pi-crew 0.9.16 → 0.9.17

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 (432) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +19 -0
  3. package/dist/build-meta.json +21790 -0
  4. package/dist/index.mjs +83070 -0
  5. package/dist/index.mjs.map +7 -0
  6. package/docs/A +358 -0
  7. package/docs/M-A +357 -0
  8. package/docs/REVIEW-FINDINGS-2026-06 +357 -0
  9. package/docs/Y +357 -0
  10. package/docs/a +357 -0
  11. package/docs/aA +358 -0
  12. package/docs/archive/README.md +91 -0
  13. package/docs/patterns/command-agent-skill.md +1 -1
  14. package/docs/skills/REFERENCE.md +0 -17
  15. package/docs//303/242mmaAAA/303/242 +357 -0
  16. package/index.bundle.ts +25 -0
  17. package/index.ts +95 -4
  18. package/package.json +15 -4
  19. package/skills/iterative-audit/SKILL.md +0 -1
  20. package/skills/widget-rendering/SKILL.md +17 -0
  21. package/src/adapters/claude-adapter.ts +1 -3
  22. package/src/adapters/export-util.ts +16 -16
  23. package/src/adapters/index.ts +5 -5
  24. package/src/agents/agent-config.ts +20 -14
  25. package/src/agents/agent-serializer.ts +1 -1
  26. package/src/agents/discover-agents.ts +83 -39
  27. package/src/benchmark/benchmark-runner.ts +51 -51
  28. package/src/benchmark/feedback-loop.ts +1 -1
  29. package/src/config/config.ts +166 -590
  30. package/src/config/defaults.ts +28 -2
  31. package/src/config/drift-detector.ts +11 -14
  32. package/src/config/markers.ts +201 -203
  33. package/src/config/resilient-parser.ts +14 -6
  34. package/src/config/role-tools.ts +3 -3
  35. package/src/config/suggestions.ts +5 -12
  36. package/src/config/types.ts +9 -25
  37. package/src/errors.ts +151 -157
  38. package/src/extension/action-suggestions.ts +54 -9
  39. package/src/extension/async-notifier.ts +43 -13
  40. package/src/extension/autonomous-policy.ts +77 -37
  41. package/src/extension/command-completions.ts +9 -8
  42. package/src/extension/context-status-injection.ts +14 -12
  43. package/src/extension/crew-autocomplete.ts +8 -16
  44. package/src/extension/crew-cleanup.ts +2 -1
  45. package/src/extension/crew-shortcuts.ts +9 -6
  46. package/src/extension/cross-extension-rpc.ts +136 -42
  47. package/src/extension/help.ts +1 -1
  48. package/src/extension/import-index.ts +10 -5
  49. package/src/extension/knowledge-injection.ts +88 -15
  50. package/src/extension/management.ts +89 -349
  51. package/src/extension/message-renderers.ts +3 -4
  52. package/src/extension/notification-router.ts +22 -5
  53. package/src/extension/notification-sink.ts +6 -3
  54. package/src/extension/pi-api.ts +17 -8
  55. package/src/extension/plan-orchestrate.ts +8 -27
  56. package/src/extension/project-init.ts +21 -6
  57. package/src/extension/register.ts +329 -975
  58. package/src/extension/registration/artifact-cleanup.ts +9 -4
  59. package/src/extension/registration/command-utils.ts +5 -1
  60. package/src/extension/registration/commands.ts +806 -314
  61. package/src/extension/registration/compaction-guard.ts +15 -15
  62. package/src/extension/registration/lifecycle.ts +259 -0
  63. package/src/extension/registration/observability.ts +293 -0
  64. package/src/extension/registration/subagent-helpers.ts +29 -7
  65. package/src/extension/registration/subagent-tools.ts +253 -44
  66. package/src/extension/registration/team-tool.ts +19 -84
  67. package/src/extension/registration/ui.ts +168 -0
  68. package/src/extension/registration/viewers.ts +64 -24
  69. package/src/extension/result-watcher.ts +18 -7
  70. package/src/extension/run-bundle-schema.ts +21 -6
  71. package/src/extension/run-export.ts +15 -6
  72. package/src/extension/run-import.ts +64 -29
  73. package/src/extension/run-index.ts +28 -9
  74. package/src/extension/run-maintenance.ts +32 -12
  75. package/src/extension/session-summary.ts +1 -1
  76. package/src/extension/team-manager-command.ts +64 -7
  77. package/src/extension/team-onboard.ts +151 -150
  78. package/src/extension/team-recommendation.ts +121 -21
  79. package/src/extension/team-tool/anchor.ts +31 -64
  80. package/src/extension/team-tool/api.ts +929 -141
  81. package/src/extension/team-tool/auto-summarize.ts +14 -26
  82. package/src/extension/team-tool/cache-control.ts +1 -5
  83. package/src/extension/team-tool/cancel.ts +138 -38
  84. package/src/extension/team-tool/chain-dispatch.ts +5 -13
  85. package/src/extension/team-tool/chain-executor.ts +29 -51
  86. package/src/extension/team-tool/config-patch.ts +1 -1
  87. package/src/extension/team-tool/context.ts +40 -20
  88. package/src/extension/team-tool/destructive-gate.ts +10 -5
  89. package/src/extension/team-tool/doctor.ts +170 -51
  90. package/src/extension/team-tool/explain.ts +228 -214
  91. package/src/extension/team-tool/failure-patterns.ts +3 -9
  92. package/src/extension/team-tool/goal-wrap.ts +71 -29
  93. package/src/extension/team-tool/goal.ts +185 -35
  94. package/src/extension/team-tool/handle-schedule.ts +34 -15
  95. package/src/extension/team-tool/handle-settings.ts +94 -56
  96. package/src/extension/team-tool/health-monitor.ts +27 -108
  97. package/src/extension/team-tool/inspect.ts +42 -9
  98. package/src/extension/team-tool/intent-policy.ts +4 -1
  99. package/src/extension/team-tool/lifecycle-actions.ts +244 -48
  100. package/src/extension/team-tool/orchestrate.ts +7 -18
  101. package/src/extension/team-tool/parallel-dispatch.ts +51 -29
  102. package/src/extension/team-tool/plan.ts +29 -5
  103. package/src/extension/team-tool/respond.ts +49 -16
  104. package/src/extension/team-tool/run-not-found.ts +3 -8
  105. package/src/extension/team-tool/run.ts +80 -317
  106. package/src/extension/team-tool/status.ts +135 -43
  107. package/src/extension/team-tool/workflow-manage.ts +92 -25
  108. package/src/extension/team-tool-types.ts +8 -1
  109. package/src/extension/team-tool.ts +142 -551
  110. package/src/extension/validate-resources.ts +39 -8
  111. package/src/hooks/registry.ts +66 -17
  112. package/src/hooks/types.ts +1 -1
  113. package/src/i18n.ts +25 -11
  114. package/src/observability/correlation.ts +17 -3
  115. package/src/observability/event-bus.ts +51 -56
  116. package/src/observability/event-to-metric.ts +117 -15
  117. package/src/observability/exporters/otlp-exporter.ts +56 -17
  118. package/src/observability/exporters/prometheus-exporter.ts +1 -1
  119. package/src/observability/metric-registry.ts +16 -4
  120. package/src/observability/metric-retention.ts +8 -2
  121. package/src/observability/metric-sink.ts +11 -3
  122. package/src/observability/metrics-primitives.ts +42 -9
  123. package/src/plugins/plugin-define.ts +2 -2
  124. package/src/plugins/plugin-registry.ts +25 -25
  125. package/src/plugins/plugins/index.ts +1 -1
  126. package/src/plugins/plugins/nextjs.ts +16 -16
  127. package/src/plugins/plugins/vite.ts +7 -11
  128. package/src/plugins/plugins/vitest.ts +6 -11
  129. package/src/runtime/adaptive-plan.ts +225 -40
  130. package/src/runtime/agent-control.ts +58 -15
  131. package/src/runtime/agent-memory.ts +15 -9
  132. package/src/runtime/agent-observability.ts +10 -2
  133. package/src/runtime/anchor-manager.ts +27 -25
  134. package/src/runtime/async-marker.ts +7 -1
  135. package/src/runtime/async-runner.ts +27 -23
  136. package/src/runtime/auto-summarize.ts +7 -13
  137. package/src/runtime/background-runner.ts +189 -251
  138. package/src/runtime/batch-barrier.ts +18 -16
  139. package/src/runtime/cancellation-token.ts +16 -6
  140. package/src/runtime/cancellation.ts +46 -8
  141. package/src/runtime/capability-inventory.ts +6 -4
  142. package/src/runtime/chain-parser.ts +44 -11
  143. package/src/runtime/chain-runner.ts +63 -69
  144. package/src/runtime/checkpoint.ts +12 -56
  145. package/src/runtime/child-pi.ts +343 -78
  146. package/src/runtime/coalesce-tasks.ts +268 -0
  147. package/src/runtime/code-summary.ts +71 -26
  148. package/src/runtime/compact-stages/index.ts +15 -5
  149. package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
  150. package/src/runtime/compact-stages/truncation-stage.ts +4 -1
  151. package/src/runtime/compaction-summary.ts +17 -10
  152. package/src/runtime/completion-guard.ts +33 -16
  153. package/src/runtime/crash-classification.ts +28 -7
  154. package/src/runtime/crash-recovery.ts +177 -37
  155. package/src/runtime/crew-agent-records.ts +145 -47
  156. package/src/runtime/crew-hooks.ts +9 -24
  157. package/src/runtime/cross-extension-rpc.ts +25 -23
  158. package/src/runtime/custom-tools/irc-tool.ts +43 -15
  159. package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
  160. package/src/runtime/delivery-coordinator.ts +34 -7
  161. package/src/runtime/delta-conflict.ts +9 -21
  162. package/src/runtime/deterministic-ast.ts +1 -1
  163. package/src/runtime/diagnostic-export.ts +53 -20
  164. package/src/runtime/direct-run.ts +12 -2
  165. package/src/runtime/dwf-state-store.ts +1 -1
  166. package/src/runtime/dynamic-workflow-context.ts +186 -58
  167. package/src/runtime/dynamic-workflow-runner.ts +42 -20
  168. package/src/runtime/effectiveness.ts +16 -8
  169. package/src/runtime/errors/crew-errors.ts +7 -11
  170. package/src/runtime/event-stream-bridge.ts +9 -3
  171. package/src/runtime/foreground-control.ts +54 -14
  172. package/src/runtime/foreground-watchdog.ts +9 -6
  173. package/src/runtime/goal-achievement.ts +27 -10
  174. package/src/runtime/goal-evaluator.ts +54 -19
  175. package/src/runtime/goal-loop-runner.ts +280 -99
  176. package/src/runtime/goal-state-store.ts +27 -17
  177. package/src/runtime/green-contract.ts +11 -2
  178. package/src/runtime/group-join.ts +64 -31
  179. package/src/runtime/handoff-manager.ts +37 -42
  180. package/src/runtime/heartbeat-gradient.ts +10 -2
  181. package/src/runtime/heartbeat-watcher.ts +32 -6
  182. package/src/runtime/hidden-handoff.ts +12 -30
  183. package/src/runtime/important-line-classifier.ts +12 -2
  184. package/src/runtime/iteration-hooks.ts +25 -15
  185. package/src/runtime/live-agent-control.ts +55 -7
  186. package/src/runtime/live-agent-manager.ts +130 -27
  187. package/src/runtime/live-control-realtime.ts +23 -3
  188. package/src/runtime/live-irc.ts +4 -1
  189. package/src/runtime/live-session-health.ts +12 -4
  190. package/src/runtime/live-session-runtime.ts +379 -117
  191. package/src/runtime/manifest-cache.ts +28 -12
  192. package/src/runtime/mcp-proxy.ts +8 -16
  193. package/src/runtime/metric-parser.ts +1 -5
  194. package/src/runtime/model-fallback.ts +55 -18
  195. package/src/runtime/model-resolver.ts +2 -6
  196. package/src/runtime/model-scope.ts +19 -3
  197. package/src/runtime/notebook-helpers.ts +60 -62
  198. package/src/runtime/orphan-worker-registry.ts +37 -26
  199. package/src/runtime/output-validator.ts +18 -3
  200. package/src/runtime/overflow-recovery.ts +5 -4
  201. package/src/runtime/parallel-research.ts +29 -5
  202. package/src/runtime/parallel-utils.ts +9 -11
  203. package/src/runtime/path-overlap.ts +150 -0
  204. package/src/runtime/peer-dep.ts +12 -17
  205. package/src/runtime/per-write-validator.ts +1 -3
  206. package/src/runtime/phase-tracker.ts +342 -330
  207. package/src/runtime/pi-args.ts +26 -8
  208. package/src/runtime/pi-json-output.ts +1 -1
  209. package/src/runtime/pi-spawn.ts +30 -19
  210. package/src/runtime/pipeline-runner.ts +56 -55
  211. package/src/runtime/plan-templates.ts +5 -6
  212. package/src/runtime/policy-engine.ts +43 -7
  213. package/src/runtime/post-checks.ts +12 -4
  214. package/src/runtime/post-exit-stdio-guard.ts +2 -2
  215. package/src/runtime/process-lifecycle.ts +20 -10
  216. package/src/runtime/process-status.ts +16 -5
  217. package/src/runtime/progress-event-coalescer.ts +2 -1
  218. package/src/runtime/progress-tracker.ts +103 -103
  219. package/src/runtime/prose-compressor.ts +9 -11
  220. package/src/runtime/recovery-recipes.ts +118 -24
  221. package/src/runtime/replace.ts +25 -10
  222. package/src/runtime/resilient-edit.ts +10 -25
  223. package/src/runtime/result-extractor.ts +1 -2
  224. package/src/runtime/retry-executor.ts +20 -4
  225. package/src/runtime/retry-runner.ts +26 -50
  226. package/src/runtime/role-permission.ts +6 -1
  227. package/src/runtime/run-coalesced-task-group.ts +256 -0
  228. package/src/runtime/run-drift.ts +14 -15
  229. package/src/runtime/run-tracker.ts +6 -28
  230. package/src/runtime/runtime-policy.ts +1 -6
  231. package/src/runtime/runtime-resolver.ts +80 -15
  232. package/src/runtime/scheduler.ts +47 -18
  233. package/src/runtime/semaphore.ts +5 -7
  234. package/src/runtime/sensitive-paths.ts +2 -1
  235. package/src/runtime/session-usage.ts +1 -1
  236. package/src/runtime/settings-store.ts +16 -12
  237. package/src/runtime/sidechain-output.ts +6 -2
  238. package/src/runtime/single-agent-compose.ts +1 -4
  239. package/src/runtime/skill-effectiveness.ts +29 -97
  240. package/src/runtime/skill-instructions.ts +40 -83
  241. package/src/runtime/stale-reconciler.ts +73 -197
  242. package/src/runtime/stream-preview.ts +1 -1
  243. package/src/runtime/streaming-output.ts +1 -1
  244. package/src/runtime/subagent-manager.ts +44 -169
  245. package/src/runtime/subprocess-tool-registry.ts +4 -1
  246. package/src/runtime/supervisor-contact.ts +10 -5
  247. package/src/runtime/task-display.ts +19 -5
  248. package/src/runtime/task-graph-scheduler.ts +95 -21
  249. package/src/runtime/task-graph.ts +5 -11
  250. package/src/runtime/task-health.ts +54 -47
  251. package/src/runtime/task-id.ts +11 -18
  252. package/src/runtime/task-output-context.ts +265 -81
  253. package/src/runtime/task-packet.ts +12 -20
  254. package/src/runtime/task-quality.ts +6 -14
  255. package/src/runtime/task-runner/context-retrieval.ts +4 -13
  256. package/src/runtime/task-runner/live-executor.ts +114 -36
  257. package/src/runtime/task-runner/output-splitter.ts +152 -0
  258. package/src/runtime/task-runner/progress.ts +50 -12
  259. package/src/runtime/task-runner/prompt-builder.ts +31 -7
  260. package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
  261. package/src/runtime/task-runner/result-utils.ts +3 -1
  262. package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
  263. package/src/runtime/task-runner/run-projection.ts +27 -8
  264. package/src/runtime/task-runner/state-helpers.ts +29 -8
  265. package/src/runtime/task-runner/tail-read.ts +2 -6
  266. package/src/runtime/task-runner.ts +180 -326
  267. package/src/runtime/team-runner-artifacts.ts +13 -0
  268. package/src/runtime/team-runner.ts +456 -974
  269. package/src/runtime/tool-output-pruner.ts +6 -9
  270. package/src/runtime/tool-progress.ts +11 -21
  271. package/src/runtime/verification-gates.ts +33 -24
  272. package/src/runtime/verification-integrity.ts +1 -4
  273. package/src/runtime/verification-worktree.ts +62 -12
  274. package/src/runtime/worker-heartbeat.ts +5 -1
  275. package/src/runtime/worker-startup.ts +29 -5
  276. package/src/runtime/workflow-state.ts +17 -9
  277. package/src/runtime/workspace-lock.ts +30 -35
  278. package/src/runtime/workspace-tree.ts +20 -32
  279. package/src/runtime/yield-handler.ts +43 -9
  280. package/src/runtime/zombie-scanner.ts +5 -4
  281. package/src/schema/config-schema.ts +266 -172
  282. package/src/schema/team-tool-schema.ts +29 -74
  283. package/src/schema/validation-types.ts +25 -17
  284. package/src/skills/discover-skills.ts +35 -10
  285. package/src/skills/skill-templates.ts +109 -27
  286. package/src/skills/validate.ts +26 -8
  287. package/src/state/active-run-registry.ts +87 -28
  288. package/src/state/artifact-store.ts +9 -5
  289. package/src/state/atomic-write-v2.ts +85 -63
  290. package/src/state/atomic-write.ts +105 -26
  291. package/src/state/blob-store.ts +47 -20
  292. package/src/state/contracts.ts +20 -5
  293. package/src/state/crew-init.ts +5 -22
  294. package/src/state/decision-ledger.ts +19 -73
  295. package/src/state/event-log-rotation.ts +41 -15
  296. package/src/state/event-log.ts +168 -53
  297. package/src/state/event-reconstructor.ts +11 -1
  298. package/src/state/gitignore-manager.ts +2 -8
  299. package/src/state/health-store.ts +57 -57
  300. package/src/state/hook-instinct-bridge.ts +1 -1
  301. package/src/state/hook-integrations.ts +1 -1
  302. package/src/state/instinct-store.ts +17 -5
  303. package/src/state/jsonl-writer.ts +1 -1
  304. package/src/state/locks.ts +23 -9
  305. package/src/state/mailbox.ts +151 -28
  306. package/src/state/observation-store.ts +20 -14
  307. package/src/state/run-cache.ts +142 -135
  308. package/src/state/run-graph.ts +6 -15
  309. package/src/state/run-metrics.ts +5 -18
  310. package/src/state/schedule.ts +15 -9
  311. package/src/state/state-store.ts +129 -45
  312. package/src/state/task-claims.ts +12 -2
  313. package/src/state/tiered-eval.ts +52 -43
  314. package/src/state/types-eval.ts +2 -2
  315. package/src/state/types.ts +24 -20
  316. package/src/state/usage.ts +20 -4
  317. package/src/state/worker-atomic-writer.ts +6 -3
  318. package/src/subagents/index.ts +2 -2
  319. package/src/teams/discover-teams.ts +21 -6
  320. package/src/tools/safe-bash-extension.ts +5 -6
  321. package/src/tools/safe-bash.ts +10 -11
  322. package/src/types/new-api-types.ts +6 -10
  323. package/src/ui/agent-management-overlay.ts +52 -40
  324. package/src/ui/card-colors.ts +13 -4
  325. package/src/ui/crew-footer.ts +8 -7
  326. package/src/ui/crew-select-list.ts +1 -1
  327. package/src/ui/dashboard-panes/agents-pane.ts +41 -25
  328. package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
  329. package/src/ui/dashboard-panes/capability-pane.ts +32 -15
  330. package/src/ui/dashboard-panes/health-pane.ts +2 -1
  331. package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
  332. package/src/ui/dashboard-panes/progress-pane.ts +12 -9
  333. package/src/ui/heartbeat-aggregator.ts +15 -4
  334. package/src/ui/keybinding-map.ts +40 -7
  335. package/src/ui/live-conversation-overlay.ts +36 -20
  336. package/src/ui/live-duration.ts +1 -4
  337. package/src/ui/live-run-sidebar.ts +88 -25
  338. package/src/ui/loaders.ts +2 -8
  339. package/src/ui/mascot.ts +20 -36
  340. package/src/ui/overlays/agent-picker-overlay.ts +11 -3
  341. package/src/ui/overlays/confirm-overlay.ts +4 -2
  342. package/src/ui/overlays/help-overlay.ts +25 -14
  343. package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
  344. package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
  345. package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
  346. package/src/ui/pi-ui-compat.ts +7 -7
  347. package/src/ui/powerbar-publisher.ts +120 -42
  348. package/src/ui/render-diff.ts +10 -3
  349. package/src/ui/render-scheduler.ts +12 -4
  350. package/src/ui/run-action-dispatcher.ts +81 -18
  351. package/src/ui/run-dashboard.ts +172 -76
  352. package/src/ui/run-event-bus.ts +59 -37
  353. package/src/ui/run-snapshot-cache.ts +276 -86
  354. package/src/ui/settings-overlay.ts +361 -74
  355. package/src/ui/status-colors.ts +12 -1
  356. package/src/ui/syntax-highlight.ts +1 -1
  357. package/src/ui/theme-adapter.ts +16 -14
  358. package/src/ui/theme-discovery.ts +13 -2
  359. package/src/ui/tool-progress-formatter.ts +7 -7
  360. package/src/ui/tool-render.ts +128 -56
  361. package/src/ui/tool-renderers/brief-mode.ts +45 -27
  362. package/src/ui/tool-renderers/index.ts +109 -43
  363. package/src/ui/transcript-cache.ts +32 -6
  364. package/src/ui/transcript-entries.ts +25 -23
  365. package/src/ui/transcript-viewer.ts +78 -29
  366. package/src/ui/widget/index.ts +99 -40
  367. package/src/ui/widget/widget-formatters.ts +13 -6
  368. package/src/ui/widget/widget-model.ts +19 -8
  369. package/src/ui/widget/widget-renderer.ts +23 -13
  370. package/src/ui/widget/widget-types.ts +1 -1
  371. package/src/utils/bm25-search.ts +199 -199
  372. package/src/utils/conflict-detect.ts +22 -21
  373. package/src/utils/env-filter.ts +14 -7
  374. package/src/utils/file-coalescer.ts +5 -1
  375. package/src/utils/fingerprint.ts +3 -6
  376. package/src/utils/frontmatter.ts +3 -1
  377. package/src/utils/fs-watch.ts +2 -6
  378. package/src/utils/gh-protocol.ts +119 -44
  379. package/src/utils/git.ts +13 -15
  380. package/src/utils/guards.ts +2 -5
  381. package/src/utils/ids.ts +9 -2
  382. package/src/utils/incremental-reader.ts +14 -3
  383. package/src/utils/internal-error.ts +2 -1
  384. package/src/utils/names.ts +12 -3
  385. package/src/utils/paths.ts +49 -5
  386. package/src/utils/project-detector.ts +2 -2
  387. package/src/utils/redaction.ts +29 -19
  388. package/src/utils/resolve-shell.ts +9 -7
  389. package/src/utils/run-watcher-registry.ts +19 -31
  390. package/src/utils/safe-paths.ts +45 -24
  391. package/src/utils/scan-cache.ts +9 -2
  392. package/src/utils/session-utils.ts +2 -4
  393. package/src/utils/sleep.ts +12 -5
  394. package/src/utils/sse-parser.ts +5 -17
  395. package/src/utils/visual.ts +52 -32
  396. package/src/workflows/discover-workflows.ts +41 -109
  397. package/src/workflows/intermediate-store.ts +5 -21
  398. package/src/workflows/preflight-validator.ts +6 -33
  399. package/src/workflows/topology-analyzer.ts +5 -21
  400. package/src/workflows/workflow-config.ts +7 -6
  401. package/src/worktree/branch-freshness.ts +66 -8
  402. package/src/worktree/cleanup.ts +130 -20
  403. package/src/worktree/worktree-manager.ts +212 -69
  404. package/skills/artifact-analysis-loop/SKILL.md +0 -303
  405. package/skills/detection-pipeline-design/SKILL.md +0 -286
  406. package/skills/hunting-investigation-loop/SKILL.md +0 -402
  407. package/skills/incident-playbook-construction/SKILL.md +0 -384
  408. package/skills/security-review/SKILL.md +0 -561
  409. package/skills/threat-hypothesis-framework/SKILL.md +0 -176
  410. package/skills/ui-render-performance/SKILL.md +0 -58
  411. /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
  412. /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
  413. /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
  414. /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
  415. /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
  416. /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
  417. /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
  418. /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
  419. /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
  420. /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
  421. /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
  422. /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
  423. /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
  424. /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
  425. /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
  426. /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
  427. /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
  428. /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
  429. /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
  430. /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
  431. /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
  432. /package/docs/{pi-subagents3-deep-analysis.md → archive/pi-subagents3-deep-analysis.md} +0 -0
