@selesai/code 0.13.12 → 0.13.14

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 (203) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/extensions/pi-subagents/CHANGELOG.md +77 -1
  3. package/dist/extensions/pi-subagents/VISION.md +12 -1
  4. package/dist/extensions/pi-subagents/docs/agents.md +13 -6
  5. package/dist/extensions/pi-subagents/docs/configuration.md +35 -9
  6. package/dist/extensions/pi-subagents/docs/extension-api.md +1 -1
  7. package/dist/extensions/pi-subagents/docs/missions.md +1 -1
  8. package/dist/extensions/pi-subagents/docs/models.md +6 -6
  9. package/dist/extensions/pi-subagents/docs/observability.md +6 -3
  10. package/dist/extensions/pi-subagents/docs/tool-reference.md +3 -3
  11. package/dist/extensions/pi-subagents/docs/watchdog.md +92 -114
  12. package/dist/extensions/pi-subagents/docs/workflows.md +1 -1
  13. package/dist/extensions/pi-subagents/install.mjs +1 -2
  14. package/dist/extensions/pi-subagents/package.json +1 -1
  15. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +1 -1
  16. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +6 -6
  17. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -2
  18. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +1 -1
  19. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +4 -4
  20. package/dist/extensions/pi-subagents/skills/pi-subagents/references/review-and-validation.md +1 -1
  21. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +41 -4
  22. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +3 -0
  23. package/dist/extensions/pi-subagents/src/agents/agents.ts +120 -124
  24. package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +5 -1
  25. package/dist/extensions/pi-subagents/src/api/preflight.ts +4 -0
  26. package/dist/extensions/pi-subagents/src/api/shared-types.ts +3 -0
  27. package/dist/extensions/pi-subagents/src/extension/config.ts +20 -0
  28. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +1 -0
  29. package/dist/extensions/pi-subagents/src/extension/schemas.ts +6 -2
  30. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +1 -1
  31. package/dist/extensions/pi-subagents/src/inspectors/herdr/inspector-runner.ts +19 -13
  32. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +26 -8
  33. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +103 -23
  34. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +6 -2
  35. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -2
  36. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +54 -3
  37. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +16 -0
  38. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +22 -2
  39. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +63 -6
  40. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +4 -1
  41. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +69 -12
  42. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +13 -0
  43. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +3 -1
  44. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +21 -8
  45. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +59 -6
  46. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +95 -18
  47. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +11 -43
  48. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +1 -0
  49. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
  50. package/dist/extensions/pi-subagents/src/runs/shared/lane-metadata.ts +24 -3
  51. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +4 -0
  52. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +2 -6
  53. package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +1 -0
  54. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +33 -18
  55. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +73 -37
  56. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +33 -6
  57. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +4 -2
  58. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +20 -3
  59. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +21 -7
  60. package/dist/extensions/pi-subagents/src/runs/shared/tool-timeout.ts +1 -1
  61. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +467 -63
  62. package/dist/extensions/pi-subagents/src/shared/atomic-json.ts +3 -1
  63. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +0 -12
  64. package/dist/extensions/pi-subagents/src/shared/fork-session-cwd.ts +27 -0
  65. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +3 -0
  66. package/dist/extensions/pi-subagents/src/shared/types.ts +42 -4
  67. package/dist/extensions/pi-subagents/src/shared/utils.ts +18 -7
  68. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +1 -1
  69. package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +26 -12
  70. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +61 -2
  71. package/dist/extensions/pi-subagents/src/tui/fleet.ts +12 -7
  72. package/dist/extensions/pi-subagents/src/tui/render.ts +227 -14
  73. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +56 -34
  74. package/dist/extensions/pi-subagents/src/watchdog/diff-tool.ts +77 -0
  75. package/dist/extensions/pi-subagents/src/watchdog/emission-guard.ts +5 -3
  76. package/dist/extensions/pi-subagents/src/watchdog/guidance.ts +20 -0
  77. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +16 -13
  78. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +10 -9
  79. package/dist/extensions/pi-subagents/src/watchdog/render.ts +4 -5
  80. package/dist/extensions/pi-subagents/src/watchdog/review.ts +15 -4
  81. package/dist/extensions/pi-subagents/src/watchdog/rules.ts +70 -0
  82. package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +75 -92
  83. package/dist/extensions/pi-subagents/src/watchdog/scope.ts +2 -1
  84. package/dist/extensions/pi-subagents/src/watchdog/settings.ts +48 -104
  85. package/dist/extensions/pi-subagents/src/watchdog/types.ts +18 -32
  86. package/dist/extensions/pi-subagents/src/watchdog/warning-format.ts +0 -1
  87. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -2
  88. package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +439 -0
  89. package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +28 -1
  90. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +335 -21
  91. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +4 -1
  92. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +1 -1
  93. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +22 -18
  94. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +0 -1
  95. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +21 -18
  96. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +307 -22
  97. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1 -0
  98. package/dist/extensions/pi-subagents/test/support/helpers.ts +25 -0
  99. package/dist/extensions/pi-subagents/test/support/isolated-temp-root.mjs +15 -4
  100. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +17 -2
  101. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +96 -15
  102. package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +53 -5
  103. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +20 -0
  104. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +221 -8
  105. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +45 -24
  106. package/dist/extensions/pi-subagents/test/unit/agent-scan-dirs.test.ts +133 -0
  107. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +28 -2
  108. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +1 -1
  109. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +2 -0
  110. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +4 -1
  111. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +18 -4
  112. package/dist/extensions/pi-subagents/test/unit/atomic-json.test.ts +16 -0
  113. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +38 -0
  114. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +2 -2
  115. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +21 -0
  116. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +19 -6
  117. package/dist/extensions/pi-subagents/test/unit/get-final-output.test.ts +26 -0
  118. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +22 -1
  119. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +2 -6
  120. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +66 -1
  121. package/dist/extensions/pi-subagents/test/unit/pi-args-permission-system.test.ts +1 -1
  122. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +116 -10
  123. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +136 -18
  124. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +20 -0
  125. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +22 -0
  126. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +1 -0
  127. package/dist/extensions/pi-subagents/test/unit/project-panes-public-api.test.ts +8 -0
  128. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +127 -48
  129. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +68 -0
  130. package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +17 -0
  131. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +88 -0
  132. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +4 -2
  133. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +9 -9
  134. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -2
  135. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +9 -3
  136. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +22 -9
  137. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +91 -8
  138. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +27 -0
  139. package/dist/extensions/pi-subagents/test/unit/temp-paths.test.ts +50 -0
  140. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +0 -1
  141. package/dist/extensions/pi-subagents/test/unit/tool-timeout.test.ts +2 -2
  142. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +34 -0
  143. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +1 -2
  144. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +73 -13
  145. package/dist/extensions/pi-subagents/test/unit/watchdog-diff-tool.test.ts +79 -0
  146. package/dist/extensions/pi-subagents/test/unit/watchdog-permission-arbiter.test.ts +2 -4
  147. package/dist/extensions/pi-subagents/test/unit/watchdog-render.test.ts +7 -8
  148. package/dist/extensions/pi-subagents/test/unit/watchdog-review.test.ts +48 -3
  149. package/dist/extensions/pi-subagents/test/unit/watchdog-rules.test.ts +37 -0
  150. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +36 -118
  151. package/dist/extensions/pi-subagents/test/unit/watchdog-scope.test.ts +1 -1
  152. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +37 -14
  153. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +45 -26
  154. package/dist/extensions/pi-subagents/test/unit/workflow-checklist.test.ts +223 -0
  155. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +50 -1
  156. package/dist/extensions/pi-subagents/test/unit/workflow-preflight.test.ts +22 -0
  157. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +136 -4
  158. package/dist/extensions/pi-zentui/README.md +19 -5
  159. package/dist/extensions/pi-zentui/docs/configuration.md +37 -9
  160. package/dist/extensions/pi-zentui/extensions/zentui/config.ts +29 -0
  161. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +31 -2
  162. package/dist/extensions/pi-zentui/extensions/zentui/prototype-patch-registry.ts +55 -11
  163. package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +115 -3
  164. package/dist/extensions/pi-zentui/extensions/zentui/settings-previews.ts +119 -2
  165. package/dist/extensions/pi-zentui/extensions/zentui/thinking-experimental.ts +1768 -0
  166. package/dist/extensions/pi-zentui/extensions/zentui/thinking-status.ts +69 -0
  167. package/dist/extensions/pi-zentui/extensions/zentui/thinking-steps.ts +155 -0
  168. package/dist/extensions/pi-zentui/extensions/zentui/ui.ts +2 -1
  169. package/dist/extensions/pi-zentui/extensions/zentui/user-message-osc.ts +16 -2
  170. package/dist/extensions/pi-zentui/extensions/zentui/user-message-styles.ts +1 -1
  171. package/dist/extensions/pi-zentui/test/config-load-lifecycle.test.ts +124 -0
  172. package/dist/extensions/pi-zentui/test/config.test.ts +82 -2
  173. package/dist/extensions/pi-zentui/test/editor-viewport-indicators.test.ts +19 -4
  174. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +58 -9
  175. package/dist/extensions/pi-zentui/test/package-contents.mjs +33 -0
  176. package/dist/extensions/pi-zentui/test/prototype-patch-registry.test.ts +131 -0
  177. package/dist/extensions/pi-zentui/test/responsive-dependencies.test.ts +4 -4
  178. package/dist/extensions/pi-zentui/test/settings-command.test.ts +289 -7
  179. package/dist/extensions/pi-zentui/test/settings-previews.test.ts +106 -0
  180. package/dist/extensions/pi-zentui/test/thinking-experimental-docs.test.ts +51 -0
  181. package/dist/extensions/pi-zentui/test/thinking-experimental-loader-diagnostics.mjs +54 -0
  182. package/dist/extensions/pi-zentui/test/thinking-experimental-missing-export.test.ts +44 -0
  183. package/dist/extensions/pi-zentui/test/thinking-experimental-rows.test.ts +297 -0
  184. package/dist/extensions/pi-zentui/test/thinking-experimental-tui.mjs +2329 -0
  185. package/dist/extensions/pi-zentui/test/thinking-experimental.test.ts +1668 -0
  186. package/dist/extensions/pi-zentui/test/thinking-status.test.ts +85 -0
  187. package/dist/extensions/pi-zentui/test/thinking-steps.test.ts +122 -0
  188. package/dist/extensions/pi-zentui/test/user-message-osc.test.ts +58 -0
  189. package/dist/skills/brandkit/SKILL.md +0 -2
  190. package/dist/skills/{industrial-brutalist-ui → brutalist}/SKILL.md +1 -3
  191. package/dist/skills/gpt-taste/SKILL.md +0 -2
  192. package/dist/skills/image-to-code/SKILL.md +0 -2
  193. package/dist/skills/imagegen-frontend-mobile/SKILL.md +0 -2
  194. package/dist/skills/imagegen-frontend-web/SKILL.md +0 -2
  195. package/dist/skills/{minimalist-ui → minimalist}/SKILL.md +1 -3
  196. package/dist/skills/{full-output-enforcement → output}/SKILL.md +1 -3
  197. package/dist/skills/{redesign-existing-projects → redesign}/SKILL.md +1 -3
  198. package/dist/skills/{high-end-visual-design → soft}/SKILL.md +1 -3
  199. package/dist/skills/stitch/DESIGN.md +121 -0
  200. package/dist/skills/{stitch-design-taste → stitch}/SKILL.md +1 -3
  201. package/dist/skills/{design-taste-frontend → taste}/SKILL.md +1 -3
  202. package/dist/skills/{design-taste-frontend-v1 → taste-v1}/SKILL.md +2 -4
  203. package/package.json +1 -1
