@greppleai/grip 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +1 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/bun/embedded-assets.d.ts.map +1 -1
  6. package/dist/bun/embedded-assets.js.map +1 -1
  7. package/dist/bun/register-bedrock.d.ts.map +1 -1
  8. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  9. package/dist/bun/restore-sandbox-env.js.map +1 -1
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/config-selector.d.ts.map +1 -1
  13. package/dist/cli/config-selector.js.map +1 -1
  14. package/dist/cli/file-processor.d.ts.map +1 -1
  15. package/dist/cli/file-processor.js.map +1 -1
  16. package/dist/cli/initial-message.d.ts +1 -1
  17. package/dist/cli/initial-message.d.ts.map +1 -1
  18. package/dist/cli/initial-message.js.map +1 -1
  19. package/dist/cli/list-models.d.ts.map +1 -1
  20. package/dist/cli/list-models.js.map +1 -1
  21. package/dist/cli/session-picker.d.ts.map +1 -1
  22. package/dist/cli/session-picker.js.map +1 -1
  23. package/dist/cli.d.ts.map +1 -1
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +2 -0
  27. package/dist/config.js.map +1 -1
  28. package/dist/core/agent-session.d.ts +38 -1
  29. package/dist/core/agent-session.d.ts.map +1 -1
  30. package/dist/core/agent-session.js +289 -154
  31. package/dist/core/agent-session.js.map +1 -1
  32. package/dist/core/auth-guidance.d.ts.map +1 -1
  33. package/dist/core/auth-guidance.js.map +1 -1
  34. package/dist/core/auth-storage.d.ts +4 -0
  35. package/dist/core/auth-storage.d.ts.map +1 -1
  36. package/dist/core/auth-storage.js +3 -10
  37. package/dist/core/auth-storage.js.map +1 -1
  38. package/dist/core/bash-executor.d.ts.map +1 -1
  39. package/dist/core/bash-executor.js +19 -23
  40. package/dist/core/bash-executor.js.map +1 -1
  41. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  42. package/dist/core/compaction/branch-summarization.js.map +1 -1
  43. package/dist/core/compaction/compaction.d.ts.map +1 -1
  44. package/dist/core/compaction/compaction.js +9 -2
  45. package/dist/core/compaction/compaction.js.map +1 -1
  46. package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -1
  47. package/dist/core/compaction/compression-detection-ledger.js.map +1 -1
  48. package/dist/core/compaction/compression-detector.d.ts +1 -0
  49. package/dist/core/compaction/compression-detector.d.ts.map +1 -1
  50. package/dist/core/compaction/compression-detector.js +10 -21
  51. package/dist/core/compaction/compression-detector.js.map +1 -1
  52. package/dist/core/compaction/compression-economics.d.ts.map +1 -1
  53. package/dist/core/compaction/compression-economics.js.map +1 -1
  54. package/dist/core/compaction/utils.d.ts.map +1 -1
  55. package/dist/core/compaction/utils.js.map +1 -1
  56. package/dist/core/defaults.d.ts.map +1 -1
  57. package/dist/core/diagnostics.d.ts.map +1 -1
  58. package/dist/core/event-bus.d.ts.map +1 -1
  59. package/dist/core/event-bus.js.map +1 -1
  60. package/dist/core/exec.d.ts.map +1 -1
  61. package/dist/core/exec.js.map +1 -1
  62. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  63. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  64. package/dist/core/export-html/index.d.ts.map +1 -1
  65. package/dist/core/export-html/index.js.map +1 -1
  66. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  67. package/dist/core/export-html/tool-renderer.js.map +1 -1
  68. package/dist/core/extensions/loader.d.ts.map +1 -1
  69. package/dist/core/extensions/loader.js.map +1 -1
  70. package/dist/core/extensions/runner.d.ts +3 -0
  71. package/dist/core/extensions/runner.d.ts.map +1 -1
  72. package/dist/core/extensions/runner.js +40 -30
  73. package/dist/core/extensions/runner.js.map +1 -1
  74. package/dist/core/extensions/types.d.ts +21 -1
  75. package/dist/core/extensions/types.d.ts.map +1 -1
  76. package/dist/core/extensions/types.js.map +1 -1
  77. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  78. package/dist/core/extensions/wrapper.js.map +1 -1
  79. package/dist/core/footer-data-provider.d.ts.map +1 -1
  80. package/dist/core/footer-data-provider.js +15 -16
  81. package/dist/core/footer-data-provider.js.map +1 -1
  82. package/dist/core/grip-agent.d.ts.map +1 -1
  83. package/dist/core/grip-agent.js +7 -21
  84. package/dist/core/grip-agent.js.map +1 -1
  85. package/dist/core/grip-manifest.d.ts.map +1 -1
  86. package/dist/core/grip-manifest.js.map +1 -1
  87. package/dist/core/hooks/aggregate.d.ts.map +1 -1
  88. package/dist/core/hooks/aggregate.js.map +1 -1
  89. package/dist/core/hooks/config.d.ts.map +1 -1
  90. package/dist/core/hooks/config.js.map +1 -1
  91. package/dist/core/hooks/executor.d.ts.map +1 -1
  92. package/dist/core/hooks/executor.js.map +1 -1
  93. package/dist/core/hooks/index.d.ts.map +1 -1
  94. package/dist/core/hooks/index.js.map +1 -1
  95. package/dist/core/hooks/matcher.d.ts.map +1 -1
  96. package/dist/core/hooks/matcher.js.map +1 -1
  97. package/dist/core/hooks/trust-store.d.ts.map +1 -1
  98. package/dist/core/hooks/trust-store.js +0 -3
  99. package/dist/core/hooks/trust-store.js.map +1 -1
  100. package/dist/core/hooks/types.d.ts.map +1 -1
  101. package/dist/core/hooks/types.js.map +1 -1
  102. package/dist/core/http-dispatcher.d.ts.map +1 -1
  103. package/dist/core/http-dispatcher.js.map +1 -1
  104. package/dist/core/instruction-resource-loader.d.ts +1 -0
  105. package/dist/core/instruction-resource-loader.d.ts.map +1 -1
  106. package/dist/core/instruction-resource-loader.js +2 -4
  107. package/dist/core/instruction-resource-loader.js.map +1 -1
  108. package/dist/core/keybindings.d.ts.map +1 -1
  109. package/dist/core/keybindings.js +0 -1
  110. package/dist/core/keybindings.js.map +1 -1
  111. package/dist/core/lsp/abort.d.ts.map +1 -1
  112. package/dist/core/lsp/abort.js.map +1 -1
  113. package/dist/core/lsp/client.d.ts.map +1 -1
  114. package/dist/core/lsp/client.js +8 -22
  115. package/dist/core/lsp/client.js.map +1 -1
  116. package/dist/core/lsp/config-loader.d.ts.map +1 -1
  117. package/dist/core/lsp/config-loader.js.map +1 -1
  118. package/dist/core/lsp/config.d.ts.map +1 -1
  119. package/dist/core/lsp/config.js.map +1 -1
  120. package/dist/core/lsp/diagnostics.d.ts.map +1 -1
  121. package/dist/core/lsp/diagnostics.js.map +1 -1
  122. package/dist/core/lsp/file-sync.d.ts.map +1 -1
  123. package/dist/core/lsp/file-sync.js +7 -9
  124. package/dist/core/lsp/file-sync.js.map +1 -1
  125. package/dist/core/lsp/integration.d.ts.map +1 -1
  126. package/dist/core/lsp/integration.js.map +1 -1
  127. package/dist/core/lsp/language-map.d.ts.map +1 -1
  128. package/dist/core/lsp/language-map.js +2 -7
  129. package/dist/core/lsp/language-map.js.map +1 -1
  130. package/dist/core/lsp/manager.d.ts.map +1 -1
  131. package/dist/core/lsp/manager.js +18 -29
  132. package/dist/core/lsp/manager.js.map +1 -1
  133. package/dist/core/lsp/navigation.d.ts.map +1 -1
  134. package/dist/core/lsp/navigation.js.map +1 -1
  135. package/dist/core/lsp/portable-path.d.ts.map +1 -1
  136. package/dist/core/lsp/portable-path.js.map +1 -1
  137. package/dist/core/lsp/refactor.d.ts.map +1 -1
  138. package/dist/core/lsp/refactor.js.map +1 -1
  139. package/dist/core/lsp/transport.d.ts.map +1 -1
  140. package/dist/core/lsp/transport.js.map +1 -1
  141. package/dist/core/messages.d.ts.map +1 -1
  142. package/dist/core/messages.js +30 -1
  143. package/dist/core/messages.js.map +1 -1
  144. package/dist/core/model-registry.d.ts.map +1 -1
  145. package/dist/core/model-registry.js +5 -7
  146. package/dist/core/model-registry.js.map +1 -1
  147. package/dist/core/model-resolver.d.ts.map +1 -1
  148. package/dist/core/model-resolver.js.map +1 -1
  149. package/dist/core/output-guard.d.ts.map +1 -1
  150. package/dist/core/output-guard.js.map +1 -1
  151. package/dist/core/package-manager.d.ts.map +1 -1
  152. package/dist/core/package-manager.js +0 -6
  153. package/dist/core/package-manager.js.map +1 -1
  154. package/dist/core/prompt-templates.d.ts.map +1 -1
  155. package/dist/core/prompt-templates.js.map +1 -1
  156. package/dist/core/provider-display-names.d.ts.map +1 -1
  157. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -1
  158. package/dist/core/remote-workspace-protocol/contract.js +4 -2
  159. package/dist/core/remote-workspace-protocol/contract.js.map +1 -1
  160. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -1
  161. package/dist/core/remote-workspace-protocol/guest-shared-client.js +1 -5
  162. package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -1
  163. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -1
  164. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +5 -10
  165. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -1
  166. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -1
  167. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +2 -9
  168. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -1
  169. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -1
  170. package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -1
  171. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -1
  172. package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -1
  173. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -1
  174. package/dist/core/remote-workspace-protocol/session.js +27 -65
  175. package/dist/core/remote-workspace-protocol/session.js.map +1 -1
  176. package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -1
  177. package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -1
  178. package/dist/core/resolve-config-value.d.ts.map +1 -1
  179. package/dist/core/resolve-config-value.js.map +1 -1
  180. package/dist/core/resource-loader.d.ts.map +1 -1
  181. package/dist/core/resource-loader.js +0 -48
  182. package/dist/core/resource-loader.js.map +1 -1
  183. package/dist/core/rules.d.ts.map +1 -1
  184. package/dist/core/rules.js.map +1 -1
  185. package/dist/core/sandbox/command.d.ts.map +1 -1
  186. package/dist/core/sandbox/command.js.map +1 -1
  187. package/dist/core/sandbox/config.d.ts.map +1 -1
  188. package/dist/core/sandbox/config.js.map +1 -1
  189. package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -1
  190. package/dist/core/sandbox/lima-guest-binary.js.map +1 -1
  191. package/dist/core/sandbox/lima.d.ts +2 -0
  192. package/dist/core/sandbox/lima.d.ts.map +1 -1
  193. package/dist/core/sandbox/lima.js +3 -9
  194. package/dist/core/sandbox/lima.js.map +1 -1
  195. package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -1
  196. package/dist/core/sandbox/shared-lima-roots.js.map +1 -1
  197. package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -1
  198. package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -1
  199. package/dist/core/session/constants.d.ts.map +1 -1
  200. package/dist/core/session/context-metadata.d.ts.map +1 -1
  201. package/dist/core/session/context-metadata.js.map +1 -1
  202. package/dist/core/session/context.d.ts.map +1 -1
  203. package/dist/core/session/context.js.map +1 -1
  204. package/dist/core/session/ids.d.ts.map +1 -1
  205. package/dist/core/session/ids.js.map +1 -1
  206. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -1
  207. package/dist/core/session/in-memory-session-manager.js +0 -1
  208. package/dist/core/session/in-memory-session-manager.js.map +1 -1
  209. package/dist/core/session/in-memory-session.d.ts.map +1 -1
  210. package/dist/core/session/in-memory-session.js.map +1 -1
  211. package/dist/core/session/jsonl-errors.d.ts.map +1 -1
  212. package/dist/core/session/jsonl-errors.js +0 -11
  213. package/dist/core/session/jsonl-errors.js.map +1 -1
  214. package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
  215. package/dist/core/session/jsonl-helpers.js.map +1 -1
  216. package/dist/core/session/local-session-manager.d.ts.map +1 -1
  217. package/dist/core/session/local-session-manager.js +4 -6
  218. package/dist/core/session/local-session-manager.js.map +1 -1
  219. package/dist/core/session/local-session.d.ts.map +1 -1
  220. package/dist/core/session/local-session.js.map +1 -1
  221. package/dist/core/session/migrations.d.ts.map +1 -1
  222. package/dist/core/session/migrations.js.map +1 -1
  223. package/dist/core/session/remote-session-client.d.ts.map +1 -1
  224. package/dist/core/session/remote-session-client.js +0 -6
  225. package/dist/core/session/remote-session-client.js.map +1 -1
  226. package/dist/core/session/remote-session-manager.d.ts.map +1 -1
  227. package/dist/core/session/remote-session-manager.js +0 -3
  228. package/dist/core/session/remote-session-manager.js.map +1 -1
  229. package/dist/core/session/remote-session.d.ts.map +1 -1
  230. package/dist/core/session/remote-session.js +0 -1
  231. package/dist/core/session/remote-session.js.map +1 -1
  232. package/dist/core/session/session-manager.d.ts.map +1 -1
  233. package/dist/core/session/session.d.ts.map +1 -1
  234. package/dist/core/session/session.js +1 -5
  235. package/dist/core/session/session.js.map +1 -1
  236. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -1
  237. package/dist/core/session/stores/in-memory-session-store.js +7 -6
  238. package/dist/core/session/stores/in-memory-session-store.js.map +1 -1
  239. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
  240. package/dist/core/session/stores/jsonl-session-store.js +6 -14
  241. package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
  242. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -1
  243. package/dist/core/session/stores/remote-session-store.js +3 -8
  244. package/dist/core/session/stores/remote-session-store.js.map +1 -1
  245. package/dist/core/session/stores/session-store.d.ts.map +1 -1
  246. package/dist/core/session/types.d.ts.map +1 -1
  247. package/dist/core/session/usage-ledger.d.ts.map +1 -1
  248. package/dist/core/session/usage-ledger.js.map +1 -1
  249. package/dist/core/session-cwd.d.ts.map +1 -1
  250. package/dist/core/session-cwd.js +0 -1
  251. package/dist/core/session-cwd.js.map +1 -1
  252. package/dist/core/settings-manager.d.ts.map +1 -1
  253. package/dist/core/settings-manager.js +9 -17
  254. package/dist/core/settings-manager.js.map +1 -1
  255. package/dist/core/skills.d.ts.map +1 -1
  256. package/dist/core/skills.js +3 -2
  257. package/dist/core/skills.js.map +1 -1
  258. package/dist/core/slash-commands.d.ts.map +1 -1
  259. package/dist/core/source-info.d.ts.map +1 -1
  260. package/dist/core/source-info.js.map +1 -1
  261. package/dist/core/system-prompt.d.ts +1 -1
  262. package/dist/core/system-prompt.d.ts.map +1 -1
  263. package/dist/core/system-prompt.js +3 -2
  264. package/dist/core/system-prompt.js.map +1 -1
  265. package/dist/core/telemetry.d.ts.map +1 -1
  266. package/dist/core/telemetry.js.map +1 -1
  267. package/dist/core/timings.d.ts.map +1 -1
  268. package/dist/core/timings.js.map +1 -1
  269. package/dist/core/tools/bash.d.ts +1 -0
  270. package/dist/core/tools/bash.d.ts.map +1 -1
  271. package/dist/core/tools/bash.js +34 -28
  272. package/dist/core/tools/bash.js.map +1 -1
  273. package/dist/core/tools/compress-context.d.ts.map +1 -1
  274. package/dist/core/tools/compress-context.js.map +1 -1
  275. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  276. package/dist/core/tools/edit-diff.js.map +1 -1
  277. package/dist/core/tools/edit.d.ts.map +1 -1
  278. package/dist/core/tools/edit.js.map +1 -1
  279. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  280. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  281. package/dist/core/tools/find.d.ts.map +1 -1
  282. package/dist/core/tools/find.js.map +1 -1
  283. package/dist/core/tools/grep.d.ts.map +1 -1
  284. package/dist/core/tools/grep.js.map +1 -1
  285. package/dist/core/tools/hash-store.d.ts.map +1 -1
  286. package/dist/core/tools/hash-store.js.map +1 -1
  287. package/dist/core/tools/hashline/apply.d.ts.map +1 -1
  288. package/dist/core/tools/hashline/apply.js.map +1 -1
  289. package/dist/core/tools/hashline/hash.d.ts.map +1 -1
  290. package/dist/core/tools/hashline/hash.js.map +1 -1
  291. package/dist/core/tools/hashline/parse.d.ts.map +1 -1
  292. package/dist/core/tools/hashline/parse.js.map +1 -1
  293. package/dist/core/tools/hashline/resolve.d.ts.map +1 -1
  294. package/dist/core/tools/hashline/resolve.js.map +1 -1
  295. package/dist/core/tools/hashline-utils.d.ts.map +1 -1
  296. package/dist/core/tools/hashline-utils.js.map +1 -1
  297. package/dist/core/tools/index.d.ts.map +1 -1
  298. package/dist/core/tools/index.js.map +1 -1
  299. package/dist/core/tools/ls.d.ts.map +1 -1
  300. package/dist/core/tools/ls.js.map +1 -1
  301. package/dist/core/tools/operations.d.ts +11 -0
  302. package/dist/core/tools/operations.d.ts.map +1 -1
  303. package/dist/core/tools/operations.js +54 -28
  304. package/dist/core/tools/operations.js.map +1 -1
  305. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  306. package/dist/core/tools/output-accumulator.js +12 -18
  307. package/dist/core/tools/output-accumulator.js.map +1 -1
  308. package/dist/core/tools/path-utils.d.ts.map +1 -1
  309. package/dist/core/tools/path-utils.js.map +1 -1
  310. package/dist/core/tools/read.d.ts.map +1 -1
  311. package/dist/core/tools/read.js.map +1 -1
  312. package/dist/core/tools/render-utils.d.ts.map +1 -1
  313. package/dist/core/tools/render-utils.js.map +1 -1
  314. package/dist/core/tools/replace-diff.d.ts.map +1 -1
  315. package/dist/core/tools/replace-diff.js.map +1 -1
  316. package/dist/core/tools/replace-normalize.d.ts.map +1 -1
  317. package/dist/core/tools/replace-normalize.js.map +1 -1
  318. package/dist/core/tools/replace-render.d.ts +1 -1
  319. package/dist/core/tools/replace-render.d.ts.map +1 -1
  320. package/dist/core/tools/replace-render.js.map +1 -1
  321. package/dist/core/tools/runtime.d.ts.map +1 -1
  322. package/dist/core/tools/runtime.js.map +1 -1
  323. package/dist/core/tools/session-history.d.ts.map +1 -1
  324. package/dist/core/tools/session-history.js.map +1 -1
  325. package/dist/core/tools/subagent-agents.d.ts.map +1 -1
  326. package/dist/core/tools/subagent-agents.js.map +1 -1
  327. package/dist/core/tools/subagent.d.ts.map +1 -1
  328. package/dist/core/tools/subagent.js.map +1 -1
  329. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  330. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  331. package/dist/core/tools/truncate.d.ts.map +1 -1
  332. package/dist/core/tools/truncate.js.map +1 -1
  333. package/dist/core/tools/websearch.d.ts.map +1 -1
  334. package/dist/core/tools/websearch.js.map +1 -1
  335. package/dist/core/tools/workspace-tool-host.d.ts +1 -0
  336. package/dist/core/tools/workspace-tool-host.d.ts.map +1 -1
  337. package/dist/core/tools/workspace-tool-host.js +36 -22
  338. package/dist/core/tools/workspace-tool-host.js.map +1 -1
  339. package/dist/core/tools/write.d.ts.map +1 -1
  340. package/dist/core/tools/write.js +0 -1
  341. package/dist/core/tools/write.js.map +1 -1
  342. package/dist/core/workspace-identity.d.ts.map +1 -1
  343. package/dist/daemon/activity-budget.d.ts.map +1 -1
  344. package/dist/daemon/activity-budget.js +2 -3
  345. package/dist/daemon/activity-budget.js.map +1 -1
  346. package/dist/daemon/command.d.ts.map +1 -1
  347. package/dist/daemon/command.js.map +1 -1
  348. package/dist/daemon/config.d.ts +2 -0
  349. package/dist/daemon/config.d.ts.map +1 -1
  350. package/dist/daemon/config.js +4 -0
  351. package/dist/daemon/config.js.map +1 -1
  352. package/dist/daemon/help.d.ts.map +1 -1
  353. package/dist/daemon/help.js +4 -3
  354. package/dist/daemon/help.js.map +1 -1
  355. package/dist/daemon/lsp-config.d.ts.map +1 -1
  356. package/dist/daemon/lsp-config.js.map +1 -1
  357. package/dist/daemon/outbound-budget.d.ts.map +1 -1
  358. package/dist/daemon/outbound-budget.js +2 -4
  359. package/dist/daemon/outbound-budget.js.map +1 -1
  360. package/dist/daemon/security.d.ts.map +1 -1
  361. package/dist/daemon/security.js.map +1 -1
  362. package/dist/daemon/server.d.ts.map +1 -1
  363. package/dist/daemon/server.js.map +1 -1
  364. package/dist/daemon/shared-connection.d.ts.map +1 -1
  365. package/dist/daemon/shared-connection.js +10 -15
  366. package/dist/daemon/shared-connection.js.map +1 -1
  367. package/dist/daemon/shared-revision.d.ts.map +1 -1
  368. package/dist/daemon/shared-revision.js +2 -1
  369. package/dist/daemon/shared-revision.js.map +1 -1
  370. package/dist/daemon/shared-roots.d.ts.map +1 -1
  371. package/dist/daemon/shared-roots.js +0 -1
  372. package/dist/daemon/shared-roots.js.map +1 -1
  373. package/dist/daemon/workspace-runtime.d.ts +2 -0
  374. package/dist/daemon/workspace-runtime.d.ts.map +1 -1
  375. package/dist/daemon/workspace-runtime.js +43 -15
  376. package/dist/daemon/workspace-runtime.js.map +1 -1
  377. package/dist/index.d.ts +1 -1
  378. package/dist/index.d.ts.map +1 -1
  379. package/dist/index.js.map +1 -1
  380. package/dist/main.d.ts.map +1 -1
  381. package/dist/main.js +8 -3
  382. package/dist/main.js.map +1 -1
  383. package/dist/migrations.d.ts.map +1 -1
  384. package/dist/migrations.js.map +1 -1
  385. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  386. package/dist/modes/interactive/components/assistant-message.js +3 -10
  387. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  388. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  389. package/dist/modes/interactive/components/bash-execution.js +4 -9
  390. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  391. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  392. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  393. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  394. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  395. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  396. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  397. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  398. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  399. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  400. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  401. package/dist/modes/interactive/components/config-selector.js +6 -16
  402. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  403. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  404. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  405. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  406. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  407. package/dist/modes/interactive/components/custom-editor.js +1 -8
  408. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  409. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  410. package/dist/modes/interactive/components/custom-message.js +1 -6
  411. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  412. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  413. package/dist/modes/interactive/components/diff.js.map +1 -1
  414. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  415. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  416. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  417. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  418. package/dist/modes/interactive/components/extension-editor.js +1 -7
  419. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  420. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  421. package/dist/modes/interactive/components/extension-input.js +2 -8
  422. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  423. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  424. package/dist/modes/interactive/components/extension-selector.js +1 -9
  425. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  426. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/footer.js +8 -4
  428. package/dist/modes/interactive/components/footer.js.map +1 -1
  429. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -1
  430. package/dist/modes/interactive/components/hook-execution.js +2 -5
  431. package/dist/modes/interactive/components/hook-execution.js.map +1 -1
  432. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  433. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  434. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/login-dialog.js +3 -9
  436. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  437. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  438. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  439. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  440. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  441. package/dist/modes/interactive/components/message-card.d.ts.map +1 -1
  442. package/dist/modes/interactive/components/message-card.js +0 -1
  443. package/dist/modes/interactive/components/message-card.js.map +1 -1
  444. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  445. package/dist/modes/interactive/components/model-selector.js +13 -28
  446. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  447. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  448. package/dist/modes/interactive/components/oauth-selector.js +3 -12
  449. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  450. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  451. package/dist/modes/interactive/components/scoped-models-selector.js +9 -13
  452. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  453. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  454. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  455. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  456. package/dist/modes/interactive/components/session-selector.js +33 -58
  457. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  458. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  459. package/dist/modes/interactive/components/settings-selector.js +0 -4
  460. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  461. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  462. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  463. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  464. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  466. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  467. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/theme-selector.js +0 -2
  469. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  470. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  472. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  473. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/tool-execution.js +9 -24
  475. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  476. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  477. package/dist/modes/interactive/components/tree-selector.js +18 -34
  478. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  479. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  480. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  481. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  482. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  483. package/dist/modes/interactive/components/user-message.js +0 -4
  484. package/dist/modes/interactive/components/user-message.js.map +1 -1
  485. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  486. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  487. package/dist/modes/interactive/interactive-mode.d.ts +13 -0
  488. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  489. package/dist/modes/interactive/interactive-mode.js +162 -136
  490. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  491. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  492. package/dist/modes/interactive/theme/theme.js +0 -7
  493. package/dist/modes/interactive/theme/theme.js.map +1 -1
  494. package/dist/modes/json-event.d.ts.map +1 -1
  495. package/dist/modes/json-event.js.map +1 -1
  496. package/dist/modes/print-mode.d.ts.map +1 -1
  497. package/dist/modes/print-mode.js.map +1 -1
  498. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  499. package/dist/modes/rpc/jsonl.js.map +1 -1
  500. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  501. package/dist/modes/rpc/rpc-client.js +10 -11
  502. package/dist/modes/rpc/rpc-client.js.map +1 -1
  503. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  504. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  505. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  506. package/dist/package-manager-cli.d.ts.map +1 -1
  507. package/dist/package-manager-cli.js +33 -2
  508. package/dist/package-manager-cli.js.map +1 -1
  509. package/dist/utils/ansi.d.ts.map +1 -1
  510. package/dist/utils/ansi.js.map +1 -1
  511. package/dist/utils/binary-self-update.d.ts +25 -0
  512. package/dist/utils/binary-self-update.d.ts.map +1 -0
  513. package/dist/utils/binary-self-update.js +159 -0
  514. package/dist/utils/binary-self-update.js.map +1 -0
  515. package/dist/utils/changelog.d.ts.map +1 -1
  516. package/dist/utils/changelog.js.map +1 -1
  517. package/dist/utils/child-process.d.ts.map +1 -1
  518. package/dist/utils/child-process.js.map +1 -1
  519. package/dist/utils/clipboard-image.d.ts.map +1 -1
  520. package/dist/utils/clipboard-image.js.map +1 -1
  521. package/dist/utils/clipboard-native.d.ts.map +1 -1
  522. package/dist/utils/clipboard-native.js.map +1 -1
  523. package/dist/utils/clipboard.d.ts.map +1 -1
  524. package/dist/utils/clipboard.js.map +1 -1
  525. package/dist/utils/deprecation.d.ts.map +1 -1
  526. package/dist/utils/deprecation.js.map +1 -1
  527. package/dist/utils/directory-completions.d.ts +8 -0
  528. package/dist/utils/directory-completions.d.ts.map +1 -1
  529. package/dist/utils/directory-completions.js +42 -1
  530. package/dist/utils/directory-completions.js.map +1 -1
  531. package/dist/utils/exif-orientation.d.ts.map +1 -1
  532. package/dist/utils/exif-orientation.js.map +1 -1
  533. package/dist/utils/frontmatter.d.ts.map +1 -1
  534. package/dist/utils/frontmatter.js.map +1 -1
  535. package/dist/utils/fs-watch.d.ts.map +1 -1
  536. package/dist/utils/fs-watch.js.map +1 -1
  537. package/dist/utils/git.d.ts.map +1 -1
  538. package/dist/utils/git.js.map +1 -1
  539. package/dist/utils/grip-user-agent.d.ts.map +1 -1
  540. package/dist/utils/grip-user-agent.js.map +1 -1
  541. package/dist/utils/html.d.ts.map +1 -1
  542. package/dist/utils/html.js.map +1 -1
  543. package/dist/utils/image-convert.d.ts.map +1 -1
  544. package/dist/utils/image-convert.js.map +1 -1
  545. package/dist/utils/image-process.d.ts.map +1 -1
  546. package/dist/utils/image-process.js.map +1 -1
  547. package/dist/utils/image-resize-core.d.ts.map +1 -1
  548. package/dist/utils/image-resize-core.js.map +1 -1
  549. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  550. package/dist/utils/image-resize-worker.js.map +1 -1
  551. package/dist/utils/image-resize.d.ts.map +1 -1
  552. package/dist/utils/image-resize.js.map +1 -1
  553. package/dist/utils/json.d.ts.map +1 -1
  554. package/dist/utils/json.js.map +1 -1
  555. package/dist/utils/mime.d.ts.map +1 -1
  556. package/dist/utils/mime.js.map +1 -1
  557. package/dist/utils/open-browser.d.ts.map +1 -1
  558. package/dist/utils/open-browser.js.map +1 -1
  559. package/dist/utils/paths.d.ts.map +1 -1
  560. package/dist/utils/paths.js.map +1 -1
  561. package/dist/utils/photon.d.ts.map +1 -1
  562. package/dist/utils/photon.js +10 -5
  563. package/dist/utils/photon.js.map +1 -1
  564. package/dist/utils/shell.d.ts.map +1 -1
  565. package/dist/utils/shell.js.map +1 -1
  566. package/dist/utils/sleep.d.ts.map +1 -1
  567. package/dist/utils/sleep.js.map +1 -1
  568. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  569. package/dist/utils/syntax-highlight.js +1 -1
  570. package/dist/utils/syntax-highlight.js.map +1 -1
  571. package/dist/utils/tools-manager.d.ts.map +1 -1
  572. package/dist/utils/tools-manager.js.map +1 -1
  573. package/dist/utils/version-check.d.ts.map +1 -1
  574. package/dist/utils/version-check.js.map +1 -1
  575. package/dist/utils/windows-self-update.d.ts.map +1 -1
  576. package/dist/utils/windows-self-update.js.map +1 -1
  577. package/docs/extensions.md +31 -1
  578. package/docs/sandbox.md +6 -0
  579. package/docs/sessions.md +1 -1
  580. package/docs/skills.md +4 -4
  581. package/docs/usage.md +2 -1
  582. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  583. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  584. package/examples/extensions/sandbox/package.json +2 -2
  585. package/examples/extensions/with-deps/package.json +1 -1
  586. package/npm-shrinkwrap.json +602 -834
  587. package/package.json +20 -21
