@wholiver_hu/metis 0.80.4

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 (837) hide show
  1. package/CHANGELOG.md +4857 -0
  2. package/README.md +681 -0
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +9 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/bun/restore-sandbox-env.d.ts +17 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +36 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +57 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +379 -0
  18. package/dist/cli/args.js.map +1 -0
  19. package/dist/cli/config-selector.d.ts +14 -0
  20. package/dist/cli/config-selector.d.ts.map +1 -0
  21. package/dist/cli/config-selector.js +31 -0
  22. package/dist/cli/config-selector.js.map +1 -0
  23. package/dist/cli/file-processor.d.ts +15 -0
  24. package/dist/cli/file-processor.d.ts.map +1 -0
  25. package/dist/cli/file-processor.js +70 -0
  26. package/dist/cli/file-processor.js.map +1 -0
  27. package/dist/cli/initial-message.d.ts +18 -0
  28. package/dist/cli/initial-message.d.ts.map +1 -0
  29. package/dist/cli/initial-message.js +22 -0
  30. package/dist/cli/initial-message.js.map +1 -0
  31. package/dist/cli/list-models.d.ts +9 -0
  32. package/dist/cli/list-models.d.ts.map +1 -0
  33. package/dist/cli/list-models.js +98 -0
  34. package/dist/cli/list-models.js.map +1 -0
  35. package/dist/cli/project-trust.d.ts +10 -0
  36. package/dist/cli/project-trust.d.ts.map +1 -0
  37. package/dist/cli/project-trust.js +48 -0
  38. package/dist/cli/project-trust.js.map +1 -0
  39. package/dist/cli/session-picker.d.ts +10 -0
  40. package/dist/cli/session-picker.d.ts.map +1 -0
  41. package/dist/cli/session-picker.js +36 -0
  42. package/dist/cli/session-picker.js.map +1 -0
  43. package/dist/cli/startup-ui.d.ts +20 -0
  44. package/dist/cli/startup-ui.d.ts.map +1 -0
  45. package/dist/cli/startup-ui.js +184 -0
  46. package/dist/cli/startup-ui.js.map +1 -0
  47. package/dist/cli.d.ts +3 -0
  48. package/dist/cli.d.ts.map +1 -0
  49. package/dist/cli.js +18 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/config.d.ts +96 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +455 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/core/agent-session-runtime.d.ts +119 -0
  56. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  57. package/dist/core/agent-session-runtime.js +295 -0
  58. package/dist/core/agent-session-runtime.js.map +1 -0
  59. package/dist/core/agent-session-services.d.ts +88 -0
  60. package/dist/core/agent-session-services.d.ts.map +1 -0
  61. package/dist/core/agent-session-services.js +119 -0
  62. package/dist/core/agent-session-services.js.map +1 -0
  63. package/dist/core/agent-session.d.ts +639 -0
  64. package/dist/core/agent-session.d.ts.map +1 -0
  65. package/dist/core/agent-session.js +2547 -0
  66. package/dist/core/agent-session.js.map +1 -0
  67. package/dist/core/auth-guidance.d.ts +5 -0
  68. package/dist/core/auth-guidance.d.ts.map +1 -0
  69. package/dist/core/auth-guidance.js +21 -0
  70. package/dist/core/auth-guidance.js.map +1 -0
  71. package/dist/core/auth-storage.d.ts +144 -0
  72. package/dist/core/auth-storage.d.ts.map +1 -0
  73. package/dist/core/auth-storage.js +439 -0
  74. package/dist/core/auth-storage.js.map +1 -0
  75. package/dist/core/bash-executor.d.ts +32 -0
  76. package/dist/core/bash-executor.d.ts.map +1 -0
  77. package/dist/core/bash-executor.js +111 -0
  78. package/dist/core/bash-executor.js.map +1 -0
  79. package/dist/core/compaction/branch-summarization.d.ts +92 -0
  80. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  81. package/dist/core/compaction/branch-summarization.js +249 -0
  82. package/dist/core/compaction/branch-summarization.js.map +1 -0
  83. package/dist/core/compaction/compaction.d.ts +122 -0
  84. package/dist/core/compaction/compaction.d.ts.map +1 -0
  85. package/dist/core/compaction/compaction.js +622 -0
  86. package/dist/core/compaction/compaction.js.map +1 -0
  87. package/dist/core/compaction/index.d.ts +7 -0
  88. package/dist/core/compaction/index.d.ts.map +1 -0
  89. package/dist/core/compaction/index.js +7 -0
  90. package/dist/core/compaction/index.js.map +1 -0
  91. package/dist/core/compaction/utils.d.ts +38 -0
  92. package/dist/core/compaction/utils.d.ts.map +1 -0
  93. package/dist/core/compaction/utils.js +153 -0
  94. package/dist/core/compaction/utils.js.map +1 -0
  95. package/dist/core/defaults.d.ts +3 -0
  96. package/dist/core/defaults.d.ts.map +1 -0
  97. package/dist/core/defaults.js +2 -0
  98. package/dist/core/defaults.js.map +1 -0
  99. package/dist/core/diagnostics.d.ts +15 -0
  100. package/dist/core/diagnostics.d.ts.map +1 -0
  101. package/dist/core/diagnostics.js +2 -0
  102. package/dist/core/diagnostics.js.map +1 -0
  103. package/dist/core/event-bus.d.ts +9 -0
  104. package/dist/core/event-bus.d.ts.map +1 -0
  105. package/dist/core/event-bus.js +25 -0
  106. package/dist/core/event-bus.js.map +1 -0
  107. package/dist/core/exec.d.ts +29 -0
  108. package/dist/core/exec.d.ts.map +1 -0
  109. package/dist/core/exec.js +75 -0
  110. package/dist/core/exec.js.map +1 -0
  111. package/dist/core/experimental.d.ts +2 -0
  112. package/dist/core/experimental.d.ts.map +1 -0
  113. package/dist/core/experimental.js +4 -0
  114. package/dist/core/experimental.js.map +1 -0
  115. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  116. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  117. package/dist/core/export-html/ansi-to-html.js +249 -0
  118. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  119. package/dist/core/export-html/index.d.ts +37 -0
  120. package/dist/core/export-html/index.d.ts.map +1 -0
  121. package/dist/core/export-html/index.js +226 -0
  122. package/dist/core/export-html/index.js.map +1 -0
  123. package/dist/core/export-html/template.css +1066 -0
  124. package/dist/core/export-html/template.html +55 -0
  125. package/dist/core/export-html/template.js +1864 -0
  126. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  127. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  128. package/dist/core/export-html/tool-renderer.js +108 -0
  129. package/dist/core/export-html/tool-renderer.js.map +1 -0
  130. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  131. package/dist/core/export-html/vendor/marked.min.js +78 -0
  132. package/dist/core/extensions/index.d.ts +12 -0
  133. package/dist/core/extensions/index.d.ts.map +1 -0
  134. package/dist/core/extensions/index.js +9 -0
  135. package/dist/core/extensions/index.js.map +1 -0
  136. package/dist/core/extensions/loader.d.ts +23 -0
  137. package/dist/core/extensions/loader.d.ts.map +1 -0
  138. package/dist/core/extensions/loader.js +527 -0
  139. package/dist/core/extensions/loader.js.map +1 -0
  140. package/dist/core/extensions/runner.d.ts +167 -0
  141. package/dist/core/extensions/runner.d.ts.map +1 -0
  142. package/dist/core/extensions/runner.js +901 -0
  143. package/dist/core/extensions/runner.js.map +1 -0
  144. package/dist/core/extensions/types.d.ts +1223 -0
  145. package/dist/core/extensions/types.d.ts.map +1 -0
  146. package/dist/core/extensions/types.js +45 -0
  147. package/dist/core/extensions/types.js.map +1 -0
  148. package/dist/core/extensions/wrapper.d.ts +20 -0
  149. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  150. package/dist/core/extensions/wrapper.js +22 -0
  151. package/dist/core/extensions/wrapper.js.map +1 -0
  152. package/dist/core/footer-data-provider.d.ts +54 -0
  153. package/dist/core/footer-data-provider.d.ts.map +1 -0
  154. package/dist/core/footer-data-provider.js +337 -0
  155. package/dist/core/footer-data-provider.js.map +1 -0
  156. package/dist/core/http-dispatcher.d.ts +22 -0
  157. package/dist/core/http-dispatcher.d.ts.map +1 -0
  158. package/dist/core/http-dispatcher.js +91 -0
  159. package/dist/core/http-dispatcher.js.map +1 -0
  160. package/dist/core/index.d.ts +13 -0
  161. package/dist/core/index.d.ts.map +1 -0
  162. package/dist/core/index.js +13 -0
  163. package/dist/core/index.js.map +1 -0
  164. package/dist/core/keybindings.d.ts +353 -0
  165. package/dist/core/keybindings.d.ts.map +1 -0
  166. package/dist/core/keybindings.js +291 -0
  167. package/dist/core/keybindings.js.map +1 -0
  168. package/dist/core/messages.d.ts +77 -0
  169. package/dist/core/messages.d.ts.map +1 -0
  170. package/dist/core/messages.js +123 -0
  171. package/dist/core/messages.js.map +1 -0
  172. package/dist/core/model-registry.d.ts +151 -0
  173. package/dist/core/model-registry.d.ts.map +1 -0
  174. package/dist/core/model-registry.js +748 -0
  175. package/dist/core/model-registry.js.map +1 -0
  176. package/dist/core/model-resolver.d.ts +121 -0
  177. package/dist/core/model-resolver.d.ts.map +1 -0
  178. package/dist/core/model-resolver.js +532 -0
  179. package/dist/core/model-resolver.js.map +1 -0
  180. package/dist/core/output-guard.d.ts +7 -0
  181. package/dist/core/output-guard.d.ts.map +1 -0
  182. package/dist/core/output-guard.js +89 -0
  183. package/dist/core/output-guard.js.map +1 -0
  184. package/dist/core/package-manager.d.ts +207 -0
  185. package/dist/core/package-manager.d.ts.map +1 -0
  186. package/dist/core/package-manager.js +2082 -0
  187. package/dist/core/package-manager.js.map +1 -0
  188. package/dist/core/project-trust.d.ts +15 -0
  189. package/dist/core/project-trust.d.ts.map +1 -0
  190. package/dist/core/project-trust.js +59 -0
  191. package/dist/core/project-trust.js.map +1 -0
  192. package/dist/core/prompt-templates.d.ts +53 -0
  193. package/dist/core/prompt-templates.d.ts.map +1 -0
  194. package/dist/core/prompt-templates.js +236 -0
  195. package/dist/core/prompt-templates.js.map +1 -0
  196. package/dist/core/provider-attribution.d.ts +4 -0
  197. package/dist/core/provider-attribution.d.ts.map +1 -0
  198. package/dist/core/provider-attribution.js +72 -0
  199. package/dist/core/provider-attribution.js.map +1 -0
  200. package/dist/core/provider-display-names.d.ts +2 -0
  201. package/dist/core/provider-display-names.d.ts.map +1 -0
  202. package/dist/core/provider-display-names.js +37 -0
  203. package/dist/core/provider-display-names.js.map +1 -0
  204. package/dist/core/resolve-config-value.d.ts +30 -0
  205. package/dist/core/resolve-config-value.d.ts.map +1 -0
  206. package/dist/core/resolve-config-value.js +247 -0
  207. package/dist/core/resolve-config-value.js.map +1 -0
  208. package/dist/core/resource-loader.d.ts +206 -0
  209. package/dist/core/resource-loader.d.ts.map +1 -0
  210. package/dist/core/resource-loader.js +776 -0
  211. package/dist/core/resource-loader.js.map +1 -0
  212. package/dist/core/sdk.d.ts +109 -0
  213. package/dist/core/sdk.d.ts.map +1 -0
  214. package/dist/core/sdk.js +267 -0
  215. package/dist/core/sdk.js.map +1 -0
  216. package/dist/core/session-cwd.d.ts +19 -0
  217. package/dist/core/session-cwd.d.ts.map +1 -0
  218. package/dist/core/session-cwd.js +37 -0
  219. package/dist/core/session-cwd.js.map +1 -0
  220. package/dist/core/session-manager.d.ts +351 -0
  221. package/dist/core/session-manager.d.ts.map +1 -0
  222. package/dist/core/session-manager.js +1248 -0
  223. package/dist/core/session-manager.js.map +1 -0
  224. package/dist/core/settings-manager.d.ts +291 -0
  225. package/dist/core/settings-manager.d.ts.map +1 -0
  226. package/dist/core/settings-manager.js +883 -0
  227. package/dist/core/settings-manager.js.map +1 -0
  228. package/dist/core/skills.d.ts +60 -0
  229. package/dist/core/skills.d.ts.map +1 -0
  230. package/dist/core/skills.js +387 -0
  231. package/dist/core/skills.js.map +1 -0
  232. package/dist/core/slash-commands.d.ts +14 -0
  233. package/dist/core/slash-commands.d.ts.map +1 -0
  234. package/dist/core/slash-commands.js +26 -0
  235. package/dist/core/slash-commands.js.map +1 -0
  236. package/dist/core/source-info.d.ts +18 -0
  237. package/dist/core/source-info.d.ts.map +1 -0
  238. package/dist/core/source-info.js +19 -0
  239. package/dist/core/source-info.js.map +1 -0
  240. package/dist/core/system-prompt.d.ts +30 -0
  241. package/dist/core/system-prompt.d.ts.map +1 -0
  242. package/dist/core/system-prompt.js +148 -0
  243. package/dist/core/system-prompt.js.map +1 -0
  244. package/dist/core/telemetry.d.ts +3 -0
  245. package/dist/core/telemetry.d.ts.map +1 -0
  246. package/dist/core/telemetry.js +9 -0
  247. package/dist/core/telemetry.js.map +1 -0
  248. package/dist/core/timings.d.ts +10 -0
  249. package/dist/core/timings.d.ts.map +1 -0
  250. package/dist/core/timings.js +41 -0
  251. package/dist/core/timings.js.map +1 -0
  252. package/dist/core/tools/bash.d.ts +68 -0
  253. package/dist/core/tools/bash.d.ts.map +1 -0
  254. package/dist/core/tools/bash.js +364 -0
  255. package/dist/core/tools/bash.js.map +1 -0
  256. package/dist/core/tools/edit-diff.d.ts +106 -0
  257. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  258. package/dist/core/tools/edit-diff.js +424 -0
  259. package/dist/core/tools/edit-diff.js.map +1 -0
  260. package/dist/core/tools/edit.d.ts +51 -0
  261. package/dist/core/tools/edit.d.ts.map +1 -0
  262. package/dist/core/tools/edit.js +284 -0
  263. package/dist/core/tools/edit.js.map +1 -0
  264. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  265. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  266. package/dist/core/tools/file-mutation-queue.js +52 -0
  267. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  268. package/dist/core/tools/find.d.ts +35 -0
  269. package/dist/core/tools/find.d.ts.map +1 -0
  270. package/dist/core/tools/find.js +305 -0
  271. package/dist/core/tools/find.js.map +1 -0
  272. package/dist/core/tools/grep.d.ts +37 -0
  273. package/dist/core/tools/grep.d.ts.map +1 -0
  274. package/dist/core/tools/grep.js +304 -0
  275. package/dist/core/tools/grep.js.map +1 -0
  276. package/dist/core/tools/index.d.ts +49 -0
  277. package/dist/core/tools/index.d.ts.map +1 -0
  278. package/dist/core/tools/index.js +142 -0
  279. package/dist/core/tools/index.js.map +1 -0
  280. package/dist/core/tools/ls.d.ts +37 -0
  281. package/dist/core/tools/ls.d.ts.map +1 -0
  282. package/dist/core/tools/ls.js +167 -0
  283. package/dist/core/tools/ls.js.map +1 -0
  284. package/dist/core/tools/output-accumulator.d.ts +52 -0
  285. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  286. package/dist/core/tools/output-accumulator.js +178 -0
  287. package/dist/core/tools/output-accumulator.js.map +1 -0
  288. package/dist/core/tools/path-utils.d.ts +10 -0
  289. package/dist/core/tools/path-utils.d.ts.map +1 -0
  290. package/dist/core/tools/path-utils.js +99 -0
  291. package/dist/core/tools/path-utils.js.map +1 -0
  292. package/dist/core/tools/read.d.ts +35 -0
  293. package/dist/core/tools/read.d.ts.map +1 -0
  294. package/dist/core/tools/read.js +276 -0
  295. package/dist/core/tools/read.js.map +1 -0
  296. package/dist/core/tools/render-utils.d.ts +24 -0
  297. package/dist/core/tools/render-utils.d.ts.map +1 -0
  298. package/dist/core/tools/render-utils.js +65 -0
  299. package/dist/core/tools/render-utils.js.map +1 -0
  300. package/dist/core/tools/subagent.d.ts +15 -0
  301. package/dist/core/tools/subagent.d.ts.map +1 -0
  302. package/dist/core/tools/subagent.js +100 -0
  303. package/dist/core/tools/subagent.js.map +1 -0
  304. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  305. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  306. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  307. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  308. package/dist/core/tools/truncate.d.ts +70 -0
  309. package/dist/core/tools/truncate.d.ts.map +1 -0
  310. package/dist/core/tools/truncate.js +215 -0
  311. package/dist/core/tools/truncate.js.map +1 -0
  312. package/dist/core/tools/webfetch.d.ts +17 -0
  313. package/dist/core/tools/webfetch.d.ts.map +1 -0
  314. package/dist/core/tools/webfetch.js +170 -0
  315. package/dist/core/tools/webfetch.js.map +1 -0
  316. package/dist/core/tools/websearch.d.ts +23 -0
  317. package/dist/core/tools/websearch.d.ts.map +1 -0
  318. package/dist/core/tools/websearch.js +176 -0
  319. package/dist/core/tools/websearch.js.map +1 -0
  320. package/dist/core/tools/write.d.ts +26 -0
  321. package/dist/core/tools/write.d.ts.map +1 -0
  322. package/dist/core/tools/write.js +196 -0
  323. package/dist/core/tools/write.js.map +1 -0
  324. package/dist/core/trust-manager.d.ts +36 -0
  325. package/dist/core/trust-manager.d.ts.map +1 -0
  326. package/dist/core/trust-manager.js +201 -0
  327. package/dist/core/trust-manager.js.map +1 -0
  328. package/dist/index.d.ts +34 -0
  329. package/dist/index.d.ts.map +1 -0
  330. package/dist/index.js +47 -0
  331. package/dist/index.js.map +1 -0
  332. package/dist/main.d.ts +12 -0
  333. package/dist/main.d.ts.map +1 -0
  334. package/dist/main.js +760 -0
  335. package/dist/main.js.map +1 -0
  336. package/dist/migrations.d.ts +33 -0
  337. package/dist/migrations.d.ts.map +1 -0
  338. package/dist/migrations.js +281 -0
  339. package/dist/migrations.js.map +1 -0
  340. package/dist/modes/index.d.ts +9 -0
  341. package/dist/modes/index.d.ts.map +1 -0
  342. package/dist/modes/index.js +8 -0
  343. package/dist/modes/index.js.map +1 -0
  344. package/dist/modes/interactive/assets/clankolas.png +0 -0
  345. package/dist/modes/interactive/components/armin.d.ts +34 -0
  346. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  347. package/dist/modes/interactive/components/armin.js +329 -0
  348. package/dist/modes/interactive/components/armin.js.map +1 -0
  349. package/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  350. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  351. package/dist/modes/interactive/components/assistant-message.js +123 -0
  352. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  353. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  354. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  355. package/dist/modes/interactive/components/bash-execution.js +170 -0
  356. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  357. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  358. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  359. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  360. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  361. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  362. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  363. package/dist/modes/interactive/components/branch-summary-message.js +42 -0
  364. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  365. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  366. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  367. package/dist/modes/interactive/components/compaction-summary-message.js +43 -0
  368. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  369. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  370. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  371. package/dist/modes/interactive/components/config-selector.js +496 -0
  372. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  373. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  374. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  375. package/dist/modes/interactive/components/countdown-timer.js +28 -0
  376. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  377. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  378. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  379. package/dist/modes/interactive/components/custom-editor.js +63 -0
  380. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  381. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  382. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  383. package/dist/modes/interactive/components/custom-entry.js +49 -0
  384. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  385. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  386. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  387. package/dist/modes/interactive/components/custom-message.js +74 -0
  388. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  389. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  390. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  391. package/dist/modes/interactive/components/daxnuts.js +138 -0
  392. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  393. package/dist/modes/interactive/components/diff.d.ts +12 -0
  394. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  395. package/dist/modes/interactive/components/diff.js +133 -0
  396. package/dist/modes/interactive/components/diff.js.map +1 -0
  397. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  398. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  399. package/dist/modes/interactive/components/dynamic-border.js +20 -0
  400. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  401. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  402. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  403. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  404. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  405. package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  406. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  407. package/dist/modes/interactive/components/extension-editor.js +122 -0
  408. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  409. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  410. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  411. package/dist/modes/interactive/components/extension-input.js +55 -0
  412. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  413. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  414. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  415. package/dist/modes/interactive/components/extension-selector.js +75 -0
  416. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  417. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  418. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  419. package/dist/modes/interactive/components/first-time-setup.js +101 -0
  420. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  421. package/dist/modes/interactive/components/footer.d.ts +28 -0
  422. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  423. package/dist/modes/interactive/components/footer.js +219 -0
  424. package/dist/modes/interactive/components/footer.js.map +1 -0
  425. package/dist/modes/interactive/components/fullscreen-root.d.ts +15 -0
  426. package/dist/modes/interactive/components/fullscreen-root.d.ts.map +1 -0
  427. package/dist/modes/interactive/components/fullscreen-root.js +36 -0
  428. package/dist/modes/interactive/components/fullscreen-root.js.map +1 -0
  429. package/dist/modes/interactive/components/index.d.ts +34 -0
  430. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  431. package/dist/modes/interactive/components/index.js +35 -0
  432. package/dist/modes/interactive/components/index.js.map +1 -0
  433. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  434. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  435. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  436. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  437. package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  438. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  439. package/dist/modes/interactive/components/login-dialog.js +173 -0
  440. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  441. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  442. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  443. package/dist/modes/interactive/components/model-selector.js +267 -0
  444. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  445. package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
  446. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  447. package/dist/modes/interactive/components/oauth-selector.js +156 -0
  448. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  449. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  450. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  451. package/dist/modes/interactive/components/scoped-models-selector.js +289 -0
  452. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  453. package/dist/modes/interactive/components/scrollable-container.d.ts +15 -0
  454. package/dist/modes/interactive/components/scrollable-container.d.ts.map +1 -0
  455. package/dist/modes/interactive/components/scrollable-container.js +50 -0
  456. package/dist/modes/interactive/components/scrollable-container.js.map +1 -0
  457. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  458. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  459. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  460. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  461. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  462. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  463. package/dist/modes/interactive/components/session-selector.js +843 -0
  464. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  465. package/dist/modes/interactive/components/settings-selector.d.ts +75 -0
  466. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  467. package/dist/modes/interactive/components/settings-selector.js +568 -0
  468. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  469. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  470. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  471. package/dist/modes/interactive/components/show-images-selector.js +38 -0
  472. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  473. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  474. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  475. package/dist/modes/interactive/components/skill-invocation-message.js +45 -0
  476. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  477. package/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  478. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  479. package/dist/modes/interactive/components/status-indicator.js +58 -0
  480. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  481. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  482. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  483. package/dist/modes/interactive/components/theme-selector.js +48 -0
  484. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  485. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  486. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  487. package/dist/modes/interactive/components/thinking-selector.js +50 -0
  488. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  489. package/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  490. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  491. package/dist/modes/interactive/components/tool-execution.js +302 -0
  492. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  493. package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
  494. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/tree-selector.js +1194 -0
  496. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  497. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  498. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/trust-selector.js +85 -0
  500. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  501. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  502. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  503. package/dist/modes/interactive/components/user-message-selector.js +111 -0
  504. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  505. package/dist/modes/interactive/components/user-message.d.ts +14 -0
  506. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  507. package/dist/modes/interactive/components/user-message.js +39 -0
  508. package/dist/modes/interactive/components/user-message.js.map +1 -0
  509. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  510. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  511. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  512. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  513. package/dist/modes/interactive/interactive-mode.d.ts +398 -0
  514. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  515. package/dist/modes/interactive/interactive-mode.js +4875 -0
  516. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  517. package/dist/modes/interactive/model-search.d.ts +12 -0
  518. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  519. package/dist/modes/interactive/model-search.js +15 -0
  520. package/dist/modes/interactive/model-search.js.map +1 -0
  521. package/dist/modes/interactive/theme/dark.json +87 -0
  522. package/dist/modes/interactive/theme/light.json +86 -0
  523. package/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  524. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  525. package/dist/modes/interactive/theme/theme-controller.js +97 -0
  526. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  527. package/dist/modes/interactive/theme/theme-schema.json +336 -0
  528. package/dist/modes/interactive/theme/theme.d.ts +119 -0
  529. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  530. package/dist/modes/interactive/theme/theme.js +1050 -0
  531. package/dist/modes/interactive/theme/theme.js.map +1 -0
  532. package/dist/modes/print-mode.d.ts +28 -0
  533. package/dist/modes/print-mode.d.ts.map +1 -0
  534. package/dist/modes/print-mode.js +132 -0
  535. package/dist/modes/print-mode.js.map +1 -0
  536. package/dist/modes/rpc/jsonl.d.ts +17 -0
  537. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  538. package/dist/modes/rpc/jsonl.js +49 -0
  539. package/dist/modes/rpc/jsonl.js.map +1 -0
  540. package/dist/modes/rpc/rpc-client.d.ts +242 -0
  541. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  542. package/dist/modes/rpc/rpc-client.js +480 -0
  543. package/dist/modes/rpc/rpc-client.js.map +1 -0
  544. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  545. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  546. package/dist/modes/rpc/rpc-mode.js +632 -0
  547. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  548. package/dist/modes/rpc/rpc-types.d.ts +446 -0
  549. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  550. package/dist/modes/rpc/rpc-types.js +8 -0
  551. package/dist/modes/rpc/rpc-types.js.map +1 -0
  552. package/dist/package-manager-cli.d.ts +8 -0
  553. package/dist/package-manager-cli.d.ts.map +1 -0
  554. package/dist/package-manager-cli.js +666 -0
  555. package/dist/package-manager-cli.js.map +1 -0
  556. package/dist/rpc-entry.d.ts +3 -0
  557. package/dist/rpc-entry.d.ts.map +1 -0
  558. package/dist/rpc-entry.js +10 -0
  559. package/dist/rpc-entry.js.map +1 -0
  560. package/dist/utils/ansi.d.ts +2 -0
  561. package/dist/utils/ansi.d.ts.map +1 -0
  562. package/dist/utils/ansi.js +52 -0
  563. package/dist/utils/ansi.js.map +1 -0
  564. package/dist/utils/changelog.d.ts +22 -0
  565. package/dist/utils/changelog.d.ts.map +1 -0
  566. package/dist/utils/changelog.js +165 -0
  567. package/dist/utils/changelog.js.map +1 -0
  568. package/dist/utils/child-process.d.ts +18 -0
  569. package/dist/utils/child-process.d.ts.map +1 -0
  570. package/dist/utils/child-process.js +106 -0
  571. package/dist/utils/child-process.js.map +1 -0
  572. package/dist/utils/clipboard-image.d.ts +11 -0
  573. package/dist/utils/clipboard-image.d.ts.map +1 -0
  574. package/dist/utils/clipboard-image.js +245 -0
  575. package/dist/utils/clipboard-image.js.map +1 -0
  576. package/dist/utils/clipboard-native.d.ts +10 -0
  577. package/dist/utils/clipboard-native.d.ts.map +1 -0
  578. package/dist/utils/clipboard-native.js +20 -0
  579. package/dist/utils/clipboard-native.js.map +1 -0
  580. package/dist/utils/clipboard.d.ts +2 -0
  581. package/dist/utils/clipboard.d.ts.map +1 -0
  582. package/dist/utils/clipboard.js +117 -0
  583. package/dist/utils/clipboard.js.map +1 -0
  584. package/dist/utils/deprecation.d.ts +4 -0
  585. package/dist/utils/deprecation.d.ts.map +1 -0
  586. package/dist/utils/deprecation.js +13 -0
  587. package/dist/utils/deprecation.js.map +1 -0
  588. package/dist/utils/exif-orientation.d.ts +5 -0
  589. package/dist/utils/exif-orientation.d.ts.map +1 -0
  590. package/dist/utils/exif-orientation.js +158 -0
  591. package/dist/utils/exif-orientation.js.map +1 -0
  592. package/dist/utils/frontmatter.d.ts +8 -0
  593. package/dist/utils/frontmatter.d.ts.map +1 -0
  594. package/dist/utils/frontmatter.js +26 -0
  595. package/dist/utils/frontmatter.js.map +1 -0
  596. package/dist/utils/fs-watch.d.ts +5 -0
  597. package/dist/utils/fs-watch.d.ts.map +1 -0
  598. package/dist/utils/fs-watch.js +25 -0
  599. package/dist/utils/fs-watch.js.map +1 -0
  600. package/dist/utils/git.d.ts +26 -0
  601. package/dist/utils/git.d.ts.map +1 -0
  602. package/dist/utils/git.js +195 -0
  603. package/dist/utils/git.js.map +1 -0
  604. package/dist/utils/html.d.ts +7 -0
  605. package/dist/utils/html.d.ts.map +1 -0
  606. package/dist/utils/html.js +40 -0
  607. package/dist/utils/html.js.map +1 -0
  608. package/dist/utils/image-convert.d.ts +10 -0
  609. package/dist/utils/image-convert.d.ts.map +1 -0
  610. package/dist/utils/image-convert.js +45 -0
  611. package/dist/utils/image-convert.js.map +1 -0
  612. package/dist/utils/image-process.d.ts +18 -0
  613. package/dist/utils/image-process.d.ts.map +1 -0
  614. package/dist/utils/image-process.js +83 -0
  615. package/dist/utils/image-process.js.map +1 -0
  616. package/dist/utils/image-resize-core.d.ts +30 -0
  617. package/dist/utils/image-resize-core.d.ts.map +1 -0
  618. package/dist/utils/image-resize-core.js +124 -0
  619. package/dist/utils/image-resize-core.js.map +1 -0
  620. package/dist/utils/image-resize-worker.d.ts +2 -0
  621. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  622. package/dist/utils/image-resize-worker.js +31 -0
  623. package/dist/utils/image-resize-worker.js.map +1 -0
  624. package/dist/utils/image-resize.d.ts +16 -0
  625. package/dist/utils/image-resize.d.ts.map +1 -0
  626. package/dist/utils/image-resize.js +97 -0
  627. package/dist/utils/image-resize.js.map +1 -0
  628. package/dist/utils/json.d.ts +3 -0
  629. package/dist/utils/json.d.ts.map +1 -0
  630. package/dist/utils/json.js +7 -0
  631. package/dist/utils/json.js.map +1 -0
  632. package/dist/utils/metis-user-agent.d.ts +2 -0
  633. package/dist/utils/metis-user-agent.d.ts.map +1 -0
  634. package/dist/utils/metis-user-agent.js +5 -0
  635. package/dist/utils/metis-user-agent.js.map +1 -0
  636. package/dist/utils/mime.d.ts +3 -0
  637. package/dist/utils/mime.d.ts.map +1 -0
  638. package/dist/utils/mime.js +110 -0
  639. package/dist/utils/mime.js.map +1 -0
  640. package/dist/utils/open-browser.d.ts +9 -0
  641. package/dist/utils/open-browser.d.ts.map +1 -0
  642. package/dist/utils/open-browser.js +22 -0
  643. package/dist/utils/open-browser.js.map +1 -0
  644. package/dist/utils/paths.d.ts +31 -0
  645. package/dist/utils/paths.d.ts.map +1 -0
  646. package/dist/utils/paths.js +92 -0
  647. package/dist/utils/paths.js.map +1 -0
  648. package/dist/utils/photon.d.ts +21 -0
  649. package/dist/utils/photon.d.ts.map +1 -0
  650. package/dist/utils/photon.js +121 -0
  651. package/dist/utils/photon.js.map +1 -0
  652. package/dist/utils/shell.d.ts +31 -0
  653. package/dist/utils/shell.d.ts.map +1 -0
  654. package/dist/utils/shell.js +202 -0
  655. package/dist/utils/shell.js.map +1 -0
  656. package/dist/utils/sleep.d.ts +5 -0
  657. package/dist/utils/sleep.d.ts.map +1 -0
  658. package/dist/utils/sleep.js +17 -0
  659. package/dist/utils/sleep.js.map +1 -0
  660. package/dist/utils/syntax-highlight.d.ts +12 -0
  661. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  662. package/dist/utils/syntax-highlight.js +118 -0
  663. package/dist/utils/syntax-highlight.js.map +1 -0
  664. package/dist/utils/tools-manager.d.ts +3 -0
  665. package/dist/utils/tools-manager.d.ts.map +1 -0
  666. package/dist/utils/tools-manager.js +328 -0
  667. package/dist/utils/tools-manager.js.map +1 -0
  668. package/dist/utils/version-check.d.ts +15 -0
  669. package/dist/utils/version-check.d.ts.map +1 -0
  670. package/dist/utils/version-check.js +59 -0
  671. package/dist/utils/version-check.js.map +1 -0
  672. package/dist/utils/windows-self-update.d.ts +3 -0
  673. package/dist/utils/windows-self-update.d.ts.map +1 -0
  674. package/dist/utils/windows-self-update.js +77 -0
  675. package/dist/utils/windows-self-update.js.map +1 -0
  676. package/docs/compaction.md +396 -0
  677. package/docs/containerization.md +111 -0
  678. package/docs/custom-provider.md +737 -0
  679. package/docs/development.md +71 -0
  680. package/docs/docs.json +156 -0
  681. package/docs/extensions.md +2728 -0
  682. package/docs/images/doom-extension.png +0 -0
  683. package/docs/images/exy.png +0 -0
  684. package/docs/images/interactive-mode.png +0 -0
  685. package/docs/images/tree-view.png +0 -0
  686. package/docs/index.md +82 -0
  687. package/docs/json.md +82 -0
  688. package/docs/keybindings.md +197 -0
  689. package/docs/models.md +495 -0
  690. package/docs/packages.md +227 -0
  691. package/docs/prompt-templates.md +95 -0
  692. package/docs/providers.md +275 -0
  693. package/docs/quickstart.md +165 -0
  694. package/docs/rpc.md +1470 -0
  695. package/docs/sdk.md +1171 -0
  696. package/docs/security.md +59 -0
  697. package/docs/session-format.md +422 -0
  698. package/docs/sessions.md +145 -0
  699. package/docs/settings.md +318 -0
  700. package/docs/shell-aliases.md +13 -0
  701. package/docs/skills.md +231 -0
  702. package/docs/terminal-setup.md +142 -0
  703. package/docs/termux.md +127 -0
  704. package/docs/themes.md +295 -0
  705. package/docs/tmux.md +63 -0
  706. package/docs/tui.md +927 -0
  707. package/docs/usage.md +308 -0
  708. package/docs/windows.md +17 -0
  709. package/examples/README.md +25 -0
  710. package/examples/extensions/README.md +212 -0
  711. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  712. package/examples/extensions/bash-spawn-hook.ts +30 -0
  713. package/examples/extensions/bookmark.ts +50 -0
  714. package/examples/extensions/border-status-editor.ts +150 -0
  715. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  716. package/examples/extensions/claude-rules.ts +86 -0
  717. package/examples/extensions/commands.ts +72 -0
  718. package/examples/extensions/confirm-destructive.ts +59 -0
  719. package/examples/extensions/custom-compaction.ts +128 -0
  720. package/examples/extensions/custom-footer.ts +64 -0
  721. package/examples/extensions/custom-header.ts +73 -0
  722. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  723. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  724. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  725. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -0
  726. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  727. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  728. package/examples/extensions/dirty-repo-guard.ts +56 -0
  729. package/examples/extensions/doom-overlay/README.md +46 -0
  730. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  731. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  732. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  733. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  734. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  735. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  736. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  737. package/examples/extensions/doom-overlay/index.ts +74 -0
  738. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  739. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  740. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  741. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  742. package/examples/extensions/dynamic-resources/index.ts +15 -0
  743. package/examples/extensions/dynamic-tools.ts +74 -0
  744. package/examples/extensions/entry-renderer.ts +41 -0
  745. package/examples/extensions/event-bus.ts +43 -0
  746. package/examples/extensions/file-trigger.ts +41 -0
  747. package/examples/extensions/git-checkpoint.ts +53 -0
  748. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  749. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  750. package/examples/extensions/gondolin/index.ts +531 -0
  751. package/examples/extensions/gondolin/package-lock.json +185 -0
  752. package/examples/extensions/gondolin/package.json +19 -0
  753. package/examples/extensions/handoff.ts +191 -0
  754. package/examples/extensions/hello.ts +26 -0
  755. package/examples/extensions/hidden-thinking-label.ts +53 -0
  756. package/examples/extensions/inline-bash.ts +94 -0
  757. package/examples/extensions/input-transform-streaming.ts +39 -0
  758. package/examples/extensions/input-transform.ts +43 -0
  759. package/examples/extensions/interactive-shell.ts +196 -0
  760. package/examples/extensions/mac-system-theme.ts +47 -0
  761. package/examples/extensions/message-renderer.ts +59 -0
  762. package/examples/extensions/minimal-mode.ts +426 -0
  763. package/examples/extensions/modal-editor.ts +85 -0
  764. package/examples/extensions/model-status.ts +31 -0
  765. package/examples/extensions/notify.ts +55 -0
  766. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  767. package/examples/extensions/overlay-test.ts +153 -0
  768. package/examples/extensions/permission-gate.ts +34 -0
  769. package/examples/extensions/pirate.ts +47 -0
  770. package/examples/extensions/plan-mode/README.md +66 -0
  771. package/examples/extensions/plan-mode/index.ts +390 -0
  772. package/examples/extensions/plan-mode/utils.ts +168 -0
  773. package/examples/extensions/preset.ts +436 -0
  774. package/examples/extensions/project-trust.ts +64 -0
  775. package/examples/extensions/prompt-customizer.ts +97 -0
  776. package/examples/extensions/protected-paths.ts +30 -0
  777. package/examples/extensions/provider-payload.ts +18 -0
  778. package/examples/extensions/qna.ts +122 -0
  779. package/examples/extensions/question.ts +286 -0
  780. package/examples/extensions/questionnaire.ts +448 -0
  781. package/examples/extensions/rainbow-editor.ts +88 -0
  782. package/examples/extensions/reload-runtime.ts +37 -0
  783. package/examples/extensions/rpc-demo.ts +118 -0
  784. package/examples/extensions/sandbox/index.ts +321 -0
  785. package/examples/extensions/sandbox/package-lock.json +92 -0
  786. package/examples/extensions/sandbox/package.json +19 -0
  787. package/examples/extensions/send-user-message.ts +97 -0
  788. package/examples/extensions/session-name.ts +27 -0
  789. package/examples/extensions/shutdown-command.ts +63 -0
  790. package/examples/extensions/snake.ts +343 -0
  791. package/examples/extensions/space-invaders.ts +560 -0
  792. package/examples/extensions/ssh.ts +220 -0
  793. package/examples/extensions/status-line.ts +32 -0
  794. package/examples/extensions/structured-output.ts +65 -0
  795. package/examples/extensions/subagent/README.md +175 -0
  796. package/examples/extensions/subagent/agents/planner.md +37 -0
  797. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  798. package/examples/extensions/subagent/agents/scout.md +50 -0
  799. package/examples/extensions/subagent/agents/worker.md +24 -0
  800. package/examples/extensions/subagent/agents.ts +126 -0
  801. package/examples/extensions/subagent/index.ts +1015 -0
  802. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  803. package/examples/extensions/subagent/prompts/implement.md +10 -0
  804. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  805. package/examples/extensions/summarize.ts +207 -0
  806. package/examples/extensions/system-prompt-header.ts +17 -0
  807. package/examples/extensions/tic-tac-toe.ts +1008 -0
  808. package/examples/extensions/timed-confirm.ts +70 -0
  809. package/examples/extensions/titlebar-spinner.ts +58 -0
  810. package/examples/extensions/todo.ts +297 -0
  811. package/examples/extensions/tool-override.ts +144 -0
  812. package/examples/extensions/tools.ts +146 -0
  813. package/examples/extensions/trigger-compact.ts +50 -0
  814. package/examples/extensions/truncated-tool.ts +195 -0
  815. package/examples/extensions/widget-placement.ts +9 -0
  816. package/examples/extensions/with-deps/index.ts +32 -0
  817. package/examples/extensions/with-deps/package-lock.json +31 -0
  818. package/examples/extensions/with-deps/package.json +22 -0
  819. package/examples/extensions/working-indicator.ts +123 -0
  820. package/examples/extensions/working-message-test.ts +25 -0
  821. package/examples/rpc-extension-ui.ts +632 -0
  822. package/examples/sdk/01-minimal.ts +26 -0
  823. package/examples/sdk/02-custom-model.ts +53 -0
  824. package/examples/sdk/03-custom-prompt.ts +75 -0
  825. package/examples/sdk/04-skills.ts +55 -0
  826. package/examples/sdk/05-tools.ts +48 -0
  827. package/examples/sdk/06-extensions.ts +99 -0
  828. package/examples/sdk/07-context-files.ts +47 -0
  829. package/examples/sdk/08-prompt-templates.ts +51 -0
  830. package/examples/sdk/09-api-keys-and-oauth.ts +52 -0
  831. package/examples/sdk/10-settings.ts +53 -0
  832. package/examples/sdk/11-sessions.ts +52 -0
  833. package/examples/sdk/12-full-control.ts +77 -0
  834. package/examples/sdk/13-session-runtime.ts +67 -0
  835. package/examples/sdk/README.md +144 -0
  836. package/npm-shrinkwrap.json +4874 -0
  837. package/package.json +104 -0
