@pentoshi/clai 3.6.0 → 3.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/dist/agent/compaction-summary.d.ts +17 -0
  2. package/dist/agent/compaction-summary.js +64 -0
  3. package/dist/agent/compaction-summary.js.map +1 -0
  4. package/dist/agent/confirm-port.d.ts +3 -1
  5. package/dist/agent/confirm-port.js +5 -1
  6. package/dist/agent/confirm-port.js.map +1 -1
  7. package/dist/agent/context-manager.js +45 -22
  8. package/dist/agent/context-manager.js.map +1 -1
  9. package/dist/agent/events.d.ts +6 -0
  10. package/dist/agent/evidence-governor.d.ts +37 -0
  11. package/dist/agent/evidence-governor.js +70 -0
  12. package/dist/agent/evidence-governor.js.map +1 -0
  13. package/dist/agent/loop-guard.d.ts +29 -11
  14. package/dist/agent/loop-guard.js +93 -39
  15. package/dist/agent/loop-guard.js.map +1 -1
  16. package/dist/agent/must-continue.d.ts +56 -0
  17. package/dist/agent/must-continue.js +240 -0
  18. package/dist/agent/must-continue.js.map +1 -0
  19. package/dist/agent/outcomes.d.ts +101 -0
  20. package/dist/agent/outcomes.js +359 -0
  21. package/dist/agent/outcomes.js.map +1 -0
  22. package/dist/agent/plan-decision.d.ts +33 -0
  23. package/dist/agent/plan-decision.js +104 -0
  24. package/dist/agent/plan-decision.js.map +1 -0
  25. package/dist/agent/plan-tool.d.ts +12 -0
  26. package/dist/agent/plan-tool.js +312 -104
  27. package/dist/agent/plan-tool.js.map +1 -1
  28. package/dist/agent/project-root.js +3 -0
  29. package/dist/agent/project-root.js.map +1 -1
  30. package/dist/agent/prompt-composer.d.ts +21 -0
  31. package/dist/agent/prompt-composer.js +46 -0
  32. package/dist/agent/prompt-composer.js.map +1 -0
  33. package/dist/agent/runner.d.ts +11 -1
  34. package/dist/agent/runner.js +1226 -971
  35. package/dist/agent/runner.js.map +1 -1
  36. package/dist/agent/scope-context.d.ts +3 -0
  37. package/dist/agent/scope-context.js +24 -0
  38. package/dist/agent/scope-context.js.map +1 -0
  39. package/dist/agent/scratch-write.d.ts +4 -0
  40. package/dist/agent/scratch-write.js +54 -0
  41. package/dist/agent/scratch-write.js.map +1 -0
  42. package/dist/agent/session-policy.d.ts +7 -0
  43. package/dist/agent/session-policy.js +61 -0
  44. package/dist/agent/session-policy.js.map +1 -1
  45. package/dist/agent/session-state.d.ts +41 -0
  46. package/dist/agent/session-state.js +107 -0
  47. package/dist/agent/session-state.js.map +1 -0
  48. package/dist/agent/step-budget.d.ts +14 -0
  49. package/dist/agent/step-budget.js +26 -0
  50. package/dist/agent/step-budget.js.map +1 -0
  51. package/dist/agent/task-analyzer.d.ts +12 -3
  52. package/dist/agent/task-analyzer.js +263 -23
  53. package/dist/agent/task-analyzer.js.map +1 -1
  54. package/dist/agent/task-evidence.d.ts +111 -29
  55. package/dist/agent/task-evidence.js +519 -91
  56. package/dist/agent/task-evidence.js.map +1 -1
  57. package/dist/agent/task-plan.d.ts +57 -0
  58. package/dist/agent/task-plan.js +147 -1
  59. package/dist/agent/task-plan.js.map +1 -1
  60. package/dist/agent/tool-call-parser.d.ts +4 -12
  61. package/dist/agent/tool-call-parser.js +34 -67
  62. package/dist/agent/tool-call-parser.js.map +1 -1
  63. package/dist/agent/tool-history.d.ts +7 -0
  64. package/dist/agent/tool-history.js +50 -0
  65. package/dist/agent/tool-history.js.map +1 -1
  66. package/dist/agent/tool-output-formatting.d.ts +13 -1
  67. package/dist/agent/tool-output-formatting.js +75 -22
  68. package/dist/agent/tool-output-formatting.js.map +1 -1
  69. package/dist/agent/turn-outcome.d.ts +11 -0
  70. package/dist/agent/turn-outcome.js +17 -0
  71. package/dist/agent/turn-outcome.js.map +1 -0
  72. package/dist/agent/turn-state.d.ts +11 -0
  73. package/dist/agent/turn-state.js +28 -0
  74. package/dist/agent/turn-state.js.map +1 -0
  75. package/dist/agent/workspace-orient.d.ts +11 -0
  76. package/dist/agent/workspace-orient.js +103 -12
  77. package/dist/agent/workspace-orient.js.map +1 -1
  78. package/dist/app/adapters/agent-event-adapter.d.ts +2 -13
  79. package/dist/app/adapters/agent-event-adapter.js +63 -25
  80. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  81. package/dist/app/adapters/current-agent-adapter.d.ts +0 -5
  82. package/dist/app/adapters/current-agent-adapter.js +4 -7
  83. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  84. package/dist/app/adapters/current-jobs-adapter.js +1 -0
  85. package/dist/app/adapters/current-jobs-adapter.js.map +1 -1
  86. package/dist/app/adapters/current-terminal-adapter.d.ts +0 -7
  87. package/dist/app/adapters/current-terminal-adapter.js +0 -7
  88. package/dist/app/adapters/current-terminal-adapter.js.map +1 -1
  89. package/dist/app/adapters/current-updates-adapter.d.ts +0 -5
  90. package/dist/app/adapters/current-updates-adapter.js +0 -5
  91. package/dist/app/adapters/current-updates-adapter.js.map +1 -1
  92. package/dist/app/adapters/in-memory-clipboard-adapter.d.ts +0 -5
  93. package/dist/app/adapters/in-memory-clipboard-adapter.js +0 -5
  94. package/dist/app/adapters/in-memory-clipboard-adapter.js.map +1 -1
  95. package/dist/app/commands/command.d.ts +0 -5
  96. package/dist/app/commands/command.js.map +1 -1
  97. package/dist/app/commands/registry.d.ts +0 -14
  98. package/dist/app/commands/registry.js +0 -20
  99. package/dist/app/commands/registry.js.map +1 -1
  100. package/dist/app/controllers/disposable.d.ts +0 -5
  101. package/dist/app/controllers/disposable.js +0 -5
  102. package/dist/app/controllers/disposable.js.map +1 -1
  103. package/dist/app/controllers/job-controller.d.ts +1 -5
  104. package/dist/app/controllers/job-controller.js +0 -4
  105. package/dist/app/controllers/job-controller.js.map +1 -1
  106. package/dist/app/controllers/plan-controller.d.ts +5 -8
  107. package/dist/app/controllers/plan-controller.js +30 -12
  108. package/dist/app/controllers/plan-controller.js.map +1 -1
  109. package/dist/app/controllers/session-controller.d.ts +17 -32
  110. package/dist/app/controllers/session-controller.js +56 -35
  111. package/dist/app/controllers/session-controller.js.map +1 -1
  112. package/dist/app/controllers/turn-controller.d.ts +2 -6
  113. package/dist/app/controllers/turn-controller.js +8 -8
  114. package/dist/app/controllers/turn-controller.js.map +1 -1
  115. package/dist/app/events/app-event.d.ts +4 -7
  116. package/dist/app/events/app-event.js +0 -6
  117. package/dist/app/events/app-event.js.map +1 -1
  118. package/dist/app/events/event-buffer.d.ts +6 -17
  119. package/dist/app/events/event-buffer.js +27 -24
  120. package/dist/app/events/event-buffer.js.map +1 -1
  121. package/dist/app/events/sequencer.d.ts +0 -9
  122. package/dist/app/events/sequencer.js +0 -4
  123. package/dist/app/events/sequencer.js.map +1 -1
  124. package/dist/app/ports/agent-port.d.ts +13 -3
  125. package/dist/app/ports/clipboard-port.d.ts +0 -5
  126. package/dist/app/ports/confirm-port.d.ts +0 -7
  127. package/dist/app/ports/jobs-port.d.ts +2 -5
  128. package/dist/app/ports/persistence-port.d.ts +0 -4
  129. package/dist/app/ports/secret-port.d.ts +0 -5
  130. package/dist/app/ports/terminal-port.d.ts +0 -6
  131. package/dist/app/ports/updates-port.d.ts +0 -4
  132. package/dist/attachments/service.d.ts +29 -0
  133. package/dist/attachments/service.js +47 -0
  134. package/dist/attachments/service.js.map +1 -0
  135. package/dist/commands/providers.js +0 -3
  136. package/dist/commands/providers.js.map +1 -1
  137. package/dist/commands/search-providers.d.ts +0 -33
  138. package/dist/commands/search-providers.js +0 -33
  139. package/dist/commands/search-providers.js.map +1 -1
  140. package/dist/commands/update.js +1 -9
  141. package/dist/commands/update.js.map +1 -1
  142. package/dist/index.js +22 -42
  143. package/dist/index.js.map +1 -1
  144. package/dist/llm/adapters/ollama-tools.d.ts +0 -4
  145. package/dist/llm/adapters/ollama-tools.js +0 -4
  146. package/dist/llm/adapters/ollama-tools.js.map +1 -1
  147. package/dist/llm/capabilities.d.ts +10 -10
  148. package/dist/llm/capabilities.js +43 -17
  149. package/dist/llm/capabilities.js.map +1 -1
  150. package/dist/llm/groq.js +0 -6
  151. package/dist/llm/groq.js.map +1 -1
  152. package/dist/llm/http.d.ts +0 -17
  153. package/dist/llm/http.js +0 -45
  154. package/dist/llm/http.js.map +1 -1
  155. package/dist/llm/router.d.ts +0 -6
  156. package/dist/llm/router.js +0 -15
  157. package/dist/llm/router.js.map +1 -1
  158. package/dist/llm/tool-protocol.d.ts +0 -6
  159. package/dist/llm/tool-protocol.js +3 -7
  160. package/dist/llm/tool-protocol.js.map +1 -1
  161. package/dist/modes/agent.d.ts +2 -1
  162. package/dist/modes/agent.js +4 -2
  163. package/dist/modes/agent.js.map +1 -1
  164. package/dist/modes/ask.d.ts +0 -18
  165. package/dist/modes/ask.js +0 -49
  166. package/dist/modes/ask.js.map +1 -1
  167. package/dist/os/cwd.d.ts +0 -21
  168. package/dist/os/cwd.js +0 -24
  169. package/dist/os/cwd.js.map +1 -1
  170. package/dist/os/pkgmgr.js +0 -6
  171. package/dist/os/pkgmgr.js.map +1 -1
  172. package/dist/prompts/embedded.d.ts +1 -0
  173. package/dist/prompts/embedded.js +9 -0
  174. package/dist/prompts/embedded.js.map +1 -0
  175. package/dist/prompts/index.d.ts +6 -18
  176. package/dist/prompts/index.js +104 -293
  177. package/dist/prompts/index.js.map +1 -1
  178. package/dist/prompts/system.agent.md +228 -0
  179. package/dist/prompts/system.ask.md +56 -0
  180. package/dist/repl/prompt-line.js +0 -36
  181. package/dist/repl/prompt-line.js.map +1 -1
  182. package/dist/repl/slash-commands.d.ts +0 -9
  183. package/dist/repl/slash-commands.js +2 -23
  184. package/dist/repl/slash-commands.js.map +1 -1
  185. package/dist/repl.d.ts +5 -0
  186. package/dist/repl.js +169 -55
  187. package/dist/repl.js.map +1 -1
  188. package/dist/safety/classifier.js +17 -9
  189. package/dist/safety/classifier.js.map +1 -1
  190. package/dist/safety/engagement-policy.d.ts +46 -0
  191. package/dist/safety/engagement-policy.js +198 -0
  192. package/dist/safety/engagement-policy.js.map +1 -0
  193. package/dist/store/engagement.d.ts +115 -0
  194. package/dist/store/engagement.js +278 -0
  195. package/dist/store/engagement.js.map +1 -0
  196. package/dist/store/logs.d.ts +5 -0
  197. package/dist/store/logs.js +52 -2
  198. package/dist/store/logs.js.map +1 -1
  199. package/dist/store/plan.d.ts +57 -5
  200. package/dist/store/plan.js +182 -8
  201. package/dist/store/plan.js.map +1 -1
  202. package/dist/store/scope.d.ts +4 -1
  203. package/dist/store/scope.js +2 -2
  204. package/dist/store/scope.js.map +1 -1
  205. package/dist/tools/definitions.js +70 -1
  206. package/dist/tools/definitions.js.map +1 -1
  207. package/dist/tools/elevated-shell.d.ts +60 -0
  208. package/dist/tools/elevated-shell.js +233 -0
  209. package/dist/tools/elevated-shell.js.map +1 -0
  210. package/dist/tools/file-diff.d.ts +125 -0
  211. package/dist/tools/file-diff.js +495 -0
  212. package/dist/tools/file-diff.js.map +1 -0
  213. package/dist/tools/fs.d.ts +11 -13
  214. package/dist/tools/fs.js +269 -78
  215. package/dist/tools/fs.js.map +1 -1
  216. package/dist/tools/http.d.ts +15 -0
  217. package/dist/tools/http.js +202 -61
  218. package/dist/tools/http.js.map +1 -1
  219. package/dist/tools/jobs.d.ts +71 -10
  220. package/dist/tools/jobs.js +403 -124
  221. package/dist/tools/jobs.js.map +1 -1
  222. package/dist/tools/nmap-runner.d.ts +11 -0
  223. package/dist/tools/nmap-runner.js +115 -74
  224. package/dist/tools/nmap-runner.js.map +1 -1
  225. package/dist/tools/pentest-workflows.d.ts +8 -0
  226. package/dist/tools/pentest-workflows.js +71 -0
  227. package/dist/tools/pentest-workflows.js.map +1 -0
  228. package/dist/tools/registry.d.ts +9 -0
  229. package/dist/tools/registry.js +244 -57
  230. package/dist/tools/registry.js.map +1 -1
  231. package/dist/tools/shell.d.ts +3 -0
  232. package/dist/tools/shell.js +35 -13
  233. package/dist/tools/shell.js.map +1 -1
  234. package/dist/tools/tool-types.d.ts +11 -0
  235. package/dist/tools/web/fetch-core.d.ts +7 -0
  236. package/dist/tools/web/fetch-core.js +40 -1
  237. package/dist/tools/web/fetch-core.js.map +1 -1
  238. package/dist/tools/web/fetch.js +8 -1
  239. package/dist/tools/web/fetch.js.map +1 -1
  240. package/dist/tui-v2/app/App.js +34 -41
  241. package/dist/tui-v2/app/App.js.map +1 -1
  242. package/dist/tui-v2/app/command-handlers.js +20 -1
  243. package/dist/tui-v2/app/command-handlers.js.map +1 -1
  244. package/dist/tui-v2/app/commands/picker-commands.js +3 -0
  245. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
  246. package/dist/tui-v2/app/commands/session-commands.js +5 -0
  247. package/dist/tui-v2/app/commands/session-commands.js.map +1 -1
  248. package/dist/tui-v2/app/plan-lifecycle.d.ts +25 -3
  249. package/dist/tui-v2/app/plan-lifecycle.js +87 -24
  250. package/dist/tui-v2/app/plan-lifecycle.js.map +1 -1
  251. package/dist/tui-v2/bootstrap/patch-opentui-text.d.ts +6 -0
  252. package/dist/tui-v2/bootstrap/patch-opentui-text.js +53 -0
  253. package/dist/tui-v2/bootstrap/patch-opentui-text.js.map +1 -0
  254. package/dist/tui-v2/bootstrap/start-tui-v2.js +7 -0
  255. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  256. package/dist/tui-v2/components/jobs/jobs-panel.js +23 -14
  257. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
  258. package/dist/tui-v2/components/modal/confirm-modal.d.ts +1 -1
  259. package/dist/tui-v2/components/modal/confirm-modal.js +18 -7
  260. package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -1
  261. package/dist/tui-v2/components/overlay/overlay-host.js +1 -1
  262. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
  263. package/dist/tui-v2/components/pager/pager.d.ts +6 -0
  264. package/dist/tui-v2/components/pager/pager.js +313 -67
  265. package/dist/tui-v2/components/pager/pager.js.map +1 -1
  266. package/dist/tui-v2/components/status/status-line.d.ts +9 -0
  267. package/dist/tui-v2/components/status/status-line.js +17 -3
  268. package/dist/tui-v2/components/status/status-line.js.map +1 -1
  269. package/dist/tui-v2/components/transcript/assistant-message.js +1 -1
  270. package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -1
  271. package/dist/tui-v2/components/transcript/compacted-row.js +1 -1
  272. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
  273. package/dist/tui-v2/components/transcript/tool-card.d.ts +9 -1
  274. package/dist/tui-v2/components/transcript/tool-card.js +114 -9
  275. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  276. package/dist/tui-v2/components/transcript/transcript-row.js +2 -2
  277. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
  278. package/dist/tui-v2/composer/composer-editor.js +16 -0
  279. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  280. package/dist/tui-v2/controllers/overlay-controller.d.ts +16 -2
  281. package/dist/tui-v2/controllers/overlay-controller.js +92 -12
  282. package/dist/tui-v2/controllers/overlay-controller.js.map +1 -1
  283. package/dist/tui-v2/rendering/artifact-pager-source.d.ts +19 -0
  284. package/dist/tui-v2/rendering/artifact-pager-source.js +103 -0
  285. package/dist/tui-v2/rendering/artifact-pager-source.js.map +1 -0
  286. package/dist/tui-v2/rendering/file-diff-view.d.ts +63 -0
  287. package/dist/tui-v2/rendering/file-diff-view.js +263 -0
  288. package/dist/tui-v2/rendering/file-diff-view.js.map +1 -0
  289. package/dist/tui-v2/rendering/open-tool-output.d.ts +9 -1
  290. package/dist/tui-v2/rendering/open-tool-output.js +65 -12
  291. package/dist/tui-v2/rendering/open-tool-output.js.map +1 -1
  292. package/dist/tui-v2/rendering/pager-chrome.d.ts +12 -0
  293. package/dist/tui-v2/rendering/pager-chrome.js +56 -0
  294. package/dist/tui-v2/rendering/pager-chrome.js.map +1 -0
  295. package/dist/tui-v2/rendering/plan-view.js +1 -1
  296. package/dist/tui-v2/rendering/plan-view.js.map +1 -1
  297. package/dist/tui-v2/rendering/syntax-highlight.d.ts +37 -0
  298. package/dist/tui-v2/rendering/syntax-highlight.js +1303 -0
  299. package/dist/tui-v2/rendering/syntax-highlight.js.map +1 -0
  300. package/dist/tui-v2/rendering/theme.d.ts +28 -0
  301. package/dist/tui-v2/rendering/theme.js +28 -0
  302. package/dist/tui-v2/rendering/theme.js.map +1 -1
  303. package/dist/tui-v2/rendering/tool-presenter.d.ts +5 -0
  304. package/dist/tui-v2/rendering/tool-presenter.js +35 -3
  305. package/dist/tui-v2/rendering/tool-presenter.js.map +1 -1
  306. package/dist/tui-v2/state/transcript-hydrate.js +5 -0
  307. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -1
  308. package/dist/tui-v2/state/transcript-reducer.js +12 -2
  309. package/dist/tui-v2/state/transcript-reducer.js.map +1 -1
  310. package/dist/tui-v2/state/transcript-store.d.ts +7 -0
  311. package/dist/tui-v2/state/transcript-store.js +46 -0
  312. package/dist/tui-v2/state/transcript-store.js.map +1 -1
  313. package/dist/tui-v2/state/transcript-types.d.ts +12 -0
  314. package/dist/tui-v2/state/transcript-types.js +9 -0
  315. package/dist/tui-v2/state/transcript-types.js.map +1 -1
  316. package/dist/types.d.ts +17 -1
  317. package/dist/ui/mentions.d.ts +6 -0
  318. package/dist/ui/mentions.js +50 -12
  319. package/dist/ui/mentions.js.map +1 -1
  320. package/dist/ui/plan-pane.js +1 -1
  321. package/dist/ui/plan-pane.js.map +1 -1
  322. package/package.json +18 -12