@@ -1 +1 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport type { AgentTool, AgentToolResult } from \"@greppleai/grip-agent-core\";\nimport type { Api, Model } from \"@greppleai/grip-ai\";\nimport { Text } from \"@greppleai/grip-tui\";\n\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.ts\";\nimport { keyText } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { processImage } from \"../../utils/image-process.ts\";\nimport { formatPathRelativeToCwdOrAbsolute } from \"../../utils/paths.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { fmtRegion } from \"./hashline/apply.ts\";\nimport { HASH_SEP, initHasher, lineHashes } from \"./hashline/hash.ts\";\nimport { visLines as hashlineVisLines } from \"./hashline-utils.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport { resolveReadPathAsync, resolveToCwd } from \"./path-utils.ts\";\nimport {\n\tformatBackendIcon,\n\tformatHiddenLinesHint,\n\tgetTextOutput,\n\tinvalidArgText,\n\treplaceTabs,\n\tshortenPath,\n\tstr,\n} from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst readSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to read (relative or absolute)\" }),\n\toffset: Type.Optional(Type.Number({ description: \"Line number to start reading from (1-indexed)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of lines to read\" })),\n});\n\nexport type ReadToolInput = Static<typeof readSchema>;\n\nexport interface ReadToolDetails {\n\ttruncation?: TruncationResult;\n}\n\ntype CompactReadClassificationKind = \"docs\" | \"resource\" | \"skill\" | \"rule\";\n\ninterface CompactReadClassification {\n\tkind: CompactReadClassificationKind;\n\tlabel: string;\n}\n\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.override.md\", \"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\n\nexport interface ReadToolOperationsSelection {\n\tkind: \"selection\";\n\toperations: ToolOperations;\n\tpath: string;\n}\n\nexport type ReadToolOperations = ToolOperations | ReadToolOperationsSelection;\n\ntype ReadToolOperationsSelector = (absolutePath: string) => ReadToolOperations | undefined;\n\nexport interface ReadToolOptions {\n\t/** Whether to auto-resize images to 2000x2000 max. Default: true */\n\tautoResizeImages?: boolean;\n\t/** Select a backend, and optionally a canonical path, for a resolved absolute path. Defaults to the tool backend. */\n\toperationsForPath?: ReadToolOperationsSelector;\n}\n\nfunction isReadToolOperationsSelection(value: ReadToolOperations): value is ReadToolOperationsSelection {\n\treturn \"kind\" in value && value.kind === \"selection\";\n}\n\nfunction getReadToolOperations(value: ReadToolOperations | undefined): ToolOperations | undefined {\n\treturn value && isReadToolOperationsSelection(value) ? value.operations : value;\n}\n\ntype ReadRenderArgs = { path?: string; file_path?: string; offset?: number; limit?: number };\n\nfunction formatReadLineRange(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tif (args?.offset === undefined && args?.limit === undefined) return \"\";\n\tconst startLine = args.offset ?? 1;\n\tconst endLine = args.limit !== undefined ? startLine + args.limit - 1 : \"\";\n\treturn theme.fg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n}\n\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst path = rawPath !== null ? shortenPath(rawPath) : null;\n\tconst invalidArg = invalidArgText(theme);\n\tconst pathDisplay = path === null ? invalidArg : path ? theme.fg(\"accent\", path) : theme.fg(\"toolOutput\", \"...\");\n\treturn `${theme.fg(\"toolTitle\", theme.bold(\"read\"))} ${pathDisplay}${formatReadLineRange(args, theme)}`;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\tif (!model || model.input.includes(\"image\")) {\n\t\treturn undefined;\n\t}\n\treturn \"[Current model does not support images. The image will be omitted from this request.]\";\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\n\nfunction getGripDocsClassification(absolutePath: string): CompactReadClassification | undefined {\n\tconst packageRoot = dirname(getReadmePath());\n\tconst relativePath = relative(resolvePath(packageRoot), resolvePath(absolutePath));\n\tif (\n\t\trelativePath === \"\" ||\n\t\trelativePath === \"..\" ||\n\t\trelativePath.startsWith(`..${sep}`) ||\n\t\tisAbsolute(relativePath)\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst label = toPosixPath(relativePath);\n\tif (label === \"README.md\" || label.startsWith(\"docs/\") || label.startsWith(\"examples/\")) {\n\t\treturn { kind: \"docs\", label };\n\t}\n\treturn undefined;\n}\n\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tif (!rawPath) return undefined;\n\n\tconst absolutePath = resolveToCwd(rawPath, cwd);\n\tconst fileName = basename(absolutePath);\n\tif (fileName === \"SKILL.md\") {\n\t\treturn { kind: \"skill\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\tif (fileName === \"RULES.md\") {\n\t\treturn { kind: \"rule\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\n\tconst docsClassification = getGripDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: formatPathRelativeToCwdOrAbsolute(absolutePath, cwd) };\n\t}\n\n\treturn undefined;\n}\n\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst expandHint = theme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\n\tif (classification.kind === \"skill\" || classification.kind === \"rule\") {\n\t\tconst label = classification.kind === \"skill\" ? \"skill\" : \"rule\";\n\t\treturn (\n\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[${label}]\\x1b[22m `) +\n\t\t\ttheme.fg(\"customMessageText\", classification.label) +\n\t\t\tformatReadLineRange(args, theme) +\n\t\t\texpandHint\n\t\t);\n\t}\n\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(`read ${classification.kind}`)) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", classification.label) +\n\t\tformatReadLineRange(args, theme) +\n\t\texpandHint\n\t);\n}\n\nfunction formatReadTruncationWarning(truncation: TruncationResult | undefined, theme: Theme): string {\n\tif (!truncation?.truncated) return \"\";\n\tif (truncation.firstLineExceedsLimit) {\n\t\treturn `\\n${theme.fg(\"warning\", `[First line exceeds ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t}\n\tif (truncation.truncatedBy === \"lines\") {\n\t\treturn `\\n${theme.fg(\"warning\", `[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines ?? DEFAULT_MAX_LINES} line limit)]`)}`;\n\t}\n\treturn `\\n${theme.fg(\"warning\", `[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)]`)}`;\n}\n\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: AgentToolResult<ReadToolDetails | undefined>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\tcwd: string,\n\tisError: boolean,\n): string {\n\tif (!options.expanded && !isError && getCompactReadClassification(args, cwd)) {\n\t\treturn \"\";\n\t}\n\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst output = getTextOutput(result, showImages);\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tconst renderedLines = lang ? highlightCode(replaceTabs(output), lang) : output.split(\"\\n\");\n\tconst lines = trimTrailingEmptyLines(renderedLines);\n\tconst maxLines = options.expanded ? lines.length : 10;\n\tconst displayLines = lines.slice(0, maxLines);\n\tconst remaining = lines.length - maxLines;\n\tlet text = `\\n${displayLines.map((line) => (lang ? replaceTabs(line) : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\tif (remaining > 0) {\n\t\ttext += `\\n\\n${formatHiddenLinesHint(remaining, theme)}`;\n\t}\n\n\ttext += formatReadTruncationWarning(result.details?.truncation, theme);\n\treturn text;\n}\n\ninterface ResolvedReadTarget {\n\toperations: ToolOperations;\n\tpath: string;\n}\n\ninterface ReadExecutionOptions {\n\tinput: ReadToolInput;\n\tdefaultOperations: ToolOperations;\n\tcwd: string;\n\toperationsForPath: ReadToolOperationsSelector | undefined;\n\tautoResizeImages: boolean;\n\tmodel: Model<Api> | undefined;\n\tsignal: AbortSignal | undefined;\n}\n\ninterface TextReadOutputOptions {\n\ttruncation: TruncationResult;\n\tallLines: string[];\n\tstartLine: number;\n\tstartLineDisplay: number;\n\tendLine: number;\n\ttotalFileLines: number;\n}\n\nasync function resolveReadTarget(options: ReadExecutionOptions): Promise<ResolvedReadTarget> {\n\tconst absolutePath = await resolveReadPathAsync(options.input.path, options.cwd);\n\tconst selection = options.operationsForPath?.(absolutePath);\n\treturn {\n\t\toperations: getReadToolOperations(selection) ?? options.defaultOperations,\n\t\tpath: selection && isReadToolOperationsSelection(selection) ? selection.path : absolutePath,\n\t};\n}\n\nasync function readImageFile(\n\toperations: ToolOperations,\n\tpath: string,\n\tmimeType: string,\n\tautoResizeImages: boolean,\n\tnonVisionImageNote: string | undefined,\n): Promise<AgentToolResult<ReadToolDetails | undefined>> {\n\tconst buffer = await operations.readFile(path);\n\tconst processed = await processImage(buffer, mimeType, { autoResizeImages });\n\tif (!processed.ok) {\n\t\tlet text = `Read image file [${mimeType}]\\n${processed.message}`;\n\t\tif (nonVisionImageNote) text += `\\n${nonVisionImageNote}`;\n\t\treturn { content: [{ type: \"text\", text }], details: undefined };\n\t}\n\tlet text = `Read image file [${processed.mimeType}]`;\n\tif (processed.hints.length > 0) text += `\\n${processed.hints.join(\"\\n\")}`;\n\tif (nonVisionImageNote) text += `\\n${nonVisionImageNote}`;\n\treturn {\n\t\tcontent: [\n\t\t\t{ type: \"text\", text },\n\t\t\t{ type: \"image\", data: processed.data, mimeType: processed.mimeType },\n\t\t],\n\t\tdetails: undefined,\n\t};\n}\n\nfunction formatTextReadOutput(options: TextReadOutputOptions): AgentToolResult<ReadToolDetails | undefined> {\n\tconst { truncation } = options;\n\tlet text: string;\n\tlet details: ReadToolDetails | undefined;\n\tif (truncation.firstLineExceedsLimit) {\n\t\tconst firstLineSize = formatSize(Buffer.byteLength(options.allLines[options.startLine] ?? \"\", \"utf-8\"));\n\t\ttext = `[Line ${options.startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Hashline output requires full lines; use bash for this line.]`;\n\t\tdetails = { truncation };\n\t} else if (truncation.truncated) {\n\t\tconst endLineDisplay = options.startLineDisplay + truncation.outputLines - 1;\n\t\tconst nextOffset = endLineDisplay + 1;\n\t\ttext = truncation.content;\n\t\tif (truncation.truncatedBy === \"lines\") {\n\t\t\ttext += `\\n\\n[Showing lines ${options.startLineDisplay}-${endLineDisplay} of ${options.totalFileLines}. Use offset=${nextOffset} to continue.]`;\n\t\t} else {\n\t\t\ttext += `\\n\\n[Showing lines ${options.startLineDisplay}-${endLineDisplay} of ${options.totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;\n\t\t}\n\t\tdetails = { truncation };\n\t} else if (options.endLine < options.totalFileLines) {\n\t\tconst remaining = options.totalFileLines - options.endLine;\n\t\ttext = `${truncation.content}\\n\\n[${remaining} more lines in file. Use offset=${options.endLine + 1} to continue.]`;\n\t} else {\n\t\ttext = truncation.content;\n\t}\n\treturn { content: [{ type: \"text\", text }], details };\n}\n\nasync function readTextFile(\n\toperations: ToolOperations,\n\tpath: string,\n\toffset: number | undefined,\n\tlimit: number | undefined,\n): Promise<AgentToolResult<ReadToolDetails | undefined>> {\n\tawait initHasher();\n\tconst buffer = await operations.readFile(path);\n\tconst textContent = buffer.toString(\"utf-8\").replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\tconst allLines = hashlineVisLines(textContent);\n\tconst totalFileLines = allLines.length;\n\tconst startLine = offset ? Math.max(0, offset - 1) : 0;\n\tconst startLineDisplay = startLine + 1;\n\tif (totalFileLines === 0) {\n\t\tif (startLineDisplay !== 1) throw new Error(`Offset ${offset} is beyond end of file (0 lines total)`);\n\t\tconst emptyHash = (await lineHashes(textContent, path))[0] ?? \"\";\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `${emptyHash}${HASH_SEP}\\n[File is empty. Use edit to insert content.]` }],\n\t\t\tdetails: undefined,\n\t\t};\n\t}\n\tif (startLine >= totalFileLines) {\n\t\tthrow new Error(`Offset ${offset} is beyond end of file (${totalFileLines} lines total)`);\n\t}\n\tconst endLine = limit !== undefined ? Math.min(startLine + limit, totalFileLines) : totalFileLines;\n\tconst allHashes = await lineHashes(textContent, path);\n\tconst selectedContent = fmtRegion(allHashes.slice(startLine, endLine), allLines.slice(startLine, endLine));\n\treturn formatTextReadOutput({\n\t\ttruncation: truncateHead(selectedContent),\n\t\tallLines,\n\t\tstartLine,\n\t\tstartLineDisplay,\n\t\tendLine,\n\t\ttotalFileLines,\n\t});\n}\n\nasync function executeReadRequest(\n\toptions: ReadExecutionOptions,\n\tisAborted: () => boolean,\n): Promise<AgentToolResult<ReadToolDetails | undefined> | undefined> {\n\tconst target = await resolveReadTarget(options);\n\tif (isAborted()) return undefined;\n\tawait target.operations.access(target.path, \"read\");\n\tif (isAborted()) return undefined;\n\tconst mimeType = target.operations.detectImageMimeType\n\t\t? await target.operations.detectImageMimeType(target.path)\n\t\t: undefined;\n\tconst nonVisionImageNote = getNonVisionImageNote(options.model);\n\tconst result = mimeType\n\t\t? await readImageFile(target.operations, target.path, mimeType, options.autoResizeImages, nonVisionImageNote)\n\t\t: await readTextFile(target.operations, target.path, options.input.offset, options.input.limit);\n\treturn isAborted() ? undefined : result;\n}\n\nfunction executeAbortableRead(options: ReadExecutionOptions): Promise<AgentToolResult<ReadToolDetails | undefined>> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (options.signal?.aborted) {\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\treturn;\n\t\t}\n\t\tlet aborted = false;\n\t\tconst onAbort = () => {\n\t\t\taborted = true;\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t};\n\t\toptions.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid executeReadRequest(options, () => aborted).then(\n\t\t\t(result) => {\n\t\t\t\tif (result === undefined) return;\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tresolve(result);\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tif (!aborted) reject(error);\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport type ReadToolDefinition = ToolDefinition<typeof readSchema, ReadToolDetails | undefined>;\n\nexport function createReadToolDefinition(operations: ToolOperations, options?: ReadToolOptions): ReadToolDefinition {\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\n\tconst ops = operations;\n\tconst cwd = operations.cwd;\n\tconst operationsForPath = options?.operationsForPath;\n\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. Text files are returned as HASH│content rows for hash-anchored editing. Output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,\n\t\tpromptSnippet: \"Read file contents with hashline anchors\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use read to examine files instead of cat or sed.\",\n\t\t\t\"For edits, copy only the 3-character HASH values into edit hash_range_inclusive; do not include HASH│ prefixes in content_lines.\",\n\t\t],\n\t\tparameters: readSchema,\n\t\tasync execute(_toolCallId, input: ReadToolInput, signal?: AbortSignal, _onUpdate?, ctx?) {\n\t\t\treturn executeAbortableRead({\n\t\t\t\tinput,\n\t\t\t\tdefaultOperations: ops,\n\t\t\t\tcwd,\n\t\t\t\toperationsForPath,\n\t\t\t\tautoResizeImages,\n\t\t\t\tmodel: ctx?.model,\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\tconst classification = !context.expanded ? getCompactReadClassification(args, context.cwd) : undefined;\n\t\t\tconst renderArgs = args as ReadRenderArgs | undefined;\n\t\t\tconst rawPath = str(renderArgs?.file_path ?? renderArgs?.path);\n\t\t\tconst displayOps = rawPath\n\t\t\t\t? (getReadToolOperations(operationsForPath?.(resolveToCwd(rawPath, cwd))) ?? ops)\n\t\t\t\t: ops;\n\t\t\ttext.setText(\n\t\t\t\tformatBackendIcon(displayOps.getBackendInfo?.(), theme) +\n\t\t\t\t\t(classification ? formatCompactReadCall(classification, args, theme) : formatReadCall(args, theme)),\n\t\t\t);\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(\n\t\t\t\tformatReadResult(context.args, result, options, theme, context.showImages, context.cwd, context.isError),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createReadTool(operations: ToolOperations, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(operations, options));\n}\n"]}
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport type { AgentTool, AgentToolResult } from \"@greppleai/grip-agent-core\";\nimport type { Api, Model } from \"@greppleai/grip-ai\";\nimport { Text } from \"@greppleai/grip-tui\";\n\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.ts\";\nimport { keyText } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { processImage } from \"../../utils/image-process.ts\";\nimport { formatPathRelativeToCwdOrAbsolute } from \"../../utils/paths.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { fmtRegion } from \"./hashline/apply.ts\";\nimport { HASH_SEP, initHasher, lineHashes } from \"./hashline/hash.ts\";\nimport { visLines as hashlineVisLines } from \"./hashline-utils.ts\";\nimport type { ToolOperations } from \"./operations.ts\";\nimport { resolveReadPathAsync, resolveToCwd } from \"./path-utils.ts\";\nimport {\n\tformatBackendIcon,\n\tformatHiddenLinesHint,\n\tgetTextOutput,\n\tinvalidArgText,\n\treplaceTabs,\n\tshortenPath,\n\tstr,\n} from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst readSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to read (relative or absolute)\" }),\n\toffset: Type.Optional(Type.Number({ description: \"Line number to start reading from (1-indexed)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of lines to read\" })),\n});\n\nexport type ReadToolInput = Static<typeof readSchema>;\n\nexport interface ReadToolDetails {\n\ttruncation?: TruncationResult;\n}\n\ntype CompactReadClassificationKind = \"docs\" | \"resource\" | \"skill\" | \"rule\";\n\ninterface CompactReadClassification {\n\tkind: CompactReadClassificationKind;\n\tlabel: string;\n}\n\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.override.md\", \"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\n\nexport interface ReadToolOperationsSelection {\n\tkind: \"selection\";\n\toperations: ToolOperations;\n\tpath: string;\n}\n\nexport type ReadToolOperations = ToolOperations | ReadToolOperationsSelection;\n\ntype ReadToolOperationsSelector = (absolutePath: string) => ReadToolOperations | undefined;\n\nexport interface ReadToolOptions {\n\t/** Whether to auto-resize images to 2000x2000 max. Default: true */\n\tautoResizeImages?: boolean;\n\t/** Select a backend, and optionally a canonical path, for a resolved absolute path. Defaults to the tool backend. */\n\toperationsForPath?: ReadToolOperationsSelector;\n}\n\nfunction isReadToolOperationsSelection(value: ReadToolOperations): value is ReadToolOperationsSelection {\n\treturn \"kind\" in value && value.kind === \"selection\";\n}\n\nfunction getReadToolOperations(value: ReadToolOperations | undefined): ToolOperations | undefined {\n\treturn value && isReadToolOperationsSelection(value) ? value.operations : value;\n}\n\ntype ReadRenderArgs = { path?: string; file_path?: string; offset?: number; limit?: number };\n\nfunction formatReadLineRange(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tif (args?.offset === undefined && args?.limit === undefined) return \"\";\n\tconst startLine = args.offset ?? 1;\n\tconst endLine = args.limit !== undefined ? startLine + args.limit - 1 : \"\";\n\treturn theme.fg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n}\n\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst path = rawPath !== null ? shortenPath(rawPath) : null;\n\tconst invalidArg = invalidArgText(theme);\n\tconst pathDisplay = path === null ? invalidArg : path ? theme.fg(\"accent\", path) : theme.fg(\"toolOutput\", \"...\");\n\treturn `${theme.fg(\"toolTitle\", theme.bold(\"read\"))} ${pathDisplay}${formatReadLineRange(args, theme)}`;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\tif (!model || model.input.includes(\"image\")) {\n\t\treturn undefined;\n\t}\n\treturn \"[Current model does not support images. The image will be omitted from this request.]\";\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\n\nfunction getGripDocsClassification(absolutePath: string): CompactReadClassification | undefined {\n\tconst packageRoot = dirname(getReadmePath());\n\tconst relativePath = relative(resolvePath(packageRoot), resolvePath(absolutePath));\n\tif (\n\t\trelativePath === \"\" ||\n\t\trelativePath === \"..\" ||\n\t\trelativePath.startsWith(`..${sep}`) ||\n\t\tisAbsolute(relativePath)\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst label = toPosixPath(relativePath);\n\tif (label === \"README.md\" || label.startsWith(\"docs/\") || label.startsWith(\"examples/\")) {\n\t\treturn { kind: \"docs\", label };\n\t}\n\treturn undefined;\n}\n\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tif (!rawPath) return undefined;\n\n\tconst absolutePath = resolveToCwd(rawPath, cwd);\n\tconst fileName = basename(absolutePath);\n\tif (fileName === \"SKILL.md\") {\n\t\treturn { kind: \"skill\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\tif (fileName === \"RULES.md\") {\n\t\treturn { kind: \"rule\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\n\tconst docsClassification = getGripDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: formatPathRelativeToCwdOrAbsolute(absolutePath, cwd) };\n\t}\n\n\treturn undefined;\n}\n\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst expandHint = theme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\n\tif (classification.kind === \"skill\" || classification.kind === \"rule\") {\n\t\tconst label = classification.kind === \"skill\" ? \"skill\" : \"rule\";\n\t\treturn (\n\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[${label}]\\x1b[22m `) +\n\t\t\ttheme.fg(\"customMessageText\", classification.label) +\n\t\t\tformatReadLineRange(args, theme) +\n\t\t\texpandHint\n\t\t);\n\t}\n\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(`read ${classification.kind}`)) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", classification.label) +\n\t\tformatReadLineRange(args, theme) +\n\t\texpandHint\n\t);\n}\n\nfunction formatReadTruncationWarning(truncation: TruncationResult | undefined, theme: Theme): string {\n\tif (!truncation?.truncated) return \"\";\n\tif (truncation.firstLineExceedsLimit) {\n\t\treturn `\\n${theme.fg(\"warning\", `[First line exceeds ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t}\n\tif (truncation.truncatedBy === \"lines\") {\n\t\treturn `\\n${theme.fg(\"warning\", `[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines ?? DEFAULT_MAX_LINES} line limit)]`)}`;\n\t}\n\treturn `\\n${theme.fg(\"warning\", `[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)]`)}`;\n}\n\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: AgentToolResult<ReadToolDetails | undefined>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\tcwd: string,\n\tisError: boolean,\n): string {\n\tif (!options.expanded && !isError && getCompactReadClassification(args, cwd)) {\n\t\treturn \"\";\n\t}\n\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst output = getTextOutput(result, showImages);\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tconst renderedLines = lang ? highlightCode(replaceTabs(output), lang) : output.split(\"\\n\");\n\tconst lines = trimTrailingEmptyLines(renderedLines);\n\tconst maxLines = options.expanded ? lines.length : 10;\n\tconst displayLines = lines.slice(0, maxLines);\n\tconst remaining = lines.length - maxLines;\n\tlet text = `\\n${displayLines.map((line) => (lang ? replaceTabs(line) : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\tif (remaining > 0) {\n\t\ttext += `\\n\\n${formatHiddenLinesHint(remaining, theme)}`;\n\t}\n\n\ttext += formatReadTruncationWarning(result.details?.truncation, theme);\n\treturn text;\n}\n\ninterface ResolvedReadTarget {\n\toperations: ToolOperations;\n\tpath: string;\n}\n\ninterface ReadExecutionOptions {\n\tinput: ReadToolInput;\n\tdefaultOperations: ToolOperations;\n\tcwd: string;\n\toperationsForPath: ReadToolOperationsSelector | undefined;\n\tautoResizeImages: boolean;\n\tmodel: Model<Api> | undefined;\n\tsignal: AbortSignal | undefined;\n}\n\ninterface TextReadOutputOptions {\n\ttruncation: TruncationResult;\n\tallLines: string[];\n\tstartLine: number;\n\tstartLineDisplay: number;\n\tendLine: number;\n\ttotalFileLines: number;\n}\n\nasync function resolveReadTarget(options: ReadExecutionOptions): Promise<ResolvedReadTarget> {\n\tconst absolutePath = await resolveReadPathAsync(options.input.path, options.cwd);\n\tconst selection = options.operationsForPath?.(absolutePath);\n\treturn {\n\t\toperations: getReadToolOperations(selection) ?? options.defaultOperations,\n\t\tpath: selection && isReadToolOperationsSelection(selection) ? selection.path : absolutePath,\n\t};\n}\n\nasync function readImageFile(\n\toperations: ToolOperations,\n\tpath: string,\n\tmimeType: string,\n\tautoResizeImages: boolean,\n\tnonVisionImageNote: string | undefined,\n): Promise<AgentToolResult<ReadToolDetails | undefined>> {\n\tconst buffer = await operations.readFile(path);\n\tconst processed = await processImage(buffer, mimeType, { autoResizeImages });\n\tif (!processed.ok) {\n\t\tlet text = `Read image file [${mimeType}]\\n${processed.message}`;\n\t\tif (nonVisionImageNote) text += `\\n${nonVisionImageNote}`;\n\t\treturn { content: [{ type: \"text\", text }], details: undefined };\n\t}\n\tlet text = `Read image file [${processed.mimeType}]`;\n\tif (processed.hints.length > 0) text += `\\n${processed.hints.join(\"\\n\")}`;\n\tif (nonVisionImageNote) text += `\\n${nonVisionImageNote}`;\n\treturn {\n\t\tcontent: [\n\t\t\t{ type: \"text\", text },\n\t\t\t{ type: \"image\", data: processed.data, mimeType: processed.mimeType },\n\t\t],\n\t\tdetails: undefined,\n\t};\n}\n\nfunction formatTextReadOutput(options: TextReadOutputOptions): AgentToolResult<ReadToolDetails | undefined> {\n\tconst { truncation } = options;\n\tlet text: string;\n\tlet details: ReadToolDetails | undefined;\n\tif (truncation.firstLineExceedsLimit) {\n\t\tconst firstLineSize = formatSize(Buffer.byteLength(options.allLines[options.startLine] ?? \"\", \"utf-8\"));\n\t\ttext = `[Line ${options.startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Hashline output requires full lines; use bash for this line.]`;\n\t\tdetails = { truncation };\n\t} else if (truncation.truncated) {\n\t\tconst endLineDisplay = options.startLineDisplay + truncation.outputLines - 1;\n\t\tconst nextOffset = endLineDisplay + 1;\n\t\ttext = truncation.content;\n\t\tif (truncation.truncatedBy === \"lines\") {\n\t\t\ttext += `\\n\\n[Showing lines ${options.startLineDisplay}-${endLineDisplay} of ${options.totalFileLines}. Use offset=${nextOffset} to continue.]`;\n\t\t} else {\n\t\t\ttext += `\\n\\n[Showing lines ${options.startLineDisplay}-${endLineDisplay} of ${options.totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;\n\t\t}\n\t\tdetails = { truncation };\n\t} else if (options.endLine < options.totalFileLines) {\n\t\tconst remaining = options.totalFileLines - options.endLine;\n\t\ttext = `${truncation.content}\\n\\n[${remaining} more lines in file. Use offset=${options.endLine + 1} to continue.]`;\n\t} else {\n\t\ttext = truncation.content;\n\t}\n\treturn { content: [{ type: \"text\", text }], details };\n}\n\nasync function readTextFile(\n\toperations: ToolOperations,\n\tpath: string,\n\toffset: number | undefined,\n\tlimit: number | undefined,\n): Promise<AgentToolResult<ReadToolDetails | undefined>> {\n\tawait initHasher();\n\tconst buffer = await operations.readFile(path);\n\tconst textContent = buffer.toString(\"utf-8\").replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\tconst allLines = hashlineVisLines(textContent);\n\tconst totalFileLines = allLines.length;\n\tconst startLine = offset ? Math.max(0, offset - 1) : 0;\n\tconst startLineDisplay = startLine + 1;\n\tif (totalFileLines === 0) {\n\t\tif (startLineDisplay !== 1) throw new Error(`Offset ${offset} is beyond end of file (0 lines total)`);\n\t\tconst emptyHash = (await lineHashes(textContent, path))[0] ?? \"\";\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `${emptyHash}${HASH_SEP}\\n[File is empty. Use edit to insert content.]` }],\n\t\t\tdetails: undefined,\n\t\t};\n\t}\n\tif (startLine >= totalFileLines) {\n\t\tthrow new Error(`Offset ${offset} is beyond end of file (${totalFileLines} lines total)`);\n\t}\n\tconst endLine = limit !== undefined ? Math.min(startLine + limit, totalFileLines) : totalFileLines;\n\tconst allHashes = await lineHashes(textContent, path);\n\tconst selectedContent = fmtRegion(allHashes.slice(startLine, endLine), allLines.slice(startLine, endLine));\n\treturn formatTextReadOutput({\n\t\ttruncation: truncateHead(selectedContent),\n\t\tallLines,\n\t\tstartLine,\n\t\tstartLineDisplay,\n\t\tendLine,\n\t\ttotalFileLines,\n\t});\n}\n\nasync function executeReadRequest(\n\toptions: ReadExecutionOptions,\n\tisAborted: () => boolean,\n): Promise<AgentToolResult<ReadToolDetails | undefined> | undefined> {\n\tconst target = await resolveReadTarget(options);\n\tif (isAborted()) return undefined;\n\tawait target.operations.access(target.path, \"read\");\n\tif (isAborted()) return undefined;\n\tconst mimeType = target.operations.detectImageMimeType\n\t\t? await target.operations.detectImageMimeType(target.path)\n\t\t: undefined;\n\tconst nonVisionImageNote = getNonVisionImageNote(options.model);\n\tconst result = mimeType\n\t\t? await readImageFile(target.operations, target.path, mimeType, options.autoResizeImages, nonVisionImageNote)\n\t\t: await readTextFile(target.operations, target.path, options.input.offset, options.input.limit);\n\treturn isAborted() ? undefined : result;\n}\n\nfunction executeAbortableRead(options: ReadExecutionOptions): Promise<AgentToolResult<ReadToolDetails | undefined>> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (options.signal?.aborted) {\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\treturn;\n\t\t}\n\t\tlet aborted = false;\n\t\tconst onAbort = () => {\n\t\t\taborted = true;\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t};\n\t\toptions.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid executeReadRequest(options, () => aborted).then(\n\t\t\t(result) => {\n\t\t\t\tif (result === undefined) return;\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tresolve(result);\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tif (!aborted) reject(error);\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport type ReadToolDefinition = ToolDefinition<typeof readSchema, ReadToolDetails | undefined>;\n\nexport function createReadToolDefinition(operations: ToolOperations, options?: ReadToolOptions): ReadToolDefinition {\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\n\tconst ops = operations;\n\tconst cwd = operations.cwd;\n\tconst operationsForPath = options?.operationsForPath;\n\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. Text files are returned as HASH│content rows for hash-anchored editing. Output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,\n\t\tpromptSnippet: \"Read file contents with hashline anchors\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use read to examine files instead of cat or sed.\",\n\t\t\t\"For edits, copy only the 3-character HASH values into edit hash_range_inclusive; do not include HASH│ prefixes in content_lines.\",\n\t\t],\n\t\tparameters: readSchema,\n\t\tasync execute(_toolCallId, input: ReadToolInput, signal?: AbortSignal, _onUpdate?, ctx?) {\n\t\t\treturn executeAbortableRead({\n\t\t\t\tinput,\n\t\t\t\tdefaultOperations: ops,\n\t\t\t\tcwd,\n\t\t\t\toperationsForPath,\n\t\t\t\tautoResizeImages,\n\t\t\t\tmodel: ctx?.model,\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\tconst classification = !context.expanded ? getCompactReadClassification(args, context.cwd) : undefined;\n\t\t\tconst renderArgs = args as ReadRenderArgs | undefined;\n\t\t\tconst rawPath = str(renderArgs?.file_path ?? renderArgs?.path);\n\t\t\tconst displayOps = rawPath\n\t\t\t\t? (getReadToolOperations(operationsForPath?.(resolveToCwd(rawPath, cwd))) ?? ops)\n\t\t\t\t: ops;\n\t\t\ttext.setText(\n\t\t\t\tformatBackendIcon(displayOps.getBackendInfo?.(), theme) +\n\t\t\t\t\t(classification ? formatCompactReadCall(classification, args, theme) : formatReadCall(args, theme)),\n\t\t\t);\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(\n\t\t\t\tformatReadResult(context.args, result, options, theme, context.showImages, context.cwd, context.isError),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createReadTool(operations: ToolOperations, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(operations, options));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"render-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAGzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAOjD;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIjD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,oBAAoB;IAC7B,OAAO,EAAE,qBAAqB,EAAE,CAAC;CACjC;AAED,UAAU,eAAe;IACxB,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAsBnG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAKnF;AAED,MAAM,MAAM,oBAAoB,CAAC,QAAQ,IAAI;IAC5C,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACxC,OAAO,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,eAAe,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAI1G","sourcesContent":["import * as os from \"node:os\";\nimport type { ImageContent, TextContent } from \"@greppleai/grip-ai\";\nimport { getCapabilities, getImageDimensions, imageFallback } from \"@greppleai/grip-tui\";\nimport { keyText } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { ThemeColor } from \"../../modes/interactive/theme/theme.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\nimport type { ToolBackendInfo } from \"./operations.ts\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport interface ToolTextOutputContent {\n\ttype: string;\n\ttext?: string;\n\tdata?: string;\n\tmimeType?: string;\n}\n\ninterface ToolTextOutputSource {\n\tcontent: ToolTextOutputContent[];\n}\n\ninterface ToolRenderTheme {\n\tfg(name: ThemeColor, text: string): string;\n}\n\nexport function getTextOutput(result: ToolTextOutputSource | undefined, showImages: boolean): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport function formatHiddenLinesHint(count: number, theme: ToolRenderTheme): string {\n\tconst expandKey = keyText(\"app.tools.expand\");\n\treturn (\n\t\ttheme.fg(\"warning\", `${count} lines hidden`) + (expandKey ? theme.fg(\"accent\", ` · ${expandKey} to expand`) : \"\")\n\t);\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: ToolRenderTheme): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n\n/**\n * Render a small icon prefix for a tool-call header indicating whether the tool\n * runs against the local machine or a remote daemon backend. Placed at the start\n * of the header so the local/remote target is visible at a glance.\n */\nexport function formatBackendIcon(backendInfo: ToolBackendInfo | undefined, theme: ToolRenderTheme): string {\n\tif (!backendInfo) return \"\";\n\tif (backendInfo.type === \"local\") return theme.fg(\"muted\", \"\\u{1F5A5} \");\n\treturn backendInfo.configured ? theme.fg(\"muted\", \"\\u2601 \") : theme.fg(\"warning\", \"\\u2601 \");\n}\n"]}
1
+ {"version":3,"file":"render-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAGzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAOjD;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIjD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,oBAAoB;IAC7B,OAAO,EAAE,qBAAqB,EAAE,CAAC;CACjC;AAED,UAAU,eAAe;IACxB,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAsBnG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAKnF;AAED,MAAM,MAAM,oBAAoB,CAAC,QAAQ,IAAI;IAC5C,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACxC,OAAO,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,eAAe,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAI1G"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC;AAEjF,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,MAAM,UAAU,WAAW,CAAC,IAAa,EAAU;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,GAAG,CAAC,KAAc,EAAiB;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAU;IACjD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAAA,CAClC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAU;IAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAAA,CAC/B;AAiBD,MAAM,UAAU,aAAa,CAAC,MAAwC,EAAE,UAAmB,EAAU;IACpG,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAErE,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhH,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,MAAM,eAAe,GAAG,WAAW;aACjC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,eAAe,CAAC;YACjD,MAAM,IAAI,GACT,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAClG,OAAO,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAAA,CACrC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,eAAe,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC;AAAA,CACd;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,KAAsB,EAAU;IACpF,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9C,OAAO,CACN,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAM,SAAS,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CACjH,CAAC;AAAA,CACF;AAOD,MAAM,UAAU,cAAc,CAAC,KAAsB,EAAU;IAC9D,OAAO,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAAA,CAC1C;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAwC,EAAE,KAAsB,EAAU;IAC3G,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAC5B,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACzE,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAAA,CAC9F","sourcesContent":["import * as os from \"node:os\";\nimport type { ImageContent, TextContent } from \"@greppleai/grip-ai\";\nimport { getCapabilities, getImageDimensions, imageFallback } from \"@greppleai/grip-tui\";\nimport { keyText } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { ThemeColor } from \"../../modes/interactive/theme/theme.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\nimport type { ToolBackendInfo } from \"./operations.ts\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport interface ToolTextOutputContent {\n\ttype: string;\n\ttext?: string;\n\tdata?: string;\n\tmimeType?: string;\n}\n\ninterface ToolTextOutputSource {\n\tcontent: ToolTextOutputContent[];\n}\n\ninterface ToolRenderTheme {\n\tfg(name: ThemeColor, text: string): string;\n}\n\nexport function getTextOutput(result: ToolTextOutputSource | undefined, showImages: boolean): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport function formatHiddenLinesHint(count: number, theme: ToolRenderTheme): string {\n\tconst expandKey = keyText(\"app.tools.expand\");\n\treturn (\n\t\ttheme.fg(\"warning\", `${count} lines hidden`) + (expandKey ? theme.fg(\"accent\", ` · ${expandKey} to expand`) : \"\")\n\t);\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: ToolRenderTheme): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n\n/**\n * Render a small icon prefix for a tool-call header indicating whether the tool\n * runs against the local machine or a remote daemon backend. Placed at the start\n * of the header so the local/remote target is visible at a glance.\n */\nexport function formatBackendIcon(backendInfo: ToolBackendInfo | undefined, theme: ToolRenderTheme): string {\n\tif (!backendInfo) return \"\";\n\tif (backendInfo.type === \"local\") return theme.fg(\"muted\", \"\\u{1F5A5} \");\n\treturn backendInfo.configured ? theme.fg(\"muted\", \"\\u2601 \") : theme.fg(\"warning\", \"\\u2601 \");\n}\n"]}
1
+ {"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport type { ImageContent, TextContent } from \"@greppleai/grip-ai\";\nimport { getCapabilities, getImageDimensions, imageFallback } from \"@greppleai/grip-tui\";\nimport { keyText } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { ThemeColor } from \"../../modes/interactive/theme/theme.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\nimport type { ToolBackendInfo } from \"./operations.ts\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport interface ToolTextOutputContent {\n\ttype: string;\n\ttext?: string;\n\tdata?: string;\n\tmimeType?: string;\n}\n\ninterface ToolTextOutputSource {\n\tcontent: ToolTextOutputContent[];\n}\n\ninterface ToolRenderTheme {\n\tfg(name: ThemeColor, text: string): string;\n}\n\nexport function getTextOutput(result: ToolTextOutputSource | undefined, showImages: boolean): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport function formatHiddenLinesHint(count: number, theme: ToolRenderTheme): string {\n\tconst expandKey = keyText(\"app.tools.expand\");\n\treturn (\n\t\ttheme.fg(\"warning\", `${count} lines hidden`) + (expandKey ? theme.fg(\"accent\", ` · ${expandKey} to expand`) : \"\")\n\t);\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: ToolRenderTheme): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n\n/**\n * Render a small icon prefix for a tool-call header indicating whether the tool\n * runs against the local machine or a remote daemon backend. Placed at the start\n * of the header so the local/remote target is visible at a glance.\n */\nexport function formatBackendIcon(backendInfo: ToolBackendInfo | undefined, theme: ToolRenderTheme): string {\n\tif (!backendInfo) return \"\";\n\tif (backendInfo.type === \"local\") return theme.fg(\"muted\", \"\\u{1F5A5} \");\n\treturn backendInfo.configured ? theme.fg(\"muted\", \"\\u2601 \") : theme.fg(\"warning\", \"\\u2601 \");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"replace-diff.d.ts","sourceRoot":"","sources":["../../../src/core/tools/replace-diff.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;AAGvC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAKxD;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAEvE;AAED,UAAU,kBAAkB;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACb;AAED,UAAU,kBAAkB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAE5D;AA6FD,wBAAgB,OAAO,CACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,YAAY,SAAI,EAChB,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,GACnB,kBAAkB,CAiCpB","sourcesContent":["import * as Diff from \"diff\";\nimport { _lineHashesPure, ANCHOR_LEN, HASH_SEP } from \"./hashline/hash.ts\";\n\nexport type LineEnding = \"\\r\\n\" | \"\\n\";\ntype DiffLinePrefix = \" \" | \"+\" | \"-\";\n\nexport function detectEnding(content: string): LineEnding {\n\tconst crlfIdx = content.indexOf(\"\\r\\n\");\n\tconst lfIdx = content.indexOf(\"\\n\");\n\tif (lfIdx === -1 || crlfIdx === -1) return \"\\n\";\n\treturn crlfIdx < lfIdx ? \"\\r\\n\" : \"\\n\";\n}\n\nexport function toLF(text: string): string {\n\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nexport function restoreEndings(text: string, ending: LineEnding): string {\n\treturn ending === \"\\r\\n\" ? text.replace(/\\n/g, \"\\r\\n\") : text;\n}\n\ninterface StrippedBomContent {\n\tbom: string;\n\ttext: string;\n}\n\ninterface HashlineDiffResult {\n\tdiff: string;\n\tfirstChangedLine: number | undefined;\n}\n\nexport function stripBOM(content: string): StrippedBomContent {\n\treturn content.startsWith(\"\\uFEFF\") ? { bom: \"\\uFEFF\", text: content.slice(1) } : { bom: \"\", text: content };\n}\n\nfunction fmtDiffLine(prefix: DiffLinePrefix, line: string, hash: string | undefined): string {\n\tif (hash === undefined) {\n\t\treturn `${prefix}${\" \".repeat(ANCHOR_LEN)}${HASH_SEP}${line}`;\n\t}\n\treturn `${prefix}${hash}${HASH_SEP}${line}`;\n}\ninterface DiffRenderState {\n\toutput: string[];\n\tnewLineNumber: number;\n\tlastPartWasChange: boolean;\n\tfirstChangedLine: number | undefined;\n}\n\ninterface DiffContextWindow {\n\tlines: string[];\n\tskippedStartLines: number;\n\tskippedMiddleLines: number;\n}\n\nconst DIFF_ELLIPSIS_MARKER = \"__ELLIPSIS__\";\n\nfunction getDiffDisplayLines(part: Diff.Change): string[] {\n\tconst lines = part.value.split(\"\\n\");\n\tif (lines[lines.length - 1] === \"\") lines.pop();\n\treturn lines;\n}\n\nfunction isChangedPart(part: Diff.Change): boolean {\n\treturn part.added || part.removed;\n}\n\nfunction renderChangedLines(\n\tpart: Diff.Change,\n\tlines: string[],\n\tnewContentHashes: string[],\n\tstate: DiffRenderState,\n): void {\n\tif (state.firstChangedLine === undefined) state.firstChangedLine = state.newLineNumber;\n\tfor (const line of lines) {\n\t\tif (part.added) {\n\t\t\tconst hash = newContentHashes[state.newLineNumber - 1];\n\t\t\tstate.output.push(fmtDiffLine(\"+\", line, hash));\n\t\t\tstate.newLineNumber++;\n\t\t} else {\n\t\t\tstate.output.push(fmtDiffLine(\"-\", line, undefined));\n\t\t}\n\t}\n\tstate.lastPartWasChange = true;\n}\n\nfunction selectDiffContextWindow(\n\tlines: string[],\n\tlastPartWasChange: boolean,\n\tnextPartIsChange: boolean,\n\tcontextLines: number,\n): DiffContextWindow {\n\tif (!lastPartWasChange) {\n\t\tconst skippedStartLines = Math.max(0, lines.length - contextLines);\n\t\treturn { lines: lines.slice(skippedStartLines), skippedStartLines, skippedMiddleLines: 0 };\n\t}\n\tif (nextPartIsChange && lines.length > contextLines * 2) {\n\t\treturn {\n\t\t\tlines: [...lines.slice(0, contextLines), DIFF_ELLIPSIS_MARKER, ...lines.slice(-contextLines)],\n\t\t\tskippedStartLines: 0,\n\t\t\tskippedMiddleLines: lines.length - contextLines * 2,\n\t\t};\n\t}\n\treturn {\n\t\tlines: lines.length > contextLines ? lines.slice(0, contextLines) : lines,\n\t\tskippedStartLines: 0,\n\t\tskippedMiddleLines: 0,\n\t};\n}\n\nfunction renderDiffContext(window: DiffContextWindow, newContentHashes: string[], state: DiffRenderState): void {\n\tif (window.skippedStartLines > 0) {\n\t\tstate.output.push(\" ...\");\n\t\tstate.newLineNumber += window.skippedStartLines;\n\t}\n\tfor (const line of window.lines) {\n\t\tif (line === DIFF_ELLIPSIS_MARKER) {\n\t\t\tstate.output.push(\" ...\");\n\t\t\tstate.newLineNumber += window.skippedMiddleLines;\n\t\t\tcontinue;\n\t\t}\n\t\tconst hash = newContentHashes[state.newLineNumber - 1];\n\t\tstate.output.push(fmtDiffLine(\" \", line, hash));\n\t\tstate.newLineNumber++;\n\t}\n}\n\nexport function genDiff(\n\toldContent: string,\n\tnewContent: string,\n\tcontextLines = 2,\n\tnewContentHashes?: string[],\n\t_oldHashes?: string[],\n): HashlineDiffResult {\n\t// Run Diff.diffLines on raw content only (no hash annotations) so that\n\t// lines whose content is identical are never reported as changed even\n\t// when their hash differs due to collision resolution or position\n\t// tracking. Hashes are used purely for display via fmtDiffLine.\n\tconst effectiveNewHashes = newContentHashes ?? _lineHashesPure(newContent);\n\tconst parts = Diff.diffLines(oldContent, newContent);\n\tconst state: DiffRenderState = {\n\t\toutput: [],\n\t\tnewLineNumber: 1,\n\t\tlastPartWasChange: false,\n\t\tfirstChangedLine: undefined,\n\t};\n\n\tfor (let index = 0; index < parts.length; index++) {\n\t\tconst part = parts[index]!;\n\t\tconst displayLines = getDiffDisplayLines(part);\n\t\tif (isChangedPart(part)) {\n\t\t\trenderChangedLines(part, displayLines, effectiveNewHashes, state);\n\t\t\tcontinue;\n\t\t}\n\t\tconst nextPart = parts[index + 1];\n\t\tconst nextPartIsChange = nextPart !== undefined && isChangedPart(nextPart);\n\t\tif (state.lastPartWasChange || nextPartIsChange) {\n\t\t\tconst window = selectDiffContextWindow(displayLines, state.lastPartWasChange, nextPartIsChange, contextLines);\n\t\t\trenderDiffContext(window, effectiveNewHashes, state);\n\t\t} else {\n\t\t\tstate.newLineNumber += displayLines.length;\n\t\t}\n\t\tstate.lastPartWasChange = false;\n\t}\n\n\treturn { diff: state.output.join(\"\\n\"), firstChangedLine: state.firstChangedLine };\n}\n"]}
1
+ {"version":3,"file":"replace-diff.d.ts","sourceRoot":"","sources":["../../../src/core/tools/replace-diff.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;AAGvC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAKxD;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAEvE;AAED,UAAU,kBAAkB;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACb;AAED,UAAU,kBAAkB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAE5D;AA6FD,wBAAgB,OAAO,CACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,YAAY,SAAI,EAChB,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,GACnB,kBAAkB,CAiCpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"replace-diff.js","sourceRoot":"","sources":["../../../src/core/tools/replace-diff.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Diff from \"diff\";\nimport { _lineHashesPure, ANCHOR_LEN, HASH_SEP } from \"./hashline/hash.ts\";\n\nexport type LineEnding = \"\\r\\n\" | \"\\n\";\ntype DiffLinePrefix = \" \" | \"+\" | \"-\";\n\nexport function detectEnding(content: string): LineEnding {\n\tconst crlfIdx = content.indexOf(\"\\r\\n\");\n\tconst lfIdx = content.indexOf(\"\\n\");\n\tif (lfIdx === -1 || crlfIdx === -1) return \"\\n\";\n\treturn crlfIdx < lfIdx ? \"\\r\\n\" : \"\\n\";\n}\n\nexport function toLF(text: string): string {\n\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nexport function restoreEndings(text: string, ending: LineEnding): string {\n\treturn ending === \"\\r\\n\" ? text.replace(/\\n/g, \"\\r\\n\") : text;\n}\n\ninterface StrippedBomContent {\n\tbom: string;\n\ttext: string;\n}\n\ninterface HashlineDiffResult {\n\tdiff: string;\n\tfirstChangedLine: number | undefined;\n}\n\nexport function stripBOM(content: string): StrippedBomContent {\n\treturn content.startsWith(\"\\uFEFF\") ? { bom: \"\\uFEFF\", text: content.slice(1) } : { bom: \"\", text: content };\n}\n\nfunction fmtDiffLine(prefix: DiffLinePrefix, line: string, hash: string | undefined): string {\n\tif (hash === undefined) {\n\t\treturn `${prefix}${\" \".repeat(ANCHOR_LEN)}${HASH_SEP}${line}`;\n\t}\n\treturn `${prefix}${hash}${HASH_SEP}${line}`;\n}\ninterface DiffRenderState {\n\toutput: string[];\n\tnewLineNumber: number;\n\tlastPartWasChange: boolean;\n\tfirstChangedLine: number | undefined;\n}\n\ninterface DiffContextWindow {\n\tlines: string[];\n\tskippedStartLines: number;\n\tskippedMiddleLines: number;\n}\n\nconst DIFF_ELLIPSIS_MARKER = \"__ELLIPSIS__\";\n\nfunction getDiffDisplayLines(part: Diff.Change): string[] {\n\tconst lines = part.value.split(\"\\n\");\n\tif (lines[lines.length - 1] === \"\") lines.pop();\n\treturn lines;\n}\n\nfunction isChangedPart(part: Diff.Change): boolean {\n\treturn part.added || part.removed;\n}\n\nfunction renderChangedLines(\n\tpart: Diff.Change,\n\tlines: string[],\n\tnewContentHashes: string[],\n\tstate: DiffRenderState,\n): void {\n\tif (state.firstChangedLine === undefined) state.firstChangedLine = state.newLineNumber;\n\tfor (const line of lines) {\n\t\tif (part.added) {\n\t\t\tconst hash = newContentHashes[state.newLineNumber - 1];\n\t\t\tstate.output.push(fmtDiffLine(\"+\", line, hash));\n\t\t\tstate.newLineNumber++;\n\t\t} else {\n\t\t\tstate.output.push(fmtDiffLine(\"-\", line, undefined));\n\t\t}\n\t}\n\tstate.lastPartWasChange = true;\n}\n\nfunction selectDiffContextWindow(\n\tlines: string[],\n\tlastPartWasChange: boolean,\n\tnextPartIsChange: boolean,\n\tcontextLines: number,\n): DiffContextWindow {\n\tif (!lastPartWasChange) {\n\t\tconst skippedStartLines = Math.max(0, lines.length - contextLines);\n\t\treturn { lines: lines.slice(skippedStartLines), skippedStartLines, skippedMiddleLines: 0 };\n\t}\n\tif (nextPartIsChange && lines.length > contextLines * 2) {\n\t\treturn {\n\t\t\tlines: [...lines.slice(0, contextLines), DIFF_ELLIPSIS_MARKER, ...lines.slice(-contextLines)],\n\t\t\tskippedStartLines: 0,\n\t\t\tskippedMiddleLines: lines.length - contextLines * 2,\n\t\t};\n\t}\n\treturn {\n\t\tlines: lines.length > contextLines ? lines.slice(0, contextLines) : lines,\n\t\tskippedStartLines: 0,\n\t\tskippedMiddleLines: 0,\n\t};\n}\n\nfunction renderDiffContext(window: DiffContextWindow, newContentHashes: string[], state: DiffRenderState): void {\n\tif (window.skippedStartLines > 0) {\n\t\tstate.output.push(\" ...\");\n\t\tstate.newLineNumber += window.skippedStartLines;\n\t}\n\tfor (const line of window.lines) {\n\t\tif (line === DIFF_ELLIPSIS_MARKER) {\n\t\t\tstate.output.push(\" ...\");\n\t\t\tstate.newLineNumber += window.skippedMiddleLines;\n\t\t\tcontinue;\n\t\t}\n\t\tconst hash = newContentHashes[state.newLineNumber - 1];\n\t\tstate.output.push(fmtDiffLine(\" \", line, hash));\n\t\tstate.newLineNumber++;\n\t}\n}\n\nexport function genDiff(\n\toldContent: string,\n\tnewContent: string,\n\tcontextLines = 2,\n\tnewContentHashes?: string[],\n\t_oldHashes?: string[],\n): HashlineDiffResult {\n\t// Run Diff.diffLines on raw content only (no hash annotations) so that\n\t// lines whose content is identical are never reported as changed even\n\t// when their hash differs due to collision resolution or position\n\t// tracking. Hashes are used purely for display via fmtDiffLine.\n\tconst effectiveNewHashes = newContentHashes ?? _lineHashesPure(newContent);\n\tconst parts = Diff.diffLines(oldContent, newContent);\n\tconst state: DiffRenderState = {\n\t\toutput: [],\n\t\tnewLineNumber: 1,\n\t\tlastPartWasChange: false,\n\t\tfirstChangedLine: undefined,\n\t};\n\n\tfor (let index = 0; index < parts.length; index++) {\n\t\tconst part = parts[index]!;\n\t\tconst displayLines = getDiffDisplayLines(part);\n\t\tif (isChangedPart(part)) {\n\t\t\trenderChangedLines(part, displayLines, effectiveNewHashes, state);\n\t\t\tcontinue;\n\t\t}\n\t\tconst nextPart = parts[index + 1];\n\t\tconst nextPartIsChange = nextPart !== undefined && isChangedPart(nextPart);\n\t\tif (state.lastPartWasChange || nextPartIsChange) {\n\t\t\tconst window = selectDiffContextWindow(displayLines, state.lastPartWasChange, nextPartIsChange, contextLines);\n\t\t\trenderDiffContext(window, effectiveNewHashes, state);\n\t\t} else {\n\t\t\tstate.newLineNumber += displayLines.length;\n\t\t}\n\t\tstate.lastPartWasChange = false;\n\t}\n\n\treturn { diff: state.output.join(\"\\n\"), firstChangedLine: state.firstChangedLine };\n}\n"]}
1
+ {"version":3,"file":"replace-diff.js","sourceRoot":"","sources":["../../../src/core/tools/replace-diff.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Diff from \"diff\";\nimport { _lineHashesPure, ANCHOR_LEN, HASH_SEP } from \"./hashline/hash.ts\";\n\nexport type LineEnding = \"\\r\\n\" | \"\\n\";\ntype DiffLinePrefix = \" \" | \"+\" | \"-\";\n\nexport function detectEnding(content: string): LineEnding {\n\tconst crlfIdx = content.indexOf(\"\\r\\n\");\n\tconst lfIdx = content.indexOf(\"\\n\");\n\tif (lfIdx === -1 || crlfIdx === -1) return \"\\n\";\n\treturn crlfIdx < lfIdx ? \"\\r\\n\" : \"\\n\";\n}\n\nexport function toLF(text: string): string {\n\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nexport function restoreEndings(text: string, ending: LineEnding): string {\n\treturn ending === \"\\r\\n\" ? text.replace(/\\n/g, \"\\r\\n\") : text;\n}\n\ninterface StrippedBomContent {\n\tbom: string;\n\ttext: string;\n}\n\ninterface HashlineDiffResult {\n\tdiff: string;\n\tfirstChangedLine: number | undefined;\n}\n\nexport function stripBOM(content: string): StrippedBomContent {\n\treturn content.startsWith(\"\\uFEFF\") ? { bom: \"\\uFEFF\", text: content.slice(1) } : { bom: \"\", text: content };\n}\n\nfunction fmtDiffLine(prefix: DiffLinePrefix, line: string, hash: string | undefined): string {\n\tif (hash === undefined) {\n\t\treturn `${prefix}${\" \".repeat(ANCHOR_LEN)}${HASH_SEP}${line}`;\n\t}\n\treturn `${prefix}${hash}${HASH_SEP}${line}`;\n}\ninterface DiffRenderState {\n\toutput: string[];\n\tnewLineNumber: number;\n\tlastPartWasChange: boolean;\n\tfirstChangedLine: number | undefined;\n}\n\ninterface DiffContextWindow {\n\tlines: string[];\n\tskippedStartLines: number;\n\tskippedMiddleLines: number;\n}\n\nconst DIFF_ELLIPSIS_MARKER = \"__ELLIPSIS__\";\n\nfunction getDiffDisplayLines(part: Diff.Change): string[] {\n\tconst lines = part.value.split(\"\\n\");\n\tif (lines[lines.length - 1] === \"\") lines.pop();\n\treturn lines;\n}\n\nfunction isChangedPart(part: Diff.Change): boolean {\n\treturn part.added || part.removed;\n}\n\nfunction renderChangedLines(\n\tpart: Diff.Change,\n\tlines: string[],\n\tnewContentHashes: string[],\n\tstate: DiffRenderState,\n): void {\n\tif (state.firstChangedLine === undefined) state.firstChangedLine = state.newLineNumber;\n\tfor (const line of lines) {\n\t\tif (part.added) {\n\t\t\tconst hash = newContentHashes[state.newLineNumber - 1];\n\t\t\tstate.output.push(fmtDiffLine(\"+\", line, hash));\n\t\t\tstate.newLineNumber++;\n\t\t} else {\n\t\t\tstate.output.push(fmtDiffLine(\"-\", line, undefined));\n\t\t}\n\t}\n\tstate.lastPartWasChange = true;\n}\n\nfunction selectDiffContextWindow(\n\tlines: string[],\n\tlastPartWasChange: boolean,\n\tnextPartIsChange: boolean,\n\tcontextLines: number,\n): DiffContextWindow {\n\tif (!lastPartWasChange) {\n\t\tconst skippedStartLines = Math.max(0, lines.length - contextLines);\n\t\treturn { lines: lines.slice(skippedStartLines), skippedStartLines, skippedMiddleLines: 0 };\n\t}\n\tif (nextPartIsChange && lines.length > contextLines * 2) {\n\t\treturn {\n\t\t\tlines: [...lines.slice(0, contextLines), DIFF_ELLIPSIS_MARKER, ...lines.slice(-contextLines)],\n\t\t\tskippedStartLines: 0,\n\t\t\tskippedMiddleLines: lines.length - contextLines * 2,\n\t\t};\n\t}\n\treturn {\n\t\tlines: lines.length > contextLines ? lines.slice(0, contextLines) : lines,\n\t\tskippedStartLines: 0,\n\t\tskippedMiddleLines: 0,\n\t};\n}\n\nfunction renderDiffContext(window: DiffContextWindow, newContentHashes: string[], state: DiffRenderState): void {\n\tif (window.skippedStartLines > 0) {\n\t\tstate.output.push(\" ...\");\n\t\tstate.newLineNumber += window.skippedStartLines;\n\t}\n\tfor (const line of window.lines) {\n\t\tif (line === DIFF_ELLIPSIS_MARKER) {\n\t\t\tstate.output.push(\" ...\");\n\t\t\tstate.newLineNumber += window.skippedMiddleLines;\n\t\t\tcontinue;\n\t\t}\n\t\tconst hash = newContentHashes[state.newLineNumber - 1];\n\t\tstate.output.push(fmtDiffLine(\" \", line, hash));\n\t\tstate.newLineNumber++;\n\t}\n}\n\nexport function genDiff(\n\toldContent: string,\n\tnewContent: string,\n\tcontextLines = 2,\n\tnewContentHashes?: string[],\n\t_oldHashes?: string[],\n): HashlineDiffResult {\n\t// Run Diff.diffLines on raw content only (no hash annotations) so that\n\t// lines whose content is identical are never reported as changed even\n\t// when their hash differs due to collision resolution or position\n\t// tracking. Hashes are used purely for display via fmtDiffLine.\n\tconst effectiveNewHashes = newContentHashes ?? _lineHashesPure(newContent);\n\tconst parts = Diff.diffLines(oldContent, newContent);\n\tconst state: DiffRenderState = {\n\t\toutput: [],\n\t\tnewLineNumber: 1,\n\t\tlastPartWasChange: false,\n\t\tfirstChangedLine: undefined,\n\t};\n\n\tfor (let index = 0; index < parts.length; index++) {\n\t\tconst part = parts[index]!;\n\t\tconst displayLines = getDiffDisplayLines(part);\n\t\tif (isChangedPart(part)) {\n\t\t\trenderChangedLines(part, displayLines, effectiveNewHashes, state);\n\t\t\tcontinue;\n\t\t}\n\t\tconst nextPart = parts[index + 1];\n\t\tconst nextPartIsChange = nextPart !== undefined && isChangedPart(nextPart);\n\t\tif (state.lastPartWasChange || nextPartIsChange) {\n\t\t\tconst window = selectDiffContextWindow(displayLines, state.lastPartWasChange, nextPartIsChange, contextLines);\n\t\t\trenderDiffContext(window, effectiveNewHashes, state);\n\t\t} else {\n\t\t\tstate.newLineNumber += displayLines.length;\n\t\t}\n\t\tstate.lastPartWasChange = false;\n\t}\n\n\treturn { diff: state.output.join(\"\\n\"), firstChangedLine: state.firstChangedLine };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"replace-normalize.d.ts","sourceRoot":"","sources":["../../../src/core/tools/replace-normalize.ts"],"names":[],"mappings":"AA8CA,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAsC/C","sourcesContent":["import { has, isRec } from \"./hashline-utils.ts\";\n\nfunction tryParseJSON<T>(value: unknown, guard: (v: unknown) => v is T): T | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(value);\n\t\tif (guard(parsed)) return parsed;\n\t} catch {}\n\treturn undefined;\n}\n\n/**\n * Coerces an array of edit items: JSON-string items → objects,\n * JSON-string content_lines → string arrays. Shared by the `changes`\n * and `edits` normalization branches.\n */\nfunction coerceEditArray(items: unknown[]): unknown[] {\n\treturn items.map((item: unknown) => {\n\t\tconst change = tryParseJSON(item, isRec) ?? item;\n\t\tif (!isRec(change)) return change;\n\t\tif (typeof change.content_lines !== \"string\") return change;\n\t\tconst parsed = tryParseJSON(\n\t\t\tchange.content_lines,\n\t\t\t(v): v is string[] => Array.isArray(v) && v.every((i) => typeof i === \"string\"),\n\t\t);\n\t\treturn parsed ? { ...change, content_lines: parsed } : change;\n\t});\n}\n\n/**\n * Normalizes a field from `from` to `to`: JSON-string arrays → real arrays,\n * single objects → wrapped in array. Shared by the `changes` and `edits`\n * normalization branches.\n */\nfunction normalizeField(record: Record<string, unknown>, from: string, to: string): void {\n\tif (!has(record, from)) return;\n\tconst raw = tryParseJSON(record[from], Array.isArray) ?? record[from];\n\tif (Array.isArray(raw)) {\n\t\trecord[to] = coerceEditArray(raw);\n\t} else {\n\t\tconst single = typeof raw === \"string\" ? tryParseJSON(raw, isRec) : isRec(raw) ? raw : undefined;\n\t\tif (single) record[to] = coerceEditArray([single]);\n\t}\n\tif (from !== to) delete record[from];\n}\n\nexport function normReq(input: unknown): unknown {\n\tif (!isRec(input)) {\n\t\treturn input;\n\t}\n\n\tconst record: Record<string, unknown> = { ...input };\n\n\tif (typeof record.path !== \"string\" && typeof record.file_path === \"string\") {\n\t\trecord.path = record.file_path;\n\t\tdelete record.file_path;\n\t}\n\n\tnormalizeField(record, \"changes\", \"changes\");\n\tnormalizeField(record, \"edits\", \"changes\");\n\n\t// Handle flat format: hash_range_inclusive and content_lines at top level\n\t// (no changes array). Wrap them into a single-element changes array.\n\tif (!Array.isArray(record.changes) && has(record, \"hash_range_inclusive\") && has(record, \"content_lines\")) {\n\t\tconst hri =\n\t\t\ttryParseJSON(\n\t\t\t\trecord.hash_range_inclusive,\n\t\t\t\t(v): v is string[] => Array.isArray(v) && v.length === 2 && v.every((i) => typeof i === \"string\"),\n\t\t\t) ?? record.hash_range_inclusive;\n\n\t\tconst cl =\n\t\t\ttryParseJSON(\n\t\t\t\trecord.content_lines,\n\t\t\t\t(v): v is string[] => Array.isArray(v) && v.every((i) => typeof i === \"string\"),\n\t\t\t) ?? record.content_lines;\n\n\t\tif (Array.isArray(hri) && Array.isArray(cl)) {\n\t\t\trecord.changes = [{ hash_range_inclusive: hri, content_lines: cl }];\n\t\t\tdelete record.hash_range_inclusive;\n\t\t\tdelete record.content_lines;\n\t\t}\n\t}\n\n\treturn record;\n}\n"]}
1
+ {"version":3,"file":"replace-normalize.d.ts","sourceRoot":"","sources":["../../../src/core/tools/replace-normalize.ts"],"names":[],"mappings":"AA8CA,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAsC/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"replace-normalize.js","sourceRoot":"","sources":["../../../src/core/tools/replace-normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import { has, isRec } from \"./hashline-utils.ts\";\n\nfunction tryParseJSON<T>(value: unknown, guard: (v: unknown) => v is T): T | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(value);\n\t\tif (guard(parsed)) return parsed;\n\t} catch {}\n\treturn undefined;\n}\n\n/**\n * Coerces an array of edit items: JSON-string items → objects,\n * JSON-string content_lines → string arrays. Shared by the `changes`\n * and `edits` normalization branches.\n */\nfunction coerceEditArray(items: unknown[]): unknown[] {\n\treturn items.map((item: unknown) => {\n\t\tconst change = tryParseJSON(item, isRec) ?? item;\n\t\tif (!isRec(change)) return change;\n\t\tif (typeof change.content_lines !== \"string\") return change;\n\t\tconst parsed = tryParseJSON(\n\t\t\tchange.content_lines,\n\t\t\t(v): v is string[] => Array.isArray(v) && v.every((i) => typeof i === \"string\"),\n\t\t);\n\t\treturn parsed ? { ...change, content_lines: parsed } : change;\n\t});\n}\n\n/**\n * Normalizes a field from `from` to `to`: JSON-string arrays → real arrays,\n * single objects → wrapped in array. Shared by the `changes` and `edits`\n * normalization branches.\n */\nfunction normalizeField(record: Record<string, unknown>, from: string, to: string): void {\n\tif (!has(record, from)) return;\n\tconst raw = tryParseJSON(record[from], Array.isArray) ?? record[from];\n\tif (Array.isArray(raw)) {\n\t\trecord[to] = coerceEditArray(raw);\n\t} else {\n\t\tconst single = typeof raw === \"string\" ? tryParseJSON(raw, isRec) : isRec(raw) ? raw : undefined;\n\t\tif (single) record[to] = coerceEditArray([single]);\n\t}\n\tif (from !== to) delete record[from];\n}\n\nexport function normReq(input: unknown): unknown {\n\tif (!isRec(input)) {\n\t\treturn input;\n\t}\n\n\tconst record: Record<string, unknown> = { ...input };\n\n\tif (typeof record.path !== \"string\" && typeof record.file_path === \"string\") {\n\t\trecord.path = record.file_path;\n\t\tdelete record.file_path;\n\t}\n\n\tnormalizeField(record, \"changes\", \"changes\");\n\tnormalizeField(record, \"edits\", \"changes\");\n\n\t// Handle flat format: hash_range_inclusive and content_lines at top level\n\t// (no changes array). Wrap them into a single-element changes array.\n\tif (!Array.isArray(record.changes) && has(record, \"hash_range_inclusive\") && has(record, \"content_lines\")) {\n\t\tconst hri =\n\t\t\ttryParseJSON(\n\t\t\t\trecord.hash_range_inclusive,\n\t\t\t\t(v): v is string[] => Array.isArray(v) && v.length === 2 && v.every((i) => typeof i === \"string\"),\n\t\t\t) ?? record.hash_range_inclusive;\n\n\t\tconst cl =\n\t\t\ttryParseJSON(\n\t\t\t\trecord.content_lines,\n\t\t\t\t(v): v is string[] => Array.isArray(v) && v.every((i) => typeof i === \"string\"),\n\t\t\t) ?? record.content_lines;\n\n\t\tif (Array.isArray(hri) && Array.isArray(cl)) {\n\t\t\trecord.changes = [{ hash_range_inclusive: hri, content_lines: cl }];\n\t\t\tdelete record.hash_range_inclusive;\n\t\t\tdelete record.content_lines;\n\t\t}\n\t}\n\n\treturn record;\n}\n"]}
1
+ {"version":3,"file":"replace-normalize.js","sourceRoot":"","sources":["../../../src/core/tools/replace-normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import { has, isRec } from \"./hashline-utils.ts\";\n\nfunction tryParseJSON<T>(value: unknown, guard: (v: unknown) => v is T): T | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(value);\n\t\tif (guard(parsed)) return parsed;\n\t} catch {}\n\treturn undefined;\n}\n\n/**\n * Coerces an array of edit items: JSON-string items → objects,\n * JSON-string content_lines → string arrays. Shared by the `changes`\n * and `edits` normalization branches.\n */\nfunction coerceEditArray(items: unknown[]): unknown[] {\n\treturn items.map((item: unknown) => {\n\t\tconst change = tryParseJSON(item, isRec) ?? item;\n\t\tif (!isRec(change)) return change;\n\t\tif (typeof change.content_lines !== \"string\") return change;\n\t\tconst parsed = tryParseJSON(\n\t\t\tchange.content_lines,\n\t\t\t(v): v is string[] => Array.isArray(v) && v.every((i) => typeof i === \"string\"),\n\t\t);\n\t\treturn parsed ? { ...change, content_lines: parsed } : change;\n\t});\n}\n\n/**\n * Normalizes a field from `from` to `to`: JSON-string arrays → real arrays,\n * single objects → wrapped in array. Shared by the `changes` and `edits`\n * normalization branches.\n */\nfunction normalizeField(record: Record<string, unknown>, from: string, to: string): void {\n\tif (!has(record, from)) return;\n\tconst raw = tryParseJSON(record[from], Array.isArray) ?? record[from];\n\tif (Array.isArray(raw)) {\n\t\trecord[to] = coerceEditArray(raw);\n\t} else {\n\t\tconst single = typeof raw === \"string\" ? tryParseJSON(raw, isRec) : isRec(raw) ? raw : undefined;\n\t\tif (single) record[to] = coerceEditArray([single]);\n\t}\n\tif (from !== to) delete record[from];\n}\n\nexport function normReq(input: unknown): unknown {\n\tif (!isRec(input)) {\n\t\treturn input;\n\t}\n\n\tconst record: Record<string, unknown> = { ...input };\n\n\tif (typeof record.path !== \"string\" && typeof record.file_path === \"string\") {\n\t\trecord.path = record.file_path;\n\t\tdelete record.file_path;\n\t}\n\n\tnormalizeField(record, \"changes\", \"changes\");\n\tnormalizeField(record, \"edits\", \"changes\");\n\n\t// Handle flat format: hash_range_inclusive and content_lines at top level\n\t// (no changes array). Wrap them into a single-element changes array.\n\tif (!Array.isArray(record.changes) && has(record, \"hash_range_inclusive\") && has(record, \"content_lines\")) {\n\t\tconst hri =\n\t\t\ttryParseJSON(\n\t\t\t\trecord.hash_range_inclusive,\n\t\t\t\t(v): v is string[] => Array.isArray(v) && v.length === 2 && v.every((i) => typeof i === \"string\"),\n\t\t\t) ?? record.hash_range_inclusive;\n\n\t\tconst cl =\n\t\t\ttryParseJSON(\n\t\t\t\trecord.content_lines,\n\t\t\t\t(v): v is string[] => Array.isArray(v) && v.every((i) => typeof i === \"string\"),\n\t\t\t) ?? record.content_lines;\n\n\t\tif (Array.isArray(hri) && Array.isArray(cl)) {\n\t\t\trecord.changes = [{ hash_range_inclusive: hri, content_lines: cl }];\n\t\t\tdelete record.hash_range_inclusive;\n\t\t\tdelete record.content_lines;\n\t\t}\n\t}\n\n\treturn record;\n}\n"]}
@@ -45,7 +45,7 @@ export declare function mkMdTheme(theme: MdTheme): {
45
45
  italic: (text: string) => string;
46
46
  underline: (text: string) => string;
47
47
  strikethrough: (text: string) => string;
48
- highlightCode: (code: string, lang?: string | undefined) => string[];
48
+ highlightCode: (code: string, lang?: string) => string[];
49
49
  };
