@asm-agent/coding-agent 0.8.7 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +2 -7
- package/dist/asm-agent-runtime/src/__pycache__/asm_cm_driver.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/__pycache__/phase76_address_head.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__init__.py +1 -1
- package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/_winjob.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/harness.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp_base.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp_base.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/skill.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/bash.py +94 -31
- package/dist/asm-agent-runtime/src/rlm/repl.md +3 -3
- package/dist/asm-agent-runtime/src/rlm/repl.py +46 -45
- package/dist/asm-agent-runtime/test/__pycache__/test_agent_message_skill.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_bash.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_harness.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_mcp.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_mcp_base.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_repl.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_subagent_registry.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_winjob.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/test_bash.py +74 -19
- package/dist/asm-agent-runtime/test/test_repl.py +67 -3
- package/dist/asm-agent-runtime/uv.lock +446 -155
- package/dist/bundle/{anthropic-XSMQHGYB.js → anthropic-ZOZNPFXS.js} +2 -2
- package/dist/bundle/{azure-openai-responses-XLQAIKKH.js → azure-openai-responses-TDHCU647.js} +2 -2
- package/dist/bundle/{bundled-modules-5OCN73BM.js → bundled-modules-Q2YODC4B.js} +3 -3
- package/dist/bundle/{chunk-IAQLPSMN.js → chunk-AMKLNEAK.js} +47 -47
- package/dist/bundle/{chunk-2LPSALBF.js → chunk-FPY7FFJS.js} +978 -1821
- package/dist/bundle/{chunk-E3YE2Q7A.js → chunk-G6SC4YYW.js} +4973 -1926
- package/dist/bundle/{chunk-YPNK4MRU.js → chunk-QLHAP3FT.js} +1 -1
- package/dist/bundle/{cli-main-QYX5R3LF.js → cli-main-277AG2BR.js} +3 -3
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/{google-ZXJEPWJA.js → google-Q3AJWUOY.js} +1 -1
- package/dist/bundle/{google-vertex-WAF3RIJ6.js → google-vertex-2CSNOUBS.js} +1 -1
- package/dist/bundle/{main-EOUAQCJH.js → main-TNXWJXIU.js} +3 -3
- package/dist/bundle/{mistral-GDZXSXRS.js → mistral-XRYJGLLG.js} +1 -1
- package/dist/bundle/{openai-codex-responses-7XMPW4LG.js → openai-codex-responses-C6BRO2BN.js} +2 -2
- package/dist/bundle/{openai-completions-LNSVGDMF.js → openai-completions-DNXCK2JW.js} +4 -4
- package/dist/bundle/{openai-responses-MFZOBMIT.js → openai-responses-BEMWVIXE.js} +2 -2
- package/dist/config.d.ts +0 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -3
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-config.d.ts +1 -2
- package/dist/core/agent-session-config.d.ts.map +1 -1
- package/dist/core/agent-session-config.js +0 -3
- package/dist/core/agent-session-config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +0 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +0 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +0 -22
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +8 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +100 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/kernel/bootstrap.d.ts.map +1 -1
- package/dist/core/kernel/bootstrap.js +1 -1
- package/dist/core/kernel/bootstrap.js.map +1 -1
- package/dist/core/kernel/repl-manager.d.ts +32 -8
- package/dist/core/kernel/repl-manager.d.ts.map +1 -1
- package/dist/core/kernel/repl-manager.js +401 -102
- package/dist/core/kernel/repl-manager.js.map +1 -1
- package/dist/core/kernel/shared.d.ts +11 -7
- package/dist/core/kernel/shared.d.ts.map +1 -1
- package/dist/core/kernel/shared.js +2 -5
- package/dist/core/kernel/shared.js.map +1 -1
- package/dist/core/mcp/mcp-manager.d.ts +4 -2
- package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
- package/dist/core/mcp/mcp-manager.js +9 -7
- package/dist/core/mcp/mcp-manager.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/ollama-models.d.ts +3 -1
- package/dist/core/ollama-models.d.ts.map +1 -1
- package/dist/core/ollama-models.js +31 -10
- package/dist/core/ollama-models.js.map +1 -1
- package/dist/core/prime-inference-auth.d.ts +0 -9
- package/dist/core/prime-inference-auth.d.ts.map +1 -1
- package/dist/core/prime-inference-auth.js +0 -50
- package/dist/core/prime-inference-auth.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +0 -1
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/session-manager.d.ts +0 -4
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +0 -22
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +13 -43
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +0 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/acp-mcp.d.ts +6 -0
- package/dist/core/tools/acp-mcp.d.ts.map +1 -0
- package/dist/core/tools/acp-mcp.js +86 -0
- package/dist/core/tools/acp-mcp.js.map +1 -0
- package/dist/core/tools/index.d.ts +1 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ipython.d.ts.map +1 -1
- package/dist/core/tools/ipython.js +9 -4
- package/dist/core/tools/ipython.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -11
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts.map +1 -1
- package/dist/modes/acp/acp-mode.js +1 -1
- package/dist/modes/acp/acp-mode.js.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts +0 -2
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.js +0 -2
- package/dist/modes/agent-connection/daemon-agent-connection.js.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.d.ts.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.js +0 -19
- package/dist/modes/agents-view/agents-view-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-mode.d.ts +1 -10
- package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-mode.js +134 -274
- package/dist/modes/daemon/daemon-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-protocol.d.ts +11 -5
- package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-protocol.js +6 -8
- package/dist/modes/daemon/daemon-protocol.js.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts +0 -3
- package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.js +18 -52
- package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.d.ts +1 -6
- package/dist/modes/daemon/daemon-worker-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.js +0 -2
- package/dist/modes/daemon/daemon-worker-protocol.js.map +1 -1
- package/dist/modes/interactive/auth-flows.d.ts +0 -2
- package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
- package/dist/modes/interactive/auth-flows.js +1 -101
- package/dist/modes/interactive/auth-flows.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +6 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +13 -3
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -2
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts +12 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +63 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/feature-hints.d.ts.map +1 -1
- package/dist/modes/interactive/feature-hints.js +0 -4
- package/dist/modes/interactive/feature-hints.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -7
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +23 -279
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/settings.md +1 -31
- package/docs/usage.md +1 -4
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +6 -5
- package/dist/core/agent-traces.d.ts +0 -130
- package/dist/core/agent-traces.d.ts.map +0 -1
- package/dist/core/agent-traces.js +0 -746
- package/dist/core/agent-traces.js.map +0 -1
- package/dist/core/telemetry.d.ts +0 -92
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js +0 -633
- package/dist/core/telemetry.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@asm-agent/agent\";\nimport type { AssistantMessage, ImageContent, Message, ServiceTier, TextContent, Usage } from \"@asm-agent/ai\";\nimport { randomUUID } from \"crypto\";\nimport {\n\tappendFileSync,\n\tchmodSync,\n\tchownSync,\n\texistsSync,\n\tmkdirSync,\n\treaddirSync,\n\treadFileSync,\n\trealpathSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n\twriteFileSync,\n} from \"fs\";\nimport { readdir, readFile, stat } from \"fs/promises\";\nimport { basename, dirname, join, resolve } from \"path\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport { getAgentDir as getDefaultAgentDir, getSessionsDir } from \"../config.js\";\nimport { readFirstLineSync, readLinesAsBuffers } from \"../utils/file-lines.js\";\nimport { captureGitContext, type GitContext, gitContextsEqual } from \"../utils/git.js\";\nimport {\n\ttype BashExecutionMessage,\n\ttype CustomMessage,\n\tcreateBranchSummaryMessage,\n\tcreateCompactionSummaryMessage,\n\tcreateCustomMessage,\n} from \"./messages.js\";\nimport { cloneUsage } from \"./usage.js\";\n\nexport const CURRENT_SESSION_VERSION = 3;\nconst SESSION_LIST_SEARCH_TEXT_MAX_CHARS = 64 * 1024;\nconst SESSION_LIST_PARSE_MAX_LINE_CHARS = 1024 * 1024;\nconst SESSION_LIST_LARGE_MESSAGE_PREVIEW_MAX_CHARS = 256;\nconst SESSION_STREAMING_LOAD_THRESHOLD_BYTES = 128 * 1024 * 1024;\nconst SESSION_ASYNC_PARSE_YIELD_BYTES = 4 * 1024 * 1024;\n\n// Entry types that can represent user intent (vs. daemon bookkeeping like\n// session_state/agent_status/git_state/child_usage_attributed). Used by\n// hasUserContent to decide whether a message-less draft is safe to discard.\nconst CONTENT_ENTRY_TYPES = new Set([\n\t\"message\",\n\t\"custom_message\",\n\t\"custom\",\n\t\"model_change\",\n\t\"thinking_level_change\",\n\t\"service_tier_change\",\n\t\"session_info\",\n\t\"label\",\n\t\"compaction\",\n\t\"branch_summary\",\n]);\n\nfunction realpathIfPresent(path: string): string {\n\ttry {\n\t\treturn realpathSync(path);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return path;\n\t\tthrow error;\n\t}\n}\n\nfunction statMetadataIfPresent(path: string): { mode: number; uid: number; gid: number } | undefined {\n\ttry {\n\t\tconst { mode, uid, gid } = statSync(path);\n\t\treturn { mode: mode & 0o777, uid, gid };\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n\t\tthrow error;\n\t}\n}\n\nexport interface SessionHeader {\n\ttype: \"session\";\n\tversion?: number; // v1 sessions don't have this\n\tid: string;\n\ttimestamp: string;\n\tcwd: string;\n\tparentSession?: string;\n\trlmDepth?: number;\n\tgit?: GitContext;\n}\n\nexport interface NewSessionOptions {\n\tid?: string;\n\tparentSession?: string;\n\trlmDepth?: number;\n}\n\nexport type SessionPersistListener = (sessionFile: string) => void;\n\nexport interface SessionEntryBase {\n\ttype: string;\n\tid: string;\n\tparentId: string | null;\n\ttimestamp: string;\n}\n\nexport interface SessionMessageEntry extends SessionEntryBase {\n\ttype: \"message\";\n\tmessage: AgentMessage;\n}\n\ntype AssistantSessionMessageEntry = SessionMessageEntry & { message: AssistantMessage };\n\nexport interface ThinkingLevelChangeEntry extends SessionEntryBase {\n\ttype: \"thinking_level_change\";\n\tthinkingLevel: string;\n}\n\nexport interface ServiceTierChangeEntry extends SessionEntryBase {\n\ttype: \"service_tier_change\";\n\tserviceTier: ServiceTier;\n}\n\nexport interface ModelChangeEntry extends SessionEntryBase {\n\ttype: \"model_change\";\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport interface CompactionEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"compaction\";\n\tsummary: string;\n\tfirstKeptEntryId: string;\n\ttokensBefore: number;\n\tdetails?: T;\n\tfromHook?: boolean;\n\tcustomInstructions?: string;\n}\n\nexport interface BranchSummaryEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"branch_summary\";\n\tfromId: string;\n\tsummary: string;\n\tdetails?: T;\n\tfromHook?: boolean;\n}\n\nexport interface CustomEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"custom\";\n\tcustomType: string;\n\tdata?: T;\n}\n\n/**\n * Records usage folded into a parent assistant message after an RLM child run.\n * The child usage is kept separately so audit/UI code can explain why the\n * parent turn's aggregate usage exceeds the parent model response itself.\n */\nexport interface ChildUsageAttributionEntry extends SessionEntryBase {\n\ttype: \"child_usage_attributed\";\n\ttargetId: string;\n\tchildUsage: Usage;\n\taggregateUsage: Usage;\n\torigin?: \"spawn_task\" | \"agent_message\" | \"direct_user\";\n}\n\nexport interface LabelEntry extends SessionEntryBase {\n\ttype: \"label\";\n\ttargetId: string;\n\tlabel: string | undefined;\n}\n\nexport interface SessionInfoEntry extends SessionEntryBase {\n\ttype: \"session_info\";\n\tname?: string;\n}\n\nexport type SessionStateStatus = \"active\" | \"archived\" | \"crash\";\n\nexport interface SessionState {\n\tstatus: SessionStateStatus;\n}\n\nexport interface SessionStateEntry extends SessionEntryBase {\n\ttype: \"session_state\";\n\tstate: SessionState;\n}\n\nexport type AgentTaskState = \"needs_input\" | \"completed\";\n\nexport interface AgentStatus {\n\tsummary: string;\n\ttaskState?: AgentTaskState;\n\tbasedOnMessageCount: number;\n}\n\nexport interface AgentStatusEntry extends SessionEntryBase {\n\ttype: \"agent_status\";\n\tstatus: AgentStatus;\n}\n\nexport interface GitStateEntry extends SessionEntryBase {\n\ttype: \"git_state\";\n\tgit: GitContext;\n}\n\nexport interface CustomMessageEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"custom_message\";\n\tcustomType: string;\n\tcontent: string | (TextContent | ImageContent)[];\n\tdetails?: T;\n\tdisplay: boolean;\n}\n\nexport type SessionEntry =\n\t| SessionMessageEntry\n\t| ThinkingLevelChangeEntry\n\t| ServiceTierChangeEntry\n\t| ModelChangeEntry\n\t| CompactionEntry\n\t| BranchSummaryEntry\n\t| CustomEntry\n\t| ChildUsageAttributionEntry\n\t| CustomMessageEntry\n\t| LabelEntry\n\t| SessionInfoEntry\n\t| SessionStateEntry\n\t| AgentStatusEntry\n\t| GitStateEntry;\n\nexport type FileEntry = SessionHeader | SessionEntry;\n\nexport interface SessionTreeFlatNode {\n\tentry: SessionEntry;\n\tlabel?: string;\n\tlabelTimestamp?: string;\n}\n\nexport interface SessionTreeNode extends SessionTreeFlatNode {\n\tchildren: SessionTreeNode[];\n}\n\nexport interface SessionContext {\n\tmessages: AgentMessage[];\n\tthinkingLevel: string;\n\tserviceTier: ServiceTier;\n\tmodel: { provider: string; modelId: string } | null;\n}\n\nexport interface SessionInfo {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tstate?: SessionState;\n\tparentSessionPath?: string;\n\trlmDepth: number;\n\tcreated: Date;\n\tmodified: Date;\n\tmessageCount: number;\n\tfirstMessage: string;\n\tallMessagesText: string;\n\tagentStatus?: AgentStatus;\n}\n\nexport type ReadonlySessionManager = Pick<\n\tSessionManager,\n\t| \"getCwd\"\n\t| \"getSessionDir\"\n\t| \"getSessionId\"\n\t| \"getSessionFile\"\n\t| \"getLeafId\"\n\t| \"getLeafEntry\"\n\t| \"getEntry\"\n\t| \"getLabel\"\n\t| \"getBranch\"\n\t| \"getHeader\"\n\t| \"getEntries\"\n\t| \"getTree\"\n\t| \"getSessionName\"\n>;\n\nfunction createSessionId(): string {\n\treturn uuidv7();\n}\n\nfunction getSessionFilePath(sessionDir: string, sessionId: string): string {\n\treturn join(sessionDir, `${sessionId}.jsonl`);\n}\n\nfunction createUniqueSessionFileTarget(sessionDir: string): { sessionId: string; sessionFile: string } {\n\tfor (let i = 0; i < 100; i++) {\n\t\tconst sessionId = createSessionId();\n\t\tconst sessionFile = getSessionFilePath(sessionDir, sessionId);\n\t\tif (!existsSync(sessionFile)) {\n\t\t\treturn { sessionId, sessionFile };\n\t\t}\n\t}\n\tthrow new Error(\"Unable to create a unique session file\");\n}\n\nexport function getSessionArtifactsRoot(sessionDir: string): string {\n\treturn join(dirname(sessionDir), \"session-artifacts\");\n}\n\nexport function getSessionArtifactPath(sessionDir: string, sessionId: string): string {\n\treturn join(getSessionArtifactsRoot(sessionDir), sessionId);\n}\n\nexport function getSessionArtifactPathForFile(sessionFile: string, sessionId?: string): string {\n\treturn getSessionArtifactPath(dirname(sessionFile), sessionId ?? basename(sessionFile).replace(/\\.jsonl$/, \"\"));\n}\n\nfunction generateId(byId: { has(id: string): boolean }): string {\n\tfor (let i = 0; i < 100; i++) {\n\t\tconst id = randomUUID().slice(0, 8);\n\t\tif (!byId.has(id)) return id;\n\t}\n\treturn randomUUID();\n}\n\nfunction migrateV1ToV2(entries: FileEntry[]): void {\n\tconst ids = new Set<string>();\n\tlet prevId: string | null = null;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.id = generateId(ids);\n\t\tentry.parentId = prevId;\n\t\tprevId = entry.id;\n\n\t\tif (entry.type === \"compaction\") {\n\t\t\tconst comp = entry as CompactionEntry & { firstKeptEntryIndex?: number };\n\t\t\tif (typeof comp.firstKeptEntryIndex === \"number\") {\n\t\t\t\tconst targetEntry = entries[comp.firstKeptEntryIndex];\n\t\t\t\tif (targetEntry && targetEntry.type !== \"session\") {\n\t\t\t\t\tcomp.firstKeptEntryId = targetEntry.id;\n\t\t\t\t}\n\t\t\t\tdelete comp.firstKeptEntryIndex;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction migrateV2ToV3(entries: FileEntry[]): void {\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 3;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msgEntry = entry as SessionMessageEntry;\n\t\t\tif (msgEntry.message && (msgEntry.message as { role: string }).role === \"hookMessage\") {\n\t\t\t\t(msgEntry.message as { role: string }).role = \"custom\";\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction migrateToCurrentVersion(entries: FileEntry[]): boolean {\n\tconst header = entries.find((e) => e.type === \"session\") as SessionHeader | undefined;\n\tconst version = header?.version ?? 1;\n\n\tif (version >= CURRENT_SESSION_VERSION) return false;\n\n\tif (version < 2) migrateV1ToV2(entries);\n\tif (version < 3) migrateV2ToV3(entries);\n\n\treturn true;\n}\n\nexport function migrateSessionEntries(entries: FileEntry[]): void {\n\tmigrateToCurrentVersion(entries);\n}\n\nexport function parseSessionEntries(content: string): FileEntry[] {\n\tconst entries: FileEntry[] = [];\n\tconst lines = content.trim().split(\"\\n\");\n\n\tfor (const line of lines) {\n\t\tif (!line.trim()) continue;\n\t\ttry {\n\t\t\tconst entry = JSON.parse(line) as FileEntry;\n\t\t\tentries.push(entry);\n\t\t} catch {\n\t\t\t// Skip malformed lines.\n\t\t}\n\t}\n\n\tapplyChildUsageAttributions(entries);\n\treturn entries;\n}\n\nfunction applyChildUsageAttributions(entries: FileEntry[]): void {\n\tconst assistantEntriesById = new Map<string, AssistantSessionMessageEntry>();\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tassistantEntriesById.set(entry.id, entry as AssistantSessionMessageEntry);\n\t\t}\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"child_usage_attributed\") continue;\n\t\tconst target = assistantEntriesById.get(entry.targetId);\n\t\tif (!target) continue;\n\t\ttarget.message.usage = cloneUsage(entry.aggregateUsage);\n\t}\n}\n\nexport function getLatestCompactionEntry(entries: SessionEntry[]): CompactionEntry | null {\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tif (entries[i].type === \"compaction\") {\n\t\t\treturn entries[i] as CompactionEntry;\n\t\t}\n\t}\n\treturn null;\n}\n\nexport function buildSessionContext(\n\tentries: SessionEntry[],\n\tleafId?: string | null,\n\tbyId?: Map<string, SessionEntry>,\n): SessionContext {\n\tif (!byId) {\n\t\tbyId = new Map<string, SessionEntry>();\n\t\tfor (const entry of entries) {\n\t\t\tbyId.set(entry.id, entry);\n\t\t}\n\t}\n\n\tlet leaf: SessionEntry | undefined;\n\tif (leafId === null) {\n\t\treturn { messages: [], thinkingLevel: \"off\", serviceTier: \"default\", model: null };\n\t}\n\tif (leafId) {\n\t\tleaf = byId.get(leafId);\n\t}\n\tif (!leaf) {\n\t\tleaf = entries[entries.length - 1];\n\t}\n\n\tif (!leaf) {\n\t\treturn { messages: [], thinkingLevel: \"off\", serviceTier: \"default\", model: null };\n\t}\n\n\t// push+reverse, not unshift-per-entry: unshift is O(n), making this O(n^2) on long sessions.\n\tconst path: SessionEntry[] = [];\n\tlet current: SessionEntry | undefined = leaf;\n\twhile (current) {\n\t\tpath.push(current);\n\t\tcurrent = current.parentId ? byId.get(current.parentId) : undefined;\n\t}\n\tpath.reverse();\n\n\tlet thinkingLevel = \"off\";\n\tlet serviceTier: ServiceTier = \"default\";\n\tlet model: { provider: string; modelId: string } | null = null;\n\tlet compaction: CompactionEntry | null = null;\n\n\tfor (const entry of path) {\n\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\tthinkingLevel = entry.thinkingLevel;\n\t\t} else if (entry.type === \"service_tier_change\") {\n\t\t\tserviceTier = entry.serviceTier;\n\t\t} else if (entry.type === \"model_change\") {\n\t\t\tmodel = { provider: entry.provider, modelId: entry.modelId };\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tmodel = { provider: entry.message.provider, modelId: entry.message.model };\n\t\t} else if (entry.type === \"compaction\") {\n\t\t\tcompaction = entry;\n\t\t}\n\t}\n\n\t// Build messages and collect corresponding entries\n\t// When there's a compaction, model context remains summary-first while the\n\t// summary records where clients should present it among retained messages.\n\tconst messages: AgentMessage[] = [];\n\n\tconst appendMessage = (entry: SessionEntry, target = messages) => {\n\t\tif (entry.type === \"message\") {\n\t\t\ttarget.push(entry.message);\n\t\t} else if (entry.type === \"custom_message\") {\n\t\t\ttarget.push(\n\t\t\t\tcreateCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp),\n\t\t\t);\n\t\t} else if (entry.type === \"branch_summary\" && entry.summary) {\n\t\t\ttarget.push(createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));\n\t\t}\n\t};\n\n\tif (compaction) {\n\t\tconst compactionIdx = path.findIndex((e) => e.type === \"compaction\" && e.id === compaction.id);\n\n\t\t// Collect kept messages (before compaction, starting from firstKeptEntryId).\n\t\t// The context remains summary-first for the model; retainedMessageCount records\n\t\t// the exact chronological presentation boundary for clients.\n\t\tconst retainedMessages: AgentMessage[] = [];\n\t\tlet foundFirstKept = false;\n\t\tfor (let i = 0; i < compactionIdx; i++) {\n\t\t\tconst entry = path[i];\n\t\t\tif (entry.id === compaction.firstKeptEntryId) {\n\t\t\t\tfoundFirstKept = true;\n\t\t\t}\n\t\t\tif (foundFirstKept) {\n\t\t\t\tappendMessage(entry, retainedMessages);\n\t\t\t}\n\t\t}\n\n\t\tmessages.push(\n\t\t\tcreateCompactionSummaryMessage(\n\t\t\t\tcompaction.summary,\n\t\t\t\tcompaction.tokensBefore,\n\t\t\t\tcompaction.timestamp,\n\t\t\t\tcompaction.customInstructions,\n\t\t\t\tretainedMessages.length,\n\t\t\t),\n\t\t\t...retainedMessages,\n\t\t);\n\n\t\tfor (let i = compactionIdx + 1; i < path.length; i++) {\n\t\t\tconst entry = path[i];\n\t\t\tappendMessage(entry);\n\t\t}\n\t} else {\n\t\tfor (const entry of path) {\n\t\t\tappendMessage(entry);\n\t\t}\n\t}\n\n\treturn { messages, thinkingLevel, serviceTier, model };\n}\n\nexport function getDefaultSessionDir(_cwd: string, agentDir: string = getDefaultAgentDir()): string {\n\tconst sessionDir = getSessionsDir(agentDir);\n\tif (!existsSync(sessionDir)) {\n\t\tmkdirSync(sessionDir, { recursive: true });\n\t}\n\treturn sessionDir;\n}\n\n// Decode per line off a Buffer: toString(\"utf8\") on a whole large file is far slower\n// (one giant UTF-16 string). Splitting on 0x0a is UTF-8-safe.\nfunction appendEntryFromBuffer(entries: FileEntry[], buffer: Buffer, start = 0, end = buffer.length): void {\n\tif (end <= start) return;\n\ttry {\n\t\tentries.push(JSON.parse(buffer.toString(\"utf8\", start, end)) as FileEntry);\n\t} catch {\n\t\t// Skip malformed or blank lines.\n\t}\n}\n\nfunction parseEntriesFromBuffer(buffer: Buffer): FileEntry[] {\n\tconst entries: FileEntry[] = [];\n\tlet start = 0;\n\twhile (start < buffer.length) {\n\t\tlet end = buffer.indexOf(0x0a, start);\n\t\tif (end === -1) end = buffer.length;\n\t\tappendEntryFromBuffer(entries, buffer, start, end);\n\t\tstart = end + 1;\n\t}\n\treturn entries;\n}\n\nasync function parseEntriesFromBufferAsync(buffer: Buffer): Promise<FileEntry[]> {\n\tconst entries: FileEntry[] = [];\n\tlet start = 0;\n\tlet bytesSinceYield = 0;\n\twhile (start < buffer.length) {\n\t\tlet end = buffer.indexOf(0x0a, start);\n\t\tif (end === -1) end = buffer.length;\n\t\tappendEntryFromBuffer(entries, buffer, start, end);\n\t\tbytesSinceYield += end - start + 1;\n\t\tstart = end + 1;\n\t\tif (bytesSinceYield >= SESSION_ASYNC_PARSE_YIELD_BYTES) {\n\t\t\tbytesSinceYield = 0;\n\t\t\tawait new Promise<void>((resolve) => setImmediate(resolve));\n\t\t}\n\t}\n\treturn entries;\n}\n\nfunction finalizeLoadedEntries(entries: FileEntry[]): FileEntry[] {\n\tif (entries.length === 0) return entries;\n\tconst header = entries[0];\n\tif (header.type !== \"session\" || typeof (header as any).id !== \"string\") {\n\t\treturn [];\n\t}\n\tapplyChildUsageAttributions(entries);\n\treturn entries;\n}\n\nexport function loadEntriesFromFile(filePath: string): FileEntry[] {\n\tif (!existsSync(filePath)) return [];\n\treturn finalizeLoadedEntries(parseEntriesFromBuffer(readFileSync(filePath)));\n}\n\n// Async loader for the daemon: reads off the event loop and yields while parsing so a\n// large load doesn't freeze other sessions. Large files stream to avoid retaining both\n// the full input Buffer and the parsed entry graph at the same time.\nexport async function loadEntriesFromFileAsync(\n\tfilePath: string,\n\toptions: { streamThresholdBytes?: number } = {},\n): Promise<FileEntry[]> {\n\tif (!existsSync(filePath)) return [];\n\tconst streamThresholdBytes = options.streamThresholdBytes ?? SESSION_STREAMING_LOAD_THRESHOLD_BYTES;\n\tif ((await stat(filePath)).size < streamThresholdBytes) {\n\t\treturn finalizeLoadedEntries(await parseEntriesFromBufferAsync(await readFile(filePath)));\n\t}\n\n\tconst entries: FileEntry[] = [];\n\tlet bytesSinceYield = 0;\n\tfor await (const line of readLinesAsBuffers(filePath)) {\n\t\tappendEntryFromBuffer(entries, line);\n\t\tbytesSinceYield += line.length + 1;\n\t\tif (bytesSinceYield >= SESSION_ASYNC_PARSE_YIELD_BYTES) {\n\t\t\tbytesSinceYield = 0;\n\t\t\tawait new Promise<void>((resolve) => setImmediate(resolve));\n\t\t}\n\t}\n\treturn finalizeLoadedEntries(entries);\n}\n\nfunction readSessionHeader(filePath: string): Partial<SessionHeader> | undefined {\n\tconst firstLine = readFirstLineSync(filePath);\n\tif (!firstLine) {\n\t\treturn undefined;\n\t}\n\treturn JSON.parse(firstLine) as Partial<SessionHeader>;\n}\n\nfunction isValidRlmDepth(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nexport function resolveSessionRlmDepth(\n\theader: { rlmDepth?: number; parentSession?: string },\n\tsessionPath: string,\n): number {\n\treturn resolveLegacySessionRlmDepth(header, sessionPath, new Set()) ?? legacyChildDepthFromPath(sessionPath);\n}\n\nfunction resolveLegacySessionRlmDepth(\n\theader: { rlmDepth?: number; parentSession?: string },\n\tsessionPath: string,\n\tvisitedPaths: Set<string>,\n): number | undefined {\n\tif (isValidRlmDepth(header.rlmDepth)) {\n\t\treturn header.rlmDepth;\n\t}\n\tif (!header.parentSession) {\n\t\treturn 0;\n\t}\n\n\tconst resolvedSessionPath = resolve(sessionPath);\n\tif (visitedPaths.has(resolvedSessionPath)) {\n\t\treturn undefined;\n\t}\n\tvisitedPaths.add(resolvedSessionPath);\n\n\tconst pathDepth = legacyChildDepthFromPath(sessionPath);\n\tconst parentSessionPath = resolve(dirname(sessionPath), header.parentSession);\n\ttry {\n\t\tconst parentHeader = readSessionHeader(parentSessionPath);\n\t\tif (parentHeader) {\n\t\t\tconst parentDepth = resolveLegacySessionRlmDepth(parentHeader, parentSessionPath, visitedPaths);\n\t\t\tif (parentDepth !== undefined) {\n\t\t\t\treturn pathDepth > 0 ? parentDepth + 1 : parentDepth;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Fall back to artifact ancestry for unavailable or invalid legacy parents.\n\t} finally {\n\t\tvisitedPaths.delete(resolvedSessionPath);\n\t}\n\treturn pathDepth;\n}\n\nfunction legacyChildDepthFromPath(sessionPath: string): number {\n\tlet depth = 0;\n\tfor (const segment of dirname(sessionPath)\n\t\t.split(/[\\\\/]+/)\n\t\t.reverse()) {\n\t\tif (!/^sub-[0-9a-f]{8}$/.test(segment)) {\n\t\t\tbreak;\n\t\t}\n\t\tdepth += 1;\n\t}\n\treturn depth;\n}\n\nfunction deriveChildRlmDepth(parentHeader: Partial<SessionHeader> | undefined): number | undefined {\n\tconst depth = parentHeader?.rlmDepth;\n\treturn isValidRlmDepth(depth) && depth < Number.MAX_SAFE_INTEGER ? depth + 1 : undefined;\n}\n\nfunction rootRlmDepthFromEnv(): number {\n\tconst value = process.env.RLM_DEPTH;\n\tif (value === undefined || value === \"\") {\n\t\treturn 0;\n\t}\n\tconst parsed = Number(value);\n\tif (!/^\\d+$/.test(value) || !isValidRlmDepth(parsed)) {\n\t\tthrow new Error(\"RLM_DEPTH must be a non-negative integer\");\n\t}\n\treturn parsed;\n}\n\nfunction isValidSessionFile(filePath: string): boolean {\n\ttry {\n\t\tconst header = readSessionHeader(filePath);\n\t\treturn header?.type === \"session\" && typeof header.id === \"string\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function findMostRecentSession(sessionDir: string): string | null {\n\ttry {\n\t\tconst files = readdirSync(sessionDir)\n\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t.map((f) => join(sessionDir, f))\n\t\t\t.filter(isValidSessionFile)\n\t\t\t.map((path) => ({ path, mtime: statSync(path).mtime }))\n\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\treturn files[0]?.path || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction normalizeCwd(cwd: string): string {\n\treturn resolve(cwd);\n}\n\nfunction sessionInfoMatchesCwd(session: SessionInfo, cwd: string): boolean {\n\treturn !!session.cwd && normalizeCwd(session.cwd) === normalizeCwd(cwd);\n}\n\nfunction sessionHeaderMatchesCwd(header: Partial<SessionHeader> | undefined, cwd: string): boolean {\n\treturn (\n\t\theader?.type === \"session\" &&\n\t\ttypeof header.id === \"string\" &&\n\t\ttypeof header.cwd === \"string\" &&\n\t\tnormalizeCwd(header.cwd) === normalizeCwd(cwd)\n\t);\n}\n\nexport function findMostRecentSessionForCwd(sessionDir: string, cwd: string): string | null {\n\ttry {\n\t\tconst files = readdirSync(sessionDir)\n\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t.map((f) => join(sessionDir, f))\n\t\t\t.map((path) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst header = readSessionHeader(path);\n\t\t\t\t\tif (!sessionHeaderMatchesCwd(header, cwd)) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn { path, mtime: statSync(path).mtime };\n\t\t\t\t} catch {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter((entry): entry is { path: string; mtime: Date } => entry !== undefined)\n\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\treturn files[0]?.path || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isMessageWithContent(message: AgentMessage): message is Message {\n\treturn typeof (message as Message).role === \"string\" && \"content\" in message;\n}\n\nfunction extractTextContent(message: Message): string {\n\tconst content = message.content;\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\treturn content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\" \");\n}\n\nfunction normalizeSessionStateStatus(value: unknown): SessionStateStatus | undefined {\n\tif (value === \"active\" || value === \"archived\" || value === \"crash\") {\n\t\treturn value;\n\t}\n\tif (value === \"hidden\" || value === \"sleep\") {\n\t\treturn \"archived\";\n\t}\n\treturn undefined;\n}\n\nfunction updateLastActivityTime(lastActivityTime: number | undefined, entry: FileEntry): number | undefined {\n\tif (entry.type !== \"message\") {\n\t\treturn lastActivityTime;\n\t}\n\n\tconst message = (entry as SessionMessageEntry).message;\n\tif (!isMessageWithContent(message)) {\n\t\treturn lastActivityTime;\n\t}\n\tif (message.role !== \"user\" && message.role !== \"assistant\") {\n\t\treturn lastActivityTime;\n\t}\n\n\tconst msgTimestamp = (message as { timestamp?: number }).timestamp;\n\tif (typeof msgTimestamp === \"number\") {\n\t\treturn Math.max(lastActivityTime ?? 0, msgTimestamp);\n\t}\n\n\tconst entryTimestamp = (entry as SessionEntryBase).timestamp;\n\tif (typeof entryTimestamp === \"string\") {\n\t\tconst t = new Date(entryTimestamp).getTime();\n\t\tif (!Number.isNaN(t)) {\n\t\t\treturn Math.max(lastActivityTime ?? 0, t);\n\t\t}\n\t}\n\n\treturn lastActivityTime;\n}\n\nfunction getSessionModifiedDateFromLastActivity(\n\tlastActivityTime: number | undefined,\n\theader: SessionHeader,\n\tstatsMtime: Date,\n): Date {\n\tif (typeof lastActivityTime === \"number\" && lastActivityTime > 0) {\n\t\treturn new Date(lastActivityTime);\n\t}\n\n\tconst headerTime = typeof header.timestamp === \"string\" ? new Date(header.timestamp).getTime() : NaN;\n\treturn !Number.isNaN(headerTime) ? new Date(headerTime) : statsMtime;\n}\n\nfunction appendCappedSearchText(current: string, text: string): string {\n\tif (!text || current.length >= SESSION_LIST_SEARCH_TEXT_MAX_CHARS) {\n\t\treturn current;\n\t}\n\tconst next = current ? ` ${text}` : text;\n\treturn current + next.slice(0, SESSION_LIST_SEARCH_TEXT_MAX_CHARS - current.length);\n}\n\nfunction looksLikeMessageEntry(line: string): boolean {\n\treturn line.includes('\"type\":\"message\"') || line.includes('\"type\": \"message\"');\n}\n\nfunction extractJsonStringPropertyPrefix(\n\ttext: string,\n\tpropertyName: string,\n\tmaxChars: number,\n\tstartIndex = 0,\n): string | undefined {\n\tconst propertyIndex = text.indexOf(`\"${propertyName}\"`, startIndex);\n\tif (propertyIndex < 0) {\n\t\treturn undefined;\n\t}\n\tlet index = propertyIndex + propertyName.length + 2;\n\twhile (index < text.length && /\\s/.test(text[index] ?? \"\")) index++;\n\tif (text[index] !== \":\") {\n\t\treturn undefined;\n\t}\n\tindex++;\n\twhile (index < text.length && /\\s/.test(text[index] ?? \"\")) index++;\n\tif (text[index] !== '\"') {\n\t\treturn undefined;\n\t}\n\tindex++;\n\n\tlet result = \"\";\n\tlet escaped = false;\n\tfor (; index < text.length && result.length < maxChars; index++) {\n\t\tconst char = text[index];\n\t\tif (escaped) {\n\t\t\tresult += char;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"\\\\\") {\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"') {\n\t\t\tbreak;\n\t\t}\n\t\tresult += char;\n\t}\n\treturn result;\n}\n\nfunction extractOversizedMessageSummary(line: string): {\n\trole?: string;\n\ttimestamp?: number;\n\ttextPreview?: string;\n} {\n\tconst timestampText = extractJsonStringPropertyPrefix(line, \"timestamp\", 64);\n\tconst timestamp = timestampText ? new Date(timestampText).getTime() : NaN;\n\tconst messageIndex = line.indexOf('\"message\"');\n\tconst role =\n\t\tmessageIndex >= 0\n\t\t\t? extractJsonStringPropertyPrefix(line, \"role\", 64, messageIndex)\n\t\t\t: extractJsonStringPropertyPrefix(line, \"role\", 64);\n\tlet textPreview: string | undefined;\n\tif (messageIndex >= 0) {\n\t\ttextPreview =\n\t\t\textractJsonStringPropertyPrefix(line, \"content\", SESSION_LIST_LARGE_MESSAGE_PREVIEW_MAX_CHARS, messageIndex) ??\n\t\t\textractJsonStringPropertyPrefix(line, \"text\", SESSION_LIST_LARGE_MESSAGE_PREVIEW_MAX_CHARS, messageIndex);\n\t}\n\treturn {\n\t\trole,\n\t\t...(Number.isNaN(timestamp) ? {} : { timestamp }),\n\t\t...(textPreview ? { textPreview } : {}),\n\t};\n}\n\ninterface SessionInfoCacheEntry {\n\tsize: number;\n\tmtimeMs: number;\n\tinfo: SessionInfo | null;\n}\n\n// Session files are append-only, so an unchanged (size, mtimeMs) means identical\n// content: cache list metadata and rescan only files that changed.\nconst sessionInfoCache = new Map<string, SessionInfoCacheEntry>();\n\nexport async function readSessionInfo(filePath: string): Promise<SessionInfo | null> {\n\tlet stats: Awaited<ReturnType<typeof stat>>;\n\ttry {\n\t\tstats = await stat(filePath);\n\t} catch {\n\t\treturn null;\n\t}\n\tconst cached = sessionInfoCache.get(filePath);\n\tif (cached && cached.size === stats.size && cached.mtimeMs === stats.mtimeMs) {\n\t\treturn cached.info;\n\t}\n\tconst info = await scanSessionInfo(filePath, stats);\n\tsessionInfoCache.set(filePath, { size: stats.size, mtimeMs: stats.mtimeMs, info });\n\treturn info;\n}\n\nasync function scanSessionInfo(filePath: string, stats: Awaited<ReturnType<typeof stat>>): Promise<SessionInfo | null> {\n\ttry {\n\t\tlet header: SessionHeader | undefined;\n\t\tlet messageCount = 0;\n\t\tlet firstMessage = \"\";\n\t\tlet allMessagesText = \"\";\n\t\tlet name: string | undefined;\n\t\tlet state: SessionState | undefined;\n\t\tlet agentStatus: AgentStatus | undefined;\n\t\tlet lastActivityTime: number | undefined;\n\n\t\tfor await (const lineBuffer of readLinesAsBuffers(filePath)) {\n\t\t\tconst line = lineBuffer.toString(\"utf8\");\n\t\t\tif (!line.trim()) continue;\n\n\t\t\t// Large tool-result entries can be many MB. They do not carry the\n\t\t\t// session-list metadata we need, and parsing them during every refresh\n\t\t\t// can exhaust the daemon heap.\n\t\t\tif (line.length > SESSION_LIST_PARSE_MAX_LINE_CHARS) {\n\t\t\t\tif (looksLikeMessageEntry(line)) {\n\t\t\t\t\tmessageCount++;\n\t\t\t\t\tconst summary = extractOversizedMessageSummary(line);\n\t\t\t\t\tif (typeof summary.timestamp === \"number\" && (summary.role === \"user\" || summary.role === \"assistant\")) {\n\t\t\t\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, summary.timestamp);\n\t\t\t\t\t}\n\t\t\t\t\tif (summary.role === \"user\" && !firstMessage) {\n\t\t\t\t\t\tfirstMessage = summary.textPreview || \"(large message)\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst trimmed = line.trim();\n\t\t\tlet entry: FileEntry;\n\t\t\ttry {\n\t\t\t\tentry = JSON.parse(trimmed) as FileEntry;\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (entry.type === \"session_info\") {\n\t\t\t\tconst infoEntry = entry as SessionInfoEntry;\n\t\t\t\tname = infoEntry.name?.trim() || undefined;\n\t\t\t}\n\t\t\tif (entry.type === \"session_state\") {\n\t\t\t\tconst stateEntry = entry as SessionStateEntry;\n\t\t\t\tconst status = normalizeSessionStateStatus(stateEntry.state?.status);\n\t\t\t\tif (status) {\n\t\t\t\t\tstate = { status };\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Keep the latest recap/verdict so off-daemon sessions don't all show as\n\t\t\t// unjudged in the agents view. Append-only, so last seen wins.\n\t\t\tif (entry.type === \"agent_status\") {\n\t\t\t\tagentStatus = (entry as AgentStatusEntry).status;\n\t\t\t}\n\n\t\t\tif (!header) {\n\t\t\t\tif (entry.type !== \"session\") {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\theader = entry as SessionHeader;\n\t\t\t}\n\n\t\t\tlastActivityTime = updateLastActivityTime(lastActivityTime, entry);\n\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tmessageCount++;\n\n\t\t\tconst message = (entry as SessionMessageEntry).message;\n\t\t\tif (!isMessageWithContent(message)) continue;\n\t\t\tif (message.role !== \"user\" && message.role !== \"assistant\") continue;\n\n\t\t\tconst textContent = extractTextContent(message);\n\t\t\tif (!textContent) continue;\n\n\t\t\tallMessagesText = appendCappedSearchText(allMessagesText, textContent);\n\t\t\tif (!firstMessage && message.role === \"user\") {\n\t\t\t\tfirstMessage = textContent;\n\t\t\t}\n\t\t}\n\n\t\tif (!header) return null;\n\t\tconst cwd = typeof header.cwd === \"string\" ? header.cwd : \"\";\n\t\tconst parentSessionPath = header.parentSession;\n\t\tconst rlmDepth = resolveSessionRlmDepth(header, filePath);\n\t\tconst modified = getSessionModifiedDateFromLastActivity(lastActivityTime, header, stats.mtime);\n\n\t\treturn {\n\t\t\tpath: filePath,\n\t\t\tid: header.id,\n\t\t\tcwd,\n\t\t\tname,\n\t\t\tstate,\n\t\t\tparentSessionPath,\n\t\t\trlmDepth,\n\t\t\tcreated: new Date(header.timestamp),\n\t\t\tmodified,\n\t\t\tmessageCount,\n\t\t\tfirstMessage: firstMessage || \"(no messages)\",\n\t\t\tallMessagesText,\n\t\t\tagentStatus,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport type SessionListProgress = (loaded: number, total: number) => void;\nexport type SessionListItem = (session: SessionInfo) => void;\n\nexport interface SessionListCallbacks {\n\tonProgress?: SessionListProgress;\n\tonSession?: SessionListItem;\n}\n\nasync function listSessionsFromDir(\n\tdir: string,\n\tcallbacks?: SessionListCallbacks,\n\tprogressOffset = 0,\n\tprogressTotal?: number,\n): Promise<SessionInfo[]> {\n\tconst sessions: SessionInfo[] = [];\n\tif (!existsSync(dir)) {\n\t\treturn sessions;\n\t}\n\n\ttry {\n\t\tconst dirEntries = await readdir(dir);\n\t\tconst files = dirEntries.filter((f) => f.endsWith(\".jsonl\")).map((f) => join(dir, f));\n\t\tconst total = progressTotal ?? files.length;\n\n\t\tconst present = new Set(files);\n\t\tfor (const key of sessionInfoCache.keys()) {\n\t\t\tif (dirname(key) === dir && !present.has(key)) {\n\t\t\t\tsessionInfoCache.delete(key);\n\t\t\t}\n\t\t}\n\n\t\tlet loaded = 0;\n\t\tfor (const file of files) {\n\t\t\tconst info = await readSessionInfo(file);\n\t\t\tloaded++;\n\t\t\tcallbacks?.onProgress?.(progressOffset + loaded, total);\n\t\t\tif (info) {\n\t\t\t\tsessions.push(info);\n\t\t\t\tcallbacks?.onSession?.(info);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Return no sessions when the directory cannot be read.\n\t}\n\n\treturn sessions;\n}\n\nexport class SessionManager {\n\tprivate sessionId: string = \"\";\n\tprivate sessionFile: string | undefined;\n\tprivate sessionDir: string;\n\tprivate cwd: string;\n\tprivate persist: boolean;\n\tprivate flushed: boolean = false;\n\tprivate fileEntries: FileEntry[] = [];\n\tprivate byId: Map<string, SessionEntry> = new Map();\n\tprivate labelsById: Map<string, string> = new Map();\n\tprivate labelTimestampsById: Map<string, string> = new Map();\n\tprivate leafId: string | null = null;\n\tprivate persistListeners = new Set<SessionPersistListener>();\n\n\tprivate constructor(\n\t\tcwd: string,\n\t\tsessionDir: string,\n\t\tsessionFile: string | undefined,\n\t\tpersist: boolean,\n\t\tpreloadedEntries?: FileEntry[],\n\t) {\n\t\tthis.cwd = cwd;\n\t\tthis.sessionDir = sessionDir;\n\t\tthis.persist = persist;\n\t\tif (persist && sessionDir && !existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tif (sessionFile) {\n\t\t\tthis.setSessionFile(sessionFile, preloadedEntries);\n\t\t} else {\n\t\t\tthis.newSession();\n\t\t}\n\t}\n\n\t/**\n\t * Switch to a different session file (used for resume and branching).\n\t * preloadedEntries must be loadEntriesFromFile(sessionFile) for the same path; it\n\t * lets the async daemon path skip the synchronous re-read.\n\t */\n\tsetSessionFile(sessionFile: string, preloadedEntries?: FileEntry[]): void {\n\t\tthis.sessionFile = resolve(sessionFile);\n\t\tif (existsSync(this.sessionFile)) {\n\t\t\tthis.fileEntries = preloadedEntries ?? loadEntriesFromFile(this.sessionFile);\n\n\t\t\t// If file was empty or corrupted (no valid header), truncate and start fresh\n\t\t\t// to avoid appending messages without a session header (which breaks the session)\n\t\t\tif (this.fileEntries.length === 0) {\n\t\t\t\tconst explicitPath = this.sessionFile;\n\t\t\t\tthis.newSession();\n\t\t\t\tthis.sessionFile = explicitPath;\n\t\t\t\tthis._rewriteFile();\n\t\t\t\tthis.flushed = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst header = this.fileEntries.find((e) => e.type === \"session\") as SessionHeader | undefined;\n\t\t\tthis.sessionId = header?.id ?? createSessionId();\n\n\t\t\tlet shouldRewrite = migrateToCurrentVersion(this.fileEntries);\n\t\t\tif (header?.parentSession && !isValidRlmDepth(header.rlmDepth)) {\n\t\t\t\theader.rlmDepth = resolveSessionRlmDepth(header, this.sessionFile);\n\t\t\t\tshouldRewrite = true;\n\t\t\t}\n\t\t\tif (shouldRewrite) {\n\t\t\t\tthis._rewriteFile();\n\t\t\t}\n\n\t\t\tthis._buildIndex();\n\t\t\tthis.flushed = true;\n\t\t} else {\n\t\t\tconst explicitPath = this.sessionFile;\n\t\t\tthis.newSession();\n\t\t\tthis.sessionFile = explicitPath; // preserve explicit path from --resume selector\n\t\t}\n\t}\n\n\tnewSession(options?: NewSessionOptions): string | undefined {\n\t\tlet sessionId = options?.id ?? createSessionId();\n\t\tlet sessionFile: string | undefined;\n\t\tconst hasExplicitRlmDepth = options !== undefined && Object.hasOwn(options, \"rlmDepth\");\n\t\tlet parentHeader: Partial<SessionHeader> | undefined;\n\t\tif (options?.parentSession && !hasExplicitRlmDepth) {\n\t\t\ttry {\n\t\t\t\tparentHeader = readSessionHeader(options.parentSession);\n\t\t\t} catch {\n\t\t\t\t// Unavailable parent metadata leaves the child depth unknown.\n\t\t\t}\n\t\t}\n\t\tif (this.persist) {\n\t\t\tif (options?.id) {\n\t\t\t\tsessionFile = getSessionFilePath(this.getSessionDir(), sessionId);\n\t\t\t\tif (existsSync(sessionFile)) {\n\t\t\t\t\tthrow new Error(`Session file already exists for id \"${sessionId}\": ${sessionFile}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst target = createUniqueSessionFileTarget(this.getSessionDir());\n\t\t\t\tsessionId = target.sessionId;\n\t\t\t\tsessionFile = target.sessionFile;\n\t\t\t}\n\t\t}\n\n\t\tthis.sessionId = sessionId;\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst git = this.persist ? (captureGitContext(this.cwd) ?? undefined) : undefined;\n\t\tconst rlmDepth = hasExplicitRlmDepth\n\t\t\t? options?.rlmDepth\n\t\t\t: options?.parentSession\n\t\t\t\t? deriveChildRlmDepth(parentHeader)\n\t\t\t\t: rootRlmDepthFromEnv();\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: options?.parentSession,\n\t\t\trlmDepth,\n\t\t\tgit,\n\t\t};\n\t\tthis.fileEntries = [header];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.labelTimestampsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\n\t\tif (this.persist) {\n\t\t\tthis.sessionFile = sessionFile;\n\t\t}\n\t\treturn this.sessionFile;\n\t}\n\n\tprivate _buildIndex(): void {\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.labelTimestampsById.clear();\n\t\tthis.leafId = null;\n\t\tfor (const entry of this.fileEntries) {\n\t\t\tif (entry.type === \"session\") continue;\n\t\t\tthis.byId.set(entry.id, entry);\n\t\t\tthis.leafId = entry.id;\n\t\t\tif (entry.type === \"label\") {\n\t\t\t\tif (entry.label) {\n\t\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t\t\tthis.labelTimestampsById.set(entry.targetId, entry.timestamp);\n\t\t\t\t} else {\n\t\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t\t\tthis.labelTimestampsById.delete(entry.targetId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _rewriteFile(): void {\n\t\tif (!this.persist || !this.sessionFile) return;\n\t\tconst content = `${this.fileEntries.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`;\n\t\tconst targetPath = realpathIfPresent(this.sessionFile);\n\t\tconst directory = dirname(targetPath);\n\t\tmkdirSync(directory, { recursive: true });\n\t\tconst tempPath = join(directory, `.${basename(targetPath)}.${process.pid}.${randomUUID()}.tmp`);\n\t\ttry {\n\t\t\tconst metadata = statMetadataIfPresent(targetPath);\n\t\t\twriteFileSync(tempPath, content, metadata === undefined ? undefined : { mode: metadata.mode });\n\t\t\tif (metadata !== undefined) {\n\t\t\t\tchownSync(tempPath, metadata.uid, metadata.gid);\n\t\t\t\tchmodSync(tempPath, metadata.mode);\n\t\t\t}\n\t\t\trenameSync(tempPath, targetPath);\n\t\t} finally {\n\t\t\trmSync(tempPath, { force: true });\n\t\t}\n\t\tthis._notifyPersistListeners();\n\t}\n\n\tprivate _notifyPersistListeners(): void {\n\t\tif (!this.sessionFile) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const listener of this.persistListeners) {\n\t\t\ttry {\n\t\t\t\tlistener(this.sessionFile);\n\t\t\t} catch {\n\t\t\t\t// Persistence observers must not break session writes.\n\t\t\t}\n\t\t}\n\t}\n\n\tonPersist(listener: SessionPersistListener): () => void {\n\t\tthis.persistListeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.persistListeners.delete(listener);\n\t\t};\n\t}\n\n\tisPersisted(): boolean {\n\t\treturn this.persist;\n\t}\n\n\tgetCwd(): string {\n\t\treturn this.cwd;\n\t}\n\n\tgetSessionDir(): string {\n\t\treturn this.sessionDir;\n\t}\n\n\tgetSessionId(): string {\n\t\treturn this.sessionId;\n\t}\n\n\tgetSessionFile(): string | undefined {\n\t\treturn this.sessionFile;\n\t}\n\n\tmaterializeSessionFile(sessionDir?: string): string {\n\t\tif (this.sessionFile) {\n\t\t\treturn this.sessionFile;\n\t\t}\n\t\tconst dir = sessionDir ?? (this.sessionDir || getDefaultSessionDir(this.cwd));\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\t\tconst previousHeader = this.getHeader();\n\t\tconst target = createUniqueSessionFileTarget(dir);\n\t\tthis.sessionDir = dir;\n\t\tthis.sessionId = target.sessionId;\n\t\tthis.sessionFile = target.sessionFile;\n\t\tthis.persist = true;\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst git = captureGitContext(this.cwd) ?? undefined;\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: previousHeader?.parentSession,\n\t\t\trlmDepth: resolveSessionRlmDepth(previousHeader ?? {}, target.sessionFile),\n\t\t\tgit,\n\t\t};\n\t\tthis.fileEntries = [header, ...this.getEntries()];\n\t\tthis._rewriteFile();\n\t\tthis.flushed = true;\n\t\treturn this.sessionFile;\n\t}\n\n\tgetSessionArtifactDir(): string | undefined {\n\t\treturn this.persist ? getSessionArtifactPath(this.sessionDir, this.sessionId) : undefined;\n\t}\n\n\t/**\n\t * Force-write all in-memory entries to the session file immediately.\n\t * This bypasses the no-assistant guard in {@link _persist} so that\n\t * pre-model entries (session header, goal state, settings changes)\n\t * are durable on disk before the first assistant response.\n\t * No-op for in-memory (non-persisted) sessions.\n\t */\n\tflushNow(): void {\n\t\tif (!this.persist || !this.sessionFile) return;\n\t\tif (this.flushed && existsSync(this.sessionFile)) return;\n\t\tthis._rewriteFile();\n\t\tthis.flushed = true;\n\t}\n\n\t_persist(entry: SessionEntry): void {\n\t\tif (!this.persist || !this.sessionFile) return;\n\n\t\tconst hasAssistant = this.fileEntries.some((e) => e.type === \"message\" && e.message.role === \"assistant\");\n\t\tconst shouldPersistWithoutAssistant = entry.type === \"session_state\" || entry.type === \"session_info\";\n\t\tif (!hasAssistant && !shouldPersistWithoutAssistant) {\n\t\t\tthis.flushed = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.flushed || !existsSync(this.sessionFile)) {\n\t\t\tthis._rewriteFile();\n\t\t\tthis.flushed = true;\n\t\t} else {\n\t\t\tmkdirSync(dirname(this.sessionFile), { recursive: true });\n\t\t\tappendFileSync(this.sessionFile, `${JSON.stringify(entry)}\\n`);\n\t\t\tthis._notifyPersistListeners();\n\t\t}\n\t}\n\n\tprivate _appendEntry(entry: SessionEntry): void {\n\t\tthis.fileEntries.push(entry);\n\t\tthis.byId.set(entry.id, entry);\n\t\tthis.leafId = entry.id;\n\t\tthis._persist(entry);\n\t}\n\n\tappendMessage(message: Message | CustomMessage | BashExecutionMessage): string {\n\t\tconst entry: SessionMessageEntry = {\n\t\t\ttype: \"message\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmessage,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendThinkingLevelChange(thinkingLevel: string): string {\n\t\tconst entry: ThinkingLevelChangeEntry = {\n\t\t\ttype: \"thinking_level_change\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tthinkingLevel,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendServiceTierChange(serviceTier: ServiceTier): string {\n\t\tconst entry: ServiceTierChangeEntry = {\n\t\t\ttype: \"service_tier_change\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tserviceTier,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendModelChange(provider: string, modelId: string): string {\n\t\tconst entry: ModelChangeEntry = {\n\t\t\ttype: \"model_change\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tprovider,\n\t\t\tmodelId,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendCompaction<T = unknown>(\n\t\tsummary: string,\n\t\tfirstKeptEntryId: string,\n\t\ttokensBefore: number,\n\t\tdetails?: T,\n\t\tfromHook?: boolean,\n\t\tcustomInstructions?: string,\n\t): string {\n\t\tconst entry: CompactionEntry<T> = {\n\t\t\ttype: \"compaction\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore,\n\t\t\tdetails,\n\t\t\tfromHook,\n\t\t\tcustomInstructions,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendCustomEntry(customType: string, data?: unknown): string {\n\t\tconst entry: CustomEntry = {\n\t\t\ttype: \"custom\",\n\t\t\tcustomType,\n\t\t\tdata,\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendCustomEntryWithRollback(customType: string, data?: unknown): string {\n\t\treturn this._appendEntryWithRollback(() => this.appendCustomEntry(customType, data));\n\t}\n\n\tappendChildUsageAttribution(\n\t\ttargetId: string,\n\t\tchildUsage: Usage,\n\t\taggregateUsage: Usage,\n\t\torigin?: ChildUsageAttributionEntry[\"origin\"],\n\t): string {\n\t\tconst target = this.byId.get(targetId);\n\t\tif (target?.type !== \"message\" || target.message.role !== \"assistant\") {\n\t\t\tthrow new Error(`Assistant message entry ${targetId} not found`);\n\t\t}\n\n\t\ttarget.message.usage = cloneUsage(aggregateUsage);\n\t\tconst entry: ChildUsageAttributionEntry = {\n\t\t\ttype: \"child_usage_attributed\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttargetId,\n\t\t\tchildUsage: cloneUsage(childUsage),\n\t\t\taggregateUsage: cloneUsage(aggregateUsage),\n\t\t\t...(origin ? { origin } : {}),\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendSessionInfo(name: string): string {\n\t\tconst entry: SessionInfoEntry = {\n\t\t\ttype: \"session_info\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tname: name.trim(),\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendSessionState(state: SessionState): string {\n\t\tconst entry: SessionStateEntry = {\n\t\t\ttype: \"session_state\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tstate: { status: state.status },\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tgetSessionName(): string | undefined {\n\t\tconst entries = this.getEntries();\n\t\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = entries[i];\n\t\t\tif (entry.type === \"session_info\") {\n\t\t\t\treturn entry.name?.trim() || undefined;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tgetSessionState(): SessionState | undefined {\n\t\tconst entries = this.getEntries();\n\t\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = entries[i];\n\t\t\tif (entry.type === \"session_state\") {\n\t\t\t\tconst status = normalizeSessionStateStatus(entry.state.status);\n\t\t\t\tif (status) {\n\t\t\t\t\treturn { status };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * True when the session holds user-meaningful persisted content, as opposed to\n\t * only daemon-written bookkeeping (session_state, agent_status, git_state) or\n\t * the default model/thinking entries every new session is created with. Used by\n\t * the daemon discard guard to decide whether a message-less draft is safe to\n\t * delete (that guard always also requires zero messages).\n\t *\n\t * createAgentSession opens a new session with an optional leading `model_change`\n\t * followed by `thinking_level_change` and `service_tier_change`. That creation\n\t * prefix is skipped; anything beyond it is user content.\n\t */\n\thasUserContent(): boolean {\n\t\tconst contentEntries = this.getEntries().filter((entry) => CONTENT_ENTRY_TYPES.has(entry.type));\n\t\tlet start = 0;\n\t\tif (contentEntries[start]?.type === \"model_change\") {\n\t\t\tstart++;\n\t\t}\n\t\tif (contentEntries[start]?.type === \"thinking_level_change\") {\n\t\t\tstart++;\n\t\t}\n\t\tif (contentEntries[start]?.type === \"service_tier_change\") {\n\t\t\tstart++;\n\t\t}\n\t\treturn contentEntries.length > start;\n\t}\n\n\tappendAgentStatus(status: AgentStatus): string {\n\t\tconst entry: AgentStatusEntry = {\n\t\t\ttype: \"agent_status\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tstatus: {\n\t\t\t\tsummary: status.summary,\n\t\t\t\ttaskState: status.taskState,\n\t\t\t\tbasedOnMessageCount: status.basedOnMessageCount,\n\t\t\t},\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendGitState(git: GitContext): string {\n\t\tconst entry: GitStateEntry = {\n\t\t\ttype: \"git_state\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tgit,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\trecordGitStateIfChanged(): string | undefined {\n\t\tif (!this.persist) return undefined;\n\t\tconst git = captureGitContext(this.cwd);\n\t\tif (!git) return undefined;\n\t\tconst last = this.getActiveGitContext();\n\t\tif (last && gitContextsEqual(last, git)) return undefined;\n\t\treturn this.appendGitState(git);\n\t}\n\n\tprivate getActiveGitContext(): GitContext | undefined {\n\t\tlet current = this.leafId ? this.byId.get(this.leafId) : undefined;\n\t\twhile (current) {\n\t\t\tif (current.type === \"git_state\") return current.git;\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\tconst header = this.fileEntries[0];\n\t\treturn header?.type === \"session\" ? header.git : undefined;\n\t}\n\n\tgetLatestAgentStatus(): AgentStatus | undefined {\n\t\t// Walk the current leaf to root so we only read status on the active branch,\n\t\t// not a sibling branch's status that happens to sit later in the file.\n\t\tlet current = this.leafId ? this.byId.get(this.leafId) : undefined;\n\t\twhile (current) {\n\t\t\tif (current.type === \"agent_status\") {\n\t\t\t\treturn { ...current.status };\n\t\t\t}\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tappendCustomMessageEntry<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): string {\n\t\tconst entry: CustomMessageEntry<T> = {\n\t\t\ttype: \"custom_message\",\n\t\t\tcustomType,\n\t\t\tcontent,\n\t\t\tdisplay,\n\t\t\tdetails,\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\t/**\n\t * Append a custom message, undoing the append if persistence fails so a\n\t * best-effort record never leaves an unsaved leaf for later entries.\n\t */\n\tappendCustomMessageEntryWithRollback<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): string {\n\t\treturn this._appendEntryWithRollback(() => this.appendCustomMessageEntry(customType, content, display, details));\n\t}\n\n\tprivate _appendEntryWithRollback(append: () => string): string {\n\t\tconst previousLeafId = this.leafId;\n\t\ttry {\n\t\t\tconst entryId = append();\n\t\t\tthis.flushNow();\n\t\t\treturn entryId;\n\t\t} catch (error) {\n\t\t\t// The append indexes the entry before persisting it; undo exactly that.\n\t\t\tif (this.leafId !== null && this.leafId !== previousLeafId) {\n\t\t\t\tthis.byId.delete(this.leafId);\n\t\t\t\tthis.fileEntries.pop();\n\t\t\t\tthis.leafId = previousLeafId;\n\t\t\t\t// The failed append may have left a torn line on disk. Restore the file\n\t\t\t\t// from the rolled-back entries now; if that also fails (e.g. the disk is\n\t\t\t\t// still full), fall back to forcing the next persist to rewrite.\n\t\t\t\tthis.flushed = false;\n\t\t\t\ttry {\n\t\t\t\t\tthis.flushNow();\n\t\t\t\t} catch {\n\t\t\t\t\tthis.flushed = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tgetLeafId(): string | null {\n\t\treturn this.leafId;\n\t}\n\n\tgetLeafEntry(): SessionEntry | undefined {\n\t\treturn this.leafId ? this.byId.get(this.leafId) : undefined;\n\t}\n\n\tgetEntry(id: string): SessionEntry | undefined {\n\t\treturn this.byId.get(id);\n\t}\n\n\tgetChildren(parentId: string): SessionEntry[] {\n\t\tconst children: SessionEntry[] = [];\n\t\tfor (const entry of this.byId.values()) {\n\t\t\tif (entry.parentId === parentId) {\n\t\t\t\tchildren.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn children;\n\t}\n\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labelsById.get(id);\n\t}\n\n\tappendLabelChange(targetId: string, label: string | undefined): string {\n\t\tif (!this.byId.has(targetId)) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\t\tconst entry: LabelEntry = {\n\t\t\ttype: \"label\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttargetId,\n\t\t\tlabel,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\tif (label) {\n\t\t\tthis.labelsById.set(targetId, label);\n\t\t\tthis.labelTimestampsById.set(targetId, entry.timestamp);\n\t\t} else {\n\t\t\tthis.labelsById.delete(targetId);\n\t\t\tthis.labelTimestampsById.delete(targetId);\n\t\t}\n\t\treturn entry.id;\n\t}\n\n\tgetBranch(fromId?: string): SessionEntry[] {\n\t\t// push+reverse, not unshift-per-entry: unshift is O(n), which makes this O(n^2) on long sessions.\n\t\tconst path: SessionEntry[] = [];\n\t\tconst startId = fromId ?? this.leafId;\n\t\tlet current = startId ? this.byId.get(startId) : undefined;\n\t\twhile (current) {\n\t\t\tpath.push(current);\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\tpath.reverse();\n\t\treturn path;\n\t}\n\n\tbuildSessionContext(): SessionContext {\n\t\t// Pass fileEntries directly rather than getEntries(): the resolved context\n\t\t// is computed from the leaf-to-root walk over byId (which already excludes\n\t\t// the header), so the entries argument is only a fallback for an undefined\n\t\t// leaf — never hit here since leafId is always set or null. Avoids an O(n)\n\t\t// array copy on every call (attach, get_session_context, agent init, ...).\n\t\treturn buildSessionContext(this.fileEntries as SessionEntry[], this.leafId, this.byId);\n\t}\n\n\tgetHeader(): SessionHeader | null {\n\t\tconst h = this.fileEntries.find((e) => e.type === \"session\");\n\t\treturn h ? (h as SessionHeader) : null;\n\t}\n\n\tgetEntries(): SessionEntry[] {\n\t\treturn this.fileEntries.filter((e): e is SessionEntry => e.type !== \"session\");\n\t}\n\n\tgetFlatTree(): SessionTreeFlatNode[] {\n\t\treturn this.getEntries().map((entry) => ({\n\t\t\tentry,\n\t\t\tlabel: this.labelsById.get(entry.id),\n\t\t\tlabelTimestamp: this.labelTimestampsById.get(entry.id),\n\t\t}));\n\t}\n\n\tgetTree(): SessionTreeNode[] {\n\t\tconst entries = this.getFlatTree();\n\t\tconst nodeMap = new Map<string, SessionTreeNode>();\n\t\tconst roots: SessionTreeNode[] = [];\n\n\t\tfor (const flatNode of entries) {\n\t\t\tnodeMap.set(flatNode.entry.id, { ...flatNode, children: [] });\n\t\t}\n\n\t\tfor (const flatNode of entries) {\n\t\t\tconst entry = flatNode.entry;\n\t\t\tconst node = nodeMap.get(entry.id)!;\n\t\t\tif (entry.parentId === null || entry.parentId === entry.id) {\n\t\t\t\troots.push(node);\n\t\t\t} else {\n\t\t\t\tconst parent = nodeMap.get(entry.parentId);\n\t\t\t\tif (parent) {\n\t\t\t\t\tparent.children.push(node);\n\t\t\t\t} else {\n\t\t\t\t\troots.push(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Sort children by timestamp (oldest first, newest at bottom)\n\t\t// Use iterative approach to avoid stack overflow on deep trees\n\t\tconst stack: SessionTreeNode[] = [...roots];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop()!;\n\t\t\tnode.children.sort((a, b) => new Date(a.entry.timestamp).getTime() - new Date(b.entry.timestamp).getTime());\n\t\t\tstack.push(...node.children);\n\t\t}\n\n\t\treturn roots;\n\t}\n\n\tbranch(branchFromId: string): void {\n\t\tif (!this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t}\n\n\tresetLeaf(): void {\n\t\tthis.leafId = null;\n\t}\n\n\tbranchWithSummary(branchFromId: string | null, summary: string, details?: unknown, fromHook?: boolean): string {\n\t\tif (branchFromId !== null && !this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: branchFromId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId: branchFromId ?? \"root\",\n\t\t\tsummary,\n\t\t\tdetails,\n\t\t\tfromHook,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tcreateBranchedSession(leafId: string): string | undefined {\n\t\tconst previousSessionFile = this.sessionFile;\n\t\tconst path = this.getBranch(leafId);\n\t\tif (path.length === 0) {\n\t\t\tthrow new Error(`Entry ${leafId} not found`);\n\t\t}\n\n\t\tconst pathWithoutLabels = path.filter((e) => e.type !== \"label\");\n\n\t\tconst target = this.persist\n\t\t\t? createUniqueSessionFileTarget(this.getSessionDir())\n\t\t\t: { sessionId: createSessionId(), sessionFile: undefined };\n\t\tconst newSessionId = target.sessionId;\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst newSessionFile = target.sessionFile;\n\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: newSessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: this.persist ? previousSessionFile : undefined,\n\t\t\trlmDepth: resolveSessionRlmDepth(this.getHeader() ?? {}, previousSessionFile ?? newSessionFile ?? \"\"),\n\t\t\tgit: this.persist ? (captureGitContext(this.cwd) ?? undefined) : undefined,\n\t\t};\n\n\t\tconst pathEntryIds = new Set(pathWithoutLabels.map((e) => e.id));\n\t\tconst labelsToWrite: Array<{ targetId: string; label: string; timestamp: string }> = [];\n\t\tfor (const [targetId, label] of this.labelsById) {\n\t\t\tif (pathEntryIds.has(targetId)) {\n\t\t\t\tlabelsToWrite.push({ targetId, label, timestamp: this.labelTimestampsById.get(targetId)! });\n\t\t\t}\n\t\t}\n\n\t\tif (this.persist) {\n\t\t\tconst lastEntryId = pathWithoutLabels[pathWithoutLabels.length - 1]?.id || null;\n\t\t\tlet parentId = lastEntryId;\n\t\t\tconst labelEntries: LabelEntry[] = [];\n\t\t\tfor (const { targetId, label, timestamp: labelTimestamp } of labelsToWrite) {\n\t\t\t\tconst labelEntry: LabelEntry = {\n\t\t\t\t\ttype: \"label\",\n\t\t\t\t\tid: generateId(new Set(pathEntryIds)),\n\t\t\t\t\tparentId,\n\t\t\t\t\ttimestamp: labelTimestamp,\n\t\t\t\t\ttargetId,\n\t\t\t\t\tlabel,\n\t\t\t\t};\n\t\t\t\tpathEntryIds.add(labelEntry.id);\n\t\t\t\tlabelEntries.push(labelEntry);\n\t\t\t\tparentId = labelEntry.id;\n\t\t\t}\n\n\t\t\tthis.fileEntries = [header, ...pathWithoutLabels, ...labelEntries];\n\t\t\tthis.sessionId = newSessionId;\n\t\t\tthis.sessionFile = newSessionFile;\n\t\t\tthis._buildIndex();\n\n\t\t\t// Only write the file now if it contains an assistant message.\n\t\t\t// Otherwise defer to _persist(), which creates the file on the\n\t\t\t// first assistant response, matching the newSession() contract\n\t\t\t// and avoiding the duplicate-header bug when _persist()'s\n\t\t\t// no-assistant guard later resets flushed to false.\n\t\t\tconst hasAssistant = this.fileEntries.some((e) => e.type === \"message\" && e.message.role === \"assistant\");\n\t\t\tif (hasAssistant) {\n\t\t\t\tthis._rewriteFile();\n\t\t\t\tthis.flushed = true;\n\t\t\t} else {\n\t\t\t\tthis.flushed = false;\n\t\t\t}\n\n\t\t\treturn newSessionFile;\n\t\t}\n\n\t\tconst labelEntries: LabelEntry[] = [];\n\t\tlet parentId = pathWithoutLabels[pathWithoutLabels.length - 1]?.id || null;\n\t\tfor (const { targetId, label, timestamp: labelTimestamp } of labelsToWrite) {\n\t\t\tconst labelEntry: LabelEntry = {\n\t\t\t\ttype: \"label\",\n\t\t\t\tid: generateId(new Set([...pathEntryIds, ...labelEntries.map((e) => e.id)])),\n\t\t\t\tparentId,\n\t\t\t\ttimestamp: labelTimestamp,\n\t\t\t\ttargetId,\n\t\t\t\tlabel,\n\t\t\t};\n\t\t\tlabelEntries.push(labelEntry);\n\t\t\tparentId = labelEntry.id;\n\t\t}\n\t\tthis.fileEntries = [header, ...pathWithoutLabels, ...labelEntries];\n\t\tthis.sessionId = newSessionId;\n\t\tthis._buildIndex();\n\t\treturn undefined;\n\t}\n\n\tstatic create(cwd: string, sessionDir?: string): SessionManager {\n\t\tconst dir = sessionDir ?? getDefaultSessionDir(cwd);\n\t\treturn new SessionManager(cwd, dir, undefined, true);\n\t}\n\n\tstatic open(path: string, sessionDir?: string, cwdOverride?: string): SessionManager {\n\t\t// Only the header's cwd is needed to construct the manager; the constructor\n\t\t// (setSessionFile) performs the full parse. Read just the first line here\n\t\t// instead of parsing the entire file a second time — that double parse is a\n\t\t// needless O(n) cost on open and is noticeable for long sessions.\n\t\tlet cwd = cwdOverride;\n\t\tif (cwd === undefined) {\n\t\t\tlet header: Partial<SessionHeader> | undefined;\n\t\t\ttry {\n\t\t\t\theader = readSessionHeader(path);\n\t\t\t} catch {\n\t\t\t\theader = undefined;\n\t\t\t}\n\t\t\t// readSessionHeader only inspects the first physical line. If that isn't a\n\t\t\t// valid session header (e.g. a leading blank/whitespace or malformed line),\n\t\t\t// fall back to the full loader, which trims and skips such lines exactly\n\t\t\t// like setSessionFile does — so this.cwd stays consistent with the header\n\t\t\t// the session is actually loaded with. This slow path is rare.\n\t\t\tif (header?.type !== \"session\" || typeof header.id !== \"string\") {\n\t\t\t\theader = loadEntriesFromFile(path).find((e) => e.type === \"session\") as SessionHeader | undefined;\n\t\t\t}\n\t\t\tcwd = header?.cwd;\n\t\t}\n\t\tconst dir = sessionDir ?? resolve(path, \"..\");\n\t\treturn new SessionManager(cwd ?? process.cwd(), dir, path, true);\n\t}\n\n\tstatic async openAsync(path: string, sessionDir?: string, cwdOverride?: string): Promise<SessionManager> {\n\t\tif (!existsSync(path)) {\n\t\t\treturn SessionManager.open(path, sessionDir, cwdOverride);\n\t\t}\n\t\tconst entries = await loadEntriesFromFileAsync(path);\n\t\tif (entries.length === 0) {\n\t\t\treturn SessionManager.open(path, sessionDir, cwdOverride);\n\t\t}\n\t\tconst cwd = cwdOverride ?? (entries[0] as SessionHeader).cwd;\n\t\tconst dir = sessionDir ?? resolve(path, \"..\");\n\t\treturn new SessionManager(cwd ?? process.cwd(), dir, path, true, entries);\n\t}\n\n\tstatic continueRecent(cwd: string, sessionDir?: string): SessionManager {\n\t\tconst dir = sessionDir ?? getDefaultSessionDir(cwd);\n\t\tconst mostRecent = findMostRecentSessionForCwd(dir, cwd);\n\t\tif (mostRecent) {\n\t\t\treturn new SessionManager(cwd, dir, mostRecent, true);\n\t\t}\n\t\treturn new SessionManager(cwd, dir, undefined, true);\n\t}\n\n\tstatic inMemory(cwd: string = process.cwd(), sessionDir = \"\"): SessionManager {\n\t\treturn new SessionManager(cwd, sessionDir, undefined, false);\n\t}\n\n\tstatic forkFrom(sourcePath: string, targetCwd: string, sessionDir?: string): SessionManager {\n\t\tconst sourceEntries = loadEntriesFromFile(sourcePath);\n\t\tif (sourceEntries.length === 0) {\n\t\t\tthrow new Error(`Cannot fork: source session file is empty or invalid: ${sourcePath}`);\n\t\t}\n\n\t\tconst sourceHeader = sourceEntries.find((e) => e.type === \"session\") as SessionHeader | undefined;\n\t\tif (!sourceHeader) {\n\t\t\tthrow new Error(`Cannot fork: source session has no header: ${sourcePath}`);\n\t\t}\n\t\tmigrateToCurrentVersion(sourceEntries);\n\n\t\tconst dir = sessionDir ?? getDefaultSessionDir(targetCwd);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tconst target = createUniqueSessionFileTarget(dir);\n\t\tconst newSessionId = target.sessionId;\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst newSessionFile = target.sessionFile;\n\n\t\tconst newHeader: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: newSessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: targetCwd,\n\t\t\tparentSession: sourcePath,\n\t\t\trlmDepth: resolveSessionRlmDepth(sourceHeader, sourcePath),\n\t\t\tgit: captureGitContext(targetCwd) ?? undefined,\n\t\t};\n\t\tappendFileSync(newSessionFile, `${JSON.stringify(newHeader)}\\n`);\n\n\t\t// Drop the source's git_state entries (re-linking children): they describe the source repo,\n\t\t// so the fork would otherwise report the source's git instead of its own target context.\n\t\tconst droppedParent = new Map<string, string | null>();\n\t\tfor (const entry of sourceEntries) {\n\t\t\tif (entry.type === \"git_state\") droppedParent.set(entry.id, entry.parentId);\n\t\t}\n\t\tconst liveParent = (parentId: string | null): string | null => {\n\t\t\tlet pid = parentId;\n\t\t\twhile (pid !== null && droppedParent.has(pid)) pid = droppedParent.get(pid) ?? null;\n\t\t\treturn pid;\n\t\t};\n\t\tfor (const entry of sourceEntries) {\n\t\t\tif (entry.type === \"session\" || entry.type === \"git_state\") continue;\n\t\t\tconst parentId = liveParent(entry.parentId);\n\t\t\tconst out = parentId === entry.parentId ? entry : { ...entry, parentId };\n\t\t\tappendFileSync(newSessionFile, `${JSON.stringify(out)}\\n`);\n\t\t}\n\n\t\treturn new SessionManager(targetCwd, dir, newSessionFile, true);\n\t}\n\n\tstatic async list(cwd: string, sessionDir?: string, callbacks?: SessionListCallbacks): Promise<SessionInfo[]> {\n\t\tconst dir = sessionDir ?? getDefaultSessionDir(cwd);\n\t\tconst matchesCwd = (session: SessionInfo) => sessionInfoMatchesCwd(session, cwd);\n\t\tconst sessions = (\n\t\t\tawait listSessionsFromDir(dir, {\n\t\t\t\tonProgress: callbacks?.onProgress,\n\t\t\t\tonSession: callbacks?.onSession\n\t\t\t\t\t? (session) => {\n\t\t\t\t\t\t\tif (matchesCwd(session)) {\n\t\t\t\t\t\t\t\tcallbacks.onSession?.(session);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t})\n\t\t).filter(matchesCwd);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n\n\tstatic async listAll(callbacks?: SessionListCallbacks, sessionDir?: string): Promise<SessionInfo[]> {\n\t\tconst sessionsDir = sessionDir ?? getSessionsDir();\n\t\tconst sessions = await listSessionsFromDir(sessionsDir, callbacks);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@asm-agent/agent\";\nimport type { AssistantMessage, ImageContent, Message, ServiceTier, TextContent, Usage } from \"@asm-agent/ai\";\nimport { randomUUID } from \"crypto\";\nimport {\n\tappendFileSync,\n\tchmodSync,\n\tchownSync,\n\texistsSync,\n\tmkdirSync,\n\treaddirSync,\n\treadFileSync,\n\trealpathSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n\twriteFileSync,\n} from \"fs\";\nimport { readdir, readFile, stat } from \"fs/promises\";\nimport { basename, dirname, join, resolve } from \"path\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport { getAgentDir as getDefaultAgentDir, getSessionsDir } from \"../config.js\";\nimport { readFirstLineSync, readLinesAsBuffers } from \"../utils/file-lines.js\";\nimport { captureGitContext, type GitContext, gitContextsEqual } from \"../utils/git.js\";\nimport {\n\ttype BashExecutionMessage,\n\ttype CustomMessage,\n\tcreateBranchSummaryMessage,\n\tcreateCompactionSummaryMessage,\n\tcreateCustomMessage,\n} from \"./messages.js\";\nimport { cloneUsage } from \"./usage.js\";\n\nexport const CURRENT_SESSION_VERSION = 3;\nconst SESSION_LIST_SEARCH_TEXT_MAX_CHARS = 64 * 1024;\nconst SESSION_LIST_PARSE_MAX_LINE_CHARS = 1024 * 1024;\nconst SESSION_LIST_LARGE_MESSAGE_PREVIEW_MAX_CHARS = 256;\nconst SESSION_STREAMING_LOAD_THRESHOLD_BYTES = 128 * 1024 * 1024;\nconst SESSION_ASYNC_PARSE_YIELD_BYTES = 4 * 1024 * 1024;\n\n// Entry types that can represent user intent (vs. daemon bookkeeping like\n// session_state/agent_status/git_state/child_usage_attributed). Used by\n// hasUserContent to decide whether a message-less draft is safe to discard.\nconst CONTENT_ENTRY_TYPES = new Set([\n\t\"message\",\n\t\"custom_message\",\n\t\"custom\",\n\t\"model_change\",\n\t\"thinking_level_change\",\n\t\"service_tier_change\",\n\t\"session_info\",\n\t\"label\",\n\t\"compaction\",\n\t\"branch_summary\",\n]);\n\nfunction realpathIfPresent(path: string): string {\n\ttry {\n\t\treturn realpathSync(path);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return path;\n\t\tthrow error;\n\t}\n}\n\nfunction statMetadataIfPresent(path: string): { mode: number; uid: number; gid: number } | undefined {\n\ttry {\n\t\tconst { mode, uid, gid } = statSync(path);\n\t\treturn { mode: mode & 0o777, uid, gid };\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n\t\tthrow error;\n\t}\n}\n\nexport interface SessionHeader {\n\ttype: \"session\";\n\tversion?: number; // v1 sessions don't have this\n\tid: string;\n\ttimestamp: string;\n\tcwd: string;\n\tparentSession?: string;\n\trlmDepth?: number;\n\tgit?: GitContext;\n}\n\nexport interface NewSessionOptions {\n\tid?: string;\n\tparentSession?: string;\n\trlmDepth?: number;\n}\n\nexport interface SessionEntryBase {\n\ttype: string;\n\tid: string;\n\tparentId: string | null;\n\ttimestamp: string;\n}\n\nexport interface SessionMessageEntry extends SessionEntryBase {\n\ttype: \"message\";\n\tmessage: AgentMessage;\n}\n\ntype AssistantSessionMessageEntry = SessionMessageEntry & { message: AssistantMessage };\n\nexport interface ThinkingLevelChangeEntry extends SessionEntryBase {\n\ttype: \"thinking_level_change\";\n\tthinkingLevel: string;\n}\n\nexport interface ServiceTierChangeEntry extends SessionEntryBase {\n\ttype: \"service_tier_change\";\n\tserviceTier: ServiceTier;\n}\n\nexport interface ModelChangeEntry extends SessionEntryBase {\n\ttype: \"model_change\";\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport interface CompactionEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"compaction\";\n\tsummary: string;\n\tfirstKeptEntryId: string;\n\ttokensBefore: number;\n\tdetails?: T;\n\tfromHook?: boolean;\n\tcustomInstructions?: string;\n}\n\nexport interface BranchSummaryEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"branch_summary\";\n\tfromId: string;\n\tsummary: string;\n\tdetails?: T;\n\tfromHook?: boolean;\n}\n\nexport interface CustomEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"custom\";\n\tcustomType: string;\n\tdata?: T;\n}\n\n/**\n * Records usage folded into a parent assistant message after an RLM child run.\n * The child usage is kept separately so audit/UI code can explain why the\n * parent turn's aggregate usage exceeds the parent model response itself.\n */\nexport interface ChildUsageAttributionEntry extends SessionEntryBase {\n\ttype: \"child_usage_attributed\";\n\ttargetId: string;\n\tchildUsage: Usage;\n\taggregateUsage: Usage;\n\torigin?: \"spawn_task\" | \"agent_message\" | \"direct_user\";\n}\n\nexport interface LabelEntry extends SessionEntryBase {\n\ttype: \"label\";\n\ttargetId: string;\n\tlabel: string | undefined;\n}\n\nexport interface SessionInfoEntry extends SessionEntryBase {\n\ttype: \"session_info\";\n\tname?: string;\n}\n\nexport type SessionStateStatus = \"active\" | \"archived\" | \"crash\";\n\nexport interface SessionState {\n\tstatus: SessionStateStatus;\n}\n\nexport interface SessionStateEntry extends SessionEntryBase {\n\ttype: \"session_state\";\n\tstate: SessionState;\n}\n\nexport type AgentTaskState = \"needs_input\" | \"completed\";\n\nexport interface AgentStatus {\n\tsummary: string;\n\ttaskState?: AgentTaskState;\n\tbasedOnMessageCount: number;\n}\n\nexport interface AgentStatusEntry extends SessionEntryBase {\n\ttype: \"agent_status\";\n\tstatus: AgentStatus;\n}\n\nexport interface GitStateEntry extends SessionEntryBase {\n\ttype: \"git_state\";\n\tgit: GitContext;\n}\n\nexport interface CustomMessageEntry<T = unknown> extends SessionEntryBase {\n\ttype: \"custom_message\";\n\tcustomType: string;\n\tcontent: string | (TextContent | ImageContent)[];\n\tdetails?: T;\n\tdisplay: boolean;\n}\n\nexport type SessionEntry =\n\t| SessionMessageEntry\n\t| ThinkingLevelChangeEntry\n\t| ServiceTierChangeEntry\n\t| ModelChangeEntry\n\t| CompactionEntry\n\t| BranchSummaryEntry\n\t| CustomEntry\n\t| ChildUsageAttributionEntry\n\t| CustomMessageEntry\n\t| LabelEntry\n\t| SessionInfoEntry\n\t| SessionStateEntry\n\t| AgentStatusEntry\n\t| GitStateEntry;\n\nexport type FileEntry = SessionHeader | SessionEntry;\n\nexport interface SessionTreeFlatNode {\n\tentry: SessionEntry;\n\tlabel?: string;\n\tlabelTimestamp?: string;\n}\n\nexport interface SessionTreeNode extends SessionTreeFlatNode {\n\tchildren: SessionTreeNode[];\n}\n\nexport interface SessionContext {\n\tmessages: AgentMessage[];\n\tthinkingLevel: string;\n\tserviceTier: ServiceTier;\n\tmodel: { provider: string; modelId: string } | null;\n}\n\nexport interface SessionInfo {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tstate?: SessionState;\n\tparentSessionPath?: string;\n\trlmDepth: number;\n\tcreated: Date;\n\tmodified: Date;\n\tmessageCount: number;\n\tfirstMessage: string;\n\tallMessagesText: string;\n\tagentStatus?: AgentStatus;\n}\n\nexport type ReadonlySessionManager = Pick<\n\tSessionManager,\n\t| \"getCwd\"\n\t| \"getSessionDir\"\n\t| \"getSessionId\"\n\t| \"getSessionFile\"\n\t| \"getLeafId\"\n\t| \"getLeafEntry\"\n\t| \"getEntry\"\n\t| \"getLabel\"\n\t| \"getBranch\"\n\t| \"getHeader\"\n\t| \"getEntries\"\n\t| \"getTree\"\n\t| \"getSessionName\"\n>;\n\nfunction createSessionId(): string {\n\treturn uuidv7();\n}\n\nfunction getSessionFilePath(sessionDir: string, sessionId: string): string {\n\treturn join(sessionDir, `${sessionId}.jsonl`);\n}\n\nfunction createUniqueSessionFileTarget(sessionDir: string): { sessionId: string; sessionFile: string } {\n\tfor (let i = 0; i < 100; i++) {\n\t\tconst sessionId = createSessionId();\n\t\tconst sessionFile = getSessionFilePath(sessionDir, sessionId);\n\t\tif (!existsSync(sessionFile)) {\n\t\t\treturn { sessionId, sessionFile };\n\t\t}\n\t}\n\tthrow new Error(\"Unable to create a unique session file\");\n}\n\nexport function getSessionArtifactsRoot(sessionDir: string): string {\n\treturn join(dirname(sessionDir), \"session-artifacts\");\n}\n\nexport function getSessionArtifactPath(sessionDir: string, sessionId: string): string {\n\treturn join(getSessionArtifactsRoot(sessionDir), sessionId);\n}\n\nexport function getSessionArtifactPathForFile(sessionFile: string, sessionId?: string): string {\n\treturn getSessionArtifactPath(dirname(sessionFile), sessionId ?? basename(sessionFile).replace(/\\.jsonl$/, \"\"));\n}\n\nfunction generateId(byId: { has(id: string): boolean }): string {\n\tfor (let i = 0; i < 100; i++) {\n\t\tconst id = randomUUID().slice(0, 8);\n\t\tif (!byId.has(id)) return id;\n\t}\n\treturn randomUUID();\n}\n\nfunction migrateV1ToV2(entries: FileEntry[]): void {\n\tconst ids = new Set<string>();\n\tlet prevId: string | null = null;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.id = generateId(ids);\n\t\tentry.parentId = prevId;\n\t\tprevId = entry.id;\n\n\t\tif (entry.type === \"compaction\") {\n\t\t\tconst comp = entry as CompactionEntry & { firstKeptEntryIndex?: number };\n\t\t\tif (typeof comp.firstKeptEntryIndex === \"number\") {\n\t\t\t\tconst targetEntry = entries[comp.firstKeptEntryIndex];\n\t\t\t\tif (targetEntry && targetEntry.type !== \"session\") {\n\t\t\t\t\tcomp.firstKeptEntryId = targetEntry.id;\n\t\t\t\t}\n\t\t\t\tdelete comp.firstKeptEntryIndex;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction migrateV2ToV3(entries: FileEntry[]): void {\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 3;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msgEntry = entry as SessionMessageEntry;\n\t\t\tif (msgEntry.message && (msgEntry.message as { role: string }).role === \"hookMessage\") {\n\t\t\t\t(msgEntry.message as { role: string }).role = \"custom\";\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction migrateToCurrentVersion(entries: FileEntry[]): boolean {\n\tconst header = entries.find((e) => e.type === \"session\") as SessionHeader | undefined;\n\tconst version = header?.version ?? 1;\n\n\tif (version >= CURRENT_SESSION_VERSION) return false;\n\n\tif (version < 2) migrateV1ToV2(entries);\n\tif (version < 3) migrateV2ToV3(entries);\n\n\treturn true;\n}\n\nexport function migrateSessionEntries(entries: FileEntry[]): void {\n\tmigrateToCurrentVersion(entries);\n}\n\nexport function parseSessionEntries(content: string): FileEntry[] {\n\tconst entries: FileEntry[] = [];\n\tconst lines = content.trim().split(\"\\n\");\n\n\tfor (const line of lines) {\n\t\tif (!line.trim()) continue;\n\t\ttry {\n\t\t\tconst entry = JSON.parse(line) as FileEntry;\n\t\t\tentries.push(entry);\n\t\t} catch {\n\t\t\t// Skip malformed lines.\n\t\t}\n\t}\n\n\tapplyChildUsageAttributions(entries);\n\treturn entries;\n}\n\nfunction applyChildUsageAttributions(entries: FileEntry[]): void {\n\tconst assistantEntriesById = new Map<string, AssistantSessionMessageEntry>();\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tassistantEntriesById.set(entry.id, entry as AssistantSessionMessageEntry);\n\t\t}\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"child_usage_attributed\") continue;\n\t\tconst target = assistantEntriesById.get(entry.targetId);\n\t\tif (!target) continue;\n\t\ttarget.message.usage = cloneUsage(entry.aggregateUsage);\n\t}\n}\n\nexport function getLatestCompactionEntry(entries: SessionEntry[]): CompactionEntry | null {\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tif (entries[i].type === \"compaction\") {\n\t\t\treturn entries[i] as CompactionEntry;\n\t\t}\n\t}\n\treturn null;\n}\n\nexport function buildSessionContext(\n\tentries: SessionEntry[],\n\tleafId?: string | null,\n\tbyId?: Map<string, SessionEntry>,\n): SessionContext {\n\tif (!byId) {\n\t\tbyId = new Map<string, SessionEntry>();\n\t\tfor (const entry of entries) {\n\t\t\tbyId.set(entry.id, entry);\n\t\t}\n\t}\n\n\tlet leaf: SessionEntry | undefined;\n\tif (leafId === null) {\n\t\treturn { messages: [], thinkingLevel: \"off\", serviceTier: \"default\", model: null };\n\t}\n\tif (leafId) {\n\t\tleaf = byId.get(leafId);\n\t}\n\tif (!leaf) {\n\t\tleaf = entries[entries.length - 1];\n\t}\n\n\tif (!leaf) {\n\t\treturn { messages: [], thinkingLevel: \"off\", serviceTier: \"default\", model: null };\n\t}\n\n\t// push+reverse, not unshift-per-entry: unshift is O(n), making this O(n^2) on long sessions.\n\tconst path: SessionEntry[] = [];\n\tlet current: SessionEntry | undefined = leaf;\n\twhile (current) {\n\t\tpath.push(current);\n\t\tcurrent = current.parentId ? byId.get(current.parentId) : undefined;\n\t}\n\tpath.reverse();\n\n\tlet thinkingLevel = \"off\";\n\tlet serviceTier: ServiceTier = \"default\";\n\tlet model: { provider: string; modelId: string } | null = null;\n\tlet compaction: CompactionEntry | null = null;\n\n\tfor (const entry of path) {\n\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\tthinkingLevel = entry.thinkingLevel;\n\t\t} else if (entry.type === \"service_tier_change\") {\n\t\t\tserviceTier = entry.serviceTier;\n\t\t} else if (entry.type === \"model_change\") {\n\t\t\tmodel = { provider: entry.provider, modelId: entry.modelId };\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tmodel = { provider: entry.message.provider, modelId: entry.message.model };\n\t\t} else if (entry.type === \"compaction\") {\n\t\t\tcompaction = entry;\n\t\t}\n\t}\n\n\t// Build messages and collect corresponding entries\n\t// When there's a compaction, model context remains summary-first while the\n\t// summary records where clients should present it among retained messages.\n\tconst messages: AgentMessage[] = [];\n\n\tconst appendMessage = (entry: SessionEntry, target = messages) => {\n\t\tif (entry.type === \"message\") {\n\t\t\ttarget.push(entry.message);\n\t\t} else if (entry.type === \"custom_message\") {\n\t\t\ttarget.push(\n\t\t\t\tcreateCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp),\n\t\t\t);\n\t\t} else if (entry.type === \"branch_summary\" && entry.summary) {\n\t\t\ttarget.push(createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));\n\t\t}\n\t};\n\n\tif (compaction) {\n\t\tconst compactionIdx = path.findIndex((e) => e.type === \"compaction\" && e.id === compaction.id);\n\n\t\t// Collect kept messages (before compaction, starting from firstKeptEntryId).\n\t\t// The context remains summary-first for the model; retainedMessageCount records\n\t\t// the exact chronological presentation boundary for clients.\n\t\tconst retainedMessages: AgentMessage[] = [];\n\t\tlet foundFirstKept = false;\n\t\tfor (let i = 0; i < compactionIdx; i++) {\n\t\t\tconst entry = path[i];\n\t\t\tif (entry.id === compaction.firstKeptEntryId) {\n\t\t\t\tfoundFirstKept = true;\n\t\t\t}\n\t\t\tif (foundFirstKept) {\n\t\t\t\tappendMessage(entry, retainedMessages);\n\t\t\t}\n\t\t}\n\n\t\tmessages.push(\n\t\t\tcreateCompactionSummaryMessage(\n\t\t\t\tcompaction.summary,\n\t\t\t\tcompaction.tokensBefore,\n\t\t\t\tcompaction.timestamp,\n\t\t\t\tcompaction.customInstructions,\n\t\t\t\tretainedMessages.length,\n\t\t\t),\n\t\t\t...retainedMessages,\n\t\t);\n\n\t\tfor (let i = compactionIdx + 1; i < path.length; i++) {\n\t\t\tconst entry = path[i];\n\t\t\tappendMessage(entry);\n\t\t}\n\t} else {\n\t\tfor (const entry of path) {\n\t\t\tappendMessage(entry);\n\t\t}\n\t}\n\n\treturn { messages, thinkingLevel, serviceTier, model };\n}\n\nexport function getDefaultSessionDir(_cwd: string, agentDir: string = getDefaultAgentDir()): string {\n\tconst sessionDir = getSessionsDir(agentDir);\n\tif (!existsSync(sessionDir)) {\n\t\tmkdirSync(sessionDir, { recursive: true });\n\t}\n\treturn sessionDir;\n}\n\n// Decode per line off a Buffer: toString(\"utf8\") on a whole large file is far slower\n// (one giant UTF-16 string). Splitting on 0x0a is UTF-8-safe.\nfunction appendEntryFromBuffer(entries: FileEntry[], buffer: Buffer, start = 0, end = buffer.length): void {\n\tif (end <= start) return;\n\ttry {\n\t\tentries.push(JSON.parse(buffer.toString(\"utf8\", start, end)) as FileEntry);\n\t} catch {\n\t\t// Skip malformed or blank lines.\n\t}\n}\n\nfunction parseEntriesFromBuffer(buffer: Buffer): FileEntry[] {\n\tconst entries: FileEntry[] = [];\n\tlet start = 0;\n\twhile (start < buffer.length) {\n\t\tlet end = buffer.indexOf(0x0a, start);\n\t\tif (end === -1) end = buffer.length;\n\t\tappendEntryFromBuffer(entries, buffer, start, end);\n\t\tstart = end + 1;\n\t}\n\treturn entries;\n}\n\nasync function parseEntriesFromBufferAsync(buffer: Buffer): Promise<FileEntry[]> {\n\tconst entries: FileEntry[] = [];\n\tlet start = 0;\n\tlet bytesSinceYield = 0;\n\twhile (start < buffer.length) {\n\t\tlet end = buffer.indexOf(0x0a, start);\n\t\tif (end === -1) end = buffer.length;\n\t\tappendEntryFromBuffer(entries, buffer, start, end);\n\t\tbytesSinceYield += end - start + 1;\n\t\tstart = end + 1;\n\t\tif (bytesSinceYield >= SESSION_ASYNC_PARSE_YIELD_BYTES) {\n\t\t\tbytesSinceYield = 0;\n\t\t\tawait new Promise<void>((resolve) => setImmediate(resolve));\n\t\t}\n\t}\n\treturn entries;\n}\n\nfunction finalizeLoadedEntries(entries: FileEntry[]): FileEntry[] {\n\tif (entries.length === 0) return entries;\n\tconst header = entries[0];\n\tif (header.type !== \"session\" || typeof (header as any).id !== \"string\") {\n\t\treturn [];\n\t}\n\tapplyChildUsageAttributions(entries);\n\treturn entries;\n}\n\nexport function loadEntriesFromFile(filePath: string): FileEntry[] {\n\tif (!existsSync(filePath)) return [];\n\treturn finalizeLoadedEntries(parseEntriesFromBuffer(readFileSync(filePath)));\n}\n\n// Async loader for the daemon: reads off the event loop and yields while parsing so a\n// large load doesn't freeze other sessions. Large files stream to avoid retaining both\n// the full input Buffer and the parsed entry graph at the same time.\nexport async function loadEntriesFromFileAsync(\n\tfilePath: string,\n\toptions: { streamThresholdBytes?: number } = {},\n): Promise<FileEntry[]> {\n\tif (!existsSync(filePath)) return [];\n\tconst streamThresholdBytes = options.streamThresholdBytes ?? SESSION_STREAMING_LOAD_THRESHOLD_BYTES;\n\tif ((await stat(filePath)).size < streamThresholdBytes) {\n\t\treturn finalizeLoadedEntries(await parseEntriesFromBufferAsync(await readFile(filePath)));\n\t}\n\n\tconst entries: FileEntry[] = [];\n\tlet bytesSinceYield = 0;\n\tfor await (const line of readLinesAsBuffers(filePath)) {\n\t\tappendEntryFromBuffer(entries, line);\n\t\tbytesSinceYield += line.length + 1;\n\t\tif (bytesSinceYield >= SESSION_ASYNC_PARSE_YIELD_BYTES) {\n\t\t\tbytesSinceYield = 0;\n\t\t\tawait new Promise<void>((resolve) => setImmediate(resolve));\n\t\t}\n\t}\n\treturn finalizeLoadedEntries(entries);\n}\n\nfunction readSessionHeader(filePath: string): Partial<SessionHeader> | undefined {\n\tconst firstLine = readFirstLineSync(filePath);\n\tif (!firstLine) {\n\t\treturn undefined;\n\t}\n\treturn JSON.parse(firstLine) as Partial<SessionHeader>;\n}\n\nfunction isValidRlmDepth(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nexport function resolveSessionRlmDepth(\n\theader: { rlmDepth?: number; parentSession?: string },\n\tsessionPath: string,\n): number {\n\treturn resolveLegacySessionRlmDepth(header, sessionPath, new Set()) ?? legacyChildDepthFromPath(sessionPath);\n}\n\nfunction resolveLegacySessionRlmDepth(\n\theader: { rlmDepth?: number; parentSession?: string },\n\tsessionPath: string,\n\tvisitedPaths: Set<string>,\n): number | undefined {\n\tif (isValidRlmDepth(header.rlmDepth)) {\n\t\treturn header.rlmDepth;\n\t}\n\tif (!header.parentSession) {\n\t\treturn 0;\n\t}\n\n\tconst resolvedSessionPath = resolve(sessionPath);\n\tif (visitedPaths.has(resolvedSessionPath)) {\n\t\treturn undefined;\n\t}\n\tvisitedPaths.add(resolvedSessionPath);\n\n\tconst pathDepth = legacyChildDepthFromPath(sessionPath);\n\tconst parentSessionPath = resolve(dirname(sessionPath), header.parentSession);\n\ttry {\n\t\tconst parentHeader = readSessionHeader(parentSessionPath);\n\t\tif (parentHeader) {\n\t\t\tconst parentDepth = resolveLegacySessionRlmDepth(parentHeader, parentSessionPath, visitedPaths);\n\t\t\tif (parentDepth !== undefined) {\n\t\t\t\treturn pathDepth > 0 ? parentDepth + 1 : parentDepth;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Fall back to artifact ancestry for unavailable or invalid legacy parents.\n\t} finally {\n\t\tvisitedPaths.delete(resolvedSessionPath);\n\t}\n\treturn pathDepth;\n}\n\nfunction legacyChildDepthFromPath(sessionPath: string): number {\n\tlet depth = 0;\n\tfor (const segment of dirname(sessionPath)\n\t\t.split(/[\\\\/]+/)\n\t\t.reverse()) {\n\t\tif (!/^sub-[0-9a-f]{8}$/.test(segment)) {\n\t\t\tbreak;\n\t\t}\n\t\tdepth += 1;\n\t}\n\treturn depth;\n}\n\nfunction deriveChildRlmDepth(parentHeader: Partial<SessionHeader> | undefined): number | undefined {\n\tconst depth = parentHeader?.rlmDepth;\n\treturn isValidRlmDepth(depth) && depth < Number.MAX_SAFE_INTEGER ? depth + 1 : undefined;\n}\n\nfunction rootRlmDepthFromEnv(): number {\n\tconst value = process.env.RLM_DEPTH;\n\tif (value === undefined || value === \"\") {\n\t\treturn 0;\n\t}\n\tconst parsed = Number(value);\n\tif (!/^\\d+$/.test(value) || !isValidRlmDepth(parsed)) {\n\t\tthrow new Error(\"RLM_DEPTH must be a non-negative integer\");\n\t}\n\treturn parsed;\n}\n\nfunction isValidSessionFile(filePath: string): boolean {\n\ttry {\n\t\tconst header = readSessionHeader(filePath);\n\t\treturn header?.type === \"session\" && typeof header.id === \"string\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function findMostRecentSession(sessionDir: string): string | null {\n\ttry {\n\t\tconst files = readdirSync(sessionDir)\n\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t.map((f) => join(sessionDir, f))\n\t\t\t.filter(isValidSessionFile)\n\t\t\t.map((path) => ({ path, mtime: statSync(path).mtime }))\n\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\treturn files[0]?.path || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction normalizeCwd(cwd: string): string {\n\treturn resolve(cwd);\n}\n\nfunction sessionInfoMatchesCwd(session: SessionInfo, cwd: string): boolean {\n\treturn !!session.cwd && normalizeCwd(session.cwd) === normalizeCwd(cwd);\n}\n\nfunction sessionHeaderMatchesCwd(header: Partial<SessionHeader> | undefined, cwd: string): boolean {\n\treturn (\n\t\theader?.type === \"session\" &&\n\t\ttypeof header.id === \"string\" &&\n\t\ttypeof header.cwd === \"string\" &&\n\t\tnormalizeCwd(header.cwd) === normalizeCwd(cwd)\n\t);\n}\n\nexport function findMostRecentSessionForCwd(sessionDir: string, cwd: string): string | null {\n\ttry {\n\t\tconst files = readdirSync(sessionDir)\n\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t.map((f) => join(sessionDir, f))\n\t\t\t.map((path) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst header = readSessionHeader(path);\n\t\t\t\t\tif (!sessionHeaderMatchesCwd(header, cwd)) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn { path, mtime: statSync(path).mtime };\n\t\t\t\t} catch {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter((entry): entry is { path: string; mtime: Date } => entry !== undefined)\n\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\treturn files[0]?.path || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isMessageWithContent(message: AgentMessage): message is Message {\n\treturn typeof (message as Message).role === \"string\" && \"content\" in message;\n}\n\nfunction extractTextContent(message: Message): string {\n\tconst content = message.content;\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\treturn content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\" \");\n}\n\nfunction normalizeSessionStateStatus(value: unknown): SessionStateStatus | undefined {\n\tif (value === \"active\" || value === \"archived\" || value === \"crash\") {\n\t\treturn value;\n\t}\n\tif (value === \"hidden\" || value === \"sleep\") {\n\t\treturn \"archived\";\n\t}\n\treturn undefined;\n}\n\nfunction updateLastActivityTime(lastActivityTime: number | undefined, entry: FileEntry): number | undefined {\n\tif (entry.type !== \"message\") {\n\t\treturn lastActivityTime;\n\t}\n\n\tconst message = (entry as SessionMessageEntry).message;\n\tif (!isMessageWithContent(message)) {\n\t\treturn lastActivityTime;\n\t}\n\tif (message.role !== \"user\" && message.role !== \"assistant\") {\n\t\treturn lastActivityTime;\n\t}\n\n\tconst msgTimestamp = (message as { timestamp?: number }).timestamp;\n\tif (typeof msgTimestamp === \"number\") {\n\t\treturn Math.max(lastActivityTime ?? 0, msgTimestamp);\n\t}\n\n\tconst entryTimestamp = (entry as SessionEntryBase).timestamp;\n\tif (typeof entryTimestamp === \"string\") {\n\t\tconst t = new Date(entryTimestamp).getTime();\n\t\tif (!Number.isNaN(t)) {\n\t\t\treturn Math.max(lastActivityTime ?? 0, t);\n\t\t}\n\t}\n\n\treturn lastActivityTime;\n}\n\nfunction getSessionModifiedDateFromLastActivity(\n\tlastActivityTime: number | undefined,\n\theader: SessionHeader,\n\tstatsMtime: Date,\n): Date {\n\tif (typeof lastActivityTime === \"number\" && lastActivityTime > 0) {\n\t\treturn new Date(lastActivityTime);\n\t}\n\n\tconst headerTime = typeof header.timestamp === \"string\" ? new Date(header.timestamp).getTime() : NaN;\n\treturn !Number.isNaN(headerTime) ? new Date(headerTime) : statsMtime;\n}\n\nfunction appendCappedSearchText(current: string, text: string): string {\n\tif (!text || current.length >= SESSION_LIST_SEARCH_TEXT_MAX_CHARS) {\n\t\treturn current;\n\t}\n\tconst next = current ? ` ${text}` : text;\n\treturn current + next.slice(0, SESSION_LIST_SEARCH_TEXT_MAX_CHARS - current.length);\n}\n\nfunction looksLikeMessageEntry(line: string): boolean {\n\treturn line.includes('\"type\":\"message\"') || line.includes('\"type\": \"message\"');\n}\n\nfunction extractJsonStringPropertyPrefix(\n\ttext: string,\n\tpropertyName: string,\n\tmaxChars: number,\n\tstartIndex = 0,\n): string | undefined {\n\tconst propertyIndex = text.indexOf(`\"${propertyName}\"`, startIndex);\n\tif (propertyIndex < 0) {\n\t\treturn undefined;\n\t}\n\tlet index = propertyIndex + propertyName.length + 2;\n\twhile (index < text.length && /\\s/.test(text[index] ?? \"\")) index++;\n\tif (text[index] !== \":\") {\n\t\treturn undefined;\n\t}\n\tindex++;\n\twhile (index < text.length && /\\s/.test(text[index] ?? \"\")) index++;\n\tif (text[index] !== '\"') {\n\t\treturn undefined;\n\t}\n\tindex++;\n\n\tlet result = \"\";\n\tlet escaped = false;\n\tfor (; index < text.length && result.length < maxChars; index++) {\n\t\tconst char = text[index];\n\t\tif (escaped) {\n\t\t\tresult += char;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"\\\\\") {\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"') {\n\t\t\tbreak;\n\t\t}\n\t\tresult += char;\n\t}\n\treturn result;\n}\n\nfunction extractOversizedMessageSummary(line: string): {\n\trole?: string;\n\ttimestamp?: number;\n\ttextPreview?: string;\n} {\n\tconst timestampText = extractJsonStringPropertyPrefix(line, \"timestamp\", 64);\n\tconst timestamp = timestampText ? new Date(timestampText).getTime() : NaN;\n\tconst messageIndex = line.indexOf('\"message\"');\n\tconst role =\n\t\tmessageIndex >= 0\n\t\t\t? extractJsonStringPropertyPrefix(line, \"role\", 64, messageIndex)\n\t\t\t: extractJsonStringPropertyPrefix(line, \"role\", 64);\n\tlet textPreview: string | undefined;\n\tif (messageIndex >= 0) {\n\t\ttextPreview =\n\t\t\textractJsonStringPropertyPrefix(line, \"content\", SESSION_LIST_LARGE_MESSAGE_PREVIEW_MAX_CHARS, messageIndex) ??\n\t\t\textractJsonStringPropertyPrefix(line, \"text\", SESSION_LIST_LARGE_MESSAGE_PREVIEW_MAX_CHARS, messageIndex);\n\t}\n\treturn {\n\t\trole,\n\t\t...(Number.isNaN(timestamp) ? {} : { timestamp }),\n\t\t...(textPreview ? { textPreview } : {}),\n\t};\n}\n\ninterface SessionInfoCacheEntry {\n\tsize: number;\n\tmtimeMs: number;\n\tinfo: SessionInfo | null;\n}\n\n// Session files are append-only, so an unchanged (size, mtimeMs) means identical\n// content: cache list metadata and rescan only files that changed.\nconst sessionInfoCache = new Map<string, SessionInfoCacheEntry>();\n\nexport async function readSessionInfo(filePath: string): Promise<SessionInfo | null> {\n\tlet stats: Awaited<ReturnType<typeof stat>>;\n\ttry {\n\t\tstats = await stat(filePath);\n\t} catch {\n\t\treturn null;\n\t}\n\tconst cached = sessionInfoCache.get(filePath);\n\tif (cached && cached.size === stats.size && cached.mtimeMs === stats.mtimeMs) {\n\t\treturn cached.info;\n\t}\n\tconst info = await scanSessionInfo(filePath, stats);\n\tsessionInfoCache.set(filePath, { size: stats.size, mtimeMs: stats.mtimeMs, info });\n\treturn info;\n}\n\nasync function scanSessionInfo(filePath: string, stats: Awaited<ReturnType<typeof stat>>): Promise<SessionInfo | null> {\n\ttry {\n\t\tlet header: SessionHeader | undefined;\n\t\tlet messageCount = 0;\n\t\tlet firstMessage = \"\";\n\t\tlet allMessagesText = \"\";\n\t\tlet name: string | undefined;\n\t\tlet state: SessionState | undefined;\n\t\tlet agentStatus: AgentStatus | undefined;\n\t\tlet lastActivityTime: number | undefined;\n\n\t\tfor await (const lineBuffer of readLinesAsBuffers(filePath)) {\n\t\t\tconst line = lineBuffer.toString(\"utf8\");\n\t\t\tif (!line.trim()) continue;\n\n\t\t\t// Large tool-result entries can be many MB. They do not carry the\n\t\t\t// session-list metadata we need, and parsing them during every refresh\n\t\t\t// can exhaust the daemon heap.\n\t\t\tif (line.length > SESSION_LIST_PARSE_MAX_LINE_CHARS) {\n\t\t\t\tif (looksLikeMessageEntry(line)) {\n\t\t\t\t\tmessageCount++;\n\t\t\t\t\tconst summary = extractOversizedMessageSummary(line);\n\t\t\t\t\tif (typeof summary.timestamp === \"number\" && (summary.role === \"user\" || summary.role === \"assistant\")) {\n\t\t\t\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, summary.timestamp);\n\t\t\t\t\t}\n\t\t\t\t\tif (summary.role === \"user\" && !firstMessage) {\n\t\t\t\t\t\tfirstMessage = summary.textPreview || \"(large message)\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst trimmed = line.trim();\n\t\t\tlet entry: FileEntry;\n\t\t\ttry {\n\t\t\t\tentry = JSON.parse(trimmed) as FileEntry;\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (entry.type === \"session_info\") {\n\t\t\t\tconst infoEntry = entry as SessionInfoEntry;\n\t\t\t\tname = infoEntry.name?.trim() || undefined;\n\t\t\t}\n\t\t\tif (entry.type === \"session_state\") {\n\t\t\t\tconst stateEntry = entry as SessionStateEntry;\n\t\t\t\tconst status = normalizeSessionStateStatus(stateEntry.state?.status);\n\t\t\t\tif (status) {\n\t\t\t\t\tstate = { status };\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Keep the latest recap/verdict so off-daemon sessions don't all show as\n\t\t\t// unjudged in the agents view. Append-only, so last seen wins.\n\t\t\tif (entry.type === \"agent_status\") {\n\t\t\t\tagentStatus = (entry as AgentStatusEntry).status;\n\t\t\t}\n\n\t\t\tif (!header) {\n\t\t\t\tif (entry.type !== \"session\") {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\theader = entry as SessionHeader;\n\t\t\t}\n\n\t\t\tlastActivityTime = updateLastActivityTime(lastActivityTime, entry);\n\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tmessageCount++;\n\n\t\t\tconst message = (entry as SessionMessageEntry).message;\n\t\t\tif (!isMessageWithContent(message)) continue;\n\t\t\tif (message.role !== \"user\" && message.role !== \"assistant\") continue;\n\n\t\t\tconst textContent = extractTextContent(message);\n\t\t\tif (!textContent) continue;\n\n\t\t\tallMessagesText = appendCappedSearchText(allMessagesText, textContent);\n\t\t\tif (!firstMessage && message.role === \"user\") {\n\t\t\t\tfirstMessage = textContent;\n\t\t\t}\n\t\t}\n\n\t\tif (!header) return null;\n\t\tconst cwd = typeof header.cwd === \"string\" ? header.cwd : \"\";\n\t\tconst parentSessionPath = header.parentSession;\n\t\tconst rlmDepth = resolveSessionRlmDepth(header, filePath);\n\t\tconst modified = getSessionModifiedDateFromLastActivity(lastActivityTime, header, stats.mtime);\n\n\t\treturn {\n\t\t\tpath: filePath,\n\t\t\tid: header.id,\n\t\t\tcwd,\n\t\t\tname,\n\t\t\tstate,\n\t\t\tparentSessionPath,\n\t\t\trlmDepth,\n\t\t\tcreated: new Date(header.timestamp),\n\t\t\tmodified,\n\t\t\tmessageCount,\n\t\t\tfirstMessage: firstMessage || \"(no messages)\",\n\t\t\tallMessagesText,\n\t\t\tagentStatus,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport type SessionListProgress = (loaded: number, total: number) => void;\nexport type SessionListItem = (session: SessionInfo) => void;\n\nexport interface SessionListCallbacks {\n\tonProgress?: SessionListProgress;\n\tonSession?: SessionListItem;\n}\n\nasync function listSessionsFromDir(\n\tdir: string,\n\tcallbacks?: SessionListCallbacks,\n\tprogressOffset = 0,\n\tprogressTotal?: number,\n): Promise<SessionInfo[]> {\n\tconst sessions: SessionInfo[] = [];\n\tif (!existsSync(dir)) {\n\t\treturn sessions;\n\t}\n\n\ttry {\n\t\tconst dirEntries = await readdir(dir);\n\t\tconst files = dirEntries.filter((f) => f.endsWith(\".jsonl\")).map((f) => join(dir, f));\n\t\tconst total = progressTotal ?? files.length;\n\n\t\tconst present = new Set(files);\n\t\tfor (const key of sessionInfoCache.keys()) {\n\t\t\tif (dirname(key) === dir && !present.has(key)) {\n\t\t\t\tsessionInfoCache.delete(key);\n\t\t\t}\n\t\t}\n\n\t\tlet loaded = 0;\n\t\tfor (const file of files) {\n\t\t\tconst info = await readSessionInfo(file);\n\t\t\tloaded++;\n\t\t\tcallbacks?.onProgress?.(progressOffset + loaded, total);\n\t\t\tif (info) {\n\t\t\t\tsessions.push(info);\n\t\t\t\tcallbacks?.onSession?.(info);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Return no sessions when the directory cannot be read.\n\t}\n\n\treturn sessions;\n}\n\nexport class SessionManager {\n\tprivate sessionId: string = \"\";\n\tprivate sessionFile: string | undefined;\n\tprivate sessionDir: string;\n\tprivate cwd: string;\n\tprivate persist: boolean;\n\tprivate flushed: boolean = false;\n\tprivate fileEntries: FileEntry[] = [];\n\tprivate byId: Map<string, SessionEntry> = new Map();\n\tprivate labelsById: Map<string, string> = new Map();\n\tprivate labelTimestampsById: Map<string, string> = new Map();\n\tprivate leafId: string | null = null;\n\n\tprivate constructor(\n\t\tcwd: string,\n\t\tsessionDir: string,\n\t\tsessionFile: string | undefined,\n\t\tpersist: boolean,\n\t\tpreloadedEntries?: FileEntry[],\n\t) {\n\t\tthis.cwd = cwd;\n\t\tthis.sessionDir = sessionDir;\n\t\tthis.persist = persist;\n\t\tif (persist && sessionDir && !existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tif (sessionFile) {\n\t\t\tthis.setSessionFile(sessionFile, preloadedEntries);\n\t\t} else {\n\t\t\tthis.newSession();\n\t\t}\n\t}\n\n\t/**\n\t * Switch to a different session file (used for resume and branching).\n\t * preloadedEntries must be loadEntriesFromFile(sessionFile) for the same path; it\n\t * lets the async daemon path skip the synchronous re-read.\n\t */\n\tsetSessionFile(sessionFile: string, preloadedEntries?: FileEntry[]): void {\n\t\tthis.sessionFile = resolve(sessionFile);\n\t\tif (existsSync(this.sessionFile)) {\n\t\t\tthis.fileEntries = preloadedEntries ?? loadEntriesFromFile(this.sessionFile);\n\n\t\t\t// If file was empty or corrupted (no valid header), truncate and start fresh\n\t\t\t// to avoid appending messages without a session header (which breaks the session)\n\t\t\tif (this.fileEntries.length === 0) {\n\t\t\t\tconst explicitPath = this.sessionFile;\n\t\t\t\tthis.newSession();\n\t\t\t\tthis.sessionFile = explicitPath;\n\t\t\t\tthis._rewriteFile();\n\t\t\t\tthis.flushed = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst header = this.fileEntries.find((e) => e.type === \"session\") as SessionHeader | undefined;\n\t\t\tthis.sessionId = header?.id ?? createSessionId();\n\n\t\t\tlet shouldRewrite = migrateToCurrentVersion(this.fileEntries);\n\t\t\tif (header?.parentSession && !isValidRlmDepth(header.rlmDepth)) {\n\t\t\t\theader.rlmDepth = resolveSessionRlmDepth(header, this.sessionFile);\n\t\t\t\tshouldRewrite = true;\n\t\t\t}\n\t\t\tif (shouldRewrite) {\n\t\t\t\tthis._rewriteFile();\n\t\t\t}\n\n\t\t\tthis._buildIndex();\n\t\t\tthis.flushed = true;\n\t\t} else {\n\t\t\tconst explicitPath = this.sessionFile;\n\t\t\tthis.newSession();\n\t\t\tthis.sessionFile = explicitPath; // preserve explicit path from --resume selector\n\t\t}\n\t}\n\n\tnewSession(options?: NewSessionOptions): string | undefined {\n\t\tlet sessionId = options?.id ?? createSessionId();\n\t\tlet sessionFile: string | undefined;\n\t\tconst hasExplicitRlmDepth = options !== undefined && Object.hasOwn(options, \"rlmDepth\");\n\t\tlet parentHeader: Partial<SessionHeader> | undefined;\n\t\tif (options?.parentSession && !hasExplicitRlmDepth) {\n\t\t\ttry {\n\t\t\t\tparentHeader = readSessionHeader(options.parentSession);\n\t\t\t} catch {\n\t\t\t\t// Unavailable parent metadata leaves the child depth unknown.\n\t\t\t}\n\t\t}\n\t\tif (this.persist) {\n\t\t\tif (options?.id) {\n\t\t\t\tsessionFile = getSessionFilePath(this.getSessionDir(), sessionId);\n\t\t\t\tif (existsSync(sessionFile)) {\n\t\t\t\t\tthrow new Error(`Session file already exists for id \"${sessionId}\": ${sessionFile}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst target = createUniqueSessionFileTarget(this.getSessionDir());\n\t\t\t\tsessionId = target.sessionId;\n\t\t\t\tsessionFile = target.sessionFile;\n\t\t\t}\n\t\t}\n\n\t\tthis.sessionId = sessionId;\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst git = this.persist ? (captureGitContext(this.cwd) ?? undefined) : undefined;\n\t\tconst rlmDepth = hasExplicitRlmDepth\n\t\t\t? options?.rlmDepth\n\t\t\t: options?.parentSession\n\t\t\t\t? deriveChildRlmDepth(parentHeader)\n\t\t\t\t: rootRlmDepthFromEnv();\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: options?.parentSession,\n\t\t\trlmDepth,\n\t\t\tgit,\n\t\t};\n\t\tthis.fileEntries = [header];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.labelTimestampsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\n\t\tif (this.persist) {\n\t\t\tthis.sessionFile = sessionFile;\n\t\t}\n\t\treturn this.sessionFile;\n\t}\n\n\tprivate _buildIndex(): void {\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.labelTimestampsById.clear();\n\t\tthis.leafId = null;\n\t\tfor (const entry of this.fileEntries) {\n\t\t\tif (entry.type === \"session\") continue;\n\t\t\tthis.byId.set(entry.id, entry);\n\t\t\tthis.leafId = entry.id;\n\t\t\tif (entry.type === \"label\") {\n\t\t\t\tif (entry.label) {\n\t\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t\t\tthis.labelTimestampsById.set(entry.targetId, entry.timestamp);\n\t\t\t\t} else {\n\t\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t\t\tthis.labelTimestampsById.delete(entry.targetId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _rewriteFile(): void {\n\t\tif (!this.persist || !this.sessionFile) return;\n\t\tconst content = `${this.fileEntries.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`;\n\t\tconst targetPath = realpathIfPresent(this.sessionFile);\n\t\tconst directory = dirname(targetPath);\n\t\tmkdirSync(directory, { recursive: true });\n\t\tconst tempPath = join(directory, `.${basename(targetPath)}.${process.pid}.${randomUUID()}.tmp`);\n\t\ttry {\n\t\t\tconst metadata = statMetadataIfPresent(targetPath);\n\t\t\twriteFileSync(tempPath, content, metadata === undefined ? undefined : { mode: metadata.mode });\n\t\t\tif (metadata !== undefined) {\n\t\t\t\tchownSync(tempPath, metadata.uid, metadata.gid);\n\t\t\t\tchmodSync(tempPath, metadata.mode);\n\t\t\t}\n\t\t\trenameSync(tempPath, targetPath);\n\t\t} finally {\n\t\t\trmSync(tempPath, { force: true });\n\t\t}\n\t}\n\n\tisPersisted(): boolean {\n\t\treturn this.persist;\n\t}\n\n\tgetCwd(): string {\n\t\treturn this.cwd;\n\t}\n\n\tgetSessionDir(): string {\n\t\treturn this.sessionDir;\n\t}\n\n\tgetSessionId(): string {\n\t\treturn this.sessionId;\n\t}\n\n\tgetSessionFile(): string | undefined {\n\t\treturn this.sessionFile;\n\t}\n\n\tmaterializeSessionFile(sessionDir?: string): string {\n\t\tif (this.sessionFile) {\n\t\t\treturn this.sessionFile;\n\t\t}\n\t\tconst dir = sessionDir ?? (this.sessionDir || getDefaultSessionDir(this.cwd));\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\t\tconst previousHeader = this.getHeader();\n\t\tconst target = createUniqueSessionFileTarget(dir);\n\t\tthis.sessionDir = dir;\n\t\tthis.sessionId = target.sessionId;\n\t\tthis.sessionFile = target.sessionFile;\n\t\tthis.persist = true;\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst git = captureGitContext(this.cwd) ?? undefined;\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: previousHeader?.parentSession,\n\t\t\trlmDepth: resolveSessionRlmDepth(previousHeader ?? {}, target.sessionFile),\n\t\t\tgit,\n\t\t};\n\t\tthis.fileEntries = [header, ...this.getEntries()];\n\t\tthis._rewriteFile();\n\t\tthis.flushed = true;\n\t\treturn this.sessionFile;\n\t}\n\n\tgetSessionArtifactDir(): string | undefined {\n\t\treturn this.persist ? getSessionArtifactPath(this.sessionDir, this.sessionId) : undefined;\n\t}\n\n\t/**\n\t * Force-write all in-memory entries to the session file immediately.\n\t * This bypasses the no-assistant guard in {@link _persist} so that\n\t * pre-model entries (session header, goal state, settings changes)\n\t * are durable on disk before the first assistant response.\n\t * No-op for in-memory (non-persisted) sessions.\n\t */\n\tflushNow(): void {\n\t\tif (!this.persist || !this.sessionFile) return;\n\t\tif (this.flushed && existsSync(this.sessionFile)) return;\n\t\tthis._rewriteFile();\n\t\tthis.flushed = true;\n\t}\n\n\t_persist(entry: SessionEntry): void {\n\t\tif (!this.persist || !this.sessionFile) return;\n\n\t\tconst hasAssistant = this.fileEntries.some((e) => e.type === \"message\" && e.message.role === \"assistant\");\n\t\tconst shouldPersistWithoutAssistant = entry.type === \"session_state\" || entry.type === \"session_info\";\n\t\tif (!hasAssistant && !shouldPersistWithoutAssistant) {\n\t\t\tthis.flushed = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.flushed || !existsSync(this.sessionFile)) {\n\t\t\tthis._rewriteFile();\n\t\t\tthis.flushed = true;\n\t\t} else {\n\t\t\tmkdirSync(dirname(this.sessionFile), { recursive: true });\n\t\t\tappendFileSync(this.sessionFile, `${JSON.stringify(entry)}\\n`);\n\t\t}\n\t}\n\n\tprivate _appendEntry(entry: SessionEntry): void {\n\t\tthis.fileEntries.push(entry);\n\t\tthis.byId.set(entry.id, entry);\n\t\tthis.leafId = entry.id;\n\t\tthis._persist(entry);\n\t}\n\n\tappendMessage(message: Message | CustomMessage | BashExecutionMessage): string {\n\t\tconst entry: SessionMessageEntry = {\n\t\t\ttype: \"message\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmessage,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendThinkingLevelChange(thinkingLevel: string): string {\n\t\tconst entry: ThinkingLevelChangeEntry = {\n\t\t\ttype: \"thinking_level_change\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tthinkingLevel,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendServiceTierChange(serviceTier: ServiceTier): string {\n\t\tconst entry: ServiceTierChangeEntry = {\n\t\t\ttype: \"service_tier_change\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tserviceTier,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendModelChange(provider: string, modelId: string): string {\n\t\tconst entry: ModelChangeEntry = {\n\t\t\ttype: \"model_change\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tprovider,\n\t\t\tmodelId,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendCompaction<T = unknown>(\n\t\tsummary: string,\n\t\tfirstKeptEntryId: string,\n\t\ttokensBefore: number,\n\t\tdetails?: T,\n\t\tfromHook?: boolean,\n\t\tcustomInstructions?: string,\n\t): string {\n\t\tconst entry: CompactionEntry<T> = {\n\t\t\ttype: \"compaction\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore,\n\t\t\tdetails,\n\t\t\tfromHook,\n\t\t\tcustomInstructions,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendCustomEntry(customType: string, data?: unknown): string {\n\t\tconst entry: CustomEntry = {\n\t\t\ttype: \"custom\",\n\t\t\tcustomType,\n\t\t\tdata,\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendCustomEntryWithRollback(customType: string, data?: unknown): string {\n\t\treturn this._appendEntryWithRollback(() => this.appendCustomEntry(customType, data));\n\t}\n\n\tappendChildUsageAttribution(\n\t\ttargetId: string,\n\t\tchildUsage: Usage,\n\t\taggregateUsage: Usage,\n\t\torigin?: ChildUsageAttributionEntry[\"origin\"],\n\t): string {\n\t\tconst target = this.byId.get(targetId);\n\t\tif (target?.type !== \"message\" || target.message.role !== \"assistant\") {\n\t\t\tthrow new Error(`Assistant message entry ${targetId} not found`);\n\t\t}\n\n\t\ttarget.message.usage = cloneUsage(aggregateUsage);\n\t\tconst entry: ChildUsageAttributionEntry = {\n\t\t\ttype: \"child_usage_attributed\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttargetId,\n\t\t\tchildUsage: cloneUsage(childUsage),\n\t\t\taggregateUsage: cloneUsage(aggregateUsage),\n\t\t\t...(origin ? { origin } : {}),\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendSessionInfo(name: string): string {\n\t\tconst entry: SessionInfoEntry = {\n\t\t\ttype: \"session_info\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tname: name.trim(),\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendSessionState(state: SessionState): string {\n\t\tconst entry: SessionStateEntry = {\n\t\t\ttype: \"session_state\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tstate: { status: state.status },\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tgetSessionName(): string | undefined {\n\t\tconst entries = this.getEntries();\n\t\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = entries[i];\n\t\t\tif (entry.type === \"session_info\") {\n\t\t\t\treturn entry.name?.trim() || undefined;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tgetSessionState(): SessionState | undefined {\n\t\tconst entries = this.getEntries();\n\t\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = entries[i];\n\t\t\tif (entry.type === \"session_state\") {\n\t\t\t\tconst status = normalizeSessionStateStatus(entry.state.status);\n\t\t\t\tif (status) {\n\t\t\t\t\treturn { status };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * True when the session holds user-meaningful persisted content, as opposed to\n\t * only daemon-written bookkeeping (session_state, agent_status, git_state) or\n\t * the default model/thinking entries every new session is created with. Used by\n\t * the daemon discard guard to decide whether a message-less draft is safe to\n\t * delete (that guard always also requires zero messages).\n\t *\n\t * createAgentSession opens a new session with an optional leading `model_change`\n\t * followed by `thinking_level_change` and `service_tier_change`. That creation\n\t * prefix is skipped; anything beyond it is user content.\n\t */\n\thasUserContent(): boolean {\n\t\tconst contentEntries = this.getEntries().filter((entry) => CONTENT_ENTRY_TYPES.has(entry.type));\n\t\tlet start = 0;\n\t\tif (contentEntries[start]?.type === \"model_change\") {\n\t\t\tstart++;\n\t\t}\n\t\tif (contentEntries[start]?.type === \"thinking_level_change\") {\n\t\t\tstart++;\n\t\t}\n\t\tif (contentEntries[start]?.type === \"service_tier_change\") {\n\t\t\tstart++;\n\t\t}\n\t\treturn contentEntries.length > start;\n\t}\n\n\tappendAgentStatus(status: AgentStatus): string {\n\t\tconst entry: AgentStatusEntry = {\n\t\t\ttype: \"agent_status\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tstatus: {\n\t\t\t\tsummary: status.summary,\n\t\t\t\ttaskState: status.taskState,\n\t\t\t\tbasedOnMessageCount: status.basedOnMessageCount,\n\t\t\t},\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tappendGitState(git: GitContext): string {\n\t\tconst entry: GitStateEntry = {\n\t\t\ttype: \"git_state\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tgit,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\trecordGitStateIfChanged(): string | undefined {\n\t\tif (!this.persist) return undefined;\n\t\tconst git = captureGitContext(this.cwd);\n\t\tif (!git) return undefined;\n\t\tconst last = this.getActiveGitContext();\n\t\tif (last && gitContextsEqual(last, git)) return undefined;\n\t\treturn this.appendGitState(git);\n\t}\n\n\tprivate getActiveGitContext(): GitContext | undefined {\n\t\tlet current = this.leafId ? this.byId.get(this.leafId) : undefined;\n\t\twhile (current) {\n\t\t\tif (current.type === \"git_state\") return current.git;\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\tconst header = this.fileEntries[0];\n\t\treturn header?.type === \"session\" ? header.git : undefined;\n\t}\n\n\tgetLatestAgentStatus(): AgentStatus | undefined {\n\t\t// Walk the current leaf to root so we only read status on the active branch,\n\t\t// not a sibling branch's status that happens to sit later in the file.\n\t\tlet current = this.leafId ? this.byId.get(this.leafId) : undefined;\n\t\twhile (current) {\n\t\t\tif (current.type === \"agent_status\") {\n\t\t\t\treturn { ...current.status };\n\t\t\t}\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tappendCustomMessageEntry<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): string {\n\t\tconst entry: CustomMessageEntry<T> = {\n\t\t\ttype: \"custom_message\",\n\t\t\tcustomType,\n\t\t\tcontent,\n\t\t\tdisplay,\n\t\t\tdetails,\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\t/**\n\t * Append a custom message, undoing the append if persistence fails so a\n\t * best-effort record never leaves an unsaved leaf for later entries.\n\t */\n\tappendCustomMessageEntryWithRollback<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): string {\n\t\treturn this._appendEntryWithRollback(() => this.appendCustomMessageEntry(customType, content, display, details));\n\t}\n\n\tprivate _appendEntryWithRollback(append: () => string): string {\n\t\tconst previousLeafId = this.leafId;\n\t\ttry {\n\t\t\tconst entryId = append();\n\t\t\tthis.flushNow();\n\t\t\treturn entryId;\n\t\t} catch (error) {\n\t\t\t// The append indexes the entry before persisting it; undo exactly that.\n\t\t\tif (this.leafId !== null && this.leafId !== previousLeafId) {\n\t\t\t\tthis.byId.delete(this.leafId);\n\t\t\t\tthis.fileEntries.pop();\n\t\t\t\tthis.leafId = previousLeafId;\n\t\t\t\t// The failed append may have left a torn line on disk. Restore the file\n\t\t\t\t// from the rolled-back entries now; if that also fails (e.g. the disk is\n\t\t\t\t// still full), fall back to forcing the next persist to rewrite.\n\t\t\t\tthis.flushed = false;\n\t\t\t\ttry {\n\t\t\t\t\tthis.flushNow();\n\t\t\t\t} catch {\n\t\t\t\t\tthis.flushed = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tgetLeafId(): string | null {\n\t\treturn this.leafId;\n\t}\n\n\tgetLeafEntry(): SessionEntry | undefined {\n\t\treturn this.leafId ? this.byId.get(this.leafId) : undefined;\n\t}\n\n\tgetEntry(id: string): SessionEntry | undefined {\n\t\treturn this.byId.get(id);\n\t}\n\n\tgetChildren(parentId: string): SessionEntry[] {\n\t\tconst children: SessionEntry[] = [];\n\t\tfor (const entry of this.byId.values()) {\n\t\t\tif (entry.parentId === parentId) {\n\t\t\t\tchildren.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn children;\n\t}\n\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labelsById.get(id);\n\t}\n\n\tappendLabelChange(targetId: string, label: string | undefined): string {\n\t\tif (!this.byId.has(targetId)) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\t\tconst entry: LabelEntry = {\n\t\t\ttype: \"label\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttargetId,\n\t\t\tlabel,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\tif (label) {\n\t\t\tthis.labelsById.set(targetId, label);\n\t\t\tthis.labelTimestampsById.set(targetId, entry.timestamp);\n\t\t} else {\n\t\t\tthis.labelsById.delete(targetId);\n\t\t\tthis.labelTimestampsById.delete(targetId);\n\t\t}\n\t\treturn entry.id;\n\t}\n\n\tgetBranch(fromId?: string): SessionEntry[] {\n\t\t// push+reverse, not unshift-per-entry: unshift is O(n), which makes this O(n^2) on long sessions.\n\t\tconst path: SessionEntry[] = [];\n\t\tconst startId = fromId ?? this.leafId;\n\t\tlet current = startId ? this.byId.get(startId) : undefined;\n\t\twhile (current) {\n\t\t\tpath.push(current);\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\tpath.reverse();\n\t\treturn path;\n\t}\n\n\tbuildSessionContext(): SessionContext {\n\t\t// Pass fileEntries directly rather than getEntries(): the resolved context\n\t\t// is computed from the leaf-to-root walk over byId (which already excludes\n\t\t// the header), so the entries argument is only a fallback for an undefined\n\t\t// leaf — never hit here since leafId is always set or null. Avoids an O(n)\n\t\t// array copy on every call (attach, get_session_context, agent init, ...).\n\t\treturn buildSessionContext(this.fileEntries as SessionEntry[], this.leafId, this.byId);\n\t}\n\n\tgetHeader(): SessionHeader | null {\n\t\tconst h = this.fileEntries.find((e) => e.type === \"session\");\n\t\treturn h ? (h as SessionHeader) : null;\n\t}\n\n\tgetEntries(): SessionEntry[] {\n\t\treturn this.fileEntries.filter((e): e is SessionEntry => e.type !== \"session\");\n\t}\n\n\tgetFlatTree(): SessionTreeFlatNode[] {\n\t\treturn this.getEntries().map((entry) => ({\n\t\t\tentry,\n\t\t\tlabel: this.labelsById.get(entry.id),\n\t\t\tlabelTimestamp: this.labelTimestampsById.get(entry.id),\n\t\t}));\n\t}\n\n\tgetTree(): SessionTreeNode[] {\n\t\tconst entries = this.getFlatTree();\n\t\tconst nodeMap = new Map<string, SessionTreeNode>();\n\t\tconst roots: SessionTreeNode[] = [];\n\n\t\tfor (const flatNode of entries) {\n\t\t\tnodeMap.set(flatNode.entry.id, { ...flatNode, children: [] });\n\t\t}\n\n\t\tfor (const flatNode of entries) {\n\t\t\tconst entry = flatNode.entry;\n\t\t\tconst node = nodeMap.get(entry.id)!;\n\t\t\tif (entry.parentId === null || entry.parentId === entry.id) {\n\t\t\t\troots.push(node);\n\t\t\t} else {\n\t\t\t\tconst parent = nodeMap.get(entry.parentId);\n\t\t\t\tif (parent) {\n\t\t\t\t\tparent.children.push(node);\n\t\t\t\t} else {\n\t\t\t\t\troots.push(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Sort children by timestamp (oldest first, newest at bottom)\n\t\t// Use iterative approach to avoid stack overflow on deep trees\n\t\tconst stack: SessionTreeNode[] = [...roots];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop()!;\n\t\t\tnode.children.sort((a, b) => new Date(a.entry.timestamp).getTime() - new Date(b.entry.timestamp).getTime());\n\t\t\tstack.push(...node.children);\n\t\t}\n\n\t\treturn roots;\n\t}\n\n\tbranch(branchFromId: string): void {\n\t\tif (!this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t}\n\n\tresetLeaf(): void {\n\t\tthis.leafId = null;\n\t}\n\n\tbranchWithSummary(branchFromId: string | null, summary: string, details?: unknown, fromHook?: boolean): string {\n\t\tif (branchFromId !== null && !this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: generateId(this.byId),\n\t\t\tparentId: branchFromId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId: branchFromId ?? \"root\",\n\t\t\tsummary,\n\t\t\tdetails,\n\t\t\tfromHook,\n\t\t};\n\t\tthis._appendEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tcreateBranchedSession(leafId: string): string | undefined {\n\t\tconst previousSessionFile = this.sessionFile;\n\t\tconst path = this.getBranch(leafId);\n\t\tif (path.length === 0) {\n\t\t\tthrow new Error(`Entry ${leafId} not found`);\n\t\t}\n\n\t\tconst pathWithoutLabels = path.filter((e) => e.type !== \"label\");\n\n\t\tconst target = this.persist\n\t\t\t? createUniqueSessionFileTarget(this.getSessionDir())\n\t\t\t: { sessionId: createSessionId(), sessionFile: undefined };\n\t\tconst newSessionId = target.sessionId;\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst newSessionFile = target.sessionFile;\n\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: newSessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: this.persist ? previousSessionFile : undefined,\n\t\t\trlmDepth: resolveSessionRlmDepth(this.getHeader() ?? {}, previousSessionFile ?? newSessionFile ?? \"\"),\n\t\t\tgit: this.persist ? (captureGitContext(this.cwd) ?? undefined) : undefined,\n\t\t};\n\n\t\tconst pathEntryIds = new Set(pathWithoutLabels.map((e) => e.id));\n\t\tconst labelsToWrite: Array<{ targetId: string; label: string; timestamp: string }> = [];\n\t\tfor (const [targetId, label] of this.labelsById) {\n\t\t\tif (pathEntryIds.has(targetId)) {\n\t\t\t\tlabelsToWrite.push({ targetId, label, timestamp: this.labelTimestampsById.get(targetId)! });\n\t\t\t}\n\t\t}\n\n\t\tif (this.persist) {\n\t\t\tconst lastEntryId = pathWithoutLabels[pathWithoutLabels.length - 1]?.id || null;\n\t\t\tlet parentId = lastEntryId;\n\t\t\tconst labelEntries: LabelEntry[] = [];\n\t\t\tfor (const { targetId, label, timestamp: labelTimestamp } of labelsToWrite) {\n\t\t\t\tconst labelEntry: LabelEntry = {\n\t\t\t\t\ttype: \"label\",\n\t\t\t\t\tid: generateId(new Set(pathEntryIds)),\n\t\t\t\t\tparentId,\n\t\t\t\t\ttimestamp: labelTimestamp,\n\t\t\t\t\ttargetId,\n\t\t\t\t\tlabel,\n\t\t\t\t};\n\t\t\t\tpathEntryIds.add(labelEntry.id);\n\t\t\t\tlabelEntries.push(labelEntry);\n\t\t\t\tparentId = labelEntry.id;\n\t\t\t}\n\n\t\t\tthis.fileEntries = [header, ...pathWithoutLabels, ...labelEntries];\n\t\t\tthis.sessionId = newSessionId;\n\t\t\tthis.sessionFile = newSessionFile;\n\t\t\tthis._buildIndex();\n\n\t\t\t// Only write the file now if it contains an assistant message.\n\t\t\t// Otherwise defer to _persist(), which creates the file on the\n\t\t\t// first assistant response, matching the newSession() contract\n\t\t\t// and avoiding the duplicate-header bug when _persist()'s\n\t\t\t// no-assistant guard later resets flushed to false.\n\t\t\tconst hasAssistant = this.fileEntries.some((e) => e.type === \"message\" && e.message.role === \"assistant\");\n\t\t\tif (hasAssistant) {\n\t\t\t\tthis._rewriteFile();\n\t\t\t\tthis.flushed = true;\n\t\t\t} else {\n\t\t\t\tthis.flushed = false;\n\t\t\t}\n\n\t\t\treturn newSessionFile;\n\t\t}\n\n\t\tconst labelEntries: LabelEntry[] = [];\n\t\tlet parentId = pathWithoutLabels[pathWithoutLabels.length - 1]?.id || null;\n\t\tfor (const { targetId, label, timestamp: labelTimestamp } of labelsToWrite) {\n\t\t\tconst labelEntry: LabelEntry = {\n\t\t\t\ttype: \"label\",\n\t\t\t\tid: generateId(new Set([...pathEntryIds, ...labelEntries.map((e) => e.id)])),\n\t\t\t\tparentId,\n\t\t\t\ttimestamp: labelTimestamp,\n\t\t\t\ttargetId,\n\t\t\t\tlabel,\n\t\t\t};\n\t\t\tlabelEntries.push(labelEntry);\n\t\t\tparentId = labelEntry.id;\n\t\t}\n\t\tthis.fileEntries = [header, ...pathWithoutLabels, ...labelEntries];\n\t\tthis.sessionId = newSessionId;\n\t\tthis._buildIndex();\n\t\treturn undefined;\n\t}\n\n\tstatic create(cwd: string, sessionDir?: string): SessionManager {\n\t\tconst dir = sessionDir ?? getDefaultSessionDir(cwd);\n\t\treturn new SessionManager(cwd, dir, undefined, true);\n\t}\n\n\tstatic open(path: string, sessionDir?: string, cwdOverride?: string): SessionManager {\n\t\t// Only the header's cwd is needed to construct the manager; the constructor\n\t\t// (setSessionFile) performs the full parse. Read just the first line here\n\t\t// instead of parsing the entire file a second time — that double parse is a\n\t\t// needless O(n) cost on open and is noticeable for long sessions.\n\t\tlet cwd = cwdOverride;\n\t\tif (cwd === undefined) {\n\t\t\tlet header: Partial<SessionHeader> | undefined;\n\t\t\ttry {\n\t\t\t\theader = readSessionHeader(path);\n\t\t\t} catch {\n\t\t\t\theader = undefined;\n\t\t\t}\n\t\t\t// readSessionHeader only inspects the first physical line. If that isn't a\n\t\t\t// valid session header (e.g. a leading blank/whitespace or malformed line),\n\t\t\t// fall back to the full loader, which trims and skips such lines exactly\n\t\t\t// like setSessionFile does — so this.cwd stays consistent with the header\n\t\t\t// the session is actually loaded with. This slow path is rare.\n\t\t\tif (header?.type !== \"session\" || typeof header.id !== \"string\") {\n\t\t\t\theader = loadEntriesFromFile(path).find((e) => e.type === \"session\") as SessionHeader | undefined;\n\t\t\t}\n\t\t\tcwd = header?.cwd;\n\t\t}\n\t\tconst dir = sessionDir ?? resolve(path, \"..\");\n\t\treturn new SessionManager(cwd ?? process.cwd(), dir, path, true);\n\t}\n\n\tstatic async openAsync(path: string, sessionDir?: string, cwdOverride?: string): Promise<SessionManager> {\n\t\tif (!existsSync(path)) {\n\t\t\treturn SessionManager.open(path, sessionDir, cwdOverride);\n\t\t}\n\t\tconst entries = await loadEntriesFromFileAsync(path);\n\t\tif (entries.length === 0) {\n\t\t\treturn SessionManager.open(path, sessionDir, cwdOverride);\n\t\t}\n\t\tconst cwd = cwdOverride ?? (entries[0] as SessionHeader).cwd;\n\t\tconst dir = sessionDir ?? resolve(path, \"..\");\n\t\treturn new SessionManager(cwd ?? process.cwd(), dir, path, true, entries);\n\t}\n\n\tstatic continueRecent(cwd: string, sessionDir?: string): SessionManager {\n\t\tconst dir = sessionDir ?? getDefaultSessionDir(cwd);\n\t\tconst mostRecent = findMostRecentSessionForCwd(dir, cwd);\n\t\tif (mostRecent) {\n\t\t\treturn new SessionManager(cwd, dir, mostRecent, true);\n\t\t}\n\t\treturn new SessionManager(cwd, dir, undefined, true);\n\t}\n\n\tstatic inMemory(cwd: string = process.cwd(), sessionDir = \"\"): SessionManager {\n\t\treturn new SessionManager(cwd, sessionDir, undefined, false);\n\t}\n\n\tstatic forkFrom(sourcePath: string, targetCwd: string, sessionDir?: string): SessionManager {\n\t\tconst sourceEntries = loadEntriesFromFile(sourcePath);\n\t\tif (sourceEntries.length === 0) {\n\t\t\tthrow new Error(`Cannot fork: source session file is empty or invalid: ${sourcePath}`);\n\t\t}\n\n\t\tconst sourceHeader = sourceEntries.find((e) => e.type === \"session\") as SessionHeader | undefined;\n\t\tif (!sourceHeader) {\n\t\t\tthrow new Error(`Cannot fork: source session has no header: ${sourcePath}`);\n\t\t}\n\t\tmigrateToCurrentVersion(sourceEntries);\n\n\t\tconst dir = sessionDir ?? getDefaultSessionDir(targetCwd);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tconst target = createUniqueSessionFileTarget(dir);\n\t\tconst newSessionId = target.sessionId;\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst newSessionFile = target.sessionFile;\n\n\t\tconst newHeader: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: newSessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: targetCwd,\n\t\t\tparentSession: sourcePath,\n\t\t\trlmDepth: resolveSessionRlmDepth(sourceHeader, sourcePath),\n\t\t\tgit: captureGitContext(targetCwd) ?? undefined,\n\t\t};\n\t\tappendFileSync(newSessionFile, `${JSON.stringify(newHeader)}\\n`);\n\n\t\t// Drop the source's git_state entries (re-linking children): they describe the source repo,\n\t\t// so the fork would otherwise report the source's git instead of its own target context.\n\t\tconst droppedParent = new Map<string, string | null>();\n\t\tfor (const entry of sourceEntries) {\n\t\t\tif (entry.type === \"git_state\") droppedParent.set(entry.id, entry.parentId);\n\t\t}\n\t\tconst liveParent = (parentId: string | null): string | null => {\n\t\t\tlet pid = parentId;\n\t\t\twhile (pid !== null && droppedParent.has(pid)) pid = droppedParent.get(pid) ?? null;\n\t\t\treturn pid;\n\t\t};\n\t\tfor (const entry of sourceEntries) {\n\t\t\tif (entry.type === \"session\" || entry.type === \"git_state\") continue;\n\t\t\tconst parentId = liveParent(entry.parentId);\n\t\t\tconst out = parentId === entry.parentId ? entry : { ...entry, parentId };\n\t\t\tappendFileSync(newSessionFile, `${JSON.stringify(out)}\\n`);\n\t\t}\n\n\t\treturn new SessionManager(targetCwd, dir, newSessionFile, true);\n\t}\n\n\tstatic async list(cwd: string, sessionDir?: string, callbacks?: SessionListCallbacks): Promise<SessionInfo[]> {\n\t\tconst dir = sessionDir ?? getDefaultSessionDir(cwd);\n\t\tconst matchesCwd = (session: SessionInfo) => sessionInfoMatchesCwd(session, cwd);\n\t\tconst sessions = (\n\t\t\tawait listSessionsFromDir(dir, {\n\t\t\t\tonProgress: callbacks?.onProgress,\n\t\t\t\tonSession: callbacks?.onSession\n\t\t\t\t\t? (session) => {\n\t\t\t\t\t\t\tif (matchesCwd(session)) {\n\t\t\t\t\t\t\t\tcallbacks.onSession?.(session);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t})\n\t\t).filter(matchesCwd);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n\n\tstatic async listAll(callbacks?: SessionListCallbacks, sessionDir?: string): Promise<SessionInfo[]> {\n\t\tconst sessionsDir = sessionDir ?? getSessionsDir();\n\t\tconst sessions = await listSessionsFromDir(sessionsDir, callbacks);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n}\n"]}
|