@@ -3,7 +3,7 @@ import assert from "node:assert/strict";
3
3
  import * as fs from "node:fs";
4
4
  import * as path from "node:path";
5
5
  import type { MockPi } from "../support/helpers.ts";
6
- import { createEventBus, createMockPi, createTempDir, events, removeTempDir, tryImport } from "../support/helpers.ts";
6
+ import { createEventBus, createMockPi, createTempDir, events, removeTempDir, resolveMockPiCallArgs, tryImport } from "../support/helpers.ts";
7
7
  import { discoverAgents } from "../../src/agents/agents.ts";
8
8
  import { ACTIVE_ASYNC_CAPACITY_DIR, acquireActiveAsyncCapacity, activeAsyncCapacitySessionKey } from "../../src/runs/background/active-async-capacity.ts";
9
9
  import { clearExclusions } from "../../src/runs/shared/model-exclusions.ts";
@@ -161,23 +161,23 @@ describe("fork context execution wiring", { skip: !available ? "subagent executo
161
161
  .sort()
162
162
  .at(-1);
163
163
  assert.ok(callFile, "expected a recorded mock pi call");
164
- return readRecordedArgs(callFile);
164
+ return readRecordedArgs(callFile, true);
165
165
  }
166
166
 
167
167
  function readAllCallArgs(): string[][] {
168
168
  return fs.readdirSync(mockPi.dir)
169
169
  .filter((name) => name.startsWith("call-") && name.endsWith(".json"))
170
170
  .sort()
171
- .map(readRecordedArgs);
171
+ .map((name) => readRecordedArgs(name));
172
172
  }
173
173
 
174
- function readRecordedArgs(callFile: string): string[] {
175
- const payload = JSON.parse(fs.readFileSync(path.join(mockPi.dir, callFile), "utf-8"));
174
+ function readRecordedArgs(callFile: string, effective = false): string[] {
175
+ const payload = JSON.parse(fs.readFileSync(path.join(mockPi.dir, callFile), "utf-8")) as { args?: string[]; effectiveArgs?: string[] };
176
176
  assert.equal(typeof payload, "object", "expected recorded args payload");
177
177
  assert.notEqual(payload, null, "expected recorded args payload");
178
178
  assert.ok("args" in payload, "expected recorded args payload");
179
179
  assert.ok(Array.isArray(payload.args), "expected recorded args");
180
- return payload.args;
180
+ return effective ? resolveMockPiCallArgs(payload) : payload.args;
181
181
  }
182
182
 
183
183
  function readSessionArgsFromCalls(): string[] {
@@ -192,14 +192,8 @@ describe("fork context execution wiring", { skip: !available ? "subagent executo
192
192
  .filter((sessionFile): sessionFile is string => Boolean(sessionFile));
193
193
  }
194
194
 
195
- function readCallArgsForTask(taskText: string): string[] {
196
- const args = readAllCallArgs().find((callArgs) => {
197
- const prompt = callArgs.at(-1) ?? "";
198
- return prompt.startsWith(`Task: ${taskText}\n`)
199
- || prompt.includes(`\n\nTask:\n${taskText}\n`);
200
- });
201
- assert.ok(args, `expected a recorded mock pi call for task '${taskText}'`);
202
- return args;
195
+ function isTaskFileArg(arg: string): boolean {
196
+ return arg.startsWith("@") && arg.endsWith("task.md");
203
197
  }
204
198
 
205
199
  function readSessionArg(args: string[]): string {
@@ -313,8 +307,13 @@ describe("fork context execution wiring", { skip: !available ? "subagent executo
313
307
  );
314
308
 
315
309
  assert.equal(result.isError, undefined);
316
- const args = readCallArgs();
317
- assert.ok((args.at(-1) ?? "").startsWith("Task: \n\n## Acceptance Contract"));
310
+ const args = readAllCallArgs()[0] ?? [];
311
+ const taskArg = args.at(-1) ?? "";
312
+ if (process.platform === "darwin") {
313
+ assert.ok(isTaskFileArg(taskArg));
314
+ } else {
315
+ assert.ok(taskArg.startsWith("Task: \n\n## Acceptance Contract"));
316
+ }
318
317
  });
319
318
 
320
319
  it("fails pruned fork model auth before child spawn", async () => {
@@ -1314,8 +1313,13 @@ describe("fork context execution wiring", { skip: !available ? "subagent executo
1314
1313
  );
1315
1314
 
1316
1315
  assert.equal(result.isError, undefined);
1317
- const args = readAllCallArgs().find((callArgs) => (callArgs.at(-1) ?? "").startsWith(`Task: ${task}\n\n## Acceptance Contract`));
1318
- assert.ok(args, "expected a recorded mock pi call for this test task");
1316
+ const args = readAllCallArgs()[0] ?? [];
1317
+ const taskArg = args.at(-1) ?? "";
1318
+ if (process.platform === "darwin") {
1319
+ assert.ok(isTaskFileArg(taskArg));
1320
+ } else {
1321
+ assert.ok(taskArg.startsWith(`Task: ${task}\n\n## Acceptance Contract`));
1322
+ }
1319
1323
  const modelIndex = args.indexOf("--model");
1320
1324
  assert.notEqual(modelIndex, -1);
1321
1325
  assert.equal(args[modelIndex + 1], "anthropic/claude-haiku-4-5");
@@ -986,7 +986,6 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
986
986
  assert.match(result.content[0]?.text ?? "", /Revived async subagent from/);
987
987
  assert.match(result.content[0]?.text ?? "", /Do not run sleep timers or polling loops/);
988
988
  assert.match(result.content[0]?.text ?? "", /Use bg_wait only/);
989
- assert.doesNotMatch(result.content[0]?.text ?? "", /subagent_wait/);
990
989
  assert.match(result.content[0]?.text ?? "", /Status if needed: subagent\(\{ action: "status"/);
991
990
  assert.doesNotMatch(result.content[0]?.text ?? "", /Follow:/);
992
991
  const revivedId = result.details?.asyncId;
@@ -307,9 +307,13 @@ describe("subagent async widget rendering", () => {
307
307
  };
308
308
 
309
309
  const text = buildWidgetLines([job], theme, 180).join("\n");
310
- assert.match(text, /ci: CI checks · running · provider:local-tests · PR #1614/);
311
- assert.match(text, /gate: Review gate · inconclusive · provider:opaque-provider · reason:stale-head · stale · out:gate.json/);
310
+ assert.match(text, /CI checks 1 active/);
311
+ assert.match(text, /Review gate 1 blocked/);
312
312
  assert.doesNotMatch(text, /async subagent .*CI checks/);
313
+
314
+ const expanded = buildWidgetLines([job], theme, 180, true).join("\n");
315
+ assert.match(expanded, /ci: CI checks · running · provider:local-tests · PR #1614/);
316
+ assert.match(expanded, /gate: Review gate · inconclusive · provider:opaque-provider · reason:stale-head · stale · out:gate.json/);
313
317
  });
314
318
 
315
319
  it("keeps simple one-off async rows on the existing fallback projection", () => {
@@ -928,14 +932,14 @@ describe("subagent async widget rendering", () => {
928
932
 
929
933
  it("keeps the active runs.lanes stage in focus before collapsed history", () => {
930
934
  resetWidgetLayout();
931
- withStdoutSize(60, 120, () => {
935
+ withStdoutSize(30, 120, () => {
932
936
  const stageKeys = ["scope-scout", "red-tests", "label-helpers", "summary-title", "detail-row", "tiers-noise", "validation", "minimality-challenge", "fresh-review"];
933
937
  const nodeIds = stageKeys.map((key) => `issue-1695.${key}`);
934
- const statuses = stageKeys.map((_, index) => index < 3 ? "completed" : index === 3 ? "running" : "pending");
938
+ const statuses = stageKeys.map((_, index) => index < 7 ? "completed" : index === 7 ? "running" : "pending");
935
939
  const workflowGraph = {
936
940
  runId: "workflow-1695",
937
941
  mode: "workflow",
938
- phases: [{ title: "issue-1695 staged lane", nodeIds }],
942
+ phases: stageKeys.map((title, index) => ({ title, nodeIds: [nodeIds[index]!] })),
939
943
  nodes: stageKeys.map((key, index) => ({
940
944
  id: nodeIds[index],
941
945
  kind: "step",
@@ -945,7 +949,7 @@ describe("subagent async widget rendering", () => {
945
949
  flatIndex: index,
946
950
  stepIndex: index,
947
951
  })),
948
- currentNodeId: nodeIds[3],
952
+ currentNodeId: nodeIds[7],
949
953
  };
950
954
  const job = {
951
955
  asyncId: "workflow-1695",
@@ -953,11 +957,11 @@ describe("subagent async widget rendering", () => {
953
957
  status: "running",
954
958
  mode: "workflow",
955
959
  agents: ["scout", "worker"],
956
- currentStep: 3,
957
- stepsTotal: 4,
960
+ currentStep: 7,
961
+ stepsTotal: stageKeys.length,
958
962
  updatedAt: 200,
959
963
  workflowGraph,
960
- steps: stageKeys.slice(0, 4).map((key, index) => ({
964
+ steps: stageKeys.slice(0, 8).map((key, index) => ({
961
965
  index,
962
966
  agent: index === 0 ? "scout" : "worker",
963
967
  status: statuses[index],
@@ -973,14 +977,13 @@ describe("subagent async widget rendering", () => {
973
977
  renderWidget(ui.ctx as never, [job]);
974
978
  const lines = renderWidgetLines(ui.widgets.at(-1));
975
979
  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/);
980
+ assert.match(text, /7\/9 done · 1 active · 1 queued/);
981
+ assert.match(text, /minimality-challenge 1 active/);
982
+ assert.match(text, /fresh-review 1 queued/);
983
+ assert.match(text, /bottleneck · minimality-challenge/);
984
+ assert.match(text, /Press configured-expand-key for live detail/);
985
+ assert.doesNotMatch(text, /label-helpers/);
986
+ assert.doesNotMatch(text, /Step \d+\/9|task:|workspace:|out(?:put)?:/i);
984
987
  });
985
988
  resetWidgetLayout();
986
989
  });
@@ -1018,7 +1021,7 @@ describe("subagent async widget rendering", () => {
1018
1021
  stepsTotal: stages.length,
1019
1022
  workflowGraph,
1020
1023
  steps: stages,
1021
- }], theme, 220, false).join("\n");
1024
+ }], theme, 220, true).join("\n");
1022
1025
  const rowIndex = (label: string): number => text.split("\n").findIndex((line) => line.includes(label));
1023
1026
  const completed = rowIndex("completed-history");
1024
1027
  const failed = rowIndex("failed-stage");