50
50
  export {};
51
51
  //# sourceMappingURL=replace-render.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replace-render.d.ts","sourceRoot":"","sources":["../../../src/core/tools/replace-render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAK3D,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACpC,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;AAC/C,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,eAAe,CAAC,CAAC;AAE5F,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,OAAO,GAAG;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAqB/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,EAAE,CAUhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,CAS9E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,CAE1D;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAmB5G;AAED,UAAU,yBAAyB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAOD,UAAU,uBAAuB;IAChC,OAAO,CAAC,EAAE,yBAAyB,EAAE,CAAC;CACtC;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,GAAG,SAAS,CAKjF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE5E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAKtE;AAED,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,KAAK,EAAE,GAAG,GACR,MAAM,GAAG,SAAS,CAWpB;AAyBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqChD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;EA+BvC","sourcesContent":["import type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ReplaceDetails, ReqParams } from \"./edit.ts\";\nimport type { HTEdit } from \"./hashline/resolve.ts\";\nimport { isRec } from \"./hashline-utils.ts\";\nimport { normReq } from \"./replace-normalize.ts\";\n\nexport type FgT = Pick<Theme, \"fg\">;\nexport type CallT = Pick<Theme, \"fg\" | \"bold\">;\nexport type MdTheme = Pick<Theme, \"fg\" | \"bold\" | \"italic\" | \"underline\" | \"strikethrough\">;\n\nexport type RPreview = { diff: string } | { error: string };\n\nexport type RRState = {\n\targsKey?: string;\n\tpreview?: RPreview;\n\tpreviewGeneration?: number;\n};\n\nexport function getPreviewInput(args: unknown): ReqParams | null {\n\tlet normalized: unknown;\n\ttry {\n\t\tnormalized = normReq(args);\n\t} catch {\n\t\treturn null;\n\t}\n\tif (!isRec(normalized) || typeof normalized.path !== \"string\") {\n\t\treturn null;\n\t}\n\n\tif (!Array.isArray(normalized.changes)) {\n\t\treturn null;\n\t}\n\n\tconst request: ReqParams = {\n\t\tpath: normalized.path,\n\t\tchanges: normalized.changes as HTEdit[],\n\t};\n\n\treturn request;\n}\n\nexport function colorLines(lines: string[], theme: FgT): string[] {\n\treturn lines.map((line) => {\n\t\tif (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n\t\t\treturn theme.fg(\"success\", line);\n\t\t}\n\t\tif (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n\t\t\treturn theme.fg(\"error\", line);\n\t\t}\n\t\treturn theme.fg(\"dim\", line);\n\t});\n}\n\nexport function fmtPreview(diff: string, expanded: boolean, theme: FgT): string {\n\tconst lines = diff.split(\"\\n\");\n\tconst maxLines = expanded ? 40 : 16;\n\tconst shown = colorLines(lines.slice(0, maxLines), theme);\n\n\tif (lines.length > maxLines) {\n\t\tshown.push(theme.fg(\"muted\", `... ${lines.length - maxLines} more diff lines`));\n\t}\n\treturn shown.join(\"\\n\");\n}\n\nexport function fmtResult(diff: string, theme: FgT): string {\n\treturn colorLines(diff.split(\"\\n\"), theme).join(\"\\n\");\n}\n\nexport function fmtCall(args: ReqParams | undefined, state: RRState, expanded: boolean, theme: CallT): string {\n\tconst path = args?.path;\n\tconst pathDisplay =\n\t\ttypeof path === \"string\" && path.length > 0 ? theme.fg(\"accent\", path) : theme.fg(\"toolOutput\", \"...\");\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"replace\"))} ${pathDisplay}`;\n\n\tif (!state.preview) {\n\t\treturn text;\n\t}\n\n\tif (\"error\" in state.preview) {\n\t\ttext += `\\n\\n${theme.fg(\"error\", state.preview.error)}`;\n\t\treturn text;\n\t}\n\n\tif (state.preview.diff) {\n\t\ttext += `\\n\\n${fmtPreview(state.preview.diff, expanded, theme)}`;\n\t}\n\treturn text;\n}\n// grip-ignore noNearIdenticalDataStructures: Replace rendering accepts minimal adapter input, while the test fixture captures streamed tool-update callback content.\ninterface ReplaceResultContentEntry {\n\ttype: string;\n\ttext?: string;\n}\n\ninterface ReplaceResultTextEntry extends ReplaceResultContentEntry {\n\ttype: \"text\";\n\ttext: string;\n}\n\ninterface ReplaceResultTextSource {\n\tcontent?: ReplaceResultContentEntry[];\n}\n\nexport function getResultText(result: ReplaceResultTextSource): string | undefined {\n\tconst textContent = result.content?.find(\n\t\t(entry): entry is ReplaceResultTextEntry => entry.type === \"text\" && typeof entry.text === \"string\",\n\t);\n\treturn textContent?.text;\n}\n\nexport function extractWarnings(text: string | undefined): string | undefined {\n\treturn text?.match(/(?:^|\\n)Warnings:\\n[\\s\\S]*$/)?.[0]?.trimStart();\n}\n\nexport function isApplied(details: ReplaceDetails | undefined): boolean {\n\tconst metrics = details?.metrics;\n\treturn (\n\t\tmetrics?.classification === \"applied\" && metrics.added_lines !== undefined && metrics.removed_lines !== undefined\n\t);\n}\n\nexport function buildAppliedText(\n\ttext: string | undefined,\n\tdetails: ReplaceDetails | undefined,\n\ttheme: FgT,\n): string | undefined {\n\tconst sections: string[] = [];\n\n\tif (details?.diff) {\n\t\tsections.push(fmtResult(details.diff, theme));\n\t}\n\n\tconst warnings = extractWarnings(text);\n\tif (warnings) sections.push(warnings);\n\n\treturn sections.length > 0 ? sections.join(\"\\n\\n\") : undefined;\n}\n\nfunction trimEmpty(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\n\twhile (start < end && lines[start] === \"\") {\n\t\tstart++;\n\t}\n\twhile (end > start && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\n\treturn lines.slice(start, end);\n}\n\nfunction isSectionBoundary(line: string): boolean {\n\treturn (\n\t\tline === \"--- Anchors ---\" ||\n\t\tline === \"Warnings:\" ||\n\t\tline === \"Structure outline:\" ||\n\t\t/^--- Range \\d+ ---$/.test(line)\n\t);\n}\n\nexport function fmtResultMd(text: string): string {\n\tconst lines = text.split(\"\\n\");\n\tconst sections: string[] = [];\n\tlet plainLines: string[] = [];\n\n\tconst flush = () => {\n\t\tconst trimmed = trimEmpty(plainLines);\n\t\tif (trimmed.length > 0) {\n\t\t\tsections.push(trimmed.join(\"\\n\"));\n\t\t}\n\t\tplainLines = [];\n\t};\n\n\tlet index = 0;\n\twhile (index < lines.length) {\n\t\tconst line = lines[index]!;\n\n\t\tif (line.startsWith(\"--- Anchors \")) {\n\t\t\tflush();\n\t\t\tconst title = line.replace(/^---\\s*/, \"\").replace(/\\s*---$/, \"\");\n\t\t\tindex++;\n\t\t\tconst bodyLines: string[] = [];\n\t\t\twhile (index < lines.length && !isSectionBoundary(lines[index]!)) {\n\t\t\t\tbodyLines.push(lines[index]!);\n\t\t\t\tindex++;\n\t\t\t}\n\t\t\tsections.push([`#### ${title}`, \"```text\", ...trimEmpty(bodyLines), \"```\"].join(\"\\n\"));\n\t\t\tcontinue;\n\t\t}\n\n\t\tplainLines.push(line);\n\t\tindex++;\n\t}\n\n\tflush();\n\n\treturn sections.join(\"\\n\\n\");\n}\n\nexport function mkMdTheme(theme: MdTheme) {\n\treturn {\n\t\theading: (text: string) => theme.fg(\"mdHeading\", text),\n\t\tlink: (text: string) => theme.fg(\"mdLink\", text),\n\t\tlinkUrl: (text: string) => theme.fg(\"mdLinkUrl\", text),\n\t\tcode: (text: string) => theme.fg(\"mdCode\", text),\n\t\tcodeBlock: (text: string) => theme.fg(\"mdCodeBlock\", text),\n\t\tcodeBlockBorder: (text: string) => theme.fg(\"mdCodeBlockBorder\", text),\n\t\tquote: (text: string) => theme.fg(\"mdQuote\", text),\n\t\tquoteBorder: (text: string) => theme.fg(\"mdQuoteBorder\", text),\n\t\thr: (text: string) => theme.fg(\"mdHr\", text),\n\t\tlistBullet: (text: string) => theme.fg(\"mdListBullet\", text),\n\t\tbold: (text: string) => theme.bold(text),\n\t\titalic: (text: string) => (theme.italic ? theme.italic(text) : text),\n\t\tunderline: (text: string) => (theme.underline ? theme.underline(text) : text),\n\t\tstrikethrough: (text: string) => (theme.strikethrough ? theme.strikethrough(text) : text),\n\t\thighlightCode: (code: string, lang?: string) =>\n\t\t\tcode.split(\"\\n\").map((line) => {\n\t\t\t\tif (lang === \"diff\") {\n\t\t\t\t\tif (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n\t\t\t\t\t\treturn theme.fg(\"toolDiffAdded\", line);\n\t\t\t\t\t}\n\t\t\t\t\tif (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n\t\t\t\t\t\treturn theme.fg(\"toolDiffRemoved\", line);\n\t\t\t\t\t}\n\t\t\t\t\treturn theme.fg(\"toolDiffContext\", line);\n\t\t\t\t}\n\n\t\t\t\treturn theme.fg(\"mdCodeBlock\", line);\n\t\t\t}),\n\t};\n}\n"]}
