@evalops/maestro 0.10.22 → 0.10.24

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 (387) hide show
  1. package/README.md +4 -4
  2. package/dist/agent/agent.d.ts +2 -2
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +1 -1
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/keys.d.ts +2 -5
  7. package/dist/agent/keys.d.ts.map +1 -1
  8. package/dist/agent/keys.js +4 -5
  9. package/dist/agent/keys.js.map +1 -1
  10. package/dist/agent/modes.d.ts +2 -2
  11. package/dist/agent/modes.d.ts.map +1 -1
  12. package/dist/agent/modes.js +6 -7
  13. package/dist/agent/modes.js.map +1 -1
  14. package/dist/agent/providers/anthropic.d.ts.map +1 -1
  15. package/dist/agent/providers/anthropic.js +4 -4
  16. package/dist/agent/providers/anthropic.js.map +1 -1
  17. package/dist/agent/providers/google.js +1 -1
  18. package/dist/agent/swarm/executor.d.ts +2 -0
  19. package/dist/agent/swarm/executor.d.ts.map +1 -1
  20. package/dist/agent/swarm/executor.js +208 -35
  21. package/dist/agent/swarm/executor.js.map +1 -1
  22. package/dist/agent/swarm/types.d.ts +2 -0
  23. package/dist/agent/swarm/types.d.ts.map +1 -1
  24. package/dist/agent/swarm/types.js.map +1 -1
  25. package/dist/agent/tool-capability-types.d.ts +36 -0
  26. package/dist/agent/tool-capability-types.d.ts.map +1 -0
  27. package/dist/agent/tool-capability-types.js +2 -0
  28. package/dist/agent/tool-capability-types.js.map +1 -0
  29. package/dist/agent/transport/tool-execution-bridge.d.ts +13 -0
  30. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  31. package/dist/agent/transport/tool-execution-bridge.js +28 -15
  32. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  33. package/dist/agent/transport/transport-utils.d.ts.map +1 -1
  34. package/dist/agent/transport/transport-utils.js +2 -3
  35. package/dist/agent/transport/transport-utils.js.map +1 -1
  36. package/dist/agent/transport.js +1 -1
  37. package/dist/agent/transport.js.map +1 -1
  38. package/dist/agent/type-guards.d.ts +1 -1
  39. package/dist/agent/type-guards.js +1 -1
  40. package/dist/agent/type-guards.js.map +1 -1
  41. package/dist/agent/types.d.ts +5 -3
  42. package/dist/agent/types.d.ts.map +1 -1
  43. package/dist/agent/types.js +2 -2
  44. package/dist/agent/types.js.map +1 -1
  45. package/dist/app-server/daemon-lifecycle-api.d.ts +31 -0
  46. package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -0
  47. package/dist/app-server/daemon-lifecycle-api.js +259 -0
  48. package/dist/app-server/daemon-lifecycle-api.js.map +1 -0
  49. package/dist/app-server/external-agent-import-api.d.ts +30 -0
  50. package/dist/app-server/external-agent-import-api.d.ts.map +1 -0
  51. package/dist/app-server/external-agent-import-api.js +553 -0
  52. package/dist/app-server/external-agent-import-api.js.map +1 -0
  53. package/dist/app-server/host-control-api.d.ts +30 -0
  54. package/dist/app-server/host-control-api.d.ts.map +1 -0
  55. package/dist/app-server/host-control-api.js +343 -0
  56. package/dist/app-server/host-control-api.js.map +1 -0
  57. package/dist/app-server/in-process-client.d.ts +2 -2
  58. package/dist/app-server/in-process-client.d.ts.map +1 -1
  59. package/dist/app-server/in-process-client.js.map +1 -1
  60. package/dist/app-server/network-governance-api.d.ts +26 -0
  61. package/dist/app-server/network-governance-api.d.ts.map +1 -0
  62. package/dist/app-server/network-governance-api.js +476 -0
  63. package/dist/app-server/network-governance-api.js.map +1 -0
  64. package/dist/app-server/plugin-bundle-api.d.ts +17 -0
  65. package/dist/app-server/plugin-bundle-api.d.ts.map +1 -0
  66. package/dist/app-server/plugin-bundle-api.js +219 -0
  67. package/dist/app-server/plugin-bundle-api.js.map +1 -0
  68. package/dist/app-server/policy-control-api.d.ts +14 -0
  69. package/dist/app-server/policy-control-api.d.ts.map +1 -0
  70. package/dist/app-server/policy-control-api.js +200 -0
  71. package/dist/app-server/policy-control-api.js.map +1 -0
  72. package/dist/app-server/protocol-modes-api.d.ts +22 -0
  73. package/dist/app-server/protocol-modes-api.d.ts.map +1 -0
  74. package/dist/app-server/protocol-modes-api.js +124 -0
  75. package/dist/app-server/protocol-modes-api.js.map +1 -0
  76. package/dist/app-server/sandbox-proof-api.d.ts +21 -0
  77. package/dist/app-server/sandbox-proof-api.d.ts.map +1 -0
  78. package/dist/app-server/sandbox-proof-api.js +127 -0
  79. package/dist/app-server/sandbox-proof-api.js.map +1 -0
  80. package/dist/app-server/session-api.d.ts +93 -3
  81. package/dist/app-server/session-api.d.ts.map +1 -1
  82. package/dist/app-server/session-api.js +706 -18
  83. package/dist/app-server/session-api.js.map +1 -1
  84. package/dist/audit/logger.d.ts +1 -1
  85. package/dist/bootstrap/auth-setup.d.ts.map +1 -1
  86. package/dist/bootstrap/auth-setup.js +17 -2
  87. package/dist/bootstrap/auth-setup.js.map +1 -1
  88. package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
  89. package/dist/bootstrap/model-resolution-setup.js +19 -4
  90. package/dist/bootstrap/model-resolution-setup.js.map +1 -1
  91. package/dist/cli/args.d.ts +2 -2
  92. package/dist/cli/args.d.ts.map +1 -1
  93. package/dist/cli/args.js +2 -2
  94. package/dist/cli/args.js.map +1 -1
  95. package/dist/cli/commands/a2a.d.ts.map +1 -1
  96. package/dist/cli/commands/a2a.js +226 -14
  97. package/dist/cli/commands/a2a.js.map +1 -1
  98. package/dist/cli/commands/anthropic.d.ts +1 -1
  99. package/dist/cli/commands/anthropic.d.ts.map +1 -1
  100. package/dist/cli/commands/anthropic.js +3 -68
  101. package/dist/cli/commands/anthropic.js.map +1 -1
  102. package/dist/cli/commands/modes.js +1 -1
  103. package/dist/cli/commands/modes.js.map +1 -1
  104. package/dist/cli/help.d.ts.map +1 -1
  105. package/dist/cli/help.js +5 -7
  106. package/dist/cli/help.js.map +1 -1
  107. package/dist/cli/rpc-mode.d.ts +1 -1
  108. package/dist/cli/rpc-mode.js +1 -1
  109. package/dist/cli/rpc-mode.js.map +1 -1
  110. package/dist/cli/session.js +1 -1
  111. package/dist/cli/session.js.map +1 -1
  112. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
  113. package/dist/cli-tui/commands/command-catalog.js +7 -12
  114. package/dist/cli-tui/commands/command-catalog.js.map +1 -1
  115. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +1 -1
  116. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
  117. package/dist/cli-tui/commands/subcommands/auth-commands.js +4 -12
  118. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
  119. package/dist/cli-tui/custom-editor.d.ts +1 -1
  120. package/dist/cli-tui/custom-editor.js +2 -2
  121. package/dist/cli-tui/custom-editor.js.map +1 -1
  122. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  123. package/dist/cli-tui/oauth/oauth-flow-controller.js +19 -23
  124. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  125. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  126. package/dist/cli-tui/selectors/model-selector.js +0 -1
  127. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  128. package/dist/cli-tui/selectors/oauth-selector-view.d.ts +2 -2
  129. package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
  130. package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
  131. package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -2
  132. package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
  133. package/dist/cli-tui/selectors/oauth-selector.js +3 -4
  134. package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
  135. package/dist/cli-tui/tui-renderer/mcp-events-setup.js +1 -1
  136. package/dist/cli-tui/tui-renderer/mcp-events-setup.js.map +1 -1
  137. package/dist/cli-tui/tui-renderer.js +2 -2
  138. package/dist/cli-tui/tui-renderer.js.map +1 -1
  139. package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
  140. package/dist/cli-tui/utils/footer-utils.js +1 -1
  141. package/dist/cli-tui/utils/footer-utils.js.map +1 -1
  142. package/dist/cli.js +15171 -14298
  143. package/dist/commands/prompts.d.ts +1 -1
  144. package/dist/commands/prompts.js +1 -1
  145. package/dist/commands/prompts.js.map +1 -1
  146. package/dist/config/constants.d.ts +2 -2
  147. package/dist/config/constants.d.ts.map +1 -1
  148. package/dist/config/constants.js +2 -2
  149. package/dist/config/constants.js.map +1 -1
  150. package/dist/config/index.d.ts +1 -1
  151. package/dist/config/index.js +1 -1
  152. package/dist/config/index.js.map +1 -1
  153. package/dist/config/toml-config.js +3 -3
  154. package/dist/config/toml-config.js.map +1 -1
  155. package/dist/db/client.d.ts +2 -2
  156. package/dist/db/client.js +2 -2
  157. package/dist/db/client.js.map +1 -1
  158. package/dist/db/migrate.d.ts +1 -1
  159. package/dist/db/migrate.js +1 -1
  160. package/dist/db/migrate.js.map +1 -1
  161. package/dist/db/schema.d.ts +2 -2
  162. package/dist/db/schema.js +1 -1
  163. package/dist/db/schema.js.map +1 -1
  164. package/dist/errors/index.d.ts +2 -2
  165. package/dist/errors/index.js +2 -2
  166. package/dist/errors/index.js.map +1 -1
  167. package/dist/main.d.ts +4 -5
  168. package/dist/main.d.ts.map +1 -1
  169. package/dist/main.js +17 -14
  170. package/dist/main.js.map +1 -1
  171. package/dist/mcp/config.d.ts +15 -2
  172. package/dist/mcp/config.d.ts.map +1 -1
  173. package/dist/mcp/config.js +50 -26
  174. package/dist/mcp/config.js.map +1 -1
  175. package/dist/mcp/fathom-cua.d.ts.map +1 -1
  176. package/dist/mcp/fathom-cua.js +10 -0
  177. package/dist/mcp/fathom-cua.js.map +1 -1
  178. package/dist/mcp/manager.d.ts.map +1 -1
  179. package/dist/mcp/manager.js +32 -1
  180. package/dist/mcp/manager.js.map +1 -1
  181. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  182. package/dist/mcp/tool-bridge.js +12 -3
  183. package/dist/mcp/tool-bridge.js.map +1 -1
  184. package/dist/mcp/tool-capabilities.d.ts +5 -0
  185. package/dist/mcp/tool-capabilities.d.ts.map +1 -0
  186. package/dist/mcp/tool-capabilities.js +271 -0
  187. package/dist/mcp/tool-capabilities.js.map +1 -0
  188. package/dist/mcp/types.d.ts +6 -1
  189. package/dist/mcp/types.d.ts.map +1 -1
  190. package/dist/mcp/types.js.map +1 -1
  191. package/dist/models/config-loader.d.ts +1 -1
  192. package/dist/models/factory-integration.d.ts +1 -1
  193. package/dist/models/factory-integration.js +1 -1
  194. package/dist/models/factory-integration.js.map +1 -1
  195. package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts +58 -0
  196. package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts.map +1 -0
  197. package/dist/node_modules/@evalops/contracts/dist/artifacts.js +191 -0
  198. package/dist/node_modules/@evalops/contracts/dist/artifacts.js.map +1 -0
  199. package/dist/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +10 -10
  200. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +4 -3
  201. package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  202. package/dist/node_modules/@evalops/contracts/dist/index.js +3 -2
  203. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  204. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +1182 -14
  205. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
  206. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +450 -1
  207. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
  208. package/dist/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +1 -1
  209. package/dist/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +3 -3
  210. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  211. package/dist/node_modules/@evalops/tui/package.json +1 -1
  212. package/dist/oauth/connectors.d.ts +2 -2
  213. package/dist/oauth/connectors.d.ts.map +1 -1
  214. package/dist/oauth/connectors.js +3 -5
  215. package/dist/oauth/connectors.js.map +1 -1
  216. package/dist/oauth/github-copilot.d.ts +1 -1
  217. package/dist/oauth/github-copilot.js +1 -1
  218. package/dist/oauth/github-copilot.js.map +1 -1
  219. package/dist/oauth/index.d.ts +10 -8
  220. package/dist/oauth/index.d.ts.map +1 -1
  221. package/dist/oauth/index.js +54 -31
  222. package/dist/oauth/index.js.map +1 -1
  223. package/dist/oauth/openai.d.ts +1 -1
  224. package/dist/oauth/openai.js +2 -2
  225. package/dist/oauth/openai.js.map +1 -1
  226. package/dist/platform/a2a-completion-audit.d.ts +41 -0
  227. package/dist/platform/a2a-completion-audit.d.ts.map +1 -0
  228. package/dist/platform/a2a-completion-audit.js +177 -0
  229. package/dist/platform/a2a-completion-audit.js.map +1 -0
  230. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  231. package/dist/platform/a2a-task-ledger.js +17 -0
  232. package/dist/platform/a2a-task-ledger.js.map +1 -1
  233. package/dist/platform/a2a-telemetry-inspect.d.ts +58 -0
  234. package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -0
  235. package/dist/platform/a2a-telemetry-inspect.js +224 -0
  236. package/dist/platform/a2a-telemetry-inspect.js.map +1 -0
  237. package/dist/platform/agent-registry-client.d.ts +8 -0
  238. package/dist/platform/agent-registry-client.d.ts.map +1 -1
  239. package/dist/platform/agent-registry-client.js +9 -1
  240. package/dist/platform/agent-registry-client.js.map +1 -1
  241. package/dist/providers/api-keys.d.ts +2 -2
  242. package/dist/providers/api-keys.js +2 -2
  243. package/dist/providers/api-keys.js.map +1 -1
  244. package/dist/providers/auth.d.ts +3 -6
  245. package/dist/providers/auth.d.ts.map +1 -1
  246. package/dist/providers/auth.js +1 -40
  247. package/dist/providers/auth.js.map +1 -1
  248. package/dist/rpc/index.d.ts +2 -2
  249. package/dist/rpc/index.js +2 -2
  250. package/dist/rpc/index.js.map +1 -1
  251. package/dist/rpc/rpc-types.d.ts +1 -1
  252. package/dist/rpc/rpc-types.js +1 -1
  253. package/dist/rpc/rpc-types.js.map +1 -1
  254. package/dist/safety/nested-agent-guard.js +1 -1
  255. package/dist/safety/nested-agent-guard.js.map +1 -1
  256. package/dist/safety/policy.d.ts +2 -2
  257. package/dist/safety/policy.js +2 -2
  258. package/dist/safety/policy.js.map +1 -1
  259. package/dist/safety/validators/network-policy-validator.d.ts +8 -0
  260. package/dist/safety/validators/network-policy-validator.d.ts.map +1 -1
  261. package/dist/safety/validators/network-policy-validator.js +29 -4
  262. package/dist/safety/validators/network-policy-validator.js.map +1 -1
  263. package/dist/sandbox/local-sandbox.d.ts +1 -1
  264. package/dist/sandbox/local-sandbox.js +1 -1
  265. package/dist/sandbox/local-sandbox.js.map +1 -1
  266. package/dist/server/app-context.d.ts +2 -0
  267. package/dist/server/app-context.d.ts.map +1 -1
  268. package/dist/server/app-context.js.map +1 -1
  269. package/dist/server/handlers/attachments.d.ts.map +1 -1
  270. package/dist/server/handlers/attachments.js +1 -0
  271. package/dist/server/handlers/attachments.js.map +1 -1
  272. package/dist/server/handlers/models.d.ts.map +1 -1
  273. package/dist/server/handlers/models.js +3 -1
  274. package/dist/server/handlers/models.js.map +1 -1
  275. package/dist/server/handlers/session-artifacts.d.ts.map +1 -1
  276. package/dist/server/handlers/session-artifacts.js +13 -74
  277. package/dist/server/handlers/session-artifacts.js.map +1 -1
  278. package/dist/server/handlers/session-attachments.d.ts.map +1 -1
  279. package/dist/server/handlers/session-attachments.js +2 -0
  280. package/dist/server/handlers/session-attachments.js.map +1 -1
  281. package/dist/server/handlers/sessions.js +1 -1
  282. package/dist/server/handlers/sessions.js.map +1 -1
  283. package/dist/server/handlers/status.d.ts +2 -0
  284. package/dist/server/handlers/status.d.ts.map +1 -1
  285. package/dist/server/handlers/status.js +3 -2
  286. package/dist/server/handlers/status.js.map +1 -1
  287. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  288. package/dist/server/headless-runtime-service.js +32 -3
  289. package/dist/server/headless-runtime-service.js.map +1 -1
  290. package/dist/server/hosted-session-manager.d.ts +2 -0
  291. package/dist/server/hosted-session-manager.d.ts.map +1 -1
  292. package/dist/server/hosted-session-manager.js +9 -0
  293. package/dist/server/hosted-session-manager.js.map +1 -1
  294. package/dist/server/model-selection.d.ts.map +1 -1
  295. package/dist/server/model-selection.js +9 -1
  296. package/dist/server/model-selection.js.map +1 -1
  297. package/dist/server/rate-limiter.d.ts +1 -1
  298. package/dist/server/rate-limiter.js +1 -1
  299. package/dist/server/rate-limiter.js.map +1 -1
  300. package/dist/server/router.d.ts +2 -2
  301. package/dist/server/router.js.map +1 -1
  302. package/dist/server/session-serialization.d.ts +9 -9
  303. package/dist/server/session-serialization.js +15 -15
  304. package/dist/server/session-serialization.js.map +1 -1
  305. package/dist/session/manager.d.ts +5 -0
  306. package/dist/session/manager.d.ts.map +1 -1
  307. package/dist/session/manager.js +56 -8
  308. package/dist/session/manager.js.map +1 -1
  309. package/dist/session/session-catalog.d.ts +2 -0
  310. package/dist/session/session-catalog.d.ts.map +1 -1
  311. package/dist/session/session-catalog.js +6 -0
  312. package/dist/session/session-catalog.js.map +1 -1
  313. package/dist/session/session-context.d.ts +2 -0
  314. package/dist/session/session-context.d.ts.map +1 -1
  315. package/dist/session/session-context.js +15 -0
  316. package/dist/session/session-context.js.map +1 -1
  317. package/dist/session/types.d.ts +7 -0
  318. package/dist/session/types.d.ts.map +1 -1
  319. package/dist/session/types.js.map +1 -1
  320. package/dist/session/wire-format.generated.d.ts +1 -0
  321. package/dist/session/wire-format.generated.d.ts.map +1 -1
  322. package/dist/session/wire-format.generated.js +1 -0
  323. package/dist/session/wire-format.generated.js.map +1 -1
  324. package/dist/shared-memory/contract.d.ts +4 -4
  325. package/dist/shared-memory/contract.js +2 -2
  326. package/dist/shared-memory/contract.js.map +1 -1
  327. package/dist/telemetry/index.d.ts +2 -2
  328. package/dist/telemetry/index.d.ts.map +1 -1
  329. package/dist/telemetry/index.js +2 -2
  330. package/dist/telemetry/index.js.map +1 -1
  331. package/dist/telemetry/maestro-event-bus.d.ts +57 -0
  332. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  333. package/dist/telemetry/maestro-event-bus.js +59 -1
  334. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  335. package/dist/telemetry/maestro-event-catalog.d.ts +17 -1
  336. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
  337. package/dist/telemetry/maestro-event-catalog.js +24 -0
  338. package/dist/telemetry/maestro-event-catalog.js.map +1 -1
  339. package/dist/telemetry/mcp-beacon.d.ts +2 -0
  340. package/dist/telemetry/mcp-beacon.d.ts.map +1 -1
  341. package/dist/telemetry/mcp-beacon.js +15 -0
  342. package/dist/telemetry/mcp-beacon.js.map +1 -1
  343. package/dist/telemetry/metrics.d.ts +62 -0
  344. package/dist/telemetry/metrics.d.ts.map +1 -1
  345. package/dist/telemetry/metrics.js +84 -0
  346. package/dist/telemetry/metrics.js.map +1 -1
  347. package/dist/telemetry.d.ts +44 -0
  348. package/dist/telemetry.d.ts.map +1 -1
  349. package/dist/telemetry.js +84 -2
  350. package/dist/telemetry.js.map +1 -1
  351. package/dist/theme/theme-loader.js +2 -2
  352. package/dist/theme/theme-loader.js.map +1 -1
  353. package/dist/theme/theme-schema.json +2 -2
  354. package/dist/theme/theme.d.ts +1 -1
  355. package/dist/theme/theme.js.map +1 -1
  356. package/dist/tools/background/task-types.d.ts +1 -1
  357. package/dist/tools/extract-document.d.ts +1 -0
  358. package/dist/tools/extract-document.d.ts.map +1 -1
  359. package/dist/tools/extract-document.js +2 -1
  360. package/dist/tools/extract-document.js.map +1 -1
  361. package/dist/tools/index.d.ts +55 -55
  362. package/dist/tools/index.js +1 -1
  363. package/dist/tools/index.js.map +1 -1
  364. package/dist/tools/tool-dsl.d.ts +1 -1
  365. package/dist/tools/tool-dsl.js +1 -1
  366. package/dist/tools/tool-dsl.js.map +1 -1
  367. package/dist/utils/document-extractor.d.ts +1 -0
  368. package/dist/utils/document-extractor.d.ts.map +1 -1
  369. package/dist/utils/document-extractor.js +320 -40
  370. package/dist/utils/document-extractor.js.map +1 -1
  371. package/dist/utils/logger.d.ts +1 -1
  372. package/dist/utils/logger.js +1 -1
  373. package/dist/utils/logger.js.map +1 -1
  374. package/dist/version.json +2 -2
  375. package/dist/web-server.d.ts +1 -1
  376. package/dist/web-server.d.ts.map +1 -1
  377. package/dist/web-server.js +12 -8
  378. package/dist/web-server.js.map +1 -1
  379. package/package.json +4 -2
  380. package/dist/oauth/anthropic.d.ts +0 -17
  381. package/dist/oauth/anthropic.d.ts.map +0 -1
  382. package/dist/oauth/anthropic.js +0 -81
  383. package/dist/oauth/anthropic.js.map +0 -1
  384. package/dist/providers/anthropic-auth.d.ts +0 -75
  385. package/dist/providers/anthropic-auth.d.ts.map +0 -1
  386. package/dist/providers/anthropic-auth.js +0 -221
  387. package/dist/providers/anthropic-auth.js.map +0 -1