@@ -7,24 +7,33 @@
7
7
 
8
8
  import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
9
9
  import type { CrewUiConfig } from "../../config/config.ts";
10
+ import { DEFAULT_UI } from "../../config/defaults.ts";
10
11
  import type { ManifestCache } from "../../runtime/manifest-cache.ts";
11
12
  import type { TeamRunManifest } from "../../state/types.ts";
12
- import type { RunSnapshotCache, RunUiSnapshot } from "../snapshot-types.ts";
13
- import type { CrewTheme } from "../theme-adapter.ts";
14
- import { asCrewTheme, subscribeThemeChange } from "../theme-adapter.ts";
15
13
  import { truncate } from "../../utils/visual.ts";
16
14
  import { requestRender, requestRenderTarget, setExtensionWidget } from "../pi-ui-compat.ts";
17
- import { spinnerBucket, spinnerFrame } from "../spinner.ts";
18
15
  import { runEventBus } from "../run-event-bus.ts";
19
- import { DEFAULT_UI } from "../../config/defaults.ts";
16
+ import type { RunSnapshotCache, RunUiSnapshot } from "../snapshot-types.ts";
17
+ import { spinnerBucket, spinnerFrame } from "../spinner.ts";
18
+ import type { CrewTheme } from "../theme-adapter.ts";
19
+ import { asCrewTheme, subscribeThemeChange } from "../theme-adapter.ts";
20
20
  import { activeWidgetRuns, statusSummary } from "./widget-model.ts";
