@geminixiang/mikan 1.0.0-beta.84 → 1.0.0-beta.86

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 (289) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +10 -10
  3. package/dist/adapters/commands/session-view.js +1 -1
  4. package/dist/adapters/commands/session-view.js.map +1 -1
  5. package/dist/adapters/discord/bot.d.ts.map +1 -1
  6. package/dist/adapters/discord/bot.js +1 -8
  7. package/dist/adapters/discord/bot.js.map +1 -1
  8. package/dist/adapters/github/activity.d.ts +3 -0
  9. package/dist/adapters/github/activity.d.ts.map +1 -0
  10. package/dist/adapters/github/activity.js +154 -0
  11. package/dist/adapters/github/activity.js.map +1 -0
  12. package/dist/adapters/github/bot.d.ts +10 -20
  13. package/dist/adapters/github/bot.d.ts.map +1 -1
  14. package/dist/adapters/github/bot.js +119 -342
  15. package/dist/adapters/github/bot.js.map +1 -1
  16. package/dist/adapters/github/client.d.ts +9 -19
  17. package/dist/adapters/github/client.d.ts.map +1 -1
  18. package/dist/adapters/github/client.js +28 -104
  19. package/dist/adapters/github/client.js.map +1 -1
  20. package/dist/adapters/github/context.d.ts.map +1 -1
  21. package/dist/adapters/github/context.js +29 -20
  22. package/dist/adapters/github/context.js.map +1 -1
  23. package/dist/adapters/github/github-ops.d.ts +2 -10
  24. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  25. package/dist/adapters/github/github-ops.js +28 -91
  26. package/dist/adapters/github/github-ops.js.map +1 -1
  27. package/dist/adapters/github/policy.d.ts +19 -0
  28. package/dist/adapters/github/policy.d.ts.map +1 -0
  29. package/dist/adapters/github/policy.js +79 -0
  30. package/dist/adapters/github/policy.js.map +1 -0
  31. package/dist/adapters/github/tool-pack.d.ts +2 -2
  32. package/dist/adapters/github/tool-pack.d.ts.map +1 -1
  33. package/dist/adapters/github/tool-pack.js +4 -9
  34. package/dist/adapters/github/tool-pack.js.map +1 -1
  35. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  36. package/dist/adapters/github/tools/checks.js +6 -8
  37. package/dist/adapters/github/tools/checks.js.map +1 -1
  38. package/dist/adapters/github/tools/pr.d.ts.map +1 -1
  39. package/dist/adapters/github/tools/pr.js +7 -9
  40. package/dist/adapters/github/tools/pr.js.map +1 -1
  41. package/dist/adapters/github/types.d.ts +66 -67
  42. package/dist/adapters/github/types.d.ts.map +1 -1
  43. package/dist/adapters/github/types.js.map +1 -1
  44. package/dist/adapters/github/webhook.d.ts +2 -1
  45. package/dist/adapters/github/webhook.d.ts.map +1 -1
  46. package/dist/adapters/github/webhook.js +46 -4
  47. package/dist/adapters/github/webhook.js.map +1 -1
  48. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  49. package/dist/adapters/progressive-renderer.js +3 -0
  50. package/dist/adapters/progressive-renderer.js.map +1 -1
  51. package/dist/adapters/shared.d.ts +3 -1
  52. package/dist/adapters/shared.d.ts.map +1 -1
  53. package/dist/adapters/shared.js +45 -23
  54. package/dist/adapters/shared.js.map +1 -1
  55. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  56. package/dist/adapters/slack/blocks.js +65 -2
  57. package/dist/adapters/slack/blocks.js.map +1 -1
  58. package/dist/adapters/slack/bot.d.ts +4 -0
  59. package/dist/adapters/slack/bot.d.ts.map +1 -1
  60. package/dist/adapters/slack/bot.js +84 -36
  61. package/dist/adapters/slack/bot.js.map +1 -1
  62. package/dist/adapters/slack/jev-context.js +2 -2
  63. package/dist/adapters/slack/jev-context.js.map +1 -1
  64. package/dist/adapters/slack/response-lifecycle.js +2 -2
  65. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  66. package/dist/adapters/slack/task-status.d.ts +3 -2
  67. package/dist/adapters/slack/task-status.d.ts.map +1 -1
  68. package/dist/adapters/slack/task-status.js +12 -15
  69. package/dist/adapters/slack/task-status.js.map +1 -1
  70. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  71. package/dist/adapters/telegram/bot.js +1 -8
  72. package/dist/adapters/telegram/bot.js.map +1 -1
  73. package/dist/adapters/web/admin/portal.js +1 -1
  74. package/dist/adapters/web/admin/portal.js.map +1 -1
  75. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -1
  76. package/dist/adapters/web/admin/provider-models.js +10 -3
  77. package/dist/adapters/web/admin/provider-models.js.map +1 -1
  78. package/dist/adapters/web/login/portal.js +6 -1
  79. package/dist/adapters/web/login/portal.js.map +1 -1
  80. package/dist/adapters/web/server.d.ts.map +1 -1
  81. package/dist/adapters/web/server.js +5 -3
  82. package/dist/adapters/web/server.js.map +1 -1
  83. package/dist/adapters/web/session-view/portal.d.ts +2 -1
  84. package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
  85. package/dist/adapters/web/session-view/portal.js +18 -27
  86. package/dist/adapters/web/session-view/portal.js.map +1 -1
  87. package/dist/cli/boot.d.ts.map +1 -1
  88. package/dist/cli/boot.js +4 -6
  89. package/dist/cli/boot.js.map +1 -1
  90. package/dist/cli/migrate.d.ts +3 -0
  91. package/dist/cli/migrate.d.ts.map +1 -0
  92. package/dist/cli/migrate.js +74 -0
  93. package/dist/cli/migrate.js.map +1 -0
  94. package/dist/cli/office.d.ts.map +1 -1
  95. package/dist/cli/office.js +8 -129
  96. package/dist/cli/office.js.map +1 -1
  97. package/dist/cli/onboard.d.ts +0 -1
  98. package/dist/cli/onboard.d.ts.map +1 -1
  99. package/dist/cli/onboard.js +4 -7
  100. package/dist/cli/onboard.js.map +1 -1
  101. package/dist/cli/types.d.ts +2 -3
  102. package/dist/cli/types.d.ts.map +1 -1
  103. package/dist/cli/types.js.map +1 -1
  104. package/dist/env-manifest.d.ts.map +1 -1
  105. package/dist/env-manifest.js +24 -22
  106. package/dist/env-manifest.js.map +1 -1
  107. package/dist/events/index.d.ts +3 -13
  108. package/dist/events/index.d.ts.map +1 -1
  109. package/dist/events/index.js +12 -58
  110. package/dist/events/index.js.map +1 -1
  111. package/dist/events/scheduler.d.ts.map +1 -1
  112. package/dist/events/scheduler.js +3 -0
  113. package/dist/events/scheduler.js.map +1 -1
  114. package/dist/file-guards.d.ts +7 -0
  115. package/dist/file-guards.d.ts.map +1 -1
  116. package/dist/file-guards.js +63 -1
  117. package/dist/file-guards.js.map +1 -1
  118. package/dist/harness/budget-stop.d.ts +3 -0
  119. package/dist/harness/budget-stop.d.ts.map +1 -0
  120. package/dist/harness/budget-stop.js +36 -0
  121. package/dist/harness/budget-stop.js.map +1 -0
  122. package/dist/harness/execution-resolver.d.ts.map +1 -1
  123. package/dist/harness/execution-resolver.js +5 -9
  124. package/dist/harness/execution-resolver.js.map +1 -1
  125. package/dist/harness/mcp.d.ts.map +1 -1
  126. package/dist/harness/mcp.js +75 -31
  127. package/dist/harness/mcp.js.map +1 -1
  128. package/dist/harness/models.js +2 -2
  129. package/dist/harness/models.js.map +1 -1
  130. package/dist/harness/open-connector.d.ts +0 -9
  131. package/dist/harness/open-connector.d.ts.map +1 -1
  132. package/dist/harness/open-connector.js +15 -69
  133. package/dist/harness/open-connector.js.map +1 -1
  134. package/dist/harness/presenter.d.ts.map +1 -1
  135. package/dist/harness/presenter.js +33 -2
  136. package/dist/harness/presenter.js.map +1 -1
  137. package/dist/harness/prompt.d.ts +1 -1
  138. package/dist/harness/prompt.d.ts.map +1 -1
  139. package/dist/harness/prompt.js +14 -32
  140. package/dist/harness/prompt.js.map +1 -1
  141. package/dist/harness/run-events.d.ts.map +1 -1
  142. package/dist/harness/run-events.js +6 -1
  143. package/dist/harness/run-events.js.map +1 -1
  144. package/dist/harness/runner.d.ts.map +1 -1
  145. package/dist/harness/runner.js +6 -9
  146. package/dist/harness/runner.js.map +1 -1
  147. package/dist/harness/session.d.ts.map +1 -1
  148. package/dist/harness/session.js +6 -0
  149. package/dist/harness/session.js.map +1 -1
  150. package/dist/harness/tools/event.d.ts.map +1 -1
  151. package/dist/harness/tools/event.js +19 -2
  152. package/dist/harness/tools/event.js.map +1 -1
  153. package/dist/harness/tools/generate-image.d.ts.map +1 -1
  154. package/dist/harness/tools/generate-image.js +17 -3
  155. package/dist/harness/tools/generate-image.js.map +1 -1
  156. package/dist/harness/tools/jev-browser.d.ts +1 -2
  157. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  158. package/dist/harness/tools/jev-browser.js +75 -50
  159. package/dist/harness/tools/jev-browser.js.map +1 -1
  160. package/dist/harness/types.d.ts +16 -0
  161. package/dist/harness/types.d.ts.map +1 -1
  162. package/dist/harness/types.js.map +1 -1
  163. package/dist/index.d.ts +2 -3
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +2 -3
  166. package/dist/index.js.map +1 -1
  167. package/dist/main.js +40 -93
  168. package/dist/main.js.map +1 -1
  169. package/dist/memory-capture/index.d.ts.map +1 -1
  170. package/dist/memory-capture/index.js +3 -3
  171. package/dist/memory-capture/index.js.map +1 -1
  172. package/dist/migrations/actor-vaults.d.ts +3 -0
  173. package/dist/migrations/actor-vaults.d.ts.map +1 -0
  174. package/dist/migrations/actor-vaults.js +43 -0
  175. package/dist/migrations/actor-vaults.js.map +1 -0
  176. package/dist/migrations/conversation-settings.d.ts +3 -0
  177. package/dist/migrations/conversation-settings.d.ts.map +1 -0
  178. package/dist/migrations/conversation-settings.js +31 -0
  179. package/dist/migrations/conversation-settings.js.map +1 -0
  180. package/dist/migrations/index.d.ts +14 -0
  181. package/dist/migrations/index.d.ts.map +1 -0
  182. package/dist/migrations/index.js +99 -0
  183. package/dist/migrations/index.js.map +1 -0
  184. package/dist/migrations/models-json.d.ts +3 -0
  185. package/dist/migrations/models-json.d.ts.map +1 -0
  186. package/dist/migrations/models-json.js +18 -0
  187. package/dist/migrations/models-json.js.map +1 -0
  188. package/dist/migrations/office-layout.d.ts +4 -0
  189. package/dist/migrations/office-layout.d.ts.map +1 -0
  190. package/dist/migrations/office-layout.js +94 -0
  191. package/dist/migrations/office-layout.js.map +1 -0
  192. package/dist/migrations/office-sessions.d.ts +3 -0
  193. package/dist/migrations/office-sessions.d.ts.map +1 -0
  194. package/dist/migrations/office-sessions.js +70 -0
  195. package/dist/migrations/office-sessions.js.map +1 -0
  196. package/dist/migrations/sandbox-containers.d.ts +3 -0
  197. package/dist/migrations/sandbox-containers.d.ts.map +1 -0
  198. package/dist/migrations/sandbox-containers.js +36 -0
  199. package/dist/migrations/sandbox-containers.js.map +1 -0
  200. package/dist/{sessions/migrate-common.d.ts → migrations/session-files.d.ts} +1 -2
  201. package/dist/migrations/session-files.d.ts.map +1 -0
  202. package/dist/{sessions/migrate-common.js → migrations/session-files.js} +2 -2
  203. package/dist/migrations/session-files.js.map +1 -0
  204. package/dist/{sessions/migrate-v3.d.ts → migrations/sessions-v3.d.ts} +4 -3
  205. package/dist/migrations/sessions-v3.d.ts.map +1 -0
  206. package/dist/{sessions/migrate-v3.js → migrations/sessions-v3.js} +14 -4
  207. package/dist/migrations/sessions-v3.js.map +1 -0
  208. package/dist/migrations/types.d.ts +30 -0
  209. package/dist/migrations/types.d.ts.map +1 -0
  210. package/dist/migrations/types.js +2 -0
  211. package/dist/migrations/types.js.map +1 -0
  212. package/dist/migrations/workspace-events.d.ts +3 -0
  213. package/dist/migrations/workspace-events.d.ts.map +1 -0
  214. package/dist/migrations/workspace-events.js +43 -0
  215. package/dist/migrations/workspace-events.js.map +1 -0
  216. package/dist/office/index.d.ts +2 -24
  217. package/dist/office/index.d.ts.map +1 -1
  218. package/dist/office/index.js +15 -579
  219. package/dist/office/index.js.map +1 -1
  220. package/dist/office/types.d.ts +0 -10
  221. package/dist/office/types.d.ts.map +1 -1
  222. package/dist/office/types.js.map +1 -1
  223. package/dist/runtime/conversation-runtime.js +12 -12
  224. package/dist/runtime/conversation-runtime.js.map +1 -1
  225. package/dist/sandbox/identity.d.ts +2 -3
  226. package/dist/sandbox/identity.d.ts.map +1 -1
  227. package/dist/sandbox/identity.js +6 -13
  228. package/dist/sandbox/identity.js.map +1 -1
  229. package/dist/sandbox/layout.d.ts +0 -2
  230. package/dist/sandbox/layout.d.ts.map +1 -1
  231. package/dist/sandbox/layout.js +2 -2
  232. package/dist/sandbox/layout.js.map +1 -1
  233. package/dist/sandbox/provisioner.d.ts +4 -38
  234. package/dist/sandbox/provisioner.d.ts.map +1 -1
  235. package/dist/sandbox/provisioner.js +32 -456
  236. package/dist/sandbox/provisioner.js.map +1 -1
  237. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  238. package/dist/sessions/chat-history-sync.js +28 -40
  239. package/dist/sessions/chat-history-sync.js.map +1 -1
  240. package/dist/sessions/session-store.d.ts.map +1 -1
  241. package/dist/sessions/session-store.js +1 -8
  242. package/dist/sessions/session-store.js.map +1 -1
  243. package/dist/sessions/store.d.ts +2 -3
  244. package/dist/sessions/store.d.ts.map +1 -1
  245. package/dist/sessions/store.js +8 -14
  246. package/dist/sessions/store.js.map +1 -1
  247. package/dist/sessions/types.d.ts +6 -15
  248. package/dist/sessions/types.d.ts.map +1 -1
  249. package/dist/sessions/types.js.map +1 -1
  250. package/dist/settings/index.d.ts +0 -48
  251. package/dist/settings/index.d.ts.map +1 -1
  252. package/dist/settings/index.js +6 -37
  253. package/dist/settings/index.js.map +1 -1
  254. package/dist/types.d.ts +0 -29
  255. package/dist/types.d.ts.map +1 -1
  256. package/dist/types.js.map +1 -1
  257. package/dist/vault/index.d.ts +0 -7
  258. package/dist/vault/index.d.ts.map +1 -1
  259. package/dist/vault/index.js +1 -36
  260. package/dist/vault/index.js.map +1 -1
  261. package/package.json +8 -6
  262. package/dist/adapters/github/repo.d.ts +0 -8
  263. package/dist/adapters/github/repo.d.ts.map +0 -1
  264. package/dist/adapters/github/repo.js +0 -92
  265. package/dist/adapters/github/repo.js.map +0 -1
  266. package/dist/adapters/github/tools/sync.d.ts +0 -13
  267. package/dist/adapters/github/tools/sync.d.ts.map +0 -1
  268. package/dist/adapters/github/tools/sync.js +0 -29
  269. package/dist/adapters/github/tools/sync.js.map +0 -1
  270. package/dist/cli/sandbox.d.ts +0 -3
  271. package/dist/cli/sandbox.d.ts.map +0 -1
  272. package/dist/cli/sandbox.js +0 -80
  273. package/dist/cli/sandbox.js.map +0 -1
  274. package/dist/cli/sessions.d.ts +0 -2
  275. package/dist/cli/sessions.d.ts.map +0 -1
  276. package/dist/cli/sessions.js +0 -78
  277. package/dist/cli/sessions.js.map +0 -1
  278. package/dist/sessions/migrate-common.d.ts.map +0 -1
  279. package/dist/sessions/migrate-common.js.map +0 -1
  280. package/dist/sessions/migrate-pi-084.d.ts +0 -7
  281. package/dist/sessions/migrate-pi-084.d.ts.map +0 -1
  282. package/dist/sessions/migrate-pi-084.js +0 -293
  283. package/dist/sessions/migrate-pi-084.js.map +0 -1
  284. package/dist/sessions/migrate-v3.d.ts.map +0 -1
  285. package/dist/sessions/migrate-v3.js.map +0 -1
  286. package/dist/settings/migrate.d.ts +0 -16
  287. package/dist/settings/migrate.d.ts.map +0 -1
  288. package/dist/settings/migrate.js +0 -70
  289. package/dist/settings/migrate.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chat-history-sync.js","sourceRoot":"","sources":["../../src/sessions/chat-history-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONTROL_INPUT_CUSTOM_TYPE, type SessionEntry } from \"./types.js\";\nimport { OFFICE_LOG_FILENAME, officeSessionsDir } from \"../office/index.js\";\nimport { SessionStore } from \"./session-store.js\";\nimport type { ConversationLogMessage } from \"../types.js\";\nimport { join } from \"node:path\";\nimport * as log from \"../log.js\";\nimport { parseJsonValue, readTextFileIfExists } from \"../file-guards.js\";\nimport {\n formatHistoryLine,\n stripHistoryLinePrefix,\n stripTriggerSignature,\n} from \"./history-line.js\";\nimport { isPlatformHistorySession } from \"./store.js\";\nimport { isThreadSessionKey } from \"./session-key.js\";\nimport {\n archiveManagedSessionFile,\n createManagedSessionFile,\n createManagedSessionFileAtPath,\n extractSessionSuffix,\n getThreadSessionFile,\n openManagedSession,\n resolveChannelSessionFile,\n resolveParentSessionForThread,\n tryResolveCurrentSession,\n tryResolveThreadSession,\n} from \"./store.js\";\n\nconst DEFAULT_RECENT_DAYS = 14;\nconst DEFAULT_MAX_TOP_LEVEL_MESSAGES = 200;\nconst CHAT_SYNC_CUSTOM_TYPE = \"mikan.chat_sync\";\n\ntype SessionAppendMessage = Parameters<SessionStore[\"appendMessage\"]>[0];\n\nimport type {\n ChatHistorySyncOptions,\n HasMaterializedSessionOptions,\n RegisterThreadSessionOptions,\n ResetChatSessionOptions,\n ResolveChatSessionScopeOptions,\n SyncChatSessionOptions,\n ThreadBootstrapWaitOptions,\n ChatSyncReport,\n LogRecord,\n ParentSessionRef,\n ResolvedSessionScope,\n ThreadRootMessage,\n} from \"./types.js\";\nimport { errorMessage, isRecord } from \"../unknown-values.js\";\n\nexport function hasMaterializedChatSession(options: HasMaterializedSessionOptions): boolean {\n if (!isThreadSessionKey(options.sessionKey)) {\n return resolveChannelSessionFile(options.conversationDir) !== null;\n }\n return (\n tryResolveThreadSession(getThreadSessionFile(options.conversationDir, options.sessionKey)) !==\n null\n );\n}\n\nexport function registerThreadSession(options: RegisterThreadSessionOptions): string | null {\n if (!isThreadSessionKey(options.sessionKey)) return null;\n\n const threadFile = getThreadSessionFile(options.conversationDir, options.sessionKey);\n return (\n tryResolveThreadSession(threadFile) ??\n createManagedSessionFileAtPath(\n threadFile,\n options.cwd ?? options.conversationDir,\n resolveParentSessionForThread(\n options.conversationDir,\n extractSessionSuffix(options.sessionKey),\n ) ?? undefined,\n )\n );\n}\n\nexport async function waitForThreadSessionBootstrap(\n options: ThreadBootstrapWaitOptions,\n): Promise<boolean> {\n const {\n parentSessionKey,\n sessionKey,\n hasThreadSession,\n isParentRunning,\n sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)),\n pollMs = 100,\n } = options;\n\n if (!isThreadSessionKey(sessionKey)) return false;\n if (sessionKey === parentSessionKey) return false;\n if (hasThreadSession()) return false;\n\n let waited = false;\n while (isParentRunning() && !hasThreadSession()) {\n waited = true;\n await sleep(pollMs);\n }\n\n return waited;\n}\n\nexport class ChatHistorySync {\n private readonly recentDays: number;\n private readonly maxTopLevelMessages: number;\n private readonly now: () => Date;\n private readonly isCommandText: (text: string) => boolean;\n\n constructor(options: ChatHistorySyncOptions) {\n this.isCommandText = options.isCommandText;\n this.recentDays = options.recentDays ?? DEFAULT_RECENT_DAYS;\n this.maxTopLevelMessages = options.maxTopLevelMessages ?? DEFAULT_MAX_TOP_LEVEL_MESSAGES;\n this.now = options.now ?? (() => new Date());\n }\n\n async resolveSessionScope(\n options: ResolveChatSessionScopeOptions,\n ): Promise<ResolvedSessionScope> {\n const cwd = options.cwd ?? options.conversationDir;\n const sessionDir = officeSessionsDir(options.conversationDir);\n\n if (!isThreadSessionKey(options.sessionKey)) {\n const contextFile = await this.resolveTopLevelSessionFile({\n conversationDir: options.conversationDir,\n sessionDir,\n cwd,\n currentMessageId: options.currentMessageId,\n });\n return { sessionDir, contextFile, threadRootMessage: null };\n }\n\n return this.resolveThreadSessionScope({\n conversationDir: options.conversationDir,\n sessionDir,\n sessionKey: options.sessionKey,\n cwd,\n currentMessageId: options.currentMessageId,\n });\n }\n\n async syncSessionManager(options: SyncChatSessionOptions): Promise<ChatSyncReport> {\n const records = readConversationLog(options.conversationDir);\n return syncSessionManagerFromLog(\n options.sessionManager,\n selectExistingSessionSyncMessages(records, {\n sessionKey: isThreadSessionKey(options.sessionKey) ? options.sessionKey : null,\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n }),\n {\n recentDays: this.recentDays,\n maxMessages: this.maxTopLevelMessages,\n now: this.now(),\n },\n );\n }\n\n async resetSession(options: ResetChatSessionOptions): Promise<string> {\n const cwd = options.cwd ?? options.conversationDir;\n const sessionFile = isThreadSessionKey(options.sessionKey)\n ? resetThreadSessionFile(options.conversationDir, options.sessionKey, cwd)\n : createManagedSessionFile(officeSessionsDir(options.conversationDir), cwd);\n const records = readConversationLog(options.conversationDir);\n const lastMessageId = latestSyncMessageId(records, {\n sessionKey: isThreadSessionKey(options.sessionKey) ? options.sessionKey : null,\n isCommandText: this.isCommandText,\n });\n const sessionManager = await openManagedSession(sessionFile, cwd);\n try {\n await sessionManager.appendCustomEntry(CHAT_SYNC_CUSTOM_TYPE, {\n source: OFFICE_LOG_FILENAME,\n messageCount: 0,\n resetAt: this.now().toISOString(),\n lastMessageId: lastMessageId ? lastMessageId : undefined,\n });\n } finally {\n await sessionManager.close();\n }\n return sessionFile;\n }\n\n private async resolveTopLevelSessionFile(options: {\n conversationDir: string;\n sessionDir: string;\n cwd: string;\n currentMessageId?: string;\n }): Promise<string> {\n const existing = tryResolveCurrentSession(options.sessionDir);\n if (existing && !isPlatformHistorySession(existing)) return existing;\n const records = readConversationLog(options.conversationDir);\n\n const sessionFile = createManagedSessionFile(options.sessionDir, options.cwd);\n const bootstrapRecords = selectRecentTopLevelMessages(records, {\n recentDays: this.recentDays,\n maxMessages: this.maxTopLevelMessages,\n now: this.now(),\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n });\n await bootstrapSessionFromLog(\n sessionFile,\n options.cwd,\n bootstrapRecords,\n latestSyncMessageId(records, {\n sessionKey: null,\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n }),\n );\n return sessionFile;\n }\n\n private async resolveThreadSessionScope(options: {\n conversationDir: string;\n sessionDir: string;\n sessionKey: string;\n cwd: string;\n currentMessageId?: string;\n }): Promise<ResolvedSessionScope> {\n const threadFile = getThreadSessionFile(options.conversationDir, options.sessionKey);\n const threadId = extractSessionSuffix(options.sessionKey);\n const records = readConversationLog(options.conversationDir);\n const threadRootMessage = buildThreadRootSeed(findLogRecordById(records, threadId)?.message);\n const existing = tryResolveThreadSession(threadFile);\n if (existing) {\n return { sessionDir: options.sessionDir, contextFile: existing, threadRootMessage };\n }\n\n createManagedSessionFileAtPath(\n threadFile,\n options.cwd,\n resolveParentSessionForThread(options.conversationDir, threadId) ?? undefined,\n );\n const bootstrapRecords = selectThreadBootstrapMessages(records, threadId, {\n recentDays: this.recentDays,\n maxTopLevelMessages: this.maxTopLevelMessages,\n now: this.now(),\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n });\n await bootstrapSessionFromLog(\n threadFile,\n options.cwd,\n bootstrapRecords,\n latestSyncMessageId(records, {\n sessionKey: options.sessionKey,\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n }),\n );\n\n return { sessionDir: options.sessionDir, contextFile: threadFile, threadRootMessage };\n }\n}\n\nfunction existingThreadParent(threadFile: string): ParentSessionRef | undefined {\n let header;\n try {\n header = SessionStore.readHeader(threadFile);\n } catch {\n return undefined;\n }\n const path = header?.parentSession;\n if (!header || !path) return undefined;\n const id = header.parentSessionId ?? readParentSessionId(path);\n return id ? { path, id } : undefined;\n}\n\nfunction readParentSessionId(parentPath: string): string | undefined {\n try {\n return SessionStore.readHeader(parentPath)?.id;\n } catch {\n return undefined;\n }\n}\n\nfunction resetThreadSessionFile(conversationDir: string, sessionKey: string, cwd: string): string {\n const threadFile = getThreadSessionFile(conversationDir, sessionKey);\n const parent =\n existingThreadParent(threadFile) ??\n resolveParentSessionForThread(conversationDir, extractSessionSuffix(sessionKey)) ??\n undefined;\n archiveManagedSessionFile(threadFile);\n return createManagedSessionFileAtPath(threadFile, cwd, parent);\n}\n\nfunction findLogRecordById(records: LogRecord[], messageId: string): LogRecord | undefined {\n for (let i = records.length - 1; i >= 0; i--) {\n if (records[i]?.message.ts === messageId) return records[i];\n }\n return undefined;\n}\n\nfunction selectRecentTopLevelMessages(\n records: LogRecord[],\n options: {\n recentDays: number;\n maxMessages: number;\n now: Date;\n excludeMessageId?: string;\n isCommandText: (text: string) => boolean;\n },\n): LogRecord[] {\n return selectRecentMessages(\n recordsBeforeCurrentMessage(records, options.excludeMessageId).filter((record) =>\n isTopLevelHistoryMessage(record.message, options),\n ),\n options,\n );\n}\n\nfunction selectRecentMessages(records: LogRecord[], options: HistoryWindow): LogRecord[] {\n const sinceMs = options.now.getTime() - options.recentDays * 24 * 60 * 60 * 1000;\n return records\n .filter((record) => isRecentHistoryMessage(record.message, sinceMs))\n .slice(-options.maxMessages);\n}\n\nfunction selectThreadBootstrapMessages(\n records: LogRecord[],\n threadId: string,\n options: {\n recentDays: number;\n maxTopLevelMessages: number;\n now: Date;\n excludeMessageId?: string;\n isCommandText: (text: string) => boolean;\n },\n): LogRecord[] {\n const scopedRecords = recordsBeforeCurrentMessage(records, options.excludeMessageId);\n const rootRecord = findLogRecordById(scopedRecords, threadId);\n const topLevelSource = rootRecord\n ? scopedRecords.filter((record) => record.index <= rootRecord.index)\n : scopedRecords;\n const topLevelRecords = selectRecentTopLevelMessages(topLevelSource, {\n recentDays: options.recentDays,\n maxMessages: options.maxTopLevelMessages,\n now: options.now,\n excludeMessageId: options.excludeMessageId,\n isCommandText: options.isCommandText,\n });\n const threadRecords = scopedRecords.filter(\n (record) =>\n isRenderableConversationMessage(record.message, options) &&\n (record.message.ts === threadId || record.message.threadTs === threadId),\n );\n\n return dedupeAndSortRecords([...topLevelRecords, ...threadRecords]);\n}\n\nfunction isTopLevelHistoryMessage(\n message: ConversationLogMessage,\n filter: RenderableMessageFilter,\n): boolean {\n if (!isRenderableConversationMessage(message, filter)) return false;\n return !message.threadTs;\n}\n\nfunction isRecentHistoryMessage(message: ConversationLogMessage, sinceMs: number): boolean {\n if (!message.date) return true;\n const dateMs = new Date(message.date).getTime();\n return !Number.isFinite(dateMs) || dateMs >= sinceMs;\n}\n\nfunction selectExistingSessionSyncMessages(\n records: LogRecord[],\n options: RenderableMessageFilter & { sessionKey: string | null },\n): LogRecord[] {\n const threadId = options.sessionKey ? extractSessionSuffix(options.sessionKey) : null;\n return dedupeAndSortRecords(\n recordsBeforeCurrentMessage(records, options.excludeMessageId).filter((record) => {\n if (!isRenderableConversationMessage(record.message, options)) return false;\n if (!threadId) return !record.message.threadTs;\n return record.message.ts === threadId || record.message.threadTs === threadId;\n }),\n );\n}\n\nfunction recordsBeforeCurrentMessage(records: LogRecord[], currentMessageId?: string): LogRecord[] {\n if (!currentMessageId) return records;\n const currentRecord = findLogRecordById(records, currentMessageId);\n if (!currentRecord) return records;\n return records.filter((record) => record.index < currentRecord.index);\n}\n\nfunction latestSyncMessageId(\n records: LogRecord[],\n options: RenderableMessageFilter & { sessionKey: string | null },\n): string | undefined {\n return selectExistingSessionSyncMessages(records, options).at(-1)?.message.ts;\n}\n\ninterface RenderableMessageFilter {\n excludeMessageId?: string;\n isCommandText: (text: string) => boolean;\n}\n\nfunction isRenderableConversationMessage(\n message: ConversationLogMessage,\n filter: RenderableMessageFilter,\n): boolean {\n if (filter.excludeMessageId && message.ts === filter.excludeMessageId) return false;\n if (!message.isMessagingBot && filter.isCommandText(message.text ?? \"\")) return false;\n return !!message.text?.trim();\n}\n\nfunction dedupeAndSortRecords(records: LogRecord[]): LogRecord[] {\n const byKey = new Map<string, LogRecord>();\n for (const record of records) {\n byKey.set(record.message.ts ?? `line:${record.index}`, record);\n }\n\n return Array.from(byKey.values()).toSorted((a, b) => {\n const aTime = sortTime(a);\n const bTime = sortTime(b);\n if (aTime !== bTime) return aTime - bTime;\n return a.index - b.index;\n });\n}\n\nfunction sortTime(record: LogRecord): number {\n if (record.message.date) {\n const dateMs = new Date(record.message.date).getTime();\n if (Number.isFinite(dateMs)) return dateMs;\n }\n\n if (record.message.ts) {\n const tsMs = Number(record.message.ts) * 1000;\n if (Number.isFinite(tsMs)) return tsMs;\n }\n\n return record.index;\n}\n\nasync function bootstrapSessionFromLog(\n sessionFile: string,\n cwd: string,\n records: LogRecord[],\n lastMessageId = records.at(-1)?.message.ts,\n): Promise<void> {\n if (records.length === 0 && !lastMessageId) return;\n\n const sessionManager = await openManagedSession(sessionFile, cwd);\n try {\n await appendLogRecordsToSession(sessionManager, records);\n await sessionManager.appendCustomEntry(CHAT_SYNC_CUSTOM_TYPE, {\n source: OFFICE_LOG_FILENAME,\n messageCount: records.length,\n lastMessageId,\n });\n } finally {\n await sessionManager.close();\n }\n}\n\ninterface HistoryWindow {\n recentDays: number;\n maxMessages: number;\n now: Date;\n}\n\nasync function syncSessionManagerFromLog(\n sessionManager: SessionStore,\n records: LogRecord[],\n historyWindow: HistoryWindow,\n): Promise<ChatSyncReport> {\n if (records.length === 0) return { appended: 0 };\n\n const existingEntries = await sessionManager.getEntries();\n const resetAt = getLatestChatSyncResetAt(existingEntries);\n const controlledIds = new Set(\n existingEntries.flatMap((entry) => {\n if (\n entry.type !== \"custom\" ||\n entry.customType !== CONTROL_INPUT_CUSTOM_TYPE ||\n !isRecord(entry.data)\n )\n return [];\n return typeof entry.data.messageId === \"string\" ? [entry.data.messageId] : [];\n }),\n );\n const eligibleRecords = records.filter(\n (record) =>\n !controlledIds.has(record.message.ts ?? \"\") && (!resetAt || isAfterReset(record, resetAt)),\n );\n const lastSyncedMessageId = getLatestChatSyncMessageId(existingEntries);\n const lastSyncedIndex = lastSyncedMessageId\n ? eligibleRecords.findIndex((record) => record.message.ts === lastSyncedMessageId)\n : -1;\n const syncCandidates = selectRecentMessages(\n eligibleRecords.slice(lastSyncedIndex + 1),\n historyWindow,\n );\n if (syncCandidates.length === 0) return { appended: 0 };\n\n const represented = buildRepresentedMessageCounts(existingEntries);\n const newRecords = syncCandidates.filter(\n (record) => !consumeRepresentedLogMessage(record, represented),\n );\n if (newRecords.length === 0) return { appended: 0 };\n\n const lastMessageId = syncCandidates.at(-1)?.message.ts;\n await appendLogRecordsToSession(sessionManager, newRecords);\n await sessionManager.appendCustomEntry(CHAT_SYNC_CUSTOM_TYPE, {\n source: OFFICE_LOG_FILENAME,\n messageCount: newRecords.length,\n lastMessageId,\n });\n return {\n appended: newRecords.length,\n lastMessageId,\n };\n}\n\nasync function appendLogRecordsToSession(\n sessionManager: SessionStore,\n records: LogRecord[],\n): Promise<void> {\n for (const record of records) {\n const message = buildHistorySessionMessage(record.message);\n if (message) await sessionManager.appendMessage(message);\n }\n}\n\nfunction isChatSyncMarker(entry: SessionEntry): entry is Extract<SessionEntry, { type: \"custom\" }> {\n return entry.type === \"custom\" && entry.customType === CHAT_SYNC_CUSTOM_TYPE;\n}\n\nfunction markerResetAt(entry: SessionEntry): number | undefined {\n if (!isChatSyncMarker(entry)) return undefined;\n if (!isRecord(entry.data) || typeof entry.data.resetAt !== \"string\") return undefined;\n const resetAt = new Date(entry.data.resetAt).getTime();\n return Number.isFinite(resetAt) ? resetAt : undefined;\n}\n\nfunction getLatestChatSyncResetAt(entries: SessionEntry[]): number | undefined {\n for (const entry of entries.toReversed()) {\n const resetAt = markerResetAt(entry);\n if (resetAt !== undefined) return resetAt;\n }\n return undefined;\n}\n\nfunction isAfterReset(record: LogRecord, resetAt: number): boolean {\n if (!record.message.date) return false;\n const messageTime = new Date(record.message.date).getTime();\n return Number.isFinite(messageTime) && messageTime >= resetAt;\n}\n\nfunction getLatestChatSyncMessageId(entries: SessionEntry[]): string | undefined {\n const marker = entries.toReversed().find(isChatSyncMarker);\n const lastMessageId = isRecord(marker?.data) ? marker.data.lastMessageId : undefined;\n return typeof lastMessageId === \"string\" ? lastMessageId : undefined;\n}\n\nfunction buildRepresentedMessageCounts(entries: SessionEntry[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const entry of entries) {\n const comparable = comparableSessionMessage(entry);\n if (!comparable) continue;\n counts.set(comparable, (counts.get(comparable) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction consumeRepresentedLogMessage(record: LogRecord, counts: Map<string, number>): boolean {\n const comparable = comparableLogMessage(record.message);\n if (!comparable) return false;\n\n const key = counts.get(comparable) ? comparable : presentedAnswerKey(comparable, counts);\n if (!key) return false;\n counts.set(key, (counts.get(key) ?? 0) - 1);\n return true;\n}\n\nfunction presentedAnswerKey(comparable: string, counts: Map<string, number>): string | undefined {\n if (!comparable.startsWith(ASSISTANT_KEY_PREFIX)) return undefined;\n const posted = comparable.slice(ASSISTANT_KEY_PREFIX.length);\n for (const [key, count] of counts) {\n if (count <= 0 || !key.startsWith(ASSISTANT_KEY_PREFIX)) continue;\n const answer = key.slice(ASSISTANT_KEY_PREFIX.length);\n if (posted.endsWith(`\\n\\n${answer}`)) return key;\n }\n return undefined;\n}\n\nconst ASSISTANT_KEY_PREFIX = \"assistant:\";\n\nfunction comparableSessionMessage(entry: SessionEntry): string | null {\n if (entry.type !== \"message\") return null;\n const role = entry.message.role;\n if (role !== \"user\" && role !== \"assistant\") return null;\n\n const raw = getSessionMessageText(entry);\n const text = normalizeComparableText(role === \"assistant\" ? stripTriggerSignature(raw) : raw);\n if (!text) return null;\n return `${role}:${text}`;\n}\n\nfunction comparableLogMessage(message: ConversationLogMessage): string | null {\n const text = historyMessageText(message);\n if (!text) return null;\n return `${message.isMessagingBot ? \"assistant\" : \"user\"}:${normalizeComparableText(text)}`;\n}\n\nfunction historyMessageText(message: ConversationLogMessage): string {\n const text = message.text?.trim() ?? \"\";\n return message.isMessagingBot ? stripTriggerSignature(text) : text;\n}\n\nfunction getSessionMessageText(entry: SessionEntry): string {\n if (entry.type !== \"message\" || !(\"content\" in entry.message)) return \"\";\n const content = entry.message.content;\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .map((part) => (part.type === \"text\" && \"text\" in part ? part.text : \"\"))\n .join(\"\\n\");\n}\n\nconst normalizeComparableText = stripHistoryLinePrefix;\n\nfunction buildHistorySessionMessage(message: ConversationLogMessage): SessionAppendMessage | null {\n const text = historyMessageText(message);\n if (!text) return null;\n\n const timestamp = parseMessageTimestamp(message);\n if (!message.isMessagingBot) {\n return {\n role: \"user\",\n content: [{ type: \"text\", text: formatHistoryMessage(message) }],\n timestamp,\n } as SessionAppendMessage;\n }\n\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n api: \"platform-history\",\n provider: \"platform-history\",\n model: \"platform-history\",\n usage: zeroUsage(),\n stopReason: \"stop\",\n timestamp,\n } as SessionAppendMessage;\n}\n\nfunction buildThreadRootSeed(\n message: ConversationLogMessage | undefined,\n): ThreadRootMessage | null {\n if (!message) return null;\n return {\n text: message.text,\n userName: message.userName,\n user: message.user,\n loggedAt: message.date ? new Date(message.date).getTime() : undefined,\n isMessagingBot: message.isMessagingBot,\n };\n}\n\nfunction parseMessageTimestamp(message: ConversationLogMessage): number | undefined {\n if (message.date) {\n const dateMs = new Date(message.date).getTime();\n if (Number.isFinite(dateMs)) return dateMs;\n }\n\n if (message.ts) {\n const tsMs = Number(message.ts) * 1000;\n if (Number.isFinite(tsMs)) return tsMs;\n }\n\n return undefined;\n}\n\nfunction formatHistoryMessage(message: ConversationLogMessage): string {\n return formatHistoryLine({\n date: message.date ? new Date(message.date) : undefined,\n userName: message.userName || message.user,\n text: message.text?.trim() ?? \"\",\n });\n}\n\nfunction zeroUsage(): object {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\nfunction readConversationLog(conversationDir: string): LogRecord[] {\n const logFile = join(conversationDir, OFFICE_LOG_FILENAME);\n const raw = readTextFileIfExists(logFile);\n if (raw === undefined) return [];\n\n const records: LogRecord[] = [];\n for (const [index, line] of raw.trim().split(\"\\n\").filter(Boolean).entries()) {\n const message = parseLogLine(line, logFile, index + 1);\n if (message) records.push({ message, index });\n }\n return coalesceMessagingBotLogChunks(records);\n}\n\nfunction parseLogLine(\n line: string,\n logFile: string,\n lineNumber: number,\n): ConversationLogMessage | undefined {\n try {\n return parseJsonValue(\n line,\n (value): value is ConversationLogMessage => isRecord(value),\n (detail, kind) => (kind === \"shape\" ? \"expected a JSON object\" : detail),\n );\n } catch (err) {\n log.logWarning(`Skipping malformed log entry at ${logFile}:${lineNumber}`, errorMessage(err));\n return undefined;\n }\n}\n\nfunction coalesceMessagingBotLogChunks(records: LogRecord[]): LogRecord[] {\n const coalesced: LogRecord[] = [];\n for (const record of records) {\n const previous = coalesced.at(-1);\n if (previous && canCoalesceMessagingBotLogChunk(previous.message, record.message)) {\n previous.message.text = `${previous.message.text ?? \"\"}${record.message.text ?? \"\"}`;\n continue;\n }\n coalesced.push({ ...record, message: { ...record.message } });\n }\n return coalesced;\n}\n\nfunction canCoalesceMessagingBotLogChunk(\n previous: ConversationLogMessage,\n current: ConversationLogMessage,\n): boolean {\n return (\n previous.isMessagingBot === true &&\n current.isMessagingBot === true &&\n !!previous.ts &&\n previous.ts === current.ts &&\n previous.threadTs === current.threadTs &&\n previous.user === current.user\n );\n}\n"]}
