pi-crew 0.9.15 → 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 +145 -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 +193 -40
  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 +86 -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
@@ -1,12 +1,12 @@
1
- import type { RunDashboardOptions } from "../run-dashboard.ts";
2
- import { iconForStatus } from "../status-colors.ts";
3
- import type { RunUiSnapshot } from "../snapshot-types.ts";
4
- import { spinnerFrame } from "../spinner.ts";
5
1
  import type { CrewAgentRecord } from "../../runtime/crew-agent-runtime.ts";
2
+ import { type LiveAgentHandle, listLiveAgents, listLiveAgentsByWorkspace } from "../../runtime/live-agent-manager.ts";
6
3
  import { formatCost } from "../../state/usage.ts";
7
- import { listLiveAgents, listLiveAgentsByWorkspace, type LiveAgentHandle } from "../../runtime/live-agent-manager.ts";
8
- import { computeLiveDurationMs } from "../live-duration.ts";
9
4
  import { visibleWidth } from "../../utils/visual.ts";
5
+ import { computeLiveDurationMs } from "../live-duration.ts";
6
+ import type { RunDashboardOptions } from "../run-dashboard.ts";
7
+ import type { RunUiSnapshot } from "../snapshot-types.ts";
8
+ import { spinnerFrame } from "../spinner.ts";
9
+ import { iconForStatus } from "../status-colors.ts";
10
10
 