1
+ {"version":3,"file":"replace-render.d.ts","sourceRoot":"","sources":["../../../src/core/tools/replace-render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAK3D,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACpC,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;AAC/C,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,eAAe,CAAC,CAAC;AAE5F,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,OAAO,GAAG;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAqB/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,EAAE,CAUhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,CAS9E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,CAE1D;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAmB5G;AAED,UAAU,yBAAyB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAOD,UAAU,uBAAuB;IAChC,OAAO,CAAC,EAAE,yBAAyB,EAAE,CAAC;CACtC;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,GAAG,SAAS,CAKjF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE5E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAKtE;AAED,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,KAAK,EAAE,GAAG,GACR,MAAM,GAAG,SAAS,CAWpB;AAyBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqChD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO;IAEtC,OAAO,SAAS,MAAM;IACtB,IAAI,SAAS,MAAM;IACnB,OAAO,SAAS,MAAM;IACtB,IAAI,SAAS,MAAM;IACnB,SAAS,SAAS,MAAM;IACxB,eAAe,SAAS,MAAM;IAC9B,KAAK,SAAS,MAAM;IACpB,WAAW,SAAS,MAAM;IAC1B,EAAE,SAAS,MAAM;IACjB,UAAU,SAAS,MAAM;IACzB,IAAI,SAAS,MAAM;IACnB,MAAM,SAAS,MAAM;IACrB,SAAS,SAAS,MAAM;IACxB,aAAa,SAAS,MAAM;IAC5B,aAAa,SAAS,MAAM,SAAS,MAAM;EAe5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"replace-render.js","sourceRoot":"","sources":["../../../src/core/tools/replace-render.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ReplaceDetails, ReqParams } from \"./edit.ts\";\nimport type { HTEdit } from \"./hashline/resolve.ts\";\nimport { isRec } from \"./hashline-utils.ts\";\nimport { normReq } from \"./replace-normalize.ts\";\n\nexport type FgT = Pick<Theme, \"fg\">;\nexport type CallT = Pick<Theme, \"fg\" | \"bold\">;\nexport type MdTheme = Pick<Theme, \"fg\" | \"bold\" | \"italic\" | \"underline\" | \"strikethrough\">;\n\nexport type RPreview = { diff: string } | { error: string };\n\nexport type RRState = {\n\targsKey?: string;\n\tpreview?: RPreview;\n\tpreviewGeneration?: number;\n};\n\nexport function getPreviewInput(args: unknown): ReqParams | null {\n\tlet normalized: unknown;\n\ttry {\n\t\tnormalized = normReq(args);\n\t} catch {\n\t\treturn null;\n\t}\n\tif (!isRec(normalized) || typeof normalized.path !== \"string\") {\n\t\treturn null;\n\t}\n\n\tif (!Array.isArray(normalized.changes)) {\n\t\treturn null;\n\t}\n\n\tconst request: ReqParams = {\n\t\tpath: normalized.path,\n\t\tchanges: normalized.changes as HTEdit[],\n\t};\n\n\treturn request;\n}\n\nexport function colorLines(lines: string[], theme: FgT): string[] {\n\treturn lines.map((line) => {\n\t\tif (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n\t\t\treturn theme.fg(\"success\", line);\n\t\t}\n\t\tif (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n\t\t\treturn theme.fg(\"error\", line);\n\t\t}\n\t\treturn theme.fg(\"dim\", line);\n\t});\n}\n\nexport function fmtPreview(diff: string, expanded: boolean, theme: FgT): string {\n\tconst lines = diff.split(\"\\n\");\n\tconst maxLines = expanded ? 40 : 16;\n\tconst shown = colorLines(lines.slice(0, maxLines), theme);\n\n\tif (lines.length > maxLines) {\n\t\tshown.push(theme.fg(\"muted\", `... ${lines.length - maxLines} more diff lines`));\n\t}\n\treturn shown.join(\"\\n\");\n}\n\nexport function fmtResult(diff: string, theme: FgT): string {\n\treturn colorLines(diff.split(\"\\n\"), theme).join(\"\\n\");\n}\n\nexport function fmtCall(args: ReqParams | undefined, state: RRState, expanded: boolean, theme: CallT): string {\n\tconst path = args?.path;\n\tconst pathDisplay =\n\t\ttypeof path === \"string\" && path.length > 0 ? theme.fg(\"accent\", path) : theme.fg(\"toolOutput\", \"...\");\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"replace\"))} ${pathDisplay}`;\n\n\tif (!state.preview) {\n\t\treturn text;\n\t}\n\n\tif (\"error\" in state.preview) {\n\t\ttext += `\\n\\n${theme.fg(\"error\", state.preview.error)}`;\n\t\treturn text;\n\t}\n\n\tif (state.preview.diff) {\n\t\ttext += `\\n\\n${fmtPreview(state.preview.diff, expanded, theme)}`;\n\t}\n\treturn text;\n}\n// grip-ignore noNearIdenticalDataStructures: Replace rendering accepts minimal adapter input, while the test fixture captures streamed tool-update callback content.\ninterface ReplaceResultContentEntry {\n\ttype: string;\n\ttext?: string;\n}\n\ninterface ReplaceResultTextEntry extends ReplaceResultContentEntry {\n\ttype: \"text\";\n\ttext: string;\n}\n\ninterface ReplaceResultTextSource {\n\tcontent?: ReplaceResultContentEntry[];\n}\n\nexport function getResultText(result: ReplaceResultTextSource): string | undefined {\n\tconst textContent = result.content?.find(\n\t\t(entry): entry is ReplaceResultTextEntry => entry.type === \"text\" && typeof entry.text === \"string\",\n\t);\n\treturn textContent?.text;\n}\n\nexport function extractWarnings(text: string | undefined): string | undefined {\n\treturn text?.match(/(?:^|\\n)Warnings:\\n[\\s\\S]*$/)?.[0]?.trimStart();\n}\n\nexport function isApplied(details: ReplaceDetails | undefined): boolean {\n\tconst metrics = details?.metrics;\n\treturn (\n\t\tmetrics?.classification === \"applied\" && metrics.added_lines !== undefined && metrics.removed_lines !== undefined\n\t);\n}\n\nexport function buildAppliedText(\n\ttext: string | undefined,\n\tdetails: ReplaceDetails | undefined,\n\ttheme: FgT,\n): string | undefined {\n\tconst sections: string[] = [];\n\n\tif (details?.diff) {\n\t\tsections.push(fmtResult(details.diff, theme));\n\t}\n\n\tconst warnings = extractWarnings(text);\n\tif (warnings) sections.push(warnings);\n\n\treturn sections.length > 0 ? sections.join(\"\\n\\n\") : undefined;\n}\n\nfunction trimEmpty(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\n\twhile (start < end && lines[start] === \"\") {\n\t\tstart++;\n\t}\n\twhile (end > start && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\n\treturn lines.slice(start, end);\n}\n\nfunction isSectionBoundary(line: string): boolean {\n\treturn (\n\t\tline === \"--- Anchors ---\" ||\n\t\tline === \"Warnings:\" ||\n\t\tline === \"Structure outline:\" ||\n\t\t/^--- Range \\d+ ---$/.test(line)\n\t);\n}\n\nexport function fmtResultMd(text: string): string {\n\tconst lines = text.split(\"\\n\");\n\tconst sections: string[] = [];\n\tlet plainLines: string[] = [];\n\n\tconst flush = () => {\n\t\tconst trimmed = trimEmpty(plainLines);\n\t\tif (trimmed.length > 0) {\n\t\t\tsections.push(trimmed.join(\"\\n\"));\n\t\t}\n\t\tplainLines = [];\n\t};\n\n\tlet index = 0;\n\twhile (index < lines.length) {\n\t\tconst line = lines[index]!;\n\n\t\tif (line.startsWith(\"--- Anchors \")) {\n\t\t\tflush();\n\t\t\tconst title = line.replace(/^---\\s*/, \"\").replace(/\\s*---$/, \"\");\n\t\t\tindex++;\n\t\t\tconst bodyLines: string[] = [];\n\t\t\twhile (index < lines.length && !isSectionBoundary(lines[index]!)) {\n\t\t\t\tbodyLines.push(lines[index]!);\n\t\t\t\tindex++;\n\t\t\t}\n\t\t\tsections.push([`#### ${title}`, \"```text\", ...trimEmpty(bodyLines), \"```\"].join(\"\\n\"));\n\t\t\tcontinue;\n\t\t}\n\n\t\tplainLines.push(line);\n\t\tindex++;\n\t}\n\n\tflush();\n\n\treturn sections.join(\"\\n\\n\");\n}\n\nexport function mkMdTheme(theme: MdTheme) {\n\treturn {\n\t\theading: (text: string) => theme.fg(\"mdHeading\", text),\n\t\tlink: (text: string) => theme.fg(\"mdLink\", text),\n\t\tlinkUrl: (text: string) => theme.fg(\"mdLinkUrl\", text),\n\t\tcode: (text: string) => theme.fg(\"mdCode\", text),\n\t\tcodeBlock: (text: string) => theme.fg(\"mdCodeBlock\", text),\n\t\tcodeBlockBorder: (text: string) => theme.fg(\"mdCodeBlockBorder\", text),\n\t\tquote: (text: string) => theme.fg(\"mdQuote\", text),\n\t\tquoteBorder: (text: string) => theme.fg(\"mdQuoteBorder\", text),\n\t\thr: (text: string) => theme.fg(\"mdHr\", text),\n\t\tlistBullet: (text: string) => theme.fg(\"mdListBullet\", text),\n\t\tbold: (text: string) => theme.bold(text),\n\t\titalic: (text: string) => (theme.italic ? theme.italic(text) : text),\n\t\tunderline: (text: string) => (theme.underline ? theme.underline(text) : text),\n\t\tstrikethrough: (text: string) => (theme.strikethrough ? theme.strikethrough(text) : text),\n\t\thighlightCode: (code: string, lang?: string) =>\n\t\t\tcode.split(\"\\n\").map((line) => {\n\t\t\t\tif (lang === \"diff\") {\n\t\t\t\t\tif (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n\t\t\t\t\t\treturn theme.fg(\"toolDiffAdded\", line);\n\t\t\t\t\t}\n\t\t\t\t\tif (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n\t\t\t\t\t\treturn theme.fg(\"toolDiffRemoved\", line);\n\t\t\t\t\t}\n\t\t\t\t\treturn theme.fg(\"toolDiffContext\", line);\n\t\t\t\t}\n\n\t\t\t\treturn theme.fg(\"mdCodeBlock\", line);\n\t\t\t}),\n\t};\n}\n"]}
1
+ {"version":3,"file":"replace-render.js","sourceRoot":"","sources":["../../../src/core/tools/replace-render.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ReplaceDetails, ReqParams } from \"./edit.ts\";\nimport type { HTEdit } from \"./hashline/resolve.ts\";\nimport { isRec } from \"./hashline-utils.ts\";\nimport { normReq } from \"./replace-normalize.ts\";\n\nexport type FgT = Pick<Theme, \"fg\">;\nexport type CallT = Pick<Theme, \"fg\" | \"bold\">;\nexport type MdTheme = Pick<Theme, \"fg\" | \"bold\" | \"italic\" | \"underline\" | \"strikethrough\">;\n\nexport type RPreview = { diff: string } | { error: string };\n\nexport type RRState = {\n\targsKey?: string;\n\tpreview?: RPreview;\n\tpreviewGeneration?: number;\n};\n\nexport function getPreviewInput(args: unknown): ReqParams | null {\n\tlet normalized: unknown;\n\ttry {\n\t\tnormalized = normReq(args);\n\t} catch {\n\t\treturn null;\n\t}\n\tif (!isRec(normalized) || typeof normalized.path !== \"string\") {\n\t\treturn null;\n\t}\n\n\tif (!Array.isArray(normalized.changes)) {\n\t\treturn null;\n\t}\n\n\tconst request: ReqParams = {\n\t\tpath: normalized.path,\n\t\tchanges: normalized.changes as HTEdit[],\n\t};\n\n\treturn request;\n}\n\nexport function colorLines(lines: string[], theme: FgT): string[] {\n\treturn lines.map((line) => {\n\t\tif (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n\t\t\treturn theme.fg(\"success\", line);\n\t\t}\n\t\tif (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n\t\t\treturn theme.fg(\"error\", line);\n\t\t}\n\t\treturn theme.fg(\"dim\", line);\n\t});\n}\n\nexport function fmtPreview(diff: string, expanded: boolean, theme: FgT): string {\n\tconst lines = diff.split(\"\\n\");\n\tconst maxLines = expanded ? 40 : 16;\n\tconst shown = colorLines(lines.slice(0, maxLines), theme);\n\n\tif (lines.length > maxLines) {\n\t\tshown.push(theme.fg(\"muted\", `... ${lines.length - maxLines} more diff lines`));\n\t}\n\treturn shown.join(\"\\n\");\n}\n\nexport function fmtResult(diff: string, theme: FgT): string {\n\treturn colorLines(diff.split(\"\\n\"), theme).join(\"\\n\");\n}\n\nexport function fmtCall(args: ReqParams | undefined, state: RRState, expanded: boolean, theme: CallT): string {\n\tconst path = args?.path;\n\tconst pathDisplay =\n\t\ttypeof path === \"string\" && path.length > 0 ? theme.fg(\"accent\", path) : theme.fg(\"toolOutput\", \"...\");\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"replace\"))} ${pathDisplay}`;\n\n\tif (!state.preview) {\n\t\treturn text;\n\t}\n\n\tif (\"error\" in state.preview) {\n\t\ttext += `\\n\\n${theme.fg(\"error\", state.preview.error)}`;\n\t\treturn text;\n\t}\n\n\tif (state.preview.diff) {\n\t\ttext += `\\n\\n${fmtPreview(state.preview.diff, expanded, theme)}`;\n\t}\n\treturn text;\n}\n// grip-ignore noNearIdenticalDataStructures: Replace rendering accepts minimal adapter input, while the test fixture captures streamed tool-update callback content.\ninterface ReplaceResultContentEntry {\n\ttype: string;\n\ttext?: string;\n}\n\ninterface ReplaceResultTextEntry extends ReplaceResultContentEntry {\n\ttype: \"text\";\n\ttext: string;\n}\n\ninterface ReplaceResultTextSource {\n\tcontent?: ReplaceResultContentEntry[];\n}\n\nexport function getResultText(result: ReplaceResultTextSource): string | undefined {\n\tconst textContent = result.content?.find(\n\t\t(entry): entry is ReplaceResultTextEntry => entry.type === \"text\" && typeof entry.text === \"string\",\n\t);\n\treturn textContent?.text;\n}\n\nexport function extractWarnings(text: string | undefined): string | undefined {\n\treturn text?.match(/(?:^|\\n)Warnings:\\n[\\s\\S]*$/)?.[0]?.trimStart();\n}\n\nexport function isApplied(details: ReplaceDetails | undefined): boolean {\n\tconst metrics = details?.metrics;\n\treturn (\n\t\tmetrics?.classification === \"applied\" && metrics.added_lines !== undefined && metrics.removed_lines !== undefined\n\t);\n}\n\nexport function buildAppliedText(\n\ttext: string | undefined,\n\tdetails: ReplaceDetails | undefined,\n\ttheme: FgT,\n): string | undefined {\n\tconst sections: string[] = [];\n\n\tif (details?.diff) {\n\t\tsections.push(fmtResult(details.diff, theme));\n\t}\n\n\tconst warnings = extractWarnings(text);\n\tif (warnings) sections.push(warnings);\n\n\treturn sections.length > 0 ? sections.join(\"\\n\\n\") : undefined;\n}\n\nfunction trimEmpty(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\n\twhile (start < end && lines[start] === \"\") {\n\t\tstart++;\n\t}\n\twhile (end > start && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\n\treturn lines.slice(start, end);\n}\n\nfunction isSectionBoundary(line: string): boolean {\n\treturn (\n\t\tline === \"--- Anchors ---\" ||\n\t\tline === \"Warnings:\" ||\n\t\tline === \"Structure outline:\" ||\n\t\t/^--- Range \\d+ ---$/.test(line)\n\t);\n}\n\nexport function fmtResultMd(text: string): string {\n\tconst lines = text.split(\"\\n\");\n\tconst sections: string[] = [];\n\tlet plainLines: string[] = [];\n\n\tconst flush = () => {\n\t\tconst trimmed = trimEmpty(plainLines);\n\t\tif (trimmed.length > 0) {\n\t\t\tsections.push(trimmed.join(\"\\n\"));\n\t\t}\n\t\tplainLines = [];\n\t};\n\n\tlet index = 0;\n\twhile (index < lines.length) {\n\t\tconst line = lines[index]!;\n\n\t\tif (line.startsWith(\"--- Anchors \")) {\n\t\t\tflush();\n\t\t\tconst title = line.replace(/^---\\s*/, \"\").replace(/\\s*---$/, \"\");\n\t\t\tindex++;\n\t\t\tconst bodyLines: string[] = [];\n\t\t\twhile (index < lines.length && !isSectionBoundary(lines[index]!)) {\n\t\t\t\tbodyLines.push(lines[index]!);\n\t\t\t\tindex++;\n\t\t\t}\n\t\t\tsections.push([`#### ${title}`, \"```text\", ...trimEmpty(bodyLines), \"```\"].join(\"\\n\"));\n\t\t\tcontinue;\n\t\t}\n\n\t\tplainLines.push(line);\n\t\tindex++;\n\t}\n\n\tflush();\n\n\treturn sections.join(\"\\n\\n\");\n}\n\nexport function mkMdTheme(theme: MdTheme) {\n\treturn {\n\t\theading: (text: string) => theme.fg(\"mdHeading\", text),\n\t\tlink: (text: string) => theme.fg(\"mdLink\", text),\n\t\tlinkUrl: (text: string) => theme.fg(\"mdLinkUrl\", text),\n\t\tcode: (text: string) => theme.fg(\"mdCode\", text),\n\t\tcodeBlock: (text: string) => theme.fg(\"mdCodeBlock\", text),\n\t\tcodeBlockBorder: (text: string) => theme.fg(\"mdCodeBlockBorder\", text),\n\t\tquote: (text: string) => theme.fg(\"mdQuote\", text),\n\t\tquoteBorder: (text: string) => theme.fg(\"mdQuoteBorder\", text),\n\t\thr: (text: string) => theme.fg(\"mdHr\", text),\n\t\tlistBullet: (text: string) => theme.fg(\"mdListBullet\", text),\n\t\tbold: (text: string) => theme.bold(text),\n\t\titalic: (text: string) => (theme.italic ? theme.italic(text) : text),\n\t\tunderline: (text: string) => (theme.underline ? theme.underline(text) : text),\n\t\tstrikethrough: (text: string) => (theme.strikethrough ? theme.strikethrough(text) : text),\n\t\thighlightCode: (code: string, lang?: string) =>\n\t\t\tcode.split(\"\\n\").map((line) => {\n\t\t\t\tif (lang === \"diff\") {\n\t\t\t\t\tif (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n\t\t\t\t\t\treturn theme.fg(\"toolDiffAdded\", line);\n\t\t\t\t\t}\n\t\t\t\t\tif (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n\t\t\t\t\t\treturn theme.fg(\"toolDiffRemoved\", line);\n\t\t\t\t\t}\n\t\t\t\t\treturn theme.fg(\"toolDiffContext\", line);\n\t\t\t\t}\n\n\t\t\t\treturn theme.fg(\"mdCodeBlock\", line);\n\t\t\t}),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/tools/runtime.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAI7D","sourcesContent":["export function abortIf(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) {\n\t\tthrow new Error(\"Operation aborted\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/tools/runtime.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAI7D"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/tools/runtime.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,MAA+B,EAAQ;IAC9D,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;AAAA,CACD","sourcesContent":["export function abortIf(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) {\n\t\tthrow new Error(\"Operation aborted\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/tools/runtime.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,MAA+B;IACtD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;AACF,CAAC","sourcesContent":["export function abortIf(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) {\n\t\tthrow new Error(\"Operation aborted\");\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-history.d.ts","sourceRoot":"","sources":["../../../src/core/tools/session-history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA+B7D,QAAA,MAAM,mBAAmB;;;;;;;;EAoCvB,CAAC;AAEH,QAAA,MAAM,qBAAqB;;EAKzB,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAC5E,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACxE,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC5E,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CACzB;AAqkBD,wBAAgB,iCAAiC,CAChD,OAAO,EAAE,eAAe,GACtB,cAAc,CAAC,OAAO,mBAAmB,EAAE,wBAAwB,CAAC,CA8DtE;AAED,wBAAgB,mCAAmC,CAClD,OAAO,EAAE,eAAe,GACtB,cAAc,CAAC,OAAO,qBAAqB,EAAE,0BAA0B,CAAC,CAkC1E;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,mBAAmB,CAAC,CAEvG;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,qBAAqB,CAAC,CAE3G","sourcesContent":["import { Worker } from \"node:worker_threads\";\nimport type { AgentTool } from \"@greppleai/grip-agent-core\";\nimport { StringEnum } from \"@greppleai/grip-ai\";\nimport type { Static } from \"typebox\";\nimport { Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE } from \"../messages.ts\";\nimport { getLatestCompactionEntry, projectSessionContextEntries } from \"../session/context.ts\";\nimport type { ReadonlySession } from \"../session/session.ts\";\nimport type { SessionEntry } from \"../session/types.ts\";\nimport { abortIf } from \"./runtime.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, truncateHead, truncateLine } from \"./truncate.ts\";\n\nconst DEFAULT_SEARCH_RESULTS = 20;\nconst MAX_SEARCH_RESULTS = 50;\nconst MAX_CONTEXT_LINES = 5;\nconst MAX_PATTERN_LENGTH = 1000;\nconst MAX_DISPLAY_LINE_LENGTH = 500;\nconst MAX_SEARCH_LINE_LENGTH = 10_000;\nconst MAX_SEARCH_BYTES = 5 * 1024 * 1024;\nconst MAX_SEARCH_LINES = 100_000;\nconst MAX_ENTRY_SERIALIZATION_BYTES = 5 * 1024 * 1024;\nconst REGEX_TIMEOUT_MS = 1000;\n\nconst REGEX_WORKER_SOURCE = `\nconst { parentPort, workerData } = require(\"node:worker_threads\");\ntry {\n const expression = new RegExp(workerData.pattern, workerData.ignoreCase ? \"iu\" : \"u\");\n const indexes = [];\n for (let index = 0; index < workerData.lines.length; index++) {\n if (expression.test(workerData.lines[index])) indexes.push(index);\n }\n parentPort.postMessage({ indexes });\n} catch (error) {\n parentPort.postMessage({ error: error instanceof Error ? error.message : String(error) });\n}\n`;\n\nconst sessionSearchSchema = Type.Object({\n\tpattern: Type.String({\n\t\tdescription:\n\t\t\t\"JavaScript regular expression to search for, without / delimiters; use fixedStrings for literal matching\",\n\t\tmaxLength: MAX_PATTERN_LENGTH,\n\t}),\n\tignoreCase: Type.Optional(Type.Boolean({ description: \"Perform case-insensitive matching, like grep -i\" })),\n\tfixedStrings: Type.Optional(\n\t\tType.Boolean({ description: \"Treat pattern as a literal string instead of a regular expression, like grep -F\" }),\n\t),\n\tbeforeContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: `Context lines before each match (default 0, max ${MAX_CONTEXT_LINES}), like grep -B`,\n\t\t\tminimum: 0,\n\t\t\tmaximum: MAX_CONTEXT_LINES,\n\t\t}),\n\t),\n\tafterContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: `Context lines after each match (default 0, max ${MAX_CONTEXT_LINES}), like grep -A`,\n\t\t\tminimum: 0,\n\t\t\tmaximum: MAX_CONTEXT_LINES,\n\t\t}),\n\t),\n\tmaxResults: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: `Maximum matching lines to return (default ${DEFAULT_SEARCH_RESULTS}, max ${MAX_SEARCH_RESULTS})`,\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SEARCH_RESULTS,\n\t\t}),\n\t),\n\tscope: Type.Optional(\n\t\tStringEnum([\"context\", \"branch\", \"all\"] as const, {\n\t\t\tdescription: \"Search entries in the current model context (default), current branch ancestry, or every branch\",\n\t\t}),\n\t),\n});\n\nconst sessionEntryGetSchema = Type.Object({\n\tentryId: Type.String({\n\t\tdescription: \"Exact session entry ID returned by session_search or another session API\",\n\t\tminLength: 1,\n\t}),\n});\n\nexport type SessionHistoryToolName = \"session_search\" | \"session_entry_get\";\nexport type SessionSearchToolInput = Static<typeof sessionSearchSchema>;\nexport type SessionEntryGetToolInput = Static<typeof sessionEntryGetSchema>;\nexport type SessionSearchScope = \"context\" | \"branch\" | \"all\";\n\nexport interface SessionSearchMatch {\n\tentryId: string;\n\tentryType: string;\n\trole?: string;\n\ttimestamp: string;\n\tlineNumber: number;\n\tline: string;\n}\n\nexport interface SessionSearchToolDetails {\n\tpattern: string;\n\tignoreCase: boolean;\n\tfixedStrings: boolean;\n\tscope: SessionSearchScope;\n\tmatchCount: number;\n\treturnedMatchCount: number;\n\tmatches: SessionSearchMatch[];\n\tscannedEntries: number;\n\tscannedLines: number;\n\tscannedBytes: number;\n\tscanTruncated: boolean;\n\toutputTruncated: boolean;\n}\n\nexport interface SessionEntryGetToolDetails {\n\tentryId: string;\n\tentryType: string;\n\tonCurrentBranch: boolean;\n\toutputTruncated: boolean;\n}\n\ninterface SearchDocument {\n\tentry: SessionEntry;\n\trole?: string;\n\tlines: string[];\n\tbytes: number;\n\ttruncated: boolean;\n\tlimitReached: boolean;\n}\n\ninterface SearchLine {\n\tdocument: SearchDocument;\n\tlineIndex: number;\n}\n\ninterface SearchCorpus {\n\tlines: SearchLine[];\n\tscannedEntries: number;\n\tscannedBytes: number;\n\ttruncated: boolean;\n}\n\ninterface SessionSearchContextLine {\n\tlineNumber: number;\n\tline: string;\n}\n\ninterface CollectedMatch extends SessionSearchMatch {\n\tcontextBefore: SessionSearchContextLine[];\n\tcontextAfter: SessionSearchContextLine[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sanitizeImageData(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map((child) => sanitizeImageData(child));\n\tif (!isRecord(value)) return value;\n\tconst result: Record<string, unknown> = {};\n\tconst imageDataLength = value.type === \"image\" && typeof value.data === \"string\" ? value.data.length : undefined;\n\tfor (const key in value) {\n\t\tif (!Object.hasOwn(value, key)) continue;\n\t\tconst child = value[key];\n\t\tresult[key] =\n\t\t\timageDataLength !== undefined && key === \"data\"\n\t\t\t\t? `[base64 image data omitted: ${imageDataLength} chars]`\n\t\t\t\t: sanitizeImageData(child);\n\t}\n\treturn result;\n}\n\nfunction estimateSerializedArrayBytes(values: unknown[], limit: number, seen: Set<object>): number {\n\tlet total = 2;\n\tfor (const value of values) {\n\t\ttotal += estimateSerializedBytes(value, limit - total, seen) + 1;\n\t\tif (total > limit) return total;\n\t}\n\treturn total;\n}\n\nfunction estimateSerializedRecordBytes(value: Record<string, unknown>, limit: number, seen: Set<object>): number {\n\tlet total = 2;\n\tfor (const key in value) {\n\t\tif (!Object.hasOwn(value, key)) continue;\n\t\ttotal += Buffer.byteLength(key, \"utf8\") * 6 + estimateSerializedBytes(value[key], limit - total, seen) + 4;\n\t\tif (total > limit) return total;\n\t}\n\treturn total;\n}\n\nfunction estimateSerializedBytes(value: unknown, limit: number, seen = new Set<object>()): number {\n\tif (typeof value === \"string\") return Buffer.byteLength(value, \"utf8\") * 6 + 2;\n\tif (typeof value !== \"object\" || value === null) return Buffer.byteLength(String(value), \"utf8\");\n\tif (seen.has(value)) return 0;\n\tseen.add(value);\n\tif (Array.isArray(value)) return estimateSerializedArrayBytes(value, limit, seen);\n\tif (isRecord(value)) return estimateSerializedRecordBytes(value, limit, seen);\n\treturn 2;\n}\n\ninterface BoundedLineCollector {\n\tlines: string[];\n\tbytes: number;\n\tencounteredLines: number;\n\ttruncated: boolean;\n\tlimitReached: boolean;\n\tappendLine(line: string): boolean;\n\tomitOversizedLine(): boolean;\n\tappendText(text: string): boolean;\n}\ninterface SearchLineTextSegment {\n\tkind: \"line\";\n\tline: string;\n\tnextStart: number;\n}\n\ninterface OversizedSearchTextSegment {\n\tkind: \"oversized\";\n\tcomplete: boolean;\n}\n\ntype SearchTextSegment = SearchLineTextSegment | OversizedSearchTextSegment;\n\nfunction readSearchTextSegment(text: string, start: number): SearchTextSegment {\n\tconst windowEnd = Math.min(text.length, start + MAX_SEARCH_LINE_LENGTH + 1);\n\tconst window = text.slice(start, windowEnd);\n\tconst lineFeed = window.indexOf(\"\\n\");\n\tconst carriageReturn = window.indexOf(\"\\r\");\n\tlet separatorIndex = lineFeed;\n\tif (separatorIndex < 0 || (carriageReturn >= 0 && carriageReturn < separatorIndex)) {\n\t\tseparatorIndex = carriageReturn;\n\t}\n\tif (separatorIndex < 0) {\n\t\tif (window.length > MAX_SEARCH_LINE_LENGTH) {\n\t\t\treturn { kind: \"oversized\", complete: windowEnd === text.length };\n\t\t}\n\t\treturn { kind: \"line\", line: window, nextStart: text.length };\n\t}\n\n\tconst separatorPosition = start + separatorIndex;\n\tconst separatorLength = text[separatorPosition] === \"\\r\" && text[separatorPosition + 1] === \"\\n\" ? 2 : 1;\n\treturn {\n\t\tkind: \"line\",\n\t\tline: window.slice(0, separatorIndex),\n\t\tnextStart: separatorPosition + separatorLength,\n\t};\n}\nfunction appendOversizedSearchTextSegment(\n\tcollector: BoundedLineCollector,\n\tsegment: OversizedSearchTextSegment,\n): boolean {\n\tif (!collector.omitOversizedLine()) return false;\n\tif (!segment.complete) collector.limitReached = true;\n\treturn segment.complete;\n}\n\nfunction createBoundedLineCollector(maxLines: number, maxBytes: number): BoundedLineCollector {\n\tconst collector: BoundedLineCollector = {\n\t\tlines: [],\n\t\tbytes: 0,\n\t\tencounteredLines: 0,\n\t\ttruncated: false,\n\t\tlimitReached: false,\n\t\tappendLine(line) {\n\t\t\tif (line.length > MAX_SEARCH_LINE_LENGTH) return collector.omitOversizedLine();\n\t\t\tconst lineBytes = Buffer.byteLength(line, \"utf8\") + 1;\n\t\t\tif (collector.encounteredLines >= maxLines || collector.bytes + lineBytes > maxBytes) {\n\t\t\t\tcollector.truncated = true;\n\t\t\t\tcollector.limitReached = true;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcollector.lines.push(line);\n\t\t\tcollector.bytes += lineBytes;\n\t\t\tcollector.encounteredLines++;\n\t\t\treturn true;\n\t\t},\n\t\tomitOversizedLine() {\n\t\t\tconst budgetBytes = MAX_SEARCH_LINE_LENGTH * 4 + 1;\n\t\t\tif (collector.encounteredLines >= maxLines || collector.bytes + budgetBytes > maxBytes) {\n\t\t\t\tcollector.truncated = true;\n\t\t\t\tcollector.limitReached = true;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcollector.bytes += budgetBytes;\n\t\t\tcollector.encounteredLines++;\n\t\t\tcollector.truncated = true;\n\t\t\treturn true;\n\t\t},\n\t\tappendText(text) {\n\t\t\tif (text.length === 0) return collector.appendLine(\"\");\n\t\t\tlet start = 0;\n\t\t\twhile (start < text.length) {\n\t\t\t\tconst segment = readSearchTextSegment(text, start);\n\t\t\t\tif (segment.kind === \"oversized\") return appendOversizedSearchTextSegment(collector, segment);\n\t\t\t\tif (!collector.appendLine(segment.line)) return false;\n\t\t\t\tstart = segment.nextStart;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t};\n\treturn collector;\n}\n\nfunction appendSearchArrayValues(collector: BoundedLineCollector, values: unknown[], seen: Set<object>): boolean {\n\tfor (let index = 0; index < values.length; index++) {\n\t\tif (!appendSearchValue(collector, values[index], seen, `[${index}]`)) return false;\n\t}\n\treturn true;\n}\n\nfunction appendSearchRecordValue(\n\tcollector: BoundedLineCollector,\n\tvalue: Record<string, unknown>,\n\tseen: Set<object>,\n): boolean {\n\tif (value.type === \"image\" && typeof value.data === \"string\") {\n\t\treturn collector.appendLine(\n\t\t\t`[image ${typeof value.mimeType === \"string\" ? value.mimeType : \"unknown\"} data omitted: ${value.data.length} chars]`,\n\t\t);\n\t}\n\tfor (const key in value) {\n\t\tif (!Object.hasOwn(value, key)) continue;\n\t\tif (!appendSearchValue(collector, value[key], seen, key)) return false;\n\t}\n\treturn true;\n}\n\nfunction appendSearchValue(\n\tcollector: BoundedLineCollector,\n\tvalue: unknown,\n\tseen = new Set<object>(),\n\tlabel?: string,\n): boolean {\n\tif (label !== undefined && !collector.appendLine(`${label}:`)) return false;\n\tif (typeof value === \"string\") return collector.appendText(value);\n\tif (typeof value !== \"object\" || value === null) return collector.appendLine(String(value));\n\tif (seen.has(value)) return collector.appendLine(\"[circular value omitted]\");\n\tseen.add(value);\n\tif (Array.isArray(value)) return appendSearchArrayValues(collector, value, seen);\n\tif (!isRecord(value)) return collector.appendLine(String(value));\n\treturn appendSearchRecordValue(collector, value, seen);\n}\n\nfunction appendSearchContentBlock(collector: BoundedLineCollector, block: Record<string, unknown>): void {\n\tswitch (block.type) {\n\t\tcase \"text\":\n\t\t\tif (typeof block.text === \"string\") collector.appendText(block.text);\n\t\t\tbreak;\n\t\tcase \"thinking\":\n\t\t\tif (typeof block.thinking !== \"string\") break;\n\t\t\tcollector.appendLine(\"thinking:\");\n\t\t\tcollector.appendText(block.thinking);\n\t\t\tbreak;\n\t\tcase \"toolCall\":\n\t\t\tcollector.appendLine(`tool_call: ${typeof block.name === \"string\" ? block.name : \"unknown\"}`);\n\t\t\tif (block.arguments !== undefined) appendSearchValue(collector, block.arguments);\n\t\t\tbreak;\n\t\tcase \"image\":\n\t\t\tcollector.appendLine(`[image ${typeof block.mimeType === \"string\" ? block.mimeType : \"unknown\"} omitted]`);\n\t\t\tbreak;\n\t}\n}\n\nfunction appendContentLines(collector: BoundedLineCollector, content: unknown): void {\n\tif (typeof content === \"string\") {\n\t\tcollector.appendText(content);\n\t\treturn;\n\t}\n\tif (!Array.isArray(content)) return;\n\tfor (const block of content) {\n\t\tif (collector.limitReached) break;\n\t\tif (isRecord(block)) appendSearchContentBlock(collector, block);\n\t}\n}\n\nfunction finishSearchDocument(entry: SessionEntry, collector: BoundedLineCollector, role?: string): SearchDocument {\n\treturn {\n\t\tentry,\n\t\trole,\n\t\tlines: collector.lines,\n\t\tbytes: collector.bytes,\n\t\ttruncated: collector.truncated,\n\t\tlimitReached: collector.limitReached,\n\t};\n}\n\nfunction createMessageSearchDocument(entry: SessionEntry, collector: BoundedLineCollector): SearchDocument | undefined {\n\tif (entry.type !== \"message\") return undefined;\n\tconst message = entry.message;\n\tconst role = message.role;\n\tif (role === \"bashExecution\" && message.excludeFromContext) return undefined;\n\tif (role === \"custom\" && message.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\tcollector.appendLine(`role: ${role}`);\n\tswitch (role) {\n\t\tcase \"user\":\n\t\tcase \"assistant\":\n\t\t\tappendContentLines(collector, message.content);\n\t\t\tbreak;\n\t\tcase \"toolResult\":\n\t\t\tcollector.appendLine(`tool_name: ${message.toolName}`);\n\t\t\tappendContentLines(collector, message.content);\n\t\t\tbreak;\n\t\tcase \"custom\":\n\t\t\tcollector.appendLine(`custom_type: ${message.customType}`);\n\t\t\tappendContentLines(collector, message.content);\n\t\t\tbreak;\n\t\tcase \"bashExecution\":\n\t\t\tcollector.appendLine(\"command:\");\n\t\t\tcollector.appendText(message.command);\n\t\t\tcollector.appendLine(\"output:\");\n\t\t\tcollector.appendText(message.output);\n\t\t\tbreak;\n\t\tcase \"branchSummary\":\n\t\tcase \"compactionSummary\":\n\t\t\tcollector.appendText(message.summary);\n\t\t\tbreak;\n\t}\n\treturn finishSearchDocument(entry, collector, role);\n}\n\nfunction createMetadataSearchDocument(\n\tentry: SessionEntry,\n\tcollector: BoundedLineCollector,\n): SearchDocument | undefined {\n\tif (entry.type === \"message\") return undefined;\n\tswitch (entry.type) {\n\t\tcase \"compaction\":\n\t\t\tcollector.appendLine(\"compaction summary:\");\n\t\t\tcollector.appendText(entry.summary);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"branch_summary\":\n\t\t\tcollector.appendLine(\"branch summary:\");\n\t\t\tcollector.appendText(entry.summary);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"custom_message\":\n\t\t\tif (entry.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\t\t\tcollector.appendLine(`custom_type: ${entry.customType}`);\n\t\t\tappendContentLines(collector, entry.content);\n\t\t\treturn finishSearchDocument(entry, collector, \"custom\");\n\t\tcase \"thinking_level_change\":\n\t\t\tcollector.appendLine(`thinking_level: ${entry.thinkingLevel}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"model_change\":\n\t\t\tcollector.appendLine(`model: ${entry.provider}/${entry.modelId}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"label\":\n\t\t\tcollector.appendLine(`label target: ${entry.targetId}`);\n\t\t\tcollector.appendLine(`label: ${entry.label ?? \"(cleared)\"}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"session_info\":\n\t\t\tcollector.appendLine(`session_name: ${entry.name ?? \"\"}`);\n\t\t\treturn finishSearchDocument(entry, collector);\n\t\tcase \"custom\":\n\t\t\treturn undefined;\n\t}\n}\n\nfunction createSearchDocument(entry: SessionEntry, maxLines: number, maxBytes: number): SearchDocument | undefined {\n\tconst collector = createBoundedLineCollector(maxLines, maxBytes);\n\treturn entry.type === \"message\"\n\t\t? createMessageSearchDocument(entry, collector)\n\t\t: createMetadataSearchDocument(entry, collector);\n}\n\nfunction containsToolCall(entry: SessionEntry, toolCallId: string): boolean {\n\treturn (\n\t\tentry.type === \"message\" &&\n\t\tentry.message.role === \"assistant\" &&\n\t\tentry.message.content.some((block) => block.type === \"toolCall\" && block.id === toolCallId)\n\t);\n}\n\nfunction buildSearchCorpus(entries: SessionEntry[], toolCallId: string, signal?: AbortSignal): SearchCorpus {\n\tconst searchLines: SearchLine[] = [];\n\tlet scannedEntries = 0;\n\tlet scannedBytes = 0;\n\tlet truncated = false;\n\tfor (const entry of entries) {\n\t\tabortIf(signal);\n\t\tif (containsToolCall(entry, toolCallId)) continue;\n\t\tconst document = createSearchDocument(\n\t\t\tentry,\n\t\t\tMAX_SEARCH_LINES - searchLines.length,\n\t\t\tMAX_SEARCH_BYTES - scannedBytes,\n\t\t);\n\t\tif (!document) continue;\n\t\tfor (let lineIndex = 0; lineIndex < document.lines.length; lineIndex++) {\n\t\t\tsearchLines.push({ document, lineIndex });\n\t\t}\n\t\tif (document.lines.length > 0) scannedEntries++;\n\t\tscannedBytes += document.bytes;\n\t\ttruncated ||= document.truncated;\n\t\tif (document.limitReached) break;\n\t}\n\treturn { lines: searchLines, scannedEntries, scannedBytes, truncated };\n}\n\nfunction validateRegex(pattern: string, ignoreCase: boolean): void {\n\ttry {\n\t\tnew RegExp(pattern, ignoreCase ? \"iu\" : \"u\");\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Invalid session_search regular expression: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n}\n\nfunction findFixedStringMatchIndexes(lines: string[], pattern: string, ignoreCase: boolean): number[] {\n\tconst expected = ignoreCase ? pattern.toLowerCase() : pattern;\n\tconst indexes: number[] = [];\n\tfor (let index = 0; index < lines.length; index++) {\n\t\tif ((ignoreCase ? lines[index].toLowerCase() : lines[index]).includes(expected)) indexes.push(index);\n\t}\n\treturn indexes;\n}\n\nfunction findRegexMatchIndexes(\n\tlines: string[],\n\tpattern: string,\n\tignoreCase: boolean,\n\tsignal?: AbortSignal,\n): Promise<number[]> {\n\tvalidateRegex(pattern, ignoreCase);\n\tabortIf(signal);\n\treturn new Promise((resolve, reject) => {\n\t\tconst worker = new Worker(REGEX_WORKER_SOURCE, {\n\t\t\teval: true,\n\t\t\tworkerData: { lines, pattern, ignoreCase },\n\t\t});\n\t\tlet settled = false;\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tvoid worker.terminate();\n\t\t};\n\t\tconst succeed = (indexes: number[]) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve(indexes);\n\t\t};\n\t\tconst fail = (error: Error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\t\tconst onAbort = () => fail(new Error(\"Operation aborted\"));\n\t\tconst timeout = setTimeout(\n\t\t\t() => fail(new Error(`session_search regular expression exceeded the ${REGEX_TIMEOUT_MS}ms safety limit`)),\n\t\t\tREGEX_TIMEOUT_MS,\n\t\t);\n\t\ttimeout.unref?.();\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tworker.once(\"message\", (message: unknown) => {\n\t\t\tif (!isRecord(message)) {\n\t\t\t\tfail(new Error(\"session_search regex worker returned an invalid response\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof message.error === \"string\") {\n\t\t\t\tfail(new Error(`Invalid session_search regular expression: ${message.error}`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!Array.isArray(message.indexes) || !message.indexes.every((index) => Number.isSafeInteger(index))) {\n\t\t\t\tfail(new Error(\"session_search regex worker returned invalid match indexes\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsucceed(message.indexes as number[]);\n\t\t});\n\t\tworker.once(\"error\", fail);\n\t\tworker.once(\"exit\", (code) => {\n\t\t\tif (!settled) fail(new Error(`session_search regex worker exited before returning matches (code ${code})`));\n\t\t});\n\t});\n}\n\nfunction collectMatches(\n\tcorpus: SearchCorpus,\n\tindexes: number[],\n\tbeforeContext: number,\n\tafterContext: number,\n): CollectedMatch[] {\n\treturn indexes.map((index) => {\n\t\tconst searchLine = corpus.lines[index];\n\t\tconst { document, lineIndex } = searchLine;\n\t\tconst entry = document.entry;\n\t\treturn {\n\t\t\tentryId: entry.id,\n\t\t\tentryType: entry.type,\n\t\t\trole: document.role,\n\t\t\ttimestamp: entry.timestamp,\n\t\t\tlineNumber: lineIndex + 1,\n\t\t\tline: document.lines[lineIndex],\n\t\t\tcontextBefore: document.lines\n\t\t\t\t.slice(Math.max(0, lineIndex - beforeContext), lineIndex)\n\t\t\t\t.map((line, contextIndex) => ({\n\t\t\t\t\tlineNumber: Math.max(0, lineIndex - beforeContext) + contextIndex + 1,\n\t\t\t\t\tline,\n\t\t\t\t})),\n\t\t\tcontextAfter: document.lines\n\t\t\t\t.slice(lineIndex + 1, lineIndex + 1 + afterContext)\n\t\t\t\t.map((line, contextIndex) => ({ lineNumber: lineIndex + contextIndex + 2, line })),\n\t\t};\n\t});\n}\n\nfunction entryHeader(match: CollectedMatch): string {\n\tconst role = match.role ? ` role=${match.role}` : \"\";\n\treturn `entry ${match.entryId} type=${match.entryType}${role} timestamp=${match.timestamp}`;\n}\n\nfunction displayLine(line: string): string {\n\treturn truncateLine(line, MAX_DISPLAY_LINE_LENGTH).text;\n}\n\nfunction formatMatches(\n\tmatches: CollectedMatch[],\n\ttotalMatches: number,\n\tmaxResults: number,\n\tscanTruncated: boolean,\n): string {\n\tconst blocks = matches.map((match) => {\n\t\tconst lines = [entryHeader(match)];\n\t\tfor (const context of match.contextBefore) lines.push(` ${context.lineNumber}-${displayLine(context.line)}`);\n\t\tlines.push(`> ${match.lineNumber}:${displayLine(match.line)}`);\n\t\tfor (const context of match.contextAfter) lines.push(` ${context.lineNumber}-${displayLine(context.line)}`);\n\t\treturn lines.join(\"\\n\");\n\t});\n\tif (blocks.length === 0) blocks.push(\"No matching session entries found.\");\n\tif (totalMatches > maxResults) {\n\t\tblocks.push(\n\t\t\t`[Showing ${matches.length} of ${totalMatches} matching lines. Refine the pattern or raise maxResults.]`,\n\t\t);\n\t}\n\tif (scanTruncated) {\n\t\tblocks.push(\n\t\t\t`[Session search input was bounded at ${MAX_SEARCH_LINES} lines, ${MAX_SEARCH_BYTES} bytes, and ${MAX_SEARCH_LINE_LENGTH} characters per line. Results may be incomplete.]`,\n\t\t);\n\t}\n\treturn blocks.join(\"\\n\\n\");\n}\n\ninterface TruncatedSessionToolOutput {\n\ttext: string;\n\ttruncated: boolean;\n}\n\nfunction truncateToolOutput(output: string): TruncatedSessionToolOutput {\n\tconst initial = truncateHead(output, { maxBytes: DEFAULT_MAX_BYTES, maxLines: DEFAULT_MAX_LINES });\n\tif (!initial.truncated) return { text: output, truncated: false };\n\tconst notice = \"\\n\\n[Session tool output truncated. Refine the request.]\";\n\tconst reserved = truncateHead(output, {\n\t\tmaxBytes: DEFAULT_MAX_BYTES - Buffer.byteLength(notice, \"utf8\"),\n\t\tmaxLines: DEFAULT_MAX_LINES - 2,\n\t});\n\treturn { text: `${reserved.content}${notice}`, truncated: true };\n}\n\nfunction projectEntryForModel(entry: SessionEntry): unknown | undefined {\n\tif (entry.type === \"custom\") return undefined;\n\tif (entry.type === \"custom_message\") {\n\t\tif (entry.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\t\tconst { details: _details, ...visible } = entry;\n\t\treturn visible;\n\t}\n\tif (entry.type === \"compaction\" || entry.type === \"branch_summary\") {\n\t\tconst { details: _details, ...visible } = entry;\n\t\treturn visible;\n\t}\n\tif (entry.type !== \"message\") return entry;\n\tconst message = entry.message;\n\tif (message.role === \"bashExecution\") {\n\t\tif (message.excludeFromContext) return undefined;\n\t\tconst { fullOutputPath: _fullOutputPath, ...visibleMessage } = message;\n\t\treturn { ...entry, message: visibleMessage };\n\t}\n\tif (message.role === \"toolResult\") {\n\t\tconst { details: _details, ...visibleMessage } = message;\n\t\treturn { ...entry, message: visibleMessage };\n\t}\n\tif (message.role === \"custom\") {\n\t\tif (message.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE) return undefined;\n\t\tconst { details: _details, ...visibleMessage } = message;\n\t\treturn { ...entry, message: visibleMessage };\n\t}\n\treturn entry;\n}\n\nfunction getContextSearchEntries(path: SessionEntry[]): SessionEntry[] {\n\tconst compaction = getLatestCompactionEntry(path);\n\treturn projectSessionContextEntries(path).filter(\n\t\t(entry) =>\n\t\t\tentry.type === \"message\" ||\n\t\t\tentry.type === \"custom_message\" ||\n\t\t\tentry.type === \"branch_summary\" ||\n\t\t\t(entry.type === \"compaction\" && entry.id === compaction?.id && entry.summary.length > 0),\n\t);\n}\n\nexport function createSessionSearchToolDefinition(\n\tsession: ReadonlySession,\n): ToolDefinition<typeof sessionSearchSchema, SessionSearchToolDetails> {\n\treturn {\n\t\tname: \"session_search\",\n\t\tlabel: \"session_search\",\n\t\tdescription:\n\t\t\t\"Search finalized entries in the active session using a JavaScript regular expression by default, with grep-like case, fixed-string, context, result-limit, and scope options. Searches entries in the current model context by default; use scope: branch for older current-branch history or scope: all for archived branches. Hidden extension state and context-excluded bash output are not searched. Input and output are bounded.\",\n\t\tpromptSnippet: \"Search finalized entries in the active session history with a regular expression\",\n\t\tpromptGuidelines: [\n\t\t\t\"Default searches cover current model context. Use scope: branch or scope: all to recover history omitted by compaction; use session_entry_get with a returned entry ID when the exact model-visible entry is needed.\",\n\t\t],\n\t\tparameters: sessionSearchSchema,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(\n\t\t\ttoolCallId,\n\t\t\t{\n\t\t\t\tpattern,\n\t\t\t\tignoreCase = false,\n\t\t\t\tfixedStrings = false,\n\t\t\t\tbeforeContext = 0,\n\t\t\t\tafterContext = 0,\n\t\t\t\tmaxResults = DEFAULT_SEARCH_RESULTS,\n\t\t\t\tscope = \"context\",\n\t\t\t}: SessionSearchToolInput,\n\t\t\tsignal,\n\t\t) {\n\t\t\tabortIf(signal);\n\t\t\tconst entries =\n\t\t\t\tscope === \"all\"\n\t\t\t\t\t? session.getEntries()\n\t\t\t\t\t: scope === \"branch\"\n\t\t\t\t\t\t? session.getBranch()\n\t\t\t\t\t\t: getContextSearchEntries(session.getBranch());\n\t\t\tconst corpus = buildSearchCorpus(entries, toolCallId, signal);\n\t\t\tconst lines = corpus.lines.map(({ document, lineIndex }) => document.lines[lineIndex]);\n\t\t\tconst matchIndexes = fixedStrings\n\t\t\t\t? findFixedStringMatchIndexes(lines, pattern, ignoreCase)\n\t\t\t\t: await findRegexMatchIndexes(lines, pattern, ignoreCase, signal);\n\t\t\tabortIf(signal);\n\t\t\tconst matches = collectMatches(corpus, matchIndexes.slice(0, maxResults), beforeContext, afterContext);\n\t\t\tconst output = truncateToolOutput(formatMatches(matches, matchIndexes.length, maxResults, corpus.truncated));\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: output.text }],\n\t\t\t\tdetails: {\n\t\t\t\t\tpattern,\n\t\t\t\t\tignoreCase,\n\t\t\t\t\tfixedStrings,\n\t\t\t\t\tscope,\n\t\t\t\t\tmatchCount: matchIndexes.length,\n\t\t\t\t\treturnedMatchCount: matches.length,\n\t\t\t\t\tmatches: matches.map(({ contextBefore: _before, contextAfter: _after, ...match }) => ({\n\t\t\t\t\t\t...match,\n\t\t\t\t\t\tline: displayLine(match.line),\n\t\t\t\t\t})),\n\t\t\t\t\tscannedEntries: corpus.scannedEntries,\n\t\t\t\t\tscannedLines: corpus.lines.length,\n\t\t\t\t\tscannedBytes: corpus.scannedBytes,\n\t\t\t\t\tscanTruncated: corpus.truncated,\n\t\t\t\t\toutputTruncated: output.truncated,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSessionEntryGetToolDefinition(\n\tsession: ReadonlySession,\n): ToolDefinition<typeof sessionEntryGetSchema, SessionEntryGetToolDetails> {\n\treturn {\n\t\tname: \"session_entry_get\",\n\t\tlabel: \"session_entry_get\",\n\t\tdescription:\n\t\t\t\"Fetch one exact model-visible entry by ID from the active session, including entries outside the current branch. Extension-private metadata, hidden custom entries, context-excluded bash output, and base64 image payloads are not exposed. Returns the complete JSON projection unless safety or tool-output limits require truncation.\",\n\t\tpromptSnippet: \"Fetch an exact model-visible entry by ID from the active session\",\n\t\tparameters: sessionEntryGetSchema,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, { entryId }: SessionEntryGetToolInput, signal) {\n\t\t\tabortIf(signal);\n\t\t\tconst entry = session.getEntry(entryId);\n\t\t\tif (!entry) throw new Error(`Session entry not found: ${entryId}`);\n\t\t\tconst visibleEntry = projectEntryForModel(entry);\n\t\t\tif (!visibleEntry) throw new Error(`Session entry is private or context-excluded: ${entryId}`);\n\t\t\tconst sanitizedEntry = sanitizeImageData(visibleEntry);\n\t\t\tif (estimateSerializedBytes(sanitizedEntry, MAX_ENTRY_SERIALIZATION_BYTES) > MAX_ENTRY_SERIALIZATION_BYTES) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Session entry exceeds the ${MAX_ENTRY_SERIALIZATION_BYTES}-byte serialization safety limit: ${entryId}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst onCurrentBranch = session.getBranch().some((candidate) => candidate.id === entryId);\n\t\t\tconst output = truncateToolOutput(`Session entry ${entryId}:\\n${JSON.stringify(sanitizedEntry)}`);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: output.text }],\n\t\t\t\tdetails: {\n\t\t\t\t\tentryId,\n\t\t\t\t\tentryType: entry.type,\n\t\t\t\t\tonCurrentBranch,\n\t\t\t\t\toutputTruncated: output.truncated,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSessionSearchTool(session: ReadonlySession): AgentTool<typeof sessionSearchSchema> {\n\treturn wrapToolDefinition(createSessionSearchToolDefinition(session));\n}\n\nexport function createSessionEntryGetTool(session: ReadonlySession): AgentTool<typeof sessionEntryGetSchema> {\n\treturn wrapToolDefinition(createSessionEntryGetToolDefinition(session));\n}\n"]}
1
+ {"version":3,"file":"session-history.d.ts","sourceRoot":"","sources":["../../../src/core/tools/session-history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA+B7D,QAAA,MAAM,mBAAmB;;;;;;;;EAoCvB,CAAC;AAEH,QAAA,MAAM,qBAAqB;;EAKzB,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAC5E,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACxE,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC5E,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CACzB;AAqkBD,wBAAgB,iCAAiC,CAChD,OAAO,EAAE,eAAe,GACtB,cAAc,CAAC,OAAO,mBAAmB,EAAE,wBAAwB,CAAC,CA8DtE;AAED,wBAAgB,mCAAmC,CAClD,OAAO,EAAE,eAAe,GACtB,cAAc,CAAC,OAAO,qBAAqB,EAAE,0BAA0B,CAAC,CAkC1E;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,mBAAmB,CAAC,CAEvG;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,qBAAqB,CAAC,CAE3G"}