@tomsun28/pizza 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/README.md +20 -143
  2. package/README.zh-CN.md +36 -0
  3. package/dist/bun/cli.d.ts +2 -0
  4. package/dist/bun/cli.js +6 -0
  5. package/dist/bun/register-bedrock.d.ts +1 -0
  6. package/dist/bun/register-bedrock.js +3 -0
  7. package/dist/cli/args.d.ts +48 -0
  8. package/dist/cli/args.js +330 -0
  9. package/dist/cli/config-selector.d.ts +13 -0
  10. package/dist/cli/config-selector.js +30 -0
  11. package/dist/cli/file-processor.d.ts +14 -0
  12. package/dist/cli/file-processor.js +82 -0
  13. package/dist/cli/initial-message.d.ts +17 -0
  14. package/dist/cli/initial-message.js +21 -0
  15. package/dist/cli/list-models.d.ts +8 -0
  16. package/dist/cli/list-models.js +96 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +68 -0
  19. package/dist/config.d.ts +79 -0
  20. package/dist/config.js +223 -0
  21. package/dist/core/agent/index.d.ts +6 -0
  22. package/dist/core/agent/index.js +6 -0
  23. package/dist/core/agent/types.d.ts +202 -0
  24. package/dist/core/agent/types.js +51 -0
  25. package/dist/core/auth-storage.d.ts +135 -0
  26. package/dist/core/auth-storage.js +417 -0
  27. package/dist/core/bash-executor.d.ts +31 -0
  28. package/dist/core/bash-executor.js +107 -0
  29. package/dist/core/compaction/branch-summarization.d.ts +87 -0
  30. package/dist/core/compaction/branch-summarization.js +242 -0
  31. package/dist/core/compaction/compaction-engine.d.ts +40 -0
  32. package/dist/core/compaction/compaction-engine.js +292 -0
  33. package/dist/core/compaction/compaction.d.ts +106 -0
  34. package/dist/core/compaction/compaction.js +295 -0
  35. package/dist/core/compaction/index.d.ts +7 -0
  36. package/dist/core/compaction/index.js +7 -0
  37. package/dist/core/compaction/utils.d.ts +37 -0
  38. package/dist/core/compaction/utils.js +152 -0
  39. package/dist/core/defaults.d.ts +2 -0
  40. package/dist/core/defaults.js +1 -0
  41. package/dist/core/diagnostics.d.ts +14 -0
  42. package/dist/core/diagnostics.js +1 -0
  43. package/dist/core/event-bus.d.ts +8 -0
  44. package/dist/core/event-bus.js +24 -0
  45. package/dist/core/event-store/events.d.ts +465 -0
  46. package/dist/core/event-store/events.js +6 -0
  47. package/dist/core/event-store/index.d.ts +10 -0
  48. package/dist/core/event-store/index.js +10 -0
  49. package/dist/core/event-store/sqlite-store.d.ts +27 -0
  50. package/dist/core/event-store/sqlite-store.js +275 -0
  51. package/dist/core/event-store/store.d.ts +91 -0
  52. package/dist/core/event-store/store.js +7 -0
  53. package/dist/core/event-store/thread-scoped-store.d.ts +29 -0
  54. package/dist/core/event-store/thread-scoped-store.js +50 -0
  55. package/dist/core/event-store/types.d.ts +70 -0
  56. package/dist/core/event-store/types.js +7 -0
  57. package/dist/core/event-store/workspace.d.ts +37 -0
  58. package/dist/core/event-store/workspace.js +71 -0
  59. package/dist/core/exec.d.ts +28 -0
  60. package/dist/core/exec.js +74 -0
  61. package/dist/core/export-html/ansi-to-html.d.ts +21 -0
  62. package/dist/core/export-html/ansi-to-html.js +248 -0
  63. package/dist/core/export-html/index.d.ts +29 -0
  64. package/dist/core/export-html/index.js +186 -0
  65. package/dist/core/export-html/template.css +1017 -0
  66. package/dist/core/export-html/template.html +55 -0
  67. package/dist/core/export-html/template.js +1742 -0
  68. package/dist/core/export-html/tool-renderer.d.ts +39 -0
  69. package/dist/core/export-html/tool-renderer.js +94 -0
  70. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  71. package/dist/core/export-html/vendor/marked.min.js +6 -0
  72. package/dist/core/extensions/index.d.ts +12 -0
  73. package/dist/core/extensions/index.js +9 -0
  74. package/dist/core/extensions/loader.d.ts +24 -0
  75. package/dist/core/extensions/loader.js +492 -0
  76. package/dist/core/extensions/runner.d.ts +167 -0
  77. package/dist/core/extensions/runner.js +898 -0
  78. package/dist/core/extensions/session-context.d.ts +67 -0
  79. package/dist/core/extensions/session-context.js +272 -0
  80. package/dist/core/extensions/types.d.ts +1147 -0
  81. package/dist/core/extensions/types.js +44 -0
  82. package/dist/core/extensions/wrapper.d.ts +19 -0
  83. package/dist/core/extensions/wrapper.js +21 -0
  84. package/dist/core/footer-data-provider.d.ts +47 -0
  85. package/dist/core/footer-data-provider.js +321 -0
  86. package/dist/core/goal/index.d.ts +3 -0
  87. package/dist/core/goal/index.js +1 -0
  88. package/dist/core/goal/scheduler.d.ts +83 -0
  89. package/dist/core/goal/scheduler.js +154 -0
  90. package/dist/core/goal/types.d.ts +182 -0
  91. package/dist/core/goal/types.js +11 -0
  92. package/dist/core/index.d.ts +8 -0
  93. package/dist/core/index.js +8 -0
  94. package/dist/core/intent/classifier.d.ts +53 -0
  95. package/dist/core/intent/classifier.js +353 -0
  96. package/dist/core/intent/index.d.ts +8 -0
  97. package/dist/core/intent/index.js +8 -0
  98. package/dist/core/intent/tool-adapter.d.ts +31 -0
  99. package/dist/core/intent/tool-adapter.js +168 -0
  100. package/dist/core/intent/types.d.ts +71 -0
  101. package/dist/core/intent/types.js +6 -0
  102. package/dist/core/keybindings.d.ts +297 -0
  103. package/dist/core/keybindings.js +250 -0
  104. package/dist/core/messages.d.ts +30 -0
  105. package/dist/core/messages.js +134 -0
  106. package/dist/core/model-registry.d.ts +131 -0
  107. package/dist/core/model-registry.js +634 -0
  108. package/dist/core/model-resolver.d.ts +109 -0
  109. package/dist/core/model-resolver.js +486 -0
  110. package/dist/core/output-guard.d.ts +5 -0
  111. package/dist/core/output-guard.js +58 -0
  112. package/dist/core/package-manager.d.ts +196 -0
  113. package/dist/core/package-manager.js +1873 -0
  114. package/dist/core/projection/boundary-inferrer.d.ts +58 -0
  115. package/dist/core/projection/boundary-inferrer.js +122 -0
  116. package/dist/core/projection/event-to-message.d.ts +35 -0
  117. package/dist/core/projection/event-to-message.js +253 -0
  118. package/dist/core/projection/goal-projection.d.ts +67 -0
  119. package/dist/core/projection/goal-projection.js +339 -0
  120. package/dist/core/projection/index.d.ts +13 -0
  121. package/dist/core/projection/index.js +13 -0
  122. package/dist/core/projection/session-manager.d.ts +100 -0
  123. package/dist/core/projection/session-manager.js +331 -0
  124. package/dist/core/projection/session-projection.d.ts +58 -0
  125. package/dist/core/projection/session-projection.js +257 -0
  126. package/dist/core/projection/task-history.d.ts +13 -0
  127. package/dist/core/projection/task-history.js +61 -0
  128. package/dist/core/projection/timeline-projection.d.ts +82 -0
  129. package/dist/core/projection/timeline-projection.js +276 -0
  130. package/dist/core/projection/types.d.ts +69 -0
  131. package/dist/core/projection/types.js +6 -0
  132. package/dist/core/prompt-templates.d.ts +51 -0
  133. package/dist/core/prompt-templates.js +249 -0
  134. package/dist/core/resolve-config-value.d.ts +22 -0
  135. package/dist/core/resolve-config-value.js +125 -0
  136. package/dist/core/resource-loader.d.ts +193 -0
  137. package/dist/core/resource-loader.js +685 -0
  138. package/dist/core/runtime/ai-client.d.ts +12 -0
  139. package/dist/core/runtime/ai-client.js +153 -0
  140. package/dist/core/runtime/checkpoint.d.ts +12 -0
  141. package/dist/core/runtime/checkpoint.js +78 -0
  142. package/dist/core/runtime/index.d.ts +12 -0
  143. package/dist/core/runtime/index.js +12 -0
  144. package/dist/core/runtime/llm-types.d.ts +99 -0
  145. package/dist/core/runtime/llm-types.js +6 -0
  146. package/dist/core/runtime/local-runtime.d.ts +23 -0
  147. package/dist/core/runtime/local-runtime.js +59 -0
  148. package/dist/core/runtime/policies.d.ts +72 -0
  149. package/dist/core/runtime/policies.js +37 -0
  150. package/dist/core/runtime/reactor.d.ts +213 -0
  151. package/dist/core/runtime/reactor.js +992 -0
  152. package/dist/core/runtime/runtime.d.ts +191 -0
  153. package/dist/core/runtime/runtime.js +449 -0
  154. package/dist/core/runtime/types.d.ts +42 -0
  155. package/dist/core/runtime/types.js +1 -0
  156. package/dist/core/sdk.d.ts +12 -0
  157. package/dist/core/sdk.js +10 -0
  158. package/dist/core/session-context-builder.d.ts +9 -0
  159. package/dist/core/session-context-builder.js +87 -0
  160. package/dist/core/session-cwd.d.ts +18 -0
  161. package/dist/core/session-cwd.js +36 -0
  162. package/dist/core/session-facade-factory.d.ts +79 -0
  163. package/dist/core/session-facade-factory.js +460 -0
  164. package/dist/core/session-facade.d.ts +57 -0
  165. package/dist/core/session-facade.js +91 -0
  166. package/dist/core/session-listing.d.ts +30 -0
  167. package/dist/core/session-listing.js +168 -0
  168. package/dist/core/session-reader.d.ts +19 -0
  169. package/dist/core/session-reader.js +101 -0
  170. package/dist/core/session-ref.d.ts +7 -0
  171. package/dist/core/session-ref.js +25 -0
  172. package/dist/core/session-services.d.ts +51 -0
  173. package/dist/core/session-services.js +90 -0
  174. package/dist/core/session-stats.d.ts +43 -0
  175. package/dist/core/session-stats.js +41 -0
  176. package/dist/core/settings-manager.d.ts +236 -0
  177. package/dist/core/settings-manager.js +706 -0
  178. package/dist/core/skill-block-parser.d.ts +12 -0
  179. package/dist/core/skill-block-parser.js +15 -0
  180. package/dist/core/skills.d.ts +59 -0
  181. package/dist/core/skills.js +408 -0
  182. package/dist/core/slash-commands.d.ts +13 -0
  183. package/dist/core/slash-commands.js +17 -0
  184. package/dist/core/source-info.d.ts +17 -0
  185. package/dist/core/source-info.js +18 -0
  186. package/dist/core/system-prompt.d.ts +27 -0
  187. package/dist/core/system-prompt.js +179 -0
  188. package/dist/core/timings.d.ts +7 -0
  189. package/dist/core/timings.js +30 -0
  190. package/dist/core/tools/bash.d.ts +95 -0
  191. package/dist/core/tools/bash.js +513 -0
  192. package/dist/core/tools/builtin-commands.d.ts +75 -0
  193. package/dist/core/tools/builtin-commands.js +503 -0
  194. package/dist/core/tools/compat-commands.d.ts +12 -0
  195. package/dist/core/tools/compat-commands.js +1280 -0
  196. package/dist/core/tools/edit-diff.d.ts +59 -0
  197. package/dist/core/tools/edit-diff.js +263 -0
  198. package/dist/core/tools/edit.d.ts +49 -0
  199. package/dist/core/tools/edit.js +340 -0
  200. package/dist/core/tools/file-mutation-queue.d.ts +5 -0
  201. package/dist/core/tools/file-mutation-queue.js +36 -0
  202. package/dist/core/tools/find.d.ts +34 -0
  203. package/dist/core/tools/find.js +459 -0
  204. package/dist/core/tools/grep.d.ts +36 -0
  205. package/dist/core/tools/grep.js +422 -0
  206. package/dist/core/tools/index.d.ts +70 -0
  207. package/dist/core/tools/index.js +129 -0
  208. package/dist/core/tools/line-anchors.d.ts +33 -0
  209. package/dist/core/tools/line-anchors.js +151 -0
  210. package/dist/core/tools/ls.d.ts +36 -0
  211. package/dist/core/tools/ls.js +268 -0
  212. package/dist/core/tools/path-utils.d.ts +7 -0
  213. package/dist/core/tools/path-utils.js +80 -0
  214. package/dist/core/tools/read.d.ts +35 -0
  215. package/dist/core/tools/read.js +244 -0
  216. package/dist/core/tools/render-utils.d.ts +20 -0
  217. package/dist/core/tools/render-utils.js +48 -0
  218. package/dist/core/tools/session-split.d.ts +9 -0
  219. package/dist/core/tools/session-split.js +77 -0
  220. package/dist/core/tools/tool-definition-wrapper.d.ts +13 -0
  221. package/dist/core/tools/tool-definition-wrapper.js +32 -0
  222. package/dist/core/tools/truncate.d.ts +69 -0
  223. package/dist/core/tools/truncate.js +204 -0
  224. package/dist/core/tools/write.d.ts +25 -0
  225. package/dist/core/tools/write.js +211 -0
  226. package/dist/core/types/session-types.d.ts +123 -0
  227. package/dist/core/types/session-types.js +8 -0
  228. package/dist/index.d.ts +27 -0
  229. package/dist/index.js +38 -0
  230. package/dist/main.d.ts +11 -2
  231. package/dist/main.js +577 -149
  232. package/dist/modes/event-mapper.d.ts +115 -0
  233. package/dist/modes/event-mapper.js +200 -0
  234. package/dist/modes/gui/server.d.ts +14 -0
  235. package/dist/modes/gui/server.js +1032 -0
  236. package/dist/modes/index.d.ts +10 -0
  237. package/dist/modes/index.js +9 -0
  238. package/dist/modes/interactive/assets/clankolas.png +0 -0
  239. package/dist/modes/interactive/components/armin.d.ts +33 -0
  240. package/dist/modes/interactive/components/armin.js +328 -0
  241. package/dist/modes/interactive/components/assistant-message.d.ts +19 -0
  242. package/dist/modes/interactive/components/assistant-message.js +115 -0
  243. package/dist/modes/interactive/components/bash-execution.d.ts +33 -0
  244. package/dist/modes/interactive/components/bash-execution.js +169 -0
  245. package/dist/modes/interactive/components/bordered-loader.d.ts +15 -0
  246. package/dist/modes/interactive/components/bordered-loader.js +50 -0
  247. package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
  248. package/dist/modes/interactive/components/branch-summary-message.js +41 -0
  249. package/dist/modes/interactive/components/brand-header.d.ts +33 -0
  250. package/dist/modes/interactive/components/brand-header.js +235 -0
  251. package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
  252. package/dist/modes/interactive/components/compaction-summary-message.js +42 -0
  253. package/dist/modes/interactive/components/config-selector.d.ts +70 -0
  254. package/dist/modes/interactive/components/config-selector.js +469 -0
  255. package/dist/modes/interactive/components/countdown-timer.d.ts +13 -0
  256. package/dist/modes/interactive/components/countdown-timer.js +27 -0
  257. package/dist/modes/interactive/components/custom-editor.d.ts +27 -0
  258. package/dist/modes/interactive/components/custom-editor.js +94 -0
  259. package/dist/modes/interactive/components/custom-message.d.ts +19 -0
  260. package/dist/modes/interactive/components/custom-message.js +73 -0
  261. package/dist/modes/interactive/components/daxnuts.d.ts +22 -0
  262. package/dist/modes/interactive/components/daxnuts.js +137 -0
  263. package/dist/modes/interactive/components/diff.d.ts +11 -0
  264. package/dist/modes/interactive/components/diff.js +132 -0
  265. package/dist/modes/interactive/components/dynamic-border.d.ts +14 -0
  266. package/dist/modes/interactive/components/dynamic-border.js +19 -0
  267. package/dist/modes/interactive/components/earendil-announcement.d.ts +4 -0
  268. package/dist/modes/interactive/components/earendil-announcement.js +39 -0
  269. package/dist/modes/interactive/components/extension-editor.d.ts +19 -0
  270. package/dist/modes/interactive/components/extension-editor.js +105 -0
  271. package/dist/modes/interactive/components/extension-input.d.ts +22 -0
  272. package/dist/modes/interactive/components/extension-input.js +54 -0
  273. package/dist/modes/interactive/components/extension-selector.d.ts +23 -0
  274. package/dist/modes/interactive/components/extension-selector.js +70 -0
  275. package/dist/modes/interactive/components/footer.d.ts +55 -0
  276. package/dist/modes/interactive/components/footer.js +207 -0
  277. package/dist/modes/interactive/components/index.d.ts +31 -0
  278. package/dist/modes/interactive/components/index.js +32 -0
  279. package/dist/modes/interactive/components/keybinding-hints.d.ts +7 -0
  280. package/dist/modes/interactive/components/keybinding-hints.js +21 -0
  281. package/dist/modes/interactive/components/login-dialog.d.ts +41 -0
  282. package/dist/modes/interactive/components/login-dialog.js +138 -0
  283. package/dist/modes/interactive/components/model-selector.d.ts +32 -0
  284. package/dist/modes/interactive/components/model-selector.js +209 -0
  285. package/dist/modes/interactive/components/oauth-selector.d.ts +18 -0
  286. package/dist/modes/interactive/components/oauth-selector.js +91 -0
  287. package/dist/modes/interactive/components/settings-selector.d.ts +57 -0
  288. package/dist/modes/interactive/components/settings-selector.js +299 -0
  289. package/dist/modes/interactive/components/show-images-selector.d.ts +9 -0
  290. package/dist/modes/interactive/components/show-images-selector.js +37 -0
  291. package/dist/modes/interactive/components/skill-invocation-message.d.ts +16 -0
  292. package/dist/modes/interactive/components/skill-invocation-message.js +44 -0
  293. package/dist/modes/interactive/components/theme-selector.d.ts +10 -0
  294. package/dist/modes/interactive/components/theme-selector.js +47 -0
  295. package/dist/modes/interactive/components/thinking-selector.d.ts +10 -0
  296. package/dist/modes/interactive/components/thinking-selector.js +50 -0
  297. package/dist/modes/interactive/components/timeline-view.d.ts +31 -0
  298. package/dist/modes/interactive/components/timeline-view.js +81 -0
  299. package/dist/modes/interactive/components/tool-execution.d.ts +64 -0
  300. package/dist/modes/interactive/components/tool-execution.js +305 -0
  301. package/dist/modes/interactive/components/tree-selector.d.ts +88 -0
  302. package/dist/modes/interactive/components/tree-selector.js +1072 -0
  303. package/dist/modes/interactive/components/user-message-selector.d.ts +29 -0
  304. package/dist/modes/interactive/components/user-message-selector.js +110 -0
  305. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  306. package/dist/modes/interactive/components/user-message.js +27 -0
  307. package/dist/modes/interactive/components/visual-truncate.d.ts +23 -0
  308. package/dist/modes/interactive/components/visual-truncate.js +32 -0
  309. package/dist/modes/interactive/interactive-mode.d.ts +394 -0
  310. package/dist/modes/interactive/interactive-mode.js +4116 -0
  311. package/dist/modes/interactive/theme/dark.json +85 -0
  312. package/dist/modes/interactive/theme/light.json +84 -0
  313. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  314. package/dist/modes/interactive/theme/theme.d.ts +80 -0
  315. package/dist/modes/interactive/theme/theme.js +973 -0
  316. package/dist/modes/print-mode.d.ts +27 -0
  317. package/dist/modes/print-mode.js +102 -0
  318. package/dist/modes/rpc/jsonl.d.ts +16 -0
  319. package/dist/modes/rpc/jsonl.js +48 -0
  320. package/dist/modes/rpc/rpc-client.d.ts +219 -0
  321. package/dist/modes/rpc/rpc-client.js +405 -0
  322. package/dist/modes/rpc/rpc-mode.d.ts +19 -0
  323. package/dist/modes/rpc/rpc-mode.js +381 -0
  324. package/dist/modes/rpc/rpc-types.d.ts +406 -0
  325. package/dist/modes/rpc/rpc-types.js +7 -0
  326. package/dist/package-manager-cli.d.ts +3 -0
  327. package/dist/package-manager-cli.js +233 -0
  328. package/dist/utils/changelog.d.ts +20 -0
  329. package/dist/utils/changelog.js +86 -0
  330. package/dist/utils/child-process.d.ts +10 -0
  331. package/dist/utils/child-process.js +77 -0
  332. package/dist/utils/clipboard-image.d.ts +10 -0
  333. package/dist/utils/clipboard-image.js +244 -0
  334. package/dist/utils/clipboard-native.d.ts +7 -0
  335. package/dist/utils/clipboard-native.js +13 -0
  336. package/dist/utils/clipboard.d.ts +1 -0
  337. package/dist/utils/clipboard.js +77 -0
  338. package/dist/utils/exif-orientation.d.ts +4 -0
  339. package/dist/utils/exif-orientation.js +157 -0
  340. package/dist/utils/frontmatter.d.ts +7 -0
  341. package/dist/utils/frontmatter.js +25 -0
  342. package/dist/utils/git.d.ts +25 -0
  343. package/dist/utils/git.js +162 -0
  344. package/dist/utils/image-convert.d.ts +8 -0
  345. package/dist/utils/image-convert.js +38 -0
  346. package/dist/utils/image-resize.d.ts +35 -0
  347. package/dist/utils/image-resize.js +136 -0
  348. package/dist/utils/mime.d.ts +1 -0
  349. package/dist/utils/mime.js +25 -0
  350. package/dist/utils/path-shims.d.ts +1 -0
  351. package/dist/utils/path-shims.js +90 -0
  352. package/dist/utils/paths.d.ts +6 -0
  353. package/dist/utils/paths.js +18 -0
  354. package/dist/utils/photon.d.ts +20 -0
  355. package/dist/utils/photon.js +120 -0
  356. package/dist/utils/shell.d.ts +29 -0
  357. package/dist/utils/shell.js +189 -0
  358. package/dist/utils/sleep.d.ts +4 -0
  359. package/dist/utils/sleep.js +16 -0
  360. package/dist/utils/tools-manager.d.ts +3 -0
  361. package/dist/utils/tools-manager.js +101 -0
  362. package/dist/vendor/bin/darwin-arm64/fd +0 -0
  363. package/dist/vendor/bin/darwin-arm64/rg +0 -0
  364. package/dist/vendor/bin/darwin-x64/fd +0 -0
  365. package/dist/vendor/bin/darwin-x64/rg +0 -0
  366. package/dist/vendor/bin/linux-arm64/fd +0 -0
  367. package/dist/vendor/bin/linux-arm64/rg +0 -0
  368. package/dist/vendor/bin/linux-x64/fd +0 -0
  369. package/dist/vendor/bin/linux-x64/rg +0 -0
  370. package/dist/vendor/bin/win32-arm64/fd.exe +0 -0
  371. package/dist/vendor/bin/win32-arm64/rg.exe +0 -0
  372. package/dist/vendor/bin/win32-x64/fd.exe +0 -0
  373. package/dist/vendor/bin/win32-x64/rg.exe +0 -0
  374. package/package.json +90 -26
  375. package/dist/extension/core.d.ts +0 -69
  376. package/dist/extension/core.js +0 -270
  377. package/dist/extension/core.js.map +0 -1
  378. package/dist/extension/index.d.ts +0 -14
  379. package/dist/extension/index.js +0 -374
  380. package/dist/extension/index.js.map +0 -1
  381. package/dist/main.js.map +0 -1
  382. package/themes/pizza.json +0 -87