@@ -0,0 +1,495 @@
1
+ /**
2
+ * Pure line-diff engine for file mutation tools (fs.edit / write / append / …).
3
+ * Produces Cursor/Claude-style hunks with configurable context and size caps.
4
+ */
5
+ import { basename } from "node:path";
6
+ /** Max lines on either side before falling back to whole-file replace. */
7
+ export const DIFF_MAX_LINES = 20_000;
8
+ /** Max UTF-8 bytes on either side for full LCS. */
9
+ export const DIFF_MAX_BYTES = 1_000_000;
10
+ /** Max afterText kept inline on FileChange (else snapshot only). */
11
+ export const INLINE_AFTER_MAX_BYTES = 200_000;
12
+ /** Max diff body lines in chat preview. */
13
+ export const PREVIEW_MAX_DIFF_LINES = 40;
14
+ /** Context lines around each change for chat. */
15
+ export const PREVIEW_CONTEXT = 1;
16
+ export function splitLines(text) {
17
+ if (text.length === 0)
18
+ return [];
19
+ const lines = text.split(/\r?\n/);
20
+ // Trailing newline produces a final empty entry — keep content lines only
21
+ // when the file ends with newline (standard diff behavior keeps the empty
22
+ // last element only if there is content after the last newline).
23
+ if (text.endsWith("\n") || text.endsWith("\r\n")) {
24
+ if (lines.length > 0 && lines[lines.length - 1] === "")
25
+ lines.pop();
26
+ }
27
+ return lines.map((l) => (l.endsWith("\r") ? l.slice(0, -1) : l));
28
+ }
29
+ export function looksBinary(text) {
30
+ // NUL in the first 8KB is a strong binary signal.
31
+ const sample = text.slice(0, 8_192);
32
+ return sample.includes("\0");
33
+ }
34
+ /**
35
+ * Myers O(ND) line diff → list of ops over the full file (no hunk grouping).
36
+ * Falls back to whole-file replace when sizes exceed caps.
37
+ */
38
+ export function computeLineOps(oldLines, newLines) {
39
+ const n = oldLines.length;
40
+ const m = newLines.length;
41
+ if (n === 0 && m === 0)
42
+ return [];
43
+ if (n === 0) {
44
+ return newLines.map((text, i) => ({
45
+ op: "add",
46
+ text,
47
+ newLine: i + 1,
48
+ }));
49
+ }
50
+ if (m === 0) {
51
+ return oldLines.map((text, i) => ({
52
+ op: "del",
53
+ text,
54
+ oldLine: i + 1,
55
+ }));
56
+ }
57
+ // Whole-file replace for oversized inputs (avoid O(N*M) blowups).
58
+ if (n > DIFF_MAX_LINES || m > DIFF_MAX_LINES) {
59
+ return wholeFileReplace(oldLines, newLines);
60
+ }
61
+ // Classic DP LCS for moderate sizes; Myers-style for typical source files
62
+ // under ~4k lines is fine with simple LCS table when n*m is bounded.
63
+ if (n * m > 4_000_000) {
64
+ return wholeFileReplace(oldLines, newLines);
65
+ }
66
+ // LCS lengths
67
+ const dp = new Array(n + 1);
68
+ for (let i = 0; i <= n; i += 1)
69
+ dp[i] = new Uint32Array(m + 1);
70
+ for (let i = 1; i <= n; i += 1) {
71
+ const oi = oldLines[i - 1];
72
+ const row = dp[i];
73
+ const prev = dp[i - 1];
74
+ for (let j = 1; j <= m; j += 1) {
75
+ if (oi === newLines[j - 1])
76
+ row[j] = prev[j - 1] + 1;
77
+ else
78
+ row[j] = Math.max(prev[j], row[j - 1]);
79
+ }
80
+ }
81
+ // Backtrack
82
+ const rev = [];
83
+ let i = n;
84
+ let j = m;
85
+ while (i > 0 || j > 0) {
86
+ if (i > 0 && j > 0 && oldLines[i - 1] === newLines[j - 1]) {
87
+ rev.push({
88
+ op: "context",
89
+ text: oldLines[i - 1],
90
+ oldLine: i,
91
+ newLine: j,
92
+ });
93
+ i -= 1;
94
+ j -= 1;
95
+ }
96
+ else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
97
+ rev.push({ op: "add", text: newLines[j - 1], newLine: j });
98
+ j -= 1;
99
+ }
100
+ else {
101
+ rev.push({ op: "del", text: oldLines[i - 1], oldLine: i });
102
+ i -= 1;
103
+ }
104
+ }
105
+ rev.reverse();
106
+ return rev;
107
+ }
108
+ function wholeFileReplace(oldLines, newLines) {
109
+ const out = [];
110
+ for (let i = 0; i < oldLines.length; i += 1) {
111
+ out.push({ op: "del", text: oldLines[i], oldLine: i + 1 });
112
+ }
113
+ for (let i = 0; i < newLines.length; i += 1) {
114
+ out.push({ op: "add", text: newLines[i], newLine: i + 1 });
115
+ }
116
+ return out;
117
+ }
118
+ /**
119
+ * Group full-file ops into unified hunks with `context` lines of surrounding
120
+ * unchanged content. Adjacent change regions within `context*2` merge.
121
+ */
122
+ export function groupHunks(ops, context = PREVIEW_CONTEXT) {
123
+ if (ops.length === 0)
124
+ return [];
125
+ // Mark change indices
126
+ const isChange = ops.map((o) => o.op !== "context");
127
+ if (!isChange.some(Boolean))
128
+ return [];
129
+ // Expand change islands by context
130
+ const include = new Array(ops.length).fill(false);
131
+ for (let i = 0; i < ops.length; i += 1) {
132
+ if (!isChange[i])
133
+ continue;
134
+ const from = Math.max(0, i - context);
135
+ const to = Math.min(ops.length - 1, i + context);
136
+ for (let k = from; k <= to; k += 1)
137
+ include[k] = true;
138
+ }
139
+ const hunks = [];
140
+ let i = 0;
141
+ while (i < ops.length) {
142
+ if (!include[i]) {
143
+ i += 1;
144
+ continue;
145
+ }
146
+ const start = i;
147
+ while (i < ops.length && include[i])
148
+ i += 1;
149
+ const slice = ops.slice(start, i);
150
+ const first = slice[0];
151
+ hunks.push({
152
+ oldStart: first.oldLine ?? first.newLine ?? 1,
153
+ newStart: first.newLine ?? first.oldLine ?? 1,
154
+ lines: slice,
155
+ });
156
+ }
157
+ return hunks;
158
+ }
159
+ /** Cap total preview lines across hunks; drop tail hunks with a sentinel. */
160
+ export function capPreviewHunks(hunks, maxLines = PREVIEW_MAX_DIFF_LINES) {
161
+ let used = 0;
162
+ const out = [];
163
+ let omitted = 0;
164
+ for (const h of hunks) {
165
+ if (used >= maxLines) {
166
+ omitted += h.lines.length;
167
+ continue;
168
+ }
169
+ const room = maxLines - used;
170
+ if (h.lines.length <= room) {
171
+ out.push(h);
172
+ used += h.lines.length;
173
+ }
174
+ else {
175
+ out.push({
176
+ oldStart: h.oldStart,
177
+ newStart: h.newStart,
178
+ lines: h.lines.slice(0, room),
179
+ });
180
+ used += room;
181
+ omitted += h.lines.length - room;
182
+ }
183
+ }
184
+ return { hunks: out, truncated: omitted > 0, omittedLines: omitted };
185
+ }
186
+ function countOps(ops) {
187
+ let added = 0;
188
+ let removed = 0;
189
+ for (const o of ops) {
190
+ if (o.op === "add")
191
+ added += 1;
192
+ else if (o.op === "del")
193
+ removed += 1;
194
+ }
195
+ return { added, removed };
196
+ }
197
+ function collectAddedNewLines(ops) {
198
+ const out = [];
199
+ for (const o of ops) {
200
+ if (o.op === "add" && typeof o.newLine === "number")
201
+ out.push(o.newLine);
202
+ }
203
+ return out;
204
+ }
205
+ function collectDeletedAt(ops) {
206
+ const segments = [];
207
+ let i = 0;
208
+ // Track the last seen new-line number so deletions attach after it.
209
+ let lastNew = 0;
210
+ while (i < ops.length) {
211
+ const op = ops[i];
212
+ if (op.op === "context" || op.op === "add") {
213
+ if (typeof op.newLine === "number")
214
+ lastNew = op.newLine;
215
+ i += 1;
216
+ continue;
217
+ }
218
+ // del run
219
+ const lines = [];
220
+ const oldStart = op.oldLine ?? 1;
221
+ while (i < ops.length && ops[i].op === "del") {
222
+ lines.push(ops[i].text);
223
+ i += 1;
224
+ }
225
+ segments.push({ atNewLine: lastNew, oldStart, lines });
226
+ }
227
+ return segments;
228
+ }
229
+ /**
230
+ * Build a UI-ready FileChange from before/after text.
231
+ */
232
+ export function buildFileChange(opts) {
233
+ const path = opts.path;
234
+ const base = basename(path);
235
+ const before = opts.before;
236
+ const after = opts.after;
237
+ if (looksBinary(before) || looksBinary(after)) {
238
+ const oldLines = before.length === 0 ? 0 : 1;
239
+ const newLines = after.length === 0 ? 0 : 1;
240
+ return {
241
+ path,
242
+ basename: base,
243
+ kind: opts.kind,
244
+ stats: {
245
+ oldLines,
246
+ newLines,
247
+ added: after.length > 0 ? 1 : 0,
248
+ removed: before.length > 0 ? 1 : 0,
249
+ },
250
+ previewHunks: [],
251
+ binary: true,
252
+ ...(after.length <= INLINE_AFTER_MAX_BYTES && !opts.snapshotPath
253
+ ? { afterText: after }
254
+ : {}),
255
+ ...(opts.snapshotPath ? { snapshotPath: opts.snapshotPath } : {}),
256
+ addedNewLines: [],
257
+ deletedAt: [],
258
+ };
259
+ }
260
+ const beforeBytes = Buffer.byteLength(before, "utf8");
261
+ const afterBytes = Buffer.byteLength(after, "utf8");
262
+ const oversized = beforeBytes > DIFF_MAX_BYTES ||
263
+ afterBytes > DIFF_MAX_BYTES ||
264
+ splitLines(before).length > DIFF_MAX_LINES ||
265
+ splitLines(after).length > DIFF_MAX_LINES;
266
+ const oldLines = splitLines(before);
267
+ const newLines = splitLines(after);
268
+ const ops = oversized
269
+ ? wholeFileReplace(oldLines, newLines)
270
+ : computeLineOps(oldLines, newLines);
271
+ const { added, removed } = countOps(ops);
272
+ const rawHunks = groupHunks(ops, opts.context ?? PREVIEW_CONTEXT);
273
+ const capped = capPreviewHunks(rawHunks, opts.previewMaxLines ?? PREVIEW_MAX_DIFF_LINES);
274
+ const keepInline = !opts.snapshotPath && afterBytes <= INLINE_AFTER_MAX_BYTES;
275
+ return {
276
+ path,
277
+ basename: base,
278
+ kind: opts.kind,
279
+ stats: {
280
+ oldLines: oldLines.length,
281
+ newLines: newLines.length,
282
+ added,
283
+ removed,
284
+ },
285
+ previewHunks: capped.hunks,
286
+ addedNewLines: collectAddedNewLines(ops),
287
+ deletedAt: collectDeletedAt(ops),
288
+ truncated: capped.truncated || oversized,
289
+ binary: false,
290
+ ...(keepInline ? { afterText: after } : {}),
291
+ ...(opts.snapshotPath ? { snapshotPath: opts.snapshotPath } : {}),
292
+ };
293
+ }
294
+ /** Infer kind from before/after when the caller only knows the tool. */
295
+ export function inferChangeKind(before, after, toolHint) {
296
+ if (toolHint === "delete")
297
+ return "delete";
298
+ if (toolHint === "append") {
299
+ return before === undefined || before.length === 0 ? "create" : "append";
300
+ }
301
+ if (before === undefined || before.length === 0)
302
+ return "create";
303
+ if (after.length === 0)
304
+ return "delete";
305
+ if (toolHint === "write" && before.length > 0)
306
+ return "overwrite";
307
+ return "edit";
308
+ }
309
+ /**
310
+ * Render preview hunks as plain text (for spool / export / classic REPL).
311
+ * Uses unified +/- prefixes; no ANSI.
312
+ */
313
+ export function formatUnifiedPreview(change, options = {}) {
314
+ if (change.binary) {
315
+ return `binary file · ${change.basename} (${change.stats.newLines ? "changed" : "removed"})`;
316
+ }
317
+ const lines = [];
318
+ const max = options.maxLines ?? PREVIEW_MAX_DIFF_LINES;
319
+ let used = 0;
320
+ for (const hunk of change.previewHunks) {
321
+ if (used >= max)
322
+ break;
323
+ lines.push(`@@ -${hunk.oldStart} +${hunk.newStart} @@`);
324
+ used += 1;
325
+ for (const dl of hunk.lines) {
326
+ if (used >= max)
327
+ break;
328
+ const prefix = dl.op === "add" ? "+" : dl.op === "del" ? "-" : " ";
329
+ lines.push(`${prefix}${dl.text}`);
330
+ used += 1;
331
+ }
332
+ }
333
+ if (change.truncated) {
334
+ lines.push(`··· more changes truncated · +${change.stats.added}/-${change.stats.removed} total ···`);
335
+ }
336
+ if (lines.length === 0) {
337
+ return `(no line changes in ${change.basename})`;
338
+ }
339
+ return lines.join("\n");
340
+ }
341
+ export function buildModalLines(change) {
342
+ if (change.binary) {
343
+ return [
344
+ {
345
+ lineNo: undefined,
346
+ text: `(binary file — ${change.path})`,
347
+ op: "context",
348
+ },
349
+ ];
350
+ }
351
+ const after = change.afterText ?? "";
352
+ const afterLines = splitLines(after);
353
+ const addedSet = new Set(change.addedNewLines);
354
+ const delByAt = new Map();
355
+ for (const seg of change.deletedAt) {
356
+ const list = delByAt.get(seg.atNewLine) ?? [];
357
+ list.push(seg);
358
+ delByAt.set(seg.atNewLine, list);
359
+ }
360
+ const out = [];
361
+ // Deletions before first new line
362
+ for (const seg of delByAt.get(0) ?? []) {
363
+ seg.lines.forEach((text, idx) => {
364
+ out.push({
365
+ lineNo: undefined,
366
+ text,
367
+ op: "del",
368
+ oldLineNo: seg.oldStart + idx,
369
+ });
370
+ });
371
+ }
372
+ for (let i = 0; i < afterLines.length; i += 1) {
373
+ const newLine = i + 1;
374
+ const text = afterLines[i];
375
+ out.push({
376
+ lineNo: newLine,
377
+ text,
378
+ op: addedSet.has(newLine) ? "add" : "context",
379
+ });
380
+ for (const seg of delByAt.get(newLine) ?? []) {
381
+ seg.lines.forEach((dtext, idx) => {
382
+ out.push({
383
+ lineNo: undefined,
384
+ text: dtext,
385
+ op: "del",
386
+ oldLineNo: seg.oldStart + idx,
387
+ });
388
+ });
389
+ }
390
+ }
391
+ // Pure delete (empty after): show all deleted lines
392
+ if (afterLines.length === 0 && change.deletedAt.length > 0) {
393
+ // already handled via atNewLine 0; if empty deletedAt but kind delete, rebuild
394
+ }
395
+ else if (afterLines.length === 0 && change.kind === "delete" && change.stats.removed > 0) {
396
+ // fallback: nothing in after, deletedAt may have been built from ops
397
+ }
398
+ if (out.length === 0 && change.kind === "delete") {
399
+ return [
400
+ {
401
+ lineNo: undefined,
402
+ text: `(deleted ${change.path})`,
403
+ op: "del",
404
+ },
405
+ ];
406
+ }
407
+ return out;
408
+ }
409
+ /** Human verb for status titles. */
410
+ export function changeVerb(kind, status) {
411
+ if (status === "failed") {
412
+ switch (kind) {
413
+ case "create":
414
+ return "Create failed";
415
+ case "delete":
416
+ return "Delete failed";
417
+ case "append":
418
+ return "Append failed";
419
+ case "overwrite":
420
+ return "Write failed";
421
+ default:
422
+ return "Edit failed";
423
+ }
424
+ }
425
+ if (status === "running") {
426
+ switch (kind) {
427
+ case "create":
428
+ return "Creating";
429
+ case "delete":
430
+ return "Deleting";
431
+ case "append":
432
+ return "Appending";
433
+ case "overwrite":
434
+ return "Writing";
435
+ default:
436
+ return "Editing";
437
+ }
438
+ }
439
+ // ok
440
+ switch (kind) {
441
+ case "create":
442
+ return "Created";
443
+ case "delete":
444
+ return "Deleted";
445
+ case "append":
446
+ return "Appended";
447
+ case "overwrite":
448
+ return "Wrote";
449
+ default:
450
+ return "Edited";
451
+ }
452
+ }
453
+ /** Map tool name + optional kind to a display title basename. */
454
+ export function fileToolTitle(toolName, status, pathOrDisplay, kind) {
455
+ const path = pathOrDisplay.trim();
456
+ const base = path ? basename(path.split(/\s|,/)[0] ?? path) : "file";
457
+ const fullPath = path && path.includes("/") ? path : undefined;
458
+ if (toolName === "fs.writeMany") {
459
+ if (status === "running" || status === "queued") {
460
+ return { title: `Writing ${path || "files"}`, pathLine: undefined };
461
+ }
462
+ if (status === "failed" || status === "blocked") {
463
+ return { title: `Write failed · ${path || "files"}`, pathLine: undefined };
464
+ }
465
+ return { title: `Wrote ${path || "files"}`, pathLine: undefined };
466
+ }
467
+ const inferred = kind ??
468
+ (toolName === "fs.delete"
469
+ ? "delete"
470
+ : toolName === "fs.append"
471
+ ? "append"
472
+ : toolName === "fs.write"
473
+ ? "overwrite"
474
+ : "edit");
475
+ const st = status === "running" || status === "queued"
476
+ ? "running"
477
+ : status === "failed" || status === "blocked"
478
+ ? "failed"
479
+ : "ok";
480
+ const verb = changeVerb(inferred, st);
481
+ const sep = st === "failed" ? " · " : " ";
482
+ return {
483
+ title: `${verb}${sep}${base}`,
484
+ pathLine: fullPath,
485
+ };
486
+ }
487
+ export function isFileMutationTool(name) {
488
+ return (name === "fs.edit" ||
489
+ name === "fs.write" ||
490
+ name === "fs.writeMany" ||
491
+ name === "fs.append" ||
492
+ name === "fs.replaceLines" ||
493
+ name === "fs.delete");
494
+ }
495
+ //# sourceMappingURL=file-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-diff.js","sourceRoot":"","sources":["../../src/tools/file-diff.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,18 @@
1
1
  import type { ToolResult } from "../types.js";