1
+ {"version":3,"file":"chat-history-sync.js","sourceRoot":"","sources":["../../src/sessions/chat-history-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONTROL_INPUT_CUSTOM_TYPE, type SessionEntry } from \"./types.js\";\nimport { OFFICE_LOG_FILENAME } from \"../office/index.js\";\nimport type { Office } from \"../office/types.js\";\nimport { SessionStore } from \"./session-store.js\";\nimport type { ConversationLogMessage } from \"../types.js\";\nimport * as log from \"../log.js\";\nimport { parseJsonValue, readTextFileNoFollowIfExists } from \"../file-guards.js\";\nimport {\n formatHistoryLine,\n stripHistoryLinePrefix,\n stripTriggerSignature,\n} from \"./history-line.js\";\nimport { isPlatformHistorySession } from \"./store.js\";\nimport { isThreadSessionKey } from \"./session-key.js\";\nimport {\n archiveManagedSessionFile,\n createManagedSessionFile,\n createManagedSessionFileAtPath,\n extractSessionSuffix,\n getThreadSessionFile,\n openManagedSession,\n resolveParentSessionForThread,\n tryResolveCurrentSession,\n tryResolveThreadSession,\n} from \"./store.js\";\n\nconst DEFAULT_RECENT_DAYS = 14;\nconst DEFAULT_MAX_TOP_LEVEL_MESSAGES = 200;\nconst CHAT_SYNC_CUSTOM_TYPE = \"mikan.chat_sync\";\n\ntype SessionAppendMessage = Parameters<SessionStore[\"appendMessage\"]>[0];\n\nimport type {\n ChatHistorySyncOptions,\n HasMaterializedSessionOptions,\n RegisterThreadSessionOptions,\n ResetChatSessionOptions,\n ResolveChatSessionScopeOptions,\n SyncChatSessionOptions,\n ThreadBootstrapWaitOptions,\n ChatSyncReport,\n LogRecord,\n ParentSessionRef,\n ResolvedSessionScope,\n ThreadRootMessage,\n} from \"./types.js\";\nimport { errorMessage, isRecord } from \"../unknown-values.js\";\n\nexport function hasMaterializedChatSession(options: HasMaterializedSessionOptions): boolean {\n if (!isThreadSessionKey(options.sessionKey)) {\n return tryResolveCurrentSession(options.office.sessionsDir) !== null;\n }\n return (\n tryResolveThreadSession(\n getThreadSessionFile(options.office.sessionsDir, options.sessionKey),\n ) !== null\n );\n}\n\nexport function registerThreadSession(options: RegisterThreadSessionOptions): string | null {\n if (!isThreadSessionKey(options.sessionKey)) return null;\n\n const threadFile = getThreadSessionFile(options.office.sessionsDir, options.sessionKey);\n return (\n tryResolveThreadSession(threadFile) ??\n createManagedSessionFileAtPath(\n threadFile,\n options.cwd ?? options.office.dir,\n resolveParentSessionForThread(\n options.office.sessionsDir,\n extractSessionSuffix(options.sessionKey),\n ) ?? undefined,\n )\n );\n}\n\nexport async function waitForThreadSessionBootstrap(\n options: ThreadBootstrapWaitOptions,\n): Promise<boolean> {\n const {\n parentSessionKey,\n sessionKey,\n hasThreadSession,\n isParentRunning,\n sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)),\n pollMs = 100,\n } = options;\n\n if (!isThreadSessionKey(sessionKey)) return false;\n if (sessionKey === parentSessionKey) return false;\n if (hasThreadSession()) return false;\n\n let waited = false;\n while (isParentRunning() && !hasThreadSession()) {\n waited = true;\n await sleep(pollMs);\n }\n\n return waited;\n}\n\nexport class ChatHistorySync {\n private readonly recentDays: number;\n private readonly maxTopLevelMessages: number;\n private readonly now: () => Date;\n private readonly isCommandText: (text: string) => boolean;\n\n constructor(options: ChatHistorySyncOptions) {\n this.isCommandText = options.isCommandText;\n this.recentDays = options.recentDays ?? DEFAULT_RECENT_DAYS;\n this.maxTopLevelMessages = options.maxTopLevelMessages ?? DEFAULT_MAX_TOP_LEVEL_MESSAGES;\n this.now = options.now ?? (() => new Date());\n }\n\n async resolveSessionScope(\n options: ResolveChatSessionScopeOptions,\n ): Promise<ResolvedSessionScope> {\n const cwd = options.cwd ?? options.office.dir;\n const sessionDir = options.office.sessionsDir;\n\n if (!isThreadSessionKey(options.sessionKey)) {\n const contextFile = await this.resolveTopLevelSessionFile({\n office: options.office,\n sessionDir,\n cwd,\n currentMessageId: options.currentMessageId,\n });\n return { sessionDir, contextFile, threadRootMessage: null };\n }\n\n return this.resolveThreadSessionScope({\n office: options.office,\n sessionDir,\n sessionKey: options.sessionKey,\n cwd,\n currentMessageId: options.currentMessageId,\n });\n }\n\n async syncSessionManager(options: SyncChatSessionOptions): Promise<ChatSyncReport> {\n const records = readConversationLog(options.office);\n return syncSessionManagerFromLog(\n options.sessionManager,\n selectExistingSessionSyncMessages(records, {\n sessionKey: isThreadSessionKey(options.sessionKey) ? options.sessionKey : null,\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n }),\n {\n recentDays: this.recentDays,\n maxMessages: this.maxTopLevelMessages,\n now: this.now(),\n },\n );\n }\n\n async resetSession(options: ResetChatSessionOptions): Promise<string> {\n const cwd = options.cwd ?? options.office.dir;\n const sessionFile = isThreadSessionKey(options.sessionKey)\n ? resetThreadSessionFile(options.office.sessionsDir, options.sessionKey, cwd)\n : createManagedSessionFile(options.office.sessionsDir, cwd);\n const records = readConversationLog(options.office);\n const lastMessageId = latestSyncMessageId(records, {\n sessionKey: isThreadSessionKey(options.sessionKey) ? options.sessionKey : null,\n isCommandText: this.isCommandText,\n });\n const sessionManager = await openManagedSession(sessionFile, cwd);\n try {\n await sessionManager.appendCustomEntry(CHAT_SYNC_CUSTOM_TYPE, {\n source: OFFICE_LOG_FILENAME,\n messageCount: 0,\n resetAt: this.now().toISOString(),\n lastMessageId: lastMessageId ? lastMessageId : undefined,\n });\n } finally {\n await sessionManager.close();\n }\n return sessionFile;\n }\n\n private async resolveTopLevelSessionFile(options: {\n office: Office;\n sessionDir: string;\n cwd: string;\n currentMessageId?: string;\n }): Promise<string> {\n const existing = tryResolveCurrentSession(options.sessionDir);\n if (existing && !isPlatformHistorySession(existing)) return existing;\n const records = readConversationLog(options.office);\n\n const sessionFile = createManagedSessionFile(options.sessionDir, options.cwd);\n const bootstrapRecords = selectRecentTopLevelMessages(records, {\n recentDays: this.recentDays,\n maxMessages: this.maxTopLevelMessages,\n now: this.now(),\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n });\n await bootstrapSessionFromLog(\n sessionFile,\n options.cwd,\n bootstrapRecords,\n latestSyncMessageId(records, {\n sessionKey: null,\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n }),\n );\n return sessionFile;\n }\n\n private async resolveThreadSessionScope(options: {\n office: Office;\n sessionDir: string;\n sessionKey: string;\n cwd: string;\n currentMessageId?: string;\n }): Promise<ResolvedSessionScope> {\n const threadFile = getThreadSessionFile(options.sessionDir, options.sessionKey);\n const threadId = extractSessionSuffix(options.sessionKey);\n const records = readConversationLog(options.office);\n const threadRootMessage = buildThreadRootSeed(findLogRecordById(records, threadId)?.message);\n const existing = tryResolveThreadSession(threadFile);\n if (existing) {\n return { sessionDir: options.sessionDir, contextFile: existing, threadRootMessage };\n }\n\n createManagedSessionFileAtPath(\n threadFile,\n options.cwd,\n resolveParentSessionForThread(options.sessionDir, threadId) ?? undefined,\n );\n const bootstrapRecords = selectThreadBootstrapMessages(records, threadId, {\n recentDays: this.recentDays,\n maxTopLevelMessages: this.maxTopLevelMessages,\n now: this.now(),\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n });\n await bootstrapSessionFromLog(\n threadFile,\n options.cwd,\n bootstrapRecords,\n latestSyncMessageId(records, {\n sessionKey: options.sessionKey,\n excludeMessageId: options.currentMessageId,\n isCommandText: this.isCommandText,\n }),\n );\n\n return { sessionDir: options.sessionDir, contextFile: threadFile, threadRootMessage };\n }\n}\n\nfunction existingThreadParent(threadFile: string): ParentSessionRef | undefined {\n let header;\n try {\n header = SessionStore.readHeader(threadFile);\n } catch {\n return undefined;\n }\n const path = header?.parentSession;\n const id = header?.parentSessionId;\n return path && id ? { path, id } : undefined;\n}\n\nfunction resetThreadSessionFile(sessionsDir: string, sessionKey: string, cwd: string): string {\n const threadFile = getThreadSessionFile(sessionsDir, sessionKey);\n const parent =\n existingThreadParent(threadFile) ??\n resolveParentSessionForThread(sessionsDir, extractSessionSuffix(sessionKey)) ??\n undefined;\n archiveManagedSessionFile(threadFile);\n return createManagedSessionFileAtPath(threadFile, cwd, parent);\n}\n\nfunction findLogRecordById(records: LogRecord[], messageId: string): LogRecord | undefined {\n for (let i = records.length - 1; i >= 0; i--) {\n if (records[i]?.message.ts === messageId) return records[i];\n }\n return undefined;\n}\n\nfunction selectRecentTopLevelMessages(\n records: LogRecord[],\n options: {\n recentDays: number;\n maxMessages: number;\n now: Date;\n excludeMessageId?: string;\n isCommandText: (text: string) => boolean;\n },\n): LogRecord[] {\n return selectRecentMessages(\n recordsBeforeCurrentMessage(records, options.excludeMessageId).filter((record) =>\n isTopLevelHistoryMessage(record.message, options),\n ),\n options,\n );\n}\n\nfunction selectRecentMessages(records: LogRecord[], options: HistoryWindow): LogRecord[] {\n const sinceMs = options.now.getTime() - options.recentDays * 24 * 60 * 60 * 1000;\n return records\n .filter((record) => isRecentHistoryMessage(record.message, sinceMs))\n .slice(-options.maxMessages);\n}\n\nfunction selectThreadBootstrapMessages(\n records: LogRecord[],\n threadId: string,\n options: {\n recentDays: number;\n maxTopLevelMessages: number;\n now: Date;\n excludeMessageId?: string;\n isCommandText: (text: string) => boolean;\n },\n): LogRecord[] {\n const scopedRecords = recordsBeforeCurrentMessage(records, options.excludeMessageId);\n const rootRecord = findLogRecordById(scopedRecords, threadId);\n const topLevelSource = rootRecord\n ? scopedRecords.filter((record) => record.index <= rootRecord.index)\n : scopedRecords;\n const topLevelRecords = selectRecentTopLevelMessages(topLevelSource, {\n recentDays: options.recentDays,\n maxMessages: options.maxTopLevelMessages,\n now: options.now,\n excludeMessageId: options.excludeMessageId,\n isCommandText: options.isCommandText,\n });\n const threadRecords = scopedRecords.filter(\n (record) =>\n isRenderableConversationMessage(record.message, options) &&\n (record.message.ts === threadId || record.message.threadTs === threadId),\n );\n\n return dedupeAndSortRecords([...topLevelRecords, ...threadRecords]);\n}\n\nfunction isTopLevelHistoryMessage(\n message: ConversationLogMessage,\n filter: RenderableMessageFilter,\n): boolean {\n if (!isRenderableConversationMessage(message, filter)) return false;\n return !message.threadTs;\n}\n\nfunction isRecentHistoryMessage(message: ConversationLogMessage, sinceMs: number): boolean {\n if (!message.date) return true;\n const dateMs = new Date(message.date).getTime();\n return !Number.isFinite(dateMs) || dateMs >= sinceMs;\n}\n\nfunction selectExistingSessionSyncMessages(\n records: LogRecord[],\n options: RenderableMessageFilter & { sessionKey: string | null },\n): LogRecord[] {\n const threadId = options.sessionKey ? extractSessionSuffix(options.sessionKey) : null;\n return dedupeAndSortRecords(\n recordsBeforeCurrentMessage(records, options.excludeMessageId).filter((record) => {\n if (!isRenderableConversationMessage(record.message, options)) return false;\n if (!threadId) return !record.message.threadTs;\n return record.message.ts === threadId || record.message.threadTs === threadId;\n }),\n );\n}\n\nfunction recordsBeforeCurrentMessage(records: LogRecord[], currentMessageId?: string): LogRecord[] {\n if (!currentMessageId) return records;\n const currentRecord = findLogRecordById(records, currentMessageId);\n if (!currentRecord) return records;\n return records.filter((record) => record.index < currentRecord.index);\n}\n\nfunction latestSyncMessageId(\n records: LogRecord[],\n options: RenderableMessageFilter & { sessionKey: string | null },\n): string | undefined {\n return selectExistingSessionSyncMessages(records, options).at(-1)?.message.ts;\n}\n\ninterface RenderableMessageFilter {\n excludeMessageId?: string;\n isCommandText: (text: string) => boolean;\n}\n\nfunction isRenderableConversationMessage(\n message: ConversationLogMessage,\n filter: RenderableMessageFilter,\n): boolean {\n if (filter.excludeMessageId && message.ts === filter.excludeMessageId) return false;\n if (!message.isMessagingBot && filter.isCommandText(message.text ?? \"\")) return false;\n return !!message.text?.trim();\n}\n\nfunction dedupeAndSortRecords(records: LogRecord[]): LogRecord[] {\n const byKey = new Map<string, LogRecord>();\n for (const record of records) {\n byKey.set(record.message.ts ?? `line:${record.index}`, record);\n }\n\n return Array.from(byKey.values()).toSorted((a, b) => {\n const aTime = sortTime(a);\n const bTime = sortTime(b);\n if (aTime !== bTime) return aTime - bTime;\n return a.index - b.index;\n });\n}\n\nfunction sortTime(record: LogRecord): number {\n if (record.message.date) {\n const dateMs = new Date(record.message.date).getTime();\n if (Number.isFinite(dateMs)) return dateMs;\n }\n\n if (record.message.ts) {\n const tsMs = Number(record.message.ts) * 1000;\n if (Number.isFinite(tsMs)) return tsMs;\n }\n\n return record.index;\n}\n\nasync function bootstrapSessionFromLog(\n sessionFile: string,\n cwd: string,\n records: LogRecord[],\n lastMessageId = records.at(-1)?.message.ts,\n): Promise<void> {\n if (records.length === 0 && !lastMessageId) return;\n\n const sessionManager = await openManagedSession(sessionFile, cwd);\n try {\n await appendLogRecordsToSession(sessionManager, records);\n await sessionManager.appendCustomEntry(CHAT_SYNC_CUSTOM_TYPE, {\n source: OFFICE_LOG_FILENAME,\n messageCount: records.length,\n lastMessageId,\n });\n } finally {\n await sessionManager.close();\n }\n}\n\ninterface HistoryWindow {\n recentDays: number;\n maxMessages: number;\n now: Date;\n}\n\nasync function syncSessionManagerFromLog(\n sessionManager: SessionStore,\n records: LogRecord[],\n historyWindow: HistoryWindow,\n): Promise<ChatSyncReport> {\n if (records.length === 0) return { appended: 0 };\n\n const existingEntries = await sessionManager.getEntries();\n const resetAt = getLatestChatSyncResetAt(existingEntries);\n const controlledIds = new Set(\n existingEntries.flatMap((entry) => {\n if (\n entry.type !== \"custom\" ||\n entry.customType !== CONTROL_INPUT_CUSTOM_TYPE ||\n !isRecord(entry.data)\n )\n return [];\n return typeof entry.data.messageId === \"string\" ? [entry.data.messageId] : [];\n }),\n );\n const eligibleRecords = records.filter(\n (record) =>\n !controlledIds.has(record.message.ts ?? \"\") && (!resetAt || isAfterReset(record, resetAt)),\n );\n const lastSyncedMessageId = getLatestChatSyncMessageId(existingEntries);\n const lastSyncedIndex = lastSyncedMessageId\n ? eligibleRecords.findIndex((record) => record.message.ts === lastSyncedMessageId)\n : -1;\n const syncCandidates = selectRecentMessages(\n eligibleRecords.slice(lastSyncedIndex + 1),\n historyWindow,\n );\n if (syncCandidates.length === 0) return { appended: 0 };\n\n const represented = buildRepresentedMessageCounts(existingEntries);\n const newRecords = syncCandidates.filter(\n (record) => !consumeRepresentedLogMessage(record, represented),\n );\n if (newRecords.length === 0) return { appended: 0 };\n\n const lastMessageId = syncCandidates.at(-1)?.message.ts;\n await appendLogRecordsToSession(sessionManager, newRecords);\n await sessionManager.appendCustomEntry(CHAT_SYNC_CUSTOM_TYPE, {\n source: OFFICE_LOG_FILENAME,\n messageCount: newRecords.length,\n lastMessageId,\n });\n return {\n appended: newRecords.length,\n lastMessageId,\n };\n}\n\nasync function appendLogRecordsToSession(\n sessionManager: SessionStore,\n records: LogRecord[],\n): Promise<void> {\n for (const record of records) {\n const message = buildHistorySessionMessage(record.message);\n if (message) await sessionManager.appendMessage(message);\n }\n}\n\nfunction isChatSyncMarker(entry: SessionEntry): entry is Extract<SessionEntry, { type: \"custom\" }> {\n return entry.type === \"custom\" && entry.customType === CHAT_SYNC_CUSTOM_TYPE;\n}\n\nfunction markerResetAt(entry: SessionEntry): number | undefined {\n if (!isChatSyncMarker(entry)) return undefined;\n if (!isRecord(entry.data) || typeof entry.data.resetAt !== \"string\") return undefined;\n const resetAt = new Date(entry.data.resetAt).getTime();\n return Number.isFinite(resetAt) ? resetAt : undefined;\n}\n\nfunction getLatestChatSyncResetAt(entries: SessionEntry[]): number | undefined {\n for (const entry of entries.toReversed()) {\n const resetAt = markerResetAt(entry);\n if (resetAt !== undefined) return resetAt;\n }\n return undefined;\n}\n\nfunction isAfterReset(record: LogRecord, resetAt: number): boolean {\n if (!record.message.date) return false;\n const messageTime = new Date(record.message.date).getTime();\n return Number.isFinite(messageTime) && messageTime >= resetAt;\n}\n\nfunction getLatestChatSyncMessageId(entries: SessionEntry[]): string | undefined {\n const marker = entries.toReversed().find(isChatSyncMarker);\n const lastMessageId = isRecord(marker?.data) ? marker.data.lastMessageId : undefined;\n return typeof lastMessageId === \"string\" ? lastMessageId : undefined;\n}\n\nfunction buildRepresentedMessageCounts(entries: SessionEntry[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const entry of entries) {\n const comparable = comparableSessionMessage(entry);\n if (!comparable) continue;\n counts.set(comparable, (counts.get(comparable) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction consumeRepresentedLogMessage(record: LogRecord, counts: Map<string, number>): boolean {\n const comparable = comparableLogMessage(record.message);\n if (!comparable) return false;\n\n const key = counts.get(comparable) ? comparable : presentedAnswerKey(comparable, counts);\n if (!key) return false;\n counts.set(key, (counts.get(key) ?? 0) - 1);\n return true;\n}\n\nfunction presentedAnswerKey(comparable: string, counts: Map<string, number>): string | undefined {\n if (!comparable.startsWith(ASSISTANT_KEY_PREFIX)) return undefined;\n const posted = comparable.slice(ASSISTANT_KEY_PREFIX.length);\n for (const [key, count] of counts) {\n if (count <= 0 || !key.startsWith(ASSISTANT_KEY_PREFIX)) continue;\n const answer = key.slice(ASSISTANT_KEY_PREFIX.length);\n if (posted.endsWith(`\\n\\n${answer}`)) return key;\n }\n return undefined;\n}\n\nconst ASSISTANT_KEY_PREFIX = \"assistant:\";\n\nfunction comparableSessionMessage(entry: SessionEntry): string | null {\n if (entry.type !== \"message\") return null;\n const role = entry.message.role;\n if (role !== \"user\" && role !== \"assistant\") return null;\n\n const raw = getSessionMessageText(entry);\n const text = normalizeComparableText(role === \"assistant\" ? stripTriggerSignature(raw) : raw);\n if (!text) return null;\n return `${role}:${text}`;\n}\n\nfunction comparableLogMessage(message: ConversationLogMessage): string | null {\n const text = historyMessageText(message);\n if (!text) return null;\n return `${message.isMessagingBot ? \"assistant\" : \"user\"}:${normalizeComparableText(text)}`;\n}\n\nfunction historyMessageText(message: ConversationLogMessage): string {\n const text = message.text?.trim() ?? \"\";\n return message.isMessagingBot ? stripTriggerSignature(text) : text;\n}\n\nfunction getSessionMessageText(entry: SessionEntry): string {\n if (entry.type !== \"message\" || !(\"content\" in entry.message)) return \"\";\n const content = entry.message.content;\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .map((part) => (part.type === \"text\" && \"text\" in part ? part.text : \"\"))\n .join(\"\\n\");\n}\n\nconst normalizeComparableText = stripHistoryLinePrefix;\n\nfunction buildHistorySessionMessage(message: ConversationLogMessage): SessionAppendMessage | null {\n const text = historyMessageText(message);\n if (!text) return null;\n\n const timestamp = parseMessageTimestamp(message);\n if (!message.isMessagingBot) {\n return {\n role: \"user\",\n content: [{ type: \"text\", text: formatHistoryMessage(message) }],\n timestamp,\n } as SessionAppendMessage;\n }\n\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n api: \"platform-history\",\n provider: \"platform-history\",\n model: \"platform-history\",\n usage: zeroUsage(),\n stopReason: \"stop\",\n timestamp,\n } as SessionAppendMessage;\n}\n\nfunction buildThreadRootSeed(\n message: ConversationLogMessage | undefined,\n): ThreadRootMessage | null {\n if (!message) return null;\n return {\n text: message.text,\n userName: message.userName,\n user: message.user,\n loggedAt: message.date ? new Date(message.date).getTime() : undefined,\n isMessagingBot: message.isMessagingBot,\n };\n}\n\nfunction parseMessageTimestamp(message: ConversationLogMessage): number | undefined {\n if (message.date) {\n const dateMs = new Date(message.date).getTime();\n if (Number.isFinite(dateMs)) return dateMs;\n }\n\n if (message.ts) {\n const tsMs = Number(message.ts) * 1000;\n if (Number.isFinite(tsMs)) return tsMs;\n }\n\n return undefined;\n}\n\nfunction formatHistoryMessage(message: ConversationLogMessage): string {\n return formatHistoryLine({\n date: message.date ? new Date(message.date) : undefined,\n userName: message.userName || message.user,\n text: message.text?.trim() ?? \"\",\n });\n}\n\nfunction zeroUsage(): object {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\nfunction readConversationLog(office: Office): LogRecord[] {\n const logFile = office.logPath;\n const raw = readTextFileNoFollowIfExists(logFile);\n if (raw === undefined) return [];\n\n const records: LogRecord[] = [];\n for (const [index, line] of raw.trim().split(\"\\n\").filter(Boolean).entries()) {\n const message = parseLogLine(line, logFile, index + 1);\n if (message) records.push({ message, index });\n }\n return coalesceMessagingBotLogChunks(records);\n}\n\nfunction parseLogLine(\n line: string,\n logFile: string,\n lineNumber: number,\n): ConversationLogMessage | undefined {\n try {\n return parseJsonValue(\n line,\n (value): value is ConversationLogMessage => isRecord(value),\n (detail, kind) => (kind === \"shape\" ? \"expected a JSON object\" : detail),\n );\n } catch (err) {\n log.logWarning(`Skipping malformed log entry at ${logFile}:${lineNumber}`, errorMessage(err));\n return undefined;\n }\n}\n\nfunction coalesceMessagingBotLogChunks(records: LogRecord[]): LogRecord[] {\n const coalesced: LogRecord[] = [];\n for (const record of records) {\n const previous = coalesced.at(-1);\n if (previous && canCoalesceMessagingBotLogChunk(previous.message, record.message)) {\n previous.message.text = `${previous.message.text ?? \"\"}${record.message.text ?? \"\"}`;\n continue;\n }\n coalesced.push({ ...record, message: { ...record.message } });\n }\n return coalesced;\n}\n\nfunction canCoalesceMessagingBotLogChunk(\n previous: ConversationLogMessage,\n current: ConversationLogMessage,\n): boolean {\n return (\n previous.isMessagingBot === true &&\n current.isMessagingBot === true &&\n !!previous.ts &&\n previous.ts === current.ts &&\n previous.threadTs === current.threadTs &&\n previous.user === current.user\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/sessions/session-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/sessions/session-store.ts"],"names":[],"mappings":"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"}
@@ -101,10 +101,6 @@ function parseCurrentHeader(filePath, firstLine) {
101
101
  throw new SessionFormatError(`Session file has an unrecognized header: ${filePath}`);
102
102
  }