21
- import { buildWidgetLines, colorWidgetLine, renderLines, DEFAULT_WIDGET_WIDTH, TASK_DESC_MAX } from "./widget-renderer.ts";
21
+ import { buildWidgetLines, colorWidgetLine, DEFAULT_WIDGET_WIDTH, renderLines, TASK_DESC_MAX } from "./widget-renderer.ts";
22
22
  import type { CrewWidgetModel, CrewWidgetState, WidgetRun } from "./widget-types.ts";
23
23
 
24
- // Re-export types and helpers for backward compatibility
25
- export type { WidgetRun, CrewWidgetModel, CrewWidgetState } from "./widget-types.ts";
26
24
  export { activeWidgetRuns, statusSummary } from "./widget-model.ts";
27
- export { buildWidgetLines as buildCrewWidgetLines, widgetHeader, DEFAULT_WIDGET_WIDTH, TASK_DESC_MAX } from "./widget-renderer.ts";
25
+ export {
26
+ buildWidgetLines as buildCrewWidgetLines,
27
+ DEFAULT_WIDGET_WIDTH,
28
+ TASK_DESC_MAX,
29
+ widgetHeader,
30
+ } from "./widget-renderer.ts";
31
+ // Re-export types and helpers for backward compatibility
32
+ export type {
33
+ CrewWidgetModel,
34
+ CrewWidgetState,
35
+ WidgetRun,
36
+ } from "./widget-types.ts";
28
37
 
