@schovest/pi-coding-agent 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (881) hide show
  1. package/CHANGELOG.md +142 -0
  2. package/README.md +686 -0
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +9 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/bun/restore-sandbox-env.d.ts +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 +57 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +381 -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 +82 -0
  26. package/dist/cli/file-processor.js.map +1 -0
  27. package/dist/cli/initial-message.d.ts +18 -0
  28. package/dist/cli/initial-message.d.ts.map +1 -0
  29. package/dist/cli/initial-message.js +22 -0
  30. package/dist/cli/initial-message.js.map +1 -0
  31. package/dist/cli/list-models.d.ts +9 -0
  32. package/dist/cli/list-models.d.ts.map +1 -0
  33. package/dist/cli/list-models.js +98 -0
  34. package/dist/cli/list-models.js.map +1 -0
  35. package/dist/cli/project-trust.d.ts +10 -0
  36. package/dist/cli/project-trust.d.ts.map +1 -0
  37. package/dist/cli/project-trust.js +48 -0
  38. package/dist/cli/project-trust.js.map +1 -0
  39. package/dist/cli/session-picker.d.ts +9 -0
  40. package/dist/cli/session-picker.d.ts.map +1 -0
  41. package/dist/cli/session-picker.js +35 -0
  42. package/dist/cli/session-picker.js.map +1 -0
  43. package/dist/cli/startup-ui.d.ts +16 -0
  44. package/dist/cli/startup-ui.d.ts.map +1 -0
  45. package/dist/cli/startup-ui.js +112 -0
  46. package/dist/cli/startup-ui.js.map +1 -0
  47. package/dist/cli.d.ts +3 -0
  48. package/dist/cli.d.ts.map +1 -0
  49. package/dist/cli.js +18 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/config.d.ts +92 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +433 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/core/agent-session-runtime.d.ts +119 -0
  56. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  57. package/dist/core/agent-session-runtime.js +303 -0
  58. package/dist/core/agent-session-runtime.js.map +1 -0
  59. package/dist/core/agent-session-services.d.ts +88 -0
  60. package/dist/core/agent-session-services.d.ts.map +1 -0
  61. package/dist/core/agent-session-services.js +119 -0
  62. package/dist/core/agent-session-services.js.map +1 -0
  63. package/dist/core/agent-session.d.ts +661 -0
  64. package/dist/core/agent-session.d.ts.map +1 -0
  65. package/dist/core/agent-session.js +2758 -0
  66. package/dist/core/agent-session.js.map +1 -0
  67. package/dist/core/auth-guidance.d.ts +5 -0
  68. package/dist/core/auth-guidance.d.ts.map +1 -0
  69. package/dist/core/auth-guidance.js +21 -0
  70. package/dist/core/auth-guidance.js.map +1 -0
  71. package/dist/core/auth-storage.d.ts +141 -0
  72. package/dist/core/auth-storage.d.ts.map +1 -0
  73. package/dist/core/auth-storage.js +443 -0
  74. package/dist/core/auth-storage.js.map +1 -0
  75. package/dist/core/background-process-manager.d.ts +52 -0
  76. package/dist/core/background-process-manager.d.ts.map +1 -0
  77. package/dist/core/background-process-manager.js +127 -0
  78. package/dist/core/background-process-manager.js.map +1 -0
  79. package/dist/core/bash-executor.d.ts +32 -0
  80. package/dist/core/bash-executor.d.ts.map +1 -0
  81. package/dist/core/bash-executor.js +111 -0
  82. package/dist/core/bash-executor.js.map +1 -0
  83. package/dist/core/claude-plugin-manager.d.ts +110 -0
  84. package/dist/core/claude-plugin-manager.d.ts.map +1 -0
  85. package/dist/core/claude-plugin-manager.js +518 -0
  86. package/dist/core/claude-plugin-manager.js.map +1 -0
  87. package/dist/core/command-palette/command-palette-component.d.ts +24 -0
  88. package/dist/core/command-palette/command-palette-component.d.ts.map +1 -0
  89. package/dist/core/command-palette/command-palette-component.js +86 -0
  90. package/dist/core/command-palette/command-palette-component.js.map +1 -0
  91. package/dist/core/command-palette/command-palette-list.d.ts +16 -0
  92. package/dist/core/command-palette/command-palette-list.d.ts.map +1 -0
  93. package/dist/core/command-palette/command-palette-list.js +58 -0
  94. package/dist/core/command-palette/command-palette-list.js.map +1 -0
  95. package/dist/core/command-palette/command-registry.d.ts +9 -0
  96. package/dist/core/command-palette/command-registry.d.ts.map +1 -0
  97. package/dist/core/command-palette/command-registry.js +26 -0
  98. package/dist/core/command-palette/command-registry.js.map +1 -0
  99. package/dist/core/command-palette/index.d.ts +4 -0
  100. package/dist/core/command-palette/index.d.ts.map +1 -0
  101. package/dist/core/command-palette/index.js +3 -0
  102. package/dist/core/command-palette/index.js.map +1 -0
  103. package/dist/core/command-palette/types.d.ts +17 -0
  104. package/dist/core/command-palette/types.d.ts.map +1 -0
  105. package/dist/core/command-palette/types.js +2 -0
  106. package/dist/core/command-palette/types.js.map +1 -0
  107. package/dist/core/compaction/branch-summarization.d.ts +90 -0
  108. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  109. package/dist/core/compaction/branch-summarization.js +250 -0
  110. package/dist/core/compaction/branch-summarization.js.map +1 -0
  111. package/dist/core/compaction/compaction.d.ts +121 -0
  112. package/dist/core/compaction/compaction.d.ts.map +1 -0
  113. package/dist/core/compaction/compaction.js +622 -0
  114. package/dist/core/compaction/compaction.js.map +1 -0
  115. package/dist/core/compaction/index.d.ts +7 -0
  116. package/dist/core/compaction/index.d.ts.map +1 -0
  117. package/dist/core/compaction/index.js +7 -0
  118. package/dist/core/compaction/index.js.map +1 -0
  119. package/dist/core/compaction/utils.d.ts +38 -0
  120. package/dist/core/compaction/utils.d.ts.map +1 -0
  121. package/dist/core/compaction/utils.js +153 -0
  122. package/dist/core/compaction/utils.js.map +1 -0
  123. package/dist/core/defaults.d.ts +3 -0
  124. package/dist/core/defaults.d.ts.map +1 -0
  125. package/dist/core/defaults.js +2 -0
  126. package/dist/core/defaults.js.map +1 -0
  127. package/dist/core/diagnostics.d.ts +15 -0
  128. package/dist/core/diagnostics.d.ts.map +1 -0
  129. package/dist/core/diagnostics.js +2 -0
  130. package/dist/core/diagnostics.js.map +1 -0
  131. package/dist/core/event-bus.d.ts +9 -0
  132. package/dist/core/event-bus.d.ts.map +1 -0
  133. package/dist/core/event-bus.js +25 -0
  134. package/dist/core/event-bus.js.map +1 -0
  135. package/dist/core/exec.d.ts +29 -0
  136. package/dist/core/exec.d.ts.map +1 -0
  137. package/dist/core/exec.js +75 -0
  138. package/dist/core/exec.js.map +1 -0
  139. package/dist/core/experimental.d.ts +2 -0
  140. package/dist/core/experimental.d.ts.map +1 -0
  141. package/dist/core/experimental.js +4 -0
  142. package/dist/core/experimental.js.map +1 -0
  143. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  144. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  145. package/dist/core/export-html/ansi-to-html.js +249 -0
  146. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  147. package/dist/core/export-html/index.d.ts +37 -0
  148. package/dist/core/export-html/index.d.ts.map +1 -0
  149. package/dist/core/export-html/index.js +226 -0
  150. package/dist/core/export-html/index.js.map +1 -0
  151. package/dist/core/export-html/template.css +1066 -0
  152. package/dist/core/export-html/template.html +55 -0
  153. package/dist/core/export-html/template.js +1864 -0
  154. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  155. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  156. package/dist/core/export-html/tool-renderer.js +108 -0
  157. package/dist/core/export-html/tool-renderer.js.map +1 -0
  158. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  159. package/dist/core/export-html/vendor/marked.min.js +6 -0
  160. package/dist/core/extensions/index.d.ts +12 -0
  161. package/dist/core/extensions/index.d.ts.map +1 -0
  162. package/dist/core/extensions/index.js +9 -0
  163. package/dist/core/extensions/index.js.map +1 -0
  164. package/dist/core/extensions/loader.d.ts +24 -0
  165. package/dist/core/extensions/loader.d.ts.map +1 -0
  166. package/dist/core/extensions/loader.js +499 -0
  167. package/dist/core/extensions/loader.js.map +1 -0
  168. package/dist/core/extensions/runner.d.ts +166 -0
  169. package/dist/core/extensions/runner.d.ts.map +1 -0
  170. package/dist/core/extensions/runner.js +896 -0
  171. package/dist/core/extensions/runner.js.map +1 -0
  172. package/dist/core/extensions/types.d.ts +1209 -0
  173. package/dist/core/extensions/types.d.ts.map +1 -0
  174. package/dist/core/extensions/types.js +45 -0
  175. package/dist/core/extensions/types.js.map +1 -0
  176. package/dist/core/extensions/wrapper.d.ts +20 -0
  177. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  178. package/dist/core/extensions/wrapper.js +22 -0
  179. package/dist/core/extensions/wrapper.js.map +1 -0
  180. package/dist/core/footer-data-provider.d.ts +54 -0
  181. package/dist/core/footer-data-provider.d.ts.map +1 -0
  182. package/dist/core/footer-data-provider.js +338 -0
  183. package/dist/core/footer-data-provider.js.map +1 -0
  184. package/dist/core/http-dispatcher.d.ts +21 -0
  185. package/dist/core/http-dispatcher.d.ts.map +1 -0
  186. package/dist/core/http-dispatcher.js +48 -0
  187. package/dist/core/http-dispatcher.js.map +1 -0
  188. package/dist/core/index.d.ts +14 -0
  189. package/dist/core/index.d.ts.map +1 -0
  190. package/dist/core/index.js +14 -0
  191. package/dist/core/index.js.map +1 -0
  192. package/dist/core/keybindings.d.ts +363 -0
  193. package/dist/core/keybindings.d.ts.map +1 -0
  194. package/dist/core/keybindings.js +303 -0
  195. package/dist/core/keybindings.js.map +1 -0
  196. package/dist/core/messages.d.ts +77 -0
  197. package/dist/core/messages.d.ts.map +1 -0
  198. package/dist/core/messages.js +123 -0
  199. package/dist/core/messages.js.map +1 -0
  200. package/dist/core/model-registry.d.ts +161 -0
  201. package/dist/core/model-registry.d.ts.map +1 -0
  202. package/dist/core/model-registry.js +810 -0
  203. package/dist/core/model-registry.js.map +1 -0
  204. package/dist/core/model-resolver.d.ts +111 -0
  205. package/dist/core/model-resolver.d.ts.map +1 -0
  206. package/dist/core/model-resolver.js +513 -0
  207. package/dist/core/model-resolver.js.map +1 -0
  208. package/dist/core/output-guard.d.ts +7 -0
  209. package/dist/core/output-guard.d.ts.map +1 -0
  210. package/dist/core/output-guard.js +89 -0
  211. package/dist/core/output-guard.js.map +1 -0
  212. package/dist/core/package-manager.d.ts +207 -0
  213. package/dist/core/package-manager.d.ts.map +1 -0
  214. package/dist/core/package-manager.js +2074 -0
  215. package/dist/core/package-manager.js.map +1 -0
  216. package/dist/core/primary-agents/discovery.d.ts +4 -0
  217. package/dist/core/primary-agents/discovery.d.ts.map +1 -0
  218. package/dist/core/primary-agents/discovery.js +89 -0
  219. package/dist/core/primary-agents/discovery.js.map +1 -0
  220. package/dist/core/primary-agents/index.d.ts +3 -0
  221. package/dist/core/primary-agents/index.d.ts.map +1 -0
  222. package/dist/core/primary-agents/index.js +2 -0
  223. package/dist/core/primary-agents/index.js.map +1 -0
  224. package/dist/core/primary-agents/types.d.ts +18 -0
  225. package/dist/core/primary-agents/types.d.ts.map +1 -0
  226. package/dist/core/primary-agents/types.js +2 -0
  227. package/dist/core/primary-agents/types.js.map +1 -0
  228. package/dist/core/project-trust.d.ts +15 -0
  229. package/dist/core/project-trust.d.ts.map +1 -0
  230. package/dist/core/project-trust.js +58 -0
  231. package/dist/core/project-trust.js.map +1 -0
  232. package/dist/core/prompt-templates.d.ts +53 -0
  233. package/dist/core/prompt-templates.d.ts.map +1 -0
  234. package/dist/core/prompt-templates.js +236 -0
  235. package/dist/core/prompt-templates.js.map +1 -0
  236. package/dist/core/provider-attribution.d.ts +4 -0
  237. package/dist/core/provider-attribution.d.ts.map +1 -0
  238. package/dist/core/provider-attribution.js +72 -0
  239. package/dist/core/provider-attribution.js.map +1 -0
  240. package/dist/core/provider-display-names.d.ts +2 -0
  241. package/dist/core/provider-display-names.d.ts.map +1 -0
  242. package/dist/core/provider-display-names.js +36 -0
  243. package/dist/core/provider-display-names.js.map +1 -0
  244. package/dist/core/resolve-config-value.d.ts +31 -0
  245. package/dist/core/resolve-config-value.d.ts.map +1 -0
  246. package/dist/core/resolve-config-value.js +249 -0
  247. package/dist/core/resolve-config-value.js.map +1 -0
  248. package/dist/core/resource-loader.d.ts +206 -0
  249. package/dist/core/resource-loader.d.ts.map +1 -0
  250. package/dist/core/resource-loader.js +827 -0
  251. package/dist/core/resource-loader.js.map +1 -0
  252. package/dist/core/sdk.d.ts +111 -0
  253. package/dist/core/sdk.d.ts.map +1 -0
  254. package/dist/core/sdk.js +269 -0
  255. package/dist/core/sdk.js.map +1 -0
  256. package/dist/core/session-cwd.d.ts +19 -0
  257. package/dist/core/session-cwd.d.ts.map +1 -0
  258. package/dist/core/session-cwd.js +38 -0
  259. package/dist/core/session-cwd.js.map +1 -0
  260. package/dist/core/session-manager.d.ts +362 -0
  261. package/dist/core/session-manager.d.ts.map +1 -0
  262. package/dist/core/session-manager.js +1283 -0
  263. package/dist/core/session-manager.js.map +1 -0
  264. package/dist/core/settings-manager.d.ts +309 -0
  265. package/dist/core/settings-manager.d.ts.map +1 -0
  266. package/dist/core/settings-manager.js +907 -0
  267. package/dist/core/settings-manager.js.map +1 -0
  268. package/dist/core/skills.d.ts +60 -0
  269. package/dist/core/skills.d.ts.map +1 -0
  270. package/dist/core/skills.js +387 -0
  271. package/dist/core/skills.js.map +1 -0
  272. package/dist/core/slash-commands.d.ts +14 -0
  273. package/dist/core/slash-commands.d.ts.map +1 -0
  274. package/dist/core/slash-commands.js +30 -0
  275. package/dist/core/slash-commands.js.map +1 -0
  276. package/dist/core/source-info.d.ts +18 -0
  277. package/dist/core/source-info.d.ts.map +1 -0
  278. package/dist/core/source-info.js +19 -0
  279. package/dist/core/source-info.js.map +1 -0
  280. package/dist/core/subagents/discovery.d.ts +9 -0
  281. package/dist/core/subagents/discovery.d.ts.map +1 -0
  282. package/dist/core/subagents/discovery.js +97 -0
  283. package/dist/core/subagents/discovery.js.map +1 -0
  284. package/dist/core/subagents/index.d.ts +5 -0
  285. package/dist/core/subagents/index.d.ts.map +1 -0
  286. package/dist/core/subagents/index.js +4 -0
  287. package/dist/core/subagents/index.js.map +1 -0
  288. package/dist/core/subagents/runner.d.ts +6 -0
  289. package/dist/core/subagents/runner.d.ts.map +1 -0
  290. package/dist/core/subagents/runner.js +406 -0
  291. package/dist/core/subagents/runner.js.map +1 -0
  292. package/dist/core/subagents/tool.d.ts +24 -0
  293. package/dist/core/subagents/tool.d.ts.map +1 -0
  294. package/dist/core/subagents/tool.js +223 -0
  295. package/dist/core/subagents/tool.js.map +1 -0
  296. package/dist/core/subagents/types.d.ts +78 -0
  297. package/dist/core/subagents/types.d.ts.map +1 -0
  298. package/dist/core/subagents/types.js +2 -0
  299. package/dist/core/subagents/types.js.map +1 -0
  300. package/dist/core/system-prompt.d.ts +30 -0
  301. package/dist/core/system-prompt.d.ts.map +1 -0
  302. package/dist/core/system-prompt.js +121 -0
  303. package/dist/core/system-prompt.js.map +1 -0
  304. package/dist/core/telemetry.d.ts +3 -0
  305. package/dist/core/telemetry.d.ts.map +1 -0
  306. package/dist/core/telemetry.js +9 -0
  307. package/dist/core/telemetry.js.map +1 -0
  308. package/dist/core/timings.d.ts +8 -0
  309. package/dist/core/timings.d.ts.map +1 -0
  310. package/dist/core/timings.js +31 -0
  311. package/dist/core/timings.js.map +1 -0
  312. package/dist/core/tool-matcher.d.ts +27 -0
  313. package/dist/core/tool-matcher.d.ts.map +1 -0
  314. package/dist/core/tool-matcher.js +43 -0
  315. package/dist/core/tool-matcher.js.map +1 -0
  316. package/dist/core/tools/bash.d.ts +83 -0
  317. package/dist/core/tools/bash.d.ts.map +1 -0
  318. package/dist/core/tools/bash.js +380 -0
  319. package/dist/core/tools/bash.js.map +1 -0
  320. package/dist/core/tools/edit-diff.d.ts +87 -0
  321. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  322. package/dist/core/tools/edit-diff.js +345 -0
  323. package/dist/core/tools/edit-diff.js.map +1 -0
  324. package/dist/core/tools/edit.d.ts +51 -0
  325. package/dist/core/tools/edit.d.ts.map +1 -0
  326. package/dist/core/tools/edit.js +284 -0
  327. package/dist/core/tools/edit.js.map +1 -0
  328. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  329. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  330. package/dist/core/tools/file-mutation-queue.js +52 -0
  331. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  332. package/dist/core/tools/find.d.ts +35 -0
  333. package/dist/core/tools/find.d.ts.map +1 -0
  334. package/dist/core/tools/find.js +297 -0
  335. package/dist/core/tools/find.js.map +1 -0
  336. package/dist/core/tools/grep.d.ts +37 -0
  337. package/dist/core/tools/grep.d.ts.map +1 -0
  338. package/dist/core/tools/grep.js +304 -0
  339. package/dist/core/tools/grep.js.map +1 -0
  340. package/dist/core/tools/index.d.ts +40 -0
  341. package/dist/core/tools/index.d.ts.map +1 -0
  342. package/dist/core/tools/index.js +112 -0
  343. package/dist/core/tools/index.js.map +1 -0
  344. package/dist/core/tools/ls.d.ts +37 -0
  345. package/dist/core/tools/ls.d.ts.map +1 -0
  346. package/dist/core/tools/ls.js +167 -0
  347. package/dist/core/tools/ls.js.map +1 -0
  348. package/dist/core/tools/output-accumulator.d.ts +52 -0
  349. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  350. package/dist/core/tools/output-accumulator.js +184 -0
  351. package/dist/core/tools/output-accumulator.js.map +1 -0
  352. package/dist/core/tools/path-utils.d.ts +10 -0
  353. package/dist/core/tools/path-utils.d.ts.map +1 -0
  354. package/dist/core/tools/path-utils.js +99 -0
  355. package/dist/core/tools/path-utils.js.map +1 -0
  356. package/dist/core/tools/read.d.ts +35 -0
  357. package/dist/core/tools/read.d.ts.map +1 -0
  358. package/dist/core/tools/read.js +289 -0
  359. package/dist/core/tools/read.js.map +1 -0
  360. package/dist/core/tools/render-utils.d.ts +24 -0
  361. package/dist/core/tools/render-utils.d.ts.map +1 -0
  362. package/dist/core/tools/render-utils.js +65 -0
  363. package/dist/core/tools/render-utils.js.map +1 -0
  364. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  365. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  366. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  367. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  368. package/dist/core/tools/truncate.d.ts +70 -0
  369. package/dist/core/tools/truncate.d.ts.map +1 -0
  370. package/dist/core/tools/truncate.js +215 -0
  371. package/dist/core/tools/truncate.js.map +1 -0
  372. package/dist/core/tools/write.d.ts +26 -0
  373. package/dist/core/tools/write.d.ts.map +1 -0
  374. package/dist/core/tools/write.js +197 -0
  375. package/dist/core/tools/write.js.map +1 -0
  376. package/dist/core/trust-manager.d.ts +31 -0
  377. package/dist/core/trust-manager.d.ts.map +1 -0
  378. package/dist/core/trust-manager.js +187 -0
  379. package/dist/core/trust-manager.js.map +1 -0
  380. package/dist/index.d.ts +33 -0
  381. package/dist/index.d.ts.map +1 -0
  382. package/dist/index.js +46 -0
  383. package/dist/index.js.map +1 -0
  384. package/dist/main.d.ts +12 -0
  385. package/dist/main.d.ts.map +1 -0
  386. package/dist/main.js +665 -0
  387. package/dist/main.js.map +1 -0
  388. package/dist/migrations.d.ts +33 -0
  389. package/dist/migrations.d.ts.map +1 -0
  390. package/dist/migrations.js +403 -0
  391. package/dist/migrations.js.map +1 -0
  392. package/dist/modes/index.d.ts +9 -0
  393. package/dist/modes/index.d.ts.map +1 -0
  394. package/dist/modes/index.js +8 -0
  395. package/dist/modes/index.js.map +1 -0
  396. package/dist/modes/interactive/assets/clankolas.png +0 -0
  397. package/dist/modes/interactive/components/agent-selector.d.ts +21 -0
  398. package/dist/modes/interactive/components/agent-selector.d.ts.map +1 -0
  399. package/dist/modes/interactive/components/agent-selector.js +85 -0
  400. package/dist/modes/interactive/components/agent-selector.js.map +1 -0
  401. package/dist/modes/interactive/components/armin.d.ts +34 -0
  402. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  403. package/dist/modes/interactive/components/armin.js +333 -0
  404. package/dist/modes/interactive/components/armin.js.map +1 -0
  405. package/dist/modes/interactive/components/assistant-message.d.ts +20 -0
  406. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  407. package/dist/modes/interactive/components/assistant-message.js +121 -0
  408. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  409. package/dist/modes/interactive/components/background-process-selector.d.ts +40 -0
  410. package/dist/modes/interactive/components/background-process-selector.d.ts.map +1 -0
  411. package/dist/modes/interactive/components/background-process-selector.js +187 -0
  412. package/dist/modes/interactive/components/background-process-selector.js.map +1 -0
  413. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  414. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  415. package/dist/modes/interactive/components/bash-execution.js +175 -0
  416. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  417. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  418. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  419. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  420. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  421. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  422. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  423. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  424. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  425. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  426. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  427. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  428. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  429. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  430. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  431. package/dist/modes/interactive/components/config-selector.js +506 -0
  432. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  433. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  434. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  435. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  436. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  437. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  438. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  439. package/dist/modes/interactive/components/custom-editor.js +76 -0
  440. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  441. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  442. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  443. package/dist/modes/interactive/components/custom-message.js +79 -0
  444. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  445. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  446. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  447. package/dist/modes/interactive/components/daxnuts.js +140 -0
  448. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  449. package/dist/modes/interactive/components/diff.d.ts +12 -0
  450. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  451. package/dist/modes/interactive/components/diff.js +133 -0
  452. package/dist/modes/interactive/components/diff.js.map +1 -0
  453. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  454. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  455. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  456. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  457. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  458. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  459. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  460. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  461. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  462. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  463. package/dist/modes/interactive/components/extension-editor.js +119 -0
  464. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  465. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  466. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  467. package/dist/modes/interactive/components/extension-input.js +61 -0
  468. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  469. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  470. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  471. package/dist/modes/interactive/components/extension-selector.js +83 -0
  472. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  473. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  474. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  475. package/dist/modes/interactive/components/first-time-setup.js +103 -0
  476. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  477. package/dist/modes/interactive/components/footer.d.ts +28 -0
  478. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  479. package/dist/modes/interactive/components/footer.js +231 -0
  480. package/dist/modes/interactive/components/footer.js.map +1 -0
  481. package/dist/modes/interactive/components/index.d.ts +34 -0
  482. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  483. package/dist/modes/interactive/components/index.js +35 -0
  484. package/dist/modes/interactive/components/index.js.map +1 -0
  485. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  486. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  487. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  488. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  489. package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  490. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  491. package/dist/modes/interactive/components/login-dialog.js +180 -0
  492. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  493. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  494. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/model-selector.js +278 -0
  496. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  497. package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
  498. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/oauth-selector.js +165 -0
  500. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  501. package/dist/modes/interactive/components/plugin-manager.d.ts +67 -0
  502. package/dist/modes/interactive/components/plugin-manager.d.ts.map +1 -0
  503. package/dist/modes/interactive/components/plugin-manager.js +443 -0
  504. package/dist/modes/interactive/components/plugin-manager.js.map +1 -0
  505. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  506. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  507. package/dist/modes/interactive/components/scoped-models-selector.js +290 -0
  508. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  509. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  510. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  511. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  512. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  513. package/dist/modes/interactive/components/session-selector.d.ts +96 -0
  514. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  515. package/dist/modes/interactive/components/session-selector.js +861 -0
  516. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  517. package/dist/modes/interactive/components/settings-selector.d.ts +71 -0
  518. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  519. package/dist/modes/interactive/components/settings-selector.js +410 -0
  520. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  521. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  522. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  523. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  524. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  525. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  526. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  527. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  528. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  529. package/dist/modes/interactive/components/subagent-details.d.ts +63 -0
  530. package/dist/modes/interactive/components/subagent-details.d.ts.map +1 -0
  531. package/dist/modes/interactive/components/subagent-details.js +360 -0
  532. package/dist/modes/interactive/components/subagent-details.js.map +1 -0
  533. package/dist/modes/interactive/components/subagent-overlay.d.ts +51 -0
  534. package/dist/modes/interactive/components/subagent-overlay.d.ts.map +1 -0
  535. package/dist/modes/interactive/components/subagent-overlay.js +324 -0
  536. package/dist/modes/interactive/components/subagent-overlay.js.map +1 -0
  537. package/dist/modes/interactive/components/subagents-panel.d.ts +23 -0
  538. package/dist/modes/interactive/components/subagents-panel.d.ts.map +1 -0
  539. package/dist/modes/interactive/components/subagents-panel.js +192 -0
  540. package/dist/modes/interactive/components/subagents-panel.js.map +1 -0
  541. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  542. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  543. package/dist/modes/interactive/components/theme-selector.js +50 -0
  544. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  545. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  546. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  547. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  548. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  549. package/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  550. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  551. package/dist/modes/interactive/components/tool-execution.js +317 -0
  552. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  553. package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
  554. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  555. package/dist/modes/interactive/components/tree-selector.js +1093 -0
  556. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  557. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  558. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  559. package/dist/modes/interactive/components/trust-selector.js +91 -0
  560. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  561. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  562. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  563. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  564. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  565. package/dist/modes/interactive/components/user-message.d.ts +10 -0
  566. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  567. package/dist/modes/interactive/components/user-message.js +29 -0
  568. package/dist/modes/interactive/components/user-message.js.map +1 -0
  569. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  570. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  571. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  572. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  573. package/dist/modes/interactive/interactive-mode.d.ts +417 -0
  574. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  575. package/dist/modes/interactive/interactive-mode.js +5518 -0
  576. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  577. package/dist/modes/interactive/theme/dark.json +86 -0
  578. package/dist/modes/interactive/theme/light.json +85 -0
  579. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  580. package/dist/modes/interactive/theme/theme.d.ts +100 -0
  581. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  582. package/dist/modes/interactive/theme/theme.js +1034 -0
  583. package/dist/modes/interactive/theme/theme.js.map +1 -0
  584. package/dist/modes/print-mode.d.ts +28 -0
  585. package/dist/modes/print-mode.d.ts.map +1 -0
  586. package/dist/modes/print-mode.js +132 -0
  587. package/dist/modes/print-mode.js.map +1 -0
  588. package/dist/modes/rpc/jsonl.d.ts +17 -0
  589. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  590. package/dist/modes/rpc/jsonl.js +49 -0
  591. package/dist/modes/rpc/jsonl.js.map +1 -0
  592. package/dist/modes/rpc/rpc-client.d.ts +227 -0
  593. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  594. package/dist/modes/rpc/rpc-client.js +467 -0
  595. package/dist/modes/rpc/rpc-client.js.map +1 -0
  596. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  597. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  598. package/dist/modes/rpc/rpc-mode.js +616 -0
  599. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  600. package/dist/modes/rpc/rpc-types.d.ts +420 -0
  601. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  602. package/dist/modes/rpc/rpc-types.js +8 -0
  603. package/dist/modes/rpc/rpc-types.js.map +1 -0
  604. package/dist/package-manager-cli.d.ts +9 -0
  605. package/dist/package-manager-cli.d.ts.map +1 -0
  606. package/dist/package-manager-cli.js +764 -0
  607. package/dist/package-manager-cli.js.map +1 -0
  608. package/dist/utils/ansi.d.ts +2 -0
  609. package/dist/utils/ansi.d.ts.map +1 -0
  610. package/dist/utils/ansi.js +52 -0
  611. package/dist/utils/ansi.js.map +1 -0
  612. package/dist/utils/changelog.d.ts +22 -0
  613. package/dist/utils/changelog.d.ts.map +1 -0
  614. package/dist/utils/changelog.js +165 -0
  615. package/dist/utils/changelog.js.map +1 -0
  616. package/dist/utils/child-process.d.ts +15 -0
  617. package/dist/utils/child-process.d.ts.map +1 -0
  618. package/dist/utils/child-process.js +88 -0
  619. package/dist/utils/child-process.js.map +1 -0
  620. package/dist/utils/clipboard-image.d.ts +11 -0
  621. package/dist/utils/clipboard-image.d.ts.map +1 -0
  622. package/dist/utils/clipboard-image.js +245 -0
  623. package/dist/utils/clipboard-image.js.map +1 -0
  624. package/dist/utils/clipboard-native.d.ts +10 -0
  625. package/dist/utils/clipboard-native.d.ts.map +1 -0
  626. package/dist/utils/clipboard-native.js +20 -0
  627. package/dist/utils/clipboard-native.js.map +1 -0
  628. package/dist/utils/clipboard.d.ts +2 -0
  629. package/dist/utils/clipboard.d.ts.map +1 -0
  630. package/dist/utils/clipboard.js +117 -0
  631. package/dist/utils/clipboard.js.map +1 -0
  632. package/dist/utils/deprecation.d.ts +4 -0
  633. package/dist/utils/deprecation.d.ts.map +1 -0
  634. package/dist/utils/deprecation.js +13 -0
  635. package/dist/utils/deprecation.js.map +1 -0
  636. package/dist/utils/exif-orientation.d.ts +5 -0
  637. package/dist/utils/exif-orientation.d.ts.map +1 -0
  638. package/dist/utils/exif-orientation.js +158 -0
  639. package/dist/utils/exif-orientation.js.map +1 -0
  640. package/dist/utils/frontmatter.d.ts +8 -0
  641. package/dist/utils/frontmatter.d.ts.map +1 -0
  642. package/dist/utils/frontmatter.js +26 -0
  643. package/dist/utils/frontmatter.js.map +1 -0
  644. package/dist/utils/fs-watch.d.ts +5 -0
  645. package/dist/utils/fs-watch.d.ts.map +1 -0
  646. package/dist/utils/fs-watch.js +25 -0
  647. package/dist/utils/fs-watch.js.map +1 -0
  648. package/dist/utils/git.d.ts +26 -0
  649. package/dist/utils/git.d.ts.map +1 -0
  650. package/dist/utils/git.js +195 -0
  651. package/dist/utils/git.js.map +1 -0
  652. package/dist/utils/html.d.ts +7 -0
  653. package/dist/utils/html.d.ts.map +1 -0
  654. package/dist/utils/html.js +40 -0
  655. package/dist/utils/html.js.map +1 -0
  656. package/dist/utils/image-convert.d.ts +9 -0
  657. package/dist/utils/image-convert.d.ts.map +1 -0
  658. package/dist/utils/image-convert.js +39 -0
  659. package/dist/utils/image-convert.js.map +1 -0
  660. package/dist/utils/image-resize-core.d.ts +30 -0
  661. package/dist/utils/image-resize-core.d.ts.map +1 -0
  662. package/dist/utils/image-resize-core.js +124 -0
  663. package/dist/utils/image-resize-core.js.map +1 -0
  664. package/dist/utils/image-resize-worker.d.ts +2 -0
  665. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  666. package/dist/utils/image-resize-worker.js +31 -0
  667. package/dist/utils/image-resize-worker.js.map +1 -0
  668. package/dist/utils/image-resize.d.ts +16 -0
  669. package/dist/utils/image-resize.d.ts.map +1 -0
  670. package/dist/utils/image-resize.js +97 -0
  671. package/dist/utils/image-resize.js.map +1 -0
  672. package/dist/utils/json.d.ts +3 -0
  673. package/dist/utils/json.d.ts.map +1 -0
  674. package/dist/utils/json.js +7 -0
  675. package/dist/utils/json.js.map +1 -0
  676. package/dist/utils/mime.d.ts +3 -0
  677. package/dist/utils/mime.d.ts.map +1 -0
  678. package/dist/utils/mime.js +69 -0
  679. package/dist/utils/mime.js.map +1 -0
  680. package/dist/utils/open-browser.d.ts +9 -0
  681. package/dist/utils/open-browser.d.ts.map +1 -0
  682. package/dist/utils/open-browser.js +22 -0
  683. package/dist/utils/open-browser.js.map +1 -0
  684. package/dist/utils/paths.d.ts +31 -0
  685. package/dist/utils/paths.d.ts.map +1 -0
  686. package/dist/utils/paths.js +92 -0
  687. package/dist/utils/paths.js.map +1 -0
  688. package/dist/utils/photon.d.ts +21 -0
  689. package/dist/utils/photon.d.ts.map +1 -0
  690. package/dist/utils/photon.js +121 -0
  691. package/dist/utils/photon.js.map +1 -0
  692. package/dist/utils/pi-user-agent.d.ts +2 -0
  693. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  694. package/dist/utils/pi-user-agent.js +5 -0
  695. package/dist/utils/pi-user-agent.js.map +1 -0
  696. package/dist/utils/shell.d.ts +30 -0
  697. package/dist/utils/shell.d.ts.map +1 -0
  698. package/dist/utils/shell.js +195 -0
  699. package/dist/utils/shell.js.map +1 -0
  700. package/dist/utils/sleep.d.ts +5 -0
  701. package/dist/utils/sleep.d.ts.map +1 -0
  702. package/dist/utils/sleep.js +17 -0
  703. package/dist/utils/sleep.js.map +1 -0
  704. package/dist/utils/syntax-highlight.d.ts +12 -0
  705. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  706. package/dist/utils/syntax-highlight.js +118 -0
  707. package/dist/utils/syntax-highlight.js.map +1 -0
  708. package/dist/utils/tools-manager.d.ts +3 -0
  709. package/dist/utils/tools-manager.d.ts.map +1 -0
  710. package/dist/utils/tools-manager.js +328 -0
  711. package/dist/utils/tools-manager.js.map +1 -0
  712. package/dist/utils/version-check.d.ts +15 -0
  713. package/dist/utils/version-check.d.ts.map +1 -0
  714. package/dist/utils/version-check.js +82 -0
  715. package/dist/utils/version-check.js.map +1 -0
  716. package/dist/utils/windows-self-update.d.ts +3 -0
  717. package/dist/utils/windows-self-update.d.ts.map +1 -0
  718. package/dist/utils/windows-self-update.js +77 -0
  719. package/dist/utils/windows-self-update.js.map +1 -0
  720. package/docs/compaction.md +394 -0
  721. package/docs/containerization.md +111 -0
  722. package/docs/custom-provider.md +736 -0
  723. package/docs/development.md +71 -0
  724. package/docs/docs.json +172 -0
  725. package/docs/extensions.md +2657 -0
  726. package/docs/images/doom-extension.png +0 -0
  727. package/docs/images/exy.png +0 -0
  728. package/docs/images/interactive-mode.png +0 -0
  729. package/docs/images/tree-view.png +0 -0
  730. package/docs/index.md +86 -0
  731. package/docs/json.md +82 -0
  732. package/docs/keybindings.md +199 -0
  733. package/docs/mcp.md +476 -0
  734. package/docs/models.md +604 -0
  735. package/docs/packages.md +228 -0
  736. package/docs/plugins.md +48 -0
  737. package/docs/primary-agents.md +272 -0
  738. package/docs/prompt-templates.md +95 -0
  739. package/docs/providers.md +256 -0
  740. package/docs/quickstart.md +165 -0
  741. package/docs/rpc.md +1408 -0
  742. package/docs/sdk.md +1161 -0
  743. package/docs/security.md +55 -0
  744. package/docs/session-format.md +412 -0
  745. package/docs/sessions.md +145 -0
  746. package/docs/settings.md +317 -0
  747. package/docs/shell-aliases.md +13 -0
  748. package/docs/skills.md +231 -0
  749. package/docs/subagents.md +334 -0
  750. package/docs/terminal-setup.md +148 -0
  751. package/docs/termux.md +127 -0
  752. package/docs/themes.md +295 -0
  753. package/docs/tmux.md +63 -0
  754. package/docs/tui.md +927 -0
  755. package/docs/usage.md +328 -0
  756. package/docs/windows.md +17 -0
  757. package/examples/README.md +25 -0
  758. package/examples/extensions/README.md +211 -0
  759. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  760. package/examples/extensions/bash-spawn-hook.ts +30 -0
  761. package/examples/extensions/bookmark.ts +50 -0
  762. package/examples/extensions/border-status-editor.ts +150 -0
  763. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  764. package/examples/extensions/claude-rules.ts +86 -0
  765. package/examples/extensions/commands.ts +72 -0
  766. package/examples/extensions/confirm-destructive.ts +59 -0
  767. package/examples/extensions/custom-compaction.ts +127 -0
  768. package/examples/extensions/custom-footer.ts +64 -0
  769. package/examples/extensions/custom-header.ts +73 -0
  770. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  771. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  772. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  773. package/examples/extensions/custom-provider-gitlab-duo/index.ts +400 -0
  774. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  775. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  776. package/examples/extensions/dirty-repo-guard.ts +56 -0
  777. package/examples/extensions/doom-overlay/README.md +46 -0
  778. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  779. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  780. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  781. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  782. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  783. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  784. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  785. package/examples/extensions/doom-overlay/index.ts +74 -0
  786. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  787. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  788. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  789. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  790. package/examples/extensions/dynamic-resources/index.ts +15 -0
  791. package/examples/extensions/dynamic-tools.ts +74 -0
  792. package/examples/extensions/event-bus.ts +43 -0
  793. package/examples/extensions/file-trigger.ts +41 -0
  794. package/examples/extensions/git-checkpoint.ts +53 -0
  795. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  796. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  797. package/examples/extensions/gondolin/index.ts +531 -0
  798. package/examples/extensions/gondolin/package-lock.json +185 -0
  799. package/examples/extensions/gondolin/package.json +19 -0
  800. package/examples/extensions/handoff.ts +191 -0
  801. package/examples/extensions/hello.ts +26 -0
  802. package/examples/extensions/hidden-thinking-label.ts +53 -0
  803. package/examples/extensions/inline-bash.ts +94 -0
  804. package/examples/extensions/input-transform-streaming.ts +39 -0
  805. package/examples/extensions/input-transform.ts +43 -0
  806. package/examples/extensions/interactive-shell.ts +196 -0
  807. package/examples/extensions/mac-system-theme.ts +47 -0
  808. package/examples/extensions/message-renderer.ts +59 -0
  809. package/examples/extensions/minimal-mode.ts +426 -0
  810. package/examples/extensions/modal-editor.ts +85 -0
  811. package/examples/extensions/model-status.ts +31 -0
  812. package/examples/extensions/notify.ts +55 -0
  813. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  814. package/examples/extensions/overlay-test.ts +153 -0
  815. package/examples/extensions/permission-gate.ts +34 -0
  816. package/examples/extensions/pirate.ts +47 -0
  817. package/examples/extensions/preset.ts +430 -0
  818. package/examples/extensions/project-trust.ts +64 -0
  819. package/examples/extensions/prompt-customizer.ts +97 -0
  820. package/examples/extensions/protected-paths.ts +30 -0
  821. package/examples/extensions/provider-payload.ts +18 -0
  822. package/examples/extensions/qna.ts +122 -0
  823. package/examples/extensions/question.ts +264 -0
  824. package/examples/extensions/questionnaire.ts +427 -0
  825. package/examples/extensions/rainbow-editor.ts +88 -0
  826. package/examples/extensions/reload-runtime.ts +37 -0
  827. package/examples/extensions/rpc-demo.ts +118 -0
  828. package/examples/extensions/sandbox/index.ts +321 -0
  829. package/examples/extensions/sandbox/package-lock.json +92 -0
  830. package/examples/extensions/sandbox/package.json +19 -0
  831. package/examples/extensions/send-user-message.ts +97 -0
  832. package/examples/extensions/session-name.ts +27 -0
  833. package/examples/extensions/shutdown-command.ts +63 -0
  834. package/examples/extensions/snake.ts +343 -0
  835. package/examples/extensions/space-invaders.ts +560 -0
  836. package/examples/extensions/ssh.ts +220 -0
  837. package/examples/extensions/status-line.ts +32 -0
  838. package/examples/extensions/structured-output.ts +65 -0
  839. package/examples/extensions/subagent/README.md +175 -0
  840. package/examples/extensions/subagent/agents/planner.md +37 -0
  841. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  842. package/examples/extensions/subagent/agents/scout.md +50 -0
  843. package/examples/extensions/subagent/agents/worker.md +24 -0
  844. package/examples/extensions/subagent/agents.ts +126 -0
  845. package/examples/extensions/subagent/index.ts +1009 -0
  846. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  847. package/examples/extensions/subagent/prompts/implement.md +10 -0
  848. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  849. package/examples/extensions/summarize.ts +206 -0
  850. package/examples/extensions/system-prompt-header.ts +17 -0
  851. package/examples/extensions/tic-tac-toe.ts +1008 -0
  852. package/examples/extensions/timed-confirm.ts +70 -0
  853. package/examples/extensions/titlebar-spinner.ts +58 -0
  854. package/examples/extensions/todo.ts +297 -0
  855. package/examples/extensions/tool-override.ts +144 -0
  856. package/examples/extensions/tools.ts +146 -0
  857. package/examples/extensions/trigger-compact.ts +50 -0
  858. package/examples/extensions/truncated-tool.ts +195 -0
  859. package/examples/extensions/widget-placement.ts +9 -0
  860. package/examples/extensions/with-deps/index.ts +32 -0
  861. package/examples/extensions/with-deps/package-lock.json +31 -0
  862. package/examples/extensions/with-deps/package.json +22 -0
  863. package/examples/extensions/working-indicator.ts +123 -0
  864. package/examples/extensions/working-message-test.ts +25 -0
  865. package/examples/rpc-extension-ui.ts +632 -0
  866. package/examples/sdk/01-minimal.ts +26 -0
  867. package/examples/sdk/02-custom-model.ts +53 -0
  868. package/examples/sdk/03-custom-prompt.ts +70 -0
  869. package/examples/sdk/04-skills.ts +55 -0
  870. package/examples/sdk/05-tools.ts +48 -0
  871. package/examples/sdk/06-extensions.ts +94 -0
  872. package/examples/sdk/07-context-files.ts +42 -0
  873. package/examples/sdk/08-prompt-templates.ts +51 -0
  874. package/examples/sdk/09-api-keys-and-oauth.ts +52 -0
  875. package/examples/sdk/10-settings.ts +53 -0
  876. package/examples/sdk/11-sessions.ts +52 -0
  877. package/examples/sdk/12-full-control.ts +77 -0
  878. package/examples/sdk/13-session-runtime.ts +67 -0
  879. package/examples/sdk/README.md +144 -0
  880. package/npm-shrinkwrap.json +1806 -0
  881. package/package.json +96 -0
