@greppleai/grip 0.0.0-stage → 0.1.3

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 (1119) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +731 -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 +13 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/embedded-assets.d.ts +3 -0
  8. package/dist/bun/embedded-assets.d.ts.map +1 -0
  9. package/dist/bun/embedded-assets.js +52 -0
  10. package/dist/bun/embedded-assets.js.map +1 -0
  11. package/dist/bun/register-bedrock.d.ts +2 -0
  12. package/dist/bun/register-bedrock.d.ts.map +1 -0
  13. package/dist/bun/register-bedrock.js +4 -0
  14. package/dist/bun/register-bedrock.js.map +1 -0
  15. package/dist/bun/restore-sandbox-env.d.ts +13 -0
  16. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  17. package/dist/bun/restore-sandbox-env.js +32 -0
  18. package/dist/bun/restore-sandbox-env.js.map +1 -0
  19. package/dist/cli/args.d.ts +70 -0
  20. package/dist/cli/args.d.ts.map +1 -0
  21. package/dist/cli/args.js +442 -0
  22. package/dist/cli/args.js.map +1 -0
  23. package/dist/cli/config-selector.d.ts +14 -0
  24. package/dist/cli/config-selector.d.ts.map +1 -0
  25. package/dist/cli/config-selector.js +31 -0
  26. package/dist/cli/config-selector.js.map +1 -0
  27. package/dist/cli/file-processor.d.ts +15 -0
  28. package/dist/cli/file-processor.d.ts.map +1 -0
  29. package/dist/cli/file-processor.js +60 -0
  30. package/dist/cli/file-processor.js.map +1 -0
  31. package/dist/cli/initial-message.d.ts +18 -0
  32. package/dist/cli/initial-message.d.ts.map +1 -0
  33. package/dist/cli/initial-message.js +22 -0
  34. package/dist/cli/initial-message.js.map +1 -0
  35. package/dist/cli/list-models.d.ts +9 -0
  36. package/dist/cli/list-models.d.ts.map +1 -0
  37. package/dist/cli/list-models.js +98 -0
  38. package/dist/cli/list-models.js.map +1 -0
  39. package/dist/cli/session-picker.d.ts +9 -0
  40. package/dist/cli/session-picker.d.ts.map +1 -0
  41. package/dist/cli/session-picker.js +35 -0
  42. package/dist/cli/session-picker.js.map +1 -0
  43. package/dist/cli.d.ts +3 -0
  44. package/dist/cli.d.ts.map +1 -0
  45. package/dist/cli.js +14 -0
  46. package/dist/cli.js.map +1 -0
  47. package/dist/config.d.ts +82 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +406 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/core/agent-session.d.ts +970 -0
  52. package/dist/core/agent-session.d.ts.map +1 -0
  53. package/dist/core/agent-session.js +5191 -0
  54. package/dist/core/agent-session.js.map +1 -0
  55. package/dist/core/auth-guidance.d.ts +5 -0
  56. package/dist/core/auth-guidance.d.ts.map +1 -0
  57. package/dist/core/auth-guidance.js +21 -0
  58. package/dist/core/auth-guidance.js.map +1 -0
  59. package/dist/core/auth-storage.d.ts +150 -0
  60. package/dist/core/auth-storage.d.ts.map +1 -0
  61. package/dist/core/auth-storage.js +557 -0
  62. package/dist/core/auth-storage.js.map +1 -0
  63. package/dist/core/bash-executor.d.ts +26 -0
  64. package/dist/core/bash-executor.d.ts.map +1 -0
  65. package/dist/core/bash-executor.js +99 -0
  66. package/dist/core/bash-executor.js.map +1 -0
  67. package/dist/core/compaction/branch-summarization.d.ts +83 -0
  68. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  69. package/dist/core/compaction/branch-summarization.js +220 -0
  70. package/dist/core/compaction/branch-summarization.js.map +1 -0
  71. package/dist/core/compaction/compaction.d.ts +65 -0
  72. package/dist/core/compaction/compaction.d.ts.map +1 -0
  73. package/dist/core/compaction/compaction.js +550 -0
  74. package/dist/core/compaction/compaction.js.map +1 -0
  75. package/dist/core/compaction/compression-detection-ledger.d.ts +34 -0
  76. package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -0
  77. package/dist/core/compaction/compression-detection-ledger.js +52 -0
  78. package/dist/core/compaction/compression-detection-ledger.js.map +1 -0
  79. package/dist/core/compaction/compression-detector.d.ts +71 -0
  80. package/dist/core/compaction/compression-detector.d.ts.map +1 -0
  81. package/dist/core/compaction/compression-detector.js +407 -0
  82. package/dist/core/compaction/compression-detector.js.map +1 -0
  83. package/dist/core/compaction/compression-economics.d.ts +55 -0
  84. package/dist/core/compaction/compression-economics.d.ts.map +1 -0
  85. package/dist/core/compaction/compression-economics.js +151 -0
  86. package/dist/core/compaction/compression-economics.js.map +1 -0
  87. package/dist/core/compaction/utils.d.ts +28 -0
  88. package/dist/core/compaction/utils.d.ts.map +1 -0
  89. package/dist/core/compaction/utils.js +165 -0
  90. package/dist/core/compaction/utils.js.map +1 -0
  91. package/dist/core/defaults.d.ts +3 -0
  92. package/dist/core/defaults.d.ts.map +1 -0
  93. package/dist/core/defaults.js +2 -0
  94. package/dist/core/defaults.js.map +1 -0
  95. package/dist/core/diagnostics.d.ts +18 -0
  96. package/dist/core/diagnostics.d.ts.map +1 -0
  97. package/dist/core/diagnostics.js +2 -0
  98. package/dist/core/diagnostics.js.map +1 -0
  99. package/dist/core/event-bus.d.ts +9 -0
  100. package/dist/core/event-bus.d.ts.map +1 -0
  101. package/dist/core/event-bus.js +25 -0
  102. package/dist/core/event-bus.js.map +1 -0
  103. package/dist/core/exec.d.ts +29 -0
  104. package/dist/core/exec.d.ts.map +1 -0
  105. package/dist/core/exec.js +75 -0
  106. package/dist/core/exec.js.map +1 -0
  107. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  108. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  109. package/dist/core/export-html/ansi-to-html.js +245 -0
  110. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  111. package/dist/core/export-html/index.d.ts +21 -0
  112. package/dist/core/export-html/index.d.ts.map +1 -0
  113. package/dist/core/export-html/index.js +230 -0
  114. package/dist/core/export-html/index.js.map +1 -0
  115. package/dist/core/export-html/template.css +1066 -0
  116. package/dist/core/export-html/template.html +55 -0
  117. package/dist/core/export-html/template.js +1864 -0
  118. package/dist/core/export-html/tool-renderer.d.ts +32 -0
  119. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  120. package/dist/core/export-html/tool-renderer.js +108 -0
  121. package/dist/core/export-html/tool-renderer.js.map +1 -0
  122. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  123. package/dist/core/export-html/vendor/marked.min.js +78 -0
  124. package/dist/core/extensions/loader.d.ts +24 -0
  125. package/dist/core/extensions/loader.d.ts.map +1 -0
  126. package/dist/core/extensions/loader.js +613 -0
  127. package/dist/core/extensions/loader.js.map +1 -0
  128. package/dist/core/extensions/runner.d.ts +160 -0
  129. package/dist/core/extensions/runner.d.ts.map +1 -0
  130. package/dist/core/extensions/runner.js +962 -0
  131. package/dist/core/extensions/runner.js.map +1 -0
  132. package/dist/core/extensions/types.d.ts +1311 -0
  133. package/dist/core/extensions/types.d.ts.map +1 -0
  134. package/dist/core/extensions/types.js +51 -0
  135. package/dist/core/extensions/types.js.map +1 -0
  136. package/dist/core/extensions/wrapper.d.ts +20 -0
  137. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  138. package/dist/core/extensions/wrapper.js +22 -0
  139. package/dist/core/extensions/wrapper.js.map +1 -0
  140. package/dist/core/footer-data-provider.d.ts +52 -0
  141. package/dist/core/footer-data-provider.d.ts.map +1 -0
  142. package/dist/core/footer-data-provider.js +318 -0
  143. package/dist/core/footer-data-provider.js.map +1 -0
  144. package/dist/core/grip-agent.d.ts +240 -0
  145. package/dist/core/grip-agent.d.ts.map +1 -0
  146. package/dist/core/grip-agent.js +1243 -0
  147. package/dist/core/grip-agent.js.map +1 -0
  148. package/dist/core/grip-manifest.d.ts +9 -0
  149. package/dist/core/grip-manifest.d.ts.map +1 -0
  150. package/dist/core/grip-manifest.js +25 -0
  151. package/dist/core/grip-manifest.js.map +1 -0
  152. package/dist/core/hooks/aggregate.d.ts +5 -0
  153. package/dist/core/hooks/aggregate.d.ts.map +1 -0
  154. package/dist/core/hooks/aggregate.js +226 -0
  155. package/dist/core/hooks/aggregate.js.map +1 -0
  156. package/dist/core/hooks/config.d.ts +14 -0
  157. package/dist/core/hooks/config.d.ts.map +1 -0
  158. package/dist/core/hooks/config.js +372 -0
  159. package/dist/core/hooks/config.js.map +1 -0
  160. package/dist/core/hooks/executor.d.ts +12 -0
  161. package/dist/core/hooks/executor.d.ts.map +1 -0
  162. package/dist/core/hooks/executor.js +708 -0
  163. package/dist/core/hooks/executor.js.map +1 -0
  164. package/dist/core/hooks/index.d.ts +9 -0
  165. package/dist/core/hooks/index.d.ts.map +1 -0
  166. package/dist/core/hooks/index.js +14 -0
  167. package/dist/core/hooks/index.js.map +1 -0
  168. package/dist/core/hooks/matcher.d.ts +10 -0
  169. package/dist/core/hooks/matcher.d.ts.map +1 -0
  170. package/dist/core/hooks/matcher.js +70 -0
  171. package/dist/core/hooks/matcher.js.map +1 -0
  172. package/dist/core/hooks/trust-store.d.ts +38 -0
  173. package/dist/core/hooks/trust-store.d.ts.map +1 -0
  174. package/dist/core/hooks/trust-store.js +167 -0
  175. package/dist/core/hooks/trust-store.js.map +1 -0
  176. package/dist/core/hooks/types.d.ts +234 -0
  177. package/dist/core/hooks/types.d.ts.map +1 -0
  178. package/dist/core/hooks/types.js +52 -0
  179. package/dist/core/hooks/types.js.map +1 -0
  180. package/dist/core/http-dispatcher.d.ts +21 -0
  181. package/dist/core/http-dispatcher.d.ts.map +1 -0
  182. package/dist/core/http-dispatcher.js +82 -0
  183. package/dist/core/http-dispatcher.js.map +1 -0
  184. package/dist/core/instruction-resource-loader.d.ts +81 -0
  185. package/dist/core/instruction-resource-loader.d.ts.map +1 -0
  186. package/dist/core/instruction-resource-loader.js +574 -0
  187. package/dist/core/instruction-resource-loader.js.map +1 -0
  188. package/dist/core/keybindings.d.ts +399 -0
  189. package/dist/core/keybindings.d.ts.map +1 -0
  190. package/dist/core/keybindings.js +299 -0
  191. package/dist/core/keybindings.js.map +1 -0
  192. package/dist/core/lsp/abort.d.ts +3 -0
  193. package/dist/core/lsp/abort.d.ts.map +1 -0
  194. package/dist/core/lsp/abort.js +28 -0
  195. package/dist/core/lsp/abort.js.map +1 -0
  196. package/dist/core/lsp/client.d.ts +108 -0
  197. package/dist/core/lsp/client.d.ts.map +1 -0
  198. package/dist/core/lsp/client.js +586 -0
  199. package/dist/core/lsp/client.js.map +1 -0
  200. package/dist/core/lsp/config-loader.d.ts +44 -0
  201. package/dist/core/lsp/config-loader.d.ts.map +1 -0
  202. package/dist/core/lsp/config-loader.js +223 -0
  203. package/dist/core/lsp/config-loader.js.map +1 -0
  204. package/dist/core/lsp/config.d.ts +134 -0
  205. package/dist/core/lsp/config.d.ts.map +1 -0
  206. package/dist/core/lsp/config.js +682 -0
  207. package/dist/core/lsp/config.js.map +1 -0
  208. package/dist/core/lsp/diagnostics.d.ts +18 -0
  209. package/dist/core/lsp/diagnostics.d.ts.map +1 -0
  210. package/dist/core/lsp/diagnostics.js +311 -0
  211. package/dist/core/lsp/diagnostics.js.map +1 -0
  212. package/dist/core/lsp/file-sync.d.ts +58 -0
  213. package/dist/core/lsp/file-sync.d.ts.map +1 -0
  214. package/dist/core/lsp/file-sync.js +432 -0
  215. package/dist/core/lsp/file-sync.js.map +1 -0
  216. package/dist/core/lsp/integration.d.ts +62 -0
  217. package/dist/core/lsp/integration.d.ts.map +1 -0
  218. package/dist/core/lsp/integration.js +145 -0
  219. package/dist/core/lsp/integration.js.map +1 -0
  220. package/dist/core/lsp/language-map.d.ts +54 -0
  221. package/dist/core/lsp/language-map.d.ts.map +1 -0
  222. package/dist/core/lsp/language-map.js +300 -0
  223. package/dist/core/lsp/language-map.js.map +1 -0
  224. package/dist/core/lsp/manager.d.ts +120 -0
  225. package/dist/core/lsp/manager.d.ts.map +1 -0
  226. package/dist/core/lsp/manager.js +636 -0
  227. package/dist/core/lsp/manager.js.map +1 -0
  228. package/dist/core/lsp/navigation.d.ts +32 -0
  229. package/dist/core/lsp/navigation.d.ts.map +1 -0
  230. package/dist/core/lsp/navigation.js +327 -0
  231. package/dist/core/lsp/navigation.js.map +1 -0
  232. package/dist/core/lsp/portable-path.d.ts +18 -0
  233. package/dist/core/lsp/portable-path.d.ts.map +1 -0
  234. package/dist/core/lsp/portable-path.js +83 -0
  235. package/dist/core/lsp/portable-path.js.map +1 -0
  236. package/dist/core/lsp/refactor.d.ts +32 -0
  237. package/dist/core/lsp/refactor.d.ts.map +1 -0
  238. package/dist/core/lsp/refactor.js +519 -0
  239. package/dist/core/lsp/refactor.js.map +1 -0
  240. package/dist/core/lsp/transport.d.ts +39 -0
  241. package/dist/core/lsp/transport.d.ts.map +1 -0
  242. package/dist/core/lsp/transport.js +261 -0
  243. package/dist/core/lsp/transport.js.map +1 -0
  244. package/dist/core/messages.d.ts +34 -0
  245. package/dist/core/messages.d.ts.map +1 -0
  246. package/dist/core/messages.js +140 -0
  247. package/dist/core/messages.js.map +1 -0
  248. package/dist/core/model-registry.d.ts +148 -0
  249. package/dist/core/model-registry.d.ts.map +1 -0
  250. package/dist/core/model-registry.js +812 -0
  251. package/dist/core/model-registry.js.map +1 -0
  252. package/dist/core/model-resolver.d.ts +115 -0
  253. package/dist/core/model-resolver.d.ts.map +1 -0
  254. package/dist/core/model-resolver.js +498 -0
  255. package/dist/core/model-resolver.js.map +1 -0
  256. package/dist/core/output-guard.d.ts +7 -0
  257. package/dist/core/output-guard.d.ts.map +1 -0
  258. package/dist/core/output-guard.js +89 -0
  259. package/dist/core/output-guard.js.map +1 -0
  260. package/dist/core/package-manager.d.ts +209 -0
  261. package/dist/core/package-manager.d.ts.map +1 -0
  262. package/dist/core/package-manager.js +2341 -0
  263. package/dist/core/package-manager.js.map +1 -0
  264. package/dist/core/prompt-templates.d.ts +57 -0
  265. package/dist/core/prompt-templates.d.ts.map +1 -0
  266. package/dist/core/prompt-templates.js +353 -0
  267. package/dist/core/prompt-templates.js.map +1 -0
  268. package/dist/core/provider-display-names.d.ts +2 -0
  269. package/dist/core/provider-display-names.d.ts.map +1 -0
  270. package/dist/core/provider-display-names.js +33 -0
  271. package/dist/core/provider-display-names.js.map +1 -0
  272. package/dist/core/remote-workspace-protocol/contract.d.ts +465 -0
  273. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -0
  274. package/dist/core/remote-workspace-protocol/contract.js +825 -0
  275. package/dist/core/remote-workspace-protocol/contract.js.map +1 -0
  276. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts +16 -0
  277. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -0
  278. package/dist/core/remote-workspace-protocol/guest-shared-client.js +54 -0
  279. package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -0
  280. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts +23 -0
  281. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -0
  282. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +112 -0
  283. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -0
  284. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts +30 -0
  285. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -0
  286. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +243 -0
  287. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -0
  288. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts +3 -0
  289. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -0
  290. package/dist/core/remote-workspace-protocol/lima-owner-directory.js +31 -0
  291. package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -0
  292. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts +9 -0
  293. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -0
  294. package/dist/core/remote-workspace-protocol/lima-owner-lock.js +89 -0
  295. package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -0
  296. package/dist/core/remote-workspace-protocol/session.d.ts +249 -0
  297. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -0
  298. package/dist/core/remote-workspace-protocol/session.js +1842 -0
  299. package/dist/core/remote-workspace-protocol/session.js.map +1 -0
  300. package/dist/core/remote-workspace-protocol/shared-transport.d.ts +71 -0
  301. package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -0
  302. package/dist/core/remote-workspace-protocol/shared-transport.js +68 -0
  303. package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -0
  304. package/dist/core/resolve-config-value.d.ts +32 -0
  305. package/dist/core/resolve-config-value.d.ts.map +1 -0
  306. package/dist/core/resolve-config-value.js +257 -0
  307. package/dist/core/resolve-config-value.js.map +1 -0
  308. package/dist/core/resource-loader.d.ts +200 -0
  309. package/dist/core/resource-loader.d.ts.map +1 -0
  310. package/dist/core/resource-loader.js +1209 -0
  311. package/dist/core/resource-loader.js.map +1 -0
  312. package/dist/core/rules.d.ts +40 -0
  313. package/dist/core/rules.d.ts.map +1 -0
  314. package/dist/core/rules.js +57 -0
  315. package/dist/core/rules.js.map +1 -0
  316. package/dist/core/sandbox/command.d.ts +25 -0
  317. package/dist/core/sandbox/command.d.ts.map +1 -0
  318. package/dist/core/sandbox/command.js +102 -0
  319. package/dist/core/sandbox/command.js.map +1 -0
  320. package/dist/core/sandbox/config.d.ts +91 -0
  321. package/dist/core/sandbox/config.d.ts.map +1 -0
  322. package/dist/core/sandbox/config.js +88 -0
  323. package/dist/core/sandbox/config.js.map +1 -0
  324. package/dist/core/sandbox/lima-guest-binary.d.ts +11 -0
  325. package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -0
  326. package/dist/core/sandbox/lima-guest-binary.js +140 -0
  327. package/dist/core/sandbox/lima-guest-binary.js.map +1 -0
  328. package/dist/core/sandbox/lima.d.ts +57 -0
  329. package/dist/core/sandbox/lima.d.ts.map +1 -0
  330. package/dist/core/sandbox/lima.js +716 -0
  331. package/dist/core/sandbox/lima.js.map +1 -0
  332. package/dist/core/sandbox/shared-lima-roots.d.ts +11 -0
  333. package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -0
  334. package/dist/core/sandbox/shared-lima-roots.js +25 -0
  335. package/dist/core/sandbox/shared-lima-roots.js.map +1 -0
  336. package/dist/core/sandbox/update-shared-guest-binary.d.ts +8 -0
  337. package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -0
  338. package/dist/core/sandbox/update-shared-guest-binary.js +100 -0
  339. package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -0
  340. package/dist/core/session/constants.d.ts +2 -0
  341. package/dist/core/session/constants.d.ts.map +1 -0
  342. package/dist/core/session/constants.js +2 -0
  343. package/dist/core/session/constants.js.map +1 -0
  344. package/dist/core/session/context-metadata.d.ts +5 -0
  345. package/dist/core/session/context-metadata.d.ts.map +1 -0
  346. package/dist/core/session/context-metadata.js +55 -0
  347. package/dist/core/session/context-metadata.js.map +1 -0
  348. package/dist/core/session/context.d.ts +14 -0
  349. package/dist/core/session/context.d.ts.map +1 -0
  350. package/dist/core/session/context.js +117 -0
  351. package/dist/core/session/context.js.map +1 -0
  352. package/dist/core/session/ids.d.ts +9 -0
  353. package/dist/core/session/ids.d.ts.map +1 -0
  354. package/dist/core/session/ids.js +21 -0
  355. package/dist/core/session/ids.js.map +1 -0
  356. package/dist/core/session/in-memory-session-manager.d.ts +17 -0
  357. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -0
  358. package/dist/core/session/in-memory-session-manager.js +40 -0
  359. package/dist/core/session/in-memory-session-manager.js.map +1 -0
  360. package/dist/core/session/in-memory-session.d.ts +7 -0
  361. package/dist/core/session/in-memory-session.d.ts.map +1 -0
  362. package/dist/core/session/in-memory-session.js +11 -0
  363. package/dist/core/session/in-memory-session.js.map +1 -0
  364. package/dist/core/session/jsonl-errors.d.ts +36 -0
  365. package/dist/core/session/jsonl-errors.d.ts.map +1 -0
  366. package/dist/core/session/jsonl-errors.js +49 -0
  367. package/dist/core/session/jsonl-errors.js.map +1 -0
  368. package/dist/core/session/jsonl-helpers.d.ts +20 -0
  369. package/dist/core/session/jsonl-helpers.d.ts.map +1 -0
  370. package/dist/core/session/jsonl-helpers.js +21 -0
  371. package/dist/core/session/jsonl-helpers.js.map +1 -0
  372. package/dist/core/session/local-session-manager.d.ts +30 -0
  373. package/dist/core/session/local-session-manager.d.ts.map +1 -0
  374. package/dist/core/session/local-session-manager.js +205 -0
  375. package/dist/core/session/local-session-manager.js.map +1 -0
  376. package/dist/core/session/local-session.d.ts +9 -0
  377. package/dist/core/session/local-session.d.ts.map +1 -0
  378. package/dist/core/session/local-session.js +15 -0
  379. package/dist/core/session/local-session.js.map +1 -0
  380. package/dist/core/session/migrations.d.ts +11 -0
  381. package/dist/core/session/migrations.d.ts.map +1 -0
  382. package/dist/core/session/migrations.js +78 -0
  383. package/dist/core/session/migrations.js.map +1 -0
  384. package/dist/core/session/remote-session-client.d.ts +83 -0
  385. package/dist/core/session/remote-session-client.d.ts.map +1 -0
  386. package/dist/core/session/remote-session-client.js +224 -0
  387. package/dist/core/session/remote-session-client.js.map +1 -0
  388. package/dist/core/session/remote-session-manager.d.ts +32 -0
  389. package/dist/core/session/remote-session-manager.d.ts.map +1 -0
  390. package/dist/core/session/remote-session-manager.js +124 -0
  391. package/dist/core/session/remote-session-manager.js.map +1 -0
  392. package/dist/core/session/remote-session.d.ts +20 -0
  393. package/dist/core/session/remote-session.d.ts.map +1 -0
  394. package/dist/core/session/remote-session.js +33 -0
  395. package/dist/core/session/remote-session.js.map +1 -0
  396. package/dist/core/session/session-manager.d.ts +18 -0
  397. package/dist/core/session/session-manager.d.ts.map +1 -0
  398. package/dist/core/session/session-manager.js +2 -0
  399. package/dist/core/session/session-manager.js.map +1 -0
  400. package/dist/core/session/session.d.ts +140 -0
  401. package/dist/core/session/session.d.ts.map +1 -0
  402. package/dist/core/session/session.js +461 -0
  403. package/dist/core/session/session.js.map +1 -0
  404. package/dist/core/session/stores/in-memory-session-store.d.ts +39 -0
  405. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -0
  406. package/dist/core/session/stores/in-memory-session-store.js +168 -0
  407. package/dist/core/session/stores/in-memory-session-store.js.map +1 -0
  408. package/dist/core/session/stores/jsonl-session-store.d.ts +97 -0
  409. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -0
  410. package/dist/core/session/stores/jsonl-session-store.js +1140 -0
  411. package/dist/core/session/stores/jsonl-session-store.js.map +1 -0
  412. package/dist/core/session/stores/remote-session-store.d.ts +44 -0
  413. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -0
  414. package/dist/core/session/stores/remote-session-store.js +159 -0
  415. package/dist/core/session/stores/remote-session-store.js.map +1 -0
  416. package/dist/core/session/stores/session-store.d.ts +42 -0
  417. package/dist/core/session/stores/session-store.d.ts.map +1 -0
  418. package/dist/core/session/stores/session-store.js +2 -0
  419. package/dist/core/session/stores/session-store.js.map +1 -0
  420. package/dist/core/session/types.d.ts +141 -0
  421. package/dist/core/session/types.d.ts.map +1 -0
  422. package/dist/core/session/types.js +2 -0
  423. package/dist/core/session/types.js.map +1 -0
  424. package/dist/core/session/usage-ledger.d.ts +18 -0
  425. package/dist/core/session/usage-ledger.d.ts.map +1 -0
  426. package/dist/core/session/usage-ledger.js +68 -0
  427. package/dist/core/session/usage-ledger.js.map +1 -0
  428. package/dist/core/session-cwd.d.ts +19 -0
  429. package/dist/core/session-cwd.d.ts.map +1 -0
  430. package/dist/core/session-cwd.js +38 -0
  431. package/dist/core/session-cwd.js.map +1 -0
  432. package/dist/core/settings-manager.d.ts +314 -0
  433. package/dist/core/settings-manager.d.ts.map +1 -0
  434. package/dist/core/settings-manager.js +991 -0
  435. package/dist/core/settings-manager.js.map +1 -0
  436. package/dist/core/skills.d.ts +40 -0
  437. package/dist/core/skills.d.ts.map +1 -0
  438. package/dist/core/skills.js +57 -0
  439. package/dist/core/skills.js.map +1 -0
  440. package/dist/core/slash-commands.d.ts +15 -0
  441. package/dist/core/slash-commands.d.ts.map +1 -0
  442. package/dist/core/slash-commands.js +36 -0
  443. package/dist/core/slash-commands.js.map +1 -0
  444. package/dist/core/source-info.d.ts +26 -0
  445. package/dist/core/source-info.d.ts.map +1 -0
  446. package/dist/core/source-info.js +27 -0
  447. package/dist/core/source-info.js.map +1 -0
  448. package/dist/core/system-prompt.d.ts +32 -0
  449. package/dist/core/system-prompt.d.ts.map +1 -0
  450. package/dist/core/system-prompt.js +131 -0
  451. package/dist/core/system-prompt.js.map +1 -0
  452. package/dist/core/telemetry.d.ts +3 -0
  453. package/dist/core/telemetry.d.ts.map +1 -0
  454. package/dist/core/telemetry.js +9 -0
  455. package/dist/core/telemetry.js.map +1 -0
  456. package/dist/core/timings.d.ts +10 -0
  457. package/dist/core/timings.d.ts.map +1 -0
  458. package/dist/core/timings.js +41 -0
  459. package/dist/core/timings.js.map +1 -0
  460. package/dist/core/tools/bash.d.ts +51 -0
  461. package/dist/core/tools/bash.d.ts.map +1 -0
  462. package/dist/core/tools/bash.js +321 -0
  463. package/dist/core/tools/bash.js.map +1 -0
  464. package/dist/core/tools/compress-context.d.ts +27 -0
  465. package/dist/core/tools/compress-context.d.ts.map +1 -0
  466. package/dist/core/tools/compress-context.js +142 -0
  467. package/dist/core/tools/compress-context.js.map +1 -0
  468. package/dist/core/tools/edit-diff.d.ts +82 -0
  469. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  470. package/dist/core/tools/edit-diff.js +327 -0
  471. package/dist/core/tools/edit-diff.js.map +1 -0
  472. package/dist/core/tools/edit.d.ts +50 -0
  473. package/dist/core/tools/edit.d.ts.map +1 -0
  474. package/dist/core/tools/edit.js +324 -0
  475. package/dist/core/tools/edit.js.map +1 -0
  476. package/dist/core/tools/file-mutation-queue.d.ts +8 -0
  477. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  478. package/dist/core/tools/file-mutation-queue.js +69 -0
  479. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  480. package/dist/core/tools/find.d.ts +22 -0
  481. package/dist/core/tools/find.d.ts.map +1 -0
  482. package/dist/core/tools/find.js +268 -0
  483. package/dist/core/tools/find.js.map +1 -0
  484. package/dist/core/tools/grep.d.ts +27 -0
  485. package/dist/core/tools/grep.d.ts.map +1 -0
  486. package/dist/core/tools/grep.js +332 -0
  487. package/dist/core/tools/grep.js.map +1 -0
  488. package/dist/core/tools/hash-store.d.ts +12 -0
  489. package/dist/core/tools/hash-store.d.ts.map +1 -0
  490. package/dist/core/tools/hash-store.js +48 -0
  491. package/dist/core/tools/hash-store.js.map +1 -0
  492. package/dist/core/tools/hashline/apply.d.ts +40 -0
  493. package/dist/core/tools/hashline/apply.d.ts.map +1 -0
  494. package/dist/core/tools/hashline/apply.js +261 -0
  495. package/dist/core/tools/hashline/apply.js.map +1 -0
  496. package/dist/core/tools/hashline/hash.d.ts +56 -0
  497. package/dist/core/tools/hashline/hash.d.ts.map +1 -0
  498. package/dist/core/tools/hashline/hash.js +196 -0
  499. package/dist/core/tools/hashline/hash.js.map +1 -0
  500. package/dist/core/tools/hashline/parse.d.ts +8 -0
  501. package/dist/core/tools/hashline/parse.d.ts.map +1 -0
  502. package/dist/core/tools/hashline/parse.js +41 -0
  503. package/dist/core/tools/hashline/parse.js.map +1 -0
  504. package/dist/core/tools/hashline/resolve.d.ts +51 -0
  505. package/dist/core/tools/hashline/resolve.d.ts.map +1 -0
  506. package/dist/core/tools/hashline/resolve.js +187 -0
  507. package/dist/core/tools/hashline/resolve.js.map +1 -0
  508. package/dist/core/tools/hashline-utils.d.ts +6 -0
  509. package/dist/core/tools/hashline-utils.d.ts.map +1 -0
  510. package/dist/core/tools/hashline-utils.js +23 -0
  511. package/dist/core/tools/hashline-utils.js.map +1 -0
  512. package/dist/core/tools/index.d.ts +36 -0
  513. package/dist/core/tools/index.d.ts.map +1 -0
  514. package/dist/core/tools/index.js +141 -0
  515. package/dist/core/tools/index.js.map +1 -0
  516. package/dist/core/tools/ls.d.ts +21 -0
  517. package/dist/core/tools/ls.d.ts.map +1 -0
  518. package/dist/core/tools/ls.js +156 -0
  519. package/dist/core/tools/ls.js.map +1 -0
  520. package/dist/core/tools/operations.d.ts +212 -0
  521. package/dist/core/tools/operations.d.ts.map +1 -0
  522. package/dist/core/tools/operations.js +793 -0
  523. package/dist/core/tools/operations.js.map +1 -0
  524. package/dist/core/tools/output-accumulator.d.ts +54 -0
  525. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  526. package/dist/core/tools/output-accumulator.js +184 -0
  527. package/dist/core/tools/output-accumulator.js.map +1 -0
  528. package/dist/core/tools/path-utils.d.ts +9 -0
  529. package/dist/core/tools/path-utils.d.ts.map +1 -0
  530. package/dist/core/tools/path-utils.js +99 -0
  531. package/dist/core/tools/path-utils.js.map +1 -0
  532. package/dist/core/tools/read.d.ts +32 -0
  533. package/dist/core/tools/read.d.ts.map +1 -0
  534. package/dist/core/tools/read.js +318 -0
  535. package/dist/core/tools/read.js.map +1 -0
  536. package/dist/core/tools/render-utils.d.ts +33 -0
  537. package/dist/core/tools/render-utils.d.ts.map +1 -0
  538. package/dist/core/tools/render-utils.js +61 -0
  539. package/dist/core/tools/render-utils.js.map +1 -0
  540. package/dist/core/tools/replace-diff.d.ts +16 -0
  541. package/dist/core/tools/replace-diff.d.ts.map +1 -0
  542. package/dist/core/tools/replace-diff.js +117 -0
  543. package/dist/core/tools/replace-diff.js.map +1 -0
  544. package/dist/core/tools/replace-normalize.d.ts +2 -0
  545. package/dist/core/tools/replace-normalize.d.ts.map +1 -0
  546. package/dist/core/tools/replace-normalize.js +73 -0
  547. package/dist/core/tools/replace-normalize.js.map +1 -0
  548. package/dist/core/tools/replace-render.d.ts +51 -0
  549. package/dist/core/tools/replace-render.d.ts.map +1 -0
  550. package/dist/core/tools/replace-render.js +162 -0
  551. package/dist/core/tools/replace-render.js.map +1 -0
  552. package/dist/core/tools/runtime.d.ts +2 -0
  553. package/dist/core/tools/runtime.d.ts.map +1 -0
  554. package/dist/core/tools/runtime.js +6 -0
  555. package/dist/core/tools/runtime.js.map +1 -0
  556. package/dist/core/tools/session-history.d.ts +55 -0
  557. package/dist/core/tools/session-history.d.ts.map +1 -0
  558. package/dist/core/tools/session-history.js +649 -0
  559. package/dist/core/tools/session-history.js.map +1 -0
  560. package/dist/core/tools/subagent-agents.d.ts +29 -0
  561. package/dist/core/tools/subagent-agents.d.ts.map +1 -0
  562. package/dist/core/tools/subagent-agents.js +223 -0
  563. package/dist/core/tools/subagent-agents.js.map +1 -0
  564. package/dist/core/tools/subagent.d.ts +185 -0
  565. package/dist/core/tools/subagent.d.ts.map +1 -0
  566. package/dist/core/tools/subagent.js +1309 -0
  567. package/dist/core/tools/subagent.js.map +1 -0
  568. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  569. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  570. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  571. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  572. package/dist/core/tools/truncate.d.ts +39 -0
  573. package/dist/core/tools/truncate.d.ts.map +1 -0
  574. package/dist/core/tools/truncate.js +215 -0
  575. package/dist/core/tools/truncate.js.map +1 -0
  576. package/dist/core/tools/websearch.d.ts +33 -0
  577. package/dist/core/tools/websearch.d.ts.map +1 -0
  578. package/dist/core/tools/websearch.js +341 -0
  579. package/dist/core/tools/websearch.js.map +1 -0
  580. package/dist/core/tools/workspace-tool-host.d.ts +102 -0
  581. package/dist/core/tools/workspace-tool-host.d.ts.map +1 -0
  582. package/dist/core/tools/workspace-tool-host.js +348 -0
  583. package/dist/core/tools/workspace-tool-host.js.map +1 -0
  584. package/dist/core/tools/write.d.ts +16 -0
  585. package/dist/core/tools/write.d.ts.map +1 -0
  586. package/dist/core/tools/write.js +204 -0
  587. package/dist/core/tools/write.js.map +1 -0
  588. package/dist/core/workspace-identity.d.ts +7 -0
  589. package/dist/core/workspace-identity.d.ts.map +1 -0
  590. package/dist/core/workspace-identity.js +2 -0
  591. package/dist/core/workspace-identity.js.map +1 -0
  592. package/dist/daemon/activity-budget.d.ts +10 -0
  593. package/dist/daemon/activity-budget.d.ts.map +1 -0
  594. package/dist/daemon/activity-budget.js +34 -0
  595. package/dist/daemon/activity-budget.js.map +1 -0
  596. package/dist/daemon/command.d.ts +6 -0
  597. package/dist/daemon/command.d.ts.map +1 -0
  598. package/dist/daemon/command.js +58 -0
  599. package/dist/daemon/command.js.map +1 -0
  600. package/dist/daemon/config.d.ts +45 -0
  601. package/dist/daemon/config.d.ts.map +1 -0
  602. package/dist/daemon/config.js +319 -0
  603. package/dist/daemon/config.js.map +1 -0
  604. package/dist/daemon/help.d.ts +2 -0
  605. package/dist/daemon/help.d.ts.map +1 -0
  606. package/dist/daemon/help.js +42 -0
  607. package/dist/daemon/help.js.map +1 -0
  608. package/dist/daemon/lsp-config.d.ts +4 -0
  609. package/dist/daemon/lsp-config.d.ts.map +1 -0
  610. package/dist/daemon/lsp-config.js +155 -0
  611. package/dist/daemon/lsp-config.js.map +1 -0
  612. package/dist/daemon/outbound-budget.d.ts +10 -0
  613. package/dist/daemon/outbound-budget.d.ts.map +1 -0
  614. package/dist/daemon/outbound-budget.js +30 -0
  615. package/dist/daemon/outbound-budget.js.map +1 -0
  616. package/dist/daemon/security.d.ts +19 -0
  617. package/dist/daemon/security.d.ts.map +1 -0
  618. package/dist/daemon/security.js +177 -0
  619. package/dist/daemon/security.js.map +1 -0
  620. package/dist/daemon/server.d.ts +20 -0
  621. package/dist/daemon/server.d.ts.map +1 -0
  622. package/dist/daemon/server.js +480 -0
  623. package/dist/daemon/server.js.map +1 -0
  624. package/dist/daemon/shared-connection.d.ts +33 -0
  625. package/dist/daemon/shared-connection.d.ts.map +1 -0
  626. package/dist/daemon/shared-connection.js +271 -0
  627. package/dist/daemon/shared-connection.js.map +1 -0
  628. package/dist/daemon/shared-revision.d.ts +5 -0
  629. package/dist/daemon/shared-revision.d.ts.map +1 -0
  630. package/dist/daemon/shared-revision.js +61 -0
  631. package/dist/daemon/shared-revision.js.map +1 -0
  632. package/dist/daemon/shared-roots.d.ts +9 -0
  633. package/dist/daemon/shared-roots.d.ts.map +1 -0
  634. package/dist/daemon/shared-roots.js +33 -0
  635. package/dist/daemon/shared-roots.js.map +1 -0
  636. package/dist/daemon/workspace-runtime.d.ts +46 -0
  637. package/dist/daemon/workspace-runtime.d.ts.map +1 -0
  638. package/dist/daemon/workspace-runtime.js +705 -0
  639. package/dist/daemon/workspace-runtime.js.map +1 -0
  640. package/dist/index.d.ts +109 -0
  641. package/dist/index.d.ts.map +1 -0
  642. package/dist/index.js +107 -0
  643. package/dist/index.js.map +1 -0
  644. package/dist/main.d.ts +39 -0
  645. package/dist/main.d.ts.map +1 -0
  646. package/dist/main.js +765 -0
  647. package/dist/main.js.map +1 -0
  648. package/dist/migrations.d.ts +35 -0
  649. package/dist/migrations.d.ts.map +1 -0
  650. package/dist/migrations.js +412 -0
  651. package/dist/migrations.js.map +1 -0
  652. package/dist/modes/interactive/components/assistant-message.d.ts +30 -0
  653. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  654. package/dist/modes/interactive/components/assistant-message.js +159 -0
  655. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  656. package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
  657. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  658. package/dist/modes/interactive/components/bash-execution.js +173 -0
  659. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  660. package/dist/modes/interactive/components/bordered-loader.d.ts +18 -0
  661. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  662. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  663. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  664. package/dist/modes/interactive/components/branch-summary-message.d.ts +17 -0
  665. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  666. package/dist/modes/interactive/components/branch-summary-message.js +45 -0
  667. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  668. package/dist/modes/interactive/components/compaction-summary-message.d.ts +17 -0
  669. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  670. package/dist/modes/interactive/components/compaction-summary-message.js +46 -0
  671. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  672. package/dist/modes/interactive/components/config-selector.d.ts +74 -0
  673. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  674. package/dist/modes/interactive/components/config-selector.js +514 -0
  675. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  676. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  677. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  678. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  679. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  680. package/dist/modes/interactive/components/custom-editor.d.ts +25 -0
  681. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  682. package/dist/modes/interactive/components/custom-editor.js +85 -0
  683. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  684. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  685. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  686. package/dist/modes/interactive/components/custom-message.js +81 -0
  687. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  688. package/dist/modes/interactive/components/diff.d.ts +12 -0
  689. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  690. package/dist/modes/interactive/components/diff.js +118 -0
  691. package/dist/modes/interactive/components/diff.js.map +1 -0
  692. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  693. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  694. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  695. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  696. package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  697. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  698. package/dist/modes/interactive/components/extension-editor.js +128 -0
  699. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  700. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  701. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  702. package/dist/modes/interactive/components/extension-input.js +61 -0
  703. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  704. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  705. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  706. package/dist/modes/interactive/components/extension-selector.js +83 -0
  707. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  708. package/dist/modes/interactive/components/footer.d.ts +36 -0
  709. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  710. package/dist/modes/interactive/components/footer.js +227 -0
  711. package/dist/modes/interactive/components/footer.js.map +1 -0
  712. package/dist/modes/interactive/components/hook-execution.d.ts +19 -0
  713. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -0
  714. package/dist/modes/interactive/components/hook-execution.js +185 -0
  715. package/dist/modes/interactive/components/hook-execution.js.map +1 -0
  716. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  717. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  718. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  719. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  720. package/dist/modes/interactive/components/login-dialog.d.ts +55 -0
  721. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  722. package/dist/modes/interactive/components/login-dialog.js +176 -0
  723. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  724. package/dist/modes/interactive/components/markdown-transform.d.ts +4 -0
  725. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  726. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  727. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  728. package/dist/modes/interactive/components/mermaid.d.ts +14 -0
  729. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  730. package/dist/modes/interactive/components/mermaid.js +228 -0
  731. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  732. package/dist/modes/interactive/components/message-card.d.ts +9 -0
  733. package/dist/modes/interactive/components/message-card.d.ts.map +1 -0
  734. package/dist/modes/interactive/components/message-card.js +24 -0
  735. package/dist/modes/interactive/components/message-card.js.map +1 -0
  736. package/dist/modes/interactive/components/model-selector.d.ts +52 -0
  737. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  738. package/dist/modes/interactive/components/model-selector.js +296 -0
  739. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  740. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  741. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  742. package/dist/modes/interactive/components/oauth-selector.js +165 -0
  743. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  744. package/dist/modes/interactive/components/scoped-models-selector.d.ts +50 -0
  745. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  746. package/dist/modes/interactive/components/scoped-models-selector.js +300 -0
  747. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  748. package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
  749. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  750. package/dist/modes/interactive/components/session-selector-search.js +144 -0
  751. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  752. package/dist/modes/interactive/components/session-selector.d.ts +108 -0
  753. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  754. package/dist/modes/interactive/components/session-selector.js +835 -0
  755. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  756. package/dist/modes/interactive/components/settings-selector.d.ts +81 -0
  757. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  758. package/dist/modes/interactive/components/settings-selector.js +455 -0
  759. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  760. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  761. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  762. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  763. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  764. package/dist/modes/interactive/components/skill-invocation-message.d.ts +18 -0
  765. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  766. package/dist/modes/interactive/components/skill-invocation-message.js +48 -0
  767. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  768. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  769. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  770. package/dist/modes/interactive/components/theme-selector.js +50 -0
  771. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  772. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  773. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  774. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  775. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  776. package/dist/modes/interactive/components/tool-execution.d.ts +67 -0
  777. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  778. package/dist/modes/interactive/components/tool-execution.js +312 -0
  779. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  780. package/dist/modes/interactive/components/tree-selector.d.ts +127 -0
  781. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  782. package/dist/modes/interactive/components/tree-selector.js +1098 -0
  783. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  784. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  785. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  786. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  787. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  788. package/dist/modes/interactive/components/user-message.d.ts +16 -0
  789. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  790. package/dist/modes/interactive/components/user-message.js +50 -0
  791. package/dist/modes/interactive/components/user-message.js.map +1 -0
  792. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  793. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  794. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  795. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  796. package/dist/modes/interactive/interactive-mode.d.ts +554 -0
  797. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  798. package/dist/modes/interactive/interactive-mode.js +5870 -0
  799. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  800. package/dist/modes/interactive/theme/dark.json +86 -0
  801. package/dist/modes/interactive/theme/light.json +85 -0
  802. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  803. package/dist/modes/interactive/theme/theme.d.ts +109 -0
  804. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  805. package/dist/modes/interactive/theme/theme.js +1040 -0
  806. package/dist/modes/interactive/theme/theme.js.map +1 -0
  807. package/dist/modes/json-event.d.ts +28 -0
  808. package/dist/modes/json-event.d.ts.map +1 -0
  809. package/dist/modes/json-event.js +12 -0
  810. package/dist/modes/json-event.js.map +1 -0
  811. package/dist/modes/print-mode.d.ts +29 -0
  812. package/dist/modes/print-mode.d.ts.map +1 -0
  813. package/dist/modes/print-mode.js +142 -0
  814. package/dist/modes/print-mode.js.map +1 -0
  815. package/dist/modes/rpc/jsonl.d.ts +17 -0
  816. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  817. package/dist/modes/rpc/jsonl.js +49 -0
  818. package/dist/modes/rpc/jsonl.js.map +1 -0
  819. package/dist/modes/rpc/rpc-client.d.ts +321 -0
  820. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  821. package/dist/modes/rpc/rpc-client.js +755 -0
  822. package/dist/modes/rpc/rpc-client.js.map +1 -0
  823. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  824. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  825. package/dist/modes/rpc/rpc-mode.js +963 -0
  826. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  827. package/dist/modes/rpc/rpc-types.d.ts +652 -0
  828. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  829. package/dist/modes/rpc/rpc-types.js +8 -0
  830. package/dist/modes/rpc/rpc-types.js.map +1 -0
  831. package/dist/package-manager-cli.d.ts +4 -0
  832. package/dist/package-manager-cli.d.ts.map +1 -0
  833. package/dist/package-manager-cli.js +488 -0
  834. package/dist/package-manager-cli.js.map +1 -0
  835. package/dist/utils/ansi.d.ts +2 -0
  836. package/dist/utils/ansi.d.ts.map +1 -0
  837. package/dist/utils/ansi.js +25 -0
  838. package/dist/utils/ansi.js.map +1 -0
  839. package/dist/utils/changelog.d.ts +23 -0
  840. package/dist/utils/changelog.d.ts.map +1 -0
  841. package/dist/utils/changelog.js +74 -0
  842. package/dist/utils/changelog.js.map +1 -0
  843. package/dist/utils/child-process.d.ts +15 -0
  844. package/dist/utils/child-process.d.ts.map +1 -0
  845. package/dist/utils/child-process.js +88 -0
  846. package/dist/utils/child-process.js.map +1 -0
  847. package/dist/utils/clipboard-image.d.ts +13 -0
  848. package/dist/utils/clipboard-image.d.ts.map +1 -0
  849. package/dist/utils/clipboard-image.js +248 -0
  850. package/dist/utils/clipboard-image.js.map +1 -0
  851. package/dist/utils/clipboard-native.d.ts +11 -0
  852. package/dist/utils/clipboard-native.d.ts.map +1 -0
  853. package/dist/utils/clipboard-native.js +20 -0
  854. package/dist/utils/clipboard-native.js.map +1 -0
  855. package/dist/utils/clipboard.d.ts +4 -0
  856. package/dist/utils/clipboard.d.ts.map +1 -0
  857. package/dist/utils/clipboard.js +171 -0
  858. package/dist/utils/clipboard.js.map +1 -0
  859. package/dist/utils/deprecation.d.ts +4 -0
  860. package/dist/utils/deprecation.d.ts.map +1 -0
  861. package/dist/utils/deprecation.js +13 -0
  862. package/dist/utils/deprecation.js.map +1 -0
  863. package/dist/utils/directory-completions.d.ts +5 -0
  864. package/dist/utils/directory-completions.d.ts.map +1 -0
  865. package/dist/utils/directory-completions.js +64 -0
  866. package/dist/utils/directory-completions.js.map +1 -0
  867. package/dist/utils/exif-orientation.d.ts +6 -0
  868. package/dist/utils/exif-orientation.d.ts.map +1 -0
  869. package/dist/utils/exif-orientation.js +166 -0
  870. package/dist/utils/exif-orientation.js.map +1 -0
  871. package/dist/utils/frontmatter.d.ts +8 -0
  872. package/dist/utils/frontmatter.d.ts.map +1 -0
  873. package/dist/utils/frontmatter.js +26 -0
  874. package/dist/utils/frontmatter.js.map +1 -0
  875. package/dist/utils/fs-watch.d.ts +5 -0
  876. package/dist/utils/fs-watch.d.ts.map +1 -0
  877. package/dist/utils/fs-watch.js +25 -0
  878. package/dist/utils/fs-watch.js.map +1 -0
  879. package/dist/utils/git.d.ts +27 -0
  880. package/dist/utils/git.d.ts.map +1 -0
  881. package/dist/utils/git.js +237 -0
  882. package/dist/utils/git.js.map +1 -0
  883. package/dist/utils/grip-user-agent.d.ts +2 -0
  884. package/dist/utils/grip-user-agent.d.ts.map +1 -0
  885. package/dist/utils/grip-user-agent.js +5 -0
  886. package/dist/utils/grip-user-agent.js.map +1 -0
  887. package/dist/utils/html.d.ts +7 -0
  888. package/dist/utils/html.d.ts.map +1 -0
  889. package/dist/utils/html.js +40 -0
  890. package/dist/utils/html.js.map +1 -0
  891. package/dist/utils/image-convert.d.ts +12 -0
  892. package/dist/utils/image-convert.d.ts.map +1 -0
  893. package/dist/utils/image-convert.js +43 -0
  894. package/dist/utils/image-convert.js.map +1 -0
  895. package/dist/utils/image-process.d.ts +18 -0
  896. package/dist/utils/image-process.d.ts.map +1 -0
  897. package/dist/utils/image-process.js +83 -0
  898. package/dist/utils/image-process.js.map +1 -0
  899. package/dist/utils/image-resize-core.d.ts +30 -0
  900. package/dist/utils/image-resize-core.d.ts.map +1 -0
  901. package/dist/utils/image-resize-core.js +133 -0
  902. package/dist/utils/image-resize-core.js.map +1 -0
  903. package/dist/utils/image-resize-worker.d.ts +2 -0
  904. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  905. package/dist/utils/image-resize-worker.js +31 -0
  906. package/dist/utils/image-resize-worker.js.map +1 -0
  907. package/dist/utils/image-resize.d.ts +19 -0
  908. package/dist/utils/image-resize.d.ts.map +1 -0
  909. package/dist/utils/image-resize.js +86 -0
  910. package/dist/utils/image-resize.js.map +1 -0
  911. package/dist/utils/json.d.ts +3 -0
  912. package/dist/utils/json.d.ts.map +1 -0
  913. package/dist/utils/json.js +7 -0
  914. package/dist/utils/json.js.map +1 -0
  915. package/dist/utils/mime.d.ts +3 -0
  916. package/dist/utils/mime.d.ts.map +1 -0
  917. package/dist/utils/mime.js +110 -0
  918. package/dist/utils/mime.js.map +1 -0
  919. package/dist/utils/open-browser.d.ts +9 -0
  920. package/dist/utils/open-browser.d.ts.map +1 -0
  921. package/dist/utils/open-browser.js +22 -0
  922. package/dist/utils/open-browser.js.map +1 -0
  923. package/dist/utils/paths.d.ts +31 -0
  924. package/dist/utils/paths.d.ts.map +1 -0
  925. package/dist/utils/paths.js +87 -0
  926. package/dist/utils/paths.js.map +1 -0
  927. package/dist/utils/photon.d.ts +22 -0
  928. package/dist/utils/photon.d.ts.map +1 -0
  929. package/dist/utils/photon.js +126 -0
  930. package/dist/utils/photon.js.map +1 -0
  931. package/dist/utils/shell.d.ts +28 -0
  932. package/dist/utils/shell.d.ts.map +1 -0
  933. package/dist/utils/shell.js +188 -0
  934. package/dist/utils/shell.js.map +1 -0
  935. package/dist/utils/sleep.d.ts +5 -0
  936. package/dist/utils/sleep.d.ts.map +1 -0
  937. package/dist/utils/sleep.js +17 -0
  938. package/dist/utils/sleep.js.map +1 -0
  939. package/dist/utils/syntax-highlight.d.ts +12 -0
  940. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  941. package/dist/utils/syntax-highlight.js +125 -0
  942. package/dist/utils/syntax-highlight.js.map +1 -0
  943. package/dist/utils/tools-manager.d.ts +5 -0
  944. package/dist/utils/tools-manager.d.ts.map +1 -0
  945. package/dist/utils/tools-manager.js +329 -0
  946. package/dist/utils/tools-manager.js.map +1 -0
  947. package/dist/utils/version-check.d.ts +14 -0
  948. package/dist/utils/version-check.d.ts.map +1 -0
  949. package/dist/utils/version-check.js +91 -0
  950. package/dist/utils/version-check.js.map +1 -0
  951. package/dist/utils/windows-self-update.d.ts +3 -0
  952. package/dist/utils/windows-self-update.d.ts.map +1 -0
  953. package/dist/utils/windows-self-update.js +77 -0
  954. package/dist/utils/windows-self-update.js.map +1 -0
  955. package/docs/compaction.md +408 -0
  956. package/docs/custom-provider.md +714 -0
  957. package/docs/daemon-architecture.md +399 -0
  958. package/docs/daemon.md +112 -0
  959. package/docs/development.md +72 -0
  960. package/docs/docs.json +164 -0
  961. package/docs/extensions.md +2745 -0
  962. package/docs/hooks.md +85 -0
  963. package/docs/images/doom-extension.png +0 -0
  964. package/docs/images/exy.png +0 -0
  965. package/docs/images/interactive-mode.png +0 -0
  966. package/docs/images/tree-view.png +0 -0
  967. package/docs/index.md +77 -0
  968. package/docs/json.md +89 -0
  969. package/docs/keybindings.md +230 -0
  970. package/docs/lsp.md +499 -0
  971. package/docs/migrating-to-grip.md +18 -0
  972. package/docs/models.md +496 -0
  973. package/docs/packages.md +228 -0
  974. package/docs/prompt-templates.md +88 -0
  975. package/docs/providers.md +251 -0
  976. package/docs/quickstart.md +159 -0
  977. package/docs/rpc.md +1492 -0
  978. package/docs/rules.md +117 -0
  979. package/docs/sandbox.md +104 -0
  980. package/docs/sdk.md +360 -0
  981. package/docs/session-format.md +414 -0
  982. package/docs/sessions.md +137 -0
  983. package/docs/settings.md +372 -0
  984. package/docs/shell-aliases.md +13 -0
  985. package/docs/skills.md +246 -0
  986. package/docs/terminal-setup.md +112 -0
  987. package/docs/termux.md +112 -0
  988. package/docs/themes.md +295 -0
  989. package/docs/tmux.md +61 -0
  990. package/docs/tui.md +918 -0
  991. package/docs/usage.md +304 -0
  992. package/docs/windows.md +17 -0
  993. package/examples/README.md +29 -0
  994. package/examples/daemon-docker/Dockerfile +43 -0
  995. package/examples/daemon-docker/README.md +45 -0
  996. package/examples/extensions/README.md +208 -0
  997. package/examples/extensions/auto-commit-on-exit.ts +46 -0
  998. package/examples/extensions/bash-spawn-hook.ts +30 -0
  999. package/examples/extensions/bookmark.ts +50 -0
  1000. package/examples/extensions/border-status-editor.ts +145 -0
  1001. package/examples/extensions/built-in-tool-renderer.ts +259 -0
  1002. package/examples/extensions/claude-rules.ts +86 -0
  1003. package/examples/extensions/commands.ts +82 -0
  1004. package/examples/extensions/confirm-destructive.ts +59 -0
  1005. package/examples/extensions/custom-compaction.ts +131 -0
  1006. package/examples/extensions/custom-footer.ts +79 -0
  1007. package/examples/extensions/custom-header.ts +73 -0
  1008. package/examples/extensions/custom-provider-anthropic/index.ts +707 -0
  1009. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  1010. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  1011. package/examples/extensions/custom-provider-gitlab-duo/index.ts +402 -0
  1012. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  1013. package/examples/extensions/custom-provider-gitlab-duo/test.ts +104 -0
  1014. package/examples/extensions/dirty-repo-guard.ts +59 -0
  1015. package/examples/extensions/doom-overlay/README.md +46 -0
  1016. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  1017. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  1018. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  1019. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  1020. package/examples/extensions/doom-overlay/doom-component.ts +133 -0
  1021. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  1022. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  1023. package/examples/extensions/doom-overlay/index.ts +74 -0
  1024. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  1025. package/examples/extensions/dynamic-resources/RULES.md +8 -0
  1026. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  1027. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  1028. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  1029. package/examples/extensions/dynamic-resources/index.ts +16 -0
  1030. package/examples/extensions/dynamic-tools.ts +74 -0
  1031. package/examples/extensions/event-bus.ts +43 -0
  1032. package/examples/extensions/file-trigger.ts +41 -0
  1033. package/examples/extensions/git-checkpoint.ts +53 -0
  1034. package/examples/extensions/git-merge-and-resolve.ts +125 -0
  1035. package/examples/extensions/github-issue-autocomplete.ts +191 -0
  1036. package/examples/extensions/handoff.ts +191 -0
  1037. package/examples/extensions/hello.ts +26 -0
  1038. package/examples/extensions/hidden-thinking-label.ts +53 -0
  1039. package/examples/extensions/inline-bash.ts +104 -0
  1040. package/examples/extensions/input-transform.ts +43 -0
  1041. package/examples/extensions/interactive-shell.ts +194 -0
  1042. package/examples/extensions/mac-system-theme.ts +47 -0
  1043. package/examples/extensions/message-renderer.ts +59 -0
  1044. package/examples/extensions/minimal-mode.ts +428 -0
  1045. package/examples/extensions/modal-editor.ts +86 -0
  1046. package/examples/extensions/model-status.ts +31 -0
  1047. package/examples/extensions/notify.ts +55 -0
  1048. package/examples/extensions/overlay-qa-tests.ts +1374 -0
  1049. package/examples/extensions/overlay-test.ts +171 -0
  1050. package/examples/extensions/permission-gate.ts +34 -0
  1051. package/examples/extensions/pirate.ts +47 -0
  1052. package/examples/extensions/plan-mode/README.md +65 -0
  1053. package/examples/extensions/plan-mode/index.ts +346 -0
  1054. package/examples/extensions/plan-mode/utils.ts +172 -0
  1055. package/examples/extensions/preset.ts +426 -0
  1056. package/examples/extensions/prompt-customizer.ts +97 -0
  1057. package/examples/extensions/protected-paths.ts +29 -0
  1058. package/examples/extensions/provider-payload.ts +18 -0
  1059. package/examples/extensions/qna.ts +125 -0
  1060. package/examples/extensions/question.ts +294 -0
  1061. package/examples/extensions/questionnaire.ts +459 -0
  1062. package/examples/extensions/rainbow-editor.ts +88 -0
  1063. package/examples/extensions/reload-runtime.ts +37 -0
  1064. package/examples/extensions/rpc-demo.ts +118 -0
  1065. package/examples/extensions/sandbox/index.ts +320 -0
  1066. package/examples/extensions/sandbox/package-lock.json +92 -0
  1067. package/examples/extensions/sandbox/package.json +19 -0
  1068. package/examples/extensions/send-user-message.ts +97 -0
  1069. package/examples/extensions/session-name.ts +27 -0
  1070. package/examples/extensions/shutdown-command.ts +63 -0
  1071. package/examples/extensions/snake.ts +381 -0
  1072. package/examples/extensions/space-invaders.ts +597 -0
  1073. package/examples/extensions/status-line.ts +32 -0
  1074. package/examples/extensions/structured-output.ts +65 -0
  1075. package/examples/extensions/subagent/README.md +175 -0
  1076. package/examples/extensions/subagent/agents/planner.md +37 -0
  1077. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1078. package/examples/extensions/subagent/agents/scout.md +50 -0
  1079. package/examples/extensions/subagent/agents/worker.md +24 -0
  1080. package/examples/extensions/subagent/agents.ts +126 -0
  1081. package/examples/extensions/subagent/index.ts +1083 -0
  1082. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1083. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1084. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1085. package/examples/extensions/summarize.ts +186 -0
  1086. package/examples/extensions/system-prompt-header.ts +17 -0
  1087. package/examples/extensions/tic-tac-toe.ts +1091 -0
  1088. package/examples/extensions/timed-confirm.ts +70 -0
  1089. package/examples/extensions/titlebar-spinner.ts +58 -0
  1090. package/examples/extensions/todo.ts +306 -0
  1091. package/examples/extensions/tool-override.ts +144 -0
  1092. package/examples/extensions/tools.ts +141 -0
  1093. package/examples/extensions/trigger-compact.ts +50 -0
  1094. package/examples/extensions/truncated-tool.ts +200 -0
  1095. package/examples/extensions/widget-placement.ts +9 -0
  1096. package/examples/extensions/with-deps/index.ts +32 -0
  1097. package/examples/extensions/with-deps/package-lock.json +31 -0
  1098. package/examples/extensions/with-deps/package.json +22 -0
  1099. package/examples/extensions/working-indicator.ts +123 -0
  1100. package/examples/extensions/working-message-test.ts +25 -0
  1101. package/examples/remote-session-server/README.md +71 -0
  1102. package/examples/remote-session-server/server.ts +353 -0
  1103. package/examples/rpc-extension-ui.ts +642 -0
  1104. package/examples/sdk/01-minimal.ts +27 -0
  1105. package/examples/sdk/02-custom-model.ts +54 -0
  1106. package/examples/sdk/03-custom-prompt.ts +76 -0
  1107. package/examples/sdk/04-skills.ts +60 -0
  1108. package/examples/sdk/05-tools.ts +55 -0
  1109. package/examples/sdk/06-extensions.ts +94 -0
  1110. package/examples/sdk/07-context-files.ts +47 -0
  1111. package/examples/sdk/08-prompt-templates.ts +56 -0
  1112. package/examples/sdk/09-api-keys-and-oauth.ts +50 -0
  1113. package/examples/sdk/10-settings.ts +58 -0
  1114. package/examples/sdk/11-sessions.ts +54 -0
  1115. package/examples/sdk/12-full-control.ts +79 -0
  1116. package/examples/sdk/13-session-runtime.ts +49 -0
  1117. package/examples/sdk/README.md +94 -0
  1118. package/npm-shrinkwrap.json +1878 -0
  1119. package/package.json +101 -5
