@selesai/code 0.13.3 → 0.13.5

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 (511) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cli/credential-print.js +4 -4
  3. package/dist/cli.js +0 -0
  4. package/dist/core/compaction/utils.js +2 -2
  5. package/dist/core/export-html/template.css +1066 -1066
  6. package/dist/core/export-html/template.html +55 -55
  7. package/dist/core/export-html/template.js +1864 -1864
  8. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  9. package/dist/core/export-html/vendor/marked.min.js +78 -78
  10. package/dist/core/messages.js +7 -7
  11. package/dist/defaults/models.json +17 -1
  12. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  13. package/dist/extensions/context-compaction-reminder.ts +28 -28
  14. package/dist/extensions/cost-reconcile.test.ts +24 -5
  15. package/dist/extensions/cost-reconcile.ts +14 -7
  16. package/dist/extensions/pi-hermes-memory/scripts/check-min-sdk.mjs +0 -0
  17. package/dist/extensions/pi-hermes-memory/tests/run-all.sh +0 -0
  18. package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
  19. package/dist/extensions/pi-intercom/LICENSE +21 -21
  20. package/dist/extensions/pi-intercom/README.md +4 -5
  21. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  22. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  23. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  24. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  25. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  26. package/dist/extensions/pi-intercom/config.test.ts +3 -31
  27. package/dist/extensions/pi-intercom/config.ts +0 -15
  28. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  29. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  30. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  31. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  32. package/dist/extensions/pi-intercom/index.ts +9 -46
  33. package/dist/extensions/pi-intercom/intercom.integration.test.ts +49 -57
  34. package/dist/extensions/pi-intercom/package.json +1 -1
  35. package/dist/extensions/pi-intercom/reply-tracker.test.ts +20 -0
  36. package/dist/extensions/pi-intercom/reply-tracker.ts +8 -0
  37. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  38. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  39. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  40. package/dist/extensions/pi-subagents/CHANGELOG.md +27 -0
  41. package/dist/extensions/pi-subagents/docs/tool-reference.md +4 -1
  42. package/dist/extensions/pi-subagents/docs/workflows.md +2 -2
  43. package/dist/extensions/pi-subagents/install.mjs +0 -0
  44. package/dist/extensions/pi-subagents/package-lock.json +2 -2
  45. package/dist/extensions/pi-subagents/package.json +1 -1
  46. package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +48 -243
  47. package/dist/extensions/pi-subagents/skills/council-mode/references/pass-contracts.md +150 -0
  48. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +87 -37
  49. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +29 -233
  50. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +49 -8
  51. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -2
  52. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +13 -1
  53. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +34 -27
  54. package/dist/extensions/pi-subagents/skills/pi-subagents/references/review-and-validation.md +73 -0
  55. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +157 -28
  56. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -0
  57. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +1 -0
  58. package/dist/extensions/pi-subagents/src/extension/schemas.ts +1 -0
  59. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +4 -1
  60. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +2 -2
  61. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +3 -0
  62. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +45 -2
  63. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +3 -2
  64. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +13 -2
  65. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +5 -1
  66. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +10 -2
  67. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +3 -0
  68. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +11 -2
  69. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +98 -1
  70. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +138 -4
  71. package/dist/extensions/pi-subagents/src/runs/shared/background-process-options.ts +9 -0
  72. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +2 -5
  73. package/dist/extensions/pi-subagents/src/runs/shared/mutation-evidence.ts +52 -3
  74. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +47 -1
  75. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +45 -18
  76. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +21 -2
  77. package/dist/extensions/pi-subagents/src/runs/shared/workflow-graph.ts +15 -0
  78. package/dist/extensions/pi-subagents/src/shared/types.ts +34 -1
  79. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +11 -3
  80. package/dist/extensions/pi-subagents/src/tui/render-helpers.ts +31 -0
  81. package/dist/extensions/pi-subagents/src/tui/render.ts +597 -112
  82. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +40 -1
  83. package/dist/extensions/pi-subagents/src/workflows/host-command.ts +6 -1
  84. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +53 -2
  85. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +55 -6
  86. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +111 -1
  87. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +206 -38
  88. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +522 -31
  89. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +123 -0
  90. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +48 -0
  91. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +57 -1
  92. package/dist/extensions/pi-subagents/test/unit/background-process-options.test.ts +17 -0
  93. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +1 -1
  94. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +44 -4
  95. package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +91 -0
  96. package/dist/extensions/pi-subagents/test/unit/host-command.test.ts +1 -0
  97. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +0 -1
  98. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +20 -3
  99. package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +27 -0
  100. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +93 -17
  101. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +1 -0
  102. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +103 -26
  103. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +58 -0
  104. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +22 -2
  105. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +21 -0
  106. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +13 -0
  107. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +54 -0
  108. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +2 -0
  109. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +32 -0
  110. package/dist/extensions/pi-subagents/test/unit/watchdog-change-signature.test.ts +48 -1
  111. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +21 -6
  112. package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +11 -0
  113. package/dist/extensions/pi-web-agent/CHANGELOG.md +410 -0
  114. package/dist/extensions/pi-web-agent/README.md +131 -0
  115. package/dist/extensions/pi-web-agent/package.json +4 -2
  116. package/dist/extensions/pi-web-agent/src/backends/config.ts +62 -5
  117. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -0
  118. package/dist/extensions/pi-web-agent/src/backends/factory.ts +96 -6
  119. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  120. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  121. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  122. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +183 -47
  123. package/dist/extensions/pi-web-agent/src/extension.ts +62 -25
  124. package/dist/extensions/pi-web-agent/src/extract/readability.ts +19 -11
  125. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  126. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  127. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  128. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  129. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  130. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +5 -4
  131. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +2 -25
  132. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +5 -2
  133. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +2 -0
  134. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  135. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  136. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +72 -7
  137. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +8 -1
  138. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +28 -3
  139. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +4 -0
  140. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  141. package/dist/extensions/pi-web-agent/src/orchestration/url.ts +35 -0
  142. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  143. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  144. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +18 -6
  145. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  146. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +14 -2
  147. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  148. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  149. package/dist/extensions/pi-web-agent/src/readers/github-reader.ts +150 -0
  150. package/dist/extensions/pi-web-agent/src/readers/limits.ts +3 -0
  151. package/dist/extensions/pi-web-agent/src/readers/pdf-reader.ts +87 -0
  152. package/dist/extensions/pi-web-agent/src/readers/resolver.ts +25 -0
  153. package/dist/extensions/pi-web-agent/src/readers/types.ts +11 -0
  154. package/dist/extensions/pi-web-agent/src/readers/youtube-reader.ts +79 -0
  155. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  156. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +32 -5
  157. package/dist/extensions/pi-web-agent/src/search/exa.ts +109 -0
  158. package/dist/extensions/pi-web-agent/src/search/fanout.ts +154 -0
  159. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  160. package/dist/extensions/pi-web-agent/src/search/tavily.ts +113 -0
  161. package/dist/extensions/pi-web-agent/src/search/youcom.ts +109 -0
  162. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  163. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  164. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  165. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +22 -9
  166. package/dist/extensions/pi-web-agent/src/types.ts +19 -4
  167. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +7 -1
  168. package/dist/extensions/ponytail/package.json +8 -8
  169. package/dist/extensions/question/constants.ts +30 -30
  170. package/dist/extensions/question/helpers.ts +58 -58
  171. package/dist/extensions/question/navigation.ts +14 -14
  172. package/dist/extensions/question/package.json +19 -19
  173. package/dist/extensions/question/selection-mode.ts +46 -46
  174. package/dist/extensions/question/shortcuts.ts +44 -44
  175. package/dist/extensions/question/types.ts +132 -132
  176. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  177. package/dist/extensions/test-resolve-hook.mjs +6 -6
  178. package/dist/extensions/web-agent-onboarding.ts +222 -222
  179. package/dist/package-manager-cli.js +71 -71
  180. package/dist/rpc-entry.js +0 -0
  181. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  182. package/docs/compaction.md +396 -396
  183. package/docs/containerization.md +111 -111
  184. package/docs/development.md +71 -71
  185. package/docs/docs.json +164 -164
  186. package/docs/environment-variables.md +86 -86
  187. package/docs/index.md +83 -83
  188. package/docs/json.md +82 -82
  189. package/docs/models.md +502 -502
  190. package/docs/packages.md +227 -227
  191. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  192. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  193. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  194. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  195. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  196. package/docs/prompt-templates.md +95 -95
  197. package/docs/providers.md +293 -293
  198. package/docs/security.md +59 -59
  199. package/docs/session-format.md +414 -414
  200. package/docs/sessions.md +145 -145
  201. package/docs/shared-host-extensions.md +109 -109
  202. package/docs/shell-aliases.md +13 -13
  203. package/docs/skills.md +231 -231
  204. package/docs/terminal-setup.md +142 -142
  205. package/docs/termux.md +127 -127
  206. package/docs/themes.md +295 -295
  207. package/docs/tmux.md +63 -63
  208. package/docs/tui.md +927 -927
  209. package/docs/windows.md +17 -17
  210. package/examples/README.md +25 -25
  211. package/examples/extensions/README.md +211 -211
  212. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  213. package/examples/extensions/bash-spawn-hook.ts +30 -30
  214. package/examples/extensions/bookmark.ts +50 -50
  215. package/examples/extensions/border-status-editor.ts +150 -150
  216. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  217. package/examples/extensions/claude-rules.ts +86 -86
  218. package/examples/extensions/commands.ts +72 -72
  219. package/examples/extensions/confirm-destructive.ts +59 -59
  220. package/examples/extensions/custom-compaction.ts +130 -130
  221. package/examples/extensions/custom-footer.ts +64 -64
  222. package/examples/extensions/custom-header.ts +73 -73
  223. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  224. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  225. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  226. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  227. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  228. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  229. package/examples/extensions/dirty-repo-guard.ts +56 -56
  230. package/examples/extensions/doom-overlay/README.md +46 -46
  231. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  232. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  233. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  234. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  235. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  236. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  237. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  238. package/examples/extensions/doom-overlay/index.ts +74 -74
  239. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  240. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  241. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  242. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  243. package/examples/extensions/dynamic-resources/index.ts +15 -15
  244. package/examples/extensions/dynamic-tools.ts +74 -74
  245. package/examples/extensions/event-bus.ts +43 -43
  246. package/examples/extensions/file-trigger.ts +41 -41
  247. package/examples/extensions/git-checkpoint.ts +53 -53
  248. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  249. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  250. package/examples/extensions/gondolin/index.ts +531 -531
  251. package/examples/extensions/gondolin/package-lock.json +185 -185
  252. package/examples/extensions/gondolin/package.json +19 -19
  253. package/examples/extensions/handoff.ts +199 -199
  254. package/examples/extensions/hello.ts +26 -26
  255. package/examples/extensions/hidden-thinking-label.ts +53 -53
  256. package/examples/extensions/inline-bash.ts +94 -94
  257. package/examples/extensions/input-transform-streaming.ts +39 -39
  258. package/examples/extensions/input-transform.ts +43 -43
  259. package/examples/extensions/interactive-shell.ts +196 -196
  260. package/examples/extensions/mac-system-theme.ts +47 -47
  261. package/examples/extensions/message-renderer.ts +59 -59
  262. package/examples/extensions/minimal-mode.ts +426 -426
  263. package/examples/extensions/modal-editor.ts +85 -85
  264. package/examples/extensions/model-status.ts +31 -31
  265. package/examples/extensions/notify.ts +55 -55
  266. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  267. package/examples/extensions/overlay-test.ts +153 -153
  268. package/examples/extensions/permission-gate.ts +34 -34
  269. package/examples/extensions/pirate.ts +47 -47
  270. package/examples/extensions/plan-mode/README.md +66 -66
  271. package/examples/extensions/plan-mode/index.ts +390 -390
  272. package/examples/extensions/plan-mode/utils.ts +168 -168
  273. package/examples/extensions/preset.ts +436 -436
  274. package/examples/extensions/project-trust.ts +64 -64
  275. package/examples/extensions/prompt-customizer.ts +97 -97
  276. package/examples/extensions/protected-paths.ts +30 -30
  277. package/examples/extensions/provider-payload.ts +18 -18
  278. package/examples/extensions/qna.ts +122 -122
  279. package/examples/extensions/question.ts +285 -285
  280. package/examples/extensions/questionnaire.ts +448 -448
  281. package/examples/extensions/rainbow-editor.ts +88 -88
  282. package/examples/extensions/reload-runtime.ts +37 -37
  283. package/examples/extensions/rpc-demo.ts +118 -118
  284. package/examples/extensions/sandbox/index.ts +321 -321
  285. package/examples/extensions/sandbox/package-lock.json +92 -92
  286. package/examples/extensions/sandbox/package.json +19 -19
  287. package/examples/extensions/send-user-message.ts +97 -97
  288. package/examples/extensions/session-name.ts +27 -27
  289. package/examples/extensions/shutdown-command.ts +63 -63
  290. package/examples/extensions/snake.ts +343 -343
  291. package/examples/extensions/space-invaders.ts +560 -560
  292. package/examples/extensions/ssh.ts +220 -220
  293. package/examples/extensions/status-line.ts +32 -32
  294. package/examples/extensions/structured-output.ts +65 -65
  295. package/examples/extensions/subagent/README.md +175 -175
  296. package/examples/extensions/subagent/agents/planner.md +37 -37
  297. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  298. package/examples/extensions/subagent/agents/scout.md +50 -50
  299. package/examples/extensions/subagent/agents/worker.md +24 -24
  300. package/examples/extensions/subagent/agents.ts +126 -126
  301. package/examples/extensions/subagent/index.ts +1015 -1015
  302. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  303. package/examples/extensions/subagent/prompts/implement.md +10 -10
  304. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  305. package/examples/extensions/summarize.ts +209 -209
  306. package/examples/extensions/system-prompt-header.ts +17 -17
  307. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  308. package/examples/extensions/timed-confirm.ts +70 -70
  309. package/examples/extensions/titlebar-spinner.ts +58 -58
  310. package/examples/extensions/todo.ts +297 -297
  311. package/examples/extensions/tool-override.ts +144 -144
  312. package/examples/extensions/tools.ts +146 -146
  313. package/examples/extensions/trigger-compact.ts +50 -50
  314. package/examples/extensions/truncated-tool.ts +195 -195
  315. package/examples/extensions/widget-placement.ts +9 -9
  316. package/examples/extensions/with-deps/index.ts +32 -32
  317. package/examples/extensions/with-deps/package-lock.json +31 -31
  318. package/examples/extensions/with-deps/package.json +22 -22
  319. package/examples/extensions/working-indicator.ts +123 -123
  320. package/examples/extensions/working-message-test.ts +25 -25
  321. package/examples/rpc-extension-ui.ts +632 -632
  322. package/examples/sdk/01-minimal.ts +26 -26
  323. package/examples/sdk/02-custom-model.ts +53 -53
  324. package/examples/sdk/03-custom-prompt.ts +75 -75
  325. package/examples/sdk/04-skills.ts +55 -55
  326. package/examples/sdk/05-tools.ts +48 -48
  327. package/examples/sdk/06-extensions.ts +99 -99
  328. package/examples/sdk/07-context-files.ts +47 -47
  329. package/examples/sdk/08-prompt-templates.ts +51 -51
  330. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  331. package/examples/sdk/10-settings.ts +53 -53
  332. package/examples/sdk/11-sessions.ts +52 -52
  333. package/examples/sdk/12-full-control.ts +79 -79
  334. package/examples/sdk/13-session-runtime.ts +67 -67
  335. package/examples/sdk/README.md +144 -144
  336. package/package.json +3 -2
  337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +0 -3
  338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +0 -2
  339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +0 -17
  340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +0 -57
  341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +0 -16
  342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +0 -15
  343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +0 -18
  344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +0 -9
  345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +0 -10
  346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +0 -10
  347. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +0 -20
  348. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +0 -3
  349. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +0 -96
  350. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +0 -119
  351. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +0 -85
  352. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +0 -620
  353. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +0 -5
  354. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +0 -56
  355. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +0 -32
  356. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +0 -49
  357. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +0 -93
  358. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +0 -128
  359. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +0 -7
  360. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +0 -38
  361. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +0 -3
  362. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +0 -15
  363. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +0 -9
  364. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +0 -29
  365. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +0 -2
  366. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +0 -22
  367. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +0 -37
  368. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +0 -34
  369. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +0 -12
  370. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +0 -23
  371. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +0 -171
  372. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +0 -1261
  373. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +0 -20
  374. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +0 -54
  375. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +0 -22
  376. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +0 -13
  377. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +0 -358
  378. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +0 -77
  379. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +0 -512
  380. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +0 -43
  381. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +0 -121
  382. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +0 -82
  383. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +0 -17
  384. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +0 -7
  385. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +0 -210
  386. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +0 -15
  387. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +0 -54
  388. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +0 -4
  389. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +0 -55
  390. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +0 -2
  391. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +0 -5
  392. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +0 -30
  393. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +0 -206
  394. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +0 -15
  395. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +0 -106
  396. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +0 -19
  397. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +0 -356
  398. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +0 -297
  399. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +0 -60
  400. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +0 -15
  401. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +0 -18
  402. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +0 -28
  403. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +0 -3
  404. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +0 -10
  405. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +0 -68
  406. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +0 -106
  407. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +0 -51
  408. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +0 -6
  409. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +0 -35
  410. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +0 -37
  411. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +0 -40
  412. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +0 -37
  413. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +0 -52
  414. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +0 -10
  415. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +0 -35
  416. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +0 -24
  417. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  418. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +0 -70
  419. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +0 -26
  420. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +0 -36
  421. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +0 -19
  422. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +0 -3
  423. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +0 -61
  424. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +0 -23
  425. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +0 -3
  426. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +0 -10
  427. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +0 -42
  428. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +0 -35
  429. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +0 -12
  430. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +0 -33
  431. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +0 -9
  432. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +0 -34
  433. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +0 -22
  434. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  435. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  436. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  437. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  438. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +0 -102
  439. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  440. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  441. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +0 -19
  442. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +0 -20
  443. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  444. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +0 -12
  445. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  446. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  447. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +0 -22
  448. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +0 -23
  449. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +0 -26
  450. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +0 -25
  451. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +0 -32
  452. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +0 -34
  453. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +0 -13
  454. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +0 -52
  455. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +0 -54
  456. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +0 -33
  457. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  458. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  459. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +0 -95
  460. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +0 -77
  461. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  462. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  463. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +0 -28
  464. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  465. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  466. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +0 -63
  467. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +0 -94
  468. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +0 -23
  469. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  470. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +0 -14
  471. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  472. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +0 -394
  473. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +0 -12
  474. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +0 -29
  475. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +0 -120
  476. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +0 -28
  477. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +0 -17
  478. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +0 -246
  479. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +0 -20
  480. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +0 -457
  481. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +0 -8
  482. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +0 -3
  483. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +0 -2
  484. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +0 -22
  485. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +0 -18
  486. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +0 -11
  487. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +0 -11
  488. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +0 -4
  489. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +0 -4
  490. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +0 -5
  491. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +0 -8
  492. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +0 -5
  493. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +0 -26
  494. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +0 -7
  495. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +0 -10
  496. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +0 -18
  497. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +0 -30
  498. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +0 -2
  499. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +0 -16
  500. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +0 -3
  501. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +0 -3
  502. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +0 -9
  503. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +0 -31
  504. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +0 -21
  505. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +0 -2
  506. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +0 -31
  507. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +0 -5
  508. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +0 -12
  509. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +0 -3
  510. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +0 -15
  511. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +0 -3
