@greppleai/grip 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1057) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +725 -2
  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 +11 -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 +13 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +32 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +70 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +441 -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 +60 -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/session-picker.d.ts +9 -0
  36. package/dist/cli/session-picker.d.ts.map +1 -0
  37. package/dist/cli/session-picker.js +35 -0
  38. package/dist/cli/session-picker.js.map +1 -0
  39. package/dist/cli.d.ts +3 -0
  40. package/dist/cli.d.ts.map +1 -0
  41. package/dist/cli.js +14 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/config.d.ts +82 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +406 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/core/agent-session.d.ts +970 -0
  48. package/dist/core/agent-session.d.ts.map +1 -0
  49. package/dist/core/agent-session.js +5176 -0
  50. package/dist/core/agent-session.js.map +1 -0
  51. package/dist/core/auth-guidance.d.ts +5 -0
  52. package/dist/core/auth-guidance.d.ts.map +1 -0
  53. package/dist/core/auth-guidance.js +21 -0
  54. package/dist/core/auth-guidance.js.map +1 -0
  55. package/dist/core/auth-storage.d.ts +150 -0
  56. package/dist/core/auth-storage.d.ts.map +1 -0
  57. package/dist/core/auth-storage.js +557 -0
  58. package/dist/core/auth-storage.js.map +1 -0
  59. package/dist/core/bash-executor.d.ts +26 -0
  60. package/dist/core/bash-executor.d.ts.map +1 -0
  61. package/dist/core/bash-executor.js +99 -0
  62. package/dist/core/bash-executor.js.map +1 -0
  63. package/dist/core/compaction/branch-summarization.d.ts +83 -0
  64. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  65. package/dist/core/compaction/branch-summarization.js +220 -0
  66. package/dist/core/compaction/branch-summarization.js.map +1 -0
  67. package/dist/core/compaction/compaction.d.ts +65 -0
  68. package/dist/core/compaction/compaction.d.ts.map +1 -0
  69. package/dist/core/compaction/compaction.js +550 -0
  70. package/dist/core/compaction/compaction.js.map +1 -0
  71. package/dist/core/compaction/compression-detection-ledger.d.ts +34 -0
  72. package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -0
  73. package/dist/core/compaction/compression-detection-ledger.js +52 -0
  74. package/dist/core/compaction/compression-detection-ledger.js.map +1 -0
  75. package/dist/core/compaction/compression-detector.d.ts +71 -0
  76. package/dist/core/compaction/compression-detector.d.ts.map +1 -0
  77. package/dist/core/compaction/compression-detector.js +407 -0
  78. package/dist/core/compaction/compression-detector.js.map +1 -0
  79. package/dist/core/compaction/compression-economics.d.ts +55 -0
  80. package/dist/core/compaction/compression-economics.d.ts.map +1 -0
  81. package/dist/core/compaction/compression-economics.js +151 -0
  82. package/dist/core/compaction/compression-economics.js.map +1 -0
  83. package/dist/core/compaction/utils.d.ts +28 -0
  84. package/dist/core/compaction/utils.d.ts.map +1 -0
  85. package/dist/core/compaction/utils.js +165 -0
  86. package/dist/core/compaction/utils.js.map +1 -0
  87. package/dist/core/defaults.d.ts +3 -0
  88. package/dist/core/defaults.d.ts.map +1 -0
  89. package/dist/core/defaults.js +2 -0
  90. package/dist/core/defaults.js.map +1 -0
  91. package/dist/core/diagnostics.d.ts +18 -0
  92. package/dist/core/diagnostics.d.ts.map +1 -0
  93. package/dist/core/diagnostics.js +2 -0
  94. package/dist/core/diagnostics.js.map +1 -0
  95. package/dist/core/event-bus.d.ts +9 -0
  96. package/dist/core/event-bus.d.ts.map +1 -0
  97. package/dist/core/event-bus.js +25 -0
  98. package/dist/core/event-bus.js.map +1 -0
  99. package/dist/core/exec.d.ts +29 -0
  100. package/dist/core/exec.d.ts.map +1 -0
  101. package/dist/core/exec.js +75 -0
  102. package/dist/core/exec.js.map +1 -0
  103. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  104. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  105. package/dist/core/export-html/ansi-to-html.js +245 -0
  106. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  107. package/dist/core/export-html/index.d.ts +21 -0
  108. package/dist/core/export-html/index.d.ts.map +1 -0
  109. package/dist/core/export-html/index.js +230 -0
  110. package/dist/core/export-html/index.js.map +1 -0
  111. package/dist/core/export-html/template.css +1066 -0
  112. package/dist/core/export-html/template.html +55 -0
  113. package/dist/core/export-html/template.js +1864 -0
  114. package/dist/core/export-html/tool-renderer.d.ts +32 -0
  115. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  116. package/dist/core/export-html/tool-renderer.js +108 -0
  117. package/dist/core/export-html/tool-renderer.js.map +1 -0
  118. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  119. package/dist/core/export-html/vendor/marked.min.js +78 -0
  120. package/dist/core/extensions/loader.d.ts +24 -0
  121. package/dist/core/extensions/loader.d.ts.map +1 -0
  122. package/dist/core/extensions/loader.js +613 -0
  123. package/dist/core/extensions/loader.js.map +1 -0
  124. package/dist/core/extensions/runner.d.ts +160 -0
  125. package/dist/core/extensions/runner.d.ts.map +1 -0
  126. package/dist/core/extensions/runner.js +962 -0
  127. package/dist/core/extensions/runner.js.map +1 -0
  128. package/dist/core/extensions/types.d.ts +1311 -0
  129. package/dist/core/extensions/types.d.ts.map +1 -0
  130. package/dist/core/extensions/types.js +51 -0
  131. package/dist/core/extensions/types.js.map +1 -0
  132. package/dist/core/extensions/wrapper.d.ts +20 -0
  133. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  134. package/dist/core/extensions/wrapper.js +22 -0
  135. package/dist/core/extensions/wrapper.js.map +1 -0
  136. package/dist/core/footer-data-provider.d.ts +52 -0
  137. package/dist/core/footer-data-provider.d.ts.map +1 -0
  138. package/dist/core/footer-data-provider.js +318 -0
  139. package/dist/core/footer-data-provider.js.map +1 -0
  140. package/dist/core/grip-agent.d.ts +240 -0
  141. package/dist/core/grip-agent.d.ts.map +1 -0
  142. package/dist/core/grip-agent.js +1243 -0
  143. package/dist/core/grip-agent.js.map +1 -0
  144. package/dist/core/grip-manifest.d.ts +9 -0
  145. package/dist/core/grip-manifest.d.ts.map +1 -0
  146. package/dist/core/grip-manifest.js +25 -0
  147. package/dist/core/grip-manifest.js.map +1 -0
  148. package/dist/core/hooks/aggregate.d.ts +5 -0
  149. package/dist/core/hooks/aggregate.d.ts.map +1 -0
  150. package/dist/core/hooks/aggregate.js +226 -0
  151. package/dist/core/hooks/aggregate.js.map +1 -0
  152. package/dist/core/hooks/config.d.ts +14 -0
  153. package/dist/core/hooks/config.d.ts.map +1 -0
  154. package/dist/core/hooks/config.js +372 -0
  155. package/dist/core/hooks/config.js.map +1 -0
  156. package/dist/core/hooks/executor.d.ts +12 -0
  157. package/dist/core/hooks/executor.d.ts.map +1 -0
  158. package/dist/core/hooks/executor.js +708 -0
  159. package/dist/core/hooks/executor.js.map +1 -0
  160. package/dist/core/hooks/index.d.ts +9 -0
  161. package/dist/core/hooks/index.d.ts.map +1 -0
  162. package/dist/core/hooks/index.js +14 -0
  163. package/dist/core/hooks/index.js.map +1 -0
  164. package/dist/core/hooks/matcher.d.ts +10 -0
  165. package/dist/core/hooks/matcher.d.ts.map +1 -0
  166. package/dist/core/hooks/matcher.js +70 -0
  167. package/dist/core/hooks/matcher.js.map +1 -0
  168. package/dist/core/hooks/trust-store.d.ts +38 -0
  169. package/dist/core/hooks/trust-store.d.ts.map +1 -0
  170. package/dist/core/hooks/trust-store.js +167 -0
  171. package/dist/core/hooks/trust-store.js.map +1 -0
  172. package/dist/core/hooks/types.d.ts +234 -0
  173. package/dist/core/hooks/types.d.ts.map +1 -0
  174. package/dist/core/hooks/types.js +52 -0
  175. package/dist/core/hooks/types.js.map +1 -0
  176. package/dist/core/http-dispatcher.d.ts +21 -0
  177. package/dist/core/http-dispatcher.d.ts.map +1 -0
  178. package/dist/core/http-dispatcher.js +82 -0
  179. package/dist/core/http-dispatcher.js.map +1 -0
  180. package/dist/core/instruction-resource-loader.d.ts +81 -0
  181. package/dist/core/instruction-resource-loader.d.ts.map +1 -0
  182. package/dist/core/instruction-resource-loader.js +574 -0
  183. package/dist/core/instruction-resource-loader.js.map +1 -0
  184. package/dist/core/keybindings.d.ts +399 -0
  185. package/dist/core/keybindings.d.ts.map +1 -0
  186. package/dist/core/keybindings.js +299 -0
  187. package/dist/core/keybindings.js.map +1 -0
  188. package/dist/core/lsp/abort.d.ts +3 -0
  189. package/dist/core/lsp/abort.d.ts.map +1 -0
  190. package/dist/core/lsp/abort.js +28 -0
  191. package/dist/core/lsp/abort.js.map +1 -0
  192. package/dist/core/lsp/client.d.ts +108 -0
  193. package/dist/core/lsp/client.d.ts.map +1 -0
  194. package/dist/core/lsp/client.js +586 -0
  195. package/dist/core/lsp/client.js.map +1 -0
  196. package/dist/core/lsp/config-loader.d.ts +44 -0
  197. package/dist/core/lsp/config-loader.d.ts.map +1 -0
  198. package/dist/core/lsp/config-loader.js +223 -0
  199. package/dist/core/lsp/config-loader.js.map +1 -0
  200. package/dist/core/lsp/config.d.ts +134 -0
  201. package/dist/core/lsp/config.d.ts.map +1 -0
  202. package/dist/core/lsp/config.js +682 -0
  203. package/dist/core/lsp/config.js.map +1 -0
  204. package/dist/core/lsp/diagnostics.d.ts +18 -0
  205. package/dist/core/lsp/diagnostics.d.ts.map +1 -0
  206. package/dist/core/lsp/diagnostics.js +311 -0
  207. package/dist/core/lsp/diagnostics.js.map +1 -0
  208. package/dist/core/lsp/file-sync.d.ts +58 -0
  209. package/dist/core/lsp/file-sync.d.ts.map +1 -0
  210. package/dist/core/lsp/file-sync.js +432 -0
  211. package/dist/core/lsp/file-sync.js.map +1 -0
  212. package/dist/core/lsp/integration.d.ts +62 -0
  213. package/dist/core/lsp/integration.d.ts.map +1 -0
  214. package/dist/core/lsp/integration.js +145 -0
  215. package/dist/core/lsp/integration.js.map +1 -0
  216. package/dist/core/lsp/language-map.d.ts +54 -0
  217. package/dist/core/lsp/language-map.d.ts.map +1 -0
  218. package/dist/core/lsp/language-map.js +300 -0
  219. package/dist/core/lsp/language-map.js.map +1 -0
  220. package/dist/core/lsp/manager.d.ts +120 -0
  221. package/dist/core/lsp/manager.d.ts.map +1 -0
  222. package/dist/core/lsp/manager.js +636 -0
  223. package/dist/core/lsp/manager.js.map +1 -0
  224. package/dist/core/lsp/navigation.d.ts +32 -0
  225. package/dist/core/lsp/navigation.d.ts.map +1 -0
  226. package/dist/core/lsp/navigation.js +327 -0
  227. package/dist/core/lsp/navigation.js.map +1 -0
  228. package/dist/core/lsp/portable-path.d.ts +18 -0
  229. package/dist/core/lsp/portable-path.d.ts.map +1 -0
  230. package/dist/core/lsp/portable-path.js +83 -0
  231. package/dist/core/lsp/portable-path.js.map +1 -0
  232. package/dist/core/lsp/refactor.d.ts +32 -0
  233. package/dist/core/lsp/refactor.d.ts.map +1 -0
  234. package/dist/core/lsp/refactor.js +519 -0
  235. package/dist/core/lsp/refactor.js.map +1 -0
  236. package/dist/core/lsp/transport.d.ts +39 -0
  237. package/dist/core/lsp/transport.d.ts.map +1 -0
  238. package/dist/core/lsp/transport.js +261 -0
  239. package/dist/core/lsp/transport.js.map +1 -0
  240. package/dist/core/messages.d.ts +34 -0
  241. package/dist/core/messages.d.ts.map +1 -0
  242. package/dist/core/messages.js +140 -0
  243. package/dist/core/messages.js.map +1 -0
  244. package/dist/core/model-registry.d.ts +148 -0
  245. package/dist/core/model-registry.d.ts.map +1 -0
  246. package/dist/core/model-registry.js +812 -0
  247. package/dist/core/model-registry.js.map +1 -0
  248. package/dist/core/model-resolver.d.ts +115 -0
  249. package/dist/core/model-resolver.d.ts.map +1 -0
  250. package/dist/core/model-resolver.js +498 -0
  251. package/dist/core/model-resolver.js.map +1 -0
  252. package/dist/core/output-guard.d.ts +7 -0
  253. package/dist/core/output-guard.d.ts.map +1 -0
  254. package/dist/core/output-guard.js +89 -0
  255. package/dist/core/output-guard.js.map +1 -0
  256. package/dist/core/package-manager.d.ts +209 -0
  257. package/dist/core/package-manager.d.ts.map +1 -0
  258. package/dist/core/package-manager.js +2341 -0
  259. package/dist/core/package-manager.js.map +1 -0
  260. package/dist/core/prompt-templates.d.ts +57 -0
  261. package/dist/core/prompt-templates.d.ts.map +1 -0
  262. package/dist/core/prompt-templates.js +353 -0
  263. package/dist/core/prompt-templates.js.map +1 -0
  264. package/dist/core/provider-display-names.d.ts +2 -0
  265. package/dist/core/provider-display-names.d.ts.map +1 -0
  266. package/dist/core/provider-display-names.js +33 -0
  267. package/dist/core/provider-display-names.js.map +1 -0
  268. package/dist/core/remote-workspace-protocol/contract.d.ts +456 -0
  269. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -0
  270. package/dist/core/remote-workspace-protocol/contract.js +809 -0
  271. package/dist/core/remote-workspace-protocol/contract.js.map +1 -0
  272. package/dist/core/remote-workspace-protocol/session.d.ts +247 -0
  273. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -0
  274. package/dist/core/remote-workspace-protocol/session.js +1839 -0
  275. package/dist/core/remote-workspace-protocol/session.js.map +1 -0
  276. package/dist/core/resolve-config-value.d.ts +32 -0
  277. package/dist/core/resolve-config-value.d.ts.map +1 -0
  278. package/dist/core/resolve-config-value.js +257 -0
  279. package/dist/core/resolve-config-value.js.map +1 -0
  280. package/dist/core/resource-loader.d.ts +200 -0
  281. package/dist/core/resource-loader.d.ts.map +1 -0
  282. package/dist/core/resource-loader.js +1209 -0
  283. package/dist/core/resource-loader.js.map +1 -0
  284. package/dist/core/rules.d.ts +40 -0
  285. package/dist/core/rules.d.ts.map +1 -0
  286. package/dist/core/rules.js +57 -0
  287. package/dist/core/rules.js.map +1 -0
  288. package/dist/core/sandbox/command.d.ts +27 -0
  289. package/dist/core/sandbox/command.d.ts.map +1 -0
  290. package/dist/core/sandbox/command.js +124 -0
  291. package/dist/core/sandbox/command.js.map +1 -0
  292. package/dist/core/sandbox/docker.d.ts +169 -0
  293. package/dist/core/sandbox/docker.d.ts.map +1 -0
  294. package/dist/core/sandbox/docker.js +633 -0
  295. package/dist/core/sandbox/docker.js.map +1 -0
  296. package/dist/core/sandbox/lima.d.ts +38 -0
  297. package/dist/core/sandbox/lima.d.ts.map +1 -0
  298. package/dist/core/sandbox/lima.js +324 -0
  299. package/dist/core/sandbox/lima.js.map +1 -0
  300. package/dist/core/session/constants.d.ts +2 -0
  301. package/dist/core/session/constants.d.ts.map +1 -0
  302. package/dist/core/session/constants.js +2 -0
  303. package/dist/core/session/constants.js.map +1 -0
  304. package/dist/core/session/context-metadata.d.ts +5 -0
  305. package/dist/core/session/context-metadata.d.ts.map +1 -0
  306. package/dist/core/session/context-metadata.js +55 -0
  307. package/dist/core/session/context-metadata.js.map +1 -0
  308. package/dist/core/session/context.d.ts +14 -0
  309. package/dist/core/session/context.d.ts.map +1 -0
  310. package/dist/core/session/context.js +117 -0
  311. package/dist/core/session/context.js.map +1 -0
  312. package/dist/core/session/ids.d.ts +9 -0
  313. package/dist/core/session/ids.d.ts.map +1 -0
  314. package/dist/core/session/ids.js +21 -0
  315. package/dist/core/session/ids.js.map +1 -0
  316. package/dist/core/session/in-memory-session-manager.d.ts +17 -0
  317. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -0
  318. package/dist/core/session/in-memory-session-manager.js +40 -0
  319. package/dist/core/session/in-memory-session-manager.js.map +1 -0
  320. package/dist/core/session/in-memory-session.d.ts +7 -0
  321. package/dist/core/session/in-memory-session.d.ts.map +1 -0
  322. package/dist/core/session/in-memory-session.js +11 -0
  323. package/dist/core/session/in-memory-session.js.map +1 -0
  324. package/dist/core/session/jsonl-errors.d.ts +36 -0
  325. package/dist/core/session/jsonl-errors.d.ts.map +1 -0
  326. package/dist/core/session/jsonl-errors.js +49 -0
  327. package/dist/core/session/jsonl-errors.js.map +1 -0
  328. package/dist/core/session/jsonl-helpers.d.ts +20 -0
  329. package/dist/core/session/jsonl-helpers.d.ts.map +1 -0
  330. package/dist/core/session/jsonl-helpers.js +21 -0
  331. package/dist/core/session/jsonl-helpers.js.map +1 -0
  332. package/dist/core/session/local-session-manager.d.ts +30 -0
  333. package/dist/core/session/local-session-manager.d.ts.map +1 -0
  334. package/dist/core/session/local-session-manager.js +205 -0
  335. package/dist/core/session/local-session-manager.js.map +1 -0
  336. package/dist/core/session/local-session.d.ts +9 -0
  337. package/dist/core/session/local-session.d.ts.map +1 -0
  338. package/dist/core/session/local-session.js +15 -0
  339. package/dist/core/session/local-session.js.map +1 -0
  340. package/dist/core/session/migrations.d.ts +11 -0
  341. package/dist/core/session/migrations.d.ts.map +1 -0
  342. package/dist/core/session/migrations.js +78 -0
  343. package/dist/core/session/migrations.js.map +1 -0
  344. package/dist/core/session/remote-session-client.d.ts +83 -0
  345. package/dist/core/session/remote-session-client.d.ts.map +1 -0
  346. package/dist/core/session/remote-session-client.js +224 -0
  347. package/dist/core/session/remote-session-client.js.map +1 -0
  348. package/dist/core/session/remote-session-manager.d.ts +32 -0
  349. package/dist/core/session/remote-session-manager.d.ts.map +1 -0
  350. package/dist/core/session/remote-session-manager.js +124 -0
  351. package/dist/core/session/remote-session-manager.js.map +1 -0
  352. package/dist/core/session/remote-session.d.ts +20 -0
  353. package/dist/core/session/remote-session.d.ts.map +1 -0
  354. package/dist/core/session/remote-session.js +33 -0
  355. package/dist/core/session/remote-session.js.map +1 -0
  356. package/dist/core/session/session-manager.d.ts +18 -0
  357. package/dist/core/session/session-manager.d.ts.map +1 -0
  358. package/dist/core/session/session-manager.js +2 -0
  359. package/dist/core/session/session-manager.js.map +1 -0
  360. package/dist/core/session/session.d.ts +140 -0
  361. package/dist/core/session/session.d.ts.map +1 -0
  362. package/dist/core/session/session.js +461 -0
  363. package/dist/core/session/session.js.map +1 -0
  364. package/dist/core/session/stores/in-memory-session-store.d.ts +39 -0
  365. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -0
  366. package/dist/core/session/stores/in-memory-session-store.js +168 -0
  367. package/dist/core/session/stores/in-memory-session-store.js.map +1 -0
  368. package/dist/core/session/stores/jsonl-session-store.d.ts +97 -0
  369. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -0
  370. package/dist/core/session/stores/jsonl-session-store.js +1140 -0
  371. package/dist/core/session/stores/jsonl-session-store.js.map +1 -0
  372. package/dist/core/session/stores/remote-session-store.d.ts +44 -0
  373. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -0
  374. package/dist/core/session/stores/remote-session-store.js +159 -0
  375. package/dist/core/session/stores/remote-session-store.js.map +1 -0
  376. package/dist/core/session/stores/session-store.d.ts +42 -0
  377. package/dist/core/session/stores/session-store.d.ts.map +1 -0
  378. package/dist/core/session/stores/session-store.js +2 -0
  379. package/dist/core/session/stores/session-store.js.map +1 -0
  380. package/dist/core/session/types.d.ts +141 -0
  381. package/dist/core/session/types.d.ts.map +1 -0
  382. package/dist/core/session/types.js +2 -0
  383. package/dist/core/session/types.js.map +1 -0
  384. package/dist/core/session/usage-ledger.d.ts +18 -0
  385. package/dist/core/session/usage-ledger.d.ts.map +1 -0
  386. package/dist/core/session/usage-ledger.js +68 -0
  387. package/dist/core/session/usage-ledger.js.map +1 -0
  388. package/dist/core/session-cwd.d.ts +19 -0
  389. package/dist/core/session-cwd.d.ts.map +1 -0
  390. package/dist/core/session-cwd.js +38 -0
  391. package/dist/core/session-cwd.js.map +1 -0
  392. package/dist/core/settings-manager.d.ts +318 -0
  393. package/dist/core/settings-manager.d.ts.map +1 -0
  394. package/dist/core/settings-manager.js +991 -0
  395. package/dist/core/settings-manager.js.map +1 -0
  396. package/dist/core/skills.d.ts +40 -0
  397. package/dist/core/skills.d.ts.map +1 -0
  398. package/dist/core/skills.js +57 -0
  399. package/dist/core/skills.js.map +1 -0
  400. package/dist/core/slash-commands.d.ts +15 -0
  401. package/dist/core/slash-commands.d.ts.map +1 -0
  402. package/dist/core/slash-commands.js +36 -0
  403. package/dist/core/slash-commands.js.map +1 -0
  404. package/dist/core/source-info.d.ts +26 -0
  405. package/dist/core/source-info.d.ts.map +1 -0
  406. package/dist/core/source-info.js +27 -0
  407. package/dist/core/source-info.js.map +1 -0
  408. package/dist/core/system-prompt.d.ts +32 -0
  409. package/dist/core/system-prompt.d.ts.map +1 -0
  410. package/dist/core/system-prompt.js +131 -0
  411. package/dist/core/system-prompt.js.map +1 -0
  412. package/dist/core/telemetry.d.ts +3 -0
  413. package/dist/core/telemetry.d.ts.map +1 -0
  414. package/dist/core/telemetry.js +9 -0
  415. package/dist/core/telemetry.js.map +1 -0
  416. package/dist/core/timings.d.ts +10 -0
  417. package/dist/core/timings.d.ts.map +1 -0
  418. package/dist/core/timings.js +41 -0
  419. package/dist/core/timings.js.map +1 -0
  420. package/dist/core/tools/bash.d.ts +51 -0
  421. package/dist/core/tools/bash.d.ts.map +1 -0
  422. package/dist/core/tools/bash.js +310 -0
  423. package/dist/core/tools/bash.js.map +1 -0
  424. package/dist/core/tools/compress-context.d.ts +27 -0
  425. package/dist/core/tools/compress-context.d.ts.map +1 -0
  426. package/dist/core/tools/compress-context.js +142 -0
  427. package/dist/core/tools/compress-context.js.map +1 -0
  428. package/dist/core/tools/edit-diff.d.ts +82 -0
  429. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  430. package/dist/core/tools/edit-diff.js +327 -0
  431. package/dist/core/tools/edit-diff.js.map +1 -0
  432. package/dist/core/tools/edit.d.ts +50 -0
  433. package/dist/core/tools/edit.d.ts.map +1 -0
  434. package/dist/core/tools/edit.js +324 -0
  435. package/dist/core/tools/edit.js.map +1 -0
  436. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  437. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  438. package/dist/core/tools/file-mutation-queue.js +60 -0
  439. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  440. package/dist/core/tools/find.d.ts +22 -0
  441. package/dist/core/tools/find.d.ts.map +1 -0
  442. package/dist/core/tools/find.js +268 -0
  443. package/dist/core/tools/find.js.map +1 -0
  444. package/dist/core/tools/grep.d.ts +27 -0
  445. package/dist/core/tools/grep.d.ts.map +1 -0
  446. package/dist/core/tools/grep.js +332 -0
  447. package/dist/core/tools/grep.js.map +1 -0
  448. package/dist/core/tools/hash-store.d.ts +12 -0
  449. package/dist/core/tools/hash-store.d.ts.map +1 -0
  450. package/dist/core/tools/hash-store.js +48 -0
  451. package/dist/core/tools/hash-store.js.map +1 -0
  452. package/dist/core/tools/hashline/apply.d.ts +40 -0
  453. package/dist/core/tools/hashline/apply.d.ts.map +1 -0
  454. package/dist/core/tools/hashline/apply.js +261 -0
  455. package/dist/core/tools/hashline/apply.js.map +1 -0
  456. package/dist/core/tools/hashline/hash.d.ts +56 -0
  457. package/dist/core/tools/hashline/hash.d.ts.map +1 -0
  458. package/dist/core/tools/hashline/hash.js +196 -0
  459. package/dist/core/tools/hashline/hash.js.map +1 -0
  460. package/dist/core/tools/hashline/parse.d.ts +8 -0
  461. package/dist/core/tools/hashline/parse.d.ts.map +1 -0
  462. package/dist/core/tools/hashline/parse.js +41 -0
  463. package/dist/core/tools/hashline/parse.js.map +1 -0
  464. package/dist/core/tools/hashline/resolve.d.ts +51 -0
  465. package/dist/core/tools/hashline/resolve.d.ts.map +1 -0
  466. package/dist/core/tools/hashline/resolve.js +187 -0
  467. package/dist/core/tools/hashline/resolve.js.map +1 -0
  468. package/dist/core/tools/hashline-utils.d.ts +6 -0
  469. package/dist/core/tools/hashline-utils.d.ts.map +1 -0
  470. package/dist/core/tools/hashline-utils.js +23 -0
  471. package/dist/core/tools/hashline-utils.js.map +1 -0
  472. package/dist/core/tools/index.d.ts +36 -0
  473. package/dist/core/tools/index.d.ts.map +1 -0
  474. package/dist/core/tools/index.js +141 -0
  475. package/dist/core/tools/index.js.map +1 -0
  476. package/dist/core/tools/ls.d.ts +21 -0
  477. package/dist/core/tools/ls.d.ts.map +1 -0
  478. package/dist/core/tools/ls.js +156 -0
  479. package/dist/core/tools/ls.js.map +1 -0
  480. package/dist/core/tools/operations.d.ts +201 -0
  481. package/dist/core/tools/operations.d.ts.map +1 -0
  482. package/dist/core/tools/operations.js +697 -0
  483. package/dist/core/tools/operations.js.map +1 -0
  484. package/dist/core/tools/output-accumulator.d.ts +54 -0
  485. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  486. package/dist/core/tools/output-accumulator.js +184 -0
  487. package/dist/core/tools/output-accumulator.js.map +1 -0
  488. package/dist/core/tools/path-utils.d.ts +9 -0
  489. package/dist/core/tools/path-utils.d.ts.map +1 -0
  490. package/dist/core/tools/path-utils.js +99 -0
  491. package/dist/core/tools/path-utils.js.map +1 -0
  492. package/dist/core/tools/read.d.ts +32 -0
  493. package/dist/core/tools/read.d.ts.map +1 -0
  494. package/dist/core/tools/read.js +318 -0
  495. package/dist/core/tools/read.js.map +1 -0
  496. package/dist/core/tools/render-utils.d.ts +33 -0
  497. package/dist/core/tools/render-utils.d.ts.map +1 -0
  498. package/dist/core/tools/render-utils.js +61 -0
  499. package/dist/core/tools/render-utils.js.map +1 -0
  500. package/dist/core/tools/replace-diff.d.ts +16 -0
  501. package/dist/core/tools/replace-diff.d.ts.map +1 -0
  502. package/dist/core/tools/replace-diff.js +117 -0
  503. package/dist/core/tools/replace-diff.js.map +1 -0
  504. package/dist/core/tools/replace-normalize.d.ts +2 -0
  505. package/dist/core/tools/replace-normalize.d.ts.map +1 -0
  506. package/dist/core/tools/replace-normalize.js +73 -0
  507. package/dist/core/tools/replace-normalize.js.map +1 -0
  508. package/dist/core/tools/replace-render.d.ts +51 -0
  509. package/dist/core/tools/replace-render.d.ts.map +1 -0
  510. package/dist/core/tools/replace-render.js +162 -0
  511. package/dist/core/tools/replace-render.js.map +1 -0
  512. package/dist/core/tools/runtime.d.ts +2 -0
  513. package/dist/core/tools/runtime.d.ts.map +1 -0
  514. package/dist/core/tools/runtime.js +6 -0
  515. package/dist/core/tools/runtime.js.map +1 -0
  516. package/dist/core/tools/session-history.d.ts +55 -0
  517. package/dist/core/tools/session-history.d.ts.map +1 -0
  518. package/dist/core/tools/session-history.js +649 -0
  519. package/dist/core/tools/session-history.js.map +1 -0
  520. package/dist/core/tools/subagent-agents.d.ts +29 -0
  521. package/dist/core/tools/subagent-agents.d.ts.map +1 -0
  522. package/dist/core/tools/subagent-agents.js +223 -0
  523. package/dist/core/tools/subagent-agents.js.map +1 -0
  524. package/dist/core/tools/subagent.d.ts +185 -0
  525. package/dist/core/tools/subagent.d.ts.map +1 -0
  526. package/dist/core/tools/subagent.js +1309 -0
  527. package/dist/core/tools/subagent.js.map +1 -0
  528. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  529. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  530. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  531. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  532. package/dist/core/tools/truncate.d.ts +39 -0
  533. package/dist/core/tools/truncate.d.ts.map +1 -0
  534. package/dist/core/tools/truncate.js +215 -0
  535. package/dist/core/tools/truncate.js.map +1 -0
  536. package/dist/core/tools/websearch.d.ts +33 -0
  537. package/dist/core/tools/websearch.d.ts.map +1 -0
  538. package/dist/core/tools/websearch.js +341 -0
  539. package/dist/core/tools/websearch.js.map +1 -0
  540. package/dist/core/tools/workspace-tool-host.d.ts +102 -0
  541. package/dist/core/tools/workspace-tool-host.d.ts.map +1 -0
  542. package/dist/core/tools/workspace-tool-host.js +348 -0
  543. package/dist/core/tools/workspace-tool-host.js.map +1 -0
  544. package/dist/core/tools/write.d.ts +16 -0
  545. package/dist/core/tools/write.d.ts.map +1 -0
  546. package/dist/core/tools/write.js +204 -0
  547. package/dist/core/tools/write.js.map +1 -0
  548. package/dist/core/workspace-identity.d.ts +7 -0
  549. package/dist/core/workspace-identity.d.ts.map +1 -0
  550. package/dist/core/workspace-identity.js +2 -0
  551. package/dist/core/workspace-identity.js.map +1 -0
  552. package/dist/daemon/command.d.ts +6 -0
  553. package/dist/daemon/command.d.ts.map +1 -0
  554. package/dist/daemon/command.js +58 -0
  555. package/dist/daemon/command.js.map +1 -0
  556. package/dist/daemon/config.d.ts +43 -0
  557. package/dist/daemon/config.d.ts.map +1 -0
  558. package/dist/daemon/config.js +304 -0
  559. package/dist/daemon/config.js.map +1 -0
  560. package/dist/daemon/help.d.ts +2 -0
  561. package/dist/daemon/help.d.ts.map +1 -0
  562. package/dist/daemon/help.js +42 -0
  563. package/dist/daemon/help.js.map +1 -0
  564. package/dist/daemon/lsp-config.d.ts +4 -0
  565. package/dist/daemon/lsp-config.d.ts.map +1 -0
  566. package/dist/daemon/lsp-config.js +155 -0
  567. package/dist/daemon/lsp-config.js.map +1 -0
  568. package/dist/daemon/security.d.ts +19 -0
  569. package/dist/daemon/security.d.ts.map +1 -0
  570. package/dist/daemon/security.js +175 -0
  571. package/dist/daemon/security.js.map +1 -0
  572. package/dist/daemon/server.d.ts +20 -0
  573. package/dist/daemon/server.d.ts.map +1 -0
  574. package/dist/daemon/server.js +400 -0
  575. package/dist/daemon/server.js.map +1 -0
  576. package/dist/daemon/workspace-runtime.d.ts +46 -0
  577. package/dist/daemon/workspace-runtime.d.ts.map +1 -0
  578. package/dist/daemon/workspace-runtime.js +673 -0
  579. package/dist/daemon/workspace-runtime.js.map +1 -0
  580. package/dist/index.d.ts +109 -0
  581. package/dist/index.d.ts.map +1 -0
  582. package/dist/index.js +107 -0
  583. package/dist/index.js.map +1 -0
  584. package/dist/main.d.ts +39 -0
  585. package/dist/main.d.ts.map +1 -0
  586. package/dist/main.js +763 -0
  587. package/dist/main.js.map +1 -0
  588. package/dist/migrations.d.ts +35 -0
  589. package/dist/migrations.d.ts.map +1 -0
  590. package/dist/migrations.js +412 -0
  591. package/dist/migrations.js.map +1 -0
  592. package/dist/modes/interactive/components/assistant-message.d.ts +29 -0
  593. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  594. package/dist/modes/interactive/components/assistant-message.js +149 -0
  595. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  596. package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
  597. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  598. package/dist/modes/interactive/components/bash-execution.js +173 -0
  599. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  600. package/dist/modes/interactive/components/bordered-loader.d.ts +18 -0
  601. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  602. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  603. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  604. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  605. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  606. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  607. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  608. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  609. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  610. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  611. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  612. package/dist/modes/interactive/components/config-selector.d.ts +74 -0
  613. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  614. package/dist/modes/interactive/components/config-selector.js +514 -0
  615. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  616. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  617. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  618. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  619. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  620. package/dist/modes/interactive/components/custom-editor.d.ts +25 -0
  621. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  622. package/dist/modes/interactive/components/custom-editor.js +85 -0
  623. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  624. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  625. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  626. package/dist/modes/interactive/components/custom-message.js +80 -0
  627. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  628. package/dist/modes/interactive/components/diff.d.ts +12 -0
  629. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  630. package/dist/modes/interactive/components/diff.js +118 -0
  631. package/dist/modes/interactive/components/diff.js.map +1 -0
  632. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  633. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  634. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  635. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  636. package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  637. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  638. package/dist/modes/interactive/components/extension-editor.js +128 -0
  639. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  640. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  641. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  642. package/dist/modes/interactive/components/extension-input.js +61 -0
  643. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  644. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  645. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  646. package/dist/modes/interactive/components/extension-selector.js +83 -0
  647. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  648. package/dist/modes/interactive/components/footer.d.ts +36 -0
  649. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  650. package/dist/modes/interactive/components/footer.js +227 -0
  651. package/dist/modes/interactive/components/footer.js.map +1 -0
  652. package/dist/modes/interactive/components/hook-execution.d.ts +19 -0
  653. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -0
  654. package/dist/modes/interactive/components/hook-execution.js +184 -0
  655. package/dist/modes/interactive/components/hook-execution.js.map +1 -0
  656. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  657. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  658. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  659. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  660. package/dist/modes/interactive/components/login-dialog.d.ts +55 -0
  661. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  662. package/dist/modes/interactive/components/login-dialog.js +176 -0
  663. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  664. package/dist/modes/interactive/components/markdown-transform.d.ts +4 -0
  665. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  666. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  667. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  668. package/dist/modes/interactive/components/mermaid.d.ts +14 -0
  669. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  670. package/dist/modes/interactive/components/mermaid.js +228 -0
  671. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  672. package/dist/modes/interactive/components/model-selector.d.ts +52 -0
  673. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  674. package/dist/modes/interactive/components/model-selector.js +296 -0
  675. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  676. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  677. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  678. package/dist/modes/interactive/components/oauth-selector.js +165 -0
  679. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  680. package/dist/modes/interactive/components/scoped-models-selector.d.ts +50 -0
  681. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  682. package/dist/modes/interactive/components/scoped-models-selector.js +300 -0
  683. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  684. package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
  685. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  686. package/dist/modes/interactive/components/session-selector-search.js +144 -0
  687. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  688. package/dist/modes/interactive/components/session-selector.d.ts +108 -0
  689. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  690. package/dist/modes/interactive/components/session-selector.js +835 -0
  691. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  692. package/dist/modes/interactive/components/settings-selector.d.ts +81 -0
  693. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  694. package/dist/modes/interactive/components/settings-selector.js +455 -0
  695. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  696. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  697. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  698. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  699. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  700. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  701. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  702. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  703. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  704. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  705. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  706. package/dist/modes/interactive/components/theme-selector.js +50 -0
  707. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  708. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  709. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  710. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  711. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  712. package/dist/modes/interactive/components/tool-execution.d.ts +67 -0
  713. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  714. package/dist/modes/interactive/components/tool-execution.js +306 -0
  715. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  716. package/dist/modes/interactive/components/tree-selector.d.ts +127 -0
  717. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  718. package/dist/modes/interactive/components/tree-selector.js +1098 -0
  719. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  720. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  721. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  722. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  723. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  724. package/dist/modes/interactive/components/user-message.d.ts +16 -0
  725. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  726. package/dist/modes/interactive/components/user-message.js +49 -0
  727. package/dist/modes/interactive/components/user-message.js.map +1 -0
  728. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  729. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  730. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  731. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  732. package/dist/modes/interactive/interactive-mode.d.ts +557 -0
  733. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  734. package/dist/modes/interactive/interactive-mode.js +5859 -0
  735. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  736. package/dist/modes/interactive/theme/dark.json +86 -0
  737. package/dist/modes/interactive/theme/light.json +85 -0
  738. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  739. package/dist/modes/interactive/theme/theme.d.ts +106 -0
  740. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  741. package/dist/modes/interactive/theme/theme.js +1030 -0
  742. package/dist/modes/interactive/theme/theme.js.map +1 -0
  743. package/dist/modes/json-event.d.ts +28 -0
  744. package/dist/modes/json-event.d.ts.map +1 -0
  745. package/dist/modes/json-event.js +12 -0
  746. package/dist/modes/json-event.js.map +1 -0
  747. package/dist/modes/print-mode.d.ts +29 -0
  748. package/dist/modes/print-mode.d.ts.map +1 -0
  749. package/dist/modes/print-mode.js +142 -0
  750. package/dist/modes/print-mode.js.map +1 -0
  751. package/dist/modes/rpc/jsonl.d.ts +17 -0
  752. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  753. package/dist/modes/rpc/jsonl.js +49 -0
  754. package/dist/modes/rpc/jsonl.js.map +1 -0
  755. package/dist/modes/rpc/rpc-client.d.ts +321 -0
  756. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  757. package/dist/modes/rpc/rpc-client.js +755 -0
  758. package/dist/modes/rpc/rpc-client.js.map +1 -0
  759. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  760. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  761. package/dist/modes/rpc/rpc-mode.js +963 -0
  762. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  763. package/dist/modes/rpc/rpc-types.d.ts +652 -0
  764. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  765. package/dist/modes/rpc/rpc-types.js +8 -0
  766. package/dist/modes/rpc/rpc-types.js.map +1 -0
  767. package/dist/package-manager-cli.d.ts +4 -0
  768. package/dist/package-manager-cli.d.ts.map +1 -0
  769. package/dist/package-manager-cli.js +488 -0
  770. package/dist/package-manager-cli.js.map +1 -0
  771. package/dist/utils/ansi.d.ts +2 -0
  772. package/dist/utils/ansi.d.ts.map +1 -0
  773. package/dist/utils/ansi.js +25 -0
  774. package/dist/utils/ansi.js.map +1 -0
  775. package/dist/utils/changelog.d.ts +23 -0
  776. package/dist/utils/changelog.d.ts.map +1 -0
  777. package/dist/utils/changelog.js +74 -0
  778. package/dist/utils/changelog.js.map +1 -0
  779. package/dist/utils/child-process.d.ts +15 -0
  780. package/dist/utils/child-process.d.ts.map +1 -0
  781. package/dist/utils/child-process.js +88 -0
  782. package/dist/utils/child-process.js.map +1 -0
  783. package/dist/utils/clipboard-image.d.ts +13 -0
  784. package/dist/utils/clipboard-image.d.ts.map +1 -0
  785. package/dist/utils/clipboard-image.js +248 -0
  786. package/dist/utils/clipboard-image.js.map +1 -0
  787. package/dist/utils/clipboard-native.d.ts +11 -0
  788. package/dist/utils/clipboard-native.d.ts.map +1 -0
  789. package/dist/utils/clipboard-native.js +20 -0
  790. package/dist/utils/clipboard-native.js.map +1 -0
  791. package/dist/utils/clipboard.d.ts +4 -0
  792. package/dist/utils/clipboard.d.ts.map +1 -0
  793. package/dist/utils/clipboard.js +171 -0
  794. package/dist/utils/clipboard.js.map +1 -0
  795. package/dist/utils/deprecation.d.ts +4 -0
  796. package/dist/utils/deprecation.d.ts.map +1 -0
  797. package/dist/utils/deprecation.js +13 -0
  798. package/dist/utils/deprecation.js.map +1 -0
  799. package/dist/utils/directory-completions.d.ts +5 -0
  800. package/dist/utils/directory-completions.d.ts.map +1 -0
  801. package/dist/utils/directory-completions.js +64 -0
  802. package/dist/utils/directory-completions.js.map +1 -0
  803. package/dist/utils/exif-orientation.d.ts +6 -0
  804. package/dist/utils/exif-orientation.d.ts.map +1 -0
  805. package/dist/utils/exif-orientation.js +166 -0
  806. package/dist/utils/exif-orientation.js.map +1 -0
  807. package/dist/utils/frontmatter.d.ts +8 -0
  808. package/dist/utils/frontmatter.d.ts.map +1 -0
  809. package/dist/utils/frontmatter.js +26 -0
  810. package/dist/utils/frontmatter.js.map +1 -0
  811. package/dist/utils/fs-watch.d.ts +5 -0
  812. package/dist/utils/fs-watch.d.ts.map +1 -0
  813. package/dist/utils/fs-watch.js +25 -0
  814. package/dist/utils/fs-watch.js.map +1 -0
  815. package/dist/utils/git.d.ts +27 -0
  816. package/dist/utils/git.d.ts.map +1 -0
  817. package/dist/utils/git.js +237 -0
  818. package/dist/utils/git.js.map +1 -0
  819. package/dist/utils/grip-user-agent.d.ts +2 -0
  820. package/dist/utils/grip-user-agent.d.ts.map +1 -0
  821. package/dist/utils/grip-user-agent.js +5 -0
  822. package/dist/utils/grip-user-agent.js.map +1 -0
  823. package/dist/utils/html.d.ts +7 -0
  824. package/dist/utils/html.d.ts.map +1 -0
  825. package/dist/utils/html.js +40 -0
  826. package/dist/utils/html.js.map +1 -0
  827. package/dist/utils/image-convert.d.ts +12 -0
  828. package/dist/utils/image-convert.d.ts.map +1 -0
  829. package/dist/utils/image-convert.js +43 -0
  830. package/dist/utils/image-convert.js.map +1 -0
  831. package/dist/utils/image-process.d.ts +18 -0
  832. package/dist/utils/image-process.d.ts.map +1 -0
  833. package/dist/utils/image-process.js +83 -0
  834. package/dist/utils/image-process.js.map +1 -0
  835. package/dist/utils/image-resize-core.d.ts +30 -0
  836. package/dist/utils/image-resize-core.d.ts.map +1 -0
  837. package/dist/utils/image-resize-core.js +133 -0
  838. package/dist/utils/image-resize-core.js.map +1 -0
  839. package/dist/utils/image-resize-worker.d.ts +2 -0
  840. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  841. package/dist/utils/image-resize-worker.js +31 -0
  842. package/dist/utils/image-resize-worker.js.map +1 -0
  843. package/dist/utils/image-resize.d.ts +19 -0
  844. package/dist/utils/image-resize.d.ts.map +1 -0
  845. package/dist/utils/image-resize.js +81 -0
  846. package/dist/utils/image-resize.js.map +1 -0
  847. package/dist/utils/json.d.ts +3 -0
  848. package/dist/utils/json.d.ts.map +1 -0
  849. package/dist/utils/json.js +7 -0
  850. package/dist/utils/json.js.map +1 -0
  851. package/dist/utils/mime.d.ts +3 -0
  852. package/dist/utils/mime.d.ts.map +1 -0
  853. package/dist/utils/mime.js +110 -0
  854. package/dist/utils/mime.js.map +1 -0
  855. package/dist/utils/open-browser.d.ts +9 -0
  856. package/dist/utils/open-browser.d.ts.map +1 -0
  857. package/dist/utils/open-browser.js +22 -0
  858. package/dist/utils/open-browser.js.map +1 -0
  859. package/dist/utils/paths.d.ts +31 -0
  860. package/dist/utils/paths.d.ts.map +1 -0
  861. package/dist/utils/paths.js +87 -0
  862. package/dist/utils/paths.js.map +1 -0
  863. package/dist/utils/photon.d.ts +22 -0
  864. package/dist/utils/photon.d.ts.map +1 -0
  865. package/dist/utils/photon.js +125 -0
  866. package/dist/utils/photon.js.map +1 -0
  867. package/dist/utils/shell.d.ts +28 -0
  868. package/dist/utils/shell.d.ts.map +1 -0
  869. package/dist/utils/shell.js +188 -0
  870. package/dist/utils/shell.js.map +1 -0
  871. package/dist/utils/sleep.d.ts +5 -0
  872. package/dist/utils/sleep.d.ts.map +1 -0
  873. package/dist/utils/sleep.js +17 -0
  874. package/dist/utils/sleep.js.map +1 -0
  875. package/dist/utils/syntax-highlight.d.ts +12 -0
  876. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  877. package/dist/utils/syntax-highlight.js +125 -0
  878. package/dist/utils/syntax-highlight.js.map +1 -0
  879. package/dist/utils/tools-manager.d.ts +5 -0
  880. package/dist/utils/tools-manager.d.ts.map +1 -0
  881. package/dist/utils/tools-manager.js +329 -0
  882. package/dist/utils/tools-manager.js.map +1 -0
  883. package/dist/utils/version-check.d.ts +14 -0
  884. package/dist/utils/version-check.d.ts.map +1 -0
  885. package/dist/utils/version-check.js +91 -0
  886. package/dist/utils/version-check.js.map +1 -0
  887. package/dist/utils/windows-self-update.d.ts +3 -0
  888. package/dist/utils/windows-self-update.d.ts.map +1 -0
  889. package/dist/utils/windows-self-update.js +77 -0
  890. package/dist/utils/windows-self-update.js.map +1 -0
  891. package/docs/compaction.md +408 -0
  892. package/docs/custom-provider.md +714 -0
  893. package/docs/daemon-architecture.md +399 -0
  894. package/docs/daemon.md +110 -0
  895. package/docs/development.md +72 -0
  896. package/docs/docs.json +164 -0
  897. package/docs/extensions.md +2745 -0
  898. package/docs/hooks.md +85 -0
  899. package/docs/images/doom-extension.png +0 -0
  900. package/docs/images/exy.png +0 -0
  901. package/docs/images/interactive-mode.png +0 -0
  902. package/docs/images/tree-view.png +0 -0
  903. package/docs/index.md +81 -0
  904. package/docs/json.md +89 -0
  905. package/docs/keybindings.md +230 -0
  906. package/docs/lsp.md +499 -0
  907. package/docs/migrating-to-grip.md +18 -0
  908. package/docs/models.md +496 -0
  909. package/docs/packages.md +228 -0
  910. package/docs/prompt-templates.md +88 -0
  911. package/docs/providers.md +251 -0
  912. package/docs/quickstart.md +167 -0
  913. package/docs/rpc.md +1492 -0
  914. package/docs/rules.md +117 -0
  915. package/docs/sandbox.md +181 -0
  916. package/docs/sdk.md +360 -0
  917. package/docs/session-format.md +414 -0
  918. package/docs/sessions.md +137 -0
  919. package/docs/settings.md +371 -0
  920. package/docs/shell-aliases.md +13 -0
  921. package/docs/skills.md +246 -0
  922. package/docs/terminal-setup.md +112 -0
  923. package/docs/termux.md +129 -0
  924. package/docs/themes.md +295 -0
  925. package/docs/tmux.md +61 -0
  926. package/docs/tui.md +918 -0
  927. package/docs/usage.md +304 -0
  928. package/docs/windows.md +17 -0
  929. package/examples/README.md +31 -0
  930. package/examples/daemon-docker/Dockerfile +43 -0
  931. package/examples/daemon-docker/README.md +45 -0
  932. package/examples/extensions/README.md +208 -0
  933. package/examples/extensions/auto-commit-on-exit.ts +46 -0
  934. package/examples/extensions/bash-spawn-hook.ts +30 -0
  935. package/examples/extensions/bookmark.ts +50 -0
  936. package/examples/extensions/border-status-editor.ts +145 -0
  937. package/examples/extensions/built-in-tool-renderer.ts +259 -0
  938. package/examples/extensions/claude-rules.ts +86 -0
  939. package/examples/extensions/commands.ts +82 -0
  940. package/examples/extensions/confirm-destructive.ts +59 -0
  941. package/examples/extensions/custom-compaction.ts +131 -0
  942. package/examples/extensions/custom-footer.ts +79 -0
  943. package/examples/extensions/custom-header.ts +73 -0
  944. package/examples/extensions/custom-provider-anthropic/index.ts +707 -0
  945. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  946. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  947. package/examples/extensions/custom-provider-gitlab-duo/index.ts +402 -0
  948. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  949. package/examples/extensions/custom-provider-gitlab-duo/test.ts +104 -0
  950. package/examples/extensions/dirty-repo-guard.ts +59 -0
  951. package/examples/extensions/doom-overlay/README.md +46 -0
  952. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  953. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  954. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  955. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  956. package/examples/extensions/doom-overlay/doom-component.ts +133 -0
  957. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  958. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  959. package/examples/extensions/doom-overlay/index.ts +74 -0
  960. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  961. package/examples/extensions/dynamic-resources/RULES.md +8 -0
  962. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  963. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  964. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  965. package/examples/extensions/dynamic-resources/index.ts +16 -0
  966. package/examples/extensions/dynamic-tools.ts +74 -0
  967. package/examples/extensions/event-bus.ts +43 -0
  968. package/examples/extensions/file-trigger.ts +41 -0
  969. package/examples/extensions/git-checkpoint.ts +53 -0
  970. package/examples/extensions/git-merge-and-resolve.ts +125 -0
  971. package/examples/extensions/github-issue-autocomplete.ts +191 -0
  972. package/examples/extensions/handoff.ts +191 -0
  973. package/examples/extensions/hello.ts +26 -0
  974. package/examples/extensions/hidden-thinking-label.ts +53 -0
  975. package/examples/extensions/inline-bash.ts +104 -0
  976. package/examples/extensions/input-transform.ts +43 -0
  977. package/examples/extensions/interactive-shell.ts +194 -0
  978. package/examples/extensions/mac-system-theme.ts +47 -0
  979. package/examples/extensions/message-renderer.ts +59 -0
  980. package/examples/extensions/minimal-mode.ts +428 -0
  981. package/examples/extensions/modal-editor.ts +86 -0
  982. package/examples/extensions/model-status.ts +31 -0
  983. package/examples/extensions/notify.ts +55 -0
  984. package/examples/extensions/overlay-qa-tests.ts +1374 -0
  985. package/examples/extensions/overlay-test.ts +171 -0
  986. package/examples/extensions/permission-gate.ts +34 -0
  987. package/examples/extensions/pirate.ts +47 -0
  988. package/examples/extensions/plan-mode/README.md +65 -0
  989. package/examples/extensions/plan-mode/index.ts +346 -0
  990. package/examples/extensions/plan-mode/utils.ts +172 -0
  991. package/examples/extensions/preset.ts +426 -0
  992. package/examples/extensions/prompt-customizer.ts +97 -0
  993. package/examples/extensions/protected-paths.ts +29 -0
  994. package/examples/extensions/provider-payload.ts +18 -0
  995. package/examples/extensions/qna.ts +125 -0
  996. package/examples/extensions/question.ts +294 -0
  997. package/examples/extensions/questionnaire.ts +459 -0
  998. package/examples/extensions/rainbow-editor.ts +88 -0
  999. package/examples/extensions/reload-runtime.ts +37 -0
  1000. package/examples/extensions/rpc-demo.ts +118 -0
  1001. package/examples/extensions/sandbox/index.ts +320 -0
  1002. package/examples/extensions/sandbox/package-lock.json +92 -0
  1003. package/examples/extensions/sandbox/package.json +19 -0
  1004. package/examples/extensions/send-user-message.ts +97 -0
  1005. package/examples/extensions/session-name.ts +27 -0
  1006. package/examples/extensions/shutdown-command.ts +63 -0
  1007. package/examples/extensions/snake.ts +381 -0
  1008. package/examples/extensions/space-invaders.ts +597 -0
  1009. package/examples/extensions/status-line.ts +32 -0
  1010. package/examples/extensions/structured-output.ts +65 -0
  1011. package/examples/extensions/subagent/README.md +175 -0
  1012. package/examples/extensions/subagent/agents/planner.md +37 -0
  1013. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1014. package/examples/extensions/subagent/agents/scout.md +50 -0
  1015. package/examples/extensions/subagent/agents/worker.md +24 -0
  1016. package/examples/extensions/subagent/agents.ts +126 -0
  1017. package/examples/extensions/subagent/index.ts +1083 -0
  1018. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1019. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1020. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1021. package/examples/extensions/summarize.ts +186 -0
  1022. package/examples/extensions/system-prompt-header.ts +17 -0
  1023. package/examples/extensions/tic-tac-toe.ts +1091 -0
  1024. package/examples/extensions/timed-confirm.ts +70 -0
  1025. package/examples/extensions/titlebar-spinner.ts +58 -0
  1026. package/examples/extensions/todo.ts +306 -0
  1027. package/examples/extensions/tool-override.ts +144 -0
  1028. package/examples/extensions/tools.ts +141 -0
  1029. package/examples/extensions/trigger-compact.ts +50 -0
  1030. package/examples/extensions/truncated-tool.ts +200 -0
  1031. package/examples/extensions/widget-placement.ts +9 -0
  1032. package/examples/extensions/with-deps/index.ts +32 -0
  1033. package/examples/extensions/with-deps/package-lock.json +31 -0
  1034. package/examples/extensions/with-deps/package.json +22 -0
  1035. package/examples/extensions/working-indicator.ts +123 -0
  1036. package/examples/extensions/working-message-test.ts +25 -0
  1037. package/examples/remote-session-server/README.md +71 -0
  1038. package/examples/remote-session-server/server.ts +353 -0
  1039. package/examples/rpc-extension-ui.ts +642 -0
  1040. package/examples/sandbox-docker/Dockerfile +274 -0
  1041. package/examples/sandbox-docker/README.md +88 -0
  1042. package/examples/sdk/01-minimal.ts +27 -0
  1043. package/examples/sdk/02-custom-model.ts +54 -0
  1044. package/examples/sdk/03-custom-prompt.ts +76 -0
  1045. package/examples/sdk/04-skills.ts +60 -0
  1046. package/examples/sdk/05-tools.ts +55 -0
  1047. package/examples/sdk/06-extensions.ts +94 -0
  1048. package/examples/sdk/07-context-files.ts +47 -0
  1049. package/examples/sdk/08-prompt-templates.ts +56 -0
  1050. package/examples/sdk/09-api-keys-and-oauth.ts +50 -0
  1051. package/examples/sdk/10-settings.ts +58 -0
  1052. package/examples/sdk/11-sessions.ts +54 -0
  1053. package/examples/sdk/12-full-control.ts +79 -0
  1054. package/examples/sdk/13-session-runtime.ts +49 -0
  1055. package/examples/sdk/README.md +94 -0
  1056. package/npm-shrinkwrap.json +1878 -0
  1057. package/package.json +102 -5
