@greppleai/grip 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1057) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +725 -2
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +11 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/bun/restore-sandbox-env.d.ts +13 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +32 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +70 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +441 -0
  18. package/dist/cli/args.js.map +1 -0
  19. package/dist/cli/config-selector.d.ts +14 -0
  20. package/dist/cli/config-selector.d.ts.map +1 -0
  21. package/dist/cli/config-selector.js +31 -0
  22. package/dist/cli/config-selector.js.map +1 -0
  23. package/dist/cli/file-processor.d.ts +15 -0
  24. package/dist/cli/file-processor.d.ts.map +1 -0
  25. package/dist/cli/file-processor.js +60 -0
  26. package/dist/cli/file-processor.js.map +1 -0
  27. package/dist/cli/initial-message.d.ts +18 -0
  28. package/dist/cli/initial-message.d.ts.map +1 -0
  29. package/dist/cli/initial-message.js +22 -0
  30. package/dist/cli/initial-message.js.map +1 -0
  31. package/dist/cli/list-models.d.ts +9 -0
  32. package/dist/cli/list-models.d.ts.map +1 -0
  33. package/dist/cli/list-models.js +98 -0
  34. package/dist/cli/list-models.js.map +1 -0
  35. package/dist/cli/session-picker.d.ts +9 -0
  36. package/dist/cli/session-picker.d.ts.map +1 -0
  37. package/dist/cli/session-picker.js +35 -0
  38. package/dist/cli/session-picker.js.map +1 -0
  39. package/dist/cli.d.ts +3 -0
  40. package/dist/cli.d.ts.map +1 -0
  41. package/dist/cli.js +14 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/config.d.ts +82 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +406 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/core/agent-session.d.ts +970 -0
  48. package/dist/core/agent-session.d.ts.map +1 -0
  49. package/dist/core/agent-session.js +5176 -0
  50. package/dist/core/agent-session.js.map +1 -0
  51. package/dist/core/auth-guidance.d.ts +5 -0
  52. package/dist/core/auth-guidance.d.ts.map +1 -0
  53. package/dist/core/auth-guidance.js +21 -0
  54. package/dist/core/auth-guidance.js.map +1 -0
  55. package/dist/core/auth-storage.d.ts +150 -0
  56. package/dist/core/auth-storage.d.ts.map +1 -0
  57. package/dist/core/auth-storage.js +557 -0
  58. package/dist/core/auth-storage.js.map +1 -0
  59. package/dist/core/bash-executor.d.ts +26 -0
  60. package/dist/core/bash-executor.d.ts.map +1 -0
  61. package/dist/core/bash-executor.js +99 -0
  62. package/dist/core/bash-executor.js.map +1 -0
  63. package/dist/core/compaction/branch-summarization.d.ts +83 -0
  64. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  65. package/dist/core/compaction/branch-summarization.js +220 -0
  66. package/dist/core/compaction/branch-summarization.js.map +1 -0
  67. package/dist/core/compaction/compaction.d.ts +65 -0
  68. package/dist/core/compaction/compaction.d.ts.map +1 -0
  69. package/dist/core/compaction/compaction.js +550 -0
  70. package/dist/core/compaction/compaction.js.map +1 -0
  71. package/dist/core/compaction/compression-detection-ledger.d.ts +34 -0
  72. package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -0
  73. package/dist/core/compaction/compression-detection-ledger.js +52 -0
  74. package/dist/core/compaction/compression-detection-ledger.js.map +1 -0
  75. package/dist/core/compaction/compression-detector.d.ts +71 -0
  76. package/dist/core/compaction/compression-detector.d.ts.map +1 -0
  77. package/dist/core/compaction/compression-detector.js +407 -0
  78. package/dist/core/compaction/compression-detector.js.map +1 -0
  79. package/dist/core/compaction/compression-economics.d.ts +55 -0
  80. package/dist/core/compaction/compression-economics.d.ts.map +1 -0
  81. package/dist/core/compaction/compression-economics.js +151 -0
  82. package/dist/core/compaction/compression-economics.js.map +1 -0
  83. package/dist/core/compaction/utils.d.ts +28 -0
  84. package/dist/core/compaction/utils.d.ts.map +1 -0
  85. package/dist/core/compaction/utils.js +165 -0
  86. package/dist/core/compaction/utils.js.map +1 -0
  87. package/dist/core/defaults.d.ts +3 -0
  88. package/dist/core/defaults.d.ts.map +1 -0
  89. package/dist/core/defaults.js +2 -0
  90. package/dist/core/defaults.js.map +1 -0
  91. package/dist/core/diagnostics.d.ts +18 -0
  92. package/dist/core/diagnostics.d.ts.map +1 -0
  93. package/dist/core/diagnostics.js +2 -0
  94. package/dist/core/diagnostics.js.map +1 -0
  95. package/dist/core/event-bus.d.ts +9 -0
  96. package/dist/core/event-bus.d.ts.map +1 -0
  97. package/dist/core/event-bus.js +25 -0
  98. package/dist/core/event-bus.js.map +1 -0
  99. package/dist/core/exec.d.ts +29 -0
  100. package/dist/core/exec.d.ts.map +1 -0
  101. package/dist/core/exec.js +75 -0
  102. package/dist/core/exec.js.map +1 -0
  103. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  104. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  105. package/dist/core/export-html/ansi-to-html.js +245 -0
  106. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  107. package/dist/core/export-html/index.d.ts +21 -0
  108. package/dist/core/export-html/index.d.ts.map +1 -0
  109. package/dist/core/export-html/index.js +230 -0
  110. package/dist/core/export-html/index.js.map +1 -0
  111. package/dist/core/export-html/template.css +1066 -0
  112. package/dist/core/export-html/template.html +55 -0
  113. package/dist/core/export-html/template.js +1864 -0
  114. package/dist/core/export-html/tool-renderer.d.ts +32 -0
  115. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  116. package/dist/core/export-html/tool-renderer.js +108 -0
  117. package/dist/core/export-html/tool-renderer.js.map +1 -0
  118. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  119. package/dist/core/export-html/vendor/marked.min.js +78 -0
  120. package/dist/core/extensions/loader.d.ts +24 -0
  121. package/dist/core/extensions/loader.d.ts.map +1 -0
  122. package/dist/core/extensions/loader.js +613 -0
  123. package/dist/core/extensions/loader.js.map +1 -0
  124. package/dist/core/extensions/runner.d.ts +160 -0
  125. package/dist/core/extensions/runner.d.ts.map +1 -0
  126. package/dist/core/extensions/runner.js +962 -0
  127. package/dist/core/extensions/runner.js.map +1 -0
  128. package/dist/core/extensions/types.d.ts +1311 -0
  129. package/dist/core/extensions/types.d.ts.map +1 -0
  130. package/dist/core/extensions/types.js +51 -0
  131. package/dist/core/extensions/types.js.map +1 -0
  132. package/dist/core/extensions/wrapper.d.ts +20 -0
  133. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  134. package/dist/core/extensions/wrapper.js +22 -0
  135. package/dist/core/extensions/wrapper.js.map +1 -0
  136. package/dist/core/footer-data-provider.d.ts +52 -0
  137. package/dist/core/footer-data-provider.d.ts.map +1 -0
  138. package/dist/core/footer-data-provider.js +318 -0
  139. package/dist/core/footer-data-provider.js.map +1 -0
  140. package/dist/core/grip-agent.d.ts +240 -0
  141. package/dist/core/grip-agent.d.ts.map +1 -0
  142. package/dist/core/grip-agent.js +1243 -0
  143. package/dist/core/grip-agent.js.map +1 -0
  144. package/dist/core/grip-manifest.d.ts +9 -0
  145. package/dist/core/grip-manifest.d.ts.map +1 -0
  146. package/dist/core/grip-manifest.js +25 -0
  147. package/dist/core/grip-manifest.js.map +1 -0
  148. package/dist/core/hooks/aggregate.d.ts +5 -0
  149. package/dist/core/hooks/aggregate.d.ts.map +1 -0
  150. package/dist/core/hooks/aggregate.js +226 -0
  151. package/dist/core/hooks/aggregate.js.map +1 -0
  152. package/dist/core/hooks/config.d.ts +14 -0
  153. package/dist/core/hooks/config.d.ts.map +1 -0
  154. package/dist/core/hooks/config.js +372 -0
  155. package/dist/core/hooks/config.js.map +1 -0
  156. package/dist/core/hooks/executor.d.ts +12 -0
  157. package/dist/core/hooks/executor.d.ts.map +1 -0
  158. package/dist/core/hooks/executor.js +708 -0
  159. package/dist/core/hooks/executor.js.map +1 -0
  160. package/dist/core/hooks/index.d.ts +9 -0
  161. package/dist/core/hooks/index.d.ts.map +1 -0
  162. package/dist/core/hooks/index.js +14 -0
  163. package/dist/core/hooks/index.js.map +1 -0
  164. package/dist/core/hooks/matcher.d.ts +10 -0
  165. package/dist/core/hooks/matcher.d.ts.map +1 -0
  166. package/dist/core/hooks/matcher.js +70 -0
  167. package/dist/core/hooks/matcher.js.map +1 -0
  168. package/dist/core/hooks/trust-store.d.ts +38 -0
  169. package/dist/core/hooks/trust-store.d.ts.map +1 -0
  170. package/dist/core/hooks/trust-store.js +167 -0
  171. package/dist/core/hooks/trust-store.js.map +1 -0
  172. package/dist/core/hooks/types.d.ts +234 -0
  173. package/dist/core/hooks/types.d.ts.map +1 -0
  174. package/dist/core/hooks/types.js +52 -0
  175. package/dist/core/hooks/types.js.map +1 -0
  176. package/dist/core/http-dispatcher.d.ts +21 -0
  177. package/dist/core/http-dispatcher.d.ts.map +1 -0
  178. package/dist/core/http-dispatcher.js +82 -0
  179. package/dist/core/http-dispatcher.js.map +1 -0
  180. package/dist/core/instruction-resource-loader.d.ts +81 -0
  181. package/dist/core/instruction-resource-loader.d.ts.map +1 -0
  182. package/dist/core/instruction-resource-loader.js +574 -0
  183. package/dist/core/instruction-resource-loader.js.map +1 -0
  184. package/dist/core/keybindings.d.ts +399 -0
  185. package/dist/core/keybindings.d.ts.map +1 -0
  186. package/dist/core/keybindings.js +299 -0
  187. package/dist/core/keybindings.js.map +1 -0
  188. package/dist/core/lsp/abort.d.ts +3 -0
  189. package/dist/core/lsp/abort.d.ts.map +1 -0
  190. package/dist/core/lsp/abort.js +28 -0
  191. package/dist/core/lsp/abort.js.map +1 -0
  192. package/dist/core/lsp/client.d.ts +108 -0
  193. package/dist/core/lsp/client.d.ts.map +1 -0
  194. package/dist/core/lsp/client.js +586 -0
  195. package/dist/core/lsp/client.js.map +1 -0
  196. package/dist/core/lsp/config-loader.d.ts +44 -0
  197. package/dist/core/lsp/config-loader.d.ts.map +1 -0
  198. package/dist/core/lsp/config-loader.js +223 -0
  199. package/dist/core/lsp/config-loader.js.map +1 -0
  200. package/dist/core/lsp/config.d.ts +134 -0
  201. package/dist/core/lsp/config.d.ts.map +1 -0
  202. package/dist/core/lsp/config.js +682 -0
  203. package/dist/core/lsp/config.js.map +1 -0
  204. package/dist/core/lsp/diagnostics.d.ts +18 -0
  205. package/dist/core/lsp/diagnostics.d.ts.map +1 -0
  206. package/dist/core/lsp/diagnostics.js +311 -0
  207. package/dist/core/lsp/diagnostics.js.map +1 -0
  208. package/dist/core/lsp/file-sync.d.ts +58 -0
  209. package/dist/core/lsp/file-sync.d.ts.map +1 -0
  210. package/dist/core/lsp/file-sync.js +432 -0
  211. package/dist/core/lsp/file-sync.js.map +1 -0
  212. package/dist/core/lsp/integration.d.ts +62 -0
  213. package/dist/core/lsp/integration.d.ts.map +1 -0
  214. package/dist/core/lsp/integration.js +145 -0
  215. package/dist/core/lsp/integration.js.map +1 -0
  216. package/dist/core/lsp/language-map.d.ts +54 -0
  217. package/dist/core/lsp/language-map.d.ts.map +1 -0
  218. package/dist/core/lsp/language-map.js +300 -0
  219. package/dist/core/lsp/language-map.js.map +1 -0
  220. package/dist/core/lsp/manager.d.ts +120 -0
  221. package/dist/core/lsp/manager.d.ts.map +1 -0
  222. package/dist/core/lsp/manager.js +636 -0
  223. package/dist/core/lsp/manager.js.map +1 -0
  224. package/dist/core/lsp/navigation.d.ts +32 -0
  225. package/dist/core/lsp/navigation.d.ts.map +1 -0
  226. package/dist/core/lsp/navigation.js +327 -0
  227. package/dist/core/lsp/navigation.js.map +1 -0
  228. package/dist/core/lsp/portable-path.d.ts +18 -0
  229. package/dist/core/lsp/portable-path.d.ts.map +1 -0
  230. package/dist/core/lsp/portable-path.js +83 -0
  231. package/dist/core/lsp/portable-path.js.map +1 -0
  232. package/dist/core/lsp/refactor.d.ts +32 -0
  233. package/dist/core/lsp/refactor.d.ts.map +1 -0
  234. package/dist/core/lsp/refactor.js +519 -0
  235. package/dist/core/lsp/refactor.js.map +1 -0
  236. package/dist/core/lsp/transport.d.ts +39 -0
  237. package/dist/core/lsp/transport.d.ts.map +1 -0
  238. package/dist/core/lsp/transport.js +261 -0
  239. package/dist/core/lsp/transport.js.map +1 -0
  240. package/dist/core/messages.d.ts +34 -0
  241. package/dist/core/messages.d.ts.map +1 -0
  242. package/dist/core/messages.js +140 -0
  243. package/dist/core/messages.js.map +1 -0
  244. package/dist/core/model-registry.d.ts +148 -0
  245. package/dist/core/model-registry.d.ts.map +1 -0
  246. package/dist/core/model-registry.js +812 -0
  247. package/dist/core/model-registry.js.map +1 -0
  248. package/dist/core/model-resolver.d.ts +115 -0
  249. package/dist/core/model-resolver.d.ts.map +1 -0
  250. package/dist/core/model-resolver.js +498 -0
  251. package/dist/core/model-resolver.js.map +1 -0
  252. package/dist/core/output-guard.d.ts +7 -0
  253. package/dist/core/output-guard.d.ts.map +1 -0
  254. package/dist/core/output-guard.js +89 -0
  255. package/dist/core/output-guard.js.map +1 -0
  256. package/dist/core/package-manager.d.ts +209 -0
  257. package/dist/core/package-manager.d.ts.map +1 -0
  258. package/dist/core/package-manager.js +2341 -0
  259. package/dist/core/package-manager.js.map +1 -0
  260. package/dist/core/prompt-templates.d.ts +57 -0
  261. package/dist/core/prompt-templates.d.ts.map +1 -0
  262. package/dist/core/prompt-templates.js +353 -0
  263. package/dist/core/prompt-templates.js.map +1 -0
  264. package/dist/core/provider-display-names.d.ts +2 -0
  265. package/dist/core/provider-display-names.d.ts.map +1 -0
  266. package/dist/core/provider-display-names.js +33 -0
  267. package/dist/core/provider-display-names.js.map +1 -0
  268. package/dist/core/remote-workspace-protocol/contract.d.ts +456 -0
  269. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -0
  270. package/dist/core/remote-workspace-protocol/contract.js +809 -0
  271. package/dist/core/remote-workspace-protocol/contract.js.map +1 -0
  272. package/dist/core/remote-workspace-protocol/session.d.ts +247 -0
  273. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -0
  274. package/dist/core/remote-workspace-protocol/session.js +1839 -0
  275. package/dist/core/remote-workspace-protocol/session.js.map +1 -0
  276. package/dist/core/resolve-config-value.d.ts +32 -0
  277. package/dist/core/resolve-config-value.d.ts.map +1 -0
  278. package/dist/core/resolve-config-value.js +257 -0
  279. package/dist/core/resolve-config-value.js.map +1 -0
  280. package/dist/core/resource-loader.d.ts +200 -0
  281. package/dist/core/resource-loader.d.ts.map +1 -0
  282. package/dist/core/resource-loader.js +1209 -0
  283. package/dist/core/resource-loader.js.map +1 -0
  284. package/dist/core/rules.d.ts +40 -0
  285. package/dist/core/rules.d.ts.map +1 -0
  286. package/dist/core/rules.js +57 -0
  287. package/dist/core/rules.js.map +1 -0
  288. package/dist/core/sandbox/command.d.ts +27 -0
  289. package/dist/core/sandbox/command.d.ts.map +1 -0
  290. package/dist/core/sandbox/command.js +124 -0
  291. package/dist/core/sandbox/command.js.map +1 -0
  292. package/dist/core/sandbox/docker.d.ts +169 -0
  293. package/dist/core/sandbox/docker.d.ts.map +1 -0
  294. package/dist/core/sandbox/docker.js +633 -0
  295. package/dist/core/sandbox/docker.js.map +1 -0
  296. package/dist/core/sandbox/lima.d.ts +38 -0
  297. package/dist/core/sandbox/lima.d.ts.map +1 -0
  298. package/dist/core/sandbox/lima.js +324 -0
  299. package/dist/core/sandbox/lima.js.map +1 -0
  300. package/dist/core/session/constants.d.ts +2 -0
  301. package/dist/core/session/constants.d.ts.map +1 -0
  302. package/dist/core/session/constants.js +2 -0
  303. package/dist/core/session/constants.js.map +1 -0
  304. package/dist/core/session/context-metadata.d.ts +5 -0
  305. package/dist/core/session/context-metadata.d.ts.map +1 -0
  306. package/dist/core/session/context-metadata.js +55 -0
  307. package/dist/core/session/context-metadata.js.map +1 -0
  308. package/dist/core/session/context.d.ts +14 -0
  309. package/dist/core/session/context.d.ts.map +1 -0
  310. package/dist/core/session/context.js +117 -0
  311. package/dist/core/session/context.js.map +1 -0
  312. package/dist/core/session/ids.d.ts +9 -0
  313. package/dist/core/session/ids.d.ts.map +1 -0
  314. package/dist/core/session/ids.js +21 -0
  315. package/dist/core/session/ids.js.map +1 -0
  316. package/dist/core/session/in-memory-session-manager.d.ts +17 -0
  317. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -0
  318. package/dist/core/session/in-memory-session-manager.js +40 -0
  319. package/dist/core/session/in-memory-session-manager.js.map +1 -0
  320. package/dist/core/session/in-memory-session.d.ts +7 -0
  321. package/dist/core/session/in-memory-session.d.ts.map +1 -0
  322. package/dist/core/session/in-memory-session.js +11 -0
  323. package/dist/core/session/in-memory-session.js.map +1 -0
  324. package/dist/core/session/jsonl-errors.d.ts +36 -0
  325. package/dist/core/session/jsonl-errors.d.ts.map +1 -0
  326. package/dist/core/session/jsonl-errors.js +49 -0
  327. package/dist/core/session/jsonl-errors.js.map +1 -0
  328. package/dist/core/session/jsonl-helpers.d.ts +20 -0
  329. package/dist/core/session/jsonl-helpers.d.ts.map +1 -0
  330. package/dist/core/session/jsonl-helpers.js +21 -0
  331. package/dist/core/session/jsonl-helpers.js.map +1 -0
  332. package/dist/core/session/local-session-manager.d.ts +30 -0
  333. package/dist/core/session/local-session-manager.d.ts.map +1 -0
  334. package/dist/core/session/local-session-manager.js +205 -0
  335. package/dist/core/session/local-session-manager.js.map +1 -0
  336. package/dist/core/session/local-session.d.ts +9 -0
  337. package/dist/core/session/local-session.d.ts.map +1 -0
  338. package/dist/core/session/local-session.js +15 -0
  339. package/dist/core/session/local-session.js.map +1 -0
  340. package/dist/core/session/migrations.d.ts +11 -0
  341. package/dist/core/session/migrations.d.ts.map +1 -0
  342. package/dist/core/session/migrations.js +78 -0
  343. package/dist/core/session/migrations.js.map +1 -0
  344. package/dist/core/session/remote-session-client.d.ts +83 -0
  345. package/dist/core/session/remote-session-client.d.ts.map +1 -0
  346. package/dist/core/session/remote-session-client.js +224 -0
  347. package/dist/core/session/remote-session-client.js.map +1 -0
  348. package/dist/core/session/remote-session-manager.d.ts +32 -0
  349. package/dist/core/session/remote-session-manager.d.ts.map +1 -0
  350. package/dist/core/session/remote-session-manager.js +124 -0
  351. package/dist/core/session/remote-session-manager.js.map +1 -0
  352. package/dist/core/session/remote-session.d.ts +20 -0
  353. package/dist/core/session/remote-session.d.ts.map +1 -0
  354. package/dist/core/session/remote-session.js +33 -0
  355. package/dist/core/session/remote-session.js.map +1 -0
  356. package/dist/core/session/session-manager.d.ts +18 -0
  357. package/dist/core/session/session-manager.d.ts.map +1 -0
  358. package/dist/core/session/session-manager.js +2 -0
  359. package/dist/core/session/session-manager.js.map +1 -0
  360. package/dist/core/session/session.d.ts +140 -0
  361. package/dist/core/session/session.d.ts.map +1 -0
  362. package/dist/core/session/session.js +461 -0
  363. package/dist/core/session/session.js.map +1 -0
  364. package/dist/core/session/stores/in-memory-session-store.d.ts +39 -0
  365. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -0
  366. package/dist/core/session/stores/in-memory-session-store.js +168 -0
  367. package/dist/core/session/stores/in-memory-session-store.js.map +1 -0
  368. package/dist/core/session/stores/jsonl-session-store.d.ts +97 -0
  369. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -0
  370. package/dist/core/session/stores/jsonl-session-store.js +1140 -0
  371. package/dist/core/session/stores/jsonl-session-store.js.map +1 -0
  372. package/dist/core/session/stores/remote-session-store.d.ts +44 -0
  373. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -0
  374. package/dist/core/session/stores/remote-session-store.js +159 -0
  375. package/dist/core/session/stores/remote-session-store.js.map +1 -0
  376. package/dist/core/session/stores/session-store.d.ts +42 -0
  377. package/dist/core/session/stores/session-store.d.ts.map +1 -0
  378. package/dist/core/session/stores/session-store.js +2 -0
  379. package/dist/core/session/stores/session-store.js.map +1 -0
  380. package/dist/core/session/types.d.ts +141 -0
  381. package/dist/core/session/types.d.ts.map +1 -0
  382. package/dist/core/session/types.js +2 -0
  383. package/dist/core/session/types.js.map +1 -0
  384. package/dist/core/session/usage-ledger.d.ts +18 -0
  385. package/dist/core/session/usage-ledger.d.ts.map +1 -0
  386. package/dist/core/session/usage-ledger.js +68 -0
  387. package/dist/core/session/usage-ledger.js.map +1 -0
  388. package/dist/core/session-cwd.d.ts +19 -0
  389. package/dist/core/session-cwd.d.ts.map +1 -0
  390. package/dist/core/session-cwd.js +38 -0
  391. package/dist/core/session-cwd.js.map +1 -0
  392. package/dist/core/settings-manager.d.ts +318 -0
  393. package/dist/core/settings-manager.d.ts.map +1 -0
  394. package/dist/core/settings-manager.js +991 -0
  395. package/dist/core/settings-manager.js.map +1 -0
  396. package/dist/core/skills.d.ts +40 -0
  397. package/dist/core/skills.d.ts.map +1 -0
  398. package/dist/core/skills.js +57 -0
  399. package/dist/core/skills.js.map +1 -0
  400. package/dist/core/slash-commands.d.ts +15 -0
  401. package/dist/core/slash-commands.d.ts.map +1 -0
  402. package/dist/core/slash-commands.js +36 -0
  403. package/dist/core/slash-commands.js.map +1 -0
  404. package/dist/core/source-info.d.ts +26 -0
  405. package/dist/core/source-info.d.ts.map +1 -0
  406. package/dist/core/source-info.js +27 -0
  407. package/dist/core/source-info.js.map +1 -0
  408. package/dist/core/system-prompt.d.ts +32 -0
  409. package/dist/core/system-prompt.d.ts.map +1 -0
  410. package/dist/core/system-prompt.js +131 -0
  411. package/dist/core/system-prompt.js.map +1 -0
  412. package/dist/core/telemetry.d.ts +3 -0
  413. package/dist/core/telemetry.d.ts.map +1 -0
  414. package/dist/core/telemetry.js +9 -0
  415. package/dist/core/telemetry.js.map +1 -0
  416. package/dist/core/timings.d.ts +10 -0
  417. package/dist/core/timings.d.ts.map +1 -0
  418. package/dist/core/timings.js +41 -0
  419. package/dist/core/timings.js.map +1 -0
  420. package/dist/core/tools/bash.d.ts +51 -0
  421. package/dist/core/tools/bash.d.ts.map +1 -0
  422. package/dist/core/tools/bash.js +310 -0
  423. package/dist/core/tools/bash.js.map +1 -0
  424. package/dist/core/tools/compress-context.d.ts +27 -0
  425. package/dist/core/tools/compress-context.d.ts.map +1 -0
  426. package/dist/core/tools/compress-context.js +142 -0
  427. package/dist/core/tools/compress-context.js.map +1 -0
  428. package/dist/core/tools/edit-diff.d.ts +82 -0
  429. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  430. package/dist/core/tools/edit-diff.js +327 -0
  431. package/dist/core/tools/edit-diff.js.map +1 -0
  432. package/dist/core/tools/edit.d.ts +50 -0
  433. package/dist/core/tools/edit.d.ts.map +1 -0
  434. package/dist/core/tools/edit.js +324 -0
  435. package/dist/core/tools/edit.js.map +1 -0
  436. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  437. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  438. package/dist/core/tools/file-mutation-queue.js +60 -0
  439. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  440. package/dist/core/tools/find.d.ts +22 -0
  441. package/dist/core/tools/find.d.ts.map +1 -0
  442. package/dist/core/tools/find.js +268 -0
  443. package/dist/core/tools/find.js.map +1 -0
  444. package/dist/core/tools/grep.d.ts +27 -0
  445. package/dist/core/tools/grep.d.ts.map +1 -0
  446. package/dist/core/tools/grep.js +332 -0
  447. package/dist/core/tools/grep.js.map +1 -0
  448. package/dist/core/tools/hash-store.d.ts +12 -0
  449. package/dist/core/tools/hash-store.d.ts.map +1 -0
  450. package/dist/core/tools/hash-store.js +48 -0
  451. package/dist/core/tools/hash-store.js.map +1 -0
  452. package/dist/core/tools/hashline/apply.d.ts +40 -0
  453. package/dist/core/tools/hashline/apply.d.ts.map +1 -0
  454. package/dist/core/tools/hashline/apply.js +261 -0
  455. package/dist/core/tools/hashline/apply.js.map +1 -0
  456. package/dist/core/tools/hashline/hash.d.ts +56 -0
  457. package/dist/core/tools/hashline/hash.d.ts.map +1 -0
  458. package/dist/core/tools/hashline/hash.js +196 -0
  459. package/dist/core/tools/hashline/hash.js.map +1 -0
  460. package/dist/core/tools/hashline/parse.d.ts +8 -0
  461. package/dist/core/tools/hashline/parse.d.ts.map +1 -0
  462. package/dist/core/tools/hashline/parse.js +41 -0
  463. package/dist/core/tools/hashline/parse.js.map +1 -0
  464. package/dist/core/tools/hashline/resolve.d.ts +51 -0
  465. package/dist/core/tools/hashline/resolve.d.ts.map +1 -0
  466. package/dist/core/tools/hashline/resolve.js +187 -0
  467. package/dist/core/tools/hashline/resolve.js.map +1 -0
  468. package/dist/core/tools/hashline-utils.d.ts +6 -0
  469. package/dist/core/tools/hashline-utils.d.ts.map +1 -0
  470. package/dist/core/tools/hashline-utils.js +23 -0
  471. package/dist/core/tools/hashline-utils.js.map +1 -0
  472. package/dist/core/tools/index.d.ts +36 -0
  473. package/dist/core/tools/index.d.ts.map +1 -0
  474. package/dist/core/tools/index.js +141 -0
  475. package/dist/core/tools/index.js.map +1 -0
  476. package/dist/core/tools/ls.d.ts +21 -0
  477. package/dist/core/tools/ls.d.ts.map +1 -0
  478. package/dist/core/tools/ls.js +156 -0
  479. package/dist/core/tools/ls.js.map +1 -0
  480. package/dist/core/tools/operations.d.ts +201 -0
  481. package/dist/core/tools/operations.d.ts.map +1 -0
  482. package/dist/core/tools/operations.js +697 -0
  483. package/dist/core/tools/operations.js.map +1 -0
  484. package/dist/core/tools/output-accumulator.d.ts +54 -0
  485. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  486. package/dist/core/tools/output-accumulator.js +184 -0
  487. package/dist/core/tools/output-accumulator.js.map +1 -0
  488. package/dist/core/tools/path-utils.d.ts +9 -0
  489. package/dist/core/tools/path-utils.d.ts.map +1 -0
  490. package/dist/core/tools/path-utils.js +99 -0
  491. package/dist/core/tools/path-utils.js.map +1 -0
  492. package/dist/core/tools/read.d.ts +32 -0
  493. package/dist/core/tools/read.d.ts.map +1 -0
  494. package/dist/core/tools/read.js +318 -0
  495. package/dist/core/tools/read.js.map +1 -0
  496. package/dist/core/tools/render-utils.d.ts +33 -0
  497. package/dist/core/tools/render-utils.d.ts.map +1 -0
  498. package/dist/core/tools/render-utils.js +61 -0
  499. package/dist/core/tools/render-utils.js.map +1 -0
  500. package/dist/core/tools/replace-diff.d.ts +16 -0
  501. package/dist/core/tools/replace-diff.d.ts.map +1 -0
  502. package/dist/core/tools/replace-diff.js +117 -0
  503. package/dist/core/tools/replace-diff.js.map +1 -0
  504. package/dist/core/tools/replace-normalize.d.ts +2 -0
  505. package/dist/core/tools/replace-normalize.d.ts.map +1 -0
  506. package/dist/core/tools/replace-normalize.js +73 -0
  507. package/dist/core/tools/replace-normalize.js.map +1 -0
  508. package/dist/core/tools/replace-render.d.ts +51 -0
  509. package/dist/core/tools/replace-render.d.ts.map +1 -0
  510. package/dist/core/tools/replace-render.js +162 -0
  511. package/dist/core/tools/replace-render.js.map +1 -0
  512. package/dist/core/tools/runtime.d.ts +2 -0
  513. package/dist/core/tools/runtime.d.ts.map +1 -0
  514. package/dist/core/tools/runtime.js +6 -0
  515. package/dist/core/tools/runtime.js.map +1 -0
  516. package/dist/core/tools/session-history.d.ts +55 -0
  517. package/dist/core/tools/session-history.d.ts.map +1 -0
  518. package/dist/core/tools/session-history.js +649 -0
  519. package/dist/core/tools/session-history.js.map +1 -0
  520. package/dist/core/tools/subagent-agents.d.ts +29 -0
  521. package/dist/core/tools/subagent-agents.d.ts.map +1 -0
  522. package/dist/core/tools/subagent-agents.js +223 -0
  523. package/dist/core/tools/subagent-agents.js.map +1 -0
  524. package/dist/core/tools/subagent.d.ts +185 -0
  525. package/dist/core/tools/subagent.d.ts.map +1 -0
  526. package/dist/core/tools/subagent.js +1309 -0
  527. package/dist/core/tools/subagent.js.map +1 -0
  528. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  529. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  530. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  531. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  532. package/dist/core/tools/truncate.d.ts +39 -0
  533. package/dist/core/tools/truncate.d.ts.map +1 -0
  534. package/dist/core/tools/truncate.js +215 -0
  535. package/dist/core/tools/truncate.js.map +1 -0
  536. package/dist/core/tools/websearch.d.ts +33 -0
  537. package/dist/core/tools/websearch.d.ts.map +1 -0
  538. package/dist/core/tools/websearch.js +341 -0
  539. package/dist/core/tools/websearch.js.map +1 -0
  540. package/dist/core/tools/workspace-tool-host.d.ts +102 -0
  541. package/dist/core/tools/workspace-tool-host.d.ts.map +1 -0
  542. package/dist/core/tools/workspace-tool-host.js +348 -0
  543. package/dist/core/tools/workspace-tool-host.js.map +1 -0
  544. package/dist/core/tools/write.d.ts +16 -0
  545. package/dist/core/tools/write.d.ts.map +1 -0
  546. package/dist/core/tools/write.js +204 -0
  547. package/dist/core/tools/write.js.map +1 -0
  548. package/dist/core/workspace-identity.d.ts +7 -0
  549. package/dist/core/workspace-identity.d.ts.map +1 -0
  550. package/dist/core/workspace-identity.js +2 -0
  551. package/dist/core/workspace-identity.js.map +1 -0
  552. package/dist/daemon/command.d.ts +6 -0
  553. package/dist/daemon/command.d.ts.map +1 -0
  554. package/dist/daemon/command.js +58 -0
  555. package/dist/daemon/command.js.map +1 -0
  556. package/dist/daemon/config.d.ts +43 -0
  557. package/dist/daemon/config.d.ts.map +1 -0
  558. package/dist/daemon/config.js +304 -0
  559. package/dist/daemon/config.js.map +1 -0
  560. package/dist/daemon/help.d.ts +2 -0
  561. package/dist/daemon/help.d.ts.map +1 -0
  562. package/dist/daemon/help.js +42 -0
  563. package/dist/daemon/help.js.map +1 -0
  564. package/dist/daemon/lsp-config.d.ts +4 -0
  565. package/dist/daemon/lsp-config.d.ts.map +1 -0
  566. package/dist/daemon/lsp-config.js +155 -0
  567. package/dist/daemon/lsp-config.js.map +1 -0
  568. package/dist/daemon/security.d.ts +19 -0
  569. package/dist/daemon/security.d.ts.map +1 -0
  570. package/dist/daemon/security.js +175 -0
  571. package/dist/daemon/security.js.map +1 -0
  572. package/dist/daemon/server.d.ts +20 -0
  573. package/dist/daemon/server.d.ts.map +1 -0
  574. package/dist/daemon/server.js +400 -0
  575. package/dist/daemon/server.js.map +1 -0
  576. package/dist/daemon/workspace-runtime.d.ts +46 -0
  577. package/dist/daemon/workspace-runtime.d.ts.map +1 -0
  578. package/dist/daemon/workspace-runtime.js +673 -0
  579. package/dist/daemon/workspace-runtime.js.map +1 -0
  580. package/dist/index.d.ts +109 -0
  581. package/dist/index.d.ts.map +1 -0
  582. package/dist/index.js +107 -0
  583. package/dist/index.js.map +1 -0
  584. package/dist/main.d.ts +39 -0
  585. package/dist/main.d.ts.map +1 -0
  586. package/dist/main.js +763 -0
  587. package/dist/main.js.map +1 -0
  588. package/dist/migrations.d.ts +35 -0
  589. package/dist/migrations.d.ts.map +1 -0
  590. package/dist/migrations.js +412 -0
  591. package/dist/migrations.js.map +1 -0
  592. package/dist/modes/interactive/components/assistant-message.d.ts +29 -0
  593. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  594. package/dist/modes/interactive/components/assistant-message.js +149 -0
  595. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  596. package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
  597. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  598. package/dist/modes/interactive/components/bash-execution.js +173 -0
  599. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  600. package/dist/modes/interactive/components/bordered-loader.d.ts +18 -0
  601. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  602. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  603. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  604. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  605. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  606. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  607. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  608. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  609. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  610. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  611. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  612. package/dist/modes/interactive/components/config-selector.d.ts +74 -0
  613. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  614. package/dist/modes/interactive/components/config-selector.js +514 -0
  615. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  616. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  617. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  618. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  619. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  620. package/dist/modes/interactive/components/custom-editor.d.ts +25 -0
  621. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  622. package/dist/modes/interactive/components/custom-editor.js +85 -0
  623. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  624. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  625. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  626. package/dist/modes/interactive/components/custom-message.js +80 -0
  627. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  628. package/dist/modes/interactive/components/diff.d.ts +12 -0
  629. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  630. package/dist/modes/interactive/components/diff.js +118 -0
  631. package/dist/modes/interactive/components/diff.js.map +1 -0
  632. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  633. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  634. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  635. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  636. package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  637. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  638. package/dist/modes/interactive/components/extension-editor.js +128 -0
  639. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  640. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  641. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  642. package/dist/modes/interactive/components/extension-input.js +61 -0
  643. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  644. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  645. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  646. package/dist/modes/interactive/components/extension-selector.js +83 -0
  647. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  648. package/dist/modes/interactive/components/footer.d.ts +36 -0
  649. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  650. package/dist/modes/interactive/components/footer.js +227 -0
  651. package/dist/modes/interactive/components/footer.js.map +1 -0
  652. package/dist/modes/interactive/components/hook-execution.d.ts +19 -0
  653. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -0
  654. package/dist/modes/interactive/components/hook-execution.js +184 -0
  655. package/dist/modes/interactive/components/hook-execution.js.map +1 -0
  656. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  657. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  658. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  659. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  660. package/dist/modes/interactive/components/login-dialog.d.ts +55 -0
  661. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  662. package/dist/modes/interactive/components/login-dialog.js +176 -0
  663. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  664. package/dist/modes/interactive/components/markdown-transform.d.ts +4 -0
  665. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  666. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  667. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  668. package/dist/modes/interactive/components/mermaid.d.ts +14 -0
  669. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  670. package/dist/modes/interactive/components/mermaid.js +228 -0
  671. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  672. package/dist/modes/interactive/components/model-selector.d.ts +52 -0
  673. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  674. package/dist/modes/interactive/components/model-selector.js +296 -0
  675. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  676. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  677. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  678. package/dist/modes/interactive/components/oauth-selector.js +165 -0
  679. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  680. package/dist/modes/interactive/components/scoped-models-selector.d.ts +50 -0
  681. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  682. package/dist/modes/interactive/components/scoped-models-selector.js +300 -0
  683. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  684. package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
  685. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  686. package/dist/modes/interactive/components/session-selector-search.js +144 -0
  687. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  688. package/dist/modes/interactive/components/session-selector.d.ts +108 -0
  689. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  690. package/dist/modes/interactive/components/session-selector.js +835 -0
  691. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  692. package/dist/modes/interactive/components/settings-selector.d.ts +81 -0
  693. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  694. package/dist/modes/interactive/components/settings-selector.js +455 -0
  695. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  696. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  697. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  698. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  699. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  700. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  701. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  702. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  703. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  704. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  705. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  706. package/dist/modes/interactive/components/theme-selector.js +50 -0
  707. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  708. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  709. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  710. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  711. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  712. package/dist/modes/interactive/components/tool-execution.d.ts +67 -0
  713. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  714. package/dist/modes/interactive/components/tool-execution.js +306 -0
  715. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  716. package/dist/modes/interactive/components/tree-selector.d.ts +127 -0
  717. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  718. package/dist/modes/interactive/components/tree-selector.js +1098 -0
  719. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  720. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  721. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  722. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  723. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  724. package/dist/modes/interactive/components/user-message.d.ts +16 -0
  725. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  726. package/dist/modes/interactive/components/user-message.js +49 -0
  727. package/dist/modes/interactive/components/user-message.js.map +1 -0
  728. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  729. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  730. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  731. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  732. package/dist/modes/interactive/interactive-mode.d.ts +557 -0
  733. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  734. package/dist/modes/interactive/interactive-mode.js +5859 -0
  735. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  736. package/dist/modes/interactive/theme/dark.json +86 -0
  737. package/dist/modes/interactive/theme/light.json +85 -0
  738. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  739. package/dist/modes/interactive/theme/theme.d.ts +106 -0
  740. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  741. package/dist/modes/interactive/theme/theme.js +1030 -0
  742. package/dist/modes/interactive/theme/theme.js.map +1 -0
  743. package/dist/modes/json-event.d.ts +28 -0
  744. package/dist/modes/json-event.d.ts.map +1 -0
  745. package/dist/modes/json-event.js +12 -0
  746. package/dist/modes/json-event.js.map +1 -0
  747. package/dist/modes/print-mode.d.ts +29 -0
  748. package/dist/modes/print-mode.d.ts.map +1 -0
  749. package/dist/modes/print-mode.js +142 -0
  750. package/dist/modes/print-mode.js.map +1 -0
  751. package/dist/modes/rpc/jsonl.d.ts +17 -0
  752. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  753. package/dist/modes/rpc/jsonl.js +49 -0
  754. package/dist/modes/rpc/jsonl.js.map +1 -0
  755. package/dist/modes/rpc/rpc-client.d.ts +321 -0
  756. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  757. package/dist/modes/rpc/rpc-client.js +755 -0
  758. package/dist/modes/rpc/rpc-client.js.map +1 -0
  759. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  760. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  761. package/dist/modes/rpc/rpc-mode.js +963 -0
  762. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  763. package/dist/modes/rpc/rpc-types.d.ts +652 -0
  764. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  765. package/dist/modes/rpc/rpc-types.js +8 -0
  766. package/dist/modes/rpc/rpc-types.js.map +1 -0
  767. package/dist/package-manager-cli.d.ts +4 -0
  768. package/dist/package-manager-cli.d.ts.map +1 -0
  769. package/dist/package-manager-cli.js +488 -0
  770. package/dist/package-manager-cli.js.map +1 -0
  771. package/dist/utils/ansi.d.ts +2 -0
  772. package/dist/utils/ansi.d.ts.map +1 -0
  773. package/dist/utils/ansi.js +25 -0
  774. package/dist/utils/ansi.js.map +1 -0
  775. package/dist/utils/changelog.d.ts +23 -0
  776. package/dist/utils/changelog.d.ts.map +1 -0
  777. package/dist/utils/changelog.js +74 -0
  778. package/dist/utils/changelog.js.map +1 -0
  779. package/dist/utils/child-process.d.ts +15 -0
  780. package/dist/utils/child-process.d.ts.map +1 -0
  781. package/dist/utils/child-process.js +88 -0
  782. package/dist/utils/child-process.js.map +1 -0
  783. package/dist/utils/clipboard-image.d.ts +13 -0
  784. package/dist/utils/clipboard-image.d.ts.map +1 -0
  785. package/dist/utils/clipboard-image.js +248 -0
  786. package/dist/utils/clipboard-image.js.map +1 -0
  787. package/dist/utils/clipboard-native.d.ts +11 -0
  788. package/dist/utils/clipboard-native.d.ts.map +1 -0
  789. package/dist/utils/clipboard-native.js +20 -0
  790. package/dist/utils/clipboard-native.js.map +1 -0
  791. package/dist/utils/clipboard.d.ts +4 -0
  792. package/dist/utils/clipboard.d.ts.map +1 -0
  793. package/dist/utils/clipboard.js +171 -0
  794. package/dist/utils/clipboard.js.map +1 -0
  795. package/dist/utils/deprecation.d.ts +4 -0
  796. package/dist/utils/deprecation.d.ts.map +1 -0
  797. package/dist/utils/deprecation.js +13 -0
  798. package/dist/utils/deprecation.js.map +1 -0
  799. package/dist/utils/directory-completions.d.ts +5 -0
  800. package/dist/utils/directory-completions.d.ts.map +1 -0
  801. package/dist/utils/directory-completions.js +64 -0
  802. package/dist/utils/directory-completions.js.map +1 -0
  803. package/dist/utils/exif-orientation.d.ts +6 -0
  804. package/dist/utils/exif-orientation.d.ts.map +1 -0
  805. package/dist/utils/exif-orientation.js +166 -0
  806. package/dist/utils/exif-orientation.js.map +1 -0
  807. package/dist/utils/frontmatter.d.ts +8 -0
  808. package/dist/utils/frontmatter.d.ts.map +1 -0
  809. package/dist/utils/frontmatter.js +26 -0
  810. package/dist/utils/frontmatter.js.map +1 -0
  811. package/dist/utils/fs-watch.d.ts +5 -0
  812. package/dist/utils/fs-watch.d.ts.map +1 -0
  813. package/dist/utils/fs-watch.js +25 -0
  814. package/dist/utils/fs-watch.js.map +1 -0
  815. package/dist/utils/git.d.ts +27 -0
  816. package/dist/utils/git.d.ts.map +1 -0
  817. package/dist/utils/git.js +237 -0
  818. package/dist/utils/git.js.map +1 -0
  819. package/dist/utils/grip-user-agent.d.ts +2 -0
  820. package/dist/utils/grip-user-agent.d.ts.map +1 -0
  821. package/dist/utils/grip-user-agent.js +5 -0
  822. package/dist/utils/grip-user-agent.js.map +1 -0
  823. package/dist/utils/html.d.ts +7 -0
  824. package/dist/utils/html.d.ts.map +1 -0
  825. package/dist/utils/html.js +40 -0
  826. package/dist/utils/html.js.map +1 -0
  827. package/dist/utils/image-convert.d.ts +12 -0
  828. package/dist/utils/image-convert.d.ts.map +1 -0
  829. package/dist/utils/image-convert.js +43 -0
  830. package/dist/utils/image-convert.js.map +1 -0
  831. package/dist/utils/image-process.d.ts +18 -0
  832. package/dist/utils/image-process.d.ts.map +1 -0
  833. package/dist/utils/image-process.js +83 -0
  834. package/dist/utils/image-process.js.map +1 -0
  835. package/dist/utils/image-resize-core.d.ts +30 -0
  836. package/dist/utils/image-resize-core.d.ts.map +1 -0
  837. package/dist/utils/image-resize-core.js +133 -0
  838. package/dist/utils/image-resize-core.js.map +1 -0
  839. package/dist/utils/image-resize-worker.d.ts +2 -0
  840. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  841. package/dist/utils/image-resize-worker.js +31 -0
  842. package/dist/utils/image-resize-worker.js.map +1 -0
  843. package/dist/utils/image-resize.d.ts +19 -0
  844. package/dist/utils/image-resize.d.ts.map +1 -0
  845. package/dist/utils/image-resize.js +81 -0
  846. package/dist/utils/image-resize.js.map +1 -0
  847. package/dist/utils/json.d.ts +3 -0
  848. package/dist/utils/json.d.ts.map +1 -0
  849. package/dist/utils/json.js +7 -0
  850. package/dist/utils/json.js.map +1 -0
  851. package/dist/utils/mime.d.ts +3 -0
  852. package/dist/utils/mime.d.ts.map +1 -0
  853. package/dist/utils/mime.js +110 -0
  854. package/dist/utils/mime.js.map +1 -0
  855. package/dist/utils/open-browser.d.ts +9 -0
  856. package/dist/utils/open-browser.d.ts.map +1 -0
  857. package/dist/utils/open-browser.js +22 -0
  858. package/dist/utils/open-browser.js.map +1 -0
  859. package/dist/utils/paths.d.ts +31 -0
  860. package/dist/utils/paths.d.ts.map +1 -0
  861. package/dist/utils/paths.js +87 -0
  862. package/dist/utils/paths.js.map +1 -0
  863. package/dist/utils/photon.d.ts +22 -0
  864. package/dist/utils/photon.d.ts.map +1 -0
  865. package/dist/utils/photon.js +125 -0
  866. package/dist/utils/photon.js.map +1 -0
  867. package/dist/utils/shell.d.ts +28 -0
  868. package/dist/utils/shell.d.ts.map +1 -0
  869. package/dist/utils/shell.js +188 -0
  870. package/dist/utils/shell.js.map +1 -0
  871. package/dist/utils/sleep.d.ts +5 -0
  872. package/dist/utils/sleep.d.ts.map +1 -0
  873. package/dist/utils/sleep.js +17 -0
  874. package/dist/utils/sleep.js.map +1 -0
  875. package/dist/utils/syntax-highlight.d.ts +12 -0
  876. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  877. package/dist/utils/syntax-highlight.js +125 -0
  878. package/dist/utils/syntax-highlight.js.map +1 -0
  879. package/dist/utils/tools-manager.d.ts +5 -0
  880. package/dist/utils/tools-manager.d.ts.map +1 -0
  881. package/dist/utils/tools-manager.js +329 -0
  882. package/dist/utils/tools-manager.js.map +1 -0
  883. package/dist/utils/version-check.d.ts +14 -0
  884. package/dist/utils/version-check.d.ts.map +1 -0
  885. package/dist/utils/version-check.js +91 -0
  886. package/dist/utils/version-check.js.map +1 -0
  887. package/dist/utils/windows-self-update.d.ts +3 -0
  888. package/dist/utils/windows-self-update.d.ts.map +1 -0
  889. package/dist/utils/windows-self-update.js +77 -0
  890. package/dist/utils/windows-self-update.js.map +1 -0
  891. package/docs/compaction.md +408 -0
  892. package/docs/custom-provider.md +714 -0
  893. package/docs/daemon-architecture.md +399 -0
  894. package/docs/daemon.md +110 -0
  895. package/docs/development.md +72 -0
  896. package/docs/docs.json +164 -0
  897. package/docs/extensions.md +2745 -0
  898. package/docs/hooks.md +85 -0
  899. package/docs/images/doom-extension.png +0 -0
  900. package/docs/images/exy.png +0 -0
  901. package/docs/images/interactive-mode.png +0 -0
  902. package/docs/images/tree-view.png +0 -0
  903. package/docs/index.md +81 -0
  904. package/docs/json.md +89 -0
  905. package/docs/keybindings.md +230 -0
  906. package/docs/lsp.md +499 -0
  907. package/docs/migrating-to-grip.md +18 -0
  908. package/docs/models.md +496 -0
  909. package/docs/packages.md +228 -0
  910. package/docs/prompt-templates.md +88 -0
  911. package/docs/providers.md +251 -0
  912. package/docs/quickstart.md +167 -0
  913. package/docs/rpc.md +1492 -0
  914. package/docs/rules.md +117 -0
  915. package/docs/sandbox.md +181 -0
  916. package/docs/sdk.md +360 -0
  917. package/docs/session-format.md +414 -0
  918. package/docs/sessions.md +137 -0
  919. package/docs/settings.md +371 -0
  920. package/docs/shell-aliases.md +13 -0
  921. package/docs/skills.md +246 -0
  922. package/docs/terminal-setup.md +112 -0
  923. package/docs/termux.md +129 -0
  924. package/docs/themes.md +295 -0
  925. package/docs/tmux.md +61 -0
  926. package/docs/tui.md +918 -0
  927. package/docs/usage.md +304 -0
  928. package/docs/windows.md +17 -0
  929. package/examples/README.md +31 -0
  930. package/examples/daemon-docker/Dockerfile +43 -0
  931. package/examples/daemon-docker/README.md +45 -0
  932. package/examples/extensions/README.md +208 -0
  933. package/examples/extensions/auto-commit-on-exit.ts +46 -0
  934. package/examples/extensions/bash-spawn-hook.ts +30 -0
  935. package/examples/extensions/bookmark.ts +50 -0
  936. package/examples/extensions/border-status-editor.ts +145 -0
  937. package/examples/extensions/built-in-tool-renderer.ts +259 -0
  938. package/examples/extensions/claude-rules.ts +86 -0
  939. package/examples/extensions/commands.ts +82 -0
  940. package/examples/extensions/confirm-destructive.ts +59 -0
  941. package/examples/extensions/custom-compaction.ts +131 -0
  942. package/examples/extensions/custom-footer.ts +79 -0
  943. package/examples/extensions/custom-header.ts +73 -0
  944. package/examples/extensions/custom-provider-anthropic/index.ts +707 -0
  945. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  946. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  947. package/examples/extensions/custom-provider-gitlab-duo/index.ts +402 -0
  948. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  949. package/examples/extensions/custom-provider-gitlab-duo/test.ts +104 -0
  950. package/examples/extensions/dirty-repo-guard.ts +59 -0
  951. package/examples/extensions/doom-overlay/README.md +46 -0
  952. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  953. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  954. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  955. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  956. package/examples/extensions/doom-overlay/doom-component.ts +133 -0
  957. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  958. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  959. package/examples/extensions/doom-overlay/index.ts +74 -0
  960. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  961. package/examples/extensions/dynamic-resources/RULES.md +8 -0
  962. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  963. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  964. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  965. package/examples/extensions/dynamic-resources/index.ts +16 -0
  966. package/examples/extensions/dynamic-tools.ts +74 -0
  967. package/examples/extensions/event-bus.ts +43 -0
  968. package/examples/extensions/file-trigger.ts +41 -0
  969. package/examples/extensions/git-checkpoint.ts +53 -0
  970. package/examples/extensions/git-merge-and-resolve.ts +125 -0
  971. package/examples/extensions/github-issue-autocomplete.ts +191 -0
  972. package/examples/extensions/handoff.ts +191 -0
  973. package/examples/extensions/hello.ts +26 -0
  974. package/examples/extensions/hidden-thinking-label.ts +53 -0
  975. package/examples/extensions/inline-bash.ts +104 -0
  976. package/examples/extensions/input-transform.ts +43 -0
  977. package/examples/extensions/interactive-shell.ts +194 -0
  978. package/examples/extensions/mac-system-theme.ts +47 -0
  979. package/examples/extensions/message-renderer.ts +59 -0
  980. package/examples/extensions/minimal-mode.ts +428 -0
  981. package/examples/extensions/modal-editor.ts +86 -0
  982. package/examples/extensions/model-status.ts +31 -0
  983. package/examples/extensions/notify.ts +55 -0
  984. package/examples/extensions/overlay-qa-tests.ts +1374 -0
  985. package/examples/extensions/overlay-test.ts +171 -0
  986. package/examples/extensions/permission-gate.ts +34 -0
  987. package/examples/extensions/pirate.ts +47 -0
  988. package/examples/extensions/plan-mode/README.md +65 -0
  989. package/examples/extensions/plan-mode/index.ts +346 -0
  990. package/examples/extensions/plan-mode/utils.ts +172 -0
  991. package/examples/extensions/preset.ts +426 -0
  992. package/examples/extensions/prompt-customizer.ts +97 -0
  993. package/examples/extensions/protected-paths.ts +29 -0
  994. package/examples/extensions/provider-payload.ts +18 -0
  995. package/examples/extensions/qna.ts +125 -0
  996. package/examples/extensions/question.ts +294 -0
  997. package/examples/extensions/questionnaire.ts +459 -0
  998. package/examples/extensions/rainbow-editor.ts +88 -0
  999. package/examples/extensions/reload-runtime.ts +37 -0
  1000. package/examples/extensions/rpc-demo.ts +118 -0
  1001. package/examples/extensions/sandbox/index.ts +320 -0
  1002. package/examples/extensions/sandbox/package-lock.json +92 -0
  1003. package/examples/extensions/sandbox/package.json +19 -0
  1004. package/examples/extensions/send-user-message.ts +97 -0
  1005. package/examples/extensions/session-name.ts +27 -0
  1006. package/examples/extensions/shutdown-command.ts +63 -0
  1007. package/examples/extensions/snake.ts +381 -0
  1008. package/examples/extensions/space-invaders.ts +597 -0
  1009. package/examples/extensions/status-line.ts +32 -0
  1010. package/examples/extensions/structured-output.ts +65 -0
  1011. package/examples/extensions/subagent/README.md +175 -0
  1012. package/examples/extensions/subagent/agents/planner.md +37 -0
  1013. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1014. package/examples/extensions/subagent/agents/scout.md +50 -0
  1015. package/examples/extensions/subagent/agents/worker.md +24 -0
  1016. package/examples/extensions/subagent/agents.ts +126 -0
  1017. package/examples/extensions/subagent/index.ts +1083 -0
  1018. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1019. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1020. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1021. package/examples/extensions/summarize.ts +186 -0
  1022. package/examples/extensions/system-prompt-header.ts +17 -0
  1023. package/examples/extensions/tic-tac-toe.ts +1091 -0
  1024. package/examples/extensions/timed-confirm.ts +70 -0
  1025. package/examples/extensions/titlebar-spinner.ts +58 -0
  1026. package/examples/extensions/todo.ts +306 -0
  1027. package/examples/extensions/tool-override.ts +144 -0
  1028. package/examples/extensions/tools.ts +141 -0
  1029. package/examples/extensions/trigger-compact.ts +50 -0
  1030. package/examples/extensions/truncated-tool.ts +200 -0
  1031. package/examples/extensions/widget-placement.ts +9 -0
  1032. package/examples/extensions/with-deps/index.ts +32 -0
  1033. package/examples/extensions/with-deps/package-lock.json +31 -0
  1034. package/examples/extensions/with-deps/package.json +22 -0
  1035. package/examples/extensions/working-indicator.ts +123 -0
  1036. package/examples/extensions/working-message-test.ts +25 -0
  1037. package/examples/remote-session-server/README.md +71 -0
  1038. package/examples/remote-session-server/server.ts +353 -0
  1039. package/examples/rpc-extension-ui.ts +642 -0
  1040. package/examples/sandbox-docker/Dockerfile +274 -0
  1041. package/examples/sandbox-docker/README.md +88 -0
  1042. package/examples/sdk/01-minimal.ts +27 -0
  1043. package/examples/sdk/02-custom-model.ts +54 -0
  1044. package/examples/sdk/03-custom-prompt.ts +76 -0
  1045. package/examples/sdk/04-skills.ts +60 -0
  1046. package/examples/sdk/05-tools.ts +55 -0
  1047. package/examples/sdk/06-extensions.ts +94 -0
  1048. package/examples/sdk/07-context-files.ts +47 -0
  1049. package/examples/sdk/08-prompt-templates.ts +56 -0
  1050. package/examples/sdk/09-api-keys-and-oauth.ts +50 -0
  1051. package/examples/sdk/10-settings.ts +58 -0
  1052. package/examples/sdk/11-sessions.ts +54 -0
  1053. package/examples/sdk/12-full-control.ts +79 -0
  1054. package/examples/sdk/13-session-runtime.ts +49 -0
  1055. package/examples/sdk/README.md +94 -0
  1056. package/npm-shrinkwrap.json +1878 -0
  1057. package/package.json +102 -5