29
38
  /**
30
39
  * Resolve the real render width for widget lines, in priority order:
@@ -42,7 +51,10 @@ export function getRenderWidth(width?: number): number {
42
51
  if (Number.isFinite(stdoutCols) && stdoutCols! > 0) return Math.floor(stdoutCols!);
43
52
  return DEFAULT_WIDGET_WIDTH;
44
53
  }
45
- export { notificationBadge, NOTIFICATION_BADGE_CAP } from "./widget-formatters.ts";
54
+ export {
55
+ NOTIFICATION_BADGE_CAP,
56
+ notificationBadge,
57
+ } from "./widget-formatters.ts";
46
58
 
47
59
  // ── Constants ─────────────────────────────────────────────────────────
48
60
 
@@ -112,30 +124,53 @@ class CrewWidgetComponent implements WidgetComponent {
112
124
  installResizeListener();
113
125
  this.unsubscribeTheme = subscribeThemeChange(themeLike, () => this.invalidate());
114
126
  this.unsubscribeEventBus = (() => {
115
- const unsub1 = runEventBus.onChannel("run:state", () => this.invalidate());
116
- const unsub2 = runEventBus.onChannel("worker:lifecycle", () => this.invalidate());
117
- const unsub3 = runEventBus.onChannel("ui:invalidate", () => this.invalidate());
118
- return () => { unsub1(); unsub2(); unsub3(); };
119
- })();
127
+ const unsub1 = runEventBus.onChannel("run:state", () => this.invalidate());
128
+ const unsub2 = runEventBus.onChannel("worker:lifecycle", () => this.invalidate());
129
+ const unsub3 = runEventBus.onChannel("ui:invalidate", () => this.invalidate());
130
+ return () => {
131
+ unsub1();
132
+ unsub2();
133
+ unsub3();
134
+ };
135
+ })();
120
136
  }
121
137
 
122
138
  private buildSignature(runs: WidgetRun[]): string {
123
- const liveSig = [...listLiveAgents()].map((h) =>
124
- `${h.agentId}:${h.status}:${h.activity.turnCount}:${h.activity.toolUses}:${[...h.activity.activeTools.values()].join(",")}:${h.activity.responseText.slice(-30)}`
125
- ).join("|");
126
-
127
- const hasRunning = runs.some((entry) => entry.agents.some((a) => a.status === "running"))
128
- || [...listLiveAgents()].some((h) => h.status === "running");
139
+ const liveSig = [...listLiveAgents()]
140
+ .map(
141
+ (h) =>
142
+ `${h.agentId}:${h.status}:${h.activity.turnCount}:${h.activity.toolUses}:${[...h.activity.activeTools.values()].join(",")}:${h.activity.responseText.slice(-30)}`,
143
+ )
144
+ .join("|");
145
+
146
+ const hasRunning =
147
+ runs.some((entry) => entry.agents.some((a) => a.status === "running")) ||
148
+ [...listLiveAgents()].some((h) => h.status === "running");
129
149
  const animation = hasRunning ? `:spin=${spinnerBucket()}` : "";
130
150
 
131
- return runs
132
- .map((entry) => entry.snapshot?.signature ?? `${entry.run.runId}:${entry.run.status}:${entry.run.updatedAt}:` +
133
- entry.agents.map((a) => {
134
- const recentOutput = a.progress?.recentOutput.at(-1) ?? "";
135
- const progress = [a.progress?.currentTool ?? "", a.progress?.toolCount ?? 0, a.progress?.tokens ?? 0, a.progress?.turns ?? 0, a.progress?.lastActivityAt ?? "", recentOutput].join(":");
136
- return `${a.status}:${a.startedAt}:${a.completedAt ?? ""}:${a.toolUses ?? 0}:${progress}`;
137
- }).join(","))
138
- .join("|") + `|live:${liveSig}${animation}`;
151
+ return (
152
+ runs
153
+ .map(
154
+ (entry) =>
155
+ entry.snapshot?.signature ??
156
+ `${entry.run.runId}:${entry.run.status}:${entry.run.updatedAt}:` +
157
+ entry.agents
158
+ .map((a) => {
159
+ const recentOutput = a.progress?.recentOutput.at(-1) ?? "";
160
+ const progress = [
161
+ a.progress?.currentTool ?? "",
162
+ a.progress?.toolCount ?? 0,
163
+ a.progress?.tokens ?? 0,
164
+ a.progress?.turns ?? 0,
165
+ a.progress?.lastActivityAt ?? "",
166
+ recentOutput,
167
+ ].join(":");
168
+ return `${a.status}:${a.startedAt}:${a.completedAt ?? ""}:${a.toolUses ?? 0}:${progress}`;
169
+ })
170
+ .join(","),
171
+ )
172
+ .join("|") + `|live:${liveSig}${animation}`
173
+ );
139
174
  }
140
175
 
141
176
  private colorize(lines: string[], width: number): string[] {
@@ -168,7 +203,14 @@ class CrewWidgetComponent implements WidgetComponent {
168
203
  const runningGlyph = spinnerFrame("widget-header");
169
204
 
170
205
  if (this.cacheSignature !== signature || width !== this.cachedWidth || this.cachedTheme !== this.theme) {
171
- this.cachedBaseLines = buildWidgetLines(this.model.cwd, 0, this.model.maxLines, runs, this.model.notificationCount ?? 0, width).map((line, index) => {
206
+ this.cachedBaseLines = buildWidgetLines(
207
+ this.model.cwd,
208
+ 0,
209
+ this.model.maxLines,
210
+ runs,
211
+ this.model.notificationCount ?? 0,
212
+ width,
213
+ ).map((line, index) => {
172
214
  if (index === 0 && line.length > 0) return `${runningGlyph}${line.slice(1)}`;
173
215
  return line;
174
216
  });
@@ -240,9 +282,24 @@ export function updateCrewWidget(
240
282
  return;
241
283
  }
242
284
 
243
- const needsWidgetInstall = state.lastVisibility !== "visible" || state.lastPlacement !== placement || state.lastKey !== WIDGET_KEY || state.lastMaxLines !== maxLines || state.lastCwd !== ctx.cwd || !state.model;
244
-
245
- if (!state.model) state.model = { cwd: ctx.cwd, frame: state.frame, maxLines, notificationCount: state.notificationCount ?? 0, manifestCache, snapshotCache, preloadManifests: preloadedManifests };
285
+ const needsWidgetInstall =
286
+ state.lastVisibility !== "visible" ||
287
+ state.lastPlacement !== placement ||
288
+ state.lastKey !== WIDGET_KEY ||
289
+ state.lastMaxLines !== maxLines ||
290
+ state.lastCwd !== ctx.cwd ||
291
+ !state.model;
292
+
293
+ if (!state.model)
294
+ state.model = {
295
+ cwd: ctx.cwd,
296
+ frame: state.frame,
297
+ maxLines,
298
+ notificationCount: state.notificationCount ?? 0,
299
+ manifestCache,
300
+ snapshotCache,
301
+ preloadManifests: preloadedManifests,
302
+ };
246
303
  else {
247
304
  state.model.cwd = ctx.cwd;
248
305
  state.model.frame = state.frame;
@@ -255,12 +312,10 @@ export function updateCrewWidget(
255
312
 
256
313
  if (needsWidgetInstall) {
257
314
  const model = state.model;
258
- setExtensionWidget(
259
- ctx,
260
- WIDGET_KEY,
261
- ((_tui: unknown, theme: unknown) => new CrewWidgetComponent(model, theme, _tui)) as never,
262
- { placement, persist: true },
263
- );
315
+ setExtensionWidget(ctx, WIDGET_KEY, ((_tui: unknown, theme: unknown) => new CrewWidgetComponent(model, theme, _tui)) as never, {
316
+ placement,
317
+ persist: true,
318
+ });
264
319
  state.lastVisibility = "visible";
265
320
  state.lastPlacement = placement;
266
321
  state.lastKey = WIDGET_KEY;
@@ -271,7 +326,11 @@ export function updateCrewWidget(
271
326
  requestRender(ctx);
272
327
  }
273
328
 
274
- export function stopCrewWidget(ctx: Pick<ExtensionContext, "hasUI" | "ui"> | undefined, state: CrewWidgetState, config?: CrewUiConfig): void {
329
+ export function stopCrewWidget(
330
+ ctx: Pick<ExtensionContext, "hasUI" | "ui"> | undefined,
331
+ state: CrewWidgetState,
332
+ config?: CrewUiConfig,
333
+ ): void {
275
334
  if (state.interval) clearInterval(state.interval);
276
335
  state.interval = undefined;
277
336
  if (ctx?.hasUI) {
@@ -7,8 +7,8 @@
7
7
  import type { CrewAgentRecord } from "../../runtime/crew-agent-runtime.ts";
8
8
  import type { LiveAgentHandle } from "../../runtime/live-agent-manager.ts";
9
9
  import { getTaskUsage } from "../../runtime/usage-tracker.ts";
10
- import { computeLiveDurationMs } from "../live-duration.ts";
11
10
  import { visibleWidth } from "../../utils/visual.ts";
11
+ import { computeLiveDurationMs } from "../live-duration.ts";
12
12
 
13
13
  // ── Token formatting ──────────────────────────────────────────────────
14
14
 
@@ -16,9 +16,9 @@ import { visibleWidth } from "../../utils/visual.ts";
16
16
  // jitter every tick as values change width (e.g. 9.9s→10.0s, 950→1.0k).
17
17
  // alignMetric right-aligns to the width; values wider than the width overflow
18
18
  // verbatim (no truncation/crash) — these are rare one-off states, not jitter.
19
- const TOOLS_METRIC_WIDTH = 8; // "127 tools"
19
+ const TOOLS_METRIC_WIDTH = 8; // "127 tools"
20
20
  const TOKENS_METRIC_WIDTH = 10; // "1.2k tok", "12.3M tok"
21
- const CTX_METRIC_WIDTH = 7; // "100% ctx"
21
+ const CTX_METRIC_WIDTH = 7; // "100% ctx"
22
22
  const DURATION_METRIC_WIDTH = 6; // "120.0s"
23
23
 
24
24
  function alignMetric(value: string, width: number): string {
@@ -87,7 +87,11 @@ export function describeLiveActivity(handle: LiveAgentHandle): string {
87
87
  return parts.join(", ") + "…";
88
88
  }
89
89
  if (act.responseText?.trim()) {
90
- const line = act.responseText.split("\n").find((l) => l.trim())?.trim() ?? "";
90
+ const line =
91
+ act.responseText
92
+ .split("\n")
93
+ .find((l) => l.trim())
94
+ ?.trim() ?? "";
91
95
  return line.length > 60 ? line.slice(0, 60) + "…" : line;
92
96
  }
93
97
  return "thinking…";
@@ -96,7 +100,8 @@ export function describeLiveActivity(handle: LiveAgentHandle): string {
96
100
  export function agentActivity(agent: CrewAgentRecord, liveHandle?: LiveAgentHandle): string {
97
101
  if (liveHandle && liveHandle.status === "running") {
98
102
  const live = describeLiveActivity(liveHandle);
99
- if (live === "thinking…" && agent.progress?.currentTool) return `${TOOL_LABELS[agent.progress.currentTool] ?? agent.progress.currentTool}…`;
103
+ if (live === "thinking…" && agent.progress?.currentTool)
104
+ return `${TOOL_LABELS[agent.progress.currentTool] ?? agent.progress.currentTool}…`;
100
105
  return live;
101
106
  }
102
107
  if (agent.progress?.currentTool) return `${TOOL_LABELS[agent.progress.currentTool] ?? agent.progress.currentTool}…`;
@@ -130,7 +135,9 @@ export function agentStats(agent: CrewAgentRecord, liveHandle?: LiveAgentHandle)
130
135
  const stats = liveHandle.session.getSessionStats?.();
131
136
  const ctxPct = stats?.contextUsage?.percent;
132
137
  if (ctxPct != null) parts.push(alignMetric(`${Math.round(ctxPct)}% ctx`, CTX_METRIC_WIDTH));
133
- } catch { /* ignore */ }
138
+ } catch {
139
+ /* ignore */
140
+ }
134
141
  const ms = computeLiveDurationMs(act);