11
11
  /**
12
12
  * Fixed visible widths for the per-agent numeric metrics (finding V-1).
@@ -63,11 +63,15 @@ const TOOL_LABELS: Record<string, string> = {
63
63
  function describeActivity(handle: LiveAgentHandle): string {
64
64
  const act = handle.activity;
65
65
  if (act.activeTools.size > 0) {
66
- const tools = [...new Set([...act.activeTools.values()])].map(t => TOOL_LABELS[t] ?? t);
66
+ const tools = [...new Set([...act.activeTools.values()])].map((t) => TOOL_LABELS[t] ?? t);
67
67
  return tools.join(", ") + "…";
68
68
  }
69
69
  if (act.responseText?.trim()) {
70
- const line = act.responseText.split("\n").find((l) => l.trim())?.trim() ?? "";
70
+ const line =
71
+ act.responseText
72
+ .split("\n")
73
+ .find((l) => l.trim())
74
+ ?.trim() ?? "";
71
75
  return line.length > 40 ? line.slice(0, 40) + "…" : line;
72
76
  }
73
77
  return "thinking…";
@@ -77,38 +81,50 @@ export function renderAgentsPane(snapshot: RunUiSnapshot | undefined, options: R
77
81
  if (!snapshot) return ["(snapshot unavailable)"];
78
82
  if (!snapshot.agents.length) return ["(no agents)"];
79
83
  // Filter live agents by workspaceId for session isolation
80
- const allLive = options.workspaceId
81
- ? listLiveAgentsByWorkspace(options.workspaceId)
82
- : listLiveAgents();
83
- const liveForRun = allLive.filter(h => h.runId === snapshot.runId);
84
+ const allLive = options.workspaceId ? listLiveAgentsByWorkspace(options.workspaceId) : listLiveAgents();
85
+ const liveForRun = allLive.filter((h) => h.runId === snapshot.runId);
84
86
  const { completed, total } = snapshot.progress;
85
87
 
86
88
  const lines: string[] = [];
87
89
 
88
- const realAgents = snapshot.agents.filter(a => isRealAgent(a, liveForRun.find(h => h.taskId === a.taskId)));
90
+ const realAgents = snapshot.agents.filter((a) =>
91
+ isRealAgent(
92
+ a,
93
+ liveForRun.find((h) => h.taskId === a.taskId),
94
+ ),
95
+ );
89
96
  const lineCount = Math.min(realAgents.length, 12);
90
- const label = realAgents.length !== snapshot.agents.length
91
- ? `${realAgents.length} real agents (${snapshot.agents.length} total)`
92
- : `${realAgents.length} agents`;
97
+ const label =
98
+ realAgents.length !== snapshot.agents.length
99
+ ? `${realAgents.length} real agents (${snapshot.agents.length} total)`
100
+ : `${realAgents.length} agents`;
93
101
 
94
102
  lines.push(`${completed}/${total} tasks · ${label}`);
95
103
 
96
104
  for (const agent of realAgents.slice(0, 12)) {
97
- const liveHandle = liveForRun.find(h => h.taskId === agent.taskId);
98
- const icon = iconForStatus(agent.status, { runningGlyph: spinnerFrame(agent.taskId) });
105
+ const liveHandle = liveForRun.find((h) => h.taskId === agent.taskId);
106
+ const icon = iconForStatus(agent.status, {
107
+ runningGlyph: spinnerFrame(agent.taskId),
108
+ });
99
109
  const role = `${agent.role}`;
100
110
 
101
111
  // Compact activity line
102
- const activity = liveHandle ? describeActivity(liveHandle)
103
- : agent.progress?.currentTool ? `${TOOL_LABELS[agent.progress.currentTool] ?? agent.progress.currentTool}…`
104
- : agent.status === "running" ? "thinking…"
105
- : agent.status === "queued" ? "queued"
106
- : agent.status === "failed" ? (agent.error ?? "failed")
107
- : "done";
112
+ const activity = liveHandle
113
+ ? describeActivity(liveHandle)
114
+ : agent.progress?.currentTool
115
+ ? `${TOOL_LABELS[agent.progress.currentTool] ?? agent.progress.currentTool}…`
116
+ : agent.status === "running"
117
+ ? "thinking…"
118
+ : agent.status === "queued"
119
+ ? "queued"
120
+ : agent.status === "failed"
121
+ ? (agent.error ?? "failed")
122
+ : "done";
108
123
 
109
124
  // Stats: tokens + cost + duration
110
125
  const stats: string[] = [];
111
- const tokenTotal = (agent.usage?.input ?? 0) + (agent.usage?.output ?? 0) + (agent.usage?.cacheRead ?? 0) + (agent.usage?.cacheWrite ?? 0);
126
+ const tokenTotal =
127
+ (agent.usage?.input ?? 0) + (agent.usage?.output ?? 0) + (agent.usage?.cacheRead ?? 0) + (agent.usage?.cacheWrite ?? 0);
112
128
  if (tokenTotal > 0) {
113
129
  const tok = tokenTotal >= 1000 ? `${(tokenTotal / 1000).toFixed(1)}k` : `${tokenTotal}`;
114
130
  stats.push(alignMetric(tok, TOKENS_METRIC_WIDTH));
@@ -63,4 +63,4 @@ export function summarizeTerminalReason(
63
63
  if (failed?.error) return failed.error;
64
64
  if (manifest.policyDecisions?.length) return manifest.policyDecisions[0]?.message;
65
65
  return undefined;
66
- }
66
+ }
@@ -1,6 +1,6 @@
1
- import { buildCapabilityInventory } from "../../runtime/capability-inventory.ts";
2
1
  import type { PiTeamsConfig } from "../../config/config.ts";
3
2
  import type { CapabilityItem } from "../../runtime/capability-inventory.ts";
3
+ import { buildCapabilityInventory } from "../../runtime/capability-inventory.ts";
4
4
 
5
5
  export interface CapabilityPaneOptions {
6
6
  config?: PiTeamsConfig;
@@ -9,30 +9,47 @@ export interface CapabilityPaneOptions {
9
9
 
10
10
  function kindIcon(kind: string): string {
11
11
  switch (kind) {
12
- case "team": return "👥";
13
- case "workflow": return "📋";
14
- case "agent": return "🤖";
15
- case "skill": return "🔧";
16
- case "tool": return "🛠";
17
- case "runtime": return "";
18
- default: return "";
12
+ case "team":
13
+ return "👥";
14
+ case "workflow":
15
+ return "📋";
16
+ case "agent":
17
+ return "🤖";
18
+ case "skill":
19
+ return "🔧";
20
+ case "tool":
21
+ return "🛠";
22
+ case "runtime":
23
+ return "⚙";
24
+ default:
25
+ return "•";
19
26
  }
20
27
  }
21
28
 
22
29
  function stateLabel(state: string): string {
23
30
  switch (state) {
24
- case "active": return "";
25
- case "disabled": return " [DISABLED]";
26
- case "shadowed": return " [SHADOWED]";
27
- case "missing": return " [MISSING]";
28
- default: return "";
31
+ case "active":
32
+ return "";
33
+ case "disabled":
34
+ return " [DISABLED]";
35
+ case "shadowed":
36
+ return " [SHADOWED]";
37
+ case "missing":
38
+ return " [MISSING]";
39
+ default:
40
+ return "";
29
41
  }
30
42
  }
31
43
 
32
44
  export function renderCapabilityPane(cwd: string, opts: CapabilityPaneOptions = {}): string[] {
33
45
  const inventory = buildCapabilityInventory(cwd, opts.config);
34
46
  const filtered = opts.filter
35
- ? inventory.filter((item) => item.kind.includes(opts.filter!.toLowerCase()) || item.name.toLowerCase().includes(opts.filter!.toLowerCase()) || item.id.toLowerCase().includes(opts.filter!.toLowerCase()))
47
+ ? inventory.filter(
48
+ (item) =>
49
+ item.kind.includes(opts.filter!.toLowerCase()) ||
50
+ item.name.toLowerCase().includes(opts.filter!.toLowerCase()) ||
51
+ item.id.toLowerCase().includes(opts.filter!.toLowerCase()),
52
+ )
36
53
  : inventory;
37
54
 
38
55
  if (filtered.length === 0) return ["Capability pane: no items found"];
@@ -57,4 +74,4 @@ export function renderCapabilityPane(cwd: string, opts: CapabilityPaneOptions =
57
74
  const disabled = filtered.filter((i) => i.state === "disabled").length;
58
75
  if (disabled > 0) lines.push(` Disabled: ${disabled}`);
59
76
  return lines;
60
- }
77
+ }
@@ -25,6 +25,7 @@ export function renderHealthPane(snapshot: RunUiSnapshot | undefined, opts: Heal
25
25
  if ((summary.dead > 0 || summary.stale > 0) && foreground) hints.push("K kill stale");
26
26
  hints.push("D diagnostic export");
27
27
  lines.push(`Actions: ${hints.join(" · ")}`);
28
- if (!foreground && (summary.dead > 0 || summary.missing > 0 || summary.stale > 0)) lines.push("Async run: R/K disabled — inspect process manually or use /team-api.");
28
+ if (!foreground && (summary.dead > 0 || summary.missing > 0 || summary.stale > 0))
29
+ lines.push("Async run: R/K disabled — inspect process manually or use /team-api.");
29
30
  return lines;
30
31
  }
@@ -27,7 +27,10 @@ export function renderMetricsPane(_snapshot: RunUiSnapshot | undefined, opts: Me
27
27
  lines.push(`${snapshot.name}: empty`);
28
28
  continue;
29
29
  }
30
- if (isHistogramPoint(first)) lines.push(`${snapshot.name}${labelsText(first.labels)} count=${first.count} p95=${Number.isFinite(first.quantiles.p95) ? Math.round(first.quantiles.p95) : "n/a"}`);
30
+ if (isHistogramPoint(first))
31
+ lines.push(
32
+ `${snapshot.name}${labelsText(first.labels)} count=${first.count} p95=${Number.isFinite(first.quantiles.p95) ? Math.round(first.quantiles.p95) : "n/a"}`,
33
+ );
31
34
  else lines.push(`${snapshot.name}${labelsText(first.labels)} ${first.value}`);
32
35
  }
33
36
  return lines;
@@ -1,21 +1,24 @@
1
- import type { RunUiSnapshot } from "../snapshot-types.ts";
2
1
  import { computePhaseProgress, formatPhaseProgressLine } from "../../runtime/phase-progress.ts";
3
2
  import { renderDwfPhaseLines } from "../dwf-phase-display.ts";
3
+ import type { RunUiSnapshot } from "../snapshot-types.ts";
4
4
 
5
5
  export function renderProgressPane(snapshot: RunUiSnapshot | undefined): string[] {
6
6
  if (!snapshot) return ["Progress pane: snapshot unavailable"];
7
7
  const progress = snapshot.progress;
8
8
  const groupJoins = snapshot.groupJoins ?? [];
9
- const groupJoinLines = groupJoins.length ? groupJoins.map((item) => `group join ${item.partial ? "partial" : "completed"}: ${item.requestId} ack=${item.ack}`) : ["group joins: none"];
9
+ const groupJoinLines = groupJoins.length
10
+ ? groupJoins.map((item) => `group join ${item.partial ? "partial" : "completed"}: ${item.requestId} ack=${item.ack}`)
11
+ : ["group joins: none"];
10
12
  const cancellationLine = snapshot.cancellationReason ? [`cancelled: reason=${snapshot.cancellationReason}`] : [];
11
13
  const runProgress = computePhaseProgress(snapshot.tasks);
12
- const phaseLines = runProgress.phases.length > 0
13
- ? runProgress.phases.map((p) => {
14
- const done = p.completed + p.failed;
15
- const status = p.running > 0 ? "running" : p.queued > 0 ? "queued" : done >= p.total ? "done" : "waiting";
16
- return ` Phase ${p.index + 1} ${p.phase}: ${p.percentage}% (${done}/${p.total}) [${status}]`;
17
- })
18
- : [];
14
+ const phaseLines =
15
+ runProgress.phases.length > 0
16
+ ? runProgress.phases.map((p) => {
17
+ const done = p.completed + p.failed;
18
+ const status = p.running > 0 ? "running" : p.queued > 0 ? "queued" : done >= p.total ? "done" : "waiting";
19
+ return ` Phase ${p.index + 1} ${p.phase}: ${p.percentage}% (${done}/${p.total}) [${status}]`;
20
+ })
21
+ : [];
19
22
  const phaseHeader = phaseLines.length > 0 ? [formatPhaseProgressLine(runProgress), ...phaseLines] : [];
20
23
  // DWF logical phases (round-15 P1-4): derived from dwf.phase_* events.
21
24
  // Null/absent for non-DWF runs → zero visible change.
@@ -1,6 +1,6 @@
1
- import type { TeamTaskState } from "../state/types.ts";
2
- import { classifyHeartbeat, heartbeatAgeMs } from "../runtime/heartbeat-gradient.ts";
3
1
  import type { MetricRegistry } from "../observability/metric-registry.ts";
2
+ import { classifyHeartbeat, heartbeatAgeMs } from "../runtime/heartbeat-gradient.ts";
3
+ import type { TeamTaskState } from "../state/types.ts";
4
4
  import type { RunUiSnapshot } from "./snapshot-types.ts";
5
5
 
6
6
  export interface HeartbeatSummary {
@@ -35,7 +35,16 @@ export function summarizeHeartbeats(snapshot: RunUiSnapshot, opts: HeartbeatSumm
35
35
  const staleMs = opts.staleMs ?? 60_000;
36
36
  const deadMs = opts.deadMs ?? 5 * 60_000;
37
37
  const current = nowMs(opts.now);
38
- const summary: HeartbeatSummary = { runId: snapshot.runId, totalTasks: snapshot.tasks.length, healthy: 0, stale: 0, dead: 0, missing: 0, worstStaleMs: 0, gradient: { healthy: 0, warn: 0, stale: 0, dead: 0 } };
38
+ const summary: HeartbeatSummary = {
39
+ runId: snapshot.runId,
40
+ totalTasks: snapshot.tasks.length,
41
+ healthy: 0,
42
+ stale: 0,
43
+ dead: 0,
44
+ missing: 0,
45
+ worstStaleMs: 0,
46
+ gradient: { healthy: 0, warn: 0, stale: 0, dead: 0 },
47
+ };
39
48
  for (const task of snapshot.tasks) {
40
49
  if (!isActiveTask(task)) continue;
41
50
  const heartbeat = task.heartbeat;
@@ -53,7 +62,9 @@ export function summarizeHeartbeats(snapshot: RunUiSnapshot, opts: HeartbeatSumm
53
62
  summary.worstStaleMs = Math.max(summary.worstStaleMs, age);
54
63
  const level = classifyHeartbeat(heartbeat, { warnMs: Math.max(1, Math.floor(staleMs / 2)), staleMs, deadMs }, current);
55
64
  summary.gradient[level] += 1;
56
- opts.registry?.gauge("crew.heartbeat.staleness_ms", "Heartbeat elapsed since last seen, milliseconds").set({ runId: snapshot.runId, taskId: task.id }, age);
65
+ opts.registry
66
+ ?.gauge("crew.heartbeat.staleness_ms", "Heartbeat elapsed since last seen, milliseconds")
67
+ .set({ runId: snapshot.runId, taskId: task.id }, age);
57
68
  opts.registry?.counter("crew.heartbeat.level_total", "Heartbeat classifications by level").inc({ runId: snapshot.runId, level });
58
69
  if (level === "dead") summary.dead += 1;
59
70
  else if (level === "stale") summary.stale += 1;
@@ -40,9 +40,23 @@ export const DASHBOARD_KEYS = {
40
40
  reload: ["r"],
41
41
  progressToggle: ["p"],
42
42
  },
43
- pane: { agents: ["1"], progress: ["2"], mailbox: ["3"], output: ["4"], health: ["5"], metrics: ["6"] },
43
+ pane: {
44
+ agents: ["1"],
45
+ progress: ["2"],
46
+ mailbox: ["3"],
47
+ output: ["4"],
48
+ health: ["5"],
49
+ metrics: ["6"],
50
+ },
44
51
  navigation: { up: ["k", "\u001b[A"], down: ["j", "\u001b[B"] },
45
- mailbox: { ack: ["A"], nudge: ["N"], compose: ["C"], preview: ["P"], ackAll: ["X"], openDetail: ["\r", "\n"] },
52
+ mailbox: {
53
+ ack: ["A"],
54
+ nudge: ["N"],
55
+ compose: ["C"],
56
+ preview: ["P"],
57
+ ackAll: ["X"],
58
+ openDetail: ["\r", "\n"],
59
+ },
46
60
  health: { recovery: ["R"], killStale: ["K"], diagnosticExport: ["D"] },
47
61
  notification: { dismissAll: ["H"] },
48
62
  } as const;
@@ -115,11 +129,30 @@ export type DashboardKeyAction =
115
129
  const BINDINGS: readonly KeyBinding[] = [
116
130
  { keys: DASHBOARD_KEYS.close, action: "close" },
117
131
  { keys: DASHBOARD_KEYS.help, action: "help" },
118
- { keys: DASHBOARD_KEYS.mailbox.openDetail, action: "mailbox-detail", pane: "mailbox" },
119
- { keys: DASHBOARD_KEYS.health.recovery, action: "health-recovery", pane: "health" },
120
- { keys: DASHBOARD_KEYS.health.killStale, action: "health-kill-stale", pane: "health" },
121
- { keys: DASHBOARD_KEYS.health.diagnosticExport, action: "health-diagnostic-export", pane: "health" },
122
- { keys: DASHBOARD_KEYS.notification.dismissAll, action: "notifications-dismiss" },
132
+ {
133
+ keys: DASHBOARD_KEYS.mailbox.openDetail,
134
+ action: "mailbox-detail",
135
+ pane: "mailbox",
136
+ },
137
+ {
138
+ keys: DASHBOARD_KEYS.health.recovery,
139
+ action: "health-recovery",
140
+ pane: "health",
141
+ },
142
+ {
143
+ keys: DASHBOARD_KEYS.health.killStale,
144
+ action: "health-kill-stale",
145
+ pane: "health",
146
+ },
147
+ {
148
+ keys: DASHBOARD_KEYS.health.diagnosticExport,
149
+ action: "health-diagnostic-export",
150
+ pane: "health",
151
+ },
152
+ {
153
+ keys: DASHBOARD_KEYS.notification.dismissAll,
154
+ action: "notifications-dismiss",
155
+ },
123
156
  { keys: DASHBOARD_KEYS.select, action: "select" },
124
157
  { keys: DASHBOARD_KEYS.root.summary, action: "summary" },
125
158
  { keys: DASHBOARD_KEYS.root.artifacts, action: "artifacts" },
@@ -5,10 +5,10 @@
5
5
  * Falls back to polling LiveAgentHandle.activity when subscribe is unavailable.
6
6
  */
