@dreb/coding-agent 1.16.0

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 (809) hide show
  1. package/CHANGELOG.md +3316 -0
  2. package/README.md +657 -0
  3. package/agents/code-reviewer.md +55 -0
  4. package/agents/completeness-checker.md +71 -0
  5. package/agents/error-auditor.md +65 -0
  6. package/agents/explore.md +13 -0
  7. package/agents/feature-dev.md +23 -0
  8. package/agents/independent-assessor.md +61 -0
  9. package/agents/sandbox.md +14 -0
  10. package/agents/simplifier.md +69 -0
  11. package/agents/test-reviewer.md +63 -0
  12. package/dist/bun/cli.d.ts +3 -0
  13. package/dist/bun/cli.d.ts.map +1 -0
  14. package/dist/bun/cli.js +7 -0
  15. package/dist/bun/cli.js.map +1 -0
  16. package/dist/bun/register-bedrock.d.ts +2 -0
  17. package/dist/bun/register-bedrock.d.ts.map +1 -0
  18. package/dist/bun/register-bedrock.js +4 -0
  19. package/dist/bun/register-bedrock.js.map +1 -0
  20. package/dist/cli/args.d.ts +50 -0
  21. package/dist/cli/args.d.ts.map +1 -0
  22. package/dist/cli/args.js +310 -0
  23. package/dist/cli/args.js.map +1 -0
  24. package/dist/cli/config-selector.d.ts +14 -0
  25. package/dist/cli/config-selector.d.ts.map +1 -0
  26. package/dist/cli/config-selector.js +31 -0
  27. package/dist/cli/config-selector.js.map +1 -0
  28. package/dist/cli/file-processor.d.ts +15 -0
  29. package/dist/cli/file-processor.d.ts.map +1 -0
  30. package/dist/cli/file-processor.js +83 -0
  31. package/dist/cli/file-processor.js.map +1 -0
  32. package/dist/cli/initial-message.d.ts +18 -0
  33. package/dist/cli/initial-message.d.ts.map +1 -0
  34. package/dist/cli/initial-message.js +22 -0
  35. package/dist/cli/initial-message.js.map +1 -0
  36. package/dist/cli/list-models.d.ts +9 -0
  37. package/dist/cli/list-models.d.ts.map +1 -0
  38. package/dist/cli/list-models.js +92 -0
  39. package/dist/cli/list-models.js.map +1 -0
  40. package/dist/cli/session-picker.d.ts +9 -0
  41. package/dist/cli/session-picker.d.ts.map +1 -0
  42. package/dist/cli/session-picker.js +35 -0
  43. package/dist/cli/session-picker.js.map +1 -0
  44. package/dist/cli.d.ts +3 -0
  45. package/dist/cli.d.ts.map +1 -0
  46. package/dist/cli.js +14 -0
  47. package/dist/cli.js.map +1 -0
  48. package/dist/config.d.ts +76 -0
  49. package/dist/config.d.ts.map +1 -0
  50. package/dist/config.js +234 -0
  51. package/dist/config.js.map +1 -0
  52. package/dist/core/agent-session.d.ts +658 -0
  53. package/dist/core/agent-session.d.ts.map +1 -0
  54. package/dist/core/agent-session.js +2898 -0
  55. package/dist/core/agent-session.js.map +1 -0
  56. package/dist/core/auth-storage.d.ts +130 -0
  57. package/dist/core/auth-storage.d.ts.map +1 -0
  58. package/dist/core/auth-storage.js +421 -0
  59. package/dist/core/auth-storage.js.map +1 -0
  60. package/dist/core/bash-executor.d.ts +46 -0
  61. package/dist/core/bash-executor.d.ts.map +1 -0
  62. package/dist/core/bash-executor.js +113 -0
  63. package/dist/core/bash-executor.js.map +1 -0
  64. package/dist/core/buddy/buddy-controller.d.ts +139 -0
  65. package/dist/core/buddy/buddy-controller.d.ts.map +1 -0
  66. package/dist/core/buddy/buddy-controller.js +428 -0
  67. package/dist/core/buddy/buddy-controller.js.map +1 -0
  68. package/dist/core/buddy/buddy-manager.d.ts +68 -0
  69. package/dist/core/buddy/buddy-manager.d.ts.map +1 -0
  70. package/dist/core/buddy/buddy-manager.js +399 -0
  71. package/dist/core/buddy/buddy-manager.js.map +1 -0
  72. package/dist/core/buddy/buddy-prng.d.ts +28 -0
  73. package/dist/core/buddy/buddy-prng.d.ts.map +1 -0
  74. package/dist/core/buddy/buddy-prng.js +65 -0
  75. package/dist/core/buddy/buddy-prng.js.map +1 -0
  76. package/dist/core/buddy/buddy-species.d.ts +37 -0
  77. package/dist/core/buddy/buddy-species.d.ts.map +1 -0
  78. package/dist/core/buddy/buddy-species.js +287 -0
  79. package/dist/core/buddy/buddy-species.js.map +1 -0
  80. package/dist/core/buddy/buddy-types.d.ts +58 -0
  81. package/dist/core/buddy/buddy-types.d.ts.map +1 -0
  82. package/dist/core/buddy/buddy-types.js +46 -0
  83. package/dist/core/buddy/buddy-types.js.map +1 -0
  84. package/dist/core/buddy/index.d.ts +7 -0
  85. package/dist/core/buddy/index.d.ts.map +1 -0
  86. package/dist/core/buddy/index.js +6 -0
  87. package/dist/core/buddy/index.js.map +1 -0
  88. package/dist/core/compaction/branch-summarization.d.ts +86 -0
  89. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  90. package/dist/core/compaction/branch-summarization.js +243 -0
  91. package/dist/core/compaction/branch-summarization.js.map +1 -0
  92. package/dist/core/compaction/compaction.d.ts +121 -0
  93. package/dist/core/compaction/compaction.d.ts.map +1 -0
  94. package/dist/core/compaction/compaction.js +612 -0
  95. package/dist/core/compaction/compaction.js.map +1 -0
  96. package/dist/core/compaction/index.d.ts +7 -0
  97. package/dist/core/compaction/index.d.ts.map +1 -0
  98. package/dist/core/compaction/index.js +7 -0
  99. package/dist/core/compaction/index.js.map +1 -0
  100. package/dist/core/compaction/utils.d.ts +38 -0
  101. package/dist/core/compaction/utils.d.ts.map +1 -0
  102. package/dist/core/compaction/utils.js +153 -0
  103. package/dist/core/compaction/utils.js.map +1 -0
  104. package/dist/core/defaults.d.ts +3 -0
  105. package/dist/core/defaults.d.ts.map +1 -0
  106. package/dist/core/defaults.js +2 -0
  107. package/dist/core/defaults.js.map +1 -0
  108. package/dist/core/diagnostics.d.ts +15 -0
  109. package/dist/core/diagnostics.d.ts.map +1 -0
  110. package/dist/core/diagnostics.js +2 -0
  111. package/dist/core/diagnostics.js.map +1 -0
  112. package/dist/core/event-bus.d.ts +9 -0
  113. package/dist/core/event-bus.d.ts.map +1 -0
  114. package/dist/core/event-bus.js +25 -0
  115. package/dist/core/event-bus.js.map +1 -0
  116. package/dist/core/exec.d.ts +29 -0
  117. package/dist/core/exec.d.ts.map +1 -0
  118. package/dist/core/exec.js +75 -0
  119. package/dist/core/exec.js.map +1 -0
  120. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  121. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  122. package/dist/core/export-html/ansi-to-html.js +249 -0
  123. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  124. package/dist/core/export-html/index.d.ts +37 -0
  125. package/dist/core/export-html/index.d.ts.map +1 -0
  126. package/dist/core/export-html/index.js +224 -0
  127. package/dist/core/export-html/index.js.map +1 -0
  128. package/dist/core/export-html/template.css +1001 -0
  129. package/dist/core/export-html/template.html +55 -0
  130. package/dist/core/export-html/template.js +1690 -0
  131. package/dist/core/export-html/tool-renderer.d.ts +38 -0
  132. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  133. package/dist/core/export-html/tool-renderer.js +95 -0
  134. package/dist/core/export-html/tool-renderer.js.map +1 -0
  135. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  136. package/dist/core/export-html/vendor/marked.min.js +6 -0
  137. package/dist/core/extensions/index.d.ts +12 -0
  138. package/dist/core/extensions/index.d.ts.map +1 -0
  139. package/dist/core/extensions/index.js +9 -0
  140. package/dist/core/extensions/index.js.map +1 -0
  141. package/dist/core/extensions/loader.d.ts +25 -0
  142. package/dist/core/extensions/loader.d.ts.map +1 -0
  143. package/dist/core/extensions/loader.js +436 -0
  144. package/dist/core/extensions/loader.js.map +1 -0
  145. package/dist/core/extensions/runner.d.ts +147 -0
  146. package/dist/core/extensions/runner.d.ts.map +1 -0
  147. package/dist/core/extensions/runner.js +696 -0
  148. package/dist/core/extensions/runner.js.map +1 -0
  149. package/dist/core/extensions/types.d.ts +1072 -0
  150. package/dist/core/extensions/types.d.ts.map +1 -0
  151. package/dist/core/extensions/types.js +35 -0
  152. package/dist/core/extensions/types.js.map +1 -0
  153. package/dist/core/extensions/wrapper.d.ts +20 -0
  154. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  155. package/dist/core/extensions/wrapper.js +22 -0
  156. package/dist/core/extensions/wrapper.js.map +1 -0
  157. package/dist/core/footer-data-provider.d.ts +44 -0
  158. package/dist/core/footer-data-provider.d.ts.map +1 -0
  159. package/dist/core/footer-data-provider.js +252 -0
  160. package/dist/core/footer-data-provider.js.map +1 -0
  161. package/dist/core/forbidden-commands.d.ts +31 -0
  162. package/dist/core/forbidden-commands.d.ts.map +1 -0
  163. package/dist/core/forbidden-commands.js +184 -0
  164. package/dist/core/forbidden-commands.js.map +1 -0
  165. package/dist/core/git-root.d.ts +6 -0
  166. package/dist/core/git-root.d.ts.map +1 -0
  167. package/dist/core/git-root.js +32 -0
  168. package/dist/core/git-root.js.map +1 -0
  169. package/dist/core/index.d.ts +10 -0
  170. package/dist/core/index.d.ts.map +1 -0
  171. package/dist/core/index.js +10 -0
  172. package/dist/core/index.js.map +1 -0
  173. package/dist/core/keybindings.d.ts +280 -0
  174. package/dist/core/keybindings.d.ts.map +1 -0
  175. package/dist/core/keybindings.js +245 -0
  176. package/dist/core/keybindings.js.map +1 -0
  177. package/dist/core/memory-prompt.d.ts +10 -0
  178. package/dist/core/memory-prompt.d.ts.map +1 -0
  179. package/dist/core/memory-prompt.js +95 -0
  180. package/dist/core/memory-prompt.js.map +1 -0
  181. package/dist/core/messages.d.ts +77 -0
  182. package/dist/core/messages.d.ts.map +1 -0
  183. package/dist/core/messages.js +123 -0
  184. package/dist/core/messages.js.map +1 -0
  185. package/dist/core/model-registry.d.ts +114 -0
  186. package/dist/core/model-registry.d.ts.map +1 -0
  187. package/dist/core/model-registry.js +563 -0
  188. package/dist/core/model-registry.js.map +1 -0
  189. package/dist/core/model-resolver.d.ts +116 -0
  190. package/dist/core/model-resolver.d.ts.map +1 -0
  191. package/dist/core/model-resolver.js +465 -0
  192. package/dist/core/model-resolver.js.map +1 -0
  193. package/dist/core/output-guard.d.ts +6 -0
  194. package/dist/core/output-guard.d.ts.map +1 -0
  195. package/dist/core/output-guard.js +59 -0
  196. package/dist/core/output-guard.js.map +1 -0
  197. package/dist/core/package-manager.d.ts +172 -0
  198. package/dist/core/package-manager.d.ts.map +1 -0
  199. package/dist/core/package-manager.js +1767 -0
  200. package/dist/core/package-manager.js.map +1 -0
  201. package/dist/core/prompt-templates.d.ts +51 -0
  202. package/dist/core/prompt-templates.d.ts.map +1 -0
  203. package/dist/core/prompt-templates.js +251 -0
  204. package/dist/core/prompt-templates.js.map +1 -0
  205. package/dist/core/resolve-config-value.d.ts +17 -0
  206. package/dist/core/resolve-config-value.d.ts.map +1 -0
  207. package/dist/core/resolve-config-value.js +94 -0
  208. package/dist/core/resolve-config-value.js.map +1 -0
  209. package/dist/core/resource-loader.d.ts +205 -0
  210. package/dist/core/resource-loader.d.ts.map +1 -0
  211. package/dist/core/resource-loader.js +866 -0
  212. package/dist/core/resource-loader.js.map +1 -0
  213. package/dist/core/sdk.d.ts +92 -0
  214. package/dist/core/sdk.d.ts.map +1 -0
  215. package/dist/core/sdk.js +258 -0
  216. package/dist/core/sdk.js.map +1 -0
  217. package/dist/core/search/chunker.d.ts +21 -0
  218. package/dist/core/search/chunker.d.ts.map +1 -0
  219. package/dist/core/search/chunker.js +51 -0
  220. package/dist/core/search/chunker.js.map +1 -0
  221. package/dist/core/search/db.d.ts +89 -0
  222. package/dist/core/search/db.d.ts.map +1 -0
  223. package/dist/core/search/db.js +406 -0
  224. package/dist/core/search/db.js.map +1 -0
  225. package/dist/core/search/embedder.d.ts +51 -0
  226. package/dist/core/search/embedder.d.ts.map +1 -0
  227. package/dist/core/search/embedder.js +143 -0
  228. package/dist/core/search/embedder.js.map +1 -0
  229. package/dist/core/search/index-manager.d.ts +55 -0
  230. package/dist/core/search/index-manager.d.ts.map +1 -0
  231. package/dist/core/search/index-manager.js +311 -0
  232. package/dist/core/search/index-manager.js.map +1 -0
  233. package/dist/core/search/metrics/bm25.d.ts +10 -0
  234. package/dist/core/search/metrics/bm25.d.ts.map +1 -0
  235. package/dist/core/search/metrics/bm25.js +32 -0
  236. package/dist/core/search/metrics/bm25.js.map +1 -0
  237. package/dist/core/search/metrics/git-recency.d.ts +14 -0
  238. package/dist/core/search/metrics/git-recency.d.ts.map +1 -0
  239. package/dist/core/search/metrics/git-recency.js +123 -0
  240. package/dist/core/search/metrics/git-recency.js.map +1 -0
  241. package/dist/core/search/metrics/import-graph.d.ts +15 -0
  242. package/dist/core/search/metrics/import-graph.d.ts.map +1 -0
  243. package/dist/core/search/metrics/import-graph.js +115 -0
  244. package/dist/core/search/metrics/import-graph.js.map +1 -0
  245. package/dist/core/search/metrics/path-match.d.ts +13 -0
  246. package/dist/core/search/metrics/path-match.d.ts.map +1 -0
  247. package/dist/core/search/metrics/path-match.js +54 -0
  248. package/dist/core/search/metrics/path-match.js.map +1 -0
  249. package/dist/core/search/metrics/symbol-match.d.ts +12 -0
  250. package/dist/core/search/metrics/symbol-match.d.ts.map +1 -0
  251. package/dist/core/search/metrics/symbol-match.js +62 -0
  252. package/dist/core/search/metrics/symbol-match.js.map +1 -0
  253. package/dist/core/search/metrics/tokenize.d.ts +12 -0
  254. package/dist/core/search/metrics/tokenize.d.ts.map +1 -0
  255. package/dist/core/search/metrics/tokenize.js +29 -0
  256. package/dist/core/search/metrics/tokenize.js.map +1 -0
  257. package/dist/core/search/poem.d.ts +38 -0
  258. package/dist/core/search/poem.d.ts.map +1 -0
  259. package/dist/core/search/poem.js +214 -0
  260. package/dist/core/search/poem.js.map +1 -0
  261. package/dist/core/search/query-classifier.d.ts +17 -0
  262. package/dist/core/search/query-classifier.d.ts.map +1 -0
  263. package/dist/core/search/query-classifier.js +54 -0
  264. package/dist/core/search/query-classifier.js.map +1 -0
  265. package/dist/core/search/scanner.d.ts +30 -0
  266. package/dist/core/search/scanner.d.ts.map +1 -0
  267. package/dist/core/search/scanner.js +335 -0
  268. package/dist/core/search/scanner.js.map +1 -0
  269. package/dist/core/search/search.d.ts +42 -0
  270. package/dist/core/search/search.d.ts.map +1 -0
  271. package/dist/core/search/search.js +337 -0
  272. package/dist/core/search/search.js.map +1 -0
  273. package/dist/core/search/text-chunker.d.ts +15 -0
  274. package/dist/core/search/text-chunker.d.ts.map +1 -0
  275. package/dist/core/search/text-chunker.js +580 -0
  276. package/dist/core/search/text-chunker.js.map +1 -0
  277. package/dist/core/search/tree-sitter-chunker.d.ts +25 -0
  278. package/dist/core/search/tree-sitter-chunker.d.ts.map +1 -0
  279. package/dist/core/search/tree-sitter-chunker.js +357 -0
  280. package/dist/core/search/tree-sitter-chunker.js.map +1 -0
  281. package/dist/core/search/types.d.ts +96 -0
  282. package/dist/core/search/types.d.ts.map +1 -0
  283. package/dist/core/search/types.js +6 -0
  284. package/dist/core/search/types.js.map +1 -0
  285. package/dist/core/search/vector-store.d.ts +43 -0
  286. package/dist/core/search/vector-store.d.ts.map +1 -0
  287. package/dist/core/search/vector-store.js +73 -0
  288. package/dist/core/search/vector-store.js.map +1 -0
  289. package/dist/core/session-manager.d.ts +329 -0
  290. package/dist/core/session-manager.d.ts.map +1 -0
  291. package/dist/core/session-manager.js +1097 -0
  292. package/dist/core/session-manager.js.map +1 -0
  293. package/dist/core/settings-manager.d.ts +239 -0
  294. package/dist/core/settings-manager.d.ts.map +1 -0
  295. package/dist/core/settings-manager.js +705 -0
  296. package/dist/core/settings-manager.js.map +1 -0
  297. package/dist/core/skills.d.ts +67 -0
  298. package/dist/core/skills.d.ts.map +1 -0
  299. package/dist/core/skills.js +428 -0
  300. package/dist/core/skills.js.map +1 -0
  301. package/dist/core/slash-commands.d.ts +14 -0
  302. package/dist/core/slash-commands.d.ts.map +1 -0
  303. package/dist/core/slash-commands.js +23 -0
  304. package/dist/core/slash-commands.js.map +1 -0
  305. package/dist/core/source-info.d.ts +18 -0
  306. package/dist/core/source-info.d.ts.map +1 -0
  307. package/dist/core/source-info.js +19 -0
  308. package/dist/core/source-info.js.map +1 -0
  309. package/dist/core/system-prompt.d.ts +33 -0
  310. package/dist/core/system-prompt.d.ts.map +1 -0
  311. package/dist/core/system-prompt.js +184 -0
  312. package/dist/core/system-prompt.js.map +1 -0
  313. package/dist/core/timings.d.ts +8 -0
  314. package/dist/core/timings.d.ts.map +1 -0
  315. package/dist/core/timings.js +31 -0
  316. package/dist/core/timings.js.map +1 -0
  317. package/dist/core/tools/bash.d.ts +73 -0
  318. package/dist/core/tools/bash.d.ts.map +1 -0
  319. package/dist/core/tools/bash.js +342 -0
  320. package/dist/core/tools/bash.js.map +1 -0
  321. package/dist/core/tools/edit-diff.d.ts +63 -0
  322. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  323. package/dist/core/tools/edit-diff.js +244 -0
  324. package/dist/core/tools/edit-diff.js.map +1 -0
  325. package/dist/core/tools/edit.d.ts +51 -0
  326. package/dist/core/tools/edit.d.ts.map +1 -0
  327. package/dist/core/tools/edit.js +218 -0
  328. package/dist/core/tools/edit.js.map +1 -0
  329. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  330. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  331. package/dist/core/tools/file-mutation-queue.js +37 -0
  332. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  333. package/dist/core/tools/find.d.ts +46 -0
  334. package/dist/core/tools/find.d.ts.map +1 -0
  335. package/dist/core/tools/find.js +241 -0
  336. package/dist/core/tools/find.js.map +1 -0
  337. package/dist/core/tools/grep.d.ts +56 -0
  338. package/dist/core/tools/grep.d.ts.map +1 -0
  339. package/dist/core/tools/grep.js +293 -0
  340. package/dist/core/tools/grep.js.map +1 -0
  341. package/dist/core/tools/index.d.ts +176 -0
  342. package/dist/core/tools/index.d.ts.map +1 -0
  343. package/dist/core/tools/index.js +137 -0
  344. package/dist/core/tools/index.js.map +1 -0
  345. package/dist/core/tools/ls.d.ts +46 -0
  346. package/dist/core/tools/ls.d.ts.map +1 -0
  347. package/dist/core/tools/ls.js +172 -0
  348. package/dist/core/tools/ls.js.map +1 -0
  349. package/dist/core/tools/path-utils.d.ts +8 -0
  350. package/dist/core/tools/path-utils.d.ts.map +1 -0
  351. package/dist/core/tools/path-utils.js +81 -0
  352. package/dist/core/tools/path-utils.js.map +1 -0
  353. package/dist/core/tools/read.d.ts +46 -0
  354. package/dist/core/tools/read.d.ts.map +1 -0
  355. package/dist/core/tools/read.js +225 -0
  356. package/dist/core/tools/read.js.map +1 -0
  357. package/dist/core/tools/render-utils.d.ts +21 -0
  358. package/dist/core/tools/render-utils.d.ts.map +1 -0
  359. package/dist/core/tools/render-utils.js +49 -0
  360. package/dist/core/tools/render-utils.js.map +1 -0
  361. package/dist/core/tools/search.d.ts +29 -0
  362. package/dist/core/tools/search.d.ts.map +1 -0
  363. package/dist/core/tools/search.js +187 -0
  364. package/dist/core/tools/search.js.map +1 -0
  365. package/dist/core/tools/skill.d.ts +26 -0
  366. package/dist/core/tools/skill.d.ts.map +1 -0
  367. package/dist/core/tools/skill.js +127 -0
  368. package/dist/core/tools/skill.js.map +1 -0
  369. package/dist/core/tools/subagent.d.ts +147 -0
  370. package/dist/core/tools/subagent.d.ts.map +1 -0
  371. package/dist/core/tools/subagent.js +950 -0
  372. package/dist/core/tools/subagent.js.map +1 -0
  373. package/dist/core/tools/tasks.d.ts +32 -0
  374. package/dist/core/tools/tasks.d.ts.map +1 -0
  375. package/dist/core/tools/tasks.js +110 -0
  376. package/dist/core/tools/tasks.js.map +1 -0
  377. package/dist/core/tools/tmp-read.d.ts +11 -0
  378. package/dist/core/tools/tmp-read.d.ts.map +1 -0
  379. package/dist/core/tools/tmp-read.js +63 -0
  380. package/dist/core/tools/tmp-read.js.map +1 -0
  381. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  382. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  383. package/dist/core/tools/tool-definition-wrapper.js +30 -0
  384. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  385. package/dist/core/tools/truncate.d.ts +70 -0
  386. package/dist/core/tools/truncate.d.ts.map +1 -0
  387. package/dist/core/tools/truncate.js +205 -0
  388. package/dist/core/tools/truncate.js.map +1 -0
  389. package/dist/core/tools/web.d.ts +42 -0
  390. package/dist/core/tools/web.d.ts.map +1 -0
  391. package/dist/core/tools/web.js +518 -0
  392. package/dist/core/tools/web.js.map +1 -0
  393. package/dist/core/tools/write.d.ts +35 -0
  394. package/dist/core/tools/write.d.ts.map +1 -0
  395. package/dist/core/tools/write.js +216 -0
  396. package/dist/core/tools/write.js.map +1 -0
  397. package/dist/index.d.ts +28 -0
  398. package/dist/index.d.ts.map +1 -0
  399. package/dist/index.js +43 -0
  400. package/dist/index.js.map +1 -0
  401. package/dist/main.d.ts +8 -0
  402. package/dist/main.d.ts.map +1 -0
  403. package/dist/main.js +789 -0
  404. package/dist/main.js.map +1 -0
  405. package/dist/migrations.d.ts +33 -0
  406. package/dist/migrations.d.ts.map +1 -0
  407. package/dist/migrations.js +261 -0
  408. package/dist/migrations.js.map +1 -0
  409. package/dist/modes/index.d.ts +9 -0
  410. package/dist/modes/index.d.ts.map +1 -0
  411. package/dist/modes/index.js +8 -0
  412. package/dist/modes/index.js.map +1 -0
  413. package/dist/modes/interactive/components/armin.d.ts +34 -0
  414. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  415. package/dist/modes/interactive/components/armin.js +333 -0
  416. package/dist/modes/interactive/components/armin.js.map +1 -0
  417. package/dist/modes/interactive/components/assistant-message.d.ts +16 -0
  418. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  419. package/dist/modes/interactive/components/assistant-message.js +96 -0
  420. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  421. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  422. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  423. package/dist/modes/interactive/components/bash-execution.js +175 -0
  424. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  425. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  426. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  427. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  428. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  429. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  430. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  431. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  432. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  433. package/dist/modes/interactive/components/buddy-component.d.ts +58 -0
  434. package/dist/modes/interactive/components/buddy-component.d.ts.map +1 -0
  435. package/dist/modes/interactive/components/buddy-component.js +351 -0
  436. package/dist/modes/interactive/components/buddy-component.js.map +1 -0
  437. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  438. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  439. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  440. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  441. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  442. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  443. package/dist/modes/interactive/components/config-selector.js +479 -0
  444. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  445. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  446. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  447. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  448. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  449. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  450. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  451. package/dist/modes/interactive/components/custom-editor.js +70 -0
  452. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  453. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  454. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  455. package/dist/modes/interactive/components/custom-message.js +79 -0
  456. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  457. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  458. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  459. package/dist/modes/interactive/components/daxnuts.js +140 -0
  460. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  461. package/dist/modes/interactive/components/diff.d.ts +12 -0
  462. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  463. package/dist/modes/interactive/components/diff.js +133 -0
  464. package/dist/modes/interactive/components/diff.js.map +1 -0
  465. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  466. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  467. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  468. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  469. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  470. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  471. package/dist/modes/interactive/components/extension-editor.js +111 -0
  472. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  473. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  474. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  475. package/dist/modes/interactive/components/extension-input.js +61 -0
  476. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  477. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  478. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  479. package/dist/modes/interactive/components/extension-selector.js +78 -0
  480. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  481. package/dist/modes/interactive/components/footer.d.ts +26 -0
  482. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  483. package/dist/modes/interactive/components/footer.js +198 -0
  484. package/dist/modes/interactive/components/footer.js.map +1 -0
  485. package/dist/modes/interactive/components/index.d.ts +33 -0
  486. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  487. package/dist/modes/interactive/components/index.js +34 -0
  488. package/dist/modes/interactive/components/index.js.map +1 -0
  489. package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -0
  490. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  491. package/dist/modes/interactive/components/keybinding-hints.js +22 -0
  492. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  493. package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
  494. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/login-dialog.js +145 -0
  496. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  497. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  498. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/model-selector.js +275 -0
  500. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  501. package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  502. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  503. package/dist/modes/interactive/components/oauth-selector.js +97 -0
  504. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  505. package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
  506. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  507. package/dist/modes/interactive/components/scoped-models-selector.js +275 -0
  508. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  509. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  510. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  511. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  512. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  513. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  514. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  515. package/dist/modes/interactive/components/session-selector.js +848 -0
  516. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  517. package/dist/modes/interactive/components/settings-selector.d.ts +58 -0
  518. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  519. package/dist/modes/interactive/components/settings-selector.js +301 -0
  520. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  521. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  522. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  523. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  524. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  525. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  526. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  527. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  528. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  529. package/dist/modes/interactive/components/tasks-panel.d.ts +20 -0
  530. package/dist/modes/interactive/components/tasks-panel.d.ts.map +1 -0
  531. package/dist/modes/interactive/components/tasks-panel.js +66 -0
  532. package/dist/modes/interactive/components/tasks-panel.js.map +1 -0
  533. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  534. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  535. package/dist/modes/interactive/components/theme-selector.js +50 -0
  536. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  537. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  538. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  539. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  540. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  541. package/dist/modes/interactive/components/tool-execution.d.ts +59 -0
  542. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  543. package/dist/modes/interactive/components/tool-execution.js +279 -0
  544. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  545. package/dist/modes/interactive/components/tree-selector.d.ts +87 -0
  546. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  547. package/dist/modes/interactive/components/tree-selector.js +1051 -0
  548. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  549. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  550. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  551. package/dist/modes/interactive/components/user-message-selector.js +113 -0
  552. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  553. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  554. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  555. package/dist/modes/interactive/components/user-message.js +28 -0
  556. package/dist/modes/interactive/components/user-message.js.map +1 -0
  557. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  558. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  559. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  560. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  561. package/dist/modes/interactive/interactive-mode.d.ts +338 -0
  562. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  563. package/dist/modes/interactive/interactive-mode.js +4167 -0
  564. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  565. package/dist/modes/interactive/theme/dark.json +85 -0
  566. package/dist/modes/interactive/theme/light.json +84 -0
  567. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  568. package/dist/modes/interactive/theme/theme.d.ts +81 -0
  569. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  570. package/dist/modes/interactive/theme/theme.js +975 -0
  571. package/dist/modes/interactive/theme/theme.js.map +1 -0
  572. package/dist/modes/print-mode.d.ts +28 -0
  573. package/dist/modes/print-mode.d.ts.map +1 -0
  574. package/dist/modes/print-mode.js +107 -0
  575. package/dist/modes/print-mode.js.map +1 -0
  576. package/dist/modes/rpc/index.d.ts +10 -0
  577. package/dist/modes/rpc/index.d.ts.map +1 -0
  578. package/dist/modes/rpc/index.js +8 -0
  579. package/dist/modes/rpc/index.js.map +1 -0
  580. package/dist/modes/rpc/jsonl.d.ts +17 -0
  581. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  582. package/dist/modes/rpc/jsonl.js +49 -0
  583. package/dist/modes/rpc/jsonl.js.map +1 -0
  584. package/dist/modes/rpc/rpc-client.d.ts +237 -0
  585. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  586. package/dist/modes/rpc/rpc-client.js +448 -0
  587. package/dist/modes/rpc/rpc-client.js.map +1 -0
  588. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  589. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  590. package/dist/modes/rpc/rpc-mode.js +592 -0
  591. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  592. package/dist/modes/rpc/rpc-types.d.ts +471 -0
  593. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  594. package/dist/modes/rpc/rpc-types.js +8 -0
  595. package/dist/modes/rpc/rpc-types.js.map +1 -0
  596. package/dist/utils/changelog.d.ts +21 -0
  597. package/dist/utils/changelog.d.ts.map +1 -0
  598. package/dist/utils/changelog.js +87 -0
  599. package/dist/utils/changelog.js.map +1 -0
  600. package/dist/utils/child-process.d.ts +11 -0
  601. package/dist/utils/child-process.d.ts.map +1 -0
  602. package/dist/utils/child-process.js +78 -0
  603. package/dist/utils/child-process.js.map +1 -0
  604. package/dist/utils/clipboard-image.d.ts +11 -0
  605. package/dist/utils/clipboard-image.d.ts.map +1 -0
  606. package/dist/utils/clipboard-image.js +245 -0
  607. package/dist/utils/clipboard-image.js.map +1 -0
  608. package/dist/utils/clipboard-native.d.ts +8 -0
  609. package/dist/utils/clipboard-native.d.ts.map +1 -0
  610. package/dist/utils/clipboard-native.js +14 -0
  611. package/dist/utils/clipboard-native.js.map +1 -0
  612. package/dist/utils/clipboard.d.ts +2 -0
  613. package/dist/utils/clipboard.d.ts.map +1 -0
  614. package/dist/utils/clipboard.js +78 -0
  615. package/dist/utils/clipboard.js.map +1 -0
  616. package/dist/utils/exif-orientation.d.ts +5 -0
  617. package/dist/utils/exif-orientation.d.ts.map +1 -0
  618. package/dist/utils/exif-orientation.js +158 -0
  619. package/dist/utils/exif-orientation.js.map +1 -0
  620. package/dist/utils/frontmatter.d.ts +8 -0
  621. package/dist/utils/frontmatter.d.ts.map +1 -0
  622. package/dist/utils/frontmatter.js +26 -0
  623. package/dist/utils/frontmatter.js.map +1 -0
  624. package/dist/utils/git.d.ts +26 -0
  625. package/dist/utils/git.d.ts.map +1 -0
  626. package/dist/utils/git.js +163 -0
  627. package/dist/utils/git.js.map +1 -0
  628. package/dist/utils/image-convert.d.ts +9 -0
  629. package/dist/utils/image-convert.d.ts.map +1 -0
  630. package/dist/utils/image-convert.js +39 -0
  631. package/dist/utils/image-convert.js.map +1 -0
  632. package/dist/utils/image-resize.d.ts +36 -0
  633. package/dist/utils/image-resize.d.ts.map +1 -0
  634. package/dist/utils/image-resize.js +137 -0
  635. package/dist/utils/image-resize.js.map +1 -0
  636. package/dist/utils/mime.d.ts +2 -0
  637. package/dist/utils/mime.d.ts.map +1 -0
  638. package/dist/utils/mime.js +26 -0
  639. package/dist/utils/mime.js.map +1 -0
  640. package/dist/utils/photon.d.ts +21 -0
  641. package/dist/utils/photon.d.ts.map +1 -0
  642. package/dist/utils/photon.js +121 -0
  643. package/dist/utils/photon.js.map +1 -0
  644. package/dist/utils/shell.d.ts +26 -0
  645. package/dist/utils/shell.d.ts.map +1 -0
  646. package/dist/utils/shell.js +186 -0
  647. package/dist/utils/shell.js.map +1 -0
  648. package/dist/utils/sleep.d.ts +5 -0
  649. package/dist/utils/sleep.d.ts.map +1 -0
  650. package/dist/utils/sleep.js +17 -0
  651. package/dist/utils/sleep.js.map +1 -0
  652. package/dist/utils/tools-manager.d.ts +3 -0
  653. package/dist/utils/tools-manager.d.ts.map +1 -0
  654. package/dist/utils/tools-manager.js +252 -0
  655. package/dist/utils/tools-manager.js.map +1 -0
  656. package/dist/utils/xml.d.ts +2 -0
  657. package/dist/utils/xml.d.ts.map +1 -0
  658. package/dist/utils/xml.js +9 -0
  659. package/dist/utils/xml.js.map +1 -0
  660. package/docs/buddy.md +111 -0
  661. package/docs/compaction.md +392 -0
  662. package/docs/custom-provider.md +599 -0
  663. package/docs/development.md +108 -0
  664. package/docs/extensions.md +2130 -0
  665. package/docs/images/doom-extension.png +0 -0
  666. package/docs/images/interactive-mode.png +0 -0
  667. package/docs/images/tree-view.png +0 -0
  668. package/docs/json.md +112 -0
  669. package/docs/keybindings.md +174 -0
  670. package/docs/mach6.md +150 -0
  671. package/docs/models.md +335 -0
  672. package/docs/packages.md +197 -0
  673. package/docs/prompt-templates.md +67 -0
  674. package/docs/providers.md +194 -0
  675. package/docs/rpc.md +1426 -0
  676. package/docs/sdk.md +969 -0
  677. package/docs/session.md +412 -0
  678. package/docs/settings.md +247 -0
  679. package/docs/shell-aliases.md +55 -0
  680. package/docs/skills.md +296 -0
  681. package/docs/terminal-setup.md +104 -0
  682. package/docs/termux.md +127 -0
  683. package/docs/themes.md +295 -0
  684. package/docs/tmux.md +61 -0
  685. package/docs/tree.md +228 -0
  686. package/docs/tui.md +887 -0
  687. package/docs/windows.md +61 -0
  688. package/examples/README.md +25 -0
  689. package/examples/extensions/README.md +205 -0
  690. package/examples/extensions/antigravity-image-gen.ts +418 -0
  691. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  692. package/examples/extensions/bash-spawn-hook.ts +30 -0
  693. package/examples/extensions/bookmark.ts +50 -0
  694. package/examples/extensions/built-in-tool-renderer.ts +246 -0
  695. package/examples/extensions/claude-rules.ts +86 -0
  696. package/examples/extensions/commands.ts +72 -0
  697. package/examples/extensions/confirm-destructive.ts +59 -0
  698. package/examples/extensions/custom-compaction.ts +114 -0
  699. package/examples/extensions/custom-footer.ts +64 -0
  700. package/examples/extensions/custom-header.ts +73 -0
  701. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  702. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  703. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  704. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  705. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  706. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  707. package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
  708. package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  709. package/examples/extensions/dirty-repo-guard.ts +56 -0
  710. package/examples/extensions/doom-overlay/README.md +46 -0
  711. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  712. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  713. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  714. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +73 -0
  715. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  716. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  717. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  718. package/examples/extensions/doom-overlay/index.ts +74 -0
  719. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  720. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  721. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  722. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  723. package/examples/extensions/dynamic-resources/index.ts +15 -0
  724. package/examples/extensions/dynamic-tools.ts +74 -0
  725. package/examples/extensions/event-bus.ts +43 -0
  726. package/examples/extensions/file-trigger.ts +41 -0
  727. package/examples/extensions/git-checkpoint.ts +53 -0
  728. package/examples/extensions/handoff.ts +150 -0
  729. package/examples/extensions/hello.ts +25 -0
  730. package/examples/extensions/inline-bash.ts +94 -0
  731. package/examples/extensions/input-transform.ts +43 -0
  732. package/examples/extensions/interactive-shell.ts +196 -0
  733. package/examples/extensions/mac-system-theme.ts +47 -0
  734. package/examples/extensions/message-renderer.ts +59 -0
  735. package/examples/extensions/minimal-mode.ts +426 -0
  736. package/examples/extensions/modal-editor.ts +85 -0
  737. package/examples/extensions/model-status.ts +31 -0
  738. package/examples/extensions/notify.ts +55 -0
  739. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  740. package/examples/extensions/overlay-test.ts +150 -0
  741. package/examples/extensions/permission-gate.ts +34 -0
  742. package/examples/extensions/pirate.ts +47 -0
  743. package/examples/extensions/plan-mode/README.md +65 -0
  744. package/examples/extensions/plan-mode/index.ts +340 -0
  745. package/examples/extensions/plan-mode/utils.ts +168 -0
  746. package/examples/extensions/preset.ts +403 -0
  747. package/examples/extensions/protected-paths.ts +30 -0
  748. package/examples/extensions/provider-payload.ts +14 -0
  749. package/examples/extensions/qna.ts +119 -0
  750. package/examples/extensions/question.ts +264 -0
  751. package/examples/extensions/questionnaire.ts +427 -0
  752. package/examples/extensions/rainbow-editor.ts +88 -0
  753. package/examples/extensions/reload-runtime.ts +37 -0
  754. package/examples/extensions/rpc-demo.ts +124 -0
  755. package/examples/extensions/sandbox/index.ts +317 -0
  756. package/examples/extensions/sandbox/package-lock.json +92 -0
  757. package/examples/extensions/sandbox/package.json +19 -0
  758. package/examples/extensions/send-user-message.ts +97 -0
  759. package/examples/extensions/session-name.ts +27 -0
  760. package/examples/extensions/shutdown-command.ts +63 -0
  761. package/examples/extensions/snake.ts +343 -0
  762. package/examples/extensions/space-invaders.ts +560 -0
  763. package/examples/extensions/ssh.ts +220 -0
  764. package/examples/extensions/status-line.ts +40 -0
  765. package/examples/extensions/subagent/README.md +172 -0
  766. package/examples/extensions/subagent/agents/planner.md +37 -0
  767. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  768. package/examples/extensions/subagent/agents/scout.md +50 -0
  769. package/examples/extensions/subagent/agents/worker.md +24 -0
  770. package/examples/extensions/subagent/agents.ts +126 -0
  771. package/examples/extensions/subagent/index.ts +986 -0
  772. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  773. package/examples/extensions/subagent/prompts/implement.md +10 -0
  774. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  775. package/examples/extensions/summarize.ts +195 -0
  776. package/examples/extensions/system-prompt-header.ts +17 -0
  777. package/examples/extensions/timed-confirm.ts +70 -0
  778. package/examples/extensions/titlebar-spinner.ts +58 -0
  779. package/examples/extensions/todo.ts +299 -0
  780. package/examples/extensions/tool-override.ts +144 -0
  781. package/examples/extensions/tools.ts +146 -0
  782. package/examples/extensions/trigger-compact.ts +40 -0
  783. package/examples/extensions/truncated-tool.ts +195 -0
  784. package/examples/extensions/widget-placement.ts +17 -0
  785. package/examples/extensions/with-deps/index.ts +32 -0
  786. package/examples/extensions/with-deps/package-lock.json +31 -0
  787. package/examples/extensions/with-deps/package.json +22 -0
  788. package/examples/rpc-extension-ui.ts +632 -0
  789. package/examples/sdk/01-minimal.ts +22 -0
  790. package/examples/sdk/02-custom-model.ts +49 -0
  791. package/examples/sdk/03-custom-prompt.ts +55 -0
  792. package/examples/sdk/04-skills.ts +53 -0
  793. package/examples/sdk/05-tools.ts +56 -0
  794. package/examples/sdk/06-extensions.ts +88 -0
  795. package/examples/sdk/07-context-files.ts +40 -0
  796. package/examples/sdk/08-prompt-templates.ts +48 -0
  797. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  798. package/examples/sdk/10-settings.ts +51 -0
  799. package/examples/sdk/11-sessions.ts +48 -0
  800. package/examples/sdk/12-full-control.ts +87 -0
  801. package/examples/sdk/README.md +144 -0
  802. package/package.json +123 -0
  803. package/skills/mach6-implement/SKILL.md +170 -0
  804. package/skills/mach6-issue/SKILL.md +129 -0
  805. package/skills/mach6-plan/SKILL.md +123 -0
  806. package/skills/mach6-publish/SKILL.md +188 -0
  807. package/skills/mach6-push/SKILL.md +101 -0
  808. package/skills/mach6-review/SKILL.md +192 -0
  809. package/skills/telegram-send/SKILL.md +46 -0
