@greppleai/grip 0.1.5 → 0.1.7

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 (587) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +1 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/bun/embedded-assets.d.ts.map +1 -1
  6. package/dist/bun/embedded-assets.js.map +1 -1
  7. package/dist/bun/register-bedrock.d.ts.map +1 -1
  8. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  9. package/dist/bun/restore-sandbox-env.js.map +1 -1
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/config-selector.d.ts.map +1 -1
  13. package/dist/cli/config-selector.js.map +1 -1
  14. package/dist/cli/file-processor.d.ts.map +1 -1
  15. package/dist/cli/file-processor.js.map +1 -1
  16. package/dist/cli/initial-message.d.ts +1 -1
  17. package/dist/cli/initial-message.d.ts.map +1 -1
  18. package/dist/cli/initial-message.js.map +1 -1
  19. package/dist/cli/list-models.d.ts.map +1 -1
  20. package/dist/cli/list-models.js.map +1 -1
  21. package/dist/cli/session-picker.d.ts.map +1 -1
  22. package/dist/cli/session-picker.js.map +1 -1
  23. package/dist/cli.d.ts.map +1 -1
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +2 -0
  27. package/dist/config.js.map +1 -1
  28. package/dist/core/agent-session.d.ts +38 -1
  29. package/dist/core/agent-session.d.ts.map +1 -1
  30. package/dist/core/agent-session.js +289 -154
  31. package/dist/core/agent-session.js.map +1 -1
  32. package/dist/core/auth-guidance.d.ts.map +1 -1
  33. package/dist/core/auth-guidance.js.map +1 -1
  34. package/dist/core/auth-storage.d.ts +4 -0
  35. package/dist/core/auth-storage.d.ts.map +1 -1
  36. package/dist/core/auth-storage.js +3 -10
  37. package/dist/core/auth-storage.js.map +1 -1
  38. package/dist/core/bash-executor.d.ts.map +1 -1
  39. package/dist/core/bash-executor.js +19 -23
  40. package/dist/core/bash-executor.js.map +1 -1
  41. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  42. package/dist/core/compaction/branch-summarization.js.map +1 -1
  43. package/dist/core/compaction/compaction.d.ts.map +1 -1
  44. package/dist/core/compaction/compaction.js +9 -2
  45. package/dist/core/compaction/compaction.js.map +1 -1
  46. package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -1
  47. package/dist/core/compaction/compression-detection-ledger.js.map +1 -1
  48. package/dist/core/compaction/compression-detector.d.ts +1 -0
  49. package/dist/core/compaction/compression-detector.d.ts.map +1 -1
  50. package/dist/core/compaction/compression-detector.js +10 -21
  51. package/dist/core/compaction/compression-detector.js.map +1 -1
  52. package/dist/core/compaction/compression-economics.d.ts.map +1 -1
  53. package/dist/core/compaction/compression-economics.js.map +1 -1
  54. package/dist/core/compaction/utils.d.ts.map +1 -1
  55. package/dist/core/compaction/utils.js.map +1 -1
  56. package/dist/core/defaults.d.ts.map +1 -1
  57. package/dist/core/diagnostics.d.ts.map +1 -1
  58. package/dist/core/event-bus.d.ts.map +1 -1
  59. package/dist/core/event-bus.js.map +1 -1
  60. package/dist/core/exec.d.ts.map +1 -1
  61. package/dist/core/exec.js.map +1 -1
  62. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  63. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  64. package/dist/core/export-html/index.d.ts.map +1 -1
  65. package/dist/core/export-html/index.js.map +1 -1
  66. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  67. package/dist/core/export-html/tool-renderer.js.map +1 -1
  68. package/dist/core/extensions/loader.d.ts.map +1 -1
  69. package/dist/core/extensions/loader.js.map +1 -1
  70. package/dist/core/extensions/runner.d.ts +3 -0
  71. package/dist/core/extensions/runner.d.ts.map +1 -1
  72. package/dist/core/extensions/runner.js +40 -30
  73. package/dist/core/extensions/runner.js.map +1 -1
  74. package/dist/core/extensions/types.d.ts +21 -1
  75. package/dist/core/extensions/types.d.ts.map +1 -1
  76. package/dist/core/extensions/types.js.map +1 -1
  77. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  78. package/dist/core/extensions/wrapper.js.map +1 -1
  79. package/dist/core/footer-data-provider.d.ts.map +1 -1
  80. package/dist/core/footer-data-provider.js +15 -16
  81. package/dist/core/footer-data-provider.js.map +1 -1
  82. package/dist/core/grip-agent.d.ts.map +1 -1
  83. package/dist/core/grip-agent.js +7 -21
  84. package/dist/core/grip-agent.js.map +1 -1
  85. package/dist/core/grip-manifest.d.ts.map +1 -1
  86. package/dist/core/grip-manifest.js.map +1 -1
  87. package/dist/core/hooks/aggregate.d.ts.map +1 -1
  88. package/dist/core/hooks/aggregate.js.map +1 -1
  89. package/dist/core/hooks/config.d.ts.map +1 -1
  90. package/dist/core/hooks/config.js.map +1 -1
  91. package/dist/core/hooks/executor.d.ts.map +1 -1
  92. package/dist/core/hooks/executor.js.map +1 -1
  93. package/dist/core/hooks/index.d.ts.map +1 -1
  94. package/dist/core/hooks/index.js.map +1 -1
  95. package/dist/core/hooks/matcher.d.ts.map +1 -1
  96. package/dist/core/hooks/matcher.js.map +1 -1
  97. package/dist/core/hooks/trust-store.d.ts.map +1 -1
  98. package/dist/core/hooks/trust-store.js +0 -3
  99. package/dist/core/hooks/trust-store.js.map +1 -1
  100. package/dist/core/hooks/types.d.ts.map +1 -1
  101. package/dist/core/hooks/types.js.map +1 -1
  102. package/dist/core/http-dispatcher.d.ts.map +1 -1
  103. package/dist/core/http-dispatcher.js.map +1 -1
  104. package/dist/core/instruction-resource-loader.d.ts +1 -0
  105. package/dist/core/instruction-resource-loader.d.ts.map +1 -1
  106. package/dist/core/instruction-resource-loader.js +2 -4
  107. package/dist/core/instruction-resource-loader.js.map +1 -1
  108. package/dist/core/keybindings.d.ts.map +1 -1
  109. package/dist/core/keybindings.js +0 -1
  110. package/dist/core/keybindings.js.map +1 -1
  111. package/dist/core/lsp/abort.d.ts.map +1 -1
  112. package/dist/core/lsp/abort.js.map +1 -1
  113. package/dist/core/lsp/client.d.ts.map +1 -1
  114. package/dist/core/lsp/client.js +8 -22
  115. package/dist/core/lsp/client.js.map +1 -1
  116. package/dist/core/lsp/config-loader.d.ts.map +1 -1
  117. package/dist/core/lsp/config-loader.js.map +1 -1
  118. package/dist/core/lsp/config.d.ts.map +1 -1
  119. package/dist/core/lsp/config.js.map +1 -1
  120. package/dist/core/lsp/diagnostics.d.ts.map +1 -1
  121. package/dist/core/lsp/diagnostics.js.map +1 -1
  122. package/dist/core/lsp/file-sync.d.ts.map +1 -1
  123. package/dist/core/lsp/file-sync.js +7 -9
  124. package/dist/core/lsp/file-sync.js.map +1 -1
  125. package/dist/core/lsp/integration.d.ts.map +1 -1
  126. package/dist/core/lsp/integration.js.map +1 -1
  127. package/dist/core/lsp/language-map.d.ts.map +1 -1
  128. package/dist/core/lsp/language-map.js +2 -7
  129. package/dist/core/lsp/language-map.js.map +1 -1
  130. package/dist/core/lsp/manager.d.ts.map +1 -1
  131. package/dist/core/lsp/manager.js +18 -29
  132. package/dist/core/lsp/manager.js.map +1 -1
  133. package/dist/core/lsp/navigation.d.ts.map +1 -1
  134. package/dist/core/lsp/navigation.js.map +1 -1
  135. package/dist/core/lsp/portable-path.d.ts.map +1 -1
  136. package/dist/core/lsp/portable-path.js.map +1 -1
  137. package/dist/core/lsp/refactor.d.ts.map +1 -1
  138. package/dist/core/lsp/refactor.js.map +1 -1
  139. package/dist/core/lsp/transport.d.ts.map +1 -1
  140. package/dist/core/lsp/transport.js.map +1 -1
  141. package/dist/core/messages.d.ts.map +1 -1
  142. package/dist/core/messages.js +30 -1
  143. package/dist/core/messages.js.map +1 -1
  144. package/dist/core/model-registry.d.ts.map +1 -1
  145. package/dist/core/model-registry.js +5 -7
  146. package/dist/core/model-registry.js.map +1 -1
  147. package/dist/core/model-resolver.d.ts.map +1 -1
  148. package/dist/core/model-resolver.js.map +1 -1
  149. package/dist/core/output-guard.d.ts.map +1 -1
  150. package/dist/core/output-guard.js.map +1 -1
  151. package/dist/core/package-manager.d.ts.map +1 -1
  152. package/dist/core/package-manager.js +0 -6
  153. package/dist/core/package-manager.js.map +1 -1
  154. package/dist/core/prompt-templates.d.ts.map +1 -1
  155. package/dist/core/prompt-templates.js.map +1 -1
  156. package/dist/core/provider-display-names.d.ts.map +1 -1
  157. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -1
  158. package/dist/core/remote-workspace-protocol/contract.js +4 -2
  159. package/dist/core/remote-workspace-protocol/contract.js.map +1 -1
  160. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -1
  161. package/dist/core/remote-workspace-protocol/guest-shared-client.js +1 -5
  162. package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -1
  163. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -1
  164. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +5 -10
  165. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -1
  166. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -1
  167. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +2 -9
  168. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -1
  169. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -1
  170. package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -1
  171. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -1
  172. package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -1
  173. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -1
  174. package/dist/core/remote-workspace-protocol/session.js +27 -65
  175. package/dist/core/remote-workspace-protocol/session.js.map +1 -1
  176. package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -1
  177. package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -1
  178. package/dist/core/resolve-config-value.d.ts.map +1 -1
  179. package/dist/core/resolve-config-value.js.map +1 -1
  180. package/dist/core/resource-loader.d.ts.map +1 -1
  181. package/dist/core/resource-loader.js +0 -48
  182. package/dist/core/resource-loader.js.map +1 -1
  183. package/dist/core/rules.d.ts.map +1 -1
  184. package/dist/core/rules.js.map +1 -1
  185. package/dist/core/sandbox/command.d.ts.map +1 -1
  186. package/dist/core/sandbox/command.js.map +1 -1
  187. package/dist/core/sandbox/config.d.ts.map +1 -1
  188. package/dist/core/sandbox/config.js.map +1 -1
  189. package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -1
  190. package/dist/core/sandbox/lima-guest-binary.js.map +1 -1
  191. package/dist/core/sandbox/lima.d.ts +2 -0
  192. package/dist/core/sandbox/lima.d.ts.map +1 -1
  193. package/dist/core/sandbox/lima.js +3 -9
  194. package/dist/core/sandbox/lima.js.map +1 -1
  195. package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -1
  196. package/dist/core/sandbox/shared-lima-roots.js.map +1 -1
  197. package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -1
  198. package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -1
  199. package/dist/core/session/constants.d.ts.map +1 -1
  200. package/dist/core/session/context-metadata.d.ts.map +1 -1
  201. package/dist/core/session/context-metadata.js.map +1 -1
  202. package/dist/core/session/context.d.ts.map +1 -1
  203. package/dist/core/session/context.js.map +1 -1
  204. package/dist/core/session/ids.d.ts.map +1 -1
  205. package/dist/core/session/ids.js.map +1 -1
  206. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -1
  207. package/dist/core/session/in-memory-session-manager.js +0 -1
  208. package/dist/core/session/in-memory-session-manager.js.map +1 -1
  209. package/dist/core/session/in-memory-session.d.ts.map +1 -1
  210. package/dist/core/session/in-memory-session.js.map +1 -1
  211. package/dist/core/session/jsonl-errors.d.ts.map +1 -1
  212. package/dist/core/session/jsonl-errors.js +0 -11
  213. package/dist/core/session/jsonl-errors.js.map +1 -1
  214. package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
  215. package/dist/core/session/jsonl-helpers.js.map +1 -1
  216. package/dist/core/session/local-session-manager.d.ts.map +1 -1
  217. package/dist/core/session/local-session-manager.js +4 -6
  218. package/dist/core/session/local-session-manager.js.map +1 -1
  219. package/dist/core/session/local-session.d.ts.map +1 -1
  220. package/dist/core/session/local-session.js.map +1 -1
  221. package/dist/core/session/migrations.d.ts.map +1 -1
  222. package/dist/core/session/migrations.js.map +1 -1
  223. package/dist/core/session/remote-session-client.d.ts.map +1 -1
  224. package/dist/core/session/remote-session-client.js +0 -6
  225. package/dist/core/session/remote-session-client.js.map +1 -1
  226. package/dist/core/session/remote-session-manager.d.ts.map +1 -1
  227. package/dist/core/session/remote-session-manager.js +0 -3
  228. package/dist/core/session/remote-session-manager.js.map +1 -1
  229. package/dist/core/session/remote-session.d.ts.map +1 -1
  230. package/dist/core/session/remote-session.js +0 -1
  231. package/dist/core/session/remote-session.js.map +1 -1
  232. package/dist/core/session/session-manager.d.ts.map +1 -1
  233. package/dist/core/session/session.d.ts.map +1 -1
  234. package/dist/core/session/session.js +1 -5
  235. package/dist/core/session/session.js.map +1 -1
  236. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -1
  237. package/dist/core/session/stores/in-memory-session-store.js +7 -6
  238. package/dist/core/session/stores/in-memory-session-store.js.map +1 -1
  239. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
  240. package/dist/core/session/stores/jsonl-session-store.js +6 -14
  241. package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
  242. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -1
  243. package/dist/core/session/stores/remote-session-store.js +3 -8
  244. package/dist/core/session/stores/remote-session-store.js.map +1 -1
  245. package/dist/core/session/stores/session-store.d.ts.map +1 -1
  246. package/dist/core/session/types.d.ts.map +1 -1
  247. package/dist/core/session/usage-ledger.d.ts.map +1 -1
  248. package/dist/core/session/usage-ledger.js.map +1 -1
  249. package/dist/core/session-cwd.d.ts.map +1 -1
  250. package/dist/core/session-cwd.js +0 -1
  251. package/dist/core/session-cwd.js.map +1 -1
  252. package/dist/core/settings-manager.d.ts.map +1 -1
  253. package/dist/core/settings-manager.js +9 -17
  254. package/dist/core/settings-manager.js.map +1 -1
  255. package/dist/core/skills.d.ts.map +1 -1
  256. package/dist/core/skills.js +3 -2
  257. package/dist/core/skills.js.map +1 -1
  258. package/dist/core/slash-commands.d.ts.map +1 -1
  259. package/dist/core/source-info.d.ts.map +1 -1
  260. package/dist/core/source-info.js.map +1 -1
  261. package/dist/core/system-prompt.d.ts +1 -1
  262. package/dist/core/system-prompt.d.ts.map +1 -1
  263. package/dist/core/system-prompt.js +3 -2
  264. package/dist/core/system-prompt.js.map +1 -1
  265. package/dist/core/telemetry.d.ts.map +1 -1
  266. package/dist/core/telemetry.js.map +1 -1
  267. package/dist/core/timings.d.ts.map +1 -1
  268. package/dist/core/timings.js.map +1 -1
  269. package/dist/core/tools/bash.d.ts +1 -0
  270. package/dist/core/tools/bash.d.ts.map +1 -1
  271. package/dist/core/tools/bash.js +34 -28
  272. package/dist/core/tools/bash.js.map +1 -1
  273. package/dist/core/tools/compress-context.d.ts.map +1 -1
  274. package/dist/core/tools/compress-context.js.map +1 -1
  275. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  276. package/dist/core/tools/edit-diff.js.map +1 -1
  277. package/dist/core/tools/edit.d.ts.map +1 -1
  278. package/dist/core/tools/edit.js.map +1 -1
  279. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  280. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  281. package/dist/core/tools/find.d.ts.map +1 -1
  282. package/dist/core/tools/find.js.map +1 -1
  283. package/dist/core/tools/grep.d.ts.map +1 -1
  284. package/dist/core/tools/grep.js.map +1 -1
  285. package/dist/core/tools/hash-store.d.ts.map +1 -1
  286. package/dist/core/tools/hash-store.js.map +1 -1
  287. package/dist/core/tools/hashline/apply.d.ts.map +1 -1
  288. package/dist/core/tools/hashline/apply.js.map +1 -1
  289. package/dist/core/tools/hashline/hash.d.ts.map +1 -1
  290. package/dist/core/tools/hashline/hash.js.map +1 -1
  291. package/dist/core/tools/hashline/parse.d.ts.map +1 -1
  292. package/dist/core/tools/hashline/parse.js.map +1 -1
  293. package/dist/core/tools/hashline/resolve.d.ts.map +1 -1
  294. package/dist/core/tools/hashline/resolve.js.map +1 -1
  295. package/dist/core/tools/hashline-utils.d.ts.map +1 -1
  296. package/dist/core/tools/hashline-utils.js.map +1 -1
  297. package/dist/core/tools/index.d.ts.map +1 -1
  298. package/dist/core/tools/index.js.map +1 -1
  299. package/dist/core/tools/ls.d.ts.map +1 -1
  300. package/dist/core/tools/ls.js.map +1 -1
  301. package/dist/core/tools/operations.d.ts +11 -0
  302. package/dist/core/tools/operations.d.ts.map +1 -1
  303. package/dist/core/tools/operations.js +54 -28
  304. package/dist/core/tools/operations.js.map +1 -1
  305. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  306. package/dist/core/tools/output-accumulator.js +12 -18
  307. package/dist/core/tools/output-accumulator.js.map +1 -1
  308. package/dist/core/tools/path-utils.d.ts.map +1 -1
  309. package/dist/core/tools/path-utils.js.map +1 -1
  310. package/dist/core/tools/read.d.ts.map +1 -1
  311. package/dist/core/tools/read.js.map +1 -1
  312. package/dist/core/tools/render-utils.d.ts.map +1 -1
  313. package/dist/core/tools/render-utils.js.map +1 -1
  314. package/dist/core/tools/replace-diff.d.ts.map +1 -1
  315. package/dist/core/tools/replace-diff.js.map +1 -1
  316. package/dist/core/tools/replace-normalize.d.ts.map +1 -1
  317. package/dist/core/tools/replace-normalize.js.map +1 -1
  318. package/dist/core/tools/replace-render.d.ts +1 -1
  319. package/dist/core/tools/replace-render.d.ts.map +1 -1
  320. package/dist/core/tools/replace-render.js.map +1 -1
  321. package/dist/core/tools/runtime.d.ts.map +1 -1
  322. package/dist/core/tools/runtime.js.map +1 -1
  323. package/dist/core/tools/session-history.d.ts.map +1 -1
  324. package/dist/core/tools/session-history.js.map +1 -1
  325. package/dist/core/tools/subagent-agents.d.ts.map +1 -1
  326. package/dist/core/tools/subagent-agents.js.map +1 -1
  327. package/dist/core/tools/subagent.d.ts.map +1 -1
  328. package/dist/core/tools/subagent.js.map +1 -1
  329. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  330. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  331. package/dist/core/tools/truncate.d.ts.map +1 -1
  332. package/dist/core/tools/truncate.js.map +1 -1
  333. package/dist/core/tools/websearch.d.ts.map +1 -1
  334. package/dist/core/tools/websearch.js.map +1 -1
  335. package/dist/core/tools/workspace-tool-host.d.ts +1 -0
  336. package/dist/core/tools/workspace-tool-host.d.ts.map +1 -1
  337. package/dist/core/tools/workspace-tool-host.js +36 -22
  338. package/dist/core/tools/workspace-tool-host.js.map +1 -1
  339. package/dist/core/tools/write.d.ts.map +1 -1
  340. package/dist/core/tools/write.js +0 -1
  341. package/dist/core/tools/write.js.map +1 -1
  342. package/dist/core/workspace-identity.d.ts.map +1 -1
  343. package/dist/daemon/activity-budget.d.ts.map +1 -1
  344. package/dist/daemon/activity-budget.js +2 -3
  345. package/dist/daemon/activity-budget.js.map +1 -1
  346. package/dist/daemon/command.d.ts.map +1 -1
  347. package/dist/daemon/command.js.map +1 -1
  348. package/dist/daemon/config.d.ts +2 -0
  349. package/dist/daemon/config.d.ts.map +1 -1
  350. package/dist/daemon/config.js +4 -0
  351. package/dist/daemon/config.js.map +1 -1
  352. package/dist/daemon/help.d.ts.map +1 -1
  353. package/dist/daemon/help.js +4 -3
  354. package/dist/daemon/help.js.map +1 -1
  355. package/dist/daemon/lsp-config.d.ts.map +1 -1
  356. package/dist/daemon/lsp-config.js.map +1 -1
  357. package/dist/daemon/outbound-budget.d.ts.map +1 -1
  358. package/dist/daemon/outbound-budget.js +2 -4
  359. package/dist/daemon/outbound-budget.js.map +1 -1
  360. package/dist/daemon/security.d.ts.map +1 -1
  361. package/dist/daemon/security.js.map +1 -1
  362. package/dist/daemon/server.d.ts.map +1 -1
  363. package/dist/daemon/server.js.map +1 -1
  364. package/dist/daemon/shared-connection.d.ts.map +1 -1
  365. package/dist/daemon/shared-connection.js +10 -15
  366. package/dist/daemon/shared-connection.js.map +1 -1
  367. package/dist/daemon/shared-revision.d.ts.map +1 -1
  368. package/dist/daemon/shared-revision.js +2 -1
  369. package/dist/daemon/shared-revision.js.map +1 -1
  370. package/dist/daemon/shared-roots.d.ts.map +1 -1
  371. package/dist/daemon/shared-roots.js +0 -1
  372. package/dist/daemon/shared-roots.js.map +1 -1
  373. package/dist/daemon/workspace-runtime.d.ts +2 -0
  374. package/dist/daemon/workspace-runtime.d.ts.map +1 -1
  375. package/dist/daemon/workspace-runtime.js +43 -15
  376. package/dist/daemon/workspace-runtime.js.map +1 -1
  377. package/dist/index.d.ts +1 -1
  378. package/dist/index.d.ts.map +1 -1
  379. package/dist/index.js.map +1 -1
  380. package/dist/main.d.ts.map +1 -1
  381. package/dist/main.js +8 -3
  382. package/dist/main.js.map +1 -1
  383. package/dist/migrations.d.ts.map +1 -1
  384. package/dist/migrations.js.map +1 -1
  385. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  386. package/dist/modes/interactive/components/assistant-message.js +3 -10
  387. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  388. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  389. package/dist/modes/interactive/components/bash-execution.js +4 -9
  390. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  391. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  392. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  393. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  394. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  395. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  396. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  397. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  398. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  399. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  400. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  401. package/dist/modes/interactive/components/config-selector.js +6 -16
  402. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  403. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  404. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  405. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  406. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  407. package/dist/modes/interactive/components/custom-editor.js +1 -8
  408. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  409. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  410. package/dist/modes/interactive/components/custom-message.js +1 -6
  411. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  412. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  413. package/dist/modes/interactive/components/diff.js.map +1 -1
  414. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  415. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  416. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  417. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  418. package/dist/modes/interactive/components/extension-editor.js +1 -7
  419. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  420. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  421. package/dist/modes/interactive/components/extension-input.js +2 -8
  422. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  423. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  424. package/dist/modes/interactive/components/extension-selector.js +1 -9
  425. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  426. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/footer.js +8 -4
  428. package/dist/modes/interactive/components/footer.js.map +1 -1
  429. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -1
  430. package/dist/modes/interactive/components/hook-execution.js +2 -5
  431. package/dist/modes/interactive/components/hook-execution.js.map +1 -1
  432. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  433. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  434. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/login-dialog.js +3 -9
  436. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  437. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  438. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  439. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  440. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  441. package/dist/modes/interactive/components/message-card.d.ts.map +1 -1
  442. package/dist/modes/interactive/components/message-card.js +0 -1
  443. package/dist/modes/interactive/components/message-card.js.map +1 -1
  444. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  445. package/dist/modes/interactive/components/model-selector.js +13 -28
  446. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  447. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  448. package/dist/modes/interactive/components/oauth-selector.js +3 -12
  449. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  450. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  451. package/dist/modes/interactive/components/scoped-models-selector.js +9 -13
  452. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  453. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  454. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  455. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  456. package/dist/modes/interactive/components/session-selector.js +33 -58
  457. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  458. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  459. package/dist/modes/interactive/components/settings-selector.js +0 -4
  460. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  461. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  462. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  463. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  464. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  466. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  467. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/theme-selector.js +0 -2
  469. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  470. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  472. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  473. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/tool-execution.js +9 -24
  475. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  476. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  477. package/dist/modes/interactive/components/tree-selector.js +18 -34
  478. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  479. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  480. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  481. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  482. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  483. package/dist/modes/interactive/components/user-message.js +0 -4
  484. package/dist/modes/interactive/components/user-message.js.map +1 -1
  485. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  486. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  487. package/dist/modes/interactive/interactive-mode.d.ts +13 -0
  488. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  489. package/dist/modes/interactive/interactive-mode.js +162 -136
  490. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  491. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  492. package/dist/modes/interactive/theme/theme.js +0 -7
  493. package/dist/modes/interactive/theme/theme.js.map +1 -1
  494. package/dist/modes/json-event.d.ts.map +1 -1
  495. package/dist/modes/json-event.js.map +1 -1
  496. package/dist/modes/print-mode.d.ts.map +1 -1
  497. package/dist/modes/print-mode.js.map +1 -1
  498. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  499. package/dist/modes/rpc/jsonl.js.map +1 -1
  500. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  501. package/dist/modes/rpc/rpc-client.js +10 -11
  502. package/dist/modes/rpc/rpc-client.js.map +1 -1
  503. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  504. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  505. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  506. package/dist/package-manager-cli.d.ts.map +1 -1
  507. package/dist/package-manager-cli.js +33 -2
  508. package/dist/package-manager-cli.js.map +1 -1
  509. package/dist/utils/ansi.d.ts.map +1 -1
  510. package/dist/utils/ansi.js.map +1 -1
  511. package/dist/utils/binary-self-update.d.ts +25 -0
  512. package/dist/utils/binary-self-update.d.ts.map +1 -0
  513. package/dist/utils/binary-self-update.js +159 -0
  514. package/dist/utils/binary-self-update.js.map +1 -0
  515. package/dist/utils/changelog.d.ts.map +1 -1
  516. package/dist/utils/changelog.js.map +1 -1
  517. package/dist/utils/child-process.d.ts.map +1 -1
  518. package/dist/utils/child-process.js.map +1 -1
  519. package/dist/utils/clipboard-image.d.ts.map +1 -1
  520. package/dist/utils/clipboard-image.js.map +1 -1
  521. package/dist/utils/clipboard-native.d.ts.map +1 -1
  522. package/dist/utils/clipboard-native.js.map +1 -1
  523. package/dist/utils/clipboard.d.ts.map +1 -1
  524. package/dist/utils/clipboard.js.map +1 -1
  525. package/dist/utils/deprecation.d.ts.map +1 -1
  526. package/dist/utils/deprecation.js.map +1 -1
  527. package/dist/utils/directory-completions.d.ts +8 -0
  528. package/dist/utils/directory-completions.d.ts.map +1 -1
  529. package/dist/utils/directory-completions.js +42 -1
  530. package/dist/utils/directory-completions.js.map +1 -1
  531. package/dist/utils/exif-orientation.d.ts.map +1 -1
  532. package/dist/utils/exif-orientation.js.map +1 -1
  533. package/dist/utils/frontmatter.d.ts.map +1 -1
  534. package/dist/utils/frontmatter.js.map +1 -1
  535. package/dist/utils/fs-watch.d.ts.map +1 -1
  536. package/dist/utils/fs-watch.js.map +1 -1
  537. package/dist/utils/git.d.ts.map +1 -1
  538. package/dist/utils/git.js.map +1 -1
  539. package/dist/utils/grip-user-agent.d.ts.map +1 -1
  540. package/dist/utils/grip-user-agent.js.map +1 -1
  541. package/dist/utils/html.d.ts.map +1 -1
  542. package/dist/utils/html.js.map +1 -1
  543. package/dist/utils/image-convert.d.ts.map +1 -1
  544. package/dist/utils/image-convert.js.map +1 -1
  545. package/dist/utils/image-process.d.ts.map +1 -1
  546. package/dist/utils/image-process.js.map +1 -1
  547. package/dist/utils/image-resize-core.d.ts.map +1 -1
  548. package/dist/utils/image-resize-core.js.map +1 -1
  549. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  550. package/dist/utils/image-resize-worker.js.map +1 -1
  551. package/dist/utils/image-resize.d.ts.map +1 -1
  552. package/dist/utils/image-resize.js.map +1 -1
  553. package/dist/utils/json.d.ts.map +1 -1
  554. package/dist/utils/json.js.map +1 -1
  555. package/dist/utils/mime.d.ts.map +1 -1
  556. package/dist/utils/mime.js.map +1 -1
  557. package/dist/utils/open-browser.d.ts.map +1 -1
  558. package/dist/utils/open-browser.js.map +1 -1
  559. package/dist/utils/paths.d.ts.map +1 -1
  560. package/dist/utils/paths.js.map +1 -1
  561. package/dist/utils/photon.d.ts.map +1 -1
  562. package/dist/utils/photon.js +10 -5
  563. package/dist/utils/photon.js.map +1 -1
  564. package/dist/utils/shell.d.ts.map +1 -1
  565. package/dist/utils/shell.js.map +1 -1
  566. package/dist/utils/sleep.d.ts.map +1 -1
  567. package/dist/utils/sleep.js.map +1 -1
  568. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  569. package/dist/utils/syntax-highlight.js +1 -1
  570. package/dist/utils/syntax-highlight.js.map +1 -1
  571. package/dist/utils/tools-manager.d.ts.map +1 -1
  572. package/dist/utils/tools-manager.js.map +1 -1
  573. package/dist/utils/version-check.d.ts.map +1 -1
  574. package/dist/utils/version-check.js.map +1 -1
  575. package/dist/utils/windows-self-update.d.ts.map +1 -1
  576. package/dist/utils/windows-self-update.js.map +1 -1
  577. package/docs/extensions.md +31 -1
  578. package/docs/sandbox.md +6 -0
  579. package/docs/sessions.md +1 -1
  580. package/docs/skills.md +4 -4
  581. package/docs/usage.md +2 -1
  582. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  583. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  584. package/examples/extensions/sandbox/package.json +2 -2
  585. package/examples/extensions/with-deps/package.json +1 -1
  586. package/npm-shrinkwrap.json +602 -834
  587. package/package.json +20 -21
