@bastani/atomic 0.9.53-alpha.1 → 0.9.54-alpha.1

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.
Files changed (170) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/package.json +1 -1
  4. package/dist/builtin/subagents/package.json +1 -1
  5. package/dist/builtin/web-access/package.json +1 -1
  6. package/dist/builtin/workflows/package.json +1 -1
  7. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  8. package/dist/core/agent-session-auto-compaction.js +2 -1
  9. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  10. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  11. package/dist/core/agent-session-compaction.js +2 -1
  12. package/dist/core/agent-session-compaction.js.map +1 -1
  13. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  14. package/dist/core/agent-session-extension-bindings.js +2 -1
  15. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  16. package/dist/core/agent-session-models.d.ts +17 -1
  17. package/dist/core/agent-session-models.d.ts.map +1 -1
  18. package/dist/core/agent-session-models.js +19 -0
  19. package/dist/core/agent-session-models.js.map +1 -1
  20. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
  21. package/dist/core/agent-session-post-tool-compaction.js +2 -1
  22. package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
  23. package/dist/core/agent-session-summary.d.ts.map +1 -1
  24. package/dist/core/agent-session-summary.js +2 -1
  25. package/dist/core/agent-session-summary.js.map +1 -1
  26. package/dist/core/agent-session-tree.d.ts.map +1 -1
  27. package/dist/core/agent-session-tree.js +2 -1
  28. package/dist/core/agent-session-tree.js.map +1 -1
  29. package/dist/core/exec.d.ts +9 -1
  30. package/dist/core/exec.d.ts.map +1 -1
  31. package/dist/core/exec.js +109 -74
  32. package/dist/core/exec.js.map +1 -1
  33. package/dist/core/extensions/loader-virtual-modules.js +2 -2
  34. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  35. package/dist/core/model-resolver-patterns.d.ts.map +1 -1
  36. package/dist/core/model-resolver-patterns.js +15 -9
  37. package/dist/core/model-resolver-patterns.js.map +1 -1
  38. package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
  39. package/dist/core/package-manager-auto-resources.js +3 -2
  40. package/dist/core/package-manager-auto-resources.js.map +1 -1
  41. package/dist/core/package-manager-git.d.ts +1 -1
  42. package/dist/core/package-manager-git.d.ts.map +1 -1
  43. package/dist/core/package-manager-git.js +12 -1
  44. package/dist/core/package-manager-git.js.map +1 -1
  45. package/dist/core/package-manager-npm.d.ts +1 -1
  46. package/dist/core/package-manager-npm.d.ts.map +1 -1
  47. package/dist/core/package-manager-npm.js +8 -4
  48. package/dist/core/package-manager-npm.js.map +1 -1
  49. package/dist/core/package-manager-operations.d.ts.map +1 -1
  50. package/dist/core/package-manager-operations.js +33 -8
  51. package/dist/core/package-manager-operations.js.map +1 -1
  52. package/dist/core/package-manager-resolver.d.ts.map +1 -1
  53. package/dist/core/package-manager-resolver.js +22 -4
  54. package/dist/core/package-manager-resolver.js.map +1 -1
  55. package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -1
  56. package/dist/core/package-manager-resource-accumulator.js +4 -4
  57. package/dist/core/package-manager-resource-accumulator.js.map +1 -1
  58. package/dist/core/package-manager-source.js +5 -5
  59. package/dist/core/package-manager-source.js.map +1 -1
  60. package/dist/core/package-manager-types.d.ts +5 -1
  61. package/dist/core/package-manager-types.d.ts.map +1 -1
  62. package/dist/core/package-manager-types.js.map +1 -1
  63. package/dist/core/package-manager.d.ts.map +1 -1
  64. package/dist/core/package-manager.js +3 -3
  65. package/dist/core/package-manager.js.map +1 -1
  66. package/dist/core/project-trust.d.ts.map +1 -1
  67. package/dist/core/project-trust.js +2 -1
  68. package/dist/core/project-trust.js.map +1 -1
  69. package/dist/core/prompt-templates-async.d.ts.map +1 -1
  70. package/dist/core/prompt-templates-async.js +4 -9
  71. package/dist/core/prompt-templates-async.js.map +1 -1
  72. package/dist/core/prompt-templates.d.ts.map +1 -1
  73. package/dist/core/prompt-templates.js +4 -12
  74. package/dist/core/prompt-templates.js.map +1 -1
  75. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  76. package/dist/core/resource-loader-extensions.js +8 -7
  77. package/dist/core/resource-loader-extensions.js.map +1 -1
  78. package/dist/core/resource-loader-paths.js +5 -5
  79. package/dist/core/resource-loader-paths.js.map +1 -1
  80. package/dist/core/resource-loader-source-info.d.ts +0 -1
  81. package/dist/core/resource-loader-source-info.d.ts.map +1 -1
  82. package/dist/core/resource-loader-source-info.js +6 -17
  83. package/dist/core/resource-loader-source-info.js.map +1 -1
  84. package/dist/core/sdk.d.ts.map +1 -1
  85. package/dist/core/sdk.js +3 -0
  86. package/dist/core/sdk.js.map +1 -1
  87. package/dist/core/session-manager-core.js +2 -2
  88. package/dist/core/session-manager-core.js.map +1 -1
  89. package/dist/core/session-manager-list.js +2 -2
  90. package/dist/core/session-manager-list.js.map +1 -1
  91. package/dist/core/skills-async.d.ts.map +1 -1
  92. package/dist/core/skills-async.js +5 -10
  93. package/dist/core/skills-async.js.map +1 -1
  94. package/dist/core/skills.d.ts.map +1 -1
  95. package/dist/core/skills.js +5 -13
  96. package/dist/core/skills.js.map +1 -1
  97. package/dist/core/source-info.d.ts +2 -0
  98. package/dist/core/source-info.d.ts.map +1 -1
  99. package/dist/core/source-info.js +5 -0
  100. package/dist/core/source-info.js.map +1 -1
  101. package/dist/core/tool-loadout.d.ts +4 -0
  102. package/dist/core/tool-loadout.d.ts.map +1 -1
  103. package/dist/core/tool-loadout.js +7 -1
  104. package/dist/core/tool-loadout.js.map +1 -1
  105. package/dist/core/tools/render-utils.d.ts.map +1 -1
  106. package/dist/core/tools/render-utils.js +2 -7
  107. package/dist/core/tools/render-utils.js.map +1 -1
  108. package/dist/core/trust-manager.d.ts.map +1 -1
  109. package/dist/core/trust-manager.js +15 -9
  110. package/dist/core/trust-manager.js.map +1 -1
  111. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  112. package/dist/extensions/codemode/tool.js +33 -8
  113. package/dist/extensions/codemode/tool.js.map +1 -1
  114. package/dist/main.d.ts.map +1 -1
  115. package/dist/main.js +20 -3
  116. package/dist/main.js.map +1 -1
  117. package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
  118. package/dist/modes/interactive/components/config-selector-list.js +2 -13
  119. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  120. package/dist/modes/interactive/components/session-selector-list.js +2 -2
  121. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  122. package/dist/modes/interactive/components/session-selector-tree.d.ts.map +1 -1
  123. package/dist/modes/interactive/components/session-selector-tree.js +4 -6
  124. package/dist/modes/interactive/components/session-selector-tree.js.map +1 -1
  125. package/dist/modes/interactive/components/session-selector-utils.d.ts +2 -1
  126. package/dist/modes/interactive/components/session-selector-utils.d.ts.map +1 -1
  127. package/dist/modes/interactive/components/session-selector-utils.js +5 -13
  128. package/dist/modes/interactive/components/session-selector-utils.js.map +1 -1
  129. package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
  130. package/dist/modes/interactive/components/tree-selector-content.js +2 -6
  131. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
  132. package/dist/modes/interactive/interactive-mode-base.d.ts +2 -0
  133. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  134. package/dist/modes/interactive/interactive-mode-base.js +4 -0
  135. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  136. package/dist/modes/interactive/interactive-mode-surface.d.ts +1 -0
  137. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  138. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  139. package/dist/modes/interactive/interactive-mode-types.d.ts +6 -0
  140. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  141. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  142. package/dist/modes/interactive/interactive-resource-rendering.js +1 -1
  143. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  144. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  145. package/dist/modes/interactive/interactive-startup.js +15 -8
  146. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  147. package/dist/modes/interactive/interactive-tui.d.ts +1 -0
  148. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  149. package/dist/modes/interactive/interactive-tui.js +1 -1
  150. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  151. package/dist/package-manager-cli.d.ts.map +1 -1
  152. package/dist/package-manager-cli.js +3 -0
  153. package/dist/package-manager-cli.js.map +1 -1
  154. package/dist/utils/ansi.d.ts.map +1 -1
  155. package/dist/utils/ansi.js +5 -2
  156. package/dist/utils/ansi.js.map +1 -1
  157. package/dist/utils/git.d.ts +1 -1
  158. package/dist/utils/git.d.ts.map +1 -1
  159. package/dist/utils/git.js.map +1 -1
  160. package/dist/utils/image-resize-core.d.ts.map +1 -1
  161. package/dist/utils/image-resize-core.js +5 -3
  162. package/dist/utils/image-resize-core.js.map +1 -1
  163. package/dist/utils/paths.d.ts +14 -0
  164. package/dist/utils/paths.d.ts.map +1 -1
  165. package/dist/utils/paths.js +39 -1
  166. package/dist/utils/paths.js.map +1 -1
  167. package/docs/extensions/api-reference.md +4 -2
  168. package/docs/packages.md +2 -0
  169. package/npm-shrinkwrap.json +32 -32
  170. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager-core.js","sourceRoot":"","sources":["../../src/core/session-manager-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { getCurrentSystemMessage } from \"@bastani/pi-ai\";\nimport type { ImageContent, Message, TextContent, Usage } from \"@bastani/pi-ai/compat\";\nimport { getAgentDir } from \"../config.js\";\nimport { createSessionCwdMatcher, normalizePath, resolvePath } from \"../utils/paths.ts\";\nimport type { VerbatimCompactionDetails } from \"./compaction/compaction-types.js\";\nimport type { BashExecutionMessage, CustomMessage } from \"./messages.ts\";\nimport { createBranchedSessionState } from \"./session-manager-archive.ts\";\nimport { classifiedWorkflowMetadata, validSessionWorkflowMetadata } from \"./session-manager-classification.ts\";\nimport {\n\tcreateBranchSummaryEntry,\n\tcreateCompactionEntry,\n\tcreateContextEditEntry,\n\tcreateCustomEntry,\n\tcreateCustomMessageEntry,\n\tcreateLabelEntry,\n\tcreateMessageEntry,\n\tcreateModelChangeEntry,\n\tcreateSessionFilePath,\n\tcreateSessionHeader,\n\tcreateSessionInfoEntry,\n\tcreateSessionSummaryEntry,\n\tcreateThinkingLevelChangeEntry,\n\tgetEntriesWithoutHeader,\n\tgetLatestSessionName,\n} from \"./session-manager-entries.ts\";\nimport { SessionEntryError } from \"./session-manager-errors.js\";\nimport {\n\tbuildContextEntries,\n\tbuildSessionIndex,\n\tbuildSessionProjection,\n\tbuildSessionTree,\n\tgetBranchPath,\n} from \"./session-manager-history.ts\";\nimport { listProjectSessions } from \"./session-manager-list.ts\";\nimport { getDefaultSessionDirPath } from \"./session-manager-paths.ts\";\nimport type {\n\tBranchSummaryEntry,\n\tContextEditEntry,\n\tFileEntry,\n\tNewSessionOptions,\n\tSessionContext,\n\tSessionEntry,\n\tSessionHeader,\n\tSessionInfo,\n\tSessionListProgress,\n\tSessionNameState,\n\tSessionProjection,\n\tSessionTreeNode,\n\tSessionWorkflowMetadata,\n\tUsageEntry,\n} from \"./session-manager-types.ts\";\nimport {\n\tassertValidSessionId,\n\tcreateSessionId,\n\tgenerateId,\n\tvalidateSessionFileEntries,\n} from \"./session-manager-validation.ts\";\nimport { listSessionStore } from \"./session-store-list.js\";\nimport { type StorageFailureCause, StorageRollbackError } from \"./storage/errors.js\";\nimport {\n\tSessionFormatVersionError,\n\tSessionIdMismatchError,\n\ttype SessionJsonValue,\n\tSessionNotFoundError,\n\tStorageUnavailableError,\n} from \"./storage/session/errors.js\";\nimport { JsonlSessionStore } from \"./storage/session/jsonl-session-store.js\";\nimport { MemorySessionStore } from \"./storage/session/memory-session-store.js\";\nimport type { SessionRecordHeader, SessionSnapshot, SessionStore } from \"./storage/session/types.js\";\n\nasync function resolveSessionStore(cwd: string): Promise<SessionStore> {\n\t// Selection loads settings and tools, which depend on the completed session module.\n\treturn (await import(\"./session-storage.js\")).resolveSessionStore(cwd);\n}\n\n/** An in-memory session tree whose mutations await the backing store. */\nexport class SessionManager {\n\tprivate sessionId = \"\";\n\tprivate sessionFile: string | undefined;\n\tprivate sessionDir: string;\n\tprivate cwd: string;\n\tprivate store: SessionStore;\n\tprivate lastSeq = 0;\n\tprivate mutation: Promise<void> = Promise.resolve();\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(store: SessionStore, cwd: string, sessionDir: string, options?: NewSessionOptions) {\n\t\tthis.store = store;\n\t\tthis.cwd = resolvePath(cwd);\n\t\tthis.sessionDir = normalizePath(sessionDir);\n\t\tthis.start(options);\n\t}\n\n\tprivate runMutation<T>(operation: () => Promise<T>): Promise<T> {\n\t\tconst result = this.mutation.then(operation);\n\t\tthis.mutation = result.then(\n\t\t\t() => {},\n\t\t\t() => {},\n\t\t);\n\t\treturn result;\n\t}\n\n\tprivate recordHeader(header = this.getHeader()!): SessionRecordHeader {\n\t\tconst { type: _type, ...record } = header;\n\t\treturn record;\n\t}\n\n\tprivate restore(snapshot: SessionSnapshot, location?: string): void {\n\t\tconst header = snapshot.header;\n\t\tthis.fileEntries = [{ type: \"session\", ...header }, ...snapshot.entries];\n\t\tthis.sessionId = header.id;\n\t\tthis.lastSeq = snapshot.lastSeq;\n\t\tthis.sessionFile =\n\t\t\tlocation ?? (this.store instanceof JsonlSessionStore ? this.store.locationFor(header) : undefined);\n\t\tthis._buildIndex();\n\t}\n\n\tprivate start(options?: NewSessionOptions): string | undefined {\n\t\tif (options?.id !== undefined) assertValidSessionId(options.id);\n\t\tthis.sessionId = options?.id ?? createSessionId();\n\t\tthis.fileEntries = [\n\t\t\tcreateSessionHeader(\n\t\t\t\tthis.sessionId,\n\t\t\t\tthis.cwd,\n\t\t\t\tnew Date().toISOString(),\n\t\t\t\toptions?.parentSession,\n\t\t\t\toptions?.internal,\n\t\t\t\toptions?.workflow,\n\t\t\t),\n\t\t];\n\t\tthis.lastSeq = 0;\n\t\tthis._buildIndex();\n\t\tthis.sessionFile =\n\t\t\tthis.store instanceof JsonlSessionStore\n\t\t\t\t? this.sessionDir\n\t\t\t\t\t? createSessionFilePath(this.sessionDir, this.getHeader()!.createdAt, this.sessionId)\n\t\t\t\t\t: this.store.locationFor(this.recordHeader())\n\t\t\t\t: undefined;\n\t\treturn this.sessionFile;\n\t}\n\n\tsetSessionFile(sessionFile: string): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst opened = await SessionManager.open(sessionFile, this.sessionDir, this.cwd);\n\t\t\tthis.store = opened.store;\n\t\t\tthis.restore(\n\t\t\t\t{ header: opened.recordHeader(), entries: opened.getEntries(), lastSeq: opened.lastSeq },\n\t\t\t\topened.sessionFile,\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate async initialize(): Promise<void> {\n\t\tthis.lastSeq = (\n\t\t\tawait (this.store instanceof JsonlSessionStore\n\t\t\t\t? this.store.create(this.recordHeader(), this.getEntries(), this.sessionFile)\n\t\t\t\t: this.store.create(this.recordHeader(), this.getEntries()))\n\t\t).lastSeq;\n\t}\n\n\tprivate async storeForNewSession(): Promise<SessionStore> {\n\t\tif (\n\t\t\tthis.store instanceof JsonlSessionStore &&\n\t\t\tthis.sessionDir &&\n\t\t\tthis.store.descriptor.location !== resolvePath(this.sessionDir)\n\t\t) {\n\t\t\treturn JsonlSessionStore.open(this.sessionDir, { exactDirectory: true, scanExisting: false });\n\t\t}\n\t\treturn this.store;\n\t}\n\n\tnewSession(options?: NewSessionOptions): Promise<string | undefined> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (options?.id !== undefined) assertValidSessionId(options.id);\n\t\t\tconst header = createSessionHeader(\n\t\t\t\toptions?.id ?? createSessionId(),\n\t\t\t\tthis.cwd,\n\t\t\t\tnew Date().toISOString(),\n\t\t\t\toptions?.parentSession,\n\t\t\t\toptions?.internal,\n\t\t\t\toptions?.workflow,\n\t\t\t);\n\t\t\tconst record = this.recordHeader(header);\n\t\t\tconst store = await this.storeForNewSession();\n\t\t\tconst location =\n\t\t\t\tstore instanceof JsonlSessionStore\n\t\t\t\t\t? this.sessionDir\n\t\t\t\t\t\t? createSessionFilePath(this.sessionDir, record.createdAt, record.id)\n\t\t\t\t\t\t: store.locationFor(record)\n\t\t\t\t\t: undefined;\n\t\t\tconst result = await (store instanceof JsonlSessionStore\n\t\t\t\t? store.create(record, [], location)\n\t\t\t\t: store.create(record, []));\n\t\t\tthis.store = store;\n\t\t\tthis.byId.clear();\n\t\t\tthis.labelsById.clear();\n\t\t\tthis.labelTimestampsById.clear();\n\t\t\tthis.restore({ header: record, entries: [], lastSeq: result.lastSeq }, location);\n\t\t\treturn this.sessionFile;\n\t\t});\n\t}\n\n\tmarkSessionInternal(workflow?: SessionWorkflowMetadata): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst previous = this.getHeader()!;\n\t\t\tif (classifiedWorkflowMetadata(previous)) return;\n\t\t\tconst validWorkflow = validSessionWorkflowMetadata(workflow);\n\t\t\tif (!validWorkflow) return;\n\t\t\tconst header: SessionHeader = { ...previous, internal: true, workflow: validWorkflow };\n\t\t\tconst result = await this.store.replace(this.sessionId, this.recordHeader(header), this.getEntries(), {\n\t\t\t\texpectSeq: this.lastSeq,\n\t\t\t});\n\t\t\tthis.lastSeq = result.lastSeq;\n\t\t\tthis.fileEntries[0] = header;\n\t\t});\n\t}\n\n\tprivate _buildIndex(): void {\n\t\tvalidateSessionFileEntries(this.fileEntries, this.sessionFile ?? \"in-memory session\");\n\t\tconst index = buildSessionIndex(this.fileEntries);\n\t\tthis.byId = index.byId;\n\t\tthis.labelsById = index.labelsById;\n\t\tthis.labelTimestampsById = index.labelTimestampsById;\n\t\tthis.leafId = index.leafId;\n\t}\n\n\tisPersisted(): boolean {\n\t\treturn !(this.store instanceof MemorySessionStore);\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\tusesDefaultSessionDir(): boolean {\n\t\treturn this.sessionDir === getDefaultSessionDirPath(this.cwd);\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\tgetSessionStore(): SessionStore {\n\t\treturn this.store;\n\t}\n\n\tasync deleteSession(sessionId: string): Promise<void> {\n\t\tif (sessionId === this.sessionId) {\n\t\t\tthrow new Error(`Cannot delete the session that is currently open: ${sessionId}`);\n\t\t}\n\t\ttry {\n\t\t\tawait this.store.delete(sessionId);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof SessionNotFoundError)) throw error;\n\t\t}\n\t}\n\n\t/** @internal Finalize provisional startup storage after project trust resolves. */\n\trebindStore(store: SessionStore, removeProvisionalRecord: boolean): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (store === this.store) return;\n\t\t\tconst header = this.recordHeader();\n\t\t\tconst entries = this.getEntries();\n\t\t\tconst result = await store.create(header, entries);\n\t\t\tif (removeProvisionalRecord) await this.store.delete(this.sessionId);\n\t\t\tthis.store = store;\n\t\t\tthis.sessionDir = store instanceof JsonlSessionStore ? store.descriptor.location : \"\";\n\t\t\tthis.restore({ header, entries, lastSeq: result.lastSeq });\n\t\t});\n\t}\n\n\tasync openSessionById(sessionId: string, cwdOverride?: string, sessionDirectory?: string): Promise<SessionManager> {\n\t\tlet store =\n\t\t\tsessionDirectory === undefined\n\t\t\t\t? this.store\n\t\t\t\t: await JsonlSessionStore.open(sessionDirectory, { exactDirectory: true, scanExisting: false });\n\t\tlet snapshot: SessionSnapshot;\n\t\ttry {\n\t\t\tsnapshot = await store.load(sessionId);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!(error instanceof SessionNotFoundError) ||\n\t\t\t\tsessionDirectory !== undefined ||\n\t\t\t\t!this.usesDefaultSessionDir()\n\t\t\t)\n\t\t\t\tthrow error;\n\t\t\tstore = await JsonlSessionStore.open(join(getAgentDir(), \"sessions\"), { scanExisting: false });\n\t\t\tsnapshot = await store.load(sessionId);\n\t\t}\n\t\tconst location = store instanceof JsonlSessionStore ? await store.findFile(sessionId) : undefined;\n\t\tif (location !== undefined) {\n\t\t\tstore = await JsonlSessionStore.open(dirname(location), { exactDirectory: true, scanExisting: false });\n\t\t\tsnapshot = await store.load(sessionId);\n\t\t}\n\t\tif (snapshot.header.id !== sessionId) throw new SessionIdMismatchError(sessionId, snapshot.header.id);\n\t\tconst manager = new SessionManager(store, cwdOverride ?? snapshot.header.cwd, this.sessionDir);\n\t\tmanager.restore(snapshot, location);\n\t\tif (location !== undefined) manager.sessionDir = dirname(location);\n\t\treturn manager;\n\t}\n\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<SessionManager> {\n\t\tconst source = await JsonlSessionStore.open(dirname(resolvePath(inputPath)), {\n\t\t\texactDirectory: true,\n\t\t\tscanExisting: false,\n\t\t});\n\t\ttry {\n\t\t\tconst snapshot = await source.loadFile(inputPath);\n\t\t\tconst manager = new SessionManager(this.store, cwdOverride ?? snapshot.header.cwd, this.sessionDir);\n\t\t\tmanager.restore(snapshot);\n\t\t\tawait manager.initialize();\n\t\t\treturn manager;\n\t\t} finally {\n\t\t\tawait source.close();\n\t\t}\n\t}\n\n\tprivate async _appendEntry(entry: SessionEntry): Promise<void> {\n\t\tconst result = await this.store.append(this.sessionId, [entry], { expectSeq: this.lastSeq });\n\t\tthis.lastSeq = result.lastSeq;\n\t\tthis.fileEntries.push(entry);\n\t\tthis.byId.set(entry.id, entry);\n\t\tthis.leafId = entry.id;\n\t}\n\n\t/** Append a message as child of current leaf, then advance leaf. Returns entry id. */\n\tappendMessage(message: Message | CustomMessage | BashExecutionMessage): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createMessageEntry(message, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Append a thinking level change as child of current leaf, then advance leaf. Returns entry id. */\n\tappendThinkingLevelChange(thinkingLevel: string): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createThinkingLevelChangeEntry(thinkingLevel, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Record auxiliary model usage without adding it to the LLM context. */\n\tappendUsage(kind: string, provider: string, model: string, usage: Usage, note?: string): Promise<UsageEntry> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry: UsageEntry = {\n\t\t\t\ttype: \"usage\",\n\t\t\t\tid: generateId(this.byId),\n\t\t\t\tparentId: this.leafId,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tkind,\n\t\t\t\tprovider,\n\t\t\t\tmodel,\n\t\t\t\tusage,\n\t\t\t\t...(note === undefined ? {} : { note }),\n\t\t\t};\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry;\n\t\t});\n\t}\n\n\t/** Append a model change as child of current leaf, then advance leaf. Returns entry id. */\n\tappendModelChange(provider: string, modelId: string): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createModelChangeEntry(provider, modelId, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\tappendCompaction(\n\t\tcompactedText: string,\n\t\tfirstKeptEntryId: string | null,\n\t\ttokensBefore: number,\n\t\tdetails: VerbatimCompactionDetails,\n\t\tusage?: Usage,\n\t): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (firstKeptEntryId !== null && !this.byId.has(firstKeptEntryId))\n\t\t\t\tthrow new SessionEntryError(firstKeptEntryId, \"missing\");\n\t\t\tconst entry = createCompactionEntry(\n\t\t\t\tcompactedText,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\tdetails,\n\t\t\t\tusage,\n\t\t\t\tthis.byId,\n\t\t\t\tthis.leafId,\n\t\t\t);\n\t\t\tconst systemMessage = getCurrentSystemMessage(this.buildSessionProjection().messages);\n\t\t\tif (systemMessage) entry.systemMessage = { ...systemMessage, timestamp: new Date(entry.timestamp).getTime() };\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Save a JSONL backup; database-backed sessions have no file snapshot. */\n\twriteBackupSnapshot(label = \"compact\"): Promise<string | undefined> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (!(this.store instanceof JsonlSessionStore) || !this.sessionFile) return undefined;\n\t\t\tconst path = `${this.sessionFile}.${new Date().toISOString().replace(/[:.]/g, \"-\")}.${label.replace(/[^a-z0-9_-]/gi, \"-\") || \"backup\"}.bak`;\n\t\t\ttry {\n\t\t\t\tawait writeFile(\n\t\t\t\t\tpath,\n\t\t\t\t\t`${[JSON.stringify({ type: \"session\", ...this.recordHeader() }), ...this.getEntries().map((entry) => JSON.stringify(entry))].join(\"\\n\")}\\n`,\n\t\t\t\t);\n\t\t\t} catch (cause) {\n\t\t\t\tthrow new StorageUnavailableError(this.store.descriptor, cause as Error);\n\t\t\t}\n\t\t\treturn path;\n\t\t});\n\t}\n\n\t/** Append a branch-local edit to an earlier model-visible entry. */\n\tappendContextEdit(targetId: string, replacement: ContextEditEntry[\"replacement\"]): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (\n\t\t\t\treplacement !== null &&\n\t\t\t\t(typeof replacement !== \"object\" ||\n\t\t\t\t\t!(\"content\" in replacement) ||\n\t\t\t\t\t(typeof replacement.content !== \"string\" && !Array.isArray(replacement.content)))\n\t\t\t) {\n\t\t\t\tthrow new SessionEntryError(targetId, \"invalid-replacement\");\n\t\t\t}\n\t\t\tconst target = this.byId.get(targetId);\n\t\t\tif (!target) throw new SessionEntryError(targetId, \"missing\");\n\t\t\tif (!this.getBranch().some((entry) => entry.id === targetId)) {\n\t\t\t\tthrow new SessionEntryError(targetId, \"inactive\");\n\t\t\t}\n\t\t\tconst editable =\n\t\t\t\ttarget.type === \"custom_message\" ||\n\t\t\t\t(target.type === \"message\" &&\n\t\t\t\t\t(target.message.role === \"user\" ||\n\t\t\t\t\t\ttarget.message.role === \"assistant\" ||\n\t\t\t\t\t\ttarget.message.role === \"toolResult\"));\n\t\t\tif (!editable) throw new SessionEntryError(targetId, \"not-editable\");\n\t\t\tconst targetRole = target.type === \"message\" ? target.message.role : \"custom\";\n\t\t\tconst normalizedReplacement =\n\t\t\t\treplacement !== null &&\n\t\t\t\t(targetRole === \"assistant\" || targetRole === \"toolResult\") &&\n\t\t\t\ttypeof replacement.content === \"string\"\n\t\t\t\t\t? { content: [{ type: \"text\" as const, text: replacement.content }] }\n\t\t\t\t\t: replacement;\n\t\t\tconst entry = createContextEditEntry(targetId, normalizedReplacement, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Append a custom entry (for extensions) as child of current leaf, then advance leaf. Returns entry id. */\n\tappendCustomEntry<T = SessionJsonValue>(customType: string, data?: T): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createCustomEntry(customType, data, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Append a session info entry (e.g., display name). Returns entry id. */\n\tappendSessionInfo(name: string): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createSessionInfoEntry(name, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Append a generated resume summary anchored to the message it describes. Returns entry id. */\n\tappendSessionSummary(summary: string, summarizedThroughId: string, usage?: Usage): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (!this.byId.has(summarizedThroughId)) throw new SessionEntryError(summarizedThroughId, \"missing\");\n\t\t\tconst entry = createSessionSummaryEntry(summary, summarizedThroughId, usage, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Get the current session name from the latest session_info entry, if any. */\n\tgetSessionName(): string | undefined {\n\t\treturn this.getSessionNameState().name;\n\t}\n\n\t/**\n\t * Get the session name state. `hasName` is true for a session that was named and\n\t * then cleared even though `name` is undefined; a never-named session reports\n\t * `hasName: false`. Read-side only: the JSONL already records the distinction.\n\t */\n\tgetSessionNameState(): SessionNameState {\n\t\treturn getLatestSessionName(this.fileEntries);\n\t}\n\n\t/** Append a custom message entry (for extensions) that participates in LLM context unless excluded. */\n\tappendCustomMessageEntry<T = SessionJsonValue>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t\texcludeFromContext?: boolean,\n\t\tprotectedReconciliation?: { delivery: \"steer\" | \"followUp\" },\n\t\tstageAdmissionKey?: string,\n\t): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createCustomMessageEntry(\n\t\t\t\tcustomType,\n\t\t\t\tcontent,\n\t\t\t\tdisplay,\n\t\t\t\tdetails,\n\t\t\t\texcludeFromContext,\n\t\t\t\tprotectedReconciliation,\n\t\t\t\tthis.byId,\n\t\t\t\tthis.leafId,\n\t\t\t\tstageAdmissionKey,\n\t\t\t);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\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\t/** Get all direct children of an entry. */\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\t/** Get the label for an entry, if any. */\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labelsById.get(id);\n\t}\n\n\t/** Set or clear a label on an entry. */\n\tappendLabelChange(targetId: string, label: string | undefined): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (!this.byId.has(targetId)) {\n\t\t\t\tthrow new SessionEntryError(targetId, \"missing\");\n\t\t\t}\n\t\t\tconst entry = createLabelEntry(targetId, label, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\tif (label) {\n\t\t\t\tthis.labelsById.set(targetId, label);\n\t\t\t\tthis.labelTimestampsById.set(targetId, entry.timestamp);\n\t\t\t} else {\n\t\t\t\tthis.labelsById.delete(targetId);\n\t\t\t\tthis.labelTimestampsById.delete(targetId);\n\t\t\t}\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Walk from entry to root, returning all entries in path order. */\n\tgetBranch(fromId?: string): SessionEntry[] {\n\t\treturn getBranchPath(fromId ?? this.leafId, this.byId);\n\t}\n\n\t/** Return the active branch entries after applying the latest compaction boundary. */\n\tbuildContextEntries(): SessionEntry[] {\n\t\treturn buildContextEntries(this.getEntries(), this.leafId, this.byId);\n\t}\n\n\t/** Build provenance-preserving, compaction-aware model context from the current leaf. */\n\tbuildSessionProjection(): SessionProjection {\n\t\treturn buildSessionProjection(this.getEntries(), this.leafId, this.byId);\n\t}\n\n\t/** Build the session context (what gets sent to the LLM). */\n\tbuildSessionContext(): SessionContext {\n\t\tconst { messages, thinkingLevel, model } = this.buildSessionProjection();\n\t\treturn { messages, thinkingLevel, model };\n\t}\n\n\t/** Get session header. */\n\tgetHeader(): SessionHeader | null {\n\t\tconst header = this.fileEntries.find((entry) => entry.type === \"session\");\n\t\treturn header ? (header as SessionHeader) : null;\n\t}\n\n\t/** Number of entries without copying the session history. */\n\tgetEntryCount(): number {\n\t\treturn this.byId.size;\n\t}\n\n\t/** Get all session entries (excludes header). Returns a shallow copy. */\n\tgetEntries(): SessionEntry[] {\n\t\treturn getEntriesWithoutHeader(this.fileEntries);\n\t}\n\n\t/** Get the session as a tree structure. Returns a shallow defensive copy of all entries. */\n\tgetTree(): SessionTreeNode[] {\n\t\treturn buildSessionTree(this.getEntries(), this.labelsById, this.labelTimestampsById);\n\t}\n\n\t/** Start a new branch from an earlier entry. */\n\tbranch(branchFromId: string): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (!this.byId.has(branchFromId)) {\n\t\t\t\tthrow new SessionEntryError(branchFromId, \"missing\");\n\t\t\t}\n\t\t\tthis.leafId = branchFromId;\n\t\t});\n\t}\n\n\t/** Reset the leaf pointer to null (before any entries). */\n\tresetLeaf(): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tthis.leafId = null;\n\t\t});\n\t}\n\n\t/** Start a new branch with a summary of the abandoned path. */\n\tbranchWithSummary<T = SessionJsonValue>(\n\t\tbranchFromId: string | null,\n\t\tsummary: string,\n\t\tdetails?: T,\n\t\tfromHook?: boolean,\n\t\tusage?: import(\"@bastani/pi-ai/compat\").Usage,\n\t\tfromId?: string,\n\t): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (branchFromId !== null && !this.byId.has(branchFromId)) {\n\t\t\t\tthrow new SessionEntryError(branchFromId, \"missing\");\n\t\t\t}\n\t\t\tconst entry: BranchSummaryEntry = createBranchSummaryEntry(\n\t\t\t\tbranchFromId,\n\t\t\t\tfromId ?? this.leafId ?? \"root\",\n\t\t\t\tsummary,\n\t\t\t\tdetails,\n\t\t\t\tusage,\n\t\t\t\tfromHook,\n\t\t\t\tthis.byId,\n\t\t\t);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\tcreateBranchedSession(leafId: string): Promise<string | undefined> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst result = createBranchedSessionState({\n\t\t\t\tleafId,\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tparentSessionId: this.sessionId,\n\t\t\t\tworkflow: classifiedWorkflowMetadata(this.getHeader()),\n\t\t\t\tpath: this.getBranch(leafId),\n\t\t\t\tlabelsById: this.labelsById,\n\t\t\t\tlabelTimestampsById: this.labelTimestampsById,\n\t\t\t});\n\t\t\tconst header = result.fileEntries[0] as SessionHeader;\n\t\t\tconst entries = getEntriesWithoutHeader(result.fileEntries);\n\t\t\tconst record = this.recordHeader(header);\n\t\t\tconst store = await this.storeForNewSession();\n\t\t\tconst location =\n\t\t\t\tstore instanceof JsonlSessionStore\n\t\t\t\t\t? this.sessionDir\n\t\t\t\t\t\t? createSessionFilePath(this.sessionDir, record.createdAt, record.id)\n\t\t\t\t\t\t: store.locationFor(record)\n\t\t\t\t\t: undefined;\n\t\t\tconst lastSeq = (\n\t\t\t\tawait (store instanceof JsonlSessionStore\n\t\t\t\t\t? store.create(record, entries, location)\n\t\t\t\t\t: store.create(record, entries))\n\t\t\t).lastSeq;\n\t\t\tthis.store = store;\n\t\t\tthis.fileEntries = result.fileEntries;\n\t\t\tthis.sessionId = header.id;\n\t\t\tthis.lastSeq = lastSeq;\n\t\t\tthis.sessionFile = location;\n\t\t\tthis._buildIndex();\n\t\t\treturn this.sessionFile;\n\t\t});\n\t}\n\n\tasync forkTo(cwd: string, sessionDir?: string | SessionStore, options?: NewSessionOptions): Promise<SessionManager> {\n\t\tconst store =\n\t\t\ttypeof sessionDir === \"string\"\n\t\t\t\t? await JsonlSessionStore.open(sessionDir, { exactDirectory: true, scanExisting: false })\n\t\t\t\t: (sessionDir ?? (await resolveSessionStore(cwd)));\n\t\tconst directory = store instanceof JsonlSessionStore ? store.descriptor.location : \"\";\n\t\treturn SessionManager.constructWithStore(store, store !== sessionDir, async () => {\n\t\t\tconst manager = new SessionManager(store, cwd, directory, { ...options, parentSession: this.sessionId });\n\t\t\tmanager.fileEntries.push(...this.getEntries());\n\t\t\tawait manager.initialize();\n\t\t\tmanager._buildIndex();\n\t\t\treturn manager;\n\t\t});\n\t}\n\n\tstatic async importFromJsonl(\n\t\tinputPath: string,\n\t\tcwd: string,\n\t\tsessionDir?: string | SessionStore,\n\t): Promise<SessionManager> {\n\t\tconst store =\n\t\t\ttypeof sessionDir === \"string\"\n\t\t\t\t? await JsonlSessionStore.open(sessionDir, { exactDirectory: true, scanExisting: false })\n\t\t\t\t: (sessionDir ?? (await resolveSessionStore(cwd)));\n\t\treturn SessionManager.constructWithStore(store, store !== sessionDir, () =>\n\t\t\tnew SessionManager(\n\t\t\t\tstore,\n\t\t\t\tcwd,\n\t\t\t\tstore instanceof JsonlSessionStore ? store.descriptor.location : \"\",\n\t\t\t).importFromJsonl(inputPath),\n\t\t);\n\t}\n\tprivate static async constructWithStore(\n\t\tstore: SessionStore,\n\t\towned: boolean,\n\t\tconstruct: () => Promise<SessionManager>,\n\t): Promise<SessionManager> {\n\t\ttry {\n\t\t\treturn await construct();\n\t\t} catch (error) {\n\t\t\tif (owned) {\n\t\t\t\ttry {\n\t\t\t\t\tawait store.close();\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tthrow new StorageRollbackError(error as StorageFailureCause, cause as StorageFailureCause);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tstatic async create(cwd: string, sessionDir?: string, options?: NewSessionOptions): Promise<SessionManager>;\n\tstatic async create(store: SessionStore, cwd: string, options?: NewSessionOptions): Promise<SessionManager>;\n\tstatic async create(\n\t\tcwdOrStore: string | SessionStore,\n\t\tdirectoryOrCwd?: string,\n\t\toptions?: NewSessionOptions,\n\t): Promise<SessionManager> {\n\t\tconst cwd = typeof cwdOrStore === \"string\" ? cwdOrStore : (directoryOrCwd ?? process.cwd());\n\t\tif (typeof cwdOrStore === \"string\" && directoryOrCwd === undefined) {\n\t\t\tconst store = await resolveSessionStore(cwd);\n\t\t\treturn SessionManager.constructWithStore(store, true, () => SessionManager.create(store, cwd, options));\n\t\t}\n\t\tconst directory =\n\t\t\ttypeof cwdOrStore === \"string\"\n\t\t\t\t? directoryOrCwd\n\t\t\t\t\t? normalizePath(directoryOrCwd)\n\t\t\t\t\t: getDefaultSessionDirPath(cwd)\n\t\t\t\t: cwdOrStore instanceof JsonlSessionStore\n\t\t\t\t\t? cwdOrStore.descriptor.location\n\t\t\t\t\t: \"\";\n\t\tconst store =\n\t\t\ttypeof cwdOrStore === \"string\"\n\t\t\t\t? await JsonlSessionStore.open(directory, { exactDirectory: true, scanExisting: false })\n\t\t\t\t: cwdOrStore;\n\t\treturn SessionManager.constructWithStore(store, store !== cwdOrStore, async () => {\n\t\t\tconst manager = new SessionManager(store, cwd, directory, options);\n\t\t\tif (typeof cwdOrStore !== \"string\" && store instanceof JsonlSessionStore) {\n\t\t\t\tmanager.sessionFile = store.locationFor(manager.recordHeader());\n\t\t\t\tmanager.sessionDir = dirname(manager.sessionFile);\n\t\t\t}\n\t\t\tawait manager.initialize();\n\t\t\treturn manager;\n\t\t});\n\t}\n\n\tstatic async open(path: string, sessionDir?: string, cwdOverride?: string): Promise<SessionManager>;\n\tstatic async open(store: SessionStore, sessionId: string, cwdOverride?: string): Promise<SessionManager>;\n\tstatic async open(\n\t\tpathOrStore: string | SessionStore,\n\t\tdirectoryOrId?: string,\n\t\tcwdOverride?: string,\n\t): Promise<SessionManager> {\n\t\tif (typeof pathOrStore !== \"string\") {\n\t\t\tconst snapshot = await pathOrStore.load(directoryOrId!);\n\t\t\tif (snapshot.header.id !== directoryOrId) throw new SessionIdMismatchError(directoryOrId!, snapshot.header.id);\n\t\t\tconst manager = new SessionManager(\n\t\t\t\tpathOrStore,\n\t\t\t\tcwdOverride ?? snapshot.header.cwd,\n\t\t\t\tpathOrStore instanceof JsonlSessionStore ? pathOrStore.descriptor.location : \"\",\n\t\t\t);\n\t\t\tmanager.restore(\n\t\t\t\tsnapshot,\n\t\t\t\tpathOrStore instanceof JsonlSessionStore ? await pathOrStore.findFile(directoryOrId!) : undefined,\n\t\t\t);\n\t\t\tif (manager.sessionFile) manager.sessionDir = dirname(manager.sessionFile);\n\t\t\treturn manager;\n\t\t}\n\t\tconst path = resolvePath(pathOrStore);\n\t\tconst directory = directoryOrId ?? dirname(path);\n\t\tconst store = await JsonlSessionStore.open(dirname(path), { exactDirectory: true, scanExisting: false });\n\t\tlet snapshot: SessionSnapshot;\n\t\ttry {\n\t\t\tsnapshot = await store.loadFile(path);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof StorageUnavailableError) || (error.cause as NodeJS.ErrnoException).code !== \"ENOENT\")\n\t\t\t\tthrow error;\n\t\t\tconst manager = new SessionManager(store, cwdOverride ?? process.cwd(), directory);\n\t\t\tmanager.lastSeq = (await store.create(manager.recordHeader(), [], path)).lastSeq;\n\t\t\tmanager.sessionFile = path;\n\t\t\treturn manager;\n\t\t}\n\t\tconst manager = new SessionManager(store, cwdOverride ?? snapshot.header.cwd, directory);\n\t\tmanager.restore(snapshot, path);\n\t\treturn manager;\n\t}\n\n\tstatic async continueRecent(\n\t\tcwd: string,\n\t\tsessionDir?: string,\n\t\toptions?: { includeInternal?: boolean },\n\t): Promise<SessionManager>;\n\tstatic async continueRecent(\n\t\tstore: SessionStore,\n\t\tcwd: string,\n\t\toptions?: { includeInternal?: boolean },\n\t): Promise<SessionManager>;\n\tstatic async continueRecent(\n\t\tcwdOrStore: string | SessionStore,\n\t\tdirectoryOrCwd?: string,\n\t\toptions?: { includeInternal?: boolean },\n\t): Promise<SessionManager> {\n\t\tconst cwd = typeof cwdOrStore === \"string\" ? cwdOrStore : directoryOrCwd!;\n\t\tif (typeof cwdOrStore === \"string\" && directoryOrCwd === undefined) {\n\t\t\tconst store = await resolveSessionStore(cwd);\n\t\t\treturn SessionManager.constructWithStore(store, true, () =>\n\t\t\t\tSessionManager.continueRecent(store, cwd, options),\n\t\t\t);\n\t\t}\n\t\tconst directory = typeof cwdOrStore === \"string\" ? (directoryOrCwd ?? getDefaultSessionDirPath(cwd)) : \"\";\n\t\tconst store =\n\t\t\ttypeof cwdOrStore === \"string\"\n\t\t\t\t? await JsonlSessionStore.open(directory, { exactDirectory: true, scanExisting: false })\n\t\t\t\t: cwdOrStore;\n\t\treturn SessionManager.constructWithStore(store, store !== cwdOrStore, async () => {\n\t\t\tconst recent = await store.findMostRecent({\n\t\t\t\tcwd: resolvePath(cwd),\n\t\t\t\tincludeInternal: options?.includeInternal,\n\t\t\t});\n\t\t\tconst manager = new SessionManager(store, cwd, directory);\n\t\t\tif (recent) manager.restore(await store.load(recent.id), recent.location);\n\t\t\telse await manager.initialize();\n\t\t\treturn manager;\n\t\t});\n\t}\n\n\tstatic inMemory(cwd: string = process.cwd(), options?: NewSessionOptions, entries?: FileEntry[]): SessionManager {\n\t\tconst manager = new SessionManager(new MemorySessionStore(createSessionCwdMatcher), cwd, \"\", options);\n\t\tif (entries?.length) {\n\t\t\tmanager.fileEntries = entries[0].type === \"session\" ? entries : [...manager.fileEntries, ...entries];\n\t\t\tmanager.sessionId = manager.getHeader()!.id;\n\t\t\tmanager._buildIndex();\n\t\t}\n\t\tmanager.mutation = manager.initialize();\n\t\treturn manager;\n\t}\n\n\tstatic async forkFrom(\n\t\tsourcePath: string,\n\t\ttargetCwd: string,\n\t\tsessionDir?: string,\n\t\toptions?: NewSessionOptions,\n\t): Promise<SessionManager> {\n\t\tconst sourceStore = await JsonlSessionStore.open(dirname(resolvePath(sourcePath)), {\n\t\t\texactDirectory: true,\n\t\t\tscanExisting: false,\n\t\t});\n\t\tlet source: SessionSnapshot;\n\t\ttry {\n\t\t\tsource = await sourceStore.loadFile(resolvePath(sourcePath));\n\t\t} finally {\n\t\t\tawait sourceStore.close();\n\t\t}\n\t\tconst store =\n\t\t\tsessionDir === undefined\n\t\t\t\t? await resolveSessionStore(targetCwd)\n\t\t\t\t: await JsonlSessionStore.open(sessionDir, { exactDirectory: true, scanExisting: false });\n\t\treturn SessionManager.constructWithStore(store, true, async () => {\n\t\t\tconst manager = new SessionManager(store, targetCwd, sessionDir ?? \"\", {\n\t\t\t\t...options,\n\t\t\t\tparentSession: source.header.id,\n\t\t\t});\n\t\t\tmanager.fileEntries.push(...source.entries);\n\t\t\tawait manager.initialize();\n\t\t\tmanager._buildIndex();\n\t\t\treturn manager;\n\t\t});\n\t}\n\n\tstatic async findById(cwd: string, id: string, sessionDir?: string): Promise<string | undefined> {\n\t\tconst store =\n\t\t\tsessionDir === undefined\n\t\t\t\t? await resolveSessionStore(cwd)\n\t\t\t\t: await JsonlSessionStore.open(sessionDir, { exactDirectory: true, scanExisting: false });\n\t\ttry {\n\t\t\tconst header = await store.readHeader(id);\n\t\t\tif (\n\t\t\t\t!header ||\n\t\t\t\tclassifiedWorkflowMetadata(header) ||\n\t\t\t\t!createSessionCwdMatcher(resolvePath(cwd))(resolvePath(header.cwd))\n\t\t\t)\n\t\t\t\treturn undefined;\n\t\t\treturn store instanceof JsonlSessionStore ? await store.findFile(id) : id;\n\t\t} catch (error) {\n\t\t\tif (error instanceof SessionFormatVersionError) return undefined;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tawait store.close();\n\t\t}\n\t}\n\n\tstatic async list(\n\t\tcwd: string,\n\t\tsessionDir?: string | SessionStore,\n\t\tonProgress?: SessionListProgress,\n\t\toptions?: { includeInternal?: boolean; signal?: AbortSignal } | AbortSignal,\n\t): Promise<SessionInfo[]> {\n\t\tconst signal = options && \"aborted\" in options ? options : options?.signal;\n\t\tif (typeof sessionDir !== \"string\") {\n\t\t\tconst store = sessionDir ?? (await resolveSessionStore(cwd));\n\t\t\ttry {\n\t\t\t\treturn await listSessionStore(\n\t\t\t\t\tstore,\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: resolvePath(cwd),\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tincludeInternal:\n\t\t\t\t\t\t\toptions !== undefined && \"includeInternal\" in options && options.includeInternal === true,\n\t\t\t\t\t},\n\t\t\t\t\tonProgress,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tif (sessionDir === undefined) await store.close();\n\t\t\t}\n\t\t}\n\t\treturn listProjectSessions(\n\t\t\tcwd,\n\t\t\tsessionDir,\n\t\t\tonProgress,\n\t\t\toptions !== undefined && \"includeInternal\" in options && options.includeInternal === true,\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tstatic async listAll(onProgress?: SessionListProgress, signal?: AbortSignal): Promise<SessionInfo[]>;\n\tstatic async listAll(\n\t\tsessionDir?: string | SessionStore,\n\t\tonProgress?: SessionListProgress,\n\t\toptions?: { includeInternal?: boolean; signal?: AbortSignal } | AbortSignal,\n\t): Promise<SessionInfo[]>;\n\tstatic async listAll(\n\t\tdirectoryOrProgress?: string | SessionStore | SessionListProgress,\n\t\tprogressOrSignal?: SessionListProgress | AbortSignal,\n\t\toptions?: { includeInternal?: boolean; signal?: AbortSignal } | AbortSignal,\n\t): Promise<SessionInfo[]> {\n\t\tif (typeof directoryOrProgress !== \"string\") {\n\t\t\tconst supplied = typeof directoryOrProgress === \"object\" ? directoryOrProgress : undefined;\n\t\t\tconst store = supplied ?? (await resolveSessionStore(process.cwd()));\n\t\t\ttry {\n\t\t\t\treturn await listSessionStore(\n\t\t\t\t\tstore,\n\t\t\t\t\t{\n\t\t\t\t\t\tincludeInternal:\n\t\t\t\t\t\t\toptions !== undefined && \"includeInternal\" in options && options.includeInternal === true,\n\t\t\t\t\t\tsignal:\n\t\t\t\t\t\t\toptions && \"aborted\" in options\n\t\t\t\t\t\t\t\t? options\n\t\t\t\t\t\t\t\t: (options?.signal ?? (typeof progressOrSignal === \"object\" ? progressOrSignal : undefined)),\n\t\t\t\t\t},\n\t\t\t\t\ttypeof directoryOrProgress === \"function\"\n\t\t\t\t\t\t? directoryOrProgress\n\t\t\t\t\t\t: typeof progressOrSignal === \"function\"\n\t\t\t\t\t\t\t? progressOrSignal\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tif (!supplied) await store.close();\n\t\t\t}\n\t\t}\n\t\tconst { listAllSessions } = await import(\"./session-manager-list.ts\");\n\t\treturn listAllSessions(\n\t\t\tdirectoryOrProgress,\n\t\t\ttypeof progressOrSignal === \"function\" ? progressOrSignal : undefined,\n\t\t\toptions !== undefined && \"includeInternal\" in options && options.includeInternal === true,\n\t\t\toptions && \"aborted\" in options\n\t\t\t\t? options\n\t\t\t\t: (options?.signal ?? (typeof progressOrSignal === \"object\" ? progressOrSignal : undefined)),\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"session-manager-core.js","sourceRoot":"","sources":["../../src/core/session-manager-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { getCurrentSystemMessage } from \"@bastani/pi-ai\";\nimport type { ImageContent, Message, TextContent, Usage } from \"@bastani/pi-ai/compat\";\nimport { getAgentDir } from \"../config.js\";\nimport { createSessionCwdMatcher, normalizePath, pathsEqual, resolvePath } from \"../utils/paths.ts\";\nimport type { VerbatimCompactionDetails } from \"./compaction/compaction-types.js\";\nimport type { BashExecutionMessage, CustomMessage } from \"./messages.ts\";\nimport { createBranchedSessionState } from \"./session-manager-archive.ts\";\nimport { classifiedWorkflowMetadata, validSessionWorkflowMetadata } from \"./session-manager-classification.ts\";\nimport {\n\tcreateBranchSummaryEntry,\n\tcreateCompactionEntry,\n\tcreateContextEditEntry,\n\tcreateCustomEntry,\n\tcreateCustomMessageEntry,\n\tcreateLabelEntry,\n\tcreateMessageEntry,\n\tcreateModelChangeEntry,\n\tcreateSessionFilePath,\n\tcreateSessionHeader,\n\tcreateSessionInfoEntry,\n\tcreateSessionSummaryEntry,\n\tcreateThinkingLevelChangeEntry,\n\tgetEntriesWithoutHeader,\n\tgetLatestSessionName,\n} from \"./session-manager-entries.ts\";\nimport { SessionEntryError } from \"./session-manager-errors.js\";\nimport {\n\tbuildContextEntries,\n\tbuildSessionIndex,\n\tbuildSessionProjection,\n\tbuildSessionTree,\n\tgetBranchPath,\n} from \"./session-manager-history.ts\";\nimport { listProjectSessions } from \"./session-manager-list.ts\";\nimport { getDefaultSessionDirPath } from \"./session-manager-paths.ts\";\nimport type {\n\tBranchSummaryEntry,\n\tContextEditEntry,\n\tFileEntry,\n\tNewSessionOptions,\n\tSessionContext,\n\tSessionEntry,\n\tSessionHeader,\n\tSessionInfo,\n\tSessionListProgress,\n\tSessionNameState,\n\tSessionProjection,\n\tSessionTreeNode,\n\tSessionWorkflowMetadata,\n\tUsageEntry,\n} from \"./session-manager-types.ts\";\nimport {\n\tassertValidSessionId,\n\tcreateSessionId,\n\tgenerateId,\n\tvalidateSessionFileEntries,\n} from \"./session-manager-validation.ts\";\nimport { listSessionStore } from \"./session-store-list.js\";\nimport { type StorageFailureCause, StorageRollbackError } from \"./storage/errors.js\";\nimport {\n\tSessionFormatVersionError,\n\tSessionIdMismatchError,\n\ttype SessionJsonValue,\n\tSessionNotFoundError,\n\tStorageUnavailableError,\n} from \"./storage/session/errors.js\";\nimport { JsonlSessionStore } from \"./storage/session/jsonl-session-store.js\";\nimport { MemorySessionStore } from \"./storage/session/memory-session-store.js\";\nimport type { SessionRecordHeader, SessionSnapshot, SessionStore } from \"./storage/session/types.js\";\n\nasync function resolveSessionStore(cwd: string): Promise<SessionStore> {\n\t// Selection loads settings and tools, which depend on the completed session module.\n\treturn (await import(\"./session-storage.js\")).resolveSessionStore(cwd);\n}\n\n/** An in-memory session tree whose mutations await the backing store. */\nexport class SessionManager {\n\tprivate sessionId = \"\";\n\tprivate sessionFile: string | undefined;\n\tprivate sessionDir: string;\n\tprivate cwd: string;\n\tprivate store: SessionStore;\n\tprivate lastSeq = 0;\n\tprivate mutation: Promise<void> = Promise.resolve();\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(store: SessionStore, cwd: string, sessionDir: string, options?: NewSessionOptions) {\n\t\tthis.store = store;\n\t\tthis.cwd = resolvePath(cwd);\n\t\tthis.sessionDir = normalizePath(sessionDir);\n\t\tthis.start(options);\n\t}\n\n\tprivate runMutation<T>(operation: () => Promise<T>): Promise<T> {\n\t\tconst result = this.mutation.then(operation);\n\t\tthis.mutation = result.then(\n\t\t\t() => {},\n\t\t\t() => {},\n\t\t);\n\t\treturn result;\n\t}\n\n\tprivate recordHeader(header = this.getHeader()!): SessionRecordHeader {\n\t\tconst { type: _type, ...record } = header;\n\t\treturn record;\n\t}\n\n\tprivate restore(snapshot: SessionSnapshot, location?: string): void {\n\t\tconst header = snapshot.header;\n\t\tthis.fileEntries = [{ type: \"session\", ...header }, ...snapshot.entries];\n\t\tthis.sessionId = header.id;\n\t\tthis.lastSeq = snapshot.lastSeq;\n\t\tthis.sessionFile =\n\t\t\tlocation ?? (this.store instanceof JsonlSessionStore ? this.store.locationFor(header) : undefined);\n\t\tthis._buildIndex();\n\t}\n\n\tprivate start(options?: NewSessionOptions): string | undefined {\n\t\tif (options?.id !== undefined) assertValidSessionId(options.id);\n\t\tthis.sessionId = options?.id ?? createSessionId();\n\t\tthis.fileEntries = [\n\t\t\tcreateSessionHeader(\n\t\t\t\tthis.sessionId,\n\t\t\t\tthis.cwd,\n\t\t\t\tnew Date().toISOString(),\n\t\t\t\toptions?.parentSession,\n\t\t\t\toptions?.internal,\n\t\t\t\toptions?.workflow,\n\t\t\t),\n\t\t];\n\t\tthis.lastSeq = 0;\n\t\tthis._buildIndex();\n\t\tthis.sessionFile =\n\t\t\tthis.store instanceof JsonlSessionStore\n\t\t\t\t? this.sessionDir\n\t\t\t\t\t? createSessionFilePath(this.sessionDir, this.getHeader()!.createdAt, this.sessionId)\n\t\t\t\t\t: this.store.locationFor(this.recordHeader())\n\t\t\t\t: undefined;\n\t\treturn this.sessionFile;\n\t}\n\n\tsetSessionFile(sessionFile: string): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst opened = await SessionManager.open(sessionFile, this.sessionDir, this.cwd);\n\t\t\tthis.store = opened.store;\n\t\t\tthis.restore(\n\t\t\t\t{ header: opened.recordHeader(), entries: opened.getEntries(), lastSeq: opened.lastSeq },\n\t\t\t\topened.sessionFile,\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate async initialize(): Promise<void> {\n\t\tthis.lastSeq = (\n\t\t\tawait (this.store instanceof JsonlSessionStore\n\t\t\t\t? this.store.create(this.recordHeader(), this.getEntries(), this.sessionFile)\n\t\t\t\t: this.store.create(this.recordHeader(), this.getEntries()))\n\t\t).lastSeq;\n\t}\n\n\tprivate async storeForNewSession(): Promise<SessionStore> {\n\t\tif (\n\t\t\tthis.store instanceof JsonlSessionStore &&\n\t\t\tthis.sessionDir &&\n\t\t\tthis.store.descriptor.location !== resolvePath(this.sessionDir)\n\t\t) {\n\t\t\treturn JsonlSessionStore.open(this.sessionDir, { exactDirectory: true, scanExisting: false });\n\t\t}\n\t\treturn this.store;\n\t}\n\n\tnewSession(options?: NewSessionOptions): Promise<string | undefined> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (options?.id !== undefined) assertValidSessionId(options.id);\n\t\t\tconst header = createSessionHeader(\n\t\t\t\toptions?.id ?? createSessionId(),\n\t\t\t\tthis.cwd,\n\t\t\t\tnew Date().toISOString(),\n\t\t\t\toptions?.parentSession,\n\t\t\t\toptions?.internal,\n\t\t\t\toptions?.workflow,\n\t\t\t);\n\t\t\tconst record = this.recordHeader(header);\n\t\t\tconst store = await this.storeForNewSession();\n\t\t\tconst location =\n\t\t\t\tstore instanceof JsonlSessionStore\n\t\t\t\t\t? this.sessionDir\n\t\t\t\t\t\t? createSessionFilePath(this.sessionDir, record.createdAt, record.id)\n\t\t\t\t\t\t: store.locationFor(record)\n\t\t\t\t\t: undefined;\n\t\t\tconst result = await (store instanceof JsonlSessionStore\n\t\t\t\t? store.create(record, [], location)\n\t\t\t\t: store.create(record, []));\n\t\t\tthis.store = store;\n\t\t\tthis.byId.clear();\n\t\t\tthis.labelsById.clear();\n\t\t\tthis.labelTimestampsById.clear();\n\t\t\tthis.restore({ header: record, entries: [], lastSeq: result.lastSeq }, location);\n\t\t\treturn this.sessionFile;\n\t\t});\n\t}\n\n\tmarkSessionInternal(workflow?: SessionWorkflowMetadata): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst previous = this.getHeader()!;\n\t\t\tif (classifiedWorkflowMetadata(previous)) return;\n\t\t\tconst validWorkflow = validSessionWorkflowMetadata(workflow);\n\t\t\tif (!validWorkflow) return;\n\t\t\tconst header: SessionHeader = { ...previous, internal: true, workflow: validWorkflow };\n\t\t\tconst result = await this.store.replace(this.sessionId, this.recordHeader(header), this.getEntries(), {\n\t\t\t\texpectSeq: this.lastSeq,\n\t\t\t});\n\t\t\tthis.lastSeq = result.lastSeq;\n\t\t\tthis.fileEntries[0] = header;\n\t\t});\n\t}\n\n\tprivate _buildIndex(): void {\n\t\tvalidateSessionFileEntries(this.fileEntries, this.sessionFile ?? \"in-memory session\");\n\t\tconst index = buildSessionIndex(this.fileEntries);\n\t\tthis.byId = index.byId;\n\t\tthis.labelsById = index.labelsById;\n\t\tthis.labelTimestampsById = index.labelTimestampsById;\n\t\tthis.leafId = index.leafId;\n\t}\n\n\tisPersisted(): boolean {\n\t\treturn !(this.store instanceof MemorySessionStore);\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\tusesDefaultSessionDir(): boolean {\n\t\treturn pathsEqual(this.sessionDir, getDefaultSessionDirPath(this.cwd));\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\tgetSessionStore(): SessionStore {\n\t\treturn this.store;\n\t}\n\n\tasync deleteSession(sessionId: string): Promise<void> {\n\t\tif (sessionId === this.sessionId) {\n\t\t\tthrow new Error(`Cannot delete the session that is currently open: ${sessionId}`);\n\t\t}\n\t\ttry {\n\t\t\tawait this.store.delete(sessionId);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof SessionNotFoundError)) throw error;\n\t\t}\n\t}\n\n\t/** @internal Finalize provisional startup storage after project trust resolves. */\n\trebindStore(store: SessionStore, removeProvisionalRecord: boolean): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (store === this.store) return;\n\t\t\tconst header = this.recordHeader();\n\t\t\tconst entries = this.getEntries();\n\t\t\tconst result = await store.create(header, entries);\n\t\t\tif (removeProvisionalRecord) await this.store.delete(this.sessionId);\n\t\t\tthis.store = store;\n\t\t\tthis.sessionDir = store instanceof JsonlSessionStore ? store.descriptor.location : \"\";\n\t\t\tthis.restore({ header, entries, lastSeq: result.lastSeq });\n\t\t});\n\t}\n\n\tasync openSessionById(sessionId: string, cwdOverride?: string, sessionDirectory?: string): Promise<SessionManager> {\n\t\tlet store =\n\t\t\tsessionDirectory === undefined\n\t\t\t\t? this.store\n\t\t\t\t: await JsonlSessionStore.open(sessionDirectory, { exactDirectory: true, scanExisting: false });\n\t\tlet snapshot: SessionSnapshot;\n\t\ttry {\n\t\t\tsnapshot = await store.load(sessionId);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!(error instanceof SessionNotFoundError) ||\n\t\t\t\tsessionDirectory !== undefined ||\n\t\t\t\t!this.usesDefaultSessionDir()\n\t\t\t)\n\t\t\t\tthrow error;\n\t\t\tstore = await JsonlSessionStore.open(join(getAgentDir(), \"sessions\"), { scanExisting: false });\n\t\t\tsnapshot = await store.load(sessionId);\n\t\t}\n\t\tconst location = store instanceof JsonlSessionStore ? await store.findFile(sessionId) : undefined;\n\t\tif (location !== undefined) {\n\t\t\tstore = await JsonlSessionStore.open(dirname(location), { exactDirectory: true, scanExisting: false });\n\t\t\tsnapshot = await store.load(sessionId);\n\t\t}\n\t\tif (snapshot.header.id !== sessionId) throw new SessionIdMismatchError(sessionId, snapshot.header.id);\n\t\tconst manager = new SessionManager(store, cwdOverride ?? snapshot.header.cwd, this.sessionDir);\n\t\tmanager.restore(snapshot, location);\n\t\tif (location !== undefined) manager.sessionDir = dirname(location);\n\t\treturn manager;\n\t}\n\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<SessionManager> {\n\t\tconst source = await JsonlSessionStore.open(dirname(resolvePath(inputPath)), {\n\t\t\texactDirectory: true,\n\t\t\tscanExisting: false,\n\t\t});\n\t\ttry {\n\t\t\tconst snapshot = await source.loadFile(inputPath);\n\t\t\tconst manager = new SessionManager(this.store, cwdOverride ?? snapshot.header.cwd, this.sessionDir);\n\t\t\tmanager.restore(snapshot);\n\t\t\tawait manager.initialize();\n\t\t\treturn manager;\n\t\t} finally {\n\t\t\tawait source.close();\n\t\t}\n\t}\n\n\tprivate async _appendEntry(entry: SessionEntry): Promise<void> {\n\t\tconst result = await this.store.append(this.sessionId, [entry], { expectSeq: this.lastSeq });\n\t\tthis.lastSeq = result.lastSeq;\n\t\tthis.fileEntries.push(entry);\n\t\tthis.byId.set(entry.id, entry);\n\t\tthis.leafId = entry.id;\n\t}\n\n\t/** Append a message as child of current leaf, then advance leaf. Returns entry id. */\n\tappendMessage(message: Message | CustomMessage | BashExecutionMessage): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createMessageEntry(message, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Append a thinking level change as child of current leaf, then advance leaf. Returns entry id. */\n\tappendThinkingLevelChange(thinkingLevel: string): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createThinkingLevelChangeEntry(thinkingLevel, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Record auxiliary model usage without adding it to the LLM context. */\n\tappendUsage(kind: string, provider: string, model: string, usage: Usage, note?: string): Promise<UsageEntry> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry: UsageEntry = {\n\t\t\t\ttype: \"usage\",\n\t\t\t\tid: generateId(this.byId),\n\t\t\t\tparentId: this.leafId,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tkind,\n\t\t\t\tprovider,\n\t\t\t\tmodel,\n\t\t\t\tusage,\n\t\t\t\t...(note === undefined ? {} : { note }),\n\t\t\t};\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry;\n\t\t});\n\t}\n\n\t/** Append a model change as child of current leaf, then advance leaf. Returns entry id. */\n\tappendModelChange(provider: string, modelId: string): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createModelChangeEntry(provider, modelId, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\tappendCompaction(\n\t\tcompactedText: string,\n\t\tfirstKeptEntryId: string | null,\n\t\ttokensBefore: number,\n\t\tdetails: VerbatimCompactionDetails,\n\t\tusage?: Usage,\n\t): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (firstKeptEntryId !== null && !this.byId.has(firstKeptEntryId))\n\t\t\t\tthrow new SessionEntryError(firstKeptEntryId, \"missing\");\n\t\t\tconst entry = createCompactionEntry(\n\t\t\t\tcompactedText,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\tdetails,\n\t\t\t\tusage,\n\t\t\t\tthis.byId,\n\t\t\t\tthis.leafId,\n\t\t\t);\n\t\t\tconst systemMessage = getCurrentSystemMessage(this.buildSessionProjection().messages);\n\t\t\tif (systemMessage) entry.systemMessage = { ...systemMessage, timestamp: new Date(entry.timestamp).getTime() };\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Save a JSONL backup; database-backed sessions have no file snapshot. */\n\twriteBackupSnapshot(label = \"compact\"): Promise<string | undefined> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (!(this.store instanceof JsonlSessionStore) || !this.sessionFile) return undefined;\n\t\t\tconst path = `${this.sessionFile}.${new Date().toISOString().replace(/[:.]/g, \"-\")}.${label.replace(/[^a-z0-9_-]/gi, \"-\") || \"backup\"}.bak`;\n\t\t\ttry {\n\t\t\t\tawait writeFile(\n\t\t\t\t\tpath,\n\t\t\t\t\t`${[JSON.stringify({ type: \"session\", ...this.recordHeader() }), ...this.getEntries().map((entry) => JSON.stringify(entry))].join(\"\\n\")}\\n`,\n\t\t\t\t);\n\t\t\t} catch (cause) {\n\t\t\t\tthrow new StorageUnavailableError(this.store.descriptor, cause as Error);\n\t\t\t}\n\t\t\treturn path;\n\t\t});\n\t}\n\n\t/** Append a branch-local edit to an earlier model-visible entry. */\n\tappendContextEdit(targetId: string, replacement: ContextEditEntry[\"replacement\"]): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (\n\t\t\t\treplacement !== null &&\n\t\t\t\t(typeof replacement !== \"object\" ||\n\t\t\t\t\t!(\"content\" in replacement) ||\n\t\t\t\t\t(typeof replacement.content !== \"string\" && !Array.isArray(replacement.content)))\n\t\t\t) {\n\t\t\t\tthrow new SessionEntryError(targetId, \"invalid-replacement\");\n\t\t\t}\n\t\t\tconst target = this.byId.get(targetId);\n\t\t\tif (!target) throw new SessionEntryError(targetId, \"missing\");\n\t\t\tif (!this.getBranch().some((entry) => entry.id === targetId)) {\n\t\t\t\tthrow new SessionEntryError(targetId, \"inactive\");\n\t\t\t}\n\t\t\tconst editable =\n\t\t\t\ttarget.type === \"custom_message\" ||\n\t\t\t\t(target.type === \"message\" &&\n\t\t\t\t\t(target.message.role === \"user\" ||\n\t\t\t\t\t\ttarget.message.role === \"assistant\" ||\n\t\t\t\t\t\ttarget.message.role === \"toolResult\"));\n\t\t\tif (!editable) throw new SessionEntryError(targetId, \"not-editable\");\n\t\t\tconst targetRole = target.type === \"message\" ? target.message.role : \"custom\";\n\t\t\tconst normalizedReplacement =\n\t\t\t\treplacement !== null &&\n\t\t\t\t(targetRole === \"assistant\" || targetRole === \"toolResult\") &&\n\t\t\t\ttypeof replacement.content === \"string\"\n\t\t\t\t\t? { content: [{ type: \"text\" as const, text: replacement.content }] }\n\t\t\t\t\t: replacement;\n\t\t\tconst entry = createContextEditEntry(targetId, normalizedReplacement, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Append a custom entry (for extensions) as child of current leaf, then advance leaf. Returns entry id. */\n\tappendCustomEntry<T = SessionJsonValue>(customType: string, data?: T): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createCustomEntry(customType, data, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Append a session info entry (e.g., display name). Returns entry id. */\n\tappendSessionInfo(name: string): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createSessionInfoEntry(name, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Append a generated resume summary anchored to the message it describes. Returns entry id. */\n\tappendSessionSummary(summary: string, summarizedThroughId: string, usage?: Usage): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (!this.byId.has(summarizedThroughId)) throw new SessionEntryError(summarizedThroughId, \"missing\");\n\t\t\tconst entry = createSessionSummaryEntry(summary, summarizedThroughId, usage, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Get the current session name from the latest session_info entry, if any. */\n\tgetSessionName(): string | undefined {\n\t\treturn this.getSessionNameState().name;\n\t}\n\n\t/**\n\t * Get the session name state. `hasName` is true for a session that was named and\n\t * then cleared even though `name` is undefined; a never-named session reports\n\t * `hasName: false`. Read-side only: the JSONL already records the distinction.\n\t */\n\tgetSessionNameState(): SessionNameState {\n\t\treturn getLatestSessionName(this.fileEntries);\n\t}\n\n\t/** Append a custom message entry (for extensions) that participates in LLM context unless excluded. */\n\tappendCustomMessageEntry<T = SessionJsonValue>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t\texcludeFromContext?: boolean,\n\t\tprotectedReconciliation?: { delivery: \"steer\" | \"followUp\" },\n\t\tstageAdmissionKey?: string,\n\t): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst entry = createCustomMessageEntry(\n\t\t\t\tcustomType,\n\t\t\t\tcontent,\n\t\t\t\tdisplay,\n\t\t\t\tdetails,\n\t\t\t\texcludeFromContext,\n\t\t\t\tprotectedReconciliation,\n\t\t\t\tthis.byId,\n\t\t\t\tthis.leafId,\n\t\t\t\tstageAdmissionKey,\n\t\t\t);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\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\t/** Get all direct children of an entry. */\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\t/** Get the label for an entry, if any. */\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labelsById.get(id);\n\t}\n\n\t/** Set or clear a label on an entry. */\n\tappendLabelChange(targetId: string, label: string | undefined): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (!this.byId.has(targetId)) {\n\t\t\t\tthrow new SessionEntryError(targetId, \"missing\");\n\t\t\t}\n\t\t\tconst entry = createLabelEntry(targetId, label, this.byId, this.leafId);\n\t\t\tawait this._appendEntry(entry);\n\t\t\tif (label) {\n\t\t\t\tthis.labelsById.set(targetId, label);\n\t\t\t\tthis.labelTimestampsById.set(targetId, entry.timestamp);\n\t\t\t} else {\n\t\t\t\tthis.labelsById.delete(targetId);\n\t\t\t\tthis.labelTimestampsById.delete(targetId);\n\t\t\t}\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\t/** Walk from entry to root, returning all entries in path order. */\n\tgetBranch(fromId?: string): SessionEntry[] {\n\t\treturn getBranchPath(fromId ?? this.leafId, this.byId);\n\t}\n\n\t/** Return the active branch entries after applying the latest compaction boundary. */\n\tbuildContextEntries(): SessionEntry[] {\n\t\treturn buildContextEntries(this.getEntries(), this.leafId, this.byId);\n\t}\n\n\t/** Build provenance-preserving, compaction-aware model context from the current leaf. */\n\tbuildSessionProjection(): SessionProjection {\n\t\treturn buildSessionProjection(this.getEntries(), this.leafId, this.byId);\n\t}\n\n\t/** Build the session context (what gets sent to the LLM). */\n\tbuildSessionContext(): SessionContext {\n\t\tconst { messages, thinkingLevel, model } = this.buildSessionProjection();\n\t\treturn { messages, thinkingLevel, model };\n\t}\n\n\t/** Get session header. */\n\tgetHeader(): SessionHeader | null {\n\t\tconst header = this.fileEntries.find((entry) => entry.type === \"session\");\n\t\treturn header ? (header as SessionHeader) : null;\n\t}\n\n\t/** Number of entries without copying the session history. */\n\tgetEntryCount(): number {\n\t\treturn this.byId.size;\n\t}\n\n\t/** Get all session entries (excludes header). Returns a shallow copy. */\n\tgetEntries(): SessionEntry[] {\n\t\treturn getEntriesWithoutHeader(this.fileEntries);\n\t}\n\n\t/** Get the session as a tree structure. Returns a shallow defensive copy of all entries. */\n\tgetTree(): SessionTreeNode[] {\n\t\treturn buildSessionTree(this.getEntries(), this.labelsById, this.labelTimestampsById);\n\t}\n\n\t/** Start a new branch from an earlier entry. */\n\tbranch(branchFromId: string): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (!this.byId.has(branchFromId)) {\n\t\t\t\tthrow new SessionEntryError(branchFromId, \"missing\");\n\t\t\t}\n\t\t\tthis.leafId = branchFromId;\n\t\t});\n\t}\n\n\t/** Reset the leaf pointer to null (before any entries). */\n\tresetLeaf(): Promise<void> {\n\t\treturn this.runMutation(async () => {\n\t\t\tthis.leafId = null;\n\t\t});\n\t}\n\n\t/** Start a new branch with a summary of the abandoned path. */\n\tbranchWithSummary<T = SessionJsonValue>(\n\t\tbranchFromId: string | null,\n\t\tsummary: string,\n\t\tdetails?: T,\n\t\tfromHook?: boolean,\n\t\tusage?: import(\"@bastani/pi-ai/compat\").Usage,\n\t\tfromId?: string,\n\t): Promise<string> {\n\t\treturn this.runMutation(async () => {\n\t\t\tif (branchFromId !== null && !this.byId.has(branchFromId)) {\n\t\t\t\tthrow new SessionEntryError(branchFromId, \"missing\");\n\t\t\t}\n\t\t\tconst entry: BranchSummaryEntry = createBranchSummaryEntry(\n\t\t\t\tbranchFromId,\n\t\t\t\tfromId ?? this.leafId ?? \"root\",\n\t\t\t\tsummary,\n\t\t\t\tdetails,\n\t\t\t\tusage,\n\t\t\t\tfromHook,\n\t\t\t\tthis.byId,\n\t\t\t);\n\t\t\tawait this._appendEntry(entry);\n\t\t\treturn entry.id;\n\t\t});\n\t}\n\n\tcreateBranchedSession(leafId: string): Promise<string | undefined> {\n\t\treturn this.runMutation(async () => {\n\t\t\tconst result = createBranchedSessionState({\n\t\t\t\tleafId,\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tparentSessionId: this.sessionId,\n\t\t\t\tworkflow: classifiedWorkflowMetadata(this.getHeader()),\n\t\t\t\tpath: this.getBranch(leafId),\n\t\t\t\tlabelsById: this.labelsById,\n\t\t\t\tlabelTimestampsById: this.labelTimestampsById,\n\t\t\t});\n\t\t\tconst header = result.fileEntries[0] as SessionHeader;\n\t\t\tconst entries = getEntriesWithoutHeader(result.fileEntries);\n\t\t\tconst record = this.recordHeader(header);\n\t\t\tconst store = await this.storeForNewSession();\n\t\t\tconst location =\n\t\t\t\tstore instanceof JsonlSessionStore\n\t\t\t\t\t? this.sessionDir\n\t\t\t\t\t\t? createSessionFilePath(this.sessionDir, record.createdAt, record.id)\n\t\t\t\t\t\t: store.locationFor(record)\n\t\t\t\t\t: undefined;\n\t\t\tconst lastSeq = (\n\t\t\t\tawait (store instanceof JsonlSessionStore\n\t\t\t\t\t? store.create(record, entries, location)\n\t\t\t\t\t: store.create(record, entries))\n\t\t\t).lastSeq;\n\t\t\tthis.store = store;\n\t\t\tthis.fileEntries = result.fileEntries;\n\t\t\tthis.sessionId = header.id;\n\t\t\tthis.lastSeq = lastSeq;\n\t\t\tthis.sessionFile = location;\n\t\t\tthis._buildIndex();\n\t\t\treturn this.sessionFile;\n\t\t});\n\t}\n\n\tasync forkTo(cwd: string, sessionDir?: string | SessionStore, options?: NewSessionOptions): Promise<SessionManager> {\n\t\tconst store =\n\t\t\ttypeof sessionDir === \"string\"\n\t\t\t\t? await JsonlSessionStore.open(sessionDir, { exactDirectory: true, scanExisting: false })\n\t\t\t\t: (sessionDir ?? (await resolveSessionStore(cwd)));\n\t\tconst directory = store instanceof JsonlSessionStore ? store.descriptor.location : \"\";\n\t\treturn SessionManager.constructWithStore(store, store !== sessionDir, async () => {\n\t\t\tconst manager = new SessionManager(store, cwd, directory, { ...options, parentSession: this.sessionId });\n\t\t\tmanager.fileEntries.push(...this.getEntries());\n\t\t\tawait manager.initialize();\n\t\t\tmanager._buildIndex();\n\t\t\treturn manager;\n\t\t});\n\t}\n\n\tstatic async importFromJsonl(\n\t\tinputPath: string,\n\t\tcwd: string,\n\t\tsessionDir?: string | SessionStore,\n\t): Promise<SessionManager> {\n\t\tconst store =\n\t\t\ttypeof sessionDir === \"string\"\n\t\t\t\t? await JsonlSessionStore.open(sessionDir, { exactDirectory: true, scanExisting: false })\n\t\t\t\t: (sessionDir ?? (await resolveSessionStore(cwd)));\n\t\treturn SessionManager.constructWithStore(store, store !== sessionDir, () =>\n\t\t\tnew SessionManager(\n\t\t\t\tstore,\n\t\t\t\tcwd,\n\t\t\t\tstore instanceof JsonlSessionStore ? store.descriptor.location : \"\",\n\t\t\t).importFromJsonl(inputPath),\n\t\t);\n\t}\n\tprivate static async constructWithStore(\n\t\tstore: SessionStore,\n\t\towned: boolean,\n\t\tconstruct: () => Promise<SessionManager>,\n\t): Promise<SessionManager> {\n\t\ttry {\n\t\t\treturn await construct();\n\t\t} catch (error) {\n\t\t\tif (owned) {\n\t\t\t\ttry {\n\t\t\t\t\tawait store.close();\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tthrow new StorageRollbackError(error as StorageFailureCause, cause as StorageFailureCause);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tstatic async create(cwd: string, sessionDir?: string, options?: NewSessionOptions): Promise<SessionManager>;\n\tstatic async create(store: SessionStore, cwd: string, options?: NewSessionOptions): Promise<SessionManager>;\n\tstatic async create(\n\t\tcwdOrStore: string | SessionStore,\n\t\tdirectoryOrCwd?: string,\n\t\toptions?: NewSessionOptions,\n\t): Promise<SessionManager> {\n\t\tconst cwd = typeof cwdOrStore === \"string\" ? cwdOrStore : (directoryOrCwd ?? process.cwd());\n\t\tif (typeof cwdOrStore === \"string\" && directoryOrCwd === undefined) {\n\t\t\tconst store = await resolveSessionStore(cwd);\n\t\t\treturn SessionManager.constructWithStore(store, true, () => SessionManager.create(store, cwd, options));\n\t\t}\n\t\tconst directory =\n\t\t\ttypeof cwdOrStore === \"string\"\n\t\t\t\t? directoryOrCwd\n\t\t\t\t\t? normalizePath(directoryOrCwd)\n\t\t\t\t\t: getDefaultSessionDirPath(cwd)\n\t\t\t\t: cwdOrStore instanceof JsonlSessionStore\n\t\t\t\t\t? cwdOrStore.descriptor.location\n\t\t\t\t\t: \"\";\n\t\tconst store =\n\t\t\ttypeof cwdOrStore === \"string\"\n\t\t\t\t? await JsonlSessionStore.open(directory, { exactDirectory: true, scanExisting: false })\n\t\t\t\t: cwdOrStore;\n\t\treturn SessionManager.constructWithStore(store, store !== cwdOrStore, async () => {\n\t\t\tconst manager = new SessionManager(store, cwd, directory, options);\n\t\t\tif (typeof cwdOrStore !== \"string\" && store instanceof JsonlSessionStore) {\n\t\t\t\tmanager.sessionFile = store.locationFor(manager.recordHeader());\n\t\t\t\tmanager.sessionDir = dirname(manager.sessionFile);\n\t\t\t}\n\t\t\tawait manager.initialize();\n\t\t\treturn manager;\n\t\t});\n\t}\n\n\tstatic async open(path: string, sessionDir?: string, cwdOverride?: string): Promise<SessionManager>;\n\tstatic async open(store: SessionStore, sessionId: string, cwdOverride?: string): Promise<SessionManager>;\n\tstatic async open(\n\t\tpathOrStore: string | SessionStore,\n\t\tdirectoryOrId?: string,\n\t\tcwdOverride?: string,\n\t): Promise<SessionManager> {\n\t\tif (typeof pathOrStore !== \"string\") {\n\t\t\tconst snapshot = await pathOrStore.load(directoryOrId!);\n\t\t\tif (snapshot.header.id !== directoryOrId) throw new SessionIdMismatchError(directoryOrId!, snapshot.header.id);\n\t\t\tconst manager = new SessionManager(\n\t\t\t\tpathOrStore,\n\t\t\t\tcwdOverride ?? snapshot.header.cwd,\n\t\t\t\tpathOrStore instanceof JsonlSessionStore ? pathOrStore.descriptor.location : \"\",\n\t\t\t);\n\t\t\tmanager.restore(\n\t\t\t\tsnapshot,\n\t\t\t\tpathOrStore instanceof JsonlSessionStore ? await pathOrStore.findFile(directoryOrId!) : undefined,\n\t\t\t);\n\t\t\tif (manager.sessionFile) manager.sessionDir = dirname(manager.sessionFile);\n\t\t\treturn manager;\n\t\t}\n\t\tconst path = resolvePath(pathOrStore);\n\t\tconst directory = directoryOrId ?? dirname(path);\n\t\tconst store = await JsonlSessionStore.open(dirname(path), { exactDirectory: true, scanExisting: false });\n\t\tlet snapshot: SessionSnapshot;\n\t\ttry {\n\t\t\tsnapshot = await store.loadFile(path);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof StorageUnavailableError) || (error.cause as NodeJS.ErrnoException).code !== \"ENOENT\")\n\t\t\t\tthrow error;\n\t\t\tconst manager = new SessionManager(store, cwdOverride ?? process.cwd(), directory);\n\t\t\tmanager.lastSeq = (await store.create(manager.recordHeader(), [], path)).lastSeq;\n\t\t\tmanager.sessionFile = path;\n\t\t\treturn manager;\n\t\t}\n\t\tconst manager = new SessionManager(store, cwdOverride ?? snapshot.header.cwd, directory);\n\t\tmanager.restore(snapshot, path);\n\t\treturn manager;\n\t}\n\n\tstatic async continueRecent(\n\t\tcwd: string,\n\t\tsessionDir?: string,\n\t\toptions?: { includeInternal?: boolean },\n\t): Promise<SessionManager>;\n\tstatic async continueRecent(\n\t\tstore: SessionStore,\n\t\tcwd: string,\n\t\toptions?: { includeInternal?: boolean },\n\t): Promise<SessionManager>;\n\tstatic async continueRecent(\n\t\tcwdOrStore: string | SessionStore,\n\t\tdirectoryOrCwd?: string,\n\t\toptions?: { includeInternal?: boolean },\n\t): Promise<SessionManager> {\n\t\tconst cwd = typeof cwdOrStore === \"string\" ? cwdOrStore : directoryOrCwd!;\n\t\tif (typeof cwdOrStore === \"string\" && directoryOrCwd === undefined) {\n\t\t\tconst store = await resolveSessionStore(cwd);\n\t\t\treturn SessionManager.constructWithStore(store, true, () =>\n\t\t\t\tSessionManager.continueRecent(store, cwd, options),\n\t\t\t);\n\t\t}\n\t\tconst directory = typeof cwdOrStore === \"string\" ? (directoryOrCwd ?? getDefaultSessionDirPath(cwd)) : \"\";\n\t\tconst store =\n\t\t\ttypeof cwdOrStore === \"string\"\n\t\t\t\t? await JsonlSessionStore.open(directory, { exactDirectory: true, scanExisting: false })\n\t\t\t\t: cwdOrStore;\n\t\treturn SessionManager.constructWithStore(store, store !== cwdOrStore, async () => {\n\t\t\tconst recent = await store.findMostRecent({\n\t\t\t\tcwd: resolvePath(cwd),\n\t\t\t\tincludeInternal: options?.includeInternal,\n\t\t\t});\n\t\t\tconst manager = new SessionManager(store, cwd, directory);\n\t\t\tif (recent) manager.restore(await store.load(recent.id), recent.location);\n\t\t\telse await manager.initialize();\n\t\t\treturn manager;\n\t\t});\n\t}\n\n\tstatic inMemory(cwd: string = process.cwd(), options?: NewSessionOptions, entries?: FileEntry[]): SessionManager {\n\t\tconst manager = new SessionManager(new MemorySessionStore(createSessionCwdMatcher), cwd, \"\", options);\n\t\tif (entries?.length) {\n\t\t\tmanager.fileEntries = entries[0].type === \"session\" ? entries : [...manager.fileEntries, ...entries];\n\t\t\tmanager.sessionId = manager.getHeader()!.id;\n\t\t\tmanager._buildIndex();\n\t\t}\n\t\tmanager.mutation = manager.initialize();\n\t\treturn manager;\n\t}\n\n\tstatic async forkFrom(\n\t\tsourcePath: string,\n\t\ttargetCwd: string,\n\t\tsessionDir?: string,\n\t\toptions?: NewSessionOptions,\n\t): Promise<SessionManager> {\n\t\tconst sourceStore = await JsonlSessionStore.open(dirname(resolvePath(sourcePath)), {\n\t\t\texactDirectory: true,\n\t\t\tscanExisting: false,\n\t\t});\n\t\tlet source: SessionSnapshot;\n\t\ttry {\n\t\t\tsource = await sourceStore.loadFile(resolvePath(sourcePath));\n\t\t} finally {\n\t\t\tawait sourceStore.close();\n\t\t}\n\t\tconst store =\n\t\t\tsessionDir === undefined\n\t\t\t\t? await resolveSessionStore(targetCwd)\n\t\t\t\t: await JsonlSessionStore.open(sessionDir, { exactDirectory: true, scanExisting: false });\n\t\treturn SessionManager.constructWithStore(store, true, async () => {\n\t\t\tconst manager = new SessionManager(store, targetCwd, sessionDir ?? \"\", {\n\t\t\t\t...options,\n\t\t\t\tparentSession: source.header.id,\n\t\t\t});\n\t\t\tmanager.fileEntries.push(...source.entries);\n\t\t\tawait manager.initialize();\n\t\t\tmanager._buildIndex();\n\t\t\treturn manager;\n\t\t});\n\t}\n\n\tstatic async findById(cwd: string, id: string, sessionDir?: string): Promise<string | undefined> {\n\t\tconst store =\n\t\t\tsessionDir === undefined\n\t\t\t\t? await resolveSessionStore(cwd)\n\t\t\t\t: await JsonlSessionStore.open(sessionDir, { exactDirectory: true, scanExisting: false });\n\t\ttry {\n\t\t\tconst header = await store.readHeader(id);\n\t\t\tif (\n\t\t\t\t!header ||\n\t\t\t\tclassifiedWorkflowMetadata(header) ||\n\t\t\t\t!createSessionCwdMatcher(resolvePath(cwd))(resolvePath(header.cwd))\n\t\t\t)\n\t\t\t\treturn undefined;\n\t\t\treturn store instanceof JsonlSessionStore ? await store.findFile(id) : id;\n\t\t} catch (error) {\n\t\t\tif (error instanceof SessionFormatVersionError) return undefined;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tawait store.close();\n\t\t}\n\t}\n\n\tstatic async list(\n\t\tcwd: string,\n\t\tsessionDir?: string | SessionStore,\n\t\tonProgress?: SessionListProgress,\n\t\toptions?: { includeInternal?: boolean; signal?: AbortSignal } | AbortSignal,\n\t): Promise<SessionInfo[]> {\n\t\tconst signal = options && \"aborted\" in options ? options : options?.signal;\n\t\tif (typeof sessionDir !== \"string\") {\n\t\t\tconst store = sessionDir ?? (await resolveSessionStore(cwd));\n\t\t\ttry {\n\t\t\t\treturn await listSessionStore(\n\t\t\t\t\tstore,\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: resolvePath(cwd),\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tincludeInternal:\n\t\t\t\t\t\t\toptions !== undefined && \"includeInternal\" in options && options.includeInternal === true,\n\t\t\t\t\t},\n\t\t\t\t\tonProgress,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tif (sessionDir === undefined) await store.close();\n\t\t\t}\n\t\t}\n\t\treturn listProjectSessions(\n\t\t\tcwd,\n\t\t\tsessionDir,\n\t\t\tonProgress,\n\t\t\toptions !== undefined && \"includeInternal\" in options && options.includeInternal === true,\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tstatic async listAll(onProgress?: SessionListProgress, signal?: AbortSignal): Promise<SessionInfo[]>;\n\tstatic async listAll(\n\t\tsessionDir?: string | SessionStore,\n\t\tonProgress?: SessionListProgress,\n\t\toptions?: { includeInternal?: boolean; signal?: AbortSignal } | AbortSignal,\n\t): Promise<SessionInfo[]>;\n\tstatic async listAll(\n\t\tdirectoryOrProgress?: string | SessionStore | SessionListProgress,\n\t\tprogressOrSignal?: SessionListProgress | AbortSignal,\n\t\toptions?: { includeInternal?: boolean; signal?: AbortSignal } | AbortSignal,\n\t): Promise<SessionInfo[]> {\n\t\tif (typeof directoryOrProgress !== \"string\") {\n\t\t\tconst supplied = typeof directoryOrProgress === \"object\" ? directoryOrProgress : undefined;\n\t\t\tconst store = supplied ?? (await resolveSessionStore(process.cwd()));\n\t\t\ttry {\n\t\t\t\treturn await listSessionStore(\n\t\t\t\t\tstore,\n\t\t\t\t\t{\n\t\t\t\t\t\tincludeInternal:\n\t\t\t\t\t\t\toptions !== undefined && \"includeInternal\" in options && options.includeInternal === true,\n\t\t\t\t\t\tsignal:\n\t\t\t\t\t\t\toptions && \"aborted\" in options\n\t\t\t\t\t\t\t\t? options\n\t\t\t\t\t\t\t\t: (options?.signal ?? (typeof progressOrSignal === \"object\" ? progressOrSignal : undefined)),\n\t\t\t\t\t},\n\t\t\t\t\ttypeof directoryOrProgress === \"function\"\n\t\t\t\t\t\t? directoryOrProgress\n\t\t\t\t\t\t: typeof progressOrSignal === \"function\"\n\t\t\t\t\t\t\t? progressOrSignal\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tif (!supplied) await store.close();\n\t\t\t}\n\t\t}\n\t\tconst { listAllSessions } = await import(\"./session-manager-list.ts\");\n\t\treturn listAllSessions(\n\t\t\tdirectoryOrProgress,\n\t\t\ttypeof progressOrSignal === \"function\" ? progressOrSignal : undefined,\n\t\t\toptions !== undefined && \"includeInternal\" in options && options.includeInternal === true,\n\t\t\toptions && \"aborted\" in options\n\t\t\t\t? options\n\t\t\t\t: (options?.signal ?? (typeof progressOrSignal === \"object\" ? progressOrSignal : undefined)),\n\t\t);\n\t}\n}\n"]}