@@ -0,0 +1,950 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomBytes } from "node:crypto";
3
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { join, resolve } from "node:path";
6
+ import { Text } from "@dreb/tui";
7
+ import { Type } from "@sinclair/typebox";
8
+ import { CONFIG_DIR_NAME, getPackageDir, getSubagentSessionsDir } from "../../config.js";
9
+ import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
10
+ import { attachJsonlLineReader } from "../../modes/rpc/jsonl.js";
11
+ import { resolveCliModel } from "../model-resolver.js";
12
+ import { getTextOutput, invalidArgText, str } from "./render-utils.js";
13
+ import { wrapToolDefinition } from "./tool-definition-wrapper.js";
14
+ import { DEFAULT_MAX_BYTES, formatSize } from "./truncate.js";
15
+ const DEFAULT_AGENT = "Explore";
16
+ export function parseAgentFrontmatter(content) {
17
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
18
+ if (!fmMatch)
19
+ return { ok: false, error: "missing --- frontmatter delimiters" };
20
+ const frontmatter = fmMatch[1];
21
+ const body = fmMatch[2].trim();
22
+ const get = (key) => {
23
+ const match = frontmatter.match(new RegExp(`^${key}:\\s*(.+)$`, "m"));
24
+ return match?.[1].trim();
25
+ };
26
+ /** Parse `model` field — supports single string, comma-separated, or YAML list syntax. */
27
+ const getModel = () => {
28
+ // First check for YAML list syntax (indented lines starting with "- ")
29
+ const listMatch = frontmatter.match(/^model:\s*\n((?:\s+-\s+.+\n?)+)/m);
30
+ if (listMatch) {
31
+ const items = listMatch[1]
32
+ .split("\n")
33
+ .map((line) => line.replace(/^\s+-\s+/, "").trim())
34
+ .filter(Boolean);
35
+ return items.length > 1 ? items : items[0];
36
+ }
37
+ // Inline value — check for comma-separated list
38
+ const value = get("model");
39
+ if (!value)
40
+ return undefined;
41
+ if (value.includes(",")) {
42
+ const items = value
43
+ .split(",")
44
+ .map((s) => s.trim())
45
+ .filter(Boolean);
46
+ return items.length > 1 ? items : items[0];
47
+ }
48
+ return value;
49
+ };
50
+ const name = get("name");
51
+ if (!name)
52
+ return { ok: false, error: "missing required 'name' field in frontmatter" };
53
+ return {
54
+ ok: true,
55
+ config: {
56
+ name,
57
+ description: get("description") || "",
58
+ tools: get("tools"),
59
+ model: getModel(),
60
+ systemPrompt: body,
61
+ },
62
+ };
63
+ }
64
+ function discoverAgentTypes(cwd) {
65
+ const agents = new Map();
66
+ // Package-bundled agents (shipped with dreb — the canonical source of truth for built-in agents)
67
+ const packageAgentsDir = join(getPackageDir(), "agents");
68
+ loadAgentsFromDir(packageAgentsDir, agents);
69
+ // User-level agents (~/.dreb/agents/*.md)
70
+ const userDir = join(homedir(), CONFIG_DIR_NAME, "agents");
71
+ loadAgentsFromDir(userDir, agents);
72
+ // Project-level agents (.dreb/agents/*.md)
73
+ // TODO: Security gate — prompt user for confirmation before loading agents from untrusted repos
74
+ const projectDir = join(cwd, ".dreb", "agents");
75
+ loadAgentsFromDir(projectDir, agents);
76
+ return agents;
77
+ }
78
+ function loadAgentsFromDir(dir, agents) {
79
+ if (!existsSync(dir))
80
+ return;
81
+ try {
82
+ for (const file of readdirSync(dir)) {
83
+ if (!file.endsWith(".md"))
84
+ continue;
85
+ try {
86
+ const content = readFileSync(join(dir, file), "utf-8");
87
+ const parsed = parseAgentFrontmatter(content);
88
+ if (!parsed.ok) {
89
+ console.error(`[subagent] Skipping agent file ${join(dir, file)}: ${parsed.error}`);
90
+ }
91
+ else {
92
+ agents.set(parsed.config.name, parsed.config);
93
+ }
94
+ }
95
+ catch (err) {
96
+ console.error(`[subagent] Could not read agent file ${join(dir, file)}: ${err instanceof Error ? err.message : String(err)}`);
97
+ }
98
+ }
99
+ }
100
+ catch (err) {
101
+ if (err.code !== "ENOENT") {
102
+ console.error(`[subagent] Could not read agents directory ${dir}: ${err instanceof Error ? err.message : String(err)}`);
103
+ }
104
+ }
105
+ }
106
+ // Capture at module load before process.title overwrites argv memory on Linux.
107
+ // After process.title = "dreb" (in cli.ts), the original argv area is overwritten
108
+ // and process.argv[1] may return corrupted or truncated data.
109
+ const DREB_SCRIPT = process.argv[1] || "dreb";
110
+ const NODE_EXEC = process.execPath;
111
+ // TODO: Support PATH-based binary discovery.
112
+ // Currently returns the captured argv[1].
113
+ function findDrebBinary() {
114
+ return DREB_SCRIPT;
115
+ }
116
+ async function spawnSubagent(agentConfig, task, cwd, signal, onProgress, parentProvider, sessionDir) {
117
+ const drebBin = findDrebBinary();
118
+ console.error(`[subagent] spawn: agent=${agentConfig.name} cwd=${cwd}`);
119
+ // Validate cwd exists — spawn() throws a misleading ENOENT blaming the
120
+ // binary when the cwd is invalid, making the real cause hard to diagnose
121
+ if (!existsSync(cwd)) {
122
+ return {
123
+ agent: agentConfig.name,
124
+ task,
125
+ exitCode: 1,
126
+ output: "",
127
+ stderr: "",
128
+ errorMessage: `Working directory does not exist: ${cwd}`,
129
+ };
130
+ }
131
+ const args = ["--mode", "json", "--ui", "agent"];
132
+ if (sessionDir) {
133
+ args.push("--session-dir", sessionDir);
134
+ }
135
+ else {
136
+ args.push("--no-session");
137
+ }
138
+ // By spawn time, model should be a resolved single string (fallback resolution
139
+ // happens in executeSingle). Handle string[] defensively by taking the first entry.
140
+ const modelStr = Array.isArray(agentConfig.model) ? agentConfig.model[0] : agentConfig.model;
141
+ if (modelStr) {
142
+ args.push("--model", modelStr);
143
+ // When the model string doesn't already specify a provider (no "/"),
144
+ // inherit the parent's provider to prevent fuzzy matching from picking
145
+ // an unauthenticated provider (e.g. Bedrock instead of Anthropic).
146
+ if (parentProvider && !modelStr.includes("/")) {
147
+ args.push("--provider", parentProvider);
148
+ }
149
+ }
150
+ if (agentConfig.tools) {
151
+ args.push("--tools", agentConfig.tools);
152
+ }
153
+ if (agentConfig.systemPrompt) {
154
+ args.push("--append-system-prompt", agentConfig.systemPrompt);
155
+ }
156
+ args.push("-p", task);
157
+ // Early abort check — if the signal is already aborted (e.g. queued task whose
158
+ // AbortController was aborted while waiting on bgAcquire), bail out before
159
+ // spawning a child process that can never be killed. addEventListener("abort")
160
+ // on an already-aborted signal does NOT fire the callback in Node.js.
161
+ if (signal?.aborted) {
162
+ return {
163
+ agent: agentConfig.name,
164
+ task,
165
+ exitCode: 1,
166
+ output: "",
167
+ stderr: "",
168
+ errorMessage: "Aborted before spawn",
169
+ };
170
+ }
171
+ return new Promise((resolvePromise, rejectPromise) => {
172
+ let proc;
173
+ try {
174
+ proc = spawn(NODE_EXEC, [drebBin, ...args], {
175
+ cwd,
176
+ stdio: ["ignore", "pipe", "pipe"],
177
+ env: { ...process.env },
178
+ });
179
+ }
180
+ catch (err) {
181
+ rejectPromise(new Error(`Failed to spawn subagent: ${err instanceof Error ? err.message : String(err)}`));
182
+ return;
183
+ }
184
+ let settled = false;
185
+ let killTimer = null;
186
+ const collectedMessages = [];
187
+ const stderrChunks = [];
188
+ let stderrSize = 0;
189
+ const MAX_STDERR_BYTES = 8192;
190
+ const plainStdoutLines = [];
191
+ let lastToolName = "";
192
+ let resolvedModel;
193
+ // Drain stderr concurrently to avoid pipe deadlock (capped to prevent OOM from verbose subagents)
194
+ proc.stderr?.on("data", (chunk) => {
195
+ if (stderrSize < MAX_STDERR_BYTES) {
196
+ const str = chunk.toString();
197
+ stderrChunks.push(str);
198
+ stderrSize += str.length;
199
+ }
200
+ });
201
+ proc.stderr?.on("error", (err) => {
202
+ console.error(`[subagent] stderr stream error (agent=${agentConfig.name}): ${err.message}`);
203
+ });
204
+ // Parse JSONL events from stdout
205
+ if (proc.stdout) {
206
+ proc.stdout.on("error", (err) => {
207
+ console.error(`[subagent] stdout stream error (agent=${agentConfig.name}): ${err.message}`);
208
+ });
209
+ attachJsonlLineReader(proc.stdout, (line) => {
210
+ if (!line.trim())
211
+ return;
212
+ // Separate JSON.parse from event handling so only parse failures
213
+ // are caught as non-JSON lines — errors in handling propagate normally
214
+ let event;
215
+ try {
216
+ event = JSON.parse(line);
217
+ }
218
+ catch {
219
+ // Capture non-JSON lines — on failure these often contain the real error
220
+ // (e.g. startup errors printed before JSONL mode begins)
221
+ plainStdoutLines.push(line.trim());
222
+ if (line.trim().startsWith("{")) {
223
+ console.error(`[subagent] Failed to parse JSONL event: ${line.slice(0, 200)}`);
224
+ }
225
+ return;
226
+ }
227
+ if (event.type === "agent_start" && event.model) {
228
+ resolvedModel = event.model.id;
229
+ }
230
+ if (event.type === "message_end" && event.message?.role === "assistant") {
231
+ collectedMessages.push(event.message);
232
+ }
233
+ if (event.type === "tool_execution_start" && onProgress) {
234
+ lastToolName = event.toolName || "";
235
+ onProgress(`Using ${lastToolName}...`);
236
+ }
237
+ if (event.type === "tool_execution_end" && onProgress) {
238
+ onProgress(`${lastToolName} done`);
239
+ }
240
+ });
241
+ }
242
+ // Handle abort signal (guard kill() against ESRCH race if process already exited)
243
+ const onAbort = () => {
244
+ try {
245
+ proc.kill("SIGTERM");
246
+ }
247
+ catch {
248
+ /* process already exited */
249
+ }
250
+ killTimer = setTimeout(() => {
251
+ try {
252
+ if (!proc.killed)
253
+ proc.kill("SIGKILL");
254
+ }
255
+ catch {
256
+ /* process already exited */
257
+ }
258
+ }, 5000);
259
+ };
260
+ signal?.addEventListener("abort", onAbort, { once: true });
261
+ proc.on("error", (err) => {
262
+ if (settled)
263
+ return;
264
+ settled = true;
265
+ if (killTimer)
266
+ clearTimeout(killTimer);
267
+ signal?.removeEventListener("abort", onAbort);
268
+ rejectPromise(new Error(`Subagent process error: ${err.message}`));
269
+ });
270
+ proc.on("close", (code) => {
271
+ if (settled)
272
+ return;
273
+ settled = true;
274
+ if (killTimer)
275
+ clearTimeout(killTimer);
276
+ signal?.removeEventListener("abort", onAbort);
277
+ const exitCode = code ?? 1;
278
+ const stderr = stderrChunks.join("");
279
+ console.error(`[subagent] close: agent=${agentConfig.name} exit=${exitCode} messages=${collectedMessages.length}${exitCode !== 0 ? ` stderr=${stderr.slice(0, 200)} stdout=${plainStdoutLines.join("|").slice(0, 200)}` : ""}`);
280
+ // Extract final text output from collected assistant messages
281
+ const outputParts = [];
282
+ for (const msg of collectedMessages) {
283
+ if (Array.isArray(msg.content)) {
284
+ for (const part of msg.content) {
285
+ if (part.type === "text" && part.text) {
286
+ outputParts.push(part.text);
287
+ }
288
+ }
289
+ }
290
+ }
291
+ const output = outputParts.join("\n\n");
292
+ // Build error message from best available source: stderr, plain stdout lines, or generic
293
+ let errorMessage = null;
294
+ if (exitCode !== 0) {
295
+ const stderrTrimmed = stderr.trim();
296
+ const plainOutput = plainStdoutLines.join("\n").trim();
297
+ errorMessage =
298
+ stderrTrimmed.slice(0, 500) || plainOutput.slice(0, 500) || `Subagent exited with code ${exitCode}`;
299
+ }
300
+ // Discover the session file written by the child process
301
+ const sessionFile = sessionDir ? discoverSessionFile(sessionDir, agentConfig.name) : undefined;
302
+ resolvePromise({
303
+ agent: agentConfig.name,
304
+ task,
305
+ model: resolvedModel ??
306
+ (exitCode === 0
307
+ ? Array.isArray(agentConfig.model)
308
+ ? agentConfig.model[0]
309
+ : agentConfig.model
310
+ : undefined),
311
+ exitCode,
312
+ output,
313
+ stderr: stderr.slice(0, 2000), // cap stderr
314
+ errorMessage,
315
+ sessionFile,
316
+ });
317
+ });
318
+ });
319
+ }
320
+ // ---------------------------------------------------------------------------
321
+ // Session file discovery and cleanup
322
+ // ---------------------------------------------------------------------------
323
+ /**
324
+ * Find the most recently modified .jsonl file in a session directory.
325
+ * Returns the full path, or undefined if no session file was written
326
+ * (e.g., subagent was killed before the first assistant message).
327
+ */
328
+ export function discoverSessionFile(sessionDir, agentName) {
329
+ try {
330
+ if (!existsSync(sessionDir))
331
+ return undefined;
332
+ const files = readdirSync(sessionDir).filter((f) => f.endsWith(".jsonl"));
333
+ if (files.length === 0)
334
+ return undefined;
335
+ // Pick the most recently modified file (typically there's only one per subagent dir)
336
+ let best;
337
+ for (const f of files) {
338
+ try {
339
+ const fullPath = join(sessionDir, f);
340
+ const mtime = statSync(fullPath).mtime.getTime();
341
+ if (!best || mtime > best.mtime) {
342
+ best = { path: fullPath, mtime };
343
+ }
344
+ }
345
+ catch {
346
+ // File disappeared or is a bad symlink — skip it, keep any valid candidate
347
+ }
348
+ }
349
+ if (best) {
350
+ console.error(`[subagent] session file: ${best.path} (agent=${agentName})`);
351
+ return best.path;
352
+ }
353
+ }
354
+ catch (err) {
355
+ console.error(`[subagent] failed to discover session file (agent=${agentName}): ${err instanceof Error ? err.message : String(err)}`);
356
+ }
357
+ return undefined;
358
+ }
359
+ // ---------------------------------------------------------------------------
360
+ // Execution modes
361
+ // ---------------------------------------------------------------------------
362
+ /**
363
+ * Resolve a model fallback list against the registry. Tries each model in order,
364
+ * returns the first one that resolves successfully. If all fail, returns the
365
+ * last error. Single strings are treated as a one-element list.
366
+ */
367
+ export function resolveModelWithFallbacks(models, parentProvider, registry) {
368
+ const modelList = Array.isArray(models) ? models : [models];
369
+ let lastError = "";
370
+ for (const modelStr of modelList) {
371
+ const result = resolveModelStringSingle(modelStr, parentProvider, registry);
372
+ if (result.ok)
373
+ return result;
374
+ lastError = result.error;
375
+ }
376
+ if (modelList.length > 1) {
377
+ return {
378
+ ok: false,
379
+ error: `None of the fallback models resolved: ${modelList.join(", ")}. Last error: ${lastError}`,
380
+ };
381
+ }
382
+ return { ok: false, error: lastError };
383
+ }
384
+ export function resolveModelStringSingle(modelStr, parentProvider, registry) {
385
+ if (!registry) {
386
+ return { ok: true, modelId: modelStr };
387
+ }
388
+ // If the model string contains "/" the user already specified a provider
389
+ const hasProvider = modelStr.includes("/");
390
+ const resolved = resolveCliModel({
391
+ cliProvider: hasProvider ? undefined : parentProvider,
392
+ cliModel: modelStr,
393
+ modelRegistry: registry,
394
+ });
395
+ if (resolved.error) {
396
+ return { ok: false, error: resolved.error };
397
+ }
398
+ if (!resolved.model) {
399
+ return { ok: false, error: `Model "${modelStr}" not found. Use --list-models to see available models.` };
400
+ }
401
+ // resolveCliModel creates a synthetic model for any unknown ID when a
402
+ // provider is specified (designed for custom/self-hosted models like Ollama).
403
+ // For subagents this causes silent failures — reject synthetic fallbacks
404
+ // so the next model in the fallback list is tried instead.
405
+ if (resolved.isSyntheticFallback) {
406
+ return {
407
+ ok: false,
408
+ error: `Model "${modelStr}" not found for provider "${resolved.model.provider}". Use --list-models to see available models.`,
409
+ };
410
+ }
411
+ return { ok: true, modelId: resolved.model.id, provider: resolved.model.provider };
412
+ }
413
+ const MAX_PARALLEL_TASKS = 8;
414
+ const MAX_CONCURRENCY = 4;
415
+ const MAX_TASK_LENGTH = 32_768; // 32 KB — prevent E2BIG from oversized argv
416
+ // Semaphore for background task concurrency — shared across all background launches
417
+ let bgRunning = 0;
418
+ const bgWaiters = [];
419
+ async function bgAcquire() {
420
+ if (bgRunning < MAX_CONCURRENCY) {
421
+ bgRunning++;
422
+ return;
423
+ }
424
+ return new Promise((resolve) => {
425
+ bgWaiters.push(() => {
426
+ bgRunning++;
427
+ resolve();
428
+ });
429
+ });
430
+ }
431
+ function bgRelease() {
432
+ bgRunning--;
433
+ const next = bgWaiters.shift();
434
+ if (next)
435
+ next();
436
+ }
437
+ /**
438
+ * Resolve a per-task cwd relative to the parent cwd.
439
+ * Rejects absolute paths and relative paths that escape the parent directory.
440
+ * Returns a result object with ok=false and an error string on rejection, so callers can surface it to the model.
441
+ */
442
+ function clampCwd(defaultCwd, itemCwd) {
443
+ if (!itemCwd)
444
+ return { ok: true, cwd: defaultCwd };
445
+ if (itemCwd.startsWith("/")) {
446
+ return { ok: false, error: `Rejected absolute cwd "${itemCwd}" — must be relative to parent cwd` };
447
+ }
448
+ const resolved = resolve(defaultCwd, itemCwd);
449
+ if (resolved !== defaultCwd && !resolved.startsWith(`${defaultCwd}/`)) {
450
+ return { ok: false, error: `Rejected cwd "${itemCwd}" — resolves outside parent cwd` };
451
+ }
452
+ return { ok: true, cwd: resolved };
453
+ }
454
+ async function executeSingle(agents, agentName, task, cwd, signal, onProgress, modelOverride, parentProvider, registry, sessionDir) {
455
+ const name = agentName || DEFAULT_AGENT;
456
+ const config = agents.get(name);
457
+ if (!config) {
458
+ return {
459
+ agent: name,
460
+ task,
461
+ exitCode: 1,
462
+ output: "",
463
+ stderr: "",
464
+ errorMessage: `Unknown agent type "${name}". Available: ${[...agents.keys()].join(", ")}. If you expected "${name}" to exist, check the .md file in ~/.dreb/agents/ or .dreb/agents/ for syntax errors.`,
465
+ };
466
+ }
467
+ // Validate task length for all modes (single, parallel items, chain steps)
468
+ if (task.length > MAX_TASK_LENGTH) {
469
+ return {
470
+ agent: name,
471
+ task: `${task.slice(0, 200)}...`,
472
+ exitCode: 1,
473
+ output: "",
474
+ stderr: "",
475
+ errorMessage: `Task prompt too long (${task.length} chars, max ${MAX_TASK_LENGTH}). Shorten the prompt.`,
476
+ };
477
+ }
478
+ // Per-invocation model override takes precedence over agent definition model.
479
+ // Override is always a single string; agent config may be a string or fallback list.
480
+ const modelSpec = modelOverride || config.model;
481
+ let effectiveConfig = modelOverride ? { ...config, model: modelOverride } : config;
482
+ let resolvedProvider = parentProvider;
483
+ // Resolve and validate the model against the registry before spawning.
484
+ // This catches typos and invalid model names immediately instead of failing
485
+ // silently in the child process. Also passes the canonical model ID to the
486
+ // child, avoiding fuzzy matching entirely.
487
+ if (modelSpec) {
488
+ const resolved = resolveModelWithFallbacks(modelSpec, parentProvider, registry);
489
+ if (!resolved.ok) {
490
+ return {
491
+ agent: name,
492
+ task,
493
+ exitCode: 1,
494
+ output: "",
495
+ stderr: "",
496
+ errorMessage: resolved.error,
497
+ };
498
+ }
499
+ effectiveConfig = { ...effectiveConfig, model: resolved.modelId };
500
+ if (resolved.provider) {
501
+ resolvedProvider = resolved.provider;
502
+ }
503
+ }
504
+ onProgress?.(`Running ${name} agent...`);
505
+ return spawnSubagent(effectiveConfig, task, cwd, signal, onProgress, resolvedProvider, sessionDir);
506
+ }
507
+ async function executeChain(agents, chain, defaultCwd, signal, onProgress, parentProvider, registry, sessionBaseDir) {
508
+ const results = [];
509
+ let previousOutput = "";
510
+ for (let i = 0; i < chain.length; i++) {
511
+ if (signal?.aborted)
512
+ break;
513
+ const step = chain[i];
514
+ const task = step.task.replace(/\{previous\}/g, previousOutput);
515
+ onProgress?.(`Chain step ${i + 1}/${chain.length}`);
516
+ // Validate task length after {previous} substitution (can compound across steps)
517
+ if (task.length > MAX_TASK_LENGTH) {
518
+ results.push({
519
+ agent: step.agent || DEFAULT_AGENT,
520
+ task: `${task.slice(0, 200)}...`,
521
+ exitCode: 1,
522
+ output: "",
523
+ stderr: "",
524
+ errorMessage: `Task prompt too long after {previous} substitution (${task.length} chars, max ${MAX_TASK_LENGTH}). Shorten the prompt or summarize previous output.`,
525
+ });
526
+ break;
527
+ }
528
+ const cwdResult = clampCwd(defaultCwd, step.cwd);
529
+ if (!cwdResult.ok) {
530
+ results.push({
531
+ agent: step.agent || DEFAULT_AGENT,
532
+ task,
533
+ exitCode: 1,
534
+ output: "",
535
+ stderr: "",
536
+ errorMessage: cwdResult.error,
537
+ });
538
+ break;
539
+ }
540
+ // Each chain step gets its own session subdirectory
541
+ const stepSessionDir = sessionBaseDir ? join(sessionBaseDir, `step-${i + 1}`) : undefined;
542
+ const result = await executeSingle(agents, step.agent, task, cwdResult.cwd, signal, onProgress, step.model, parentProvider, registry, stepSessionDir);
543
+ results.push(result);
544
+ if (result.exitCode !== 0) {
545
+ break; // stop chain on error
546
+ }
547
+ previousOutput = result.output;
548
+ }
549
+ return results;
550
+ }
551
+ // ---------------------------------------------------------------------------
552
+ // Background execution
553
+ // ---------------------------------------------------------------------------
554
+ function generateAgentId() {
555
+ return randomBytes(6).toString("hex");
556
+ }
557
+ const backgroundAgentRegistry = new Map();
558
+ const backgroundAbortControllers = new Map();
559
+ /** Get a snapshot of all tracked background agents (running and recently completed). Returns readonly clones. */
560
+ export function getBackgroundAgents() {
561
+ return [...backgroundAgentRegistry.values()].map((a) => ({ ...a }));
562
+ }
563
+ /** Get only currently running background agents. Returns readonly clones. */
564
+ export function getRunningBackgroundAgents() {
565
+ return [...backgroundAgentRegistry.values()].filter((a) => a.status === "running").map((a) => ({ ...a }));
566
+ }
567
+ /** Abort all running background agents. */
568
+ export function abortBackgroundAgents() {
569
+ for (const [id, controller] of backgroundAbortControllers) {
570
+ controller.abort();
571
+ const entry = backgroundAgentRegistry.get(id);
572
+ if (entry && entry.status === "running") {
573
+ entry.status = "failed";
574
+ }
575
+ }
576
+ backgroundAbortControllers.clear();
577
+ }
578
+ /** Remove completed/failed entries older than the given age (ms). Default: 5 minutes. */
579
+ export function pruneBackgroundAgents(maxAgeMs = 5 * 60 * 1000) {
580
+ const now = Date.now();
581
+ for (const [id, info] of backgroundAgentRegistry) {
582
+ if (info.status !== "running" && now - info.startedAt > maxAgeMs) {
583
+ backgroundAgentRegistry.delete(id);
584
+ backgroundAbortControllers.delete(id);
585
+ }
586
+ }
587
+ }
588
+ // ---------------------------------------------------------------------------
589
+ // Tool schema and definition
590
+ // ---------------------------------------------------------------------------
591
+ const taskItemSchema = Type.Object({
592
+ agent: Type.Optional(Type.String({ description: "Agent type name (default: 'Explore')" })),
593
+ task: Type.String({ description: "The task prompt for this subagent" }),
594
+ cwd: Type.Optional(Type.String({ description: "Working directory (defaults to parent's cwd)" })),
595
+ model: Type.Optional(Type.String({
596
+ description: "Model override for this task. Takes precedence over agent definition model. Note: a single-string override discards the agent's fallback list.",
597
+ })),
598
+ });
599
+ const subagentSchema = Type.Object({
600
+ agent: Type.Optional(Type.String({ description: "Agent type name (default: 'Explore')" })),
601
+ task: Type.Optional(Type.String({ description: "Task prompt (single mode)", minLength: 1 })),
602
+ model: Type.Optional(Type.String({
603
+ description: "Model override. Takes precedence over agent definition model. Note: a single-string override discards the agent's fallback list. For parallel/chain, set per-task instead.",
604
+ })),
605
+ tasks: Type.Optional(Type.Array(taskItemSchema, {
606
+ description: "Array of tasks to run in parallel (max 8)",
607
+ minItems: 1,
608
+ maxItems: MAX_PARALLEL_TASKS,
609
+ })),
610
+ chain: Type.Optional(Type.Array(taskItemSchema, {
611
+ description: "Sequential pipeline — each step can use {previous} for prior output",
612
+ minItems: 1,
613
+ })),
614
+ // background parameter removed — all subagents run in background mode.
615
+ // Kept in schema for backward compatibility (silently ignored if passed).
616
+ background: Type.Optional(Type.Boolean({ description: "Deprecated — all subagents run in background mode. This parameter is ignored." })),
617
+ });
618
+ function formatSubagentCall(args, theme, argsComplete = true) {
619
+ const invalidArg = invalidArgText(theme);
620
+ if (args?.tasks) {
621
+ return (theme.fg("toolTitle", theme.bold("subagent")) +
622
+ " " +
623
+ theme.fg("accent", `parallel (${args.tasks.length} tasks)`));
624
+ }
625
+ if (args?.chain) {
626
+ return `${theme.fg("toolTitle", theme.bold("subagent"))} ${theme.fg("accent", `chain (${args.chain.length} steps)`)}`;
627
+ }
628
+ const agent = str(args?.agent) || DEFAULT_AGENT;
629
+ const model = str(args?.model);
630
+ const task = str(args?.task);
631
+ const taskPreview = task ? (task.length > 60 ? `${task.slice(0, 57)}...` : task) : null;
632
+ const modelSuffix = model ? ` ${theme.fg("muted", `(${model})`)}` : "";
633
+ return (theme.fg("toolTitle", theme.bold("subagent")) +
634
+ " " +
635
+ theme.fg("accent", agent) +
636
+ modelSuffix +
637
+ " " +
638
+ (taskPreview === null
639
+ ? argsComplete
640
+ ? invalidArg
641
+ : theme.fg("muted", "…")
642
+ : theme.fg("toolOutput", `"${taskPreview}"`)));
643
+ }
644
+ function formatSubagentResult(result, options, theme, showImages) {
645
+ const output = getTextOutput(result, showImages).trim();
646
+ let text = "";
647
+ if (output) {
648
+ const lines = output.split("\n");
649
+ const maxLines = options.expanded ? lines.length : 25;
650
+ const displayLines = lines.slice(0, maxLines);
651
+ const remaining = lines.length - maxLines;
652
+ text += `\n${displayLines.map((line) => theme.fg("toolOutput", line)).join("\n")}`;
653
+ if (remaining > 0) {
654
+ text += `${theme.fg("muted", `\n... (${remaining} more lines,`)} ${keyHint("app.tools.expand", "to expand")})`;
655
+ }
656
+ }
657
+ const truncation = result.details?.truncation;
658
+ if (truncation?.truncated) {
659
+ text += `\n${theme.fg("warning", `[Truncated: ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;
660
+ }
661
+ return text;
662
+ }
663
+ function formatSingleResult(result) {
664
+ let text = `## Agent: ${result.agent}${result.model ? ` (model: ${result.model})` : ""}\n`;
665
+ if (result.exitCode !== 0) {
666
+ text += `**Error** (exit ${result.exitCode}): ${result.errorMessage || "Unknown error"}\n`;
667
+ if (result.stderr) {
668
+ text += `\nStderr:\n${result.stderr}\n`;
669
+ }
670
+ }
671
+ if (result.output) {
672
+ text += `\n${result.output}`;
673
+ }
674
+ else if (result.exitCode === 0) {
675
+ text += "\n(No output)";
676
+ }
677
+ if (result.sessionFile) {
678
+ text += `\n\nSession log: ${result.sessionFile}`;
679
+ }
680
+ return text;
681
+ }
682
+ export function createSubagentToolDefinition(cwd, options) {
683
+ const onBackgroundStart = options?.onBackgroundStart;
684
+ const onBackgroundComplete = options?.onBackgroundComplete;
685
+ const getParentProvider = options?.parentProvider ?? (() => undefined);
686
+ const modelRegistry = options?.modelRegistry;
687
+ // Discover agents at definition time to build the prompt guidelines.
688
+ // This is cheap (reads .md files) and the same call happens on every execute().
689
+ const knownAgents = discoverAgentTypes(cwd);
690
+ const agentListParts = [];
691
+ for (const [name, config] of knownAgents) {
692
+ const defaultTag = name === DEFAULT_AGENT ? " (default)" : "";
693
+ const desc = config.description || name;
694
+ agentListParts.push(`'${name}'${defaultTag} — ${desc}`);
695
+ }
696
+ const builtInAgentsLine = `Built-in agents: ${agentListParts.join("; ")}`;
697
+ return {
698
+ name: "subagent",
699
+ label: "subagent",
700
+ description: "Delegate tasks to independent subagents (Explore for codebase research, Sandbox for isolated /tmp-only analysis). " +
701
+ "Supports single task, parallel (up to 8, max 4 concurrent), " +
702
+ "and chain (sequential pipeline with {previous} substitution) modes. " +
703
+ "All subagents run in background — returns immediately, notifies on completion.",
704
+ promptSnippet: "Delegate tasks to independent subagents",
705
+ promptGuidelines: [
706
+ "Use `subagent` to delegate focused, independent tasks to child agents",
707
+ "Available agent types can be discovered from ~/.dreb/agents/ and .dreb/agents/ markdown files",
708
+ builtInAgentsLine,
709
+ "Use parallel mode for independent tasks that can run concurrently",
710
+ "Use chain mode when each step depends on the previous step's output (reference with {previous})",
711
+ "All subagents run in background — the tool returns immediately and you are notified when each agent completes.",
712
+ "Subagents have their own context window — provide enough context in the task prompt",
713
+ "Each agent notifies independently when done — completion messages include a list of any still-running agents. If you need their results before proceeding, stop generating — do not output anything, do not launch filler work. Your turn ends, and when an agent completes, its result arrives as a new message that resumes your turn automatically.",
714
+ "Agent definitions specify a `model` field with a provider fallback list (comma-separated or YAML list). The spawner tries each in order and uses the first one that resolves for the current provider. This makes agents portable across providers.",
715
+ "Per-invocation `model` overrides take precedence but **discard the entire fallback list** — if the single override model isn't available on the current provider, the agent fails. Only override when you have a specific reason (e.g. escalating to a stronger tier for a complex task).",
716
+ "**Model routing** — agent definitions already specify the right tier for their role. Most subagent tasks (exploration, file discovery, grep, navigation, summarization) are handled well by the defaults. Do not override the model unless the task genuinely requires a different capability tier than what the agent definition provides.",
717
+ ],
718
+ parameters: subagentSchema,
719
+ async execute(_toolCallId, params, _signal, _onUpdate) {
720
+ const agents = discoverAgentTypes(cwd);
721
+ // Determine mode
722
+ const modeCount = (params.task ? 1 : 0) + (params.tasks ? 1 : 0) + (params.chain ? 1 : 0);
723
+ if (modeCount === 0) {
724
+ return {
725
+ content: [
726
+ { type: "text", text: "Error: provide one of `task` (single), `tasks` (parallel), or `chain`." },
727
+ ],
728
+ details: undefined,
729
+ };
730
+ }
731
+ if (modeCount > 1) {
732
+ return {
733
+ content: [
734
+ {
735
+ type: "text",
736
+ text: "Error: modes are mutually exclusive — provide only one of `task`, `tasks`, or `chain`.",
737
+ },
738
+ ],
739
+ details: undefined,
740
+ };
741
+ }
742
+ // All subagents run in background mode — return immediately, notify on completion
743
+ {
744
+ if (!onBackgroundComplete) {
745
+ return {
746
+ content: [
747
+ {
748
+ type: "text",
749
+ text: "Subagent execution requires background support, which is not available in this session.",
750
+ },
751
+ ],
752
+ details: undefined,
753
+ };
754
+ }
755
+ /**
756
+ * Shared lifecycle for all background launches: generates agent ID,
757
+ * sets up registry/abort/notification, gates on the concurrency
758
+ * semaphore, and handles errors. The caller provides the actual
759
+ * work via `runFn(signal)` which must return a SubagentResult.
760
+ */
761
+ const launchBackgroundLifecycle = (agentName, taskSummary, runFn) => {
762
+ const agentId = generateAgentId();
763
+ const bgAbort = new AbortController();
764
+ backgroundAgentRegistry.set(agentId, {
765
+ agentId,
766
+ agentType: agentName,
767
+ taskSummary,
768
+ startedAt: Date.now(),
769
+ status: "running",
770
+ });
771
+ backgroundAbortControllers.set(agentId, bgAbort);
772
+ onBackgroundStart?.(agentId, agentName, taskSummary);
773
+ const bgSignal = bgAbort.signal;
774
+ const safeNotify = (result) => {
775
+ try {
776
+ onBackgroundComplete(agentId, result, bgSignal.aborted);
777
+ }
778
+ catch (err) {
779
+ console.error(`[subagent] onBackgroundComplete threw for agent ${agentId}: ${err instanceof Error ? err.message : String(err)}. Background result lost.`);
780
+ }
781
+ };
782
+ const run = async () => {
783
+ await bgAcquire();
784
+ try {
785
+ const result = await runFn(bgSignal);
786
+ const entry = backgroundAgentRegistry.get(agentId);
787
+ if (entry && !bgSignal.aborted)
788
+ entry.status = result.exitCode === 0 ? "completed" : "failed";
789
+ backgroundAbortControllers.delete(agentId);
790
+ safeNotify(result);
791
+ }
792
+ catch (err) {
793
+ const entry = backgroundAgentRegistry.get(agentId);
794
+ if (entry && !bgSignal.aborted)
795
+ entry.status = "failed";
796
+ backgroundAbortControllers.delete(agentId);
797
+ safeNotify({
798
+ agent: agentName,
799
+ task: taskSummary,
800
+ exitCode: 1,
801
+ output: "",
802
+ stderr: "",
803
+ errorMessage: err instanceof Error ? err.message : String(err),
804
+ });
805
+ }
806
+ finally {
807
+ bgRelease();
808
+ }
809
+ };
810
+ run().catch((err) => {
811
+ console.error(`[subagent] Unhandled background error (${agentId}): ${err instanceof Error ? err.message : String(err)}`);
812
+ const entry = backgroundAgentRegistry.get(agentId);
813
+ if (entry && entry.status === "running")
814
+ entry.status = "failed";
815
+ backgroundAbortControllers.delete(agentId);
816
+ try {
817
+ onBackgroundComplete(agentId, {
818
+ agent: agentName,
819
+ task: taskSummary,
820
+ exitCode: 1,
821
+ output: "",
822
+ stderr: "",
823
+ errorMessage: `Internal error: ${err instanceof Error ? err.message : String(err)}`,
824
+ }, bgSignal.aborted);
825
+ }
826
+ catch (notifyErr) {
827
+ console.error(`[subagent] CRITICAL: Last-resort notification failed for ${agentId}: ${notifyErr instanceof Error ? notifyErr.message : String(notifyErr)}`);
828
+ }
829
+ });
830
+ return agentId;
831
+ };
832
+ // Helper to launch a single background task
833
+ const subagentSessionsBase = getSubagentSessionsDir();
834
+ const launchBackgroundTask = (agentName, task, taskLabel, taskCwd, modelOverride) => {
835
+ const resolvedCwd = taskCwd ?? cwd;
836
+ // Each background agent gets its own session subdirectory
837
+ const sessionId = generateAgentId();
838
+ const sessionDir = join(subagentSessionsBase, sessionId);
839
+ return launchBackgroundLifecycle(agentName, taskLabel, (signal) => executeSingle(agents, agentName === DEFAULT_AGENT ? undefined : agentName, task, resolvedCwd, signal, undefined, modelOverride, getParentProvider(), modelRegistry, sessionDir));
840
+ };
841
+ if (params.task) {
842
+ // Single background task
843
+ const agentName = params.agent || DEFAULT_AGENT;
844
+ const agentId = launchBackgroundTask(agentName, params.task, `${agentName} task`, undefined, params.model);
845
+ return {
846
+ content: [
847
+ {
848
+ type: "text",
849
+ text: `Background agent ${agentId} started (${agentName}). You will be notified when it completes.`,
850
+ },
851
+ ],
852
+ details: { mode: "single", agentCount: 1 },
853
+ endTurn: true,
854
+ };
855
+ }
856
+ else if (params.tasks) {
857
+ // Parallel background tasks — each gets its own agent ID and notifies independently
858
+ const launched = [];
859
+ const skipped = [];
860
+ for (let i = 0; i < params.tasks.length; i++) {
861
+ const item = params.tasks[i];
862
+ const agentName = item.agent || DEFAULT_AGENT;
863
+ const cwdResult = clampCwd(cwd, item.cwd);
864
+ if (!cwdResult.ok) {
865
+ skipped.push({ taskText: item.task, error: cwdResult.error });
866
+ continue;
867
+ }
868
+ const agentId = launchBackgroundTask(agentName, item.task, `${agentName} task ${i + 1}/${params.tasks.length}`, cwdResult.cwd, item.model);
869
+ launched.push({ id: agentId, taskText: item.task });
870
+ }
871
+ const listing = launched.map(({ id, taskText }) => ` ${id}: ${taskText.slice(0, 80)}`).join("\n");
872
+ const skippedListing = skipped
873
+ .map(({ taskText, error }) => ` SKIPPED: ${taskText.slice(0, 60)} — ${error}`)
874
+ .join("\n");
875
+ const parts = [`${launched.length} background agents started:\n${listing}`];
876
+ if (skipped.length > 0) {
877
+ parts.push(`\n${skipped.length} task(s) failed to launch:\n${skippedListing}`);
878
+ }
879
+ if (launched.length > 0) {
880
+ parts.push("\nEach will notify independently when complete.");
881
+ }
882
+ else {
883
+ parts.push("\nNo agents were launched.");
884
+ }
885
+ return {
886
+ content: [
887
+ {
888
+ type: "text",
889
+ text: parts.join("\n"),
890
+ },
891
+ ],
892
+ details: { mode: "parallel", agentCount: launched.length },
893
+ endTurn: launched.length > 0,
894
+ };
895
+ }
896
+ else {
897
+ // Chain mode — sequential, stays as one agent since steps depend on each other
898
+ const agentName = params.chain[0].agent || DEFAULT_AGENT;
899
+ const taskSummary = `${params.chain.length}-step chain`;
900
+ const chainSteps = params.chain;
901
+ const chainSessionDir = join(subagentSessionsBase, `chain-${generateAgentId()}`);
902
+ const agentId = launchBackgroundLifecycle(agentName, taskSummary, async (signal) => {
903
+ const results = await executeChain(agents, chainSteps, cwd, signal, undefined, getParentProvider(), modelRegistry, chainSessionDir);
904
+ const resultText = results
905
+ .map((r, i) => `### Step ${i + 1}\n${formatSingleResult(r)}`)
906
+ .join("\n\n---\n\n");
907
+ const failed = results.filter((r) => r.exitCode !== 0);
908
+ // Per-step session logs are already embedded in resultText via formatSingleResult
909
+ return {
910
+ agent: "chain",
911
+ task: taskSummary,
912
+ exitCode: failed.length > 0 ? 1 : 0,
913
+ output: resultText,
914
+ stderr: "",
915
+ errorMessage: failed.length > 0
916
+ ? `Chain stopped at step ${results.length} of ${chainSteps.length}: ${results[results.length - 1]?.errorMessage}`
917
+ : null,
918
+ };
919
+ });
920
+ return {
921
+ content: [
922
+ {
923
+ type: "text",
924
+ text: `Background chain ${agentId} started (${taskSummary}). You will be notified when it completes.`,
925
+ },
926
+ ],
927
+ details: { mode: "chain", agentCount: chainSteps.length },
928
+ endTurn: true,
929
+ };
930
+ }
931
+ }
932
+ },
933
+ renderCall(args, theme, context) {
934
+ const text = context.lastComponent ?? new Text("", 0, 0);
935
+ text.setText(formatSubagentCall(args, theme, context.argsComplete));
936
+ return text;
937
+ },
938
+ renderResult(result, options, theme, context) {
939
+ const text = context.lastComponent ?? new Text("", 0, 0);
940
+ text.setText(formatSubagentResult(result, options, theme, context.showImages));
941
+ return text;
942
+ },
943
+ };
944
+ }
945
+ export function createSubagentTool(cwd, options) {
946
+ return wrapToolDefinition(createSubagentToolDefinition(cwd, options));
947
+ }
948
+ export const subagentToolDefinition = createSubagentToolDefinition(process.cwd());
949
+ export const subagentTool = createSubagentTool(process.cwd());
950
+ //# sourceMappingURL=subagent.js.map