2
2
  /**
3
- * Decide whether a given absolute path falls inside any approved sandbox
4
- * root. Roots are the configured `sandboxRoots`, the current working
5
- * directory, and (for read operations only) optionally the user's home
6
- * directory.
7
- *
8
- * `mode` flips two things:
9
- * - "read" → home directory is included as an implicit root (so the
10
- * agent can still inspect dotfiles by name without each one
11
- * needing to be added to sandboxRoots), but the secret-path
12
- * blocklist still applies on top.
13
- * - "write" → home directory is NOT included unless explicitly added to
14
- * sandboxRoots, so a runaway agent can't drop files all over
15
- * $HOME.
3
+ * Decide whether a path falls inside configured sandbox roots / cwd / home.
4
+ * Used for UX (outside-cwd confirm) and optional sandboxReads opt-in.
5
+ * Writes are not hard-blocked by sandbox outside cwd always prompts instead.
16
6
  */
17
7
  export declare function pathInsideSandbox(resolvedPath: string, mode: "read" | "write"): boolean;
8
+ /**
9
+ * True when a write should require an explicit confirm even under allow-all:
10
+ * outside the working directory and active project root, but not system temp /
11
+ * scratch (agent scratch lives under tmpdir and must not spam confirmations).
12
+ */
13
+ export declare function isOutsideWorkingDirectory(resolvedPath: string): boolean;
14
+ /** Resolve a tool path for permission checks (tilde + project root). */
15
+ export declare function resolveFsToolPath(path: string): string;
18
16
  export declare function fsRead(path: string, options?: {
19
17
  maxBytes?: number | undefined;
20
18
  confirmed?: boolean | undefined;