@@ -292,11 +292,18 @@ export class SessionManager {
292
292
  ? toSessionModelMetadata(state.model)
293
293
  : undefined);
294
294
  const fallbackMetadata = this.resolveModelMetadata(sessionModelKey);
295
+ const provisionalHeaderIndex = this.fileEntries.findIndex((existing) => existing.type === "session" &&
296
+ existing.id === this.sessionId &&
297
+ existing.provisional === true);
298
+ const provisionalHeader = provisionalHeaderIndex >= 0
299
+ ? this.fileEntries[provisionalHeaderIndex]
300
+ : undefined;
301
+ const timestamp = provisionalHeader?.timestamp ?? new Date().toISOString();
295
302
  const entry = {
296
303
  type: "session",
297
304
  version: CURRENT_SESSION_VERSION,
298
305
  id: this.sessionId,
299
- timestamp: new Date().toISOString(),
306
+ timestamp,
300
307
  cwd: process.cwd(),
301
308
  subject: options?.subject || undefined,
302
309
  model: sessionModelKey,
@@ -313,9 +320,20 @@ export class SessionManager {
313
320
  })),
314
321
  };
315
322
  this.metadataCache.apply(entry);
316
- this.fileEntries.unshift(entry);
323
+ if (provisionalHeaderIndex >= 0) {
324
+ this.fileEntries[provisionalHeaderIndex] = entry;
325
+ }
326
+ else {
327
+ this.fileEntries.unshift(entry);
328
+ }
317
329
  this.sessionInitialized = true;
