@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
@@ -549,11 +549,146 @@ describe("subagent async widget rendering", () => {
549
549
  }], theme, 120);
550
550
 
551
551
  const text = lines.join("\n");
552
- assert.match(text, /Agent 1\/2: Review auth — private auth task \(reviewer\) · running/);
553
- assert.match(text, /Agent 2\/2: Review billing — private billing task \(reviewer\) · running/);
552
+ assert.match(text, /Review auth — private auth task \(reviewer\) · running/);
553
+ assert.match(text, /Review billing — private billing task \(reviewer\) · running/);
554
+ assert.doesNotMatch(text, /Agent \d+\/2:/);
554
555
  assert.equal(compactTaskText(" [prompt redacted] ", "Review auth"), "Review auth");
555
556
  });
556
557
 
558
+ it("renders a named top-level parallel group card with nested readable agent rows", () => {
559
+ const now = Date.now();
560
+ const text = buildWidgetLines([{
561
+ asyncId: "named-parallel-group",
562
+ asyncDir: "/tmp/named-parallel-group",
563
+ status: "running",
564
+ mode: "parallel",
565
+ agents: ["scout", "reviewer", "worker"],
566
+ activeParallelGroup: true,
567
+ runningSteps: 2,
568
+ completedSteps: 0,
569
+ stepsTotal: 3,
570
+ updatedAt: now,
571
+ steps: [
572
+ {
573
+ index: 0,
574
+ agent: "scout",
575
+ label: "Gather context",
576
+ description: "Read source files",
577
+ status: "running",
578
+ currentTool: "read",
579
+ currentToolStartedAt: now - 2_000,
580
+ currentPath: "src/tui/render.ts",
581
+ },
582
+ {
583
+ index: 1,
584
+ agent: "reviewer",
585
+ sessionName: "reviewer: Review diff",
586
+ status: "running",
587
+ currentTool: "grep",
588
+ currentToolStartedAt: now - 1_000,
589
+ currentPath: "test/integration/render-widget.test.ts",
590
+ phase: "review",
591
+ workflowKey: "review",
592
+ outputName: "review.md",
593
+ children: [{
594
+ id: "nested-reviewer",
595
+ parentRunId: "named-parallel-group",
596
+ parentStepIndex: 1,
597
+ depth: 1,
598
+ path: [{ runId: "named-parallel-group", stepIndex: 1 }],
599
+ state: "running",
600
+ agent: "nested-reviewer",
601
+ lastUpdate: now,
602
+ }],
603
+ },
604
+ {
605
+ index: 2,
606
+ agent: "worker",
607
+ label: "Apply fixes",
608
+ status: "pending",
609
+ phase: "implementation",
610
+ workflowKey: "worker",
611
+ outputName: "fix.md",
612
+ },
613
+ ],
614
+ }], theme, 220, true).join("\n");
615
+
616
+ assert.equal((text.match(/parallel group/g) ?? []).length, 1);
617
+ assert.match(text, /parallel · (?:2 agents running|2 running) · 0\/3 done/);
618
+ assert.match(text, /Gather context/);
619
+ assert.match(text, /Review diff/);
620
+ assert.doesNotMatch(text, /reviewer: Review diff/);
621
+ assert.match(text, /Apply fixes/);
622
+ assert.doesNotMatch(text, /Agent \d+\/3:/);
623
+ assert.match(text, /nested-reviewer/);
624
+ assert.match(text, /src\/tui\/render\.ts/);
625
+ assert.match(text, /out:review\.md/);
626
+ assert.match(text, /pending/);
627
+ });
628
+
629
+ it("groups active parallel-card rows before completed and pending rows", () => {
630
+ const text = buildWidgetLines([{
631
+ asyncId: "active-first-group",
632
+ asyncDir: "/tmp/active-first-group",
633
+ status: "running",
634
+ mode: "parallel",
635
+ agents: ["scout", "worker", "reviewer", "auditor"],
636
+ activeParallelGroup: true,
637
+ runningSteps: 2,
638
+ completedSteps: 1,
639
+ stepsTotal: 4,
640
+ steps: [
641
+ { index: 0, agent: "scout", label: "done-scout", status: "complete" },
642
+ { index: 1, agent: "worker", label: "pending-worker", status: "pending" },
643
+ { index: 2, agent: "reviewer", label: "active-reviewer", status: "running" },
644
+ { index: 3, agent: "auditor", label: "active-auditor", status: "running" },
645
+ ],
646
+ }], theme, 220, true).join("\n");
647
+ const rowIndex = (label: string): number => text.split("\n").findIndex((line) => line.includes(label) && !line.includes("task:"));
648
+ const done = rowIndex("done-scout");
649
+ const pending = rowIndex("pending-worker");
650
+ const reviewer = rowIndex("active-reviewer");
651
+ const auditor = rowIndex("active-auditor");
652
+
653
+ assert.ok(reviewer >= 0 && auditor >= 0 && done >= 0 && pending >= 0);
654
+ assert.ok(reviewer < auditor, "active rows should retain stable input order");
655
+ assert.ok(auditor < done, "active rows should precede completed rows");
656
+ assert.ok(done < pending, "completed rows should precede pending rows");
657
+ assert.match(text, /done-scout.*complete/);
658
+ assert.match(text, /pending-worker.*pending/);
659
+ });
660
+
661
+ it("preserves completed, pending, and hidden overflow evidence in a parallel group card", () => {
662
+ const group = {
663
+ asyncId: "evidence-group",
664
+ asyncDir: "/tmp/evidence-group",
665
+ status: "running",
666
+ mode: "parallel",
667
+ agents: ["scout", "worker"],
668
+ activeParallelGroup: true,
669
+ runningSteps: 0,
670
+ completedSteps: 1,
671
+ stepsTotal: 2,
672
+ steps: [
673
+ { index: 0, agent: "scout", label: "done-scout", status: "complete" },
674
+ { index: 1, agent: "worker", label: "pending-worker", status: "pending" },
675
+ ],
676
+ };
677
+ const text = buildWidgetLines([
678
+ group,
679
+ { asyncId: "overflow-1", asyncDir: "/tmp/overflow-1", status: "running", agents: ["one"] },
680
+ { asyncId: "overflow-2", asyncDir: "/tmp/overflow-2", status: "running", agents: ["two"] },
681
+ { asyncId: "overflow-3", asyncDir: "/tmp/overflow-3", status: "running", agents: ["three"] },
682
+ { asyncId: "overflow-4", asyncDir: "/tmp/overflow-4", status: "running", agents: ["four"] },
683
+ ], theme, 220).join("\n");
684
+
685
+ assert.equal((text.match(/parallel group/g) ?? []).length, 1);
686
+ assert.match(text, /1\/2 done/);
687
+ assert.match(text, /done-scout.*complete/);
688
+ assert.match(text, /pending-worker.*pending/);
689
+ assert.match(text, /\+1 more \(1 running\)/);
690
+ });
691
+
557
692
  it("shows peak context usage and falls back to token usage without a limit", () => {
558
693
  const step = {
559
694
  index: 0,
@@ -608,6 +743,7 @@ describe("subagent async widget rendering", () => {
608
743
  const lines = (widget as (_tui: unknown, widgetTheme: typeof theme) => { render(width: number): string[] })(undefined, theme).render(180).map((line) => line.trimEnd());
609
744
  const text = lines.join("\n");
610
745
  assert.match(text, /async subagent parallel \(3\) · background/);
746
+ assert.match(text, /parallel group · 3 agents running · 0\/3 done/);
611
747
  assert.match(text, /Agent 1\/3: reviewer · running · active now · 5 turns · 18 tool uses · 44k token/);
612
748
  assert.match(text, /Agent 2\/3: reviewer · running · active 2s ago · 4 turns · 13 tool uses · 22k token/);
613
749
  assert.match(text, /Agent 3\/3: reviewer · running · grep \| 1\.0s · 3 turns · 11 tool uses · 19k token/);
@@ -790,6 +926,110 @@ describe("subagent async widget rendering", () => {
790
926
  resetWidgetLayout();
791
927
  });
792
928
 
929
+ it("keeps the active runs.lanes stage in focus before collapsed history", () => {
930
+ resetWidgetLayout();
931
+ withStdoutSize(60, 120, () => {
932
+ const stageKeys = ["scope-scout", "red-tests", "label-helpers", "summary-title", "detail-row", "tiers-noise", "validation", "minimality-challenge", "fresh-review"];
933
+ const nodeIds = stageKeys.map((key) => `issue-1695.${key}`);
934
+ const statuses = stageKeys.map((_, index) => index < 3 ? "completed" : index === 3 ? "running" : "pending");
935
+ const workflowGraph = {
936
+ runId: "workflow-1695",
937
+ mode: "workflow",
938
+ phases: [{ title: "issue-1695 staged lane", nodeIds }],
939
+ nodes: stageKeys.map((key, index) => ({
940
+ id: nodeIds[index],
941
+ kind: "step",
942
+ agent: index === 0 ? "scout" : "worker",
943
+ label: key,
944
+ status: statuses[index],
945
+ flatIndex: index,
946
+ stepIndex: index,
947
+ })),
948
+ currentNodeId: nodeIds[3],
949
+ };
950
+ const job = {
951
+ asyncId: "workflow-1695",
952
+ asyncDir: "/tmp/workflow-1695",
953
+ status: "running",
954
+ mode: "workflow",
955
+ agents: ["scout", "worker"],
956
+ currentStep: 3,
957
+ stepsTotal: 4,
958
+ updatedAt: 200,
959
+ workflowGraph,
960
+ steps: stageKeys.slice(0, 4).map((key, index) => ({
961
+ index,
962
+ agent: index === 0 ? "scout" : "worker",
963
+ status: statuses[index],
964
+ label: key,
965
+ workflowKey: nodeIds[index],
966
+ phase: "issue-1695",
967
+ description: `${key} task`,
968
+ outputName: `${key}.md`,
969
+ ...(index < 3 ? { lastActivityAt: 100 } : { currentTool: "read", currentToolStartedAt: 190, lastActivityAt: 195 }),
970
+ })),
971
+ };
972
+ const ui = createUiContext();
973
+ renderWidget(ui.ctx as never, [job]);
974
+ const lines = renderWidgetLines(ui.widgets.at(-1));
975
+ const text = lines.join("\n");
976
+ const activeIndex = lines.findIndex((line) => line.includes("summary-title"));
977
+ const hiddenIndex = lines.findIndex((line) => /lines hidden/.test(line));
978
+ assert.ok(hiddenIndex >= 0, `collapsed history should expose a hidden-lines marker:\n${text}`);
979
+ assert.ok(activeIndex >= 0, `active stage should remain visible:\n${text}`);
980
+ assert.ok(activeIndex < hiddenIndex, `active stage must precede the hidden-lines marker:\n${text}`);
981
+ assert.match(text, /stage\s+4\/9/i);
982
+ assert.match(text, /summary-title task/);
983
+ assert.match(lines[activeIndex]!, /worker/);
984
+ });
985
+ resetWidgetLayout();
986
+ });
987
+
988
+ it("prioritizes failed, blocked, and gate stages over completed history", () => {
989
+ const stages = [
990
+ { index: 0, agent: "scout", label: "completed-history", workflowKey: "issue-1695.completed-history", status: "complete" },
991
+ { index: 1, agent: "worker", label: "failed-stage", workflowKey: "issue-1695.failed-stage", status: "failed", error: "stage failed" },
992
+ { index: 2, agent: "worker", label: "blocked-stage", workflowKey: "issue-1695.blocked-stage", status: "pending", toolBudgetBlocked: true },
993
+ { index: 3, agent: "reviewer", label: "gate-stage", workflowKey: "issue-1695.gate-stage", status: "complete", review: { status: "blockers" } },
994
+ { index: 4, agent: "worker", label: "completed-tail", workflowKey: "issue-1695.completed-tail", status: "complete" },
995
+ ];
996
+ const workflowGraph = {
997
+ runId: "workflow-priority",
998
+ mode: "workflow",
999
+ phases: [{ title: "issue-1695 staged lane", nodeIds: stages.map((stage) => stage.workflowKey) }],
1000
+ nodes: stages.map((stage) => ({
1001
+ id: stage.workflowKey,
1002
+ kind: "step",
1003
+ agent: stage.agent,
1004
+ label: stage.label,
1005
+ status: stage.status === "complete" ? "completed" : stage.status === "failed" ? "failed" : "pending",
1006
+ flatIndex: stage.index,
1007
+ stepIndex: stage.index,
1008
+ })),
1009
+ currentNodeId: "issue-1695.failed-stage",
1010
+ };
1011
+ const text = buildWidgetLines([{
1012
+ asyncId: "workflow-priority",
1013
+ asyncDir: "/tmp/workflow-priority",
1014
+ status: "running",
1015
+ mode: "workflow",
1016
+ agents: ["scout", "worker", "reviewer"],
1017
+ currentStep: 1,
1018
+ stepsTotal: stages.length,
1019
+ workflowGraph,
1020
+ steps: stages,
1021
+ }], theme, 220, false).join("\n");
1022
+ const rowIndex = (label: string): number => text.split("\n").findIndex((line) => line.includes(label));
1023
+ const completed = rowIndex("completed-history");
1024
+ const failed = rowIndex("failed-stage");
1025
+ const blocked = rowIndex("blocked-stage");
1026
+ const gate = rowIndex("gate-stage");
1027
+ assert.ok(completed >= 0 && failed >= 0 && blocked >= 0 && gate >= 0, text);
1028
+ assert.ok(failed < completed, `failed stage should precede completed history:\n${text}`);
1029
+ assert.ok(blocked < completed, `blocked stage should precede completed history:\n${text}`);
1030
+ assert.ok(gate < completed, `gate stage should precede completed history:\n${text}`);
1031
+ });
1032
+
793
1033
  it("keeps constrained progressive slots focused on active jobs", () => {
794
1034
  resetWidgetLayout();
795
1035
  withStdoutSize(22, 120, () => {
@@ -856,7 +1096,8 @@ describe("subagent async widget rendering", () => {
856
1096
 
857
1097
  const text = renderWidgetLines(ui.widgets.at(-1)).join("\n");
858
1098
  assert.match(text, /async subagent parallel · background/);
859
- assert.match(text, /Agent 1\/1: reviewer · running/);
1099
+ assert.match(text, /parallel group · 1 agent running · 0\/1 done/);
1100
+ assert.match(text, /reviewer · running/);
860
1101
  assert.doesNotMatch(text, /subagents \(1\/1 running\)/);
861
1102
  });
862
1103
  resetWidgetLayout();
@@ -887,7 +1128,8 @@ describe("subagent async widget rendering", () => {
887
1128
  const text = lines.join("\n");
888
1129
  assert.match(text, /async subagent parallel \(3\) · background/);
889
1130
  assert.match(text, /parallel · 2 agents running · 1\/3 done/);
890
- assert.match(text, /Agent 1\/3: reviewer: Inspect the first row · running · 2 tool uses/);
1131
+ assert.match(text, /Inspect the first row · running · 2 tool uses/);
1132
+ assert.doesNotMatch(text, /Agent 1\/3: reviewer/);
891
1133
  assert.match(text, /⎿ active now/);
892
1134
  assert.match(text, /Agent 2\/3: reviewer · running\n\s+⎿ read \| 2\.0s/);
893
1135
  assert.match(text, /Press configured-expand-key for live detail/);
@@ -918,8 +1160,8 @@ describe("subagent async widget rendering", () => {
918
1160
  },
919
1161
  ], theme, 180).join("\n");
920
1162
 
921
- assert.match(text, /Agent 1\/1: reviewer: Inspect the multi-job row · running/);
922
- assert.doesNotMatch(text, /Agent 1\/1: reviewer · running/);
1163
+ assert.match(text, /Inspect the multi-job row · running/);
1164
+ assert.doesNotMatch(text, /reviewer: Inspect the multi-job row/);
923
1165
  });
924
1166
 
925
1167
  it("shows async job and step context badges", () => {
@@ -945,8 +1187,8 @@ describe("subagent async widget rendering", () => {
945
1187
  ], theme, 160).join("\n");
946
1188
 
947
1189
  assert.match(text, /parallel \[mixed\]/);
948
- assert.match(text, /Agent 1\/2: scout \[fresh\] · running/);
949
- assert.match(text, /Agent 2\/2: worker \[fork\] · running/);
1190
+ assert.match(text, /scout \[fresh\] · running/);
1191
+ assert.match(text, /worker \[fork\] · running/);
950
1192
  });
951
1193
 
952
1194
  it("shows model and thinking for active async widget rows", () => {
@@ -969,8 +1211,8 @@ describe("subagent async widget rendering", () => {
969
1211
  ], theme, 180);
970
1212
 
971
1213
  const text = lines.join("\n");
972
- assert.match(text, /Agent 1\/2: reviewer · running \(gpt-5\.5 · thinking high\)/);
973
- assert.match(text, /Agent 2\/2: scout · running \(claude-haiku-4-5 · thinking low\)/);
1214
+ assert.match(text, /reviewer · running \(gpt-5\.5 · thinking high\)/);
1215
+ assert.match(text, /scout · running \(claude-haiku-4-5 · thinking low\)/);
974
1216
  assert.doesNotMatch(text, /openai-codex\/gpt-5\.5/);
975
1217
  assert.doesNotMatch(text, /gpt-5\.5:high/);
976
1218
  });
@@ -993,9 +1235,9 @@ describe("subagent async widget rendering", () => {
993
1235
  },
994
1236
  ], theme, 68);
995
1237
 
996
- const row = lines.find((line) => line.includes("Agent 1/1")) ?? "";
997
- assert.match(row, /Agent 1\/1: reviewer · running/);
998
- assert.doesNotMatch(row, /Agent 1\/1: reviewer \(/);
1238
+ const row = lines.find((line) => line.includes("reviewer · running")) ?? "";
1239
+ assert.match(row, /reviewer · running/);
1240
+ assert.doesNotMatch(row, /reviewer \(/);
999
1241
  });
1000
1242
 
1001
1243
  it("shows inline live detail for expanded async parallel widget rows", () => {
@@ -1107,6 +1349,10 @@ describe("subagent async widget rendering", () => {
1107
1349
  "Step 1/1: reviewer · running (gpt-5.5 · thinking xhigh) · 4 turns · 11 tool uses",
1108
1350
  "reviewer · step 1/1 · 11 tool uses · 3m32s",
1109
1351
  "Step 1/1: reviewer · running (gpt-5.5 · thinking xhigh) · 4 turns · 11 tool uses",
1352
+ "reviewer [fresh] · running · 11 tool uses · 3m37s",
1353
+ "reviewer · running · 11 tool uses · 3m39s",
1354
+ "reviewer · running · 11 tool uses · 3m42s",
1355
+ "reviewer · running · 11 tool uses · 3m44s",
1110
1356
  "repo=nicobailon/pi-subagents",
1111
1357
  "sha=d61aca... | 2m32s",
1112
1358
  "output: /var/folders/x/T/pi-subagents-uid-501/async-subagent-runs/run-status-snapshots/output.log",
@@ -1116,12 +1362,16 @@ describe("subagent async widget rendering", () => {
1116
1362
  };
1117
1363
 
1118
1364
  const expandedText = buildWidgetLines([job], theme, 180, true).join("\n");
1119
- assert.match(expandedText, /↻ 7 progress updates/);
1365
+ assert.match(expandedText, /↻ 11 progress updates/);
1120
1366
  assert.match(expandedText, /latest: output: \/var\/folders\/x\/T\/pi-subagents-uid-501\/async-subagent-runs\/run-status-snapshots\/output.log/);
1121
1367
  assert.match(expandedText, /repo=nicobailon\/pi-subagents/);
1122
1368
  assert.match(expandedText, /sha=d61aca\.\.\. \| 2m32s/);
1123
1369
  assert.doesNotMatch(expandedText, /3m27s/);
1124
1370
  assert.doesNotMatch(expandedText, /3m29s/);
1371
+ assert.doesNotMatch(expandedText, /3m37s/);
1372
+ assert.doesNotMatch(expandedText, /3m39s/);
1373
+ assert.doesNotMatch(expandedText, /3m42s/);
1374
+ assert.doesNotMatch(expandedText, /3m44s/);
1125
1375
  });
1126
1376
 
1127
1377
  it("keeps mixed live output raw instead of hiding non-status lines", () => {
@@ -1196,41 +1446,163 @@ describe("subagent async widget rendering", () => {
1196
1446
  assert.match(expandedText, /Checking final status: rejected/);
1197
1447
  });
1198
1448
 
1199
- it("shows step detail and configured live detail key hint for running single async jobs with steps", () => {
1449
+ it("dedupes one-child single async summary/title while retaining detail evidence", () => {
1200
1450
  const now = Date.now();
1201
1451
  const job = {
1202
1452
  asyncId: "single-run",
1203
1453
  asyncDir: "/tmp/single-run",
1204
1454
  status: "running",
1205
1455
  mode: "single",
1206
- agents: ["worker"],
1456
+ agents: ["reviewer"],
1457
+ currentStep: 0,
1207
1458
  stepsTotal: 1,
1208
1459
  updatedAt: now,
1209
1460
  steps: [
1210
1461
  {
1211
1462
  index: 0,
1212
- agent: "worker",
1213
- sessionName: " worker: Read the widget ",
1463
+ agent: "reviewer",
1464
+ sessionName: " reviewer: Review the widget ",
1214
1465
  status: "running",
1466
+ description: "Review the widget",
1215
1467
  currentTool: "read",
1216
1468
  currentToolArgs: "src/tui/render.ts",
1217
1469
  currentToolStartedAt: now - 2000,
1218
- recentOutput: ["reading render widget"],
1470
+ toolCount: 23,
1471
+ durationMs: 49_100,
1472
+ recentOutput: ["error: failed to inspect the widget"],
1219
1473
  },
1220
1474
  ],
1221
1475
  };
1222
1476
 
1223
1477
  const collapsedText = buildWidgetLines([job], theme, 180).join("\n");
1224
- assert.match(collapsedText, /async subagent worker · background/);
1225
- assert.match(collapsedText, /Step 1\/1: worker: Read the widget · running/);
1478
+ const collapsedLines = collapsedText.split("\n");
1479
+ const collapsedSummary = collapsedLines.slice(0, 2).join("\n");
1480
+ assert.doesNotMatch(collapsedSummary, /step 1\/1/i);
1481
+ assert.match(collapsedSummary, /async subagent · background/);
1482
+ assert.match(collapsedSummary, /reviewer/);
1483
+ assert.match(collapsedLines[1] ?? "", /reviewer · running · 23 tool uses · 49\.1s/);
1484
+ assert.equal(collapsedLines.filter((line) => line.includes("reviewer · running · 23 tool uses · 49.1s")).length, 1);
1485
+ assert.doesNotMatch(collapsedText, /Step 1\/1: reviewer:/);
1486
+ assert.match(collapsedText, /reviewer · running · 23 tool uses · 49\.1s/);
1487
+ assert.match(collapsedText, /task: Review the widget/);
1226
1488
  assert.match(collapsedText, /⎿ read: src\/tui\/render\.ts \| 2\.0s/);
1227
1489
  assert.match(collapsedText, /Press configured-expand-key for live detail/);
1228
1490
  assert.match(collapsedText, outputPathPattern("/tmp/single-run/output-0.log"));
1229
- assert.doesNotMatch(collapsedText, /reading render widget/);
1491
+ assert.doesNotMatch(collapsedText, /error: failed to inspect the widget/);
1230
1492
 
1231
1493
  const expandedText = buildWidgetLines([job], theme, 180, true).join("\n");
1494
+ const expandedLines = expandedText.split("\n");
1495
+ const expandedSummary = expandedLines.slice(0, 2).join("\n");
1232
1496
  assert.doesNotMatch(expandedText, /Press configured-expand-key for live detail/);
1233
- assert.match(expandedText, /reading render widget/);
1497
+ assert.doesNotMatch(expandedSummary, /step 1\/1/i);
1498
+ assert.match(expandedSummary, /async subagent · background/);
1499
+ assert.match(expandedSummary, /reviewer/);
1500
+ assert.match(expandedLines[1] ?? "", /reviewer · running · 23 tool uses · 49\.1s/);
1501
+ assert.equal(expandedLines.filter((line) => line.includes("reviewer · running · 23 tool uses · 49.1s")).length, 1);
1502
+ assert.doesNotMatch(expandedText, /Step 1\/1: reviewer:/);
1503
+ assert.match(expandedText, /reviewer · running · 23 tool uses · 49\.1s/);
1504
+ assert.match(expandedText, /task: Review the widget/);
1505
+ assert.match(expandedText, /⎿ read: src\/tui\/render\.ts \| 2\.0s/);
1506
+ assert.match(expandedText, /error: failed to inspect the widget/);
1507
+ assert.match(expandedText, outputPathPattern("/tmp/single-run/output-0.log"));
1508
+ });
1509
+
1510
+ it("collapses a completed single child but keeps a mismatched step header", () => {
1511
+ const completed = buildWidgetLines([{
1512
+ asyncId: "single-complete",
1513
+ asyncDir: "/tmp/single-complete",
1514
+ status: "complete",
1515
+ mode: "single",
1516
+ agents: ["reviewer"],
1517
+ stepsTotal: 1,
1518
+ steps: [{ index: 0, agent: "reviewer", sessionName: "reviewer: Review the widget", status: "completed" }],
1519
+ }], theme, 180).join("\n");
1520
+ assert.match(completed, /reviewer · complete/);
1521
+ assert.doesNotMatch(completed, /Step 1\/1: reviewer:/);
1522
+ assert.match(completed, /task: Review the widget/);
1523
+
1524
+ const mismatched = buildWidgetLines([{
1525
+ asyncId: "single-mismatch",
1526
+ asyncDir: "/tmp/single-mismatch",
1527
+ status: "complete",
1528
+ mode: "single",
1529
+ agents: ["reviewer"],
1530
+ currentStep: 0,
1531
+ stepsTotal: 1,
1532
+ steps: [{ index: 0, agent: "reviewer", sessionName: "reviewer: Review the widget", status: "running" }],
1533
+ }], theme, 180).join("\n");
1534
+ assert.match(mismatched, /Step 1\/1: reviewer: Review the widget · running/);
1535
+ });
1536
+
1537
+ it("keeps explicit single-child error and gate evidence with a step header", () => {
1538
+ const text = buildWidgetLines([{
1539
+ asyncId: "single-evidence",
1540
+ asyncDir: "/tmp/single-evidence",
1541
+ status: "running",
1542
+ mode: "single",
1543
+ agents: ["reviewer"],
1544
+ currentStep: 0,
1545
+ stepsTotal: 1,
1546
+ steps: [{
1547
+ index: 0,
1548
+ agent: "reviewer",
1549
+ sessionName: "reviewer: Review the widget",
1550
+ status: "running",
1551
+ error: "failed to inspect the widget",
1552
+ review: { status: "blockers" },
1553
+ }],
1554
+ }], theme, 180, true).join("\n");
1555
+ assert.match(text, /Step 1\/1: reviewer: Review the widget · running/);
1556
+ assert.match(text, /error: failed to inspect the widget/);
1557
+ assert.match(text, /gate:review blockers/);
1558
+ });
1559
+
1560
+ it("keeps a Step header for lane-bearing one-child single async jobs", () => {
1561
+ const job = {
1562
+ asyncId: "single-lane",
1563
+ asyncDir: "/tmp/single-lane",
1564
+ status: "running",
1565
+ mode: "single",
1566
+ agents: ["reviewer"],
1567
+ currentStep: 0,
1568
+ stepsTotal: 1,
1569
+ steps: [{
1570
+ index: 0,
1571
+ agent: "reviewer",
1572
+ sessionName: "reviewer: Review the widget",
1573
+ status: "running",
1574
+ phase: "fresh-review",
1575
+ label: "Review #1695",
1576
+ workflowKey: "review",
1577
+ outputName: "review.md",
1578
+ }],
1579
+ };
1580
+
1581
+ for (const expanded of [false, true]) {
1582
+ const text = buildWidgetLines([job], theme, 180, expanded).join("\n");
1583
+ assert.match(text, /Step 1\/1: reviewer: Review the widget · running/);
1584
+ assert.match(text, /phase:fresh-review/);
1585
+ assert.match(text, /out:review\.md/);
1586
+ }
1587
+ });
1588
+
1589
+ it("keeps failed, paused, and stopped detail evidence in single-child summaries", () => {
1590
+ for (const status of ["failed", "paused", "stopped"] as const) {
1591
+ const text = buildWidgetLines([{
1592
+ asyncId: `single-${status}`,
1593
+ asyncDir: `/tmp/single-${status}`,
1594
+ status,
1595
+ mode: "single",
1596
+ agents: ["reviewer"],
1597
+ currentStep: 0,
1598
+ stepsTotal: 1,
1599
+ steps: [{ index: 0, agent: "reviewer", status }],
1600
+ }], theme, 180).join("\n");
1601
+ const summary = text.split("\n").slice(0, 2).join("\n");
1602
+
1603
+ assert.doesNotMatch(summary, /step 1\/1/i);
1604
+ assert.match(text, new RegExp(`Step 1/1: reviewer · ${status}`));
1605
+ }
1234
1606
  });
1235
1607
 
1236
1608
  it("keeps generic activity fallback for single async jobs without steps", () => {
@@ -1275,6 +1647,91 @@ describe("subagent async widget rendering", () => {
1275
1647
  assert.match(text, /step 2\/3 · parallel group: 1 agent running · 1\/2 done/);
1276
1648
  });
1277
1649
 
1650
+ it("keeps the chain step number while nesting readable rows in an active parallel group card", () => {
1651
+ const text = buildWidgetLines([{
1652
+ asyncId: "active-chain-group",
1653
+ asyncDir: "/tmp/active-chain-group",
1654
+ status: "running",
1655
+ mode: "chain",
1656
+ agents: ["producer", "scout", "reviewer"],
1657
+ activeParallelGroup: true,
1658
+ currentStep: 2,
1659
+ chainStepCount: 3,
1660
+ parallelGroups: [{ start: 1, count: 2, stepIndex: 1 }],
1661
+ runningSteps: 1,
1662
+ completedSteps: 1,
1663
+ stepsTotal: 2,
1664
+ steps: [
1665
+ { index: 1, agent: "scout", label: "Inspect source", status: "complete" },
1666
+ { index: 2, agent: "reviewer", label: "Review diff", status: "running" },
1667
+ ],
1668
+ }], theme, 220, true).join("\n");
1669
+
1670
+ assert.match(text, /chain · step 2\/3/);
1671
+ assert.match(text, /Step 2\/3: parallel group/);
1672
+ assert.match(text, /Inspect source/);
1673
+ assert.match(text, /Review diff/);
1674
+ assert.doesNotMatch(text, /Agent \d+\/3:/);
1675
+ });
1676
+
1677
+ it("renders child rows beneath an inactive chain parallel-group header", () => {
1678
+ const text = buildWidgetLines([{
1679
+ asyncId: "completed-chain-group",
1680
+ asyncDir: "/tmp/completed-chain-group",
1681
+ status: "running",
1682
+ mode: "chain",
1683
+ agents: ["scout", "reviewer", "writer"],
1684
+ activeParallelGroup: false,
1685
+ currentStep: 3,
1686
+ chainStepCount: 2,
1687
+ parallelGroups: [{ start: 0, count: 2, stepIndex: 0 }],
1688
+ stepsTotal: 3,
1689
+ steps: [
1690
+ { index: 0, agent: "scout", label: "Gather context", status: "complete" },
1691
+ { index: 1, agent: "reviewer", label: "Review diff", status: "complete" },
1692
+ { index: 2, agent: "writer", label: "Apply fixes", status: "running" },
1693
+ ],
1694
+ }], theme, 220, true).join("\n");
1695
+ const headerIndex = text.indexOf("Step 1/2: parallel group");
1696
+
1697
+ assert.ok(headerIndex >= 0);
1698
+ assert.ok(text.indexOf("Gather context", headerIndex) > headerIndex);
1699
+ assert.ok(text.indexOf("Review diff", headerIndex) > headerIndex);
1700
+ assert.match(text, /Step 2\/2: writer/);
1701
+ });
1702
+
1703
+ it("renders a pending dynamic fanout placeholder instead of an empty parallel group", () => {
1704
+ const text = buildWidgetLines([{
1705
+ asyncId: "dynamic-placeholder",
1706
+ asyncDir: "/tmp/dynamic-placeholder",
1707
+ status: "running",
1708
+ mode: "chain",
1709
+ agents: ["expand:reviewer"],
1710
+ activeParallelGroup: true,
1711
+ currentStep: 0,
1712
+ chainStepCount: 1,
1713
+ parallelGroups: [{ start: 0, count: 1, stepIndex: 0 }],
1714
+ runningSteps: 0,
1715
+ completedSteps: 0,
1716
+ stepsTotal: 1,
1717
+ steps: [{
1718
+ index: 0,
1719
+ agent: "expand:reviewer",
1720
+ label: "Dynamic fanout (reviews)",
1721
+ description: "Await review targets",
1722
+ status: "pending",
1723
+ workflowKey: "dynamic-review",
1724
+ outputName: "reviews.md",
1725
+ }],
1726
+ }], theme, 220, true).join("\n");
1727
+
1728
+ assert.match(text, /parallel group/);
1729
+ assert.match(text, /Step 1\/1: parallel group/);
1730
+ assert.match(text, /Dynamic fanout \(reviews\)/);
1731
+ assert.match(text, /pending/);
1732
+ assert.match(text, /next:await launch/);
1733
+ });
1734
+
1278
1735
  it("uses logical chain steps after an async chain parallel group finishes", () => {
1279
1736
  const job = {
1280
1737
  asyncId: "run-chain",
@@ -1314,6 +1771,32 @@ describe("subagent async widget rendering", () => {
1314
1771
  );
1315
1772
  });
1316
1773
 
1774
+ it("keeps chain step structure when only one logical child is materialized", () => {
1775
+ const job = {
1776
+ asyncId: "partial-chain",
1777
+ asyncDir: "/tmp/partial-chain",
1778
+ status: "running",
1779
+ mode: "chain",
1780
+ agents: ["planner", "reviewer"],
1781
+ currentStep: 0,
1782
+ chainStepCount: 2,
1783
+ stepsTotal: 1,
1784
+ steps: [{
1785
+ index: 0,
1786
+ agent: "planner",
1787
+ sessionName: "planner: Plan the review",
1788
+ status: "running",
1789
+ }],
1790
+ };
1791
+ const text = buildWidgetLines([job], theme, 180).join("\n");
1792
+
1793
+ assert.match(text, /async subagent chain \(2\) · background/);
1794
+ assert.match(text, /chain · step 1\/2/);
1795
+ assert.match(text, /Step 1\/2: planner: Plan the review/);
1796
+ assert.doesNotMatch(text, /Step 1\/1: planner: Plan the review/);
1797
+ assert.doesNotMatch(text, /\s+[^\n]*planner · running/);
1798
+ });
1799
+
1317
1800
  it("omits zero-running labels for pending active async parallel groups", () => {
1318
1801
  const lines = buildWidgetLines([
1319
1802
  {
@@ -1411,7 +1894,8 @@ describe("subagent async widget rendering", () => {
1411
1894
  );
1412
1895
  });
1413
1896
 
1414
- it("keeps running widget output stable when progress seed is unchanged", async () => {
1897
+ it("advances running widget glyphs when the wall clock moves despite unchanged progress", () => {
1898
+ const originalNow = Date.now;
1415
1899
  const job = {
1416
1900
  asyncId: "run-stable",
1417
1901
  asyncDir: "/tmp/run",
@@ -1423,12 +1907,19 @@ describe("subagent async widget rendering", () => {
1423
1907
  currentToolStartedAt: 2_000,
1424
1908
  lastActivityAt: 2_500,
1425
1909
  };
1426
- const first = buildWidgetLines([job], theme, 120);
1427
- await new Promise((resolve) => setTimeout(resolve, 120));
1428
- const second = buildWidgetLines([job], theme, 120);
1910
+ try {
1911
+ Date.now = () => 1_000;
1912
+ const first = buildWidgetLines([job], theme, 120);
1913
+ Date.now = () => 1_125;
1914
+ const second = buildWidgetLines([job], theme, 120);
1915
+ const withoutRunningGlyphs = (lines: string[]) => lines.map((line) => line.replace(/[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]/gu, ""));
1429
1916
 
1430
- assert.deepEqual(second, first);
1431
- assert.equal(firstGrapheme(first[1] ?? ""), firstGrapheme(second[1] ?? ""));
1917
+ assert.notDeepEqual(second, first);
1918
+ assert.deepEqual(withoutRunningGlyphs(second), withoutRunningGlyphs(first), "only the running glyph should change");
1919
+ assert.notEqual(firstGrapheme(first[1] ?? ""), firstGrapheme(second[1] ?? ""));
1920
+ } finally {
1921
+ Date.now = originalNow;
1922
+ }
1432
1923
  });
1433
1924
 
1434
1925
  it("advances component running glyphs with the render clock", () => {
@@ -1473,8 +1964,8 @@ describe("subagent async widget rendering", () => {
1473
1964
  assert.notEqual(firstRunningGlyph(first[0] ?? ""), firstRunningGlyph(second[0] ?? ""), "header glyph should advance");
1474
1965
  assert.notEqual(firstRunningGlyph(first[1] ?? ""), firstRunningGlyph(second[1] ?? ""), "job glyph should advance");
1475
1966
  assert.notEqual(
1476
- firstRunningGlyph(first.find((line) => line.includes("Agent 1/1")) ?? ""),
1477
- firstRunningGlyph(second.find((line) => line.includes("Agent 1/1")) ?? ""),
1967
+ firstRunningGlyph(first.find((line) => line.includes("reviewer · running")) ?? ""),
1968
+ firstRunningGlyph(second.find((line) => line.includes("reviewer · running")) ?? ""),
1478
1969
  "step glyph should advance",
1479
1970
  );
1480
1971
  } finally {