@@ -0,0 +1,23 @@
1
+ import type { AgentTool } from "@earendil-works/metis-agent-core";
2
+ import { type Static, Type } from "typebox";
3
+ import type { ToolDefinition } from "../extensions/types.ts";
4
+ export declare const EXA_URL: string;
5
+ export declare const PARALLEL_URL = "https://search.parallel.ai/mcp";
6
+ declare const webSearchSchema: Type.TObject<{
7
+ query: Type.TString;
8
+ numResults: Type.TOptional<Type.TNumber>;
9
+ livecrawl: Type.TOptional<Type.TUnion<[Type.TLiteral<"fallback">, Type.TLiteral<"preferred">]>>;
10
+ type: Type.TOptional<Type.TUnion<[Type.TLiteral<"auto">, Type.TLiteral<"fast">, Type.TLiteral<"deep">]>>;
11
+ contextMaxCharacters: Type.TOptional<Type.TNumber>;
12
+ }>;
13
+ export type WebSearchToolInput = Static<typeof webSearchSchema>;
14
+ export interface WebSearchToolOptions {
15
+ /** Provide a custom endpoint URL. Default: uses EXA_API_KEY env variable to construct Exa MCP endpoint */
16
+ endpointUrl?: string;
17
+ /** Force specific provider identifier for logging */
18
+ provider?: "exa" | "parallel";
19
+ }
20
+ export declare function createWebSearchToolDefinition(options?: WebSearchToolOptions): ToolDefinition<typeof webSearchSchema, undefined>;
21
+ export declare function createWebSearchTool(options?: WebSearchToolOptions): AgentTool<typeof webSearchSchema>;
22
+ export {};
23
+ //# sourceMappingURL=websearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websearch.d.ts","sourceRoot":"","sources":["../../../src/core/tools/websearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAElE,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AAItF,eAAO,MAAM,OAAO,QAEO,CAAC;AAC5B,eAAO,MAAM,YAAY,mCAAmC,CAAC;AAE7D,QAAA,MAAM,eAAe;;;;;;EAwBnB,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAEhE,MAAM,WAAW,oBAAoB;IACpC,0GAA0G;IAC1G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;CAC9B;AAmED,wBAAgB,6BAA6B,CAC5C,OAAO,CAAC,EAAE,oBAAoB,GAC5B,cAAc,CAAC,OAAO,eAAe,EAAE,SAAS,CAAC,CA4GnD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC,OAAO,eAAe,CAAC,CAErG"}
@@ -0,0 +1,176 @@
1
+ import { Text } from "@earendil-works/metis-tui";
2
+ import { Type } from "typebox";
3
+ import { getTextOutput, invalidArgText, str } from "./render-utils.js";
4
+ import { wrapToolDefinition } from "./tool-definition-wrapper.js";
5
+ export const EXA_URL = process.env.EXA_API_KEY
6
+ ? `https://mcp.exa.ai/mcp?exaApiKey=${encodeURIComponent(process.env.EXA_API_KEY)}`
7
+ : "https://mcp.exa.ai/mcp";
8
+ export const PARALLEL_URL = "https://search.parallel.ai/mcp";
9
+ const webSearchSchema = Type.Object({
10
+ query: Type.String({ description: "Websearch query" }),
11
+ numResults: Type.Optional(Type.Number({
12
+ description: "Number of search results to return (default: 8)",
13
+ })),
14
+ livecrawl: Type.Optional(Type.Union([Type.Literal("fallback"), Type.Literal("preferred")], {
15
+ description: "Live crawl mode - 'fallback': use live crawling as backup if cached content unavailable, 'preferred': prioritize live crawling (default: 'fallback')",
16
+ })),
17
+ type: Type.Optional(Type.Union([Type.Literal("auto"), Type.Literal("fast"), Type.Literal("deep")], {
18
+ description: "Search type - 'auto': balanced search (default), 'fast': quick results, 'deep': comprehensive search",
19
+ })),
20
+ contextMaxCharacters: Type.Optional(Type.Number({
21
+ description: "Maximum characters for context string optimized for LLMs (default: 10000)",
22
+ })),
23
+ });
24
+ function formatWebSearchCall(args, theme) {
25
+ const query = str(args?.query);
26
+ const invalidArg = invalidArgText(theme);
27
+ return (theme.fg("toolTitle", theme.bold("websearch")) + " " + (query === null ? invalidArg : theme.fg("accent", query)));
28
+ }
29
+ function formatWebSearchResult(result, options, theme, showImages) {
30
+ const output = getTextOutput(result, showImages).trim();
31
+ if (!output)
32
+ return "";
33
+ const lines = output.split("\n");
34
+ const maxLines = options.expanded ? lines.length : 5;
35
+ const displayLines = lines.slice(0, maxLines);
36
+ const remaining = lines.length - maxLines;
37
+ let text = `\n${displayLines.map((line) => theme.fg("toolOutput", line)).join("\n")}`;
38
+ if (remaining > 0) {
39
+ text += `\n${theme.fg("muted", `... (${remaining} more lines)`)}`;
40
+ }
41
+ return text;
42
+ }
43
+ // Parses JSON-RPC response from MCP endpoint
44
+ async function parseResponse(response) {
45
+ const body = await response.text();
46
+ const trimmed = body.trim();
47
+ const parsePayload = (payload) => {
48
+ try {
49
+ const data = JSON.parse(payload);
50
+ if (data && data.result && Array.isArray(data.result.content)) {
51
+ const item = data.result.content.find((i) => typeof i.text === "string");
52
+ return item?.text;
53
+ }
54
+ }
55
+ catch {
56
+ return undefined;
57
+ }
58
+ return undefined;
59
+ };
60
+ if (trimmed.startsWith("{")) {
61
+ const direct = parsePayload(trimmed);
62
+ if (direct)
63
+ return direct;
64
+ }
65
+ // Try extracting from Server-Sent Events format (data: {...})
66
+ for (const line of trimmed.split("\n")) {
67
+ if (line.startsWith("data: ")) {
68
+ const data = parsePayload(line.substring(6));
69
+ if (data)
70
+ return data;
71
+ }
72
+ }
73
+ return undefined;
74
+ }
75
+ export function createWebSearchToolDefinition(options) {
76
+ return {
77
+ name: "websearch",
78
+ label: "web search",
79
+ description: "Search the web for up-to-date information.",
80
+ promptSnippet: "Search the web for the given query.",
81
+ parameters: webSearchSchema,
82
+ async execute(_toolCallId, args, signal) {
83
+ if (signal?.aborted)
84
+ throw new Error("Operation aborted");
85
+ let url = options?.endpointUrl || EXA_URL;
86
+ let isParallel = false;
87
+ const provider = options?.provider || (process.env.metis_WEBSEARCH_PROVIDER === "parallel" ? "parallel" : "exa");
88
+ if (provider === "parallel" && !options?.endpointUrl) {
89
+ url = PARALLEL_URL;
90
+ isParallel = true;
91
+ }
92
+ const headers = {
93
+ "Content-Type": "application/json",
94
+ Accept: "application/json, text/event-stream",
95
+ };
96
+ if (isParallel && process.env.PARALLEL_API_KEY) {
97
+ headers["Authorization"] = `Bearer ${process.env.PARALLEL_API_KEY}`;
98
+ }
99
+ let methodArgs = {
100
+ query: args.query,
101
+ numResults: args.numResults || 8,
102
+ livecrawl: args.livecrawl || "fallback",
103
+ type: args.type || "auto",
104
+ contextMaxCharacters: args.contextMaxCharacters,
105
+ };
106
+ let toolName = "web_search_exa";
107
+ if (isParallel) {
108
+ toolName = "web_search";
109
+ methodArgs = {
110
+ objective: args.query,
111
+ search_queries: [args.query],
112
+ };
113
+ }
114
+ const payload = {
115
+ jsonrpc: "2.0",
116
+ id: 1,
117
+ method: "tools/call",
118
+ params: {
119
+ name: toolName,
120
+ arguments: methodArgs,
121
+ },
122
+ };
123
+ const abortController = new AbortController();
124
+ const onAbort = () => abortController.abort();
125
+ signal?.addEventListener("abort", onAbort, { once: true });
126
+ // Set a 25-second timeout as in the original implementation
127
+ const timeoutId = setTimeout(() => abortController.abort(), 25000);
128
+ try {
129
+ const response = await fetch(url, {
130
+ method: "POST",
131
+ headers,
132
+ body: JSON.stringify(payload),
133
+ signal: abortController.signal,
134
+ });
135
+ if (!response.ok) {
136
+ throw new Error(`Web search failed with status: ${response.status} ${response.statusText}`);
137
+ }
138
+ const resultText = await parseResponse(response);
139
+ if (!resultText) {
140
+ return {
141
+ content: [{ type: "text", text: "No search results found. Please try a different query." }],
142
+ details: undefined,
143
+ };
144
+ }
145
+ return {
146
+ content: [{ type: "text", text: resultText }],
147
+ details: undefined,
148
+ };
149
+ }
150
+ catch (e) {
151
+ if (e.name === "AbortError") {
152
+ throw new Error("Web search request timed out or was aborted");
153
+ }
154
+ throw e;
155
+ }
156
+ finally {
157
+ clearTimeout(timeoutId);
158
+ signal?.removeEventListener("abort", onAbort);
159
+ }
160
+ },
161
+ renderCall(args, theme, context) {
162
+ const text = context.lastComponent ?? new Text("", 0, 0);
163
+ text.setText(formatWebSearchCall(args, theme));
164
+ return text;
165
+ },
166
+ renderResult(result, options, theme, context) {
167
+ const text = context.lastComponent ?? new Text("", 0, 0);
168
+ text.setText(formatWebSearchResult(result, options, theme, context.showImages));
169
+ return text;
170
+ },
171
+ };
172
+ }
173
+ export function createWebSearchTool(options) {
174
+ return wrapToolDefinition(createWebSearchToolDefinition(options));
175
+ }
176
+ //# sourceMappingURL=websearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websearch.js","sourceRoot":"","sources":["../../../src/core/tools/websearch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/metis-agent-core\";\nimport { Text } from \"@earendil-works/metis-tui\";\nimport { type Static, Type } from \"typebox\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { getTextOutput, invalidArgText, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nexport const EXA_URL = process.env.EXA_API_KEY\n\t? `https://mcp.exa.ai/mcp?exaApiKey=${encodeURIComponent(process.env.EXA_API_KEY)}`\n\t: \"https://mcp.exa.ai/mcp\";\nexport const PARALLEL_URL = \"https://search.parallel.ai/mcp\";\n\nconst webSearchSchema = Type.Object({\n\tquery: Type.String({ description: \"Websearch query\" }),\n\tnumResults: Type.Optional(\n\t\tType.Number({\n\t\t\tdescription: \"Number of search results to return (default: 8)\",\n\t\t}),\n\t),\n\tlivecrawl: Type.Optional(\n\t\tType.Union([Type.Literal(\"fallback\"), Type.Literal(\"preferred\")], {\n\t\t\tdescription:\n\t\t\t\t\"Live crawl mode - 'fallback': use live crawling as backup if cached content unavailable, 'preferred': prioritize live crawling (default: 'fallback')\",\n\t\t}),\n\t),\n\ttype: Type.Optional(\n\t\tType.Union([Type.Literal(\"auto\"), Type.Literal(\"fast\"), Type.Literal(\"deep\")], {\n\t\t\tdescription:\n\t\t\t\t\"Search type - 'auto': balanced search (default), 'fast': quick results, 'deep': comprehensive search\",\n\t\t}),\n\t),\n\tcontextMaxCharacters: Type.Optional(\n\t\tType.Number({\n\t\t\tdescription: \"Maximum characters for context string optimized for LLMs (default: 10000)\",\n\t\t}),\n\t),\n});\n\nexport type WebSearchToolInput = Static<typeof webSearchSchema>;\n\nexport interface WebSearchToolOptions {\n\t/** Provide a custom endpoint URL. Default: uses EXA_API_KEY env variable to construct Exa MCP endpoint */\n\tendpointUrl?: string;\n\t/** Force specific provider identifier for logging */\n\tprovider?: \"exa\" | \"parallel\";\n}\n\nfunction formatWebSearchCall(args: WebSearchToolInput | undefined, theme: Theme): string {\n\tconst query = str(args?.query);\n\tconst invalidArg = invalidArgText(theme);\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"websearch\")) + \" \" + (query === null ? invalidArg : theme.fg(\"accent\", query))\n\t);\n}\n\nfunction formatWebSearchResult(\n\tresult: {\n\t\tcontent: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\t},\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n): string {\n\tconst output = getTextOutput(result, showImages).trim();\n\tif (!output) return \"\";\n\n\tconst lines = output.split(\"\\n\");\n\tconst maxLines = options.expanded ? lines.length : 5;\n\tconst displayLines = lines.slice(0, maxLines);\n\tconst remaining = lines.length - maxLines;\n\n\tlet text = `\\n${displayLines.map((line) => theme.fg(\"toolOutput\", line)).join(\"\\n\")}`;\n\tif (remaining > 0) {\n\t\ttext += `\\n${theme.fg(\"muted\", `... (${remaining} more lines)`)}`;\n\t}\n\treturn text;\n}\n\n// Parses JSON-RPC response from MCP endpoint\nasync function parseResponse(response: Response): Promise<string | undefined> {\n\tconst body = await response.text();\n\tconst trimmed = body.trim();\n\n\tconst parsePayload = (payload: string): string | undefined => {\n\t\ttry {\n\t\t\tconst data = JSON.parse(payload);\n\t\t\tif (data && data.result && Array.isArray(data.result.content)) {\n\t\t\t\tconst item = data.result.content.find((i: any) => typeof i.text === \"string\");\n\t\t\t\treturn item?.text;\n\t\t\t}\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn undefined;\n\t};\n\n\tif (trimmed.startsWith(\"{\")) {\n\t\tconst direct = parsePayload(trimmed);\n\t\tif (direct) return direct;\n\t}\n\n\t// Try extracting from Server-Sent Events format (data: {...})\n\tfor (const line of trimmed.split(\"\\n\")) {\n\t\tif (line.startsWith(\"data: \")) {\n\t\t\tconst data = parsePayload(line.substring(6));\n\t\t\tif (data) return data;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nexport function createWebSearchToolDefinition(\n\toptions?: WebSearchToolOptions,\n): ToolDefinition<typeof webSearchSchema, undefined> {\n\treturn {\n\t\tname: \"websearch\",\n\t\tlabel: \"web search\",\n\t\tdescription: \"Search the web for up-to-date information.\",\n\t\tpromptSnippet: \"Search the web for the given query.\",\n\t\tparameters: webSearchSchema,\n\t\tasync execute(_toolCallId, args, signal?: AbortSignal) {\n\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\n\t\t\tlet url = options?.endpointUrl || EXA_URL;\n\t\t\tlet isParallel = false;\n\t\t\tconst provider = options?.provider || (process.env.metis_WEBSEARCH_PROVIDER === \"parallel\" ? \"parallel\" : \"exa\");\n\n\t\t\tif (provider === \"parallel\" && !options?.endpointUrl) {\n\t\t\t\turl = PARALLEL_URL;\n\t\t\t\tisParallel = true;\n\t\t\t}\n\n\t\t\tconst headers: Record<string, string> = {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAccept: \"application/json, text/event-stream\",\n\t\t\t};\n\n\t\t\tif (isParallel && process.env.PARALLEL_API_KEY) {\n\t\t\t\theaders[\"Authorization\"] = `Bearer ${process.env.PARALLEL_API_KEY}`;\n\t\t\t}\n\n\t\t\tlet methodArgs: any = {\n\t\t\t\tquery: args.query,\n\t\t\t\tnumResults: args.numResults || 8,\n\t\t\t\tlivecrawl: args.livecrawl || \"fallback\",\n\t\t\t\ttype: args.type || \"auto\",\n\t\t\t\tcontextMaxCharacters: args.contextMaxCharacters,\n\t\t\t};\n\n\t\t\tlet toolName = \"web_search_exa\";\n\n\t\t\tif (isParallel) {\n\t\t\t\ttoolName = \"web_search\";\n\t\t\t\tmethodArgs = {\n\t\t\t\t\tobjective: args.query,\n\t\t\t\t\tsearch_queries: [args.query],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst payload = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid: 1,\n\t\t\t\tmethod: \"tools/call\",\n\t\t\t\tparams: {\n\t\t\t\t\tname: toolName,\n\t\t\t\t\targuments: methodArgs,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst abortController = new AbortController();\n\t\t\tconst onAbort = () => abortController.abort();\n\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\t// Set a 25-second timeout as in the original implementation\n\t\t\tconst timeoutId = setTimeout(() => abortController.abort(), 25000);\n\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders,\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t});\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Web search failed with status: ${response.status} ${response.statusText}`);\n\t\t\t\t}\n\n\t\t\t\tconst resultText = await parseResponse(response);\n\t\t\t\tif (!resultText) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No search results found. Please try a different query.\" }],\n\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: resultText }],\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t} catch (e: any) {\n\t\t\t\tif (e.name === \"AbortError\") {\n\t\t\t\t\tthrow new Error(\"Web search request timed out or was aborted\");\n\t\t\t\t}\n\t\t\t\tthrow e;\n\t\t\t} finally {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatWebSearchCall(args, theme));\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatWebSearchResult(result as any, options, theme, context.showImages));\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createWebSearchTool(options?: WebSearchToolOptions): AgentTool<typeof webSearchSchema> {\n\treturn wrapToolDefinition(createWebSearchToolDefinition(options));\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import type { AgentTool } from "@earendil-works/metis-agent-core";
2
+ import { type Static, Type } from "typebox";
3
+ import type { ToolDefinition } from "../extensions/types.ts";
4
+ declare const writeSchema: Type.TObject<{
5
+ path: Type.TString;
6
+ content: Type.TString;
7
+ }>;
8
+ export type WriteToolInput = Static<typeof writeSchema>;
9
+ /**
10
+ * Pluggable operations for the write tool.
11
+ * Override these to delegate file writing to remote systems (for example SSH).
12
+ */
13
+ export interface WriteOperations {
14
+ /** Write content to a file */
15
+ writeFile: (absolutePath: string, content: string) => Promise<void>;
16
+ /** Create directory recursively */
17
+ mkdir: (dir: string) => Promise<void>;
18
+ }
19
+ export interface WriteToolOptions {
20
+ /** Custom operations for file writing. Default: local filesystem */
21
+ operations?: WriteOperations;
22
+ }
23
+ export declare function createWriteToolDefinition(cwd: string, options?: WriteToolOptions): ToolDefinition<typeof writeSchema, undefined>;
24
+ export declare function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema>;
25
+ export {};
26
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAIlE,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AAMtF,QAAA,MAAM,WAAW;;;EAGf,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,mCAAmC;IACnC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAOD,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,UAAU,CAAC,EAAE,eAAe,CAAC;CAC7B;AA6ID,wBAAgB,yBAAyB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,OAAO,WAAW,EAAE,SAAS,CAAC,CA+E/C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,OAAO,WAAW,CAAC,CAEtG"}
@@ -0,0 +1,196 @@
1
+ import { Container, Text } from "@earendil-works/metis-tui";
2
+ import { mkdir as fsMkdir, writeFile as fsWriteFile } from "fs/promises";
3
+ import { dirname } from "path";
4
+ import { Type } from "typebox";
5
+ import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
6
+ import { getLanguageFromPath, highlightCode } from "../../modes/interactive/theme/theme.js";
7
+ import { withFileMutationQueue } from "./file-mutation-queue.js";
8
+ import { resolveToCwd } from "./path-utils.js";
9
+ import { normalizeDisplayText, renderToolPath, replaceTabs, str } from "./render-utils.js";
10
+ import { wrapToolDefinition } from "./tool-definition-wrapper.js";
11
+ const writeSchema = Type.Object({
12
+ path: Type.String({ description: "Path to the file to write (relative or absolute)" }),
13
+ content: Type.String({ description: "Content to write to the file" }),
14
+ });
15
+ const defaultWriteOperations = {
16
+ writeFile: (path, content) => fsWriteFile(path, content, "utf-8"),
17
+ mkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => { }),
18
+ };
19
+ class WriteCallRenderComponent extends Text {
20
+ constructor() {
21
+ super("", 0, 0);
22
+ }
23
+ }
24
+ const WRITE_PARTIAL_FULL_HIGHLIGHT_LINES = 50;
25
+ function highlightSingleLine(line, lang) {
26
+ const highlighted = highlightCode(line, lang);
27
+ return highlighted[0] ?? "";
28
+ }
29
+ function refreshWriteHighlightPrefix(cache) {
30
+ const prefixCount = Math.min(WRITE_PARTIAL_FULL_HIGHLIGHT_LINES, cache.normalizedLines.length);
31
+ if (prefixCount === 0)
32
+ return;
33
+ const prefixSource = cache.normalizedLines.slice(0, prefixCount).join("\n");
34
+ const prefixHighlighted = highlightCode(prefixSource, cache.lang);
35
+ for (let i = 0; i < prefixCount; i++) {
36
+ cache.highlightedLines[i] =
37
+ prefixHighlighted[i] ?? highlightSingleLine(cache.normalizedLines[i] ?? "", cache.lang);
38
+ }
39
+ }
40
+ function rebuildWriteHighlightCacheFull(rawPath, fileContent) {
41
+ const lang = rawPath ? getLanguageFromPath(rawPath) : undefined;
42
+ if (!lang)
43
+ return undefined;
44
+ const displayContent = normalizeDisplayText(fileContent);
45
+ const normalized = replaceTabs(displayContent);
46
+ return {
47
+ rawPath,
48
+ lang,
49
+ rawContent: fileContent,
50
+ normalizedLines: normalized.split("\n"),
51
+ highlightedLines: highlightCode(normalized, lang),
52
+ };
53
+ }
54
+ function updateWriteHighlightCacheIncremental(cache, rawPath, fileContent) {
55
+ const lang = rawPath ? getLanguageFromPath(rawPath) : undefined;
56
+ if (!lang)
57
+ return undefined;
58
+ if (!cache)
59
+ return rebuildWriteHighlightCacheFull(rawPath, fileContent);
60
+ if (cache.lang !== lang || cache.rawPath !== rawPath)
61
+ return rebuildWriteHighlightCacheFull(rawPath, fileContent);
62
+ if (!fileContent.startsWith(cache.rawContent))
63
+ return rebuildWriteHighlightCacheFull(rawPath, fileContent);
64
+ if (fileContent.length === cache.rawContent.length)
65
+ return cache;
66
+ const deltaRaw = fileContent.slice(cache.rawContent.length);
67
+ const deltaDisplay = normalizeDisplayText(deltaRaw);
68
+ const deltaNormalized = replaceTabs(deltaDisplay);
69
+ cache.rawContent = fileContent;
70
+ if (cache.normalizedLines.length === 0) {
71
+ cache.normalizedLines.push("");
72
+ cache.highlightedLines.push("");
73
+ }
74
+ const segments = deltaNormalized.split("\n");
75
+ const lastIndex = cache.normalizedLines.length - 1;
76
+ cache.normalizedLines[lastIndex] += segments[0];
77
+ cache.highlightedLines[lastIndex] = highlightSingleLine(cache.normalizedLines[lastIndex], cache.lang);
78
+ for (let i = 1; i < segments.length; i++) {
79
+ cache.normalizedLines.push(segments[i]);
80
+ cache.highlightedLines.push(highlightSingleLine(segments[i], cache.lang));
81
+ }
82
+ refreshWriteHighlightPrefix(cache);
83
+ return cache;
84
+ }
85
+ function trimTrailingEmptyLines(lines) {
86
+ let end = lines.length;
87
+ while (end > 0 && lines[end - 1] === "") {
88
+ end--;
89
+ }
90
+ return lines.slice(0, end);
91
+ }
92
+ function formatWriteCall(args, options, theme, cache, cwd) {
93
+ const rawPath = str(args?.file_path ?? args?.path);
94
+ const fileContent = str(args?.content);
95
+ const pathDisplay = renderToolPath(rawPath, theme, cwd);
96
+ let text = `${theme.fg("toolTitle", theme.bold("write"))} ${pathDisplay}`;
97
+ if (fileContent === null) {
98
+ text += `\n\n${theme.fg("error", "[invalid content arg - expected string]")}`;
99
+ }
100
+ else if (fileContent) {
101
+ const lang = rawPath ? getLanguageFromPath(rawPath) : undefined;
102
+ const renderedLines = lang
103
+ ? (cache?.highlightedLines ?? highlightCode(replaceTabs(normalizeDisplayText(fileContent)), lang))
104
+ : normalizeDisplayText(fileContent).split("\n");
105
+ const lines = trimTrailingEmptyLines(renderedLines);
106
+ const totalLines = lines.length;
107
+ const maxLines = options.expanded ? lines.length : 10;
108
+ const displayLines = lines.slice(0, maxLines);
109
+ const remaining = lines.length - maxLines;
110
+ text += `\n\n${displayLines.map((line) => (lang ? line : theme.fg("toolOutput", replaceTabs(line)))).join("\n")}`;
111
+ if (remaining > 0) {
112
+ text += `${theme.fg("muted", `\n... (${remaining} more lines, ${totalLines} total,`)} ${keyHint("app.tools.expand", "to expand")}${theme.fg("muted", ")")}`;
113
+ }
114
+ }
115
+ return text;
116
+ }
117
+ function formatWriteResult(result, theme) {
118
+ if (!result.isError) {
119
+ return undefined;
120
+ }
121
+ const output = result.content
122
+ .filter((c) => c.type === "text")
123
+ .map((c) => c.text || "")
124
+ .join("\n");
125
+ if (!output) {
126
+ return undefined;
127
+ }
128
+ return `\n${theme.fg("error", output)}`;
129
+ }
130
+ export function createWriteToolDefinition(cwd, options) {
131
+ const ops = options?.operations ?? defaultWriteOperations;
132
+ return {
133
+ name: "write",
134
+ label: "write",
135
+ description: "Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",
136
+ promptSnippet: "Create or overwrite files",
137
+ promptGuidelines: ["Use write only for new files or complete rewrites."],
138
+ parameters: writeSchema,
139
+ async execute(_toolCallId, { path, content }, signal, _onUpdate, _ctx) {
140
+ const absolutePath = resolveToCwd(path, cwd);
141
+ const dir = dirname(absolutePath);
142
+ return withFileMutationQueue(absolutePath, async () => {
143
+ // Do not reject from an abort event listener here: that would release the
144
+ // mutation queue while an in-flight filesystem operation may still finish.
145
+ // Checking signal.aborted after each await observes the same aborts while
146
+ // keeping the queue locked until the current operation has settled.
147
+ const throwIfAborted = () => {
148
+ if (signal?.aborted)
149
+ throw new Error("Operation aborted");
150
+ };
151
+ throwIfAborted();
152
+ // Create parent directories if needed.
153
+ await ops.mkdir(dir);
154
+ throwIfAborted();
155
+ // Write the file contents.
156
+ await ops.writeFile(absolutePath, content);
157
+ throwIfAborted();
158
+ return {
159
+ content: [{ type: "text", text: `Successfully wrote ${content.length} bytes to ${path}` }],
160
+ details: undefined,
161
+ };
162
+ });
163
+ },
164
+ renderCall(args, theme, context) {
165
+ const renderArgs = args;
166
+ const rawPath = str(renderArgs?.file_path ?? renderArgs?.path);
167
+ const fileContent = str(renderArgs?.content);
168
+ const component = context.lastComponent ?? new WriteCallRenderComponent();
169
+ if (fileContent !== null) {
170
+ component.cache = context.argsComplete
171
+ ? rebuildWriteHighlightCacheFull(rawPath, fileContent)
172
+ : updateWriteHighlightCacheIncremental(component.cache, rawPath, fileContent);
173
+ }
174
+ else {
175
+ component.cache = undefined;
176
+ }
177
+ component.setText(formatWriteCall(renderArgs, { expanded: context.expanded, isPartial: context.isPartial }, theme, component.cache, context.cwd));
178
+ return component;
179
+ },
180
+ renderResult(result, _options, theme, context) {
181
+ const output = formatWriteResult({ ...result, isError: context.isError }, theme);
182
+ if (!output) {
183
+ const component = context.lastComponent ?? new Container();
184
+ component.clear();
185
+ return component;
186
+ }
187
+ const text = context.lastComponent ?? new Text("", 0, 0);
188
+ text.setText(output);
189
+ return text;
190
+ },
191
+ };
192
+ }
193
+ export function createWriteTool(cwd, options) {
194
+ return wrapToolDefinition(createWriteToolDefinition(cwd, options));
195
+ }
196
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/metis-agent-core\";\nimport { Container, Text } from \"@earendil-works/metis-tui\";\nimport { mkdir as fsMkdir, writeFile as fsWriteFile } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { withFileMutationQueue } from \"./file-mutation-queue.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { normalizeDisplayText, renderToolPath, replaceTabs, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst writeSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to write (relative or absolute)\" }),\n\tcontent: Type.String({ description: \"Content to write to the file\" }),\n});\n\nexport type WriteToolInput = Static<typeof writeSchema>;\n\n/**\n * Pluggable operations for the write tool.\n * Override these to delegate file writing to remote systems (for example SSH).\n */\nexport interface WriteOperations {\n\t/** Write content to a file */\n\twriteFile: (absolutePath: string, content: string) => Promise<void>;\n\t/** Create directory recursively */\n\tmkdir: (dir: string) => Promise<void>;\n}\n\nconst defaultWriteOperations: WriteOperations = {\n\twriteFile: (path, content) => fsWriteFile(path, content, \"utf-8\"),\n\tmkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => {}),\n};\n\nexport interface WriteToolOptions {\n\t/** Custom operations for file writing. Default: local filesystem */\n\toperations?: WriteOperations;\n}\n\ntype WriteHighlightCache = {\n\trawPath: string | null;\n\tlang: string;\n\trawContent: string;\n\tnormalizedLines: string[];\n\thighlightedLines: string[];\n};\n\nclass WriteCallRenderComponent extends Text {\n\tcache?: WriteHighlightCache;\n\n\tconstructor() {\n\t\tsuper(\"\", 0, 0);\n\t}\n}\n\nconst WRITE_PARTIAL_FULL_HIGHLIGHT_LINES = 50;\n\nfunction highlightSingleLine(line: string, lang: string): string {\n\tconst highlighted = highlightCode(line, lang);\n\treturn highlighted[0] ?? \"\";\n}\n\nfunction refreshWriteHighlightPrefix(cache: WriteHighlightCache): void {\n\tconst prefixCount = Math.min(WRITE_PARTIAL_FULL_HIGHLIGHT_LINES, cache.normalizedLines.length);\n\tif (prefixCount === 0) return;\n\tconst prefixSource = cache.normalizedLines.slice(0, prefixCount).join(\"\\n\");\n\tconst prefixHighlighted = highlightCode(prefixSource, cache.lang);\n\tfor (let i = 0; i < prefixCount; i++) {\n\t\tcache.highlightedLines[i] =\n\t\t\tprefixHighlighted[i] ?? highlightSingleLine(cache.normalizedLines[i] ?? \"\", cache.lang);\n\t}\n}\n\nfunction rebuildWriteHighlightCacheFull(rawPath: string | null, fileContent: string): WriteHighlightCache | undefined {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (!lang) return undefined;\n\tconst displayContent = normalizeDisplayText(fileContent);\n\tconst normalized = replaceTabs(displayContent);\n\treturn {\n\t\trawPath,\n\t\tlang,\n\t\trawContent: fileContent,\n\t\tnormalizedLines: normalized.split(\"\\n\"),\n\t\thighlightedLines: highlightCode(normalized, lang),\n\t};\n}\n\nfunction updateWriteHighlightCacheIncremental(\n\tcache: WriteHighlightCache | undefined,\n\trawPath: string | null,\n\tfileContent: string,\n): WriteHighlightCache | undefined {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (!lang) return undefined;\n\tif (!cache) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (cache.lang !== lang || cache.rawPath !== rawPath) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (!fileContent.startsWith(cache.rawContent)) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (fileContent.length === cache.rawContent.length) return cache;\n\n\tconst deltaRaw = fileContent.slice(cache.rawContent.length);\n\tconst deltaDisplay = normalizeDisplayText(deltaRaw);\n\tconst deltaNormalized = replaceTabs(deltaDisplay);\n\tcache.rawContent = fileContent;\n\tif (cache.normalizedLines.length === 0) {\n\t\tcache.normalizedLines.push(\"\");\n\t\tcache.highlightedLines.push(\"\");\n\t}\n\n\tconst segments = deltaNormalized.split(\"\\n\");\n\tconst lastIndex = cache.normalizedLines.length - 1;\n\tcache.normalizedLines[lastIndex] += segments[0];\n\tcache.highlightedLines[lastIndex] = highlightSingleLine(cache.normalizedLines[lastIndex], cache.lang);\n\tfor (let i = 1; i < segments.length; i++) {\n\t\tcache.normalizedLines.push(segments[i]);\n\t\tcache.highlightedLines.push(highlightSingleLine(segments[i], cache.lang));\n\t}\n\trefreshWriteHighlightPrefix(cache);\n\treturn cache;\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 formatWriteCall(\n\targs: { path?: string; file_path?: string; content?: string } | undefined,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcache: WriteHighlightCache | undefined,\n\tcwd: string,\n): string {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst fileContent = str(args?.content);\n\tconst pathDisplay = renderToolPath(rawPath, theme, cwd);\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"write\"))} ${pathDisplay}`;\n\n\tif (fileContent === null) {\n\t\ttext += `\\n\\n${theme.fg(\"error\", \"[invalid content arg - expected string]\")}`;\n\t} else if (fileContent) {\n\t\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\t\tconst renderedLines = lang\n\t\t\t? (cache?.highlightedLines ?? highlightCode(replaceTabs(normalizeDisplayText(fileContent)), lang))\n\t\t\t: normalizeDisplayText(fileContent).split(\"\\n\");\n\t\tconst lines = trimTrailingEmptyLines(renderedLines);\n\t\tconst totalLines = lines.length;\n\t\tconst maxLines = options.expanded ? lines.length : 10;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n\\n${displayLines.map((line) => (lang ? line : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines, ${totalLines} total,`)} ${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"muted\", \")\")}`;\n\t\t}\n\t}\n\n\treturn text;\n}\n\nfunction formatWriteResult(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }>; isError?: boolean },\n\ttheme: Theme,\n): string | undefined {\n\tif (!result.isError) {\n\t\treturn undefined;\n\t}\n\tconst output = result.content\n\t\t.filter((c) => c.type === \"text\")\n\t\t.map((c) => c.text || \"\")\n\t\t.join(\"\\n\");\n\tif (!output) {\n\t\treturn undefined;\n\t}\n\treturn `\\n${theme.fg(\"error\", output)}`;\n}\n\nexport function createWriteToolDefinition(\n\tcwd: string,\n\toptions?: WriteToolOptions,\n): ToolDefinition<typeof writeSchema, undefined> {\n\tconst ops = options?.operations ?? defaultWriteOperations;\n\treturn {\n\t\tname: \"write\",\n\t\tlabel: \"write\",\n\t\tdescription:\n\t\t\t\"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.\",\n\t\tpromptSnippet: \"Create or overwrite files\",\n\t\tpromptGuidelines: [\"Use write only for new files or complete rewrites.\"],\n\t\tparameters: writeSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ path, content }: { path: string; content: string },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t) {\n\t\t\tconst absolutePath = resolveToCwd(path, cwd);\n\t\t\tconst dir = dirname(absolutePath);\n\t\t\treturn withFileMutationQueue(absolutePath, async () => {\n\t\t\t\t// Do not reject from an abort event listener here: that would release the\n\t\t\t\t// mutation queue while an in-flight filesystem operation may still finish.\n\t\t\t\t// Checking signal.aborted after each await observes the same aborts while\n\t\t\t\t// keeping the queue locked until the current operation has settled.\n\t\t\t\tconst throwIfAborted = (): void => {\n\t\t\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\t\t};\n\n\t\t\t\tthrowIfAborted();\n\t\t\t\t// Create parent directories if needed.\n\t\t\t\tawait ops.mkdir(dir);\n\t\t\t\tthrowIfAborted();\n\n\t\t\t\t// Write the file contents.\n\t\t\t\tawait ops.writeFile(absolutePath, content);\n\t\t\t\tthrowIfAborted();\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Successfully wrote ${content.length} bytes to ${path}` }],\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst renderArgs = args as { path?: string; file_path?: string; content?: string } | undefined;\n\t\t\tconst rawPath = str(renderArgs?.file_path ?? renderArgs?.path);\n\t\t\tconst fileContent = str(renderArgs?.content);\n\t\t\tconst component =\n\t\t\t\t(context.lastComponent as WriteCallRenderComponent | undefined) ?? new WriteCallRenderComponent();\n\t\t\tif (fileContent !== null) {\n\t\t\t\tcomponent.cache = context.argsComplete\n\t\t\t\t\t? rebuildWriteHighlightCacheFull(rawPath, fileContent)\n\t\t\t\t\t: updateWriteHighlightCacheIncremental(component.cache, rawPath, fileContent);\n\t\t\t} else {\n\t\t\t\tcomponent.cache = undefined;\n\t\t\t}\n\t\t\tcomponent.setText(\n\t\t\t\tformatWriteCall(\n\t\t\t\t\trenderArgs,\n\t\t\t\t\t{ expanded: context.expanded, isPartial: context.isPartial },\n\t\t\t\t\ttheme,\n\t\t\t\t\tcomponent.cache,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn component;\n\t\t},\n\t\trenderResult(result, _options, theme, context) {\n\t\t\tconst output = formatWriteResult({ ...result, isError: context.isError }, theme);\n\t\t\tif (!output) {\n\t\t\t\tconst component = (context.lastComponent as Container | undefined) ?? new Container();\n\t\t\t\tcomponent.clear();\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(output);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema> {\n\treturn wrapToolDefinition(createWriteToolDefinition(cwd, options));\n}\n"]}
@@ -0,0 +1,36 @@
1
+ export type ProjectTrustDecision = boolean | null;
2
+ export interface ProjectTrustStoreEntry {
3
+ path: string;
4
+ decision: boolean;
5
+ }
6
+ export interface ProjectTrustUpdate {
7
+ path: string;
8
+ decision: ProjectTrustDecision;
9
+ }
10
+ export interface ProjectTrustOption {
11
+ label: string;
12
+ trusted: boolean;
13
+ updates: ProjectTrustUpdate[];
14
+ savedPath?: string;
15
+ }
16
+ export declare function getProjectTrustParentPath(cwd: string): string | undefined;
17
+ export declare function getProjectTrustOptions(cwd: string, options?: {
18
+ includeSessionOnly?: boolean;
19
+ }): ProjectTrustOption[];
20
+ /**
21
+ * Returns true when cwd has project-local resources that must be gated by
22
+ * project trust: trust-requiring entries under cwd/.metis, or .agents/skills in
23
+ * cwd or one of its ancestors. Returns false when no such project resources
24
+ * exist. The user/global ~/.agents/skills directory is always treated as a
25
+ * trusted user resource and is ignored here, even when cwd is $HOME.
26
+ */
27
+ export declare function hasTrustRequiringProjectResources(cwd: string): boolean;
28
+ export declare class ProjectTrustStore {
29
+ private trustPath;
30
+ constructor(agentDir: string);
31
+ get(cwd: string): ProjectTrustDecision;
32
+ getEntry(cwd: string): ProjectTrustStoreEntry | null;
33
+ set(cwd: string, decision: ProjectTrustDecision): void;
34
+ setMany(decisions: ProjectTrustUpdate[]): void;
35
+ }
36
+ //# sourceMappingURL=trust-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-manager.d.ts","sourceRoot":"","sources":["../../src/core/trust-manager.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,IAAI,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,oBAAoB,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAkCD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIzE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,kBAAkB,EAAE,CA8BpH;AAkFD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAsBtE;AAED,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,SAAS,CAAS;IAE1B,YAAY,QAAQ,EAAE,MAAM,EAE3B;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAErC;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAKnD;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAErD;IAED,OAAO,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAa7C;CACD"}