@@ -145,6 +145,47 @@ function writeMcpFixture(
145
145
  });
146
146
  }
147
147
 
148
+ type RuntimeMcpDefinition = { command: string; args: string[] };
149
+
150
+ function buildLegacyAliasLaunch(params: {
151
+ definitions: Record<string, RuntimeMcpDefinition>;
152
+ mcpDirectTools: string[];
153
+ allowedTools: string[];
154
+ }) {
155
+ const fixture = createMcpFixture();
156
+ writeJson(path.join(fixture.agentDir, "mcp.json"), { mcpServers: {} });
157
+ writeJson(path.join(fixture.agentDir, "mcp-cache.json"), {
158
+ version: 1,
159
+ servers: Object.fromEntries(Object.entries(params.definitions).map(([name, definition]) => [
160
+ name,
161
+ { configHash: computeMcpServerHash(definition), cachedAt: Date.now(), tools: [{ name: "search" }] },
162
+ ])),
163
+ });
164
+ const runtimeSnapshotHost: McpRuntimeSnapshotHost = {
165
+ events: {
166
+ emit(_event, request) {
167
+ const definition = params.definitions[request.name];
168
+ if (!definition) {
169
+ request.result = { ok: false, error: new Error(`unknown runtime server ${request.name}`) };
170
+ return;
171
+ }
172
+ request.result = { ok: true, snapshot: { name: request.name, definition, runtime: true, persisted: false } };
173
+ },
174
+ },
175
+ };
176
+ return buildPiArgs({
177
+ baseArgs: ["-p"],
178
+ task: "hello",
179
+ sessionEnabled: false,
180
+ inheritProjectContext: false,
181
+ inheritSkills: false,
182
+ tools: ["read"],
183
+ mcpDirectTools: params.mcpDirectTools,
184
+ capabilityCeiling: { version: 1, allowedTools: params.allowedTools, denyExtensions: false, sources: ["test"] },
185
+ runtimeSnapshotHost,
186
+ });
187
+ }
188
+
148
189
  afterEach(() => {
149
190
  process.chdir(originalCwd);
150
191
  for (const [key, value] of Object.entries(originalEnv)) {
@@ -1125,7 +1166,7 @@ describe("buildPiArgs system prompt mode wiring", () => {
1125
1166
 
1126
1167
  assert.equal(
1127
1168
  args[args.indexOf("--tools") + 1],
1128
- "read,bash,chrome_devtools_take_screenshot,chrome_devtools_click",
1169
+ "read,bash,chrome-devtools_take_screenshot,chrome-devtools_click",
1129
1170
  );
1130
1171
  assert.equal(env.MCP_DIRECT_TOOLS, "chrome-devtools");
1131
1172
  assert.equal(
@@ -1133,15 +1174,15 @@ describe("buildPiArgs system prompt mode wiring", () => {
1133
1174
  JSON.stringify([
1134
1175
  "read",
1135
1176
  "bash",
1136
- "chrome_devtools_take_screenshot",
1137
- "chrome_devtools_click",
1177
+ "chrome-devtools_take_screenshot",
1178
+ "chrome-devtools_click",
1138
1179
  ]),
1139
1180
  );
1140
1181
  assert.equal(
1141
1182
  env[MCP_DIRECT_CHILD_TOOLS_ENV],
1142
1183
  JSON.stringify([
1143
- "chrome_devtools_take_screenshot",
1144
- "chrome_devtools_click",
1184
+ "chrome-devtools_take_screenshot",
1185
+ "chrome-devtools_click",
1145
1186
  ]),
1146
1187
  );
1147
1188
  });
@@ -1224,8 +1265,8 @@ describe("buildPiArgs system prompt mode wiring", () => {
1224
1265
  runtimeSnapshotHost,
1225
1266
  });
1226
1267
  assert.deepEqual(requestedNames, [serverName, serverName]);
1227
- assert.equal(serverLaunch.args[serverLaunch.args.indexOf("--tools") + 1], "read,runtime_github_search_repositories,runtime_github_create_issue");
1228
- assert.equal(toolLaunch.args[toolLaunch.args.indexOf("--tools") + 1], "read,runtime_github_search_repositories");
1268
+ assert.equal(serverLaunch.args[serverLaunch.args.indexOf("--tools") + 1], "read,runtime-github_search_repositories,runtime-github_create_issue");
1269
+ assert.equal(toolLaunch.args[toolLaunch.args.indexOf("--tools") + 1], "read,runtime-github_search_repositories");
1229
1270
  assert.ok(serverLaunch.args.indexOf("--mcp-config") < serverLaunch.args.indexOf("Task: hello"));
1230
1271
  for (const launch of [serverLaunch, toolLaunch]) {
1231
1272
  const configPath = launch.args[launch.args.indexOf("--mcp-config") + 1];
@@ -1240,11 +1281,11 @@ describe("buildPiArgs system prompt mode wiring", () => {
1240
1281
  [serverName, `${serverName}/search_repositories`],
1241
1282
  );
1242
1283
  assert.deepEqual(JSON.parse(serverLaunch.env[MCP_DIRECT_CHILD_TOOLS_ENV]!), [
1243
- "runtime_github_search_repositories",
1244
- "runtime_github_create_issue",
1284
+ "runtime-github_search_repositories",
1285
+ "runtime-github_create_issue",
1245
1286
  ]);
1246
1287
  assert.deepEqual(JSON.parse(toolLaunch.env[MCP_DIRECT_CHILD_TOOLS_ENV]!), [
1247
- "runtime_github_search_repositories",
1288
+ "runtime-github_search_repositories",
1248
1289
  ]);
1249
1290
  });
1250
1291
 
@@ -1354,15 +1395,50 @@ describe("buildPiArgs system prompt mode wiring", () => {
1354
1395
  capabilityCeiling: { version: 1, allowedTools: ["read", "runtime_a_search"], denyExtensions: false, sources: ["test"] },
1355
1396
  runtimeSnapshotHost,
1356
1397
  });
1357
- assert.equal(launch.args[launch.args.indexOf("--tools") + 1], "read,runtime_a_search");
1398
+ assert.equal(launch.args[launch.args.indexOf("--tools") + 1], "read,runtime-a_search");
1358
1399
  const configPath = launch.args[launch.args.indexOf("--mcp-config") + 1];
1359
1400
  assert.ok(configPath);
1360
1401
  assert.deepEqual(JSON.parse(fs.readFileSync(configPath, "utf-8")), {
1361
1402
  mcpServers: { "runtime-a": definitions["runtime-a"] },
1362
1403
  });
1404
+ assert.deepEqual(JSON.parse(launch.env[MCP_DIRECT_CHILD_TOOLS_ENV]!), ["runtime-a_search"]);
1405
+ });
1406
+
1407
+ it("does not let legacy MCP ceiling aliases cross server boundaries", () => {
1408
+ const definitions = {
1409
+ "runtime-a": { command: "runtime-a", args: ["--stdio"] },
1410
+ runtime_a: { command: "runtime_a", args: ["--stdio"] },
1411
+ };
1412
+ const launch = buildLegacyAliasLaunch({
1413
+ definitions,
1414
+ mcpDirectTools: ["runtime-a", "runtime_a"],
1415
+ allowedTools: ["read", "runtime_a_search"],
1416
+ });
1417
+
1418
+ assert.equal(launch.args[launch.args.indexOf("--tools") + 1], "read,runtime_a_search");
1419
+ const configPath = launch.args[launch.args.indexOf("--mcp-config") + 1];
1420
+ assert.ok(configPath);
1421
+ assert.deepEqual(JSON.parse(fs.readFileSync(configPath, "utf-8")), {
1422
+ mcpServers: { runtime_a: definitions.runtime_a },
1423
+ });
1363
1424
  assert.deepEqual(JSON.parse(launch.env[MCP_DIRECT_CHILD_TOOLS_ENV]!), ["runtime_a_search"]);
1364
1425
  });
1365
1426
 
1427
+ it("does not allow ambiguous legacy MCP ceiling aliases", () => {
1428
+ const launch = buildLegacyAliasLaunch({
1429
+ definitions: {
1430
+ "runtime-a-b": { command: "runtime-a-b", args: ["--stdio"] },
1431
+ "runtime_a-b": { command: "runtime_a-b", args: ["--stdio"] },
1432
+ },
1433
+ mcpDirectTools: ["runtime-a-b", "runtime_a-b"],
1434
+ allowedTools: ["read", "runtime_a_b_search"],
1435
+ });
1436
+
1437
+ assert.equal(launch.args[launch.args.indexOf("--tools") + 1], "read");
1438
+ assert.equal(launch.args.includes("--mcp-config"), false);
1439
+ assert.equal(launch.env[MCP_DIRECT_CHILD_TOOLS_ENV], undefined);
1440
+ });
1441
+
1366
1442
  it("emits --no-tools for explicit empty tool allowlists", () => {
1367
1443
  for (const requireReadTool of [false, true]) {
1368
1444
  const { args, env } = buildPiArgs({
@@ -1398,7 +1474,7 @@ describe("buildPiArgs system prompt mode wiring", () => {
1398
1474
 
1399
1475
  assert.equal(
1400
1476
  args[args.indexOf("--tools") + 1],
1401
- "chrome_devtools_take_screenshot,chrome_devtools_click",
1477
+ "chrome-devtools_take_screenshot,chrome-devtools_click",
1402
1478
  );
1403
1479
  assert.equal(env.MCP_DIRECT_TOOLS, "chrome-devtools");
1404
1480
  }
@@ -1451,7 +1527,7 @@ describe("buildPiArgs system prompt mode wiring", () => {
1451
1527
 
1452
1528
  it("matches adapter prefix modes for direct MCP names", () => {
1453
1529
  for (const [prefix, expected] of [
1454
- ["server", "read,linear_mcp_list_issues"],
1530
+ ["server", "read,linear-mcp_list_issues"],
1455
1531
  ["short", "read,linear_list_issues"],
1456
1532
  ["none", "read,list_issues"],
1457
1533
  ] as const) {
@@ -1497,7 +1573,7 @@ describe("buildPiArgs system prompt mode wiring", () => {
1497
1573
 
1498
1574
  assert.equal(
1499
1575
  args[args.indexOf("--tools") + 1],
1500
- "read,browser_mcp_navigate,browser_mcp_get_console_logs",
1576
+ "read,browser-mcp_navigate,browser-mcp_get_console_logs",
1501
1577
  );
1502
1578
  });
1503
1579
 
@@ -1614,7 +1690,7 @@ describe("buildPiArgs system prompt mode wiring", () => {
1614
1690
  cwd: fixture.projectDir,
1615
1691
  });
1616
1692
 
1617
- assert.equal(args[args.indexOf("--tools") + 1], "read,project_mcp_inspect");
1693
+ assert.equal(args[args.indexOf("--tools") + 1], "read,project-mcp_inspect");
1618
1694
  });
1619
1695
 
1620
1696
  it("resolves direct MCP tools from Pi package manifests", () => {
@@ -1680,7 +1756,7 @@ describe("buildPiArgs system prompt mode wiring", () => {
1680
1756
  }), /Unresolved MCP direct-tool selectors: acme_tools__wiki\./);
1681
1757
  });
1682
1758
 
1683
- it("resolves direct MCP tools from the git-root package when child cwd has an incidental .pi directory", () => {
1759
+ it("resolves direct MCP tools from the git-root package when child cwd has an incidental .selesai directory", () => {
1684
1760
  const fixture = createMcpFixture();
1685
1761
  const nestedCwd = path.join(fixture.projectDir, "packages", "app");
1686
1762
  const packageRoot = path.join(fixture.projectDir, ".selesai", "npm", "node_modules", "@acme", "tools");
@@ -1861,7 +1937,7 @@ describe("buildPiArgs system prompt mode wiring", () => {
1861
1937
  );
1862
1938
  assert.equal(
1863
1939
  args[args.indexOf("--tools") + 1],
1864
- "read,chrome_devtools_take_screenshot",
1940
+ "read,chrome-devtools_take_screenshot",
1865
1941
  );
1866
1942
  assert.ok(
1867
1943
  extensionArgs.some((arg) =>
@@ -49,6 +49,7 @@ describe("public subagent execution normalization", () => {
49
49
  },
50
50
  });
51
51
  assert.deepEqual(normalizePublicSubagentExecution({ action: " list " }), { ok: true, params: { action: "list" } });
52
+ assert.deepEqual(normalizePublicSubagentExecution({ action: " list ", capabilities: true }), { ok: true, params: { action: "list", capabilities: true } });
52
53
  assert.deepEqual(
53
54
  normalizePublicSubagentExecution({ action: " validate ", workflowScript: "return 1" }),
54
55
  { ok: true, params: { action: "validate", workflowScript: "return 1" } },
@@ -2,8 +2,8 @@ import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
 
4
4
  import { visibleWidth } from "@earendil-works/pi-tui";
5
- import { row } from "../../src/tui/render-helpers.ts";
6
- import { renderSubagentResult, truncLine, widgetRenderKey } from "../../src/tui/render.ts";
5
+ import { row, shouldSuppressSingleStep, stripRepeatedAgentPrefix, withDuplicateLabelDiscriminators } from "../../src/tui/render-helpers.ts";
6
+ import { buildWidgetLines, renderSubagentResult, truncLine, widgetRenderKey } from "../../src/tui/render.ts";
7
7
  import type { AsyncJobState } from "../../src/shared/types.ts";
8
8
 
9
9
  const theme = {
@@ -38,6 +38,43 @@ test("row clips content to the available width", () => {
38
38
  assert.equal(visibleWidth(rendered), 6);
39
39
  });
40
40
 
41
+ test("stripRepeatedAgentPrefix removes only safe repeated job-name prefixes", () => {
42
+ assert.equal(stripRepeatedAgentPrefix(" reviewer: Review the diff ", "reviewer"), "Review the diff");
43
+ assert.equal(stripRepeatedAgentPrefix("reviewer · Review the diff", "reviewer"), "Review the diff");
44
+ assert.equal(stripRepeatedAgentPrefix("reviewer Review the diff", "reviewer"), "Review the diff");
45
+ assert.equal(stripRepeatedAgentPrefix("reviewer-2: Review the diff", "reviewer"), "reviewer-2: Review the diff");
46
+ assert.equal(stripRepeatedAgentPrefix("reviewerhood: Review the diff", "reviewer"), "reviewerhood: Review the diff");
47
+ assert.equal(stripRepeatedAgentPrefix("worker: Review the diff", "reviewer"), "worker: Review the diff");
48
+ assert.equal(stripRepeatedAgentPrefix("reviewer", "reviewer"), "reviewer");
49
+ });
50
+
51
+ test("shouldSuppressSingleStep uses logical totals instead of materialized step count", () => {
52
+ assert.equal(shouldSuppressSingleStep(undefined, 1), true);
53
+ assert.equal(shouldSuppressSingleStep(1, 1), true);
54
+ assert.equal(shouldSuppressSingleStep(2, 1), false);
55
+ assert.equal(shouldSuppressSingleStep(undefined, 2), false);
56
+ assert.equal(shouldSuppressSingleStep(undefined, undefined), false);
57
+ });
58
+
59
+ test("withDuplicateLabelDiscriminators preserves unique labels and stable duplicate fractions", () => {
60
+ const rows = [
61
+ { index: 0, displayName: "Gather context" },
62
+ { index: 1, displayName: "Review diff" },
63
+ { index: 2, displayName: "Review diff" },
64
+ ];
65
+
66
+ assert.deepEqual(
67
+ withDuplicateLabelDiscriminators(rows, 3).map((row) => row.rowLabel),
68
+ ["Gather context", "Agent 2/3: Review diff", "Agent 3/3: Review diff"],
69
+ );
70
+
71
+ const reordered = [rows[2]!, rows[0]!, rows[1]!];
72
+ assert.deepEqual(
73
+ withDuplicateLabelDiscriminators(reordered, 3).map((row) => row.rowLabel),
74
+ ["Agent 3/3: Review diff", "Gather context", "Agent 2/3: Review diff"],
75
+ );
76
+ });
77
+
41
78
  test("row normalizes multiline content before clipping", () => {
42
79
  const rendered = row("bash failed: line 1\nline 2\tvalue", 20, theme as any);
43
80
  assert.equal(visibleWidth(rendered), 20);
@@ -123,6 +160,42 @@ test("widget render keys keep compact payloads quiet and expanded payloads fresh
123
160
  assert.notEqual(widgetRenderKey(warningDetailChange, true), widgetRenderKey(preflightJob, true));
124
161
  });
125
162
 
163
+ test("seeded running glyphs advance at wall-clock frame boundaries while unseeded glyphs stay static", () => {
164
+ const originalNow = Date.now;
165
+ const runningGlyph = (lines: string[]): string => lines
166
+ .map((line) => line.match(/[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏●]/u)?.[0])
167
+ .find((glyph): glyph is string => glyph !== undefined) ?? "";
168
+ const seededJob: AsyncJobState = {
169
+ asyncId: "seeded",
170
+ asyncDir: "/tmp/seeded",
171
+ status: "running",
172
+ mode: "single",
173
+ updatedAt: 1,
174
+ };
175
+ const unseededJob: AsyncJobState = {
176
+ asyncId: "unseeded",
177
+ asyncDir: "/tmp/unseeded",
178
+ status: "running",
179
+ mode: "single",
180
+ };
181
+
182
+ try {
183
+ Date.now = () => 1_000;
184
+ const seededBeforeBoundary = runningGlyph(buildWidgetLines([seededJob], theme, 180));
185
+ const unseededBeforeBoundary = runningGlyph(buildWidgetLines([unseededJob], theme, 180));
186
+
187
+ Date.now = () => 1_125;
188
+ const seededAfterBoundary = runningGlyph(buildWidgetLines([seededJob], theme, 180));
189
+ const unseededAfterBoundary = runningGlyph(buildWidgetLines([unseededJob], theme, 180));
190
+
191
+ assert.notEqual(seededAfterBoundary, seededBeforeBoundary);
192
+ assert.equal(unseededAfterBoundary, unseededBeforeBoundary);
193
+ assert.equal(unseededBeforeBoundary, "●");
194
+ } finally {
195
+ Date.now = originalNow;
196
+ }
197
+ });
198
+
126
199
  test("multiline rendering omits two-column graphemes at one-column width", () => {
127
200
  const originalColumns = Object.getOwnPropertyDescriptor(process.stdout, "columns");
128
201
  Object.defineProperty(process.stdout, "columns", { configurable: true, value: 5 });
@@ -211,7 +284,7 @@ test("compact multi-result cards prefer bounded workflow labels over raw tasks",
211
284
  assert.match(text, /Ctrl\+Alt\+F Fleet/);
212
285
  });
213
286
 
214
- test("compact chain rendering uses workflow graph spans for dynamic fanout results", () => {
287
+ test("compact chain rendering uses workflow graph labels and parallel groups", () => {
215
288
  const component = renderSubagentResult({
216
289
  content: [{ type: "text", text: "done" }],
217
290
  details: {
@@ -244,10 +317,11 @@ test("compact chain rendering uses workflow graph spans for dynamic fanout resul
244
317
  }, { expanded: false }, theme as any);
245
318
 
246
319
  const text = componentText(component);
247
- assert.match(text, /Step 1: scout/);
248
- assert.match(text, /Agent 1\/2: reviewer/);
249
- assert.match(text, /Agent 2\/2: reviewer/);
250
- assert.match(text, /Step 3: writer/);
320
+ assert.match(text, /Step 1\/3: Scout/);
321
+ assert.match(text, /Step 2\/3: parallel group \(Review targets\)/);
322
+ assert.match(text, /Review A/);
323
+ assert.match(text, /Review B/);
324
+ assert.match(text, /Step 3\/3: Writer/);
251
325
  });
252
326
 
253
327
  test("compact chain rendering shows failed zero-child dynamic fanout groups", () => {
@@ -283,10 +357,10 @@ test("compact chain rendering shows failed zero-child dynamic fanout groups", ()
283
357
  const text = componentText(component);
284
358
  assert.match(text, /step 1\/3/);
285
359
  assert.doesNotMatch(text, /step 3\/3/);
286
- assert.match(text, /Step 1: scout/);
287
- assert.match(text, /Step 2: Review targets .* failed/);
360
+ assert.match(text, /Step 1\/3: Scout/);
361
+ assert.match(text, /Step 2\/3: parallel group \(Review targets\) · failed/);
288
362
  assert.match(text, /No review targets materialized/);
289
- assert.match(text, /Step 3: writer .* pending/);
363
+ assert.match(text, /Step 3\/3: writer .* pending/);
290
364
  });
291
365
 
292
366
  test("expanded chain rendering uses workflow graph spans for dynamic fanout results", () => {
@@ -322,10 +396,11 @@ test("expanded chain rendering uses workflow graph spans for dynamic fanout resu
322
396
  }, { expanded: true }, theme as any);
323
397
 
324
398
  const text = componentText(component);
325
- assert.match(text, /Step 1: scout/);
326
- assert.match(text, /Agent 1\/2: reviewer/);
327
- assert.match(text, /Agent 2\/2: reviewer/);
328
- assert.match(text, /Step 3: writer/);
399
+ assert.match(text, /Step 1\/3: Scout/);
400
+ assert.match(text, /Step 2\/3: parallel group \(Review targets\)/);
401
+ assert.match(text, /Review A/);
402
+ assert.match(text, /Review B/);
403
+ assert.match(text, /Step 3\/3: Writer/);
329
404
  });
330
405
 
331
406
  test("compact multi-result rendering shows total cost in the header", () => {
@@ -342,7 +417,7 @@ test("compact multi-result rendering shows total cost in the header", () => {
342
417
  assert.match(text, /in:30 out:12 \$0\.0400/);
343
418
  });
344
419
 
345
- test("static sequential and static parallel chain rendering keep existing labels", () => {
420
+ test("static sequential and static parallel chain rendering keep logical labels", () => {
346
421
  const sequential = componentText(renderSubagentResult({
347
422
  content: [{ type: "text", text: "done" }],
348
423
  details: {
@@ -352,8 +427,8 @@ test("static sequential and static parallel chain rendering keep existing labels
352
427
  results: [result("scout", "a"), result("writer", "b")],
353
428
  },
354
429
  }, { expanded: false }, theme as any));
355
- assert.match(sequential, /Step 1: scout/);
356
- assert.match(sequential, /Step 2: writer/);
430
+ assert.match(sequential, /Step 1\/2: scout task/);
431
+ assert.match(sequential, /Step 2\/2: writer task/);
357
432
 
358
433
  const parallel = componentText(renderSubagentResult({
359
434
  content: [{ type: "text", text: "done" }],
@@ -364,13 +439,14 @@ test("static sequential and static parallel chain rendering keep existing labels
364
439
  results: [result("scout", "a"), result("reviewer", "b"), result("auditor", "c"), result("writer", "d")],
365
440
  },
366
441
  }, { expanded: false }, theme as any));
367
- assert.match(parallel, /Step 1: scout/);
368
- assert.match(parallel, /Agent 1\/2: reviewer/);
369
- assert.match(parallel, /Agent 2\/2: auditor/);
370
- assert.match(parallel, /Step 3: writer/);
442
+ assert.match(parallel, /Step 1\/3: scout task/);
443
+ assert.match(parallel, /Step 2\/3: parallel group/);
444
+ assert.match(parallel, /reviewer task/);
445
+ assert.match(parallel, /auditor task/);
446
+ assert.match(parallel, /Step 3\/3: writer task/);
371
447
  });
372
448
 
373
- test("expanded simple chain summaries prefer result session names", () => {
449
+ test("expanded simple chain summaries strip repeated agent prefixes", () => {
374
450
  const expanded = componentText(renderSubagentResult({
375
451
  content: [{ type: "text", text: "done" }],
376
452
  details: {
@@ -380,8 +456,9 @@ test("expanded simple chain summaries prefer result session names", () => {
380
456
  results: [{ ...result("worker", "done"), sessionName: " worker: named task " }],
381
457
  },
382
458
  }, { expanded: true }, theme as any));
383
- assert.match(expanded, /Step 1: worker: named task/);
384
- assert.doesNotMatch(expanded, /Step 1: chain-label/);
459
+ assert.match(expanded, /named task/);
460
+ assert.doesNotMatch(expanded, /worker:\s+named task/);
461
+ assert.doesNotMatch(expanded, /Step 1\/1/);
385
462
  });
386
463
 
387
464
  test("main-window renderer config removes compact result indentation without changing status glyphs", () => {
@@ -395,8 +472,8 @@ test("main-window renderer config removes compact result indentation without cha
395
472
 
396
473
  const text = componentText(component);
397
474
  assert.match(text, /^✗ parallel/m);
398
- assert.match(text, /^✓ Agent 1\/2: scout/m);
399
- assert.match(text, /^✗ Agent 2\/2: reviewer/m);
475
+ assert.match(text, /^✓ scout task/m);
476
+ assert.match(text, /^✗ reviewer task/m);
400
477
  assert.match(text, /^⎿ Error: failed/m);
401
478
  });
402
479
 
@@ -78,6 +78,50 @@ describe("async run status inspection", () => {
78
78
  }
79
79
  });
80
80
 
81
+ it("renders bounded recovery guidance from a failed status step", () => {
82
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-run-status-recovery-"));
83
+ try {
84
+ const asyncRoot = path.join(root, "runs");
85
+ const asyncDir = path.join(asyncRoot, "run-recovery");
86
+ fs.mkdirSync(asyncDir, { recursive: true });
87
+ const changedFiles = Array.from({ length: 25 }, (_, index) => `src/file-${String(index + 1).padStart(2, "0")}.ts`);
88
+ fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({
89
+ runId: "run-recovery",
90
+ mode: "single",
91
+ state: "failed",
92
+ startedAt: 100,
93
+ lastUpdate: 200,
94
+ steps: [{
95
+ agent: "worker",
96
+ status: "failed",
97
+ timedOut: true,
98
+ timeoutRecovery: {
99
+ termination: "timed-out",
100
+ changedFiles,
101
+ truncated: true,
102
+ recoveryNeeded: true,
103
+ reason: "timed-out-with-dirty-worktree",
104
+ reportStatus: "missing",
105
+ message: "raw recovery message must not be rendered",
106
+ effects: { settlementDiagnostic: { finalTextPresent: true } },
107
+ },
108
+ }],
109
+ }, null, 2), "utf-8");
110
+
111
+ const result = inspectSubagentStatus({ id: "run-recovery" }, { asyncDirRoot: asyncRoot, resultsDir: path.join(root, "results") });
112
+ const text = textContent(result);
113
+ assert.equal(result.isError, undefined);
114
+ assert.match(text, /State: failed/);
115
+ assert.match(text, /Recovery needed: review the diff and artifacts before resuming or launching dependent stages\./);
116
+ assert.match(text, /requested report: missing/);
117
+ assert.match(text, /changed tracked files: src\/file-01\.ts, src\/file-02\.ts/);
118
+ assert.match(text, /file-20\.ts, …/);
119
+ assert.doesNotMatch(text, /raw recovery message|settlementDiagnostic/);
120
+ } finally {
121
+ fs.rmSync(root, { recursive: true, force: true });
122
+ }
123
+ });
124
+
81
125
  it("shows a follow-up hint for completed external-job runs when the provider supports it", () => {
82
126
  const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-run-status-external-follow-up-"));
83
127
  try {
@@ -1399,6 +1443,17 @@ describe("async run status inspection", () => {
1399
1443
  state: "failed",
1400
1444
  sessionFile,
1401
1445
  summary: "result survived missing status",
1446
+ results: [{
1447
+ agent: "worker",
1448
+ success: false,
1449
+ timeoutRecovery: {
1450
+ termination: "timed-out",
1451
+ changedFiles: ["input.md"],
1452
+ recoveryNeeded: true,
1453
+ reason: "timed-out-with-dirty-worktree",
1454
+ reportStatus: "missing",
1455
+ },
1456
+ }],
1402
1457
  }, null, 2), "utf-8");
1403
1458
 
1404
1459
  const result = inspectSubagentStatus({ id: "run-result-only" }, {
@@ -1412,6 +1467,9 @@ describe("async run status inspection", () => {
1412
1467
  assert.match(text, /Result: /);
1413
1468
  assert.match(text, /Revive: subagent\(\{ action: "resume", id: "run-result-only", message: "\.\.\." \}\)/);
1414
1469
  assert.match(text, /result survived missing status/);
1470
+ assert.match(text, /Recovery needed: review the diff and artifacts before resuming or launching dependent stages\./);
1471
+ assert.match(text, /requested report: missing/);
1472
+ assert.match(text, /changed tracked files: input\.md/);
1415
1473
  } finally {
1416
1474
  fs.rmSync(root, { recursive: true, force: true });
1417
1475
  }
@@ -78,6 +78,10 @@ interface SubagentParamsSchema {
78
78
  enum?: string[];
79
79
  description?: string;
80
80
  };
81
+ capabilities?: {
82
+ type?: string;
83
+ description?: string;
84
+ };
81
85
  view?: {
82
86
  type?: string;
83
87
  enum?: string[];
@@ -255,6 +259,22 @@ describe("SubagentParams schema", { skip: !schemasAvailable ? "typebox not avail
255
259
  assert.doesNotMatch(description, /orchestration\./);
256
260
  });
257
261
 
262
+ it("accepts prompt-free capability discovery on list requests", () => {
263
+ const capabilitiesSchema = SubagentParams?.properties?.capabilities;
264
+ assert.ok(capabilitiesSchema, "capabilities schema should exist");
265
+ assert.equal(capabilitiesSchema.type, "boolean");
266
+ const description = String(capabilitiesSchema.description ?? "");
267
+ assert.match(description, /action=['\"]list['\"]/i);
268
+ assert.match(description, /compact/i);
269
+ assert.match(description, /system prompt/i);
270
+
271
+ if (CompileSchema) {
272
+ const validator = CompileSchema(SubagentParams);
273
+ assert.equal(validator.Check({ action: "list", capabilities: true }), true);
274
+ assert.equal(validator.Check({ action: "list", capabilities: "true" }), false);
275
+ }
276
+ });
277
+
258
278
  it("keeps agentContract.version as integer bounds without an enum (Gemini schema subset)", () => {
259
279
  const agentContract = (SubagentParams?.properties as Record<string, JsonSchemaNode> | undefined)?.agentContract;
260
280
  assert.ok(agentContract, "agentContract schema should exist");
@@ -418,8 +438,8 @@ describe("SubagentParams schema", { skip: !schemasAvailable ? "typebox not avail
418
438
  assert.ok(SubagentParams, "SubagentParams schema should exist");
419
439
  const schema = SubagentParams as unknown as JsonSchemaNode;
420
440
  const serialized = JSON.stringify(schema);
421
- // Mission, inspector, inline workflow, guide, and toolTimeoutMs fields intentionally expanded the public tool surface.
422
- assert.ok(serialized.length < 17_400, `expected compact schema under 17.4k chars, got ${serialized.length}`);
441
+ // Mission, inspector, inline workflow, guide, toolTimeoutMs, and capability-list fields intentionally expanded the public tool surface.
442
+ assert.ok(serialized.length < 17_600, `expected compact schema under 17.6k chars, got ${serialized.length}`);
423
443
  assert.equal(serialized.includes('"$ref"'), false);
424
444
  assert.equal(serialized.includes('"$defs"'), false);
425
445
  assert.equal(serialized.split("Optional acceptance policy.").length - 1, 1);
@@ -106,6 +106,27 @@ describe("scripted workflow runtime", () => {
106
106
  `return runs.host("tests", { kind: "command", command: "npm test" });`,
107
107
  `return runs.host("tests", { kind: "command", command: "npm test", timeoutMs: 1000, output: "../tests.log" });`,
108
108
  ]) assert.equal(validateWorkflowScript(script).ok, false);
109
+ const cwd = validateWorkflowScript(`return runs.host("tests", { kind: "command", command: "npm test", timeoutMs: 1000, cwd: "/tmp" });`);
110
+ assert.equal(cwd.ok, false);
111
+ assert.ok(cwd.errors.some((error) => /unsupported field 'cwd'.*does not accept per-step cwd.*workflow cwd.*outer subagent request.*cd \/path\/to\/worktree/.test(error.message)));
112
+ });
113
+
114
+ it("explains the workflow cwd workaround for dynamic runs.host params", async () => {
115
+ let called = false;
116
+ await assert.rejects(
117
+ runWorkflowScript({
118
+ script: `const params = { kind: "command", command: "npm test", timeoutMs: 1000, cwd: "/tmp" }; return await runs.host("tests", params);`,
119
+ async host() {
120
+ called = true;
121
+ return { key: "tests", kind: "command", ok: true, state: "passed", exitCode: 0, stdout: "", stderr: "", outputPath: "tests.log", durationMs: 1 };
122
+ },
123
+ async launch(key) { return { key, ok: true, output: "unused", artifactPaths: [] }; },
124
+ async status(key) { return { key, ok: true, output: "unused", artifactPaths: [] }; },
125
+ }),
126
+ (error: unknown) => error instanceof WorkflowScriptError
127
+ && /does not accept per-step cwd.*workflow cwd.*outer subagent request.*cd \/path\/to\/worktree/.test(error.message),
128
+ );
129
+ assert.equal(called, false);
109
130
  });
110
131
 
111
132
  it("runs an awaited host command through the host boundary", async () => {
@@ -169,6 +169,19 @@ describe("resolveSingleOutput", () => {
169
169
  assert.equal(result.savedPath, undefined);
170
170
  assert.match(result.saveError ?? "", /Failed to read changed output file/);
171
171
  });
172
+
173
+ it("fails closed when the pre-run output snapshot could not be inspected", () => {
174
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-output-test-"));
175
+ tempDirs.push(dir);
176
+ const outputPath = path.join(dir, "review.md");
177
+
178
+ const result = resolveSingleOutput(outputPath, "fallback output", { exists: false, error: "permission denied" });
179
+
180
+ assert.equal(result.fullOutput, "fallback output");
181
+ assert.equal(result.savedPath, undefined);
182
+ assert.match(result.saveError ?? "", /Failed to inspect output file: permission denied/);
183
+ assert.equal(fs.existsSync(outputPath), false);
184
+ });
172
185
  });
173
186
 
174
187
  describe("extractChildWrittenOutput", () => {
@@ -370,6 +370,60 @@ describe("subagent_wait tool", () => {
370
370
  }
371
371
  });
372
372
 
373
+ it("surfaces bounded recovery guidance for a failed completion", async () => {
374
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-wait-recovery-completion-"));
375
+ try {
376
+ const asyncRoot = path.join(root, "runs");
377
+ const resultsDir = path.join(root, "results");
378
+ fs.mkdirSync(resultsDir, { recursive: true });
379
+ const state = makeState("sess-1");
380
+ writeStatus(asyncRoot, "run-recovery", "running", { sessionId: "sess-1", pid: 999999 });
381
+ const result = await waitForSubagents({ all: true }, undefined, baseDeps(root, state, {
382
+ sleep: async () => {
383
+ const recovery = {
384
+ termination: "timed-out",
385
+ changedFiles: ["input.md"],
386
+ recoveryNeeded: true,
387
+ reason: "timed-out-with-dirty-worktree",
388
+ reportStatus: "missing",
389
+ message: "raw recovery message must not cross the wait boundary",
390
+ effects: { settlementDiagnostic: { finalTextPresent: true } },
391
+ };
392
+ writeStatus(asyncRoot, "run-recovery", "failed", {
393
+ sessionId: "sess-1",
394
+ steps: [{ agent: "worker", status: "failed", timedOut: true, timeoutRecovery: recovery }],
395
+ });
396
+ fs.writeFileSync(path.join(resultsDir, "run-recovery.json"), JSON.stringify({
397
+ id: "run-recovery",
398
+ runId: "run-recovery",
399
+ mode: "single",
400
+ state: "failed",
401
+ success: false,
402
+ results: [{ agent: "worker", success: false, error: "Subagent timed out.", output: "raw output must not be copied", timeoutRecovery: recovery }],
403
+ }), "utf-8");
404
+ },
405
+ }));
406
+
407
+ assert.equal(result.isError, undefined);
408
+ const text = textOf(result);
409
+ assert.match(text, /Recovery needed: review the diff and artifacts before resuming or launching dependent stages\./);
410
+ assert.match(text, /requested report: missing/);
411
+ assert.match(text, /changed tracked files: input\.md/);
412
+ assert.doesNotMatch(text, /raw recovery message|settlementDiagnostic|raw output/);
413
+ const completion = result.details.completions?.[0];
414
+ assert.equal(completion?.success, false);
415
+ assert.deepEqual(completion?.results?.[0]?.timeoutRecovery, {
416
+ termination: "timed-out",
417
+ changedFiles: ["input.md"],
418
+ recoveryNeeded: true,
419
+ reason: "timed-out-with-dirty-worktree",
420
+ reportStatus: "missing",
421
+ });
422
+ } finally {
423
+ fs.rmSync(root, { recursive: true, force: true });
424
+ }
425
+ });
426
+
373
427
  it("surfaces terminal completion payloads from an indexed pending result file", async () => {
374
428
  const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-wait-completions-pending-"));
375
429
  const originalError = console.error;