103
103
  const record = parsed;
104
- if (record.type === "session" || (record.kind === "header" && record.version === 4)) {
105
- const generation = record.type === "session" ? "legacy v3" : "Pi 0.84 v4";
106
- throw new SessionFormatError(`Session file uses the ${generation} format: ${filePath}. Run \`mikan sessions migrate\` before starting this mikan version.`);
107
- }
108
104
  if (record.kind !== "header" ||
109
105
  record.v !== CURRENT_SESSION_VERSION ||
110
106
  record.storageVersion !== JSONL_STORAGE_VERSION ||
@@ -427,10 +423,7 @@ export class SessionStore {
427
423
  const header = parseCurrentHeader(path, firstLine);
428
424
  return headerView(header, parseMikanMetadata(path));
429
425
  }
430
- catch (error) {
431
- if (error instanceof SessionFormatError && /legacy v3|Pi 0\.84 v4/.test(error.message)) {
432
- throw error;
433
- }
426
+ catch {
434
427
  return null;
435
428
  }
436
429
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/sessions/session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n closeSync,\n existsSync,\n fstatSync,\n ftruncateSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readFileSync,\n readSync,\n realpathSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport {\n AgentHarness,\n laneState,\n operationResult,\n createBranchSummaryMessage,\n createCompactionSummaryMessage,\n createCustomMessage,\n JsonlSessionRepo,\n JSONL_STORAGE_VERSION,\n MemorySessionRepo,\n TODO_CONTEXT,\n uuidv7,\n value,\n} from \"@earendil-works/pi-agent-core\";\nimport type {\n AgentHarnessOptions,\n AgentLane,\n AgentMessage,\n Branch,\n Entry,\n JsonlSessionMetadata,\n JsonValue,\n Session,\n SessionMetadata,\n} from \"@earendil-works/pi-agent-core\";\nimport { NodeExecutionEnv } from \"@earendil-works/pi-agent-core/node\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { atomicWritePrivateFile } from \"../file-guards.js\";\nimport type {\n SessionContext,\n SessionCreateInfo,\n SessionHeader,\n SessionInspection,\n} from \"./types.js\";\nimport { CURRENT_SESSION_VERSION } from \"./types.js\";\nimport { loadMcpTools, formatMcpServerInstructions } from \"../harness/mcp.js\";\nimport type { McpServerConfig, McpToolsResult } from \"../harness/types.js\";\nimport * as log from \"../log.js\";\nimport { isRecord } from \"../unknown-values.js\";\n\ninterface CurrentSessionHeader extends SessionMetadata {\n v: typeof CURRENT_SESSION_VERSION;\n kind: \"header\";\n cwd: string;\n nextSeq?: number;\n}\n\ntype MikanSessionMetadata = Record<string, JsonValue>;\n\nconst MIKAN_METADATA = value<MikanSessionMetadata>(\"mikan\", \"metadata\");\nconst activeWriterKeys = new Map<string, string>();\n\nfunction canonicalSessionPath(path: string): string {\n const absolute = resolve(path);\n if (existsSync(absolute)) return realpathSync(absolute);\n const parent = dirname(absolute);\n mkdirSync(parent, { recursive: true });\n return join(realpathSync(parent), basename(absolute));\n}\n\nfunction sessionWriterKey(path: string): string {\n if (!existsSync(path)) return `path:${path}`;\n const stats = statSync(path);\n return `inode:${stats.dev}:${stats.ino}:${stats.birthtimeMs}`;\n}\n\nfunction isStaleClaim(key: string, claimedPath: string): boolean {\n if (!key.startsWith(\"inode:\")) return false;\n return sessionWriterKey(claimedPath) !== key;\n}\n\nfunction claimWriter(key: string, path: string): void {\n const claimedPath = activeWriterKeys.get(key);\n if (claimedPath !== undefined && !isStaleClaim(key, claimedPath)) {\n throw new Error(`Session file already has an active writer: ${path}`);\n }\n activeWriterKeys.set(key, path);\n}\n\nfunction acquireWriter(path: string): { path: string; key: string } {\n const canonical = canonicalSessionPath(path);\n const key = sessionWriterKey(canonical);\n claimWriter(key, canonical);\n return { path: canonical, key };\n}\n\nfunction releaseWriter(key: string): void {\n activeWriterKeys.delete(key);\n}\n\nfunction promotePendingWriter(pathKey: string, path: string): string {\n const inodeKey = sessionWriterKey(path);\n if (inodeKey === pathKey) return pathKey;\n claimWriter(inodeKey, path);\n activeWriterKeys.delete(pathKey);\n return inodeKey;\n}\n\nfunction toDurable<T>(input: T): T {\n return input === undefined ? input : (JSON.parse(JSON.stringify(input)) as T);\n}\n\nclass SessionFormatError extends Error {}\n\nconst HEADER_CHUNK_SIZE = 4096;\nconst MAX_HEADER_BYTES = 1024 * 1024;\n\nfunction readHeaderLine(filePath: string): string {\n const fd = openSync(filePath, \"r\");\n const chunks: Buffer[] = [];\n let total = 0;\n try {\n while (total < MAX_HEADER_BYTES) {\n const chunk = Buffer.allocUnsafe(Math.min(HEADER_CHUNK_SIZE, MAX_HEADER_BYTES - total));\n const bytesRead = readSync(fd, chunk, 0, chunk.length, null);\n if (bytesRead === 0) break;\n const data = chunk.subarray(0, bytesRead);\n const newline = data.indexOf(0x0a);\n chunks.push(newline < 0 ? data : data.subarray(0, newline));\n total += newline < 0 ? bytesRead : newline;\n if (newline >= 0) break;\n }\n } finally {\n closeSync(fd);\n }\n if (total >= MAX_HEADER_BYTES) {\n throw new SessionFormatError(\n `Session file header exceeds ${MAX_HEADER_BYTES} bytes: ${filePath}`,\n );\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nfunction parseCurrentHeader(filePath: string, firstLine: string): CurrentSessionHeader {\n const trimmed = firstLine.trim();\n if (!trimmed) throw new SessionFormatError(`Session file has a blank header line: ${filePath}`);\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n throw new SessionFormatError(`Session file header is not valid JSON: ${filePath}`);\n }\n if (!isMetadataRecord(parsed)) {\n throw new SessionFormatError(`Session file has an unrecognized header: ${filePath}`);\n }\n const record = parsed;\n if (record.type === \"session\" || (record.kind === \"header\" && record.version === 4)) {\n const generation = record.type === \"session\" ? \"legacy v3\" : \"Pi 0.84 v4\";\n throw new SessionFormatError(\n `Session file uses the ${generation} format: ${filePath}. Run \\`mikan sessions migrate\\` before starting this mikan version.`,\n );\n }\n if (\n record.kind !== \"header\" ||\n record.v !== CURRENT_SESSION_VERSION ||\n record.storageVersion !== JSONL_STORAGE_VERSION ||\n typeof record.id !== \"string\" ||\n typeof record.createdAt !== \"number\" ||\n typeof record.cwd !== \"string\"\n ) {\n throw new SessionFormatError(`Session file has an unrecognized header: ${filePath}`);\n }\n return parsed as unknown as CurrentSessionHeader;\n}\n\nfunction metadataFromHeader(header: CurrentSessionHeader, path: string): JsonlSessionMetadata {\n return {\n id: header.id,\n createdAt: header.createdAt,\n storageVersion: header.storageVersion,\n cwd: header.cwd,\n path,\n modifiedAt: 0,\n parentSessionId: header.parentSessionId,\n legacyParentSessionPath: header.legacyParentSessionPath,\n };\n}\n\nfunction parseMikanMetadata(filePath: string): MikanSessionMetadata | undefined {\n let current: MikanSessionMetadata | undefined;\n for (const line of readFileSync(filePath, \"utf-8\").split(\"\\n\").slice(1)) {\n for (const write of parseMetadataWrites(line)) {\n if (write.op === \"delete\") current = undefined;\n else if (write.op === \"set\" && isMetadataRecord(write.value)) current = write.value;\n }\n }\n return current;\n}\n\nfunction isMetadataRecord(input: unknown): input is MikanSessionMetadata {\n return isRecord(input);\n}\n\nfunction parseMetadataWrites(line: string): MikanSessionMetadata[] {\n let transaction: unknown;\n try {\n transaction = JSON.parse(line);\n } catch {\n return [];\n }\n const writes: unknown[] = Array.isArray(transaction) ? transaction : [transaction];\n return writes.filter(\n (write): write is MikanSessionMetadata =>\n isMetadataRecord(write) &&\n write.kind === \"value\" &&\n write.namespace === \"mikan\" &&\n write.key === \"metadata\",\n );\n}\n\nfunction fileFingerprint(path: string): string {\n const fd = openSync(path, \"r\");\n try {\n const stats = fstatSync(fd);\n return `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeMs}`;\n } finally {\n closeSync(fd);\n }\n}\n\nfunction materializePendingFile(\n path: string,\n header: CurrentSessionHeader,\n expectedFingerprint: string | null,\n): void {\n const content = `${JSON.stringify(header)}\\n`;\n if (expectedFingerprint === null) {\n mkdirSync(dirname(path), { recursive: true });\n const fd = openSync(path, \"wx\", 0o600);\n try {\n writeFileSync(fd, content);\n } finally {\n closeSync(fd);\n }\n return;\n }\n const fd = openSync(path, \"r+\");\n try {\n const stats = fstatSync(fd);\n const actual = `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeMs}`;\n if (actual !== expectedFingerprint) {\n throw new Error(`Session file changed before pending session materialization: ${path}`);\n }\n ftruncateSync(fd, 0);\n writeFileSync(fd, content);\n } finally {\n closeSync(fd);\n }\n}\n\nfunction buildHeader(\n cwd: string,\n options?: SessionCreateInfo,\n): { header: CurrentSessionHeader; metadata?: MikanSessionMetadata } {\n const metadata =\n options?.parentSession === undefined\n ? undefined\n : ({ parentSessionPath: options.parentSession } satisfies MikanSessionMetadata);\n return {\n header: {\n v: CURRENT_SESSION_VERSION,\n kind: \"header\",\n id: options?.id ?? uuidv7(),\n storageVersion: JSONL_STORAGE_VERSION,\n createdAt: Date.now(),\n cwd,\n parentSessionId: options?.parentSessionId,\n legacyParentSessionPath: options?.parentSession,\n },\n metadata,\n };\n}\n\nfunction headerView(header: CurrentSessionHeader, metadata?: MikanSessionMetadata): SessionHeader {\n const parentSession =\n typeof metadata?.parentSessionPath === \"string\"\n ? metadata.parentSessionPath\n : header.legacyParentSessionPath;\n return {\n type: \"session\",\n version: CURRENT_SESSION_VERSION,\n id: header.id,\n timestamp: new Date(header.createdAt).toISOString(),\n cwd: header.cwd,\n parentSessionId: header.parentSessionId,\n parentSession,\n metadata,\n };\n}\n\nasync function openFileSession(\n path: string,\n header: CurrentSessionHeader,\n): Promise<{ session: Session<JsonlSessionMetadata>; repo: JsonlSessionRepo }> {\n const sessionRepo = new JsonlSessionRepo({\n fileSystem: new NodeExecutionEnv({ cwd: process.cwd() }),\n sessionsRoot: dirname(path),\n });\n try {\n const session = await sessionRepo.open(metadataFromHeader(header, path), TODO_CONTEXT);\n return { session, repo: sessionRepo };\n } catch (error) {\n await sessionRepo.close(TODO_CONTEXT);\n throw error;\n }\n}\n\nasync function withSessionSnapshot<T>(\n path: string,\n read: (session: Session<JsonlSessionMetadata>, header: CurrentSessionHeader) => Promise<T>,\n): Promise<T> {\n const resolvedPath = canonicalSessionPath(path);\n const dir = mkdtempSync(join(tmpdir(), \"mikan-session-inspect-\"));\n const snapshot = join(dir, basename(resolvedPath));\n let opened: Awaited<ReturnType<typeof openFileSession>> | undefined;\n try {\n writeFileSync(snapshot, readFileSync(resolvedPath), { mode: 0o600, flag: \"wx\" });\n const header = parseCurrentHeader(resolvedPath, readHeaderLine(snapshot));\n opened = await openFileSession(snapshot, header);\n return await read(opened.session, header);\n } finally {\n try {\n await opened?.session.close(TODO_CONTEXT);\n } finally {\n try {\n await opened?.repo.close(TODO_CONTEXT);\n } finally {\n rmSync(dir, { recursive: true, force: true });\n }\n }\n }\n}\n\nasync function mainBranch(session: Session, create: boolean): Promise<Branch | undefined> {\n const existing = await session.branch(\"main\", TODO_CONTEXT);\n if (existing || !create) return existing;\n return session.createBranch(\"main\", null, TODO_CONTEXT);\n}\n\nfunction isContextMessage(message: AgentMessage): boolean {\n return (\n message.role !== \"assistant\" ||\n (message.stopReason !== \"error\" &&\n message.stopReason !== \"aborted\" &&\n message.stopReason !== \"deferred\")\n );\n}\n\nfunction buildContext(entries: Entry[]): SessionContext {\n const compactionIndex = entries.findLastIndex((entry) => entry.type === \"compaction\");\n const visibleEntries = entries.slice(Math.max(0, compactionIndex));\n const messages: AgentMessage[] = [];\n for (const entry of visibleEntries) {\n if (entry.type === \"message\") {\n if (isContextMessage(entry.message)) messages.push(entry.message);\n } else if (entry.type === \"compaction\") {\n messages.push(\n createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),\n ...entry.retainedTail.filter(isContextMessage),\n );\n } else if (entry.type === \"branch_summary\" && entry.summary) {\n messages.push(createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));\n }\n }\n return { messages };\n}\n\ninterface LiveState {\n kind: \"live\";\n session: Session;\n header: CurrentSessionHeader;\n metadata?: MikanSessionMetadata;\n repo?: JsonlSessionRepo | MemorySessionRepo;\n}\n\ninterface PendingState {\n kind: \"pending\";\n header: CurrentSessionHeader;\n metadata?: MikanSessionMetadata;\n fingerprint: string | null;\n}\n\ntype StoreState = LiveState | PendingState;\n\nclass CachedSessionInspection implements SessionInspection {\n constructor(\n private readonly header: SessionHeader,\n private readonly entries: Entry[],\n private readonly name: string | undefined,\n private readonly branch: Entry[],\n private readonly context: SessionContext,\n ) {}\n\n getHeader(): SessionHeader {\n return structuredClone(this.header);\n }\n\n async getEntries(): Promise<Entry[]> {\n return structuredClone(this.entries);\n }\n\n async getSessionName(): Promise<string | undefined> {\n return this.name;\n }\n\n async getBranch(fromId?: string): Promise<Entry[]> {\n if (fromId === undefined) return structuredClone(this.branch);\n const byId = new Map(this.entries.map((entry) => [entry.id, entry]));\n const result: Entry[] = [];\n let current = byId.get(fromId);\n while (current) {\n result.push(current);\n current = current.parentId === null ? undefined : byId.get(current.parentId);\n }\n return result.toReversed();\n }\n\n async buildSessionContext(): Promise<SessionContext> {\n return structuredClone(this.context);\n }\n}\n\nexport class SessionStore implements SessionInspection {\n private mcp: McpToolsResult | undefined;\n private mutationTail: Promise<void> = Promise.resolve();\n private closePromise: Promise<void> | undefined;\n private closed = false;\n private harness: AgentHarness | undefined;\n private harnessLane: AgentLane | undefined;\n\n private constructor(\n private readonly sessionFile: string | null,\n private readonly cwd: string,\n private state: StoreState,\n private writerKey: string | null,\n ) {}\n\n static async open(path: string, cwdOverride?: string): Promise<SessionStore> {\n const writer = acquireWriter(path);\n const writerPath = writer.path;\n try {\n if (!existsSync(writerPath)) {\n const cwd = cwdOverride ?? process.cwd();\n const built = buildHeader(cwd);\n return new SessionStore(\n writerPath,\n cwd,\n { kind: \"pending\", ...built, fingerprint: null },\n writer.key,\n );\n }\n const firstLine = readHeaderLine(writerPath);\n if (firstLine.trim().length === 0) {\n const cwd = cwdOverride ?? process.cwd();\n const built = buildHeader(cwd);\n return new SessionStore(\n writerPath,\n cwd,\n { kind: \"pending\", ...built, fingerprint: fileFingerprint(writerPath) },\n writer.key,\n );\n }\n const header = parseCurrentHeader(writerPath, firstLine);\n const opened = await openFileSession(writerPath, header);\n const metadata = (await opened.session.getValue(MIKAN_METADATA, TODO_CONTEXT))?.value;\n return new SessionStore(\n writerPath,\n cwdOverride ?? header.cwd,\n { kind: \"live\", header, metadata, ...opened },\n writer.key,\n );\n } catch (error) {\n releaseWriter(writer.key);\n throw error;\n }\n }\n\n static async inspectExecution(path: string): Promise<{\n open: boolean;\n started: boolean;\n result?: { status: \"completed\" | \"aborted\" | \"failed\" | \"declined\"; endedAt: number };\n }> {\n return withSessionSnapshot(path, async (session) => {\n const state = (await session.getValue(laneState(\"main\"), TODO_CONTEXT))?.value;\n const result = state?.lastOperationId\n ? (await session.getValue(operationResult(state.lastOperationId), TODO_CONTEXT))?.value\n : undefined;\n return {\n open: state?.currentOperationId != null,\n started: state?.currentOperationId != null || state?.lastOperationId != null,\n result: result ? { status: result.status, endedAt: result.endedAt } : undefined,\n };\n });\n }\n\n static async inspect(path: string): Promise<SessionInspection> {\n return withSessionSnapshot(path, async (session, header) => {\n const metadata = (await session.getValue(MIKAN_METADATA, TODO_CONTEXT))?.value;\n const entries = await session.findEntries({ order: \"asc\" }, TODO_CONTEXT);\n const name = await session.getName(TODO_CONTEXT);\n const branchObject = await mainBranch(session, false);\n const branch = branchObject\n ? await branchObject.findEntries({ order: \"oldestFirst\" }, TODO_CONTEXT)\n : [];\n const context = buildContext(branch);\n return new CachedSessionInspection(\n headerView(header, metadata),\n entries,\n name,\n branch,\n context,\n );\n });\n }\n\n static async create(\n path: string,\n cwd: string,\n options?: SessionCreateInfo,\n ): Promise<SessionStore> {\n const writer = acquireWriter(path);\n const writerPath = writer.path;\n let leaseKey = writer.key;\n let opened: Awaited<ReturnType<typeof openFileSession>> | undefined;\n try {\n const built = buildHeader(cwd, options);\n mkdirSync(dirname(writerPath), { recursive: true });\n writeFileSync(writerPath, `${JSON.stringify(built.header)}\\n`, { mode: 0o600, flag: \"wx\" });\n leaseKey = promotePendingWriter(leaseKey, writerPath);\n opened = await openFileSession(writerPath, built.header);\n if (built.metadata) {\n await opened.session.setValue(MIKAN_METADATA, built.metadata, TODO_CONTEXT);\n }\n return new SessionStore(writerPath, cwd, { kind: \"live\", ...built, ...opened }, leaseKey);\n } catch (error) {\n if (opened) {\n await opened.session.close(TODO_CONTEXT).catch(() => undefined);\n await opened.repo.close(TODO_CONTEXT).catch(() => undefined);\n }\n releaseWriter(leaseKey);\n throw error;\n }\n }\n\n static readHeader(path: string): SessionHeader | null {\n let firstLine: string;\n try {\n firstLine = readHeaderLine(path);\n } catch {\n return null;\n }\n if (firstLine.trim().length === 0) return null;\n try {\n const header = parseCurrentHeader(path, firstLine);\n return headerView(header, parseMikanMetadata(path));\n } catch (error) {\n if (error instanceof SessionFormatError && /legacy v3|Pi 0\\.84 v4/.test(error.message)) {\n throw error;\n }\n return null;\n }\n }\n\n static writeHeaderFile(path: string, cwd: string, options?: SessionCreateInfo): void {\n mkdirSync(dirname(path), { recursive: true });\n const built = buildHeader(cwd, options);\n atomicWritePrivateFile(path, `${JSON.stringify(built.header)}\\n`);\n }\n\n static inMemory(cwd = process.cwd()): SessionStore {\n const built = buildHeader(cwd);\n return new SessionStore(null, cwd, { kind: \"pending\", ...built, fingerprint: null }, null);\n }\n\n getSessionFile(): string | undefined {\n this.assertOpen();\n return this.sessionFile ?? undefined;\n }\n\n isPersisted(): boolean {\n this.assertOpen();\n return this.sessionFile !== null;\n }\n\n getCwd(): string {\n this.assertOpen();\n return this.cwd;\n }\n\n getHeader(): SessionHeader {\n this.assertOpen();\n return headerView(this.state.header, this.state.metadata);\n }\n\n getSessionId(): string {\n this.assertOpen();\n return this.state.header.id;\n }\n\n async getLeafId(): Promise<string | null> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return null;\n return (await mainBranch(this.state.session, false))?.getTipId(TODO_CONTEXT) ?? null;\n }\n\n async getEntry(id: string): Promise<Entry | undefined> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return undefined;\n return this.state.session.getEntry(id, TODO_CONTEXT);\n }\n\n async getEntries(): Promise<Entry[]> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return [];\n return this.state.session.findEntries({ order: \"asc\" }, TODO_CONTEXT);\n }\n\n async getSessionName(): Promise<string | undefined> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return undefined;\n return this.state.session.getName(TODO_CONTEXT);\n }\n\n async getBranch(fromId?: string): Promise<Entry[]> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return [];\n if (fromId !== undefined) {\n return this.state.session.scanBranch({ start: fromId, order: \"oldestFirst\" }, TODO_CONTEXT);\n }\n const branchObject = await mainBranch(this.state.session, false);\n return branchObject ? branchObject.findEntries({ order: \"oldestFirst\" }, TODO_CONTEXT) : [];\n }\n\n async buildSessionContext(): Promise<SessionContext> {\n return buildContext(await this.getBranch());\n }\n\n async connectMcp(servers: Record<string, McpServerConfig>, signal?: AbortSignal) {\n return this.mutate(async () => {\n if (this.mcp) throw new Error(\"SessionStore already has MCP connections\");\n this.mcp = await loadMcpTools(servers, signal);\n for (const error of this.mcp.errors) {\n log.logWarning(`MCP server unavailable: ${error.server}`, error.error);\n }\n signal?.throwIfAborted();\n return this.mcp.tools;\n });\n }\n\n withMcpInstructions(prompt: string): string {\n const instructions = formatMcpServerInstructions(this.mcp?.instructions ?? []);\n return instructions ? `${prompt}\\n\\n${instructions}` : prompt;\n }\n\n async createHarness(options: Omit<AgentHarnessOptions, \"session\">): Promise<AgentHarness> {\n return this.mutate(async () => {\n if (this.harness) throw new Error(\"SessionStore already has an attached harness\");\n const { session } = await this.live();\n const { harness } = await AgentHarness.create({ ...options, session }, TODO_CONTEXT);\n this.harness = harness;\n this.harnessLane = await harness.lane(\"main\", TODO_CONTEXT);\n return harness;\n });\n }\n\n async appendMessage(message: AgentMessage): Promise<string> {\n return this.mutate(async () => {\n if (this.harnessLane) return this.harnessLane.appendMessage(toDurable(message), TODO_CONTEXT);\n const branchObject = await mainBranch((await this.live()).session, true);\n if (!branchObject) throw new Error(\"Failed to create main session branch\");\n return branchObject.appendMessage(toDurable(message), TODO_CONTEXT);\n });\n }\n\n async appendCustomEntry(customType: string, data?: unknown): Promise<string> {\n return this.mutate(async () => {\n if (this.harnessLane) {\n return this.harnessLane.appendCustomEntry(\n customType,\n toDurable(data) as JsonValue,\n TODO_CONTEXT,\n );\n }\n const branchObject = await mainBranch((await this.live()).session, true);\n if (!branchObject) throw new Error(\"Failed to create main session branch\");\n return branchObject.appendCustomEntry(customType, toDurable(data) as JsonValue, TODO_CONTEXT);\n });\n }\n\n async appendCustomMessageEntry(\n customType: string,\n content: string | Array<TextContent | ImageContent>,\n display: boolean,\n details?: unknown,\n ): Promise<string> {\n return this.appendMessage(\n toDurable(createCustomMessage(customType, content, display, details, Date.now())),\n );\n }\n\n async setSessionName(name: string): Promise<void> {\n await this.mutate(async () =>\n (await this.live()).session.setName(name.trim() || undefined, TODO_CONTEXT),\n );\n }\n\n async close(): Promise<void> {\n if (this.closePromise) return this.closePromise;\n this.closed = true;\n this.closePromise = this.mutationTail\n .then(async () => {\n try {\n await this.mcp?.dispose();\n } finally {\n if (this.state.kind === \"live\") {\n try {\n if (this.harness) await this.harness.close(TODO_CONTEXT);\n else await this.state.session.close(TODO_CONTEXT);\n } finally {\n await this.state.repo?.close(TODO_CONTEXT);\n }\n }\n }\n })\n .finally(() => {\n if (this.writerKey !== null) releaseWriter(this.writerKey);\n });\n return this.closePromise;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error(\"SessionStore is closed\");\n }\n\n private mutate<T>(operation: () => Promise<T>): Promise<T> {\n this.assertOpen();\n const result = this.mutationTail.then(operation);\n this.mutationTail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async live(): Promise<LiveState> {\n if (this.state.kind === \"live\") return this.state;\n const pending = this.state;\n const sessionFile = this.sessionFile;\n if (sessionFile === null) {\n const repo = new MemorySessionRepo();\n const session = await repo.create(\n {\n id: pending.header.id,\n parentSessionId: pending.header.parentSessionId,\n },\n TODO_CONTEXT,\n );\n const live: LiveState = {\n kind: \"live\",\n header: pending.header,\n metadata: pending.metadata,\n session,\n repo,\n };\n this.state = live;\n return live;\n }\n materializePendingFile(sessionFile, pending.header, pending.fingerprint);\n if (this.writerKey === null) throw new Error(\"Pending session must have a writer lease\");\n this.writerKey = promotePendingWriter(this.writerKey, sessionFile);\n const opened = await openFileSession(sessionFile, pending.header);\n if (pending.metadata) {\n await opened.session.setValue(MIKAN_METADATA, pending.metadata, TODO_CONTEXT);\n }\n const live: LiveState = {\n kind: \"live\",\n header: pending.header,\n metadata: pending.metadata,\n ...opened,\n };\n this.state = live;\n return live;\n }\n}\n"]}
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/sessions/session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n closeSync,\n existsSync,\n fstatSync,\n ftruncateSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readFileSync,\n readSync,\n realpathSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport {\n AgentHarness,\n laneState,\n operationResult,\n createBranchSummaryMessage,\n createCompactionSummaryMessage,\n createCustomMessage,\n JsonlSessionRepo,\n JSONL_STORAGE_VERSION,\n MemorySessionRepo,\n TODO_CONTEXT,\n uuidv7,\n value,\n} from \"@earendil-works/pi-agent-core\";\nimport type {\n AgentHarnessOptions,\n AgentLane,\n AgentMessage,\n Branch,\n Entry,\n JsonlSessionMetadata,\n JsonValue,\n Session,\n SessionMetadata,\n} from \"@earendil-works/pi-agent-core\";\nimport { NodeExecutionEnv } from \"@earendil-works/pi-agent-core/node\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { atomicWritePrivateFile } from \"../file-guards.js\";\nimport type {\n SessionContext,\n SessionCreateInfo,\n SessionHeader,\n SessionInspection,\n} from \"./types.js\";\nimport { CURRENT_SESSION_VERSION } from \"./types.js\";\nimport { loadMcpTools, formatMcpServerInstructions } from \"../harness/mcp.js\";\nimport type { McpServerConfig, McpToolsResult } from \"../harness/types.js\";\nimport * as log from \"../log.js\";\nimport { isRecord } from \"../unknown-values.js\";\n\ninterface CurrentSessionHeader extends SessionMetadata {\n v: typeof CURRENT_SESSION_VERSION;\n kind: \"header\";\n cwd: string;\n nextSeq?: number;\n}\n\ntype MikanSessionMetadata = Record<string, JsonValue>;\n\nconst MIKAN_METADATA = value<MikanSessionMetadata>(\"mikan\", \"metadata\");\nconst activeWriterKeys = new Map<string, string>();\n\nfunction canonicalSessionPath(path: string): string {\n const absolute = resolve(path);\n if (existsSync(absolute)) return realpathSync(absolute);\n const parent = dirname(absolute);\n mkdirSync(parent, { recursive: true });\n return join(realpathSync(parent), basename(absolute));\n}\n\nfunction sessionWriterKey(path: string): string {\n if (!existsSync(path)) return `path:${path}`;\n const stats = statSync(path);\n return `inode:${stats.dev}:${stats.ino}:${stats.birthtimeMs}`;\n}\n\nfunction isStaleClaim(key: string, claimedPath: string): boolean {\n if (!key.startsWith(\"inode:\")) return false;\n return sessionWriterKey(claimedPath) !== key;\n}\n\nfunction claimWriter(key: string, path: string): void {\n const claimedPath = activeWriterKeys.get(key);\n if (claimedPath !== undefined && !isStaleClaim(key, claimedPath)) {\n throw new Error(`Session file already has an active writer: ${path}`);\n }\n activeWriterKeys.set(key, path);\n}\n\nfunction acquireWriter(path: string): { path: string; key: string } {\n const canonical = canonicalSessionPath(path);\n const key = sessionWriterKey(canonical);\n claimWriter(key, canonical);\n return { path: canonical, key };\n}\n\nfunction releaseWriter(key: string): void {\n activeWriterKeys.delete(key);\n}\n\nfunction promotePendingWriter(pathKey: string, path: string): string {\n const inodeKey = sessionWriterKey(path);\n if (inodeKey === pathKey) return pathKey;\n claimWriter(inodeKey, path);\n activeWriterKeys.delete(pathKey);\n return inodeKey;\n}\n\nfunction toDurable<T>(input: T): T {\n return input === undefined ? input : (JSON.parse(JSON.stringify(input)) as T);\n}\n\nclass SessionFormatError extends Error {}\n\nconst HEADER_CHUNK_SIZE = 4096;\nconst MAX_HEADER_BYTES = 1024 * 1024;\n\nfunction readHeaderLine(filePath: string): string {\n const fd = openSync(filePath, \"r\");\n const chunks: Buffer[] = [];\n let total = 0;\n try {\n while (total < MAX_HEADER_BYTES) {\n const chunk = Buffer.allocUnsafe(Math.min(HEADER_CHUNK_SIZE, MAX_HEADER_BYTES - total));\n const bytesRead = readSync(fd, chunk, 0, chunk.length, null);\n if (bytesRead === 0) break;\n const data = chunk.subarray(0, bytesRead);\n const newline = data.indexOf(0x0a);\n chunks.push(newline < 0 ? data : data.subarray(0, newline));\n total += newline < 0 ? bytesRead : newline;\n if (newline >= 0) break;\n }\n } finally {\n closeSync(fd);\n }\n if (total >= MAX_HEADER_BYTES) {\n throw new SessionFormatError(\n `Session file header exceeds ${MAX_HEADER_BYTES} bytes: ${filePath}`,\n );\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nfunction parseCurrentHeader(filePath: string, firstLine: string): CurrentSessionHeader {\n const trimmed = firstLine.trim();\n if (!trimmed) throw new SessionFormatError(`Session file has a blank header line: ${filePath}`);\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n throw new SessionFormatError(`Session file header is not valid JSON: ${filePath}`);\n }\n if (!isMetadataRecord(parsed)) {\n throw new SessionFormatError(`Session file has an unrecognized header: ${filePath}`);\n }\n const record = parsed;\n if (\n record.kind !== \"header\" ||\n record.v !== CURRENT_SESSION_VERSION ||\n record.storageVersion !== JSONL_STORAGE_VERSION ||\n typeof record.id !== \"string\" ||\n typeof record.createdAt !== \"number\" ||\n typeof record.cwd !== \"string\"\n ) {\n throw new SessionFormatError(`Session file has an unrecognized header: ${filePath}`);\n }\n return parsed as unknown as CurrentSessionHeader;\n}\n\nfunction metadataFromHeader(header: CurrentSessionHeader, path: string): JsonlSessionMetadata {\n return {\n id: header.id,\n createdAt: header.createdAt,\n storageVersion: header.storageVersion,\n cwd: header.cwd,\n path,\n modifiedAt: 0,\n parentSessionId: header.parentSessionId,\n legacyParentSessionPath: header.legacyParentSessionPath,\n };\n}\n\nfunction parseMikanMetadata(filePath: string): MikanSessionMetadata | undefined {\n let current: MikanSessionMetadata | undefined;\n for (const line of readFileSync(filePath, \"utf-8\").split(\"\\n\").slice(1)) {\n for (const write of parseMetadataWrites(line)) {\n if (write.op === \"delete\") current = undefined;\n else if (write.op === \"set\" && isMetadataRecord(write.value)) current = write.value;\n }\n }\n return current;\n}\n\nfunction isMetadataRecord(input: unknown): input is MikanSessionMetadata {\n return isRecord(input);\n}\n\nfunction parseMetadataWrites(line: string): MikanSessionMetadata[] {\n let transaction: unknown;\n try {\n transaction = JSON.parse(line);\n } catch {\n return [];\n }\n const writes: unknown[] = Array.isArray(transaction) ? transaction : [transaction];\n return writes.filter(\n (write): write is MikanSessionMetadata =>\n isMetadataRecord(write) &&\n write.kind === \"value\" &&\n write.namespace === \"mikan\" &&\n write.key === \"metadata\",\n );\n}\n\nfunction fileFingerprint(path: string): string {\n const fd = openSync(path, \"r\");\n try {\n const stats = fstatSync(fd);\n return `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeMs}`;\n } finally {\n closeSync(fd);\n }\n}\n\nfunction materializePendingFile(\n path: string,\n header: CurrentSessionHeader,\n expectedFingerprint: string | null,\n): void {\n const content = `${JSON.stringify(header)}\\n`;\n if (expectedFingerprint === null) {\n mkdirSync(dirname(path), { recursive: true });\n const fd = openSync(path, \"wx\", 0o600);\n try {\n writeFileSync(fd, content);\n } finally {\n closeSync(fd);\n }\n return;\n }\n const fd = openSync(path, \"r+\");\n try {\n const stats = fstatSync(fd);\n const actual = `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeMs}`;\n if (actual !== expectedFingerprint) {\n throw new Error(`Session file changed before pending session materialization: ${path}`);\n }\n ftruncateSync(fd, 0);\n writeFileSync(fd, content);\n } finally {\n closeSync(fd);\n }\n}\n\nfunction buildHeader(\n cwd: string,\n options?: SessionCreateInfo,\n): { header: CurrentSessionHeader; metadata?: MikanSessionMetadata } {\n const metadata =\n options?.parentSession === undefined\n ? undefined\n : ({ parentSessionPath: options.parentSession } satisfies MikanSessionMetadata);\n return {\n header: {\n v: CURRENT_SESSION_VERSION,\n kind: \"header\",\n id: options?.id ?? uuidv7(),\n storageVersion: JSONL_STORAGE_VERSION,\n createdAt: Date.now(),\n cwd,\n parentSessionId: options?.parentSessionId,\n legacyParentSessionPath: options?.parentSession,\n },\n metadata,\n };\n}\n\nfunction headerView(header: CurrentSessionHeader, metadata?: MikanSessionMetadata): SessionHeader {\n const parentSession =\n typeof metadata?.parentSessionPath === \"string\"\n ? metadata.parentSessionPath\n : header.legacyParentSessionPath;\n return {\n type: \"session\",\n version: CURRENT_SESSION_VERSION,\n id: header.id,\n timestamp: new Date(header.createdAt).toISOString(),\n cwd: header.cwd,\n parentSessionId: header.parentSessionId,\n parentSession,\n metadata,\n };\n}\n\nasync function openFileSession(\n path: string,\n header: CurrentSessionHeader,\n): Promise<{ session: Session<JsonlSessionMetadata>; repo: JsonlSessionRepo }> {\n const sessionRepo = new JsonlSessionRepo({\n fileSystem: new NodeExecutionEnv({ cwd: process.cwd() }),\n sessionsRoot: dirname(path),\n });\n try {\n const session = await sessionRepo.open(metadataFromHeader(header, path), TODO_CONTEXT);\n return { session, repo: sessionRepo };\n } catch (error) {\n await sessionRepo.close(TODO_CONTEXT);\n throw error;\n }\n}\n\nasync function withSessionSnapshot<T>(\n path: string,\n read: (session: Session<JsonlSessionMetadata>, header: CurrentSessionHeader) => Promise<T>,\n): Promise<T> {\n const resolvedPath = canonicalSessionPath(path);\n const dir = mkdtempSync(join(tmpdir(), \"mikan-session-inspect-\"));\n const snapshot = join(dir, basename(resolvedPath));\n let opened: Awaited<ReturnType<typeof openFileSession>> | undefined;\n try {\n writeFileSync(snapshot, readFileSync(resolvedPath), { mode: 0o600, flag: \"wx\" });\n const header = parseCurrentHeader(resolvedPath, readHeaderLine(snapshot));\n opened = await openFileSession(snapshot, header);\n return await read(opened.session, header);\n } finally {\n try {\n await opened?.session.close(TODO_CONTEXT);\n } finally {\n try {\n await opened?.repo.close(TODO_CONTEXT);\n } finally {\n rmSync(dir, { recursive: true, force: true });\n }\n }\n }\n}\n\nasync function mainBranch(session: Session, create: boolean): Promise<Branch | undefined> {\n const existing = await session.branch(\"main\", TODO_CONTEXT);\n if (existing || !create) return existing;\n return session.createBranch(\"main\", null, TODO_CONTEXT);\n}\n\nfunction isContextMessage(message: AgentMessage): boolean {\n return (\n message.role !== \"assistant\" ||\n (message.stopReason !== \"error\" &&\n message.stopReason !== \"aborted\" &&\n message.stopReason !== \"deferred\")\n );\n}\n\nfunction buildContext(entries: Entry[]): SessionContext {\n const compactionIndex = entries.findLastIndex((entry) => entry.type === \"compaction\");\n const visibleEntries = entries.slice(Math.max(0, compactionIndex));\n const messages: AgentMessage[] = [];\n for (const entry of visibleEntries) {\n if (entry.type === \"message\") {\n if (isContextMessage(entry.message)) messages.push(entry.message);\n } else if (entry.type === \"compaction\") {\n messages.push(\n createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),\n ...entry.retainedTail.filter(isContextMessage),\n );\n } else if (entry.type === \"branch_summary\" && entry.summary) {\n messages.push(createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));\n }\n }\n return { messages };\n}\n\ninterface LiveState {\n kind: \"live\";\n session: Session;\n header: CurrentSessionHeader;\n metadata?: MikanSessionMetadata;\n repo?: JsonlSessionRepo | MemorySessionRepo;\n}\n\ninterface PendingState {\n kind: \"pending\";\n header: CurrentSessionHeader;\n metadata?: MikanSessionMetadata;\n fingerprint: string | null;\n}\n\ntype StoreState = LiveState | PendingState;\n\nclass CachedSessionInspection implements SessionInspection {\n constructor(\n private readonly header: SessionHeader,\n private readonly entries: Entry[],\n private readonly name: string | undefined,\n private readonly branch: Entry[],\n private readonly context: SessionContext,\n ) {}\n\n getHeader(): SessionHeader {\n return structuredClone(this.header);\n }\n\n async getEntries(): Promise<Entry[]> {\n return structuredClone(this.entries);\n }\n\n async getSessionName(): Promise<string | undefined> {\n return this.name;\n }\n\n async getBranch(fromId?: string): Promise<Entry[]> {\n if (fromId === undefined) return structuredClone(this.branch);\n const byId = new Map(this.entries.map((entry) => [entry.id, entry]));\n const result: Entry[] = [];\n let current = byId.get(fromId);\n while (current) {\n result.push(current);\n current = current.parentId === null ? undefined : byId.get(current.parentId);\n }\n return result.toReversed();\n }\n\n async buildSessionContext(): Promise<SessionContext> {\n return structuredClone(this.context);\n }\n}\n\nexport class SessionStore implements SessionInspection {\n private mcp: McpToolsResult | undefined;\n private mutationTail: Promise<void> = Promise.resolve();\n private closePromise: Promise<void> | undefined;\n private closed = false;\n private harness: AgentHarness | undefined;\n private harnessLane: AgentLane | undefined;\n\n private constructor(\n private readonly sessionFile: string | null,\n private readonly cwd: string,\n private state: StoreState,\n private writerKey: string | null,\n ) {}\n\n static async open(path: string, cwdOverride?: string): Promise<SessionStore> {\n const writer = acquireWriter(path);\n const writerPath = writer.path;\n try {\n if (!existsSync(writerPath)) {\n const cwd = cwdOverride ?? process.cwd();\n const built = buildHeader(cwd);\n return new SessionStore(\n writerPath,\n cwd,\n { kind: \"pending\", ...built, fingerprint: null },\n writer.key,\n );\n }\n const firstLine = readHeaderLine(writerPath);\n if (firstLine.trim().length === 0) {\n const cwd = cwdOverride ?? process.cwd();\n const built = buildHeader(cwd);\n return new SessionStore(\n writerPath,\n cwd,\n { kind: \"pending\", ...built, fingerprint: fileFingerprint(writerPath) },\n writer.key,\n );\n }\n const header = parseCurrentHeader(writerPath, firstLine);\n const opened = await openFileSession(writerPath, header);\n const metadata = (await opened.session.getValue(MIKAN_METADATA, TODO_CONTEXT))?.value;\n return new SessionStore(\n writerPath,\n cwdOverride ?? header.cwd,\n { kind: \"live\", header, metadata, ...opened },\n writer.key,\n );\n } catch (error) {\n releaseWriter(writer.key);\n throw error;\n }\n }\n\n static async inspectExecution(path: string): Promise<{\n open: boolean;\n started: boolean;\n result?: { status: \"completed\" | \"aborted\" | \"failed\" | \"declined\"; endedAt: number };\n }> {\n return withSessionSnapshot(path, async (session) => {\n const state = (await session.getValue(laneState(\"main\"), TODO_CONTEXT))?.value;\n const result = state?.lastOperationId\n ? (await session.getValue(operationResult(state.lastOperationId), TODO_CONTEXT))?.value\n : undefined;\n return {\n open: state?.currentOperationId != null,\n started: state?.currentOperationId != null || state?.lastOperationId != null,\n result: result ? { status: result.status, endedAt: result.endedAt } : undefined,\n };\n });\n }\n\n static async inspect(path: string): Promise<SessionInspection> {\n return withSessionSnapshot(path, async (session, header) => {\n const metadata = (await session.getValue(MIKAN_METADATA, TODO_CONTEXT))?.value;\n const entries = await session.findEntries({ order: \"asc\" }, TODO_CONTEXT);\n const name = await session.getName(TODO_CONTEXT);\n const branchObject = await mainBranch(session, false);\n const branch = branchObject\n ? await branchObject.findEntries({ order: \"oldestFirst\" }, TODO_CONTEXT)\n : [];\n const context = buildContext(branch);\n return new CachedSessionInspection(\n headerView(header, metadata),\n entries,\n name,\n branch,\n context,\n );\n });\n }\n\n static async create(\n path: string,\n cwd: string,\n options?: SessionCreateInfo,\n ): Promise<SessionStore> {\n const writer = acquireWriter(path);\n const writerPath = writer.path;\n let leaseKey = writer.key;\n let opened: Awaited<ReturnType<typeof openFileSession>> | undefined;\n try {\n const built = buildHeader(cwd, options);\n mkdirSync(dirname(writerPath), { recursive: true });\n writeFileSync(writerPath, `${JSON.stringify(built.header)}\\n`, { mode: 0o600, flag: \"wx\" });\n leaseKey = promotePendingWriter(leaseKey, writerPath);\n opened = await openFileSession(writerPath, built.header);\n if (built.metadata) {\n await opened.session.setValue(MIKAN_METADATA, built.metadata, TODO_CONTEXT);\n }\n return new SessionStore(writerPath, cwd, { kind: \"live\", ...built, ...opened }, leaseKey);\n } catch (error) {\n if (opened) {\n await opened.session.close(TODO_CONTEXT).catch(() => undefined);\n await opened.repo.close(TODO_CONTEXT).catch(() => undefined);\n }\n releaseWriter(leaseKey);\n throw error;\n }\n }\n\n static readHeader(path: string): SessionHeader | null {\n let firstLine: string;\n try {\n firstLine = readHeaderLine(path);\n } catch {\n return null;\n }\n if (firstLine.trim().length === 0) return null;\n try {\n const header = parseCurrentHeader(path, firstLine);\n return headerView(header, parseMikanMetadata(path));\n } catch {\n return null;\n }\n }\n\n static writeHeaderFile(path: string, cwd: string, options?: SessionCreateInfo): void {\n mkdirSync(dirname(path), { recursive: true });\n const built = buildHeader(cwd, options);\n atomicWritePrivateFile(path, `${JSON.stringify(built.header)}\\n`);\n }\n\n static inMemory(cwd = process.cwd()): SessionStore {\n const built = buildHeader(cwd);\n return new SessionStore(null, cwd, { kind: \"pending\", ...built, fingerprint: null }, null);\n }\n\n getSessionFile(): string | undefined {\n this.assertOpen();\n return this.sessionFile ?? undefined;\n }\n\n isPersisted(): boolean {\n this.assertOpen();\n return this.sessionFile !== null;\n }\n\n getCwd(): string {\n this.assertOpen();\n return this.cwd;\n }\n\n getHeader(): SessionHeader {\n this.assertOpen();\n return headerView(this.state.header, this.state.metadata);\n }\n\n getSessionId(): string {\n this.assertOpen();\n return this.state.header.id;\n }\n\n async getLeafId(): Promise<string | null> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return null;\n return (await mainBranch(this.state.session, false))?.getTipId(TODO_CONTEXT) ?? null;\n }\n\n async getEntry(id: string): Promise<Entry | undefined> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return undefined;\n return this.state.session.getEntry(id, TODO_CONTEXT);\n }\n\n async getEntries(): Promise<Entry[]> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return [];\n return this.state.session.findEntries({ order: \"asc\" }, TODO_CONTEXT);\n }\n\n async getSessionName(): Promise<string | undefined> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return undefined;\n return this.state.session.getName(TODO_CONTEXT);\n }\n\n async getBranch(fromId?: string): Promise<Entry[]> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return [];\n if (fromId !== undefined) {\n return this.state.session.scanBranch({ start: fromId, order: \"oldestFirst\" }, TODO_CONTEXT);\n }\n const branchObject = await mainBranch(this.state.session, false);\n return branchObject ? branchObject.findEntries({ order: \"oldestFirst\" }, TODO_CONTEXT) : [];\n }\n\n async buildSessionContext(): Promise<SessionContext> {\n return buildContext(await this.getBranch());\n }\n\n async connectMcp(servers: Record<string, McpServerConfig>, signal?: AbortSignal) {\n return this.mutate(async () => {\n if (this.mcp) throw new Error(\"SessionStore already has MCP connections\");\n this.mcp = await loadMcpTools(servers, signal);\n for (const error of this.mcp.errors) {\n log.logWarning(`MCP server unavailable: ${error.server}`, error.error);\n }\n signal?.throwIfAborted();\n return this.mcp.tools;\n });\n }\n\n withMcpInstructions(prompt: string): string {\n const instructions = formatMcpServerInstructions(this.mcp?.instructions ?? []);\n return instructions ? `${prompt}\\n\\n${instructions}` : prompt;\n }\n\n async createHarness(options: Omit<AgentHarnessOptions, \"session\">): Promise<AgentHarness> {\n return this.mutate(async () => {\n if (this.harness) throw new Error(\"SessionStore already has an attached harness\");\n const { session } = await this.live();\n const { harness } = await AgentHarness.create({ ...options, session }, TODO_CONTEXT);\n this.harness = harness;\n this.harnessLane = await harness.lane(\"main\", TODO_CONTEXT);\n return harness;\n });\n }\n\n async appendMessage(message: AgentMessage): Promise<string> {\n return this.mutate(async () => {\n if (this.harnessLane) return this.harnessLane.appendMessage(toDurable(message), TODO_CONTEXT);\n const branchObject = await mainBranch((await this.live()).session, true);\n if (!branchObject) throw new Error(\"Failed to create main session branch\");\n return branchObject.appendMessage(toDurable(message), TODO_CONTEXT);\n });\n }\n\n async appendCustomEntry(customType: string, data?: unknown): Promise<string> {\n return this.mutate(async () => {\n if (this.harnessLane) {\n return this.harnessLane.appendCustomEntry(\n customType,\n toDurable(data) as JsonValue,\n TODO_CONTEXT,\n );\n }\n const branchObject = await mainBranch((await this.live()).session, true);\n if (!branchObject) throw new Error(\"Failed to create main session branch\");\n return branchObject.appendCustomEntry(customType, toDurable(data) as JsonValue, TODO_CONTEXT);\n });\n }\n\n async appendCustomMessageEntry(\n customType: string,\n content: string | Array<TextContent | ImageContent>,\n display: boolean,\n details?: unknown,\n ): Promise<string> {\n return this.appendMessage(\n toDurable(createCustomMessage(customType, content, display, details, Date.now())),\n );\n }\n\n async setSessionName(name: string): Promise<void> {\n await this.mutate(async () =>\n (await this.live()).session.setName(name.trim() || undefined, TODO_CONTEXT),\n );\n }\n\n async close(): Promise<void> {\n if (this.closePromise) return this.closePromise;\n this.closed = true;\n this.closePromise = this.mutationTail\n .then(async () => {\n try {\n await this.mcp?.dispose();\n } finally {\n if (this.state.kind === \"live\") {\n try {\n if (this.harness) await this.harness.close(TODO_CONTEXT);\n else await this.state.session.close(TODO_CONTEXT);\n } finally {\n await this.state.repo?.close(TODO_CONTEXT);\n }\n }\n }\n })\n .finally(() => {\n if (this.writerKey !== null) releaseWriter(this.writerKey);\n });\n return this.closePromise;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error(\"SessionStore is closed\");\n }\n\n private mutate<T>(operation: () => Promise<T>): Promise<T> {\n this.assertOpen();\n const result = this.mutationTail.then(operation);\n this.mutationTail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async live(): Promise<LiveState> {\n if (this.state.kind === \"live\") return this.state;\n const pending = this.state;\n const sessionFile = this.sessionFile;\n if (sessionFile === null) {\n const repo = new MemorySessionRepo();\n const session = await repo.create(\n {\n id: pending.header.id,\n parentSessionId: pending.header.parentSessionId,\n },\n TODO_CONTEXT,\n );\n const live: LiveState = {\n kind: \"live\",\n header: pending.header,\n metadata: pending.metadata,\n session,\n repo,\n };\n this.state = live;\n return live;\n }\n materializePendingFile(sessionFile, pending.header, pending.fingerprint);\n if (this.writerKey === null) throw new Error(\"Pending session must have a writer lease\");\n this.writerKey = promotePendingWriter(this.writerKey, sessionFile);\n const opened = await openFileSession(sessionFile, pending.header);\n if (pending.metadata) {\n await opened.session.setValue(MIKAN_METADATA, pending.metadata, TODO_CONTEXT);\n }\n const live: LiveState = {\n kind: \"live\",\n header: pending.header,\n metadata: pending.metadata,\n ...opened,\n };\n this.state = live;\n return live;\n }\n}\n"]}
@@ -10,9 +10,8 @@ export declare function createManagedSessionFile(sessionDir: string, cwd: string
10
10
  export declare function openManagedSession(sessionFile: string, cwd: string): Promise<SessionStore>;
11
11
  export declare function archiveManagedSessionFile(sessionFile: string): string | null;
12
12
  export declare function createManagedSessionFileAtPath(sessionFile: string, cwd: string, parent?: ParentSessionRef): string;
13
- export declare function getThreadSessionFile(channelDir: string, sessionKey: string): string;
13
+ export declare function getThreadSessionFile(sessionsDir: string, sessionKey: string): string;
14
14
  export declare function tryResolveCurrentSession(sessionDir: string): string | null;
15
15
  export declare function tryResolveThreadSession(sessionFile: string): string | null;
16
- export declare function resolveChannelSessionFile(channelDir: string): string | null;
17
- export declare function resolveParentSessionForThread(channelDir: string, threadTs: string | undefined): ParentSessionRef | null;
16
+ export declare function resolveParentSessionForThread(sessionsDir: string, threadTs: string | undefined): ParentSessionRef | null;
18
17
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/sessions/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGvE,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAQrE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjF;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D;AAYD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAO/D;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAM1F;AAOD,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa5E;AAQD,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,gBAAgB,GACxB,MAAM,CAGR;AAeD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGnF;AAyDD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI1E;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3E;AAID,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,gBAAgB,GAAG,IAAI,CAYzB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/sessions/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGvE,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAQrE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjF;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D;AAYD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAO/D;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAM1F;AAOD,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa5E;AAQD,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,gBAAgB,GACxB,MAAM,CAGR;AAeD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEpF;AAyDD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI1E;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1E;AAID,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,gBAAgB,GAAG,IAAI,CAYzB"}
@@ -3,7 +3,6 @@ import { existsSync, lstatSync, mkdirSync, readdirSync, renameSync, rmSync } fro
3
3
  import { basename, dirname, join, relative, resolve, sep } from "node:path";
4
4
  import { SessionStore } from "./session-store.js";
5
5
  import { atomicWritePrivateFile, parseJsonValue, readTextFileIfExists } from "../file-guards.js";
6
- import { officeSessionsDir } from "../office/index.js";
7
6
  import { assertSessionSuffix, threadSuffixOf } from "./session-key.js";
8
7
  import { isRecord } from "../unknown-values.js";
9
8
  export function isPlatformHistorySession(sessionFile) {
@@ -102,9 +101,8 @@ function writeSessionHeader(sessionFile, cwd, sessionId = randomUUID(), parent)
102
101
  parentSessionId: parent?.id,
103
102
  });