135
142
  parts.push(alignMetric(`${(ms / 1000).toFixed(1)}s`, DURATION_METRIC_WIDTH));
136
143
  } else {
@@ -4,14 +4,14 @@
4
4
  * Extracted from crew-widget.ts.
5
5
  */
6
6
 
7
- import type { TeamRunManifest } from "../../state/types.ts";
7
+ import { listRecentRuns } from "../../extension/run-index.ts";
8
+ import { reconcileAllStaleRuns } from "../../runtime/crash-recovery.ts";
8
9
  import { readCrewAgents } from "../../runtime/crew-agent-records.ts";
9
10
  import type { CrewAgentRecord } from "../../runtime/crew-agent-runtime.ts";
10
- import { isDisplayActiveRun } from "../../runtime/process-status.ts";
11
- import { listLiveAgents, evictStaleLiveAgentHandles } from "../../runtime/live-agent-manager.ts";
11
+ import { evictStaleLiveAgentHandles, listLiveAgents } from "../../runtime/live-agent-manager.ts";
12
12
  import type { ManifestCache } from "../../runtime/manifest-cache.ts";
13
- import { reconcileAllStaleRuns } from "../../runtime/crash-recovery.ts";
14
- import { listRecentRuns } from "../../extension/run-index.ts";
13
+ import { isDisplayActiveRun } from "../../runtime/process-status.ts";
14
+ import type { TeamRunManifest } from "../../state/types.ts";
15
15
  import type { RunSnapshotCache } from "../snapshot-types.ts";
16
16
  import type { WidgetRun } from "./widget-types.ts";
17
17
 
@@ -41,7 +41,11 @@ export function activeWidgetRuns(
41
41
  const now = Date.now();
42
42
  if (now - lastStaleReconcileAt > STALE_RECONCILE_INTERVAL_MS && manifestCache) {
43
43
  lastStaleReconcileAt = now;
44
- try { reconcileAllStaleRuns(cwd, manifestCache); } catch { /* non-critical */ }
44
+ try {
45
+ reconcileAllStaleRuns(cwd, manifestCache);
46
+ } catch {
47
+ /* non-critical */
48
+ }
45
49
  }
46
50
 
47
51
  let runs = preloadedManifests ?? (manifestCache ? manifestCache.list(20) : listRecentRuns(cwd, 20));
@@ -54,7 +58,11 @@ export function activeWidgetRuns(
54
58
  try {
55
59
  const snapshot = snapshotCache?.get(run.runId);
56
60
  return snapshot
57
- ? { run: snapshot.manifest, agents: snapshot.agents, snapshot }
61
+ ? {
62
+ run: snapshot.manifest,
63
+ agents: snapshot.agents,
64
+ snapshot,
65
+ }
58
66
  : { run, agents: agentsFor(run) };
59
67
  } catch {
60
68
  return { run, agents: agentsFor(run) };
@@ -73,7 +81,10 @@ export function statusSummary(runs: WidgetRun[]): string {
73
81
  const completedAgents = agents.filter((a) => a.status === "completed").length;
74
82
  const totalAgents = agents.length;
75
83
  const totalRuns = runs.length;
76
- const model = agents.find((a) => a.model)?.model?.split("/").at(-1);
84
+ const model = agents
85
+ .find((a) => a.model)
86
+ ?.model?.split("/")
87
+ .at(-1);
77
88
  const parts = [`⚙ ${runningAgents}r`];
78
89
  if (queuedAgents > 0) parts.push(`${queuedAgents}q`);
79
90
  if (completedAgents > 0) parts.push(`${completedAgents}/${totalAgents}done`);
@@ -4,18 +4,18 @@
4
4
  * Extracted from crew-widget.ts.
5
5
  */
6
6
 
7
- import type { CrewTheme } from "../theme-adapter.ts";
8
- import { iconForStatus, colorizeStatusGlyphs } from "../status-colors.ts";
9
- import { truncate } from "../../utils/visual.ts";
10
- import { Box, Text } from "../layout-primitives.ts";
11
7
  import { listLiveAgents } from "../../runtime/live-agent-manager.ts";
12
8
  import { computePhaseProgress, formatPhaseProgressLine } from "../../runtime/phase-progress.ts";
13
- import { spinnerFrame } from "../spinner.ts";
14
- import { computeLiveDurationMs } from "../live-duration.ts";
9
+ import { isFinishedRunStatus } from "../../runtime/process-status.ts";
15
10
  import { getTaskUsage } from "../../runtime/usage-tracker.ts";
11
+ import { truncate } from "../../utils/visual.ts";
12
+ import { Box, Text } from "../layout-primitives.ts";
13
+ import { computeLiveDurationMs } from "../live-duration.ts";
14
+ import { spinnerFrame } from "../spinner.ts";
15
+ import { colorizeStatusGlyphs, iconForStatus } from "../status-colors.ts";
16
+ import type { CrewTheme } from "../theme-adapter.ts";
16
17
  import { agentActivity, agentStats, elapsed, formatTokensCompact, notificationBadge } from "./widget-formatters.ts";
17
18
  import { activeWidgetRuns, shortRunLabel } from "./widget-model.ts";
18
- import { isFinishedRunStatus } from "../../runtime/process-status.ts";
19
19
  import type { WidgetRun } from "./widget-types.ts";
20
20
 
21
21
  const MAX_AGENTS_DISPLAY = 3;
@@ -47,7 +47,14 @@ export function widgetHeader(runs: WidgetRun[], runningGlyph: string, maxLines =
47
47
 
48
48
  // ── Line builder ──────────────────────────────────────────────────────
49
49
 
50
- export function buildWidgetLines(cwd: string, frame = 0, maxLines = 8, providedRuns?: WidgetRun[], notificationCount = 0, width = DEFAULT_WIDGET_WIDTH): string[] {
50
+ export function buildWidgetLines(
51
+ cwd: string,
52
+ frame = 0,
53
+ maxLines = 8,
54
+ providedRuns?: WidgetRun[],
55
+ notificationCount = 0,
56
+ width = DEFAULT_WIDGET_WIDTH,
57
+ ): string[] {
51
58
  // Match the legacy `buildCrewWidgetLines` API: when no runs are supplied,
52
59
  // auto-fetch via activeWidgetRuns(cwd). Otherwise widgets calling with
53
60
  // only `(cwd, frame)` would render an empty line set (regression vs. the
@@ -103,10 +110,12 @@ export function buildWidgetLines(cwd: string, frame = 0, maxLines = 8, providedR
103
110
  // L-4: prioritize RUNNING > QUEUED > WAITING within the visible window so the
104
111
  // most relevant live workers are always shown. Finished rows fill only the
105
112
  // leftover budget and never steal slots from running agents.
106
- const ACTIVE_PRIORITY: Record<string, number> = { running: 0, queued: 1, waiting: 2 };
107
- const prioritizedActive = [...activeAgents].sort(
108
- (a, b) => (ACTIVE_PRIORITY[a.status] ?? 9) - (ACTIVE_PRIORITY[b.status] ?? 9),
109
- );
113
+ const ACTIVE_PRIORITY: Record<string, number> = {
114
+ running: 0,
115
+ queued: 1,
116
+ waiting: 2,
117
+ };
118
+ const prioritizedActive = [...activeAgents].sort((a, b) => (ACTIVE_PRIORITY[a.status] ?? 9) - (ACTIVE_PRIORITY[b.status] ?? 9));
110
119
  // Finished rows only appear in slots not used by active agents (max 2). When
111
120
  // there are >= MAX_AGENTS_DISPLAY live workers, finished rows are suppressed
112
121
  // entirely so they cannot push a live agent's activity line off-screen.
@@ -134,7 +143,8 @@ export function buildWidgetLines(cwd: string, frame = 0, maxLines = 8, providedR
134
143
  for (const [index, agent] of finishedAgents.slice(0, finishedSlots).entries()) {
135
144
  const liveHandle = liveForRun.find((h) => h.taskId === agent.taskId);
136
145
  const name = liveHandle?.agent ?? agent.agent;
137
- const icon = agent.status === "completed" ? "✓" : agent.status === "failed" ? "✗" : agent.status === "needs_attention" ? "⚠" : "▪";
146
+ const icon =
147
+ agent.status === "completed" ? "✓" : agent.status === "failed" ? "✗" : agent.status === "needs_attention" ? "⚠" : "▪";
138
148
  const stats = agentStats(agent, liveHandle);
139
149
  const desc = truncate(liveHandle?.description ?? agent.role ?? "", TASK_DESC_MAX);
140
150
  const isLastFinished = index === Math.min(finishedAgents.length, finishedSlots) - 1;
@@ -2,9 +2,9 @@
2
2
  * Widget type definitions.
3
3
  */
4
4
 
5
- import type { TeamRunManifest } from "../../state/types.ts";
6
5
  import type { CrewAgentRecord } from "../../runtime/crew-agent-runtime.ts";
7
6
  import type { ManifestCache } from "../../runtime/manifest-cache.ts";
7
+ import type { TeamRunManifest } from "../../state/types.ts";
8
8
  import type { RunSnapshotCache, RunUiSnapshot } from "../snapshot-types.ts";
9
9
 
10
10
  export interface WidgetRun {