@@ -1 +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"]}
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"]}
@@ -1 +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"]}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/core/tools/hashline/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAIlF,SAAS,OAAO,CAAC,GAAW,EAAU;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,2EAA2E,CAAC;IACpF,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,sGAAoG,CAAC;IAC7G,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,+BAA+B,OAAO,oGAAgG,CAAC;IAC/I,CAAC;IAED,OAAO,+BAA+B,OAAO,kDAAkD,CAAC;AAAA,CAChG;AAED,SAAS,QAAQ,CAAC,GAAW,EAAU;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,CAC9B;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AAErC,SAAS,gBAAgB,CAAC,KAAe,EAAQ;IAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,SAAS;QAC3B,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CACd,mIAAiI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,+EAA6E,CAClO,CAAC;QACH,CAAC;IACF,CAAC;AAAA,CACD;AAED,MAAM,UAAU,SAAS,CAAC,IAA8B,EAAY;IACnE,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,KAAK,GACV,OAAO,IAAI,KAAK,QAAQ;QACvB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACnF,CAAC,CAAC,IAAI,CAAC;IACT,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AAAA,CACb","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"]}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/core/tools/hashline/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAIlF,SAAS,OAAO,CAAC,GAAW;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,2EAA2E,CAAC;IACpF,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,oGAAoG,CAAC;IAC7G,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,+BAA+B,OAAO,gGAAgG,CAAC;IAC/I,CAAC;IAED,OAAO,+BAA+B,OAAO,kDAAkD,CAAC;AACjG,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AAErC,SAAS,gBAAgB,CAAC,KAAe;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,SAAS;QAC3B,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CACd,iIAAiI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,6EAA6E,CAClO,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAA8B;IACvD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,KAAK,GACV,OAAO,IAAI,KAAK,QAAQ;QACvB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACnF,CAAC,CAAC,IAAI,CAAC;IACT,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACd,CAAC","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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/hashline/resolve.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAA2B,MAAM,YAAY,CAAC;AAElE,MAAM,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAAE,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AACxF,MAAM,MAAM,MAAM,GAAG;IACpB,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF,KAAK,sBAAsB,GAAG,WAAW,GAAG,WAAW,CAAC;AACxD,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3D,UAAU,SAAS;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,sBAAsB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CAClB;AACD,UAAU,oBAAoB;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,gBAAgB,EAAE,QAAQ,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,KAAK;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,MAAM,GAAG;IACpB,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AA8DF,wBAAgB,WAAW,CAC1B,UAAU,EAAE,SAAS,EAAE,EACvB,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,CAAC,EAAE,MAAM,GACf,MAAM,CAQR;AAmCD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAYjD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAQhE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CA2BnG;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AA2BD,wBAAgB,QAAQ,CACvB,KAAK,EAAE,KAAK,EAAE,EACd,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,WAAW,GAAG,SAAS,GAC7B,oBAAoB,CAkDtB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { rejectUnknownFields } from \"../hashline-utils.ts\";\nimport { abortIf } from \"../runtime.ts\";\nimport { HL_BARE_PREFIX_RE } from \"./hash.ts\";\nimport { type Anchor, parseHashRef, parseText } from \"./parse.ts\";\n\nexport type RAnchor = {\n\tline: number;\n\thash: string;\n\thashMatched: boolean;\n};\n\nexport type HEdit = { hash_range_inclusive: [Anchor, Anchor]; content_lines: string[] };\nexport type RHEdit = {\n\thash_range_inclusive: [RAnchor, RAnchor];\n\tcontent_lines: string[];\n};\n\ntype HashAnchorMismatchKind = \"not_found\" | \"ambiguous\";\nexport type BoundaryDuplicateKind = \"trailing\" | \"leading\";\n\ninterface HMismatch {\n\tref: Anchor;\n\tkind: HashAnchorMismatchKind;\n\tcandidates?: number[];\n}\n\nexport interface BDupWarn {\n\tkind: BoundaryDuplicateKind;\n\tsurvivingLineContent: string;\n\tsurvivingLineIndex: number;\n\toccurrence: number;\n\treplacementLineContent: string;\n\teditIndex: number;\n}\ninterface EditValidationResult {\n\tresolved: RHEdit[];\n\tmismatches: HMismatch[];\n\tboundaryWarnings: BDupWarn[];\n}\n\nexport interface NEdit {\n\teditIndex: number;\n\tloc: string;\n\tcurrentContent: string;\n}\n\nexport type HTEdit = {\n\thash_range_inclusive: [string, string];\n\tcontent_lines: string[];\n};\n\nfunction resAnchor(ref: Anchor, _fileLines: string[], fileHashes: string[]): RAnchor | HMismatch {\n\tconst hashMatches: number[] = [];\n\tfor (let i = 0; i < fileHashes.length; i++) {\n\t\tif (fileHashes[i] === ref.hash) hashMatches.push(i + 1);\n\t}\n\tif (hashMatches.length === 0) {\n\t\treturn { ref, kind: \"not_found\" };\n\t}\n\tif (hashMatches.length === 1) {\n\t\treturn {\n\t\t\tline: hashMatches[0]!,\n\t\t\thash: ref.hash,\n\t\t\thashMatched: true,\n\t\t};\n\t}\n\treturn { ref, kind: \"ambiguous\", candidates: hashMatches };\n}\n\nfunction assertAligned(fileLines: string[], fileHashes: string[], ctx: string): void {\n\tif (fileHashes.length !== fileLines.length) {\n\t\tthrow new Error(\n\t\t\t`${ctx}: fileHashes.length (${fileHashes.length}) must match fileLines.length (${fileLines.length}).`,\n\t\t);\n\t}\n}\n\nfunction formatNotFoundMismatches(mismatches: HMismatch[], filePath: string | undefined): string | undefined {\n\tconst notFound = mismatches.filter((mismatch) => mismatch.kind === \"not_found\");\n\tif (notFound.length === 0) return undefined;\n\tconst references = notFound.map((mismatch) => `\"${mismatch.ref.hash}\"`).join(\", \");\n\treturn `[E_STALE_ANCHOR] ${notFound.length} stale anchor${notFound.length > 1 ? \"s\" : \"\"}${filePath ? ` in ${filePath}` : \"\"}: ${references}. Call read() to get fresh anchors, then copy the 3-char HASH of the start and end of the range you are replacing into hash_range_inclusive of your next replace call.`;\n}\n\nfunction formatAmbiguousMismatchDetail(mismatch: HMismatch, fileLines: string[], fileHashes: string[]): string {\n\tconst sample = (mismatch.candidates ?? []).slice(0, 5);\n\tconst candidateCount = mismatch.candidates?.length ?? 0;\n\tconst more = candidateCount > sample.length ? `, ... (+${candidateCount - sample.length} more)` : \"\";\n\tconst lines = sample\n\t\t.map((line) => {\n\t\t\tconst content = fileLines[line - 1] ?? \"\";\n\t\t\treturn ` ${line}: ${fileHashes[line - 1]}│${content}`;\n\t\t})\n\t\t.join(\"\\n\");\n\treturn ` Hash \"${mismatch.ref.hash}\" matches lines ${sample.join(\", \")}${more}.\\n${lines}`;\n}\n\nfunction formatAmbiguousMismatches(\n\tmismatches: HMismatch[],\n\tfileLines: string[],\n\tfileHashes: string[],\n\tfilePath: string | undefined,\n): string | undefined {\n\tconst ambiguous = mismatches.filter((mismatch) => mismatch.kind === \"ambiguous\");\n\tif (ambiguous.length === 0) return undefined;\n\tconst header = `[E_AMBIGUOUS_ANCHOR] ${ambiguous.length} ambiguous anchor${ambiguous.length > 1 ? \"s\" : \"\"}${filePath ? ` in ${filePath}` : \"\"}. Call read() to get fresh anchors, then copy the 3-char HASH of the start and end of the range you are replacing into hash_range_inclusive of your next replace call.`;\n\treturn [header, ...ambiguous.map((mismatch) => formatAmbiguousMismatchDetail(mismatch, fileLines, fileHashes))].join(\n\t\t\"\\n\",\n\t);\n}\n\nexport function fmtMismatch(\n\tmismatches: HMismatch[],\n\tfileLines: string[],\n\tfileHashes: string[],\n\tfilePath?: string,\n): string {\n\tassertAligned(fileLines, fileHashes, \"fmtMismatch\");\n\treturn [\n\t\tformatNotFoundMismatches(mismatches, filePath),\n\t\tformatAmbiguousMismatches(mismatches, fileLines, fileHashes, filePath),\n\t]\n\t\t.filter((section): section is string => section !== undefined)\n\t\t.join(\"\\n\\n\");\n}\n\nconst ITEM_KS = new Set([\"hash_range_inclusive\", \"content_lines\"]);\n\nfunction isStrArr(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isStrPair(value: unknown): value is [string, string] {\n\treturn Array.isArray(value) && value.length === 2 && value.every((item) => typeof item === \"string\");\n}\n\nfunction assertItem(edit: Record<string, unknown>, index: number): void {\n\trejectUnknownFields(edit, ITEM_KS, `Edit ${index}`, \"Each edit takes only { hash_range_inclusive, content_lines }.\");\n\n\tif (\"hash_range_inclusive\" in edit && !isStrPair(edit.hash_range_inclusive)) {\n\t\tthrow new Error(\n\t\t\t`[E_BAD_SHAPE] Edit ${index} field \"hash_range_inclusive\" must be a pair of anchor strings [start, end].`,\n\t\t);\n\t}\n\tif (!(\"content_lines\" in edit)) {\n\t\tthrow new Error(\n\t\t\t`[E_BAD_SHAPE] Edit ${index} requires a \"content_lines\" field. Provide the replacement lines (use [] to delete).`,\n\t\t);\n\t}\n\tif (\"content_lines\" in edit && !isStrArr(edit.content_lines)) {\n\t\tthrow new Error(`[E_BAD_SHAPE] Edit ${index} field \"content_lines\" must be a string array.`);\n\t}\n\tif (!isStrPair(edit.hash_range_inclusive)) {\n\t\tthrow new Error(\n\t\t\t`[E_BAD_SHAPE] Edit ${index} requires an \"hash_range_inclusive\" pair of anchor strings [start, end].`,\n\t\t);\n\t}\n}\n\nexport function resEdits(edits: HTEdit[]): HEdit[] {\n\tconst result: HEdit[] = [];\n\tfor (const [index, edit] of edits.entries()) {\n\t\tassertItem(edit as Record<string, unknown>, index);\n\n\t\tconst replaceLines = parseText(edit.content_lines);\n\t\tresult.push({\n\t\t\thash_range_inclusive: [parseHashRef(edit.hash_range_inclusive[0]), parseHashRef(edit.hash_range_inclusive[1])],\n\t\t\tcontent_lines: replaceLines,\n\t\t});\n\t}\n\treturn result;\n}\n\nfunction warnUnicodeEsc(edits: HEdit[], warnings: string[]): void {\n\tfor (const edit of edits) {\n\t\tif (edit.content_lines.some((line) => /\\\\uDDDD/i.test(line))) {\n\t\t\twarnings.push(\n\t\t\t\t\"Detected literal \\\\uDDDD in edit content; no autocorrection applied. Verify whether this should be a real Unicode escape or plain text.\",\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport function assertNoBarePrefix(edits: HEdit[], _fileLines: string[], fileHashes: string[]): void {\n\tconst suspects: { line: string; hash: string; editIndex: number; lineIndex: number }[] = [];\n\tfor (let editIndex = 0; editIndex < edits.length; editIndex++) {\n\t\tconst edit = edits[editIndex]!;\n\t\tfor (let lineIndex = 0; lineIndex < edit.content_lines.length; lineIndex++) {\n\t\t\tconst line = edit.content_lines[lineIndex]!;\n\t\t\tconst match = line.match(HL_BARE_PREFIX_RE);\n\t\t\tif (match) suspects.push({ line, hash: match[1]!, editIndex, lineIndex });\n\t\t}\n\t}\n\tif (suspects.length === 0) return;\n\tconst locations = suspects.map((s) => `edit ${s.editIndex}, content_lines[${s.lineIndex}]`).join(\"; \");\n\n\tconst fileHashSet = new Set(fileHashes);\n\tconst matched = suspects.filter((s) => fileHashSet.has(s.hash));\n\tconst matchedCount = matched.length;\n\n\tconst exampleLine = `${suspects[0]!.hash}│${suspects[0]!.line}`;\n\n\tconst linesHint =\n\t\tmatchedCount === 0\n\t\t\t? `None match file line hashes.`\n\t\t\t: `${matchedCount} match file line hashes — strong evidence the prefix was copied from read output.`;\n\n\tthrow new Error(\n\t\t`[E_BARE_HASH_PREFIX] ${suspects.length} edit line(s) start with a hash-like prefix (${locations}). Example: ${JSON.stringify(exampleLine)}. ${linesHint} Remove the \"HASH│\" prefix from each affected content_lines entry; keep only the literal line content that appears after \"│\" in read output. Remember: hash_range_inclusive uses hash anchors, content_lines uses file content only.`,\n\t);\n}\n\nexport function descEdit(edit: RHEdit): string {\n\treturn `replace ${edit.hash_range_inclusive[0].hash}-${edit.hash_range_inclusive[1].hash}`;\n}\n\nfunction checkBoundaryDup(\n\tadjacentLine: string | undefined,\n\treplacementEdge: string | undefined,\n\tkind: BoundaryDuplicateKind,\n\tsurvivingLineIndex: number,\n\tfileLines: string[],\n\teditIndex: number,\n): BDupWarn | null {\n\tif (\n\t\tadjacentLine === undefined ||\n\t\treplacementEdge === undefined ||\n\t\treplacementEdge.length === 0 ||\n\t\treplacementEdge !== adjacentLine\n\t)\n\t\treturn null;\n\treturn {\n\t\tkind,\n\t\tsurvivingLineContent: adjacentLine,\n\t\tsurvivingLineIndex,\n\t\toccurrence: fileLines.slice(0, survivingLineIndex).filter((l) => l === adjacentLine).length,\n\t\treplacementLineContent: replacementEdge,\n\t\teditIndex,\n\t};\n}\n\nexport function valEdits(\n\tedits: HEdit[],\n\tfileLines: string[],\n\tfileHashes: string[],\n\t_warnings: string[],\n\tsignal: AbortSignal | undefined,\n): EditValidationResult {\n\tassertAligned(fileLines, fileHashes, \"valEdits\");\n\tconst resolved: RHEdit[] = [];\n\tconst mismatches: HMismatch[] = [];\n\tconst boundaryWarnings: BDupWarn[] = [];\n\n\tconst tryResolve = (ref: Anchor): RAnchor | undefined => {\n\t\tconst result = resAnchor(ref, fileLines, fileHashes);\n\t\tif (\"kind\" in result) {\n\t\t\tmismatches.push(result);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn result;\n\t};\n\n\tfor (const edit of edits) {\n\t\tabortIf(signal);\n\t\tconst startResolved = tryResolve(edit.hash_range_inclusive[0]);\n\t\tconst endResolved = tryResolve(edit.hash_range_inclusive[1]);\n\t\tif (!startResolved || !endResolved) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (startResolved.line > endResolved.line) {\n\t\t\tthrow new Error(\n\t\t\t\t`[E_BAD_OP] Range start line ${startResolved.line} must be <= end line ${endResolved.line} (anchors ${edit.hash_range_inclusive[0].hash} and ${edit.hash_range_inclusive[1].hash}).`,\n\t\t\t);\n\t\t}\n\t\tconst endLine = endResolved.line;\n\t\tconst nextLine = fileLines[endLine];\n\t\tconst replacementLastLine = edit.content_lines.at(-1);\n\t\tconst trailing = checkBoundaryDup(nextLine, replacementLastLine, \"trailing\", endLine, fileLines, resolved.length);\n\t\tif (trailing) boundaryWarnings.push(trailing);\n\t\tconst prevLine = fileLines[startResolved.line - 2];\n\t\tconst replacementFirstLine = edit.content_lines[0];\n\t\tconst leading = checkBoundaryDup(\n\t\t\tprevLine,\n\t\t\treplacementFirstLine,\n\t\t\t\"leading\",\n\t\t\tstartResolved.line - 2,\n\t\t\tfileLines,\n\t\t\tresolved.length,\n\t\t);\n\t\tif (leading) boundaryWarnings.push(leading);\n\t\tresolved.push({\n\t\t\thash_range_inclusive: [startResolved, endResolved],\n\t\t\tcontent_lines: edit.content_lines,\n\t\t});\n\t}\n\n\treturn { resolved, mismatches, boundaryWarnings };\n}\n\nexport { warnUnicodeEsc };\n"]}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/hashline/resolve.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAA2B,MAAM,YAAY,CAAC;AAElE,MAAM,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAAE,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AACxF,MAAM,MAAM,MAAM,GAAG;IACpB,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF,KAAK,sBAAsB,GAAG,WAAW,GAAG,WAAW,CAAC;AACxD,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3D,UAAU,SAAS;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,sBAAsB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CAClB;AACD,UAAU,oBAAoB;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,gBAAgB,EAAE,QAAQ,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,KAAK;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,MAAM,GAAG;IACpB,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AA8DF,wBAAgB,WAAW,CAC1B,UAAU,EAAE,SAAS,EAAE,EACvB,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,CAAC,EAAE,MAAM,GACf,MAAM,CAQR;AAmCD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAYjD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAQhE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CA2BnG;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AA2BD,wBAAgB,QAAQ,CACvB,KAAK,EAAE,KAAK,EAAE,EACd,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,WAAW,GAAG,SAAS,GAC7B,oBAAoB,CAkDtB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../../src/core/tools/hashline/resolve.ts"],"names":[],"mappings":"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","sourcesContent":["import { rejectUnknownFields } from \"../hashline-utils.ts\";\nimport { abortIf } from \"../runtime.ts\";\nimport { HL_BARE_PREFIX_RE } from \"./hash.ts\";\nimport { type Anchor, parseHashRef, parseText } from \"./parse.ts\";\n\nexport type RAnchor = {\n\tline: number;\n\thash: string;\n\thashMatched: boolean;\n};\n\nexport type HEdit = { hash_range_inclusive: [Anchor, Anchor]; content_lines: string[] };\nexport type RHEdit = {\n\thash_range_inclusive: [RAnchor, RAnchor];\n\tcontent_lines: string[];\n};\n\ntype HashAnchorMismatchKind = \"not_found\" | \"ambiguous\";\nexport type BoundaryDuplicateKind = \"trailing\" | \"leading\";\n\ninterface HMismatch {\n\tref: Anchor;\n\tkind: HashAnchorMismatchKind;\n\tcandidates?: number[];\n}\n\nexport interface BDupWarn {\n\tkind: BoundaryDuplicateKind;\n\tsurvivingLineContent: string;\n\tsurvivingLineIndex: number;\n\toccurrence: number;\n\treplacementLineContent: string;\n\teditIndex: number;\n}\ninterface EditValidationResult {\n\tresolved: RHEdit[];\n\tmismatches: HMismatch[];\n\tboundaryWarnings: BDupWarn[];\n}\n\nexport interface NEdit {\n\teditIndex: number;\n\tloc: string;\n\tcurrentContent: string;\n}\n\nexport type HTEdit = {\n\thash_range_inclusive: [string, string];\n\tcontent_lines: string[];\n};\n\nfunction resAnchor(ref: Anchor, _fileLines: string[], fileHashes: string[]): RAnchor | HMismatch {\n\tconst hashMatches: number[] = [];\n\tfor (let i = 0; i < fileHashes.length; i++) {\n\t\tif (fileHashes[i] === ref.hash) hashMatches.push(i + 1);\n\t}\n\tif (hashMatches.length === 0) {\n\t\treturn { ref, kind: \"not_found\" };\n\t}\n\tif (hashMatches.length === 1) {\n\t\treturn {\n\t\t\tline: hashMatches[0]!,\n\t\t\thash: ref.hash,\n\t\t\thashMatched: true,\n\t\t};\n\t}\n\treturn { ref, kind: \"ambiguous\", candidates: hashMatches };\n}\n\nfunction assertAligned(fileLines: string[], fileHashes: string[], ctx: string): void {\n\tif (fileHashes.length !== fileLines.length) {\n\t\tthrow new Error(\n\t\t\t`${ctx}: fileHashes.length (${fileHashes.length}) must match fileLines.length (${fileLines.length}).`,\n\t\t);\n\t}\n}\n\nfunction formatNotFoundMismatches(mismatches: HMismatch[], filePath: string | undefined): string | undefined {\n\tconst notFound = mismatches.filter((mismatch) => mismatch.kind === \"not_found\");\n\tif (notFound.length === 0) return undefined;\n\tconst references = notFound.map((mismatch) => `\"${mismatch.ref.hash}\"`).join(\", \");\n\treturn `[E_STALE_ANCHOR] ${notFound.length} stale anchor${notFound.length > 1 ? \"s\" : \"\"}${filePath ? ` in ${filePath}` : \"\"}: ${references}. Call read() to get fresh anchors, then copy the 3-char HASH of the start and end of the range you are replacing into hash_range_inclusive of your next replace call.`;\n}\n\nfunction formatAmbiguousMismatchDetail(mismatch: HMismatch, fileLines: string[], fileHashes: string[]): string {\n\tconst sample = (mismatch.candidates ?? []).slice(0, 5);\n\tconst candidateCount = mismatch.candidates?.length ?? 0;\n\tconst more = candidateCount > sample.length ? `, ... (+${candidateCount - sample.length} more)` : \"\";\n\tconst lines = sample\n\t\t.map((line) => {\n\t\t\tconst content = fileLines[line - 1] ?? \"\";\n\t\t\treturn ` ${line}: ${fileHashes[line - 1]}│${content}`;\n\t\t})\n\t\t.join(\"\\n\");\n\treturn ` Hash \"${mismatch.ref.hash}\" matches lines ${sample.join(\", \")}${more}.\\n${lines}`;\n}\n\nfunction formatAmbiguousMismatches(\n\tmismatches: HMismatch[],\n\tfileLines: string[],\n\tfileHashes: string[],\n\tfilePath: string | undefined,\n): string | undefined {\n\tconst ambiguous = mismatches.filter((mismatch) => mismatch.kind === \"ambiguous\");\n\tif (ambiguous.length === 0) return undefined;\n\tconst header = `[E_AMBIGUOUS_ANCHOR] ${ambiguous.length} ambiguous anchor${ambiguous.length > 1 ? \"s\" : \"\"}${filePath ? ` in ${filePath}` : \"\"}. Call read() to get fresh anchors, then copy the 3-char HASH of the start and end of the range you are replacing into hash_range_inclusive of your next replace call.`;\n\treturn [header, ...ambiguous.map((mismatch) => formatAmbiguousMismatchDetail(mismatch, fileLines, fileHashes))].join(\n\t\t\"\\n\",\n\t);\n}\n\nexport function fmtMismatch(\n\tmismatches: HMismatch[],\n\tfileLines: string[],\n\tfileHashes: string[],\n\tfilePath?: string,\n): string {\n\tassertAligned(fileLines, fileHashes, \"fmtMismatch\");\n\treturn [\n\t\tformatNotFoundMismatches(mismatches, filePath),\n\t\tformatAmbiguousMismatches(mismatches, fileLines, fileHashes, filePath),\n\t]\n\t\t.filter((section): section is string => section !== undefined)\n\t\t.join(\"\\n\\n\");\n}\n\nconst ITEM_KS = new Set([\"hash_range_inclusive\", \"content_lines\"]);\n\nfunction isStrArr(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isStrPair(value: unknown): value is [string, string] {\n\treturn Array.isArray(value) && value.length === 2 && value.every((item) => typeof item === \"string\");\n}\n\nfunction assertItem(edit: Record<string, unknown>, index: number): void {\n\trejectUnknownFields(edit, ITEM_KS, `Edit ${index}`, \"Each edit takes only { hash_range_inclusive, content_lines }.\");\n\n\tif (\"hash_range_inclusive\" in edit && !isStrPair(edit.hash_range_inclusive)) {\n\t\tthrow new Error(\n\t\t\t`[E_BAD_SHAPE] Edit ${index} field \"hash_range_inclusive\" must be a pair of anchor strings [start, end].`,\n\t\t);\n\t}\n\tif (!(\"content_lines\" in edit)) {\n\t\tthrow new Error(\n\t\t\t`[E_BAD_SHAPE] Edit ${index} requires a \"content_lines\" field. Provide the replacement lines (use [] to delete).`,\n\t\t);\n\t}\n\tif (\"content_lines\" in edit && !isStrArr(edit.content_lines)) {\n\t\tthrow new Error(`[E_BAD_SHAPE] Edit ${index} field \"content_lines\" must be a string array.`);\n\t}\n\tif (!isStrPair(edit.hash_range_inclusive)) {\n\t\tthrow new Error(\n\t\t\t`[E_BAD_SHAPE] Edit ${index} requires an \"hash_range_inclusive\" pair of anchor strings [start, end].`,\n\t\t);\n\t}\n}\n\nexport function resEdits(edits: HTEdit[]): HEdit[] {\n\tconst result: HEdit[] = [];\n\tfor (const [index, edit] of edits.entries()) {\n\t\tassertItem(edit as Record<string, unknown>, index);\n\n\t\tconst replaceLines = parseText(edit.content_lines);\n\t\tresult.push({\n\t\t\thash_range_inclusive: [parseHashRef(edit.hash_range_inclusive[0]), parseHashRef(edit.hash_range_inclusive[1])],\n\t\t\tcontent_lines: replaceLines,\n\t\t});\n\t}\n\treturn result;\n}\n\nfunction warnUnicodeEsc(edits: HEdit[], warnings: string[]): void {\n\tfor (const edit of edits) {\n\t\tif (edit.content_lines.some((line) => /\\\\uDDDD/i.test(line))) {\n\t\t\twarnings.push(\n\t\t\t\t\"Detected literal \\\\uDDDD in edit content; no autocorrection applied. Verify whether this should be a real Unicode escape or plain text.\",\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport function assertNoBarePrefix(edits: HEdit[], _fileLines: string[], fileHashes: string[]): void {\n\tconst suspects: { line: string; hash: string; editIndex: number; lineIndex: number }[] = [];\n\tfor (let editIndex = 0; editIndex < edits.length; editIndex++) {\n\t\tconst edit = edits[editIndex]!;\n\t\tfor (let lineIndex = 0; lineIndex < edit.content_lines.length; lineIndex++) {\n\t\t\tconst line = edit.content_lines[lineIndex]!;\n\t\t\tconst match = line.match(HL_BARE_PREFIX_RE);\n\t\t\tif (match) suspects.push({ line, hash: match[1]!, editIndex, lineIndex });\n\t\t}\n\t}\n\tif (suspects.length === 0) return;\n\tconst locations = suspects.map((s) => `edit ${s.editIndex}, content_lines[${s.lineIndex}]`).join(\"; \");\n\n\tconst fileHashSet = new Set(fileHashes);\n\tconst matched = suspects.filter((s) => fileHashSet.has(s.hash));\n\tconst matchedCount = matched.length;\n\n\tconst exampleLine = `${suspects[0]!.hash}│${suspects[0]!.line}`;\n\n\tconst linesHint =\n\t\tmatchedCount === 0\n\t\t\t? `None match file line hashes.`\n\t\t\t: `${matchedCount} match file line hashes — strong evidence the prefix was copied from read output.`;\n\n\tthrow new Error(\n\t\t`[E_BARE_HASH_PREFIX] ${suspects.length} edit line(s) start with a hash-like prefix (${locations}). Example: ${JSON.stringify(exampleLine)}. ${linesHint} Remove the \"HASH│\" prefix from each affected content_lines entry; keep only the literal line content that appears after \"│\" in read output. Remember: hash_range_inclusive uses hash anchors, content_lines uses file content only.`,\n\t);\n}\n\nexport function descEdit(edit: RHEdit): string {\n\treturn `replace ${edit.hash_range_inclusive[0].hash}-${edit.hash_range_inclusive[1].hash}`;\n}\n\nfunction checkBoundaryDup(\n\tadjacentLine: string | undefined,\n\treplacementEdge: string | undefined,\n\tkind: BoundaryDuplicateKind,\n\tsurvivingLineIndex: number,\n\tfileLines: string[],\n\teditIndex: number,\n): BDupWarn | null {\n\tif (\n\t\tadjacentLine === undefined ||\n\t\treplacementEdge === undefined ||\n\t\treplacementEdge.length === 0 ||\n\t\treplacementEdge !== adjacentLine\n\t)\n\t\treturn null;\n\treturn {\n\t\tkind,\n\t\tsurvivingLineContent: adjacentLine,\n\t\tsurvivingLineIndex,\n\t\toccurrence: fileLines.slice(0, survivingLineIndex).filter((l) => l === adjacentLine).length,\n\t\treplacementLineContent: replacementEdge,\n\t\teditIndex,\n\t};\n}\n\nexport function valEdits(\n\tedits: HEdit[],\n\tfileLines: string[],\n\tfileHashes: string[],\n\t_warnings: string[],\n\tsignal: AbortSignal | undefined,\n): EditValidationResult {\n\tassertAligned(fileLines, fileHashes, \"valEdits\");\n\tconst resolved: RHEdit[] = [];\n\tconst mismatches: HMismatch[] = [];\n\tconst boundaryWarnings: BDupWarn[] = [];\n\n\tconst tryResolve = (ref: Anchor): RAnchor | undefined => {\n\t\tconst result = resAnchor(ref, fileLines, fileHashes);\n\t\tif (\"kind\" in result) {\n\t\t\tmismatches.push(result);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn result;\n\t};\n\n\tfor (const edit of edits) {\n\t\tabortIf(signal);\n\t\tconst startResolved = tryResolve(edit.hash_range_inclusive[0]);\n\t\tconst endResolved = tryResolve(edit.hash_range_inclusive[1]);\n\t\tif (!startResolved || !endResolved) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (startResolved.line > endResolved.line) {\n\t\t\tthrow new Error(\n\t\t\t\t`[E_BAD_OP] Range start line ${startResolved.line} must be <= end line ${endResolved.line} (anchors ${edit.hash_range_inclusive[0].hash} and ${edit.hash_range_inclusive[1].hash}).`,\n\t\t\t);\n\t\t}\n\t\tconst endLine = endResolved.line;\n\t\tconst nextLine = fileLines[endLine];\n\t\tconst replacementLastLine = edit.content_lines.at(-1);\n\t\tconst trailing = checkBoundaryDup(nextLine, replacementLastLine, \"trailing\", endLine, fileLines, resolved.length);\n\t\tif (trailing) boundaryWarnings.push(trailing);\n\t\tconst prevLine = fileLines[startResolved.line - 2];\n\t\tconst replacementFirstLine = edit.content_lines[0];\n\t\tconst leading = checkBoundaryDup(\n\t\t\tprevLine,\n\t\t\treplacementFirstLine,\n\t\t\t\"leading\",\n\t\t\tstartResolved.line - 2,\n\t\t\tfileLines,\n\t\t\tresolved.length,\n\t\t);\n\t\tif (leading) boundaryWarnings.push(leading);\n\t\tresolved.push({\n\t\t\thash_range_inclusive: [startResolved, endResolved],\n\t\t\tcontent_lines: edit.content_lines,\n\t\t});\n\t}\n\n\treturn { resolved, mismatches, boundaryWarnings };\n}\n\nexport { warnUnicodeEsc };\n"]}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../../src/core/tools/hashline/resolve.ts"],"names":[],"mappings":"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","sourcesContent":["import { rejectUnknownFields } from \"../hashline-utils.ts\";\nimport { abortIf } from \"../runtime.ts\";\nimport { HL_BARE_PREFIX_RE } from \"./hash.ts\";\nimport { type Anchor, parseHashRef, parseText } from \"./parse.ts\";\n\nexport type RAnchor = {\n\tline: number;\n\thash: string;\n\thashMatched: boolean;\n};\n\nexport type HEdit = { hash_range_inclusive: [Anchor, Anchor]; content_lines: string[] };\nexport type RHEdit = {\n\thash_range_inclusive: [RAnchor, RAnchor];\n\tcontent_lines: string[];\n};\n\ntype HashAnchorMismatchKind = \"not_found\" | \"ambiguous\";\nexport type BoundaryDuplicateKind = \"trailing\" | \"leading\";\n\ninterface HMismatch {\n\tref: Anchor;\n\tkind: HashAnchorMismatchKind;\n\tcandidates?: number[];\n}\n\nexport interface BDupWarn {\n\tkind: BoundaryDuplicateKind;\n\tsurvivingLineContent: string;\n\tsurvivingLineIndex: number;\n\toccurrence: number;\n\treplacementLineContent: string;\n\teditIndex: number;\n}\ninterface EditValidationResult {\n\tresolved: RHEdit[];\n\tmismatches: HMismatch[];\n\tboundaryWarnings: BDupWarn[];\n}\n\nexport interface NEdit {\n\teditIndex: number;\n\tloc: string;\n\tcurrentContent: string;\n}\n\nexport type HTEdit = {\n\thash_range_inclusive: [string, string];\n\tcontent_lines: string[];\n};\n\nfunction resAnchor(ref: Anchor, _fileLines: string[], fileHashes: string[]): RAnchor | HMismatch {\n\tconst hashMatches: number[] = [];\n\tfor (let i = 0; i < fileHashes.length; i++) {\n\t\tif (fileHashes[i] === ref.hash) hashMatches.push(i + 1);\n\t}\n\tif (hashMatches.length === 0) {\n\t\treturn { ref, kind: \"not_found\" };\n\t}\n\tif (hashMatches.length === 1) {\n\t\treturn {\n\t\t\tline: hashMatches[0]!,\n\t\t\thash: ref.hash,\n\t\t\thashMatched: true,\n\t\t};\n\t}\n\treturn { ref, kind: \"ambiguous\", candidates: hashMatches };\n}\n\nfunction assertAligned(fileLines: string[], fileHashes: string[], ctx: string): void {\n\tif (fileHashes.length !== fileLines.length) {\n\t\tthrow new Error(\n\t\t\t`${ctx}: fileHashes.length (${fileHashes.length}) must match fileLines.length (${fileLines.length}).`,\n\t\t);\n\t}\n}\n\nfunction formatNotFoundMismatches(mismatches: HMismatch[], filePath: string | undefined): string | undefined {\n\tconst notFound = mismatches.filter((mismatch) => mismatch.kind === \"not_found\");\n\tif (notFound.length === 0) return undefined;\n\tconst references = notFound.map((mismatch) => `\"${mismatch.ref.hash}\"`).join(\", \");\n\treturn `[E_STALE_ANCHOR] ${notFound.length} stale anchor${notFound.length > 1 ? \"s\" : \"\"}${filePath ? ` in ${filePath}` : \"\"}: ${references}. Call read() to get fresh anchors, then copy the 3-char HASH of the start and end of the range you are replacing into hash_range_inclusive of your next replace call.`;\n}\n\nfunction formatAmbiguousMismatchDetail(mismatch: HMismatch, fileLines: string[], fileHashes: string[]): string {\n\tconst sample = (mismatch.candidates ?? []).slice(0, 5);\n\tconst candidateCount = mismatch.candidates?.length ?? 0;\n\tconst more = candidateCount > sample.length ? `, ... (+${candidateCount - sample.length} more)` : \"\";\n\tconst lines = sample\n\t\t.map((line) => {\n\t\t\tconst content = fileLines[line - 1] ?? \"\";\n\t\t\treturn ` ${line}: ${fileHashes[line - 1]}│${content}`;\n\t\t})\n\t\t.join(\"\\n\");\n\treturn ` Hash \"${mismatch.ref.hash}\" matches lines ${sample.join(\", \")}${more}.\\n${lines}`;\n}\n\nfunction formatAmbiguousMismatches(\n\tmismatches: HMismatch[],\n\tfileLines: string[],\n\tfileHashes: string[],\n\tfilePath: string | undefined,\n): string | undefined {\n\tconst ambiguous = mismatches.filter((mismatch) => mismatch.kind === \"ambiguous\");\n\tif (ambiguous.length === 0) return undefined;\n\tconst header = `[E_AMBIGUOUS_ANCHOR] ${ambiguous.length} ambiguous anchor${ambiguous.length > 1 ? \"s\" : \"\"}${filePath ? ` in ${filePath}` : \"\"}. Call read() to get fresh anchors, then copy the 3-char HASH of the start and end of the range you are replacing into hash_range_inclusive of your next replace call.`;\n\treturn [header, ...ambiguous.map((mismatch) => formatAmbiguousMismatchDetail(mismatch, fileLines, fileHashes))].join(\n\t\t\"\\n\",\n\t);\n}\n\nexport function fmtMismatch(\n\tmismatches: HMismatch[],\n\tfileLines: string[],\n\tfileHashes: string[],\n\tfilePath?: string,\n): string {\n\tassertAligned(fileLines, fileHashes, \"fmtMismatch\");\n\treturn [\n\t\tformatNotFoundMismatches(mismatches, filePath),\n\t\tformatAmbiguousMismatches(mismatches, fileLines, fileHashes, filePath),\n\t]\n\t\t.filter((section): section is string => section !== undefined)\n\t\t.join(\"\\n\\n\");\n}\n\nconst ITEM_KS = new Set([\"hash_range_inclusive\", \"content_lines\"]);\n\nfunction isStrArr(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isStrPair(value: unknown): value is [string, string] {\n\treturn Array.isArray(value) && value.length === 2 && value.every((item) => typeof item === \"string\");\n}\n\nfunction assertItem(edit: Record<string, unknown>, index: number): void {\n\trejectUnknownFields(edit, ITEM_KS, `Edit ${index}`, \"Each edit takes only { hash_range_inclusive, content_lines }.\");\n\n\tif (\"hash_range_inclusive\" in edit && !isStrPair(edit.hash_range_inclusive)) {\n\t\tthrow new Error(\n\t\t\t`[E_BAD_SHAPE] Edit ${index} field \"hash_range_inclusive\" must be a pair of anchor strings [start, end].`,\n\t\t);\n\t}\n\tif (!(\"content_lines\" in edit)) {\n\t\tthrow new Error(\n\t\t\t`[E_BAD_SHAPE] Edit ${index} requires a \"content_lines\" field. Provide the replacement lines (use [] to delete).`,\n\t\t);\n\t}\n\tif (\"content_lines\" in edit && !isStrArr(edit.content_lines)) {\n\t\tthrow new Error(`[E_BAD_SHAPE] Edit ${index} field \"content_lines\" must be a string array.`);\n\t}\n\tif (!isStrPair(edit.hash_range_inclusive)) {\n\t\tthrow new Error(\n\t\t\t`[E_BAD_SHAPE] Edit ${index} requires an \"hash_range_inclusive\" pair of anchor strings [start, end].`,\n\t\t);\n\t}\n}\n\nexport function resEdits(edits: HTEdit[]): HEdit[] {\n\tconst result: HEdit[] = [];\n\tfor (const [index, edit] of edits.entries()) {\n\t\tassertItem(edit as Record<string, unknown>, index);\n\n\t\tconst replaceLines = parseText(edit.content_lines);\n\t\tresult.push({\n\t\t\thash_range_inclusive: [parseHashRef(edit.hash_range_inclusive[0]), parseHashRef(edit.hash_range_inclusive[1])],\n\t\t\tcontent_lines: replaceLines,\n\t\t});\n\t}\n\treturn result;\n}\n\nfunction warnUnicodeEsc(edits: HEdit[], warnings: string[]): void {\n\tfor (const edit of edits) {\n\t\tif (edit.content_lines.some((line) => /\\\\uDDDD/i.test(line))) {\n\t\t\twarnings.push(\n\t\t\t\t\"Detected literal \\\\uDDDD in edit content; no autocorrection applied. Verify whether this should be a real Unicode escape or plain text.\",\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport function assertNoBarePrefix(edits: HEdit[], _fileLines: string[], fileHashes: string[]): void {\n\tconst suspects: { line: string; hash: string; editIndex: number; lineIndex: number }[] = [];\n\tfor (let editIndex = 0; editIndex < edits.length; editIndex++) {\n\t\tconst edit = edits[editIndex]!;\n\t\tfor (let lineIndex = 0; lineIndex < edit.content_lines.length; lineIndex++) {\n\t\t\tconst line = edit.content_lines[lineIndex]!;\n\t\t\tconst match = line.match(HL_BARE_PREFIX_RE);\n\t\t\tif (match) suspects.push({ line, hash: match[1]!, editIndex, lineIndex });\n\t\t}\n\t}\n\tif (suspects.length === 0) return;\n\tconst locations = suspects.map((s) => `edit ${s.editIndex}, content_lines[${s.lineIndex}]`).join(\"; \");\n\n\tconst fileHashSet = new Set(fileHashes);\n\tconst matched = suspects.filter((s) => fileHashSet.has(s.hash));\n\tconst matchedCount = matched.length;\n\n\tconst exampleLine = `${suspects[0]!.hash}│${suspects[0]!.line}`;\n\n\tconst linesHint =\n\t\tmatchedCount === 0\n\t\t\t? `None match file line hashes.`\n\t\t\t: `${matchedCount} match file line hashes — strong evidence the prefix was copied from read output.`;\n\n\tthrow new Error(\n\t\t`[E_BARE_HASH_PREFIX] ${suspects.length} edit line(s) start with a hash-like prefix (${locations}). Example: ${JSON.stringify(exampleLine)}. ${linesHint} Remove the \"HASH│\" prefix from each affected content_lines entry; keep only the literal line content that appears after \"│\" in read output. Remember: hash_range_inclusive uses hash anchors, content_lines uses file content only.`,\n\t);\n}\n\nexport function descEdit(edit: RHEdit): string {\n\treturn `replace ${edit.hash_range_inclusive[0].hash}-${edit.hash_range_inclusive[1].hash}`;\n}\n\nfunction checkBoundaryDup(\n\tadjacentLine: string | undefined,\n\treplacementEdge: string | undefined,\n\tkind: BoundaryDuplicateKind,\n\tsurvivingLineIndex: number,\n\tfileLines: string[],\n\teditIndex: number,\n): BDupWarn | null {\n\tif (\n\t\tadjacentLine === undefined ||\n\t\treplacementEdge === undefined ||\n\t\treplacementEdge.length === 0 ||\n\t\treplacementEdge !== adjacentLine\n\t)\n\t\treturn null;\n\treturn {\n\t\tkind,\n\t\tsurvivingLineContent: adjacentLine,\n\t\tsurvivingLineIndex,\n\t\toccurrence: fileLines.slice(0, survivingLineIndex).filter((l) => l === adjacentLine).length,\n\t\treplacementLineContent: replacementEdge,\n\t\teditIndex,\n\t};\n}\n\nexport function valEdits(\n\tedits: HEdit[],\n\tfileLines: string[],\n\tfileHashes: string[],\n\t_warnings: string[],\n\tsignal: AbortSignal | undefined,\n): EditValidationResult {\n\tassertAligned(fileLines, fileHashes, \"valEdits\");\n\tconst resolved: RHEdit[] = [];\n\tconst mismatches: HMismatch[] = [];\n\tconst boundaryWarnings: BDupWarn[] = [];\n\n\tconst tryResolve = (ref: Anchor): RAnchor | undefined => {\n\t\tconst result = resAnchor(ref, fileLines, fileHashes);\n\t\tif (\"kind\" in result) {\n\t\t\tmismatches.push(result);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn result;\n\t};\n\n\tfor (const edit of edits) {\n\t\tabortIf(signal);\n\t\tconst startResolved = tryResolve(edit.hash_range_inclusive[0]);\n\t\tconst endResolved = tryResolve(edit.hash_range_inclusive[1]);\n\t\tif (!startResolved || !endResolved) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (startResolved.line > endResolved.line) {\n\t\t\tthrow new Error(\n\t\t\t\t`[E_BAD_OP] Range start line ${startResolved.line} must be <= end line ${endResolved.line} (anchors ${edit.hash_range_inclusive[0].hash} and ${edit.hash_range_inclusive[1].hash}).`,\n\t\t\t);\n\t\t}\n\t\tconst endLine = endResolved.line;\n\t\tconst nextLine = fileLines[endLine];\n\t\tconst replacementLastLine = edit.content_lines.at(-1);\n\t\tconst trailing = checkBoundaryDup(nextLine, replacementLastLine, \"trailing\", endLine, fileLines, resolved.length);\n\t\tif (trailing) boundaryWarnings.push(trailing);\n\t\tconst prevLine = fileLines[startResolved.line - 2];\n\t\tconst replacementFirstLine = edit.content_lines[0];\n\t\tconst leading = checkBoundaryDup(\n\t\t\tprevLine,\n\t\t\treplacementFirstLine,\n\t\t\t\"leading\",\n\t\t\tstartResolved.line - 2,\n\t\t\tfileLines,\n\t\t\tresolved.length,\n\t\t);\n\t\tif (leading) boundaryWarnings.push(leading);\n\t\tresolved.push({\n\t\t\thash_range_inclusive: [startResolved, endResolved],\n\t\t\tcontent_lines: edit.content_lines,\n\t\t});\n\t}\n\n\treturn { resolved, mismatches, boundaryWarnings };\n}\n\nexport { warnUnicodeEsc };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"hashline-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tools/hashline-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEtE;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEzE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACX,IAAI,CAMN","sourcesContent":["export function isRec(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function has(record: Record<string, unknown>, key: string): boolean {\n\treturn Object.hasOwn(record, key);\n}\n\nexport function visLines(text: string): string[] {\n\tif (text.length === 0) return [];\n\tconst lines = text.split(\"\\n\");\n\treturn text.endsWith(\"\\n\") ? lines.slice(0, -1) : lines;\n}\n\nexport function cntLines(text: string): number {\n\treturn visLines(text).length;\n}\n\nexport function rejectUnknownFields(\n\tobj: Record<string, unknown>,\n\tallowed: Set<string>,\n\tlabel: string,\n\thint?: string,\n): void {\n\tconst unknown = Object.keys(obj).filter((key) => !allowed.has(key));\n\tif (unknown.length > 0) {\n\t\tconst suffix = hint ? ` ${hint}` : \"\";\n\t\tthrow new Error(`[E_BAD_SHAPE] ${label} contains unknown or unsupported fields: ${unknown.join(\", \")}.${suffix}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"hashline-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tools/hashline-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEtE;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEzE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACX,IAAI,CAMN"}
@@ -1 +1 @@
1
- {"version":3,"file":"hashline-utils.js","sourceRoot":"","sources":["../../../src/core/tools/hashline-utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAC,KAAc,EAAoC;IACvE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAAA,CAC5E;AAED,MAAM,UAAU,GAAG,CAAC,MAA+B,EAAE,GAAW,EAAW;IAC1E,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAAA,CAClC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAY;IAChD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAAA,CACxD;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAU;IAC9C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAAA,CAC7B;AAED,MAAM,UAAU,mBAAmB,CAClC,GAA4B,EAC5B,OAAoB,EACpB,KAAa,EACb,IAAa,EACN;IACP,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,4CAA4C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;IACnH,CAAC;AAAA,CACD","sourcesContent":["export function isRec(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function has(record: Record<string, unknown>, key: string): boolean {\n\treturn Object.hasOwn(record, key);\n}\n\nexport function visLines(text: string): string[] {\n\tif (text.length === 0) return [];\n\tconst lines = text.split(\"\\n\");\n\treturn text.endsWith(\"\\n\") ? lines.slice(0, -1) : lines;\n}\n\nexport function cntLines(text: string): number {\n\treturn visLines(text).length;\n}\n\nexport function rejectUnknownFields(\n\tobj: Record<string, unknown>,\n\tallowed: Set<string>,\n\tlabel: string,\n\thint?: string,\n): void {\n\tconst unknown = Object.keys(obj).filter((key) => !allowed.has(key));\n\tif (unknown.length > 0) {\n\t\tconst suffix = hint ? ` ${hint}` : \"\";\n\t\tthrow new Error(`[E_BAD_SHAPE] ${label} contains unknown or unsupported fields: ${unknown.join(\", \")}.${suffix}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"hashline-utils.js","sourceRoot":"","sources":["../../../src/core/tools/hashline-utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,MAA+B,EAAE,GAAW;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACpC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,GAA4B,EAC5B,OAAoB,EACpB,KAAa,EACb,IAAa;IAEb,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,4CAA4C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;IACnH,CAAC;AACF,CAAC","sourcesContent":["export function isRec(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function has(record: Record<string, unknown>, key: string): boolean {\n\treturn Object.hasOwn(record, key);\n}\n\nexport function visLines(text: string): string[] {\n\tif (text.length === 0) return [];\n\tconst lines = text.split(\"\\n\");\n\treturn text.endsWith(\"\\n\") ? lines.slice(0, -1) : lines;\n}\n\nexport function cntLines(text: string): number {\n\treturn visLines(text).length;\n}\n\nexport function rejectUnknownFields(\n\tobj: Record<string, unknown>,\n\tallowed: Set<string>,\n\tlabel: string,\n\thint?: string,\n): void {\n\tconst unknown = Object.keys(obj).filter((key) => !allowed.has(key));\n\tif (unknown.length > 0) {\n\t\tconst suffix = hint ? ` ${hint}` : \"\";\n\t\tthrow new Error(`[E_BAD_SHAPE] ${label} contains unknown or unsupported fields: ${unknown.join(\", \")}.${suffix}`);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,KAAK,eAAe,EAA4C,MAAM,WAAW,CAAC;AAC3F,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAON,KAAK,mBAAmB,EACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAsD,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/G,OAAO,EAA8C,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/F,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;AAClC,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC/C,MAAM,MAAM,QAAQ,GACjB,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,MAAM,GACN,IAAI,GACJ,UAAU,GACV,eAAe,GACf,iBAAiB,GACjB,WAAW,CAAC;AACf,eAAO,MAAM,YAAY,EAAE,GAAG,CAAC,QAAQ,CAYrC,CAAC;AAEH,MAAM,WAAW,YAAY;IAC5B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,SAAS,CAAC,EAAE,oBAAoB,CAAC;CACjC;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CA2BpH;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CA2BvG;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,EAAE,CAOzG;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,EAAE,CAO3G;AAED,wBAAgB,wBAAwB,CACvC,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,YAAY,GACpB,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAc3B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,EAAE,CAO5F;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,EAAE,CAO9F;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAczG","sourcesContent":["import type { AgentTool } from \"@greppleai/grip-agent-core\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { type BashToolOptions, createBashTool, createBashToolDefinition } from \"./bash.ts\";\nimport { createEditTool, createEditToolDefinition, type EditToolOptions } from \"./edit.ts\";\nimport { createFindTool, createFindToolDefinition, type FindToolOptions } from \"./find.ts\";\nimport { createGrepTool, createGrepToolDefinition, type GrepToolOptions } from \"./grep.ts\";\nimport { createLsTool, createLsToolDefinition, type LsToolOptions } from \"./ls.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport { createReadTool, createReadToolDefinition, type ReadToolOptions } from \"./read.ts\";\nimport {\n\tcreateCreateSubagentTool,\n\tcreateCreateSubagentToolDefinition,\n\tcreateSubagentRunsTool,\n\tcreateSubagentRunsToolDefinition,\n\tcreateSubagentTool,\n\tcreateSubagentToolDefinition,\n\ttype SubagentToolOptions,\n} from \"./subagent.ts\";\nimport { createWebsearchTool, createWebsearchToolDefinition, type WebsearchToolOptions } from \"./websearch.ts\";\nimport { createWriteTool, createWriteToolDefinition, type WriteToolOptions } from \"./write.ts\";\n\nexport type Tool = AgentTool<any>;\nexport type ToolDef = ToolDefinition<any, any>;\nexport type ToolName =\n\t| \"read\"\n\t| \"bash\"\n\t| \"edit\"\n\t| \"write\"\n\t| \"grep\"\n\t| \"find\"\n\t| \"ls\"\n\t| \"subagent\"\n\t| \"subagent_runs\"\n\t| \"create_subagent\"\n\t| \"websearch\";\nexport const allToolNames: Set<ToolName> = new Set([\n\t\"read\",\n\t\"bash\",\n\t\"edit\",\n\t\"write\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"subagent\",\n\t\"subagent_runs\",\n\t\"create_subagent\",\n\t\"websearch\",\n]);\n\nexport interface ToolsOptions {\n\tread?: ReadToolOptions;\n\tbash?: BashToolOptions;\n\twrite?: WriteToolOptions;\n\tedit?: EditToolOptions;\n\tgrep?: GrepToolOptions;\n\tfind?: FindToolOptions;\n\tls?: LsToolOptions;\n\tsubagent?: SubagentToolOptions;\n\twebsearch?: WebsearchToolOptions;\n}\n\nexport function createToolDefinition(toolName: ToolName, operations: ToolOperations, options?: ToolsOptions): ToolDef {\n\tswitch (toolName) {\n\t\tcase \"read\":\n\t\t\treturn createReadToolDefinition(operations, options?.read);\n\t\tcase \"bash\":\n\t\t\treturn createBashToolDefinition(operations, options?.bash);\n\t\tcase \"edit\":\n\t\t\treturn createEditToolDefinition(operations, options?.edit);\n\t\tcase \"write\":\n\t\t\treturn createWriteToolDefinition(operations, options?.write);\n\t\tcase \"grep\":\n\t\t\treturn createGrepToolDefinition(operations, options?.grep);\n\t\tcase \"find\":\n\t\t\treturn createFindToolDefinition(operations, options?.find);\n\t\tcase \"ls\":\n\t\t\treturn createLsToolDefinition(operations, options?.ls);\n\t\tcase \"subagent\":\n\t\t\treturn createSubagentToolDefinition(options?.subagent);\n\t\tcase \"subagent_runs\":\n\t\t\treturn createSubagentRunsToolDefinition(options?.subagent?.runRegistry);\n\t\tcase \"create_subagent\":\n\t\t\treturn createCreateSubagentToolDefinition(options?.subagent?.configRegistry);\n\t\tcase \"websearch\":\n\t\t\treturn createWebsearchToolDefinition(options?.websearch);\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown tool name: ${toolName}`);\n\t}\n}\n\nexport function createTool(toolName: ToolName, operations: ToolOperations, options?: ToolsOptions): Tool {\n\tswitch (toolName) {\n\t\tcase \"read\":\n\t\t\treturn createReadTool(operations, options?.read);\n\t\tcase \"bash\":\n\t\t\treturn createBashTool(operations, options?.bash);\n\t\tcase \"edit\":\n\t\t\treturn createEditTool(operations, options?.edit);\n\t\tcase \"write\":\n\t\t\treturn createWriteTool(operations, options?.write);\n\t\tcase \"grep\":\n\t\t\treturn createGrepTool(operations, options?.grep);\n\t\tcase \"find\":\n\t\t\treturn createFindTool(operations, options?.find);\n\t\tcase \"ls\":\n\t\t\treturn createLsTool(operations, options?.ls);\n\t\tcase \"subagent\":\n\t\t\treturn createSubagentTool(options?.subagent);\n\t\tcase \"subagent_runs\":\n\t\t\treturn createSubagentRunsTool(options?.subagent?.runRegistry);\n\t\tcase \"create_subagent\":\n\t\t\treturn createCreateSubagentTool(options?.subagent?.configRegistry);\n\t\tcase \"websearch\":\n\t\t\treturn createWebsearchTool(options?.websearch);\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown tool name: ${toolName}`);\n\t}\n}\n\nexport function createCodingToolDefinitions(operations: ToolOperations, options?: ToolsOptions): ToolDef[] {\n\treturn [\n\t\tcreateReadToolDefinition(operations, options?.read),\n\t\tcreateBashToolDefinition(operations, options?.bash),\n\t\tcreateEditToolDefinition(operations, options?.edit),\n\t\tcreateWriteToolDefinition(operations, options?.write),\n\t];\n}\n\nexport function createReadOnlyToolDefinitions(operations: ToolOperations, options?: ToolsOptions): ToolDef[] {\n\treturn [\n\t\tcreateReadToolDefinition(operations, options?.read),\n\t\tcreateGrepToolDefinition(operations, options?.grep),\n\t\tcreateFindToolDefinition(operations, options?.find),\n\t\tcreateLsToolDefinition(operations, options?.ls),\n\t];\n}\n\nexport function createAllToolDefinitions(\n\toperations: ToolOperations,\n\toptions?: ToolsOptions,\n): Record<ToolName, ToolDef> {\n\treturn {\n\t\tread: createReadToolDefinition(operations, options?.read),\n\t\tbash: createBashToolDefinition(operations, options?.bash),\n\t\tedit: createEditToolDefinition(operations, options?.edit),\n\t\twrite: createWriteToolDefinition(operations, options?.write),\n\t\tgrep: createGrepToolDefinition(operations, options?.grep),\n\t\tfind: createFindToolDefinition(operations, options?.find),\n\t\tls: createLsToolDefinition(operations, options?.ls),\n\t\tsubagent: createSubagentToolDefinition(options?.subagent),\n\t\tsubagent_runs: createSubagentRunsToolDefinition(options?.subagent?.runRegistry),\n\t\tcreate_subagent: createCreateSubagentToolDefinition(options?.subagent?.configRegistry),\n\t\twebsearch: createWebsearchToolDefinition(options?.websearch),\n\t};\n}\n\nexport function createCodingTools(operations: ToolOperations, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(operations, options?.read),\n\t\tcreateBashTool(operations, options?.bash),\n\t\tcreateEditTool(operations, options?.edit),\n\t\tcreateWriteTool(operations, options?.write),\n\t];\n}\n\nexport function createReadOnlyTools(operations: ToolOperations, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(operations, options?.read),\n\t\tcreateGrepTool(operations, options?.grep),\n\t\tcreateFindTool(operations, options?.find),\n\t\tcreateLsTool(operations, options?.ls),\n\t];\n}\n\nexport function createAllTools(operations: ToolOperations, options?: ToolsOptions): Record<ToolName, Tool> {\n\treturn {\n\t\tread: createReadTool(operations, options?.read),\n\t\tbash: createBashTool(operations, options?.bash),\n\t\tedit: createEditTool(operations, options?.edit),\n\t\twrite: createWriteTool(operations, options?.write),\n\t\tgrep: createGrepTool(operations, options?.grep),\n\t\tfind: createFindTool(operations, options?.find),\n\t\tls: createLsTool(operations, options?.ls),\n\t\tsubagent: createSubagentTool(options?.subagent),\n\t\tsubagent_runs: createSubagentRunsTool(options?.subagent?.runRegistry),\n\t\tcreate_subagent: createCreateSubagentTool(options?.subagent?.configRegistry),\n\t\twebsearch: createWebsearchTool(options?.websearch),\n\t};\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,KAAK,eAAe,EAA4C,MAAM,WAAW,CAAC;AAC3F,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAON,KAAK,mBAAmB,EACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAsD,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/G,OAAO,EAA8C,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/F,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;AAClC,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC/C,MAAM,MAAM,QAAQ,GACjB,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,MAAM,GACN,IAAI,GACJ,UAAU,GACV,eAAe,GACf,iBAAiB,GACjB,WAAW,CAAC;AACf,eAAO,MAAM,YAAY,EAAE,GAAG,CAAC,QAAQ,CAYrC,CAAC;AAEH,MAAM,WAAW,YAAY;IAC5B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,SAAS,CAAC,EAAE,oBAAoB,CAAC;CACjC;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CA2BpH;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CA2BvG;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,EAAE,CAOzG;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,EAAE,CAO3G;AAED,wBAAgB,wBAAwB,CACvC,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,YAAY,GACpB,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAc3B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,EAAE,CAO5F;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,EAAE,CAO9F;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAczG"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@greppleai/grip-agent-core\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { type BashToolOptions, createBashTool, createBashToolDefinition } from \"./bash.ts\";\nimport { createEditTool, createEditToolDefinition, type EditToolOptions } from \"./edit.ts\";\nimport { createFindTool, createFindToolDefinition, type FindToolOptions } from \"./find.ts\";\nimport { createGrepTool, createGrepToolDefinition, type GrepToolOptions } from \"./grep.ts\";\nimport { createLsTool, createLsToolDefinition, type LsToolOptions } from \"./ls.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport { createReadTool, createReadToolDefinition, type ReadToolOptions } from \"./read.ts\";\nimport {\n\tcreateCreateSubagentTool,\n\tcreateCreateSubagentToolDefinition,\n\tcreateSubagentRunsTool,\n\tcreateSubagentRunsToolDefinition,\n\tcreateSubagentTool,\n\tcreateSubagentToolDefinition,\n\ttype SubagentToolOptions,\n} from \"./subagent.ts\";\nimport { createWebsearchTool, createWebsearchToolDefinition, type WebsearchToolOptions } from \"./websearch.ts\";\nimport { createWriteTool, createWriteToolDefinition, type WriteToolOptions } from \"./write.ts\";\n\nexport type Tool = AgentTool<any>;\nexport type ToolDef = ToolDefinition<any, any>;\nexport type ToolName =\n\t| \"read\"\n\t| \"bash\"\n\t| \"edit\"\n\t| \"write\"\n\t| \"grep\"\n\t| \"find\"\n\t| \"ls\"\n\t| \"subagent\"\n\t| \"subagent_runs\"\n\t| \"create_subagent\"\n\t| \"websearch\";\nexport const allToolNames: Set<ToolName> = new Set([\n\t\"read\",\n\t\"bash\",\n\t\"edit\",\n\t\"write\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"subagent\",\n\t\"subagent_runs\",\n\t\"create_subagent\",\n\t\"websearch\",\n]);\n\nexport interface ToolsOptions {\n\tread?: ReadToolOptions;\n\tbash?: BashToolOptions;\n\twrite?: WriteToolOptions;\n\tedit?: EditToolOptions;\n\tgrep?: GrepToolOptions;\n\tfind?: FindToolOptions;\n\tls?: LsToolOptions;\n\tsubagent?: SubagentToolOptions;\n\twebsearch?: WebsearchToolOptions;\n}\n\nexport function createToolDefinition(toolName: ToolName, operations: ToolOperations, options?: ToolsOptions): ToolDef {\n\tswitch (toolName) {\n\t\tcase \"read\":\n\t\t\treturn createReadToolDefinition(operations, options?.read);\n\t\tcase \"bash\":\n\t\t\treturn createBashToolDefinition(operations, options?.bash);\n\t\tcase \"edit\":\n\t\t\treturn createEditToolDefinition(operations, options?.edit);\n\t\tcase \"write\":\n\t\t\treturn createWriteToolDefinition(operations, options?.write);\n\t\tcase \"grep\":\n\t\t\treturn createGrepToolDefinition(operations, options?.grep);\n\t\tcase \"find\":\n\t\t\treturn createFindToolDefinition(operations, options?.find);\n\t\tcase \"ls\":\n\t\t\treturn createLsToolDefinition(operations, options?.ls);\n\t\tcase \"subagent\":\n\t\t\treturn createSubagentToolDefinition(options?.subagent);\n\t\tcase \"subagent_runs\":\n\t\t\treturn createSubagentRunsToolDefinition(options?.subagent?.runRegistry);\n\t\tcase \"create_subagent\":\n\t\t\treturn createCreateSubagentToolDefinition(options?.subagent?.configRegistry);\n\t\tcase \"websearch\":\n\t\t\treturn createWebsearchToolDefinition(options?.websearch);\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown tool name: ${toolName}`);\n\t}\n}\n\nexport function createTool(toolName: ToolName, operations: ToolOperations, options?: ToolsOptions): Tool {\n\tswitch (toolName) {\n\t\tcase \"read\":\n\t\t\treturn createReadTool(operations, options?.read);\n\t\tcase \"bash\":\n\t\t\treturn createBashTool(operations, options?.bash);\n\t\tcase \"edit\":\n\t\t\treturn createEditTool(operations, options?.edit);\n\t\tcase \"write\":\n\t\t\treturn createWriteTool(operations, options?.write);\n\t\tcase \"grep\":\n\t\t\treturn createGrepTool(operations, options?.grep);\n\t\tcase \"find\":\n\t\t\treturn createFindTool(operations, options?.find);\n\t\tcase \"ls\":\n\t\t\treturn createLsTool(operations, options?.ls);\n\t\tcase \"subagent\":\n\t\t\treturn createSubagentTool(options?.subagent);\n\t\tcase \"subagent_runs\":\n\t\t\treturn createSubagentRunsTool(options?.subagent?.runRegistry);\n\t\tcase \"create_subagent\":\n\t\t\treturn createCreateSubagentTool(options?.subagent?.configRegistry);\n\t\tcase \"websearch\":\n\t\t\treturn createWebsearchTool(options?.websearch);\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown tool name: ${toolName}`);\n\t}\n}\n\nexport function createCodingToolDefinitions(operations: ToolOperations, options?: ToolsOptions): ToolDef[] {\n\treturn [\n\t\tcreateReadToolDefinition(operations, options?.read),\n\t\tcreateBashToolDefinition(operations, options?.bash),\n\t\tcreateEditToolDefinition(operations, options?.edit),\n\t\tcreateWriteToolDefinition(operations, options?.write),\n\t];\n}\n\nexport function createReadOnlyToolDefinitions(operations: ToolOperations, options?: ToolsOptions): ToolDef[] {\n\treturn [\n\t\tcreateReadToolDefinition(operations, options?.read),\n\t\tcreateGrepToolDefinition(operations, options?.grep),\n\t\tcreateFindToolDefinition(operations, options?.find),\n\t\tcreateLsToolDefinition(operations, options?.ls),\n\t];\n}\n\nexport function createAllToolDefinitions(\n\toperations: ToolOperations,\n\toptions?: ToolsOptions,\n): Record<ToolName, ToolDef> {\n\treturn {\n\t\tread: createReadToolDefinition(operations, options?.read),\n\t\tbash: createBashToolDefinition(operations, options?.bash),\n\t\tedit: createEditToolDefinition(operations, options?.edit),\n\t\twrite: createWriteToolDefinition(operations, options?.write),\n\t\tgrep: createGrepToolDefinition(operations, options?.grep),\n\t\tfind: createFindToolDefinition(operations, options?.find),\n\t\tls: createLsToolDefinition(operations, options?.ls),\n\t\tsubagent: createSubagentToolDefinition(options?.subagent),\n\t\tsubagent_runs: createSubagentRunsToolDefinition(options?.subagent?.runRegistry),\n\t\tcreate_subagent: createCreateSubagentToolDefinition(options?.subagent?.configRegistry),\n\t\twebsearch: createWebsearchToolDefinition(options?.websearch),\n\t};\n}\n\nexport function createCodingTools(operations: ToolOperations, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(operations, options?.read),\n\t\tcreateBashTool(operations, options?.bash),\n\t\tcreateEditTool(operations, options?.edit),\n\t\tcreateWriteTool(operations, options?.write),\n\t];\n}\n\nexport function createReadOnlyTools(operations: ToolOperations, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(operations, options?.read),\n\t\tcreateGrepTool(operations, options?.grep),\n\t\tcreateFindTool(operations, options?.find),\n\t\tcreateLsTool(operations, options?.ls),\n\t];\n}\n\nexport function createAllTools(operations: ToolOperations, options?: ToolsOptions): Record<ToolName, Tool> {\n\treturn {\n\t\tread: createReadTool(operations, options?.read),\n\t\tbash: createBashTool(operations, options?.bash),\n\t\tedit: createEditTool(operations, options?.edit),\n\t\twrite: createWriteTool(operations, options?.write),\n\t\tgrep: createGrepTool(operations, options?.grep),\n\t\tfind: createFindTool(operations, options?.find),\n\t\tls: createLsTool(operations, options?.ls),\n\t\tsubagent: createSubagentTool(options?.subagent),\n\t\tsubagent_runs: createSubagentRunsTool(options?.subagent?.runRegistry),\n\t\tcreate_subagent: createCreateSubagentTool(options?.subagent?.configRegistry),\n\t\twebsearch: createWebsearchTool(options?.websearch),\n\t};\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@greppleai/grip-agent-core\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { type BashToolOptions, createBashTool, createBashToolDefinition } from \"./bash.ts\";\nimport { createEditTool, createEditToolDefinition, type EditToolOptions } from \"./edit.ts\";\nimport { createFindTool, createFindToolDefinition, type FindToolOptions } from \"./find.ts\";\nimport { createGrepTool, createGrepToolDefinition, type GrepToolOptions } from \"./grep.ts\";\nimport { createLsTool, createLsToolDefinition, type LsToolOptions } from \"./ls.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport { createReadTool, createReadToolDefinition, type ReadToolOptions } from \"./read.ts\";\nimport {\n\tcreateCreateSubagentTool,\n\tcreateCreateSubagentToolDefinition,\n\tcreateSubagentRunsTool,\n\tcreateSubagentRunsToolDefinition,\n\tcreateSubagentTool,\n\tcreateSubagentToolDefinition,\n\ttype SubagentToolOptions,\n} from \"./subagent.ts\";\nimport { createWebsearchTool, createWebsearchToolDefinition, type WebsearchToolOptions } from \"./websearch.ts\";\nimport { createWriteTool, createWriteToolDefinition, type WriteToolOptions } from \"./write.ts\";\n\nexport type Tool = AgentTool<any>;\nexport type ToolDef = ToolDefinition<any, any>;\nexport type ToolName =\n\t| \"read\"\n\t| \"bash\"\n\t| \"edit\"\n\t| \"write\"\n\t| \"grep\"\n\t| \"find\"\n\t| \"ls\"\n\t| \"subagent\"\n\t| \"subagent_runs\"\n\t| \"create_subagent\"\n\t| \"websearch\";\nexport const allToolNames: Set<ToolName> = new Set([\n\t\"read\",\n\t\"bash\",\n\t\"edit\",\n\t\"write\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"subagent\",\n\t\"subagent_runs\",\n\t\"create_subagent\",\n\t\"websearch\",\n]);\n\nexport interface ToolsOptions {\n\tread?: ReadToolOptions;\n\tbash?: BashToolOptions;\n\twrite?: WriteToolOptions;\n\tedit?: EditToolOptions;\n\tgrep?: GrepToolOptions;\n\tfind?: FindToolOptions;\n\tls?: LsToolOptions;\n\tsubagent?: SubagentToolOptions;\n\twebsearch?: WebsearchToolOptions;\n}\n\nexport function createToolDefinition(toolName: ToolName, operations: ToolOperations, options?: ToolsOptions): ToolDef {\n\tswitch (toolName) {\n\t\tcase \"read\":\n\t\t\treturn createReadToolDefinition(operations, options?.read);\n\t\tcase \"bash\":\n\t\t\treturn createBashToolDefinition(operations, options?.bash);\n\t\tcase \"edit\":\n\t\t\treturn createEditToolDefinition(operations, options?.edit);\n\t\tcase \"write\":\n\t\t\treturn createWriteToolDefinition(operations, options?.write);\n\t\tcase \"grep\":\n\t\t\treturn createGrepToolDefinition(operations, options?.grep);\n\t\tcase \"find\":\n\t\t\treturn createFindToolDefinition(operations, options?.find);\n\t\tcase \"ls\":\n\t\t\treturn createLsToolDefinition(operations, options?.ls);\n\t\tcase \"subagent\":\n\t\t\treturn createSubagentToolDefinition(options?.subagent);\n\t\tcase \"subagent_runs\":\n\t\t\treturn createSubagentRunsToolDefinition(options?.subagent?.runRegistry);\n\t\tcase \"create_subagent\":\n\t\t\treturn createCreateSubagentToolDefinition(options?.subagent?.configRegistry);\n\t\tcase \"websearch\":\n\t\t\treturn createWebsearchToolDefinition(options?.websearch);\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown tool name: ${toolName}`);\n\t}\n}\n\nexport function createTool(toolName: ToolName, operations: ToolOperations, options?: ToolsOptions): Tool {\n\tswitch (toolName) {\n\t\tcase \"read\":\n\t\t\treturn createReadTool(operations, options?.read);\n\t\tcase \"bash\":\n\t\t\treturn createBashTool(operations, options?.bash);\n\t\tcase \"edit\":\n\t\t\treturn createEditTool(operations, options?.edit);\n\t\tcase \"write\":\n\t\t\treturn createWriteTool(operations, options?.write);\n\t\tcase \"grep\":\n\t\t\treturn createGrepTool(operations, options?.grep);\n\t\tcase \"find\":\n\t\t\treturn createFindTool(operations, options?.find);\n\t\tcase \"ls\":\n\t\t\treturn createLsTool(operations, options?.ls);\n\t\tcase \"subagent\":\n\t\t\treturn createSubagentTool(options?.subagent);\n\t\tcase \"subagent_runs\":\n\t\t\treturn createSubagentRunsTool(options?.subagent?.runRegistry);\n\t\tcase \"create_subagent\":\n\t\t\treturn createCreateSubagentTool(options?.subagent?.configRegistry);\n\t\tcase \"websearch\":\n\t\t\treturn createWebsearchTool(options?.websearch);\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown tool name: ${toolName}`);\n\t}\n}\n\nexport function createCodingToolDefinitions(operations: ToolOperations, options?: ToolsOptions): ToolDef[] {\n\treturn [\n\t\tcreateReadToolDefinition(operations, options?.read),\n\t\tcreateBashToolDefinition(operations, options?.bash),\n\t\tcreateEditToolDefinition(operations, options?.edit),\n\t\tcreateWriteToolDefinition(operations, options?.write),\n\t];\n}\n\nexport function createReadOnlyToolDefinitions(operations: ToolOperations, options?: ToolsOptions): ToolDef[] {\n\treturn [\n\t\tcreateReadToolDefinition(operations, options?.read),\n\t\tcreateGrepToolDefinition(operations, options?.grep),\n\t\tcreateFindToolDefinition(operations, options?.find),\n\t\tcreateLsToolDefinition(operations, options?.ls),\n\t];\n}\n\nexport function createAllToolDefinitions(\n\toperations: ToolOperations,\n\toptions?: ToolsOptions,\n): Record<ToolName, ToolDef> {\n\treturn {\n\t\tread: createReadToolDefinition(operations, options?.read),\n\t\tbash: createBashToolDefinition(operations, options?.bash),\n\t\tedit: createEditToolDefinition(operations, options?.edit),\n\t\twrite: createWriteToolDefinition(operations, options?.write),\n\t\tgrep: createGrepToolDefinition(operations, options?.grep),\n\t\tfind: createFindToolDefinition(operations, options?.find),\n\t\tls: createLsToolDefinition(operations, options?.ls),\n\t\tsubagent: createSubagentToolDefinition(options?.subagent),\n\t\tsubagent_runs: createSubagentRunsToolDefinition(options?.subagent?.runRegistry),\n\t\tcreate_subagent: createCreateSubagentToolDefinition(options?.subagent?.configRegistry),\n\t\twebsearch: createWebsearchToolDefinition(options?.websearch),\n\t};\n}\n\nexport function createCodingTools(operations: ToolOperations, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(operations, options?.read),\n\t\tcreateBashTool(operations, options?.bash),\n\t\tcreateEditTool(operations, options?.edit),\n\t\tcreateWriteTool(operations, options?.write),\n\t];\n}\n\nexport function createReadOnlyTools(operations: ToolOperations, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(operations, options?.read),\n\t\tcreateGrepTool(operations, options?.grep),\n\t\tcreateFindTool(operations, options?.find),\n\t\tcreateLsTool(operations, options?.ls),\n\t];\n}\n\nexport function createAllTools(operations: ToolOperations, options?: ToolsOptions): Record<ToolName, Tool> {\n\treturn {\n\t\tread: createReadTool(operations, options?.read),\n\t\tbash: createBashTool(operations, options?.bash),\n\t\tedit: createEditTool(operations, options?.edit),\n\t\twrite: createWriteTool(operations, options?.write),\n\t\tgrep: createGrepTool(operations, options?.grep),\n\t\tfind: createFindTool(operations, options?.find),\n\t\tls: createLsTool(operations, options?.ls),\n\t\tsubagent: createSubagentTool(options?.subagent),\n\t\tsubagent_runs: createSubagentRunsTool(options?.subagent?.runRegistry),\n\t\tcreate_subagent: createCreateSubagentTool(options?.subagent?.configRegistry),\n\t\twebsearch: createWebsearchTool(options?.websearch),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../../src/core/tools/ls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,4BAA4B,CAAC;AAG7E,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAWtD,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEnG,QAAA,MAAM,QAAQ;;;EAGZ,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAC;AAIlD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;CAAG;AAmJjC,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC,CAAC;AAE1F,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,gBAAgB,CAuB7G;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,OAAO,QAAQ,CAAC,CAE5G","sourcesContent":["import type { AgentTool, AgentToolResult } from \"@greppleai/grip-agent-core\";\nimport { Text } from \"@greppleai/grip-tui\";\nimport nodePath from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport {\n\tformatBackendIcon,\n\tformatHiddenLinesHint,\n\tgetTextOutput,\n\tinvalidArgText,\n\tshortenPath,\n\tstr,\n} from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst lsSchema = Type.Object({\n\tpath: Type.Optional(Type.String({ description: \"Directory to list (default: current directory)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of entries to return (default: 500)\" })),\n});\n\nexport type LsToolInput = Static<typeof lsSchema>;\n\nconst DEFAULT_LIMIT = 500;\n\nexport interface LsToolDetails {\n\ttruncation?: TruncationResult;\n\tentryLimitReached?: number;\n}\n\nexport interface LsToolOptions {}\n\nfunction formatLsCall(args: Partial<LsToolInput> | undefined, theme: Theme): string {\n\tconst rawPath = str(args?.path);\n\tconst path = rawPath !== null ? shortenPath(rawPath || \".\") : null;\n\tconst limit = args?.limit;\n\tconst invalidArg = invalidArgText(theme);\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"ls\"))} ${path === null ? invalidArg : theme.fg(\"accent\", path)}`;\n\tif (limit !== undefined) {\n\t\ttext += theme.fg(\"toolOutput\", ` (limit ${limit})`);\n\t}\n\treturn text;\n}\n\nfunction formatLsResult(\n\tresult: AgentToolResult<LsToolDetails | undefined>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n): string {\n\tconst output = getTextOutput(result, showImages).trim();\n\tlet text = \"\";\n\tif (output) {\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst maxLines = options.expanded ? lines.length : 20;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n${displayLines.map((line) => theme.fg(\"toolOutput\", line)).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `\\n\\n${formatHiddenLinesHint(remaining, theme)}`;\n\t\t}\n\t}\n\n\tconst entryLimit = result.details?.entryLimitReached;\n\tconst truncation = result.details?.truncation;\n\tif (entryLimit || truncation?.truncated) {\n\t\tconst warnings: string[] = [];\n\t\tif (entryLimit) warnings.push(`${entryLimit} entries limit`);\n\t\tif (truncation?.truncated) warnings.push(`${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit`);\n\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${warnings.join(\", \")}]`)}`;\n\t}\n\treturn text;\n}\ninterface DirectoryListingEntries {\n\tentries: string[];\n\tentryLimitReached: boolean;\n}\n\nasync function readDirectoryNames(dirPath: string, operations: ToolOperations): Promise<string[]> {\n\ttry {\n\t\treturn await operations.readdir(dirPath);\n\t} catch (error) {\n\t\tconst message =\n\t\t\ttypeof error === \"object\" && error !== null && \"message\" in error ? String(error.message) : \"undefined\";\n\t\tthrow new Error(`Cannot read directory: ${message}`);\n\t}\n}\n\nasync function collectDirectoryListingEntries(\n\tdirPath: string,\n\tnames: string[],\n\tlimit: number,\n\toperations: ToolOperations,\n): Promise<DirectoryListingEntries> {\n\tnames.sort((left, right) => left.toLowerCase().localeCompare(right.toLowerCase()));\n\tconst entries: string[] = [];\n\tfor (const name of names) {\n\t\tif (entries.length >= limit) return { entries, entryLimitReached: true };\n\t\ttry {\n\t\t\tconst entryStat = await operations.stat(nodePath.join(dirPath, name));\n\t\t\tentries.push(entryStat.isDirectory() ? `${name}/` : name);\n\t\t} catch {\n\t\t\t// Skip entries we cannot stat.\n\t\t}\n\t}\n\treturn { entries, entryLimitReached: false };\n}\n\nfunction formatDirectoryListingResult(\n\tlisting: DirectoryListingEntries,\n\tlimit: number,\n): AgentToolResult<LsToolDetails | undefined> {\n\tif (listing.entries.length === 0) {\n\t\treturn { content: [{ type: \"text\", text: \"(empty directory)\" }], details: undefined };\n\t}\n\tconst truncation = truncateHead(listing.entries.join(\"\\n\"), { maxLines: Number.MAX_SAFE_INTEGER });\n\tlet output = truncation.content;\n\tconst details: LsToolDetails = {};\n\tconst notices: string[] = [];\n\tif (listing.entryLimitReached) {\n\t\tnotices.push(`${limit} entries limit reached. Use limit=${limit * 2} for more`);\n\t\tdetails.entryLimitReached = limit;\n\t}\n\tif (truncation.truncated) {\n\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\tdetails.truncation = truncation;\n\t}\n\tif (notices.length > 0) output += `\\n\\n[${notices.join(\". \")}]`;\n\treturn {\n\t\tcontent: [{ type: \"text\", text: output }],\n\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t};\n}\n\nasync function buildDirectoryListing(\n\tinput: LsToolInput,\n\toperations: ToolOperations,\n\tcwd: string,\n): Promise<AgentToolResult<LsToolDetails | undefined>> {\n\tconst dirPath = resolveToCwd(input.path || \".\", cwd);\n\tconst limit = input.limit ?? DEFAULT_LIMIT;\n\ttry {\n\t\tawait operations.access(dirPath, \"exists\");\n\t} catch {\n\t\tthrow new Error(`Path not found: ${dirPath}`);\n\t}\n\tif (!(await operations.stat(dirPath)).isDirectory()) throw new Error(`Not a directory: ${dirPath}`);\n\tconst names = await readDirectoryNames(dirPath, operations);\n\treturn formatDirectoryListingResult(await collectDirectoryListingEntries(dirPath, names, limit, operations), limit);\n}\n\nfunction executeAbortableDirectoryListing(\n\tinput: LsToolInput,\n\toperations: ToolOperations,\n\tcwd: string,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<LsToolDetails | undefined>> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\treturn;\n\t\t}\n\t\tconst onAbort = () => reject(new Error(\"Operation aborted\"));\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid buildDirectoryListing(input, operations, cwd).then(\n\t\t\t(result) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tresolve(result);\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treject(error);\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport type LsToolDefinition = ToolDefinition<typeof lsSchema, LsToolDetails | undefined>;\n\nexport function createLsToolDefinition(operations: ToolOperations, _options?: LsToolOptions): LsToolDefinition {\n\tconst ops = operations;\n\tconst cwd = operations.cwd;\n\treturn {\n\t\tname: \"ls\",\n\t\tlabel: \"ls\",\n\t\tdescription: `List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT} entries or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,\n\t\tpromptSnippet: \"List directory contents\",\n\t\tparameters: lsSchema,\n\t\tasync execute(_toolCallId, input: LsToolInput, signal?: AbortSignal, _onUpdate?, _ctx?) {\n\t\t\treturn executeAbortableDirectoryListing(input, ops, cwd, signal);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatBackendIcon(ops.getBackendInfo?.(), theme) + formatLsCall(args, theme));\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatLsResult(result, options, theme, context.showImages));\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createLsTool(operations: ToolOperations, options?: LsToolOptions): AgentTool<typeof lsSchema> {\n\treturn wrapToolDefinition(createLsToolDefinition(operations, options));\n}\n"]}
1
+ {"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../../src/core/tools/ls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,4BAA4B,CAAC;AAG7E,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAWtD,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEnG,QAAA,MAAM,QAAQ;;;EAGZ,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAC;AAIlD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;CAAG;AAmJjC,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC,CAAC;AAE1F,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,gBAAgB,CAuB7G;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,OAAO,QAAQ,CAAC,CAE5G"}
@@ -1 +1 @@
1
- {"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/core/tools/ls.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool, AgentToolResult } from \"@greppleai/grip-agent-core\";\nimport { Text } from \"@greppleai/grip-tui\";\nimport nodePath from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport {\n\tformatBackendIcon,\n\tformatHiddenLinesHint,\n\tgetTextOutput,\n\tinvalidArgText,\n\tshortenPath,\n\tstr,\n} from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst lsSchema = Type.Object({\n\tpath: Type.Optional(Type.String({ description: \"Directory to list (default: current directory)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of entries to return (default: 500)\" })),\n});\n\nexport type LsToolInput = Static<typeof lsSchema>;\n\nconst DEFAULT_LIMIT = 500;\n\nexport interface LsToolDetails {\n\ttruncation?: TruncationResult;\n\tentryLimitReached?: number;\n}\n\nexport interface LsToolOptions {}\n\nfunction formatLsCall(args: Partial<LsToolInput> | undefined, theme: Theme): string {\n\tconst rawPath = str(args?.path);\n\tconst path = rawPath !== null ? shortenPath(rawPath || \".\") : null;\n\tconst limit = args?.limit;\n\tconst invalidArg = invalidArgText(theme);\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"ls\"))} ${path === null ? invalidArg : theme.fg(\"accent\", path)}`;\n\tif (limit !== undefined) {\n\t\ttext += theme.fg(\"toolOutput\", ` (limit ${limit})`);\n\t}\n\treturn text;\n}\n\nfunction formatLsResult(\n\tresult: AgentToolResult<LsToolDetails | undefined>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n): string {\n\tconst output = getTextOutput(result, showImages).trim();\n\tlet text = \"\";\n\tif (output) {\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst maxLines = options.expanded ? lines.length : 20;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n${displayLines.map((line) => theme.fg(\"toolOutput\", line)).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `\\n\\n${formatHiddenLinesHint(remaining, theme)}`;\n\t\t}\n\t}\n\n\tconst entryLimit = result.details?.entryLimitReached;\n\tconst truncation = result.details?.truncation;\n\tif (entryLimit || truncation?.truncated) {\n\t\tconst warnings: string[] = [];\n\t\tif (entryLimit) warnings.push(`${entryLimit} entries limit`);\n\t\tif (truncation?.truncated) warnings.push(`${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit`);\n\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${warnings.join(\", \")}]`)}`;\n\t}\n\treturn text;\n}\ninterface DirectoryListingEntries {\n\tentries: string[];\n\tentryLimitReached: boolean;\n}\n\nasync function readDirectoryNames(dirPath: string, operations: ToolOperations): Promise<string[]> {\n\ttry {\n\t\treturn await operations.readdir(dirPath);\n\t} catch (error) {\n\t\tconst message =\n\t\t\ttypeof error === \"object\" && error !== null && \"message\" in error ? String(error.message) : \"undefined\";\n\t\tthrow new Error(`Cannot read directory: ${message}`);\n\t}\n}\n\nasync function collectDirectoryListingEntries(\n\tdirPath: string,\n\tnames: string[],\n\tlimit: number,\n\toperations: ToolOperations,\n): Promise<DirectoryListingEntries> {\n\tnames.sort((left, right) => left.toLowerCase().localeCompare(right.toLowerCase()));\n\tconst entries: string[] = [];\n\tfor (const name of names) {\n\t\tif (entries.length >= limit) return { entries, entryLimitReached: true };\n\t\ttry {\n\t\t\tconst entryStat = await operations.stat(nodePath.join(dirPath, name));\n\t\t\tentries.push(entryStat.isDirectory() ? `${name}/` : name);\n\t\t} catch {\n\t\t\t// Skip entries we cannot stat.\n\t\t}\n\t}\n\treturn { entries, entryLimitReached: false };\n}\n\nfunction formatDirectoryListingResult(\n\tlisting: DirectoryListingEntries,\n\tlimit: number,\n): AgentToolResult<LsToolDetails | undefined> {\n\tif (listing.entries.length === 0) {\n\t\treturn { content: [{ type: \"text\", text: \"(empty directory)\" }], details: undefined };\n\t}\n\tconst truncation = truncateHead(listing.entries.join(\"\\n\"), { maxLines: Number.MAX_SAFE_INTEGER });\n\tlet output = truncation.content;\n\tconst details: LsToolDetails = {};\n\tconst notices: string[] = [];\n\tif (listing.entryLimitReached) {\n\t\tnotices.push(`${limit} entries limit reached. Use limit=${limit * 2} for more`);\n\t\tdetails.entryLimitReached = limit;\n\t}\n\tif (truncation.truncated) {\n\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\tdetails.truncation = truncation;\n\t}\n\tif (notices.length > 0) output += `\\n\\n[${notices.join(\". \")}]`;\n\treturn {\n\t\tcontent: [{ type: \"text\", text: output }],\n\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t};\n}\n\nasync function buildDirectoryListing(\n\tinput: LsToolInput,\n\toperations: ToolOperations,\n\tcwd: string,\n): Promise<AgentToolResult<LsToolDetails | undefined>> {\n\tconst dirPath = resolveToCwd(input.path || \".\", cwd);\n\tconst limit = input.limit ?? DEFAULT_LIMIT;\n\ttry {\n\t\tawait operations.access(dirPath, \"exists\");\n\t} catch {\n\t\tthrow new Error(`Path not found: ${dirPath}`);\n\t}\n\tif (!(await operations.stat(dirPath)).isDirectory()) throw new Error(`Not a directory: ${dirPath}`);\n\tconst names = await readDirectoryNames(dirPath, operations);\n\treturn formatDirectoryListingResult(await collectDirectoryListingEntries(dirPath, names, limit, operations), limit);\n}\n\nfunction executeAbortableDirectoryListing(\n\tinput: LsToolInput,\n\toperations: ToolOperations,\n\tcwd: string,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<LsToolDetails | undefined>> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\treturn;\n\t\t}\n\t\tconst onAbort = () => reject(new Error(\"Operation aborted\"));\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid buildDirectoryListing(input, operations, cwd).then(\n\t\t\t(result) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tresolve(result);\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treject(error);\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport type LsToolDefinition = ToolDefinition<typeof lsSchema, LsToolDetails | undefined>;\n\nexport function createLsToolDefinition(operations: ToolOperations, _options?: LsToolOptions): LsToolDefinition {\n\tconst ops = operations;\n\tconst cwd = operations.cwd;\n\treturn {\n\t\tname: \"ls\",\n\t\tlabel: \"ls\",\n\t\tdescription: `List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT} entries or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,\n\t\tpromptSnippet: \"List directory contents\",\n\t\tparameters: lsSchema,\n\t\tasync execute(_toolCallId, input: LsToolInput, signal?: AbortSignal, _onUpdate?, _ctx?) {\n\t\t\treturn executeAbortableDirectoryListing(input, ops, cwd, signal);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatBackendIcon(ops.getBackendInfo?.(), theme) + formatLsCall(args, theme));\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatLsResult(result, options, theme, context.showImages));\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createLsTool(operations: ToolOperations, options?: LsToolOptions): AgentTool<typeof lsSchema> {\n\treturn wrapToolDefinition(createLsToolDefinition(operations, options));\n}\n"]}
1
+ {"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/core/tools/ls.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool, AgentToolResult } from \"@greppleai/grip-agent-core\";\nimport { Text } from \"@greppleai/grip-tui\";\nimport nodePath from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport {\n\tformatBackendIcon,\n\tformatHiddenLinesHint,\n\tgetTextOutput,\n\tinvalidArgText,\n\tshortenPath,\n\tstr,\n} from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst lsSchema = Type.Object({\n\tpath: Type.Optional(Type.String({ description: \"Directory to list (default: current directory)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of entries to return (default: 500)\" })),\n});\n\nexport type LsToolInput = Static<typeof lsSchema>;\n\nconst DEFAULT_LIMIT = 500;\n\nexport interface LsToolDetails {\n\ttruncation?: TruncationResult;\n\tentryLimitReached?: number;\n}\n\nexport interface LsToolOptions {}\n\nfunction formatLsCall(args: Partial<LsToolInput> | undefined, theme: Theme): string {\n\tconst rawPath = str(args?.path);\n\tconst path = rawPath !== null ? shortenPath(rawPath || \".\") : null;\n\tconst limit = args?.limit;\n\tconst invalidArg = invalidArgText(theme);\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"ls\"))} ${path === null ? invalidArg : theme.fg(\"accent\", path)}`;\n\tif (limit !== undefined) {\n\t\ttext += theme.fg(\"toolOutput\", ` (limit ${limit})`);\n\t}\n\treturn text;\n}\n\nfunction formatLsResult(\n\tresult: AgentToolResult<LsToolDetails | undefined>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n): string {\n\tconst output = getTextOutput(result, showImages).trim();\n\tlet text = \"\";\n\tif (output) {\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst maxLines = options.expanded ? lines.length : 20;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n${displayLines.map((line) => theme.fg(\"toolOutput\", line)).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `\\n\\n${formatHiddenLinesHint(remaining, theme)}`;\n\t\t}\n\t}\n\n\tconst entryLimit = result.details?.entryLimitReached;\n\tconst truncation = result.details?.truncation;\n\tif (entryLimit || truncation?.truncated) {\n\t\tconst warnings: string[] = [];\n\t\tif (entryLimit) warnings.push(`${entryLimit} entries limit`);\n\t\tif (truncation?.truncated) warnings.push(`${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit`);\n\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${warnings.join(\", \")}]`)}`;\n\t}\n\treturn text;\n}\ninterface DirectoryListingEntries {\n\tentries: string[];\n\tentryLimitReached: boolean;\n}\n\nasync function readDirectoryNames(dirPath: string, operations: ToolOperations): Promise<string[]> {\n\ttry {\n\t\treturn await operations.readdir(dirPath);\n\t} catch (error) {\n\t\tconst message =\n\t\t\ttypeof error === \"object\" && error !== null && \"message\" in error ? String(error.message) : \"undefined\";\n\t\tthrow new Error(`Cannot read directory: ${message}`);\n\t}\n}\n\nasync function collectDirectoryListingEntries(\n\tdirPath: string,\n\tnames: string[],\n\tlimit: number,\n\toperations: ToolOperations,\n): Promise<DirectoryListingEntries> {\n\tnames.sort((left, right) => left.toLowerCase().localeCompare(right.toLowerCase()));\n\tconst entries: string[] = [];\n\tfor (const name of names) {\n\t\tif (entries.length >= limit) return { entries, entryLimitReached: true };\n\t\ttry {\n\t\t\tconst entryStat = await operations.stat(nodePath.join(dirPath, name));\n\t\t\tentries.push(entryStat.isDirectory() ? `${name}/` : name);\n\t\t} catch {\n\t\t\t// Skip entries we cannot stat.\n\t\t}\n\t}\n\treturn { entries, entryLimitReached: false };\n}\n\nfunction formatDirectoryListingResult(\n\tlisting: DirectoryListingEntries,\n\tlimit: number,\n): AgentToolResult<LsToolDetails | undefined> {\n\tif (listing.entries.length === 0) {\n\t\treturn { content: [{ type: \"text\", text: \"(empty directory)\" }], details: undefined };\n\t}\n\tconst truncation = truncateHead(listing.entries.join(\"\\n\"), { maxLines: Number.MAX_SAFE_INTEGER });\n\tlet output = truncation.content;\n\tconst details: LsToolDetails = {};\n\tconst notices: string[] = [];\n\tif (listing.entryLimitReached) {\n\t\tnotices.push(`${limit} entries limit reached. Use limit=${limit * 2} for more`);\n\t\tdetails.entryLimitReached = limit;\n\t}\n\tif (truncation.truncated) {\n\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\tdetails.truncation = truncation;\n\t}\n\tif (notices.length > 0) output += `\\n\\n[${notices.join(\". \")}]`;\n\treturn {\n\t\tcontent: [{ type: \"text\", text: output }],\n\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t};\n}\n\nasync function buildDirectoryListing(\n\tinput: LsToolInput,\n\toperations: ToolOperations,\n\tcwd: string,\n): Promise<AgentToolResult<LsToolDetails | undefined>> {\n\tconst dirPath = resolveToCwd(input.path || \".\", cwd);\n\tconst limit = input.limit ?? DEFAULT_LIMIT;\n\ttry {\n\t\tawait operations.access(dirPath, \"exists\");\n\t} catch {\n\t\tthrow new Error(`Path not found: ${dirPath}`);\n\t}\n\tif (!(await operations.stat(dirPath)).isDirectory()) throw new Error(`Not a directory: ${dirPath}`);\n\tconst names = await readDirectoryNames(dirPath, operations);\n\treturn formatDirectoryListingResult(await collectDirectoryListingEntries(dirPath, names, limit, operations), limit);\n}\n\nfunction executeAbortableDirectoryListing(\n\tinput: LsToolInput,\n\toperations: ToolOperations,\n\tcwd: string,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<LsToolDetails | undefined>> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\treturn;\n\t\t}\n\t\tconst onAbort = () => reject(new Error(\"Operation aborted\"));\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid buildDirectoryListing(input, operations, cwd).then(\n\t\t\t(result) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tresolve(result);\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treject(error);\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport type LsToolDefinition = ToolDefinition<typeof lsSchema, LsToolDetails | undefined>;\n\nexport function createLsToolDefinition(operations: ToolOperations, _options?: LsToolOptions): LsToolDefinition {\n\tconst ops = operations;\n\tconst cwd = operations.cwd;\n\treturn {\n\t\tname: \"ls\",\n\t\tlabel: \"ls\",\n\t\tdescription: `List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT} entries or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,\n\t\tpromptSnippet: \"List directory contents\",\n\t\tparameters: lsSchema,\n\t\tasync execute(_toolCallId, input: LsToolInput, signal?: AbortSignal, _onUpdate?, _ctx?) {\n\t\t\treturn executeAbortableDirectoryListing(input, ops, cwd, signal);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatBackendIcon(ops.getBackendInfo?.(), theme) + formatLsCall(args, theme));\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatLsResult(result, options, theme, context.showImages));\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createLsTool(operations: ToolOperations, options?: LsToolOptions): AgentTool<typeof lsSchema> {\n\treturn wrapToolDefinition(createLsToolDefinition(operations, options));\n}\n"]}
@@ -79,9 +79,13 @@ export interface WorkspaceToolExecutionOptions {
79
79
  imageAutoResize?: boolean;
80
80
  shellCommandPrefix?: string;
81
81
  sessionEnvironment?: GripSessionEnvironment;
82
+ /** Per-invocation guest working directory; the daemon workspace root remains unchanged. */
83
+ cwd?: string;
82
84
  }
83
85
  export interface DeferredRemoteToolOperationsConnectOptions extends RemoteToolOperationsConnectOptions {
84
86
  expectedCwd?: string;
87
+ /** Known host mount source; only supplied for a sandbox started by this Grip process. */
88
+ hostWorkspaceRoot?: string;
85
89
  }
86
90
  export type BorrowedToolOperations = Omit<ToolOperations, "dispose">;
87
91
  export declare function borrowToolOperations(operations: ToolOperations): BorrowedToolOperations;
@@ -100,6 +104,8 @@ export interface ToolOperations {
100
104
  glob?(pattern: string, cwd: string, options: ToolGlobOptions): Promise<string[]>;
101
105
  grep?(options: ToolGrepOptions): Promise<ToolGrepResult>;
102
106
  detectImageMimeType?(path: string): Promise<string | null | undefined>;
107
+ /** Map an existing guest workspace directory to its verified host mount counterpart, when known. */
108
+ mapWorkspaceDirectoryToHost?(guestPath: string): Promise<string>;
103
109
  getBackendInfo?(): ToolBackendInfo;
104
110
  resolveWorkspaceToolExecution?(name: string, parameterSchema: unknown): WorkspaceToolExecutionTarget;
105
111
  executeWorkspaceTool?(name: string, invocation: WorkspaceToolRemoteInvocation): Promise<AgentToolResult<unknown>>;
@@ -131,6 +137,7 @@ export declare class DeferredRemoteToolOperations implements ToolOperations {
131
137
  cwd: string;
132
138
  private readonly expectedCwd;
133
139
  private operations;
140
+ private hostWorkspaceRoot;
134
141
  private remoteCatalogUnsubscribe;
135
142
  private readonly catalogListeners;
136
143
  private disposePromise;
@@ -147,6 +154,8 @@ export declare class DeferredRemoteToolOperations implements ToolOperations {
147
154
  downloadFile(sourcePath: string, destinationPath: string): Promise<void>;
148
155
  mkdir(path: string, options?: ToolMkdirOptions): Promise<void>;
149
156
  stat(path: string): Promise<ToolFileStat>;
157
+ resolveWorkspaceDirectory(path: string): Promise<string>;
158
+ mapWorkspaceDirectoryToHost(guestPath: string): Promise<string>;
150
159
  readdir(path: string): Promise<string[]>;
151
160
  glob(pattern: string, cwd: string, options: ToolGlobOptions): Promise<string[]>;
152
161
  grep(options: ToolGrepOptions): Promise<ToolGrepResult>;
@@ -189,6 +198,7 @@ export declare class RemoteToolOperations implements ToolOperations {
189
198
  private refreshRemoteLspStatus;
190
199
  private request;
191
200
  private revisionForTool;
201
+ /** Observe exact bytes for CAS, or a daemon-confirmed absent target for creation. */
192
202
  private sharedExpectedRevision;
193
203
  exec(command: string, options: ToolExecOptions): Promise<ToolExecResult>;
194
204
  access(path: string, mode?: ToolAccessMode): Promise<void>;
@@ -199,6 +209,7 @@ export declare class RemoteToolOperations implements ToolOperations {
199
209
  downloadFile(sourcePath: string, destinationPath: string): Promise<void>;
200
210
  mkdir(path: string, options?: ToolMkdirOptions): Promise<void>;
201
211
  stat(path: string): Promise<ToolFileStat>;
212
+ resolveWorkspaceDirectory(path: string): Promise<string>;
202
213
  readdir(path: string): Promise<string[]>;
203
214
  glob(pattern: string, cwd: string, options: ToolGlobOptions): Promise<string[]>;
204
215
  grep(options: ToolGrepOptions): Promise<ToolGrepResult>;