@@ -0,0 +1,261 @@
1
+ import { cntLines } from "../hashline-utils.js";
2
+ import { abortIf } from "../runtime.js";
3
+ import { _lineHashesPure, HASH_SEP } from "./hash.js";
4
+ import { assertNoBarePrefix, descEdit, fmtMismatch, valEdits, warnUnicodeEsc, } from "./resolve.js";
5
+ export function buildIdx(content) {
6
+ const fileLines = content.split("\n");
7
+ const lineStarts = [];
8
+ let offset = 0;
9
+ for (let index = 0; index < fileLines.length; index++) {
10
+ lineStarts.push(offset);
11
+ offset += fileLines[index].length;
12
+ if (index < fileLines.length - 1) {
13
+ offset += 1;
14
+ }
15
+ }
16
+ return {
17
+ fileLines,
18
+ lineStarts,
19
+ hasTerminalNewline: content.endsWith("\n"),
20
+ };
21
+ }
22
+ function assertNotEmpty(originalContent, result) {
23
+ if (originalContent.length > 0 && result.length === 0) {
24
+ throw new Error("[E_WOULD_EMPTY] Cannot empty a non-empty file via edit.");
25
+ }
26
+ }
27
+ function throwConflict(left, right, reason) {
28
+ throw new Error(`[E_EDIT_CONFLICT] Edit ${left.index} (${left.label}) and edit ${right.index} (${right.label}) ${reason}.`);
29
+ }
30
+ function resToSpan(edit, index, content, lineIndex, noopEdits) {
31
+ const { fileLines, lineStarts } = lineIndex;
32
+ const startLine = edit.hash_range_inclusive[0].line;
33
+ const endLine = edit.hash_range_inclusive[1].line;
34
+ const originalLines = fileLines.slice(startLine - 1, endLine);
35
+ if (originalLines.length === edit.content_lines.length &&
36
+ originalLines.every((line, lineIndex) => line === edit.content_lines[lineIndex])) {
37
+ noopEdits.push({
38
+ editIndex: index,
39
+ loc: edit.hash_range_inclusive[0].hash,
40
+ currentContent: originalLines.join("\n"),
41
+ });
42
+ return null;
43
+ }
44
+ const label = descEdit(edit);
45
+ if (edit.content_lines.length > 0) {
46
+ return {
47
+ kind: "replace",
48
+ index,
49
+ label,
50
+ start: lineStarts[startLine - 1],
51
+ end: lineStarts[endLine - 1] + fileLines[endLine - 1].length,
52
+ replacement: edit.content_lines.join("\n"),
53
+ };
54
+ }
55
+ if (startLine === 1 && endLine === fileLines.length) {
56
+ return {
57
+ kind: "replace",
58
+ index,
59
+ label,
60
+ start: 0,
61
+ end: content.length,
62
+ replacement: "",
63
+ };
64
+ }
65
+ if (endLine < fileLines.length) {
66
+ return {
67
+ kind: "replace",
68
+ index,
69
+ label,
70
+ start: lineStarts[startLine - 1],
71
+ end: lineStarts[endLine],
72
+ replacement: "",
73
+ };
74
+ }
75
+ return {
76
+ kind: "replace",
77
+ index,
78
+ label,
79
+ start: Math.max(0, lineStarts[startLine - 1] - 1),
80
+ end: lineStarts[endLine - 1] + fileLines[endLine - 1].length,
81
+ replacement: "",
82
+ };
83
+ }
84
+ function assertNoConflict(spans) {
85
+ if (spans.length < 2)
86
+ return;
87
+ const ordered = [...spans].sort((left, right) => left.start - right.start || right.end - left.end || left.index - right.index);
88
+ let furthestEndSpan = ordered[0];
89
+ for (let index = 1; index < ordered.length; index++) {
90
+ const current = ordered[index];
91
+ if (furthestEndSpan.start < current.end && current.start < furthestEndSpan.end) {
92
+ const [left, right] = furthestEndSpan.index < current.index ? [furthestEndSpan, current] : [current, furthestEndSpan];
93
+ throwConflict(left, right, "overlap on the same original line range");
94
+ }
95
+ if (current.end > furthestEndSpan.end)
96
+ furthestEndSpan = current;
97
+ }
98
+ }
99
+ function resSpans(edits, content, lineIndex, noopEdits, signal) {
100
+ const seenSpanKeys = new Set();
101
+ const resolvedSpans = [];
102
+ for (const [index, edit] of edits.entries()) {
103
+ abortIf(signal);
104
+ const span = resToSpan(edit, index, content, lineIndex, noopEdits);
105
+ if (!span) {
106
+ continue;
107
+ }
108
+ const spanKey = `replace:${span.start}:${span.end}:${span.replacement}`;
109
+ if (seenSpanKeys.has(spanKey)) {
110
+ continue;
111
+ }
112
+ seenSpanKeys.add(spanKey);
113
+ resolvedSpans.push(span);
114
+ }
115
+ assertNoConflict(resolvedSpans);
116
+ return [...resolvedSpans].sort((left, right) => {
117
+ if (right.end !== left.end) {
118
+ return right.end - left.end;
119
+ }
120
+ return left.index - right.index;
121
+ });
122
+ }
123
+ function assemble(content, spans, signal) {
124
+ let result = content;
125
+ for (const span of spans) {
126
+ abortIf(signal);
127
+ result = result.slice(0, span.start) + span.replacement + result.slice(span.end);
128
+ }
129
+ return result;
130
+ }
131
+ /**
132
+ * Builds the boundary-duplication warning shown after an edit. A minimal header
133
+ * is followed by a hashline-anchored window: 2 lines of context before the
134
+ * duplicated pair, the pair itself, and 2 lines after. The window carries the
135
+ * post-edit hashes the model needs to remove the duplicate in a follow-up
136
+ * `replace` (no `read` round-trip required, since the hashes are current and
137
+ * staleness is per-line). Rows are plain `HASH│content` — no annotations.
138
+ */
139
+ export function fmtBoundaryWarning(params) {
140
+ const header = params.kind === "trailing"
141
+ ? "Boundary duplication (trailing): the last replacement line duplicated the next line. This happens when `content_lines` includes a line that was already outside the replaced range. Delete the duplicate — the original line outside the range is still there."
142
+ : "Boundary duplication (leading): the first replacement line duplicated the previous line. This happens when `content_lines` includes a line that was already outside the replaced range. Delete the duplicate — the original line outside the range is still there.";
143
+ // Locate the adjacent duplicated pair (two identical neighboring lines). The
144
+ // occurrence-based matchIndex usually lands inside the pair; when a file has
145
+ // several identical lines we pick the pair nearest matchIndex so the window
146
+ // frames the duplication this edit introduced, not an unrelated one.
147
+ let pairStart = -1;
148
+ let bestDist = Infinity;
149
+ for (let i = 0; i < params.resultLines.length - 1; i++) {
150
+ if (params.resultLines[i] === params.survivingContent && params.resultLines[i + 1] === params.survivingContent) {
151
+ const dist = Math.abs(i - params.matchIndex);
152
+ if (dist < bestDist) {
153
+ bestDist = dist;
154
+ pairStart = i;
155
+ }
156
+ }
157
+ }
158
+ if (pairStart < 0)
159
+ pairStart = params.matchIndex;
160
+ const winStart = Math.max(0, pairStart - 2);
161
+ const winEnd = Math.min(params.resultLines.length - 1, pairStart + 3);
162
+ const rows = [];
163
+ for (let i = winStart; i <= winEnd; i++) {
164
+ rows.push(`${params.resultHashes[i]}${HASH_SEP}${params.resultLines[i]}`);
165
+ }
166
+ return `${header}\n\n${rows.join("\n")}`;
167
+ }
168
+ export function applyEdits(content, edits, signal, precomputedHashes, filePath) {
169
+ abortIf(signal);
170
+ if (!edits.length)
171
+ return {
172
+ content,
173
+ firstChangedLine: undefined,
174
+ lastChangedLine: undefined,
175
+ };
176
+ edits = edits.map((edit) => edit.content_lines.length === 1 && edit.content_lines[0] === "" ? { ...edit, content_lines: [] } : edit);
177
+ const lineIndex = buildIdx(content);
178
+ const fileHashes = precomputedHashes ?? _lineHashesPure(content);
179
+ const noopEdits = [];
180
+ const warnings = [];
181
+ const { resolved, mismatches, boundaryWarnings } = valEdits(edits, lineIndex.fileLines, fileHashes, warnings, signal);
182
+ if (mismatches.length) {
183
+ throw new Error(fmtMismatch(mismatches, lineIndex.fileLines, fileHashes, filePath));
184
+ }
185
+ assertNoBarePrefix(edits, lineIndex.fileLines, fileHashes);
186
+ warnUnicodeEsc(edits, warnings);
187
+ const orderedSpans = resSpans(resolved, content, lineIndex, noopEdits, signal);
188
+ const result = assemble(content, orderedSpans, signal);
189
+ assertNotEmpty(content, result);
190
+ const range = changedRange(content, result);
191
+ return {
192
+ content: result,
193
+ firstChangedLine: range?.firstChangedLine,
194
+ lastChangedLine: range?.lastChangedLine,
195
+ ...(warnings.length ? { warnings } : {}),
196
+ ...(noopEdits.length ? { noopEdits } : {}),
197
+ ...(boundaryWarnings.length ? { boundaryWarnings } : {}),
198
+ };
199
+ }
200
+ export function fmtRegion(hashes, lines) {
201
+ if (hashes.length !== lines.length) {
202
+ throw new Error(`fmtRegion: hashes.length (${hashes.length}) must match lines.length (${lines.length}).`);
203
+ }
204
+ return lines.map((line, index) => `${hashes[index]}${HASH_SEP}${line}`).join("\n");
205
+ }
206
+ function characterIndexToLineNumber(characterIndex, text) {
207
+ let line = 1;
208
+ for (let index = 0; index < characterIndex && index < text.length; index++) {
209
+ if (text[index] === "\n")
210
+ line++;
211
+ }
212
+ return line;
213
+ }
214
+ function resolveLastChangedLine(scan) {
215
+ if (scan.lastResultDifferenceIndex < scan.firstDifferenceIndex) {
216
+ return scan.result.length === 0 ? 1 : cntLines(scan.result);
217
+ }
218
+ if (scan.firstDifferenceIndex === 0 && scan.original.length > 0 && scan.result.endsWith(scan.original)) {
219
+ return scan.firstChangedLine;
220
+ }
221
+ return characterIndexToLineNumber(scan.lastResultDifferenceIndex + 1, scan.result);
222
+ }
223
+ export function changedRange(original, result) {
224
+ if (original === result)
225
+ return null;
226
+ if (original.length === 0) {
227
+ return {
228
+ firstChangedLine: 1,
229
+ lastChangedLine: cntLines(result),
230
+ };
231
+ }
232
+ if (result.startsWith(original) && original.endsWith("\n")) {
233
+ return {
234
+ firstChangedLine: cntLines(original) + 1,
235
+ lastChangedLine: cntLines(result),
236
+ };
237
+ }
238
+ let firstDiff = 0;
239
+ const minLen = Math.min(original.length, result.length);
240
+ while (firstDiff < minLen && original[firstDiff] === result[firstDiff]) {
241
+ firstDiff++;
242
+ }
243
+ if (firstDiff === minLen && original.length === result.length)
244
+ return null;
245
+ let lastOrig = original.length - 1;
246
+ let lastRes = result.length - 1;
247
+ while (lastOrig >= firstDiff && lastRes >= firstDiff && original[lastOrig] === result[lastRes]) {
248
+ lastOrig--;
249
+ lastRes--;
250
+ }
251
+ const firstChangedLine = characterIndexToLineNumber(firstDiff + 1, result);
252
+ const lastChangedLine = resolveLastChangedLine({
253
+ original,
254
+ result,
255
+ firstDifferenceIndex: firstDiff,
256
+ lastResultDifferenceIndex: lastRes,
257
+ firstChangedLine,
258
+ });
259
+ return { firstChangedLine, lastChangedLine };
260
+ }
261
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../../src/core/tools/hashline/apply.ts"],"names":[],"mappings":"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","sourcesContent":["import { cntLines } from \"../hashline-utils.ts\";\nimport { abortIf } from \"../runtime.ts\";\nimport { _lineHashesPure, HASH_SEP } from \"./hash.ts\";\nimport {\n\tassertNoBarePrefix,\n\ttype BDupWarn,\n\ttype BoundaryDuplicateKind,\n\tdescEdit,\n\tfmtMismatch,\n\ttype HEdit,\n\ttype NEdit,\n\ttype RHEdit,\n\tvalEdits,\n\twarnUnicodeEsc,\n} from \"./resolve.ts\";\n\ntype LIdx = {\n\tfileLines: string[];\n\tlineStarts: number[];\n\thasTerminalNewline: boolean;\n};\n\nexport function buildIdx(content: string): LIdx {\n\tconst fileLines = content.split(\"\\n\");\n\tconst lineStarts: number[] = [];\n\tlet offset = 0;\n\n\tfor (let index = 0; index < fileLines.length; index++) {\n\t\tlineStarts.push(offset);\n\t\toffset += fileLines[index]!.length;\n\t\tif (index < fileLines.length - 1) {\n\t\t\toffset += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\tfileLines,\n\t\tlineStarts,\n\t\thasTerminalNewline: content.endsWith(\"\\n\"),\n\t};\n}\n\ntype RESpan = {\n\tkind: \"replace\";\n\tindex: number;\n\tlabel: string;\n\tstart: number;\n\tend: number;\n\treplacement: string;\n};\n\ninterface EditConflictSide {\n\tindex: number;\n\tlabel: string;\n}\n\ninterface BoundaryWarningFormatOptions {\n\tkind: BoundaryDuplicateKind;\n\tsurvivingContent: string;\n\tmatchIndex: number;\n\tresultLines: string[];\n\tresultHashes: string[];\n}\n\ninterface ChangedLineRange {\n\tfirstChangedLine: number;\n\tlastChangedLine: number;\n}\n\nexport interface ApplyEditsResult {\n\tcontent: string;\n\tfirstChangedLine: ChangedLineRange[\"firstChangedLine\"] | undefined;\n\tlastChangedLine: ChangedLineRange[\"lastChangedLine\"] | undefined;\n\twarnings?: string[];\n\tnoopEdits?: NEdit[];\n\tboundaryWarnings?: BDupWarn[];\n}\n\nfunction assertNotEmpty(originalContent: string, result: string): void {\n\tif (originalContent.length > 0 && result.length === 0) {\n\t\tthrow new Error(\"[E_WOULD_EMPTY] Cannot empty a non-empty file via edit.\");\n\t}\n}\n\nfunction throwConflict(left: EditConflictSide, right: EditConflictSide, reason: string): never {\n\tthrow new Error(\n\t\t`[E_EDIT_CONFLICT] Edit ${left.index} (${left.label}) and edit ${right.index} (${right.label}) ${reason}.`,\n\t);\n}\n\nfunction resToSpan(edit: RHEdit, index: number, content: string, lineIndex: LIdx, noopEdits: NEdit[]): RESpan | null {\n\tconst { fileLines, lineStarts } = lineIndex;\n\n\tconst startLine = edit.hash_range_inclusive[0].line;\n\tconst endLine = edit.hash_range_inclusive[1].line;\n\tconst originalLines = fileLines.slice(startLine - 1, endLine);\n\tif (\n\t\toriginalLines.length === edit.content_lines.length &&\n\t\toriginalLines.every((line, lineIndex) => line === edit.content_lines[lineIndex])\n\t) {\n\t\tnoopEdits.push({\n\t\t\teditIndex: index,\n\t\t\tloc: edit.hash_range_inclusive[0].hash,\n\t\t\tcurrentContent: originalLines.join(\"\\n\"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst label = descEdit(edit);\n\n\tif (edit.content_lines.length > 0) {\n\t\treturn {\n\t\t\tkind: \"replace\",\n\t\t\tindex,\n\t\t\tlabel,\n\t\t\tstart: lineStarts[startLine - 1]!,\n\t\t\tend: lineStarts[endLine - 1]! + fileLines[endLine - 1]!.length,\n\t\t\treplacement: edit.content_lines.join(\"\\n\"),\n\t\t};\n\t}\n\n\tif (startLine === 1 && endLine === fileLines.length) {\n\t\treturn {\n\t\t\tkind: \"replace\",\n\t\t\tindex,\n\t\t\tlabel,\n\t\t\tstart: 0,\n\t\t\tend: content.length,\n\t\t\treplacement: \"\",\n\t\t};\n\t}\n\n\tif (endLine < fileLines.length) {\n\t\treturn {\n\t\t\tkind: \"replace\",\n\t\t\tindex,\n\t\t\tlabel,\n\t\t\tstart: lineStarts[startLine - 1]!,\n\t\t\tend: lineStarts[endLine]!,\n\t\t\treplacement: \"\",\n\t\t};\n\t}\n\n\treturn {\n\t\tkind: \"replace\",\n\t\tindex,\n\t\tlabel,\n\t\tstart: Math.max(0, lineStarts[startLine - 1]! - 1),\n\t\tend: lineStarts[endLine - 1]! + fileLines[endLine - 1]!.length,\n\t\treplacement: \"\",\n\t};\n}\n\nfunction assertNoConflict(spans: RESpan[]): void {\n\tif (spans.length < 2) return;\n\tconst ordered = [...spans].sort(\n\t\t(left, right) => left.start - right.start || right.end - left.end || left.index - right.index,\n\t);\n\tlet furthestEndSpan = ordered[0]!;\n\tfor (let index = 1; index < ordered.length; index++) {\n\t\tconst current = ordered[index]!;\n\t\tif (furthestEndSpan.start < current.end && current.start < furthestEndSpan.end) {\n\t\t\tconst [left, right] =\n\t\t\t\tfurthestEndSpan.index < current.index ? [furthestEndSpan, current] : [current, furthestEndSpan];\n\t\t\tthrowConflict(left, right, \"overlap on the same original line range\");\n\t\t}\n\t\tif (current.end > furthestEndSpan.end) furthestEndSpan = current;\n\t}\n}\n\nfunction resSpans(\n\tedits: RHEdit[],\n\tcontent: string,\n\tlineIndex: LIdx,\n\tnoopEdits: NEdit[],\n\tsignal: AbortSignal | undefined,\n): RESpan[] {\n\tconst seenSpanKeys = new Set<string>();\n\tconst resolvedSpans: RESpan[] = [];\n\tfor (const [index, edit] of edits.entries()) {\n\t\tabortIf(signal);\n\t\tconst span = resToSpan(edit, index, content, lineIndex, noopEdits);\n\t\tif (!span) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst spanKey = `replace:${span.start}:${span.end}:${span.replacement}`;\n\t\tif (seenSpanKeys.has(spanKey)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseenSpanKeys.add(spanKey);\n\t\tresolvedSpans.push(span);\n\t}\n\n\tassertNoConflict(resolvedSpans);\n\treturn [...resolvedSpans].sort((left, right) => {\n\t\tif (right.end !== left.end) {\n\t\t\treturn right.end - left.end;\n\t\t}\n\t\treturn left.index - right.index;\n\t});\n}\n\nfunction assemble(content: string, spans: RESpan[], signal: AbortSignal | undefined): string {\n\tlet result = content;\n\tfor (const span of spans) {\n\t\tabortIf(signal);\n\t\tresult = result.slice(0, span.start) + span.replacement + result.slice(span.end);\n\t}\n\treturn result;\n}\n\n/**\n * Builds the boundary-duplication warning shown after an edit. A minimal header\n * is followed by a hashline-anchored window: 2 lines of context before the\n * duplicated pair, the pair itself, and 2 lines after. The window carries the\n * post-edit hashes the model needs to remove the duplicate in a follow-up\n * `replace` (no `read` round-trip required, since the hashes are current and\n * staleness is per-line). Rows are plain `HASH│content` — no annotations.\n */\nexport function fmtBoundaryWarning(params: BoundaryWarningFormatOptions): string {\n\tconst header =\n\t\tparams.kind === \"trailing\"\n\t\t\t? \"Boundary duplication (trailing): the last replacement line duplicated the next line. This happens when `content_lines` includes a line that was already outside the replaced range. Delete the duplicate — the original line outside the range is still there.\"\n\t\t\t: \"Boundary duplication (leading): the first replacement line duplicated the previous line. This happens when `content_lines` includes a line that was already outside the replaced range. Delete the duplicate — the original line outside the range is still there.\";\n\n\t// Locate the adjacent duplicated pair (two identical neighboring lines). The\n\t// occurrence-based matchIndex usually lands inside the pair; when a file has\n\t// several identical lines we pick the pair nearest matchIndex so the window\n\t// frames the duplication this edit introduced, not an unrelated one.\n\tlet pairStart = -1;\n\tlet bestDist = Infinity;\n\tfor (let i = 0; i < params.resultLines.length - 1; i++) {\n\t\tif (params.resultLines[i] === params.survivingContent && params.resultLines[i + 1] === params.survivingContent) {\n\t\t\tconst dist = Math.abs(i - params.matchIndex);\n\t\t\tif (dist < bestDist) {\n\t\t\t\tbestDist = dist;\n\t\t\t\tpairStart = i;\n\t\t\t}\n\t\t}\n\t}\n\tif (pairStart < 0) pairStart = params.matchIndex;\n\n\tconst winStart = Math.max(0, pairStart - 2);\n\tconst winEnd = Math.min(params.resultLines.length - 1, pairStart + 3);\n\n\tconst rows: string[] = [];\n\tfor (let i = winStart; i <= winEnd; i++) {\n\t\trows.push(`${params.resultHashes[i]}${HASH_SEP}${params.resultLines[i]}`);\n\t}\n\treturn `${header}\\n\\n${rows.join(\"\\n\")}`;\n}\n\nexport function applyEdits(\n\tcontent: string,\n\tedits: HEdit[],\n\tsignal?: AbortSignal,\n\tprecomputedHashes?: string[],\n\tfilePath?: string,\n): ApplyEditsResult {\n\tabortIf(signal);\n\tif (!edits.length)\n\t\treturn {\n\t\t\tcontent,\n\t\t\tfirstChangedLine: undefined,\n\t\t\tlastChangedLine: undefined,\n\t\t};\n\n\tedits = edits.map((edit) =>\n\t\tedit.content_lines.length === 1 && edit.content_lines[0] === \"\" ? { ...edit, content_lines: [] } : edit,\n\t);\n\n\tconst lineIndex = buildIdx(content);\n\tconst fileHashes = precomputedHashes ?? _lineHashesPure(content);\n\tconst noopEdits: NEdit[] = [];\n\tconst warnings: string[] = [];\n\n\tconst { resolved, mismatches, boundaryWarnings } = valEdits(\n\t\tedits,\n\t\tlineIndex.fileLines,\n\t\tfileHashes,\n\t\twarnings,\n\t\tsignal,\n\t);\n\tif (mismatches.length) {\n\t\tthrow new Error(fmtMismatch(mismatches, lineIndex.fileLines, fileHashes, filePath));\n\t}\n\n\tassertNoBarePrefix(edits, lineIndex.fileLines, fileHashes);\n\twarnUnicodeEsc(edits, warnings);\n\n\tconst orderedSpans = resSpans(resolved, content, lineIndex, noopEdits, signal);\n\n\tconst result = assemble(content, orderedSpans, signal);\n\tassertNotEmpty(content, result);\n\tconst range = changedRange(content, result);\n\n\treturn {\n\t\tcontent: result,\n\t\tfirstChangedLine: range?.firstChangedLine,\n\t\tlastChangedLine: range?.lastChangedLine,\n\t\t...(warnings.length ? { warnings } : {}),\n\t\t...(noopEdits.length ? { noopEdits } : {}),\n\t\t...(boundaryWarnings.length ? { boundaryWarnings } : {}),\n\t};\n}\n\nexport function fmtRegion(hashes: string[], lines: string[]): string {\n\tif (hashes.length !== lines.length) {\n\t\tthrow new Error(`fmtRegion: hashes.length (${hashes.length}) must match lines.length (${lines.length}).`);\n\t}\n\treturn lines.map((line, index) => `${hashes[index]}${HASH_SEP}${line}`).join(\"\\n\");\n}\nfunction characterIndexToLineNumber(characterIndex: number, text: string): number {\n\tlet line = 1;\n\tfor (let index = 0; index < characterIndex && index < text.length; index++) {\n\t\tif (text[index] === \"\\n\") line++;\n\t}\n\treturn line;\n}\ninterface ChangedRangeScan {\n\toriginal: string;\n\tresult: string;\n\tfirstDifferenceIndex: number;\n\tlastResultDifferenceIndex: number;\n\tfirstChangedLine: number;\n}\n\nfunction resolveLastChangedLine(scan: ChangedRangeScan): number {\n\tif (scan.lastResultDifferenceIndex < scan.firstDifferenceIndex) {\n\t\treturn scan.result.length === 0 ? 1 : cntLines(scan.result);\n\t}\n\tif (scan.firstDifferenceIndex === 0 && scan.original.length > 0 && scan.result.endsWith(scan.original)) {\n\t\treturn scan.firstChangedLine;\n\t}\n\treturn characterIndexToLineNumber(scan.lastResultDifferenceIndex + 1, scan.result);\n}\n\nexport function changedRange(original: string, result: string): ChangedLineRange | null {\n\tif (original === result) return null;\n\n\tif (original.length === 0) {\n\t\treturn {\n\t\t\tfirstChangedLine: 1,\n\t\t\tlastChangedLine: cntLines(result),\n\t\t};\n\t}\n\n\tif (result.startsWith(original) && original.endsWith(\"\\n\")) {\n\t\treturn {\n\t\t\tfirstChangedLine: cntLines(original) + 1,\n\t\t\tlastChangedLine: cntLines(result),\n\t\t};\n\t}\n\n\tlet firstDiff = 0;\n\tconst minLen = Math.min(original.length, result.length);\n\twhile (firstDiff < minLen && original[firstDiff] === result[firstDiff]) {\n\t\tfirstDiff++;\n\t}\n\tif (firstDiff === minLen && original.length === result.length) return null;\n\n\tlet lastOrig = original.length - 1;\n\tlet lastRes = result.length - 1;\n\twhile (lastOrig >= firstDiff && lastRes >= firstDiff && original[lastOrig] === result[lastRes]) {\n\t\tlastOrig--;\n\t\tlastRes--;\n\t}\n\n\tconst firstChangedLine = characterIndexToLineNumber(firstDiff + 1, result);\n\tconst lastChangedLine = resolveLastChangedLine({\n\t\toriginal,\n\t\tresult,\n\t\tfirstDifferenceIndex: firstDiff,\n\t\tlastResultDifferenceIndex: lastRes,\n\t\tfirstChangedLine,\n\t});\n\n\treturn { firstChangedLine, lastChangedLine };\n}\n"]}
@@ -0,0 +1,56 @@
1
+ export declare const HASH_LEN = 3;
2
+ export declare const ANCHOR_LEN = 3;
3
+ /**
4
+ * The `│` (U+2502) delimiter between a hash anchor and its line content. This
5
+ * is the wire-format separator in `HASH│content` rows. Kept as a constant so
6
+ * every construction site resolves the same delimiter.
7
+ */
8
+ export declare const HASH_SEP = "\u2502";
9
+ declare const ALPH_RE: RegExp;
10
+ export declare const HASH_CLASS: string;
11
+ export declare const HL_PREFIX_RE: RegExp;
12
+ export declare const HL_PREFIX_PLUS_RE: RegExp;
13
+ export declare const DIFF_MINUS_RE: RegExp;
14
+ export declare const HL_BARE_PREFIX_RE: RegExp;
15
+ type Hasher = {
16
+ h32(input: string, seed?: number): number;
17
+ };
18
+ export declare function initHasher(): Promise<Hasher>;
19
+ /**
20
+ * Pure hash computation — no I/O, no persistence. Used internally by the
21
+ * stable path and as a fallback when no file path is available.
22
+ * Each line is hashed with xxHash32 over its canonical form (trailing
23
+ * whitespace and CR characters stripped). If the base hash collides with a
24
+ * hash already assigned to an earlier line, a retry counter (`:R{retry}`)
25
+ * is appended to the canonical content and the hash is recomputed until a
26
+ * unique anchor is found. This perfect-hashing step guarantees every line
27
+ * in a file receives a distinct anchor, even when multiple lines contain
28
+ * identical text (e.g. repeated `}` or `import` statements).
29
+ */
30
+ export declare function _lineHashesPure(content: string): string[];
31
+ interface PreviousLineHashSnapshot {
32
+ content: string;
33
+ hashes: string[];
34
+ removedHashes?: Set<string>;
35
+ }
36
+ /**
37
+ * Stable, persistent-aware hash computation.
38
+ *
39
+ * When `path` is provided, uses the persistent hash store to preserve
40
+ * hashes for unchanged lines across edits. When `previous` is also
41
+ * provided (called from the replace pipeline), diffs the previous content
42
+ * against the new content and copies hashes for unchanged lines to their
43
+ * new positions. New/changed lines allocate fresh hashes with collision
44
+ * avoidance against the preserved set.
45
+ *
46
+ * When `path` is provided without `previous` (called from read), loads
47
+ * the stored snapshot for that path. If the content matches, returns the
48
+ * saved hashes. Otherwise computes fresh hashes via `_lineHashesPure` and
49
+ * saves a new snapshot.
50
+ *
51
+ * When `path` is not provided, falls back to `_lineHashesPure` (for
52
+ * backward compatibility and tests that don't need persistence).
53
+ */
54
+ export declare function lineHashes(content: string, path?: string, previous?: PreviousLineHashSnapshot): Promise<string[]>;
55
+ export { ALPH_RE };
56
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/hashline/hash.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,UAAU,IAAW,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,QAAQ,WAAM,CAAC;AAM5B,QAAA,MAAM,OAAO,QAAkC,CAAC;AAChD,eAAO,MAAM,UAAU,QAAgC,CAAC;AAaxD,eAAO,MAAM,YAAY,QAAmD,CAAC;AAC7E,eAAO,MAAM,iBAAiB,QAAuC,CAAC;AACtE,eAAO,MAAM,aAAa,QAAkB,CAAC;AAE7C,eAAO,MAAM,iBAAiB,QAAsC,CAAC;AAErE,KAAK,MAAM,GAAG;IAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAmB5D,wBAAgB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAE5C;AAUD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBzD;AAED,UAAU,wBAAwB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,UAAU,CAC/B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CA0BnB;AAkGD,OAAO,EAAE,OAAO,EAAE,CAAC","sourcesContent":["import xxhash from \"xxhash-wasm\";\nimport { loadHashStore, saveHashStore } from \"../hash-store.ts\";\n\nexport const HASH_LEN = 3;\nexport const ANCHOR_LEN = HASH_LEN;\n\n/**\n * The `│` (U+2502) delimiter between a hash anchor and its line content. This\n * is the wire-format separator in `HASH│content` rows. Kept as a constant so\n * every construction site resolves the same delimiter.\n */\nexport const HASH_SEP = \"│\";\n\nconst ALPH = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst ALPH_BITS = 6;\nconst ALPH_MASK = (1 << ALPH_BITS) - 1;\nconst ALPH_SAFE = ALPH.replace(/-/g, \"\\\\-\");\nconst ALPH_RE = new RegExp(`^[${ALPH_SAFE}]+$`);\nexport const HASH_CLASS = `[${ALPH_SAFE}]{${HASH_LEN}}`;\n\nfunction h2s(h: number): string {\n\tconst totalBits = HASH_LEN * ALPH_BITS;\n\tconst shift = 32 - totalBits;\n\tconst n = h >>> shift;\n\tlet out = \"\";\n\tfor (let j = 0; j < HASH_LEN; j++) {\n\t\tout += ALPH[(n >>> ((HASH_LEN - 1 - j) * ALPH_BITS)) & ALPH_MASK]!;\n\t}\n\treturn out;\n}\n\nexport const HL_PREFIX_RE = new RegExp(`^\\\\s*(?:>>>|>>)?\\\\s*${HASH_CLASS}│`);\nexport const HL_PREFIX_PLUS_RE = new RegExp(`^\\\\+\\\\s*${HASH_CLASS}│`);\nexport const DIFF_MINUS_RE = /^-\\s*\\d+\\s{4}/;\n\nexport const HL_BARE_PREFIX_RE = new RegExp(`^\\\\s*(${HASH_CLASS})│`);\n\ntype Hasher = { h32(input: string, seed?: number): number };\nlet hasherP: Promise<Hasher> | null = null;\nlet hasher: Hasher | null = null;\n\nfunction getH(): Hasher {\n\tif (hasher) return hasher;\n\tthrow new Error(\"xxhash-wasm not initialized yet. This should not happen.\");\n}\n\nhasherP = xxhash()\n\t.then((h) => {\n\t\thasher = h;\n\t\treturn h;\n\t})\n\t.catch((err) => {\n\t\tconsole.error(\"xxhash-wasm initialization failed:\", err);\n\t\tthrow err;\n\t});\n\nexport function initHasher(): Promise<Hasher> {\n\treturn hasherP!;\n}\n\nfunction xxh32(input: string, seed = 0): number {\n\treturn getH().h32(input, seed) >>> 0;\n}\n\nfunction canon(line: string): string {\n\treturn line.replace(/\\r/g, \"\").trimEnd();\n}\n\n/**\n * Pure hash computation — no I/O, no persistence. Used internally by the\n * stable path and as a fallback when no file path is available.\n * Each line is hashed with xxHash32 over its canonical form (trailing\n * whitespace and CR characters stripped). If the base hash collides with a\n * hash already assigned to an earlier line, a retry counter (`:R{retry}`)\n * is appended to the canonical content and the hash is recomputed until a\n * unique anchor is found. This perfect-hashing step guarantees every line\n * in a file receives a distinct anchor, even when multiple lines contain\n * identical text (e.g. repeated `}` or `import` statements).\n */\nexport function _lineHashesPure(content: string): string[] {\n\tconst lines = content.split(\"\\n\");\n\tconst hashes = new Array<string>(lines.length);\n\tconst assigned = new Set<string>();\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst c = canon(lines[i]!);\n\t\tlet hash = h2s(xxh32(c));\n\t\tlet retry = 0;\n\t\twhile (assigned.has(hash)) {\n\t\t\tretry++;\n\t\t\thash = h2s(xxh32(`${c}:R${retry}`));\n\t\t}\n\t\tassigned.add(hash);\n\t\thashes[i] = hash;\n\t}\n\treturn hashes;\n}\n\ninterface PreviousLineHashSnapshot {\n\tcontent: string;\n\thashes: string[];\n\tremovedHashes?: Set<string>;\n}\n\n/**\n * Stable, persistent-aware hash computation.\n *\n * When `path` is provided, uses the persistent hash store to preserve\n * hashes for unchanged lines across edits. When `previous` is also\n * provided (called from the replace pipeline), diffs the previous content\n * against the new content and copies hashes for unchanged lines to their\n * new positions. New/changed lines allocate fresh hashes with collision\n * avoidance against the preserved set.\n *\n * When `path` is provided without `previous` (called from read), loads\n * the stored snapshot for that path. If the content matches, returns the\n * saved hashes. Otherwise computes fresh hashes via `_lineHashesPure` and\n * saves a new snapshot.\n *\n * When `path` is not provided, falls back to `_lineHashesPure` (for\n * backward compatibility and tests that don't need persistence).\n */\nexport async function lineHashes(\n\tcontent: string,\n\tpath?: string,\n\tprevious?: PreviousLineHashSnapshot,\n): Promise<string[]> {\n\tif (!path) {\n\t\treturn _lineHashesPure(content);\n\t}\n\n\tconst store = await loadHashStore();\n\n\t// Case 1: previous content provided (replace pipeline) — diff and preserve\n\tif (previous) {\n\t\tconst newHashes = mapStableHashes(previous.content, previous.hashes, content, previous.removedHashes);\n\t\tstore.snapshots[path] = { content, hashes: newHashes };\n\t\tawait saveHashStore(store);\n\t\treturn newHashes;\n\t}\n\n\t// Case 2: no previous — check snapshot or compute fresh\n\tconst snapshot = store.snapshots[path];\n\tif (snapshot && snapshot.content === content) {\n\t\treturn snapshot.hashes;\n\t}\n\n\t// Compute fresh hashes\n\tconst newHashes = _lineHashesPure(content);\n\tstore.snapshots[path] = { content, hashes: newHashes };\n\tawait saveHashStore(store);\n\treturn newHashes;\n}\n\ninterface PreviousLineHashCandidate {\n\tindex: number;\n\thash: string;\n}\n\ninterface ReusedLineHashes {\n\thashes: string[];\n\tused: Set<string>;\n}\n\nfunction buildPreviousLineHashCandidates(\n\toldContent: string,\n\toldHashes: string[],\n): Map<string, PreviousLineHashCandidate[]> {\n\tconst candidatesByContent = new Map<string, PreviousLineHashCandidate[]>();\n\tconst oldLines = oldContent.split(\"\\n\");\n\tfor (let index = 0; index < oldLines.length; index++) {\n\t\tconst line = oldLines[index]!;\n\t\tconst candidate = { index, hash: oldHashes[index]! };\n\t\tconst candidates = candidatesByContent.get(line);\n\t\tif (candidates) candidates.push(candidate);\n\t\telse candidatesByContent.set(line, [candidate]);\n\t}\n\treturn candidatesByContent;\n}\n\nfunction takePreferredPreviousLineHash(\n\tcandidates: PreviousLineHashCandidate[],\n\tremovedHashes: Set<string> | undefined,\n): string {\n\tlet preferredIndex = 0;\n\tif (removedHashes && removedHashes.size > 0) {\n\t\tfor (let index = 0; index < candidates.length; index++) {\n\t\t\tif (!removedHashes.has(candidates[index]!.hash)) {\n\t\t\t\tpreferredIndex = index;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn candidates.splice(preferredIndex, 1)[0]!.hash;\n}\n\nfunction reusePreviousLineHashes(\n\tnewLines: string[],\n\tcandidatesByContent: Map<string, PreviousLineHashCandidate[]>,\n\tremovedHashes: Set<string> | undefined,\n): ReusedLineHashes {\n\tconst hashes = new Array<string>(newLines.length);\n\tconst used = new Set<string>();\n\tfor (let index = 0; index < newLines.length; index++) {\n\t\tconst candidates = candidatesByContent.get(newLines[index]!);\n\t\tif (!candidates || candidates.length === 0) continue;\n\t\tconst hash = takePreferredPreviousLineHash(candidates, removedHashes);\n\t\thashes[index] = hash;\n\t\tused.add(hash);\n\t}\n\treturn { hashes, used };\n}\n\nfunction fillFreshLineHashes(newLines: string[], hashes: string[], used: Set<string>): void {\n\tfor (let index = 0; index < newLines.length; index++) {\n\t\tif (hashes[index]) continue;\n\t\tconst canonicalLine = canon(newLines[index]!);\n\t\tlet retry = 0;\n\t\tlet hash = h2s(xxh32(canonicalLine));\n\t\twhile (used.has(hash)) {\n\t\t\tretry++;\n\t\t\thash = h2s(xxh32(`${canonicalLine}:R${retry}`));\n\t\t}\n\t\tused.add(hash);\n\t\thashes[index] = hash;\n\t}\n}\n\n/**\n * Maps old hashes to new positions using hash-aware content matching.\n * Unlike Diff.diffLines (which is content-only and cannot distinguish\n * identical lines at different positions), this algorithm uses the\n * removedHashes set to disambiguate: when a line appears multiple times\n * in the old content and one occurrence was targeted by the edit,\n * the surviving occurrence is matched to the non-removed hash.\n * New/changed lines allocate fresh hashes with collision avoidance.\n */\nfunction mapStableHashes(\n\toldContent: string,\n\toldHashes: string[],\n\tnewContent: string,\n\tremovedHashes?: Set<string>,\n): string[] {\n\tconst newLines = newContent.split(\"\\n\");\n\tconst candidatesByContent = buildPreviousLineHashCandidates(oldContent, oldHashes);\n\tconst { hashes, used } = reusePreviousLineHashes(newLines, candidatesByContent, removedHashes);\n\tfillFreshLineHashes(newLines, hashes, used);\n\treturn hashes;\n}\n\nexport { ALPH_RE };\n"]}
@@ -0,0 +1,196 @@
1
+ import xxhash from "xxhash-wasm";
2
+ import { loadHashStore, saveHashStore } from "../hash-store.js";
3
+ export const HASH_LEN = 3;
4
+ export const ANCHOR_LEN = HASH_LEN;
5
+ /**
6
+ * The `│` (U+2502) delimiter between a hash anchor and its line content. This
7
+ * is the wire-format separator in `HASH│content` rows. Kept as a constant so
8
+ * every construction site resolves the same delimiter.
9
+ */
10
+ export const HASH_SEP = "│";
11
+ const ALPH = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
12
+ const ALPH_BITS = 6;
13
+ const ALPH_MASK = (1 << ALPH_BITS) - 1;
14
+ const ALPH_SAFE = ALPH.replace(/-/g, "\\-");
15
+ const ALPH_RE = new RegExp(`^[${ALPH_SAFE}]+$`);
16
+ export const HASH_CLASS = `[${ALPH_SAFE}]{${HASH_LEN}}`;
17
+ function h2s(h) {
18
+ const totalBits = HASH_LEN * ALPH_BITS;
19
+ const shift = 32 - totalBits;
20
+ const n = h >>> shift;
21
+ let out = "";
22
+ for (let j = 0; j < HASH_LEN; j++) {
23
+ out += ALPH[(n >>> ((HASH_LEN - 1 - j) * ALPH_BITS)) & ALPH_MASK];
24
+ }
25
+ return out;
26
+ }
27
+ export const HL_PREFIX_RE = new RegExp(`^\\s*(?:>>>|>>)?\\s*${HASH_CLASS}│`);
28
+ export const HL_PREFIX_PLUS_RE = new RegExp(`^\\+\\s*${HASH_CLASS}│`);
29
+ export const DIFF_MINUS_RE = /^-\s*\d+\s{4}/;
30
+ export const HL_BARE_PREFIX_RE = new RegExp(`^\\s*(${HASH_CLASS})│`);
31
+ let hasherP = null;
32
+ let hasher = null;
33
+ function getH() {
34
+ if (hasher)
35
+ return hasher;
36
+ throw new Error("xxhash-wasm not initialized yet. This should not happen.");
37
+ }
38
+ hasherP = xxhash()
39
+ .then((h) => {
40
+ hasher = h;
41
+ return h;
42
+ })
43
+ .catch((err) => {
44
+ console.error("xxhash-wasm initialization failed:", err);
45
+ throw err;
46
+ });
47
+ export function initHasher() {
48
+ return hasherP;
49
+ }
50
+ function xxh32(input, seed = 0) {
51
+ return getH().h32(input, seed) >>> 0;
52
+ }
53
+ function canon(line) {
54
+ return line.replace(/\r/g, "").trimEnd();
55
+ }
56
+ /**
57
+ * Pure hash computation — no I/O, no persistence. Used internally by the
58
+ * stable path and as a fallback when no file path is available.
59
+ * Each line is hashed with xxHash32 over its canonical form (trailing
60
+ * whitespace and CR characters stripped). If the base hash collides with a
61
+ * hash already assigned to an earlier line, a retry counter (`:R{retry}`)
62
+ * is appended to the canonical content and the hash is recomputed until a
63
+ * unique anchor is found. This perfect-hashing step guarantees every line
64
+ * in a file receives a distinct anchor, even when multiple lines contain
65
+ * identical text (e.g. repeated `}` or `import` statements).
66
+ */
67
+ export function _lineHashesPure(content) {
68
+ const lines = content.split("\n");
69
+ const hashes = new Array(lines.length);
70
+ const assigned = new Set();
71
+ for (let i = 0; i < lines.length; i++) {
72
+ const c = canon(lines[i]);
73
+ let hash = h2s(xxh32(c));
74
+ let retry = 0;
75
+ while (assigned.has(hash)) {
76
+ retry++;
77
+ hash = h2s(xxh32(`${c}:R${retry}`));
78
+ }
79
+ assigned.add(hash);
80
+ hashes[i] = hash;
81
+ }
82
+ return hashes;
83
+ }
84
+ /**
85
+ * Stable, persistent-aware hash computation.
86
+ *
87
+ * When `path` is provided, uses the persistent hash store to preserve
88
+ * hashes for unchanged lines across edits. When `previous` is also
89
+ * provided (called from the replace pipeline), diffs the previous content
90
+ * against the new content and copies hashes for unchanged lines to their
91
+ * new positions. New/changed lines allocate fresh hashes with collision
92
+ * avoidance against the preserved set.
93
+ *
94
+ * When `path` is provided without `previous` (called from read), loads
95
+ * the stored snapshot for that path. If the content matches, returns the
96
+ * saved hashes. Otherwise computes fresh hashes via `_lineHashesPure` and
97
+ * saves a new snapshot.
98
+ *
99
+ * When `path` is not provided, falls back to `_lineHashesPure` (for
100
+ * backward compatibility and tests that don't need persistence).
101
+ */
102
+ export async function lineHashes(content, path, previous) {
103
+ if (!path) {
104
+ return _lineHashesPure(content);
105
+ }
106
+ const store = await loadHashStore();
107
+ // Case 1: previous content provided (replace pipeline) — diff and preserve
108
+ if (previous) {
109
+ const newHashes = mapStableHashes(previous.content, previous.hashes, content, previous.removedHashes);
110
+ store.snapshots[path] = { content, hashes: newHashes };
111
+ await saveHashStore(store);
112
+ return newHashes;
113
+ }
114
+ // Case 2: no previous — check snapshot or compute fresh
115
+ const snapshot = store.snapshots[path];
116
+ if (snapshot && snapshot.content === content) {
117
+ return snapshot.hashes;
118
+ }
119
+ // Compute fresh hashes
120
+ const newHashes = _lineHashesPure(content);
121
+ store.snapshots[path] = { content, hashes: newHashes };
122
+ await saveHashStore(store);
123
+ return newHashes;
124
+ }
125
+ function buildPreviousLineHashCandidates(oldContent, oldHashes) {
126
+ const candidatesByContent = new Map();
127
+ const oldLines = oldContent.split("\n");
128
+ for (let index = 0; index < oldLines.length; index++) {
129
+ const line = oldLines[index];
130
+ const candidate = { index, hash: oldHashes[index] };
131
+ const candidates = candidatesByContent.get(line);
132
+ if (candidates)
133
+ candidates.push(candidate);
134
+ else
135
+ candidatesByContent.set(line, [candidate]);
136
+ }
137
+ return candidatesByContent;
138
+ }
139
+ function takePreferredPreviousLineHash(candidates, removedHashes) {
140
+ let preferredIndex = 0;
141
+ if (removedHashes && removedHashes.size > 0) {
142
+ for (let index = 0; index < candidates.length; index++) {
143
+ if (!removedHashes.has(candidates[index].hash)) {
144
+ preferredIndex = index;
145
+ break;
146
+ }
147
+ }
148
+ }
149
+ return candidates.splice(preferredIndex, 1)[0].hash;
150
+ }
151
+ function reusePreviousLineHashes(newLines, candidatesByContent, removedHashes) {
152
+ const hashes = new Array(newLines.length);
153
+ const used = new Set();
154
+ for (let index = 0; index < newLines.length; index++) {
155
+ const candidates = candidatesByContent.get(newLines[index]);
156
+ if (!candidates || candidates.length === 0)
157
+ continue;
158
+ const hash = takePreferredPreviousLineHash(candidates, removedHashes);
159
+ hashes[index] = hash;
160
+ used.add(hash);
161
+ }
162
+ return { hashes, used };
163
+ }
164
+ function fillFreshLineHashes(newLines, hashes, used) {
165
+ for (let index = 0; index < newLines.length; index++) {
166
+ if (hashes[index])
167
+ continue;
168
+ const canonicalLine = canon(newLines[index]);
169
+ let retry = 0;
170
+ let hash = h2s(xxh32(canonicalLine));
171
+ while (used.has(hash)) {
172
+ retry++;
173
+ hash = h2s(xxh32(`${canonicalLine}:R${retry}`));
174
+ }
175
+ used.add(hash);
176
+ hashes[index] = hash;
177
+ }
178
+ }
179
+ /**
180
+ * Maps old hashes to new positions using hash-aware content matching.
181
+ * Unlike Diff.diffLines (which is content-only and cannot distinguish
182
+ * identical lines at different positions), this algorithm uses the
183
+ * removedHashes set to disambiguate: when a line appears multiple times
184
+ * in the old content and one occurrence was targeted by the edit,
185
+ * the surviving occurrence is matched to the non-removed hash.
186
+ * New/changed lines allocate fresh hashes with collision avoidance.
187
+ */
188
+ function mapStableHashes(oldContent, oldHashes, newContent, removedHashes) {
189
+ const newLines = newContent.split("\n");
190
+ const candidatesByContent = buildPreviousLineHashCandidates(oldContent, oldHashes);
191
+ const { hashes, used } = reusePreviousLineHashes(newLines, candidatesByContent, removedHashes);
192
+ fillFreshLineHashes(newLines, hashes, used);
193
+ return hashes;
194
+ }
195
+ export { ALPH_RE };
196
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../../src/core/tools/hashline/hash.ts"],"names":[],"mappings":"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","sourcesContent":["import xxhash from \"xxhash-wasm\";\nimport { loadHashStore, saveHashStore } from \"../hash-store.ts\";\n\nexport const HASH_LEN = 3;\nexport const ANCHOR_LEN = HASH_LEN;\n\n/**\n * The `│` (U+2502) delimiter between a hash anchor and its line content. This\n * is the wire-format separator in `HASH│content` rows. Kept as a constant so\n * every construction site resolves the same delimiter.\n */\nexport const HASH_SEP = \"│\";\n\nconst ALPH = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst ALPH_BITS = 6;\nconst ALPH_MASK = (1 << ALPH_BITS) - 1;\nconst ALPH_SAFE = ALPH.replace(/-/g, \"\\\\-\");\nconst ALPH_RE = new RegExp(`^[${ALPH_SAFE}]+$`);\nexport const HASH_CLASS = `[${ALPH_SAFE}]{${HASH_LEN}}`;\n\nfunction h2s(h: number): string {\n\tconst totalBits = HASH_LEN * ALPH_BITS;\n\tconst shift = 32 - totalBits;\n\tconst n = h >>> shift;\n\tlet out = \"\";\n\tfor (let j = 0; j < HASH_LEN; j++) {\n\t\tout += ALPH[(n >>> ((HASH_LEN - 1 - j) * ALPH_BITS)) & ALPH_MASK]!;\n\t}\n\treturn out;\n}\n\nexport const HL_PREFIX_RE = new RegExp(`^\\\\s*(?:>>>|>>)?\\\\s*${HASH_CLASS}│`);\nexport const HL_PREFIX_PLUS_RE = new RegExp(`^\\\\+\\\\s*${HASH_CLASS}│`);\nexport const DIFF_MINUS_RE = /^-\\s*\\d+\\s{4}/;\n\nexport const HL_BARE_PREFIX_RE = new RegExp(`^\\\\s*(${HASH_CLASS})│`);\n\ntype Hasher = { h32(input: string, seed?: number): number };\nlet hasherP: Promise<Hasher> | null = null;\nlet hasher: Hasher | null = null;\n\nfunction getH(): Hasher {\n\tif (hasher) return hasher;\n\tthrow new Error(\"xxhash-wasm not initialized yet. This should not happen.\");\n}\n\nhasherP = xxhash()\n\t.then((h) => {\n\t\thasher = h;\n\t\treturn h;\n\t})\n\t.catch((err) => {\n\t\tconsole.error(\"xxhash-wasm initialization failed:\", err);\n\t\tthrow err;\n\t});\n\nexport function initHasher(): Promise<Hasher> {\n\treturn hasherP!;\n}\n\nfunction xxh32(input: string, seed = 0): number {\n\treturn getH().h32(input, seed) >>> 0;\n}\n\nfunction canon(line: string): string {\n\treturn line.replace(/\\r/g, \"\").trimEnd();\n}\n\n/**\n * Pure hash computation — no I/O, no persistence. Used internally by the\n * stable path and as a fallback when no file path is available.\n * Each line is hashed with xxHash32 over its canonical form (trailing\n * whitespace and CR characters stripped). If the base hash collides with a\n * hash already assigned to an earlier line, a retry counter (`:R{retry}`)\n * is appended to the canonical content and the hash is recomputed until a\n * unique anchor is found. This perfect-hashing step guarantees every line\n * in a file receives a distinct anchor, even when multiple lines contain\n * identical text (e.g. repeated `}` or `import` statements).\n */\nexport function _lineHashesPure(content: string): string[] {\n\tconst lines = content.split(\"\\n\");\n\tconst hashes = new Array<string>(lines.length);\n\tconst assigned = new Set<string>();\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst c = canon(lines[i]!);\n\t\tlet hash = h2s(xxh32(c));\n\t\tlet retry = 0;\n\t\twhile (assigned.has(hash)) {\n\t\t\tretry++;\n\t\t\thash = h2s(xxh32(`${c}:R${retry}`));\n\t\t}\n\t\tassigned.add(hash);\n\t\thashes[i] = hash;\n\t}\n\treturn hashes;\n}\n\ninterface PreviousLineHashSnapshot {\n\tcontent: string;\n\thashes: string[];\n\tremovedHashes?: Set<string>;\n}\n\n/**\n * Stable, persistent-aware hash computation.\n *\n * When `path` is provided, uses the persistent hash store to preserve\n * hashes for unchanged lines across edits. When `previous` is also\n * provided (called from the replace pipeline), diffs the previous content\n * against the new content and copies hashes for unchanged lines to their\n * new positions. New/changed lines allocate fresh hashes with collision\n * avoidance against the preserved set.\n *\n * When `path` is provided without `previous` (called from read), loads\n * the stored snapshot for that path. If the content matches, returns the\n * saved hashes. Otherwise computes fresh hashes via `_lineHashesPure` and\n * saves a new snapshot.\n *\n * When `path` is not provided, falls back to `_lineHashesPure` (for\n * backward compatibility and tests that don't need persistence).\n */\nexport async function lineHashes(\n\tcontent: string,\n\tpath?: string,\n\tprevious?: PreviousLineHashSnapshot,\n): Promise<string[]> {\n\tif (!path) {\n\t\treturn _lineHashesPure(content);\n\t}\n\n\tconst store = await loadHashStore();\n\n\t// Case 1: previous content provided (replace pipeline) — diff and preserve\n\tif (previous) {\n\t\tconst newHashes = mapStableHashes(previous.content, previous.hashes, content, previous.removedHashes);\n\t\tstore.snapshots[path] = { content, hashes: newHashes };\n\t\tawait saveHashStore(store);\n\t\treturn newHashes;\n\t}\n\n\t// Case 2: no previous — check snapshot or compute fresh\n\tconst snapshot = store.snapshots[path];\n\tif (snapshot && snapshot.content === content) {\n\t\treturn snapshot.hashes;\n\t}\n\n\t// Compute fresh hashes\n\tconst newHashes = _lineHashesPure(content);\n\tstore.snapshots[path] = { content, hashes: newHashes };\n\tawait saveHashStore(store);\n\treturn newHashes;\n}\n\ninterface PreviousLineHashCandidate {\n\tindex: number;\n\thash: string;\n}\n\ninterface ReusedLineHashes {\n\thashes: string[];\n\tused: Set<string>;\n}\n\nfunction buildPreviousLineHashCandidates(\n\toldContent: string,\n\toldHashes: string[],\n): Map<string, PreviousLineHashCandidate[]> {\n\tconst candidatesByContent = new Map<string, PreviousLineHashCandidate[]>();\n\tconst oldLines = oldContent.split(\"\\n\");\n\tfor (let index = 0; index < oldLines.length; index++) {\n\t\tconst line = oldLines[index]!;\n\t\tconst candidate = { index, hash: oldHashes[index]! };\n\t\tconst candidates = candidatesByContent.get(line);\n\t\tif (candidates) candidates.push(candidate);\n\t\telse candidatesByContent.set(line, [candidate]);\n\t}\n\treturn candidatesByContent;\n}\n\nfunction takePreferredPreviousLineHash(\n\tcandidates: PreviousLineHashCandidate[],\n\tremovedHashes: Set<string> | undefined,\n): string {\n\tlet preferredIndex = 0;\n\tif (removedHashes && removedHashes.size > 0) {\n\t\tfor (let index = 0; index < candidates.length; index++) {\n\t\t\tif (!removedHashes.has(candidates[index]!.hash)) {\n\t\t\t\tpreferredIndex = index;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn candidates.splice(preferredIndex, 1)[0]!.hash;\n}\n\nfunction reusePreviousLineHashes(\n\tnewLines: string[],\n\tcandidatesByContent: Map<string, PreviousLineHashCandidate[]>,\n\tremovedHashes: Set<string> | undefined,\n): ReusedLineHashes {\n\tconst hashes = new Array<string>(newLines.length);\n\tconst used = new Set<string>();\n\tfor (let index = 0; index < newLines.length; index++) {\n\t\tconst candidates = candidatesByContent.get(newLines[index]!);\n\t\tif (!candidates || candidates.length === 0) continue;\n\t\tconst hash = takePreferredPreviousLineHash(candidates, removedHashes);\n\t\thashes[index] = hash;\n\t\tused.add(hash);\n\t}\n\treturn { hashes, used };\n}\n\nfunction fillFreshLineHashes(newLines: string[], hashes: string[], used: Set<string>): void {\n\tfor (let index = 0; index < newLines.length; index++) {\n\t\tif (hashes[index]) continue;\n\t\tconst canonicalLine = canon(newLines[index]!);\n\t\tlet retry = 0;\n\t\tlet hash = h2s(xxh32(canonicalLine));\n\t\twhile (used.has(hash)) {\n\t\t\tretry++;\n\t\t\thash = h2s(xxh32(`${canonicalLine}:R${retry}`));\n\t\t}\n\t\tused.add(hash);\n\t\thashes[index] = hash;\n\t}\n}\n\n/**\n * Maps old hashes to new positions using hash-aware content matching.\n * Unlike Diff.diffLines (which is content-only and cannot distinguish\n * identical lines at different positions), this algorithm uses the\n * removedHashes set to disambiguate: when a line appears multiple times\n * in the old content and one occurrence was targeted by the edit,\n * the surviving occurrence is matched to the non-removed hash.\n * New/changed lines allocate fresh hashes with collision avoidance.\n */\nfunction mapStableHashes(\n\toldContent: string,\n\toldHashes: string[],\n\tnewContent: string,\n\tremovedHashes?: Set<string>,\n): string[] {\n\tconst newLines = newContent.split(\"\\n\");\n\tconst candidatesByContent = buildPreviousLineHashCandidates(oldContent, oldHashes);\n\tconst { hashes, used } = reusePreviousLineHashes(newLines, candidatesByContent, removedHashes);\n\tfillFreshLineHashes(newLines, hashes, used);\n\treturn hashes;\n}\n\nexport { ALPH_RE };\n"]}
@@ -0,0 +1,8 @@
1
+ export type Anchor = {
2
+ hash: string;
3
+ };
4
+ declare function parseRef(ref: string): Anchor;
5
+ export declare const parseHashRef: typeof parseRef;
6
+ export declare function parseText(edit: string[] | string | null): string[];
7
+ export {};
8
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/hashline/parse.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAoBtC,iBAAS,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQrC;AAED,eAAO,MAAM,YAAY,iBAAW,CAAC;AAarC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAQlE","sourcesContent":["import { ALPH_RE, ANCHOR_LEN, DIFF_MINUS_RE, HL_PREFIX_PLUS_RE } from \"./hash.ts\";\n\nexport type Anchor = { hash: string };\n\nfunction diagRef(ref: string): string {\n\tconst trimmed = ref.trim();\n\n\tif (!trimmed.length) {\n\t\treturn `[E_BAD_REF] Invalid anchor. Expected a 3-char base64 anchor (e.g. \"aB3\").`;\n\t}\n\n\tif (/^\\d+/.test(trimmed)) {\n\t\treturn `[E_BAD_REF] Invalid anchor. Use the hash alone (e.g. \"aB3\") — no line numbers or trailing content.`;\n\t}\n\n\tif (trimmed.includes(\"│\")) {\n\t\treturn `[E_BAD_REF] Invalid anchor \"${trimmed}\". hash_range_inclusive must contain the 3-char hash only — remove everything from \"│\" onward.`;\n\t}\n\n\treturn `[E_BAD_REF] Invalid anchor \"${trimmed}\". Expected a 3-char base64 anchor (e.g. \"aB3\").`;\n}\n\nfunction parseRef(ref: string): Anchor {\n\tconst trimmed = ref.trim();\n\n\tif (trimmed.length === ANCHOR_LEN && ALPH_RE.test(trimmed)) {\n\t\treturn { hash: trimmed };\n\t}\n\n\tthrow new Error(diagRef(ref));\n}\n\nexport const parseHashRef = parseRef;\n\nfunction assertNoPrefixes(lines: string[]): void {\n\tfor (const line of lines) {\n\t\tif (!line.length) continue;\n\t\tif (HL_PREFIX_PLUS_RE.test(line) || DIFF_MINUS_RE.test(line)) {\n\t\t\tthrow new Error(\n\t\t\t\t`[E_INVALID_PATCH] \"content_lines\" must contain literal file content. Offending line looks like the diff preview's +HASH│ row: ${JSON.stringify(line)}. Use literal file content only — plain + or - lines are written literally.`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport function parseText(edit: string[] | string | null): string[] {\n\tif (edit === null) return [];\n\tconst lines =\n\t\ttypeof edit === \"string\"\n\t\t\t? (edit.endsWith(\"\\n\") ? edit.slice(0, -1) : edit).replaceAll(\"\\r\", \"\").split(\"\\n\")\n\t\t\t: edit;\n\tassertNoPrefixes(lines);\n\treturn lines;\n}\n"]}