@@ -0,0 +1,97 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { basename, dirname, join } from "node:path";
3
+ import { parseFrontmatter } from "../../utils/frontmatter.js";
4
+ const VALID_THINKING = new Set(["off", "minimal", "low", "medium", "high", "xhigh"]);
5
+ const BUILT_IN_SUBAGENTS = [
6
+ {
7
+ name: "explorer",
8
+ description: "Fast parallel search for discovery. Returns locations and summaries, not full content.",
9
+ prompt: "You are an explorer subagent. Run parallel searches to discover files, patterns, or facts. Return only locations and concise summaries — never full file contents. Use when the main agent needs to find something but doesn't know where. Cost-optimized: prefer lightweight queries, stop early when found. Delegate to this subagent when discovery is needed; handle known paths directly in the main agent.",
10
+ scope: "builtin",
11
+ thinking: "low",
12
+ includedTools: ["read", "grep", "find", "ls"],
13
+ },
14
+ {
15
+ name: "worker",
16
+ description: "Execute a unit-scoped task with full tool access. Independent execution sandbox.",
17
+ prompt: "You are a worker subagent. Execute the assigned unit-scoped task with full tool access. Work independently, keep changes focused, and report results with evidence. Suitable for any bounded task: file operations, shell commands, data processing, or multi-step workflows. Not limited to code — handle any concrete task the main agent delegates.",
18
+ scope: "builtin",
19
+ includedTools: ["read", "bash", "edit", "write", "grep", "find", "ls"],
20
+ },
21
+ ];
22
+ function isThinkingLevel(value) {
23
+ return typeof value === "string" && VALID_THINKING.has(value);
24
+ }
25
+ function stringArray(value) {
26
+ if (!Array.isArray(value)) {
27
+ return undefined;
28
+ }
29
+ const strings = value.filter((item) => typeof item === "string" && item.trim().length > 0);
30
+ return strings;
31
+ }
32
+ function readAgentFile(path, scope) {
33
+ const content = readFileSync(path, "utf8");
34
+ const parsed = parseFrontmatter(content);
35
+ const name = basename(path, ".md");
36
+ return {
37
+ name,
38
+ description: typeof parsed.frontmatter.description === "string" ? parsed.frontmatter.description : name,
39
+ prompt: parsed.body,
40
+ scope,
41
+ sourcePath: path,
42
+ model: typeof parsed.frontmatter.model === "string" ? parsed.frontmatter.model : undefined,
43
+ thinking: isThinkingLevel(parsed.frontmatter.thinking) ? parsed.frontmatter.thinking : undefined,
44
+ includedTools: (() => {
45
+ const parsedIncluded = stringArray(parsed.frontmatter.includedTools);
46
+ const parsedLegacy = stringArray(parsed.frontmatter.tools);
47
+ return parsedIncluded !== undefined ? parsedIncluded : parsedLegacy;
48
+ })(),
49
+ excludedTools: stringArray(parsed.frontmatter.excludedTools),
50
+ skills: stringArray(parsed.frontmatter.skills),
51
+ };
52
+ }
53
+ function loadAgentDir(path, scope) {
54
+ if (!existsSync(path)) {
55
+ return [];
56
+ }
57
+ const entries = readdirSync(path, { withFileTypes: true });
58
+ return entries
59
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".md"))
60
+ .map((entry) => readAgentFile(join(path, entry.name), scope));
61
+ }
62
+ function findNearestProjectSubagentsDir(cwd) {
63
+ let current = cwd;
64
+ for (;;) {
65
+ const candidate = join(current, ".pi", "subagents");
66
+ if (existsSync(candidate) && statSync(candidate).isDirectory()) {
67
+ return candidate;
68
+ }
69
+ const parent = dirname(current);
70
+ if (parent === current) {
71
+ return undefined;
72
+ }
73
+ current = parent;
74
+ }
75
+ }
76
+ function mergeAgents(groups) {
77
+ const merged = new Map();
78
+ for (const group of groups) {
79
+ for (const agent of group) {
80
+ merged.set(agent.name, agent);
81
+ }
82
+ }
83
+ return Array.from(merged.values()).sort((a, b) => a.name.localeCompare(b.name));
84
+ }
85
+ export function discoverSubagentsSync(options) {
86
+ const scope = options.scope ?? "user";
87
+ const builtIn = BUILT_IN_SUBAGENTS.map((agent) => ({ ...agent }));
88
+ const user = loadAgentDir(join(options.agentDir, "subagents"), "user");
89
+ const shouldLoadProject = scope === "project" || scope === "both";
90
+ const projectDir = shouldLoadProject ? findNearestProjectSubagentsDir(options.cwd) : undefined;
91
+ const project = projectDir ? loadAgentDir(projectDir, "project") : [];
92
+ return mergeAgents([builtIn, user, project]);
93
+ }
94
+ export async function discoverSubagents(options) {
95
+ return discoverSubagentsSync(options);
96
+ }
97
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/core/subagents/discovery.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport type { ThinkingLevel } from \"@schovest/pi-agent-core\";\nimport { parseFrontmatter } from \"../../utils/frontmatter.ts\";\nimport type { SubagentDefinition, SubagentDefinitionScope, SubagentScope } from \"./types.ts\";\n\ninterface AgentFrontmatter extends Record<string, unknown> {\n\tdescription?: unknown;\n\tmodel?: unknown;\n\tthinking?: unknown;\n\ttools?: unknown; // deprecated, mapped to includedTools\n\tincludedTools?: unknown;\n\texcludedTools?: unknown;\n\tskills?: unknown;\n}\n\nexport interface DiscoverSubagentsOptions {\n\tcwd: string;\n\tagentDir: string;\n\tscope?: SubagentScope;\n}\n\nconst VALID_THINKING = new Set<ThinkingLevel>([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"]);\n\nconst BUILT_IN_SUBAGENTS: SubagentDefinition[] = [\n\t{\n\t\tname: \"explorer\",\n\t\tdescription: \"Fast parallel search for discovery. Returns locations and summaries, not full content.\",\n\t\tprompt:\n\t\t\t\"You are an explorer subagent. Run parallel searches to discover files, patterns, or facts. Return only locations and concise summaries — never full file contents. Use when the main agent needs to find something but doesn't know where. Cost-optimized: prefer lightweight queries, stop early when found. Delegate to this subagent when discovery is needed; handle known paths directly in the main agent.\",\n\t\tscope: \"builtin\",\n\t\tthinking: \"low\",\n\t\tincludedTools: [\"read\", \"grep\", \"find\", \"ls\"],\n\t},\n\t{\n\t\tname: \"worker\",\n\t\tdescription: \"Execute a unit-scoped task with full tool access. Independent execution sandbox.\",\n\t\tprompt:\n\t\t\t\"You are a worker subagent. Execute the assigned unit-scoped task with full tool access. Work independently, keep changes focused, and report results with evidence. Suitable for any bounded task: file operations, shell commands, data processing, or multi-step workflows. Not limited to code — handle any concrete task the main agent delegates.\",\n\t\tscope: \"builtin\",\n\t\tincludedTools: [\"read\", \"bash\", \"edit\", \"write\", \"grep\", \"find\", \"ls\"],\n\t},\n];\n\nfunction isThinkingLevel(value: unknown): value is ThinkingLevel {\n\treturn typeof value === \"string\" && VALID_THINKING.has(value as ThinkingLevel);\n}\n\nfunction stringArray(value: unknown): string[] | undefined {\n\tif (!Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\tconst strings = value.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0);\n\treturn strings;\n}\n\nfunction readAgentFile(path: string, scope: SubagentDefinitionScope): SubagentDefinition {\n\tconst content = readFileSync(path, \"utf8\");\n\tconst parsed = parseFrontmatter<AgentFrontmatter>(content);\n\tconst name = basename(path, \".md\");\n\treturn {\n\t\tname,\n\t\tdescription: typeof parsed.frontmatter.description === \"string\" ? parsed.frontmatter.description : name,\n\t\tprompt: parsed.body,\n\t\tscope,\n\t\tsourcePath: path,\n\t\tmodel: typeof parsed.frontmatter.model === \"string\" ? parsed.frontmatter.model : undefined,\n\t\tthinking: isThinkingLevel(parsed.frontmatter.thinking) ? parsed.frontmatter.thinking : undefined,\n\t\tincludedTools: (() => {\n\t\t\tconst parsedIncluded = stringArray(parsed.frontmatter.includedTools);\n\t\t\tconst parsedLegacy = stringArray(parsed.frontmatter.tools);\n\t\t\treturn parsedIncluded !== undefined ? parsedIncluded : parsedLegacy;\n\t\t})(),\n\t\texcludedTools: stringArray(parsed.frontmatter.excludedTools),\n\t\tskills: stringArray(parsed.frontmatter.skills),\n\t};\n}\n\nfunction loadAgentDir(path: string, scope: SubagentDefinitionScope): SubagentDefinition[] {\n\tif (!existsSync(path)) {\n\t\treturn [];\n\t}\n\tconst entries = readdirSync(path, { withFileTypes: true });\n\treturn entries\n\t\t.filter((entry) => entry.isFile() && entry.name.endsWith(\".md\"))\n\t\t.map((entry) => readAgentFile(join(path, entry.name), scope));\n}\n\nfunction findNearestProjectSubagentsDir(cwd: string): string | undefined {\n\tlet current = cwd;\n\tfor (;;) {\n\t\tconst candidate = join(current, \".pi\", \"subagents\");\n\t\tif (existsSync(candidate) && statSync(candidate).isDirectory()) {\n\t\t\treturn candidate;\n\t\t}\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcurrent = parent;\n\t}\n}\n\nfunction mergeAgents(groups: SubagentDefinition[][]): SubagentDefinition[] {\n\tconst merged = new Map<string, SubagentDefinition>();\n\tfor (const group of groups) {\n\t\tfor (const agent of group) {\n\t\t\tmerged.set(agent.name, agent);\n\t\t}\n\t}\n\treturn Array.from(merged.values()).sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function discoverSubagentsSync(options: DiscoverSubagentsOptions): SubagentDefinition[] {\n\tconst scope = options.scope ?? \"user\";\n\tconst builtIn = BUILT_IN_SUBAGENTS.map((agent) => ({ ...agent }));\n\tconst user = loadAgentDir(join(options.agentDir, \"subagents\"), \"user\");\n\tconst shouldLoadProject = scope === \"project\" || scope === \"both\";\n\tconst projectDir = shouldLoadProject ? findNearestProjectSubagentsDir(options.cwd) : undefined;\n\tconst project = projectDir ? loadAgentDir(projectDir, \"project\") : [];\n\treturn mergeAgents([builtIn, user, project]);\n}\n\nexport async function discoverSubagents(options: DiscoverSubagentsOptions): Promise<SubagentDefinition[]> {\n\treturn discoverSubagentsSync(options);\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export { discoverSubagents, discoverSubagentsSync } from "./discovery.ts";
2
+ export { runSubagents } from "./runner.ts";
3
+ export { createSubagentToolDefinition } from "./tool.ts";
4
+ export type { SubagentDefinition, SubagentDefinitionScope, SubagentRunEvent, SubagentRunMode, SubagentRunOptions, SubagentRunRequest, SubagentRunResult, SubagentRunStatus, SubagentScope, SubagentTask, SubagentTaskResult, } from "./types.ts";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/subagents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AACzD,YAAY,EACX,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,kBAAkB,GAClB,MAAM,YAAY,CAAC","sourcesContent":["export { discoverSubagents, discoverSubagentsSync } from \"./discovery.ts\";\nexport { runSubagents } from \"./runner.ts\";\nexport { createSubagentToolDefinition } from \"./tool.ts\";\nexport type {\n\tSubagentDefinition,\n\tSubagentDefinitionScope,\n\tSubagentRunEvent,\n\tSubagentRunMode,\n\tSubagentRunOptions,\n\tSubagentRunRequest,\n\tSubagentRunResult,\n\tSubagentRunStatus,\n\tSubagentScope,\n\tSubagentTask,\n\tSubagentTaskResult,\n} from \"./types.ts\";\n"]}
@@ -0,0 +1,4 @@
1
+ export { discoverSubagents, discoverSubagentsSync } from "./discovery.js";
2
+ export { runSubagents } from "./runner.js";
3
+ export { createSubagentToolDefinition } from "./tool.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/subagents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC","sourcesContent":["export { discoverSubagents, discoverSubagentsSync } from \"./discovery.ts\";\nexport { runSubagents } from \"./runner.ts\";\nexport { createSubagentToolDefinition } from \"./tool.ts\";\nexport type {\n\tSubagentDefinition,\n\tSubagentDefinitionScope,\n\tSubagentRunEvent,\n\tSubagentRunMode,\n\tSubagentRunOptions,\n\tSubagentRunRequest,\n\tSubagentRunResult,\n\tSubagentRunStatus,\n\tSubagentScope,\n\tSubagentTask,\n\tSubagentTaskResult,\n} from \"./types.ts\";\n"]}
@@ -0,0 +1,6 @@
1
+ import type { Model } from "@schovest/pi-ai";
2
+ import type { AgentSession } from "../agent-session.ts";
3
+ import type { SubagentRunOptions, SubagentRunRequest, SubagentRunResult } from "./types.ts";
4
+ export declare function runSubagents(session: AgentSession, request: SubagentRunRequest, options?: SubagentRunOptions): Promise<SubagentRunResult>;
5
+ export declare function modelMatches(a: Model<any> | undefined, b: Model<any> | undefined): boolean;
6
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/core/subagents/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,OAAO,KAAK,EAGX,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EAGjB,MAAM,YAAY,CAAC;AA4ZpB,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,GAAE,kBAAuB,GAC9B,OAAO,CAAC,iBAAiB,CAAC,CAyD5B;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAE1F","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@schovest/pi-agent-core\";\nimport type { Model, Usage } from \"@schovest/pi-ai\";\nimport { clampThinkingLevel, modelsAreEqual } from \"@schovest/pi-ai\";\nimport type { AgentSession } from \"../agent-session.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../defaults.ts\";\nimport { resolveActiveSkills, resolveActiveTools } from \"../tool-matcher.ts\";\nimport { discoverSubagents } from \"./discovery.ts\";\nimport type {\n\tSubagentDefinition,\n\tSubagentRunEvent,\n\tSubagentRunOptions,\n\tSubagentRunRequest,\n\tSubagentRunResult,\n\tSubagentTask,\n\tSubagentTaskResult,\n} from \"./types.ts\";\n\nconst MAX_PARALLEL_TASKS = 8;\nconst PARALLEL_CONCURRENCY = 4;\n\ninterface ResolvedTask {\n\tindex: number;\n\tdefinition: SubagentDefinition;\n\ttask: SubagentTask;\n\ttitle: string;\n\tmodel: Model<any>;\n\tthinking: ThinkingLevel;\n\ttools: string[];\n\tskills: string[];\n\tprompt: string;\n}\n\nfunction textFromMessage(message: AgentMessage): string {\n\tif (message.role !== \"assistant\") {\n\t\treturn \"\";\n\t}\n\treturn message.content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nfunction lastAssistantText(messages: AgentMessage[]): string {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst text = textFromMessage(messages[index]);\n\t\tif (text) {\n\t\t\treturn text;\n\t\t}\n\t}\n\treturn \"\";\n}\n\nfunction lastAssistantError(messages: AgentMessage[]): string | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index];\n\t\tif (message.role === \"assistant\" && message.errorMessage) {\n\t\t\treturn message.errorMessage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction usageFromMessages(messages: AgentMessage[]): Usage | undefined {\n\tlet aggregate: Usage | undefined;\n\tfor (const message of messages) {\n\t\tif (message.role !== \"assistant\") continue;\n\t\tconst usage = message.usage;\n\t\tif (!usage) continue;\n\t\tif (!aggregate) {\n\t\t\taggregate = {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t};\n\t\t}\n\t\taggregate.input += usage.input;\n\t\taggregate.output += usage.output;\n\t\taggregate.cacheRead += usage.cacheRead;\n\t\taggregate.cacheWrite += usage.cacheWrite;\n\t\taggregate.totalTokens += usage.totalTokens;\n\t\taggregate.cost.input += usage.cost.input;\n\t\taggregate.cost.output += usage.cost.output;\n\t\taggregate.cost.cacheRead += usage.cost.cacheRead;\n\t\taggregate.cost.cacheWrite += usage.cost.cacheWrite;\n\t\taggregate.cost.total += usage.cost.total;\n\t}\n\treturn aggregate;\n}\n\nfunction formatModel(model: Model<any>): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nfunction resolveModel(session: AgentSession, requested: string | undefined): Model<any> {\n\tif (requested) {\n\t\tconst slashIndex = requested.indexOf(\"/\");\n\t\tconst model =\n\t\t\tslashIndex === -1\n\t\t\t\t? session.modelRegistry.getAll().find((candidate) => candidate.id === requested)\n\t\t\t\t: session.modelRegistry.find(requested.slice(0, slashIndex), requested.slice(slashIndex + 1));\n\t\tif (!model) {\n\t\t\tthrow new Error(`Unknown subagent model: ${requested}`);\n\t\t}\n\t\treturn model;\n\t}\n\n\tconst defaultProvider = session.settingsManager.getDefaultProvider();\n\tconst defaultModel = session.settingsManager.getDefaultModel();\n\tif (defaultProvider && defaultModel) {\n\t\tconst model = session.modelRegistry.find(defaultProvider, defaultModel);\n\t\tif (model && session.modelRegistry.hasConfiguredAuth(model)) {\n\t\t\treturn model;\n\t\t}\n\t}\n\n\tif (!session.model) {\n\t\tthrow new Error(\"No model selected for subagent run\");\n\t}\n\treturn session.model;\n}\n\nfunction resolveThinking(\n\tsession: AgentSession,\n\tmodel: Model<any>,\n\ttask: SubagentTask,\n\tdefinition: SubagentDefinition,\n): ThinkingLevel {\n\tconst requested =\n\t\ttask.thinking ??\n\t\tdefinition.thinking ??\n\t\tsession.settingsManager.getDefaultThinkingLevel() ??\n\t\tDEFAULT_THINKING_LEVEL;\n\treturn clampThinkingLevel(model, requested) as ThinkingLevel;\n}\n\nfunction buildPrompt(definition: SubagentDefinition, task: string): string {\n\treturn [`You are the \"${definition.name}\" subagent.`, definition.prompt, `Task:\\n${task}`].join(\"\\n\\n\");\n}\n\nasync function resolveTask(\n\tsession: AgentSession,\n\tdefinitions: Map<string, SubagentDefinition>,\n\ttask: SubagentTask,\n\tindex: number,\n\tallToolNames: string[],\n): Promise<ResolvedTask | SubagentTaskResult> {\n\tconst definition = definitions.get(task.agent);\n\tif (!definition) {\n\t\tconst available = [...definitions.keys()].join(\", \");\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: task.agent,\n\t\t\ttask: task.task,\n\t\t\ttitle: task.title,\n\t\t\tstatus: \"failed\",\n\t\t\toutput: \"\",\n\t\t\terror: `Unknown subagent: ${task.agent}. Available: ${available}`,\n\t\t\tmessages: [],\n\t\t\tevents: [],\n\t\t};\n\t}\n\ttry {\n\t\tconst model = resolveModel(session, task.model ?? definition.model);\n\t\tconst thinking = resolveThinking(session, model, task, definition);\n\t\tconst includedTools = task.includedTools ?? definition.includedTools;\n\t\tconst excludedTools = task.excludedTools ?? definition.excludedTools;\n\t\tconst skillsPatterns = task.skills ?? definition.skills;\n\t\tconst resolvedTools = resolveActiveTools(allToolNames, includedTools, excludedTools, [\n\t\t\t\"read\",\n\t\t\t\"bash\",\n\t\t\t\"edit\",\n\t\t\t\"write\",\n\t\t]);\n\t\treturn {\n\t\t\tindex,\n\t\t\tdefinition,\n\t\t\ttask,\n\t\t\ttitle: task.title,\n\t\t\tmodel,\n\t\t\tthinking,\n\t\t\ttools: resolvedTools,\n\t\t\tskills: skillsPatterns ?? [],\n\t\t\tprompt: buildPrompt(definition, task.task),\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: definition.name,\n\t\t\ttask: task.task,\n\t\t\ttitle: task.title,\n\t\t\tstatus: \"failed\",\n\t\t\toutput: \"\",\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tmessages: [],\n\t\t\tevents: [],\n\t\t};\n\t}\n}\n\nfunction createEvent(\n\trunId: string,\n\tresolved: ResolvedTask,\n\tstatus: SubagentRunEvent[\"status\"],\n\toverrides: Partial<SubagentRunEvent> = {},\n): SubagentRunEvent {\n\treturn {\n\t\trunId,\n\t\tindex: resolved.index,\n\t\tagent: resolved.definition.name,\n\t\ttask: resolved.task.task,\n\t\ttitle: resolved.title,\n\t\tstatus,\n\t\tmodel: formatModel(resolved.model),\n\t\tthinking: resolved.thinking,\n\t\ttimestamp: Date.now(),\n\t\t...overrides,\n\t};\n}\n\nfunction summarizeUnknown(value: unknown, maxLength = 240): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tconst text = typeof value === \"string\" ? value : JSON.stringify(value);\n\t\treturn text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;\n\t} catch {\n\t\treturn String(value);\n\t}\n}\n\nfunction textFromToolResult(result: unknown): string | undefined {\n\tif (!result || typeof result !== \"object\" || !(\"content\" in result)) {\n\t\treturn undefined;\n\t}\n\tconst content = (result as { content?: unknown }).content;\n\tif (!Array.isArray(content)) {\n\t\treturn undefined;\n\t}\n\tconst text = content\n\t\t.flatMap((part) => {\n\t\t\tif (!part || typeof part !== \"object\") {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst candidate = part as { type?: unknown; text?: unknown };\n\t\t\treturn candidate.type === \"text\" && typeof candidate.text === \"string\" ? [candidate.text] : [];\n\t\t})\n\t\t.join(\"\\n\");\n\treturn summarizeUnknown(text);\n}\n\nfunction countToolCalls(events: SubagentRunEvent[]): number {\n\treturn events.filter((e) => e.currentTool && e.currentToolArgs).length;\n}\n\nasync function runOne(\n\tsession: AgentSession,\n\trunId: string,\n\tresolved: ResolvedTask,\n\toptions: SubagentRunOptions,\n): Promise<SubagentTaskResult> {\n\tconst events: SubagentRunEvent[] = [];\n\tconst emit = (event: SubagentRunEvent): void => {\n\t\tevents.push(event);\n\t\tsession.recordSubagentRunEvent(event);\n\t\toptions.onEvent?.(event, child);\n\t};\n\n\tconst allSkills = session.resourceLoader.getSkills().skills;\n\tconst resolvedSkills = resolveActiveSkills(allSkills, resolved.skills.length > 0 ? resolved.skills : undefined);\n\n\tconst child = session.createSubagentChildSession({\n\t\tmodel: resolved.model,\n\t\tthinkingLevel: resolved.thinking,\n\t\ttools: resolved.tools,\n\t\tskills: resolvedSkills,\n\t});\n\tconst unsubscribe = child.subscribe((event) => {\n\t\tif (event.type === \"tool_execution_start\" || event.type === \"tool_execution_update\") {\n\t\t\temit(\n\t\t\t\tcreateEvent(runId, resolved, \"running\", {\n\t\t\t\t\tcurrentTool: event.toolName,\n\t\t\t\t\tcurrentToolArgs: summarizeUnknown(event.args),\n\t\t\t\t}),\n\t\t\t);\n\t\t} else if (event.type === \"tool_execution_end\") {\n\t\t\temit(\n\t\t\t\tcreateEvent(runId, resolved, \"running\", {\n\t\t\t\t\tcurrentTool: event.toolName,\n\t\t\t\t\ttoolResultSummary: textFromToolResult(event.result),\n\t\t\t\t\terror: event.isError ? textFromToolResult(event.result) : undefined,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else if (event.type === \"message_update\" && event.message.role === \"assistant\") {\n\t\t\tconst outputSummary = textFromMessage(event.message).slice(0, 240);\n\t\t\tif (outputSummary) {\n\t\t\t\temit(createEvent(runId, resolved, \"running\", { outputSummary }));\n\t\t\t}\n\t\t} else if (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\tconst outputSummary = textFromMessage(event.message).slice(0, 240);\n\t\t\temit(\n\t\t\t\tcreateEvent(runId, resolved, \"running\", {\n\t\t\t\t\toutputSummary: outputSummary || undefined,\n\t\t\t\t\tusage: event.message.usage,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t});\n\tconst abortChild = (): void => {\n\t\tvoid child.abort();\n\t};\n\toptions.signal?.addEventListener(\"abort\", abortChild, { once: true });\n\n\temit(createEvent(runId, resolved, \"running\"));\n\ttry {\n\t\tif (options.signal?.aborted) {\n\t\t\tawait child.abort();\n\t\t} else {\n\t\t\tawait child.prompt(resolved.prompt, { expandPromptTemplates: false });\n\t\t}\n\n\t\tconst messages = [...child.messages];\n\t\tconst usage = usageFromMessages(messages);\n\t\tconst error = lastAssistantError(messages);\n\t\tconst output = lastAssistantText(messages);\n\t\tconst status = options.signal?.aborted ? \"aborted\" : error ? \"failed\" : \"success\";\n\t\temit(\n\t\t\tcreateEvent(runId, resolved, status, {\n\t\t\t\tusage,\n\t\t\t\terror,\n\t\t\t\toutputSummary: output.slice(0, 240),\n\t\t\t}),\n\t\t);\n\n\t\t// Write a reference entry in the parent session, then inline the messages\n\t\tconst subagentEntryId = session.sessionManager.appendSubagentRunEntry({\n\t\t\trunId,\n\t\t\tindex: resolved.index,\n\t\t\tagent: resolved.definition.name,\n\t\t\ttask: resolved.task.task,\n\t\t\ttitle: resolved.title,\n\t\t\tstatus,\n\t\t\tmodel: formatModel(resolved.model),\n\t\t\tthinking: resolved.thinking,\n\t\t\ttotalTokens: usage?.totalTokens,\n\t\t\ttoolCount: countToolCalls(events),\n\t\t\toutputSummary: output.slice(0, 240) || undefined,\n\t\t\terror,\n\t\t});\n\t\tsession.sessionManager.appendSubagentMessages(subagentEntryId, messages);\n\n\t\treturn {\n\t\t\tindex: resolved.index,\n\t\t\tagent: resolved.definition.name,\n\t\t\ttask: resolved.task.task,\n\t\t\ttitle: resolved.title,\n\t\t\tstatus,\n\t\t\toutput,\n\t\t\tmodel: formatModel(resolved.model),\n\t\t\tthinking: resolved.thinking,\n\t\t\tusage,\n\t\t\terror,\n\t\t\tmessages,\n\t\t\tevents,\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconst status = options.signal?.aborted ? \"aborted\" : \"failed\";\n\t\temit(createEvent(runId, resolved, status, { error: message }));\n\n\t\t// Write a reference entry in the parent session for failed/aborted runs, then inline the messages\n\t\tconst subagentEntryId = session.sessionManager.appendSubagentRunEntry({\n\t\t\trunId,\n\t\t\tindex: resolved.index,\n\t\t\tagent: resolved.definition.name,\n\t\t\ttask: resolved.task.task,\n\t\t\ttitle: resolved.title,\n\t\t\tstatus,\n\t\t\tmodel: formatModel(resolved.model),\n\t\t\tthinking: resolved.thinking,\n\t\t\ttoolCount: countToolCalls(events),\n\t\t\terror: message,\n\t\t});\n\t\tsession.sessionManager.appendSubagentMessages(subagentEntryId, [...child.messages]);\n\n\t\treturn {\n\t\t\tindex: resolved.index,\n\t\t\tagent: resolved.definition.name,\n\t\t\ttask: resolved.task.task,\n\t\t\ttitle: resolved.title,\n\t\t\tstatus,\n\t\t\toutput: \"\",\n\t\t\tmodel: formatModel(resolved.model),\n\t\t\tthinking: resolved.thinking,\n\t\t\terror: message,\n\t\t\tmessages: [...child.messages],\n\t\t\tevents,\n\t\t};\n\t} finally {\n\t\toptions.signal?.removeEventListener(\"abort\", abortChild);\n\t\tunsubscribe();\n\t\tchild.dispose();\n\t}\n}\n\nasync function runWithConcurrency<T>(items: T[], concurrency: number, run: (item: T) => Promise<void>): Promise<void> {\n\tlet nextIndex = 0;\n\tconst workers = Array.from({ length: Math.min(concurrency, items.length) }, async () => {\n\t\tfor (;;) {\n\t\t\tconst item = items[nextIndex];\n\t\t\tnextIndex++;\n\t\t\tif (!item) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait run(item);\n\t\t}\n\t});\n\tawait Promise.all(workers);\n}\n\nfunction aggregateResultUsage(results: SubagentTaskResult[]): Usage | undefined {\n\treturn usageFromMessages(results.flatMap((result) => result.messages));\n}\n\nexport async function runSubagents(\n\tsession: AgentSession,\n\trequest: SubagentRunRequest,\n\toptions: SubagentRunOptions = {},\n): Promise<SubagentRunResult> {\n\tconst mode: \"parallel\" | \"chain\" = \"chain\" in request ? \"chain\" : \"parallel\";\n\tconst tasks = \"chain\" in request ? request.chain : request.tasks;\n\n\tif (tasks.length > MAX_PARALLEL_TASKS) {\n\t\tthrow new Error(`subagent runs support at most ${MAX_PARALLEL_TASKS} tasks`);\n\t}\n\n\tconst definitions = new Map(\n\t\t(\n\t\t\tawait discoverSubagents({\n\t\t\t\tcwd: session.cwd,\n\t\t\t\tagentDir: options.agentDir ?? session.agentDir,\n\t\t\t\tscope: request.subagentScope ?? \"both\",\n\t\t\t})\n\t\t).map((definition) => [definition.name, definition]),\n\t);\n\n\tconst allToolNames = session.getAllToolNames();\n\tconst runId = `subagent:${Date.now()}:${Math.random().toString(36).slice(2)}`;\n\tlet results: SubagentTaskResult[];\n\n\tif (mode === \"chain\") {\n\t\tresults = [];\n\t\tfor (let index = 0; index < tasks.length; index++) {\n\t\t\tconst previous = results.at(-1)?.output ?? \"\";\n\t\t\tconst task = { ...tasks[index], task: tasks[index].task.replaceAll(\"{previous}\", previous) };\n\t\t\tconst resolved = await resolveTask(session, definitions, task, index, allToolNames);\n\t\t\tif (\"status\" in resolved) {\n\t\t\t\tresults.push(resolved);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst result = await runOne(session, runId, resolved, options);\n\t\t\tresults.push(result);\n\t\t\tif (result.status !== \"success\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconst resolvedTasks = await Promise.all(\n\t\t\ttasks.map((task, index) => resolveTask(session, definitions, task, index, allToolNames)),\n\t\t);\n\t\tresults = new Array<SubagentTaskResult>(resolvedTasks.length);\n\t\tawait runWithConcurrency(resolvedTasks, PARALLEL_CONCURRENCY, async (resolved) => {\n\t\t\tif (\"status\" in resolved) {\n\t\t\t\tresults[resolved.index] = resolved;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresults[resolved.index] = await runOne(session, runId, resolved, options);\n\t\t});\n\t}\n\n\treturn {\n\t\tmode,\n\t\tresults,\n\t\tusage: aggregateResultUsage(results),\n\t};\n}\n\nexport function modelMatches(a: Model<any> | undefined, b: Model<any> | undefined): boolean {\n\treturn !!a && !!b && modelsAreEqual(a, b);\n}\n"]}
@@ -0,0 +1,406 @@
1
+ import { clampThinkingLevel, modelsAreEqual } from "@schovest/pi-ai";
2
+ import { DEFAULT_THINKING_LEVEL } from "../defaults.js";
3
+ import { resolveActiveSkills, resolveActiveTools } from "../tool-matcher.js";
4
+ import { discoverSubagents } from "./discovery.js";
5
+ const MAX_PARALLEL_TASKS = 8;
6
+ const PARALLEL_CONCURRENCY = 4;
7
+ function textFromMessage(message) {
8
+ if (message.role !== "assistant") {
9
+ return "";
10
+ }
11
+ return message.content
12
+ .filter((part) => part.type === "text")
13
+ .map((part) => part.text)
14
+ .join("");
15
+ }
16
+ function lastAssistantText(messages) {
17
+ for (let index = messages.length - 1; index >= 0; index--) {
18
+ const text = textFromMessage(messages[index]);
19
+ if (text) {
20
+ return text;
21
+ }
22
+ }
23
+ return "";
24
+ }
25
+ function lastAssistantError(messages) {
26
+ for (let index = messages.length - 1; index >= 0; index--) {
27
+ const message = messages[index];
28
+ if (message.role === "assistant" && message.errorMessage) {
29
+ return message.errorMessage;
30
+ }
31
+ }
32
+ return undefined;
33
+ }
34
+ function usageFromMessages(messages) {
35
+ let aggregate;
36
+ for (const message of messages) {
37
+ if (message.role !== "assistant")
38
+ continue;
39
+ const usage = message.usage;
40
+ if (!usage)
41
+ continue;
42
+ if (!aggregate) {
43
+ aggregate = {
44
+ input: 0,
45
+ output: 0,
46
+ cacheRead: 0,
47
+ cacheWrite: 0,
48
+ totalTokens: 0,
49
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
50
+ };
51
+ }
52
+ aggregate.input += usage.input;
53
+ aggregate.output += usage.output;
54
+ aggregate.cacheRead += usage.cacheRead;
55
+ aggregate.cacheWrite += usage.cacheWrite;
56
+ aggregate.totalTokens += usage.totalTokens;
57
+ aggregate.cost.input += usage.cost.input;
58
+ aggregate.cost.output += usage.cost.output;
59
+ aggregate.cost.cacheRead += usage.cost.cacheRead;
60
+ aggregate.cost.cacheWrite += usage.cost.cacheWrite;
61
+ aggregate.cost.total += usage.cost.total;
62
+ }
63
+ return aggregate;
64
+ }
65
+ function formatModel(model) {
66
+ return `${model.provider}/${model.id}`;
67
+ }
68
+ function resolveModel(session, requested) {
69
+ if (requested) {
70
+ const slashIndex = requested.indexOf("/");
71
+ const model = slashIndex === -1
72
+ ? session.modelRegistry.getAll().find((candidate) => candidate.id === requested)
73
+ : session.modelRegistry.find(requested.slice(0, slashIndex), requested.slice(slashIndex + 1));
74
+ if (!model) {
75
+ throw new Error(`Unknown subagent model: ${requested}`);
76
+ }
77
+ return model;
78
+ }
79
+ const defaultProvider = session.settingsManager.getDefaultProvider();
80
+ const defaultModel = session.settingsManager.getDefaultModel();
81
+ if (defaultProvider && defaultModel) {
82
+ const model = session.modelRegistry.find(defaultProvider, defaultModel);
83
+ if (model && session.modelRegistry.hasConfiguredAuth(model)) {
84
+ return model;
85
+ }
86
+ }
87
+ if (!session.model) {
88
+ throw new Error("No model selected for subagent run");
89
+ }
90
+ return session.model;
91
+ }
92
+ function resolveThinking(session, model, task, definition) {
93
+ const requested = task.thinking ??
94
+ definition.thinking ??
95
+ session.settingsManager.getDefaultThinkingLevel() ??
96
+ DEFAULT_THINKING_LEVEL;
97
+ return clampThinkingLevel(model, requested);
98
+ }
99
+ function buildPrompt(definition, task) {
100
+ return [`You are the "${definition.name}" subagent.`, definition.prompt, `Task:\n${task}`].join("\n\n");
101
+ }
102
+ async function resolveTask(session, definitions, task, index, allToolNames) {
103
+ const definition = definitions.get(task.agent);
104
+ if (!definition) {
105
+ const available = [...definitions.keys()].join(", ");
106
+ return {
107
+ index,
108
+ agent: task.agent,
109
+ task: task.task,
110
+ title: task.title,
111
+ status: "failed",
112
+ output: "",
113
+ error: `Unknown subagent: ${task.agent}. Available: ${available}`,
114
+ messages: [],
115
+ events: [],
116
+ };
117
+ }
118
+ try {
119
+ const model = resolveModel(session, task.model ?? definition.model);
120
+ const thinking = resolveThinking(session, model, task, definition);
121
+ const includedTools = task.includedTools ?? definition.includedTools;
122
+ const excludedTools = task.excludedTools ?? definition.excludedTools;
123
+ const skillsPatterns = task.skills ?? definition.skills;
124
+ const resolvedTools = resolveActiveTools(allToolNames, includedTools, excludedTools, [
125
+ "read",
126
+ "bash",
127
+ "edit",
128
+ "write",
129
+ ]);
130
+ return {
131
+ index,
132
+ definition,
133
+ task,
134
+ title: task.title,
135
+ model,
136
+ thinking,
137
+ tools: resolvedTools,
138
+ skills: skillsPatterns ?? [],
139
+ prompt: buildPrompt(definition, task.task),
140
+ };
141
+ }
142
+ catch (error) {
143
+ return {
144
+ index,
145
+ agent: definition.name,
146
+ task: task.task,
147
+ title: task.title,
148
+ status: "failed",
149
+ output: "",
150
+ error: error instanceof Error ? error.message : String(error),
151
+ messages: [],
152
+ events: [],
153
+ };
154
+ }
155
+ }
156
+ function createEvent(runId, resolved, status, overrides = {}) {
157
+ return {
158
+ runId,
159
+ index: resolved.index,
160
+ agent: resolved.definition.name,
161
+ task: resolved.task.task,
162
+ title: resolved.title,
163
+ status,
164
+ model: formatModel(resolved.model),
165
+ thinking: resolved.thinking,
166
+ timestamp: Date.now(),
167
+ ...overrides,
168
+ };
169
+ }
170
+ function summarizeUnknown(value, maxLength = 240) {
171
+ if (value === undefined) {
172
+ return undefined;
173
+ }
174
+ try {
175
+ const text = typeof value === "string" ? value : JSON.stringify(value);
176
+ return text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;
177
+ }
178
+ catch {
179
+ return String(value);
180
+ }
181
+ }
182
+ function textFromToolResult(result) {
183
+ if (!result || typeof result !== "object" || !("content" in result)) {
184
+ return undefined;
185
+ }
186
+ const content = result.content;
187
+ if (!Array.isArray(content)) {
188
+ return undefined;
189
+ }
190
+ const text = content
191
+ .flatMap((part) => {
192
+ if (!part || typeof part !== "object") {
193
+ return [];
194
+ }
195
+ const candidate = part;
196
+ return candidate.type === "text" && typeof candidate.text === "string" ? [candidate.text] : [];
197
+ })
198
+ .join("\n");
199
+ return summarizeUnknown(text);
200
+ }
201
+ function countToolCalls(events) {
202
+ return events.filter((e) => e.currentTool && e.currentToolArgs).length;
203
+ }
204
+ async function runOne(session, runId, resolved, options) {
205
+ const events = [];
206
+ const emit = (event) => {
207
+ events.push(event);
208
+ session.recordSubagentRunEvent(event);
209
+ options.onEvent?.(event, child);
210
+ };
211
+ const allSkills = session.resourceLoader.getSkills().skills;
212
+ const resolvedSkills = resolveActiveSkills(allSkills, resolved.skills.length > 0 ? resolved.skills : undefined);
213
+ const child = session.createSubagentChildSession({
214
+ model: resolved.model,
215
+ thinkingLevel: resolved.thinking,
216
+ tools: resolved.tools,
217
+ skills: resolvedSkills,
218
+ });
219
+ const unsubscribe = child.subscribe((event) => {
220
+ if (event.type === "tool_execution_start" || event.type === "tool_execution_update") {
221
+ emit(createEvent(runId, resolved, "running", {
222
+ currentTool: event.toolName,
223
+ currentToolArgs: summarizeUnknown(event.args),
224
+ }));
225
+ }
226
+ else if (event.type === "tool_execution_end") {
227
+ emit(createEvent(runId, resolved, "running", {
228
+ currentTool: event.toolName,
229
+ toolResultSummary: textFromToolResult(event.result),
230
+ error: event.isError ? textFromToolResult(event.result) : undefined,
231
+ }));
232
+ }
233
+ else if (event.type === "message_update" && event.message.role === "assistant") {
234
+ const outputSummary = textFromMessage(event.message).slice(0, 240);
235
+ if (outputSummary) {
236
+ emit(createEvent(runId, resolved, "running", { outputSummary }));
237
+ }
238
+ }
239
+ else if (event.type === "message_end" && event.message.role === "assistant") {
240
+ const outputSummary = textFromMessage(event.message).slice(0, 240);
241
+ emit(createEvent(runId, resolved, "running", {
242
+ outputSummary: outputSummary || undefined,
243
+ usage: event.message.usage,
244
+ }));
245
+ }
246
+ });
247
+ const abortChild = () => {
248
+ void child.abort();
249
+ };
250
+ options.signal?.addEventListener("abort", abortChild, { once: true });
251
+ emit(createEvent(runId, resolved, "running"));
252
+ try {
253
+ if (options.signal?.aborted) {
254
+ await child.abort();
255
+ }
256
+ else {
257
+ await child.prompt(resolved.prompt, { expandPromptTemplates: false });
258
+ }
259
+ const messages = [...child.messages];
260
+ const usage = usageFromMessages(messages);
261
+ const error = lastAssistantError(messages);
262
+ const output = lastAssistantText(messages);
263
+ const status = options.signal?.aborted ? "aborted" : error ? "failed" : "success";
264
+ emit(createEvent(runId, resolved, status, {
265
+ usage,
266
+ error,
267
+ outputSummary: output.slice(0, 240),
268
+ }));
269
+ // Write a reference entry in the parent session, then inline the messages
270
+ const subagentEntryId = session.sessionManager.appendSubagentRunEntry({
271
+ runId,
272
+ index: resolved.index,
273
+ agent: resolved.definition.name,
274
+ task: resolved.task.task,
275
+ title: resolved.title,
276
+ status,
277
+ model: formatModel(resolved.model),
278
+ thinking: resolved.thinking,
279
+ totalTokens: usage?.totalTokens,
280
+ toolCount: countToolCalls(events),
281
+ outputSummary: output.slice(0, 240) || undefined,
282
+ error,
283
+ });
284
+ session.sessionManager.appendSubagentMessages(subagentEntryId, messages);
285
+ return {
286
+ index: resolved.index,
287
+ agent: resolved.definition.name,
288
+ task: resolved.task.task,
289
+ title: resolved.title,
290
+ status,
291
+ output,
292
+ model: formatModel(resolved.model),
293
+ thinking: resolved.thinking,
294
+ usage,
295
+ error,
296
+ messages,
297
+ events,
298
+ };
299
+ }
300
+ catch (error) {
301
+ const message = error instanceof Error ? error.message : String(error);
302
+ const status = options.signal?.aborted ? "aborted" : "failed";
303
+ emit(createEvent(runId, resolved, status, { error: message }));
304
+ // Write a reference entry in the parent session for failed/aborted runs, then inline the messages
305
+ const subagentEntryId = session.sessionManager.appendSubagentRunEntry({
306
+ runId,
307
+ index: resolved.index,
308
+ agent: resolved.definition.name,
309
+ task: resolved.task.task,
310
+ title: resolved.title,
311
+ status,
312
+ model: formatModel(resolved.model),
313
+ thinking: resolved.thinking,
314
+ toolCount: countToolCalls(events),
315
+ error: message,
316
+ });
317
+ session.sessionManager.appendSubagentMessages(subagentEntryId, [...child.messages]);
318
+ return {
319
+ index: resolved.index,
320
+ agent: resolved.definition.name,
321
+ task: resolved.task.task,
322
+ title: resolved.title,
323
+ status,
324
+ output: "",
325
+ model: formatModel(resolved.model),
326
+ thinking: resolved.thinking,
327
+ error: message,
328
+ messages: [...child.messages],
329
+ events,
330
+ };
331
+ }
332
+ finally {
333
+ options.signal?.removeEventListener("abort", abortChild);
334
+ unsubscribe();
335
+ child.dispose();
336
+ }
337
+ }
338
+ async function runWithConcurrency(items, concurrency, run) {
339
+ let nextIndex = 0;
340
+ const workers = Array.from({ length: Math.min(concurrency, items.length) }, async () => {
341
+ for (;;) {
342
+ const item = items[nextIndex];
343
+ nextIndex++;
344
+ if (!item) {
345
+ return;
346
+ }
347
+ await run(item);
348
+ }
349
+ });
350
+ await Promise.all(workers);
351
+ }
352
+ function aggregateResultUsage(results) {
353
+ return usageFromMessages(results.flatMap((result) => result.messages));
354
+ }
355
+ export async function runSubagents(session, request, options = {}) {
356
+ const mode = "chain" in request ? "chain" : "parallel";
357
+ const tasks = "chain" in request ? request.chain : request.tasks;
358
+ if (tasks.length > MAX_PARALLEL_TASKS) {
359
+ throw new Error(`subagent runs support at most ${MAX_PARALLEL_TASKS} tasks`);
360
+ }
361
+ const definitions = new Map((await discoverSubagents({
362
+ cwd: session.cwd,
363
+ agentDir: options.agentDir ?? session.agentDir,
364
+ scope: request.subagentScope ?? "both",
365
+ })).map((definition) => [definition.name, definition]));
366
+ const allToolNames = session.getAllToolNames();
367
+ const runId = `subagent:${Date.now()}:${Math.random().toString(36).slice(2)}`;
368
+ let results;
369
+ if (mode === "chain") {
370
+ results = [];
371
+ for (let index = 0; index < tasks.length; index++) {
372
+ const previous = results.at(-1)?.output ?? "";
373
+ const task = { ...tasks[index], task: tasks[index].task.replaceAll("{previous}", previous) };
374
+ const resolved = await resolveTask(session, definitions, task, index, allToolNames);
375
+ if ("status" in resolved) {
376
+ results.push(resolved);
377
+ break;
378
+ }
379
+ const result = await runOne(session, runId, resolved, options);
380
+ results.push(result);
381
+ if (result.status !== "success") {
382
+ break;
383
+ }
384
+ }
385
+ }
386
+ else {
387
+ const resolvedTasks = await Promise.all(tasks.map((task, index) => resolveTask(session, definitions, task, index, allToolNames)));
388
+ results = new Array(resolvedTasks.length);
389
+ await runWithConcurrency(resolvedTasks, PARALLEL_CONCURRENCY, async (resolved) => {
390
+ if ("status" in resolved) {
391
+ results[resolved.index] = resolved;
392
+ return;
393
+ }
394
+ results[resolved.index] = await runOne(session, runId, resolved, options);
395
+ });
396
+ }
397
+ return {
398
+ mode,
399
+ results,
400
+ usage: aggregateResultUsage(results),
401
+ };
402
+ }
403
+ export function modelMatches(a, b) {
404
+ return !!a && !!b && modelsAreEqual(a, b);
405
+ }
406
+ //# sourceMappingURL=runner.js.map