@@ -0,0 +1,324 @@
1
+ import { Text } from "@greppleai/grip-tui";
2
+ import { createTwoFilesPatch } from "diff";
3
+ import { Type } from "typebox";
4
+ import { withFileMutationQueue } from "./file-mutation-queue.js";
5
+ import { applyEdits, fmtBoundaryWarning } from "./hashline/apply.js";
6
+ import { initHasher, lineHashes } from "./hashline/hash.js";
7
+ import { resEdits } from "./hashline/resolve.js";
8
+ import { resolveToCwd } from "./path-utils.js";
9
+ import { formatBackendIcon, invalidArgText, shortenPath, str } from "./render-utils.js";
10
+ import { detectEnding, genDiff, restoreEndings, stripBOM, toLF } from "./replace-diff.js";
11
+ import { normReq } from "./replace-normalize.js";
12
+ import { fmtCall, getPreviewInput } from "./replace-render.js";
13
+ import { abortIf } from "./runtime.js";
14
+ import { wrapToolDefinition } from "./tool-definition-wrapper.js";
15
+ const contentLinesSchema = Type.Array(Type.String(), {
16
+ description: "Literal replacement content, one string per line. Use [] to delete the range. Do not include HASH│ prefixes from read output.",
17
+ });
18
+ const hashRangeInclusiveSchema = Type.Array(Type.String(), {
19
+ description: "Inclusive hash range to replace [start_hash, end_hash]. Use hash anchors only.",
20
+ minItems: 2,
21
+ maxItems: 2,
22
+ });
23
+ const editItemSchema = Type.Object({
24
+ hash_range_inclusive: hashRangeInclusiveSchema,
25
+ content_lines: contentLinesSchema,
26
+ }, { additionalProperties: false });
27
+ const editSchema = Type.Object({
28
+ path: Type.String({ description: "Path to the file to edit (relative or absolute)" }),
29
+ changes: Type.Array(editItemSchema, {
30
+ description: "One or more hash-anchored replacements. All anchors must come from the same read snapshot.",
31
+ }),
32
+ }, { additionalProperties: false });
33
+ function countDiffLines(diff, marker) {
34
+ let count = 0;
35
+ for (const line of diff.split("\n")) {
36
+ if (line.startsWith(marker) && !line.startsWith(`${marker}${marker}${marker}`)) {
37
+ count++;
38
+ }
39
+ }
40
+ return count;
41
+ }
42
+ function hashStoreKey(operations, absolutePath) {
43
+ const backend = operations.getBackendInfo?.();
44
+ if (!backend)
45
+ return absolutePath;
46
+ if (backend.type === "remote" && backend.configured)
47
+ return `remote:${backend.url}:${absolutePath}`;
48
+ return absolutePath;
49
+ }
50
+ function formatEditCall(args, theme, backendInfo) {
51
+ const previewInput = getPreviewInput(args);
52
+ if (previewInput) {
53
+ return formatBackendIcon(backendInfo, theme) + fmtCall(previewInput, {}, false, theme).replace("replace", "edit");
54
+ }
55
+ const invalidArg = invalidArgText(theme);
56
+ const rawPath = str(args?.file_path ?? args?.path);
57
+ const path = rawPath !== null ? shortenPath(rawPath) : null;
58
+ const pathDisplay = path === null ? invalidArg : path ? theme.fg("accent", path) : theme.fg("toolOutput", "...");
59
+ return `${formatBackendIcon(backendInfo, theme)}${theme.fg("toolTitle", theme.bold("edit"))} ${pathDisplay}`;
60
+ }
61
+ async function computePreview(request, operations) {
62
+ try {
63
+ await initHasher();
64
+ const absolutePath = resolveToCwd(request.path, operations.cwd);
65
+ await operations.access(absolutePath, "read");
66
+ const rawContent = (await operations.readFile(absolutePath)).toString("utf-8");
67
+ const { text } = stripBOM(rawContent);
68
+ const originalNormalized = toLF(text);
69
+ const originalHashes = await lineHashes(originalNormalized, hashStoreKey(operations, absolutePath));
70
+ const result = applyEdits(originalNormalized, resEdits(request.changes), undefined, originalHashes, request.path).content;
71
+ if (originalNormalized === result) {
72
+ return { error: `No changes made to ${request.path}. The edits produced identical content.` };
73
+ }
74
+ const resultHashes = await lineHashes(result);
75
+ return { diff: genDiff(originalNormalized, result, 4, resultHashes, originalHashes).diff };
76
+ }
77
+ catch (error) {
78
+ return { error: error instanceof Error ? error.message : String(error) };
79
+ }
80
+ }
81
+ function normalizeEditArguments(input) {
82
+ return normReq(input);
83
+ }
84
+ function assertReq(request) {
85
+ if (!request || typeof request !== "object" || Array.isArray(request)) {
86
+ throw new Error("[E_BAD_SHAPE] Edit request must be an object.");
87
+ }
88
+ const record = request;
89
+ for (const legacyKey of ["oldText", "newText", "old_text", "new_text", "old_range", "start", "end", "lines"]) {
90
+ if (Object.hasOwn(record, legacyKey)) {
91
+ throw new Error(`[E_LEGACY_SHAPE] "${legacyKey}" is not supported. Call read first, then use {hash_range_inclusive: ["<START>", "<END>"], content_lines: [...]}.`);
92
+ }
93
+ }
94
+ const unknown = Object.keys(record).filter((key) => key !== "path" && key !== "changes");
95
+ if (unknown.length > 0) {
96
+ throw new Error(`[E_BAD_SHAPE] Edit request contains unknown or unsupported fields: ${unknown.join(", ")}.`);
97
+ }
98
+ if (typeof record.path !== "string" || record.path.length === 0) {
99
+ throw new Error('[E_BAD_SHAPE] Edit request requires a non-empty "path" string.');
100
+ }
101
+ if (!Array.isArray(record.changes) || record.changes.length === 0) {
102
+ throw new Error('[E_BAD_SHAPE] Edit request requires a non-empty "changes" array.');
103
+ }
104
+ }
105
+ async function readEditSource(path, absolutePath, operations) {
106
+ try {
107
+ await operations.access(absolutePath, "readwrite");
108
+ }
109
+ catch (error) {
110
+ const message = error instanceof Error && "code" in error ? `Error code: ${String(error.code)}` : String(error);
111
+ throw new Error(`Could not edit file: ${path}. ${message}.`);
112
+ }
113
+ const rawContent = (await operations.readFile(absolutePath)).toString("utf-8");
114
+ const { bom, text } = stripBOM(rawContent);
115
+ const originalContent = toLF(text);
116
+ const storeKey = hashStoreKey(operations, absolutePath);
117
+ return {
118
+ bom,
119
+ originalEnding: detectEnding(text),
120
+ originalContent,
121
+ originalHashes: await lineHashes(originalContent, storeKey),
122
+ storeKey,
123
+ };
124
+ }
125
+ function collectRemovedHashes(edits, originalHashes) {
126
+ const hashIndexes = new Map();
127
+ for (let index = 0; index < originalHashes.length; index++) {
128
+ const hash = originalHashes[index];
129
+ if (hash !== undefined && !hashIndexes.has(hash))
130
+ hashIndexes.set(hash, index);
131
+ }
132
+ const removedHashes = new Set();
133
+ for (const edit of edits) {
134
+ const startLine = hashIndexes.get(edit.hash_range_inclusive[0].hash) ?? -1;
135
+ const endLine = hashIndexes.get(edit.hash_range_inclusive[1].hash) ?? -1;
136
+ if (startLine < 0 || endLine < 0)
137
+ continue;
138
+ for (let index = startLine; index <= endLine; index++) {
139
+ const hash = originalHashes[index];
140
+ if (hash)
141
+ removedHashes.add(hash);
142
+ }
143
+ }
144
+ return removedHashes;
145
+ }
146
+ function indexLineOccurrences(lines) {
147
+ const indexesByLine = new Map();
148
+ for (let index = 0; index < lines.length; index++) {
149
+ const line = lines[index];
150
+ const indexes = indexesByLine.get(line);
151
+ if (indexes)
152
+ indexes.push(index);
153
+ else
154
+ indexesByLine.set(line, [index]);
155
+ }
156
+ return indexesByLine;
157
+ }
158
+ function collectEditWarnings(anchorResult, resultContent, resultHashes) {
159
+ const warnings = [...(anchorResult.warnings ?? [])];
160
+ const resultLines = resultContent.split("\n");
161
+ const indexesByLine = indexLineOccurrences(resultLines);
162
+ for (const warning of anchorResult.boundaryWarnings ?? []) {
163
+ const matchIndex = indexesByLine.get(warning.survivingLineContent)?.[warning.occurrence] ?? -1;
164
+ if (matchIndex < 0)
165
+ continue;
166
+ warnings.push(fmtBoundaryWarning({
167
+ kind: warning.kind,
168
+ survivingContent: warning.survivingLineContent,
169
+ matchIndex,
170
+ resultLines,
171
+ resultHashes,
172
+ }));
173
+ }
174
+ return warnings;
175
+ }
176
+ function buildNoopEditResult(path, editCount, anchorResult, warnings) {
177
+ return {
178
+ content: [{ type: "text", text: `No changes made to ${path}. The edits produced identical content.` }],
179
+ details: {
180
+ diff: "",
181
+ patch: "",
182
+ classification: "noop",
183
+ metrics: {
184
+ edits_attempted: editCount,
185
+ edits_noop: anchorResult.noopEdits?.length ?? 0,
186
+ warnings: warnings.length,
187
+ classification: "noop",
188
+ },
189
+ },
190
+ };
191
+ }
192
+ function buildAppliedEditResult(options) {
193
+ const diffResult = genDiff(options.originalContent, options.resultContent, 2, options.resultHashes, options.originalHashes);
194
+ const warningBlock = options.warnings.length > 0 ? `\n\nWarnings:\n${options.warnings.join("\n")}` : "";
195
+ const changedLines = options.anchorResult.firstChangedLine !== undefined && options.anchorResult.lastChangedLine !== undefined
196
+ ? {
197
+ first: options.anchorResult.firstChangedLine,
198
+ last: options.anchorResult.lastChangedLine,
199
+ }
200
+ : undefined;
201
+ return {
202
+ content: [{ type: "text", text: `Successfully replaced in ${options.path}.${warningBlock}` }],
203
+ details: {
204
+ diff: diffResult.diff,
205
+ patch: createTwoFilesPatch(options.path, options.path, options.originalContent, options.resultContent),
206
+ firstChangedLine: options.anchorResult.firstChangedLine ?? diffResult.firstChangedLine,
207
+ metrics: {
208
+ edits_attempted: options.editCount,
209
+ edits_noop: options.anchorResult.noopEdits?.length ?? 0,
210
+ warnings: options.warnings.length,
211
+ classification: "applied",
212
+ ...(changedLines ? { changed_lines: changedLines } : {}),
213
+ added_lines: countDiffLines(diffResult.diff, "+"),
214
+ removed_lines: countDiffLines(diffResult.diff, "-"),
215
+ },
216
+ },
217
+ };
218
+ }
219
+ async function executeEditMutation(request, absolutePath, operations, signal) {
220
+ abortIf(signal);
221
+ await initHasher();
222
+ const source = await readEditSource(request.path, absolutePath, operations);
223
+ const resolvedEdits = resEdits(request.changes);
224
+ const anchorResult = applyEdits(source.originalContent, resolvedEdits, signal, source.originalHashes, request.path);
225
+ const resultContent = anchorResult.content;
226
+ const resultHashes = await lineHashes(resultContent, source.storeKey, {
227
+ content: source.originalContent,
228
+ hashes: source.originalHashes,
229
+ removedHashes: collectRemovedHashes(resolvedEdits, source.originalHashes),
230
+ });
231
+ const warnings = collectEditWarnings(anchorResult, resultContent, resultHashes);
232
+ if (source.originalContent === resultContent) {
233
+ return buildNoopEditResult(request.path, request.changes.length, anchorResult, warnings);
234
+ }
235
+ abortIf(signal);
236
+ await operations.writeFile(absolutePath, source.bom + restoreEndings(resultContent, source.originalEnding));
237
+ return buildAppliedEditResult({
238
+ path: request.path,
239
+ editCount: request.changes.length,
240
+ anchorResult,
241
+ warnings,
242
+ originalContent: source.originalContent,
243
+ resultContent,
244
+ originalHashes: source.originalHashes,
245
+ resultHashes,
246
+ });
247
+ }
248
+ export function createEditToolDefinition(operations, _options) {
249
+ return {
250
+ name: "edit",
251
+ label: "edit",
252
+ description: "Edit a file using hash-anchored line replacements. Call read first; it returns HASH│content lines. Use hash_range_inclusive with the 3-character start/end hashes and content_lines with literal replacement lines only.",
253
+ promptSnippet: "Edit files using hashline anchors from read output",
254
+ promptGuidelines: [
255
+ "Use read before edit to get HASH│content anchors.",
256
+ "Use edit with changes: [{ hash_range_inclusive: [startHash, endHash], content_lines: [...] }].",
257
+ "hash_range_inclusive contains only the 3-character hashes, not line numbers and not HASH│content.",
258
+ "content_lines contains literal file content only; do not include HASH│ prefixes. Use [] to delete a range.",
259
+ "After a successful edit, call read again before follow-up edits unless the response includes current warning anchors.",
260
+ ],
261
+ parameters: editSchema,
262
+ renderShell: "default",
263
+ prepareArguments: normalizeEditArguments,
264
+ async execute(_toolCallId, input, signal) {
265
+ const normalized = normReq(input);
266
+ assertReq(normalized);
267
+ const absolutePath = resolveToCwd(normalized.path, operations.cwd);
268
+ return withFileMutationQueue(absolutePath, () => executeEditMutation(normalized, absolutePath, operations, signal));
269
+ },
270
+ renderCall(args, theme, context) {
271
+ const text = context.lastComponent ?? new Text("", 0, 0);
272
+ const previewInput = getPreviewInput(args);
273
+ if (!context.executionStarted && context.argsComplete && previewInput) {
274
+ const argsKey = JSON.stringify(previewInput);
275
+ if (context.state.argsKey !== argsKey) {
276
+ context.state.argsKey = argsKey;
277
+ context.state.preview = undefined;
278
+ const generation = (context.state.previewGeneration ?? 0) + 1;
279
+ context.state.previewGeneration = generation;
280
+ void computePreview(previewInput, operations).then((preview) => {
281
+ if (context.state.argsKey === argsKey && context.state.previewGeneration === generation) {
282
+ context.state.preview = preview;
283
+ context.invalidate();
284
+ }
285
+ });
286
+ }
287
+ text.setText(formatBackendIcon(operations.getBackendInfo?.(), theme) +
288
+ fmtCall(previewInput, context.state, context.expanded, theme).replace("replace", "edit"));
289
+ return text;
290
+ }
291
+ text.setText(formatEditCall(args, theme, operations.getBackendInfo?.()));
292
+ return text;
293
+ },
294
+ renderResult(result, _options, theme, context) {
295
+ const text = context.lastComponent ?? new Text("", 0, 0);
296
+ if (context.isError) {
297
+ const errorText = result.content
298
+ ?.filter((entry) => entry.type === "text")
299
+ .map((entry) => entry.text ?? "")
300
+ .join("\n");
301
+ text.setText(errorText ? `\n${theme.fg("error", errorText)}` : "");
302
+ return text;
303
+ }
304
+ const diff = result.details?.diff;
305
+ if (!diff) {
306
+ text.setText("");
307
+ return text;
308
+ }
309
+ const lines = diff.split("\n").map((line) => {
310
+ if (line.startsWith("+") && !line.startsWith("+++"))
311
+ return theme.fg("success", line);
312
+ if (line.startsWith("-") && !line.startsWith("---"))
313
+ return theme.fg("error", line);
314
+ return theme.fg("dim", line);
315
+ });
316
+ text.setText(`\n${lines.join("\n")}`);
317
+ return text;
318
+ },
319
+ };
320
+ }
321
+ export function createEditTool(operations, options) {
322
+ return wrapToolDefinition(createEditToolDefinition(operations, options));
323
+ }
324
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/core/tools/edit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from \"@greppleai/grip-agent-core\";\nimport { Text } from \"@greppleai/grip-tui\";\nimport { createTwoFilesPatch } from \"diff\";\nimport { type Static, Type } from \"typebox\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { withFileMutationQueue } from \"./file-mutation-queue.ts\";\nimport { type ApplyEditsResult, applyEdits, fmtBoundaryWarning } from \"./hashline/apply.ts\";\nimport { initHasher, lineHashes } from \"./hashline/hash.ts\";\nimport { type HEdit, type HTEdit, resEdits } from \"./hashline/resolve.ts\";\nimport type { ToolBackendInfo, ToolOperations } from \"./operations.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { formatBackendIcon, invalidArgText, shortenPath, str } from \"./render-utils.ts\";\nimport { detectEnding, genDiff, type LineEnding, restoreEndings, stripBOM, toLF } from \"./replace-diff.ts\";\nimport { normReq } from \"./replace-normalize.ts\";\nimport { fmtCall, getPreviewInput, type RPreview, type RRState } from \"./replace-render.ts\";\nimport { abortIf } from \"./runtime.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst contentLinesSchema = Type.Array(Type.String(), {\n\tdescription:\n\t\t\"Literal replacement content, one string per line. Use [] to delete the range. Do not include HASH│ prefixes from read output.\",\n});\n\nconst hashRangeInclusiveSchema = Type.Array(Type.String(), {\n\tdescription: \"Inclusive hash range to replace [start_hash, end_hash]. Use hash anchors only.\",\n\tminItems: 2,\n\tmaxItems: 2,\n});\n\nconst editItemSchema = Type.Object(\n\t{\n\t\thash_range_inclusive: hashRangeInclusiveSchema,\n\t\tcontent_lines: contentLinesSchema,\n\t},\n\t{ additionalProperties: false },\n);\n\nconst editSchema = Type.Object(\n\t{\n\t\tpath: Type.String({ description: \"Path to the file to edit (relative or absolute)\" }),\n\t\tchanges: Type.Array(editItemSchema, {\n\t\t\tdescription: \"One or more hash-anchored replacements. All anchors must come from the same read snapshot.\",\n\t\t}),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type EditToolInput = Static<typeof editSchema>;\n\nexport type ReqParams = {\n\tpath: string;\n\tchanges: HTEdit[];\n};\ninterface EditChangedLineRange {\n\tfirst: number;\n\tlast: number;\n}\n\nexport type RMetrics = {\n\tedits_attempted: number;\n\tedits_noop: number;\n\twarnings: number;\n\tclassification: \"applied\" | \"noop\";\n\tchanged_lines?: EditChangedLineRange;\n\tadded_lines?: number;\n\tremoved_lines?: number;\n};\n\nexport interface ReplaceDetails {\n\tdiff: string;\n\tpatch: string;\n\tfirstChangedLine?: number;\n\tclassification?: \"noop\";\n\tmetrics?: RMetrics;\n}\n\nexport type EditToolDetails = ReplaceDetails;\n\nexport interface EditToolOptions {}\n\ntype EditRenderState = RRState;\ntype DiffLineMarker = \"+\" | \"-\";\n\ntype RenderableEditArgs = {\n\tpath?: string;\n\tfile_path?: string;\n\tchanges?: HTEdit[];\n\tedits?: HTEdit[];\n\thash_range_inclusive?: [string, string];\n\tcontent_lines?: string[];\n};\n\nfunction countDiffLines(diff: string, marker: DiffLineMarker): number {\n\tlet count = 0;\n\tfor (const line of diff.split(\"\\n\")) {\n\t\tif (line.startsWith(marker) && !line.startsWith(`${marker}${marker}${marker}`)) {\n\t\t\tcount++;\n\t\t}\n\t}\n\treturn count;\n}\n\nfunction hashStoreKey(operations: ToolOperations, absolutePath: string): string {\n\tconst backend = operations.getBackendInfo?.();\n\tif (!backend) return absolutePath;\n\tif (backend.type === \"remote\" && backend.configured) return `remote:${backend.url}:${absolutePath}`;\n\treturn absolutePath;\n}\n\nfunction formatEditCall(\n\targs: RenderableEditArgs | undefined,\n\ttheme: Theme,\n\tbackendInfo: ToolBackendInfo | undefined,\n): string {\n\tconst previewInput = getPreviewInput(args);\n\tif (previewInput) {\n\t\treturn formatBackendIcon(backendInfo, theme) + fmtCall(previewInput, {}, false, theme).replace(\"replace\", \"edit\");\n\t}\n\tconst invalidArg = invalidArgText(theme);\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst path = rawPath !== null ? shortenPath(rawPath) : null;\n\tconst pathDisplay = path === null ? invalidArg : path ? theme.fg(\"accent\", path) : theme.fg(\"toolOutput\", \"...\");\n\treturn `${formatBackendIcon(backendInfo, theme)}${theme.fg(\"toolTitle\", theme.bold(\"edit\"))} ${pathDisplay}`;\n}\n\nasync function computePreview(request: ReqParams, operations: ToolOperations): Promise<RPreview> {\n\ttry {\n\t\tawait initHasher();\n\t\tconst absolutePath = resolveToCwd(request.path, operations.cwd);\n\t\tawait operations.access(absolutePath, \"read\");\n\t\tconst rawContent = (await operations.readFile(absolutePath)).toString(\"utf-8\");\n\t\tconst { text } = stripBOM(rawContent);\n\t\tconst originalNormalized = toLF(text);\n\t\tconst originalHashes = await lineHashes(originalNormalized, hashStoreKey(operations, absolutePath));\n\t\tconst result = applyEdits(\n\t\t\toriginalNormalized,\n\t\t\tresEdits(request.changes),\n\t\t\tundefined,\n\t\t\toriginalHashes,\n\t\t\trequest.path,\n\t\t).content;\n\t\tif (originalNormalized === result) {\n\t\t\treturn { error: `No changes made to ${request.path}. The edits produced identical content.` };\n\t\t}\n\t\tconst resultHashes = await lineHashes(result);\n\t\treturn { diff: genDiff(originalNormalized, result, 4, resultHashes, originalHashes).diff };\n\t} catch (error) {\n\t\treturn { error: error instanceof Error ? error.message : String(error) };\n\t}\n}\n\nfunction normalizeEditArguments(input: unknown): EditToolInput {\n\treturn normReq(input) as EditToolInput;\n}\n\nfunction assertReq(request: unknown): asserts request is ReqParams {\n\tif (!request || typeof request !== \"object\" || Array.isArray(request)) {\n\t\tthrow new Error(\"[E_BAD_SHAPE] Edit request must be an object.\");\n\t}\n\tconst record = request as Record<string, unknown>;\n\tfor (const legacyKey of [\"oldText\", \"newText\", \"old_text\", \"new_text\", \"old_range\", \"start\", \"end\", \"lines\"]) {\n\t\tif (Object.hasOwn(record, legacyKey)) {\n\t\t\tthrow new Error(\n\t\t\t\t`[E_LEGACY_SHAPE] \"${legacyKey}\" is not supported. Call read first, then use {hash_range_inclusive: [\"<START>\", \"<END>\"], content_lines: [...]}.`,\n\t\t\t);\n\t\t}\n\t}\n\tconst unknown = Object.keys(record).filter((key) => key !== \"path\" && key !== \"changes\");\n\tif (unknown.length > 0) {\n\t\tthrow new Error(`[E_BAD_SHAPE] Edit request contains unknown or unsupported fields: ${unknown.join(\", \")}.`);\n\t}\n\tif (typeof record.path !== \"string\" || record.path.length === 0) {\n\t\tthrow new Error('[E_BAD_SHAPE] Edit request requires a non-empty \"path\" string.');\n\t}\n\tif (!Array.isArray(record.changes) || record.changes.length === 0) {\n\t\tthrow new Error('[E_BAD_SHAPE] Edit request requires a non-empty \"changes\" array.');\n\t}\n}\ninterface EditSourceSnapshot {\n\tbom: string;\n\toriginalEnding: LineEnding;\n\toriginalContent: string;\n\toriginalHashes: string[];\n\tstoreKey: string;\n}\n\ninterface AppliedEditResultOptions {\n\tpath: string;\n\teditCount: number;\n\tanchorResult: ApplyEditsResult;\n\twarnings: string[];\n\toriginalContent: string;\n\tresultContent: string;\n\toriginalHashes: string[];\n\tresultHashes: string[];\n}\n\nasync function readEditSource(\n\tpath: string,\n\tabsolutePath: string,\n\toperations: ToolOperations,\n): Promise<EditSourceSnapshot> {\n\ttry {\n\t\tawait operations.access(absolutePath, \"readwrite\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error && \"code\" in error ? `Error code: ${String(error.code)}` : String(error);\n\t\tthrow new Error(`Could not edit file: ${path}. ${message}.`);\n\t}\n\tconst rawContent = (await operations.readFile(absolutePath)).toString(\"utf-8\");\n\tconst { bom, text } = stripBOM(rawContent);\n\tconst originalContent = toLF(text);\n\tconst storeKey = hashStoreKey(operations, absolutePath);\n\treturn {\n\t\tbom,\n\t\toriginalEnding: detectEnding(text),\n\t\toriginalContent,\n\t\toriginalHashes: await lineHashes(originalContent, storeKey),\n\t\tstoreKey,\n\t};\n}\n\nfunction collectRemovedHashes(edits: HEdit[], originalHashes: string[]): Set<string> {\n\tconst hashIndexes = new Map<string, number>();\n\tfor (let index = 0; index < originalHashes.length; index++) {\n\t\tconst hash = originalHashes[index];\n\t\tif (hash !== undefined && !hashIndexes.has(hash)) hashIndexes.set(hash, index);\n\t}\n\tconst removedHashes = new Set<string>();\n\tfor (const edit of edits) {\n\t\tconst startLine = hashIndexes.get(edit.hash_range_inclusive[0].hash) ?? -1;\n\t\tconst endLine = hashIndexes.get(edit.hash_range_inclusive[1].hash) ?? -1;\n\t\tif (startLine < 0 || endLine < 0) continue;\n\t\tfor (let index = startLine; index <= endLine; index++) {\n\t\t\tconst hash = originalHashes[index];\n\t\t\tif (hash) removedHashes.add(hash);\n\t\t}\n\t}\n\treturn removedHashes;\n}\n\nfunction indexLineOccurrences(lines: string[]): Map<string, number[]> {\n\tconst indexesByLine = new Map<string, number[]>();\n\tfor (let index = 0; index < lines.length; index++) {\n\t\tconst line = lines[index];\n\t\tconst indexes = indexesByLine.get(line);\n\t\tif (indexes) indexes.push(index);\n\t\telse indexesByLine.set(line, [index]);\n\t}\n\treturn indexesByLine;\n}\n\nfunction collectEditWarnings(anchorResult: ApplyEditsResult, resultContent: string, resultHashes: string[]): string[] {\n\tconst warnings = [...(anchorResult.warnings ?? [])];\n\tconst resultLines = resultContent.split(\"\\n\");\n\tconst indexesByLine = indexLineOccurrences(resultLines);\n\tfor (const warning of anchorResult.boundaryWarnings ?? []) {\n\t\tconst matchIndex = indexesByLine.get(warning.survivingLineContent)?.[warning.occurrence] ?? -1;\n\t\tif (matchIndex < 0) continue;\n\t\twarnings.push(\n\t\t\tfmtBoundaryWarning({\n\t\t\t\tkind: warning.kind,\n\t\t\t\tsurvivingContent: warning.survivingLineContent,\n\t\t\t\tmatchIndex,\n\t\t\t\tresultLines,\n\t\t\t\tresultHashes,\n\t\t\t}),\n\t\t);\n\t}\n\treturn warnings;\n}\n\nfunction buildNoopEditResult(\n\tpath: string,\n\teditCount: number,\n\tanchorResult: ApplyEditsResult,\n\twarnings: string[],\n): AgentToolResult<EditToolDetails> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: `No changes made to ${path}. The edits produced identical content.` }],\n\t\tdetails: {\n\t\t\tdiff: \"\",\n\t\t\tpatch: \"\",\n\t\t\tclassification: \"noop\",\n\t\t\tmetrics: {\n\t\t\t\tedits_attempted: editCount,\n\t\t\t\tedits_noop: anchorResult.noopEdits?.length ?? 0,\n\t\t\t\twarnings: warnings.length,\n\t\t\t\tclassification: \"noop\",\n\t\t\t},\n\t\t},\n\t};\n}\n\nfunction buildAppliedEditResult(options: AppliedEditResultOptions): AgentToolResult<EditToolDetails> {\n\tconst diffResult = genDiff(\n\t\toptions.originalContent,\n\t\toptions.resultContent,\n\t\t2,\n\t\toptions.resultHashes,\n\t\toptions.originalHashes,\n\t);\n\tconst warningBlock = options.warnings.length > 0 ? `\\n\\nWarnings:\\n${options.warnings.join(\"\\n\")}` : \"\";\n\tconst changedLines =\n\t\toptions.anchorResult.firstChangedLine !== undefined && options.anchorResult.lastChangedLine !== undefined\n\t\t\t? {\n\t\t\t\t\tfirst: options.anchorResult.firstChangedLine,\n\t\t\t\t\tlast: options.anchorResult.lastChangedLine,\n\t\t\t\t}\n\t\t\t: undefined;\n\treturn {\n\t\tcontent: [{ type: \"text\", text: `Successfully replaced in ${options.path}.${warningBlock}` }],\n\t\tdetails: {\n\t\t\tdiff: diffResult.diff,\n\t\t\tpatch: createTwoFilesPatch(options.path, options.path, options.originalContent, options.resultContent),\n\t\t\tfirstChangedLine: options.anchorResult.firstChangedLine ?? diffResult.firstChangedLine,\n\t\t\tmetrics: {\n\t\t\t\tedits_attempted: options.editCount,\n\t\t\t\tedits_noop: options.anchorResult.noopEdits?.length ?? 0,\n\t\t\t\twarnings: options.warnings.length,\n\t\t\t\tclassification: \"applied\",\n\t\t\t\t...(changedLines ? { changed_lines: changedLines } : {}),\n\t\t\t\tadded_lines: countDiffLines(diffResult.diff, \"+\"),\n\t\t\t\tremoved_lines: countDiffLines(diffResult.diff, \"-\"),\n\t\t\t},\n\t\t},\n\t};\n}\n\nasync function executeEditMutation(\n\trequest: ReqParams,\n\tabsolutePath: string,\n\toperations: ToolOperations,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<EditToolDetails>> {\n\tabortIf(signal);\n\tawait initHasher();\n\tconst source = await readEditSource(request.path, absolutePath, operations);\n\tconst resolvedEdits = resEdits(request.changes);\n\tconst anchorResult = applyEdits(source.originalContent, resolvedEdits, signal, source.originalHashes, request.path);\n\tconst resultContent = anchorResult.content;\n\tconst resultHashes = await lineHashes(resultContent, source.storeKey, {\n\t\tcontent: source.originalContent,\n\t\thashes: source.originalHashes,\n\t\tremovedHashes: collectRemovedHashes(resolvedEdits, source.originalHashes),\n\t});\n\tconst warnings = collectEditWarnings(anchorResult, resultContent, resultHashes);\n\tif (source.originalContent === resultContent) {\n\t\treturn buildNoopEditResult(request.path, request.changes.length, anchorResult, warnings);\n\t}\n\tabortIf(signal);\n\tawait operations.writeFile(absolutePath, source.bom + restoreEndings(resultContent, source.originalEnding));\n\treturn buildAppliedEditResult({\n\t\tpath: request.path,\n\t\teditCount: request.changes.length,\n\t\tanchorResult,\n\t\twarnings,\n\t\toriginalContent: source.originalContent,\n\t\tresultContent,\n\t\toriginalHashes: source.originalHashes,\n\t\tresultHashes,\n\t});\n}\n\nexport type EditToolDefinition = ToolDefinition<typeof editSchema, EditToolDetails | undefined, EditRenderState>;\n\nexport function createEditToolDefinition(operations: ToolOperations, _options?: EditToolOptions): EditToolDefinition {\n\treturn {\n\t\tname: \"edit\",\n\t\tlabel: \"edit\",\n\t\tdescription:\n\t\t\t\"Edit a file using hash-anchored line replacements. Call read first; it returns HASH│content lines. Use hash_range_inclusive with the 3-character start/end hashes and content_lines with literal replacement lines only.\",\n\t\tpromptSnippet: \"Edit files using hashline anchors from read output\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use read before edit to get HASH│content anchors.\",\n\t\t\t\"Use edit with changes: [{ hash_range_inclusive: [startHash, endHash], content_lines: [...] }].\",\n\t\t\t\"hash_range_inclusive contains only the 3-character hashes, not line numbers and not HASH│content.\",\n\t\t\t\"content_lines contains literal file content only; do not include HASH│ prefixes. Use [] to delete a range.\",\n\t\t\t\"After a successful edit, call read again before follow-up edits unless the response includes current warning anchors.\",\n\t\t],\n\t\tparameters: editSchema,\n\t\trenderShell: \"default\",\n\t\tprepareArguments: normalizeEditArguments,\n\t\tasync execute(_toolCallId, input: EditToolInput, signal?: AbortSignal) {\n\t\t\tconst normalized = normReq(input);\n\t\t\tassertReq(normalized);\n\t\t\tconst absolutePath = resolveToCwd(normalized.path, operations.cwd);\n\t\t\treturn withFileMutationQueue(absolutePath, () =>\n\t\t\t\texecuteEditMutation(normalized, absolutePath, operations, signal),\n\t\t\t);\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\tconst previewInput = getPreviewInput(args);\n\t\t\tif (!context.executionStarted && context.argsComplete && previewInput) {\n\t\t\t\tconst argsKey = JSON.stringify(previewInput);\n\t\t\t\tif (context.state.argsKey !== argsKey) {\n\t\t\t\t\tcontext.state.argsKey = argsKey;\n\t\t\t\t\tcontext.state.preview = undefined;\n\t\t\t\t\tconst generation = (context.state.previewGeneration ?? 0) + 1;\n\t\t\t\t\tcontext.state.previewGeneration = generation;\n\t\t\t\t\tvoid computePreview(previewInput, operations).then((preview) => {\n\t\t\t\t\t\tif (context.state.argsKey === argsKey && context.state.previewGeneration === generation) {\n\t\t\t\t\t\t\tcontext.state.preview = preview;\n\t\t\t\t\t\t\tcontext.invalidate();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\ttext.setText(\n\t\t\t\t\tformatBackendIcon(operations.getBackendInfo?.(), theme) +\n\t\t\t\t\t\tfmtCall(previewInput, context.state, context.expanded, theme).replace(\"replace\", \"edit\"),\n\t\t\t\t);\n\t\t\t\treturn text;\n\t\t\t}\n\t\t\ttext.setText(formatEditCall(args as RenderableEditArgs | undefined, theme, operations.getBackendInfo?.()));\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\tif (context.isError) {\n\t\t\t\tconst errorText = result.content\n\t\t\t\t\t?.filter((entry) => entry.type === \"text\")\n\t\t\t\t\t.map((entry) => entry.text ?? \"\")\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\ttext.setText(errorText ? `\\n${theme.fg(\"error\", errorText)}` : \"\");\n\t\t\t\treturn text;\n\t\t\t}\n\t\t\tconst diff = result.details?.diff;\n\t\t\tif (!diff) {\n\t\t\t\ttext.setText(\"\");\n\t\t\t\treturn text;\n\t\t\t}\n\t\t\tconst lines = diff.split(\"\\n\").map((line) => {\n\t\t\t\tif (line.startsWith(\"+\") && !line.startsWith(\"+++\")) return theme.fg(\"success\", line);\n\t\t\t\tif (line.startsWith(\"-\") && !line.startsWith(\"---\")) return theme.fg(\"error\", line);\n\t\t\t\treturn theme.fg(\"dim\", line);\n\t\t\t});\n\t\t\ttext.setText(`\\n${lines.join(\"\\n\")}`);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\ntype CompatibleEditAgentTool = AgentTool<typeof editSchema, EditToolDetails> & {\n\texecute: (\n\t\ttoolCallId: string,\n\t\tparams: Record<string, unknown>,\n\t\tsignal?: AbortSignal,\n\t\tonUpdate?: AgentToolUpdateCallback<EditToolDetails>,\n\t) => Promise<AgentToolResult<EditToolDetails>>;\n};\n\nexport function createEditTool(operations: ToolOperations, options?: EditToolOptions): CompatibleEditAgentTool {\n\treturn wrapToolDefinition(createEditToolDefinition(operations, options)) as CompatibleEditAgentTool;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Serialize file mutation operations targeting the same file.
3
+ * Operations for different files still run in parallel.
4
+ */
5
+ export declare function withFileMutationQueue<T>(filePath: string, fn: () => Promise<T>): Promise<T>;
6
+ //# sourceMappingURL=file-mutation-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-mutation-queue.d.ts","sourceRoot":"","sources":["../../../src/core/tools/file-mutation-queue.ts"],"names":[],"mappings":"AAkCA;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA6BjG","sourcesContent":["import { realpath } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n\nconst fileMutationQueues = new Map<string, Promise<void>>();\nlet registrationQueue = Promise.resolve();\n\nfunction isMissingPathError(error: unknown): boolean {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n\t);\n}\n\nasync function getMutationQueueKey(filePath: string): Promise<string> {\n\tconst resolvedPath = resolve(filePath);\n\tconst missingSegments: string[] = [];\n\tlet existingAncestor = resolvedPath;\n\n\twhile (true) {\n\t\ttry {\n\t\t\tconst canonicalAncestor = await realpath(existingAncestor);\n\t\t\treturn missingSegments.length > 0 ? join(canonicalAncestor, ...missingSegments) : canonicalAncestor;\n\t\t} catch (error) {\n\t\t\tif (!isMissingPathError(error)) throw error;\n\t\t\tconst parent = dirname(existingAncestor);\n\t\t\tif (parent === existingAncestor) return resolvedPath;\n\t\t\tmissingSegments.unshift(basename(existingAncestor));\n\t\t\texistingAncestor = parent;\n\t\t}\n\t}\n}\n\n/**\n * Serialize file mutation operations targeting the same file.\n * Operations for different files still run in parallel.\n */\nexport async function withFileMutationQueue<T>(filePath: string, fn: () => Promise<T>): Promise<T> {\n\tconst registration = registrationQueue.then(async () => {\n\t\tconst key = await getMutationQueueKey(filePath);\n\t\tconst currentQueue = fileMutationQueues.get(key) ?? Promise.resolve();\n\n\t\tlet releaseNext!: () => void;\n\t\tconst nextQueue = new Promise<void>((resolveQueue) => {\n\t\t\treleaseNext = resolveQueue;\n\t\t});\n\t\tconst chainedQueue = currentQueue.then(() => nextQueue);\n\t\tfileMutationQueues.set(key, chainedQueue);\n\n\t\treturn { key, currentQueue, chainedQueue, releaseNext };\n\t});\n\tregistrationQueue = registration.then(\n\t\t() => undefined,\n\t\t() => undefined,\n\t);\n\n\tconst { key, currentQueue, chainedQueue, releaseNext } = await registration;\n\tawait currentQueue;\n\ttry {\n\t\treturn await fn();\n\t} finally {\n\t\treleaseNext();\n\t\tif (fileMutationQueues.get(key) === chainedQueue) {\n\t\t\tfileMutationQueues.delete(key);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,60 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { basename, dirname, join, resolve } from "node:path";
3
+ const fileMutationQueues = new Map();
4
+ let registrationQueue = Promise.resolve();
5
+ function isMissingPathError(error) {
6
+ return (typeof error === "object" &&
7
+ error !== null &&
8
+ "code" in error &&
9
+ (error.code === "ENOENT" || error.code === "ENOTDIR"));
10
+ }
11
+ async function getMutationQueueKey(filePath) {
12
+ const resolvedPath = resolve(filePath);
13
+ const missingSegments = [];
14
+ let existingAncestor = resolvedPath;
15
+ while (true) {
16
+ try {
17
+ const canonicalAncestor = await realpath(existingAncestor);
18
+ return missingSegments.length > 0 ? join(canonicalAncestor, ...missingSegments) : canonicalAncestor;
19
+ }
20
+ catch (error) {
21
+ if (!isMissingPathError(error))
22
+ throw error;
23
+ const parent = dirname(existingAncestor);
24
+ if (parent === existingAncestor)
25
+ return resolvedPath;
26
+ missingSegments.unshift(basename(existingAncestor));
27
+ existingAncestor = parent;
28
+ }
29
+ }
30
+ }
31
+ /**
32
+ * Serialize file mutation operations targeting the same file.
33
+ * Operations for different files still run in parallel.
34
+ */
35
+ export async function withFileMutationQueue(filePath, fn) {
36
+ const registration = registrationQueue.then(async () => {
37
+ const key = await getMutationQueueKey(filePath);
38
+ const currentQueue = fileMutationQueues.get(key) ?? Promise.resolve();
39
+ let releaseNext;
40
+ const nextQueue = new Promise((resolveQueue) => {
41
+ releaseNext = resolveQueue;
42
+ });
43
+ const chainedQueue = currentQueue.then(() => nextQueue);
44
+ fileMutationQueues.set(key, chainedQueue);
45
+ return { key, currentQueue, chainedQueue, releaseNext };
46
+ });
47
+ registrationQueue = registration.then(() => undefined, () => undefined);
48
+ const { key, currentQueue, chainedQueue, releaseNext } = await registration;
49
+ await currentQueue;
50
+ try {
51
+ return await fn();
52
+ }
53
+ finally {
54
+ releaseNext();
55
+ if (fileMutationQueues.get(key) === chainedQueue) {
56
+ fileMutationQueues.delete(key);
57
+ }
58
+ }
59
+ }
60
+ //# sourceMappingURL=file-mutation-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-mutation-queue.js","sourceRoot":"","sources":["../../../src/core/tools/file-mutation-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { realpath } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n\nconst fileMutationQueues = new Map<string, Promise<void>>();\nlet registrationQueue = Promise.resolve();\n\nfunction isMissingPathError(error: unknown): boolean {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n\t);\n}\n\nasync function getMutationQueueKey(filePath: string): Promise<string> {\n\tconst resolvedPath = resolve(filePath);\n\tconst missingSegments: string[] = [];\n\tlet existingAncestor = resolvedPath;\n\n\twhile (true) {\n\t\ttry {\n\t\t\tconst canonicalAncestor = await realpath(existingAncestor);\n\t\t\treturn missingSegments.length > 0 ? join(canonicalAncestor, ...missingSegments) : canonicalAncestor;\n\t\t} catch (error) {\n\t\t\tif (!isMissingPathError(error)) throw error;\n\t\t\tconst parent = dirname(existingAncestor);\n\t\t\tif (parent === existingAncestor) return resolvedPath;\n\t\t\tmissingSegments.unshift(basename(existingAncestor));\n\t\t\texistingAncestor = parent;\n\t\t}\n\t}\n}\n\n/**\n * Serialize file mutation operations targeting the same file.\n * Operations for different files still run in parallel.\n */\nexport async function withFileMutationQueue<T>(filePath: string, fn: () => Promise<T>): Promise<T> {\n\tconst registration = registrationQueue.then(async () => {\n\t\tconst key = await getMutationQueueKey(filePath);\n\t\tconst currentQueue = fileMutationQueues.get(key) ?? Promise.resolve();\n\n\t\tlet releaseNext!: () => void;\n\t\tconst nextQueue = new Promise<void>((resolveQueue) => {\n\t\t\treleaseNext = resolveQueue;\n\t\t});\n\t\tconst chainedQueue = currentQueue.then(() => nextQueue);\n\t\tfileMutationQueues.set(key, chainedQueue);\n\n\t\treturn { key, currentQueue, chainedQueue, releaseNext };\n\t});\n\tregistrationQueue = registration.then(\n\t\t() => undefined,\n\t\t() => undefined,\n\t);\n\n\tconst { key, currentQueue, chainedQueue, releaseNext } = await registration;\n\tawait currentQueue;\n\ttry {\n\t\treturn await fn();\n\t} finally {\n\t\treleaseNext();\n\t\tif (fileMutationQueues.get(key) === chainedQueue) {\n\t\t\tfileMutationQueues.delete(key);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import type { AgentTool } from "@greppleai/grip-agent-core";
2
+ import { type Static, Type } from "typebox";
3
+ import type { ToolDefinition } from "../extensions/types.ts";
4
+ import type { ToolOperations } from "./operations.ts";
5
+ import { type TruncationResult } from "./truncate.ts";
6
+ declare const findSchema: Type.TObject<{
7
+ pattern: Type.TString;
8
+ path: Type.TOptional<Type.TString>;
9
+ limit: Type.TOptional<Type.TNumber>;
10
+ }>;
11
+ export type FindToolInput = Static<typeof findSchema>;
12
+ export interface FindToolDetails {
13
+ truncation?: TruncationResult;
14
+ resultLimitReached?: number;
15
+ }
16
+ export interface FindToolOptions {
17
+ }
18
+ export type FindToolDefinition = ToolDefinition<typeof findSchema, FindToolDetails | undefined>;
19
+ export declare function createFindToolDefinition(operations: ToolOperations, _options?: FindToolOptions): FindToolDefinition;
20
+ export declare function createFindTool(operations: ToolOperations, options?: FindToolOptions): AgentTool<typeof findSchema>;
21
+ export {};
22
+ //# sourceMappingURL=find.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../src/core/tools/find.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,4BAA4B,CAAC;AAI7E,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAItD,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAMnG,QAAA,MAAM,UAAU;;;;EAMd,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAItD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;CAAG;AAwPnC,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CAAC;AAEhG,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,kBAAkB,CAoCnH;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAElH","sourcesContent":["import { createInterface } from \"node:readline\";\nimport type { AgentTool, AgentToolResult } from \"@greppleai/grip-agent-core\";\nimport { Text } from \"@greppleai/grip-tui\";\nimport { spawn } from \"child_process\";\nimport path from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { ensureTool } from \"../../utils/tools-manager.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { formatBackendIcon, getTextOutput, invalidArgText, shortenPath, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nfunction toPosixPath(value: string): string {\n\treturn value.split(path.sep).join(\"/\");\n}\n\nconst findSchema = Type.Object({\n\tpattern: Type.String({\n\t\tdescription: \"Glob pattern to match files, e.g. '*.ts', '**/*.json', or 'src/**/*.spec.ts'\",\n\t}),\n\tpath: Type.Optional(Type.String({ description: \"Directory to search in (default: current directory)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of results (default: 1000)\" })),\n});\n\nexport type FindToolInput = Static<typeof findSchema>;\n\nconst DEFAULT_LIMIT = 1000;\n\nexport interface FindToolDetails {\n\ttruncation?: TruncationResult;\n\tresultLimitReached?: number;\n}\n\nexport interface FindToolOptions {}\n\nfunction formatFindCall(args: FindToolInput | undefined, theme: Theme): string {\n\tconst pattern = str(args?.pattern);\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 =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"find\")) +\n\t\t\" \" +\n\t\t(pattern === null ? invalidArg : theme.fg(\"accent\", pattern || \"\")) +\n\t\ttheme.fg(\"toolOutput\", ` in ${path === null ? invalidArg : path}`);\n\tif (limit !== undefined) {\n\t\ttext += theme.fg(\"toolOutput\", ` (limit ${limit})`);\n\t}\n\treturn text;\n}\n\nfunction formatFindResult(\n\tresult: AgentToolResult<FindToolDetails | 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 += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t}\n\t}\n\n\tconst resultLimit = result.details?.resultLimitReached;\n\tconst truncation = result.details?.truncation;\n\tif (resultLimit || truncation?.truncated) {\n\t\tconst warnings: string[] = [];\n\t\tif (resultLimit) warnings.push(`${resultLimit} results 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}\n\ntype FindExecutionResult = AgentToolResult<FindToolDetails | undefined>;\n\ninterface FindExecutionRequest {\n\toperations: ToolOperations;\n\tcwd: string;\n\tpattern: string;\n\tsearchDir: string | undefined;\n\tlimit: number | undefined;\n\tsignal: AbortSignal | undefined;\n}\n\ntype RegisterFindChildStop = (stop: () => void) => void;\n\nfunction throwIfFindAborted(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n}\n\nfunction noFindResults(): FindExecutionResult {\n\treturn { content: [{ type: \"text\", text: \"No files found matching pattern\" }], details: undefined };\n}\n\nfunction formatFindMatches(paths: string[], limit: number, includeRefineHint: boolean): FindExecutionResult {\n\tconst resultLimitReached = paths.length >= limit;\n\tconst truncation = truncateHead(paths.join(\"\\n\"), { maxLines: Number.MAX_SAFE_INTEGER });\n\tlet output = truncation.content;\n\tconst details: FindToolDetails = {};\n\tconst notices: string[] = [];\n\tif (resultLimitReached) {\n\t\tnotices.push(\n\t\t\tincludeRefineHint\n\t\t\t\t? `${limit} results limit reached. Use limit=${limit * 2} for more, or refine pattern`\n\t\t\t\t: `${limit} results limit reached`,\n\t\t);\n\t\tdetails.resultLimitReached = 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\nfunction relativizeGlobMatches(paths: string[], searchPath: string): string[] {\n\treturn paths.map((matchedPath) => {\n\t\tif (matchedPath.startsWith(searchPath)) return toPosixPath(matchedPath.slice(searchPath.length + 1));\n\t\treturn toPosixPath(path.relative(searchPath, matchedPath));\n\t});\n}\n\nasync function executeOperationsFind(\n\trequest: FindExecutionRequest,\n\tsearchPath: string,\n\teffectiveLimit: number,\n): Promise<FindExecutionResult> {\n\ttry {\n\t\tawait request.operations.access(searchPath, \"exists\");\n\t} catch {\n\t\tthrow new Error(`Path not found: ${searchPath}`);\n\t}\n\tthrowIfFindAborted(request.signal);\n\tif (!request.operations.glob) throw new Error(\"Glob operation is unavailable\");\n\tconst results = await request.operations.glob(request.pattern, searchPath, {\n\t\tignore: [\"**/node_modules/**\", \"**/.git/**\"],\n\t\tlimit: effectiveLimit,\n\t});\n\tthrowIfFindAborted(request.signal);\n\tif (results.length === 0) return noFindResults();\n\treturn formatFindMatches(relativizeGlobMatches(results, searchPath), effectiveLimit, false);\n}\n\nfunction buildFdArguments(pattern: string, searchPath: string, limit: number): string[] {\n\tconst args = [\"--glob\", \"--color=never\", \"--hidden\", \"--no-require-git\", \"--max-results\", String(limit)];\n\tlet effectivePattern = pattern;\n\tif (pattern.includes(\"/\")) {\n\t\targs.push(\"--full-path\");\n\t\tif (!pattern.startsWith(\"/\") && !pattern.startsWith(\"**/\") && pattern !== \"**\") {\n\t\t\teffectivePattern = `**/${pattern}`;\n\t\t}\n\t}\n\targs.push(\"--\", effectivePattern, searchPath);\n\treturn args;\n}\n\nfunction relativizeFdMatches(lines: string[], searchPath: string): string[] {\n\tconst relativized: string[] = [];\n\tfor (const rawLine of lines) {\n\t\tconst line = rawLine.replace(/\\r$/, \"\").trim();\n\t\tif (!line) continue;\n\t\tconst hadTrailingSlash = line.endsWith(\"/\") || line.endsWith(\"\\\\\");\n\t\tlet relativePath = line;\n\t\tif (line.startsWith(searchPath)) {\n\t\t\trelativePath = line.slice(searchPath.length + 1);\n\t\t} else {\n\t\t\trelativePath = path.relative(searchPath, line);\n\t\t}\n\t\tif (hadTrailingSlash && !relativePath.endsWith(\"/\")) relativePath += \"/\";\n\t\trelativized.push(toPosixPath(relativePath));\n\t}\n\treturn relativized;\n}\n\nfunction executeFdFind(\n\tfdPath: string,\n\trequest: FindExecutionRequest,\n\tsearchPath: string,\n\teffectiveLimit: number,\n\tregisterStop: RegisterFindChildStop,\n): Promise<FindExecutionResult> {\n\treturn new Promise((resolveFind, rejectFind) => {\n\t\tconst child = spawn(fdPath, buildFdArguments(request.pattern, searchPath, effectiveLimit), {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\t\tconst rl = createInterface({ input: child.stdout });\n\t\tlet stderr = \"\";\n\t\tconst lines: string[] = [];\n\t\tregisterStop(() => {\n\t\t\tif (!child.killed) child.kill();\n\t\t});\n\t\tconst cleanup = (): void => rl.close();\n\t\tchild.stderr?.on(\"data\", (chunk) => {\n\t\t\tstderr += chunk.toString();\n\t\t});\n\t\trl.on(\"line\", (line) => lines.push(line));\n\t\tchild.on(\"error\", (error) => {\n\t\t\tcleanup();\n\t\t\trejectFind(new Error(`Failed to run fd: ${error.message}`));\n\t\t});\n\t\tchild.on(\"close\", (code) => {\n\t\t\tcleanup();\n\t\t\tif (request.signal?.aborted) {\n\t\t\t\trejectFind(new Error(\"Operation aborted\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst output = lines.join(\"\\n\");\n\t\t\tif (code !== 0 && !output) {\n\t\t\t\trejectFind(new Error(stderr.trim() || `fd exited with code ${code}`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!output) {\n\t\t\t\tresolveFind(noFindResults());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolveFind(formatFindMatches(relativizeFdMatches(lines, searchPath), effectiveLimit, true));\n\t\t});\n\t});\n}\n\nasync function dispatchFindExecution(\n\trequest: FindExecutionRequest,\n\tregisterStop: RegisterFindChildStop,\n): Promise<FindExecutionResult> {\n\tconst searchPath = resolveToCwd(request.searchDir || \".\", request.cwd);\n\tconst effectiveLimit = request.limit ?? DEFAULT_LIMIT;\n\tif (request.operations.glob) return executeOperationsFind(request, searchPath, effectiveLimit);\n\tconst fdPath = await ensureTool(\"fd\", true);\n\tthrowIfFindAborted(request.signal);\n\tif (!fdPath) throw new Error(\"fd is not available and could not be downloaded\");\n\treturn executeFdFind(fdPath, request, searchPath, effectiveLimit, registerStop);\n}\n\nfunction executeFind(request: FindExecutionRequest): Promise<FindExecutionResult> {\n\treturn new Promise((resolveFind, rejectFind) => {\n\t\tif (request.signal?.aborted) {\n\t\t\trejectFind(new Error(\"Operation aborted\"));\n\t\t\treturn;\n\t\t}\n\t\tlet settled = false;\n\t\tlet stopChild: (() => void) | undefined;\n\t\tconst settle = (complete: () => void): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\trequest.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tstopChild = undefined;\n\t\t\tcomplete();\n\t\t};\n\t\tconst onAbort = (): void => {\n\t\t\tstopChild?.();\n\t\t\tsettle(() => rejectFind(new Error(\"Operation aborted\")));\n\t\t};\n\t\trequest.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid dispatchFindExecution(request, (stop) => {\n\t\t\tstopChild = stop;\n\t\t}).then(\n\t\t\t(result) => settle(() => resolveFind(result)),\n\t\t\t(error: unknown) => {\n\t\t\t\tif (request.signal?.aborted) {\n\t\t\t\t\tsettle(() => rejectFind(new Error(\"Operation aborted\")));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsettle(() => rejectFind(error instanceof Error ? error : new Error(String(error))));\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport type FindToolDefinition = ToolDefinition<typeof findSchema, FindToolDetails | undefined>;\n\nexport function createFindToolDefinition(operations: ToolOperations, _options?: FindToolOptions): FindToolDefinition {\n\tconst ops = operations;\n\tconst cwd = operations.cwd;\n\treturn {\n\t\tname: \"find\",\n\t\tlabel: \"find\",\n\t\tdescription: `Search for files by glob pattern. Returns matching file paths relative to the search directory. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT} results or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,\n\t\tpromptSnippet: \"Find files by glob pattern (respects .gitignore)\",\n\t\tparameters: findSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ pattern, path: searchDir, limit }: FindToolInput,\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t) {\n\t\t\treturn executeFind({\n\t\t\t\toperations: ops,\n\t\t\t\tcwd,\n\t\t\t\tpattern,\n\t\t\t\tsearchDir,\n\t\t\t\tlimit,\n\t\t\t\tsignal,\n\t\t\t});\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) + formatFindCall(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(formatFindResult(result as any, options, theme, context.showImages));\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createFindTool(operations: ToolOperations, options?: FindToolOptions): AgentTool<typeof findSchema> {\n\treturn wrapToolDefinition(createFindToolDefinition(operations, options));\n}\n"]}