318
- this.persistEntry(entry);
330
+ if (provisionalHeaderIndex >= 0) {
331
+ this.rewriteSessionFile();
332
+ this.flushed = true;
333
+ }
334
+ else {
335
+ this.persistEntry(entry);
336
+ }
319
337
  queueSharedMemoryUpdate({
320
338
  sessionId: this.sessionId,
321
339
  state: {
@@ -550,6 +568,8 @@ export class SessionManager {
550
568
  meta.favorite === undefined &&
551
569
  meta.title === undefined &&
552
570
  meta.tags === undefined &&
571
+ meta.archived === undefined &&
572
+ meta.archivedAt === undefined &&
553
573
  meta.appServerGoal === undefined) {
554
574
  return;
555
575
  }
@@ -560,6 +580,9 @@ export class SessionManager {
560
580
  };
561
581
  try {
562
582
  appendFileSync(targetFile, `${JSON.stringify(entry)}\n`);
583
+ if (resolve(targetFile) === this.sessionFile) {
584
+ this.fileEntries.push(entry);
585
+ }
563
586
  }
564
587
  catch (error) {
565
588
  logger.error("Failed to append session metadata", error instanceof Error ? error : new Error(String(error)));
@@ -663,6 +686,14 @@ export class SessionManager {
663
686
  this.appendSessionMetaEntry(sessionPath, { tags });
664
687
  this.syncSessionMemoryEntry(sessionPath);
665
688
  }
689
+ setSessionArchived(sessionPath, archived) {
690
+ if (!sessionPath || !existsSync(sessionPath))
691
+ return;
692
+ this.appendSessionMetaEntry(sessionPath, {
693
+ archived,
694
+ archivedAt: archived ? new Date().toISOString() : undefined,
695
+ });
696
+ }
666
697
  setSessionAppServerGoal(sessionPath, goal) {
667
698
  if (!sessionPath || !existsSync(sessionPath))
668
699
  return;
@@ -713,6 +744,9 @@ export class SessionManager {
713
744
  isInitialized() {
714
745
  return this.sessionInitialized;
715
746
  }
747
+ canCreateSession() {
748
+ return this.enabled;
749
+ }
716
750
  getSessionId() {
717
751
  return this.sessionId;
718
752
  }
@@ -928,12 +962,12 @@ export class SessionManager {
928
962
  const entries = safeReadSessionEntries(this.sessionFile);
929
963
  const migrated = migrateToCurrentVersion(entries);
930
964
  this.fileEntries = entries;
931
- this.sessionInitialized = entries.some((e) => e.type === "session");
965
+ const header = entries.find((e) => e.type === "session");
966
+ this.sessionInitialized = Boolean(header && header.provisional !== true);
932
967
  this.rebuildIndex(entries);
933
968
  if (migrated) {
934
969
  this.rewriteSessionFile();
935
970
  }
936
- const header = this.getHeader();
937
971
  this.sessionId = header?.id ?? uuidv4();
938
972
  this.flushed = true;
939
973
  this.metadataCache.seedFromFile(this.sessionFile);
@@ -1000,16 +1034,27 @@ export class SessionManager {
1000
1034
  */
1001
1035
  async createSession(options) {
1002
1036
  this.startFreshSession();
1037
+ const now = new Date().toISOString();
1038
+ const header = {
1039
+ type: "session",
1040
+ version: CURRENT_SESSION_VERSION,
1041
+ id: this.sessionId,
1042
+ timestamp: now,
1043
+ cwd: process.cwd(),
1044
+ provisional: true,
1045
+ };
1046
+ this.fileEntries.unshift(header);
1003
1047
  if (options?.title && this.enabled) {
1004
1048
  const entry = {
1005
1049
  type: "session_meta",
1006
- timestamp: new Date().toISOString(),
1050
+ timestamp: now,
1007
1051
  title: options.title,
1008
1052
  };
1009
1053
  this.fileEntries.push(entry);
1010
- this.persistEntry(entry);
1011
1054
  }
1012
- const now = new Date().toISOString();
1055
+ this.rewriteSessionFile();
1056
+ this.flushed = true;
1057
+ this.sessionInitialized = false;
1013
1058
  return {
1014
1059
  id: this.sessionId,
1015
1060
  title: options?.title,
@@ -1027,6 +1072,9 @@ export class SessionManager {
1027
1072
  const entries = safeReadSessionEntries(resolvedSource);
1028
1073
  return this.importPortableEntries(entries);
1029
1074
  }
1075
+ importSessionEntries(entries) {
1076
+ return this.importPortableEntries([...entries]);
1077
+ }
1030
1078
  importPortableSession(sourcePath) {
1031
1079
  const resolvedSource = resolve(sourcePath);
1032
1080
  if (!existsSync(resolvedSource)) {
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session Manager - Conversation Persistence and Recovery\n *\n * Sessions are stored as JSONL (JSON Lines) files. Each entry is append-only and\n * may include tree metadata (id/parentId) to support branching and navigation.\n *\n * Tree entries form a conversation tree where the \"leaf\" pointer tracks the\n * active branch. The session file is append-only; branching updates the leaf\n * pointer without modifying history.\n */\n\nimport {\n\tappendFileSync,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\treaddirSync,\n\tstatSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { extname, join, resolve } from \"node:path\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type {\n\tAgentState,\n\tAppMessage,\n\tImageContent,\n\tTextContent,\n} from \"../agent/types.js\";\nimport { SESSION_CONFIG, getAgentDir } from \"../config/constants.js\";\nimport { getRegisteredModels } from \"../models/registry.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport { queueSharedMemoryUpdate } from \"../shared-memory/client.js\";\nimport { recordMaestroPromptVariantSelected } from \"../telemetry/maestro-event-bus.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { SessionFileWriter } from \"./file-writer.js\";\nimport {\n\tSessionMetadataCache,\n\ttype SessionModelMetadata,\n} from \"./metadata-cache.js\";\nimport {\n\tmigrateToCurrentVersion,\n\tregisterActiveSessionFile,\n\tscheduleSessionMigration,\n\tunregisterActiveSessionFile,\n} from \"./migration.js\";\nimport { sanitizeSessionScope } from \"./scope.js\";\nimport {\n\tcreateBranchedSessionFromLeaf as createBranchedSessionFromLeafFn,\n\tcreateBranchedSessionFromState as createBranchedSessionFromStateFn,\n} from \"./session-branch.js\";\nimport { SessionCatalog } from \"./session-catalog.js\";\nimport {\n\ttype SessionContextSnapshot,\n\tbuildSessionContextFromEntries,\n\tgenerateEntryId,\n\tsafeReadSessionEntries,\n} from \"./session-context.js\";\nimport { syncSessionMemory } from \"./session-memory.js\";\nimport {\n\tapplyAttachmentExtracts,\n\tsanitizeMessageForSession,\n} from \"./session-sanitize.js\";\nimport {\n\ttype AttachmentExtractedEntry,\n\ttype BranchSummaryEntry,\n\tCURRENT_SESSION_VERSION,\n\ttype CompactionEntry,\n\ttype CustomEntry,\n\ttype CustomMessageEntry,\n\ttype LabelEntry,\n\ttype ModelChangeEntry,\n\ttype SessionEntry,\n\ttype SessionHeaderEntry,\n\ttype SessionMessageEntry,\n\ttype SessionMessagesView,\n\ttype SessionMetaEntry,\n\ttype SessionMetadata,\n\ttype SessionSummary,\n\ttype SessionTreeEntry,\n\ttype SessionTreeNode,\n\ttype ThinkingLevelChangeEntry,\n\tgetPersistedSessionPromptContextManifest,\n\tisSessionTreeEntry,\n\ttryParseSessionEntry,\n} from \"./types.js\";\n\nexport interface SessionManagerOptions {\n\t/** Override the base session directory (before per-cwd scoping). */\n\tsessionDir?: string;\n\t/** Optional scope key (e.g., auth subject) for per-user session isolation. */\n\tsessionScope?: string;\n}\n\nconst logger = createLogger(\"session-manager\");\nconst PORTABLE_SESSION_EXPORT_FORMAT = \"maestro-session-export.v1\";\n\ninterface PortableSessionBundle {\n\tformat: string;\n\texportedAt: string;\n\tsessionId?: string;\n\tentries?: SessionEntry[];\n\tsessions?: PortableSessionExportSession[];\n}\n\nexport interface PortableSessionExportSession {\n\tsessionId: string;\n\tparentSessionId?: string;\n\tsessionFile: string;\n\tentries?: SessionEntry[];\n}\n\nexport interface PortableSessionImportResult {\n\tsessionFile: string;\n\tsessionId: string;\n\timportedCount: number;\n}\n\ninterface PortableSessionExportRecord {\n\tsessionId: string;\n\tsessionFile: string;\n\ttimestamp: string;\n\tparentSessionId?: string;\n\tparentSessionFile?: string;\n}\n\n// Re-export SessionModelMetadata for backward compatibility\nexport type { SessionModelMetadata } from \"./metadata-cache.js\";\n\nexport type {\n\tAttachmentExtractedEntry,\n\tBranchSummaryEntry,\n\tCompactionEntry,\n\tSessionHeaderEntry,\n\tSessionMessageEntry,\n\tSessionMetaEntry,\n\tSessionMigrationState,\n\tSessionToolInfo,\n\tSessionTreeEntry,\n\tSessionTreeNode,\n} from \"./types.js\";\n\nexport {\n\tgetMigrationState,\n\tregisterActiveSessionFile,\n\tresetMigrationState,\n\trunSessionMigration,\n\tscheduleSessionMigration,\n\tunregisterActiveSessionFile,\n} from \"./migration.js\";\n\nexport function toSessionModelMetadata(\n\tmodel: RegisteredModel,\n): SessionModelMetadata {\n\treturn {\n\t\tprovider: model.provider,\n\t\tmodelId: model.id,\n\t\tproviderName: model.providerName,\n\t\tname: model.name,\n\t\tbaseUrl: model.baseUrl,\n\t\treasoning: model.reasoning,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\tsource: model.source,\n\t};\n}\n\nfunction findRegisteredModel(modelKey: string): RegisteredModel | undefined {\n\tconst [provider, modelId] = modelKey.split(\"/\");\n\tif (!provider || !modelId) {\n\t\treturn undefined;\n\t}\n\treturn getRegisteredModels().find(\n\t\t(entry) => entry.provider === provider && entry.id === modelId,\n\t);\n}\n\n/**\n * Main session management class.\n */\nexport class SessionManager {\n\t/** Unique identifier for this session (UUID v4) */\n\tprivate sessionId!: string;\n\t/** Absolute path to the session JSONL file */\n\tprivate sessionFile!: string;\n\t/** Directory containing all session files for current project */\n\tprivate sessionDir: string;\n\t/** Optional scope for per-user session isolation */\n\tprivate sessionScope?: string;\n\t/** Optional override for base session directory */\n\tprivate sessionDirOverride?: string;\n\t/** Whether session persistence is enabled (disabled by --no-session) */\n\tprivate enabled = true;\n\t/** Whether the session header has been written */\n\tprivate sessionInitialized = false;\n\t/** Buffered file writer for efficient I/O */\n\tprivate writer?: SessionFileWriter;\n\t/** Snapshot of agent state for recovery purposes */\n\tprivate _agentSnapshot?: AgentState;\n\t/** Metadata for the last used model */\n\tprivate lastModelMetadata?: SessionModelMetadata;\n\t/** Cache for current model/thinking level */\n\tprivate metadataCache = new SessionMetadataCache();\n\tprivate readonly catalog: SessionCatalog;\n\n\tprivate fileEntries: SessionEntry[] = [];\n\tprivate byId: Map<string, SessionTreeEntry> = new Map();\n\tprivate labelsById: Map<string, string> = new Map();\n\tprivate leafId: string | null = null;\n\tprivate flushed = false;\n\tprivate _hasAssistantMessage = false;\n\n\t/**\n\t * Creates a new SessionManager.\n\t *\n\t * @param continueSession - If true, loads the most recently modified session\n\t * @param customSessionPath - Optional specific session file to load\n\t * @param options - Optional session directory/scope overrides\n\t */\n\tconstructor(\n\t\tcontinueSession = false,\n\t\tcustomSessionPath?: string,\n\t\toptions: SessionManagerOptions = {},\n\t) {\n\t\tthis.sessionScope = options.sessionScope;\n\t\tthis.sessionDirOverride = options.sessionDir;\n\t\tthis.sessionDir = this.getSessionDirectory();\n\t\tthis.catalog = new SessionCatalog({\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tbeforeRead: () => this.writer?.flushSync(),\n\t\t\tgetCurrentSessionId: () => this.sessionId,\n\t\t});\n\n\t\tif (customSessionPath) {\n\t\t\t// Use custom session file path\n\t\t\tthis.sessionFile = resolve(customSessionPath);\n\t\t\tthis.setSessionFile(this.sessionFile);\n\t\t} else if (continueSession) {\n\t\t\tconst mostRecent = this.findMostRecentlyModifiedSession();\n\t\t\tif (mostRecent) {\n\t\t\t\tthis.sessionFile = mostRecent;\n\t\t\t\tthis.setSessionFile(this.sessionFile);\n\t\t\t} else {\n\t\t\t\tthis.initNewSession();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.initNewSession();\n\t\t}\n\n\t\tthis.initializeWriter();\n\t\tif (this.sessionInitialized) {\n\t\t\tthis.metadataCache.seedFromFile(this.sessionFile);\n\t\t}\n\t}\n\n\t/** Disable session saving (for --no-session mode) */\n\tdisable() {\n\t\tthis.enabled = false;\n\t\t// Unregister session file before disabling\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t}\n\n\tprivate initializeWriter(): void {\n\t\tif (!this.enabled) {\n\t\t\tthis.writer = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.writer = new SessionFileWriter(this.sessionFile);\n\t}\n\n\tprivate getSessionDirectory(): string {\n\t\tconst cwd = process.cwd();\n\t\tconst safePath = `--${cwd.replace(/^[/\\\\]/, \"\").replace(/[/\\\\:]/g, \"-\")}--`;\n\n\t\tconst baseOverride =\n\t\t\tresolveEnvPath(this.sessionDirOverride) ??\n\t\t\tresolveEnvPath(process.env.MAESTRO_SESSION_DIR);\n\t\tconst baseDir =\n\t\t\tbaseOverride ??\n\t\t\tSESSION_CONFIG.DEFAULT_DIR ??\n\t\t\tjoin(getAgentDir(), \"sessions\");\n\n\t\tconst scope = this.sessionScope\n\t\t\t? sanitizeSessionScope(this.sessionScope)\n\t\t\t: \"\";\n\t\tconst sessionDir = scope\n\t\t\t? join(baseDir, scope, safePath)\n\t\t\t: join(baseDir, safePath);\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\t\treturn sessionDir;\n\t}\n\n\tprivate initNewSession(): void {\n\t\tthis.sessionId = uuidv4();\n\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\tthis.sessionFile = join(\n\t\t\tthis.sessionDir,\n\t\t\t`${timestamp}_${this.sessionId}.jsonl`,\n\t\t);\n\t\t// Register new session file to prevent migration race conditions\n\t\tregisterActiveSessionFile(this.sessionFile);\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\t\tthis._hasAssistantMessage = false;\n\t\tthis.sessionInitialized = false;\n\t\tthis.metadataCache.reset();\n\t}\n\n\tstartFreshSession(): void {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\t\tthis._agentSnapshot = undefined;\n\t\tthis.lastModelMetadata = undefined;\n\t\t// Unregister old session file before creating new one\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.initNewSession();\n\t\tthis.initializeWriter();\n\t}\n\n\t/**\n\t * Reset session state for /clear command - clears pending messages and starts new session\n\t */\n\treset(): void {\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\n\t\t// Unregister old session file before creating new one\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\t\tthis._hasAssistantMessage = false;\n\t\tthis.sessionInitialized = false;\n\t\tthis.metadataCache.reset();\n\t\tthis._agentSnapshot = undefined;\n\t\tthis.lastModelMetadata = undefined;\n\n\t\tthis.initNewSession();\n\t\tthis.initializeWriter();\n\t}\n\n\tprivate findMostRecentlyModifiedSession(): string | null {\n\t\ttry {\n\t\t\tconst files = readdirSync(this.sessionDir)\n\t\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t\t.map((f) => ({\n\t\t\t\t\tpath: join(this.sessionDir, f),\n\t\t\t\t\tmtime: statSync(join(this.sessionDir, f)).mtime,\n\t\t\t\t}))\n\t\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\t\treturn files[0]?.path || null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate rebuildIndex(entries: SessionEntry[]): void {\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis._hasAssistantMessage = false;\n\n\t\tfor (const entry of entries) {\n\t\t\tif (!isSessionTreeEntry(entry)) continue;\n\t\t\tthis.byId.set(entry.id, entry);\n\t\t\tthis.leafId = entry.id;\n\t\t\tif (entry.type === \"label\") {\n\t\t\t\tif (entry.label) {\n\t\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t\t} else {\n\t\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\tthis._hasAssistantMessage = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rewriteSessionFile(): void {\n\t\tif (!this.enabled || !this.sessionFile) return;\n\t\tconst content = `${this.fileEntries.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`;\n\t\twriteFileSync(this.sessionFile, content);\n\t}\n\n\tprivate persistEntry(entry: SessionEntry): void {\n\t\tif (!this.enabled || !this.writer || !this.sessionFile) return;\n\t\tif (!this.sessionInitialized) return;\n\n\t\tif (!this.flushed) {\n\t\t\tfor (const e of this.fileEntries) {\n\t\t\t\tthis.writer.write(e);\n\t\t\t}\n\t\t\tthis.writer.flushSync();\n\t\t\tthis.flushed = true;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.writer.write(entry);\n\t}\n\n\tprivate appendTreeEntry(entry: SessionTreeEntry): void {\n\t\tthis.fileEntries.push(entry);\n\t\tthis.byId.set(entry.id, entry);\n\t\tthis.leafId = entry.id;\n\t\tif (entry.type === \"label\") {\n\t\t\tif (entry.label) {\n\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t} else {\n\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t}\n\t\t}\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tthis._hasAssistantMessage = true;\n\t\t}\n\t\tthis.persistEntry(entry);\n\t}\n\n\tprivate createTreeEntryId(): string {\n\t\treturn generateEntryId(this.byId);\n\t}\n\n\tstartSession(state: AgentState, options?: { subject?: string }): void {\n\t\tif (!this.enabled || this.sessionInitialized) return;\n\n\t\tconst modelKeyFromState = `${state.model.provider}/${state.model.id}`;\n\t\tconst latestModelChange = this.getLatestModelChange();\n\t\tconst latestThinkingLevel = this.getLatestThinkingLevel();\n\t\tconst sessionModelKey = latestModelChange?.model ?? modelKeyFromState;\n\t\tconst primaryMetadata =\n\t\t\tlatestModelChange?.modelMetadata ??\n\t\t\t(sessionModelKey === modelKeyFromState\n\t\t\t\t? toSessionModelMetadata(state.model as RegisteredModel)\n\t\t\t\t: undefined);\n\t\tconst fallbackMetadata = this.resolveModelMetadata(sessionModelKey);\n\t\tconst entry: SessionHeaderEntry = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcwd: process.cwd(),\n\t\t\tsubject: options?.subject || undefined,\n\t\t\tmodel: sessionModelKey,\n\t\t\tmodelMetadata: primaryMetadata ?? fallbackMetadata,\n\t\t\tthinkingLevel: latestThinkingLevel ?? state.thinkingLevel,\n\t\t\tsystemPrompt: state.systemPrompt,\n\t\t\tpromptMetadata: state.promptMetadata,\n\t\t\tpromptContextManifest: getPersistedSessionPromptContextManifest(state),\n\t\t\tunifiedContextManifest: state.unifiedContextManifest,\n\t\t\ttools: state.tools.map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tlabel: tool.label,\n\t\t\t\tdescription: tool.description,\n\t\t\t})),\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\t\tthis.fileEntries.unshift(entry);\n\t\tthis.sessionInitialized = true;\n\n\t\tthis.persistEntry(entry);\n\n\t\tqueueSharedMemoryUpdate({\n\t\t\tsessionId: this.sessionId,\n\t\t\tstate: {\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tmodel: sessionModelKey,\n\t\t\t\tupdatedAt: entry.timestamp,\n\t\t\t\tsource: \"maestro\",\n\t\t\t},\n\t\t\tevent: {\n\t\t\t\ttype: \"maestro.session.started\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tmodel: sessionModelKey,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (state.promptMetadata) {\n\t\t\trecordMaestroPromptVariantSelected({\n\t\t\t\tprompt_metadata: state.promptMetadata,\n\t\t\t\tcorrelation: {\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t},\n\t\t\t\tselected_at: entry.timestamp,\n\t\t\t});\n\t\t}\n\n\t\t// Auto-prune old sessions in the background (non-blocking)\n\t\tif (\n\t\t\tSESSION_CONFIG.MAX_SESSIONS > 0 ||\n\t\t\tSESSION_CONFIG.MAX_SESSION_AGE_DAYS > 0\n\t\t) {\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = this.pruneSessions();\n\t\t\t\t\tif (result.removed > 0) {\n\t\t\t\t\t\tlogger.debug(\"Auto-pruned sessions\", result);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\"Session auto-prune failed\",\n\t\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t}\n\t}\n\n\tsaveMessage(message: AppMessage): void {\n\t\tif (!this.enabled) return;\n\t\tconst sanitizedMessage = sanitizeMessageForSession(message);\n\t\tconst entry: SessionMessageEntry = {\n\t\t\ttype: \"message\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmessage: sanitizedMessage,\n\t\t};\n\n\t\tthis.appendTreeEntry(entry);\n\n\t\tqueueSharedMemoryUpdate({\n\t\t\tsessionId: this.sessionId,\n\t\t\tstate: {\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tupdatedAt: entry.timestamp,\n\t\t\t\tlastMessageId: entry.id,\n\t\t\t\tlastMessageRole: message.role,\n\t\t\t\tsource: \"maestro\",\n\t\t\t},\n\t\t\tevent: {\n\t\t\t\ttype: \"maestro.message.saved\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tmessageId: entry.id,\n\t\t\t\t\trole: message.role,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\tsaveThinkingLevelChange(thinkingLevel: string): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: ThinkingLevelChangeEntry = {\n\t\t\ttype: \"thinking_level_change\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tthinkingLevel,\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tsaveModelChange(model: string, metadata?: SessionModelMetadata): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: ModelChangeEntry = {\n\t\t\ttype: \"model_change\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmodel,\n\t\t\tmodelMetadata: metadata,\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendCustomEntry(customType: string, data?: unknown): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: CustomEntry = {\n\t\t\ttype: \"custom\",\n\t\t\tcustomType,\n\t\t\tdata,\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendCustomMessageEntry<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: CustomMessageEntry<T> = {\n\t\t\ttype: \"custom_message\",\n\t\t\tcustomType,\n\t\t\tcontent,\n\t\t\tdisplay,\n\t\t\tdetails,\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendBranchSummary(\n\t\tsummary: string,\n\t\toptions?: { fromId?: string; details?: unknown; fromHook?: boolean },\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst fromId = options?.fromId ?? this.leafId ?? \"root\";\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId,\n\t\t\tsummary,\n\t\t\tdetails: options?.details,\n\t\t\tfromHook: options?.fromHook,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendLabel(targetId: string, label: string | undefined): void {\n\t\tif (!this.byId.has(targetId)) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\t\tconst entry: LabelEntry = {\n\t\t\ttype: \"label\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttargetId,\n\t\t\tlabel,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\t/**\n\t * Save a compaction event to the session file.\n\t */\n\tsaveCompaction(\n\t\tsummary: string,\n\t\tfirstKeptEntryIndex: number,\n\t\ttokensBefore: number,\n\t\toptions?: {\n\t\t\tauto?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\tfirstKeptEntryId?: string;\n\t\t},\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst context = this.buildSessionContext();\n\t\tconst resolvedEntry = options?.firstKeptEntryId\n\t\t\t? this.getEntry(options.firstKeptEntryId)\n\t\t\t: undefined;\n\t\tconst targetEntry =\n\t\t\tresolvedEntry ?? context.messageEntries[firstKeptEntryIndex];\n\t\tconst fallbackEntry = this.getEntries()[0];\n\t\tconst firstKeptEntryId =\n\t\t\ttargetEntry?.id ?? this.leafId ?? fallbackEntry?.id;\n\t\tif (!firstKeptEntryId) {\n\t\t\tlogger.warn(\"Failed to resolve compaction cut point; skipping save\");\n\t\t\treturn;\n\t\t}\n\t\tconst entry: CompactionEntry = {\n\t\t\ttype: \"compaction\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore,\n\t\t\tauto: options?.auto,\n\t\t\tcustomInstructions: options?.customInstructions,\n\t\t};\n\n\t\tthis.appendTreeEntry(entry);\n\t\tthis.writer?.flushSync();\n\t}\n\n\t/**\n\t * Find the most recent compaction entry in the current session.\n\t */\n\tfindLatestCompaction(): CompactionEntry | null {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"compaction\") {\n\t\t\t\treturn entry as CompactionEntry;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate getLatestThinkingLevel(): string | undefined {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\t\treturn entry.thinkingLevel;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate getLatestModelChange(): ModelChangeEntry | undefined {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"model_change\") {\n\t\t\t\treturn entry as ModelChangeEntry;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate resolveModelMetadata(\n\t\tmodelKey: string,\n\t): SessionModelMetadata | undefined {\n\t\tconst registered = findRegisteredModel(modelKey);\n\t\treturn registered ? toSessionModelMetadata(registered) : undefined;\n\t}\n\n\tprivate appendSessionMetaEntry(\n\t\ttargetFile: string,\n\t\tmeta: {\n\t\t\tsummary?: string;\n\t\t\tresumeSummary?: string;\n\t\t\tmemoryExtractionHash?: string;\n\t\t\tfavorite?: boolean;\n\t\t\ttitle?: string;\n\t\t\ttags?: string[];\n\t\t\tappServerGoal?: SessionMetaEntry[\"appServerGoal\"];\n\t\t},\n\t): void {\n\t\tif (!existsSync(targetFile)) return;\n\t\tif (\n\t\t\tmeta.summary === undefined &&\n\t\t\tmeta.resumeSummary === undefined &&\n\t\t\tmeta.memoryExtractionHash === undefined &&\n\t\t\tmeta.favorite === undefined &&\n\t\t\tmeta.title === undefined &&\n\t\t\tmeta.tags === undefined &&\n\t\t\tmeta.appServerGoal === undefined\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst entry: SessionMetaEntry = {\n\t\t\ttype: \"session_meta\",\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t...meta,\n\t\t};\n\t\ttry {\n\t\t\tappendFileSync(targetFile, `${JSON.stringify(entry)}\\n`);\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to append session metadata\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate appendAttachmentExtractEntry(\n\t\ttargetFile: string,\n\t\tpayload: { attachmentId: string; extractedText: string },\n\t): AttachmentExtractedEntry | null {\n\t\tif (!existsSync(targetFile)) return null;\n\t\tif (!payload.attachmentId || !payload.extractedText) return null;\n\t\tconst entry: AttachmentExtractedEntry = {\n\t\t\ttype: \"attachment_extract\",\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tattachmentId: payload.attachmentId,\n\t\t\textractedText: payload.extractedText,\n\t\t};\n\t\ttry {\n\t\t\tappendFileSync(targetFile, `${JSON.stringify(entry)}\\n`);\n\t\t\treturn entry;\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to append attachment extraction\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Persist extracted attachment text as an append-only cache entry.\n\t */\n\tsaveAttachmentExtraction(\n\t\tsessionPath: string,\n\t\tattachmentId: string,\n\t\ttext: string,\n\t): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tconst entry = this.appendAttachmentExtractEntry(sessionPath, {\n\t\t\tattachmentId,\n\t\t\textractedText: text,\n\t\t});\n\t\tif (entry && sessionPath === this.sessionFile) {\n\t\t\tthis.fileEntries.push(entry);\n\t\t}\n\t}\n\n\tsaveSessionSummary(summary: string, sessionPath?: string): void {\n\t\tconst trimmed = summary.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { summary: trimmed });\n\t\tthis.syncSessionMemoryEntry(target);\n\t\tif (target === this.sessionFile) {\n\t\t\tqueueSharedMemoryUpdate({\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tstate: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t\t\tsummary: trimmed,\n\t\t\t\t\tsource: \"maestro\",\n\t\t\t\t},\n\t\t\t\tevent: {\n\t\t\t\t\ttype: \"maestro.session.summary\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\t\tlength: trimmed.length,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tsaveSessionResumeSummary(summary: string, sessionPath?: string): void {\n\t\tconst trimmed = summary.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { resumeSummary: trimmed });\n\t\tthis.syncSessionMemoryEntry(target);\n\t}\n\n\tsaveSessionMemoryExtractionHash(hash: string, sessionPath?: string): void {\n\t\tconst trimmed = hash.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { memoryExtractionHash: trimmed });\n\t}\n\n\tsetSessionFavorite(sessionPath: string, favorite: boolean): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { favorite });\n\t}\n\n\tsetSessionTitle(sessionPath: string, title: string): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { title });\n\t\tthis.syncSessionMemoryEntry(sessionPath);\n\t}\n\n\tsetSessionTags(sessionPath: string, tags: string[]): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { tags });\n\t\tthis.syncSessionMemoryEntry(sessionPath);\n\t}\n\n\tsetSessionAppServerGoal(\n\t\tsessionPath: string,\n\t\tgoal: NonNullable<SessionMetaEntry[\"appServerGoal\"]> | null,\n\t): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { appServerGoal: goal });\n\t}\n\n\tprivate syncSessionMemoryEntry(sessionPath: string): void {\n\t\ttry {\n\t\t\tsyncSessionMemory(sessionPath);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to sync session memory\", {\n\t\t\t\tsessionPath,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\tbuildSessionContext(\n\t\tleafId: string | null = this.leafId,\n\t): SessionContextSnapshot {\n\t\treturn buildSessionContextFromEntries(this.fileEntries, {\n\t\t\tleafId,\n\t\t\tbyId: this.byId,\n\t\t\theader: this.getHeader(),\n\t\t});\n\t}\n\n\tloadMessages(): AppMessage[] {\n\t\tconst context = this.buildSessionContext();\n\t\tconst extractedById = new Map<string, string>();\n\t\tfor (const entry of this.fileEntries) {\n\t\t\tif (entry.type === \"attachment_extract\") {\n\t\t\t\tif (entry.attachmentId && entry.extractedText) {\n\t\t\t\t\textractedById.set(entry.attachmentId, entry.extractedText);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (extractedById.size === 0) return context.messages;\n\t\treturn context.messages.map((message) =>\n\t\t\tapplyAttachmentExtracts(message, extractedById),\n\t\t);\n\t}\n\n\tloadThinkingLevel(): string {\n\t\treturn this.buildSessionContext().thinkingLevel;\n\t}\n\n\tloadModel(): string | null {\n\t\treturn this.buildSessionContext().model;\n\t}\n\n\tloadModelMetadata(): SessionModelMetadata | undefined {\n\t\tconst context = this.buildSessionContext();\n\t\treturn context.modelMetadata ?? this.lastModelMetadata;\n\t}\n\n\tisInitialized(): boolean {\n\t\treturn this.sessionInitialized;\n\t}\n\n\tgetSessionId(): string {\n\t\treturn this.sessionId;\n\t}\n\n\tgetSessionFile(): string {\n\t\treturn this.sessionFile;\n\t}\n\n\tgetPortableSessionBundle(): {\n\t\tselectedSessionId: string;\n\t\tsessions: PortableSessionExportSession[];\n\t} {\n\t\tconst records = this.buildPortableSessionRecords();\n\t\tconst byFile = new Map(\n\t\t\trecords.map((record) => [resolve(record.sessionFile), record]),\n\t\t);\n\t\tconst selected = byFile.get(resolve(this.sessionFile));\n\t\tif (!selected) {\n\t\t\treturn {\n\t\t\t\tselectedSessionId: this.sessionId,\n\t\t\t\tsessions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\t\tsessionFile: this.sessionFile,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\tconst byId = new Map(records.map((record) => [record.sessionId, record]));\n\t\tconst parentToChildren = new Map<string, PortableSessionExportRecord[]>();\n\t\tfor (const record of records) {\n\t\t\tif (!record.parentSessionId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst children = parentToChildren.get(record.parentSessionId) ?? [];\n\t\t\tchildren.push(record);\n\t\t\tparentToChildren.set(record.parentSessionId, children);\n\t\t}\n\t\tfor (const children of parentToChildren.values()) {\n\t\t\tchildren.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\t\t}\n\n\t\tlet root = selected;\n\t\tconst visited = new Set<string>();\n\t\twhile (root.parentSessionId && !visited.has(root.sessionId)) {\n\t\t\tvisited.add(root.sessionId);\n\t\t\tconst parent = byId.get(root.parentSessionId);\n\t\t\tif (!parent) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\troot = parent;\n\t\t}\n\n\t\tconst ordered: PortableSessionExportSession[] = [];\n\t\tconst queue: PortableSessionExportRecord[] = [root];\n\t\tconst enqueued = new Set<string>([root.sessionId]);\n\t\twhile (queue.length > 0) {\n\t\t\tconst current = queue.shift();\n\t\t\tif (!current) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tordered.push({\n\t\t\t\tsessionId: current.sessionId,\n\t\t\t\tparentSessionId: current.parentSessionId,\n\t\t\t\tsessionFile: current.sessionFile,\n\t\t\t});\n\t\t\tfor (const child of parentToChildren.get(current.sessionId) ?? []) {\n\t\t\t\tif (enqueued.has(child.sessionId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tenqueued.add(child.sessionId);\n\t\t\t\tqueue.push(child);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tselectedSessionId: selected.sessionId,\n\t\t\tsessions: ordered,\n\t\t};\n\t}\n\n\tgetLeafId(): string | null {\n\t\treturn this.leafId;\n\t}\n\n\tgetLeafEntry(): SessionTreeEntry | undefined {\n\t\treturn this.leafId ? this.byId.get(this.leafId) : undefined;\n\t}\n\n\tgetEntry(id: string): SessionTreeEntry | undefined {\n\t\treturn this.byId.get(id);\n\t}\n\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labelsById.get(id);\n\t}\n\n\tgetChildren(parentId: string): SessionTreeEntry[] {\n\t\tconst children: SessionTreeEntry[] = [];\n\t\tfor (const entry of this.byId.values()) {\n\t\t\tif (entry.parentId === parentId) {\n\t\t\t\tchildren.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn children;\n\t}\n\n\tgetBranch(fromId?: string | null): SessionTreeEntry[] {\n\t\tconst path: SessionTreeEntry[] = [];\n\t\tconst startId = fromId ?? this.leafId;\n\t\tlet current = startId ? this.byId.get(startId) : undefined;\n\t\twhile (current) {\n\t\t\tpath.unshift(current);\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\treturn path;\n\t}\n\n\tgetEntries(): SessionTreeEntry[] {\n\t\treturn this.fileEntries.filter(isSessionTreeEntry);\n\t}\n\n\tgetHeader(): SessionHeaderEntry | null {\n\t\tconst header = this.fileEntries.find((e) => e.type === \"session\");\n\t\treturn header ? (header as SessionHeaderEntry) : null;\n\t}\n\n\tgetTree(): SessionTreeNode[] {\n\t\tconst entries = this.getEntries();\n\t\tconst nodeMap = new Map<string, SessionTreeNode>();\n\t\tconst roots: SessionTreeNode[] = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tconst label = this.labelsById.get(entry.id);\n\t\t\tnodeMap.set(entry.id, { entry, children: [], label });\n\t\t}\n\n\t\tfor (const entry of entries) {\n\t\t\tconst node = nodeMap.get(entry.id);\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (entry.parentId === null || entry.parentId === entry.id) {\n\t\t\t\troots.push(node);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst parent = nodeMap.get(entry.parentId);\n\t\t\tif (parent) {\n\t\t\t\tparent.children.push(node);\n\t\t\t} else {\n\t\t\t\troots.push(node);\n\t\t\t}\n\t\t}\n\n\t\tconst stack: SessionTreeNode[] = [...roots];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop();\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnode.children.sort(\n\t\t\t\t(a, b) =>\n\t\t\t\t\tnew Date(a.entry.timestamp).getTime() -\n\t\t\t\t\tnew Date(b.entry.timestamp).getTime(),\n\t\t\t);\n\t\t\tstack.push(...node.children);\n\t\t}\n\n\t\treturn roots;\n\t}\n\n\tbranch(branchFromId: string): void {\n\t\tif (!this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t}\n\n\tbranchWithSummary(\n\t\tbranchFromId: string | null,\n\t\tsummary: string,\n\t\toptions?: { fromId?: string; details?: unknown; fromHook?: boolean },\n\t): string {\n\t\tif (branchFromId !== null && !this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: branchFromId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId: options?.fromId ?? branchFromId ?? \"root\",\n\t\t\tsummary,\n\t\t\tdetails: options?.details,\n\t\t\tfromHook: options?.fromHook,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tresetLeaf(): void {\n\t\tthis.leafId = null;\n\t}\n\n\tupdateSnapshot(state: AgentState, metadata?: SessionModelMetadata): void {\n\t\tthis._agentSnapshot = state;\n\t\tif (metadata) {\n\t\t\tthis.lastModelMetadata = metadata;\n\t\t}\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tawait this.writer?.flush();\n\t}\n\n\t/**\n\t * Load all sessions for the current directory with metadata\n\t */\n\tloadAllSessions(): SessionMetadata[] {\n\t\treturn this.catalog.loadAllSessions();\n\t}\n\n\tgetSessionFileById(sessionId: string): string | null {\n\t\treturn this.catalog.getSessionFileById(sessionId);\n\t}\n\n\tasync loadEntries(sessionId: string): Promise<SessionEntry[] | null> {\n\t\tconst sessionFile = this.getSessionFileById(sessionId);\n\t\tif (!sessionFile) {\n\t\t\treturn null;\n\t\t}\n\t\treturn safeReadSessionEntries(sessionFile);\n\t}\n\n\t/**\n\t * Set the session file to an existing session\n\t */\n\tsetSessionFile(path: string): void {\n\t\t// Unregister old session file before disposing writer\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\n\t\tthis.sessionFile = resolve(path);\n\t\t// Register new session file to prevent migration race conditions\n\t\tregisterActiveSessionFile(this.sessionFile);\n\t\tscheduleSessionMigration();\n\n\t\tif (existsSync(this.sessionFile)) {\n\t\t\tconst entries = safeReadSessionEntries(this.sessionFile);\n\t\t\tconst migrated = migrateToCurrentVersion(entries);\n\t\t\tthis.fileEntries = entries;\n\t\t\tthis.sessionInitialized = entries.some((e) => e.type === \"session\");\n\t\t\tthis.rebuildIndex(entries);\n\t\t\tif (migrated) {\n\t\t\t\tthis.rewriteSessionFile();\n\t\t\t}\n\t\t\tconst header = this.getHeader();\n\t\t\tthis.sessionId = header?.id ?? uuidv4();\n\t\t\tthis.flushed = true;\n\t\t\tthis.metadataCache.seedFromFile(this.sessionFile);\n\t\t} else {\n\t\t\t// Unregister the non-existent path before initNewSession registers a new one\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t\tthis.initNewSession();\n\t\t}\n\t\tthis.initializeWriter();\n\t}\n\n\t/**\n\t * Check if we should initialize the session based on message history.\n\t * Session is initialized once we have at least 1 user message.\n\t */\n\tshouldInitializeSession(messages: AppMessage[]): boolean {\n\t\tif (this.sessionInitialized) return false;\n\n\t\tconst userMessages = messages.filter((m) => m.role === \"user\");\n\t\treturn userMessages.length >= 1;\n\t}\n\n\t/**\n\t * Create a branched session from a specific message index.\n\t * Returns the new session file path.\n\t * @param state - Current agent state\n\t * @param branchFromIndex - Index of the last message to include in the branch (exclusive)\n\t */\n\tcreateBranchedSession(state: AgentState, branchFromIndex: number): string;\n\t/**\n\t * Create a branched session from a specific tree entry id.\n\t */\n\tcreateBranchedSession(leafId: string): string;\n\tcreateBranchedSession(\n\t\tstateOrLeafId: AgentState | string,\n\t\tbranchFromIndex?: number,\n\t): string {\n\t\tif (typeof stateOrLeafId === \"string\") {\n\t\t\treturn this.createBranchedSessionFromLeaf(stateOrLeafId);\n\t\t}\n\t\tif (typeof branchFromIndex !== \"number\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"branchFromIndex is required when branching from AgentState\",\n\t\t\t);\n\t\t}\n\t\treturn this.createBranchedSessionFromState(stateOrLeafId, branchFromIndex);\n\t}\n\n\tprivate createBranchedSessionFromLeaf(leafId: string): string {\n\t\treturn createBranchedSessionFromLeafFn(leafId, {\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tsessionId: this.sessionId,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tbranch: this.getBranch(leafId),\n\t\t\tcontext: this.buildSessionContext(leafId),\n\t\t\theader: this.getHeader(),\n\t\t\tlabelsById: this.labelsById,\n\t\t});\n\t}\n\n\tprivate createBranchedSessionFromState(\n\t\tstate: AgentState,\n\t\tbranchFromIndex: number,\n\t): string {\n\t\treturn createBranchedSessionFromStateFn(state, branchFromIndex, {\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tsessionId: this.sessionId,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tlastModelMetadata: this.lastModelMetadata,\n\t\t});\n\t}\n\n\t/**\n\t * List all sessions in the session directory\n\t */\n\tasync listSessions(options?: {\n\t\tlimit?: number;\n\t\toffset?: number;\n\t}): Promise<SessionSummary[]> {\n\t\treturn this.catalog.listSessions(options);\n\t}\n\n\t/**\n\t * Load a session by ID\n\t */\n\tasync loadSession(\n\t\tsessionId: string,\n\t\toptions: { messagesView?: SessionMessagesView } = {},\n\t): Promise<{\n\t\tid: string;\n\t\tsubject?: string;\n\t\ttitle?: string;\n\t\tsummary?: string;\n\t\tresumeSummary?: string;\n\t\tmessages: AppMessage[];\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t\tfavorite: boolean;\n\t\ttags?: string[];\n\t\tmessagesView: SessionMessagesView;\n\t} | null> {\n\t\treturn this.catalog.loadSession(sessionId, options);\n\t}\n\n\t/**\n\t * Create a new session\n\t */\n\tasync createSession(options?: { title?: string }): Promise<{\n\t\tid: string;\n\t\ttitle?: string;\n\t\tresumeSummary?: string;\n\t\tmessages: AppMessage[];\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t}> {\n\t\tthis.startFreshSession();\n\n\t\tif (options?.title && this.enabled) {\n\t\t\tconst entry: SessionMetaEntry = {\n\t\t\t\ttype: \"session_meta\",\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\ttitle: options.title,\n\t\t\t};\n\t\t\tthis.fileEntries.push(entry);\n\t\t\tthis.persistEntry(entry);\n\t\t}\n\n\t\tconst now = new Date().toISOString();\n\t\treturn {\n\t\t\tid: this.sessionId,\n\t\t\ttitle: options?.title,\n\t\t\tmessages: [],\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tmessageCount: 0,\n\t\t};\n\t}\n\n\timportSessionJsonl(sourcePath: string): PortableSessionImportResult {\n\t\tconst resolvedSource = resolve(sourcePath);\n\t\tif (!existsSync(resolvedSource)) {\n\t\t\tthrow new Error(`Session file not found: ${resolvedSource}`);\n\t\t}\n\n\t\tconst entries = safeReadSessionEntries(resolvedSource);\n\t\treturn this.importPortableEntries(entries);\n\t}\n\n\timportPortableSession(sourcePath: string): {\n\t\tsessionFile: string;\n\t\tsessionId: string;\n\t\timportedCount: number;\n\t} {\n\t\tconst resolvedSource = resolve(sourcePath);\n\t\tif (!existsSync(resolvedSource)) {\n\t\t\tthrow new Error(`Session file not found: ${resolvedSource}`);\n\t\t}\n\n\t\tconst extension = extname(resolvedSource).toLowerCase();\n\t\tif (extension === \".json\") {\n\t\t\tconst portableExport = this.readPortableJsonExport(resolvedSource);\n\t\t\tif (portableExport.sessions?.length) {\n\t\t\t\treturn this.importPortableSessionBundle(portableExport);\n\t\t\t}\n\t\t\tif (portableExport.entries) {\n\t\t\t\treturn this.importPortableEntries(portableExport.entries);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t\"Portable session export is missing both entries and sessions.\",\n\t\t\t);\n\t\t}\n\n\t\tconst entries = safeReadSessionEntries(resolvedSource);\n\t\treturn this.importPortableEntries(entries);\n\t}\n\n\t/**\n\t * Delete a session\n\t */\n\tasync deleteSession(sessionId: string): Promise<void> {\n\t\tthis.catalog.deleteSession(sessionId);\n\t}\n\n\t/**\n\t * Prune old sessions based on configured limits.\n\t * Removes sessions that exceed MAX_SESSIONS count or MAX_SESSION_AGE_DAYS.\n\t * Favorites are never pruned.\n\t * Returns the number of sessions removed.\n\t */\n\tpruneSessions(): { removed: number; errors: number } {\n\t\treturn this.catalog.pruneSessions();\n\t}\n\n\tprivate importPortableEntries(\n\t\tentries: SessionEntry[],\n\t): PortableSessionImportResult {\n\t\tmigrateToCurrentVersion(entries);\n\t\tif (entries.length === 0) {\n\t\t\tthrow new Error(\"Imported session file is empty or unreadable.\");\n\t\t}\n\n\t\tconst headerIndex = entries.findIndex((entry) => entry.type === \"session\");\n\t\tif (headerIndex < 0) {\n\t\t\tthrow new Error(\"Imported session file is missing a session header.\");\n\t\t}\n\n\t\tconst header = entries[headerIndex] as SessionHeaderEntry;\n\t\tlet sessionId = header.id?.trim() || uuidv4();\n\t\tif (this.catalog.getSessionFileById(sessionId)) {\n\t\t\tsessionId = uuidv4();\n\t\t}\n\n\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\tconst targetFile = join(this.sessionDir, `${timestamp}_${sessionId}.jsonl`);\n\t\tconst importedHeader: SessionHeaderEntry = {\n\t\t\t...header,\n\t\t\tid: sessionId,\n\t\t\tsubject: undefined,\n\t\t};\n\t\tconst importedEntries = entries.map((entry, index) =>\n\t\t\tindex === headerIndex ? importedHeader : entry,\n\t\t);\n\n\t\twriteFileSync(\n\t\t\ttargetFile,\n\t\t\t`${importedEntries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n\t\t\t\"utf8\",\n\t\t);\n\n\t\treturn {\n\t\t\tsessionFile: targetFile,\n\t\t\tsessionId,\n\t\t\timportedCount: 1,\n\t\t};\n\t}\n\n\tprivate importPortableSessionBundle(\n\t\tportableExport: PortableSessionBundle,\n\t): PortableSessionImportResult {\n\t\tconst sessions = portableExport.sessions;\n\t\tif (!sessions?.length) {\n\t\t\tthrow new Error(\"Portable session export is missing bundled sessions.\");\n\t\t}\n\n\t\tconst pending = new Map(\n\t\t\tsessions.map((session) => [session.sessionId, session]),\n\t\t);\n\t\tconst importedIds = new Map<string, string>();\n\t\tconst importedFiles = new Map<string, string>();\n\t\tconst ordered: PortableSessionExportSession[] = [];\n\n\t\twhile (pending.size > 0) {\n\t\t\tlet progressed = false;\n\t\t\tfor (const [sessionId, session] of pending) {\n\t\t\t\tif (session.parentSessionId && pending.has(session.parentSessionId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tordered.push(session);\n\t\t\t\tpending.delete(sessionId);\n\t\t\t\tprogressed = true;\n\t\t\t}\n\t\t\tif (!progressed) {\n\t\t\t\tordered.push(...pending.values());\n\t\t\t\tpending.clear();\n\t\t\t}\n\t\t}\n\n\t\tfor (const session of ordered) {\n\t\t\tconst entries = session.entries ? [...session.entries] : [];\n\t\t\tmigrateToCurrentVersion(entries);\n\t\t\tif (entries.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Bundled session ${session.sessionId} is empty or unreadable.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst headerIndex = entries.findIndex(\n\t\t\t\t(entry) => entry.type === \"session\",\n\t\t\t);\n\t\t\tif (headerIndex < 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Bundled session ${session.sessionId} is missing a session header.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst header = entries[headerIndex] as SessionHeaderEntry;\n\t\t\tlet importedSessionId = header.id?.trim() || uuidv4();\n\t\t\tif (this.catalog.getSessionFileById(importedSessionId)) {\n\t\t\t\timportedSessionId = uuidv4();\n\t\t\t}\n\t\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\t\tconst targetFile = join(\n\t\t\t\tthis.sessionDir,\n\t\t\t\t`${timestamp}_${importedSessionId}.jsonl`,\n\t\t\t);\n\t\t\tconst importedParentSessionId = session.parentSessionId\n\t\t\t\t? importedIds.get(session.parentSessionId)\n\t\t\t\t: undefined;\n\t\t\tconst importedHeader: SessionHeaderEntry = {\n\t\t\t\t...header,\n\t\t\t\tid: importedSessionId,\n\t\t\t\tsubject: undefined,\n\t\t\t\tparentSession: importedParentSessionId,\n\t\t\t\tbranchedFrom: session.parentSessionId\n\t\t\t\t\t? importedFiles.get(session.parentSessionId)\n\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t\tconst importedEntries = entries.map((entry, index) =>\n\t\t\t\tindex === headerIndex ? importedHeader : entry,\n\t\t\t);\n\n\t\t\twriteFileSync(\n\t\t\t\ttargetFile,\n\t\t\t\t`${importedEntries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n\t\t\t\t\"utf8\",\n\t\t\t);\n\t\t\timportedIds.set(session.sessionId, importedSessionId);\n\t\t\timportedFiles.set(session.sessionId, targetFile);\n\t\t}\n\n\t\tconst selectedSourceSessionId =\n\t\t\tportableExport.sessionId ?? sessions[0]?.sessionId;\n\t\tconst selectedSessionId =\n\t\t\t(selectedSourceSessionId\n\t\t\t\t? importedIds.get(selectedSourceSessionId)\n\t\t\t\t: undefined) ?? importedIds.get(sessions[0]!.sessionId)!;\n\t\tconst selectedSessionFile =\n\t\t\timportedFiles.get(selectedSourceSessionId ?? sessions[0]!.sessionId) ??\n\t\t\timportedFiles.get(sessions[0]!.sessionId)!;\n\n\t\treturn {\n\t\t\tsessionFile: selectedSessionFile,\n\t\t\tsessionId: selectedSessionId,\n\t\t\timportedCount: ordered.length,\n\t\t};\n\t}\n\n\tprivate readPortableJsonExport(sourcePath: string): PortableSessionBundle {\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(readFileSync(sourcePath, \"utf8\"));\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Portable session export is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"Portable session export must be a JSON object.\");\n\t\t}\n\n\t\tconst portableExport = parsed as {\n\t\t\tformat?: unknown;\n\t\t\tsessionId?: unknown;\n\t\t\tentries?: unknown;\n\t\t\tsessions?: unknown;\n\t\t};\n\t\tconst format =\n\t\t\ttypeof portableExport.format === \"string\"\n\t\t\t\t? portableExport.format\n\t\t\t\t: undefined;\n\t\tif (format !== PORTABLE_SESSION_EXPORT_FORMAT) {\n\t\t\tthrow new Error(\n\t\t\t\t`Portable session export format must be ${PORTABLE_SESSION_EXPORT_FORMAT}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst parseEntries = (entries: unknown[], path: string): SessionEntry[] =>\n\t\t\tentries.map((entry, index) => {\n\t\t\t\tconst parsedEntry = tryParseSessionEntry(JSON.stringify(entry));\n\t\t\t\tif (!parsedEntry) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${path} contains an invalid entry at index ${index}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn parsedEntry;\n\t\t\t});\n\n\t\tconst entries = Array.isArray(portableExport.entries)\n\t\t\t? parseEntries(portableExport.entries, \"Portable session export\")\n\t\t\t: undefined;\n\t\tconst sessions = Array.isArray(portableExport.sessions)\n\t\t\t? portableExport.sessions.map((session, index) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!session ||\n\t\t\t\t\t\ttypeof session !== \"object\" ||\n\t\t\t\t\t\tArray.isArray(session)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export contains an invalid bundled session at index ${index}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst parsedSession = session as {\n\t\t\t\t\t\tsessionId?: unknown;\n\t\t\t\t\t\tparentSessionId?: unknown;\n\t\t\t\t\t\tentries?: unknown;\n\t\t\t\t\t};\n\t\t\t\t\tif (typeof parsedSession.sessionId !== \"string\") {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export is missing a sessionId for bundled session ${index}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (!Array.isArray(parsedSession.entries)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export is missing entries for bundled session ${parsedSession.sessionId}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsessionId: parsedSession.sessionId,\n\t\t\t\t\t\tparentSessionId:\n\t\t\t\t\t\t\ttypeof parsedSession.parentSessionId === \"string\"\n\t\t\t\t\t\t\t\t? parsedSession.parentSessionId\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tsessionFile: join(\n\t\t\t\t\t\t\tthis.sessionDir,\n\t\t\t\t\t\t\t`${parsedSession.sessionId}.jsonl`,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tentries: parseEntries(\n\t\t\t\t\t\t\tparsedSession.entries,\n\t\t\t\t\t\t\t`Bundled session ${parsedSession.sessionId}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t} satisfies PortableSessionExportSession;\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\tif (!entries && !sessions?.length) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Portable session export is missing both entries and bundled sessions.\",\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tformat,\n\t\t\texportedAt:\n\t\t\t\ttypeof (portableExport as { exportedAt?: unknown }).exportedAt ===\n\t\t\t\t\"string\"\n\t\t\t\t\t? (portableExport as { exportedAt: string }).exportedAt\n\t\t\t\t\t: new Date().toISOString(),\n\t\t\tsessionId:\n\t\t\t\ttypeof portableExport.sessionId === \"string\"\n\t\t\t\t\t? portableExport.sessionId\n\t\t\t\t\t: undefined,\n\t\t\tentries,\n\t\t\tsessions,\n\t\t};\n\t}\n\n\tprivate buildPortableSessionRecords(): PortableSessionExportRecord[] {\n\t\tconst records: PortableSessionExportRecord[] = [];\n\t\tconst filePaths = readdirSync(this.sessionDir)\n\t\t\t.filter((fileName) => fileName.endsWith(\".jsonl\"))\n\t\t\t.map((fileName) => resolve(join(this.sessionDir, fileName)));\n\n\t\tfor (const filePath of filePaths) {\n\t\t\tconst entries = safeReadSessionEntries(filePath);\n\t\t\tconst header = entries.find((entry) => entry.type === \"session\") as\n\t\t\t\t| SessionHeaderEntry\n\t\t\t\t| undefined;\n\t\t\tif (!header?.id) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trecords.push({\n\t\t\t\tsessionId: header.id,\n\t\t\t\tsessionFile: filePath,\n\t\t\t\ttimestamp: header.timestamp,\n\t\t\t\tparentSessionId: header.parentSession,\n\t\t\t\tparentSessionFile: header.branchedFrom\n\t\t\t\t\t? resolve(header.branchedFrom)\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t}\n\n\t\tconst byPath = new Map(\n\t\t\trecords.map((record) => [resolve(record.sessionFile), record]),\n\t\t);\n\t\tfor (const record of records) {\n\t\t\tif (!record.parentSessionId && record.parentSessionFile) {\n\t\t\t\trecord.parentSessionId = byPath.get(\n\t\t\t\t\tresolve(record.parentSessionFile),\n\t\t\t\t)?.sessionId;\n\t\t\t}\n\t\t}\n\n\t\trecords.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\t\treturn records;\n\t}\n}\n"]}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session Manager - Conversation Persistence and Recovery\n *\n * Sessions are stored as JSONL (JSON Lines) files. Each entry is append-only and\n * may include tree metadata (id/parentId) to support branching and navigation.\n *\n * Tree entries form a conversation tree where the \"leaf\" pointer tracks the\n * active branch. The session file is append-only; branching updates the leaf\n * pointer without modifying history.\n */\n\nimport {\n\tappendFileSync,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\treaddirSync,\n\tstatSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { extname, join, resolve } from \"node:path\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type {\n\tAgentState,\n\tAppMessage,\n\tImageContent,\n\tTextContent,\n} from \"../agent/types.js\";\nimport { SESSION_CONFIG, getAgentDir } from \"../config/constants.js\";\nimport { getRegisteredModels } from \"../models/registry.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport { queueSharedMemoryUpdate } from \"../shared-memory/client.js\";\nimport { recordMaestroPromptVariantSelected } from \"../telemetry/maestro-event-bus.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { SessionFileWriter } from \"./file-writer.js\";\nimport {\n\tSessionMetadataCache,\n\ttype SessionModelMetadata,\n} from \"./metadata-cache.js\";\nimport {\n\tmigrateToCurrentVersion,\n\tregisterActiveSessionFile,\n\tscheduleSessionMigration,\n\tunregisterActiveSessionFile,\n} from \"./migration.js\";\nimport { sanitizeSessionScope } from \"./scope.js\";\nimport {\n\tcreateBranchedSessionFromLeaf as createBranchedSessionFromLeafFn,\n\tcreateBranchedSessionFromState as createBranchedSessionFromStateFn,\n} from \"./session-branch.js\";\nimport { SessionCatalog } from \"./session-catalog.js\";\nimport {\n\ttype SessionContextSnapshot,\n\tbuildSessionContextFromEntries,\n\tgenerateEntryId,\n\tsafeReadSessionEntries,\n} from \"./session-context.js\";\nimport { syncSessionMemory } from \"./session-memory.js\";\nimport {\n\tapplyAttachmentExtracts,\n\tsanitizeMessageForSession,\n} from \"./session-sanitize.js\";\nimport {\n\ttype AttachmentExtractedEntry,\n\ttype BranchSummaryEntry,\n\tCURRENT_SESSION_VERSION,\n\ttype CompactionEntry,\n\ttype CustomEntry,\n\ttype CustomMessageEntry,\n\ttype LabelEntry,\n\ttype ModelChangeEntry,\n\ttype SessionEntry,\n\ttype SessionHeaderEntry,\n\ttype SessionMessageEntry,\n\ttype SessionMessagesView,\n\ttype SessionMetaEntry,\n\ttype SessionMetadata,\n\ttype SessionSummary,\n\ttype SessionTreeEntry,\n\ttype SessionTreeNode,\n\ttype ThinkingLevelChangeEntry,\n\tgetPersistedSessionPromptContextManifest,\n\tisSessionTreeEntry,\n\ttryParseSessionEntry,\n} from \"./types.js\";\n\nexport interface SessionManagerOptions {\n\t/** Override the base session directory (before per-cwd scoping). */\n\tsessionDir?: string;\n\t/** Optional scope key (e.g., auth subject) for per-user session isolation. */\n\tsessionScope?: string;\n}\n\nconst logger = createLogger(\"session-manager\");\nconst PORTABLE_SESSION_EXPORT_FORMAT = \"maestro-session-export.v1\";\n\ninterface PortableSessionBundle {\n\tformat: string;\n\texportedAt: string;\n\tsessionId?: string;\n\tentries?: SessionEntry[];\n\tsessions?: PortableSessionExportSession[];\n}\n\nexport interface PortableSessionExportSession {\n\tsessionId: string;\n\tparentSessionId?: string;\n\tsessionFile: string;\n\tentries?: SessionEntry[];\n}\n\nexport interface PortableSessionImportResult {\n\tsessionFile: string;\n\tsessionId: string;\n\timportedCount: number;\n}\n\ninterface PortableSessionExportRecord {\n\tsessionId: string;\n\tsessionFile: string;\n\ttimestamp: string;\n\tparentSessionId?: string;\n\tparentSessionFile?: string;\n}\n\n// Re-export SessionModelMetadata for backward compatibility\nexport type { SessionModelMetadata } from \"./metadata-cache.js\";\n\nexport type {\n\tAttachmentExtractedEntry,\n\tBranchSummaryEntry,\n\tCompactionEntry,\n\tSessionHeaderEntry,\n\tSessionMessageEntry,\n\tSessionMetaEntry,\n\tSessionMigrationState,\n\tSessionToolInfo,\n\tSessionTreeEntry,\n\tSessionTreeNode,\n} from \"./types.js\";\n\nexport {\n\tgetMigrationState,\n\tregisterActiveSessionFile,\n\tresetMigrationState,\n\trunSessionMigration,\n\tscheduleSessionMigration,\n\tunregisterActiveSessionFile,\n} from \"./migration.js\";\n\nexport function toSessionModelMetadata(\n\tmodel: RegisteredModel,\n): SessionModelMetadata {\n\treturn {\n\t\tprovider: model.provider,\n\t\tmodelId: model.id,\n\t\tproviderName: model.providerName,\n\t\tname: model.name,\n\t\tbaseUrl: model.baseUrl,\n\t\treasoning: model.reasoning,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\tsource: model.source,\n\t};\n}\n\nfunction findRegisteredModel(modelKey: string): RegisteredModel | undefined {\n\tconst [provider, modelId] = modelKey.split(\"/\");\n\tif (!provider || !modelId) {\n\t\treturn undefined;\n\t}\n\treturn getRegisteredModels().find(\n\t\t(entry) => entry.provider === provider && entry.id === modelId,\n\t);\n}\n\n/**\n * Main session management class.\n */\nexport class SessionManager {\n\t/** Unique identifier for this session (UUID v4) */\n\tprivate sessionId!: string;\n\t/** Absolute path to the session JSONL file */\n\tprivate sessionFile!: string;\n\t/** Directory containing all session files for current project */\n\tprivate sessionDir: string;\n\t/** Optional scope for per-user session isolation */\n\tprivate sessionScope?: string;\n\t/** Optional override for base session directory */\n\tprivate sessionDirOverride?: string;\n\t/** Whether session persistence is enabled (disabled by --no-session) */\n\tprivate enabled = true;\n\t/** Whether the session header has been written */\n\tprivate sessionInitialized = false;\n\t/** Buffered file writer for efficient I/O */\n\tprivate writer?: SessionFileWriter;\n\t/** Snapshot of agent state for recovery purposes */\n\tprivate _agentSnapshot?: AgentState;\n\t/** Metadata for the last used model */\n\tprivate lastModelMetadata?: SessionModelMetadata;\n\t/** Cache for current model/thinking level */\n\tprivate metadataCache = new SessionMetadataCache();\n\tprivate readonly catalog: SessionCatalog;\n\n\tprivate fileEntries: SessionEntry[] = [];\n\tprivate byId: Map<string, SessionTreeEntry> = new Map();\n\tprivate labelsById: Map<string, string> = new Map();\n\tprivate leafId: string | null = null;\n\tprivate flushed = false;\n\tprivate _hasAssistantMessage = false;\n\n\t/**\n\t * Creates a new SessionManager.\n\t *\n\t * @param continueSession - If true, loads the most recently modified session\n\t * @param customSessionPath - Optional specific session file to load\n\t * @param options - Optional session directory/scope overrides\n\t */\n\tconstructor(\n\t\tcontinueSession = false,\n\t\tcustomSessionPath?: string,\n\t\toptions: SessionManagerOptions = {},\n\t) {\n\t\tthis.sessionScope = options.sessionScope;\n\t\tthis.sessionDirOverride = options.sessionDir;\n\t\tthis.sessionDir = this.getSessionDirectory();\n\t\tthis.catalog = new SessionCatalog({\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tbeforeRead: () => this.writer?.flushSync(),\n\t\t\tgetCurrentSessionId: () => this.sessionId,\n\t\t});\n\n\t\tif (customSessionPath) {\n\t\t\t// Use custom session file path\n\t\t\tthis.sessionFile = resolve(customSessionPath);\n\t\t\tthis.setSessionFile(this.sessionFile);\n\t\t} else if (continueSession) {\n\t\t\tconst mostRecent = this.findMostRecentlyModifiedSession();\n\t\t\tif (mostRecent) {\n\t\t\t\tthis.sessionFile = mostRecent;\n\t\t\t\tthis.setSessionFile(this.sessionFile);\n\t\t\t} else {\n\t\t\t\tthis.initNewSession();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.initNewSession();\n\t\t}\n\n\t\tthis.initializeWriter();\n\t\tif (this.sessionInitialized) {\n\t\t\tthis.metadataCache.seedFromFile(this.sessionFile);\n\t\t}\n\t}\n\n\t/** Disable session saving (for --no-session mode) */\n\tdisable() {\n\t\tthis.enabled = false;\n\t\t// Unregister session file before disabling\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t}\n\n\tprivate initializeWriter(): void {\n\t\tif (!this.enabled) {\n\t\t\tthis.writer = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.writer = new SessionFileWriter(this.sessionFile);\n\t}\n\n\tprivate getSessionDirectory(): string {\n\t\tconst cwd = process.cwd();\n\t\tconst safePath = `--${cwd.replace(/^[/\\\\]/, \"\").replace(/[/\\\\:]/g, \"-\")}--`;\n\n\t\tconst baseOverride =\n\t\t\tresolveEnvPath(this.sessionDirOverride) ??\n\t\t\tresolveEnvPath(process.env.MAESTRO_SESSION_DIR);\n\t\tconst baseDir =\n\t\t\tbaseOverride ??\n\t\t\tSESSION_CONFIG.DEFAULT_DIR ??\n\t\t\tjoin(getAgentDir(), \"sessions\");\n\n\t\tconst scope = this.sessionScope\n\t\t\t? sanitizeSessionScope(this.sessionScope)\n\t\t\t: \"\";\n\t\tconst sessionDir = scope\n\t\t\t? join(baseDir, scope, safePath)\n\t\t\t: join(baseDir, safePath);\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\t\treturn sessionDir;\n\t}\n\n\tprivate initNewSession(): void {\n\t\tthis.sessionId = uuidv4();\n\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\tthis.sessionFile = join(\n\t\t\tthis.sessionDir,\n\t\t\t`${timestamp}_${this.sessionId}.jsonl`,\n\t\t);\n\t\t// Register new session file to prevent migration race conditions\n\t\tregisterActiveSessionFile(this.sessionFile);\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\t\tthis._hasAssistantMessage = false;\n\t\tthis.sessionInitialized = false;\n\t\tthis.metadataCache.reset();\n\t}\n\n\tstartFreshSession(): void {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\t\tthis._agentSnapshot = undefined;\n\t\tthis.lastModelMetadata = undefined;\n\t\t// Unregister old session file before creating new one\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.initNewSession();\n\t\tthis.initializeWriter();\n\t}\n\n\t/**\n\t * Reset session state for /clear command - clears pending messages and starts new session\n\t */\n\treset(): void {\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\t\tthis.writer = undefined;\n\n\t\t// Unregister old session file before creating new one\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\n\t\tthis.fileEntries = [];\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis.flushed = false;\n\t\tthis._hasAssistantMessage = false;\n\t\tthis.sessionInitialized = false;\n\t\tthis.metadataCache.reset();\n\t\tthis._agentSnapshot = undefined;\n\t\tthis.lastModelMetadata = undefined;\n\n\t\tthis.initNewSession();\n\t\tthis.initializeWriter();\n\t}\n\n\tprivate findMostRecentlyModifiedSession(): string | null {\n\t\ttry {\n\t\t\tconst files = readdirSync(this.sessionDir)\n\t\t\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t\t\t.map((f) => ({\n\t\t\t\t\tpath: join(this.sessionDir, f),\n\t\t\t\t\tmtime: statSync(join(this.sessionDir, f)).mtime,\n\t\t\t\t}))\n\t\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\t\treturn files[0]?.path || null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate rebuildIndex(entries: SessionEntry[]): void {\n\t\tthis.byId.clear();\n\t\tthis.labelsById.clear();\n\t\tthis.leafId = null;\n\t\tthis._hasAssistantMessage = false;\n\n\t\tfor (const entry of entries) {\n\t\t\tif (!isSessionTreeEntry(entry)) continue;\n\t\t\tthis.byId.set(entry.id, entry);\n\t\t\tthis.leafId = entry.id;\n\t\t\tif (entry.type === \"label\") {\n\t\t\t\tif (entry.label) {\n\t\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t\t} else {\n\t\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\tthis._hasAssistantMessage = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rewriteSessionFile(): void {\n\t\tif (!this.enabled || !this.sessionFile) return;\n\t\tconst content = `${this.fileEntries.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`;\n\t\twriteFileSync(this.sessionFile, content);\n\t}\n\n\tprivate persistEntry(entry: SessionEntry): void {\n\t\tif (!this.enabled || !this.writer || !this.sessionFile) return;\n\t\tif (!this.sessionInitialized) return;\n\n\t\tif (!this.flushed) {\n\t\t\tfor (const e of this.fileEntries) {\n\t\t\t\tthis.writer.write(e);\n\t\t\t}\n\t\t\tthis.writer.flushSync();\n\t\t\tthis.flushed = true;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.writer.write(entry);\n\t}\n\n\tprivate appendTreeEntry(entry: SessionTreeEntry): void {\n\t\tthis.fileEntries.push(entry);\n\t\tthis.byId.set(entry.id, entry);\n\t\tthis.leafId = entry.id;\n\t\tif (entry.type === \"label\") {\n\t\t\tif (entry.label) {\n\t\t\t\tthis.labelsById.set(entry.targetId, entry.label);\n\t\t\t} else {\n\t\t\t\tthis.labelsById.delete(entry.targetId);\n\t\t\t}\n\t\t}\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tthis._hasAssistantMessage = true;\n\t\t}\n\t\tthis.persistEntry(entry);\n\t}\n\n\tprivate createTreeEntryId(): string {\n\t\treturn generateEntryId(this.byId);\n\t}\n\n\tstartSession(state: AgentState, options?: { subject?: string }): void {\n\t\tif (!this.enabled || this.sessionInitialized) return;\n\n\t\tconst modelKeyFromState = `${state.model.provider}/${state.model.id}`;\n\t\tconst latestModelChange = this.getLatestModelChange();\n\t\tconst latestThinkingLevel = this.getLatestThinkingLevel();\n\t\tconst sessionModelKey = latestModelChange?.model ?? modelKeyFromState;\n\t\tconst primaryMetadata =\n\t\t\tlatestModelChange?.modelMetadata ??\n\t\t\t(sessionModelKey === modelKeyFromState\n\t\t\t\t? toSessionModelMetadata(state.model as RegisteredModel)\n\t\t\t\t: undefined);\n\t\tconst fallbackMetadata = this.resolveModelMetadata(sessionModelKey);\n\t\tconst provisionalHeaderIndex = this.fileEntries.findIndex(\n\t\t\t(existing) =>\n\t\t\t\texisting.type === \"session\" &&\n\t\t\t\texisting.id === this.sessionId &&\n\t\t\t\texisting.provisional === true,\n\t\t);\n\t\tconst provisionalHeader =\n\t\t\tprovisionalHeaderIndex >= 0\n\t\t\t\t? (this.fileEntries[provisionalHeaderIndex] as SessionHeaderEntry)\n\t\t\t\t: undefined;\n\t\tconst timestamp = provisionalHeader?.timestamp ?? new Date().toISOString();\n\t\tconst entry: SessionHeaderEntry = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: process.cwd(),\n\t\t\tsubject: options?.subject || undefined,\n\t\t\tmodel: sessionModelKey,\n\t\t\tmodelMetadata: primaryMetadata ?? fallbackMetadata,\n\t\t\tthinkingLevel: latestThinkingLevel ?? state.thinkingLevel,\n\t\t\tsystemPrompt: state.systemPrompt,\n\t\t\tpromptMetadata: state.promptMetadata,\n\t\t\tpromptContextManifest: getPersistedSessionPromptContextManifest(state),\n\t\t\tunifiedContextManifest: state.unifiedContextManifest,\n\t\t\ttools: state.tools.map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tlabel: tool.label,\n\t\t\t\tdescription: tool.description,\n\t\t\t})),\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\t\tif (provisionalHeaderIndex >= 0) {\n\t\t\tthis.fileEntries[provisionalHeaderIndex] = entry;\n\t\t} else {\n\t\t\tthis.fileEntries.unshift(entry);\n\t\t}\n\t\tthis.sessionInitialized = true;\n\n\t\tif (provisionalHeaderIndex >= 0) {\n\t\t\tthis.rewriteSessionFile();\n\t\t\tthis.flushed = true;\n\t\t} else {\n\t\t\tthis.persistEntry(entry);\n\t\t}\n\n\t\tqueueSharedMemoryUpdate({\n\t\t\tsessionId: this.sessionId,\n\t\t\tstate: {\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tmodel: sessionModelKey,\n\t\t\t\tupdatedAt: entry.timestamp,\n\t\t\t\tsource: \"maestro\",\n\t\t\t},\n\t\t\tevent: {\n\t\t\t\ttype: \"maestro.session.started\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tmodel: sessionModelKey,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (state.promptMetadata) {\n\t\t\trecordMaestroPromptVariantSelected({\n\t\t\t\tprompt_metadata: state.promptMetadata,\n\t\t\t\tcorrelation: {\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t},\n\t\t\t\tselected_at: entry.timestamp,\n\t\t\t});\n\t\t}\n\n\t\t// Auto-prune old sessions in the background (non-blocking)\n\t\tif (\n\t\t\tSESSION_CONFIG.MAX_SESSIONS > 0 ||\n\t\t\tSESSION_CONFIG.MAX_SESSION_AGE_DAYS > 0\n\t\t) {\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = this.pruneSessions();\n\t\t\t\t\tif (result.removed > 0) {\n\t\t\t\t\t\tlogger.debug(\"Auto-pruned sessions\", result);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\"Session auto-prune failed\",\n\t\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t}\n\t}\n\n\tsaveMessage(message: AppMessage): void {\n\t\tif (!this.enabled) return;\n\t\tconst sanitizedMessage = sanitizeMessageForSession(message);\n\t\tconst entry: SessionMessageEntry = {\n\t\t\ttype: \"message\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmessage: sanitizedMessage,\n\t\t};\n\n\t\tthis.appendTreeEntry(entry);\n\n\t\tqueueSharedMemoryUpdate({\n\t\t\tsessionId: this.sessionId,\n\t\t\tstate: {\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tupdatedAt: entry.timestamp,\n\t\t\t\tlastMessageId: entry.id,\n\t\t\t\tlastMessageRole: message.role,\n\t\t\t\tsource: \"maestro\",\n\t\t\t},\n\t\t\tevent: {\n\t\t\t\ttype: \"maestro.message.saved\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tmessageId: entry.id,\n\t\t\t\t\trole: message.role,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\tsaveThinkingLevelChange(thinkingLevel: string): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: ThinkingLevelChangeEntry = {\n\t\t\ttype: \"thinking_level_change\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tthinkingLevel,\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tsaveModelChange(model: string, metadata?: SessionModelMetadata): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: ModelChangeEntry = {\n\t\t\ttype: \"model_change\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmodel,\n\t\t\tmodelMetadata: metadata,\n\t\t};\n\t\tthis.metadataCache.apply(entry);\n\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendCustomEntry(customType: string, data?: unknown): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: CustomEntry = {\n\t\t\ttype: \"custom\",\n\t\t\tcustomType,\n\t\t\tdata,\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendCustomMessageEntry<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst entry: CustomMessageEntry<T> = {\n\t\t\ttype: \"custom_message\",\n\t\t\tcustomType,\n\t\t\tcontent,\n\t\t\tdisplay,\n\t\t\tdetails,\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendBranchSummary(\n\t\tsummary: string,\n\t\toptions?: { fromId?: string; details?: unknown; fromHook?: boolean },\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst fromId = options?.fromId ?? this.leafId ?? \"root\";\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId,\n\t\t\tsummary,\n\t\t\tdetails: options?.details,\n\t\t\tfromHook: options?.fromHook,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\tappendLabel(targetId: string, label: string | undefined): void {\n\t\tif (!this.byId.has(targetId)) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\t\tconst entry: LabelEntry = {\n\t\t\ttype: \"label\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttargetId,\n\t\t\tlabel,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t}\n\n\t/**\n\t * Save a compaction event to the session file.\n\t */\n\tsaveCompaction(\n\t\tsummary: string,\n\t\tfirstKeptEntryIndex: number,\n\t\ttokensBefore: number,\n\t\toptions?: {\n\t\t\tauto?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\tfirstKeptEntryId?: string;\n\t\t},\n\t): void {\n\t\tif (!this.enabled) return;\n\t\tconst context = this.buildSessionContext();\n\t\tconst resolvedEntry = options?.firstKeptEntryId\n\t\t\t? this.getEntry(options.firstKeptEntryId)\n\t\t\t: undefined;\n\t\tconst targetEntry =\n\t\t\tresolvedEntry ?? context.messageEntries[firstKeptEntryIndex];\n\t\tconst fallbackEntry = this.getEntries()[0];\n\t\tconst firstKeptEntryId =\n\t\t\ttargetEntry?.id ?? this.leafId ?? fallbackEntry?.id;\n\t\tif (!firstKeptEntryId) {\n\t\t\tlogger.warn(\"Failed to resolve compaction cut point; skipping save\");\n\t\t\treturn;\n\t\t}\n\t\tconst entry: CompactionEntry = {\n\t\t\ttype: \"compaction\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: this.leafId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore,\n\t\t\tauto: options?.auto,\n\t\t\tcustomInstructions: options?.customInstructions,\n\t\t};\n\n\t\tthis.appendTreeEntry(entry);\n\t\tthis.writer?.flushSync();\n\t}\n\n\t/**\n\t * Find the most recent compaction entry in the current session.\n\t */\n\tfindLatestCompaction(): CompactionEntry | null {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"compaction\") {\n\t\t\t\treturn entry as CompactionEntry;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate getLatestThinkingLevel(): string | undefined {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\t\treturn entry.thinkingLevel;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate getLatestModelChange(): ModelChangeEntry | undefined {\n\t\tfor (let i = this.fileEntries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.fileEntries[i]!;\n\t\t\tif (entry.type === \"model_change\") {\n\t\t\t\treturn entry as ModelChangeEntry;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate resolveModelMetadata(\n\t\tmodelKey: string,\n\t): SessionModelMetadata | undefined {\n\t\tconst registered = findRegisteredModel(modelKey);\n\t\treturn registered ? toSessionModelMetadata(registered) : undefined;\n\t}\n\n\tprivate appendSessionMetaEntry(\n\t\ttargetFile: string,\n\t\tmeta: {\n\t\t\tsummary?: string;\n\t\t\tresumeSummary?: string;\n\t\t\tmemoryExtractionHash?: string;\n\t\t\tfavorite?: boolean;\n\t\t\ttitle?: string;\n\t\t\ttags?: string[];\n\t\t\tarchived?: boolean;\n\t\t\tarchivedAt?: string;\n\t\t\tappServerGoal?: SessionMetaEntry[\"appServerGoal\"];\n\t\t},\n\t): void {\n\t\tif (!existsSync(targetFile)) return;\n\t\tif (\n\t\t\tmeta.summary === undefined &&\n\t\t\tmeta.resumeSummary === undefined &&\n\t\t\tmeta.memoryExtractionHash === undefined &&\n\t\t\tmeta.favorite === undefined &&\n\t\t\tmeta.title === undefined &&\n\t\t\tmeta.tags === undefined &&\n\t\t\tmeta.archived === undefined &&\n\t\t\tmeta.archivedAt === undefined &&\n\t\t\tmeta.appServerGoal === undefined\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst entry: SessionMetaEntry = {\n\t\t\ttype: \"session_meta\",\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t...meta,\n\t\t};\n\t\ttry {\n\t\t\tappendFileSync(targetFile, `${JSON.stringify(entry)}\\n`);\n\t\t\tif (resolve(targetFile) === this.sessionFile) {\n\t\t\t\tthis.fileEntries.push(entry);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to append session metadata\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate appendAttachmentExtractEntry(\n\t\ttargetFile: string,\n\t\tpayload: { attachmentId: string; extractedText: string },\n\t): AttachmentExtractedEntry | null {\n\t\tif (!existsSync(targetFile)) return null;\n\t\tif (!payload.attachmentId || !payload.extractedText) return null;\n\t\tconst entry: AttachmentExtractedEntry = {\n\t\t\ttype: \"attachment_extract\",\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tattachmentId: payload.attachmentId,\n\t\t\textractedText: payload.extractedText,\n\t\t};\n\t\ttry {\n\t\t\tappendFileSync(targetFile, `${JSON.stringify(entry)}\\n`);\n\t\t\treturn entry;\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to append attachment extraction\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Persist extracted attachment text as an append-only cache entry.\n\t */\n\tsaveAttachmentExtraction(\n\t\tsessionPath: string,\n\t\tattachmentId: string,\n\t\ttext: string,\n\t): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tconst entry = this.appendAttachmentExtractEntry(sessionPath, {\n\t\t\tattachmentId,\n\t\t\textractedText: text,\n\t\t});\n\t\tif (entry && sessionPath === this.sessionFile) {\n\t\t\tthis.fileEntries.push(entry);\n\t\t}\n\t}\n\n\tsaveSessionSummary(summary: string, sessionPath?: string): void {\n\t\tconst trimmed = summary.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { summary: trimmed });\n\t\tthis.syncSessionMemoryEntry(target);\n\t\tif (target === this.sessionFile) {\n\t\t\tqueueSharedMemoryUpdate({\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tstate: {\n\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t\t\tsummary: trimmed,\n\t\t\t\t\tsource: \"maestro\",\n\t\t\t\t},\n\t\t\t\tevent: {\n\t\t\t\t\ttype: \"maestro.session.summary\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\t\tlength: trimmed.length,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tsaveSessionResumeSummary(summary: string, sessionPath?: string): void {\n\t\tconst trimmed = summary.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { resumeSummary: trimmed });\n\t\tthis.syncSessionMemoryEntry(target);\n\t}\n\n\tsaveSessionMemoryExtractionHash(hash: string, sessionPath?: string): void {\n\t\tconst trimmed = hash.trim();\n\t\tif (!trimmed) return;\n\t\tconst target = sessionPath ?? this.sessionFile;\n\t\tif (!target || !existsSync(target)) return;\n\t\tthis.appendSessionMetaEntry(target, { memoryExtractionHash: trimmed });\n\t}\n\n\tsetSessionFavorite(sessionPath: string, favorite: boolean): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { favorite });\n\t}\n\n\tsetSessionTitle(sessionPath: string, title: string): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { title });\n\t\tthis.syncSessionMemoryEntry(sessionPath);\n\t}\n\n\tsetSessionTags(sessionPath: string, tags: string[]): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { tags });\n\t\tthis.syncSessionMemoryEntry(sessionPath);\n\t}\n\n\tsetSessionArchived(sessionPath: string, archived: boolean): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, {\n\t\t\tarchived,\n\t\t\tarchivedAt: archived ? new Date().toISOString() : undefined,\n\t\t});\n\t}\n\n\tsetSessionAppServerGoal(\n\t\tsessionPath: string,\n\t\tgoal: NonNullable<SessionMetaEntry[\"appServerGoal\"]> | null,\n\t): void {\n\t\tif (!sessionPath || !existsSync(sessionPath)) return;\n\t\tthis.appendSessionMetaEntry(sessionPath, { appServerGoal: goal });\n\t}\n\n\tprivate syncSessionMemoryEntry(sessionPath: string): void {\n\t\ttry {\n\t\t\tsyncSessionMemory(sessionPath);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to sync session memory\", {\n\t\t\t\tsessionPath,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\tbuildSessionContext(\n\t\tleafId: string | null = this.leafId,\n\t): SessionContextSnapshot {\n\t\treturn buildSessionContextFromEntries(this.fileEntries, {\n\t\t\tleafId,\n\t\t\tbyId: this.byId,\n\t\t\theader: this.getHeader(),\n\t\t});\n\t}\n\n\tloadMessages(): AppMessage[] {\n\t\tconst context = this.buildSessionContext();\n\t\tconst extractedById = new Map<string, string>();\n\t\tfor (const entry of this.fileEntries) {\n\t\t\tif (entry.type === \"attachment_extract\") {\n\t\t\t\tif (entry.attachmentId && entry.extractedText) {\n\t\t\t\t\textractedById.set(entry.attachmentId, entry.extractedText);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (extractedById.size === 0) return context.messages;\n\t\treturn context.messages.map((message) =>\n\t\t\tapplyAttachmentExtracts(message, extractedById),\n\t\t);\n\t}\n\n\tloadThinkingLevel(): string {\n\t\treturn this.buildSessionContext().thinkingLevel;\n\t}\n\n\tloadModel(): string | null {\n\t\treturn this.buildSessionContext().model;\n\t}\n\n\tloadModelMetadata(): SessionModelMetadata | undefined {\n\t\tconst context = this.buildSessionContext();\n\t\treturn context.modelMetadata ?? this.lastModelMetadata;\n\t}\n\n\tisInitialized(): boolean {\n\t\treturn this.sessionInitialized;\n\t}\n\n\tcanCreateSession(): boolean {\n\t\treturn this.enabled;\n\t}\n\n\tgetSessionId(): string {\n\t\treturn this.sessionId;\n\t}\n\n\tgetSessionFile(): string {\n\t\treturn this.sessionFile;\n\t}\n\n\tgetPortableSessionBundle(): {\n\t\tselectedSessionId: string;\n\t\tsessions: PortableSessionExportSession[];\n\t} {\n\t\tconst records = this.buildPortableSessionRecords();\n\t\tconst byFile = new Map(\n\t\t\trecords.map((record) => [resolve(record.sessionFile), record]),\n\t\t);\n\t\tconst selected = byFile.get(resolve(this.sessionFile));\n\t\tif (!selected) {\n\t\t\treturn {\n\t\t\t\tselectedSessionId: this.sessionId,\n\t\t\t\tsessions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\t\tsessionFile: this.sessionFile,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\tconst byId = new Map(records.map((record) => [record.sessionId, record]));\n\t\tconst parentToChildren = new Map<string, PortableSessionExportRecord[]>();\n\t\tfor (const record of records) {\n\t\t\tif (!record.parentSessionId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst children = parentToChildren.get(record.parentSessionId) ?? [];\n\t\t\tchildren.push(record);\n\t\t\tparentToChildren.set(record.parentSessionId, children);\n\t\t}\n\t\tfor (const children of parentToChildren.values()) {\n\t\t\tchildren.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\t\t}\n\n\t\tlet root = selected;\n\t\tconst visited = new Set<string>();\n\t\twhile (root.parentSessionId && !visited.has(root.sessionId)) {\n\t\t\tvisited.add(root.sessionId);\n\t\t\tconst parent = byId.get(root.parentSessionId);\n\t\t\tif (!parent) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\troot = parent;\n\t\t}\n\n\t\tconst ordered: PortableSessionExportSession[] = [];\n\t\tconst queue: PortableSessionExportRecord[] = [root];\n\t\tconst enqueued = new Set<string>([root.sessionId]);\n\t\twhile (queue.length > 0) {\n\t\t\tconst current = queue.shift();\n\t\t\tif (!current) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tordered.push({\n\t\t\t\tsessionId: current.sessionId,\n\t\t\t\tparentSessionId: current.parentSessionId,\n\t\t\t\tsessionFile: current.sessionFile,\n\t\t\t});\n\t\t\tfor (const child of parentToChildren.get(current.sessionId) ?? []) {\n\t\t\t\tif (enqueued.has(child.sessionId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tenqueued.add(child.sessionId);\n\t\t\t\tqueue.push(child);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tselectedSessionId: selected.sessionId,\n\t\t\tsessions: ordered,\n\t\t};\n\t}\n\n\tgetLeafId(): string | null {\n\t\treturn this.leafId;\n\t}\n\n\tgetLeafEntry(): SessionTreeEntry | undefined {\n\t\treturn this.leafId ? this.byId.get(this.leafId) : undefined;\n\t}\n\n\tgetEntry(id: string): SessionTreeEntry | undefined {\n\t\treturn this.byId.get(id);\n\t}\n\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labelsById.get(id);\n\t}\n\n\tgetChildren(parentId: string): SessionTreeEntry[] {\n\t\tconst children: SessionTreeEntry[] = [];\n\t\tfor (const entry of this.byId.values()) {\n\t\t\tif (entry.parentId === parentId) {\n\t\t\t\tchildren.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn children;\n\t}\n\n\tgetBranch(fromId?: string | null): SessionTreeEntry[] {\n\t\tconst path: SessionTreeEntry[] = [];\n\t\tconst startId = fromId ?? this.leafId;\n\t\tlet current = startId ? this.byId.get(startId) : undefined;\n\t\twhile (current) {\n\t\t\tpath.unshift(current);\n\t\t\tcurrent = current.parentId ? this.byId.get(current.parentId) : undefined;\n\t\t}\n\t\treturn path;\n\t}\n\n\tgetEntries(): SessionTreeEntry[] {\n\t\treturn this.fileEntries.filter(isSessionTreeEntry);\n\t}\n\n\tgetHeader(): SessionHeaderEntry | null {\n\t\tconst header = this.fileEntries.find((e) => e.type === \"session\");\n\t\treturn header ? (header as SessionHeaderEntry) : null;\n\t}\n\n\tgetTree(): SessionTreeNode[] {\n\t\tconst entries = this.getEntries();\n\t\tconst nodeMap = new Map<string, SessionTreeNode>();\n\t\tconst roots: SessionTreeNode[] = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tconst label = this.labelsById.get(entry.id);\n\t\t\tnodeMap.set(entry.id, { entry, children: [], label });\n\t\t}\n\n\t\tfor (const entry of entries) {\n\t\t\tconst node = nodeMap.get(entry.id);\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (entry.parentId === null || entry.parentId === entry.id) {\n\t\t\t\troots.push(node);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst parent = nodeMap.get(entry.parentId);\n\t\t\tif (parent) {\n\t\t\t\tparent.children.push(node);\n\t\t\t} else {\n\t\t\t\troots.push(node);\n\t\t\t}\n\t\t}\n\n\t\tconst stack: SessionTreeNode[] = [...roots];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop();\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnode.children.sort(\n\t\t\t\t(a, b) =>\n\t\t\t\t\tnew Date(a.entry.timestamp).getTime() -\n\t\t\t\t\tnew Date(b.entry.timestamp).getTime(),\n\t\t\t);\n\t\t\tstack.push(...node.children);\n\t\t}\n\n\t\treturn roots;\n\t}\n\n\tbranch(branchFromId: string): void {\n\t\tif (!this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t}\n\n\tbranchWithSummary(\n\t\tbranchFromId: string | null,\n\t\tsummary: string,\n\t\toptions?: { fromId?: string; details?: unknown; fromHook?: boolean },\n\t): string {\n\t\tif (branchFromId !== null && !this.byId.has(branchFromId)) {\n\t\t\tthrow new Error(`Entry ${branchFromId} not found`);\n\t\t}\n\t\tthis.leafId = branchFromId;\n\t\tconst entry: BranchSummaryEntry = {\n\t\t\ttype: \"branch_summary\",\n\t\t\tid: this.createTreeEntryId(),\n\t\t\tparentId: branchFromId,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tfromId: options?.fromId ?? branchFromId ?? \"root\",\n\t\t\tsummary,\n\t\t\tdetails: options?.details,\n\t\t\tfromHook: options?.fromHook,\n\t\t};\n\t\tthis.appendTreeEntry(entry);\n\t\treturn entry.id;\n\t}\n\n\tresetLeaf(): void {\n\t\tthis.leafId = null;\n\t}\n\n\tupdateSnapshot(state: AgentState, metadata?: SessionModelMetadata): void {\n\t\tthis._agentSnapshot = state;\n\t\tif (metadata) {\n\t\t\tthis.lastModelMetadata = metadata;\n\t\t}\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tawait this.writer?.flush();\n\t}\n\n\t/**\n\t * Load all sessions for the current directory with metadata\n\t */\n\tloadAllSessions(): SessionMetadata[] {\n\t\treturn this.catalog.loadAllSessions();\n\t}\n\n\tgetSessionFileById(sessionId: string): string | null {\n\t\treturn this.catalog.getSessionFileById(sessionId);\n\t}\n\n\tasync loadEntries(sessionId: string): Promise<SessionEntry[] | null> {\n\t\tconst sessionFile = this.getSessionFileById(sessionId);\n\t\tif (!sessionFile) {\n\t\t\treturn null;\n\t\t}\n\t\treturn safeReadSessionEntries(sessionFile);\n\t}\n\n\t/**\n\t * Set the session file to an existing session\n\t */\n\tsetSessionFile(path: string): void {\n\t\t// Unregister old session file before disposing writer\n\t\tif (this.sessionFile) {\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t}\n\t\tthis.writer?.flushSync();\n\t\tthis.writer?.dispose();\n\n\t\tthis.sessionFile = resolve(path);\n\t\t// Register new session file to prevent migration race conditions\n\t\tregisterActiveSessionFile(this.sessionFile);\n\t\tscheduleSessionMigration();\n\n\t\tif (existsSync(this.sessionFile)) {\n\t\t\tconst entries = safeReadSessionEntries(this.sessionFile);\n\t\t\tconst migrated = migrateToCurrentVersion(entries);\n\t\t\tthis.fileEntries = entries;\n\t\t\tconst header = entries.find((e) => e.type === \"session\") as\n\t\t\t\t| SessionHeaderEntry\n\t\t\t\t| undefined;\n\t\t\tthis.sessionInitialized = Boolean(header && header.provisional !== true);\n\t\t\tthis.rebuildIndex(entries);\n\t\t\tif (migrated) {\n\t\t\t\tthis.rewriteSessionFile();\n\t\t\t}\n\t\t\tthis.sessionId = header?.id ?? uuidv4();\n\t\t\tthis.flushed = true;\n\t\t\tthis.metadataCache.seedFromFile(this.sessionFile);\n\t\t} else {\n\t\t\t// Unregister the non-existent path before initNewSession registers a new one\n\t\t\tunregisterActiveSessionFile(this.sessionFile);\n\t\t\tthis.initNewSession();\n\t\t}\n\t\tthis.initializeWriter();\n\t}\n\n\t/**\n\t * Check if we should initialize the session based on message history.\n\t * Session is initialized once we have at least 1 user message.\n\t */\n\tshouldInitializeSession(messages: AppMessage[]): boolean {\n\t\tif (this.sessionInitialized) return false;\n\n\t\tconst userMessages = messages.filter((m) => m.role === \"user\");\n\t\treturn userMessages.length >= 1;\n\t}\n\n\t/**\n\t * Create a branched session from a specific message index.\n\t * Returns the new session file path.\n\t * @param state - Current agent state\n\t * @param branchFromIndex - Index of the last message to include in the branch (exclusive)\n\t */\n\tcreateBranchedSession(state: AgentState, branchFromIndex: number): string;\n\t/**\n\t * Create a branched session from a specific tree entry id.\n\t */\n\tcreateBranchedSession(leafId: string): string;\n\tcreateBranchedSession(\n\t\tstateOrLeafId: AgentState | string,\n\t\tbranchFromIndex?: number,\n\t): string {\n\t\tif (typeof stateOrLeafId === \"string\") {\n\t\t\treturn this.createBranchedSessionFromLeaf(stateOrLeafId);\n\t\t}\n\t\tif (typeof branchFromIndex !== \"number\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"branchFromIndex is required when branching from AgentState\",\n\t\t\t);\n\t\t}\n\t\treturn this.createBranchedSessionFromState(stateOrLeafId, branchFromIndex);\n\t}\n\n\tprivate createBranchedSessionFromLeaf(leafId: string): string {\n\t\treturn createBranchedSessionFromLeafFn(leafId, {\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tsessionId: this.sessionId,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tbranch: this.getBranch(leafId),\n\t\t\tcontext: this.buildSessionContext(leafId),\n\t\t\theader: this.getHeader(),\n\t\t\tlabelsById: this.labelsById,\n\t\t});\n\t}\n\n\tprivate createBranchedSessionFromState(\n\t\tstate: AgentState,\n\t\tbranchFromIndex: number,\n\t): string {\n\t\treturn createBranchedSessionFromStateFn(state, branchFromIndex, {\n\t\t\tsessionDir: this.sessionDir,\n\t\t\tsessionId: this.sessionId,\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tlastModelMetadata: this.lastModelMetadata,\n\t\t});\n\t}\n\n\t/**\n\t * List all sessions in the session directory\n\t */\n\tasync listSessions(options?: {\n\t\tlimit?: number;\n\t\toffset?: number;\n\t}): Promise<SessionSummary[]> {\n\t\treturn this.catalog.listSessions(options);\n\t}\n\n\t/**\n\t * Load a session by ID\n\t */\n\tasync loadSession(\n\t\tsessionId: string,\n\t\toptions: { messagesView?: SessionMessagesView } = {},\n\t): Promise<{\n\t\tid: string;\n\t\tsubject?: string;\n\t\ttitle?: string;\n\t\tsummary?: string;\n\t\tresumeSummary?: string;\n\t\tmessages: AppMessage[];\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t\tfavorite: boolean;\n\t\ttags?: string[];\n\t\tarchived?: boolean;\n\t\tarchivedAt?: string;\n\t\tmessagesView: SessionMessagesView;\n\t} | null> {\n\t\treturn this.catalog.loadSession(sessionId, options);\n\t}\n\n\t/**\n\t * Create a new session\n\t */\n\tasync createSession(options?: { title?: string }): Promise<{\n\t\tid: string;\n\t\ttitle?: string;\n\t\tresumeSummary?: string;\n\t\tmessages: AppMessage[];\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t}> {\n\t\tthis.startFreshSession();\n\t\tconst now = new Date().toISOString();\n\t\tconst header: SessionHeaderEntry = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionId,\n\t\t\ttimestamp: now,\n\t\t\tcwd: process.cwd(),\n\t\t\tprovisional: true,\n\t\t};\n\t\tthis.fileEntries.unshift(header);\n\n\t\tif (options?.title && this.enabled) {\n\t\t\tconst entry: SessionMetaEntry = {\n\t\t\t\ttype: \"session_meta\",\n\t\t\t\ttimestamp: now,\n\t\t\t\ttitle: options.title,\n\t\t\t};\n\t\t\tthis.fileEntries.push(entry);\n\t\t}\n\t\tthis.rewriteSessionFile();\n\t\tthis.flushed = true;\n\t\tthis.sessionInitialized = false;\n\n\t\treturn {\n\t\t\tid: this.sessionId,\n\t\t\ttitle: options?.title,\n\t\t\tmessages: [],\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tmessageCount: 0,\n\t\t};\n\t}\n\n\timportSessionJsonl(sourcePath: string): PortableSessionImportResult {\n\t\tconst resolvedSource = resolve(sourcePath);\n\t\tif (!existsSync(resolvedSource)) {\n\t\t\tthrow new Error(`Session file not found: ${resolvedSource}`);\n\t\t}\n\n\t\tconst entries = safeReadSessionEntries(resolvedSource);\n\t\treturn this.importPortableEntries(entries);\n\t}\n\n\timportSessionEntries(entries: SessionEntry[]): PortableSessionImportResult {\n\t\treturn this.importPortableEntries([...entries]);\n\t}\n\n\timportPortableSession(sourcePath: string): {\n\t\tsessionFile: string;\n\t\tsessionId: string;\n\t\timportedCount: number;\n\t} {\n\t\tconst resolvedSource = resolve(sourcePath);\n\t\tif (!existsSync(resolvedSource)) {\n\t\t\tthrow new Error(`Session file not found: ${resolvedSource}`);\n\t\t}\n\n\t\tconst extension = extname(resolvedSource).toLowerCase();\n\t\tif (extension === \".json\") {\n\t\t\tconst portableExport = this.readPortableJsonExport(resolvedSource);\n\t\t\tif (portableExport.sessions?.length) {\n\t\t\t\treturn this.importPortableSessionBundle(portableExport);\n\t\t\t}\n\t\t\tif (portableExport.entries) {\n\t\t\t\treturn this.importPortableEntries(portableExport.entries);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t\"Portable session export is missing both entries and sessions.\",\n\t\t\t);\n\t\t}\n\n\t\tconst entries = safeReadSessionEntries(resolvedSource);\n\t\treturn this.importPortableEntries(entries);\n\t}\n\n\t/**\n\t * Delete a session\n\t */\n\tasync deleteSession(sessionId: string): Promise<void> {\n\t\tthis.catalog.deleteSession(sessionId);\n\t}\n\n\t/**\n\t * Prune old sessions based on configured limits.\n\t * Removes sessions that exceed MAX_SESSIONS count or MAX_SESSION_AGE_DAYS.\n\t * Favorites are never pruned.\n\t * Returns the number of sessions removed.\n\t */\n\tpruneSessions(): { removed: number; errors: number } {\n\t\treturn this.catalog.pruneSessions();\n\t}\n\n\tprivate importPortableEntries(\n\t\tentries: SessionEntry[],\n\t): PortableSessionImportResult {\n\t\tmigrateToCurrentVersion(entries);\n\t\tif (entries.length === 0) {\n\t\t\tthrow new Error(\"Imported session file is empty or unreadable.\");\n\t\t}\n\n\t\tconst headerIndex = entries.findIndex((entry) => entry.type === \"session\");\n\t\tif (headerIndex < 0) {\n\t\t\tthrow new Error(\"Imported session file is missing a session header.\");\n\t\t}\n\n\t\tconst header = entries[headerIndex] as SessionHeaderEntry;\n\t\tlet sessionId = header.id?.trim() || uuidv4();\n\t\tif (this.catalog.getSessionFileById(sessionId)) {\n\t\t\tsessionId = uuidv4();\n\t\t}\n\n\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\tconst targetFile = join(this.sessionDir, `${timestamp}_${sessionId}.jsonl`);\n\t\tconst importedHeader: SessionHeaderEntry = {\n\t\t\t...header,\n\t\t\tid: sessionId,\n\t\t\tsubject: undefined,\n\t\t};\n\t\tconst importedEntries = entries.map((entry, index) =>\n\t\t\tindex === headerIndex ? importedHeader : entry,\n\t\t);\n\n\t\twriteFileSync(\n\t\t\ttargetFile,\n\t\t\t`${importedEntries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n\t\t\t\"utf8\",\n\t\t);\n\n\t\treturn {\n\t\t\tsessionFile: targetFile,\n\t\t\tsessionId,\n\t\t\timportedCount: 1,\n\t\t};\n\t}\n\n\tprivate importPortableSessionBundle(\n\t\tportableExport: PortableSessionBundle,\n\t): PortableSessionImportResult {\n\t\tconst sessions = portableExport.sessions;\n\t\tif (!sessions?.length) {\n\t\t\tthrow new Error(\"Portable session export is missing bundled sessions.\");\n\t\t}\n\n\t\tconst pending = new Map(\n\t\t\tsessions.map((session) => [session.sessionId, session]),\n\t\t);\n\t\tconst importedIds = new Map<string, string>();\n\t\tconst importedFiles = new Map<string, string>();\n\t\tconst ordered: PortableSessionExportSession[] = [];\n\n\t\twhile (pending.size > 0) {\n\t\t\tlet progressed = false;\n\t\t\tfor (const [sessionId, session] of pending) {\n\t\t\t\tif (session.parentSessionId && pending.has(session.parentSessionId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tordered.push(session);\n\t\t\t\tpending.delete(sessionId);\n\t\t\t\tprogressed = true;\n\t\t\t}\n\t\t\tif (!progressed) {\n\t\t\t\tordered.push(...pending.values());\n\t\t\t\tpending.clear();\n\t\t\t}\n\t\t}\n\n\t\tfor (const session of ordered) {\n\t\t\tconst entries = session.entries ? [...session.entries] : [];\n\t\t\tmigrateToCurrentVersion(entries);\n\t\t\tif (entries.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Bundled session ${session.sessionId} is empty or unreadable.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst headerIndex = entries.findIndex(\n\t\t\t\t(entry) => entry.type === \"session\",\n\t\t\t);\n\t\t\tif (headerIndex < 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Bundled session ${session.sessionId} is missing a session header.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst header = entries[headerIndex] as SessionHeaderEntry;\n\t\t\tlet importedSessionId = header.id?.trim() || uuidv4();\n\t\t\tif (this.catalog.getSessionFileById(importedSessionId)) {\n\t\t\t\timportedSessionId = uuidv4();\n\t\t\t}\n\t\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\t\t\tconst targetFile = join(\n\t\t\t\tthis.sessionDir,\n\t\t\t\t`${timestamp}_${importedSessionId}.jsonl`,\n\t\t\t);\n\t\t\tconst importedParentSessionId = session.parentSessionId\n\t\t\t\t? importedIds.get(session.parentSessionId)\n\t\t\t\t: undefined;\n\t\t\tconst importedHeader: SessionHeaderEntry = {\n\t\t\t\t...header,\n\t\t\t\tid: importedSessionId,\n\t\t\t\tsubject: undefined,\n\t\t\t\tparentSession: importedParentSessionId,\n\t\t\t\tbranchedFrom: session.parentSessionId\n\t\t\t\t\t? importedFiles.get(session.parentSessionId)\n\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t\tconst importedEntries = entries.map((entry, index) =>\n\t\t\t\tindex === headerIndex ? importedHeader : entry,\n\t\t\t);\n\n\t\t\twriteFileSync(\n\t\t\t\ttargetFile,\n\t\t\t\t`${importedEntries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n\t\t\t\t\"utf8\",\n\t\t\t);\n\t\t\timportedIds.set(session.sessionId, importedSessionId);\n\t\t\timportedFiles.set(session.sessionId, targetFile);\n\t\t}\n\n\t\tconst selectedSourceSessionId =\n\t\t\tportableExport.sessionId ?? sessions[0]?.sessionId;\n\t\tconst selectedSessionId =\n\t\t\t(selectedSourceSessionId\n\t\t\t\t? importedIds.get(selectedSourceSessionId)\n\t\t\t\t: undefined) ?? importedIds.get(sessions[0]!.sessionId)!;\n\t\tconst selectedSessionFile =\n\t\t\timportedFiles.get(selectedSourceSessionId ?? sessions[0]!.sessionId) ??\n\t\t\timportedFiles.get(sessions[0]!.sessionId)!;\n\n\t\treturn {\n\t\t\tsessionFile: selectedSessionFile,\n\t\t\tsessionId: selectedSessionId,\n\t\t\timportedCount: ordered.length,\n\t\t};\n\t}\n\n\tprivate readPortableJsonExport(sourcePath: string): PortableSessionBundle {\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(readFileSync(sourcePath, \"utf8\"));\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Portable session export is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"Portable session export must be a JSON object.\");\n\t\t}\n\n\t\tconst portableExport = parsed as {\n\t\t\tformat?: unknown;\n\t\t\tsessionId?: unknown;\n\t\t\tentries?: unknown;\n\t\t\tsessions?: unknown;\n\t\t};\n\t\tconst format =\n\t\t\ttypeof portableExport.format === \"string\"\n\t\t\t\t? portableExport.format\n\t\t\t\t: undefined;\n\t\tif (format !== PORTABLE_SESSION_EXPORT_FORMAT) {\n\t\t\tthrow new Error(\n\t\t\t\t`Portable session export format must be ${PORTABLE_SESSION_EXPORT_FORMAT}.`,\n\t\t\t);\n\t\t}\n\n\t\tconst parseEntries = (entries: unknown[], path: string): SessionEntry[] =>\n\t\t\tentries.map((entry, index) => {\n\t\t\t\tconst parsedEntry = tryParseSessionEntry(JSON.stringify(entry));\n\t\t\t\tif (!parsedEntry) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${path} contains an invalid entry at index ${index}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn parsedEntry;\n\t\t\t});\n\n\t\tconst entries = Array.isArray(portableExport.entries)\n\t\t\t? parseEntries(portableExport.entries, \"Portable session export\")\n\t\t\t: undefined;\n\t\tconst sessions = Array.isArray(portableExport.sessions)\n\t\t\t? portableExport.sessions.map((session, index) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!session ||\n\t\t\t\t\t\ttypeof session !== \"object\" ||\n\t\t\t\t\t\tArray.isArray(session)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export contains an invalid bundled session at index ${index}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst parsedSession = session as {\n\t\t\t\t\t\tsessionId?: unknown;\n\t\t\t\t\t\tparentSessionId?: unknown;\n\t\t\t\t\t\tentries?: unknown;\n\t\t\t\t\t};\n\t\t\t\t\tif (typeof parsedSession.sessionId !== \"string\") {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export is missing a sessionId for bundled session ${index}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (!Array.isArray(parsedSession.entries)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Portable session export is missing entries for bundled session ${parsedSession.sessionId}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsessionId: parsedSession.sessionId,\n\t\t\t\t\t\tparentSessionId:\n\t\t\t\t\t\t\ttypeof parsedSession.parentSessionId === \"string\"\n\t\t\t\t\t\t\t\t? parsedSession.parentSessionId\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tsessionFile: join(\n\t\t\t\t\t\t\tthis.sessionDir,\n\t\t\t\t\t\t\t`${parsedSession.sessionId}.jsonl`,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tentries: parseEntries(\n\t\t\t\t\t\t\tparsedSession.entries,\n\t\t\t\t\t\t\t`Bundled session ${parsedSession.sessionId}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t} satisfies PortableSessionExportSession;\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\tif (!entries && !sessions?.length) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Portable session export is missing both entries and bundled sessions.\",\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tformat,\n\t\t\texportedAt:\n\t\t\t\ttypeof (portableExport as { exportedAt?: unknown }).exportedAt ===\n\t\t\t\t\"string\"\n\t\t\t\t\t? (portableExport as { exportedAt: string }).exportedAt\n\t\t\t\t\t: new Date().toISOString(),\n\t\t\tsessionId:\n\t\t\t\ttypeof portableExport.sessionId === \"string\"\n\t\t\t\t\t? portableExport.sessionId\n\t\t\t\t\t: undefined,\n\t\t\tentries,\n\t\t\tsessions,\n\t\t};\n\t}\n\n\tprivate buildPortableSessionRecords(): PortableSessionExportRecord[] {\n\t\tconst records: PortableSessionExportRecord[] = [];\n\t\tconst filePaths = readdirSync(this.sessionDir)\n\t\t\t.filter((fileName) => fileName.endsWith(\".jsonl\"))\n\t\t\t.map((fileName) => resolve(join(this.sessionDir, fileName)));\n\n\t\tfor (const filePath of filePaths) {\n\t\t\tconst entries = safeReadSessionEntries(filePath);\n\t\t\tconst header = entries.find((entry) => entry.type === \"session\") as\n\t\t\t\t| SessionHeaderEntry\n\t\t\t\t| undefined;\n\t\t\tif (!header?.id) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trecords.push({\n\t\t\t\tsessionId: header.id,\n\t\t\t\tsessionFile: filePath,\n\t\t\t\ttimestamp: header.timestamp,\n\t\t\t\tparentSessionId: header.parentSession,\n\t\t\t\tparentSessionFile: header.branchedFrom\n\t\t\t\t\t? resolve(header.branchedFrom)\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t}\n\n\t\tconst byPath = new Map(\n\t\t\trecords.map((record) => [resolve(record.sessionFile), record]),\n\t\t);\n\t\tfor (const record of records) {\n\t\t\tif (!record.parentSessionId && record.parentSessionFile) {\n\t\t\t\trecord.parentSessionId = byPath.get(\n\t\t\t\t\tresolve(record.parentSessionFile),\n\t\t\t\t)?.sessionId;\n\t\t\t}\n\t\t}\n\n\t\trecords.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\t\treturn records;\n\t}\n}\n"]}
@@ -18,6 +18,8 @@ export interface LoadedSessionData {
18
18
  messageCount: number;
19
19
  favorite: boolean;
20
20
  tags?: string[];
21
+ archived?: boolean;
22
+ archivedAt?: string;
21
23
  messagesView: SessionMessagesView;
22
24
  }
23
25
  export declare class SessionCatalog {
@@ -1 +1 @@
1
- {"version":3,"file":"session-catalog.d.ts","sourceRoot":"","sources":["../../src/session/session-catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQpD,OAAO,KAAK,EACX,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,MAAM,YAAY,CAAC;AAIpB,KAAK,qBAAqB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC/C,CAAC;AAQF,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;CAClC;AAaD,qBAAa,cAAc;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAE3D,eAAe,IAAI,eAAe,EAAE;IA0DpC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpD,YAAY,CAAC,OAAO,CAAC,EAAE;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,cAAc,EAAE;IAsCpB,WAAW,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,mBAAmB,CAAA;KAAO,GAClD,iBAAiB,GAAG,IAAI;IAkC3B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAStC,aAAa,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAiDpD"}
1
+ {"version":3,"file":"session-catalog.d.ts","sourceRoot":"","sources":["../../src/session/session-catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQpD,OAAO,KAAK,EACX,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,MAAM,YAAY,CAAC;AAIpB,KAAK,qBAAqB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC/C,CAAC;AAQF,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,mBAAmB,CAAC;CAClC;AAaD,qBAAa,cAAc;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAE3D,eAAe,IAAI,eAAe,EAAE;IA4DpC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpD,YAAY,CAAC,OAAO,CAAC,EAAE;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,cAAc,EAAE;IAwCpB,WAAW,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,mBAAmB,CAAA;KAAO,GAClD,iBAAiB,GAAG,IAAI;IAoC3B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAStC,aAAa,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAiDpD"}