@@ -3,7 +3,7 @@ import { readdir, readFile, stat } from "fs/promises";
3
3
  import { basename, join } from "path";
4
4
  import { getSessionsDir } from "../config.js";
5
5
  import { yieldToEventLoopIfSlow } from "../utils/event-loop.js";
6
- import { createSessionCwdMatcher, normalizePath, resolvePath } from "../utils/paths.js";
6
+ import { createSessionCwdMatcher, normalizePath, pathsEqual, resolvePath } from "../utils/paths.js";
7
7
  import { classifiedWorkflowMetadata } from "./session-manager-classification.js";
8
8
  import { getLatestSessionSummary } from "./session-manager-entries.js";
9
9
  import { getDefaultSessionDir, getDefaultSessionDirPath } from "./session-manager-paths.js";
@@ -213,7 +213,7 @@ export async function listSessionsFromDir(dir, onProgress, includeInternal = fal
213
213
  }
214
214
  export async function listProjectSessions(cwd, sessionDir, onProgress, includeInternal = false, signal) {
215
215
  const dir = sessionDir ? normalizePath(sessionDir) : getDefaultSessionDir(cwd);
216
- const filterCwd = sessionDir !== undefined && dir !== getDefaultSessionDirPath(cwd);
216
+ const filterCwd = sessionDir !== undefined && !pathsEqual(dir, getDefaultSessionDirPath(cwd));
217
217
  const matchesCwd = createSessionCwdMatcher(resolvePath(cwd));
218
218
  const include = (session) => !filterCwd || matchesCwd(resolvePath(session.cwd));
219
219
  const progress = onProgress
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager-list.js","sourceRoot":"","sources":["../../src/core/session-manager-list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAc,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EACN,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,2BAA2B,GAC3B,MAAM,8BAA8B,CAAC;AAUtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,SAAS,oBAAoB,CAAC,OAAqB;IAClD,OAAO,OAAQ,OAAmB,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,IAAI,OAAO,CAAC;AAC9E,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgB;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,KAAK,EAAwB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SAC9D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAoB;IAChD,IAAI,gBAAoC,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QAEvC,MAAM,OAAO,GAAI,KAA6B,CAAC,OAAO,CAAC;QACvD,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAAE,SAAS;QAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAEtE,MAAM,YAAY,GAAI,OAAkC,CAAC,SAAS,CAAC;QACnE,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACtC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;YACjE,SAAS;QACV,CAAC;QAED,MAAM,cAAc,GAAI,KAA0B,CAAC,SAAS,CAAC;QAC7D,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,gBAAgB,CAAC;AACzB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAoB,EAAE,MAAqB,EAAE,UAAgB;IAC5F,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACrG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACtE,CAAC;AAED,gFAAgF;AAChF,6EAA6E;AAC7E,8EAA8E;AAC9E,+BAA+B;AAC/B,MAAM,+BAA+B,GAAG,GAAG,GAAG,IAAI,CAAC;AACnD,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC,gFAAgF;AAChF,oEAAoE;AACpE,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,KAAK,UAAU,kBAAkB,CAChC,KAAmB,EACnB,KAAa,EACb,GAA2C,EAC3C,MAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;QAChE,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;IACF,CAAC,CAAC,CACF,CAAC;IACF,OAAO,OAAO,CAAC;AAChB,CAAC;AAMD,SAAS,gBAAgB,CAAC,QAAuB;IAChD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,KAAK,UAAU,gCAAgC,CAAC,OAAe,EAAE,MAAoB;IACpF,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,uBAAuB,KAAK,CAAC,EAAE,CAAC;YACjD,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,MAAM,sBAAsB,CAAC,SAAS,CAAC,CAAC;YACxC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,4BAA4B,CAC1C,KAAsC,EACtC,eAAwB,EACxB,UAA6D,EAC7D,MAAoB;IAEpB,OAAO,kBAAkB,CACxB,KAAK,EACL,oBAAoB,EACpB,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACrB,kFAAkF;QAClF,MAAM,IAAI,GACT,CAAC,eAAe,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC,EACD,MAAM,CACN,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,MAAoB,EACpB,SAAiB;IAEjB,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,2BAA2B,CAC1C,OAAO,CAAC,MAAM,GAAG,+BAA+B;YAC/C,CAAC,CAAC,MAAM,gCAAgC,CAAC,OAAO,EAAE,MAAM,CAAC;YACzD,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,EACrC,QAAQ,CACR,CAAC;QAEF,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE7D,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,IAAwB,CAAC;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,qEAAqE;YACrE,8EAA8E;YAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,KAAyB,CAAC;gBAC5C,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;gBAC3C,OAAO,GAAG,IAAI,CAAC;YAChB,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,SAAS;YACvC,YAAY,EAAE,CAAC;YAEf,MAAM,OAAO,GAAI,KAA6B,CAAC,OAAO,CAAC;YACvD,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAS;YAEtE,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,WAAW;gBAAE,SAAS;YAE3B,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9B,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC9C,YAAY,GAAG,WAAW,CAAC;YAC5B,CAAC;QACF,CAAC;QAED,MAAM,GAAG,GAAG,OAAQ,MAAwB,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,MAAM,iBAAiB,GAAI,MAAwB,CAAC,eAAe,CAAC;QACpE,MAAM,QAAQ,GAAG,0BAA0B,CAAC,MAAuB,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,MAAuB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAEvF,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO;YACN,IAAI,EAAE,QAAQ;YACd,EAAE,EAAG,MAAwB,CAAC,EAAE;YAChC,GAAG;YACH,IAAI;YACJ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,iBAAiB;YACjB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,IAAI,IAAI,CAAE,MAAwB,CAAC,SAAS,CAAC;YACtD,QAAQ;YACR,YAAY;YACZ,YAAY,EAAE,YAAY,IAAI,eAAe;YAC7C,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,mBAAmB,EAAE,OAAO,EAAE,mBAAmB;YACjD,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;SACtC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAuB;IAChE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE;QACnE,MAAM,iBAAiB,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnF,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IAC1F,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,GAAW,EACX,UAAgC,EAChC,eAAe,GAAG,KAAK,EACvB,MAAoB;IAEpB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;aAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,4BAA4B,CACjD,KAAK,EACL,eAAe,EACf,CAAC,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,CAAC;YACT,IAAI,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,UAAU,EAAE,CACX,MAAM,EACN,KAAK,CAAC,MAAM,EACZ,MAAM,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM;gBAC3D,CAAC,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;gBACtD,CAAC,CAAC,SAAS,CACZ,CAAC;QACH,CAAC,EACD,MAAM,CACN,CAAC;QACF,OAAO,yBAAyB,CAC/B,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAuB,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CACnG,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,GAAW,EACX,UAAmB,EACnB,UAAgC,EAChC,eAAe,GAAG,KAAK,EACvB,MAAoB;IAEpB,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,UAAU,KAAK,SAAS,IAAI,GAAG,KAAK,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,uBAAuB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,CAAC,OAAoB,EAAE,EAAE,CAAC,CAAC,SAAS,IAAI,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAoC,UAAU;QAC3D,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACjF,CAAC,CAAC,SAAS,CAAC;IACb,OAAO,gBAAgB,CAAC,CAAC,MAAM,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,sBAAqD,EACrD,UAAgC,EAChC,eAAe,GAAG,KAAK,EACvB,MAAoB;IAEpB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,gBAAgB,GACrB,OAAO,sBAAsB,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChG,MAAM,QAAQ,GAAG,OAAO,sBAAsB,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,UAAU,CAAC;IACpG,IAAI,gBAAgB,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QAChG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,IAAI,CAAC;QACJ,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACX,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,OAAO;aAClB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;aAChE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CACxC,IAAI,EACJ,EAAE,EACF,KAAK,EAAE,GAAG,EAAE,EAAE;YACb,IAAI,CAAC;gBACJ,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;YACtG,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,EAAE,CAAC;YACX,CAAC;QACF,CAAC,EACD,MAAM,CACN,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAC1C,QAAQ,CAAC,IAAI,EAAE,EACf,EAAE,EACF,KAAK,EAAE,IAAI,EAAiC,EAAE;YAC7C,IAAI,CAAC;gBACJ,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,EAAE,IAAI,EAAE,CAAC;YACjB,CAAC;QACF,CAAC,EACD,MAAM,CACN,CAAC;QACF,UAAU,CAAC,IAAI,CACd,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACR,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,iBAAiB,CAAC;YAC/F,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CACjD,CAAC;QACF,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,4BAA4B,CACjD,UAAU,EACV,eAAe,EACf,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACf,MAAM,EAAE,CAAC;YACT,IAAI,KAAK,KAAK,CAAC;gBAAE,oBAAoB,GAAG,IAAI,CAAC;YAC7C,IAAI,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,QAAQ,EAAE,CACT,MAAM,EACN,UAAU,CAAC,MAAM,EACjB,oBAAoB,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC;gBAC1F,CAAC,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;gBACtD,CAAC,CAAC,SAAS,CACZ,CAAC;QACH,CAAC,EACD,MAAM,CACN,CAAC;QACF,OAAO,gBAAgB,CACtB,yBAAyB,CACxB,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAuB,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CACnG,CACD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC","sourcesContent":["import type { Message, TextContent } from \"@bastani/pi-ai/compat\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { existsSync, type Stats } from \"fs\";\nimport { readdir, readFile, stat } from \"fs/promises\";\nimport { basename, join } from \"path\";\nimport { getSessionsDir } from \"../config.js\";\nimport { yieldToEventLoopIfSlow } from \"../utils/event-loop.ts\";\nimport { createSessionCwdMatcher, normalizePath, resolvePath } from \"../utils/paths.ts\";\nimport { classifiedWorkflowMetadata } from \"./session-manager-classification.ts\";\nimport { getLatestSessionSummary } from \"./session-manager-entries.ts\";\nimport { getDefaultSessionDir, getDefaultSessionDirPath } from \"./session-manager-paths.ts\";\nimport {\n\tisInternalHeader,\n\tparseStoredSessionEntries,\n\treadSessionHeader,\n\tupgradeStoredSessionEntries,\n} from \"./session-manager-storage.ts\";\nimport type {\n\tFileEntry,\n\tSessionEntryBase,\n\tSessionHeader,\n\tSessionInfo,\n\tSessionInfoEntry,\n\tSessionListProgress,\n\tSessionMessageEntry,\n} from \"./session-manager-types.ts\";\nimport { validateSessionFileEntries } from \"./session-manager-validation.ts\";\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 getLastActivityTime(entries: FileEntry[]): number | undefined {\n\tlet lastActivityTime: number | undefined;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\n\t\tconst message = (entry as SessionMessageEntry).message;\n\t\tif (!isMessageWithContent(message)) continue;\n\t\tif (message.role !== \"user\" && message.role !== \"assistant\") continue;\n\n\t\tconst msgTimestamp = (message as { timestamp?: number }).timestamp;\n\t\tif (typeof msgTimestamp === \"number\") {\n\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, msgTimestamp);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst entryTimestamp = (entry as SessionEntryBase).timestamp;\n\t\tif (typeof entryTimestamp === \"string\") {\n\t\t\tconst t = new Date(entryTimestamp).getTime();\n\t\t\tif (!Number.isNaN(t)) {\n\t\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn lastActivityTime;\n}\n\nfunction getSessionModifiedDate(entries: FileEntry[], header: SessionHeader, statsMtime: Date): Date {\n\tconst lastActivityTime = getLastActivityTime(entries);\n\tif (typeof lastActivityTime === \"number\" && lastActivityTime > 0) {\n\t\treturn new Date(lastActivityTime);\n\t}\n\n\tconst headerTime = typeof header.createdAt === \"string\" ? new Date(header.createdAt).getTime() : NaN;\n\treturn !Number.isNaN(headerTime) ? new Date(headerTime) : statsMtime;\n}\n\n// A single very large transcript is parsed in bounded cooperative chunks so the\n// synchronous JSON.parse-per-line loop yields to terminal input, timers, and\n// render work instead of freezing the host. Smaller files stay on the cheaper\n// fully-synchronous fast path.\nconst COOPERATIVE_PARSE_CONTENT_BYTES = 512 * 1024;\nconst PARSE_YIELD_EVERY_LINES = 2000;\n\n// Directory listings walk files in bounded batches, yielding between batches so\n// large session folders cannot starve the event loop during a scan.\nconst LIST_FILE_BATCH_SIZE = 10;\n\nasync function mapWithConcurrency<T, R>(\n\titems: readonly T[],\n\tlimit: number,\n\tmap: (item: T, index: number) => Promise<R>,\n\tsignal?: AbortSignal,\n): Promise<R[]> {\n\tconst results = new Array<R>(items.length);\n\tlet next = 0;\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(items.length, limit) }, async () => {\n\t\t\twhile (next < items.length) {\n\t\t\t\tsignal?.throwIfAborted();\n\t\t\t\tconst index = next++;\n\t\t\t\tresults[index] = await map(items[index]!, index);\n\t\t\t}\n\t\t}),\n\t);\n\treturn results;\n}\n\ninterface SessionFileCandidate {\n\tpath: string;\n\tstats?: Stats;\n}\nfunction sortSessionInfos(sessions: SessionInfo[]): SessionInfo[] {\n\treturn sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n}\n\nasync function parseSessionEntriesCooperatively(content: string, signal?: AbortSignal): Promise<FileEntry[]> {\n\tconst entries: FileEntry[] = [];\n\tconst lines = content.trim().split(\"\\n\");\n\tlet startedAt = Date.now();\n\tfor (let index = 0; index < lines.length; index += 1) {\n\t\tconst line = lines[index]!;\n\t\tif (line.trim()) {\n\t\t\tentries.push(...parseStoredSessionEntries(line));\n\t\t}\n\t\tif ((index + 1) % PARSE_YIELD_EVERY_LINES === 0) {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tawait yieldToEventLoopIfSlow(startedAt);\n\t\t\tstartedAt = Date.now();\n\t\t}\n\t}\n\treturn entries;\n}\n\n/**\n * Parse + summarize session files in bounded batches, yielding between batches\n * so a large directory scan never blocks the TUI event loop. Progress is\n * reported per file via onFileDone, matching the previous eager Promise.all.\n */\nasync function mapSessionFilesCooperatively(\n\tfiles: readonly SessionFileCandidate[],\n\tincludeInternal: boolean,\n\tonFileDone: (info: SessionInfo | null, index: number) => void,\n\tsignal?: AbortSignal,\n): Promise<(SessionInfo | null)[]> {\n\treturn mapWithConcurrency(\n\t\tfiles,\n\t\tLIST_FILE_BATCH_SIZE,\n\t\tasync (file, index) => {\n\t\t\t// Hidden sessions never enter partial results or the expensive transcript parser.\n\t\t\tconst info =\n\t\t\t\t!includeInternal && isInternalHeader(readSessionHeader(file.path))\n\t\t\t\t\t? null\n\t\t\t\t\t: await buildSessionInfo(file.path, signal, file.stats);\n\t\t\tsignal?.throwIfAborted();\n\t\t\tonFileDone(info, index);\n\t\t\treturn info;\n\t\t},\n\t\tsignal,\n\t);\n}\n\nasync function buildSessionInfo(\n\tfilePath: string,\n\tsignal?: AbortSignal,\n\tfileStats?: Stats,\n): Promise<SessionInfo | null> {\n\ttry {\n\t\tconst content = await readFile(filePath, { encoding: \"utf8\", signal });\n\t\tconst entries = upgradeStoredSessionEntries(\n\t\t\tcontent.length > COOPERATIVE_PARSE_CONTENT_BYTES\n\t\t\t\t? await parseSessionEntriesCooperatively(content, signal)\n\t\t\t\t: parseStoredSessionEntries(content),\n\t\t\tfilePath,\n\t\t);\n\n\t\tconst header = validateSessionFileEntries(entries, filePath);\n\n\t\tconst stats = fileStats ?? (await stat(filePath));\n\t\tlet messageCount = 0;\n\t\tlet firstMessage = \"\";\n\t\tconst allMessages: string[] = [];\n\t\tlet name: string | undefined;\n\t\tlet hasName = false;\n\n\t\tfor (const entry of entries) {\n\t\t\t// Extract session name state (use latest, including explicit clears:\n\t\t\t// a latest empty name means cleared, no session_info entry means never named)\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\thasName = true;\n\t\t\t}\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\tallMessages.push(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\tconst cwd = typeof (header as SessionHeader).cwd === \"string\" ? (header as SessionHeader).cwd : \"\";\n\t\tconst parentSessionPath = (header as SessionHeader).parentSessionId;\n\t\tconst workflow = classifiedWorkflowMetadata(header as SessionHeader);\n\t\tconst internal = workflow ? true : undefined;\n\n\t\tconst modified = getSessionModifiedDate(entries, header as SessionHeader, stats.mtime);\n\n\t\tconst summary = getLatestSessionSummary(entries);\n\n\t\treturn {\n\t\t\tpath: filePath,\n\t\t\tid: (header as SessionHeader).id,\n\t\t\tcwd,\n\t\t\tname,\n\t\t\t...(hasName ? { hasName: true } : {}),\n\t\t\tparentSessionPath,\n\t\t\t...(internal ? { internal } : {}),\n\t\t\t...(workflow ? { workflow } : {}),\n\t\t\tcreated: new Date((header as SessionHeader).createdAt),\n\t\t\tmodified,\n\t\t\tmessageCount,\n\t\t\tfirstMessage: firstMessage || \"(no messages)\",\n\t\t\tsummary: summary?.summary,\n\t\t\tsummarizedThroughId: summary?.summarizedThroughId,\n\t\t\tallMessagesText: allMessages.join(\" \"),\n\t\t};\n\t} catch {\n\t\tsignal?.throwIfAborted();\n\t\treturn null;\n\t}\n}\n\nexport function resolveParentSessionPaths(sessions: SessionInfo[]): SessionInfo[] {\n\tconst paths = new Map(sessions.map((session) => [session.id, session.path]));\n\treturn sessions.map(({ parentSessionPath: parentId, ...session }) => {\n\t\tconst parentSessionPath = parentId === undefined ? undefined : paths.get(parentId);\n\t\treturn { ...session, ...(parentSessionPath === undefined ? {} : { parentSessionPath }) };\n\t});\n}\n\nexport async function listSessionsFromDir(\n\tdir: string,\n\tonProgress?: SessionListProgress,\n\tincludeInternal = false,\n\tsignal?: AbortSignal,\n): Promise<SessionInfo[]> {\n\tsignal?.throwIfAborted();\n\tif (!existsSync(dir)) return [];\n\ttry {\n\t\tconst files = (await readdir(dir))\n\t\t\t.filter((file) => file.endsWith(\".jsonl\"))\n\t\t\t.sort((a, b) => b.localeCompare(a))\n\t\t\t.map((file) => ({ path: join(dir, file) }));\n\t\tconst partial: SessionInfo[] = [];\n\t\tlet loaded = 0;\n\t\tconst results = await mapSessionFilesCooperatively(\n\t\t\tfiles,\n\t\t\tincludeInternal,\n\t\t\t(info) => {\n\t\t\t\tloaded++;\n\t\t\t\tif (info && (includeInternal || !info.internal)) partial.push(info);\n\t\t\t\tonProgress?.(\n\t\t\t\t\tloaded,\n\t\t\t\t\tfiles.length,\n\t\t\t\t\tloaded === 1 || loaded % 10 === 0 || loaded === files.length\n\t\t\t\t\t\t? sortSessionInfos(resolveParentSessionPaths(partial))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\treturn resolveParentSessionPaths(\n\t\t\tresults.filter((info): info is SessionInfo => info !== null && (includeInternal || !info.internal)),\n\t\t);\n\t} catch {\n\t\tsignal?.throwIfAborted();\n\t\treturn [];\n\t}\n}\n\nexport async function listProjectSessions(\n\tcwd: string,\n\tsessionDir?: string,\n\tonProgress?: SessionListProgress,\n\tincludeInternal = false,\n\tsignal?: AbortSignal,\n): Promise<SessionInfo[]> {\n\tconst dir = sessionDir ? normalizePath(sessionDir) : getDefaultSessionDir(cwd);\n\tconst filterCwd = sessionDir !== undefined && dir !== getDefaultSessionDirPath(cwd);\n\tconst matchesCwd = createSessionCwdMatcher(resolvePath(cwd));\n\tconst include = (session: SessionInfo) => !filterCwd || matchesCwd(resolvePath(session.cwd));\n\tconst progress: SessionListProgress | undefined = onProgress\n\t\t? (loaded, total, partial) => onProgress(loaded, total, partial?.filter(include))\n\t\t: undefined;\n\treturn sortSessionInfos((await listSessionsFromDir(dir, progress, includeInternal, signal)).filter(include));\n}\n\nexport async function listAllSessions(\n\tsessionDirOrOnProgress?: string | SessionListProgress,\n\tonProgress?: SessionListProgress,\n\tincludeInternal = false,\n\tsignal?: AbortSignal,\n): Promise<SessionInfo[]> {\n\tsignal?.throwIfAborted();\n\tconst customSessionDir =\n\t\ttypeof sessionDirOrOnProgress === \"string\" ? normalizePath(sessionDirOrOnProgress) : undefined;\n\tconst progress = typeof sessionDirOrOnProgress === \"function\" ? sessionDirOrOnProgress : onProgress;\n\tif (customSessionDir) {\n\t\tconst sessions = await listSessionsFromDir(customSessionDir, progress, includeInternal, signal);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n\n\tconst sessionsDir = getSessionsDir();\n\n\ttry {\n\t\tif (!existsSync(sessionsDir)) {\n\t\t\treturn [];\n\t\t}\n\t\tconst entries = await readdir(sessionsDir, { withFileTypes: true });\n\t\tconst dirs = entries\n\t\t\t.filter((entry) => entry.isDirectory() || entry.isSymbolicLink())\n\t\t\t.map((entry) => join(sessionsDir, entry.name));\n\n\t\tconst dirFiles = await mapWithConcurrency(\n\t\t\tdirs,\n\t\t\t64,\n\t\t\tasync (dir) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn (await readdir(dir)).filter((file) => file.endsWith(\".jsonl\")).map((file) => join(dir, file));\n\t\t\t\t} catch {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\tconst candidates = await mapWithConcurrency(\n\t\t\tdirFiles.flat(),\n\t\t\t64,\n\t\t\tasync (path): Promise<SessionFileCandidate> => {\n\t\t\t\ttry {\n\t\t\t\t\treturn { path, stats: await stat(path) };\n\t\t\t\t} catch {\n\t\t\t\t\treturn { path };\n\t\t\t\t}\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\tcandidates.sort(\n\t\t\t(a, b) =>\n\t\t\t\t(b.stats?.mtimeMs ?? Number.NEGATIVE_INFINITY) - (a.stats?.mtimeMs ?? Number.NEGATIVE_INFINITY) ||\n\t\t\t\tbasename(b.path).localeCompare(basename(a.path)),\n\t\t);\n\t\tlet loaded = 0;\n\t\tlet firstCandidateLoaded = false;\n\t\tconst partial: SessionInfo[] = [];\n\t\tconst results = await mapSessionFilesCooperatively(\n\t\t\tcandidates,\n\t\t\tincludeInternal,\n\t\t\t(info, index) => {\n\t\t\t\tloaded++;\n\t\t\t\tif (index === 0) firstCandidateLoaded = true;\n\t\t\t\tif (info && (includeInternal || !info.internal)) partial.push(info);\n\t\t\t\tprogress?.(\n\t\t\t\t\tloaded,\n\t\t\t\t\tcandidates.length,\n\t\t\t\t\tfirstCandidateLoaded && (index === 0 || loaded % 100 === 0 || loaded === candidates.length)\n\t\t\t\t\t\t? sortSessionInfos(resolveParentSessionPaths(partial))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\treturn sortSessionInfos(\n\t\t\tresolveParentSessionPaths(\n\t\t\t\tresults.filter((info): info is SessionInfo => info !== null && (includeInternal || !info.internal)),\n\t\t\t),\n\t\t);\n\t} catch {\n\t\tsignal?.throwIfAborted();\n\t\treturn [];\n\t}\n}\n"]}
1
+ {"version":3,"file":"session-manager-list.js","sourceRoot":"","sources":["../../src/core/session-manager-list.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Message, TextContent } from \"@bastani/pi-ai/compat\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { existsSync, type Stats } from \"fs\";\nimport { readdir, readFile, stat } from \"fs/promises\";\nimport { basename, join } from \"path\";\nimport { getSessionsDir } from \"../config.js\";\nimport { yieldToEventLoopIfSlow } from \"../utils/event-loop.ts\";\nimport { createSessionCwdMatcher, normalizePath, pathsEqual, resolvePath } from \"../utils/paths.ts\";\nimport { classifiedWorkflowMetadata } from \"./session-manager-classification.ts\";\nimport { getLatestSessionSummary } from \"./session-manager-entries.ts\";\nimport { getDefaultSessionDir, getDefaultSessionDirPath } from \"./session-manager-paths.ts\";\nimport {\n\tisInternalHeader,\n\tparseStoredSessionEntries,\n\treadSessionHeader,\n\tupgradeStoredSessionEntries,\n} from \"./session-manager-storage.ts\";\nimport type {\n\tFileEntry,\n\tSessionEntryBase,\n\tSessionHeader,\n\tSessionInfo,\n\tSessionInfoEntry,\n\tSessionListProgress,\n\tSessionMessageEntry,\n} from \"./session-manager-types.ts\";\nimport { validateSessionFileEntries } from \"./session-manager-validation.ts\";\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 getLastActivityTime(entries: FileEntry[]): number | undefined {\n\tlet lastActivityTime: number | undefined;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\n\t\tconst message = (entry as SessionMessageEntry).message;\n\t\tif (!isMessageWithContent(message)) continue;\n\t\tif (message.role !== \"user\" && message.role !== \"assistant\") continue;\n\n\t\tconst msgTimestamp = (message as { timestamp?: number }).timestamp;\n\t\tif (typeof msgTimestamp === \"number\") {\n\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, msgTimestamp);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst entryTimestamp = (entry as SessionEntryBase).timestamp;\n\t\tif (typeof entryTimestamp === \"string\") {\n\t\t\tconst t = new Date(entryTimestamp).getTime();\n\t\t\tif (!Number.isNaN(t)) {\n\t\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn lastActivityTime;\n}\n\nfunction getSessionModifiedDate(entries: FileEntry[], header: SessionHeader, statsMtime: Date): Date {\n\tconst lastActivityTime = getLastActivityTime(entries);\n\tif (typeof lastActivityTime === \"number\" && lastActivityTime > 0) {\n\t\treturn new Date(lastActivityTime);\n\t}\n\n\tconst headerTime = typeof header.createdAt === \"string\" ? new Date(header.createdAt).getTime() : NaN;\n\treturn !Number.isNaN(headerTime) ? new Date(headerTime) : statsMtime;\n}\n\n// A single very large transcript is parsed in bounded cooperative chunks so the\n// synchronous JSON.parse-per-line loop yields to terminal input, timers, and\n// render work instead of freezing the host. Smaller files stay on the cheaper\n// fully-synchronous fast path.\nconst COOPERATIVE_PARSE_CONTENT_BYTES = 512 * 1024;\nconst PARSE_YIELD_EVERY_LINES = 2000;\n\n// Directory listings walk files in bounded batches, yielding between batches so\n// large session folders cannot starve the event loop during a scan.\nconst LIST_FILE_BATCH_SIZE = 10;\n\nasync function mapWithConcurrency<T, R>(\n\titems: readonly T[],\n\tlimit: number,\n\tmap: (item: T, index: number) => Promise<R>,\n\tsignal?: AbortSignal,\n): Promise<R[]> {\n\tconst results = new Array<R>(items.length);\n\tlet next = 0;\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(items.length, limit) }, async () => {\n\t\t\twhile (next < items.length) {\n\t\t\t\tsignal?.throwIfAborted();\n\t\t\t\tconst index = next++;\n\t\t\t\tresults[index] = await map(items[index]!, index);\n\t\t\t}\n\t\t}),\n\t);\n\treturn results;\n}\n\ninterface SessionFileCandidate {\n\tpath: string;\n\tstats?: Stats;\n}\nfunction sortSessionInfos(sessions: SessionInfo[]): SessionInfo[] {\n\treturn sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n}\n\nasync function parseSessionEntriesCooperatively(content: string, signal?: AbortSignal): Promise<FileEntry[]> {\n\tconst entries: FileEntry[] = [];\n\tconst lines = content.trim().split(\"\\n\");\n\tlet startedAt = Date.now();\n\tfor (let index = 0; index < lines.length; index += 1) {\n\t\tconst line = lines[index]!;\n\t\tif (line.trim()) {\n\t\t\tentries.push(...parseStoredSessionEntries(line));\n\t\t}\n\t\tif ((index + 1) % PARSE_YIELD_EVERY_LINES === 0) {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tawait yieldToEventLoopIfSlow(startedAt);\n\t\t\tstartedAt = Date.now();\n\t\t}\n\t}\n\treturn entries;\n}\n\n/**\n * Parse + summarize session files in bounded batches, yielding between batches\n * so a large directory scan never blocks the TUI event loop. Progress is\n * reported per file via onFileDone, matching the previous eager Promise.all.\n */\nasync function mapSessionFilesCooperatively(\n\tfiles: readonly SessionFileCandidate[],\n\tincludeInternal: boolean,\n\tonFileDone: (info: SessionInfo | null, index: number) => void,\n\tsignal?: AbortSignal,\n): Promise<(SessionInfo | null)[]> {\n\treturn mapWithConcurrency(\n\t\tfiles,\n\t\tLIST_FILE_BATCH_SIZE,\n\t\tasync (file, index) => {\n\t\t\t// Hidden sessions never enter partial results or the expensive transcript parser.\n\t\t\tconst info =\n\t\t\t\t!includeInternal && isInternalHeader(readSessionHeader(file.path))\n\t\t\t\t\t? null\n\t\t\t\t\t: await buildSessionInfo(file.path, signal, file.stats);\n\t\t\tsignal?.throwIfAborted();\n\t\t\tonFileDone(info, index);\n\t\t\treturn info;\n\t\t},\n\t\tsignal,\n\t);\n}\n\nasync function buildSessionInfo(\n\tfilePath: string,\n\tsignal?: AbortSignal,\n\tfileStats?: Stats,\n): Promise<SessionInfo | null> {\n\ttry {\n\t\tconst content = await readFile(filePath, { encoding: \"utf8\", signal });\n\t\tconst entries = upgradeStoredSessionEntries(\n\t\t\tcontent.length > COOPERATIVE_PARSE_CONTENT_BYTES\n\t\t\t\t? await parseSessionEntriesCooperatively(content, signal)\n\t\t\t\t: parseStoredSessionEntries(content),\n\t\t\tfilePath,\n\t\t);\n\n\t\tconst header = validateSessionFileEntries(entries, filePath);\n\n\t\tconst stats = fileStats ?? (await stat(filePath));\n\t\tlet messageCount = 0;\n\t\tlet firstMessage = \"\";\n\t\tconst allMessages: string[] = [];\n\t\tlet name: string | undefined;\n\t\tlet hasName = false;\n\n\t\tfor (const entry of entries) {\n\t\t\t// Extract session name state (use latest, including explicit clears:\n\t\t\t// a latest empty name means cleared, no session_info entry means never named)\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\thasName = true;\n\t\t\t}\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\tallMessages.push(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\tconst cwd = typeof (header as SessionHeader).cwd === \"string\" ? (header as SessionHeader).cwd : \"\";\n\t\tconst parentSessionPath = (header as SessionHeader).parentSessionId;\n\t\tconst workflow = classifiedWorkflowMetadata(header as SessionHeader);\n\t\tconst internal = workflow ? true : undefined;\n\n\t\tconst modified = getSessionModifiedDate(entries, header as SessionHeader, stats.mtime);\n\n\t\tconst summary = getLatestSessionSummary(entries);\n\n\t\treturn {\n\t\t\tpath: filePath,\n\t\t\tid: (header as SessionHeader).id,\n\t\t\tcwd,\n\t\t\tname,\n\t\t\t...(hasName ? { hasName: true } : {}),\n\t\t\tparentSessionPath,\n\t\t\t...(internal ? { internal } : {}),\n\t\t\t...(workflow ? { workflow } : {}),\n\t\t\tcreated: new Date((header as SessionHeader).createdAt),\n\t\t\tmodified,\n\t\t\tmessageCount,\n\t\t\tfirstMessage: firstMessage || \"(no messages)\",\n\t\t\tsummary: summary?.summary,\n\t\t\tsummarizedThroughId: summary?.summarizedThroughId,\n\t\t\tallMessagesText: allMessages.join(\" \"),\n\t\t};\n\t} catch {\n\t\tsignal?.throwIfAborted();\n\t\treturn null;\n\t}\n}\n\nexport function resolveParentSessionPaths(sessions: SessionInfo[]): SessionInfo[] {\n\tconst paths = new Map(sessions.map((session) => [session.id, session.path]));\n\treturn sessions.map(({ parentSessionPath: parentId, ...session }) => {\n\t\tconst parentSessionPath = parentId === undefined ? undefined : paths.get(parentId);\n\t\treturn { ...session, ...(parentSessionPath === undefined ? {} : { parentSessionPath }) };\n\t});\n}\n\nexport async function listSessionsFromDir(\n\tdir: string,\n\tonProgress?: SessionListProgress,\n\tincludeInternal = false,\n\tsignal?: AbortSignal,\n): Promise<SessionInfo[]> {\n\tsignal?.throwIfAborted();\n\tif (!existsSync(dir)) return [];\n\ttry {\n\t\tconst files = (await readdir(dir))\n\t\t\t.filter((file) => file.endsWith(\".jsonl\"))\n\t\t\t.sort((a, b) => b.localeCompare(a))\n\t\t\t.map((file) => ({ path: join(dir, file) }));\n\t\tconst partial: SessionInfo[] = [];\n\t\tlet loaded = 0;\n\t\tconst results = await mapSessionFilesCooperatively(\n\t\t\tfiles,\n\t\t\tincludeInternal,\n\t\t\t(info) => {\n\t\t\t\tloaded++;\n\t\t\t\tif (info && (includeInternal || !info.internal)) partial.push(info);\n\t\t\t\tonProgress?.(\n\t\t\t\t\tloaded,\n\t\t\t\t\tfiles.length,\n\t\t\t\t\tloaded === 1 || loaded % 10 === 0 || loaded === files.length\n\t\t\t\t\t\t? sortSessionInfos(resolveParentSessionPaths(partial))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\treturn resolveParentSessionPaths(\n\t\t\tresults.filter((info): info is SessionInfo => info !== null && (includeInternal || !info.internal)),\n\t\t);\n\t} catch {\n\t\tsignal?.throwIfAborted();\n\t\treturn [];\n\t}\n}\n\nexport async function listProjectSessions(\n\tcwd: string,\n\tsessionDir?: string,\n\tonProgress?: SessionListProgress,\n\tincludeInternal = false,\n\tsignal?: AbortSignal,\n): Promise<SessionInfo[]> {\n\tconst dir = sessionDir ? normalizePath(sessionDir) : getDefaultSessionDir(cwd);\n\tconst filterCwd = sessionDir !== undefined && !pathsEqual(dir, getDefaultSessionDirPath(cwd));\n\tconst matchesCwd = createSessionCwdMatcher(resolvePath(cwd));\n\tconst include = (session: SessionInfo) => !filterCwd || matchesCwd(resolvePath(session.cwd));\n\tconst progress: SessionListProgress | undefined = onProgress\n\t\t? (loaded, total, partial) => onProgress(loaded, total, partial?.filter(include))\n\t\t: undefined;\n\treturn sortSessionInfos((await listSessionsFromDir(dir, progress, includeInternal, signal)).filter(include));\n}\n\nexport async function listAllSessions(\n\tsessionDirOrOnProgress?: string | SessionListProgress,\n\tonProgress?: SessionListProgress,\n\tincludeInternal = false,\n\tsignal?: AbortSignal,\n): Promise<SessionInfo[]> {\n\tsignal?.throwIfAborted();\n\tconst customSessionDir =\n\t\ttypeof sessionDirOrOnProgress === \"string\" ? normalizePath(sessionDirOrOnProgress) : undefined;\n\tconst progress = typeof sessionDirOrOnProgress === \"function\" ? sessionDirOrOnProgress : onProgress;\n\tif (customSessionDir) {\n\t\tconst sessions = await listSessionsFromDir(customSessionDir, progress, includeInternal, signal);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n\n\tconst sessionsDir = getSessionsDir();\n\n\ttry {\n\t\tif (!existsSync(sessionsDir)) {\n\t\t\treturn [];\n\t\t}\n\t\tconst entries = await readdir(sessionsDir, { withFileTypes: true });\n\t\tconst dirs = entries\n\t\t\t.filter((entry) => entry.isDirectory() || entry.isSymbolicLink())\n\t\t\t.map((entry) => join(sessionsDir, entry.name));\n\n\t\tconst dirFiles = await mapWithConcurrency(\n\t\t\tdirs,\n\t\t\t64,\n\t\t\tasync (dir) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn (await readdir(dir)).filter((file) => file.endsWith(\".jsonl\")).map((file) => join(dir, file));\n\t\t\t\t} catch {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\tconst candidates = await mapWithConcurrency(\n\t\t\tdirFiles.flat(),\n\t\t\t64,\n\t\t\tasync (path): Promise<SessionFileCandidate> => {\n\t\t\t\ttry {\n\t\t\t\t\treturn { path, stats: await stat(path) };\n\t\t\t\t} catch {\n\t\t\t\t\treturn { path };\n\t\t\t\t}\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\tcandidates.sort(\n\t\t\t(a, b) =>\n\t\t\t\t(b.stats?.mtimeMs ?? Number.NEGATIVE_INFINITY) - (a.stats?.mtimeMs ?? Number.NEGATIVE_INFINITY) ||\n\t\t\t\tbasename(b.path).localeCompare(basename(a.path)),\n\t\t);\n\t\tlet loaded = 0;\n\t\tlet firstCandidateLoaded = false;\n\t\tconst partial: SessionInfo[] = [];\n\t\tconst results = await mapSessionFilesCooperatively(\n\t\t\tcandidates,\n\t\t\tincludeInternal,\n\t\t\t(info, index) => {\n\t\t\t\tloaded++;\n\t\t\t\tif (index === 0) firstCandidateLoaded = true;\n\t\t\t\tif (info && (includeInternal || !info.internal)) partial.push(info);\n\t\t\t\tprogress?.(\n\t\t\t\t\tloaded,\n\t\t\t\t\tcandidates.length,\n\t\t\t\t\tfirstCandidateLoaded && (index === 0 || loaded % 100 === 0 || loaded === candidates.length)\n\t\t\t\t\t\t? sortSessionInfos(resolveParentSessionPaths(partial))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\treturn sortSessionInfos(\n\t\t\tresolveParentSessionPaths(\n\t\t\t\tresults.filter((info): info is SessionInfo => info !== null && (includeInternal || !info.internal)),\n\t\t\t),\n\t\t);\n\t} catch {\n\t\tsignal?.throwIfAborted();\n\t\treturn [];\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"skills-async.d.ts","sourceRoot":"","sources":["../../src/core/skills-async.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAA2B,MAAM,aAAa,CAAC;AAuLhG,wBAAsB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqF3F"}
1
+ {"version":3,"file":"skills-async.d.ts","sourceRoot":"","sources":["../../src/core/skills-async.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAA2B,MAAM,aAAa,CAAC;AAuLhG,wBAAsB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8E3F"}
@@ -4,8 +4,8 @@ import ignore from "ignore";
4
4
  import { CONFIG_DIR_NAME, getAgentDir } from "../config.js";
5
5
  import { yieldToEventLoopIfSlow } from "../utils/event-loop.js";
6
6
  import { parseFrontmatter } from "../utils/frontmatter.js";
7
- import { canonicalizePath, resolvePath } from "../utils/paths.js";
8
- import { createSyntheticSourceInfo } from "./source-info.js";
7
+ import { isPathWithin, resolvePath } from "../utils/paths.js";
8
+ import { createSyntheticSourceInfo, getResourcePathKey } from "./source-info.js";
9
9
  const MAX_NAME_LENGTH = 64;
10
10
  const MAX_DESCRIPTION_LENGTH = 1024;
11
11
  const IGNORE_FILE_NAMES = [".gitignore", ".ignore", ".fdignore"];
@@ -204,7 +204,7 @@ export async function loadSkillsAsync(options) {
204
204
  const addSkills = (result) => {
205
205
  allDiagnostics.push(...result.diagnostics);
206
206
  for (const skill of result.skills) {
207
- const realPath = canonicalizePath(skill.filePath);
207
+ const realPath = getResourcePathKey(skill.filePath);
208
208
  if (realPathSet.has(realPath))
209
209
  continue;
210
210
  realPathSet.add(realPath);
@@ -232,16 +232,11 @@ export async function loadSkillsAsync(options) {
232
232
  addSkills(await loadSkillsFromDirInternal(userSkillsDir, "user", true));
233
233
  addSkills(await loadSkillsFromDirInternal(projectSkillsDir, "project", true));
234
234
  }
235
- const isUnderPath = (target, root) => {
236
- const normalizedRoot = resolve(root);
237
- return (target === normalizedRoot ||
238
- target.startsWith(normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`));
239
- };
240
235
  const getSource = (resolvedPath) => {
241
236
  if (!includeDefaults) {
242
- if (isUnderPath(resolvedPath, userSkillsDir))
237
+ if (isPathWithin(userSkillsDir, resolvedPath))
243
238
  return "user";
244
- if (isUnderPath(resolvedPath, projectSkillsDir))
239
+ if (isPathWithin(projectSkillsDir, resolvedPath))
245
240
  return "project";
246
241
  }
247
242
  return "path";