7
7
  import type { LiveAgentHandle } from "../runtime/live-agent-manager.ts";
8
- import { iconForStatus } from "./status-colors.ts";
8
+ import { pad, truncate } from "../utils/visual.ts";
9
9
  import { spinnerFrame } from "./spinner.ts";
10
+ import { iconForStatus } from "./status-colors.ts";
10
11
  import type { CrewTheme } from "./theme-adapter.ts";
11
- import { pad, truncate } from "../utils/visual.ts";
12
12
 
13
13
  const CHROME_LINES = 6;
14
14
  const MIN_VIEWPORT = 3;
@@ -31,12 +31,7 @@ export class LiveConversationOverlay {
31
31
  private handle: LiveAgentHandle;
32
32
  private theme: CrewTheme;
33
33
 
34
- constructor(
35
- handle: LiveAgentHandle,
36
- theme: CrewTheme,
37
- columns = 80,
38
- rows = 24,
39
- ) {
34
+ constructor(handle: LiveAgentHandle, theme: CrewTheme, columns = 80, rows = 24) {
40
35
  this.handle = handle;
41
36
  this.theme = theme;
42
37
  this.columns = columns;
@@ -54,16 +49,26 @@ export class LiveConversationOverlay {
54
49
  if (this.autoScroll) this.scrollOffset = Math.max(0, this.cachedLines.length - this.viewportHeight());
55
50
  }
56
51
  });
57
- } catch { /* ignore */ }
52
+ } catch {
53
+ /* ignore */
54
+ }
58
55
  }
