@greppleai/grip 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1057) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +725 -2
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +11 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/bun/restore-sandbox-env.d.ts +13 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +32 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +70 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +441 -0
  18. package/dist/cli/args.js.map +1 -0
  19. package/dist/cli/config-selector.d.ts +14 -0
  20. package/dist/cli/config-selector.d.ts.map +1 -0
  21. package/dist/cli/config-selector.js +31 -0
  22. package/dist/cli/config-selector.js.map +1 -0
  23. package/dist/cli/file-processor.d.ts +15 -0
  24. package/dist/cli/file-processor.d.ts.map +1 -0
  25. package/dist/cli/file-processor.js +60 -0
  26. package/dist/cli/file-processor.js.map +1 -0
  27. package/dist/cli/initial-message.d.ts +18 -0
  28. package/dist/cli/initial-message.d.ts.map +1 -0
  29. package/dist/cli/initial-message.js +22 -0
  30. package/dist/cli/initial-message.js.map +1 -0
  31. package/dist/cli/list-models.d.ts +9 -0
  32. package/dist/cli/list-models.d.ts.map +1 -0
  33. package/dist/cli/list-models.js +98 -0
  34. package/dist/cli/list-models.js.map +1 -0
  35. package/dist/cli/session-picker.d.ts +9 -0
  36. package/dist/cli/session-picker.d.ts.map +1 -0
  37. package/dist/cli/session-picker.js +35 -0
  38. package/dist/cli/session-picker.js.map +1 -0
  39. package/dist/cli.d.ts +3 -0
  40. package/dist/cli.d.ts.map +1 -0
  41. package/dist/cli.js +14 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/config.d.ts +82 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +406 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/core/agent-session.d.ts +970 -0
  48. package/dist/core/agent-session.d.ts.map +1 -0
  49. package/dist/core/agent-session.js +5176 -0
  50. package/dist/core/agent-session.js.map +1 -0
  51. package/dist/core/auth-guidance.d.ts +5 -0
  52. package/dist/core/auth-guidance.d.ts.map +1 -0
  53. package/dist/core/auth-guidance.js +21 -0
  54. package/dist/core/auth-guidance.js.map +1 -0
  55. package/dist/core/auth-storage.d.ts +150 -0
  56. package/dist/core/auth-storage.d.ts.map +1 -0
  57. package/dist/core/auth-storage.js +557 -0
  58. package/dist/core/auth-storage.js.map +1 -0
  59. package/dist/core/bash-executor.d.ts +26 -0
  60. package/dist/core/bash-executor.d.ts.map +1 -0
  61. package/dist/core/bash-executor.js +99 -0
  62. package/dist/core/bash-executor.js.map +1 -0
  63. package/dist/core/compaction/branch-summarization.d.ts +83 -0
  64. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  65. package/dist/core/compaction/branch-summarization.js +220 -0
  66. package/dist/core/compaction/branch-summarization.js.map +1 -0
  67. package/dist/core/compaction/compaction.d.ts +65 -0
  68. package/dist/core/compaction/compaction.d.ts.map +1 -0
  69. package/dist/core/compaction/compaction.js +550 -0
  70. package/dist/core/compaction/compaction.js.map +1 -0
  71. package/dist/core/compaction/compression-detection-ledger.d.ts +34 -0
  72. package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -0
  73. package/dist/core/compaction/compression-detection-ledger.js +52 -0
  74. package/dist/core/compaction/compression-detection-ledger.js.map +1 -0
  75. package/dist/core/compaction/compression-detector.d.ts +71 -0
  76. package/dist/core/compaction/compression-detector.d.ts.map +1 -0
  77. package/dist/core/compaction/compression-detector.js +407 -0
  78. package/dist/core/compaction/compression-detector.js.map +1 -0
  79. package/dist/core/compaction/compression-economics.d.ts +55 -0
  80. package/dist/core/compaction/compression-economics.d.ts.map +1 -0
  81. package/dist/core/compaction/compression-economics.js +151 -0
  82. package/dist/core/compaction/compression-economics.js.map +1 -0
  83. package/dist/core/compaction/utils.d.ts +28 -0
  84. package/dist/core/compaction/utils.d.ts.map +1 -0
  85. package/dist/core/compaction/utils.js +165 -0
  86. package/dist/core/compaction/utils.js.map +1 -0
  87. package/dist/core/defaults.d.ts +3 -0
  88. package/dist/core/defaults.d.ts.map +1 -0
  89. package/dist/core/defaults.js +2 -0
  90. package/dist/core/defaults.js.map +1 -0
  91. package/dist/core/diagnostics.d.ts +18 -0
  92. package/dist/core/diagnostics.d.ts.map +1 -0
  93. package/dist/core/diagnostics.js +2 -0
  94. package/dist/core/diagnostics.js.map +1 -0
  95. package/dist/core/event-bus.d.ts +9 -0
  96. package/dist/core/event-bus.d.ts.map +1 -0
  97. package/dist/core/event-bus.js +25 -0
  98. package/dist/core/event-bus.js.map +1 -0
  99. package/dist/core/exec.d.ts +29 -0
  100. package/dist/core/exec.d.ts.map +1 -0
  101. package/dist/core/exec.js +75 -0
  102. package/dist/core/exec.js.map +1 -0
  103. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  104. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  105. package/dist/core/export-html/ansi-to-html.js +245 -0
  106. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  107. package/dist/core/export-html/index.d.ts +21 -0
  108. package/dist/core/export-html/index.d.ts.map +1 -0
  109. package/dist/core/export-html/index.js +230 -0
  110. package/dist/core/export-html/index.js.map +1 -0
  111. package/dist/core/export-html/template.css +1066 -0
  112. package/dist/core/export-html/template.html +55 -0
  113. package/dist/core/export-html/template.js +1864 -0
  114. package/dist/core/export-html/tool-renderer.d.ts +32 -0
  115. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  116. package/dist/core/export-html/tool-renderer.js +108 -0
  117. package/dist/core/export-html/tool-renderer.js.map +1 -0
  118. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  119. package/dist/core/export-html/vendor/marked.min.js +78 -0
  120. package/dist/core/extensions/loader.d.ts +24 -0
  121. package/dist/core/extensions/loader.d.ts.map +1 -0
  122. package/dist/core/extensions/loader.js +613 -0
  123. package/dist/core/extensions/loader.js.map +1 -0
  124. package/dist/core/extensions/runner.d.ts +160 -0
  125. package/dist/core/extensions/runner.d.ts.map +1 -0
  126. package/dist/core/extensions/runner.js +962 -0
  127. package/dist/core/extensions/runner.js.map +1 -0
  128. package/dist/core/extensions/types.d.ts +1311 -0
  129. package/dist/core/extensions/types.d.ts.map +1 -0
  130. package/dist/core/extensions/types.js +51 -0
  131. package/dist/core/extensions/types.js.map +1 -0
  132. package/dist/core/extensions/wrapper.d.ts +20 -0
  133. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  134. package/dist/core/extensions/wrapper.js +22 -0
  135. package/dist/core/extensions/wrapper.js.map +1 -0
  136. package/dist/core/footer-data-provider.d.ts +52 -0
  137. package/dist/core/footer-data-provider.d.ts.map +1 -0
  138. package/dist/core/footer-data-provider.js +318 -0
  139. package/dist/core/footer-data-provider.js.map +1 -0
  140. package/dist/core/grip-agent.d.ts +240 -0
  141. package/dist/core/grip-agent.d.ts.map +1 -0
  142. package/dist/core/grip-agent.js +1243 -0
  143. package/dist/core/grip-agent.js.map +1 -0
  144. package/dist/core/grip-manifest.d.ts +9 -0
  145. package/dist/core/grip-manifest.d.ts.map +1 -0
  146. package/dist/core/grip-manifest.js +25 -0
  147. package/dist/core/grip-manifest.js.map +1 -0
  148. package/dist/core/hooks/aggregate.d.ts +5 -0
  149. package/dist/core/hooks/aggregate.d.ts.map +1 -0
  150. package/dist/core/hooks/aggregate.js +226 -0
  151. package/dist/core/hooks/aggregate.js.map +1 -0
  152. package/dist/core/hooks/config.d.ts +14 -0
  153. package/dist/core/hooks/config.d.ts.map +1 -0
  154. package/dist/core/hooks/config.js +372 -0
  155. package/dist/core/hooks/config.js.map +1 -0
  156. package/dist/core/hooks/executor.d.ts +12 -0
  157. package/dist/core/hooks/executor.d.ts.map +1 -0
  158. package/dist/core/hooks/executor.js +708 -0
  159. package/dist/core/hooks/executor.js.map +1 -0
  160. package/dist/core/hooks/index.d.ts +9 -0
  161. package/dist/core/hooks/index.d.ts.map +1 -0
  162. package/dist/core/hooks/index.js +14 -0
  163. package/dist/core/hooks/index.js.map +1 -0
  164. package/dist/core/hooks/matcher.d.ts +10 -0
  165. package/dist/core/hooks/matcher.d.ts.map +1 -0
  166. package/dist/core/hooks/matcher.js +70 -0
  167. package/dist/core/hooks/matcher.js.map +1 -0
  168. package/dist/core/hooks/trust-store.d.ts +38 -0
  169. package/dist/core/hooks/trust-store.d.ts.map +1 -0
  170. package/dist/core/hooks/trust-store.js +167 -0
  171. package/dist/core/hooks/trust-store.js.map +1 -0
  172. package/dist/core/hooks/types.d.ts +234 -0
  173. package/dist/core/hooks/types.d.ts.map +1 -0
  174. package/dist/core/hooks/types.js +52 -0
  175. package/dist/core/hooks/types.js.map +1 -0
  176. package/dist/core/http-dispatcher.d.ts +21 -0
  177. package/dist/core/http-dispatcher.d.ts.map +1 -0
  178. package/dist/core/http-dispatcher.js +82 -0
  179. package/dist/core/http-dispatcher.js.map +1 -0
  180. package/dist/core/instruction-resource-loader.d.ts +81 -0
  181. package/dist/core/instruction-resource-loader.d.ts.map +1 -0
  182. package/dist/core/instruction-resource-loader.js +574 -0
  183. package/dist/core/instruction-resource-loader.js.map +1 -0
  184. package/dist/core/keybindings.d.ts +399 -0
  185. package/dist/core/keybindings.d.ts.map +1 -0
  186. package/dist/core/keybindings.js +299 -0
  187. package/dist/core/keybindings.js.map +1 -0
  188. package/dist/core/lsp/abort.d.ts +3 -0
  189. package/dist/core/lsp/abort.d.ts.map +1 -0
  190. package/dist/core/lsp/abort.js +28 -0
  191. package/dist/core/lsp/abort.js.map +1 -0
  192. package/dist/core/lsp/client.d.ts +108 -0
  193. package/dist/core/lsp/client.d.ts.map +1 -0
  194. package/dist/core/lsp/client.js +586 -0
  195. package/dist/core/lsp/client.js.map +1 -0
  196. package/dist/core/lsp/config-loader.d.ts +44 -0
  197. package/dist/core/lsp/config-loader.d.ts.map +1 -0
  198. package/dist/core/lsp/config-loader.js +223 -0
  199. package/dist/core/lsp/config-loader.js.map +1 -0
  200. package/dist/core/lsp/config.d.ts +134 -0
  201. package/dist/core/lsp/config.d.ts.map +1 -0
  202. package/dist/core/lsp/config.js +682 -0
  203. package/dist/core/lsp/config.js.map +1 -0
  204. package/dist/core/lsp/diagnostics.d.ts +18 -0
  205. package/dist/core/lsp/diagnostics.d.ts.map +1 -0
  206. package/dist/core/lsp/diagnostics.js +311 -0
  207. package/dist/core/lsp/diagnostics.js.map +1 -0
  208. package/dist/core/lsp/file-sync.d.ts +58 -0
  209. package/dist/core/lsp/file-sync.d.ts.map +1 -0
  210. package/dist/core/lsp/file-sync.js +432 -0
  211. package/dist/core/lsp/file-sync.js.map +1 -0
  212. package/dist/core/lsp/integration.d.ts +62 -0
  213. package/dist/core/lsp/integration.d.ts.map +1 -0
  214. package/dist/core/lsp/integration.js +145 -0
  215. package/dist/core/lsp/integration.js.map +1 -0
  216. package/dist/core/lsp/language-map.d.ts +54 -0
  217. package/dist/core/lsp/language-map.d.ts.map +1 -0
  218. package/dist/core/lsp/language-map.js +300 -0
  219. package/dist/core/lsp/language-map.js.map +1 -0
  220. package/dist/core/lsp/manager.d.ts +120 -0
  221. package/dist/core/lsp/manager.d.ts.map +1 -0
  222. package/dist/core/lsp/manager.js +636 -0
  223. package/dist/core/lsp/manager.js.map +1 -0
  224. package/dist/core/lsp/navigation.d.ts +32 -0
  225. package/dist/core/lsp/navigation.d.ts.map +1 -0
  226. package/dist/core/lsp/navigation.js +327 -0
  227. package/dist/core/lsp/navigation.js.map +1 -0
  228. package/dist/core/lsp/portable-path.d.ts +18 -0
  229. package/dist/core/lsp/portable-path.d.ts.map +1 -0
  230. package/dist/core/lsp/portable-path.js +83 -0
  231. package/dist/core/lsp/portable-path.js.map +1 -0
  232. package/dist/core/lsp/refactor.d.ts +32 -0
  233. package/dist/core/lsp/refactor.d.ts.map +1 -0
  234. package/dist/core/lsp/refactor.js +519 -0
  235. package/dist/core/lsp/refactor.js.map +1 -0
  236. package/dist/core/lsp/transport.d.ts +39 -0
  237. package/dist/core/lsp/transport.d.ts.map +1 -0
  238. package/dist/core/lsp/transport.js +261 -0
  239. package/dist/core/lsp/transport.js.map +1 -0
  240. package/dist/core/messages.d.ts +34 -0
  241. package/dist/core/messages.d.ts.map +1 -0
  242. package/dist/core/messages.js +140 -0
  243. package/dist/core/messages.js.map +1 -0
  244. package/dist/core/model-registry.d.ts +148 -0
  245. package/dist/core/model-registry.d.ts.map +1 -0
  246. package/dist/core/model-registry.js +812 -0
  247. package/dist/core/model-registry.js.map +1 -0
  248. package/dist/core/model-resolver.d.ts +115 -0
  249. package/dist/core/model-resolver.d.ts.map +1 -0
  250. package/dist/core/model-resolver.js +498 -0
  251. package/dist/core/model-resolver.js.map +1 -0
  252. package/dist/core/output-guard.d.ts +7 -0
  253. package/dist/core/output-guard.d.ts.map +1 -0
  254. package/dist/core/output-guard.js +89 -0
  255. package/dist/core/output-guard.js.map +1 -0
  256. package/dist/core/package-manager.d.ts +209 -0
  257. package/dist/core/package-manager.d.ts.map +1 -0
  258. package/dist/core/package-manager.js +2341 -0
  259. package/dist/core/package-manager.js.map +1 -0
  260. package/dist/core/prompt-templates.d.ts +57 -0
  261. package/dist/core/prompt-templates.d.ts.map +1 -0
  262. package/dist/core/prompt-templates.js +353 -0
  263. package/dist/core/prompt-templates.js.map +1 -0
  264. package/dist/core/provider-display-names.d.ts +2 -0
  265. package/dist/core/provider-display-names.d.ts.map +1 -0
  266. package/dist/core/provider-display-names.js +33 -0
  267. package/dist/core/provider-display-names.js.map +1 -0
  268. package/dist/core/remote-workspace-protocol/contract.d.ts +456 -0
  269. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -0
  270. package/dist/core/remote-workspace-protocol/contract.js +809 -0
  271. package/dist/core/remote-workspace-protocol/contract.js.map +1 -0
  272. package/dist/core/remote-workspace-protocol/session.d.ts +247 -0
  273. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -0
  274. package/dist/core/remote-workspace-protocol/session.js +1839 -0
  275. package/dist/core/remote-workspace-protocol/session.js.map +1 -0
  276. package/dist/core/resolve-config-value.d.ts +32 -0
  277. package/dist/core/resolve-config-value.d.ts.map +1 -0
  278. package/dist/core/resolve-config-value.js +257 -0
  279. package/dist/core/resolve-config-value.js.map +1 -0
  280. package/dist/core/resource-loader.d.ts +200 -0
  281. package/dist/core/resource-loader.d.ts.map +1 -0
  282. package/dist/core/resource-loader.js +1209 -0
  283. package/dist/core/resource-loader.js.map +1 -0
  284. package/dist/core/rules.d.ts +40 -0
  285. package/dist/core/rules.d.ts.map +1 -0
  286. package/dist/core/rules.js +57 -0
  287. package/dist/core/rules.js.map +1 -0
  288. package/dist/core/sandbox/command.d.ts +27 -0
  289. package/dist/core/sandbox/command.d.ts.map +1 -0
  290. package/dist/core/sandbox/command.js +124 -0
  291. package/dist/core/sandbox/command.js.map +1 -0
  292. package/dist/core/sandbox/docker.d.ts +169 -0
  293. package/dist/core/sandbox/docker.d.ts.map +1 -0
  294. package/dist/core/sandbox/docker.js +633 -0
  295. package/dist/core/sandbox/docker.js.map +1 -0
  296. package/dist/core/sandbox/lima.d.ts +38 -0
  297. package/dist/core/sandbox/lima.d.ts.map +1 -0
  298. package/dist/core/sandbox/lima.js +324 -0
  299. package/dist/core/sandbox/lima.js.map +1 -0
  300. package/dist/core/session/constants.d.ts +2 -0
  301. package/dist/core/session/constants.d.ts.map +1 -0
  302. package/dist/core/session/constants.js +2 -0
  303. package/dist/core/session/constants.js.map +1 -0
  304. package/dist/core/session/context-metadata.d.ts +5 -0
  305. package/dist/core/session/context-metadata.d.ts.map +1 -0
  306. package/dist/core/session/context-metadata.js +55 -0
  307. package/dist/core/session/context-metadata.js.map +1 -0
  308. package/dist/core/session/context.d.ts +14 -0
  309. package/dist/core/session/context.d.ts.map +1 -0
  310. package/dist/core/session/context.js +117 -0
  311. package/dist/core/session/context.js.map +1 -0
  312. package/dist/core/session/ids.d.ts +9 -0
  313. package/dist/core/session/ids.d.ts.map +1 -0
  314. package/dist/core/session/ids.js +21 -0
  315. package/dist/core/session/ids.js.map +1 -0
  316. package/dist/core/session/in-memory-session-manager.d.ts +17 -0
  317. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -0
  318. package/dist/core/session/in-memory-session-manager.js +40 -0
  319. package/dist/core/session/in-memory-session-manager.js.map +1 -0
  320. package/dist/core/session/in-memory-session.d.ts +7 -0
  321. package/dist/core/session/in-memory-session.d.ts.map +1 -0
  322. package/dist/core/session/in-memory-session.js +11 -0
  323. package/dist/core/session/in-memory-session.js.map +1 -0
  324. package/dist/core/session/jsonl-errors.d.ts +36 -0
  325. package/dist/core/session/jsonl-errors.d.ts.map +1 -0
  326. package/dist/core/session/jsonl-errors.js +49 -0
  327. package/dist/core/session/jsonl-errors.js.map +1 -0
  328. package/dist/core/session/jsonl-helpers.d.ts +20 -0
  329. package/dist/core/session/jsonl-helpers.d.ts.map +1 -0
  330. package/dist/core/session/jsonl-helpers.js +21 -0
  331. package/dist/core/session/jsonl-helpers.js.map +1 -0
  332. package/dist/core/session/local-session-manager.d.ts +30 -0
  333. package/dist/core/session/local-session-manager.d.ts.map +1 -0
  334. package/dist/core/session/local-session-manager.js +205 -0
  335. package/dist/core/session/local-session-manager.js.map +1 -0
  336. package/dist/core/session/local-session.d.ts +9 -0
  337. package/dist/core/session/local-session.d.ts.map +1 -0
  338. package/dist/core/session/local-session.js +15 -0
  339. package/dist/core/session/local-session.js.map +1 -0
  340. package/dist/core/session/migrations.d.ts +11 -0
  341. package/dist/core/session/migrations.d.ts.map +1 -0
  342. package/dist/core/session/migrations.js +78 -0
  343. package/dist/core/session/migrations.js.map +1 -0
  344. package/dist/core/session/remote-session-client.d.ts +83 -0
  345. package/dist/core/session/remote-session-client.d.ts.map +1 -0
  346. package/dist/core/session/remote-session-client.js +224 -0
  347. package/dist/core/session/remote-session-client.js.map +1 -0
  348. package/dist/core/session/remote-session-manager.d.ts +32 -0
  349. package/dist/core/session/remote-session-manager.d.ts.map +1 -0
  350. package/dist/core/session/remote-session-manager.js +124 -0
  351. package/dist/core/session/remote-session-manager.js.map +1 -0
  352. package/dist/core/session/remote-session.d.ts +20 -0
  353. package/dist/core/session/remote-session.d.ts.map +1 -0
  354. package/dist/core/session/remote-session.js +33 -0
  355. package/dist/core/session/remote-session.js.map +1 -0
  356. package/dist/core/session/session-manager.d.ts +18 -0
  357. package/dist/core/session/session-manager.d.ts.map +1 -0
  358. package/dist/core/session/session-manager.js +2 -0
  359. package/dist/core/session/session-manager.js.map +1 -0
  360. package/dist/core/session/session.d.ts +140 -0
  361. package/dist/core/session/session.d.ts.map +1 -0
  362. package/dist/core/session/session.js +461 -0
  363. package/dist/core/session/session.js.map +1 -0
  364. package/dist/core/session/stores/in-memory-session-store.d.ts +39 -0
  365. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -0
  366. package/dist/core/session/stores/in-memory-session-store.js +168 -0
  367. package/dist/core/session/stores/in-memory-session-store.js.map +1 -0
  368. package/dist/core/session/stores/jsonl-session-store.d.ts +97 -0
  369. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -0
  370. package/dist/core/session/stores/jsonl-session-store.js +1140 -0
  371. package/dist/core/session/stores/jsonl-session-store.js.map +1 -0
  372. package/dist/core/session/stores/remote-session-store.d.ts +44 -0
  373. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -0
  374. package/dist/core/session/stores/remote-session-store.js +159 -0
  375. package/dist/core/session/stores/remote-session-store.js.map +1 -0
  376. package/dist/core/session/stores/session-store.d.ts +42 -0
  377. package/dist/core/session/stores/session-store.d.ts.map +1 -0
  378. package/dist/core/session/stores/session-store.js +2 -0
  379. package/dist/core/session/stores/session-store.js.map +1 -0
  380. package/dist/core/session/types.d.ts +141 -0
  381. package/dist/core/session/types.d.ts.map +1 -0
  382. package/dist/core/session/types.js +2 -0
  383. package/dist/core/session/types.js.map +1 -0
  384. package/dist/core/session/usage-ledger.d.ts +18 -0
  385. package/dist/core/session/usage-ledger.d.ts.map +1 -0
  386. package/dist/core/session/usage-ledger.js +68 -0
  387. package/dist/core/session/usage-ledger.js.map +1 -0
  388. package/dist/core/session-cwd.d.ts +19 -0
  389. package/dist/core/session-cwd.d.ts.map +1 -0
  390. package/dist/core/session-cwd.js +38 -0
  391. package/dist/core/session-cwd.js.map +1 -0
  392. package/dist/core/settings-manager.d.ts +318 -0
  393. package/dist/core/settings-manager.d.ts.map +1 -0
  394. package/dist/core/settings-manager.js +991 -0
  395. package/dist/core/settings-manager.js.map +1 -0
  396. package/dist/core/skills.d.ts +40 -0
  397. package/dist/core/skills.d.ts.map +1 -0
  398. package/dist/core/skills.js +57 -0
  399. package/dist/core/skills.js.map +1 -0
  400. package/dist/core/slash-commands.d.ts +15 -0
  401. package/dist/core/slash-commands.d.ts.map +1 -0
  402. package/dist/core/slash-commands.js +36 -0
  403. package/dist/core/slash-commands.js.map +1 -0
  404. package/dist/core/source-info.d.ts +26 -0
  405. package/dist/core/source-info.d.ts.map +1 -0
  406. package/dist/core/source-info.js +27 -0
  407. package/dist/core/source-info.js.map +1 -0
  408. package/dist/core/system-prompt.d.ts +32 -0
  409. package/dist/core/system-prompt.d.ts.map +1 -0
  410. package/dist/core/system-prompt.js +131 -0
  411. package/dist/core/system-prompt.js.map +1 -0
  412. package/dist/core/telemetry.d.ts +3 -0
  413. package/dist/core/telemetry.d.ts.map +1 -0
  414. package/dist/core/telemetry.js +9 -0
  415. package/dist/core/telemetry.js.map +1 -0
  416. package/dist/core/timings.d.ts +10 -0
  417. package/dist/core/timings.d.ts.map +1 -0
  418. package/dist/core/timings.js +41 -0
  419. package/dist/core/timings.js.map +1 -0
  420. package/dist/core/tools/bash.d.ts +51 -0
  421. package/dist/core/tools/bash.d.ts.map +1 -0
  422. package/dist/core/tools/bash.js +310 -0
  423. package/dist/core/tools/bash.js.map +1 -0
  424. package/dist/core/tools/compress-context.d.ts +27 -0
  425. package/dist/core/tools/compress-context.d.ts.map +1 -0
  426. package/dist/core/tools/compress-context.js +142 -0
  427. package/dist/core/tools/compress-context.js.map +1 -0
  428. package/dist/core/tools/edit-diff.d.ts +82 -0
  429. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  430. package/dist/core/tools/edit-diff.js +327 -0
  431. package/dist/core/tools/edit-diff.js.map +1 -0
  432. package/dist/core/tools/edit.d.ts +50 -0
  433. package/dist/core/tools/edit.d.ts.map +1 -0
  434. package/dist/core/tools/edit.js +324 -0
  435. package/dist/core/tools/edit.js.map +1 -0
  436. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  437. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  438. package/dist/core/tools/file-mutation-queue.js +60 -0
  439. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  440. package/dist/core/tools/find.d.ts +22 -0
  441. package/dist/core/tools/find.d.ts.map +1 -0
  442. package/dist/core/tools/find.js +268 -0
  443. package/dist/core/tools/find.js.map +1 -0
  444. package/dist/core/tools/grep.d.ts +27 -0
  445. package/dist/core/tools/grep.d.ts.map +1 -0
  446. package/dist/core/tools/grep.js +332 -0
  447. package/dist/core/tools/grep.js.map +1 -0
  448. package/dist/core/tools/hash-store.d.ts +12 -0
  449. package/dist/core/tools/hash-store.d.ts.map +1 -0
  450. package/dist/core/tools/hash-store.js +48 -0
  451. package/dist/core/tools/hash-store.js.map +1 -0
  452. package/dist/core/tools/hashline/apply.d.ts +40 -0
  453. package/dist/core/tools/hashline/apply.d.ts.map +1 -0
  454. package/dist/core/tools/hashline/apply.js +261 -0
  455. package/dist/core/tools/hashline/apply.js.map +1 -0
  456. package/dist/core/tools/hashline/hash.d.ts +56 -0
  457. package/dist/core/tools/hashline/hash.d.ts.map +1 -0
  458. package/dist/core/tools/hashline/hash.js +196 -0
  459. package/dist/core/tools/hashline/hash.js.map +1 -0
  460. package/dist/core/tools/hashline/parse.d.ts +8 -0
  461. package/dist/core/tools/hashline/parse.d.ts.map +1 -0
  462. package/dist/core/tools/hashline/parse.js +41 -0
  463. package/dist/core/tools/hashline/parse.js.map +1 -0
  464. package/dist/core/tools/hashline/resolve.d.ts +51 -0
  465. package/dist/core/tools/hashline/resolve.d.ts.map +1 -0
  466. package/dist/core/tools/hashline/resolve.js +187 -0
  467. package/dist/core/tools/hashline/resolve.js.map +1 -0
  468. package/dist/core/tools/hashline-utils.d.ts +6 -0
  469. package/dist/core/tools/hashline-utils.d.ts.map +1 -0
  470. package/dist/core/tools/hashline-utils.js +23 -0
  471. package/dist/core/tools/hashline-utils.js.map +1 -0
  472. package/dist/core/tools/index.d.ts +36 -0
  473. package/dist/core/tools/index.d.ts.map +1 -0
  474. package/dist/core/tools/index.js +141 -0
  475. package/dist/core/tools/index.js.map +1 -0
  476. package/dist/core/tools/ls.d.ts +21 -0
  477. package/dist/core/tools/ls.d.ts.map +1 -0
  478. package/dist/core/tools/ls.js +156 -0
  479. package/dist/core/tools/ls.js.map +1 -0
  480. package/dist/core/tools/operations.d.ts +201 -0
  481. package/dist/core/tools/operations.d.ts.map +1 -0
  482. package/dist/core/tools/operations.js +697 -0
  483. package/dist/core/tools/operations.js.map +1 -0
  484. package/dist/core/tools/output-accumulator.d.ts +54 -0
  485. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  486. package/dist/core/tools/output-accumulator.js +184 -0
  487. package/dist/core/tools/output-accumulator.js.map +1 -0
  488. package/dist/core/tools/path-utils.d.ts +9 -0
  489. package/dist/core/tools/path-utils.d.ts.map +1 -0
  490. package/dist/core/tools/path-utils.js +99 -0
  491. package/dist/core/tools/path-utils.js.map +1 -0
  492. package/dist/core/tools/read.d.ts +32 -0
  493. package/dist/core/tools/read.d.ts.map +1 -0
  494. package/dist/core/tools/read.js +318 -0
  495. package/dist/core/tools/read.js.map +1 -0
  496. package/dist/core/tools/render-utils.d.ts +33 -0
  497. package/dist/core/tools/render-utils.d.ts.map +1 -0
  498. package/dist/core/tools/render-utils.js +61 -0
  499. package/dist/core/tools/render-utils.js.map +1 -0
  500. package/dist/core/tools/replace-diff.d.ts +16 -0
  501. package/dist/core/tools/replace-diff.d.ts.map +1 -0
  502. package/dist/core/tools/replace-diff.js +117 -0
  503. package/dist/core/tools/replace-diff.js.map +1 -0
  504. package/dist/core/tools/replace-normalize.d.ts +2 -0
  505. package/dist/core/tools/replace-normalize.d.ts.map +1 -0
  506. package/dist/core/tools/replace-normalize.js +73 -0
  507. package/dist/core/tools/replace-normalize.js.map +1 -0
  508. package/dist/core/tools/replace-render.d.ts +51 -0
  509. package/dist/core/tools/replace-render.d.ts.map +1 -0
  510. package/dist/core/tools/replace-render.js +162 -0
  511. package/dist/core/tools/replace-render.js.map +1 -0
  512. package/dist/core/tools/runtime.d.ts +2 -0
  513. package/dist/core/tools/runtime.d.ts.map +1 -0
  514. package/dist/core/tools/runtime.js +6 -0
  515. package/dist/core/tools/runtime.js.map +1 -0
  516. package/dist/core/tools/session-history.d.ts +55 -0
  517. package/dist/core/tools/session-history.d.ts.map +1 -0
  518. package/dist/core/tools/session-history.js +649 -0
  519. package/dist/core/tools/session-history.js.map +1 -0
  520. package/dist/core/tools/subagent-agents.d.ts +29 -0
  521. package/dist/core/tools/subagent-agents.d.ts.map +1 -0
  522. package/dist/core/tools/subagent-agents.js +223 -0
  523. package/dist/core/tools/subagent-agents.js.map +1 -0
  524. package/dist/core/tools/subagent.d.ts +185 -0
  525. package/dist/core/tools/subagent.d.ts.map +1 -0
  526. package/dist/core/tools/subagent.js +1309 -0
  527. package/dist/core/tools/subagent.js.map +1 -0
  528. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  529. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  530. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  531. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  532. package/dist/core/tools/truncate.d.ts +39 -0
  533. package/dist/core/tools/truncate.d.ts.map +1 -0
  534. package/dist/core/tools/truncate.js +215 -0
  535. package/dist/core/tools/truncate.js.map +1 -0
  536. package/dist/core/tools/websearch.d.ts +33 -0
  537. package/dist/core/tools/websearch.d.ts.map +1 -0
  538. package/dist/core/tools/websearch.js +341 -0
  539. package/dist/core/tools/websearch.js.map +1 -0
  540. package/dist/core/tools/workspace-tool-host.d.ts +102 -0
  541. package/dist/core/tools/workspace-tool-host.d.ts.map +1 -0
  542. package/dist/core/tools/workspace-tool-host.js +348 -0
  543. package/dist/core/tools/workspace-tool-host.js.map +1 -0
  544. package/dist/core/tools/write.d.ts +16 -0
  545. package/dist/core/tools/write.d.ts.map +1 -0
  546. package/dist/core/tools/write.js +204 -0
  547. package/dist/core/tools/write.js.map +1 -0
  548. package/dist/core/workspace-identity.d.ts +7 -0
  549. package/dist/core/workspace-identity.d.ts.map +1 -0
  550. package/dist/core/workspace-identity.js +2 -0
  551. package/dist/core/workspace-identity.js.map +1 -0
  552. package/dist/daemon/command.d.ts +6 -0
  553. package/dist/daemon/command.d.ts.map +1 -0
  554. package/dist/daemon/command.js +58 -0
  555. package/dist/daemon/command.js.map +1 -0
  556. package/dist/daemon/config.d.ts +43 -0
  557. package/dist/daemon/config.d.ts.map +1 -0
  558. package/dist/daemon/config.js +304 -0
  559. package/dist/daemon/config.js.map +1 -0
  560. package/dist/daemon/help.d.ts +2 -0
  561. package/dist/daemon/help.d.ts.map +1 -0
  562. package/dist/daemon/help.js +42 -0
  563. package/dist/daemon/help.js.map +1 -0
  564. package/dist/daemon/lsp-config.d.ts +4 -0
  565. package/dist/daemon/lsp-config.d.ts.map +1 -0
  566. package/dist/daemon/lsp-config.js +155 -0
  567. package/dist/daemon/lsp-config.js.map +1 -0
  568. package/dist/daemon/security.d.ts +19 -0
  569. package/dist/daemon/security.d.ts.map +1 -0
  570. package/dist/daemon/security.js +175 -0
  571. package/dist/daemon/security.js.map +1 -0
  572. package/dist/daemon/server.d.ts +20 -0
  573. package/dist/daemon/server.d.ts.map +1 -0
  574. package/dist/daemon/server.js +400 -0
  575. package/dist/daemon/server.js.map +1 -0
  576. package/dist/daemon/workspace-runtime.d.ts +46 -0
  577. package/dist/daemon/workspace-runtime.d.ts.map +1 -0
  578. package/dist/daemon/workspace-runtime.js +673 -0
  579. package/dist/daemon/workspace-runtime.js.map +1 -0
  580. package/dist/index.d.ts +109 -0
  581. package/dist/index.d.ts.map +1 -0
  582. package/dist/index.js +107 -0
  583. package/dist/index.js.map +1 -0
  584. package/dist/main.d.ts +39 -0
  585. package/dist/main.d.ts.map +1 -0
  586. package/dist/main.js +763 -0
  587. package/dist/main.js.map +1 -0
  588. package/dist/migrations.d.ts +35 -0
  589. package/dist/migrations.d.ts.map +1 -0
  590. package/dist/migrations.js +412 -0
  591. package/dist/migrations.js.map +1 -0
  592. package/dist/modes/interactive/components/assistant-message.d.ts +29 -0
  593. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  594. package/dist/modes/interactive/components/assistant-message.js +149 -0
  595. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  596. package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
  597. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  598. package/dist/modes/interactive/components/bash-execution.js +173 -0
  599. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  600. package/dist/modes/interactive/components/bordered-loader.d.ts +18 -0
  601. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  602. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  603. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  604. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  605. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  606. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  607. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  608. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  609. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  610. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  611. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  612. package/dist/modes/interactive/components/config-selector.d.ts +74 -0
  613. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  614. package/dist/modes/interactive/components/config-selector.js +514 -0
  615. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  616. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  617. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  618. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  619. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  620. package/dist/modes/interactive/components/custom-editor.d.ts +25 -0
  621. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  622. package/dist/modes/interactive/components/custom-editor.js +85 -0
  623. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  624. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  625. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  626. package/dist/modes/interactive/components/custom-message.js +80 -0
  627. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  628. package/dist/modes/interactive/components/diff.d.ts +12 -0
  629. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  630. package/dist/modes/interactive/components/diff.js +118 -0
  631. package/dist/modes/interactive/components/diff.js.map +1 -0
  632. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  633. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  634. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  635. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  636. package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  637. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  638. package/dist/modes/interactive/components/extension-editor.js +128 -0
  639. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  640. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  641. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  642. package/dist/modes/interactive/components/extension-input.js +61 -0
  643. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  644. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  645. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  646. package/dist/modes/interactive/components/extension-selector.js +83 -0
  647. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  648. package/dist/modes/interactive/components/footer.d.ts +36 -0
  649. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  650. package/dist/modes/interactive/components/footer.js +227 -0
  651. package/dist/modes/interactive/components/footer.js.map +1 -0
  652. package/dist/modes/interactive/components/hook-execution.d.ts +19 -0
  653. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -0
  654. package/dist/modes/interactive/components/hook-execution.js +184 -0
  655. package/dist/modes/interactive/components/hook-execution.js.map +1 -0
  656. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  657. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  658. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  659. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  660. package/dist/modes/interactive/components/login-dialog.d.ts +55 -0
  661. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  662. package/dist/modes/interactive/components/login-dialog.js +176 -0
  663. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  664. package/dist/modes/interactive/components/markdown-transform.d.ts +4 -0
  665. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  666. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  667. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  668. package/dist/modes/interactive/components/mermaid.d.ts +14 -0
  669. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  670. package/dist/modes/interactive/components/mermaid.js +228 -0
  671. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  672. package/dist/modes/interactive/components/model-selector.d.ts +52 -0
  673. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  674. package/dist/modes/interactive/components/model-selector.js +296 -0
  675. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  676. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  677. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  678. package/dist/modes/interactive/components/oauth-selector.js +165 -0
  679. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  680. package/dist/modes/interactive/components/scoped-models-selector.d.ts +50 -0
  681. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  682. package/dist/modes/interactive/components/scoped-models-selector.js +300 -0
  683. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  684. package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
  685. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  686. package/dist/modes/interactive/components/session-selector-search.js +144 -0
  687. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  688. package/dist/modes/interactive/components/session-selector.d.ts +108 -0
  689. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  690. package/dist/modes/interactive/components/session-selector.js +835 -0
  691. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  692. package/dist/modes/interactive/components/settings-selector.d.ts +81 -0
  693. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  694. package/dist/modes/interactive/components/settings-selector.js +455 -0
  695. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  696. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  697. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  698. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  699. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  700. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  701. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  702. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  703. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  704. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  705. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  706. package/dist/modes/interactive/components/theme-selector.js +50 -0
  707. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  708. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  709. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  710. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  711. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  712. package/dist/modes/interactive/components/tool-execution.d.ts +67 -0
  713. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  714. package/dist/modes/interactive/components/tool-execution.js +306 -0
  715. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  716. package/dist/modes/interactive/components/tree-selector.d.ts +127 -0
  717. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  718. package/dist/modes/interactive/components/tree-selector.js +1098 -0
  719. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  720. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  721. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  722. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  723. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  724. package/dist/modes/interactive/components/user-message.d.ts +16 -0
  725. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  726. package/dist/modes/interactive/components/user-message.js +49 -0
  727. package/dist/modes/interactive/components/user-message.js.map +1 -0
  728. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  729. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  730. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  731. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  732. package/dist/modes/interactive/interactive-mode.d.ts +557 -0
  733. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  734. package/dist/modes/interactive/interactive-mode.js +5859 -0
  735. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  736. package/dist/modes/interactive/theme/dark.json +86 -0
  737. package/dist/modes/interactive/theme/light.json +85 -0
  738. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  739. package/dist/modes/interactive/theme/theme.d.ts +106 -0
  740. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  741. package/dist/modes/interactive/theme/theme.js +1030 -0
  742. package/dist/modes/interactive/theme/theme.js.map +1 -0
  743. package/dist/modes/json-event.d.ts +28 -0
  744. package/dist/modes/json-event.d.ts.map +1 -0
  745. package/dist/modes/json-event.js +12 -0
  746. package/dist/modes/json-event.js.map +1 -0
  747. package/dist/modes/print-mode.d.ts +29 -0
  748. package/dist/modes/print-mode.d.ts.map +1 -0
  749. package/dist/modes/print-mode.js +142 -0
  750. package/dist/modes/print-mode.js.map +1 -0
  751. package/dist/modes/rpc/jsonl.d.ts +17 -0
  752. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  753. package/dist/modes/rpc/jsonl.js +49 -0
  754. package/dist/modes/rpc/jsonl.js.map +1 -0
  755. package/dist/modes/rpc/rpc-client.d.ts +321 -0
  756. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  757. package/dist/modes/rpc/rpc-client.js +755 -0
  758. package/dist/modes/rpc/rpc-client.js.map +1 -0
  759. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  760. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  761. package/dist/modes/rpc/rpc-mode.js +963 -0
  762. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  763. package/dist/modes/rpc/rpc-types.d.ts +652 -0
  764. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  765. package/dist/modes/rpc/rpc-types.js +8 -0
  766. package/dist/modes/rpc/rpc-types.js.map +1 -0
  767. package/dist/package-manager-cli.d.ts +4 -0
  768. package/dist/package-manager-cli.d.ts.map +1 -0
  769. package/dist/package-manager-cli.js +488 -0
  770. package/dist/package-manager-cli.js.map +1 -0
  771. package/dist/utils/ansi.d.ts +2 -0
  772. package/dist/utils/ansi.d.ts.map +1 -0
  773. package/dist/utils/ansi.js +25 -0
  774. package/dist/utils/ansi.js.map +1 -0
  775. package/dist/utils/changelog.d.ts +23 -0
  776. package/dist/utils/changelog.d.ts.map +1 -0
  777. package/dist/utils/changelog.js +74 -0
  778. package/dist/utils/changelog.js.map +1 -0
  779. package/dist/utils/child-process.d.ts +15 -0
  780. package/dist/utils/child-process.d.ts.map +1 -0
  781. package/dist/utils/child-process.js +88 -0
  782. package/dist/utils/child-process.js.map +1 -0
  783. package/dist/utils/clipboard-image.d.ts +13 -0
  784. package/dist/utils/clipboard-image.d.ts.map +1 -0
  785. package/dist/utils/clipboard-image.js +248 -0
  786. package/dist/utils/clipboard-image.js.map +1 -0
  787. package/dist/utils/clipboard-native.d.ts +11 -0
  788. package/dist/utils/clipboard-native.d.ts.map +1 -0
  789. package/dist/utils/clipboard-native.js +20 -0
  790. package/dist/utils/clipboard-native.js.map +1 -0
  791. package/dist/utils/clipboard.d.ts +4 -0
  792. package/dist/utils/clipboard.d.ts.map +1 -0
  793. package/dist/utils/clipboard.js +171 -0
  794. package/dist/utils/clipboard.js.map +1 -0
  795. package/dist/utils/deprecation.d.ts +4 -0
  796. package/dist/utils/deprecation.d.ts.map +1 -0
  797. package/dist/utils/deprecation.js +13 -0
  798. package/dist/utils/deprecation.js.map +1 -0
  799. package/dist/utils/directory-completions.d.ts +5 -0
  800. package/dist/utils/directory-completions.d.ts.map +1 -0
  801. package/dist/utils/directory-completions.js +64 -0
  802. package/dist/utils/directory-completions.js.map +1 -0
  803. package/dist/utils/exif-orientation.d.ts +6 -0
  804. package/dist/utils/exif-orientation.d.ts.map +1 -0
  805. package/dist/utils/exif-orientation.js +166 -0
  806. package/dist/utils/exif-orientation.js.map +1 -0
  807. package/dist/utils/frontmatter.d.ts +8 -0
  808. package/dist/utils/frontmatter.d.ts.map +1 -0
  809. package/dist/utils/frontmatter.js +26 -0
  810. package/dist/utils/frontmatter.js.map +1 -0
  811. package/dist/utils/fs-watch.d.ts +5 -0
  812. package/dist/utils/fs-watch.d.ts.map +1 -0
  813. package/dist/utils/fs-watch.js +25 -0
  814. package/dist/utils/fs-watch.js.map +1 -0
  815. package/dist/utils/git.d.ts +27 -0
  816. package/dist/utils/git.d.ts.map +1 -0
  817. package/dist/utils/git.js +237 -0
  818. package/dist/utils/git.js.map +1 -0
  819. package/dist/utils/grip-user-agent.d.ts +2 -0
  820. package/dist/utils/grip-user-agent.d.ts.map +1 -0
  821. package/dist/utils/grip-user-agent.js +5 -0
  822. package/dist/utils/grip-user-agent.js.map +1 -0
  823. package/dist/utils/html.d.ts +7 -0
  824. package/dist/utils/html.d.ts.map +1 -0
  825. package/dist/utils/html.js +40 -0
  826. package/dist/utils/html.js.map +1 -0
  827. package/dist/utils/image-convert.d.ts +12 -0
  828. package/dist/utils/image-convert.d.ts.map +1 -0
  829. package/dist/utils/image-convert.js +43 -0
  830. package/dist/utils/image-convert.js.map +1 -0
  831. package/dist/utils/image-process.d.ts +18 -0
  832. package/dist/utils/image-process.d.ts.map +1 -0
  833. package/dist/utils/image-process.js +83 -0
  834. package/dist/utils/image-process.js.map +1 -0
  835. package/dist/utils/image-resize-core.d.ts +30 -0
  836. package/dist/utils/image-resize-core.d.ts.map +1 -0
  837. package/dist/utils/image-resize-core.js +133 -0
  838. package/dist/utils/image-resize-core.js.map +1 -0
  839. package/dist/utils/image-resize-worker.d.ts +2 -0
  840. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  841. package/dist/utils/image-resize-worker.js +31 -0
  842. package/dist/utils/image-resize-worker.js.map +1 -0
  843. package/dist/utils/image-resize.d.ts +19 -0
  844. package/dist/utils/image-resize.d.ts.map +1 -0
  845. package/dist/utils/image-resize.js +81 -0
  846. package/dist/utils/image-resize.js.map +1 -0
  847. package/dist/utils/json.d.ts +3 -0
  848. package/dist/utils/json.d.ts.map +1 -0
  849. package/dist/utils/json.js +7 -0
  850. package/dist/utils/json.js.map +1 -0
  851. package/dist/utils/mime.d.ts +3 -0
  852. package/dist/utils/mime.d.ts.map +1 -0
  853. package/dist/utils/mime.js +110 -0
  854. package/dist/utils/mime.js.map +1 -0
  855. package/dist/utils/open-browser.d.ts +9 -0
  856. package/dist/utils/open-browser.d.ts.map +1 -0
  857. package/dist/utils/open-browser.js +22 -0
  858. package/dist/utils/open-browser.js.map +1 -0
  859. package/dist/utils/paths.d.ts +31 -0
  860. package/dist/utils/paths.d.ts.map +1 -0
  861. package/dist/utils/paths.js +87 -0
  862. package/dist/utils/paths.js.map +1 -0
  863. package/dist/utils/photon.d.ts +22 -0
  864. package/dist/utils/photon.d.ts.map +1 -0
  865. package/dist/utils/photon.js +125 -0
  866. package/dist/utils/photon.js.map +1 -0
  867. package/dist/utils/shell.d.ts +28 -0
  868. package/dist/utils/shell.d.ts.map +1 -0
  869. package/dist/utils/shell.js +188 -0
  870. package/dist/utils/shell.js.map +1 -0
  871. package/dist/utils/sleep.d.ts +5 -0
  872. package/dist/utils/sleep.d.ts.map +1 -0
  873. package/dist/utils/sleep.js +17 -0
  874. package/dist/utils/sleep.js.map +1 -0
  875. package/dist/utils/syntax-highlight.d.ts +12 -0
  876. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  877. package/dist/utils/syntax-highlight.js +125 -0
  878. package/dist/utils/syntax-highlight.js.map +1 -0
  879. package/dist/utils/tools-manager.d.ts +5 -0
  880. package/dist/utils/tools-manager.d.ts.map +1 -0
  881. package/dist/utils/tools-manager.js +329 -0
  882. package/dist/utils/tools-manager.js.map +1 -0
  883. package/dist/utils/version-check.d.ts +14 -0
  884. package/dist/utils/version-check.d.ts.map +1 -0
  885. package/dist/utils/version-check.js +91 -0
  886. package/dist/utils/version-check.js.map +1 -0
  887. package/dist/utils/windows-self-update.d.ts +3 -0
  888. package/dist/utils/windows-self-update.d.ts.map +1 -0
  889. package/dist/utils/windows-self-update.js +77 -0
  890. package/dist/utils/windows-self-update.js.map +1 -0
  891. package/docs/compaction.md +408 -0
  892. package/docs/custom-provider.md +714 -0
  893. package/docs/daemon-architecture.md +399 -0
  894. package/docs/daemon.md +110 -0
  895. package/docs/development.md +72 -0
  896. package/docs/docs.json +164 -0
  897. package/docs/extensions.md +2745 -0
  898. package/docs/hooks.md +85 -0
  899. package/docs/images/doom-extension.png +0 -0
  900. package/docs/images/exy.png +0 -0
  901. package/docs/images/interactive-mode.png +0 -0
  902. package/docs/images/tree-view.png +0 -0
  903. package/docs/index.md +81 -0
  904. package/docs/json.md +89 -0
  905. package/docs/keybindings.md +230 -0
  906. package/docs/lsp.md +499 -0
  907. package/docs/migrating-to-grip.md +18 -0
  908. package/docs/models.md +496 -0
  909. package/docs/packages.md +228 -0
  910. package/docs/prompt-templates.md +88 -0
  911. package/docs/providers.md +251 -0
  912. package/docs/quickstart.md +167 -0
  913. package/docs/rpc.md +1492 -0
  914. package/docs/rules.md +117 -0
  915. package/docs/sandbox.md +181 -0
  916. package/docs/sdk.md +360 -0
  917. package/docs/session-format.md +414 -0
  918. package/docs/sessions.md +137 -0
  919. package/docs/settings.md +371 -0
  920. package/docs/shell-aliases.md +13 -0
  921. package/docs/skills.md +246 -0
  922. package/docs/terminal-setup.md +112 -0
  923. package/docs/termux.md +129 -0
  924. package/docs/themes.md +295 -0
  925. package/docs/tmux.md +61 -0
  926. package/docs/tui.md +918 -0
  927. package/docs/usage.md +304 -0
  928. package/docs/windows.md +17 -0
  929. package/examples/README.md +31 -0
  930. package/examples/daemon-docker/Dockerfile +43 -0
  931. package/examples/daemon-docker/README.md +45 -0
  932. package/examples/extensions/README.md +208 -0
  933. package/examples/extensions/auto-commit-on-exit.ts +46 -0
  934. package/examples/extensions/bash-spawn-hook.ts +30 -0
  935. package/examples/extensions/bookmark.ts +50 -0
  936. package/examples/extensions/border-status-editor.ts +145 -0
  937. package/examples/extensions/built-in-tool-renderer.ts +259 -0
  938. package/examples/extensions/claude-rules.ts +86 -0
  939. package/examples/extensions/commands.ts +82 -0
  940. package/examples/extensions/confirm-destructive.ts +59 -0
  941. package/examples/extensions/custom-compaction.ts +131 -0
  942. package/examples/extensions/custom-footer.ts +79 -0
  943. package/examples/extensions/custom-header.ts +73 -0
  944. package/examples/extensions/custom-provider-anthropic/index.ts +707 -0
  945. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  946. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  947. package/examples/extensions/custom-provider-gitlab-duo/index.ts +402 -0
  948. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  949. package/examples/extensions/custom-provider-gitlab-duo/test.ts +104 -0
  950. package/examples/extensions/dirty-repo-guard.ts +59 -0
  951. package/examples/extensions/doom-overlay/README.md +46 -0
  952. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  953. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  954. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  955. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  956. package/examples/extensions/doom-overlay/doom-component.ts +133 -0
  957. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  958. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  959. package/examples/extensions/doom-overlay/index.ts +74 -0
  960. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  961. package/examples/extensions/dynamic-resources/RULES.md +8 -0
  962. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  963. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  964. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  965. package/examples/extensions/dynamic-resources/index.ts +16 -0
  966. package/examples/extensions/dynamic-tools.ts +74 -0
  967. package/examples/extensions/event-bus.ts +43 -0
  968. package/examples/extensions/file-trigger.ts +41 -0
  969. package/examples/extensions/git-checkpoint.ts +53 -0
  970. package/examples/extensions/git-merge-and-resolve.ts +125 -0
  971. package/examples/extensions/github-issue-autocomplete.ts +191 -0
  972. package/examples/extensions/handoff.ts +191 -0
  973. package/examples/extensions/hello.ts +26 -0
  974. package/examples/extensions/hidden-thinking-label.ts +53 -0
  975. package/examples/extensions/inline-bash.ts +104 -0
  976. package/examples/extensions/input-transform.ts +43 -0
  977. package/examples/extensions/interactive-shell.ts +194 -0
  978. package/examples/extensions/mac-system-theme.ts +47 -0
  979. package/examples/extensions/message-renderer.ts +59 -0
  980. package/examples/extensions/minimal-mode.ts +428 -0
  981. package/examples/extensions/modal-editor.ts +86 -0
  982. package/examples/extensions/model-status.ts +31 -0
  983. package/examples/extensions/notify.ts +55 -0
  984. package/examples/extensions/overlay-qa-tests.ts +1374 -0
  985. package/examples/extensions/overlay-test.ts +171 -0
  986. package/examples/extensions/permission-gate.ts +34 -0
  987. package/examples/extensions/pirate.ts +47 -0
  988. package/examples/extensions/plan-mode/README.md +65 -0
  989. package/examples/extensions/plan-mode/index.ts +346 -0
  990. package/examples/extensions/plan-mode/utils.ts +172 -0
  991. package/examples/extensions/preset.ts +426 -0
  992. package/examples/extensions/prompt-customizer.ts +97 -0
  993. package/examples/extensions/protected-paths.ts +29 -0
  994. package/examples/extensions/provider-payload.ts +18 -0
  995. package/examples/extensions/qna.ts +125 -0
  996. package/examples/extensions/question.ts +294 -0
  997. package/examples/extensions/questionnaire.ts +459 -0
  998. package/examples/extensions/rainbow-editor.ts +88 -0
  999. package/examples/extensions/reload-runtime.ts +37 -0
  1000. package/examples/extensions/rpc-demo.ts +118 -0
  1001. package/examples/extensions/sandbox/index.ts +320 -0
  1002. package/examples/extensions/sandbox/package-lock.json +92 -0
  1003. package/examples/extensions/sandbox/package.json +19 -0
  1004. package/examples/extensions/send-user-message.ts +97 -0
  1005. package/examples/extensions/session-name.ts +27 -0
  1006. package/examples/extensions/shutdown-command.ts +63 -0
  1007. package/examples/extensions/snake.ts +381 -0
  1008. package/examples/extensions/space-invaders.ts +597 -0
  1009. package/examples/extensions/status-line.ts +32 -0
  1010. package/examples/extensions/structured-output.ts +65 -0
  1011. package/examples/extensions/subagent/README.md +175 -0
  1012. package/examples/extensions/subagent/agents/planner.md +37 -0
  1013. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1014. package/examples/extensions/subagent/agents/scout.md +50 -0
  1015. package/examples/extensions/subagent/agents/worker.md +24 -0
  1016. package/examples/extensions/subagent/agents.ts +126 -0
  1017. package/examples/extensions/subagent/index.ts +1083 -0
  1018. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1019. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1020. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1021. package/examples/extensions/summarize.ts +186 -0
  1022. package/examples/extensions/system-prompt-header.ts +17 -0
  1023. package/examples/extensions/tic-tac-toe.ts +1091 -0
  1024. package/examples/extensions/timed-confirm.ts +70 -0
  1025. package/examples/extensions/titlebar-spinner.ts +58 -0
  1026. package/examples/extensions/todo.ts +306 -0
  1027. package/examples/extensions/tool-override.ts +144 -0
  1028. package/examples/extensions/tools.ts +141 -0
  1029. package/examples/extensions/trigger-compact.ts +50 -0
  1030. package/examples/extensions/truncated-tool.ts +200 -0
  1031. package/examples/extensions/widget-placement.ts +9 -0
  1032. package/examples/extensions/with-deps/index.ts +32 -0
  1033. package/examples/extensions/with-deps/package-lock.json +31 -0
  1034. package/examples/extensions/with-deps/package.json +22 -0
  1035. package/examples/extensions/working-indicator.ts +123 -0
  1036. package/examples/extensions/working-message-test.ts +25 -0
  1037. package/examples/remote-session-server/README.md +71 -0
  1038. package/examples/remote-session-server/server.ts +353 -0
  1039. package/examples/rpc-extension-ui.ts +642 -0
  1040. package/examples/sandbox-docker/Dockerfile +274 -0
  1041. package/examples/sandbox-docker/README.md +88 -0
  1042. package/examples/sdk/01-minimal.ts +27 -0
  1043. package/examples/sdk/02-custom-model.ts +54 -0
  1044. package/examples/sdk/03-custom-prompt.ts +76 -0
  1045. package/examples/sdk/04-skills.ts +60 -0
  1046. package/examples/sdk/05-tools.ts +55 -0
  1047. package/examples/sdk/06-extensions.ts +94 -0
  1048. package/examples/sdk/07-context-files.ts +47 -0
  1049. package/examples/sdk/08-prompt-templates.ts +56 -0
  1050. package/examples/sdk/09-api-keys-and-oauth.ts +50 -0
  1051. package/examples/sdk/10-settings.ts +58 -0
  1052. package/examples/sdk/11-sessions.ts +54 -0
  1053. package/examples/sdk/12-full-control.ts +79 -0
  1054. package/examples/sdk/13-session-runtime.ts +49 -0
  1055. package/examples/sdk/README.md +94 -0
  1056. package/npm-shrinkwrap.json +1878 -0
  1057. package/package.json +102 -5
