mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-15 23:01:30 +00:00
4.7 KiB
4.7 KiB
Session Tree Implementation Plan
Reference: session-tree.md
Phase 1: SessionManager Core ✅
- Update entry types with
id,parentIdfields (using SessionEntryBase) - Add
versionfield toSessionHeader - Change
CompactionEntry.firstKeptEntryIndex→firstKeptEntryId - Add
BranchSummaryEntrytype - Add
CustomEntrytype for hooks - Add
byId: Map<string, SessionEntry>index - Add
leafId: stringtracking - Implement
getPath(fromId?)tree traversal - Implement
getTree()returningSessionTreeNode[] - Implement
getEntry(id)lookup - Implement
getLeafUuid()andgetLeafEntry()helpers - Update
_buildIndex()to populatebyIdmap - Rename
saveXXX()toappendXXX()(returns id, advances leaf) - Add
appendCustomEntry(customType, data)for hooks - Update
buildSessionContext()to usegetPath()traversal
Phase 2: Migration ✅
- Add
CURRENT_SESSION_VERSION = 2constant - Implement
migrateV1ToV2()with extensible migration chain - Update
setSessionFile()to detect version and migrate - Implement
_rewriteFile()for post-migration persistence - Handle
firstKeptEntryIndex→firstKeptEntryIdconversion in migration
Phase 3: Branching ✅
- Implement
branch(id)- switch leaf pointer - Implement
branchWithSummary(id, summary)- create summary entry - Implement
createBranchedSession(leafId)- extract path to new file - Update
AgentSession.branch()to use new API
Phase 4: Compaction Integration ✅
- Update
compaction.tsto work with IDs - Update
prepareCompaction()to returnfirstKeptEntryId - Update
compact()to returnCompactionResultwithfirstKeptEntryId - Update
AgentSessioncompaction methods - Add
firstKeptEntryIdtobefore_compacthook event
Phase 5: Testing ✅
migration.test.ts- v1 to v2 migration, idempotencybuild-context.test.ts- context building with tree structure, compaction, branchestree-traversal.test.ts- append operations, getPath, getTree, branchingfile-operations.test.ts- loadEntriesFromFile, findMostRecentSessionsave-entry.test.ts- custom entry integration- Update existing compaction tests for new types
Remaining Work
Compaction Refactor
- Clean up types passed to hooks (currently messy mix of
CompactionEntry,CompactionResult, hook'scompactioncontent) - Ensure consistent API between what hooks receive and what they return
Branch Summary Design
Current type:
export interface BranchSummaryEntry extends SessionEntryBase {
type: "branch_summary";
summary: string;
}
Questions to resolve:
- Add
abandonedLeafIdfield to reference what was abandoned? - Store metadata about why the branch happened?
- Who generates the summary - user, LLM, or both options?
- Design and implement branch summarizer
- Add tests for
branchWithSummary()flow
Entry Labels
- Add optional
label?: stringfield toSessionEntryBase - Allow users to label any entry
- Display labels in UI (tree view, path view)
HTML Export
- Add collapsible sidebar showing full tree structure
- Allow selecting any node in tree to view that path
- Add "reset to session leaf" button
- Render full path (no compaction resolution needed)
- Responsive: collapse sidebar on mobile
UI Commands
Design new commands based on refactored SessionManager:
/branch - Current behavior (creates new session file from path)
- Review if this is still the right UX with tree structure
- Consider: should this use
createBranchedSession()orbranch()?
/branch-here - In-place branching (new)
- Use
branch(id)to move leaf pointer without creating new file - Subsequent messages become new branch in same file
- Design: how to select branch point? (similar to current
/branchUI?)
/branches - List/navigate branches (new)
- Show tree structure or list of branch points
- Allow switching between branches (move leaf pointer)
- Show current position in tree
/label - Label entries (new, if labels implemented)
- Allow labeling current or selected entry
- Display in tree view
Notes
- All append methods return the new entry's ID
- Migration rewrites file on first load if version < CURRENT_VERSION
- Existing sessions become linear chains after migration (parentId = previous entry)
- Tree features available immediately after migration
- SessionHeader does NOT have id/parentId (it's metadata, not part of tree)
- Session is append-only: entries cannot be modified or deleted, only branching changes the leaf pointer