59
56
  // Also poll for summary updates
60
57
  this.pollTimer = setInterval(() => {
61
58
  if (this.closed) return;
62
59
  this.frame++;
63
- try { this.refreshSummary(); } catch { /* ignore */ }
60
+ try {
61
+ this.refreshSummary();
62
+ } catch {
63
+ /* ignore */
64
+ }
64
65
  }, 200);
65
66
  this.pollTimer.unref();
66
- try { this.refreshSummary(); } catch { /* ignore */ }
67
+ try {
68
+ this.refreshSummary();
69
+ } catch {
70
+ /* ignore */
71
+ }
67
72
  }
68
73
 
69
74
  private pushLine(line: string): void {
@@ -120,8 +125,7 @@ export class LiveConversationOverlay {
120
125
  if (w < 6) return [];
121
126
  const th = this.theme;
122
127
  const innerW = w - 4;
123
- const row = (content: string) =>
124
- th.fg("border", "│") + " " + pad(truncate(content, innerW), innerW) + " " + th.fg("border", "│");
128
+ const row = (content: string) => th.fg("border", "│") + " " + pad(truncate(content, innerW), innerW) + " " + th.fg("border", "│");
125
129
  const hrTop = th.fg("border", `╭${"─".repeat(w - 2)}╮`);
126
130
  const hrBot = th.fg("border", `╰${"─".repeat(w - 2)}╯`);
127
131
  const hrMid = row(th.fg("dim", "─".repeat(innerW)));
@@ -130,9 +134,10 @@ export class LiveConversationOverlay {
130
134
  lines.push(hrTop);
131
135
 
132
136
  // Header
133
- const statusIcon = this.handle.status === "running"
134
- ? th.fg("accent", spinnerFrame(this.handle.taskId ?? this.handle.agentId))
135
- : iconForStatus(this.handle.status);
137
+ const statusIcon =
138
+ this.handle.status === "running"
139
+ ? th.fg("accent", spinnerFrame(this.handle.taskId ?? this.handle.agentId))
140
+ : iconForStatus(this.handle.status);
136
141
  const name = this.handle.agent ?? this.handle.taskId;
137
142
  const act = this.handle.activity;
138
143
  const elapsed = `${(this.safeElapsedMs(act) / 1000).toFixed(1)}s`;
@@ -149,13 +154,19 @@ export class LiveConversationOverlay {
149
154
  const color = ctxPct >= 85 ? "error" : ctxPct >= 70 ? "warning" : "dim";
150
155
  headerParts.push(th.fg(color, `${Math.round(ctxPct)}% ctx`));
151
156
  }
152
- } catch { /* ignore */ }
157
+ } catch {
158
+ /* ignore */
159
+ }
153
160
  if (act.compactionCount > 0) headerParts.push(th.fg("dim", `↻${act.compactionCount}`));
154
161
  // Model name
155
162
  if (this.handle.modelName) headerParts.push(th.fg("muted", this.handle.modelName));
156
163
 
157
164
  const desc = this.handle.description ?? this.handle.role ?? "";
158
- lines.push(row(`${statusIcon} ${th.fg("accent", name)} ${th.fg("muted", desc)} ${th.fg("dim", "·")} ${th.fg("dim", headerParts.join(" · "))}`));
165
+ lines.push(
166
+ row(
167
+ `${statusIcon} ${th.fg("accent", name)} ${th.fg("muted", desc)} ${th.fg("dim", "·")} ${th.fg("dim", headerParts.join(" · "))}`,
168
+ ),
169
+ );
159
170
  lines.push(hrMid);
160
171
 
161
172
  // Content
@@ -167,7 +178,9 @@ export class LiveConversationOverlay {
167
178
 
168
179
  // Footer
169
180
  lines.push(hrMid);
170
- const footerText = this.autoScroll ? "auto-scroll · esc/q close" : `line ${this.scrollOffset + 1}/${this.cachedLines.length} · ↑/k ↓/j G/g · esc/q close`;
181
+ const footerText = this.autoScroll
182
+ ? "auto-scroll · esc/q close"
183
+ : `line ${this.scrollOffset + 1}/${this.cachedLines.length} · ↑/k ↓/j G/g · esc/q close`;
171
184
  lines.push(row(th.fg("dim", footerText)));
172
185
  lines.push(hrBot);
173
186
  return lines;
@@ -178,7 +191,10 @@ export class LiveConversationOverlay {
178
191
  this.closed = true;
179
192
  this.unsubscribe?.();
180
193
  this.unsubscribe = undefined;
181
- if (this.pollTimer) { clearInterval(this.pollTimer); this.pollTimer = undefined; }
194
+ if (this.pollTimer) {
195
+ clearInterval(this.pollTimer);
196
+ this.pollTimer = undefined;
197
+ }
182
198
  }
183
199
 
184
200
  dispose(): void {
@@ -43,10 +43,7 @@ export function computeLiveDurationMs(activity: LiveActivity, nowMs: number = Da
43
43
  const completedMs = rawCompleted > 0 ? toMs(rawCompleted) : 0;
44
44
  // A valid start is positive, not more than 1 minute in the future, and not
45
45
  // more than ~1000 years in the past (guards against 0 / garbage / clock skew).
46
- const isValidStarted =
47
- startedMs > 0 &&
48
- startedMs < nowMs + 60_000 &&
49
- startedMs > nowMs - 31_556_926_000_000;
46
+ const isValidStarted = startedMs > 0 && startedMs < nowMs + 60_000 && startedMs > nowMs - 31_556_926_000_000;
50
47
  const end = completedMs > 0 && completedMs < nowMs + 60_000 ? completedMs : nowMs;
51
48
  const ms = end - (isValidStarted ? startedMs : nowMs);
52
49
  return Number.isFinite(ms) && ms >= 0 ? ms : 0;