104
103
  }
105
- export function getThreadSessionFile(channelDir, sessionKey) {
106
- const sessionDir = officeSessionsDir(channelDir);
107
- return resolveChildPath(sessionDir, `${extractSessionSuffix(sessionKey)}.jsonl`);
104
+ export function getThreadSessionFile(sessionsDir, sessionKey) {
105
+ return resolveChildPath(sessionsDir, `${extractSessionSuffix(sessionKey)}.jsonl`);
108
106
  }
109
107
  function isRegularSessionFile(sessionFile) {
110
108
  try {
@@ -164,20 +162,17 @@ export function tryResolveCurrentSession(sessionDir) {
164
162
  export function tryResolveThreadSession(sessionFile) {
165
163
  return isRegularSessionFile(sessionFile) && hasSessionHeader(sessionFile) ? sessionFile : null;
166
164
  }
167
- export function resolveChannelSessionFile(channelDir) {
168
- return tryResolveCurrentSession(officeSessionsDir(channelDir));
169
- }
170
165
  const MAIN_SESSION_FILENAME = /^\d{4}-\d{2}-\d{2}T.+_[0-9a-f]{8}\.jsonl$/i;
171
- export function resolveParentSessionForThread(channelDir, threadTs) {
166
+ export function resolveParentSessionForThread(sessionsDir, threadTs) {
172
167
  if (threadTs !== undefined) {
173
168
  const threadTimeMs = Number(threadTs) * 1000;
174
169
  if (Number.isFinite(threadTimeMs)) {
175
- const best = findMainSessionActiveAtTime(channelDir, threadTimeMs);
170
+ const best = findMainSessionActiveAtTime(sessionsDir, threadTimeMs);
176
171
  if (best)
177
172
  return best;
178
173
  }
179
174
  }
180
- const path = resolveChannelSessionFile(channelDir);
175
+ const path = tryResolveCurrentSession(sessionsDir);
181
176
  if (!path)
182
177
  return null;
183
178
  const id = readSessionHeaderSummary(path)?.id;
@@ -192,11 +187,10 @@ function mainSessionSummaries(sessionDir) {
192
187
  return summary ? [{ path, id: summary.id, timestampMs: summary.timestampMs }] : [];
193
188
  });
194
189
  }
195
- function findMainSessionActiveAtTime(channelDir, targetMs) {
196
- const sessionDir = officeSessionsDir(channelDir);
197
- if (!existsSync(sessionDir))
190
+ function findMainSessionActiveAtTime(sessionsDir, targetMs) {
191
+ if (!existsSync(sessionsDir))
198
192
  return null;
199
- const started = mainSessionSummaries(sessionDir).filter((summary) => summary.timestampMs <= targetMs);
193
+ const started = mainSessionSummaries(sessionsDir).filter((summary) => summary.timestampMs <= targetMs);
200
194
  if (started.length === 0)
201
195
  return null;
202
196
  const best = started.reduce((a, b) => (b.timestampMs > a.timestampMs ? b : a));