@@ -0,0 +1,1309 @@
1
+ /**
2
+ * Subagent Tool - Delegate tasks to specialized agents
3
+ *
4
+ * Runs each task in a fresh embedded AgentSession using an injected runner.
5
+ *
6
+ * Supports three modes:
7
+ * - Single: { task: "...", responseFormat: "...", systemPrompt: "..." }
8
+ * - Parallel: { tasks: [{ task: "...", model: "..." }, ...] }
9
+ * - Chain: { chain: [{ task: "... {previous} ..." }, ...] }
10
+ */
11
+ import * as os from "node:os";
12
+ import { StringEnum } from "@greppleai/grip-ai";
13
+ import { Container, Markdown, Spacer, Text } from "@greppleai/grip-tui";
14
+ import { Type } from "typebox";
15
+ import { getMarkdownTheme } from "../../modes/interactive/theme/theme.js";
16
+ import { discoverAgentsWithOperations, } from "./subagent-agents.js";
17
+ import { wrapToolDefinition } from "./tool-definition-wrapper.js";
18
+ const GENERIC_SYSTEM_PROMPT = "You are an isolated subagent. Complete the delegated task autonomously and return only the information requested by the parent agent.";
19
+ const MAX_PARALLEL_TASKS = 8;
20
+ const MAX_CHAIN_STEPS = 16;
21
+ const MAX_CONCURRENCY = 4;
22
+ const COLLAPSED_ITEM_COUNT = 10;
23
+ const PER_TASK_OUTPUT_CAP = 50 * 1024;
24
+ const MAX_RETAINED_MESSAGE_CHARS = 64 * 1024;
25
+ const MAX_RETAINED_TASK_CHARS = 256 * 1024;
26
+ const MAX_RETAINED_TASK_MESSAGES = 100;
27
+ const MAX_RETAINED_TASK_DESCRIPTION_CHARS = 16 * 1024;
28
+ function formatTokens(count) {
29
+ if (count < 1000)
30
+ return count.toString();
31
+ if (count < 10000)
32
+ return `${(count / 1000).toFixed(1)}k`;
33
+ if (count < 1000000)
34
+ return `${Math.round(count / 1000)}k`;
35
+ return `${(count / 1000000).toFixed(1)}M`;
36
+ }
37
+ function formatUsageStats(usage, model) {
38
+ const parts = [];
39
+ if (usage.turns)
40
+ parts.push(`${usage.turns} turn${usage.turns > 1 ? "s" : ""}`);
41
+ if (usage.input)
42
+ parts.push(`in:${formatTokens(usage.input)}`);
43
+ if (usage.output)
44
+ parts.push(`out:${formatTokens(usage.output)}`);
45
+ if (usage.cacheRead)
46
+ parts.push(`R${formatTokens(usage.cacheRead)}`);
47
+ if (usage.cacheWrite)
48
+ parts.push(`W${formatTokens(usage.cacheWrite)}`);
49
+ if (usage.cost)
50
+ parts.push(`$${usage.cost.toFixed(4)}`);
51
+ if (usage.contextTokens && usage.contextTokens > 0) {
52
+ parts.push(`ctx:${formatTokens(usage.contextTokens)}`);
53
+ }
54
+ if (model)
55
+ parts.push(model);
56
+ return parts.join(" ");
57
+ }
58
+ export function formatSubagentModelCatalog(currentModel, availableModels) {
59
+ if (!currentModel)
60
+ return undefined;
61
+ const providerModels = availableModels.filter((model) => model.provider === currentModel.provider);
62
+ if (providerModels.length === 0)
63
+ return undefined;
64
+ const lines = [
65
+ `Authenticated subagent models for the current ${currentModel.provider} provider:`,
66
+ "Omit model to inherit the current model.",
67
+ ];
68
+ for (const model of providerModels) {
69
+ const capabilities = [
70
+ model.reasoning ? "reasoning" : "non-reasoning",
71
+ `context ${formatTokens(model.contextWindow)}`,
72
+ `max output ${formatTokens(model.maxTokens)}`,
73
+ `input $${model.cost.input}/M`,
74
+ `output $${model.cost.output}/M`,
75
+ ];
76
+ if (model.cost.cacheRead > 0)
77
+ capabilities.push(`cache read $${model.cost.cacheRead}/M`);
78
+ if (model.cost.cacheWrite > 0)
79
+ capabilities.push(`cache write $${model.cost.cacheWrite}/M`);
80
+ lines.push(`- ${model.provider}/${model.id}: ${capabilities.join(", ")}`);
81
+ }
82
+ return lines.join("\n");
83
+ }
84
+ function shortenSubagentToolPath(filePath) {
85
+ const home = os.homedir();
86
+ return filePath.startsWith(home) ? `~${filePath.slice(home.length)}` : filePath;
87
+ }
88
+ function formatBashToolCall(args, themeFg) {
89
+ const command = args.command || "...";
90
+ const preview = command.length > 60 ? `${command.slice(0, 60)}...` : command;
91
+ return themeFg("muted", "$ ") + themeFg("toolOutput", preview);
92
+ }
93
+ function formatReadToolCall(args, themeFg) {
94
+ const rawPath = (args.file_path || args.path || "...");
95
+ const filePath = shortenSubagentToolPath(rawPath);
96
+ const offset = args.offset;
97
+ const limit = args.limit;
98
+ let text = themeFg("accent", filePath);
99
+ if (offset !== undefined || limit !== undefined) {
100
+ const startLine = offset ?? 1;
101
+ const endLine = limit !== undefined ? startLine + limit - 1 : "";
102
+ text += themeFg("warning", `:${startLine}${endLine ? `-${endLine}` : ""}`);
103
+ }
104
+ return themeFg("muted", "read ") + text;
105
+ }
106
+ function formatWriteToolCall(args, themeFg) {
107
+ const rawPath = (args.file_path || args.path || "...");
108
+ const filePath = shortenSubagentToolPath(rawPath);
109
+ const content = (args.content || "");
110
+ const lines = content.split("\n").length;
111
+ let text = themeFg("muted", "write ") + themeFg("accent", filePath);
112
+ if (lines > 1)
113
+ text += themeFg("dim", ` (${lines} lines)`);
114
+ return text;
115
+ }
116
+ function formatToolCall(toolName, args, themeFg) {
117
+ switch (toolName) {
118
+ case "bash":
119
+ return formatBashToolCall(args, themeFg);
120
+ case "read":
121
+ return formatReadToolCall(args, themeFg);
122
+ case "write":
123
+ return formatWriteToolCall(args, themeFg);
124
+ case "edit": {
125
+ const rawPath = (args.file_path || args.path || "...");
126
+ return themeFg("muted", "edit ") + themeFg("accent", shortenSubagentToolPath(rawPath));
127
+ }
128
+ case "ls": {
129
+ const rawPath = (args.path || ".");
130
+ return themeFg("muted", "ls ") + themeFg("accent", shortenSubagentToolPath(rawPath));
131
+ }
132
+ case "find": {
133
+ const pattern = (args.pattern || "*");
134
+ const rawPath = (args.path || ".");
135
+ return (themeFg("muted", "find ") +
136
+ themeFg("accent", pattern) +
137
+ themeFg("dim", ` in ${shortenSubagentToolPath(rawPath)}`));
138
+ }
139
+ case "grep": {
140
+ const pattern = (args.pattern || "");
141
+ const rawPath = (args.path || ".");
142
+ return (themeFg("muted", "grep ") +
143
+ themeFg("accent", `/${pattern}/`) +
144
+ themeFg("dim", ` in ${shortenSubagentToolPath(rawPath)}`));
145
+ }
146
+ default: {
147
+ const argsStr = JSON.stringify(args);
148
+ const preview = argsStr.length > 50 ? `${argsStr.slice(0, 50)}...` : argsStr;
149
+ return themeFg("accent", toolName) + themeFg("dim", ` ${preview}`);
150
+ }
151
+ }
152
+ }
153
+ const presentationCache = new WeakMap();
154
+ function appendPresentationMessage(state, message) {
155
+ const segment = { displayItemCount: 0 };
156
+ if (message.role === "assistant") {
157
+ const textParts = [];
158
+ for (const part of message.content) {
159
+ if (part.type === "text") {
160
+ state.displayItems.push({ type: "text", text: part.text });
161
+ textParts.push(part.text);
162
+ segment.displayItemCount++;
163
+ }
164
+ else if (part.type === "toolCall") {
165
+ state.displayItems.push({ type: "toolCall", name: part.name, args: part.arguments });
166
+ segment.displayItemCount++;
167
+ }
168
+ }
169
+ if (textParts.length > 0) {
170
+ segment.assistantOutput = textParts.join("\n");
171
+ state.assistantOutputs.push(segment.assistantOutput);
172
+ }
173
+ }
174
+ state.segments.push(segment);
175
+ }
176
+ function removeOldestPresentationMessage(state) {
177
+ const segment = state.segments.shift();
178
+ if (!segment)
179
+ return;
180
+ if (segment.displayItemCount > 0)
181
+ state.displayItems.splice(0, segment.displayItemCount);
182
+ if (segment.assistantOutput !== undefined)
183
+ state.assistantOutputs.shift();
184
+ }
185
+ function getPresentationState(messages) {
186
+ const cached = presentationCache.get(messages);
187
+ if (cached)
188
+ return cached;
189
+ const state = { displayItems: [], assistantOutputs: [], segments: [] };
190
+ for (const message of messages)
191
+ appendPresentationMessage(state, message);
192
+ presentationCache.set(messages, state);
193
+ return state;
194
+ }
195
+ function getFinalOutput(messages) {
196
+ return getPresentationState(messages).assistantOutputs.at(-1) ?? "";
197
+ }
198
+ function isFailedResult(result) {
199
+ return result.status === "failed";
200
+ }
201
+ function getResultOutput(result) {
202
+ if (isFailedResult(result)) {
203
+ return result.errorMessage || result.stderr || getFinalOutput(result.messages) || "(no output)";
204
+ }
205
+ return getFinalOutput(result.messages) || "(no output)";
206
+ }
207
+ function truncateParallelOutput(output) {
208
+ const byteLength = Buffer.byteLength(output, "utf8");
209
+ if (byteLength <= PER_TASK_OUTPUT_CAP)
210
+ return output;
211
+ let truncated = output.slice(0, PER_TASK_OUTPUT_CAP);
212
+ while (Buffer.byteLength(truncated, "utf8") > PER_TASK_OUTPUT_CAP) {
213
+ truncated = truncated.slice(0, -1);
214
+ }
215
+ return `${truncated}\n\n[Output truncated: ${byteLength - Buffer.byteLength(truncated, "utf8")} bytes omitted.]`;
216
+ }
217
+ function getDisplayItems(messages) {
218
+ return getPresentationState(messages).displayItems;
219
+ }
220
+ async function mapWithConcurrencyLimit(items, concurrency, fn) {
221
+ if (items.length === 0)
222
+ return [];
223
+ const limit = Math.max(1, Math.min(concurrency, items.length));
224
+ const results = new Array(items.length);
225
+ let nextIndex = 0;
226
+ const workers = new Array(limit).fill(null).map(async () => {
227
+ while (true) {
228
+ const current = nextIndex++;
229
+ if (current >= items.length)
230
+ return;
231
+ results[current] = await fn(items[current], current);
232
+ }
233
+ });
234
+ await Promise.all(workers);
235
+ return results;
236
+ }
237
+ function truncateRetainedTask(task) {
238
+ if (task.length <= MAX_RETAINED_TASK_DESCRIPTION_CHARS)
239
+ return task;
240
+ return `${task.slice(0, MAX_RETAINED_TASK_DESCRIPTION_CHARS)}\n\n[Task truncated in retained details]`;
241
+ }
242
+ function truncateRetainedText(text) {
243
+ if (text.length <= MAX_RETAINED_MESSAGE_CHARS)
244
+ return text;
245
+ return `${text.slice(0, MAX_RETAINED_MESSAGE_CHARS)}\n\n[Retained output truncated: ${text.length - MAX_RETAINED_MESSAGE_CHARS} characters omitted.]`;
246
+ }
247
+ function compactRetainedMessage(message) {
248
+ if (JSON.stringify(message).length <= MAX_RETAINED_MESSAGE_CHARS)
249
+ return message;
250
+ if (message.role === "assistant") {
251
+ const text = message.content
252
+ .filter((part) => part.type === "text")
253
+ .map((part) => part.text)
254
+ .join("\n");
255
+ return {
256
+ ...message,
257
+ errorMessage: message.errorMessage ? truncateRetainedText(message.errorMessage) : undefined,
258
+ content: [{ type: "text", text: truncateRetainedText(text || "[Oversized assistant event omitted]") }],
259
+ };
260
+ }
261
+ if (message.role === "toolResult") {
262
+ const text = message.content
263
+ .filter((part) => part.type === "text")
264
+ .map((part) => part.text)
265
+ .join("\n");
266
+ return {
267
+ ...message,
268
+ toolCallId: message.toolCallId.slice(0, 1024),
269
+ toolName: message.toolName.slice(0, 1024),
270
+ details: undefined,
271
+ content: [{ type: "text", text: truncateRetainedText(text || "[Oversized tool result omitted]") }],
272
+ };
273
+ }
274
+ return undefined;
275
+ }
276
+ function retainSubagentMessage(result, state, message) {
277
+ const retainedMessage = compactRetainedMessage(message);
278
+ if (!retainedMessage)
279
+ return;
280
+ const retainedSize = JSON.stringify(retainedMessage).length;
281
+ result.messages.push(retainedMessage);
282
+ appendPresentationMessage(state.presentation, retainedMessage);
283
+ state.retainedSizes.push(retainedSize);
284
+ state.retainedChars += retainedSize;
285
+ while (result.messages.length > MAX_RETAINED_TASK_MESSAGES ||
286
+ (state.retainedChars > MAX_RETAINED_TASK_CHARS && result.messages.length > 1)) {
287
+ result.messages.shift();
288
+ removeOldestPresentationMessage(state.presentation);
289
+ state.retainedChars -= state.retainedSizes.shift() ?? 0;
290
+ }
291
+ }
292
+ function recordSubagentAssistantMessage(result, message) {
293
+ result.usage.turns++;
294
+ const usage = message.usage;
295
+ if (usage) {
296
+ result.usage.input += usage.input || 0;
297
+ result.usage.output += usage.output || 0;
298
+ result.usage.cacheRead += usage.cacheRead || 0;
299
+ result.usage.cacheWrite += usage.cacheWrite || 0;
300
+ result.usage.cost += usage.cost?.total || 0;
301
+ result.usage.contextTokens = usage.totalTokens || 0;
302
+ }
303
+ if (!result.model && message.model)
304
+ result.model = message.model;
305
+ if (message.stopReason)
306
+ result.stopReason = message.stopReason;
307
+ result.errorMessage = message.errorMessage;
308
+ }
309
+ function selectSubagentModel(selection) {
310
+ const { spec, preset, inheritedModel, agentName, result, resolveModelHintOption } = selection;
311
+ return (spec.model ??
312
+ (spec.modelHint
313
+ ? resolveModelHint(spec.modelHint, resolveModelHintOption, `task "${agentName}"`, result)
314
+ : undefined) ??
315
+ preset?.model ??
316
+ (preset?.modelHint
317
+ ? resolveModelHint(preset.modelHint, resolveModelHintOption, `agent "${agentName}"`, result)
318
+ : undefined) ??
319
+ inheritedModel);
320
+ }
321
+ function finalizeSubagentRun(result, outcome, aborted) {
322
+ result.runId = outcome.runId;
323
+ result.sessionReference = outcome.sessionReference;
324
+ result.exitCode = outcome.exitCode;
325
+ result.stderr = outcome.stderr;
326
+ if (aborted) {
327
+ result.status = "failed";
328
+ result.stopReason = "aborted";
329
+ result.errorMessage ??= outcome.stderr || "Subagent was aborted";
330
+ return result;
331
+ }
332
+ result.status =
333
+ outcome.exitCode !== 0 || result.stopReason === "error" || result.stopReason === "aborted"
334
+ ? "failed"
335
+ : "completed";
336
+ return result;
337
+ }
338
+ async function invokeSubagentRunner(runner, request) {
339
+ try {
340
+ return await runner(request);
341
+ }
342
+ catch (error) {
343
+ if (!request.signal?.aborted)
344
+ throw error;
345
+ return { exitCode: 1, stderr: error instanceof Error ? error.message : String(error) };
346
+ }
347
+ }
348
+ export function formatSubagentTaskPrompt(task, responseFormat) {
349
+ const sections = [`<task>\n${task}\n</task>`];
350
+ if (responseFormat?.trim()) {
351
+ sections.push(`<response-format>\n${responseFormat}\n</response-format>`);
352
+ }
353
+ return sections.join("\n\n");
354
+ }
355
+ async function runSingleAgent(defaultCwd, agents, spec, inheritedModel, runner, step, signal, onUpdate, makeDetails, resolveModelHintOption) {
356
+ const preset = spec.agent ? agents.find((agent) => agent.name === spec.agent) : undefined;
357
+ const agentName = spec.agent ?? "ad-hoc";
358
+ if (spec.agent && !preset) {
359
+ const available = agents.map((agent) => `"${agent.name}"`).join(", ") || "none";
360
+ return {
361
+ status: "failed",
362
+ agent: agentName,
363
+ agentSource: "unknown",
364
+ task: truncateRetainedTask(spec.task),
365
+ responseFormat: spec.responseFormat,
366
+ exitCode: 1,
367
+ messages: [],
368
+ stderr: `Unknown agent: "${agentName}". Available agents: ${available}.`,
369
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
370
+ step,
371
+ };
372
+ }
373
+ const currentResult = {
374
+ status: "running",
375
+ agent: agentName,
376
+ agentSource: preset?.source ?? "ad-hoc",
377
+ task: truncateRetainedTask(spec.task),
378
+ responseFormat: spec.responseFormat,
379
+ exitCode: -1,
380
+ messages: [],
381
+ stderr: "",
382
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
383
+ step,
384
+ };
385
+ const effectiveModel = selectSubagentModel({
386
+ spec,
387
+ preset,
388
+ inheritedModel,
389
+ agentName,
390
+ result: currentResult,
391
+ resolveModelHintOption,
392
+ });
393
+ const effectiveTools = spec.tools ?? preset?.tools;
394
+ const effectiveSkills = spec.skills ?? preset?.skills;
395
+ const effectiveCwd = spec.cwd ?? preset?.cwd ?? defaultCwd;
396
+ const effectiveSystemPrompt = spec.systemPrompt ?? preset?.systemPrompt ?? GENERIC_SYSTEM_PROMPT;
397
+ currentResult.model = effectiveModel;
398
+ if (currentResult.status === "failed")
399
+ return currentResult;
400
+ if (signal?.aborted) {
401
+ currentResult.status = "failed";
402
+ currentResult.exitCode = 1;
403
+ currentResult.stderr = "Subagent was aborted";
404
+ currentResult.stopReason = "aborted";
405
+ currentResult.errorMessage = "Subagent was aborted";
406
+ return currentResult;
407
+ }
408
+ const retainedMessageState = {
409
+ presentation: getPresentationState(currentResult.messages),
410
+ retainedChars: 0,
411
+ retainedSizes: [],
412
+ };
413
+ const emitUpdate = () => {
414
+ onUpdate?.({
415
+ content: [{ type: "text", text: getFinalOutput(currentResult.messages) || "(running...)" }],
416
+ details: makeDetails([currentResult]),
417
+ });
418
+ };
419
+ const onMessage = (message) => {
420
+ retainSubagentMessage(currentResult, retainedMessageState, message);
421
+ if (message.role === "assistant")
422
+ recordSubagentAssistantMessage(currentResult, message);
423
+ emitUpdate();
424
+ };
425
+ emitUpdate();
426
+ const outcome = await invokeSubagentRunner(runner, {
427
+ cwd: effectiveCwd,
428
+ toolOperations: spec.toolOperations,
429
+ prompt: formatSubagentTaskPrompt(spec.task, spec.responseFormat),
430
+ task: spec.task,
431
+ agent: agentName,
432
+ agentSource: preset?.source ?? "ad-hoc",
433
+ systemPrompt: effectiveSystemPrompt,
434
+ model: effectiveModel,
435
+ tools: effectiveTools,
436
+ skills: effectiveSkills,
437
+ continueSession: spec.continueSession,
438
+ signal,
439
+ onMessage,
440
+ });
441
+ return finalizeSubagentRun(currentResult, outcome, signal?.aborted === true);
442
+ }
443
+ const MODEL_DESCRIPTION = "Model for this task. Omit to inherit the parent model";
444
+ const STEP_MODEL_DESCRIPTION = "Model for this step. Omit to inherit the parent model";
445
+ const MODEL_HINT_VALUES = [
446
+ "cheapest",
447
+ "fastest",
448
+ "strongest",
449
+ "best-reasoning",
450
+ "large-context",
451
+ "same-as-parent",
452
+ "balanced",
453
+ ];
454
+ const MODEL_HINT_DESCRIPTION = "Advisory model selection hint. Exact model overrides this. Supported: cheapest, fastest, strongest, best-reasoning, large-context, same-as-parent, balanced.";
455
+ function appendModelCatalog(description, modelCatalog) {
456
+ return modelCatalog ? `${description}.\n\n${modelCatalog}` : description;
457
+ }
458
+ function createModelHintSchema() {
459
+ return StringEnum(MODEL_HINT_VALUES, { description: MODEL_HINT_DESCRIPTION });
460
+ }
461
+ function mergeSessionAgents(agents, configs) {
462
+ const agentMap = new Map();
463
+ for (const agent of agents)
464
+ agentMap.set(agent.name, agent);
465
+ for (const config of configs) {
466
+ agentMap.set(config.name, {
467
+ name: config.name,
468
+ description: config.description,
469
+ systemPrompt: config.systemPrompt,
470
+ tools: config.tools,
471
+ model: config.model,
472
+ modelHint: config.modelHint,
473
+ skills: config.skills,
474
+ cwd: config.cwd,
475
+ source: "session",
476
+ filePath: `<session-subagent:${config.name}>`,
477
+ });
478
+ }
479
+ return Array.from(agentMap.values());
480
+ }
481
+ function resolveModelHint(hint, resolveModelHintOption, context, result) {
482
+ if (!hint)
483
+ return undefined;
484
+ const resolved = resolveModelHintOption?.(hint);
485
+ if (!resolved) {
486
+ result.status = "failed";
487
+ result.exitCode = 1;
488
+ result.stderr = `Could not resolve modelHint "${hint}" for ${context}.`;
489
+ result.errorMessage = result.stderr;
490
+ result.stopReason = "error";
491
+ return undefined;
492
+ }
493
+ return resolved;
494
+ }
495
+ function createSubagentParamsSchema(modelCatalog) {
496
+ const TaskItem = Type.Object({
497
+ agent: Type.Optional(Type.String({ description: "Optional named agent preset" })),
498
+ task: Type.String({ description: "Task to delegate" }),
499
+ responseFormat: Type.Optional(Type.String({ description: "Requested response content and structure" })),
500
+ systemPrompt: Type.Optional(Type.String({ description: "Persona/instructions overriding the preset system prompt" })),
501
+ model: Type.Optional(Type.String({ description: appendModelCatalog(MODEL_DESCRIPTION, modelCatalog) })),
502
+ modelHint: Type.Optional(createModelHintSchema()),
503
+ tools: Type.Optional(Type.Array(Type.String(), { description: "Tool allowlist overriding preset defaults" })),
504
+ skills: Type.Optional(Type.Array(Type.String(), { description: "Skills to preload before the first subagent turn" })),
505
+ cwd: Type.Optional(Type.String({ description: "Working directory for the agent session" })),
506
+ });
507
+ const ChainItem = Type.Object({
508
+ agent: Type.Optional(Type.String({ description: "Optional named agent preset" })),
509
+ task: Type.String({ description: "Task with optional {previous} placeholder for prior output" }),
510
+ responseFormat: Type.Optional(Type.String({ description: "Requested response content and structure" })),
511
+ systemPrompt: Type.Optional(Type.String({ description: "Persona/instructions overriding the preset system prompt" })),
512
+ model: Type.Optional(Type.String({ description: appendModelCatalog(STEP_MODEL_DESCRIPTION, modelCatalog) })),
513
+ modelHint: Type.Optional(createModelHintSchema()),
514
+ tools: Type.Optional(Type.Array(Type.String(), { description: "Tool allowlist overriding preset defaults" })),
515
+ skills: Type.Optional(Type.Array(Type.String(), { description: "Skills to preload before the first subagent turn" })),
516
+ cwd: Type.Optional(Type.String({ description: "Working directory for the agent session" })),
517
+ });
518
+ const AgentScopeSchema = StringEnum(["user", "project", "both"], {
519
+ description: 'Which agent directories to use. Default: "user". Use "both" to include project-local agents.',
520
+ default: "user",
521
+ });
522
+ return Type.Object({
523
+ agent: Type.Optional(Type.String({ description: "Optional named agent preset (single mode)" })),
524
+ task: Type.Optional(Type.String({ description: "Task to delegate (single mode) or follow-up prompt when continuing a subagent" })),
525
+ responseFormat: Type.Optional(Type.String({ description: "Requested response content and structure" })),
526
+ systemPrompt: Type.Optional(Type.String({ description: "Persona/instructions overriding the preset system prompt" })),
527
+ model: Type.Optional(Type.String({ description: appendModelCatalog(MODEL_DESCRIPTION, modelCatalog) })),
528
+ modelHint: Type.Optional(createModelHintSchema()),
529
+ tools: Type.Optional(Type.Array(Type.String(), { description: "Tool allowlist overriding preset defaults" })),
530
+ skills: Type.Optional(Type.Array(Type.String(), { description: "Skills to preload before the first subagent turn" })),
531
+ tasks: Type.Optional(Type.Array(TaskItem, { description: "Tasks for parallel execution" })),
532
+ chain: Type.Optional(Type.Array(ChainItem, { description: "Tasks for sequential execution", maxItems: MAX_CHAIN_STEPS })),
533
+ agentScope: Type.Optional(AgentScopeSchema),
534
+ continueSession: Type.Optional(Type.String({ description: "Run id of a previous subagent run to continue" })),
535
+ cwd: Type.Optional(Type.String({ description: "Working directory for the subagent session (single mode)" })),
536
+ });
537
+ }
538
+ export const subagentParamsSchema = createSubagentParamsSchema();
539
+ const subagentRunsParamsSchema = Type.Object({
540
+ status: Type.Optional(StringEnum(["running", "completed", "failed"], { description: "Filter runs by status" })),
541
+ });
542
+ function truncateRunPreview(text) {
543
+ if (!text)
544
+ return "";
545
+ const trimmed = text.trim();
546
+ return trimmed.length > 240 ? `${trimmed.slice(0, 240)}...` : trimmed;
547
+ }
548
+ export function createSubagentRunsToolDefinition(registry) {
549
+ return {
550
+ name: "subagent_runs",
551
+ label: "Subagent Runs",
552
+ description: "List subagent runs in the current session so one can be selected and continued by run id.",
553
+ promptSnippet: "List subagent runs from the current session for continuation",
554
+ parameters: subagentRunsParamsSchema,
555
+ async execute(_toolCallId, params) {
556
+ if (!registry) {
557
+ return {
558
+ content: [{ type: "text", text: "Subagent run registry is not configured for this session." }],
559
+ details: { runs: [] },
560
+ isError: true,
561
+ };
562
+ }
563
+ const runs = registry.list().filter((run) => !params.status || run.status === params.status);
564
+ if (runs.length === 0) {
565
+ return { content: [{ type: "text", text: "No subagent runs found." }], details: { runs } };
566
+ }
567
+ const text = runs
568
+ .map((run, index) => {
569
+ const lines = [
570
+ `${index + 1}. ${run.runId} [${run.status}] ${run.agent}${run.model ? ` (${run.model})` : ""}`,
571
+ ` Task: ${run.task.replace(/\s+/g, " ")}`,
572
+ ` CWD: ${run.cwd}`,
573
+ ];
574
+ if (run.sessionReference)
575
+ lines.push(` Session: ${run.sessionReference}`);
576
+ const preview = truncateRunPreview(run.lastOutput);
577
+ if (preview)
578
+ lines.push(` Output: ${preview}`);
579
+ return lines.join("\n");
580
+ })
581
+ .join("\n\n");
582
+ return { content: [{ type: "text", text }], details: { runs } };
583
+ },
584
+ renderCall(_args, theme) {
585
+ return new Text(theme.fg("toolTitle", theme.bold("subagent_runs")), 0, 0);
586
+ },
587
+ renderResult(result, _options, theme) {
588
+ const text = result.content
589
+ .filter((part) => part.type === "text")
590
+ .map((part) => part.text)
591
+ .join("\n")
592
+ .trim();
593
+ return new Text(theme.fg("toolOutput", text), 0, 0);
594
+ },
595
+ };
596
+ }
597
+ const createSubagentConfigParamsSchema = Type.Object({
598
+ name: Type.String({ description: "Session-scoped subagent preset name" }),
599
+ description: Type.String({ description: "Short description shown when this preset is available" }),
600
+ systemPrompt: Type.String({ description: "System prompt/persona for this subagent preset" }),
601
+ model: Type.Optional(Type.String({ description: "Exact model for this preset. Overrides modelHint." })),
602
+ modelHint: Type.Optional(createModelHintSchema()),
603
+ tools: Type.Optional(Type.Array(Type.String(), { description: "Default tool allowlist for this preset" })),
604
+ skills: Type.Optional(Type.Array(Type.String(), { description: "Skill names to preload before the first subagent turn" })),
605
+ cwd: Type.Optional(Type.String({ description: "Default working directory for this preset" })),
606
+ });
607
+ export function createCreateSubagentToolDefinition(registry) {
608
+ return {
609
+ name: "create_subagent",
610
+ label: "Create Subagent",
611
+ description: "Create or replace a session-scoped named subagent preset for later subagent calls.",
612
+ promptSnippet: "Create session-scoped subagent presets with tools, skills, cwd, and model hints",
613
+ promptGuidelines: [
614
+ "Use create_subagent when a reusable temporary role would reduce repeated subagent configuration.",
615
+ "Prefer modelHint for cost/performance intent unless an exact model is required.",
616
+ ],
617
+ parameters: createSubagentConfigParamsSchema,
618
+ async execute(_toolCallId, params) {
619
+ if (!registry) {
620
+ return {
621
+ content: [{ type: "text", text: "Subagent config registry is not configured for this session." }],
622
+ details: { configs: [] },
623
+ isError: true,
624
+ };
625
+ }
626
+ const trimmedName = params.name.trim();
627
+ if (!/^[A-Za-z0-9_-]{1,64}$/.test(trimmedName)) {
628
+ return {
629
+ content: [
630
+ { type: "text", text: "Invalid subagent name. Use 1-64 letters, numbers, underscores, or hyphens." },
631
+ ],
632
+ details: { configs: registry.list() },
633
+ isError: true,
634
+ };
635
+ }
636
+ const now = new Date().toISOString();
637
+ const existing = registry.get(trimmedName);
638
+ const config = {
639
+ name: trimmedName,
640
+ description: params.description.trim(),
641
+ systemPrompt: params.systemPrompt,
642
+ model: params.model?.trim() || undefined,
643
+ modelHint: params.modelHint,
644
+ tools: params.tools?.map((tool) => tool.trim()).filter(Boolean),
645
+ skills: params.skills?.map((skill) => skill.trim()).filter(Boolean),
646
+ cwd: params.cwd?.trim() || undefined,
647
+ createdAt: existing?.createdAt ?? now,
648
+ updatedAt: now,
649
+ };
650
+ registry.upsert(config);
651
+ return {
652
+ content: [{ type: "text", text: `Created subagent preset "${config.name}".` }],
653
+ details: { config, configs: registry.list() },
654
+ };
655
+ },
656
+ renderCall(args, theme) {
657
+ return new Text(theme.fg("toolTitle", theme.bold("create_subagent ")) + theme.fg("accent", args.name), 0, 0);
658
+ },
659
+ renderResult(result, _options, theme) {
660
+ const text = result.content
661
+ .filter((part) => part.type === "text")
662
+ .map((part) => part.text)
663
+ .join("\n");
664
+ return new Text(theme.fg("toolOutput", text), 0, 0);
665
+ },
666
+ };
667
+ }
668
+ function inheritedSubagentModelName(model) {
669
+ return model ? `${model.provider}/${model.id}` : undefined;
670
+ }
671
+ function selectSubagentMode(params) {
672
+ const hasChain = (params.chain?.length ?? 0) > 0;
673
+ const hasTasks = (params.tasks?.length ?? 0) > 0;
674
+ const hasSingle = Boolean(params.task);
675
+ return {
676
+ mode: hasChain ? "chain" : hasTasks ? "parallel" : "single",
677
+ hasChain,
678
+ hasTasks,
679
+ hasSingle,
680
+ modeCount: Number(hasChain) + Number(hasTasks) + Number(hasSingle),
681
+ };
682
+ }
683
+ function createSubagentDetailsFactory(agentScope, projectAgentsDir) {
684
+ return (mode) => (results) => ({ mode, agentScope, projectAgentsDir, results });
685
+ }
686
+ function hasContinuedSessionOverrides(params) {
687
+ return (params.agent !== undefined ||
688
+ params.systemPrompt !== undefined ||
689
+ params.model !== undefined ||
690
+ params.modelHint !== undefined ||
691
+ params.tools !== undefined ||
692
+ params.skills !== undefined ||
693
+ params.cwd !== undefined ||
694
+ params.agentScope !== undefined);
695
+ }
696
+ function validateSubagentRequest(params, selection, agents, makeDetails) {
697
+ if (selection.modeCount !== 1) {
698
+ const available = agents.map((agent) => `${agent.name} (${agent.source})`).join(", ") || "none";
699
+ return {
700
+ content: [
701
+ { type: "text", text: `Invalid parameters. Provide exactly one mode.\nAvailable agents: ${available}` },
702
+ ],
703
+ details: makeDetails("single")([]),
704
+ };
705
+ }
706
+ if (params.continueSession && !selection.hasSingle) {
707
+ return {
708
+ content: [{ type: "text", text: "Invalid parameters. continueSession requires a single follow-up task." }],
709
+ details: makeDetails(selection.mode)([]),
710
+ isError: true,
711
+ };
712
+ }
713
+ if (params.continueSession && hasContinuedSessionOverrides(params)) {
714
+ return {
715
+ content: [
716
+ {
717
+ type: "text",
718
+ text: "Invalid parameters. A continued subagent may only specify task and responseFormat.",
719
+ },
720
+ ],
721
+ details: makeDetails("single")([]),
722
+ isError: true,
723
+ };
724
+ }
725
+ return undefined;
726
+ }
727
+ function collectRequestedAgentNames(params) {
728
+ const names = new Set();
729
+ for (const step of params.chain ?? [])
730
+ if (step.agent)
731
+ names.add(step.agent);
732
+ for (const task of params.tasks ?? [])
733
+ if (task.agent)
734
+ names.add(task.agent);
735
+ if (params.agent)
736
+ names.add(params.agent);
737
+ return names;
738
+ }
739
+ async function authorizeProjectAgents(params, agentScope, agents, projectAgentsDir, trustProjectAgents, ctx, makeDetails, mode) {
740
+ if (agentScope === "user")
741
+ return undefined;
742
+ const agentsByName = new Map();
743
+ for (const agent of agents) {
744
+ if (!agentsByName.has(agent.name))
745
+ agentsByName.set(agent.name, agent);
746
+ }
747
+ const projectAgents = [];
748
+ for (const name of collectRequestedAgentNames(params)) {
749
+ const agent = agentsByName.get(name);
750
+ if (agent?.source === "project")
751
+ projectAgents.push(agent);
752
+ }
753
+ if (projectAgents.length === 0 || trustProjectAgents)
754
+ return undefined;
755
+ const names = projectAgents.map((agent) => agent.name).join(", ");
756
+ const dir = projectAgentsDir ?? "(unknown)";
757
+ if (!ctx.hasUI) {
758
+ return {
759
+ content: [
760
+ {
761
+ type: "text",
762
+ text: `Project-local agents require host approval, but no interactive UI is available. Agents: ${names}. Source: ${dir}.`,
763
+ },
764
+ ],
765
+ details: makeDetails(mode)([]),
766
+ isError: true,
767
+ };
768
+ }
769
+ const approved = await ctx.ui.confirm("Run project-local agents?", `Agents: ${names}\nSource: ${dir}\n\nProject agents are repo-controlled. Only continue for trusted repositories.`);
770
+ if (approved)
771
+ return undefined;
772
+ return {
773
+ content: [{ type: "text", text: "Canceled: project-local agents not approved." }],
774
+ details: makeDetails(mode)([]),
775
+ isError: true,
776
+ };
777
+ }
778
+ function createChainUpdate(onUpdate, results, makeDetails) {
779
+ if (!onUpdate)
780
+ return undefined;
781
+ return (partial) => {
782
+ const currentResult = partial.details?.results[0];
783
+ if (!currentResult)
784
+ return;
785
+ onUpdate({
786
+ content: partial.content,
787
+ details: makeDetails("chain")([...results, currentResult]),
788
+ });
789
+ };
790
+ }
791
+ async function executeSubagentChain(params, environment) {
792
+ const chain = params.chain ?? [];
793
+ if (chain.length > MAX_CHAIN_STEPS) {
794
+ return {
795
+ content: [{ type: "text", text: `Too many chain steps (${chain.length}). Max is ${MAX_CHAIN_STEPS}.` }],
796
+ details: environment.makeDetails("chain")([]),
797
+ };
798
+ }
799
+ const results = [];
800
+ let previousOutput = "";
801
+ for (let index = 0; index < chain.length; index++) {
802
+ const step = chain[index];
803
+ const result = await runSingleAgent(environment.workspaceCwd, environment.agents, {
804
+ ...step,
805
+ task: step.task.replace(/\{previous\}/g, previousOutput),
806
+ toolOperations: environment.workspaceOperations,
807
+ }, environment.inheritedModel, environment.runner, index + 1, environment.signal, createChainUpdate(environment.onUpdate, results, environment.makeDetails), environment.makeDetails("chain"), environment.resolveModelHintOption);
808
+ results.push(result);
809
+ if (isFailedResult(result)) {
810
+ return {
811
+ content: [
812
+ {
813
+ type: "text",
814
+ text: `Chain stopped at step ${index + 1} (${result.agent}): ${getResultOutput(result)}`,
815
+ },
816
+ ],
817
+ details: environment.makeDetails("chain")(results),
818
+ isError: true,
819
+ };
820
+ }
821
+ previousOutput = getFinalOutput(result.messages);
822
+ }
823
+ return {
824
+ content: [{ type: "text", text: getFinalOutput(results[results.length - 1].messages) || "(no output)" }],
825
+ details: environment.makeDetails("chain")(results),
826
+ };
827
+ }
828
+ function createQueuedSubagentResult(task, agents, inheritedModel) {
829
+ return {
830
+ status: "queued",
831
+ agent: task.agent ?? "ad-hoc",
832
+ agentSource: task.agent ? "unknown" : "ad-hoc",
833
+ task: truncateRetainedTask(task.task),
834
+ responseFormat: task.responseFormat,
835
+ exitCode: -1,
836
+ messages: [],
837
+ stderr: "",
838
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
839
+ model: task.model ??
840
+ (task.modelHint ? `hint:${task.modelHint}` : undefined) ??
841
+ agents.find((agent) => agent.name === task.agent)?.model ??
842
+ inheritedModel,
843
+ };
844
+ }
845
+ function emitParallelSubagentUpdate(onUpdate, results, makeDetails) {
846
+ if (!onUpdate)
847
+ return;
848
+ const running = results.filter((result) => result.status === "running" || result.status === "queued").length;
849
+ const done = results.length - running;
850
+ onUpdate({
851
+ content: [{ type: "text", text: `Parallel: ${done}/${results.length} done, ${running} running...` }],
852
+ details: makeDetails("parallel")([...results]),
853
+ });
854
+ }
855
+ function formatParallelSubagentSummary(result) {
856
+ const output = truncateParallelOutput(getResultOutput(result));
857
+ const status = isFailedResult(result)
858
+ ? `failed${result.stopReason && result.stopReason !== "end" ? ` (${result.stopReason})` : ""}`
859
+ : "completed";
860
+ return `### [${result.agent}] ${status}\n\n${output}`;
861
+ }
862
+ async function executeParallelSubagents(params, environment) {
863
+ const tasks = params.tasks ?? [];
864
+ if (tasks.length > MAX_PARALLEL_TASKS) {
865
+ return {
866
+ content: [{ type: "text", text: `Too many parallel tasks (${tasks.length}). Max is ${MAX_PARALLEL_TASKS}.` }],
867
+ details: environment.makeDetails("parallel")([]),
868
+ };
869
+ }
870
+ const currentResults = tasks.map((task) => createQueuedSubagentResult(task, environment.agents, environment.inheritedModel));
871
+ const results = await mapWithConcurrencyLimit(tasks, MAX_CONCURRENCY, async (task, index) => {
872
+ const result = await runSingleAgent(environment.workspaceCwd, environment.agents, { ...task, toolOperations: environment.workspaceOperations }, environment.inheritedModel, environment.runner, undefined, environment.signal, (partial) => {
873
+ const currentResult = partial.details?.results[0];
874
+ if (!currentResult)
875
+ return;
876
+ currentResults[index] = currentResult;
877
+ emitParallelSubagentUpdate(environment.onUpdate, currentResults, environment.makeDetails);
878
+ }, environment.makeDetails("parallel"), environment.resolveModelHintOption);
879
+ currentResults[index] = result;
880
+ emitParallelSubagentUpdate(environment.onUpdate, currentResults, environment.makeDetails);
881
+ return result;
882
+ });
883
+ const successCount = results.filter((result) => !isFailedResult(result)).length;
884
+ const summaries = results.map(formatParallelSubagentSummary);
885
+ return {
886
+ content: [
887
+ {
888
+ type: "text",
889
+ text: `Parallel: ${successCount}/${results.length} succeeded\n\n${summaries.join("\n\n---\n\n")}`,
890
+ },
891
+ ],
892
+ details: environment.makeDetails("parallel")(results),
893
+ };
894
+ }
895
+ async function executeSingleSubagent(params, environment) {
896
+ const result = await runSingleAgent(environment.workspaceCwd, environment.agents, {
897
+ agent: params.agent,
898
+ task: params.task ?? "",
899
+ responseFormat: params.responseFormat,
900
+ systemPrompt: params.systemPrompt,
901
+ model: params.model,
902
+ modelHint: params.modelHint,
903
+ tools: params.tools,
904
+ skills: params.skills,
905
+ cwd: params.cwd,
906
+ toolOperations: environment.workspaceOperations,
907
+ continueSession: params.continueSession,
908
+ }, environment.inheritedModel, environment.runner, undefined, environment.signal, environment.onUpdate, environment.makeDetails("single"), environment.resolveModelHintOption);
909
+ if (isFailedResult(result)) {
910
+ return {
911
+ content: [{ type: "text", text: `Agent ${result.stopReason || "failed"}: ${getResultOutput(result)}` }],
912
+ details: environment.makeDetails("single")([result]),
913
+ isError: true,
914
+ };
915
+ }
916
+ return {
917
+ content: [{ type: "text", text: getFinalOutput(result.messages) || "(no output)" }],
918
+ details: environment.makeDetails("single")([result]),
919
+ };
920
+ }
921
+ function executeSelectedSubagentMode(params, selection, environment) {
922
+ if (selection.hasChain)
923
+ return executeSubagentChain(params, environment);
924
+ if (selection.hasTasks)
925
+ return executeParallelSubagents(params, environment);
926
+ return executeSingleSubagent(params, environment);
927
+ }
928
+ function truncateSubagentCallTask(task, maxCharacters) {
929
+ return task.length > maxCharacters ? `${task.slice(0, maxCharacters)}...` : task;
930
+ }
931
+ function renderSubagentChainCall(args, scope, theme) {
932
+ const chain = args.chain ?? [];
933
+ let text = theme.fg("toolTitle", theme.bold("subagent ")) +
934
+ theme.fg("accent", `chain (${chain.length} steps)`) +
935
+ theme.fg("muted", ` [${scope}]`);
936
+ for (let index = 0; index < Math.min(chain.length, 3); index++) {
937
+ const step = chain[index];
938
+ const cleanTask = step.task.replace(/\{previous\}/g, "").trim();
939
+ const preview = truncateSubagentCallTask(cleanTask, 40);
940
+ text +=
941
+ "\n " +
942
+ theme.fg("muted", `${index + 1}.`) +
943
+ " " +
944
+ theme.fg("accent", step.agent ?? "ad-hoc") +
945
+ theme.fg("muted", ` [${step.model ?? "parent model"}]`) +
946
+ theme.fg("dim", ` ${preview}`);
947
+ }
948
+ if (chain.length > 3)
949
+ text += `\n ${theme.fg("muted", `... +${chain.length - 3} more`)}`;
950
+ return new Text(text, 0, 0);
951
+ }
952
+ function renderParallelSubagentCall(args, scope, theme) {
953
+ const tasks = args.tasks ?? [];
954
+ let text = theme.fg("toolTitle", theme.bold("subagent ")) +
955
+ theme.fg("accent", `parallel (${tasks.length} tasks)`) +
956
+ theme.fg("muted", ` [${scope}]`);
957
+ for (const task of tasks.slice(0, 3)) {
958
+ const preview = truncateSubagentCallTask(task.task, 40);
959
+ text += `\n ${theme.fg("accent", task.agent ?? "ad-hoc")}${theme.fg("muted", ` [${task.model ?? "parent model"}]`)}${theme.fg("dim", ` ${preview}`)}`;
960
+ }
961
+ if (tasks.length > 3)
962
+ text += `\n ${theme.fg("muted", `... +${tasks.length - 3} more`)}`;
963
+ return new Text(text, 0, 0);
964
+ }
965
+ function renderSingleSubagentCall(args, scope, theme) {
966
+ const agentName = args.agent || "ad-hoc";
967
+ const preview = args.task ? truncateSubagentCallTask(args.task, 60) : "...";
968
+ let text = theme.fg("toolTitle", theme.bold("subagent ")) +
969
+ theme.fg("accent", agentName) +
970
+ theme.fg("muted", ` [${scope}] [${args.model ?? "parent model"}]`);
971
+ text += `\n ${theme.fg("dim", preview)}`;
972
+ return new Text(text, 0, 0);
973
+ }
974
+ function renderSubagentStatusIcon(status, theme) {
975
+ if (status === "queued")
976
+ return theme.fg("muted", "[queued]");
977
+ if (status === "running")
978
+ return theme.fg("warning", "[running]");
979
+ if (status === "failed")
980
+ return theme.fg("error", "[failed]");
981
+ return theme.fg("success", "[done]");
982
+ }
983
+ function renderSubagentModel(model, theme) {
984
+ return theme.fg("muted", ` [${model ?? "model pending"}]`);
985
+ }
986
+ function renderSubagentDisplayItems(items, expanded, theme, limit) {
987
+ const toShow = limit ? items.slice(-limit) : items;
988
+ const skipped = limit && items.length > limit ? items.length - limit : 0;
989
+ let text = skipped > 0 ? theme.fg("muted", `... ${skipped} earlier items\n`) : "";
990
+ for (const item of toShow) {
991
+ if (item.type === "text") {
992
+ const preview = expanded ? item.text : item.text.split("\n").slice(0, 3).join("\n");
993
+ text += `${theme.fg("toolOutput", preview)}\n`;
994
+ continue;
995
+ }
996
+ text += `${theme.fg("muted", "-> ") + formatToolCall(item.name, item.args, theme.fg.bind(theme))}\n`;
997
+ }
998
+ return text.trimEnd();
999
+ }
1000
+ function aggregateSubagentUsage(results) {
1001
+ const total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 };
1002
+ for (const result of results) {
1003
+ total.input += result.usage.input;
1004
+ total.output += result.usage.output;
1005
+ total.cacheRead += result.usage.cacheRead;
1006
+ total.cacheWrite += result.usage.cacheWrite;
1007
+ total.cost += result.usage.cost;
1008
+ total.turns += result.usage.turns;
1009
+ }
1010
+ return total;
1011
+ }
1012
+ function countSubagentStatuses(results) {
1013
+ const counts = { completed: 0, failed: 0, active: 0 };
1014
+ for (const result of results) {
1015
+ if (result.status === "completed")
1016
+ counts.completed++;
1017
+ else if (result.status === "failed")
1018
+ counts.failed++;
1019
+ else
1020
+ counts.active++;
1021
+ }
1022
+ return counts;
1023
+ }
1024
+ function appendSubagentToolCalls(container, items, theme) {
1025
+ for (const item of items) {
1026
+ if (item.type !== "toolCall")
1027
+ continue;
1028
+ container.addChild(new Text(theme.fg("muted", "-> ") + formatToolCall(item.name, item.args, theme.fg.bind(theme)), 0, 0));
1029
+ }
1030
+ }
1031
+ function appendSubagentMarkdown(container, output) {
1032
+ if (!output)
1033
+ return;
1034
+ container.addChild(new Spacer(1));
1035
+ container.addChild(new Markdown(output.trim(), 0, 0, getMarkdownTheme()));
1036
+ }
1037
+ function appendSubagentUsage(container, usage, theme, model, prefix = "", withSpacer = false) {
1038
+ const text = formatUsageStats(usage, model);
1039
+ if (!text)
1040
+ return;
1041
+ if (withSpacer)
1042
+ container.addChild(new Spacer(1));
1043
+ container.addChild(new Text(theme.fg("dim", `${prefix}${text}`), 0, 0));
1044
+ }
1045
+ function appendExpandedBatchResult(container, result, heading, theme) {
1046
+ container.addChild(new Spacer(1));
1047
+ container.addChild(new Text(heading, 0, 0));
1048
+ container.addChild(new Text(theme.fg("muted", "Task: ") + theme.fg("dim", result.task), 0, 0));
1049
+ if (result.responseFormat) {
1050
+ container.addChild(new Text(theme.fg("muted", "Response format: ") + theme.fg("dim", result.responseFormat), 0, 0));
1051
+ }
1052
+ appendSubagentToolCalls(container, getDisplayItems(result.messages), theme);
1053
+ appendSubagentMarkdown(container, getFinalOutput(result.messages));
1054
+ appendSubagentUsage(container, result.usage, theme, result.model);
1055
+ }
1056
+ function renderExpandedSingleSubagent(result, theme) {
1057
+ const container = new Container();
1058
+ const failed = isFailedResult(result);
1059
+ let header = `${renderSubagentStatusIcon(result.status, theme)} ${theme.fg("toolTitle", theme.bold(result.agent))}${theme.fg("muted", ` (${result.agentSource})`)}${renderSubagentModel(result.model, theme)}`;
1060
+ if (failed && result.stopReason)
1061
+ header += ` ${theme.fg("error", `[${result.stopReason}]`)}`;
1062
+ container.addChild(new Text(header, 0, 0));
1063
+ if (failed && result.errorMessage) {
1064
+ container.addChild(new Text(theme.fg("error", `Error: ${result.errorMessage}`), 0, 0));
1065
+ }
1066
+ container.addChild(new Spacer(1));
1067
+ container.addChild(new Text(theme.fg("muted", "─── Task ───"), 0, 0));
1068
+ container.addChild(new Text(theme.fg("dim", result.task), 0, 0));
1069
+ if (result.responseFormat) {
1070
+ container.addChild(new Text(theme.fg("muted", "Response format: ") + theme.fg("dim", result.responseFormat), 0, 0));
1071
+ }
1072
+ container.addChild(new Spacer(1));
1073
+ container.addChild(new Text(theme.fg("muted", "─── Output ───"), 0, 0));
1074
+ const displayItems = getDisplayItems(result.messages);
1075
+ const finalOutput = getFinalOutput(result.messages);
1076
+ if (displayItems.length === 0 && !finalOutput) {
1077
+ container.addChild(new Text(theme.fg("muted", result.status === "running" ? "(running...)" : "(no output)"), 0, 0));
1078
+ }
1079
+ else {
1080
+ appendSubagentToolCalls(container, displayItems, theme);
1081
+ appendSubagentMarkdown(container, finalOutput);
1082
+ }
1083
+ appendSubagentUsage(container, result.usage, theme, result.model, "", true);
1084
+ return container;
1085
+ }
1086
+ function renderCollapsedSingleSubagent(result, theme) {
1087
+ const failed = isFailedResult(result);
1088
+ const displayItems = getDisplayItems(result.messages);
1089
+ let text = `${renderSubagentStatusIcon(result.status, theme)} ${theme.fg("toolTitle", theme.bold(result.agent))}${theme.fg("muted", ` (${result.agentSource})`)}${renderSubagentModel(result.model, theme)}`;
1090
+ if (failed && result.stopReason)
1091
+ text += ` ${theme.fg("error", `[${result.stopReason}]`)}`;
1092
+ if (failed && result.errorMessage)
1093
+ text += `\n${theme.fg("error", `Error: ${result.errorMessage}`)}`;
1094
+ else if (displayItems.length === 0) {
1095
+ text += `\n${theme.fg("muted", result.status === "running" ? "(running...)" : "(no output)")}`;
1096
+ }
1097
+ else {
1098
+ text += `\n${renderSubagentDisplayItems(displayItems, false, theme, COLLAPSED_ITEM_COUNT)}`;
1099
+ if (displayItems.length > COLLAPSED_ITEM_COUNT)
1100
+ text += `\n${theme.fg("muted", "(Ctrl+O to expand)")}`;
1101
+ }
1102
+ const usage = formatUsageStats(result.usage, result.model);
1103
+ if (usage)
1104
+ text += `\n${theme.fg("dim", usage)}`;
1105
+ return new Text(text, 0, 0);
1106
+ }
1107
+ function renderSingleSubagentResult(result, expanded, theme) {
1108
+ return expanded ? renderExpandedSingleSubagent(result, theme) : renderCollapsedSingleSubagent(result, theme);
1109
+ }
1110
+ function renderExpandedSubagentChain(results, counts, icon, theme) {
1111
+ const container = new Container();
1112
+ container.addChild(new Text(icon +
1113
+ " " +
1114
+ theme.fg("toolTitle", theme.bold("chain ")) +
1115
+ theme.fg("accent", `${counts.completed}/${results.length} steps`), 0, 0));
1116
+ for (const result of results) {
1117
+ const heading = `${theme.fg("muted", `─── Step ${result.step}: `) + theme.fg("accent", result.agent)}${renderSubagentModel(result.model, theme)} ${renderSubagentStatusIcon(result.status, theme)}`;
1118
+ appendExpandedBatchResult(container, result, heading, theme);
1119
+ }
1120
+ appendSubagentUsage(container, aggregateSubagentUsage(results), theme, undefined, "Total: ", true);
1121
+ return container;
1122
+ }
1123
+ function renderCollapsedSubagentChain(results, counts, icon, theme) {
1124
+ let text = icon +
1125
+ " " +
1126
+ theme.fg("toolTitle", theme.bold("chain ")) +
1127
+ theme.fg("accent", `${counts.completed}/${results.length} steps`);
1128
+ for (const result of results) {
1129
+ const items = getDisplayItems(result.messages);
1130
+ text += `\n\n${theme.fg("muted", `─── Step ${result.step}: `)}${theme.fg("accent", result.agent)}${renderSubagentModel(result.model, theme)} ${renderSubagentStatusIcon(result.status, theme)}`;
1131
+ if (items.length === 0) {
1132
+ const empty = result.status === "running" || result.status === "queued" ? `(${result.status}...)` : "(no output)";
1133
+ text += `\n${theme.fg("muted", empty)}`;
1134
+ }
1135
+ else
1136
+ text += `\n${renderSubagentDisplayItems(items, false, theme, 5)}`;
1137
+ }
1138
+ const usage = formatUsageStats(aggregateSubagentUsage(results));
1139
+ if (usage)
1140
+ text += `\n\n${theme.fg("dim", `Total: ${usage}`)}`;
1141
+ text += `\n${theme.fg("muted", "(Ctrl+O to expand)")}`;
1142
+ return new Text(text, 0, 0);
1143
+ }
1144
+ function renderSubagentChain(results, expanded, theme) {
1145
+ const counts = countSubagentStatuses(results);
1146
+ const icon = counts.active > 0
1147
+ ? theme.fg("warning", "[running]")
1148
+ : counts.failed > 0
1149
+ ? theme.fg("error", "[failed]")
1150
+ : theme.fg("success", "[done]");
1151
+ return expanded
1152
+ ? renderExpandedSubagentChain(results, counts, icon, theme)
1153
+ : renderCollapsedSubagentChain(results, counts, icon, theme);
1154
+ }
1155
+ function parallelSubagentStatus(counts, total) {
1156
+ return counts.active > 0
1157
+ ? `${counts.completed + counts.failed}/${total} done, ${counts.active} running`
1158
+ : `${counts.completed}/${total} tasks`;
1159
+ }
1160
+ function renderExpandedParallelSubagents(results, icon, status, theme) {
1161
+ const container = new Container();
1162
+ container.addChild(new Text(`${icon} ${theme.fg("toolTitle", theme.bold("parallel "))}${theme.fg("accent", status)}`, 0, 0));
1163
+ for (const result of results) {
1164
+ const heading = `${theme.fg("muted", "─── ") + theme.fg("accent", result.agent)}${renderSubagentModel(result.model, theme)} ${renderSubagentStatusIcon(result.status, theme)}`;
1165
+ appendExpandedBatchResult(container, result, heading, theme);
1166
+ }
1167
+ appendSubagentUsage(container, aggregateSubagentUsage(results), theme, undefined, "Total: ", true);
1168
+ return container;
1169
+ }
1170
+ function renderCollapsedParallelSubagents(results, expanded, counts, icon, status, theme) {
1171
+ let text = `${icon} ${theme.fg("toolTitle", theme.bold("parallel "))}${theme.fg("accent", status)}`;
1172
+ for (const result of results) {
1173
+ const items = getDisplayItems(result.messages);
1174
+ text += `\n\n${theme.fg("muted", "─── ")}${theme.fg("accent", result.agent)}${renderSubagentModel(result.model, theme)} ${renderSubagentStatusIcon(result.status, theme)}`;
1175
+ if (items.length === 0) {
1176
+ const empty = result.status === "running" || result.status === "queued" ? `(${result.status}...)` : "(no output)";
1177
+ text += `\n${theme.fg("muted", empty)}`;
1178
+ }
1179
+ else
1180
+ text += `\n${renderSubagentDisplayItems(items, expanded, theme, 5)}`;
1181
+ }
1182
+ if (counts.active === 0) {
1183
+ const usage = formatUsageStats(aggregateSubagentUsage(results));
1184
+ if (usage)
1185
+ text += `\n\n${theme.fg("dim", `Total: ${usage}`)}`;
1186
+ }
1187
+ if (!expanded)
1188
+ text += `\n${theme.fg("muted", "(Ctrl+O to expand)")}`;
1189
+ return new Text(text, 0, 0);
1190
+ }
1191
+ function renderParallelSubagents(results, expanded, theme) {
1192
+ const counts = countSubagentStatuses(results);
1193
+ const icon = counts.active > 0
1194
+ ? theme.fg("warning", "[running]")
1195
+ : counts.failed > 0
1196
+ ? theme.fg("warning", "[partial]")
1197
+ : theme.fg("success", "[done]");
1198
+ const status = parallelSubagentStatus(counts, results.length);
1199
+ return expanded && counts.active === 0
1200
+ ? renderExpandedParallelSubagents(results, icon, status, theme)
1201
+ : renderCollapsedParallelSubagents(results, expanded, counts, icon, status, theme);
1202
+ }
1203
+ function renderSubagentFallback(result) {
1204
+ const content = result.content[0];
1205
+ return new Text(content?.type === "text" ? content.text : "(no output)", 0, 0);
1206
+ }
1207
+ function renderSubagentResult(result, expanded, theme) {
1208
+ const details = result.details;
1209
+ if (!details || details.results.length === 0)
1210
+ return renderSubagentFallback(result);
1211
+ if (details.mode === "single" && details.results.length === 1) {
1212
+ return renderSingleSubagentResult(details.results[0], expanded, theme);
1213
+ }
1214
+ if (details.mode === "chain")
1215
+ return renderSubagentChain(details.results, expanded, theme);
1216
+ if (details.mode === "parallel")
1217
+ return renderParallelSubagents(details.results, expanded, theme);
1218
+ return renderSubagentFallback(result);
1219
+ }
1220
+ export function createSubagentToolDefinition(options = {}) {
1221
+ const runner = options.runner;
1222
+ const parameters = options.modelCatalog ? createSubagentParamsSchema(options.modelCatalog) : subagentParamsSchema;
1223
+ return {
1224
+ name: "subagent",
1225
+ label: "Subagent",
1226
+ description: [
1227
+ "Delegate tasks to isolated subagent sessions with optional named presets.",
1228
+ "Modes: single (task), parallel (tasks array), chain (sequential with {previous} placeholder).",
1229
+ "Each task can specify responseFormat, systemPrompt, model, tools, cwd, and an optional agent preset.",
1230
+ "Omitted models inherit the parent model. Bundled presets: explore, worker, reviewer.",
1231
+ 'Default agent scope is "user"; project-local presets require host approval or trustProjectAgents in the host configuration.',
1232
+ ].join(" "),
1233
+ promptSnippet: "Delegate tasks to specialized agents in isolated sessions",
1234
+ promptGuidelines: [
1235
+ "Use subagent for focused parallel investigation or when a task benefits from an isolated context window.",
1236
+ "Do not delegate trivial work that is faster to perform directly.",
1237
+ ],
1238
+ parameters,
1239
+ async execute(_toolCallId, params, signal, onUpdate, ctx) {
1240
+ const selection = selectSubagentMode(params);
1241
+ const agentScope = params.agentScope ?? "user";
1242
+ const workspaceOperations = ctx.toolOperations;
1243
+ if (!workspaceOperations) {
1244
+ return {
1245
+ content: [{ type: "text", text: "Subagents require explicit workspace tool operations." }],
1246
+ details: { mode: selection.mode, agentScope, projectAgentsDir: null, results: [] },
1247
+ isError: true,
1248
+ };
1249
+ }
1250
+ const backendInfo = workspaceOperations.getBackendInfo?.();
1251
+ if (backendInfo?.type === "remote" && !backendInfo.configured) {
1252
+ return {
1253
+ content: [{ type: "text", text: "Subagents cannot run with an unconfigured remote backend." }],
1254
+ details: { mode: selection.mode, agentScope, projectAgentsDir: null, results: [] },
1255
+ isError: true,
1256
+ };
1257
+ }
1258
+ const workspaceCwd = workspaceOperations.cwd ?? ctx.cwd;
1259
+ const discovery = await discoverAgentsWithOperations(workspaceCwd, agentScope, workspaceOperations);
1260
+ const agents = mergeSessionAgents(discovery.agents, options.configRegistry?.list() ?? []);
1261
+ const makeDetails = createSubagentDetailsFactory(agentScope, discovery.projectAgentsDir);
1262
+ const validationError = validateSubagentRequest(params, selection, agents, makeDetails);
1263
+ if (validationError)
1264
+ return validationError;
1265
+ if (!runner) {
1266
+ return {
1267
+ content: [{ type: "text", text: "Subagent runner is not configured for this session." }],
1268
+ details: makeDetails(selection.mode)([]),
1269
+ isError: true,
1270
+ };
1271
+ }
1272
+ const authorizationError = await authorizeProjectAgents(params, agentScope, agents, discovery.projectAgentsDir, options.trustProjectAgents, ctx, makeDetails, selection.mode);
1273
+ if (authorizationError)
1274
+ return authorizationError;
1275
+ return executeSelectedSubagentMode(params, selection, {
1276
+ agents,
1277
+ workspaceCwd,
1278
+ workspaceOperations,
1279
+ inheritedModel: inheritedSubagentModelName(ctx.model),
1280
+ runner,
1281
+ signal,
1282
+ onUpdate,
1283
+ makeDetails,
1284
+ resolveModelHintOption: options.resolveModelHint,
1285
+ });
1286
+ },
1287
+ renderCall(args, theme, _context) {
1288
+ const scope = args.agentScope ?? "user";
1289
+ if (args.chain && args.chain.length > 0)
1290
+ return renderSubagentChainCall(args, scope, theme);
1291
+ if (args.tasks && args.tasks.length > 0)
1292
+ return renderParallelSubagentCall(args, scope, theme);
1293
+ return renderSingleSubagentCall(args, scope, theme);
1294
+ },
1295
+ renderResult(result, { expanded }, theme, _context) {
1296
+ return renderSubagentResult(result, expanded, theme);
1297
+ },
1298
+ };
1299
+ }
1300
+ export function createSubagentRunsTool(registry) {
1301
+ return wrapToolDefinition(createSubagentRunsToolDefinition(registry));
1302
+ }
1303
+ export function createCreateSubagentTool(registry) {
1304
+ return wrapToolDefinition(createCreateSubagentToolDefinition(registry));
1305
+ }
1306
+ export function createSubagentTool(options) {
1307
+ return wrapToolDefinition(createSubagentToolDefinition(options));
1308
+ }
1309
+ //# sourceMappingURL=subagent.js.map