@@ -0,0 +1,49 @@
1
+ /** Path-independent JSONL decoding failure. Storage boundaries attach location and operation context. */
2
+ export class JsonlDecodeError extends Error {
3
+ decodeKind;
4
+ /** Compatibility alias for path-independent codec consumers. */
5
+ kind;
6
+ constructor(decodeKind, message, cause) {
7
+ super(message, cause === undefined ? undefined : { cause });
8
+ this.name = "JsonlDecodeError";
9
+ this.decodeKind = decodeKind;
10
+ this.kind = decodeKind;
11
+ }
12
+ }
13
+ /** Actionable local JSONL error with location, phase, decoding, and write-outcome context. */
14
+ export class JsonlSessionError extends Error {
15
+ code;
16
+ reference;
17
+ path;
18
+ phase;
19
+ line;
20
+ byteOffset;
21
+ decodeKind;
22
+ outcome;
23
+ constructor(options) {
24
+ super(options.message, options.cause === undefined ? undefined : { cause: options.cause });
25
+ this.name = "JsonlSessionError";
26
+ this.code = options.code;
27
+ this.reference = options.reference;
28
+ this.path = options.reference;
29
+ this.phase = options.phase;
30
+ this.line = options.line;
31
+ this.byteOffset = options.byteOffset;
32
+ this.decodeKind = options.decodeKind;
33
+ this.outcome = options.outcome;
34
+ }
35
+ }
36
+ export function createJsonlSessionDecodeError(reference, phase, decodeKind, message, line = 1, byteOffset = 0) {
37
+ const cause = new JsonlDecodeError(decodeKind, message);
38
+ return new JsonlSessionError({
39
+ code: "invalid_jsonl",
40
+ reference,
41
+ phase,
42
+ line,
43
+ byteOffset,
44
+ decodeKind,
45
+ message,
46
+ cause,
47
+ });
48
+ }
49
+ //# sourceMappingURL=jsonl-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-errors.js","sourceRoot":"","sources":["../../../src/core/session/jsonl-errors.ts"],"names":[],"mappings":"AAgBA,yGAAyG;AACzG,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACjC,UAAU,CAAkB;IACrC,gEAAgE;IACvD,IAAI,CAAkB;IAE/B,YAAY,UAA2B,EAAE,OAAe,EAAE,KAAa,EAAE;QACxE,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAAA,CACvB;CACD;AAgBD,8FAA8F;AAC9F,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAClC,IAAI,CAAwB;IAC5B,SAAS,CAAS;IAClB,IAAI,CAAS;IACb,KAAK,CAAkB;IACvB,IAAI,CAAU;IACd,UAAU,CAAU;IACpB,UAAU,CAAmB;IAC7B,OAAO,CAAqB;IAErC,YAAY,OAAiC,EAAE;QAC9C,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAAA,CAC/B;CACD;AAED,MAAM,UAAU,6BAA6B,CAC5C,SAAiB,EACjB,KAAsB,EACtB,UAA2B,EAC3B,OAAe,EACf,IAAI,GAAG,CAAC,EACR,UAAU,GAAG,CAAC,EACM;IACpB,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACxD,OAAO,IAAI,iBAAiB,CAAC;QAC5B,IAAI,EAAE,eAAe;QACrB,SAAS;QACT,KAAK;QACL,IAAI;QACJ,UAAU;QACV,UAAU;QACV,OAAO;QACP,KAAK;KACL,CAAC,CAAC;AAAA,CACH","sourcesContent":["export type JsonlDecodeKind = \"utf8\" | \"syntax\" | \"schema\" | \"state\";\n\nexport type JsonlErrorPhase =\n\t| \"create\"\n\t| \"append\"\n\t| \"fork\"\n\t| \"open\"\n\t| \"repair\"\n\t| \"migrate\"\n\t| \"list\"\n\t| \"import\"\n\t| \"replace\"\n\t| \"sync\";\n\nexport type JsonlWriteOutcome = \"not_written\" | \"unknown\" | \"published\";\n\n/** Path-independent JSONL decoding failure. Storage boundaries attach location and operation context. */\nexport class JsonlDecodeError extends Error {\n\treadonly decodeKind: JsonlDecodeKind;\n\t/** Compatibility alias for path-independent codec consumers. */\n\treadonly kind: JsonlDecodeKind;\n\n\tconstructor(decodeKind: JsonlDecodeKind, message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"JsonlDecodeError\";\n\t\tthis.decodeKind = decodeKind;\n\t\tthis.kind = decodeKind;\n\t}\n}\n\nexport type JsonlSessionErrorCode = \"invalid_jsonl\" | \"storage\" | \"fenced\";\n\nexport interface JsonlSessionErrorOptions {\n\tcode: JsonlSessionErrorCode;\n\treference: string;\n\tphase: JsonlErrorPhase;\n\tmessage: string;\n\tline?: number;\n\tbyteOffset?: number;\n\tdecodeKind?: JsonlDecodeKind;\n\toutcome?: JsonlWriteOutcome;\n\tcause?: Error;\n}\n\n/** Actionable local JSONL error with location, phase, decoding, and write-outcome context. */\nexport class JsonlSessionError extends Error {\n\treadonly code: JsonlSessionErrorCode;\n\treadonly reference: string;\n\treadonly path: string;\n\treadonly phase: JsonlErrorPhase;\n\treadonly line?: number;\n\treadonly byteOffset?: number;\n\treadonly decodeKind?: JsonlDecodeKind;\n\treadonly outcome?: JsonlWriteOutcome;\n\n\tconstructor(options: JsonlSessionErrorOptions) {\n\t\tsuper(options.message, options.cause === undefined ? undefined : { cause: options.cause });\n\t\tthis.name = \"JsonlSessionError\";\n\t\tthis.code = options.code;\n\t\tthis.reference = options.reference;\n\t\tthis.path = options.reference;\n\t\tthis.phase = options.phase;\n\t\tthis.line = options.line;\n\t\tthis.byteOffset = options.byteOffset;\n\t\tthis.decodeKind = options.decodeKind;\n\t\tthis.outcome = options.outcome;\n\t}\n}\n\nexport function createJsonlSessionDecodeError(\n\treference: string,\n\tphase: JsonlErrorPhase,\n\tdecodeKind: JsonlDecodeKind,\n\tmessage: string,\n\tline = 1,\n\tbyteOffset = 0,\n): JsonlSessionError {\n\tconst cause = new JsonlDecodeError(decodeKind, message);\n\treturn new JsonlSessionError({\n\t\tcode: \"invalid_jsonl\",\n\t\treference,\n\t\tphase,\n\t\tline,\n\t\tbyteOffset,\n\t\tdecodeKind,\n\t\tmessage,\n\t\tcause,\n\t});\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { JsonlSessionStore } from "./stores/jsonl-session-store.ts";
2
+ import type { FileEntry } from "./types.ts";
3
+ export declare const jsonlSessionStore: JsonlSessionStore;
4
+ /**
5
+ * Compute the default session directory for a cwd.
6
+ * Encodes cwd into a safe directory name under ~/.grip/agent/sessions/.
7
+ */
8
+ export declare function getDefaultSessionDir(cwd: string, agentDir?: string): string;
9
+ type JsonlSessionEntryLoadPhase = "fork" | "open" | "import" | "migrate";
10
+ interface LoadSessionEntriesOptions {
11
+ repair?: boolean;
12
+ phase?: JsonlSessionEntryLoadPhase;
13
+ }
14
+ /** Exported for testing. */
15
+ export declare function loadEntriesFromFile(filePath: string, options?: LoadSessionEntriesOptions): FileEntry[];
16
+ export declare function getDefaultSessionDirPath(cwd: string, agentDir?: string): string;
17
+ /** Exported for testing. */
18
+ export declare function findMostRecentSession(sessionDir: string, cwd?: string): string | null;
19
+ export {};
20
+ //# sourceMappingURL=jsonl-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-helpers.d.ts","sourceRoot":"","sources":["../../../src/core/session/jsonl-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,iBAAiB,EAEjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,iBAAiB,mBAA0B,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,KAAK,0BAA0B,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzE,UAAU,yBAAyB;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,0BAA0B,CAAC;CACnC;AAED,4BAA4B;AAC5B,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,yBAA8B,GAAG,SAAS,EAAE,CAE1G;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,4BAA4B;AAC5B,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAErF","sourcesContent":["import {\n\tfindMostRecent,\n\tgetDefaultSessionDir as getDefaultJsonlSessionDir,\n\tgetDefaultSessionDirPath as getDefaultJsonlSessionDirPath,\n\tJsonlSessionStore,\n\tload,\n} from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry } from \"./types.ts\";\n\nexport const jsonlSessionStore = new JsonlSessionStore();\n\n/**\n * Compute the default session directory for a cwd.\n * Encodes cwd into a safe directory name under ~/.grip/agent/sessions/.\n */\nexport function getDefaultSessionDir(cwd: string, agentDir?: string): string {\n\treturn getDefaultJsonlSessionDir(cwd, agentDir);\n}\n\ntype JsonlSessionEntryLoadPhase = \"fork\" | \"open\" | \"import\" | \"migrate\";\n\ninterface LoadSessionEntriesOptions {\n\trepair?: boolean;\n\tphase?: JsonlSessionEntryLoadPhase;\n}\n\n/** Exported for testing. */\nexport function loadEntriesFromFile(filePath: string, options: LoadSessionEntriesOptions = {}): FileEntry[] {\n\treturn load(filePath, {}, options.repair ?? true, options.phase ?? \"open\");\n}\n\nexport function getDefaultSessionDirPath(cwd: string, agentDir?: string): string {\n\treturn getDefaultJsonlSessionDirPath(cwd, agentDir);\n}\n\n/** Exported for testing. */\nexport function findMostRecentSession(sessionDir: string, cwd?: string): string | null {\n\treturn findMostRecent(sessionDir, cwd);\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { findMostRecent, getDefaultSessionDir as getDefaultJsonlSessionDir, getDefaultSessionDirPath as getDefaultJsonlSessionDirPath, JsonlSessionStore, load, } from "./stores/jsonl-session-store.js";
2
+ export const jsonlSessionStore = new JsonlSessionStore();
3
+ /**
4
+ * Compute the default session directory for a cwd.
5
+ * Encodes cwd into a safe directory name under ~/.grip/agent/sessions/.
6
+ */
7
+ export function getDefaultSessionDir(cwd, agentDir) {
8
+ return getDefaultJsonlSessionDir(cwd, agentDir);
9
+ }
10
+ /** Exported for testing. */
11
+ export function loadEntriesFromFile(filePath, options = {}) {
12
+ return load(filePath, {}, options.repair ?? true, options.phase ?? "open");
13
+ }
14
+ export function getDefaultSessionDirPath(cwd, agentDir) {
15
+ return getDefaultJsonlSessionDirPath(cwd, agentDir);
16
+ }
17
+ /** Exported for testing. */
18
+ export function findMostRecentSession(sessionDir, cwd) {
19
+ return findMostRecent(sessionDir, cwd);
20
+ }
21
+ //# sourceMappingURL=jsonl-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-helpers.js","sourceRoot":"","sources":["../../../src/core/session/jsonl-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,cAAc,EACd,oBAAoB,IAAI,yBAAyB,EACjD,wBAAwB,IAAI,6BAA6B,EACzD,iBAAiB,EACjB,IAAI,GACJ,MAAM,iCAAiC,CAAC;AAGzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAEzD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAiB,EAAU;IAC5E,OAAO,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,CAChD;AASD,4BAA4B;AAC5B,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAO,GAA8B,EAAE,EAAe;IAC3G,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;AAAA,CAC3E;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAW,EAAE,QAAiB,EAAU;IAChF,OAAO,6BAA6B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,CACpD;AAED,4BAA4B;AAC5B,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAE,GAAY,EAAiB;IACtF,OAAO,cAAc,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAAA,CACvC","sourcesContent":["import {\n\tfindMostRecent,\n\tgetDefaultSessionDir as getDefaultJsonlSessionDir,\n\tgetDefaultSessionDirPath as getDefaultJsonlSessionDirPath,\n\tJsonlSessionStore,\n\tload,\n} from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry } from \"./types.ts\";\n\nexport const jsonlSessionStore = new JsonlSessionStore();\n\n/**\n * Compute the default session directory for a cwd.\n * Encodes cwd into a safe directory name under ~/.grip/agent/sessions/.\n */\nexport function getDefaultSessionDir(cwd: string, agentDir?: string): string {\n\treturn getDefaultJsonlSessionDir(cwd, agentDir);\n}\n\ntype JsonlSessionEntryLoadPhase = \"fork\" | \"open\" | \"import\" | \"migrate\";\n\ninterface LoadSessionEntriesOptions {\n\trepair?: boolean;\n\tphase?: JsonlSessionEntryLoadPhase;\n}\n\n/** Exported for testing. */\nexport function loadEntriesFromFile(filePath: string, options: LoadSessionEntriesOptions = {}): FileEntry[] {\n\treturn load(filePath, {}, options.repair ?? true, options.phase ?? \"open\");\n}\n\nexport function getDefaultSessionDirPath(cwd: string, agentDir?: string): string {\n\treturn getDefaultJsonlSessionDirPath(cwd, agentDir);\n}\n\n/** Exported for testing. */\nexport function findMostRecentSession(sessionDir: string, cwd?: string): string | null {\n\treturn findMostRecent(sessionDir, cwd);\n}\n"]}
@@ -0,0 +1,30 @@
1
+ import { LocalSession } from "./local-session.ts";
2
+ import type { Session } from "./session.ts";
3
+ import type { OpenSessionOptions, SessionManager } from "./session-manager.ts";
4
+ import type { NewSessionOptions, SessionInfo, SessionListProgress } from "./types.ts";
5
+ export interface LocalSessionManagerOptions {
6
+ cwd: string;
7
+ sessionDir?: string;
8
+ }
9
+ export declare class LocalSessionManager implements SessionManager {
10
+ private readonly cwd;
11
+ private readonly sessionDir?;
12
+ private readonly activePublicationDestinations;
13
+ private readonly firstPublicationCoordinator;
14
+ constructor(options: LocalSessionManagerOptions);
15
+ create(options?: NewSessionOptions): LocalSession;
16
+ openReference(reference: string, options?: OpenSessionOptions): LocalSession;
17
+ continueRecent(): LocalSession;
18
+ usesDefaultSessionDir(): boolean;
19
+ forkFrom(reference: string): LocalSession;
20
+ private publishFirstSnapshot;
21
+ private claimFirstPublication;
22
+ private rejectConflictingPublicationCandidate;
23
+ private rejectExistingSession;
24
+ private canonicalCwd;
25
+ forkSession(source: Session, targetLeafId: string | null): LocalSession;
26
+ importJsonl(inputPath: string, options?: OpenSessionOptions): LocalSession;
27
+ list(onProgress?: SessionListProgress): Promise<SessionInfo[]>;
28
+ listAll(onProgress?: SessionListProgress): Promise<SessionInfo[]>;
29
+ }
30
+ //# sourceMappingURL=local-session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-session-manager.d.ts","sourceRoot":"","sources":["../../../src/core/session/local-session-manager.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAiB/E,OAAO,KAAK,EAAa,iBAAiB,EAAiB,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEhH,MAAM,WAAW,0BAA0B;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,qBAAa,mBAAoB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAqB;IACnE,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAG1C;IAEF,YAAY,OAAO,EAAE,0BAA0B,EAG9C;IAED,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,YAAY,CAOhD;IAED,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAmB3E;IAED,cAAc,IAAI,YAAY,CAQ7B;IAED,qBAAqB,IAAI,OAAO,CAE/B;IAED,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAqCxC;IAED,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,qCAAqC;IA0B7C,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,YAAY;IAOpB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,YAAY,CAYtE;IAED,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAiCzE;IAEK,IAAI,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CASnE;IAEK,OAAO,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAMtE;CACD","sourcesContent":["import { existsSync, lstatSync, readdirSync } from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { CURRENT_SESSION_VERSION } from \"./constants.ts\";\nimport { createSessionId } from \"./ids.ts\";\nimport { createJsonlSessionDecodeError } from \"./jsonl-errors.ts\";\nimport {\n\tfindMostRecentSession,\n\tgetDefaultSessionDir,\n\tgetDefaultSessionDirPath,\n\tloadEntriesFromFile,\n} from \"./jsonl-helpers.ts\";\nimport { LocalSession } from \"./local-session.ts\";\nimport { migrateToCurrentVersion } from \"./migrations.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport {\n\tensureDir,\n\tforkSession as forkJsonlSession,\n\tgetJsonlEntryLocations,\n\tgetSessionDirForReference,\n\tgetSessionsRoot,\n\ttype JsonlFirstPublicationCoordinator,\n\tlistAll as listAllJsonlSessions,\n\tlist as listJsonlSessions,\n\tprepareSessionReference,\n\tpublishJsonlAtomically,\n\treadSessionHeader,\n\tSessionAlreadyExistsError,\n\tSessionHeaderScanLimitError,\n\tvalidateCurrentSessionEntries,\n} from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry, NewSessionOptions, SessionHeader, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport interface LocalSessionManagerOptions {\n\tcwd: string;\n\tsessionDir?: string;\n}\n\ntype SessionPublicationPhase = \"create\" | \"fork\" | \"import\";\n\ninterface SessionPublicationClaimOptions {\n\tallowExistingEmptyFile: boolean;\n\tphase: SessionPublicationPhase;\n}\n\nexport class LocalSessionManager implements SessionManager {\n\tprivate readonly cwd: string;\n\tprivate readonly sessionDir?: string;\n\tprivate readonly activePublicationDestinations = new Set<string>();\n\tprivate readonly firstPublicationCoordinator: JsonlFirstPublicationCoordinator = {\n\t\tpublish: (filePath, entries, operation, options) =>\n\t\t\tthis.publishFirstSnapshot(filePath, entries, operation, options),\n\t};\n\n\tconstructor(options: LocalSessionManagerOptions) {\n\t\tthis.cwd = options.cwd;\n\t\tthis.sessionDir = options.sessionDir;\n\t}\n\n\tcreate(options?: NewSessionOptions): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst session = new LocalSession(this.cwd, dir, undefined, this, undefined, this.firstPublicationCoordinator);\n\t\tif (options?.id || options?.parentSession) {\n\t\t\tsession.newSession(options);\n\t\t}\n\t\treturn session;\n\t}\n\n\topenReference(reference: string, options?: OpenSessionOptions): LocalSession {\n\t\tlet header: SessionHeader | null = null;\n\t\tlet preloadedFileEntries: FileEntry[] | undefined;\n\t\tif (options?.cwdOverride === undefined && existsSync(reference)) {\n\t\t\ttry {\n\t\t\t\theader = readSessionHeader(reference);\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof SessionHeaderScanLimitError)) throw error;\n\t\t\t\t// The bounded scan is only a discovery optimization. A full load remains\n\t\t\t\t// authoritative for legacy files with very large headers or prefixes.\n\t\t\t\tpreloadedFileEntries = loadEntriesFromFile(reference);\n\t\t\t\tconst firstEntry = preloadedFileEntries[0];\n\t\t\t\theader = firstEntry?.type === \"session\" ? firstEntry : null;\n\t\t\t}\n\t\t}\n\t\tconst storedCwd = typeof header?.cwd === \"string\" ? header.cwd : undefined;\n\t\tconst cwd = options?.cwdOverride ?? storedCwd ?? this.cwd;\n\t\tconst dir = this.sessionDir ?? getSessionDirForReference(reference);\n\t\treturn new LocalSession(cwd, dir, reference, this, preloadedFileEntries, this.firstPublicationCoordinator);\n\t}\n\n\tcontinueRecent(): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst filterCwd = this.sessionDir !== undefined && dir !== getDefaultSessionDirPath(this.cwd);\n\t\tconst mostRecent = findMostRecentSession(dir, filterCwd ? this.cwd : undefined);\n\t\tif (mostRecent) {\n\t\t\treturn new LocalSession(this.cwd, dir, mostRecent, this, undefined, this.firstPublicationCoordinator);\n\t\t}\n\t\treturn new LocalSession(this.cwd, dir, undefined, this, undefined, this.firstPublicationCoordinator);\n\t}\n\n\tusesDefaultSessionDir(): boolean {\n\t\treturn (this.sessionDir ?? getDefaultSessionDir(this.cwd)) === getDefaultSessionDirPath(this.cwd);\n\t}\n\n\tforkFrom(reference: string): LocalSession {\n\t\tconst sourceEntries = loadEntriesFromFile(reference, { repair: false, phase: \"fork\" });\n\t\tif (sourceEntries.length === 0) {\n\t\t\tthrow createJsonlSessionDecodeError(reference, \"fork\", \"schema\", `Cannot fork empty session: ${reference}`);\n\t\t}\n\t\tmigrateToCurrentVersion(sourceEntries);\n\t\tvalidateCurrentSessionEntries(sourceEntries, reference, {\n\t\t\tphase: \"fork\",\n\t\t\tlocations: getJsonlEntryLocations(sourceEntries),\n\t\t});\n\t\tconst sourceHeader = sourceEntries[0];\n\t\tif (sourceHeader?.type !== \"session\") {\n\t\t\tthrow new Error(`Cannot fork: source session has no header: ${reference}`);\n\t\t}\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tensureDir(dir);\n\n\t\tconst newSessionId = createSessionId();\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst newHeader: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: newSessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: reference,\n\t\t};\n\t\tconst expectedReference = prepareSessionReference(dir, newHeader.id, newHeader.timestamp);\n\t\tconst newSessionReference = this.claimFirstPublication(\n\t\t\texpectedReference,\n\t\t\t[newHeader, ...sourceEntries],\n\t\t\t() => forkJsonlSession(dir, newHeader, sourceEntries),\n\t\t\t{ allowExistingEmptyFile: false, phase: \"fork\" },\n\t\t);\n\n\t\treturn new LocalSession(this.cwd, dir, newSessionReference, this, undefined, this.firstPublicationCoordinator);\n\t}\n\n\tprivate publishFirstSnapshot(\n\t\tfilePath: string,\n\t\tentries: FileEntry[],\n\t\toperation: () => void,\n\t\toptions: SessionPublicationClaimOptions,\n\t): void {\n\t\tthis.claimFirstPublication(filePath, entries, operation, options);\n\t}\n\n\tprivate claimFirstPublication<T>(\n\t\tfilePath: string,\n\t\tentries: FileEntry[],\n\t\toperation: () => T,\n\t\toptions: SessionPublicationClaimOptions = {\n\t\t\tallowExistingEmptyFile: false,\n\t\t\tphase: \"create\",\n\t\t},\n\t): T {\n\t\tconst header = entries.find((entry): entry is SessionHeader => entry.type === \"session\");\n\t\tif (!header) throw new Error(`Cannot publish session without a header: ${filePath}`);\n\t\tconst key = `${this.canonicalCwd(header.cwd)}\\0${header.id}`;\n\t\tif (this.activePublicationDestinations.has(key)) {\n\t\t\tthrow new SessionAlreadyExistsError(filePath, header.id, options.phase);\n\t\t}\n\t\tthis.activePublicationDestinations.add(key);\n\t\ttry {\n\t\t\tthis.rejectExistingSession(filePath, header, options);\n\t\t\treturn operation();\n\t\t} finally {\n\t\t\tthis.activePublicationDestinations.delete(key);\n\t\t}\n\t}\n\n\tprivate rejectConflictingPublicationCandidate(\n\t\tcandidate: string,\n\t\tresolvedTarget: string,\n\t\theader: SessionHeader,\n\t\toptions: SessionPublicationClaimOptions,\n\t): void {\n\t\tif (candidate === resolvedTarget) {\n\t\t\tif (options.allowExistingEmptyFile && lstatSync(candidate).isFile() && lstatSync(candidate).size === 0) return;\n\t\t\tthrow new SessionAlreadyExistsError(candidate, header.id, options.phase);\n\t\t}\n\t\ttry {\n\t\t\tconst existing = readSessionHeader(candidate);\n\t\t\tif (\n\t\t\t\texisting?.id === header.id &&\n\t\t\t\ttypeof existing.cwd === \"string\" &&\n\t\t\t\tthis.canonicalCwd(existing.cwd) === this.canonicalCwd(header.cwd)\n\t\t\t) {\n\t\t\t\tthrow new SessionAlreadyExistsError(candidate, header.id, options.phase);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof SessionAlreadyExistsError) throw error;\n\t\t\tif (error instanceof SessionHeaderScanLimitError) return;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate rejectExistingSession(\n\t\tfilePath: string,\n\t\theader: SessionHeader,\n\t\toptions: SessionPublicationClaimOptions,\n\t): void {\n\t\tconst resolvedTarget = resolve(filePath);\n\t\tfor (const name of readdirSync(dirname(resolvedTarget))) {\n\t\t\tif (!name.endsWith(\".jsonl\")) continue;\n\t\t\tconst candidate = resolve(dirname(resolvedTarget), name);\n\t\t\tthis.rejectConflictingPublicationCandidate(candidate, resolvedTarget, header, options);\n\t\t}\n\t}\n\n\tprivate canonicalCwd(cwd: string): string {\n\t\tconst canonical = resolve(cwd);\n\t\treturn process.platform === \"win32\"\n\t\t\t? canonical.replace(/^([A-Z]):/, (_, drive: string) => `${drive.toLowerCase()}:`)\n\t\t\t: canonical;\n\t}\n\n\tforkSession(source: Session, targetLeafId: string | null): LocalSession {\n\t\tconst parentSession = source.getSessionReference();\n\t\tif (!targetLeafId) {\n\t\t\tconst session = this.create();\n\t\t\tsession.newSession({ parentSession });\n\t\t\treturn session;\n\t\t}\n\n\t\tconst branchSource = parentSession && existsSync(parentSession) ? this.openReference(parentSession) : source;\n\t\tconst target = this.create({ parentSession });\n\t\ttarget.copyBranchFrom(branchSource, targetLeafId, parentSession);\n\t\treturn target;\n\t}\n\n\timportJsonl(inputPath: string, options?: OpenSessionOptions): LocalSession {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) throw new Error(`File not found: ${resolvedPath}`);\n\n\t\tconst entries = loadEntriesFromFile(resolvedPath, { repair: false, phase: \"import\" });\n\t\tif (entries.length === 0) {\n\t\t\tthrow createJsonlSessionDecodeError(\n\t\t\t\tresolvedPath,\n\t\t\t\t\"import\",\n\t\t\t\t\"schema\",\n\t\t\t\t`Cannot import empty session JSONL: ${resolvedPath}`,\n\t\t\t);\n\t\t}\n\t\tmigrateToCurrentVersion(entries);\n\t\tvalidateCurrentSessionEntries(entries, resolvedPath, {\n\t\t\tphase: \"import\",\n\t\t\tlocations: getJsonlEntryLocations(entries),\n\t\t});\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tensureDir(dir);\n\t\tconst destinationPath = join(dir, basename(resolvedPath));\n\t\tif (resolve(destinationPath) === resolvedPath) return this.openReference(resolvedPath, options);\n\n\t\tconst header = entries[0];\n\t\tif (header?.type !== \"session\") throw new Error(`Cannot import session without a header: ${resolvedPath}`);\n\t\tthis.claimFirstPublication(\n\t\t\tdestinationPath,\n\t\t\tentries,\n\t\t\t() => publishJsonlAtomically(destinationPath, entries, { phase: \"import\" }),\n\t\t\t{ allowExistingEmptyFile: false, phase: \"import\" },\n\t\t);\n\t\treturn this.openReference(destinationPath, options);\n\t}\n\n\tasync list(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst filterCwd = this.sessionDir !== undefined && dir !== getDefaultSessionDirPath(this.cwd);\n\t\tconst resolvedCwd = resolve(this.cwd);\n\t\tconst sessions = (await listJsonlSessions(dir, onProgress)).filter(\n\t\t\t(session) => !filterCwd || (session.cwd !== undefined && resolve(session.cwd) === resolvedCwd),\n\t\t);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n\n\tasync listAll(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst sessions = this.sessionDir\n\t\t\t? await listJsonlSessions(this.sessionDir, onProgress)\n\t\t\t: await listAllJsonlSessions(getSessionsRoot(), onProgress);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n}\n"]}
@@ -0,0 +1,205 @@
1
+ import { existsSync, lstatSync, readdirSync } from "node:fs";
2
+ import { basename, dirname, join, resolve } from "node:path";
3
+ import { CURRENT_SESSION_VERSION } from "./constants.js";
4
+ import { createSessionId } from "./ids.js";
5
+ import { createJsonlSessionDecodeError } from "./jsonl-errors.js";
6
+ import { findMostRecentSession, getDefaultSessionDir, getDefaultSessionDirPath, loadEntriesFromFile, } from "./jsonl-helpers.js";
7
+ import { LocalSession } from "./local-session.js";
8
+ import { migrateToCurrentVersion } from "./migrations.js";
9
+ import { ensureDir, forkSession as forkJsonlSession, getJsonlEntryLocations, getSessionDirForReference, getSessionsRoot, listAll as listAllJsonlSessions, list as listJsonlSessions, prepareSessionReference, publishJsonlAtomically, readSessionHeader, SessionAlreadyExistsError, SessionHeaderScanLimitError, validateCurrentSessionEntries, } from "./stores/jsonl-session-store.js";
10
+ export class LocalSessionManager {
11
+ cwd;
12
+ sessionDir;
13
+ activePublicationDestinations = new Set();
14
+ firstPublicationCoordinator = {
15
+ publish: (filePath, entries, operation, options) => this.publishFirstSnapshot(filePath, entries, operation, options),
16
+ };
17
+ constructor(options) {
18
+ this.cwd = options.cwd;
19
+ this.sessionDir = options.sessionDir;
20
+ }
21
+ create(options) {
22
+ const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
23
+ const session = new LocalSession(this.cwd, dir, undefined, this, undefined, this.firstPublicationCoordinator);
24
+ if (options?.id || options?.parentSession) {
25
+ session.newSession(options);
26
+ }
27
+ return session;
28
+ }
29
+ openReference(reference, options) {
30
+ let header = null;
31
+ let preloadedFileEntries;
32
+ if (options?.cwdOverride === undefined && existsSync(reference)) {
33
+ try {
34
+ header = readSessionHeader(reference);
35
+ }
36
+ catch (error) {
37
+ if (!(error instanceof SessionHeaderScanLimitError))
38
+ throw error;
39
+ // The bounded scan is only a discovery optimization. A full load remains
40
+ // authoritative for legacy files with very large headers or prefixes.
41
+ preloadedFileEntries = loadEntriesFromFile(reference);
42
+ const firstEntry = preloadedFileEntries[0];
43
+ header = firstEntry?.type === "session" ? firstEntry : null;
44
+ }
45
+ }
46
+ const storedCwd = typeof header?.cwd === "string" ? header.cwd : undefined;
47
+ const cwd = options?.cwdOverride ?? storedCwd ?? this.cwd;
48
+ const dir = this.sessionDir ?? getSessionDirForReference(reference);
49
+ return new LocalSession(cwd, dir, reference, this, preloadedFileEntries, this.firstPublicationCoordinator);
50
+ }
51
+ continueRecent() {
52
+ const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
53
+ const filterCwd = this.sessionDir !== undefined && dir !== getDefaultSessionDirPath(this.cwd);
54
+ const mostRecent = findMostRecentSession(dir, filterCwd ? this.cwd : undefined);
55
+ if (mostRecent) {
56
+ return new LocalSession(this.cwd, dir, mostRecent, this, undefined, this.firstPublicationCoordinator);
57
+ }
58
+ return new LocalSession(this.cwd, dir, undefined, this, undefined, this.firstPublicationCoordinator);
59
+ }
60
+ usesDefaultSessionDir() {
61
+ return (this.sessionDir ?? getDefaultSessionDir(this.cwd)) === getDefaultSessionDirPath(this.cwd);
62
+ }
63
+ forkFrom(reference) {
64
+ const sourceEntries = loadEntriesFromFile(reference, { repair: false, phase: "fork" });
65
+ if (sourceEntries.length === 0) {
66
+ throw createJsonlSessionDecodeError(reference, "fork", "schema", `Cannot fork empty session: ${reference}`);
67
+ }
68
+ migrateToCurrentVersion(sourceEntries);
69
+ validateCurrentSessionEntries(sourceEntries, reference, {
70
+ phase: "fork",
71
+ locations: getJsonlEntryLocations(sourceEntries),
72
+ });
73
+ const sourceHeader = sourceEntries[0];
74
+ if (sourceHeader?.type !== "session") {
75
+ throw new Error(`Cannot fork: source session has no header: ${reference}`);
76
+ }
77
+ const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
78
+ ensureDir(dir);
79
+ const newSessionId = createSessionId();
80
+ const timestamp = new Date().toISOString();
81
+ const newHeader = {
82
+ type: "session",
83
+ version: CURRENT_SESSION_VERSION,
84
+ id: newSessionId,
85
+ timestamp,
86
+ cwd: this.cwd,
87
+ parentSession: reference,
88
+ };
89
+ const expectedReference = prepareSessionReference(dir, newHeader.id, newHeader.timestamp);
90
+ const newSessionReference = this.claimFirstPublication(expectedReference, [newHeader, ...sourceEntries], () => forkJsonlSession(dir, newHeader, sourceEntries), { allowExistingEmptyFile: false, phase: "fork" });
91
+ return new LocalSession(this.cwd, dir, newSessionReference, this, undefined, this.firstPublicationCoordinator);
92
+ }
93
+ publishFirstSnapshot(filePath, entries, operation, options) {
94
+ this.claimFirstPublication(filePath, entries, operation, options);
95
+ }
96
+ claimFirstPublication(filePath, entries, operation, options = {
97
+ allowExistingEmptyFile: false,
98
+ phase: "create",
99
+ }) {
100
+ const header = entries.find((entry) => entry.type === "session");
101
+ if (!header)
102
+ throw new Error(`Cannot publish session without a header: ${filePath}`);
103
+ const key = `${this.canonicalCwd(header.cwd)}\0${header.id}`;
104
+ if (this.activePublicationDestinations.has(key)) {
105
+ throw new SessionAlreadyExistsError(filePath, header.id, options.phase);
106
+ }
107
+ this.activePublicationDestinations.add(key);
108
+ try {
109
+ this.rejectExistingSession(filePath, header, options);
110
+ return operation();
111
+ }
112
+ finally {
113
+ this.activePublicationDestinations.delete(key);
114
+ }
115
+ }
116
+ rejectConflictingPublicationCandidate(candidate, resolvedTarget, header, options) {
117
+ if (candidate === resolvedTarget) {
118
+ if (options.allowExistingEmptyFile && lstatSync(candidate).isFile() && lstatSync(candidate).size === 0)
119
+ return;
120
+ throw new SessionAlreadyExistsError(candidate, header.id, options.phase);
121
+ }
122
+ try {
123
+ const existing = readSessionHeader(candidate);
124
+ if (existing?.id === header.id &&
125
+ typeof existing.cwd === "string" &&
126
+ this.canonicalCwd(existing.cwd) === this.canonicalCwd(header.cwd)) {
127
+ throw new SessionAlreadyExistsError(candidate, header.id, options.phase);
128
+ }
129
+ }
130
+ catch (error) {
131
+ if (error instanceof SessionAlreadyExistsError)
132
+ throw error;
133
+ if (error instanceof SessionHeaderScanLimitError)
134
+ return;
135
+ throw error;
136
+ }
137
+ }
138
+ rejectExistingSession(filePath, header, options) {
139
+ const resolvedTarget = resolve(filePath);
140
+ for (const name of readdirSync(dirname(resolvedTarget))) {
141
+ if (!name.endsWith(".jsonl"))
142
+ continue;
143
+ const candidate = resolve(dirname(resolvedTarget), name);
144
+ this.rejectConflictingPublicationCandidate(candidate, resolvedTarget, header, options);
145
+ }
146
+ }
147
+ canonicalCwd(cwd) {
148
+ const canonical = resolve(cwd);
149
+ return process.platform === "win32"
150
+ ? canonical.replace(/^([A-Z]):/, (_, drive) => `${drive.toLowerCase()}:`)
151
+ : canonical;
152
+ }
153
+ forkSession(source, targetLeafId) {
154
+ const parentSession = source.getSessionReference();
155
+ if (!targetLeafId) {
156
+ const session = this.create();
157
+ session.newSession({ parentSession });
158
+ return session;
159
+ }
160
+ const branchSource = parentSession && existsSync(parentSession) ? this.openReference(parentSession) : source;
161
+ const target = this.create({ parentSession });
162
+ target.copyBranchFrom(branchSource, targetLeafId, parentSession);
163
+ return target;
164
+ }
165
+ importJsonl(inputPath, options) {
166
+ const resolvedPath = resolve(inputPath);
167
+ if (!existsSync(resolvedPath))
168
+ throw new Error(`File not found: ${resolvedPath}`);
169
+ const entries = loadEntriesFromFile(resolvedPath, { repair: false, phase: "import" });
170
+ if (entries.length === 0) {
171
+ throw createJsonlSessionDecodeError(resolvedPath, "import", "schema", `Cannot import empty session JSONL: ${resolvedPath}`);
172
+ }
173
+ migrateToCurrentVersion(entries);
174
+ validateCurrentSessionEntries(entries, resolvedPath, {
175
+ phase: "import",
176
+ locations: getJsonlEntryLocations(entries),
177
+ });
178
+ const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
179
+ ensureDir(dir);
180
+ const destinationPath = join(dir, basename(resolvedPath));
181
+ if (resolve(destinationPath) === resolvedPath)
182
+ return this.openReference(resolvedPath, options);
183
+ const header = entries[0];
184
+ if (header?.type !== "session")
185
+ throw new Error(`Cannot import session without a header: ${resolvedPath}`);
186
+ this.claimFirstPublication(destinationPath, entries, () => publishJsonlAtomically(destinationPath, entries, { phase: "import" }), { allowExistingEmptyFile: false, phase: "import" });
187
+ return this.openReference(destinationPath, options);
188
+ }
189
+ async list(onProgress) {
190
+ const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
191
+ const filterCwd = this.sessionDir !== undefined && dir !== getDefaultSessionDirPath(this.cwd);
192
+ const resolvedCwd = resolve(this.cwd);
193
+ const sessions = (await listJsonlSessions(dir, onProgress)).filter((session) => !filterCwd || (session.cwd !== undefined && resolve(session.cwd) === resolvedCwd));
194
+ sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
195
+ return sessions;
196
+ }
197
+ async listAll(onProgress) {
198
+ const sessions = this.sessionDir
199
+ ? await listJsonlSessions(this.sessionDir, onProgress)
200
+ : await listAllJsonlSessions(getSessionsRoot(), onProgress);
201
+ sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
202
+ return sessions;
203
+ }
204
+ }
205
+ //# sourceMappingURL=local-session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-session-manager.js","sourceRoot":"","sources":["../../../src/core/session/local-session-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, lstatSync, readdirSync } from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { CURRENT_SESSION_VERSION } from \"./constants.ts\";\nimport { createSessionId } from \"./ids.ts\";\nimport { createJsonlSessionDecodeError } from \"./jsonl-errors.ts\";\nimport {\n\tfindMostRecentSession,\n\tgetDefaultSessionDir,\n\tgetDefaultSessionDirPath,\n\tloadEntriesFromFile,\n} from \"./jsonl-helpers.ts\";\nimport { LocalSession } from \"./local-session.ts\";\nimport { migrateToCurrentVersion } from \"./migrations.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport {\n\tensureDir,\n\tforkSession as forkJsonlSession,\n\tgetJsonlEntryLocations,\n\tgetSessionDirForReference,\n\tgetSessionsRoot,\n\ttype JsonlFirstPublicationCoordinator,\n\tlistAll as listAllJsonlSessions,\n\tlist as listJsonlSessions,\n\tprepareSessionReference,\n\tpublishJsonlAtomically,\n\treadSessionHeader,\n\tSessionAlreadyExistsError,\n\tSessionHeaderScanLimitError,\n\tvalidateCurrentSessionEntries,\n} from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry, NewSessionOptions, SessionHeader, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport interface LocalSessionManagerOptions {\n\tcwd: string;\n\tsessionDir?: string;\n}\n\ntype SessionPublicationPhase = \"create\" | \"fork\" | \"import\";\n\ninterface SessionPublicationClaimOptions {\n\tallowExistingEmptyFile: boolean;\n\tphase: SessionPublicationPhase;\n}\n\nexport class LocalSessionManager implements SessionManager {\n\tprivate readonly cwd: string;\n\tprivate readonly sessionDir?: string;\n\tprivate readonly activePublicationDestinations = new Set<string>();\n\tprivate readonly firstPublicationCoordinator: JsonlFirstPublicationCoordinator = {\n\t\tpublish: (filePath, entries, operation, options) =>\n\t\t\tthis.publishFirstSnapshot(filePath, entries, operation, options),\n\t};\n\n\tconstructor(options: LocalSessionManagerOptions) {\n\t\tthis.cwd = options.cwd;\n\t\tthis.sessionDir = options.sessionDir;\n\t}\n\n\tcreate(options?: NewSessionOptions): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst session = new LocalSession(this.cwd, dir, undefined, this, undefined, this.firstPublicationCoordinator);\n\t\tif (options?.id || options?.parentSession) {\n\t\t\tsession.newSession(options);\n\t\t}\n\t\treturn session;\n\t}\n\n\topenReference(reference: string, options?: OpenSessionOptions): LocalSession {\n\t\tlet header: SessionHeader | null = null;\n\t\tlet preloadedFileEntries: FileEntry[] | undefined;\n\t\tif (options?.cwdOverride === undefined && existsSync(reference)) {\n\t\t\ttry {\n\t\t\t\theader = readSessionHeader(reference);\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof SessionHeaderScanLimitError)) throw error;\n\t\t\t\t// The bounded scan is only a discovery optimization. A full load remains\n\t\t\t\t// authoritative for legacy files with very large headers or prefixes.\n\t\t\t\tpreloadedFileEntries = loadEntriesFromFile(reference);\n\t\t\t\tconst firstEntry = preloadedFileEntries[0];\n\t\t\t\theader = firstEntry?.type === \"session\" ? firstEntry : null;\n\t\t\t}\n\t\t}\n\t\tconst storedCwd = typeof header?.cwd === \"string\" ? header.cwd : undefined;\n\t\tconst cwd = options?.cwdOverride ?? storedCwd ?? this.cwd;\n\t\tconst dir = this.sessionDir ?? getSessionDirForReference(reference);\n\t\treturn new LocalSession(cwd, dir, reference, this, preloadedFileEntries, this.firstPublicationCoordinator);\n\t}\n\n\tcontinueRecent(): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst filterCwd = this.sessionDir !== undefined && dir !== getDefaultSessionDirPath(this.cwd);\n\t\tconst mostRecent = findMostRecentSession(dir, filterCwd ? this.cwd : undefined);\n\t\tif (mostRecent) {\n\t\t\treturn new LocalSession(this.cwd, dir, mostRecent, this, undefined, this.firstPublicationCoordinator);\n\t\t}\n\t\treturn new LocalSession(this.cwd, dir, undefined, this, undefined, this.firstPublicationCoordinator);\n\t}\n\n\tusesDefaultSessionDir(): boolean {\n\t\treturn (this.sessionDir ?? getDefaultSessionDir(this.cwd)) === getDefaultSessionDirPath(this.cwd);\n\t}\n\n\tforkFrom(reference: string): LocalSession {\n\t\tconst sourceEntries = loadEntriesFromFile(reference, { repair: false, phase: \"fork\" });\n\t\tif (sourceEntries.length === 0) {\n\t\t\tthrow createJsonlSessionDecodeError(reference, \"fork\", \"schema\", `Cannot fork empty session: ${reference}`);\n\t\t}\n\t\tmigrateToCurrentVersion(sourceEntries);\n\t\tvalidateCurrentSessionEntries(sourceEntries, reference, {\n\t\t\tphase: \"fork\",\n\t\t\tlocations: getJsonlEntryLocations(sourceEntries),\n\t\t});\n\t\tconst sourceHeader = sourceEntries[0];\n\t\tif (sourceHeader?.type !== \"session\") {\n\t\t\tthrow new Error(`Cannot fork: source session has no header: ${reference}`);\n\t\t}\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tensureDir(dir);\n\n\t\tconst newSessionId = createSessionId();\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst newHeader: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: newSessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: reference,\n\t\t};\n\t\tconst expectedReference = prepareSessionReference(dir, newHeader.id, newHeader.timestamp);\n\t\tconst newSessionReference = this.claimFirstPublication(\n\t\t\texpectedReference,\n\t\t\t[newHeader, ...sourceEntries],\n\t\t\t() => forkJsonlSession(dir, newHeader, sourceEntries),\n\t\t\t{ allowExistingEmptyFile: false, phase: \"fork\" },\n\t\t);\n\n\t\treturn new LocalSession(this.cwd, dir, newSessionReference, this, undefined, this.firstPublicationCoordinator);\n\t}\n\n\tprivate publishFirstSnapshot(\n\t\tfilePath: string,\n\t\tentries: FileEntry[],\n\t\toperation: () => void,\n\t\toptions: SessionPublicationClaimOptions,\n\t): void {\n\t\tthis.claimFirstPublication(filePath, entries, operation, options);\n\t}\n\n\tprivate claimFirstPublication<T>(\n\t\tfilePath: string,\n\t\tentries: FileEntry[],\n\t\toperation: () => T,\n\t\toptions: SessionPublicationClaimOptions = {\n\t\t\tallowExistingEmptyFile: false,\n\t\t\tphase: \"create\",\n\t\t},\n\t): T {\n\t\tconst header = entries.find((entry): entry is SessionHeader => entry.type === \"session\");\n\t\tif (!header) throw new Error(`Cannot publish session without a header: ${filePath}`);\n\t\tconst key = `${this.canonicalCwd(header.cwd)}\\0${header.id}`;\n\t\tif (this.activePublicationDestinations.has(key)) {\n\t\t\tthrow new SessionAlreadyExistsError(filePath, header.id, options.phase);\n\t\t}\n\t\tthis.activePublicationDestinations.add(key);\n\t\ttry {\n\t\t\tthis.rejectExistingSession(filePath, header, options);\n\t\t\treturn operation();\n\t\t} finally {\n\t\t\tthis.activePublicationDestinations.delete(key);\n\t\t}\n\t}\n\n\tprivate rejectConflictingPublicationCandidate(\n\t\tcandidate: string,\n\t\tresolvedTarget: string,\n\t\theader: SessionHeader,\n\t\toptions: SessionPublicationClaimOptions,\n\t): void {\n\t\tif (candidate === resolvedTarget) {\n\t\t\tif (options.allowExistingEmptyFile && lstatSync(candidate).isFile() && lstatSync(candidate).size === 0) return;\n\t\t\tthrow new SessionAlreadyExistsError(candidate, header.id, options.phase);\n\t\t}\n\t\ttry {\n\t\t\tconst existing = readSessionHeader(candidate);\n\t\t\tif (\n\t\t\t\texisting?.id === header.id &&\n\t\t\t\ttypeof existing.cwd === \"string\" &&\n\t\t\t\tthis.canonicalCwd(existing.cwd) === this.canonicalCwd(header.cwd)\n\t\t\t) {\n\t\t\t\tthrow new SessionAlreadyExistsError(candidate, header.id, options.phase);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof SessionAlreadyExistsError) throw error;\n\t\t\tif (error instanceof SessionHeaderScanLimitError) return;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate rejectExistingSession(\n\t\tfilePath: string,\n\t\theader: SessionHeader,\n\t\toptions: SessionPublicationClaimOptions,\n\t): void {\n\t\tconst resolvedTarget = resolve(filePath);\n\t\tfor (const name of readdirSync(dirname(resolvedTarget))) {\n\t\t\tif (!name.endsWith(\".jsonl\")) continue;\n\t\t\tconst candidate = resolve(dirname(resolvedTarget), name);\n\t\t\tthis.rejectConflictingPublicationCandidate(candidate, resolvedTarget, header, options);\n\t\t}\n\t}\n\n\tprivate canonicalCwd(cwd: string): string {\n\t\tconst canonical = resolve(cwd);\n\t\treturn process.platform === \"win32\"\n\t\t\t? canonical.replace(/^([A-Z]):/, (_, drive: string) => `${drive.toLowerCase()}:`)\n\t\t\t: canonical;\n\t}\n\n\tforkSession(source: Session, targetLeafId: string | null): LocalSession {\n\t\tconst parentSession = source.getSessionReference();\n\t\tif (!targetLeafId) {\n\t\t\tconst session = this.create();\n\t\t\tsession.newSession({ parentSession });\n\t\t\treturn session;\n\t\t}\n\n\t\tconst branchSource = parentSession && existsSync(parentSession) ? this.openReference(parentSession) : source;\n\t\tconst target = this.create({ parentSession });\n\t\ttarget.copyBranchFrom(branchSource, targetLeafId, parentSession);\n\t\treturn target;\n\t}\n\n\timportJsonl(inputPath: string, options?: OpenSessionOptions): LocalSession {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) throw new Error(`File not found: ${resolvedPath}`);\n\n\t\tconst entries = loadEntriesFromFile(resolvedPath, { repair: false, phase: \"import\" });\n\t\tif (entries.length === 0) {\n\t\t\tthrow createJsonlSessionDecodeError(\n\t\t\t\tresolvedPath,\n\t\t\t\t\"import\",\n\t\t\t\t\"schema\",\n\t\t\t\t`Cannot import empty session JSONL: ${resolvedPath}`,\n\t\t\t);\n\t\t}\n\t\tmigrateToCurrentVersion(entries);\n\t\tvalidateCurrentSessionEntries(entries, resolvedPath, {\n\t\t\tphase: \"import\",\n\t\t\tlocations: getJsonlEntryLocations(entries),\n\t\t});\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tensureDir(dir);\n\t\tconst destinationPath = join(dir, basename(resolvedPath));\n\t\tif (resolve(destinationPath) === resolvedPath) return this.openReference(resolvedPath, options);\n\n\t\tconst header = entries[0];\n\t\tif (header?.type !== \"session\") throw new Error(`Cannot import session without a header: ${resolvedPath}`);\n\t\tthis.claimFirstPublication(\n\t\t\tdestinationPath,\n\t\t\tentries,\n\t\t\t() => publishJsonlAtomically(destinationPath, entries, { phase: \"import\" }),\n\t\t\t{ allowExistingEmptyFile: false, phase: \"import\" },\n\t\t);\n\t\treturn this.openReference(destinationPath, options);\n\t}\n\n\tasync list(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst filterCwd = this.sessionDir !== undefined && dir !== getDefaultSessionDirPath(this.cwd);\n\t\tconst resolvedCwd = resolve(this.cwd);\n\t\tconst sessions = (await listJsonlSessions(dir, onProgress)).filter(\n\t\t\t(session) => !filterCwd || (session.cwd !== undefined && resolve(session.cwd) === resolvedCwd),\n\t\t);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n\n\tasync listAll(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst sessions = this.sessionDir\n\t\t\t? await listJsonlSessions(this.sessionDir, onProgress)\n\t\t\t: await listAllJsonlSessions(getSessionsRoot(), onProgress);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { Session } from "./session.ts";
2
+ import type { SessionManager } from "./session-manager.ts";
3
+ import { type JsonlFirstPublicationCoordinator } from "./stores/jsonl-session-store.ts";
4
+ import type { FileEntry } from "./types.ts";
5
+ export declare class LocalSession extends Session {
6
+ constructor(cwd: string, sessionDir: string, sessionReference: string | undefined, sessionManager?: SessionManager, preloadedFileEntries?: FileEntry[], firstPublicationCoordinator?: JsonlFirstPublicationCoordinator);
7
+ protected prepareNewSessionReference(sessionDir: string, sessionId: string, timestamp: string): string | undefined;
8
+ }
9
+ //# sourceMappingURL=local-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-session.d.ts","sourceRoot":"","sources":["../../../src/core/session/local-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,KAAK,gCAAgC,EAAqB,MAAM,iCAAiC,CAAC;AAC3G,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,qBAAa,YAAa,SAAQ,OAAO;IACxC,YACC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,cAAc,CAAC,EAAE,cAAc,EAC/B,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAClC,2BAA2B,CAAC,EAAE,gCAAgC,EAe9D;IAED,SAAS,CAAC,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjH;CACD","sourcesContent":["import { join } from \"node:path\";\nimport { Session } from \"./session.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { type JsonlFirstPublicationCoordinator, JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry } from \"./types.ts\";\n\nexport class LocalSession extends Session {\n\tconstructor(\n\t\tcwd: string,\n\t\tsessionDir: string,\n\t\tsessionReference: string | undefined,\n\t\tsessionManager?: SessionManager,\n\t\tpreloadedFileEntries?: FileEntry[],\n\t\tfirstPublicationCoordinator?: JsonlFirstPublicationCoordinator,\n\t) {\n\t\tsuper(\n\t\t\tcwd,\n\t\t\tsessionDir,\n\t\t\tsessionReference,\n\t\t\tnew JsonlSessionStore(\n\t\t\t\tsessionReference && preloadedFileEntries\n\t\t\t\t\t? { reference: sessionReference, entries: preloadedFileEntries }\n\t\t\t\t\t: undefined,\n\t\t\t\tundefined,\n\t\t\t\tfirstPublicationCoordinator,\n\t\t\t),\n\t\t\tsessionManager,\n\t\t);\n\t}\n\n\tprotected prepareNewSessionReference(sessionDir: string, sessionId: string, timestamp: string): string | undefined {\n\t\tconst fileTimestamp = timestamp.replace(/[:.]/g, \"-\");\n\t\treturn join(sessionDir, `${fileTimestamp}_${sessionId}.jsonl`);\n\t}\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { join } from "node:path";
2
+ import { Session } from "./session.js";
3
+ import { JsonlSessionStore } from "./stores/jsonl-session-store.js";
4
+ export class LocalSession extends Session {
5
+ constructor(cwd, sessionDir, sessionReference, sessionManager, preloadedFileEntries, firstPublicationCoordinator) {
6
+ super(cwd, sessionDir, sessionReference, new JsonlSessionStore(sessionReference && preloadedFileEntries
7
+ ? { reference: sessionReference, entries: preloadedFileEntries }
8
+ : undefined, undefined, firstPublicationCoordinator), sessionManager);
9
+ }
10
+ prepareNewSessionReference(sessionDir, sessionId, timestamp) {
11
+ const fileTimestamp = timestamp.replace(/[:.]/g, "-");
12
+ return join(sessionDir, `${fileTimestamp}_${sessionId}.jsonl`);
13
+ }
14
+ }
15
+ //# sourceMappingURL=local-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-session.js","sourceRoot":"","sources":["../../../src/core/session/local-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAyC,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAG3G,MAAM,OAAO,YAAa,SAAQ,OAAO;IACxC,YACC,GAAW,EACX,UAAkB,EAClB,gBAAoC,EACpC,cAA+B,EAC/B,oBAAkC,EAClC,2BAA8D,EAC7D;QACD,KAAK,CACJ,GAAG,EACH,UAAU,EACV,gBAAgB,EAChB,IAAI,iBAAiB,CACpB,gBAAgB,IAAI,oBAAoB;YACvC,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,oBAAoB,EAAE;YAChE,CAAC,CAAC,SAAS,EACZ,SAAS,EACT,2BAA2B,CAC3B,EACD,cAAc,CACd,CAAC;IAAA,CACF;IAES,0BAA0B,CAAC,UAAkB,EAAE,SAAiB,EAAE,SAAiB,EAAsB;QAClH,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,aAAa,IAAI,SAAS,QAAQ,CAAC,CAAC;IAAA,CAC/D;CACD","sourcesContent":["import { join } from \"node:path\";\nimport { Session } from \"./session.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { type JsonlFirstPublicationCoordinator, JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry } from \"./types.ts\";\n\nexport class LocalSession extends Session {\n\tconstructor(\n\t\tcwd: string,\n\t\tsessionDir: string,\n\t\tsessionReference: string | undefined,\n\t\tsessionManager?: SessionManager,\n\t\tpreloadedFileEntries?: FileEntry[],\n\t\tfirstPublicationCoordinator?: JsonlFirstPublicationCoordinator,\n\t) {\n\t\tsuper(\n\t\t\tcwd,\n\t\t\tsessionDir,\n\t\t\tsessionReference,\n\t\t\tnew JsonlSessionStore(\n\t\t\t\tsessionReference && preloadedFileEntries\n\t\t\t\t\t? { reference: sessionReference, entries: preloadedFileEntries }\n\t\t\t\t\t: undefined,\n\t\t\t\tundefined,\n\t\t\t\tfirstPublicationCoordinator,\n\t\t\t),\n\t\t\tsessionManager,\n\t\t);\n\t}\n\n\tprotected prepareNewSessionReference(sessionDir: string, sessionId: string, timestamp: string): string | undefined {\n\t\tconst fileTimestamp = timestamp.replace(/[:.]/g, \"-\");\n\t\treturn join(sessionDir, `${fileTimestamp}_${sessionId}.jsonl`);\n\t}\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { FileEntry } from "./types.ts";
2
+ /**
3
+ * Run all necessary migrations to bring entries to current version.
4
+ * Mutates entries in place. Returns true if any migration was applied.
5
+ */
6
+ export declare function migrateToCurrentVersion(entries: FileEntry[]): boolean;
7
+ /** Exported for testing. */
8
+ export declare function migrateSessionEntries(entries: FileEntry[]): void;
9
+ /** Exported for compaction tests. */
10
+ export declare function parseSessionEntries(content: string): FileEntry[];
11
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/core/session/migrations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,SAAS,EAAsC,MAAM,YAAY,CAAC;AA+CjG;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAUrE;AAED,4BAA4B;AAC5B,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAEhE;AAED,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAehE","sourcesContent":["import { CURRENT_SESSION_VERSION } from \"./constants.ts\";\nimport { generateId } from \"./ids.ts\";\nimport type { CompactionEntry, FileEntry, SessionHeader, SessionMessageEntry } from \"./types.ts\";\n\n/** Migrate v1 → v2: add id/parentId tree structure. Mutates in place. */\nfunction migrateV1ToV2(entries: FileEntry[]): void {\n\tconst ids = new Set<string>();\n\tlet prevId: string | null = null;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.id = generateId(ids);\n\t\tentry.parentId = prevId;\n\t\tprevId = entry.id;\n\n\t\tif (entry.type === \"compaction\") {\n\t\t\tconst comp = entry as CompactionEntry & { firstKeptEntryIndex?: number };\n\t\t\tif (typeof comp.firstKeptEntryIndex === \"number\") {\n\t\t\t\tconst targetEntry = entries[comp.firstKeptEntryIndex];\n\t\t\t\tif (targetEntry && targetEntry.type !== \"session\") {\n\t\t\t\t\tcomp.firstKeptEntryId = targetEntry.id;\n\t\t\t\t}\n\t\t\t\tdelete comp.firstKeptEntryIndex;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Migrate v2 → v3: rename hookMessage role to custom. Mutates in place. */\nfunction migrateV2ToV3(entries: FileEntry[]): void {\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 3;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msgEntry = entry as SessionMessageEntry;\n\t\t\tif (msgEntry.message && (msgEntry.message as { role: string }).role === \"hookMessage\") {\n\t\t\t\t(msgEntry.message as { role: string }).role = \"custom\";\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Run all necessary migrations to bring entries to current version.\n * Mutates entries in place. Returns true if any migration was applied.\n */\nexport function migrateToCurrentVersion(entries: FileEntry[]): boolean {\n\tconst header = entries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\tconst version = header?.version ?? 1;\n\n\tif (version >= CURRENT_SESSION_VERSION) return false;\n\n\tif (version < 2) migrateV1ToV2(entries);\n\tif (version < 3) migrateV2ToV3(entries);\n\n\treturn true;\n}\n\n/** Exported for testing. */\nexport function migrateSessionEntries(entries: FileEntry[]): void {\n\tmigrateToCurrentVersion(entries);\n}\n\n/** Exported for compaction tests. */\nexport function parseSessionEntries(content: string): FileEntry[] {\n\tconst entries: FileEntry[] = [];\n\tconst lines = content.trim().split(\"\\n\");\n\n\tfor (const line of lines) {\n\t\tif (!line.trim()) continue;\n\t\ttry {\n\t\t\tconst entry = JSON.parse(line) as FileEntry;\n\t\t\tentries.push(entry);\n\t\t} catch {\n\t\t\t// Skip malformed lines.\n\t\t}\n\t}\n\n\treturn entries;\n}\n"]}
@@ -0,0 +1,78 @@
1
+ import { CURRENT_SESSION_VERSION } from "./constants.js";
2
+ import { generateId } from "./ids.js";
3
+ /** Migrate v1 → v2: add id/parentId tree structure. Mutates in place. */
4
+ function migrateV1ToV2(entries) {
5
+ const ids = new Set();
6
+ let prevId = null;
7
+ for (const entry of entries) {
8
+ if (entry.type === "session") {
9
+ entry.version = 2;
10
+ continue;
11
+ }
12
+ entry.id = generateId(ids);
13
+ entry.parentId = prevId;
14
+ prevId = entry.id;
15
+ if (entry.type === "compaction") {
16
+ const comp = entry;
17
+ if (typeof comp.firstKeptEntryIndex === "number") {
18
+ const targetEntry = entries[comp.firstKeptEntryIndex];
19
+ if (targetEntry && targetEntry.type !== "session") {
20
+ comp.firstKeptEntryId = targetEntry.id;
21
+ }
22
+ delete comp.firstKeptEntryIndex;
23
+ }
24
+ }
25
+ }
26
+ }
27
+ /** Migrate v2 → v3: rename hookMessage role to custom. Mutates in place. */
28
+ function migrateV2ToV3(entries) {
29
+ for (const entry of entries) {
30
+ if (entry.type === "session") {
31
+ entry.version = 3;
32
+ continue;
33
+ }
34
+ if (entry.type === "message") {
35
+ const msgEntry = entry;
36
+ if (msgEntry.message && msgEntry.message.role === "hookMessage") {
37
+ msgEntry.message.role = "custom";
38
+ }
39
+ }
40
+ }
41
+ }
42
+ /**
43
+ * Run all necessary migrations to bring entries to current version.
44
+ * Mutates entries in place. Returns true if any migration was applied.
45
+ */
46
+ export function migrateToCurrentVersion(entries) {
47
+ const header = entries.find((entry) => entry.type === "session");
48
+ const version = header?.version ?? 1;
49
+ if (version >= CURRENT_SESSION_VERSION)
50
+ return false;
51
+ if (version < 2)
52
+ migrateV1ToV2(entries);
53
+ if (version < 3)
54
+ migrateV2ToV3(entries);
55
+ return true;
56
+ }
57
+ /** Exported for testing. */
58
+ export function migrateSessionEntries(entries) {
59
+ migrateToCurrentVersion(entries);
60
+ }
61
+ /** Exported for compaction tests. */
62
+ export function parseSessionEntries(content) {
63
+ const entries = [];
64
+ const lines = content.trim().split("\n");
65
+ for (const line of lines) {
66
+ if (!line.trim())
67
+ continue;
68
+ try {
69
+ const entry = JSON.parse(line);
70
+ entries.push(entry);
71
+ }
72
+ catch {
73
+ // Skip malformed lines.
74
+ }
75
+ }
76
+ return entries;
77
+ }
78
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/core/session/migrations.ts"],"names":[],"mappings":"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","sourcesContent":["import { CURRENT_SESSION_VERSION } from \"./constants.ts\";\nimport { generateId } from \"./ids.ts\";\nimport type { CompactionEntry, FileEntry, SessionHeader, SessionMessageEntry } from \"./types.ts\";\n\n/** Migrate v1 → v2: add id/parentId tree structure. Mutates in place. */\nfunction migrateV1ToV2(entries: FileEntry[]): void {\n\tconst ids = new Set<string>();\n\tlet prevId: string | null = null;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.id = generateId(ids);\n\t\tentry.parentId = prevId;\n\t\tprevId = entry.id;\n\n\t\tif (entry.type === \"compaction\") {\n\t\t\tconst comp = entry as CompactionEntry & { firstKeptEntryIndex?: number };\n\t\t\tif (typeof comp.firstKeptEntryIndex === \"number\") {\n\t\t\t\tconst targetEntry = entries[comp.firstKeptEntryIndex];\n\t\t\t\tif (targetEntry && targetEntry.type !== \"session\") {\n\t\t\t\t\tcomp.firstKeptEntryId = targetEntry.id;\n\t\t\t\t}\n\t\t\t\tdelete comp.firstKeptEntryIndex;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Migrate v2 → v3: rename hookMessage role to custom. Mutates in place. */\nfunction migrateV2ToV3(entries: FileEntry[]): void {\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 3;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msgEntry = entry as SessionMessageEntry;\n\t\t\tif (msgEntry.message && (msgEntry.message as { role: string }).role === \"hookMessage\") {\n\t\t\t\t(msgEntry.message as { role: string }).role = \"custom\";\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Run all necessary migrations to bring entries to current version.\n * Mutates entries in place. Returns true if any migration was applied.\n */\nexport function migrateToCurrentVersion(entries: FileEntry[]): boolean {\n\tconst header = entries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\tconst version = header?.version ?? 1;\n\n\tif (version >= CURRENT_SESSION_VERSION) return false;\n\n\tif (version < 2) migrateV1ToV2(entries);\n\tif (version < 3) migrateV2ToV3(entries);\n\n\treturn true;\n}\n\n/** Exported for testing. */\nexport function migrateSessionEntries(entries: FileEntry[]): void {\n\tmigrateToCurrentVersion(entries);\n}\n\n/** Exported for compaction tests. */\nexport function parseSessionEntries(content: string): FileEntry[] {\n\tconst entries: FileEntry[] = [];\n\tconst lines = content.trim().split(\"\\n\");\n\n\tfor (const line of lines) {\n\t\tif (!line.trim()) continue;\n\t\ttry {\n\t\t\tconst entry = JSON.parse(line) as FileEntry;\n\t\t\tentries.push(entry);\n\t\t} catch {\n\t\t\t// Skip malformed lines.\n\t\t}\n\t}\n\n\treturn entries;\n}\n"]}