@@ -0,0 +1,340 @@
1
+ import { Box, Container, Spacer, Text } from "@earendil-works/pi-tui";
2
+ import { Type } from "@sinclair/typebox";
3
+ import { constants } from "fs";
4
+ import { access as fsAccess, readFile as fsReadFile, writeFile as fsWriteFile } from "fs/promises";
5
+ import { renderDiff } from "../../modes/interactive/components/diff.js";
6
+ import { applyEditsToNormalizedContent, computeEditsDiff, detectLineEnding, generateDiffString, normalizeToLF, restoreLineEndings, stripBom, } from "./edit-diff.js";
7
+ import { withFileMutationQueue } from "./file-mutation-queue.js";
8
+ import { resolveToCwd } from "./path-utils.js";
9
+ import { invalidArgText, shortenPath, str } from "./render-utils.js";
10
+ import { wrapToolDefinition } from "./tool-definition-wrapper.js";
11
+ const rangeEditSchema = Type.Object({
12
+ op: Type.Union([
13
+ Type.Literal("replace"),
14
+ Type.Literal("insert_before"),
15
+ Type.Literal("insert_after"),
16
+ Type.Literal("delete"),
17
+ ], { description: "Edit operation to apply to the anchored range." }),
18
+ range: Type.String({
19
+ description: "Hashline range from read output. Use <line>#<hash> for one line or <start>#<hash>..<end>#<hash> for a line range.",
20
+ }),
21
+ new: Type.Optional(Type.String({
22
+ description: 'New text for replace, insert_before, and insert_after. Omit for op="delete". Missing trailing newlines are normalized for whole-line edits.',
23
+ })),
24
+ }, { additionalProperties: false });
25
+ const editSchema = Type.Object({
26
+ path: Type.String({ description: "Path to the file to edit (relative or absolute)" }),
27
+ edits: Type.Array(rangeEditSchema, {
28
+ description: "One or more edits using ranges from read output. Each edit is resolved against the original file, not incrementally. Do not include overlapping or nested ranges. If two changes touch the same block or nearby lines, merge them into one range edit instead.",
29
+ }),
30
+ }, { additionalProperties: false });
31
+ const defaultEditOperations = {
32
+ readFile: (path) => fsReadFile(path),
33
+ writeFile: (path, content) => fsWriteFile(path, content, "utf-8"),
34
+ access: (path) => fsAccess(path, constants.R_OK | constants.W_OK),
35
+ };
36
+ function prepareEditArguments(input) {
37
+ if (!input || typeof input !== "object") {
38
+ return input;
39
+ }
40
+ const args = input;
41
+ // Some models (Opus 4.6, GLM-5.1) send edits as a JSON string instead of an array
42
+ if (typeof args.edits === "string") {
43
+ try {
44
+ const parsed = JSON.parse(args.edits);
45
+ if (Array.isArray(parsed))
46
+ args.edits = parsed;
47
+ }
48
+ catch { }
49
+ }
50
+ return args;
51
+ }
52
+ function isValidEditEntry(edit) {
53
+ if (!edit || typeof edit !== "object") {
54
+ return false;
55
+ }
56
+ const record = edit;
57
+ if (record.op !== "replace" &&
58
+ record.op !== "insert_before" &&
59
+ record.op !== "insert_after" &&
60
+ record.op !== "delete") {
61
+ return false;
62
+ }
63
+ if (typeof record.range !== "string") {
64
+ return false;
65
+ }
66
+ return record.op === "delete" || typeof record.new === "string";
67
+ }
68
+ function validateEditInput(input) {
69
+ if (!Array.isArray(input.edits) || input.edits.length === 0) {
70
+ throw new Error("Edit tool input is invalid. edits must contain at least one edit.");
71
+ }
72
+ if (!input.edits.every(isValidEditEntry)) {
73
+ throw new Error('Edit tool input is invalid. Each edit must include op and range, plus new unless op is "delete".');
74
+ }
75
+ return { path: input.path, edits: input.edits };
76
+ }
77
+ function createEditCallRenderComponent() {
78
+ return Object.assign(new Box(1, 1, (text) => text), {
79
+ preview: undefined,
80
+ previewArgsKey: undefined,
81
+ previewPending: false,
82
+ settledError: false,
83
+ });
84
+ }
85
+ function getEditCallRenderComponent(state, lastComponent) {
86
+ if (lastComponent instanceof Box) {
87
+ const component = lastComponent;
88
+ state.callComponent = component;
89
+ return component;
90
+ }
91
+ if (state.callComponent) {
92
+ return state.callComponent;
93
+ }
94
+ const component = createEditCallRenderComponent();
95
+ state.callComponent = component;
96
+ return component;
97
+ }
98
+ function getRenderablePreviewInput(args) {
99
+ if (!args) {
100
+ return null;
101
+ }
102
+ const path = typeof args.path === "string" ? args.path : typeof args.file_path === "string" ? args.file_path : null;
103
+ if (!path) {
104
+ return null;
105
+ }
106
+ if (Array.isArray(args.edits) &&
107
+ args.edits.length > 0 &&
108
+ args.edits.every((edit) => isValidEditEntry(edit))) {
109
+ return { path, edits: args.edits };
110
+ }
111
+ return null;
112
+ }
113
+ function formatEditCall(args, theme) {
114
+ const invalidArg = invalidArgText(theme);
115
+ const rawPath = str(args?.file_path ?? args?.path);
116
+ const path = rawPath !== null ? shortenPath(rawPath) : null;
117
+ const pathDisplay = path === null ? invalidArg : path ? theme.fg("accent", path) : theme.fg("toolOutput", "...");
118
+ return `${theme.fg("toolTitle", theme.bold("edit"))} ${pathDisplay}`;
119
+ }
120
+ function formatEditResult(args, preview, result, theme, isError) {
121
+ const rawPath = str(args?.file_path ?? args?.path);
122
+ const previewDiff = preview && !("error" in preview) ? preview.diff : undefined;
123
+ const previewError = preview && "error" in preview ? preview.error : undefined;
124
+ if (isError) {
125
+ const errorText = result.content
126
+ .filter((c) => c.type === "text")
127
+ .map((c) => c.text || "")
128
+ .join("\n");
129
+ if (!errorText || errorText === previewError) {
130
+ return undefined;
131
+ }
132
+ return theme.fg("error", errorText);
133
+ }
134
+ const resultDiff = result.details?.diff;
135
+ if (resultDiff && resultDiff !== previewDiff) {
136
+ return renderDiff(resultDiff, { filePath: rawPath ?? undefined });
137
+ }
138
+ return undefined;
139
+ }
140
+ function getEditHeaderBg(preview, settledError, theme) {
141
+ if (preview) {
142
+ if ("error" in preview) {
143
+ return (text) => theme.bg("toolErrorBg", text);
144
+ }
145
+ return (text) => theme.bg("toolSuccessBg", text);
146
+ }
147
+ if (settledError) {
148
+ return (text) => theme.bg("toolErrorBg", text);
149
+ }
150
+ return (text) => theme.bg("toolPendingBg", text);
151
+ }
152
+ function buildEditCallComponent(component, args, theme) {
153
+ component.setBgFn(getEditHeaderBg(component.preview, component.settledError, theme));
154
+ component.clear();
155
+ component.addChild(new Text(formatEditCall(args, theme), 0, 0));
156
+ if (!component.preview) {
157
+ return component;
158
+ }
159
+ const body = "error" in component.preview ? theme.fg("error", component.preview.error) : renderDiff(component.preview.diff);
160
+ component.addChild(new Spacer(1));
161
+ component.addChild(new Text(body, 0, 0));
162
+ return component;
163
+ }
164
+ function setEditPreview(component, preview, argsKey) {
165
+ const current = component.preview;
166
+ const changed = current === undefined ||
167
+ ("error" in current && "error" in preview
168
+ ? current.error !== preview.error
169
+ : "error" in current !== "error" in preview) ||
170
+ (!("error" in current) &&
171
+ !("error" in preview) &&
172
+ (current.diff !== preview.diff || current.firstChangedLine !== preview.firstChangedLine));
173
+ component.preview = preview;
174
+ component.previewArgsKey = argsKey;
175
+ component.previewPending = false;
176
+ return changed;
177
+ }
178
+ export function createEditToolDefinition(cwd, options) {
179
+ const ops = options?.operations ?? defaultEditOperations;
180
+ return {
181
+ name: "edit",
182
+ label: "edit",
183
+ description: "Edit a single file using range anchors from read output. Supports replace, insert_before, insert_after, and delete for one line or a continuous whole-line range. Ranges fail safely if the referenced lines changed or became ambiguous. If two changes affect the same block or nearby lines, merge them into one range edit instead of emitting overlapping edits.",
184
+ promptSnippet: "Make precise file edits with read range anchors, including multiple disjoint edits in one call",
185
+ promptGuidelines: [
186
+ "Use edits[].range from read output for every edit.",
187
+ "Use op=insert_after or op=insert_before instead of repeating the anchored line.",
188
+ "For partial-line changes, use op=replace and replace the whole line with the updated line.",
189
+ "When changing multiple separate locations in one file, use one edit call with multiple entries in edits[] instead of multiple edit calls",
190
+ "Each edit is resolved against the original file, not after earlier edits are applied. Do not emit overlapping or nested ranges. Merge nearby changes into one edit.",
191
+ ],
192
+ parameters: editSchema,
193
+ renderShell: "self",
194
+ prepareArguments: prepareEditArguments,
195
+ async execute(_toolCallId, input, signal, _onUpdate, _ctx) {
196
+ const { path, edits } = validateEditInput(input);
197
+ const absolutePath = resolveToCwd(path, cwd);
198
+ return withFileMutationQueue(absolutePath, () => new Promise((resolve, reject) => {
199
+ // Check if already aborted.
200
+ if (signal?.aborted) {
201
+ reject(new Error("Operation aborted"));
202
+ return;
203
+ }
204
+ let aborted = false;
205
+ // Set up abort handler.
206
+ const onAbort = () => {
207
+ aborted = true;
208
+ reject(new Error("Operation aborted"));
209
+ };
210
+ if (signal) {
211
+ signal.addEventListener("abort", onAbort, { once: true });
212
+ }
213
+ // Perform the edit operation.
214
+ void (async () => {
215
+ try {
216
+ // Check if file exists.
217
+ try {
218
+ await ops.access(absolutePath);
219
+ }
220
+ catch {
221
+ if (signal) {
222
+ signal.removeEventListener("abort", onAbort);
223
+ }
224
+ reject(new Error(`File not found: ${path}`));
225
+ return;
226
+ }
227
+ // Check if aborted before reading.
228
+ if (aborted) {
229
+ return;
230
+ }
231
+ // Read the file.
232
+ const buffer = await ops.readFile(absolutePath);
233
+ const rawContent = buffer.toString("utf-8");
234
+ // Check if aborted after reading.
235
+ if (aborted) {
236
+ return;
237
+ }
238
+ // Strip BOM before resolving line anchors.
239
+ const { bom, text: content } = stripBom(rawContent);
240
+ const originalEnding = detectLineEnding(content);
241
+ const normalizedContent = normalizeToLF(content);
242
+ const { baseContent, newContent } = applyEditsToNormalizedContent(normalizedContent, edits, path);
243
+ // Check if aborted before writing.
244
+ if (aborted) {
245
+ return;
246
+ }
247
+ const finalContent = bom + restoreLineEndings(newContent, originalEnding);
248
+ await ops.writeFile(absolutePath, finalContent);
249
+ // Check if aborted after writing.
250
+ if (aborted) {
251
+ return;
252
+ }
253
+ // Clean up abort handler.
254
+ if (signal) {
255
+ signal.removeEventListener("abort", onAbort);
256
+ }
257
+ const diffResult = generateDiffString(baseContent, newContent);
258
+ resolve({
259
+ content: [
260
+ {
261
+ type: "text",
262
+ text: `Successfully applied ${edits.length} edit(s) in ${path}.`,
263
+ },
264
+ ],
265
+ details: { diff: diffResult.diff, firstChangedLine: diffResult.firstChangedLine },
266
+ });
267
+ }
268
+ catch (error) {
269
+ // Clean up abort handler.
270
+ if (signal) {
271
+ signal.removeEventListener("abort", onAbort);
272
+ }
273
+ if (!aborted) {
274
+ reject(error instanceof Error ? error : new Error(String(error)));
275
+ }
276
+ }
277
+ })();
278
+ }));
279
+ },
280
+ renderCall(args, theme, context) {
281
+ const component = getEditCallRenderComponent(context.state, context.lastComponent);
282
+ const previewInput = getRenderablePreviewInput(args);
283
+ const argsKey = previewInput
284
+ ? JSON.stringify({ path: previewInput.path, edits: previewInput.edits })
285
+ : undefined;
286
+ if (component.previewArgsKey !== argsKey) {
287
+ component.preview = undefined;
288
+ component.previewArgsKey = argsKey;
289
+ component.previewPending = false;
290
+ component.settledError = false;
291
+ }
292
+ if (context.argsComplete && previewInput && !component.preview && !component.previewPending) {
293
+ component.previewPending = true;
294
+ const requestKey = argsKey;
295
+ void computeEditsDiff(previewInput.path, previewInput.edits, context.cwd).then((preview) => {
296
+ if (component.previewArgsKey === requestKey) {
297
+ setEditPreview(component, preview, requestKey);
298
+ context.invalidate();
299
+ }
300
+ });
301
+ }
302
+ return buildEditCallComponent(component, args, theme);
303
+ },
304
+ renderResult(result, _options, theme, context) {
305
+ const callComponent = context.state.callComponent;
306
+ const previewInput = getRenderablePreviewInput(context.args);
307
+ const argsKey = previewInput
308
+ ? JSON.stringify({ path: previewInput.path, edits: previewInput.edits })
309
+ : undefined;
310
+ const typedResult = result;
311
+ const resultDiff = !context.isError ? typedResult.details?.diff : undefined;
312
+ let changed = false;
313
+ if (callComponent) {
314
+ if (typeof resultDiff === "string") {
315
+ changed =
316
+ setEditPreview(callComponent, { diff: resultDiff, firstChangedLine: typedResult.details?.firstChangedLine }, argsKey) || changed;
317
+ }
318
+ if (callComponent.settledError !== context.isError) {
319
+ callComponent.settledError = context.isError;
320
+ changed = true;
321
+ }
322
+ if (changed) {
323
+ context.invalidate();
324
+ }
325
+ }
326
+ const output = formatEditResult(context.args, callComponent?.preview, typedResult, theme, context.isError);
327
+ const component = context.lastComponent ?? new Container();
328
+ component.clear();
329
+ if (!output) {
330
+ return component;
331
+ }
332
+ component.addChild(new Spacer(1));
333
+ component.addChild(new Text(output, 1, 0));
334
+ return component;
335
+ },
336
+ };
337
+ }
338
+ export function createEditTool(cwd, options) {
339
+ return wrapToolDefinition(createEditToolDefinition(cwd, options));
340
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Serialize file mutation operations targeting the same file.
3
+ * Operations for different files still run in parallel.
4
+ */
5
+ export declare function withFileMutationQueue<T>(filePath: string, fn: () => Promise<T>): Promise<T>;
@@ -0,0 +1,36 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ const fileMutationQueues = new Map();
4
+ function getMutationQueueKey(filePath) {
5
+ const resolvedPath = resolve(filePath);
6
+ try {
7
+ return realpathSync.native(resolvedPath);
8
+ }
9
+ catch {
10
+ return resolvedPath;
11
+ }
12
+ }
13
+ /**
14
+ * Serialize file mutation operations targeting the same file.
15
+ * Operations for different files still run in parallel.
16
+ */
17
+ export async function withFileMutationQueue(filePath, fn) {
18
+ const key = getMutationQueueKey(filePath);
19
+ const currentQueue = fileMutationQueues.get(key) ?? Promise.resolve();
20
+ let releaseNext;
21
+ const nextQueue = new Promise((resolveQueue) => {
22
+ releaseNext = resolveQueue;
23
+ });
24
+ const chainedQueue = currentQueue.then(() => nextQueue);
25
+ fileMutationQueues.set(key, chainedQueue);
26
+ await currentQueue;
27
+ try {
28
+ return await fn();
29
+ }
30
+ finally {
31
+ releaseNext();
32
+ if (fileMutationQueues.get(key) === chainedQueue) {
33
+ fileMutationQueues.delete(key);
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,34 @@
1
+ import type { AgentTool } from "../agent/types.js";
2
+ import { type Static } from "@sinclair/typebox";
3
+ import type { ToolDefinition } from "../extensions/types.js";
4
+ import { type TruncationResult } from "./truncate.js";
5
+ declare const findSchema: import("@sinclair/typebox").TObject<{
6
+ pattern: import("@sinclair/typebox").TString;
7
+ path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
8
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
9
+ }>;
10
+ export type FindToolInput = Static<typeof findSchema>;
11
+ export interface FindToolDetails {
12
+ truncation?: TruncationResult;
13
+ resultLimitReached?: number;
14
+ }
15
+ /**
16
+ * Pluggable operations for the find tool.
17
+ * Override these to delegate file search to remote systems (for example SSH).
18
+ */
19
+ export interface FindOperations {
20
+ /** Check if path exists */
21
+ exists: (absolutePath: string) => Promise<boolean> | boolean;
22
+ /** Find files matching glob pattern. Returns relative or absolute paths. */
23
+ glob: (pattern: string, cwd: string, options: {
24
+ ignore: string[];
25
+ limit: number;
26
+ }) => Promise<string[]> | string[];
27
+ }
28
+ export interface FindToolOptions {
29
+ /** Custom operations for find. Default: local filesystem plus fd */
30
+ operations?: FindOperations;
31
+ }
32
+ export declare function createFindToolDefinition(cwd: string, options?: FindToolOptions): ToolDefinition<typeof findSchema, FindToolDetails | undefined>;
33
+ export declare function createFindTool(cwd: string, options?: FindToolOptions): AgentTool<typeof findSchema>;
34
+ export {};