@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,63 @@
1
+ import type { SubagentRunEntry } from "@schovest/pi-agent-core";
2
+ import { Container } from "@schovest/pi-tui";
3
+ import type { AgentSession } from "../../../core/agent-session.ts";
4
+ import type { SubagentRunEvent, SubagentRunResult } from "../../../core/subagents/types.ts";
5
+ export interface SubagentDetailsData {
6
+ result?: SubagentRunResult;
7
+ events: SubagentRunEvent[];
8
+ children?: Map<number, AgentSession>;
9
+ /** Historical subagent run entries loaded from session persistence */
10
+ historicalEntries?: SubagentRunEntry[];
11
+ }
12
+ export interface SubagentDetailsItem {
13
+ index: number;
14
+ agent: string;
15
+ task: string;
16
+ title?: string;
17
+ status: string;
18
+ model?: string;
19
+ thinking?: string;
20
+ output?: string;
21
+ error?: string;
22
+ totalTokens?: number;
23
+ toolCount: number;
24
+ recentTools: string[];
25
+ outputSummary?: string;
26
+ events: SubagentRunEvent[];
27
+ runId?: string;
28
+ subagentEntryId?: string;
29
+ timestamp?: string;
30
+ }
31
+ export declare function displayTitle(item: {
32
+ title?: string;
33
+ task: string;
34
+ }): string;
35
+ export declare function resultItems(data: SubagentDetailsData): SubagentDetailsItem[];
36
+ export declare function statusColor(status: string): "success" | "error" | "warning" | "muted";
37
+ export declare function compactEventTexts(events: SubagentRunEvent[]): Array<{
38
+ text: string;
39
+ count: number;
40
+ }>;
41
+ export declare class SubagentPickerComponent extends Container {
42
+ private data;
43
+ private selectedIndex;
44
+ private onSelect;
45
+ private onCancel;
46
+ constructor(data: SubagentDetailsData, onSelect: (index: number) => void, onCancel: () => void);
47
+ update(data: SubagentDetailsData): void;
48
+ handleInput(keyData: string): void;
49
+ private rebuild;
50
+ }
51
+ export declare class SubagentRunViewComponent {
52
+ private data;
53
+ private selectedIndex;
54
+ private onCancel;
55
+ constructor(data: SubagentDetailsData, selectedIndex: number, onCancel: () => void);
56
+ update(data: SubagentDetailsData): void;
57
+ getAgentName(): string | undefined;
58
+ handleInput(keyData: string): void;
59
+ invalidate(): void;
60
+ render(width: number): string[];
61
+ private getSelectedItem;
62
+ }
63
+ //# sourceMappingURL=subagent-details.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-details.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/subagent-details.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SubagentRunEntry } from \"@schovest/pi-agent-core\";\nimport { Container, getKeybindings, Spacer, Text, truncateToWidth } from \"@schovest/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport type { SubagentRunEvent, SubagentRunResult, SubagentTaskResult } from \"../../../core/subagents/types.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\n\nexport interface SubagentDetailsData {\n\tresult?: SubagentRunResult;\n\tevents: SubagentRunEvent[];\n\tchildren?: Map<number, AgentSession>;\n\t/** Historical subagent run entries loaded from session persistence */\n\thistoricalEntries?: SubagentRunEntry[];\n}\n\nexport interface SubagentDetailsItem {\n\tindex: number;\n\tagent: string;\n\ttask: string;\n\ttitle?: string;\n\tstatus: string;\n\tmodel?: string;\n\tthinking?: string;\n\toutput?: string;\n\terror?: string;\n\ttotalTokens?: number;\n\ttoolCount: number;\n\trecentTools: string[];\n\toutputSummary?: string;\n\tevents: SubagentRunEvent[];\n\trunId?: string;\n\tsubagentEntryId?: string; // SubagentRunEntry.id,用于 getSubagentMessages\n\ttimestamp?: string; // ISO timestamp for chronological sorting\n}\n\nfunction formatToolArgs(toolName: string, argsJson: string | undefined): string {\n\tif (!argsJson) return \"\";\n\ttry {\n\t\tconst args: Record<string, unknown> = JSON.parse(argsJson);\n\t\tswitch (toolName) {\n\t\t\tcase \"bash\":\n\t\t\t\treturn typeof args.command === \"string\" ? truncate(args.command, 60) : truncate(argsJson, 60);\n\t\t\tcase \"read\":\n\t\t\t\treturn truncate(String(args.file_path ?? args.path ?? argsJson), 60);\n\t\t\tcase \"edit\":\n\t\t\t\treturn truncate(String(args.path ?? args.file_path ?? argsJson), 60);\n\t\t\tcase \"write\":\n\t\t\t\treturn truncate(String(args.path ?? args.file_path ?? argsJson), 60);\n\t\t\tcase \"ls\":\n\t\t\t\treturn truncate(String(args.path ?? args.dir ?? \".\"), 60);\n\t\t\tcase \"grep\": {\n\t\t\t\tconst pattern = String(args.pattern ?? \"\");\n\t\t\t\tconst searchPath = args.path ? ` in ${args.path}` : \"\";\n\t\t\t\tconst include = args.glob ? ` (${args.glob})` : \"\";\n\t\t\t\treturn truncate(`/${pattern}/${searchPath}${include}`, 60);\n\t\t\t}\n\t\t\tcase \"find\": {\n\t\t\t\tconst pattern = String(args.pattern ?? args.glob ?? \"\");\n\t\t\t\tconst searchPath = args.path ? ` in ${args.path}` : \"\";\n\t\t\t\treturn truncate(`${pattern}${searchPath}`, 60);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn truncate(argsJson, 60);\n\t\t}\n\t} catch {\n\t\treturn truncate(argsJson, 60);\n\t}\n}\n\nfunction truncate(text: string, maxLength: number): string {\n\treturn text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;\n}\n\nexport function displayTitle(item: { title?: string; task: string }): string {\n\treturn item.title ?? item.task.slice(0, 7);\n}\n\nfunction countToolCalls(events: SubagentRunEvent[]): number {\n\treturn events.filter((e) => e.currentTool && e.currentToolArgs).length;\n}\n\nfunction extractRecentTools(events: SubagentRunEvent[], max: number): string[] {\n\treturn events\n\t\t.filter((e) => e.currentTool && e.currentToolArgs)\n\t\t.slice(-max)\n\t\t.map((e) => {\n\t\t\tconst args = formatToolArgs(e.currentTool!, e.currentToolArgs);\n\t\t\treturn `${e.currentTool}${args ? ` ${args}` : \"\"}`;\n\t\t});\n}\n\nfunction latestByIndex(events: SubagentRunEvent[]): Map<number, SubagentRunEvent> {\n\tconst byIndex = new Map<number, SubagentRunEvent>();\n\tfor (const event of events) {\n\t\tbyIndex.set(event.index, event);\n\t}\n\treturn byIndex;\n}\n\nfunction latestDefined<T>(\n\tevents: SubagentRunEvent[],\n\tselect: (event: SubagentRunEvent) => T | undefined,\n): T | undefined {\n\tfor (let index = events.length - 1; index >= 0; index--) {\n\t\tconst value = select(events[index]);\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction latestEvents(events: SubagentRunEvent[]): SubagentDetailsItem[] {\n\tconst byIndex = latestByIndex(events);\n\treturn Array.from(byIndex.values())\n\t\t.sort((a, b) => a.index - b.index)\n\t\t.map((event) => {\n\t\t\tconst itemEvents = events.filter((candidate) => candidate.index === event.index);\n\t\t\t// Use earliest event timestamp as creation time (stable across status updates)\n\t\t\tconst startTimestamp = new Date(Math.min(...itemEvents.map((e) => e.timestamp))).toISOString();\n\t\t\treturn {\n\t\t\t\tindex: event.index,\n\t\t\t\tagent: event.agent,\n\t\t\t\ttitle: event.title,\n\t\t\t\ttask: event.task,\n\t\t\t\tstatus: event.status,\n\t\t\t\tmodel: event.model,\n\t\t\t\tthinking: event.thinking,\n\t\t\t\terror: event.error,\n\t\t\t\ttotalTokens: event.usage?.totalTokens,\n\t\t\t\ttoolCount: countToolCalls(itemEvents),\n\t\t\t\trecentTools: extractRecentTools(itemEvents, 3),\n\t\t\t\toutputSummary: latestDefined(itemEvents, (candidate) => candidate.outputSummary),\n\t\t\t\tevents: itemEvents,\n\t\t\t\trunId: event.runId,\n\t\t\t\ttimestamp: startTimestamp,\n\t\t\t};\n\t\t});\n}\n\nexport function resultItems(data: SubagentDetailsData): SubagentDetailsItem[] {\n\tconst latest = latestByIndex(data.events);\n\tlet items: SubagentDetailsItem[];\n\n\tif (!data.result) {\n\t\titems = latestEvents(data.events);\n\t} else {\n\t\titems = data.result.results.map((result: SubagentTaskResult) => {\n\t\t\tconst latestEvent = latest.get(result.index);\n\t\t\tconst resultEvents =\n\t\t\t\tresult.events.length > 0 ? result.events : data.events.filter((event) => event.index === result.index);\n\t\t\t// Extract runId from events (all events in one call share the same runId prefix)\n\t\t\tconst eventRunId = resultEvents.length > 0 ? resultEvents[0].runId : undefined;\n\t\t\t// Use earliest event timestamp as the start time\n\t\t\tconst startTimestamp =\n\t\t\t\tresultEvents.length > 0\n\t\t\t\t\t? new Date(Math.min(...resultEvents.map((e) => e.timestamp))).toISOString()\n\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tindex: result.index,\n\t\t\t\tagent: result.agent,\n\t\t\t\ttitle: result.title,\n\t\t\t\ttask: result.task,\n\t\t\t\tstatus: latestEvent?.status ?? result.status,\n\t\t\t\tmodel: latestEvent?.model ?? result.model,\n\t\t\t\tthinking: latestEvent?.thinking ?? result.thinking,\n\t\t\t\toutput: result.output,\n\t\t\t\terror: latestEvent?.error ?? result.error,\n\t\t\t\ttotalTokens: latestEvent?.usage?.totalTokens ?? result.usage?.totalTokens,\n\t\t\t\ttoolCount: countToolCalls(resultEvents),\n\t\t\t\trecentTools: extractRecentTools(resultEvents, 3),\n\t\t\t\toutputSummary: latestDefined(resultEvents, (event) => event.outputSummary),\n\t\t\t\tevents: resultEvents,\n\t\t\t\trunId: eventRunId,\n\t\t\t\ttimestamp: startTimestamp,\n\t\t\t};\n\t\t});\n\t}\n\n\t// Add historical entries not already covered by live data.\n\t// Use runId:index for dedup: different subagent calls have different runIds,\n\t// so entries from previous calls are not mistakenly skipped by matching on\n\t// the non-unique task index alone. Same runId + same index = same subagent run.\n\tif (data.historicalEntries && data.historicalEntries.length > 0) {\n\t\tconst liveKeys = new Set(\n\t\t\titems.filter((item) => item.runId !== undefined).map((item) => `${item.runId}:${item.index}`),\n\t\t);\n\t\tfor (const entry of data.historicalEntries) {\n\t\t\tconst key = `${entry.runId}:${entry.index}`;\n\t\t\tif (!liveKeys.has(key)) {\n\t\t\t\titems.push({\n\t\t\t\t\tindex: entry.index,\n\t\t\t\t\tagent: entry.agent,\n\t\t\t\t\ttitle: entry.title,\n\t\t\t\t\ttask: entry.task,\n\t\t\t\t\tstatus: entry.status,\n\t\t\t\t\tmodel: entry.model,\n\t\t\t\t\tthinking: entry.thinking,\n\t\t\t\t\terror: entry.error,\n\t\t\t\t\ttotalTokens: entry.totalTokens,\n\t\t\t\t\ttoolCount: entry.toolCount,\n\t\t\t\t\trecentTools: [],\n\t\t\t\t\toutputSummary: entry.outputSummary,\n\t\t\t\t\tevents: [],\n\t\t\t\t\trunId: entry.runId,\n\t\t\t\t\tsubagentEntryId: entry.id,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Preserve insertion order: live items first (by index), then historical entries.\n\t// Do NOT sort by timestamp — sorting mixes live and historical items with the\n\t// same task index, causing getChildSession(index) to return the wrong session.\n\treturn items;\n}\n\nexport function statusColor(status: string): \"success\" | \"error\" | \"warning\" | \"muted\" {\n\tif (status === \"success\") return \"success\";\n\tif (status === \"failed\" || status === \"aborted\") return \"error\";\n\tif (status === \"running\") return \"warning\";\n\treturn \"muted\";\n}\n\nfunction clampSelectedIndex(selectedIndex: number, itemCount: number): number {\n\tif (itemCount === 0) return 0;\n\treturn Math.max(0, Math.min(selectedIndex, itemCount - 1));\n}\n\nfunction eventText(event: SubagentRunEvent): string {\n\tconst parts: string[] = [event.status];\n\tif (event.currentTool) {\n\t\tconst args = event.currentToolArgs ? ` ${event.currentToolArgs}` : \"\";\n\t\tparts.push(`tool=${event.currentTool}${args}`);\n\t}\n\tif (event.toolResultSummary) parts.push(`result=${event.toolResultSummary}`);\n\tif (event.outputSummary) {\n\t\tparts.push(\n\t\t\tevent.currentTool || event.toolResultSummary || event.error\n\t\t\t\t? `output=${event.outputSummary}`\n\t\t\t\t: \"assistant output update\",\n\t\t);\n\t}\n\tif (event.error) parts.push(`error=${event.error}`);\n\tif (event.usage?.totalTokens !== undefined) parts.push(`tokens=${event.usage.totalTokens}`);\n\treturn parts.join(\" \");\n}\n\nexport function compactEventTexts(events: SubagentRunEvent[]): Array<{ text: string; count: number }> {\n\tconst compacted: Array<{ text: string; count: number }> = [];\n\tfor (const event of events) {\n\t\tconst text = eventText(event);\n\t\tconst previous = compacted.at(-1);\n\t\tif (previous?.text === text) {\n\t\t\tprevious.count++;\n\t\t} else {\n\t\t\tcompacted.push({ text, count: 1 });\n\t\t}\n\t}\n\treturn compacted;\n}\n\nexport class SubagentPickerComponent extends Container {\n\tprivate data: SubagentDetailsData;\n\tprivate selectedIndex = 0;\n\tprivate onSelect: (index: number) => void;\n\tprivate onCancel: () => void;\n\n\tconstructor(data: SubagentDetailsData, onSelect: (index: number) => void, onCancel: () => void) {\n\t\tsuper();\n\t\tthis.data = data;\n\t\tthis.onSelect = onSelect;\n\t\tthis.onCancel = onCancel;\n\t\tthis.rebuild();\n\t}\n\n\tupdate(data: SubagentDetailsData): void {\n\t\tthis.data = data;\n\t\tthis.selectedIndex = clampSelectedIndex(this.selectedIndex, resultItems(data).length);\n\t\tthis.rebuild();\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tconst items = resultItems(this.data);\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.rebuild();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(items.length - 1, this.selectedIndex + 1);\n\t\t\tthis.rebuild();\n\t\t} else if (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tconst selected = items[this.selectedIndex];\n\t\t\tif (selected) this.onSelect(selected.index);\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel();\n\t\t}\n\t}\n\n\tprivate rebuild(): void {\n\t\tthis.clear();\n\t\tconst items = resultItems(this.data);\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Select a subagent\")), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tif (items.length === 0) {\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", \"No subagent runs captured yet.\"), 1, 0));\n\t\t} else {\n\t\t\tfor (let index = 0; index < items.length; index++) {\n\t\t\t\tconst item = items[index];\n\t\t\t\tconst selected = index === this.selectedIndex;\n\t\t\t\tconst pointer = selected ? theme.fg(\"accent\", \"-> \") : \" \";\n\t\t\t\tconst status = theme.fg(statusColor(item.status), item.status);\n\t\t\t\tconst usage = item.totalTokens === undefined ? \"\" : theme.fg(\"muted\", ` tokens=${item.totalTokens}`);\n\t\t\t\tconst tools = theme.fg(\"muted\", ` tools=${item.toolCount}`);\n\t\t\t\tconst lastTool = item.recentTools.length > 0 ? theme.fg(\"muted\", ` → ${item.recentTools.at(-1)}`) : \"\";\n\t\t\t\tthis.addChild(\n\t\t\t\t\tnew Text(\n\t\t\t\t\t\t`${pointer}${item.index + 1}. ${displayTitle(item)} ${status}${usage}${tools}${lastTool}`,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t0,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\t`${rawKeyHint(\"↑↓/j/k\", \"navigate\")} ${keyHint(\"tui.select.confirm\", \"enter\")} ${keyHint(\"tui.select.cancel\", \"close\")}`,\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n}\n\nexport class SubagentRunViewComponent {\n\tprivate data: SubagentDetailsData;\n\tprivate selectedIndex: number;\n\tprivate onCancel: () => void;\n\n\tconstructor(data: SubagentDetailsData, selectedIndex: number, onCancel: () => void) {\n\t\tthis.data = data;\n\t\tthis.selectedIndex = selectedIndex;\n\t\tthis.onCancel = onCancel;\n\t}\n\n\tupdate(data: SubagentDetailsData): void {\n\t\tthis.data = data;\n\t}\n\n\tgetAgentName(): string | undefined {\n\t\treturn this.getSelectedItem()?.agent;\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel();\n\t\t}\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst item = this.getSelectedItem();\n\t\tconst lines: string[] = [];\n\t\tlines.push(theme.fg(\"accent\", theme.bold(`Subagent ${item ? displayTitle(item) : \"\"}`)).trimEnd());\n\t\tlines.push(theme.fg(\"muted\", \"Esc returns to the main Agent\"));\n\t\tlines.push(\"\");\n\n\t\tif (!item) {\n\t\t\tlines.push(theme.fg(\"muted\", \"No subagent run is selected.\"));\n\t\t\treturn lines.map((line) => truncateToWidth(line, width, \"...\"));\n\t\t}\n\n\t\tconst status = theme.fg(statusColor(item.status), item.status);\n\t\tconst usage = item.totalTokens === undefined ? \"\" : ` tokens=${item.totalTokens}`;\n\t\tlines.push(`${theme.bold(\"Status\")} ${status}${theme.fg(\"muted\", usage)}`);\n\t\tlines.push(\n\t\t\ttheme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\t`model=${item.model ?? \"default\"} thinking=${item.thinking ?? \"default\"} index=${item.index + 1} tools=${item.toolCount}`,\n\t\t\t),\n\t\t);\n\t\tlines.push(`${theme.bold(\"Task\")} ${item.task}`);\n\n\t\tlines.push(theme.bold(\"Recent Tools\") + theme.fg(\"muted\", ` (${item.toolCount} total)`));\n\t\tif (item.recentTools.length > 0) {\n\t\t\tfor (const tool of item.recentTools) {\n\t\t\t\tlines.push(theme.fg(\"muted\", ` --${tool}`));\n\t\t\t}\n\t\t} else {\n\t\t\tlines.push(theme.fg(\"muted\", \" (no tool calls)\"));\n\t\t}\n\n\t\tif (item.outputSummary) {\n\t\t\tlines.push(`${theme.bold(\"Latest Output\")} ${item.outputSummary}`);\n\t\t}\n\t\tif (item.error) {\n\t\t\tlines.push(theme.fg(\"error\", `${theme.bold(\"Error\")} ${item.error}`));\n\t\t}\n\t\tif (item.output) {\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(theme.bold(\"Final Output\"));\n\t\t\tfor (const line of item.output.split(\"\\n\")) {\n\t\t\t\tlines.push(theme.fg(\"toolOutput\", line));\n\t\t\t}\n\t\t}\n\n\t\tlines.push(\"\");\n\t\tlines.push(theme.bold(\"Events\"));\n\t\tconst events = compactEventTexts(item.events).slice(-16);\n\t\tif (events.length === 0) {\n\t\t\tlines.push(theme.fg(\"muted\", \"No events captured yet.\"));\n\t\t} else {\n\t\t\tfor (const event of events) {\n\t\t\t\tconst repeated = event.count > 1 ? ` (repeated ${event.count}x)` : \"\";\n\t\t\t\tlines.push(theme.fg(\"muted\", `- ${event.text}${repeated}`));\n\t\t\t}\n\t\t}\n\n\t\treturn lines.map((line) => truncateToWidth(line, width, \"...\"));\n\t}\n\n\tprivate getSelectedItem(): SubagentDetailsItem | undefined {\n\t\tconst items = resultItems(this.data);\n\t\treturn items.find((item) => item.index === this.selectedIndex) ?? items[0];\n\t}\n}\n"]}
@@ -0,0 +1,360 @@
1
+ import { Container, getKeybindings, Spacer, Text, truncateToWidth } from "@schovest/pi-tui";
2
+ import { theme } from "../theme/theme.js";
3
+ import { DynamicBorder } from "./dynamic-border.js";
4
+ import { keyHint, rawKeyHint } from "./keybinding-hints.js";
5
+ function formatToolArgs(toolName, argsJson) {
6
+ if (!argsJson)
7
+ return "";
8
+ try {
9
+ const args = JSON.parse(argsJson);
10
+ switch (toolName) {
11
+ case "bash":
12
+ return typeof args.command === "string" ? truncate(args.command, 60) : truncate(argsJson, 60);
13
+ case "read":
14
+ return truncate(String(args.file_path ?? args.path ?? argsJson), 60);
15
+ case "edit":
16
+ return truncate(String(args.path ?? args.file_path ?? argsJson), 60);
17
+ case "write":
18
+ return truncate(String(args.path ?? args.file_path ?? argsJson), 60);
19
+ case "ls":
20
+ return truncate(String(args.path ?? args.dir ?? "."), 60);
21
+ case "grep": {
22
+ const pattern = String(args.pattern ?? "");
23
+ const searchPath = args.path ? ` in ${args.path}` : "";
24
+ const include = args.glob ? ` (${args.glob})` : "";
25
+ return truncate(`/${pattern}/${searchPath}${include}`, 60);
26
+ }
27
+ case "find": {
28
+ const pattern = String(args.pattern ?? args.glob ?? "");
29
+ const searchPath = args.path ? ` in ${args.path}` : "";
30
+ return truncate(`${pattern}${searchPath}`, 60);
31
+ }
32
+ default:
33
+ return truncate(argsJson, 60);
34
+ }
35
+ }
36
+ catch {
37
+ return truncate(argsJson, 60);
38
+ }
39
+ }
40
+ function truncate(text, maxLength) {
41
+ return text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;
42
+ }
43
+ export function displayTitle(item) {
44
+ return item.title ?? item.task.slice(0, 7);
45
+ }
46
+ function countToolCalls(events) {
47
+ return events.filter((e) => e.currentTool && e.currentToolArgs).length;
48
+ }
49
+ function extractRecentTools(events, max) {
50
+ return events
51
+ .filter((e) => e.currentTool && e.currentToolArgs)
52
+ .slice(-max)
53
+ .map((e) => {
54
+ const args = formatToolArgs(e.currentTool, e.currentToolArgs);
55
+ return `${e.currentTool}${args ? ` ${args}` : ""}`;
56
+ });
57
+ }
58
+ function latestByIndex(events) {
59
+ const byIndex = new Map();
60
+ for (const event of events) {
61
+ byIndex.set(event.index, event);
62
+ }
63
+ return byIndex;
64
+ }
65
+ function latestDefined(events, select) {
66
+ for (let index = events.length - 1; index >= 0; index--) {
67
+ const value = select(events[index]);
68
+ if (value !== undefined) {
69
+ return value;
70
+ }
71
+ }
72
+ return undefined;
73
+ }
74
+ function latestEvents(events) {
75
+ const byIndex = latestByIndex(events);
76
+ return Array.from(byIndex.values())
77
+ .sort((a, b) => a.index - b.index)
78
+ .map((event) => {
79
+ const itemEvents = events.filter((candidate) => candidate.index === event.index);
80
+ // Use earliest event timestamp as creation time (stable across status updates)
81
+ const startTimestamp = new Date(Math.min(...itemEvents.map((e) => e.timestamp))).toISOString();
82
+ return {
83
+ index: event.index,
84
+ agent: event.agent,
85
+ title: event.title,
86
+ task: event.task,
87
+ status: event.status,
88
+ model: event.model,
89
+ thinking: event.thinking,
90
+ error: event.error,
91
+ totalTokens: event.usage?.totalTokens,
92
+ toolCount: countToolCalls(itemEvents),
93
+ recentTools: extractRecentTools(itemEvents, 3),
94
+ outputSummary: latestDefined(itemEvents, (candidate) => candidate.outputSummary),
95
+ events: itemEvents,
96
+ runId: event.runId,
97
+ timestamp: startTimestamp,
98
+ };
99
+ });
100
+ }
101
+ export function resultItems(data) {
102
+ const latest = latestByIndex(data.events);
103
+ let items;
104
+ if (!data.result) {
105
+ items = latestEvents(data.events);
106
+ }
107
+ else {
108
+ items = data.result.results.map((result) => {
109
+ const latestEvent = latest.get(result.index);
110
+ const resultEvents = result.events.length > 0 ? result.events : data.events.filter((event) => event.index === result.index);
111
+ // Extract runId from events (all events in one call share the same runId prefix)
112
+ const eventRunId = resultEvents.length > 0 ? resultEvents[0].runId : undefined;
113
+ // Use earliest event timestamp as the start time
114
+ const startTimestamp = resultEvents.length > 0
115
+ ? new Date(Math.min(...resultEvents.map((e) => e.timestamp))).toISOString()
116
+ : undefined;
117
+ return {
118
+ index: result.index,
119
+ agent: result.agent,
120
+ title: result.title,
121
+ task: result.task,
122
+ status: latestEvent?.status ?? result.status,
123
+ model: latestEvent?.model ?? result.model,
124
+ thinking: latestEvent?.thinking ?? result.thinking,
125
+ output: result.output,
126
+ error: latestEvent?.error ?? result.error,
127
+ totalTokens: latestEvent?.usage?.totalTokens ?? result.usage?.totalTokens,
128
+ toolCount: countToolCalls(resultEvents),
129
+ recentTools: extractRecentTools(resultEvents, 3),
130
+ outputSummary: latestDefined(resultEvents, (event) => event.outputSummary),
131
+ events: resultEvents,
132
+ runId: eventRunId,
133
+ timestamp: startTimestamp,
134
+ };
135
+ });
136
+ }
137
+ // Add historical entries not already covered by live data.
138
+ // Use runId:index for dedup: different subagent calls have different runIds,
139
+ // so entries from previous calls are not mistakenly skipped by matching on
140
+ // the non-unique task index alone. Same runId + same index = same subagent run.
141
+ if (data.historicalEntries && data.historicalEntries.length > 0) {
142
+ const liveKeys = new Set(items.filter((item) => item.runId !== undefined).map((item) => `${item.runId}:${item.index}`));
143
+ for (const entry of data.historicalEntries) {
144
+ const key = `${entry.runId}:${entry.index}`;
145
+ if (!liveKeys.has(key)) {
146
+ items.push({
147
+ index: entry.index,
148
+ agent: entry.agent,
149
+ title: entry.title,
150
+ task: entry.task,
151
+ status: entry.status,
152
+ model: entry.model,
153
+ thinking: entry.thinking,
154
+ error: entry.error,
155
+ totalTokens: entry.totalTokens,
156
+ toolCount: entry.toolCount,
157
+ recentTools: [],
158
+ outputSummary: entry.outputSummary,
159
+ events: [],
160
+ runId: entry.runId,
161
+ subagentEntryId: entry.id,
162
+ timestamp: entry.timestamp,
163
+ });
164
+ }
165
+ }
166
+ }
167
+ // Preserve insertion order: live items first (by index), then historical entries.
168
+ // Do NOT sort by timestamp — sorting mixes live and historical items with the
169
+ // same task index, causing getChildSession(index) to return the wrong session.
170
+ return items;
171
+ }
172
+ export function statusColor(status) {
173
+ if (status === "success")
174
+ return "success";
175
+ if (status === "failed" || status === "aborted")
176
+ return "error";
177
+ if (status === "running")
178
+ return "warning";
179
+ return "muted";
180
+ }
181
+ function clampSelectedIndex(selectedIndex, itemCount) {
182
+ if (itemCount === 0)
183
+ return 0;
184
+ return Math.max(0, Math.min(selectedIndex, itemCount - 1));
185
+ }
186
+ function eventText(event) {
187
+ const parts = [event.status];
188
+ if (event.currentTool) {
189
+ const args = event.currentToolArgs ? ` ${event.currentToolArgs}` : "";
190
+ parts.push(`tool=${event.currentTool}${args}`);
191
+ }
192
+ if (event.toolResultSummary)
193
+ parts.push(`result=${event.toolResultSummary}`);
194
+ if (event.outputSummary) {
195
+ parts.push(event.currentTool || event.toolResultSummary || event.error
196
+ ? `output=${event.outputSummary}`
197
+ : "assistant output update");
198
+ }
199
+ if (event.error)
200
+ parts.push(`error=${event.error}`);
201
+ if (event.usage?.totalTokens !== undefined)
202
+ parts.push(`tokens=${event.usage.totalTokens}`);
203
+ return parts.join(" ");
204
+ }
205
+ export function compactEventTexts(events) {
206
+ const compacted = [];
207
+ for (const event of events) {
208
+ const text = eventText(event);
209
+ const previous = compacted.at(-1);
210
+ if (previous?.text === text) {
211
+ previous.count++;
212
+ }
213
+ else {
214
+ compacted.push({ text, count: 1 });
215
+ }
216
+ }
217
+ return compacted;
218
+ }
219
+ export class SubagentPickerComponent extends Container {
220
+ data;
221
+ selectedIndex = 0;
222
+ onSelect;
223
+ onCancel;
224
+ constructor(data, onSelect, onCancel) {
225
+ super();
226
+ this.data = data;
227
+ this.onSelect = onSelect;
228
+ this.onCancel = onCancel;
229
+ this.rebuild();
230
+ }
231
+ update(data) {
232
+ this.data = data;
233
+ this.selectedIndex = clampSelectedIndex(this.selectedIndex, resultItems(data).length);
234
+ this.rebuild();
235
+ }
236
+ handleInput(keyData) {
237
+ const kb = getKeybindings();
238
+ const items = resultItems(this.data);
239
+ if (kb.matches(keyData, "tui.select.up") || keyData === "k") {
240
+ this.selectedIndex = Math.max(0, this.selectedIndex - 1);
241
+ this.rebuild();
242
+ }
243
+ else if (kb.matches(keyData, "tui.select.down") || keyData === "j") {
244
+ this.selectedIndex = Math.min(items.length - 1, this.selectedIndex + 1);
245
+ this.rebuild();
246
+ }
247
+ else if (kb.matches(keyData, "tui.select.confirm") || keyData === "\n") {
248
+ const selected = items[this.selectedIndex];
249
+ if (selected)
250
+ this.onSelect(selected.index);
251
+ }
252
+ else if (kb.matches(keyData, "tui.select.cancel")) {
253
+ this.onCancel();
254
+ }
255
+ }
256
+ rebuild() {
257
+ this.clear();
258
+ const items = resultItems(this.data);
259
+ this.addChild(new DynamicBorder());
260
+ this.addChild(new Text(theme.fg("accent", theme.bold("Select a subagent")), 1, 0));
261
+ this.addChild(new Spacer(1));
262
+ if (items.length === 0) {
263
+ this.addChild(new Text(theme.fg("muted", "No subagent runs captured yet."), 1, 0));
264
+ }
265
+ else {
266
+ for (let index = 0; index < items.length; index++) {
267
+ const item = items[index];
268
+ const selected = index === this.selectedIndex;
269
+ const pointer = selected ? theme.fg("accent", "-> ") : " ";
270
+ const status = theme.fg(statusColor(item.status), item.status);
271
+ const usage = item.totalTokens === undefined ? "" : theme.fg("muted", ` tokens=${item.totalTokens}`);
272
+ const tools = theme.fg("muted", ` tools=${item.toolCount}`);
273
+ const lastTool = item.recentTools.length > 0 ? theme.fg("muted", ` → ${item.recentTools.at(-1)}`) : "";
274
+ this.addChild(new Text(`${pointer}${item.index + 1}. ${displayTitle(item)} ${status}${usage}${tools}${lastTool}`, 1, 0));
275
+ }
276
+ }
277
+ this.addChild(new Spacer(1));
278
+ this.addChild(new Text(`${rawKeyHint("↑↓/j/k", "navigate")} ${keyHint("tui.select.confirm", "enter")} ${keyHint("tui.select.cancel", "close")}`, 1, 0));
279
+ this.addChild(new DynamicBorder());
280
+ }
281
+ }
282
+ export class SubagentRunViewComponent {
283
+ data;
284
+ selectedIndex;
285
+ onCancel;
286
+ constructor(data, selectedIndex, onCancel) {
287
+ this.data = data;
288
+ this.selectedIndex = selectedIndex;
289
+ this.onCancel = onCancel;
290
+ }
291
+ update(data) {
292
+ this.data = data;
293
+ }
294
+ getAgentName() {
295
+ return this.getSelectedItem()?.agent;
296
+ }
297
+ handleInput(keyData) {
298
+ const kb = getKeybindings();
299
+ if (kb.matches(keyData, "tui.select.cancel")) {
300
+ this.onCancel();
301
+ }
302
+ }
303
+ invalidate() { }
304
+ render(width) {
305
+ const item = this.getSelectedItem();
306
+ const lines = [];
307
+ lines.push(theme.fg("accent", theme.bold(`Subagent ${item ? displayTitle(item) : ""}`)).trimEnd());
308
+ lines.push(theme.fg("muted", "Esc returns to the main Agent"));
309
+ lines.push("");
310
+ if (!item) {
311
+ lines.push(theme.fg("muted", "No subagent run is selected."));
312
+ return lines.map((line) => truncateToWidth(line, width, "..."));
313
+ }
314
+ const status = theme.fg(statusColor(item.status), item.status);
315
+ const usage = item.totalTokens === undefined ? "" : ` tokens=${item.totalTokens}`;
316
+ lines.push(`${theme.bold("Status")} ${status}${theme.fg("muted", usage)}`);
317
+ lines.push(theme.fg("muted", `model=${item.model ?? "default"} thinking=${item.thinking ?? "default"} index=${item.index + 1} tools=${item.toolCount}`));
318
+ lines.push(`${theme.bold("Task")} ${item.task}`);
319
+ lines.push(theme.bold("Recent Tools") + theme.fg("muted", ` (${item.toolCount} total)`));
320
+ if (item.recentTools.length > 0) {
321
+ for (const tool of item.recentTools) {
322
+ lines.push(theme.fg("muted", ` --${tool}`));
323
+ }
324
+ }
325
+ else {
326
+ lines.push(theme.fg("muted", " (no tool calls)"));
327
+ }
328
+ if (item.outputSummary) {
329
+ lines.push(`${theme.bold("Latest Output")} ${item.outputSummary}`);
330
+ }
331
+ if (item.error) {
332
+ lines.push(theme.fg("error", `${theme.bold("Error")} ${item.error}`));
333
+ }
334
+ if (item.output) {
335
+ lines.push("");
336
+ lines.push(theme.bold("Final Output"));
337
+ for (const line of item.output.split("\n")) {
338
+ lines.push(theme.fg("toolOutput", line));
339
+ }
340
+ }
341
+ lines.push("");
342
+ lines.push(theme.bold("Events"));
343
+ const events = compactEventTexts(item.events).slice(-16);
344
+ if (events.length === 0) {
345
+ lines.push(theme.fg("muted", "No events captured yet."));
346
+ }
347
+ else {
348
+ for (const event of events) {
349
+ const repeated = event.count > 1 ? ` (repeated ${event.count}x)` : "";
350
+ lines.push(theme.fg("muted", `- ${event.text}${repeated}`));
351
+ }
352
+ }
353
+ return lines.map((line) => truncateToWidth(line, width, "..."));
354
+ }
355
+ getSelectedItem() {
356
+ const items = resultItems(this.data);
357
+ return items.find((item) => item.index === this.selectedIndex) ?? items[0];
358
+ }
359
+ }
360
+ //# sourceMappingURL=subagent-details.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-details.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/subagent-details.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SubagentRunEntry } from \"@schovest/pi-agent-core\";\nimport { Container, getKeybindings, Spacer, Text, truncateToWidth } from \"@schovest/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport type { SubagentRunEvent, SubagentRunResult, SubagentTaskResult } from \"../../../core/subagents/types.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\n\nexport interface SubagentDetailsData {\n\tresult?: SubagentRunResult;\n\tevents: SubagentRunEvent[];\n\tchildren?: Map<number, AgentSession>;\n\t/** Historical subagent run entries loaded from session persistence */\n\thistoricalEntries?: SubagentRunEntry[];\n}\n\nexport interface SubagentDetailsItem {\n\tindex: number;\n\tagent: string;\n\ttask: string;\n\ttitle?: string;\n\tstatus: string;\n\tmodel?: string;\n\tthinking?: string;\n\toutput?: string;\n\terror?: string;\n\ttotalTokens?: number;\n\ttoolCount: number;\n\trecentTools: string[];\n\toutputSummary?: string;\n\tevents: SubagentRunEvent[];\n\trunId?: string;\n\tsubagentEntryId?: string; // SubagentRunEntry.id,用于 getSubagentMessages\n\ttimestamp?: string; // ISO timestamp for chronological sorting\n}\n\nfunction formatToolArgs(toolName: string, argsJson: string | undefined): string {\n\tif (!argsJson) return \"\";\n\ttry {\n\t\tconst args: Record<string, unknown> = JSON.parse(argsJson);\n\t\tswitch (toolName) {\n\t\t\tcase \"bash\":\n\t\t\t\treturn typeof args.command === \"string\" ? truncate(args.command, 60) : truncate(argsJson, 60);\n\t\t\tcase \"read\":\n\t\t\t\treturn truncate(String(args.file_path ?? args.path ?? argsJson), 60);\n\t\t\tcase \"edit\":\n\t\t\t\treturn truncate(String(args.path ?? args.file_path ?? argsJson), 60);\n\t\t\tcase \"write\":\n\t\t\t\treturn truncate(String(args.path ?? args.file_path ?? argsJson), 60);\n\t\t\tcase \"ls\":\n\t\t\t\treturn truncate(String(args.path ?? args.dir ?? \".\"), 60);\n\t\t\tcase \"grep\": {\n\t\t\t\tconst pattern = String(args.pattern ?? \"\");\n\t\t\t\tconst searchPath = args.path ? ` in ${args.path}` : \"\";\n\t\t\t\tconst include = args.glob ? ` (${args.glob})` : \"\";\n\t\t\t\treturn truncate(`/${pattern}/${searchPath}${include}`, 60);\n\t\t\t}\n\t\t\tcase \"find\": {\n\t\t\t\tconst pattern = String(args.pattern ?? args.glob ?? \"\");\n\t\t\t\tconst searchPath = args.path ? ` in ${args.path}` : \"\";\n\t\t\t\treturn truncate(`${pattern}${searchPath}`, 60);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn truncate(argsJson, 60);\n\t\t}\n\t} catch {\n\t\treturn truncate(argsJson, 60);\n\t}\n}\n\nfunction truncate(text: string, maxLength: number): string {\n\treturn text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;\n}\n\nexport function displayTitle(item: { title?: string; task: string }): string {\n\treturn item.title ?? item.task.slice(0, 7);\n}\n\nfunction countToolCalls(events: SubagentRunEvent[]): number {\n\treturn events.filter((e) => e.currentTool && e.currentToolArgs).length;\n}\n\nfunction extractRecentTools(events: SubagentRunEvent[], max: number): string[] {\n\treturn events\n\t\t.filter((e) => e.currentTool && e.currentToolArgs)\n\t\t.slice(-max)\n\t\t.map((e) => {\n\t\t\tconst args = formatToolArgs(e.currentTool!, e.currentToolArgs);\n\t\t\treturn `${e.currentTool}${args ? ` ${args}` : \"\"}`;\n\t\t});\n}\n\nfunction latestByIndex(events: SubagentRunEvent[]): Map<number, SubagentRunEvent> {\n\tconst byIndex = new Map<number, SubagentRunEvent>();\n\tfor (const event of events) {\n\t\tbyIndex.set(event.index, event);\n\t}\n\treturn byIndex;\n}\n\nfunction latestDefined<T>(\n\tevents: SubagentRunEvent[],\n\tselect: (event: SubagentRunEvent) => T | undefined,\n): T | undefined {\n\tfor (let index = events.length - 1; index >= 0; index--) {\n\t\tconst value = select(events[index]);\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction latestEvents(events: SubagentRunEvent[]): SubagentDetailsItem[] {\n\tconst byIndex = latestByIndex(events);\n\treturn Array.from(byIndex.values())\n\t\t.sort((a, b) => a.index - b.index)\n\t\t.map((event) => {\n\t\t\tconst itemEvents = events.filter((candidate) => candidate.index === event.index);\n\t\t\t// Use earliest event timestamp as creation time (stable across status updates)\n\t\t\tconst startTimestamp = new Date(Math.min(...itemEvents.map((e) => e.timestamp))).toISOString();\n\t\t\treturn {\n\t\t\t\tindex: event.index,\n\t\t\t\tagent: event.agent,\n\t\t\t\ttitle: event.title,\n\t\t\t\ttask: event.task,\n\t\t\t\tstatus: event.status,\n\t\t\t\tmodel: event.model,\n\t\t\t\tthinking: event.thinking,\n\t\t\t\terror: event.error,\n\t\t\t\ttotalTokens: event.usage?.totalTokens,\n\t\t\t\ttoolCount: countToolCalls(itemEvents),\n\t\t\t\trecentTools: extractRecentTools(itemEvents, 3),\n\t\t\t\toutputSummary: latestDefined(itemEvents, (candidate) => candidate.outputSummary),\n\t\t\t\tevents: itemEvents,\n\t\t\t\trunId: event.runId,\n\t\t\t\ttimestamp: startTimestamp,\n\t\t\t};\n\t\t});\n}\n\nexport function resultItems(data: SubagentDetailsData): SubagentDetailsItem[] {\n\tconst latest = latestByIndex(data.events);\n\tlet items: SubagentDetailsItem[];\n\n\tif (!data.result) {\n\t\titems = latestEvents(data.events);\n\t} else {\n\t\titems = data.result.results.map((result: SubagentTaskResult) => {\n\t\t\tconst latestEvent = latest.get(result.index);\n\t\t\tconst resultEvents =\n\t\t\t\tresult.events.length > 0 ? result.events : data.events.filter((event) => event.index === result.index);\n\t\t\t// Extract runId from events (all events in one call share the same runId prefix)\n\t\t\tconst eventRunId = resultEvents.length > 0 ? resultEvents[0].runId : undefined;\n\t\t\t// Use earliest event timestamp as the start time\n\t\t\tconst startTimestamp =\n\t\t\t\tresultEvents.length > 0\n\t\t\t\t\t? new Date(Math.min(...resultEvents.map((e) => e.timestamp))).toISOString()\n\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tindex: result.index,\n\t\t\t\tagent: result.agent,\n\t\t\t\ttitle: result.title,\n\t\t\t\ttask: result.task,\n\t\t\t\tstatus: latestEvent?.status ?? result.status,\n\t\t\t\tmodel: latestEvent?.model ?? result.model,\n\t\t\t\tthinking: latestEvent?.thinking ?? result.thinking,\n\t\t\t\toutput: result.output,\n\t\t\t\terror: latestEvent?.error ?? result.error,\n\t\t\t\ttotalTokens: latestEvent?.usage?.totalTokens ?? result.usage?.totalTokens,\n\t\t\t\ttoolCount: countToolCalls(resultEvents),\n\t\t\t\trecentTools: extractRecentTools(resultEvents, 3),\n\t\t\t\toutputSummary: latestDefined(resultEvents, (event) => event.outputSummary),\n\t\t\t\tevents: resultEvents,\n\t\t\t\trunId: eventRunId,\n\t\t\t\ttimestamp: startTimestamp,\n\t\t\t};\n\t\t});\n\t}\n\n\t// Add historical entries not already covered by live data.\n\t// Use runId:index for dedup: different subagent calls have different runIds,\n\t// so entries from previous calls are not mistakenly skipped by matching on\n\t// the non-unique task index alone. Same runId + same index = same subagent run.\n\tif (data.historicalEntries && data.historicalEntries.length > 0) {\n\t\tconst liveKeys = new Set(\n\t\t\titems.filter((item) => item.runId !== undefined).map((item) => `${item.runId}:${item.index}`),\n\t\t);\n\t\tfor (const entry of data.historicalEntries) {\n\t\t\tconst key = `${entry.runId}:${entry.index}`;\n\t\t\tif (!liveKeys.has(key)) {\n\t\t\t\titems.push({\n\t\t\t\t\tindex: entry.index,\n\t\t\t\t\tagent: entry.agent,\n\t\t\t\t\ttitle: entry.title,\n\t\t\t\t\ttask: entry.task,\n\t\t\t\t\tstatus: entry.status,\n\t\t\t\t\tmodel: entry.model,\n\t\t\t\t\tthinking: entry.thinking,\n\t\t\t\t\terror: entry.error,\n\t\t\t\t\ttotalTokens: entry.totalTokens,\n\t\t\t\t\ttoolCount: entry.toolCount,\n\t\t\t\t\trecentTools: [],\n\t\t\t\t\toutputSummary: entry.outputSummary,\n\t\t\t\t\tevents: [],\n\t\t\t\t\trunId: entry.runId,\n\t\t\t\t\tsubagentEntryId: entry.id,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Preserve insertion order: live items first (by index), then historical entries.\n\t// Do NOT sort by timestamp — sorting mixes live and historical items with the\n\t// same task index, causing getChildSession(index) to return the wrong session.\n\treturn items;\n}\n\nexport function statusColor(status: string): \"success\" | \"error\" | \"warning\" | \"muted\" {\n\tif (status === \"success\") return \"success\";\n\tif (status === \"failed\" || status === \"aborted\") return \"error\";\n\tif (status === \"running\") return \"warning\";\n\treturn \"muted\";\n}\n\nfunction clampSelectedIndex(selectedIndex: number, itemCount: number): number {\n\tif (itemCount === 0) return 0;\n\treturn Math.max(0, Math.min(selectedIndex, itemCount - 1));\n}\n\nfunction eventText(event: SubagentRunEvent): string {\n\tconst parts: string[] = [event.status];\n\tif (event.currentTool) {\n\t\tconst args = event.currentToolArgs ? ` ${event.currentToolArgs}` : \"\";\n\t\tparts.push(`tool=${event.currentTool}${args}`);\n\t}\n\tif (event.toolResultSummary) parts.push(`result=${event.toolResultSummary}`);\n\tif (event.outputSummary) {\n\t\tparts.push(\n\t\t\tevent.currentTool || event.toolResultSummary || event.error\n\t\t\t\t? `output=${event.outputSummary}`\n\t\t\t\t: \"assistant output update\",\n\t\t);\n\t}\n\tif (event.error) parts.push(`error=${event.error}`);\n\tif (event.usage?.totalTokens !== undefined) parts.push(`tokens=${event.usage.totalTokens}`);\n\treturn parts.join(\" \");\n}\n\nexport function compactEventTexts(events: SubagentRunEvent[]): Array<{ text: string; count: number }> {\n\tconst compacted: Array<{ text: string; count: number }> = [];\n\tfor (const event of events) {\n\t\tconst text = eventText(event);\n\t\tconst previous = compacted.at(-1);\n\t\tif (previous?.text === text) {\n\t\t\tprevious.count++;\n\t\t} else {\n\t\t\tcompacted.push({ text, count: 1 });\n\t\t}\n\t}\n\treturn compacted;\n}\n\nexport class SubagentPickerComponent extends Container {\n\tprivate data: SubagentDetailsData;\n\tprivate selectedIndex = 0;\n\tprivate onSelect: (index: number) => void;\n\tprivate onCancel: () => void;\n\n\tconstructor(data: SubagentDetailsData, onSelect: (index: number) => void, onCancel: () => void) {\n\t\tsuper();\n\t\tthis.data = data;\n\t\tthis.onSelect = onSelect;\n\t\tthis.onCancel = onCancel;\n\t\tthis.rebuild();\n\t}\n\n\tupdate(data: SubagentDetailsData): void {\n\t\tthis.data = data;\n\t\tthis.selectedIndex = clampSelectedIndex(this.selectedIndex, resultItems(data).length);\n\t\tthis.rebuild();\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tconst items = resultItems(this.data);\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.rebuild();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(items.length - 1, this.selectedIndex + 1);\n\t\t\tthis.rebuild();\n\t\t} else if (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tconst selected = items[this.selectedIndex];\n\t\t\tif (selected) this.onSelect(selected.index);\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel();\n\t\t}\n\t}\n\n\tprivate rebuild(): void {\n\t\tthis.clear();\n\t\tconst items = resultItems(this.data);\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Select a subagent\")), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tif (items.length === 0) {\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", \"No subagent runs captured yet.\"), 1, 0));\n\t\t} else {\n\t\t\tfor (let index = 0; index < items.length; index++) {\n\t\t\t\tconst item = items[index];\n\t\t\t\tconst selected = index === this.selectedIndex;\n\t\t\t\tconst pointer = selected ? theme.fg(\"accent\", \"-> \") : \" \";\n\t\t\t\tconst status = theme.fg(statusColor(item.status), item.status);\n\t\t\t\tconst usage = item.totalTokens === undefined ? \"\" : theme.fg(\"muted\", ` tokens=${item.totalTokens}`);\n\t\t\t\tconst tools = theme.fg(\"muted\", ` tools=${item.toolCount}`);\n\t\t\t\tconst lastTool = item.recentTools.length > 0 ? theme.fg(\"muted\", ` → ${item.recentTools.at(-1)}`) : \"\";\n\t\t\t\tthis.addChild(\n\t\t\t\t\tnew Text(\n\t\t\t\t\t\t`${pointer}${item.index + 1}. ${displayTitle(item)} ${status}${usage}${tools}${lastTool}`,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t0,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\t`${rawKeyHint(\"↑↓/j/k\", \"navigate\")} ${keyHint(\"tui.select.confirm\", \"enter\")} ${keyHint(\"tui.select.cancel\", \"close\")}`,\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n}\n\nexport class SubagentRunViewComponent {\n\tprivate data: SubagentDetailsData;\n\tprivate selectedIndex: number;\n\tprivate onCancel: () => void;\n\n\tconstructor(data: SubagentDetailsData, selectedIndex: number, onCancel: () => void) {\n\t\tthis.data = data;\n\t\tthis.selectedIndex = selectedIndex;\n\t\tthis.onCancel = onCancel;\n\t}\n\n\tupdate(data: SubagentDetailsData): void {\n\t\tthis.data = data;\n\t}\n\n\tgetAgentName(): string | undefined {\n\t\treturn this.getSelectedItem()?.agent;\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel();\n\t\t}\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst item = this.getSelectedItem();\n\t\tconst lines: string[] = [];\n\t\tlines.push(theme.fg(\"accent\", theme.bold(`Subagent ${item ? displayTitle(item) : \"\"}`)).trimEnd());\n\t\tlines.push(theme.fg(\"muted\", \"Esc returns to the main Agent\"));\n\t\tlines.push(\"\");\n\n\t\tif (!item) {\n\t\t\tlines.push(theme.fg(\"muted\", \"No subagent run is selected.\"));\n\t\t\treturn lines.map((line) => truncateToWidth(line, width, \"...\"));\n\t\t}\n\n\t\tconst status = theme.fg(statusColor(item.status), item.status);\n\t\tconst usage = item.totalTokens === undefined ? \"\" : ` tokens=${item.totalTokens}`;\n\t\tlines.push(`${theme.bold(\"Status\")} ${status}${theme.fg(\"muted\", usage)}`);\n\t\tlines.push(\n\t\t\ttheme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\t`model=${item.model ?? \"default\"} thinking=${item.thinking ?? \"default\"} index=${item.index + 1} tools=${item.toolCount}`,\n\t\t\t),\n\t\t);\n\t\tlines.push(`${theme.bold(\"Task\")} ${item.task}`);\n\n\t\tlines.push(theme.bold(\"Recent Tools\") + theme.fg(\"muted\", ` (${item.toolCount} total)`));\n\t\tif (item.recentTools.length > 0) {\n\t\t\tfor (const tool of item.recentTools) {\n\t\t\t\tlines.push(theme.fg(\"muted\", ` --${tool}`));\n\t\t\t}\n\t\t} else {\n\t\t\tlines.push(theme.fg(\"muted\", \" (no tool calls)\"));\n\t\t}\n\n\t\tif (item.outputSummary) {\n\t\t\tlines.push(`${theme.bold(\"Latest Output\")} ${item.outputSummary}`);\n\t\t}\n\t\tif (item.error) {\n\t\t\tlines.push(theme.fg(\"error\", `${theme.bold(\"Error\")} ${item.error}`));\n\t\t}\n\t\tif (item.output) {\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(theme.bold(\"Final Output\"));\n\t\t\tfor (const line of item.output.split(\"\\n\")) {\n\t\t\t\tlines.push(theme.fg(\"toolOutput\", line));\n\t\t\t}\n\t\t}\n\n\t\tlines.push(\"\");\n\t\tlines.push(theme.bold(\"Events\"));\n\t\tconst events = compactEventTexts(item.events).slice(-16);\n\t\tif (events.length === 0) {\n\t\t\tlines.push(theme.fg(\"muted\", \"No events captured yet.\"));\n\t\t} else {\n\t\t\tfor (const event of events) {\n\t\t\t\tconst repeated = event.count > 1 ? ` (repeated ${event.count}x)` : \"\";\n\t\t\t\tlines.push(theme.fg(\"muted\", `- ${event.text}${repeated}`));\n\t\t\t}\n\t\t}\n\n\t\treturn lines.map((line) => truncateToWidth(line, width, \"...\"));\n\t}\n\n\tprivate getSelectedItem(): SubagentDetailsItem | undefined {\n\t\tconst items = resultItems(this.data);\n\t\treturn items.find((item) => item.index === this.selectedIndex) ?? items[0];\n\t}\n}\n"]}
@@ -0,0 +1,51 @@
1
+ import type { AgentMessage } from "@schovest/pi-agent-core";
2
+ import { Container } from "@schovest/pi-tui";
3
+ import type { AgentSession } from "../../../core/agent-session.ts";
4
+ import { type SubagentDetailsData } from "./subagent-details.ts";
5
+ export interface SubagentOverlayOptions {
6
+ data: SubagentDetailsData;
7
+ onClose: () => void;
8
+ renderMessages: (messages: AgentMessage[], container: Container, expanded: boolean) => void;
9
+ getChildSession: (index: number) => AgentSession | undefined;
10
+ requestRender: () => void;
11
+ getTerminalHeight: () => number;
12
+ /** Load historical subagent messages from inline session data */
13
+ getSubagentMessages?: (subagentEntryId: string) => AgentMessage[];
14
+ /** Clear TUI selection when overlay scrolls (prevents stale highlight) */
15
+ clearSelection?: () => void;
16
+ }
17
+ export declare class SubagentOverlayComponent extends Container {
18
+ private data;
19
+ private onClose;
20
+ private renderMessages;
21
+ private getChildSession;
22
+ private requestRender;
23
+ private getTerminalHeight;
24
+ private getSubagentMessages?;
25
+ private clearSelection?;
26
+ private selectedIndex;
27
+ private expanded;
28
+ private detailScrollOffset;
29
+ private leftPanel;
30
+ private rightPanel;
31
+ private rightContent;
32
+ private rightFooter;
33
+ private childUnsubscribe;
34
+ constructor(options: SubagentOverlayOptions);
35
+ /** Clean up subscriptions when the overlay is destroyed. */
36
+ destroy(): void;
37
+ update(data: SubagentDetailsData): void;
38
+ handleInput(keyData: string): boolean;
39
+ private rebuild;
40
+ private rebuildLeftPanel;
41
+ private rebuildRightPanel;
42
+ private subscribeToSelectedChild;
43
+ private unsubscribeFromChild;
44
+ private getMessagesForAgent;
45
+ /** Clamp scroll offset to valid range based on current content. */
46
+ private clampScrollOffset;
47
+ /** Calculate the left panel (list) width for a given total width. */
48
+ static getListWidth(width: number): number;
49
+ render(width: number): string[];
50
+ }
51
+ //# sourceMappingURL=subagent-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-overlay.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/subagent-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAA0D,MAAM,kBAAkB,CAAC;AACrG,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,gCAAgC,CAAC;AAKtF,OAAO,EAGN,KAAK,mBAAmB,EAGxB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5F,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,CAAC;IAC7D,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,YAAY,EAAE,CAAC;IAClE,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAkCD,qBAAa,wBAAyB,SAAQ,SAAS;IACtD,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,cAAc,CAA8E;IACpG,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,mBAAmB,CAAC,CAA8C;IAC1E,OAAO,CAAC,cAAc,CAAC,CAAa;IAEpC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,kBAAkB,CAAK;IAE/B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,WAAW,CAAY;IAE/B,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,YAAY,OAAO,EAAE,sBAAsB,EAkB1C;IAED,4DAA4D;IAC5D,OAAO,IAAI,IAAI,CAEd;IAED,MAAM,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAKtC;IAED,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAyEpC;IAED,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,iBAAiB;IA2DzB,OAAO,CAAC,wBAAwB;IAmChC,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,mBAAmB;IA4B3B,mEAAmE;IACnE,OAAO,CAAC,iBAAiB;IAWzB,qEAAqE;IACrE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA+B9B;CACD","sourcesContent":["import type { AgentMessage } from \"@schovest/pi-agent-core\";\nimport { Container, getKeybindings, matchesKey, Spacer, Text, visibleWidth } from \"@schovest/pi-tui\";\nimport type { AgentSession, AgentSessionEvent } from \"../../../core/agent-session.ts\";\nimport type { SubagentTaskResult } from \"../../../core/subagents/types.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { rawKeyHint } from \"./keybinding-hints.ts\";\nimport {\n\tdisplayTitle,\n\tresultItems,\n\ttype SubagentDetailsData,\n\ttype SubagentDetailsItem,\n\tstatusColor,\n} from \"./subagent-details.ts\";\n\nexport interface SubagentOverlayOptions {\n\tdata: SubagentDetailsData;\n\tonClose: () => void;\n\trenderMessages: (messages: AgentMessage[], container: Container, expanded: boolean) => void;\n\tgetChildSession: (index: number) => AgentSession | undefined;\n\trequestRender: () => void;\n\tgetTerminalHeight: () => number;\n\t/** Load historical subagent messages from inline session data */\n\tgetSubagentMessages?: (subagentEntryId: string) => AgentMessage[];\n\t/** Clear TUI selection when overlay scrolls (prevents stale highlight) */\n\tclearSelection?: () => void;\n}\n\ninterface AgentListItem {\n\tindex: number;\n\tagent: string;\n\ttitle?: string;\n\ttask: string;\n\tstatus: string;\n\tmodel?: string;\n\tthinking?: string;\n\ttotalTokens?: number;\n\ttoolCount: number;\n\trecentTools: string[];\n\trunId?: string;\n\tsubagentEntryId?: string;\n}\n\nfunction toListItems(data: SubagentDetailsData): AgentListItem[] {\n\treturn resultItems(data).map((item: SubagentDetailsItem) => ({\n\t\tindex: item.index,\n\t\tagent: item.agent,\n\t\ttitle: item.title,\n\t\ttask: item.task,\n\t\tstatus: item.status,\n\t\tmodel: item.model,\n\t\tthinking: item.thinking,\n\t\ttotalTokens: item.totalTokens,\n\t\ttoolCount: item.toolCount,\n\t\trecentTools: item.recentTools,\n\t\trunId: item.runId,\n\t\tsubagentEntryId: item.subagentEntryId,\n\t}));\n}\n\nexport class SubagentOverlayComponent extends Container {\n\tprivate data: SubagentDetailsData;\n\tprivate onClose: () => void;\n\tprivate renderMessages: (messages: AgentMessage[], container: Container, expanded: boolean) => void;\n\tprivate getChildSession: (index: number) => AgentSession | undefined;\n\tprivate requestRender: () => void;\n\tprivate getTerminalHeight: () => number;\n\tprivate getSubagentMessages?: (subagentEntryId: string) => AgentMessage[];\n\tprivate clearSelection?: () => void;\n\n\tprivate selectedIndex = 0;\n\tprivate expanded = false;\n\tprivate detailScrollOffset = 0;\n\n\tprivate leftPanel: Container;\n\tprivate rightPanel: Container;\n\tprivate rightContent: Container;\n\tprivate rightFooter: Container;\n\n\tprivate childUnsubscribe: (() => void) | undefined;\n\n\tconstructor(options: SubagentOverlayOptions) {\n\t\tsuper();\n\t\tthis.data = options.data;\n\t\tthis.onClose = options.onClose;\n\t\tthis.renderMessages = options.renderMessages;\n\t\tthis.getChildSession = options.getChildSession;\n\t\tthis.requestRender = options.requestRender;\n\t\tthis.getTerminalHeight = options.getTerminalHeight;\n\t\tthis.getSubagentMessages = options.getSubagentMessages;\n\t\tthis.clearSelection = options.clearSelection;\n\n\t\tthis.leftPanel = new Container();\n\t\tthis.rightPanel = new Container();\n\t\tthis.rightContent = new Container();\n\t\tthis.rightFooter = new Container();\n\n\t\tthis.rebuild();\n\t\tthis.subscribeToSelectedChild();\n\t}\n\n\t/** Clean up subscriptions when the overlay is destroyed. */\n\tdestroy(): void {\n\t\tthis.unsubscribeFromChild();\n\t}\n\n\tupdate(data: SubagentDetailsData): void {\n\t\tthis.data = data;\n\t\tthis.selectedIndex = Math.max(0, Math.min(this.selectedIndex, toListItems(data).length - 1));\n\t\tthis.rebuild();\n\t\tthis.subscribeToSelectedChild();\n\t}\n\n\thandleInput(keyData: string): boolean {\n\t\tconst kb = getKeybindings();\n\t\tconst items = toListItems(this.data);\n\n\t\tif (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onClose();\n\t\t\treturn true;\n\t\t}\n\n\t\t// ↑/↓/j/k — left panel list navigation\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = this.selectedIndex <= 0 ? items.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.detailScrollOffset = 0;\n\t\t\tthis.rebuild();\n\t\t\tthis.subscribeToSelectedChild();\n\t\t\treturn true;\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = this.selectedIndex >= items.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.detailScrollOffset = 0;\n\t\t\tthis.rebuild();\n\t\t\tthis.subscribeToSelectedChild();\n\t\t\treturn true;\n\t\t}\n\n\t\t// Ctrl-O — toggle expand/collapse\n\t\tif (keyData === \"\\x0f\") {\n\t\t\tthis.expanded = !this.expanded;\n\t\t\tthis.rebuildRightPanel();\n\t\t\treturn true;\n\t\t}\n\n\t\t// Right panel scrolling — PgUp/PgDn, Home/End, mouse wheel\n\t\tconst pageAmount = this.getTerminalHeight() - 4;\n\t\tif (keyData === \"\\x1b[scrollUp\") {\n\t\t\tthis.detailScrollOffset = Math.max(0, this.detailScrollOffset - 3);\n\t\t\tthis.clearSelection?.();\n\t\t\tthis.rebuildRightPanel();\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t} else if (keyData === \"\\x1b[scrollDown\") {\n\t\t\tthis.detailScrollOffset += 3;\n\t\t\tthis.clearSelection?.();\n\t\t\tthis.rebuildRightPanel();\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t} else if (matchesKey(keyData, \"pageUp\")) {\n\t\t\tthis.detailScrollOffset = Math.max(0, this.detailScrollOffset - pageAmount);\n\t\t\tthis.clearSelection?.();\n\t\t\tthis.rebuildRightPanel();\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t} else if (matchesKey(keyData, \"pageDown\")) {\n\t\t\tthis.detailScrollOffset += pageAmount;\n\t\t\tthis.clearSelection?.();\n\t\t\tthis.rebuildRightPanel();\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t} else if (matchesKey(keyData, \"home\") || keyData === \"g\") {\n\t\t\tthis.detailScrollOffset = 0;\n\t\t\tthis.clearSelection?.();\n\t\t\tthis.rebuildRightPanel();\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t} else if (matchesKey(keyData, \"end\") || keyData === \"G\") {\n\t\t\tthis.detailScrollOffset = Number.MAX_SAFE_INTEGER;\n\t\t\tthis.clampScrollOffset();\n\t\t\tthis.clearSelection?.();\n\t\t\tthis.rebuildRightPanel();\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate rebuild(): void {\n\t\tthis.leftPanel.clear();\n\t\tthis.rightPanel.clear();\n\n\t\tthis.rebuildLeftPanel();\n\t\tthis.rebuildRightPanel();\n\t}\n\n\tprivate rebuildLeftPanel(): void {\n\t\tthis.leftPanel.clear();\n\t\tconst items = toListItems(this.data);\n\t\tconst running = items.filter((i) => i.status === \"running\").length;\n\t\tconst completed = items.filter((i) => i.status !== \"running\").length;\n\n\t\tthis.leftPanel.addChild(new DynamicBorder());\n\t\tthis.leftPanel.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\"accent\", theme.bold(`Subagents`)) +\n\t\t\t\t\ttheme.fg(\"muted\", ` (${running} running, ${completed} done)`) +\n\t\t\t\t\ttheme.fg(\"dim\", ` Esc close`),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.leftPanel.addChild(new Spacer(1));\n\n\t\tif (items.length === 0) {\n\t\t\tthis.leftPanel.addChild(new Text(theme.fg(\"muted\", \"No subagent runs.\"), 1, 0));\n\t\t} else {\n\t\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\t\tconst item = items[i];\n\t\t\t\tconst selected = i === this.selectedIndex;\n\t\t\t\tconst pointer = selected ? theme.fg(\"accent\", \"> \") : \" \";\n\t\t\t\tconst status = theme.fg(statusColor(item.status), item.status);\n\t\t\t\tconst usage = item.totalTokens === undefined ? \"\" : theme.fg(\"muted\", ` t=${item.totalTokens}`);\n\t\t\t\tconst tools = theme.fg(\"muted\", ` tools=${item.toolCount}`);\n\t\t\t\tconst lastTool = item.recentTools.length > 0 ? theme.fg(\"muted\", ` -> ${item.recentTools.at(-1)}`) : \"\";\n\t\t\t\tthis.leftPanel.addChild(\n\t\t\t\t\tnew Text(`${pointer}${i + 1}. ${displayTitle(item)} ${status}${usage}${tools}${lastTool}`, 1, 0),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.leftPanel.addChild(new Spacer(1));\n\t\tthis.leftPanel.addChild(new Text(`${rawKeyHint(\"↑↓/j/k\", \"nav\")} ${rawKeyHint(\"Esc\", \"close\")}`, 1, 0));\n\t\tthis.leftPanel.addChild(new DynamicBorder());\n\t}\n\n\tprivate rebuildRightPanel(): void {\n\t\tthis.rightPanel.clear();\n\t\tthis.rightContent.clear();\n\t\tthis.rightFooter.clear();\n\n\t\tconst items = toListItems(this.data);\n\t\tconst item = items[this.selectedIndex];\n\t\tconst detailsItem = resultItems(this.data)[this.selectedIndex];\n\n\t\tif (!item) {\n\t\t\tthis.rightPanel.addChild(new Text(theme.fg(\"muted\", \"Select a subagent\"), 1, 0));\n\t\t\treturn;\n\t\t}\n\n\t\tconst status = theme.fg(statusColor(item.status), item.status);\n\t\tconst usage = item.totalTokens === undefined ? \"\" : ` tokens=${item.totalTokens}`;\n\n\t\tthis.rightPanel.addChild(new DynamicBorder());\n\t\tthis.rightPanel.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.bold(`${displayTitle(item)}`) +\n\t\t\t\t\t` ${status}` +\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"muted\",\n\t\t\t\t\t\t`${usage} model=${item.model ?? \"default\"} thinking=${item.thinking ?? \"default\"} agent=${item.agent}`,\n\t\t\t\t\t),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.rightPanel.addChild(new Text(theme.fg(\"muted\", `Task: ${detailsItem?.task ?? \"\"}`), 1, 0));\n\t\tthis.rightPanel.addChild(new Spacer(1));\n\n\t\tconst messages = this.getMessagesForAgent(item);\n\t\t// Historical entries (subagentEntryId) are never \"running\"; only check\n\t\t// live child session for current-run items to avoid false matches.\n\t\tconst isCompleted =\n\t\t\titem.subagentEntryId != null || (item.status !== \"running\" && !this.getChildSession(item.index));\n\t\tconst effectiveExpanded = this.expanded || isCompleted;\n\t\tif (messages.length > 0) {\n\t\t\tthis.renderMessages(messages, this.rightContent, effectiveExpanded);\n\t\t} else {\n\t\t\tthis.rightContent.addChild(new Text(theme.fg(\"muted\", \"(no messages yet)\"), 1, 0));\n\t\t}\n\n\t\tthis.rightPanel.addChild(this.rightContent);\n\n\t\tthis.rightFooter.addChild(new Spacer(1));\n\t\tthis.rightFooter.addChild(new DynamicBorder());\n\t\tthis.rightFooter.addChild(\n\t\t\tnew Text(\n\t\t\t\t`${rawKeyHint(\"Ctrl-O\", this.expanded ? \"collapse\" : \"expand\")} ${rawKeyHint(\"PgUp/PgDn/Home/End\", \"scroll\")}`,\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.rightPanel.addChild(this.rightFooter);\n\t}\n\n\tprivate subscribeToSelectedChild(): void {\n\t\tthis.unsubscribeFromChild();\n\n\t\tconst items = toListItems(this.data);\n\t\tconst item = items[this.selectedIndex];\n\t\tif (!item) return;\n\n\t\t// Historical entries should not subscribe to a live child session —\n\t\t// getChildSession(index) would return the wrong session for a historical\n\t\t// item that shares the same task index as a currently running subagent.\n\t\tif (item.subagentEntryId) return;\n\n\t\tconst child = this.getChildSession(item.index);\n\t\tif (!child) return;\n\n\t\tthis.childUnsubscribe = child.subscribe((event: AgentSessionEvent) => {\n\t\t\tswitch (event.type) {\n\t\t\t\tcase \"message_start\":\n\t\t\t\tcase \"message_update\":\n\t\t\t\tcase \"message_end\":\n\t\t\t\tcase \"tool_execution_start\":\n\t\t\t\tcase \"tool_execution_update\":\n\t\t\t\tcase \"tool_execution_end\":\n\t\t\t\t\tthis.rebuildRightPanel();\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"agent_end\":\n\t\t\t\t\tthis.rebuildRightPanel();\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t\tthis.childUnsubscribe = undefined;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate unsubscribeFromChild(): void {\n\t\tif (this.childUnsubscribe) {\n\t\t\tthis.childUnsubscribe();\n\t\t\tthis.childUnsubscribe = undefined;\n\t\t}\n\t}\n\n\tprivate getMessagesForAgent(item: AgentListItem): AgentMessage[] {\n\t\t// Historical entries (with subagentEntryId) must skip live session lookup —\n\t\t// getChildSession(index) only uses the task index and would return the\n\t\t// currently running session even for a historical item sharing the same index.\n\t\tif (!item.subagentEntryId) {\n\t\t\t// 1. Live child session (current run only)\n\t\t\tconst child = this.getChildSession(item.index);\n\t\t\tif (child) {\n\t\t\t\treturn child.messages;\n\t\t\t}\n\t\t\t// 2. Result from current run\n\t\t\tif (this.data.result) {\n\t\t\t\tconst taskResult = this.data.result.results.find(\n\t\t\t\t\t(r: SubagentTaskResult) =>\n\t\t\t\t\t\tr.index === item.index && (item.runId === undefined || r.events.some((e) => e.runId === item.runId)),\n\t\t\t\t);\n\t\t\t\tif (taskResult) {\n\t\t\t\t\treturn taskResult.messages;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// 3. Inline historical messages from parent session (by subagentEntryId)\n\t\tif (this.getSubagentMessages && item.subagentEntryId) {\n\t\t\treturn this.getSubagentMessages(item.subagentEntryId);\n\t\t}\n\t\treturn [];\n\t}\n\n\t/** Clamp scroll offset to valid range based on current content. */\n\tprivate clampScrollOffset(): void {\n\t\t// Use a reasonable width estimate (80% of terminal) for measurement.\n\t\t// The final clamp happens in render() which uses the actual width,\n\t\t// so this is just an approximate cap to avoid hugely inflated offsets.\n\t\tconst termHeight = this.getTerminalHeight();\n\t\tconst estimatedWidth = Math.max(40, Math.floor(process.stdout.columns * 0.7));\n\t\tconst rightLines = this.rightPanel.render(estimatedWidth);\n\t\tconst maxOffset = Math.max(0, rightLines.length - termHeight);\n\t\tthis.detailScrollOffset = Math.max(0, Math.min(this.detailScrollOffset, maxOffset));\n\t}\n\n\t/** Calculate the left panel (list) width for a given total width. */\n\tstatic getListWidth(width: number): number {\n\t\treturn Math.max(20, Math.min(40, Math.floor(width * 0.3)));\n\t}\n\n\trender(width: number): string[] {\n\t\tconst listWidth = SubagentOverlayComponent.getListWidth(width);\n\t\tconst detailWidth = width - listWidth - 1;\n\t\tconst termHeight = this.getTerminalHeight();\n\t\tconst sep = theme.fg(\"border\", \"│\");\n\n\t\tconst leftLines = this.leftPanel.render(listWidth);\n\t\tconst rightLines = this.rightPanel.render(Math.max(1, detailWidth));\n\n\t\tconst maxOffset = Math.max(0, rightLines.length - termHeight);\n\t\tconst scrollOffset = Math.max(0, Math.min(this.detailScrollOffset, maxOffset));\n\t\t// Sync the stored offset to the clamped value so that subsequent\n\t\t// scroll operations (PageUp/k) start from the visually correct position.\n\t\t// Without this, a stale inflated offset (e.g. from clampScrollOffset\n\t\t// using width=1) causes PageUp to appear unresponsive.\n\t\tthis.detailScrollOffset = scrollOffset;\n\n\t\tconst visibleRight = rightLines.slice(scrollOffset, scrollOffset + termHeight);\n\t\twhile (visibleRight.length < termHeight) {\n\t\t\tvisibleRight.push(\"\");\n\t\t}\n\n\t\tconst result: string[] = [];\n\t\tfor (let i = 0; i < termHeight; i++) {\n\t\t\tconst left = i < leftLines.length ? leftLines[i] : \"\";\n\t\t\tconst right = visibleRight[i] ?? \"\";\n\t\t\tconst leftPadded = padToWidth(left, listWidth);\n\t\t\tresult.push(leftPadded + sep + right);\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\nfunction padToWidth(line: string, width: number): string {\n\tconst currentWidth = visibleWidth(line);\n\tif (currentWidth >= width) return line;\n\treturn line + \" \".repeat(width - currentWidth);\n}\n"]}