@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,1140 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { appendFileSync, closeSync, createReadStream, existsSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, readSync, renameSync, rmSync, statSync, writeFileSync, } from "fs";
3
+ import { readdir, stat } from "fs/promises";
4
+ import { basename, dirname, join, resolve } from "path";
5
+ import { createInterface } from "readline";
6
+ import { getAgentDir as getDefaultAgentDir, getSessionsDir } from "../../../config.js";
7
+ import { JsonlDecodeError as JsonlDecodeFailure, JsonlSessionError, } from "../jsonl-errors.js";
8
+ import { InMemorySessionStore } from "./in-memory-session-store.js";
9
+ function isMessageWithContent(message) {
10
+ return typeof message.role === "string" && "content" in message;
11
+ }
12
+ function extractTextContent(message) {
13
+ const content = message.content;
14
+ if (content == null) {
15
+ return "";
16
+ }
17
+ if (typeof content === "string") {
18
+ return content;
19
+ }
20
+ return content
21
+ .filter((block) => block.type === "text")
22
+ .map((block) => block.text)
23
+ .join(" ");
24
+ }
25
+ function getMessageActivityTime(entry) {
26
+ const message = entry.message;
27
+ if (!isMessageWithContent(message))
28
+ return undefined;
29
+ if (message.role !== "user" && message.role !== "assistant")
30
+ return undefined;
31
+ const msgTimestamp = message.timestamp;
32
+ if (typeof msgTimestamp === "number") {
33
+ return msgTimestamp;
34
+ }
35
+ const t = new Date(entry.timestamp).getTime();
36
+ return Number.isNaN(t) ? undefined : t;
37
+ }
38
+ const SESSION_READ_BUFFER_SIZE = 1024 * 1024;
39
+ const SESSION_HEADER_READ_BUFFER_SIZE = 4096;
40
+ /** Bound synchronous header discovery while allowing large cwd and custom metadata fields. */
41
+ const MAX_SESSION_HEADER_SCAN_BYTES = 1024 * 1024;
42
+ const SAFE_ID_PATTERN = /^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?$/;
43
+ function parseSessionEntryLine(line) {
44
+ if (!line.trim())
45
+ return null;
46
+ try {
47
+ return JSON.parse(line);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ function* readPhysicalRecords(filePath) {
54
+ const fd = openSync(filePath, "r");
55
+ const buffer = Buffer.allocUnsafe(SESSION_READ_BUFFER_SIZE);
56
+ let pending = Buffer.alloc(0);
57
+ let consumedBytes = 0;
58
+ let recordStart = 0;
59
+ let line = 1;
60
+ try {
61
+ while (true) {
62
+ const bytesRead = readSync(fd, buffer, 0, buffer.length, null);
63
+ if (bytesRead === 0)
64
+ break;
65
+ const chunk = buffer.subarray(0, bytesRead);
66
+ const data = pending.length === 0 ? chunk : Buffer.concat([pending, chunk]);
67
+ let start = 0;
68
+ let newline = data.indexOf(0x0a, start);
69
+ while (newline !== -1) {
70
+ yield { bytes: data.subarray(start, newline), line, start: recordStart, terminated: true };
71
+ line++;
72
+ start = newline + 1;
73
+ recordStart = consumedBytes + bytesRead - (data.length - start);
74
+ newline = data.indexOf(0x0a, start);
75
+ }
76
+ pending = Buffer.from(data.subarray(start));
77
+ consumedBytes += bytesRead;
78
+ }
79
+ if (pending.length > 0)
80
+ yield { bytes: pending, line, start: recordStart, terminated: false };
81
+ }
82
+ finally {
83
+ closeSync(fd);
84
+ }
85
+ }
86
+ const jsonlEntryLocations = new WeakMap();
87
+ export function getJsonlEntryLocations(entries) {
88
+ return jsonlEntryLocations.get(entries);
89
+ }
90
+ function decodePhysicalRecord(record) {
91
+ let bytes = record.bytes;
92
+ if (bytes.at(-1) === 0x0d)
93
+ bytes = bytes.subarray(0, bytes.length - 1);
94
+ try {
95
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
96
+ }
97
+ catch (error) {
98
+ throw new JsonlDecodeFailure("utf8", "contains invalid UTF-8", error instanceof Error ? error : new Error(String(error)));
99
+ }
100
+ }
101
+ function parseJsonObject(record) {
102
+ let parsed;
103
+ try {
104
+ parsed = JSON.parse(decodePhysicalRecord(record));
105
+ }
106
+ catch (error) {
107
+ if (error instanceof JsonlDecodeFailure)
108
+ throw error;
109
+ throw new JsonlDecodeFailure("syntax", "is not valid JSON", error instanceof Error ? error : new Error(String(error)));
110
+ }
111
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
112
+ throw new JsonlDecodeFailure("schema", "is not a JSON object");
113
+ }
114
+ return parsed;
115
+ }
116
+ function requireString(value, field) {
117
+ if (typeof value !== "string" || value.length === 0) {
118
+ throw new JsonlDecodeFailure("schema", `has invalid ${field}`);
119
+ }
120
+ return value;
121
+ }
122
+ function requireId(value, field) {
123
+ const id = requireString(value, field);
124
+ if (!SAFE_ID_PATTERN.test(id))
125
+ throw new JsonlDecodeFailure("schema", `has invalid ${field}`);
126
+ return id;
127
+ }
128
+ function requireTimestamp(value) {
129
+ const timestamp = requireString(value, "timestamp");
130
+ if (Number.isNaN(Date.parse(timestamp)))
131
+ throw new JsonlDecodeFailure("schema", "has invalid timestamp");
132
+ return timestamp;
133
+ }
134
+ const MESSAGE_ROLES = new Set([
135
+ "user",
136
+ "assistant",
137
+ "toolResult",
138
+ "bashExecution",
139
+ "custom",
140
+ "branchSummary",
141
+ "compactionSummary",
142
+ "hookMessage",
143
+ ]);
144
+ function validatePersistedMessageRole(message, role) {
145
+ switch (role) {
146
+ case "toolResult":
147
+ requireString(message.toolCallId, "toolCallId");
148
+ requireString(message.toolName, "toolName");
149
+ if (typeof message.isError !== "boolean")
150
+ throw new JsonlDecodeFailure("schema", "has invalid isError");
151
+ break;
152
+ case "custom":
153
+ case "hookMessage":
154
+ requireString(message.customType, "customType");
155
+ if (typeof message.display !== "boolean")
156
+ throw new JsonlDecodeFailure("schema", "has invalid display");
157
+ break;
158
+ case "bashExecution":
159
+ requireString(message.command, "command");
160
+ if (typeof message.output !== "string")
161
+ throw new JsonlDecodeFailure("schema", "has invalid output");
162
+ if (typeof message.cancelled !== "boolean" || typeof message.truncated !== "boolean") {
163
+ throw new JsonlDecodeFailure("schema", "has invalid bash state");
164
+ }
165
+ break;
166
+ case "branchSummary":
167
+ case "compactionSummary":
168
+ requireString(message.summary, "summary");
169
+ }
170
+ }
171
+ function validatePersistedMessage(value) {
172
+ if (typeof value !== "object" || value === null)
173
+ throw new JsonlDecodeFailure("schema", "has invalid message");
174
+ const message = value;
175
+ const role = requireString(message.role, "message role");
176
+ if (!MESSAGE_ROLES.has(role))
177
+ throw new JsonlDecodeFailure("schema", `has unknown message role ${role}`);
178
+ if (typeof message.timestamp !== "number" || !Number.isFinite(message.timestamp)) {
179
+ throw new JsonlDecodeFailure("schema", "has invalid message timestamp");
180
+ }
181
+ if (message.content != null && typeof message.content !== "string" && !Array.isArray(message.content)) {
182
+ throw new JsonlDecodeFailure("schema", "has invalid message content");
183
+ }
184
+ validatePersistedMessageRole(message, role);
185
+ }
186
+ const SESSION_ENTRY_TYPES = new Set([
187
+ "message",
188
+ "thinking_level_change",
189
+ "model_change",
190
+ "compaction",
191
+ "branch_summary",
192
+ "custom",
193
+ "custom_message",
194
+ "label",
195
+ "session_info",
196
+ ]);
197
+ function parseStrictHeader(record) {
198
+ const value = parseJsonObject(record);
199
+ if (value.type !== "session")
200
+ throw new JsonlDecodeFailure("schema", "is not a session header");
201
+ const version = value.version ?? 1;
202
+ if (version !== 1 && version !== 2 && version !== 3) {
203
+ throw new JsonlDecodeFailure("schema", "has unsupported session version");
204
+ }
205
+ requireId(value.id, "session id");
206
+ requireTimestamp(value.timestamp);
207
+ requireString(value.cwd, "cwd");
208
+ if (value.parentSession !== undefined && typeof value.parentSession !== "string") {
209
+ throw new JsonlDecodeFailure("schema", "has invalid parentSession");
210
+ }
211
+ return value;
212
+ }
213
+ function validateVersionedEntryLinks(value, version) {
214
+ if (version < 2)
215
+ return;
216
+ requireId(value.id, "entry id");
217
+ if (value.parentId !== null && (typeof value.parentId !== "string" || !SAFE_ID_PATTERN.test(value.parentId))) {
218
+ throw new JsonlDecodeFailure("schema", "has invalid parentId");
219
+ }
220
+ }
221
+ function validateCompactionEntry(value, version) {
222
+ requireString(value.summary, "summary");
223
+ if (version === 1) {
224
+ if (value.firstKeptEntryId === undefined && !Number.isInteger(value.firstKeptEntryIndex)) {
225
+ throw new JsonlDecodeFailure("schema", "has invalid compaction target");
226
+ }
227
+ }
228
+ else
229
+ requireId(value.firstKeptEntryId, "firstKeptEntryId");
230
+ if (typeof value.tokensBefore !== "number" || !Number.isFinite(value.tokensBefore)) {
231
+ throw new JsonlDecodeFailure("schema", "has invalid tokensBefore");
232
+ }
233
+ }
234
+ function validateCustomMessageEntry(value) {
235
+ requireString(value.customType, "customType");
236
+ if (value.content != null && typeof value.content !== "string" && !Array.isArray(value.content)) {
237
+ throw new JsonlDecodeFailure("schema", "has invalid content");
238
+ }
239
+ if (typeof value.display !== "boolean")
240
+ throw new JsonlDecodeFailure("schema", "has invalid display");
241
+ }
242
+ function parseStrictEntry(record, version) {
243
+ const value = parseJsonObject(record);
244
+ const type = requireString(value.type, "entry type");
245
+ if (!SESSION_ENTRY_TYPES.has(type)) {
246
+ throw new JsonlDecodeFailure("schema", `has unknown entry type ${type}`);
247
+ }
248
+ requireTimestamp(value.timestamp);
249
+ validateVersionedEntryLinks(value, version);
250
+ switch (type) {
251
+ case "message":
252
+ validatePersistedMessage(value.message);
253
+ break;
254
+ case "thinking_level_change":
255
+ requireString(value.thinkingLevel, "thinkingLevel");
256
+ break;
257
+ case "model_change":
258
+ requireString(value.provider, "provider");
259
+ requireString(value.modelId, "modelId");
260
+ break;
261
+ case "compaction":
262
+ validateCompactionEntry(value, version);
263
+ break;
264
+ case "branch_summary":
265
+ requireId(value.fromId, "fromId");
266
+ requireString(value.summary, "summary");
267
+ break;
268
+ case "custom":
269
+ requireString(value.customType, "customType");
270
+ break;
271
+ case "custom_message":
272
+ validateCustomMessageEntry(value);
273
+ if (typeof value.display !== "boolean")
274
+ throw new JsonlDecodeFailure("schema", "has invalid display");
275
+ break;
276
+ case "label":
277
+ requireId(value.targetId, "targetId");
278
+ if (value.label !== undefined && typeof value.label !== "string") {
279
+ throw new JsonlDecodeFailure("schema", "has invalid label");
280
+ }
281
+ break;
282
+ case "session_info":
283
+ if (value.name !== undefined && typeof value.name !== "string") {
284
+ throw new JsonlDecodeFailure("schema", "has invalid name");
285
+ }
286
+ break;
287
+ }
288
+ return value;
289
+ }
290
+ function invalidJsonl(filePath, record, failure, phase) {
291
+ const decodeFailure = failure instanceof JsonlDecodeFailure ? failure : new JsonlDecodeFailure("state", failure.message, failure);
292
+ return new JsonlSessionError({
293
+ code: "invalid_jsonl",
294
+ reference: filePath,
295
+ phase,
296
+ line: record.line,
297
+ byteOffset: record.start,
298
+ decodeKind: decodeFailure.decodeKind,
299
+ message: `Invalid JSONL session file ${filePath}: line ${record.line} ${failure.message}`,
300
+ cause: decodeFailure,
301
+ });
302
+ }
303
+ function jsonlStorageError(reference, phase, message, cause, outcome) {
304
+ if (cause instanceof JsonlSessionError && cause.phase === phase)
305
+ return cause;
306
+ return new JsonlSessionError({
307
+ code: cause instanceof JsonlSessionError ? cause.code : "storage",
308
+ reference,
309
+ phase,
310
+ line: cause instanceof JsonlSessionError ? cause.line : undefined,
311
+ byteOffset: cause instanceof JsonlSessionError ? cause.byteOffset : undefined,
312
+ decodeKind: cause instanceof JsonlSessionError ? cause.decodeKind : undefined,
313
+ message,
314
+ outcome: outcome ?? (cause instanceof JsonlSessionError ? cause.outcome : undefined),
315
+ cause,
316
+ });
317
+ }
318
+ export class SessionHeaderScanLimitError extends Error {
319
+ constructor(filePath) {
320
+ super(`Session header exceeds ${MAX_SESSION_HEADER_SCAN_BYTES}-byte scan limit: ${filePath}`);
321
+ this.name = "SessionHeaderScanLimitError";
322
+ }
323
+ }
324
+ /**
325
+ * Inspect a physical line while searching for the first parsed session entry.
326
+ * Blank lines are skipped; a malformed non-blank candidate quarantines the file.
327
+ */
328
+ function parseSessionHeaderCandidate(line) {
329
+ if (!line.trim())
330
+ return undefined;
331
+ try {
332
+ const bytes = new TextEncoder().encode(line);
333
+ return parseStrictHeader({ bytes, line: 1, start: 0, terminated: true });
334
+ }
335
+ catch {
336
+ return null;
337
+ }
338
+ }
339
+ function parseSessionHeaderBytes(bytes) {
340
+ try {
341
+ return parseSessionHeaderCandidate(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
342
+ }
343
+ catch {
344
+ return null;
345
+ }
346
+ }
347
+ export function readSessionHeader(filePath) {
348
+ const fd = openSync(filePath, "r");
349
+ try {
350
+ const buffer = Buffer.allocUnsafe(SESSION_HEADER_READ_BUFFER_SIZE);
351
+ let pending = Buffer.alloc(0);
352
+ let scannedBytes = 0;
353
+ while (scannedBytes < MAX_SESSION_HEADER_SCAN_BYTES) {
354
+ const readLength = Math.min(buffer.length, MAX_SESSION_HEADER_SCAN_BYTES - scannedBytes);
355
+ const bytesRead = readSync(fd, buffer, 0, readLength, null);
356
+ if (bytesRead === 0)
357
+ return parseSessionHeaderBytes(pending) ?? null;
358
+ scannedBytes += bytesRead;
359
+ const data = pending.length === 0
360
+ ? buffer.subarray(0, bytesRead)
361
+ : Buffer.concat([pending, buffer.subarray(0, bytesRead)]);
362
+ let lineStart = 0;
363
+ let newlineIndex = data.indexOf(0x0a, lineStart);
364
+ while (newlineIndex !== -1) {
365
+ const header = parseSessionHeaderBytes(data.subarray(lineStart, newlineIndex));
366
+ if (header !== undefined)
367
+ return header;
368
+ lineStart = newlineIndex + 1;
369
+ newlineIndex = data.indexOf(0x0a, lineStart);
370
+ }
371
+ pending = Buffer.from(data.subarray(lineStart));
372
+ }
373
+ const probe = Buffer.allocUnsafe(1);
374
+ if (readSync(fd, probe, 0, probe.length, null) === 0)
375
+ return parseSessionHeaderBytes(pending) ?? null;
376
+ throw new SessionHeaderScanLimitError(filePath);
377
+ }
378
+ finally {
379
+ closeSync(fd);
380
+ }
381
+ }
382
+ function readSessionHeaderForDiscovery(filePath) {
383
+ try {
384
+ return readSessionHeader(filePath);
385
+ }
386
+ catch (error) {
387
+ if (error instanceof SessionHeaderScanLimitError)
388
+ return null;
389
+ throw error;
390
+ }
391
+ }
392
+ function getSessionHeaderCwd(header) {
393
+ const cwd = header.cwd;
394
+ return typeof cwd === "string" ? cwd : undefined;
395
+ }
396
+ function sessionCwdMatches(cwd, resolvedCwd) {
397
+ return cwd !== undefined && cwd !== "" && resolve(cwd) === resolvedCwd;
398
+ }
399
+ function recordSessionInfoEntry(result, entry) {
400
+ if (entry.type === "session_info")
401
+ result.name = entry.name?.trim() || undefined;
402
+ if (entry.type !== "message")
403
+ return;
404
+ result.messageCount++;
405
+ const activityTime = getMessageActivityTime(entry);
406
+ if (typeof activityTime === "number") {
407
+ result.lastActivityTime = Math.max(result.lastActivityTime ?? 0, activityTime);
408
+ }
409
+ const message = entry.message;
410
+ if (!isMessageWithContent(message))
411
+ return;
412
+ if (message.role !== "user" && message.role !== "assistant")
413
+ return;
414
+ const textContent = extractTextContent(message);
415
+ if (!textContent)
416
+ return;
417
+ result.allMessages.push(textContent);
418
+ if (!result.firstMessage && message.role === "user")
419
+ result.firstMessage = textContent;
420
+ }
421
+ async function scanSessionInfo(filePath) {
422
+ const result = {
423
+ messageCount: 0,
424
+ firstMessage: "",
425
+ allMessages: [],
426
+ name: undefined,
427
+ lastActivityTime: undefined,
428
+ };
429
+ const lines = createInterface({
430
+ input: createReadStream(filePath, { encoding: "utf8" }),
431
+ crlfDelay: Infinity,
432
+ });
433
+ for await (const line of lines) {
434
+ const entry = parseSessionEntryLine(line);
435
+ if (entry && entry.type !== "session")
436
+ recordSessionInfoEntry(result, entry);
437
+ }
438
+ return result;
439
+ }
440
+ function resolveSessionModifiedDate(header, lastActivityTime, fallback) {
441
+ if (typeof lastActivityTime === "number" && lastActivityTime > 0)
442
+ return new Date(lastActivityTime);
443
+ const headerTime = typeof header.timestamp === "string" ? new Date(header.timestamp).getTime() : NaN;
444
+ return Number.isNaN(headerTime) ? fallback : new Date(headerTime);
445
+ }
446
+ async function buildSessionInfo(filePath) {
447
+ try {
448
+ const stats = await stat(filePath);
449
+ const header = readSessionHeaderForDiscovery(filePath);
450
+ if (!header)
451
+ return null;
452
+ const scan = await scanSessionInfo(filePath);
453
+ const cwd = typeof header.cwd === "string" ? header.cwd : "";
454
+ return {
455
+ reference: filePath,
456
+ path: filePath,
457
+ id: header.id,
458
+ cwd,
459
+ name: scan.name,
460
+ parentSessionPath: header.parentSession,
461
+ created: new Date(header.timestamp),
462
+ modified: resolveSessionModifiedDate(header, scan.lastActivityTime, stats.mtime),
463
+ messageCount: scan.messageCount,
464
+ firstMessage: scan.firstMessage || "(no messages)",
465
+ allMessagesText: scan.allMessages.join(" "),
466
+ };
467
+ }
468
+ catch {
469
+ return null;
470
+ }
471
+ }
472
+ const MAX_CONCURRENT_SESSION_INFO_LOADS = 10;
473
+ export function getSessionDirForReference(reference) {
474
+ return resolve(reference, "..");
475
+ }
476
+ export function getDefaultSessionDirPath(cwd, agentDir = getDefaultAgentDir()) {
477
+ const resolvedCwd = resolve(cwd);
478
+ const safePath = `--${resolvedCwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`;
479
+ return join(resolve(agentDir), "sessions", safePath);
480
+ }
481
+ export function getDefaultSessionDir(cwd, agentDir = getDefaultAgentDir()) {
482
+ const sessionDir = getDefaultSessionDirPath(cwd, agentDir);
483
+ ensureDir(sessionDir);
484
+ return sessionDir;
485
+ }
486
+ export function getSessionsRoot() {
487
+ return getSessionsDir();
488
+ }
489
+ export function prepareSessionReference(sessionDir, sessionId, timestamp) {
490
+ const fileTimestamp = timestamp.replace(/[:.]/g, "-");
491
+ return join(sessionDir, `${fileTimestamp}_${sessionId}.jsonl`);
492
+ }
493
+ export function exists(path) {
494
+ return existsSync(path);
495
+ }
496
+ export function ensureDir(path) {
497
+ if (!existsSync(path)) {
498
+ mkdirSync(path, { recursive: true });
499
+ }
500
+ }
501
+ function failCurrentSessionValidation(state, index, failure) {
502
+ const location = state.locations?.[index];
503
+ throw new JsonlSessionError({
504
+ code: "invalid_jsonl",
505
+ reference: state.filePath,
506
+ phase: state.phase,
507
+ line: location?.line ?? index + 1,
508
+ byteOffset: location?.byteOffset,
509
+ decodeKind: failure.decodeKind,
510
+ message: `Invalid JSONL session file ${state.filePath}: line ${location?.line ?? index + 1} ${failure.message}`,
511
+ cause: failure,
512
+ });
513
+ }
514
+ function validateCurrentSessionHeader(header, state) {
515
+ if (header?.type !== "session" || header.version !== 3) {
516
+ failCurrentSessionValidation(state, 0, new JsonlDecodeFailure("state", "does not have a current version-3 header"));
517
+ }
518
+ try {
519
+ const encodedHeader = new TextEncoder().encode(JSON.stringify(header));
520
+ parseStrictHeader({ bytes: encodedHeader, line: 1, start: 0, terminated: true });
521
+ }
522
+ catch (error) {
523
+ if (error instanceof JsonlDecodeFailure)
524
+ failCurrentSessionValidation(state, 0, error);
525
+ throw error;
526
+ }
527
+ }
528
+ function validateCurrentSessionEntrySchema(entry, index, state) {
529
+ if (!entry || entry.type === "session") {
530
+ failCurrentSessionValidation(state, index, new JsonlDecodeFailure("state", `has an unexpected session header at logical entry ${index + 1}`));
531
+ }
532
+ try {
533
+ const encodedEntry = new TextEncoder().encode(JSON.stringify(entry));
534
+ parseStrictEntry({ bytes: encodedEntry, line: index + 1, start: 0, terminated: true }, 3);
535
+ }
536
+ catch (error) {
537
+ if (error instanceof JsonlDecodeFailure)
538
+ failCurrentSessionValidation(state, index, error);
539
+ throw error;
540
+ }
541
+ }
542
+ function getCurrentSessionEntryTarget(entry) {
543
+ switch (entry.type) {
544
+ case "label":
545
+ return entry.targetId;
546
+ case "compaction":
547
+ return entry.firstKeptEntryId;
548
+ case "branch_summary":
549
+ return entry.fromId;
550
+ default:
551
+ return undefined;
552
+ }
553
+ }
554
+ function validateCurrentSessionEntryLinks(entry, index, state) {
555
+ if (state.entriesById.has(entry.id)) {
556
+ failCurrentSessionValidation(state, index, new JsonlDecodeFailure("state", `duplicates entry id ${entry.id}`));
557
+ }
558
+ if (entry.parentId !== null && !state.entriesById.has(entry.parentId)) {
559
+ failCurrentSessionValidation(state, index, new JsonlDecodeFailure("state", `references missing parent ${entry.parentId}`));
560
+ }
561
+ const targetId = getCurrentSessionEntryTarget(entry);
562
+ if (targetId !== undefined && !state.entriesById.has(targetId)) {
563
+ failCurrentSessionValidation(state, index, new JsonlDecodeFailure("state", `references missing target ${targetId}`));
564
+ }
565
+ state.entriesById.set(entry.id, entry);
566
+ }
567
+ export function validateCurrentSessionEntries(entries, filePath = "session", context = {}) {
568
+ const state = {
569
+ filePath,
570
+ phase: context.phase ?? "open",
571
+ locations: context.locations,
572
+ entriesById: new Map(),
573
+ };
574
+ validateCurrentSessionHeader(entries[0], state);
575
+ for (let index = 1; index < entries.length; index++) {
576
+ const entry = entries[index];
577
+ validateCurrentSessionEntrySchema(entry, index, state);
578
+ validateCurrentSessionEntryLinks(entry, index, state);
579
+ }
580
+ }
581
+ function repairTornJsonlRecord(context, record) {
582
+ publishJsonlContentAtomically(context.filePath, readFileSync(context.filePath).subarray(0, record.start), {
583
+ ...context.publicationOptions,
584
+ phase: "repair",
585
+ });
586
+ }
587
+ function isRepairableDecodeFailure(context, state, record, failure) {
588
+ return context.repair && state.header !== undefined && !record.terminated && failure instanceof JsonlDecodeFailure;
589
+ }
590
+ function isRepairableSyntaxFailure(context, state, record, failure) {
591
+ return (context.repair &&
592
+ state.header !== undefined &&
593
+ !record.terminated &&
594
+ failure instanceof JsonlDecodeFailure &&
595
+ failure.kind === "syntax");
596
+ }
597
+ function scanJsonlRecord(context, state, record) {
598
+ state.finalRecord = record;
599
+ let line;
600
+ try {
601
+ line = decodePhysicalRecord(record);
602
+ }
603
+ catch (error) {
604
+ const failure = error instanceof Error ? error : new Error(String(error));
605
+ if (isRepairableDecodeFailure(context, state, record, failure)) {
606
+ repairTornJsonlRecord(context, record);
607
+ return "stop";
608
+ }
609
+ throw invalidJsonl(context.filePath, record, failure, context.phase);
610
+ }
611
+ if (!line.trim())
612
+ return "continue";
613
+ try {
614
+ if (!state.header) {
615
+ state.header = parseStrictHeader(record);
616
+ state.headerRecord = record;
617
+ state.entries.push(state.header);
618
+ }
619
+ else {
620
+ state.entries.push(parseStrictEntry(record, state.header.version ?? 1));
621
+ }
622
+ state.locations.push({ line: record.line, byteOffset: record.start });
623
+ return "continue";
624
+ }
625
+ catch (error) {
626
+ const failure = error instanceof Error ? error : new Error(String(error));
627
+ if (isRepairableSyntaxFailure(context, state, record, failure)) {
628
+ repairTornJsonlRecord(context, record);
629
+ return "stop";
630
+ }
631
+ throw invalidJsonl(context.filePath, record, failure, context.phase);
632
+ }
633
+ }
634
+ function requireLoadedSessionHeader(context, state) {
635
+ if (state.header && state.headerRecord)
636
+ return state.header;
637
+ const failure = new JsonlDecodeFailure("schema", "does not contain a session header");
638
+ throw new JsonlSessionError({
639
+ code: "invalid_jsonl",
640
+ reference: context.filePath,
641
+ phase: context.phase,
642
+ line: state.finalRecord?.line ?? 1,
643
+ byteOffset: state.finalRecord?.start ?? 0,
644
+ decodeKind: failure.decodeKind,
645
+ message: `Session file is not a valid grip session: ${context.filePath}`,
646
+ cause: failure,
647
+ });
648
+ }
649
+ function repairMissingFinalNewline(context, state) {
650
+ if (!context.repair || state.finalRecord?.terminated !== false || state.entries.at(-1) === undefined)
651
+ return;
652
+ const original = readFileSync(context.filePath);
653
+ if (original.length === 0 || original.at(-1) === 0x0a)
654
+ return;
655
+ const repaired = Buffer.allocUnsafe(original.length + 1);
656
+ original.copy(repaired);
657
+ repaired[original.length] = 0x0a;
658
+ publishJsonlContentAtomically(context.filePath, repaired, {
659
+ ...context.publicationOptions,
660
+ phase: "repair",
661
+ });
662
+ }
663
+ function validateLoadedSessionEntries(context, state, header) {
664
+ if ((header.version ?? 1) < 2)
665
+ return;
666
+ const validationContext = { phase: context.phase, locations: state.locations };
667
+ if (header.version === 2) {
668
+ // Version 2 has current tree fields; validate via a non-mutating header projection.
669
+ validateCurrentSessionEntries([{ ...header, version: 3 }, ...state.entries.slice(1)], context.filePath, validationContext);
670
+ return;
671
+ }
672
+ validateCurrentSessionEntries(state.entries, context.filePath, validationContext);
673
+ }
674
+ function loadJsonlSession(filePath, publicationOptions = {}, repair = true, phase = "open") {
675
+ if (!existsSync(filePath))
676
+ return [];
677
+ if (lstatSync(filePath).size === 0)
678
+ return [];
679
+ const context = { filePath, publicationOptions, repair, phase };
680
+ const state = {
681
+ entries: [],
682
+ locations: [],
683
+ header: undefined,
684
+ headerRecord: undefined,
685
+ finalRecord: undefined,
686
+ };
687
+ for (const record of readPhysicalRecords(filePath)) {
688
+ if (scanJsonlRecord(context, state, record) === "stop")
689
+ break;
690
+ }
691
+ const header = requireLoadedSessionHeader(context, state);
692
+ repairMissingFinalNewline(context, state);
693
+ validateLoadedSessionEntries(context, state, header);
694
+ jsonlEntryLocations.set(state.entries, state.locations);
695
+ return state.entries;
696
+ }
697
+ export function load(filePath, publicationOptions = {}, repair = true, phase = "open") {
698
+ try {
699
+ return loadJsonlSession(filePath, publicationOptions, repair, phase);
700
+ }
701
+ catch (error) {
702
+ if (error instanceof JsonlSessionError)
703
+ throw error;
704
+ const cause = error instanceof Error ? error : new Error(String(error));
705
+ throw jsonlStorageError(filePath, phase, `Failed to ${phase} JSONL session ${filePath}: ${cause.message}`, cause);
706
+ }
707
+ }
708
+ function getNextAppendPosition(bytes) {
709
+ let line = 1;
710
+ for (const byte of bytes) {
711
+ if (byte === 0x0a)
712
+ line++;
713
+ }
714
+ return { line, byteOffset: bytes.length };
715
+ }
716
+ function serializeJsonlEntries(entries) {
717
+ return `${entries.map((entry) => JSON.stringify(entry)).join("\n")}\n`;
718
+ }
719
+ export function append(filePath, entry) {
720
+ appendFileSync(filePath, `${JSON.stringify(entry)}\n`);
721
+ }
722
+ function isWindowsRenameSharingError(error) {
723
+ if (!(error instanceof Error) || !("code" in error))
724
+ return false;
725
+ const code = error.code;
726
+ return code === "EPERM" || code === "EACCES" || code === "EBUSY";
727
+ }
728
+ function renameWithRetry(source, destination, rename, platform) {
729
+ for (let attempt = 0; attempt < 5; attempt++) {
730
+ try {
731
+ rename(source, destination);
732
+ return;
733
+ }
734
+ catch (error) {
735
+ if (platform !== "win32" || !isWindowsRenameSharingError(error) || attempt === 4)
736
+ throw error;
737
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 10 * 2 ** attempt);
738
+ }
739
+ }
740
+ }
741
+ function assertJsonlDestinationReplaceable(filePath) {
742
+ try {
743
+ const destinationInfo = lstatSync(filePath);
744
+ if (!destinationInfo.isFile())
745
+ throw new Error(`Refusing to replace non-file session path: ${filePath}`);
746
+ }
747
+ catch (error) {
748
+ if (!(error instanceof Error) || !("code" in error) || error.code !== "ENOENT") {
749
+ throw error;
750
+ }
751
+ }
752
+ }
753
+ function allocateJsonlStagingPath(filePath) {
754
+ const parentDir = dirname(filePath);
755
+ ensureDir(parentDir);
756
+ for (let attempt = 0; attempt < 100; attempt++) {
757
+ const candidate = join(parentDir, `.${basename(filePath)}.tmp-${randomUUID()}`);
758
+ if (!existsSync(candidate))
759
+ return candidate;
760
+ }
761
+ throw new Error(`Failed to allocate staging path for session: ${filePath}`);
762
+ }
763
+ function stageJsonlContent(tempPath, filePath, content, options) {
764
+ try {
765
+ writeFileSync(tempPath, content);
766
+ }
767
+ catch (error) {
768
+ const cause = error instanceof Error ? error : new Error(String(error));
769
+ throw jsonlStorageError(filePath, options.phase ?? "replace", `Failed to stage JSONL session ${filePath}: ${cause.message}`, cause, "not_written");
770
+ }
771
+ }
772
+ function publishJsonlStagingPath(tempPath, filePath, options) {
773
+ try {
774
+ renameWithRetry(tempPath, filePath, options.rename ?? renameSync, options.platform ?? process.platform);
775
+ }
776
+ catch (error) {
777
+ const cause = error instanceof Error ? error : new Error(String(error));
778
+ throw jsonlStorageError(filePath, options.phase ?? "replace", `Failed to publish JSONL session ${filePath}: ${cause.message}`, cause, "unknown");
779
+ }
780
+ }
781
+ function removeUnpublishedJsonlStagingPath(tempPath, options) {
782
+ try {
783
+ (options.remove ?? ((path) => rmSync(path, { force: true })))(tempPath);
784
+ }
785
+ catch {
786
+ // Preserve the staging or rename failure; stale temps are undiscoverable.
787
+ }
788
+ }
789
+ function publishJsonlContentAtomicallyUnsafe(filePath, content, options = {}) {
790
+ assertJsonlDestinationReplaceable(filePath);
791
+ const tempPath = allocateJsonlStagingPath(filePath);
792
+ let published = false;
793
+ try {
794
+ stageJsonlContent(tempPath, filePath, content, options);
795
+ publishJsonlStagingPath(tempPath, filePath, options);
796
+ published = true;
797
+ }
798
+ finally {
799
+ if (!published)
800
+ removeUnpublishedJsonlStagingPath(tempPath, options);
801
+ }
802
+ }
803
+ function publishJsonlContentAtomically(filePath, content, options = {}) {
804
+ try {
805
+ publishJsonlContentAtomicallyUnsafe(filePath, content, options);
806
+ }
807
+ catch (error) {
808
+ if (error instanceof JsonlSessionError)
809
+ throw error;
810
+ const cause = error instanceof Error ? error : new Error(String(error));
811
+ throw jsonlStorageError(filePath, options.phase ?? "replace", `Failed to publish JSONL session ${filePath}: ${cause.message}`, cause, "not_written");
812
+ }
813
+ }
814
+ export function publishJsonlAtomically(filePath, entries, options = {}) {
815
+ publishJsonlContentAtomically(filePath, serializeJsonlEntries(entries), options);
816
+ }
817
+ export function rewrite(filePath, entries) {
818
+ publishJsonlAtomically(filePath, entries);
819
+ }
820
+ export function forkSession(sessionDir, header, sourceEntries) {
821
+ const reference = prepareSessionReference(sessionDir, header.id, header.timestamp);
822
+ publishJsonlAtomically(reference, [header, ...sourceEntries.filter((entry) => entry.type !== "session")], {
823
+ phase: "fork",
824
+ });
825
+ return reference;
826
+ }
827
+ export function findMostRecent(sessionDir, cwd) {
828
+ const resolvedCwd = cwd ? resolve(cwd) : undefined;
829
+ let names;
830
+ try {
831
+ names = readdirSync(sessionDir).filter((file) => file.endsWith(".jsonl"));
832
+ }
833
+ catch (error) {
834
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
835
+ return null;
836
+ throw error;
837
+ }
838
+ const files = [];
839
+ for (const name of names) {
840
+ const path = join(sessionDir, name);
841
+ try {
842
+ const header = readSessionHeaderForDiscovery(path);
843
+ if (!header)
844
+ continue;
845
+ if (resolvedCwd && !sessionCwdMatches(getSessionHeaderCwd(header), resolvedCwd))
846
+ continue;
847
+ files.push({ path, mtime: statSync(path).mtime });
848
+ }
849
+ catch {
850
+ // Quarantine a candidate that disappeared or became unreadable without hiding valid siblings.
851
+ }
852
+ }
853
+ files.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
854
+ return files[0]?.path ?? null;
855
+ }
856
+ export async function list(dir, onProgress) {
857
+ const sessions = [];
858
+ if (!existsSync(dir)) {
859
+ return sessions;
860
+ }
861
+ const dirEntries = await readdir(dir);
862
+ const files = dirEntries.filter((file) => file.endsWith(".jsonl")).map((file) => join(dir, file));
863
+ let loaded = 0;
864
+ const results = await buildSessionInfosWithConcurrency(files, () => {
865
+ loaded++;
866
+ onProgress?.(loaded, files.length);
867
+ });
868
+ for (const info of results) {
869
+ if (info)
870
+ sessions.push(info);
871
+ }
872
+ return sessions;
873
+ }
874
+ export async function listAll(sessionsDir, onProgress) {
875
+ if (!existsSync(sessionsDir))
876
+ return [];
877
+ const entries = await readdir(sessionsDir, { withFileTypes: true });
878
+ const dirs = entries.filter((entry) => entry.isDirectory()).map((entry) => join(sessionsDir, entry.name));
879
+ let totalFiles = 0;
880
+ const dirFiles = [];
881
+ for (const dir of dirs) {
882
+ const files = (await readdir(dir)).filter((file) => file.endsWith(".jsonl"));
883
+ dirFiles.push(files.map((file) => join(dir, file)));
884
+ totalFiles += files.length;
885
+ }
886
+ let loaded = 0;
887
+ const sessions = [];
888
+ const results = await buildSessionInfosWithConcurrency(dirFiles.flat(), () => {
889
+ loaded++;
890
+ onProgress?.(loaded, totalFiles);
891
+ });
892
+ for (const info of results) {
893
+ if (info)
894
+ sessions.push(info);
895
+ }
896
+ return sessions;
897
+ }
898
+ async function buildSessionInfosWithConcurrency(files, onLoaded) {
899
+ const results = new Array(files.length).fill(null);
900
+ const inFlight = new Set();
901
+ let nextIndex = 0;
902
+ const startNext = () => {
903
+ const index = nextIndex++;
904
+ const file = files[index];
905
+ if (!file)
906
+ return;
907
+ let task;
908
+ task = buildSessionInfo(file)
909
+ .then((info) => {
910
+ results[index] = info;
911
+ })
912
+ .catch(() => {
913
+ results[index] = null;
914
+ })
915
+ .finally(() => {
916
+ inFlight.delete(task);
917
+ onLoaded();
918
+ });
919
+ inFlight.add(task);
920
+ };
921
+ while (nextIndex < files.length || inFlight.size > 0) {
922
+ while (nextIndex < files.length && inFlight.size < MAX_CONCURRENT_SESSION_INFO_LOADS) {
923
+ startNext();
924
+ }
925
+ if (inFlight.size > 0) {
926
+ await Promise.race(inFlight);
927
+ }
928
+ }
929
+ return results;
930
+ }
931
+ export class SessionAlreadyExistsError extends Error {
932
+ code = "already_exists";
933
+ reference;
934
+ path;
935
+ phase;
936
+ outcome = "not_written";
937
+ constructor(reference, sessionId, phase = "create") {
938
+ super(`Session already exists: ${sessionId}`);
939
+ this.name = "SessionAlreadyExistsError";
940
+ this.reference = reference;
941
+ this.path = reference;
942
+ this.phase = phase;
943
+ }
944
+ }
945
+ function isDefinitelyNotWritten(error) {
946
+ if (!(error instanceof Error) || !("code" in error))
947
+ return false;
948
+ return new Set(["ENOENT", "EACCES", "EPERM", "EISDIR", "ENOTDIR", "EINVAL", "EROFS"]).has(String(error.code));
949
+ }
950
+ function getFirstPublicationPhase(entries) {
951
+ const header = entries[0];
952
+ return header?.type === "session" && header.parentSession ? "fork" : "create";
953
+ }
954
+ const defaultWriteOperations = {
955
+ append: appendFileSync,
956
+ publish: publishJsonlAtomically,
957
+ };
958
+ export class JsonlSessionStore extends InMemorySessionStore {
959
+ reference;
960
+ flushed = false;
961
+ preloaded;
962
+ allowExistingEmptyFile = false;
963
+ writeOperations;
964
+ firstPublicationCoordinator;
965
+ writeFence;
966
+ nextAppendLine = 1;
967
+ nextAppendOffset = 0;
968
+ constructor(preloaded, writeOperations = defaultWriteOperations, firstPublicationCoordinator) {
969
+ super();
970
+ this.preloaded = preloaded ? { ...preloaded, reference: resolve(preloaded.reference) } : undefined;
971
+ this.writeOperations = writeOperations;
972
+ this.firstPublicationCoordinator = firstPublicationCoordinator;
973
+ }
974
+ isPersisted() {
975
+ return true;
976
+ }
977
+ getSessionReference() {
978
+ return this.reference;
979
+ }
980
+ setSessionReference(reference, options = {}) {
981
+ const resolvedReference = resolve(reference);
982
+ if (this.reference !== resolvedReference) {
983
+ this.writeFence = undefined;
984
+ this.allowExistingEmptyFile = false;
985
+ }
986
+ this.reference = resolvedReference;
987
+ if (options.allowExistingEmptyFile)
988
+ this.allowExistingEmptyFile = true;
989
+ this.flushed = false;
990
+ }
991
+ exists(path) {
992
+ return exists(path);
993
+ }
994
+ ensureDir(path) {
995
+ ensureDir(path);
996
+ }
997
+ load(filePath) {
998
+ if (!exists(filePath))
999
+ return [];
1000
+ const info = lstatSync(filePath);
1001
+ this.allowExistingEmptyFile = info.isFile() && info.size === 0;
1002
+ this.flushed = true;
1003
+ const resolvedFilePath = resolve(filePath);
1004
+ if (!this.writeFence && this.preloaded?.reference === resolvedFilePath) {
1005
+ const entries = this.preloaded.entries;
1006
+ this.preloaded = undefined;
1007
+ this.updateNextAppendPosition(resolvedFilePath);
1008
+ return entries;
1009
+ }
1010
+ const entries = load(resolvedFilePath);
1011
+ this.updateNextAppendPosition(resolvedFilePath);
1012
+ this.writeFence = undefined;
1013
+ this.preloaded = undefined;
1014
+ return entries;
1015
+ }
1016
+ updateNextAppendPosition(filePath) {
1017
+ const position = getNextAppendPosition(readFileSync(filePath));
1018
+ this.nextAppendLine = position.line;
1019
+ this.nextAppendOffset = position.byteOffset;
1020
+ }
1021
+ persistAppendedEntry(reference, prospectiveEntries, serializedEntry) {
1022
+ try {
1023
+ if (this.flushed)
1024
+ this.writeOperations.append(reference, serializedEntry);
1025
+ else
1026
+ this.publishFirstSnapshot(prospectiveEntries);
1027
+ }
1028
+ catch (error) {
1029
+ if (error instanceof SessionAlreadyExistsError)
1030
+ throw error;
1031
+ const cause = error instanceof Error ? error : new Error(String(error));
1032
+ if (this.flushed && isDefinitelyNotWritten(error)) {
1033
+ throw jsonlStorageError(reference, "append", cause.message, cause, "not_written");
1034
+ }
1035
+ this.writeFence = jsonlStorageError(reference, this.flushed ? "append" : getFirstPublicationPhase(prospectiveEntries), cause.message, cause, cause instanceof JsonlSessionError ? undefined : "unknown");
1036
+ throw this.writeFence;
1037
+ }
1038
+ }
1039
+ recordAppendedEntryPosition(wasFlushed, serializedEntry, prospectiveEntries) {
1040
+ if (wasFlushed) {
1041
+ this.nextAppendLine++;
1042
+ this.nextAppendOffset += Buffer.byteLength(serializedEntry);
1043
+ return;
1044
+ }
1045
+ const position = getNextAppendPosition(new TextEncoder().encode(serializeJsonlEntries(prospectiveEntries)));
1046
+ this.nextAppendLine = position.line;
1047
+ this.nextAppendOffset = position.byteOffset;
1048
+ }
1049
+ appendEntry(entry) {
1050
+ if (!this.reference) {
1051
+ super.appendEntry(entry);
1052
+ return;
1053
+ }
1054
+ this.assertWritable();
1055
+ const prospectiveEntries = [...this.getFileEntries(), entry];
1056
+ const wasFlushed = this.flushed;
1057
+ const appendPosition = wasFlushed
1058
+ ? { line: this.nextAppendLine, byteOffset: this.nextAppendOffset }
1059
+ : getNextAppendPosition(new TextEncoder().encode(serializeJsonlEntries(this.getFileEntries())));
1060
+ const locations = [];
1061
+ locations[prospectiveEntries.length - 1] = appendPosition;
1062
+ validateCurrentSessionEntries(prospectiveEntries, this.reference, { phase: "append", locations });
1063
+ const hasAssistantMessage = prospectiveEntries.some((fileEntry) => fileEntry.type === "message" && fileEntry.message.role === "assistant");
1064
+ if (!hasAssistantMessage) {
1065
+ super.appendEntry(entry);
1066
+ this.flushed = false;
1067
+ return;
1068
+ }
1069
+ if (!this.flushed)
1070
+ serializeJsonlEntries(prospectiveEntries);
1071
+ const serializedEntry = this.flushed ? `${JSON.stringify(entry)}\n` : undefined;
1072
+ this.persistAppendedEntry(this.reference, prospectiveEntries, serializedEntry);
1073
+ super.appendEntry(entry);
1074
+ this.recordAppendedEntryPosition(wasFlushed, serializedEntry, prospectiveEntries);
1075
+ this.flushed = true;
1076
+ this.allowExistingEmptyFile = false;
1077
+ }
1078
+ assertWritable() {
1079
+ if (this.writeFence) {
1080
+ throw new JsonlSessionError({
1081
+ code: "fenced",
1082
+ reference: this.reference ?? "",
1083
+ phase: "append",
1084
+ message: `Session writes are fenced after a persistence failure: ${this.reference}`,
1085
+ outcome: "unknown",
1086
+ cause: this.writeFence,
1087
+ });
1088
+ }
1089
+ }
1090
+ publishFirstSnapshot(entries) {
1091
+ if (!this.reference)
1092
+ return;
1093
+ const phase = getFirstPublicationPhase(entries);
1094
+ const operation = () => this.writeOperations.publish(this.reference, entries, { phase });
1095
+ if (this.firstPublicationCoordinator) {
1096
+ this.firstPublicationCoordinator.publish(this.reference, entries, operation, {
1097
+ allowExistingEmptyFile: this.allowExistingEmptyFile,
1098
+ phase,
1099
+ });
1100
+ }
1101
+ else {
1102
+ operation();
1103
+ }
1104
+ }
1105
+ saveSnapshot(options = {}) {
1106
+ if (!this.reference)
1107
+ return;
1108
+ this.assertWritable();
1109
+ serializeJsonlEntries(this.getFileEntries());
1110
+ try {
1111
+ if (this.flushed) {
1112
+ this.writeOperations.publish(this.reference, this.getFileEntries(), {
1113
+ phase: options.phase ?? "replace",
1114
+ });
1115
+ }
1116
+ else
1117
+ this.publishFirstSnapshot(this.getFileEntries());
1118
+ }
1119
+ catch (error) {
1120
+ if (error instanceof SessionAlreadyExistsError)
1121
+ throw error;
1122
+ const cause = error instanceof Error ? error : new Error(String(error));
1123
+ this.writeFence = jsonlStorageError(this.reference, options.phase ?? (this.flushed ? "replace" : getFirstPublicationPhase(this.getFileEntries())), cause.message, cause, cause instanceof JsonlSessionError ? undefined : "unknown");
1124
+ throw this.writeFence;
1125
+ }
1126
+ const position = getNextAppendPosition(new TextEncoder().encode(serializeJsonlEntries(this.getFileEntries())));
1127
+ this.nextAppendLine = position.line;
1128
+ this.nextAppendOffset = position.byteOffset;
1129
+ this.flushed = true;
1130
+ this.allowExistingEmptyFile = false;
1131
+ }
1132
+ commitSnapshot() {
1133
+ if (!this.hasAssistantMessage()) {
1134
+ this.flushed = false;
1135
+ return;
1136
+ }
1137
+ this.saveSnapshot();
1138
+ }
1139
+ }
1140
+ //# sourceMappingURL=jsonl-session-store.js.map