pi-crew 0.9.53 → 0.9.55

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 (493) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/package.json +6 -3
  3. package/scripts/clean-strip-types.mjs +60 -0
  4. package/src/adapters/claude-adapter.ts +23 -0
  5. package/src/adapters/codex-adapter.ts +21 -0
  6. package/src/adapters/cursor-adapter.ts +17 -0
  7. package/src/adapters/export-util.ts +143 -0
  8. package/src/adapters/index.ts +15 -0
  9. package/src/adapters/registry.ts +18 -0
  10. package/src/adapters/types.ts +23 -0
  11. package/src/agents/agent-config.ts +194 -0
  12. package/src/agents/agent-search.ts +98 -0
  13. package/src/agents/agent-serializer.ts +38 -0
  14. package/src/agents/discover-agents.ts +623 -0
  15. package/src/benchmark/benchmark-runner.ts +313 -0
  16. package/src/benchmark/feedback-loop.ts +73 -0
  17. package/src/config/config.ts +1270 -0
  18. package/src/config/defaults.ts +193 -0
  19. package/src/config/drift-detector.ts +290 -0
  20. package/src/config/markers.ts +330 -0
  21. package/src/config/resilient-parser.ts +117 -0
  22. package/src/config/role-tools.ts +118 -0
  23. package/src/config/suggestions.ts +75 -0
  24. package/src/config/types.ts +280 -0
  25. package/src/errors.ts +194 -0
  26. package/src/extension/action-suggestions.ts +117 -0
  27. package/src/extension/async-notifier.ts +179 -0
  28. package/src/extension/autonomous-policy.ts +209 -0
  29. package/src/extension/command-completions.ts +120 -0
  30. package/src/extension/context-status-injection.ts +185 -0
  31. package/src/extension/crew-autocomplete.ts +131 -0
  32. package/src/extension/crew-cleanup.ts +168 -0
  33. package/src/extension/crew-input-router.ts +93 -0
  34. package/src/extension/crew-shortcuts.ts +87 -0
  35. package/src/extension/crew-vibes/cat-frames.ts +18 -0
  36. package/src/extension/crew-vibes/config.ts +195 -0
  37. package/src/extension/crew-vibes/figures.ts +101 -0
  38. package/src/extension/crew-vibes/font-detect.ts +71 -0
  39. package/src/extension/crew-vibes/footer.ts +292 -0
  40. package/src/extension/crew-vibes/index.ts +432 -0
  41. package/src/extension/crew-vibes/provider-usage.ts +396 -0
  42. package/src/extension/crew-vibes/render.ts +206 -0
  43. package/src/extension/crew-vibes/speed.ts +286 -0
  44. package/src/extension/cross-extension-rpc.ts +350 -0
  45. package/src/extension/help.ts +62 -0
  46. package/src/extension/import-index.ts +74 -0
  47. package/src/extension/knowledge-injection.ts +402 -0
  48. package/src/extension/management.ts +571 -0
  49. package/src/extension/message-renderers.ts +108 -0
  50. package/src/extension/notification-router.ts +152 -0
  51. package/src/extension/notification-sink.ts +54 -0
  52. package/src/extension/pi-api.ts +56 -0
  53. package/src/extension/plan-orchestrate.ts +302 -0
  54. package/src/extension/project-init.ts +170 -0
  55. package/src/extension/register.ts +113 -0
  56. package/src/extension/registration/artifact-cleanup.ts +20 -0
  57. package/src/extension/registration/command-registration.ts +58 -0
  58. package/src/extension/registration/command-utils.ts +58 -0
  59. package/src/extension/registration/commands.ts +1228 -0
  60. package/src/extension/registration/compaction-guard.ts +333 -0
  61. package/src/extension/registration/context-builder.ts +135 -0
  62. package/src/extension/registration/crash-recovery-cache.ts +54 -0
  63. package/src/extension/registration/foreground-run-controller.ts +238 -0
  64. package/src/extension/registration/hook-registration.ts +119 -0
  65. package/src/extension/registration/lazy-configurers.ts +124 -0
  66. package/src/extension/registration/lifecycle-handlers.ts +923 -0
  67. package/src/extension/registration/lifecycle.ts +259 -0
  68. package/src/extension/registration/observability.ts +322 -0
  69. package/src/extension/registration/registration-types.ts +158 -0
  70. package/src/extension/registration/runtime-cleanup.ts +230 -0
  71. package/src/extension/registration/subagent-helpers.ts +125 -0
  72. package/src/extension/registration/subagent-manager-setup.ts +330 -0
  73. package/src/extension/registration/subagent-tools.ts +456 -0
  74. package/src/extension/registration/team-tool.ts +225 -0
  75. package/src/extension/registration/tool-registration.ts +50 -0
  76. package/src/extension/registration/ui.ts +172 -0
  77. package/src/extension/registration/viewers.ts +121 -0
  78. package/src/extension/registration/wire-cross-extension.ts +37 -0
  79. package/src/extension/result-watcher.ts +139 -0
  80. package/src/extension/rpc-hmac.ts +256 -0
  81. package/src/extension/run-bundle-schema.ts +104 -0
  82. package/src/extension/run-export.ts +97 -0
  83. package/src/extension/run-import.ts +168 -0
  84. package/src/extension/run-index.ts +131 -0
  85. package/src/extension/run-maintenance.ts +190 -0
  86. package/src/extension/session-summary.ts +18 -0
  87. package/src/extension/team-manager-command.ts +153 -0
  88. package/src/extension/team-onboard.ts +180 -0
  89. package/src/extension/team-recommendation.ts +288 -0
  90. package/src/extension/team-tool/anchor.ts +172 -0
  91. package/src/extension/team-tool/api.ts +1244 -0
  92. package/src/extension/team-tool/auto-summarize.ts +142 -0
  93. package/src/extension/team-tool/cache-control.ts +19 -0
  94. package/src/extension/team-tool/cancel.ts +337 -0
  95. package/src/extension/team-tool/chain-dispatch.ts +95 -0
  96. package/src/extension/team-tool/chain-executor.ts +379 -0
  97. package/src/extension/team-tool/config-patch.ts +50 -0
  98. package/src/extension/team-tool/context.ts +149 -0
  99. package/src/extension/team-tool/destructive-gate.ts +52 -0
  100. package/src/extension/team-tool/dispatch/automate.ts +80 -0
  101. package/src/extension/team-tool/dispatch/control.ts +42 -0
  102. package/src/extension/team-tool/dispatch/index.ts +95 -0
  103. package/src/extension/team-tool/dispatch/manage.ts +161 -0
  104. package/src/extension/team-tool/dispatch/run.ts +53 -0
  105. package/src/extension/team-tool/dispatch/status.ts +187 -0
  106. package/src/extension/team-tool/doctor.ts +431 -0
  107. package/src/extension/team-tool/explain.ts +282 -0
  108. package/src/extension/team-tool/failure-patterns.ts +118 -0
  109. package/src/extension/team-tool/goal-wrap.ts +330 -0
  110. package/src/extension/team-tool/goal.ts +556 -0
  111. package/src/extension/team-tool/handle-schedule.ts +332 -0
  112. package/src/extension/team-tool/handle-settings.ts +520 -0
  113. package/src/extension/team-tool/health-monitor.ts +481 -0
  114. package/src/extension/team-tool/inspect.ts +88 -0
  115. package/src/extension/team-tool/intent-policy.ts +45 -0
  116. package/src/extension/team-tool/lifecycle-actions.ts +615 -0
  117. package/src/extension/team-tool/orchestrate.ts +98 -0
  118. package/src/extension/team-tool/parallel-dispatch.ts +183 -0
  119. package/src/extension/team-tool/plan.ts +50 -0
  120. package/src/extension/team-tool/respond.ts +150 -0
  121. package/src/extension/team-tool/run-deadline.ts +66 -0
  122. package/src/extension/team-tool/run-not-found.ts +49 -0
  123. package/src/extension/team-tool/run.ts +1051 -0
  124. package/src/extension/team-tool/status.ts +260 -0
  125. package/src/extension/team-tool/workflow-manage.ts +261 -0
  126. package/src/extension/team-tool-types.ts +26 -0
  127. package/src/extension/team-tool.ts +750 -0
  128. package/src/extension/tool-result.ts +16 -0
  129. package/src/extension/validate-resources.ts +108 -0
  130. package/src/hooks/registry.ts +200 -0
  131. package/src/hooks/types.ts +69 -0
  132. package/src/i18n.ts +212 -0
  133. package/src/observability/correlation.ts +50 -0
  134. package/src/observability/event-bus.ts +86 -0
  135. package/src/observability/event-to-metric.ts +170 -0
  136. package/src/observability/exporters/adapter.ts +27 -0
  137. package/src/observability/exporters/otlp-exporter.ts +356 -0
  138. package/src/observability/exporters/prometheus-exporter.ts +54 -0
  139. package/src/observability/metric-registry.ts +100 -0
  140. package/src/observability/metric-retention.ts +64 -0
  141. package/src/observability/metric-sink.ts +99 -0
  142. package/src/observability/metrics-primitives.ts +219 -0
  143. package/src/plugins/plugin-define.ts +6 -0
  144. package/src/plugins/plugin-registry.ts +32 -0
  145. package/src/plugins/plugins/index.ts +3 -0
  146. package/src/plugins/plugins/nextjs.ts +19 -0
  147. package/src/plugins/plugins/vite.ts +10 -0
  148. package/src/plugins/plugins/vitest.ts +9 -0
  149. package/src/prompt/prompt-runtime.ts +380 -0
  150. package/src/runtime/adaptive-plan.ts +563 -0
  151. package/src/runtime/agent-control.ts +215 -0
  152. package/src/runtime/agent-memory.ts +81 -0
  153. package/src/runtime/agent-observability.ts +122 -0
  154. package/src/runtime/anchor-manager.ts +475 -0
  155. package/src/runtime/async-marker.ts +32 -0
  156. package/src/runtime/async-runner.ts +381 -0
  157. package/src/runtime/attention-events.ts +28 -0
  158. package/src/runtime/auto-summarize.ts +344 -0
  159. package/src/runtime/background-runner.ts +840 -0
  160. package/src/runtime/batch-barrier.ts +147 -0
  161. package/src/runtime/broker-issuer.ts +39 -0
  162. package/src/runtime/cancellation-token.ts +99 -0
  163. package/src/runtime/cancellation.ts +99 -0
  164. package/src/runtime/capability-inventory.ts +137 -0
  165. package/src/runtime/chain-parser.ts +237 -0
  166. package/src/runtime/chain-runner.ts +606 -0
  167. package/src/runtime/checkpoint.ts +291 -0
  168. package/src/runtime/child-pi-constants.ts +42 -0
  169. package/src/runtime/child-pi-kill.ts +180 -0
  170. package/src/runtime/child-pi-pool.ts +68 -0
  171. package/src/runtime/child-pi-spawn.ts +287 -0
  172. package/src/runtime/child-pi-steering.ts +128 -0
  173. package/src/runtime/child-pi-streams.ts +296 -0
  174. package/src/runtime/child-pi-transcript.ts +169 -0
  175. package/src/runtime/child-pi.ts +1105 -0
  176. package/src/runtime/coalesce-tasks.ts +268 -0
  177. package/src/runtime/code-summary.ts +292 -0
  178. package/src/runtime/command-trace.ts +105 -0
  179. package/src/runtime/compact-pipeline.ts +56 -0
  180. package/src/runtime/compact-stages/ansi-strip-stage.ts +25 -0
  181. package/src/runtime/compact-stages/blank-collapse-stage.ts +31 -0
  182. package/src/runtime/compact-stages/deduplicate-stage.ts +34 -0
  183. package/src/runtime/compact-stages/head-snap-stage.ts +57 -0
  184. package/src/runtime/compact-stages/index.ts +23 -0
  185. package/src/runtime/compact-stages/tail-capture-stage.ts +77 -0
  186. package/src/runtime/compact-stages/truncation-stage.ts +74 -0
  187. package/src/runtime/compaction-summary.ts +278 -0
  188. package/src/runtime/completion-guard.ts +207 -0
  189. package/src/runtime/concurrency.ts +58 -0
  190. package/src/runtime/crash-classification.ts +229 -0
  191. package/src/runtime/crash-recovery.ts +594 -0
  192. package/src/runtime/crew-agent-records.ts +595 -0
  193. package/src/runtime/crew-agent-runtime.ts +62 -0
  194. package/src/runtime/crew-broker-child.ts +88 -0
  195. package/src/runtime/crew-broker-client.ts +673 -0
  196. package/src/runtime/crew-broker-tokens.ts +159 -0
  197. package/src/runtime/crew-broker.ts +1304 -0
  198. package/src/runtime/crew-hooks.ts +227 -0
  199. package/src/runtime/cross-extension-rpc.ts +143 -0
  200. package/src/runtime/custom-tools/irc-tool.ts +282 -0
  201. package/src/runtime/custom-tools/submit-result-tool.ts +102 -0
  202. package/src/runtime/deadletter.ts +47 -0
  203. package/src/runtime/delivery-coordinator.ts +211 -0
  204. package/src/runtime/delta-conflict.ts +348 -0
  205. package/src/runtime/deterministic-ast.ts +161 -0
  206. package/src/runtime/diagnostic-export.ts +171 -0
  207. package/src/runtime/direct-run.ts +45 -0
  208. package/src/runtime/dwf-state-store.ts +102 -0
  209. package/src/runtime/dynamic-workflow-context.ts +1013 -0
  210. package/src/runtime/dynamic-workflow-runner.ts +325 -0
  211. package/src/runtime/effectiveness.ts +90 -0
  212. package/src/runtime/errors/crew-errors.ts +162 -0
  213. package/src/runtime/event-stream-bridge.ts +98 -0
  214. package/src/runtime/foreground-control.ts +193 -0
  215. package/src/runtime/foreground-watchdog.ts +132 -0
  216. package/src/runtime/global-worker-cap.ts +96 -0
  217. package/src/runtime/goal-achievement.ts +148 -0
  218. package/src/runtime/goal-evaluator.ts +365 -0
  219. package/src/runtime/goal-loop-runner.ts +825 -0
  220. package/src/runtime/goal-state-store.ts +219 -0
  221. package/src/runtime/green-contract.ts +55 -0
  222. package/src/runtime/group-join.ts +267 -0
  223. package/src/runtime/handoff-manager.ts +598 -0
  224. package/src/runtime/heartbeat-gradient.ts +36 -0
  225. package/src/runtime/heartbeat-watcher.ts +239 -0
  226. package/src/runtime/hidden-handoff.ts +407 -0
  227. package/src/runtime/important-line-classifier.ts +140 -0
  228. package/src/runtime/intercom-bridge.ts +187 -0
  229. package/src/runtime/iteration-hooks.ts +305 -0
  230. package/src/runtime/live-agent-control.ts +136 -0
  231. package/src/runtime/live-agent-manager.ts +704 -0
  232. package/src/runtime/live-control-realtime.ts +56 -0
  233. package/src/runtime/live-extension-bridge.ts +148 -0
  234. package/src/runtime/live-irc.ts +97 -0
  235. package/src/runtime/live-session-health.ts +108 -0
  236. package/src/runtime/live-session-runtime.ts +1146 -0
  237. package/src/runtime/loop-gates.ts +128 -0
  238. package/src/runtime/manifest-cache.ts +375 -0
  239. package/src/runtime/mcp-proxy.ts +105 -0
  240. package/src/runtime/metric-parser.ts +36 -0
  241. package/src/runtime/model-fallback.ts +409 -0
  242. package/src/runtime/model-resolver.ts +126 -0
  243. package/src/runtime/model-scope.ts +158 -0
  244. package/src/runtime/orphan-worker-registry.ts +465 -0
  245. package/src/runtime/output-validator.ts +202 -0
  246. package/src/runtime/overflow-recovery.ts +206 -0
  247. package/src/runtime/parallel-research.ts +68 -0
  248. package/src/runtime/parallel-utils.ts +160 -0
  249. package/src/runtime/parent-guard.ts +134 -0
  250. package/src/runtime/path-overlap.ts +150 -0
  251. package/src/runtime/peer-dep.ts +292 -0
  252. package/src/runtime/per-write-validator.ts +181 -0
  253. package/src/runtime/phase-progress.ts +217 -0
  254. package/src/runtime/phase-tracker.ts +385 -0
  255. package/src/runtime/pi-args.ts +655 -0
  256. package/src/runtime/pi-json-output.ts +170 -0
  257. package/src/runtime/pi-spawn.ts +273 -0
  258. package/src/runtime/pipeline-runner.ts +523 -0
  259. package/src/runtime/plan-templates.ts +201 -0
  260. package/src/runtime/policy-engine.ts +115 -0
  261. package/src/runtime/post-checks.ts +142 -0
  262. package/src/runtime/post-exit-stdio-guard.ts +109 -0
  263. package/src/runtime/process-lifecycle.ts +491 -0
  264. package/src/runtime/process-status.ts +154 -0
  265. package/src/runtime/progress-event-coalescer.ts +44 -0
  266. package/src/runtime/progress-tracker.ts +124 -0
  267. package/src/runtime/prose-compressor.ts +162 -0
  268. package/src/runtime/recovery-recipes.ts +203 -0
  269. package/src/runtime/replace.ts +570 -0
  270. package/src/runtime/resilient-edit.ts +153 -0
  271. package/src/runtime/result-extractor.ts +217 -0
  272. package/src/runtime/retry-executor.ts +109 -0
  273. package/src/runtime/retry-runner.ts +336 -0
  274. package/src/runtime/role-permission.ts +59 -0
  275. package/src/runtime/run-coalesced-task-group.ts +308 -0
  276. package/src/runtime/run-drift.ts +219 -0
  277. package/src/runtime/run-tracker.ts +116 -0
  278. package/src/runtime/run-worker.ts +78 -0
  279. package/src/runtime/runtime-policy.ts +29 -0
  280. package/src/runtime/runtime-resolver.ts +172 -0
  281. package/src/runtime/runtime-warmup.ts +160 -0
  282. package/src/runtime/scheduler.ts +353 -0
  283. package/src/runtime/semaphore.ts +141 -0
  284. package/src/runtime/sensitive-paths.ts +93 -0
  285. package/src/runtime/session-resources.ts +25 -0
  286. package/src/runtime/session-snapshot.ts +59 -0
  287. package/src/runtime/session-usage.ts +79 -0
  288. package/src/runtime/settings-store.ts +155 -0
  289. package/src/runtime/sidechain-output.ts +35 -0
  290. package/src/runtime/single-agent-compose.ts +84 -0
  291. package/src/runtime/skill-effectiveness.ts +524 -0
  292. package/src/runtime/skill-instructions.ts +394 -0
  293. package/src/runtime/stale-reconciler.ts +680 -0
  294. package/src/runtime/stream-preview.ts +184 -0
  295. package/src/runtime/streaming-output.ts +50 -0
  296. package/src/runtime/subagent-manager.ts +561 -0
  297. package/src/runtime/subprocess-tool-registry.ts +70 -0
  298. package/src/runtime/supervisor-contact.ts +64 -0
  299. package/src/runtime/task-display.ts +52 -0
  300. package/src/runtime/task-graph-scheduler.ts +227 -0
  301. package/src/runtime/task-graph.ts +290 -0
  302. package/src/runtime/task-health.ts +83 -0
  303. package/src/runtime/task-id.ts +161 -0
  304. package/src/runtime/task-output-context.ts +602 -0
  305. package/src/runtime/task-packet.ts +268 -0
  306. package/src/runtime/task-quality.ts +199 -0
  307. package/src/runtime/task-runner/capabilities.ts +78 -0
  308. package/src/runtime/task-runner/child-executor.ts +790 -0
  309. package/src/runtime/task-runner/context-retrieval.ts +163 -0
  310. package/src/runtime/task-runner/live-executor.ts +227 -0
  311. package/src/runtime/task-runner/output-splitter.ts +152 -0
  312. package/src/runtime/task-runner/post-execution.ts +480 -0
  313. package/src/runtime/task-runner/pre-execution.ts +365 -0
  314. package/src/runtime/task-runner/progress.ts +157 -0
  315. package/src/runtime/task-runner/prompt-builder.ts +278 -0
  316. package/src/runtime/task-runner/prompt-pipeline.ts +88 -0
  317. package/src/runtime/task-runner/result-utils.ts +16 -0
  318. package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
  319. package/src/runtime/task-runner/run-projection.ts +125 -0
  320. package/src/runtime/task-runner/scaffold-executor.ts +25 -0
  321. package/src/runtime/task-runner/state-helpers.ts +176 -0
  322. package/src/runtime/task-runner/tail-read.ts +34 -0
  323. package/src/runtime/task-runner.ts +216 -0
  324. package/src/runtime/team-runner-artifacts.ts +13 -0
  325. package/src/runtime/team-runner.ts +2396 -0
  326. package/src/runtime/tool-output-pruner.ts +333 -0
  327. package/src/runtime/tool-progress.ts +278 -0
  328. package/src/runtime/usage-tracker.ts +73 -0
  329. package/src/runtime/verification-gates.ts +579 -0
  330. package/src/runtime/verification-integrity.ts +108 -0
  331. package/src/runtime/verification-worktree.ts +186 -0
  332. package/src/runtime/worker-heartbeat.ts +25 -0
  333. package/src/runtime/worker-startup.ts +83 -0
  334. package/src/runtime/workflow-state.ts +195 -0
  335. package/src/runtime/workspace-lock.ts +443 -0
  336. package/src/runtime/workspace-tree.ts +312 -0
  337. package/src/runtime/yield-handler.ts +224 -0
  338. package/src/runtime/zombie-scanner.ts +298 -0
  339. package/src/schema/config-schema.ts +327 -0
  340. package/src/schema/team-tool-schema.ts +492 -0
  341. package/src/schema/validation-types.ts +159 -0
  342. package/src/skills/discover-skills.ts +203 -0
  343. package/src/skills/skill-templates.ts +456 -0
  344. package/src/skills/validate.ts +285 -0
  345. package/src/state/active-run-registry.ts +439 -0
  346. package/src/state/artifact-store.ts +176 -0
  347. package/src/state/atomic-write.ts +970 -0
  348. package/src/state/blob-store.ts +308 -0
  349. package/src/state/contracts.ts +160 -0
  350. package/src/state/crew-init.ts +269 -0
  351. package/src/state/decision-ledger.ts +372 -0
  352. package/src/state/event-log-rotation.ts +399 -0
  353. package/src/state/event-log.ts +1465 -0
  354. package/src/state/event-reconstructor.ts +229 -0
  355. package/src/state/gitignore-manager.ts +46 -0
  356. package/src/state/health-store.ts +79 -0
  357. package/src/state/hook-instinct-bridge.ts +94 -0
  358. package/src/state/hook-integrations.ts +51 -0
  359. package/src/state/instinct-store.ts +275 -0
  360. package/src/state/jsonl-writer.ts +107 -0
  361. package/src/state/locks.ts +562 -0
  362. package/src/state/mailbox.ts +916 -0
  363. package/src/state/observation-store.ts +176 -0
  364. package/src/state/run-cache.ts +193 -0
  365. package/src/state/run-graph.ts +183 -0
  366. package/src/state/run-metrics.ts +165 -0
  367. package/src/state/schedule.ts +166 -0
  368. package/src/state/session-state-map.ts +51 -0
  369. package/src/state/state-store.ts +973 -0
  370. package/src/state/task-claims.ts +61 -0
  371. package/src/state/tiered-eval.ts +480 -0
  372. package/src/state/types-eval.ts +58 -0
  373. package/src/state/types.ts +447 -0
  374. package/src/state/usage.ts +138 -0
  375. package/src/state/worker-atomic-writer.ts +198 -0
  376. package/src/subagents/async-entry.ts +1 -0
  377. package/src/subagents/index.ts +3 -0
  378. package/src/subagents/live/control.ts +1 -0
  379. package/src/subagents/live/manager.ts +1 -0
  380. package/src/subagents/live/realtime.ts +1 -0
  381. package/src/subagents/live/session-runtime.ts +1 -0
  382. package/src/subagents/manager.ts +1 -0
  383. package/src/subagents/spawn.ts +1 -0
  384. package/src/teams/discover-teams.ts +187 -0
  385. package/src/teams/team-config.ts +27 -0
  386. package/src/teams/team-serializer.ts +38 -0
  387. package/src/tools/safe-bash-extension.ts +54 -0
  388. package/src/tools/safe-bash.ts +505 -0
  389. package/src/types/diff.d.ts +18 -0
  390. package/src/types/new-api-types.ts +35 -0
  391. package/src/ui/agent-management-overlay.ts +160 -0
  392. package/src/ui/card-colors.ts +139 -0
  393. package/src/ui/crew-footer.ts +102 -0
  394. package/src/ui/crew-select-list.ts +112 -0
  395. package/src/ui/dashboard-panes/agents-pane.ts +164 -0
  396. package/src/ui/dashboard-panes/cancellation-pane.ts +66 -0
  397. package/src/ui/dashboard-panes/capability-pane.ts +77 -0
  398. package/src/ui/dashboard-panes/health-pane.ts +31 -0
  399. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -0
  400. package/src/ui/dashboard-panes/metrics-pane.ts +37 -0
  401. package/src/ui/dashboard-panes/progress-pane.ts +38 -0
  402. package/src/ui/dashboard-panes/transcript-pane.ts +10 -0
  403. package/src/ui/deploy-bundled-themes.ts +71 -0
  404. package/src/ui/dwf-phase-display.ts +151 -0
  405. package/src/ui/dynamic-border.ts +35 -0
  406. package/src/ui/format-helpers.ts +31 -0
  407. package/src/ui/heartbeat-aggregator.ts +74 -0
  408. package/src/ui/key-utils.ts +42 -0
  409. package/src/ui/keybinding-map.ts +248 -0
  410. package/src/ui/layout-primitives.ts +106 -0
  411. package/src/ui/live-conversation-overlay.ts +183 -0
  412. package/src/ui/live-duration.ts +55 -0
  413. package/src/ui/live-run-sidebar.ts +293 -0
  414. package/src/ui/loaders.ts +6 -0
  415. package/src/ui/mascot.ts +449 -0
  416. package/src/ui/overlays/agent-picker-overlay.ts +66 -0
  417. package/src/ui/overlays/confirm-overlay.ts +60 -0
  418. package/src/ui/overlays/help-overlay.ts +177 -0
  419. package/src/ui/overlays/mailbox-compose-overlay.ts +181 -0
  420. package/src/ui/overlays/mailbox-compose-preview.ts +78 -0
  421. package/src/ui/overlays/mailbox-detail-overlay.ts +155 -0
  422. package/src/ui/pi-ui-compat.ts +68 -0
  423. package/src/ui/powerbar-publisher.ts +459 -0
  424. package/src/ui/render-coalescer.ts +101 -0
  425. package/src/ui/render-diff.ts +160 -0
  426. package/src/ui/render-scheduler.ts +278 -0
  427. package/src/ui/run-action-dispatcher.ts +182 -0
  428. package/src/ui/run-dashboard.ts +910 -0
  429. package/src/ui/run-event-bus.ts +381 -0
  430. package/src/ui/run-snapshot-cache.ts +1057 -0
  431. package/src/ui/settings-overlay.ts +1067 -0
  432. package/src/ui/shared-overlay-scheduler.ts +96 -0
  433. package/src/ui/snapshot-types.ts +90 -0
  434. package/src/ui/spinner.ts +17 -0
  435. package/src/ui/status-colors.ts +143 -0
  436. package/src/ui/syntax-highlight.ts +136 -0
  437. package/src/ui/terminal-status.ts +269 -0
  438. package/src/ui/theme-adapter.ts +271 -0
  439. package/src/ui/theme-discovery.ts +199 -0
  440. package/src/ui/tool-progress-formatter.ts +93 -0
  441. package/src/ui/tool-renderers/brief-mode.ts +225 -0
  442. package/src/ui/tool-renderers/index.ts +726 -0
  443. package/src/ui/transcript-cache.ts +128 -0
  444. package/src/ui/transcript-entries.ts +256 -0
  445. package/src/ui/transcript-viewer.ts +424 -0
  446. package/src/ui/widget/index.ts +418 -0
  447. package/src/ui/widget/widget-formatters.ts +182 -0
  448. package/src/ui/widget/widget-model.ts +110 -0
  449. package/src/ui/widget/widget-renderer.ts +182 -0
  450. package/src/ui/widget/widget-types.ts +36 -0
  451. package/src/utils/bm25-search.ts +235 -0
  452. package/src/utils/completion-dedupe.ts +63 -0
  453. package/src/utils/conflict-detect.ts +668 -0
  454. package/src/utils/env-allowlist.ts +30 -0
  455. package/src/utils/env-filter.ts +155 -0
  456. package/src/utils/file-coalescer.ts +98 -0
  457. package/src/utils/fingerprint.ts +180 -0
  458. package/src/utils/frontmatter.ts +70 -0
  459. package/src/utils/fs-watch.ts +37 -0
  460. package/src/utils/gh-protocol.ts +556 -0
  461. package/src/utils/git.ts +260 -0
  462. package/src/utils/guards.ts +107 -0
  463. package/src/utils/ids.ts +24 -0
  464. package/src/utils/incremental-reader.ts +220 -0
  465. package/src/utils/internal-error.ts +10 -0
  466. package/src/utils/names.ts +36 -0
  467. package/src/utils/ndjson.ts +115 -0
  468. package/src/utils/paths.ts +227 -0
  469. package/src/utils/project-detector.ts +160 -0
  470. package/src/utils/redaction.ts +370 -0
  471. package/src/utils/resolve-shell.ts +36 -0
  472. package/src/utils/run-watcher-registry.ts +152 -0
  473. package/src/utils/safe-paths.ts +393 -0
  474. package/src/utils/scan-cache.ts +144 -0
  475. package/src/utils/session-utils.ts +110 -0
  476. package/src/utils/sleep.ts +54 -0
  477. package/src/utils/socket-path.ts +164 -0
  478. package/src/utils/sse-parser.ts +131 -0
  479. package/src/utils/task-name-generator.ts +337 -0
  480. package/src/utils/timings.ts +33 -0
  481. package/src/utils/token-counter.ts +200 -0
  482. package/src/utils/visual.ts +207 -0
  483. package/src/workflows/cost-estimator.ts +34 -0
  484. package/src/workflows/discover-workflows.ts +308 -0
  485. package/src/workflows/intermediate-store.ts +166 -0
  486. package/src/workflows/preflight-validator.ts +168 -0
  487. package/src/workflows/topology-analyzer.ts +203 -0
  488. package/src/workflows/validate-workflow.ts +50 -0
  489. package/src/workflows/workflow-config.ts +75 -0
  490. package/src/workflows/workflow-serializer.ts +32 -0
  491. package/src/worktree/branch-freshness.ts +112 -0
  492. package/src/worktree/cleanup.ts +341 -0
  493. package/src/worktree/worktree-manager.ts +1204 -0
@@ -0,0 +1,381 @@
1
+ import type { TeamEvent } from "../state/event-log.ts";
2
+ import { readEventsCursor } from "../state/event-log.ts";
3
+ import type { RenderSchedulerEventBus } from "./render-scheduler.ts";
4
+
5
+ export type RunEventType =
6
+ | "task_started"
7
+ | "task_completed"
8
+ | "task_failed"
9
+ | "task_cancelled"
10
+ | "worker_status"
11
+ | "mailbox_updated"
12
+ | "effectiveness_changed"
13
+ | "run_started"
14
+ | "run_completed"
15
+ | "run_blocked"
16
+ | "run_cancelled"
17
+ | "run.cache_invalidated";
18
+
19
+ /** Typed channel names for category-based event subscription. */
20
+ export type EventChannel = "worker:progress" | "worker:lifecycle" | "worker:stream" | "run:state" | "ui:invalidate";
21
+
22
+ /** Sets used by classifyEventChannel for O(1) lookup. */
23
+ const WORKER_PROGRESS_TYPES = new Set(["tool_execution_start", "tool_result", "agent_progress", "worker_status"]);
24
+ const WORKER_LIFECYCLE_TYPES = new Set([
25
+ "task.started",
26
+ "task.completed",
27
+ "task.failed",
28
+ "task.needs_attention",
29
+ "task_started",
30
+ "task_completed",
31
+ "task_failed",
32
+ "task_cancelled",
33
+ "run.started",
34
+ "run.completed",
35
+ "run.cancelled",
36
+ "run.failed",
37
+ "run_started",
38
+ "run_completed",
39
+ "run_cancelled",
40
+ "run_blocked",
41
+ ]);
42
+ const WORKER_STREAM_TYPES = new Set(["stdout_chunk", "stderr_chunk", "stream"]);
43
+ const RUN_STATE_TYPES = new Set(["manifest.saved", "task.claimed", "task.unclaimed", "mailbox_updated"]);
44
+ const UI_INVALIDATE_TYPES = new Set(["effectiveness_changed", "snapshot_stale", "run.cache_invalidated"]);
45
+
46
+ /** Classify an event type string into a typed channel. */
47
+ export function classifyEventChannel(type: string): EventChannel {
48
+ if (WORKER_PROGRESS_TYPES.has(type)) return "worker:progress";
49
+ if (WORKER_LIFECYCLE_TYPES.has(type)) return "worker:lifecycle";
50
+ if (WORKER_STREAM_TYPES.has(type)) return "worker:stream";
51
+ if (RUN_STATE_TYPES.has(type)) return "run:state";
52
+ if (UI_INVALIDATE_TYPES.has(type)) return "ui:invalidate";
53
+ return "worker:progress"; // default fallback
54
+ }
55
+
56
+ export interface RunEventPayload {
57
+ type: RunEventType;
58
+ runId: string;
59
+ taskId?: string;
60
+ timestamp?: string;
61
+ data?: unknown;
62
+ channel?: EventChannel;
63
+ /**
64
+ * L1: monotonic sequence from the durable event log
65
+ * (`TeamEvent.metadata.seq`). Present on events that originated from a
66
+ * logged TeamEvent (via emitFromTeamEvent). Absent on transient live-only
67
+ * events (e.g. worker_status from the stream bridge) that are never
68
+ * persisted and therefore cannot be replayed or deduped.
69
+ *
70
+ * Used by onWithReplay() to dedup: a live event with seq <= the last seq
71
+ * replayed to a subscriber is suppressed (it was already delivered from
72
+ * the durable log).
73
+ */
74
+ seq?: number;
75
+ }
76
+
77
+ export type RunEventCallback = (event: RunEventPayload) => void;
78
+
79
+ class RunEventBus {
80
+ #listeners = new Map<string, Set<RunEventCallback>>();
81
+ #globalListeners = new Set<RunEventCallback>();
82
+ #channelListeners = new Map<EventChannel, Set<RunEventCallback>>();
83
+ #channelRunListeners = new Map<string, Map<EventChannel, Set<RunEventCallback>>>();
84
+ // 1.10 (FIND-13): microtask-batched listener fan-out. Events emitted in
85
+ // the same synchronous tick are coalesced into a single microtask flush
86
+ // instead of one synchronous fan-out per emit. Reduces listener dispatch
87
+ // overhead when many events arrive back-to-back (e.g. from a single
88
+ // appendEvent chain that emits several derived events).
89
+ #emitQueue: RunEventPayload[] = [];
90
+ #flushScheduled = false;
91
+ #disposed = false;
92
+
93
+ on(runId: string, callback: RunEventCallback): () => void {
94
+ const listeners = this.#listeners.get(runId) ?? new Set();
95
+ listeners.add(callback);
96
+ this.#listeners.set(runId, listeners);
97
+ return () => {
98
+ listeners.delete(callback);
99
+ if (listeners.size === 0) this.#listeners.delete(runId);
100
+ };
101
+ }
102
+
103
+ onAny(callback: RunEventCallback): () => void {
104
+ this.#globalListeners.add(callback);
105
+ return () => {
106
+ this.#globalListeners.delete(callback);
107
+ };
108
+ }
109
+
110
+ off(runId: string, callback: RunEventCallback): void {
111
+ const listeners = this.#listeners.get(runId);
112
+ if (listeners) {
113
+ listeners.delete(callback);
114
+ if (listeners.size === 0) this.#listeners.delete(runId);
115
+ }
116
+ }
117
+
118
+ /** Subscribe to all events on a specific channel. */
119
+ onChannel(channel: EventChannel, callback: RunEventCallback): () => void {
120
+ const listeners = this.#channelListeners.get(channel) ?? new Set();
121
+ listeners.add(callback);
122
+ this.#channelListeners.set(channel, listeners);
123
+ return () => {
124
+ listeners.delete(callback);
125
+ if (listeners.size === 0) this.#channelListeners.delete(channel);
126
+ };
127
+ }
128
+
129
+ /** Subscribe to events on a specific channel for a given runId. */
130
+ onChannelForRun(channel: EventChannel, runId: string, callback: RunEventCallback): () => void {
131
+ const runKey = `${channel}::${runId}`;
132
+ const runMap = this.#channelRunListeners.get(runKey) ?? new Map();
133
+ const listeners = runMap.get(channel) ?? new Set();
134
+ listeners.add(callback);
135
+ runMap.set(channel, listeners);
136
+ this.#channelRunListeners.set(runKey, runMap);
137
+ return () => {
138
+ listeners.delete(callback);
139
+ if (listeners.size === 0) runMap.delete(channel);
140
+ if (runMap.size === 0) this.#channelRunListeners.delete(runKey);
141
+ };
142
+ }
143
+
144
+ /**
145
+ * L1: subscribe with a catch-up replay from the durable event log.
146
+ *
147
+ * Closes the transient-subscriber-absence gap: when an overlay/widget is
148
+ * disposed and recreated (toggle, reconnect), live events emitted in that
149
+ * window are lost as notification triggers. This method replays the
150
+ * missed TeamEvents from the durable JSONL log BEFORE attaching the live
151
+ * listener, then dedups so events delivered both ways fire exactly once.
152
+ *
153
+ * Unlike deer-flow's 256-event RAM ring buffer (lost on crash), this uses
154
+ * pi-crew's existing durable `readEventsCursor` — O(new bytes) via
155
+ * byte-offset incremental reads, monotonic seq, tail-capped. Strictly
156
+ * better: survives crashes, bounded memory.
157
+ *
158
+ * @param runId Run to subscribe to (live listener scope).
159
+ * @param eventsPath Path to the run's events JSONL (manifest.eventsPath).
160
+ * @param lastSeenSeq Last seq the caller processed; events with seq > this
161
+ * are replayed. Pass 0 to replay everything.
162
+ * @param callback Receives both replayed and live events. Replayed
163
+ * events are delivered directly (NOT via emit, so no
164
+ * fan-out to other subscribers).
165
+ * @returns unsubscribe handle (detaches the live listener).
166
+ */
167
+ onWithReplay(runId: string, eventsPath: string, lastSeenSeq: number, callback: RunEventCallback): () => void {
168
+ // Phase 1: replay missed events from the durable log directly to this
169
+ // callback. Bounded by limit; readEventsCursor already tail-caps.
170
+ let maxReplayedSeq = lastSeenSeq;
171
+ try {
172
+ const cursor = readEventsCursor(eventsPath, {
173
+ sinceSeq: lastSeenSeq,
174
+ limit: 1000,
175
+ });
176
+ for (const teamEvent of cursor.events) {
177
+ const type = teamEventToRunEventType(teamEvent);
178
+ if (!type) continue; // not all TeamEvents map to a RunEventType
179
+ const payload: RunEventPayload = {
180
+ type,
181
+ runId: teamEvent.runId,
182
+ taskId: teamEvent.taskId,
183
+ timestamp: teamEvent.time,
184
+ data: teamEvent.data,
185
+ channel: classifyEventChannel(type),
186
+ seq: teamEvent.metadata?.seq,
187
+ };
188
+ try {
189
+ callback(payload);
190
+ } catch {
191
+ /* subscriber errors are non-fatal */
192
+ }
193
+ if (typeof teamEvent.metadata?.seq === "number") {
194
+ maxReplayedSeq = Math.max(maxReplayedSeq, teamEvent.metadata.seq);
195
+ }
196
+ }
197
+ } catch {
198
+ // Log read failures are non-fatal — fall through to live-only
199
+ // subscription. The durable log may not exist yet for a brand-new run.
200
+ }
201
+
202
+ // Phase 2: attach the live listener with dedup. A live event whose seq
203
+ // was already replayed (seq <= maxReplayedSeq) is suppressed. Events
204
+ // without a seq (transient live-only, e.g. worker_status) always
205
+ // deliver — they are never persisted and thus never replayed.
206
+ const liveCallback: RunEventCallback = (event) => {
207
+ if (typeof event.seq === "number" && event.seq <= maxReplayedSeq) return;
208
+ callback(event);
209
+ };
210
+ return this.on(runId, liveCallback);
211
+ }
212
+
213
+ emit(event: RunEventPayload): void {
214
+ if (this.#disposed) return;
215
+ // Auto-classify channel if not already set.
216
+ // M2: Use local variable for routing, but also set on event
217
+ // for subscriber API contract (listeners read event.channel).
218
+ if (!event.channel) {
219
+ (event as { channel?: EventChannel }).channel = classifyEventChannel(event.type);
220
+ }
221
+ // 1.10 (FIND-13): queue and defer fan-out to a microtask so multiple
222
+ // emits in the same synchronous tick collapse into one listener-pass
223
+ // each (one per emit, all in the same microtask).
224
+ this.#emitQueue.push(event);
225
+ if (this.#flushScheduled) return;
226
+ this.#flushScheduled = true;
227
+ queueMicrotask(() => {
228
+ this.#flushScheduled = false;
229
+ if (this.#disposed) {
230
+ this.#emitQueue.length = 0;
231
+ return;
232
+ }
233
+ // Swap the queue before dispatching so a listener that re-emits
234
+ // enqueues into a fresh queue (scheduled by its own emit() call)
235
+ // instead of stomping the current iteration.
236
+ const queue = this.#emitQueue;
237
+ this.#emitQueue = [];
238
+ for (const queued of queue) this.#dispatchSync(queued);
239
+ });
240
+ }
241
+
242
+ /**
243
+ * Synchronous per-event listener fan-out. Called from the microtask flush
244
+ * scheduled by emit(); not part of the public API. Mirrors the original
245
+ * (pre-batching) emit body so a single emit still visits every listener
246
+ * registered for the event's runId / channel / global set.
247
+ */
248
+ #dispatchSync(event: RunEventPayload): void {
249
+ const channel = event.channel!;
250
+
251
+ // Existing: runId-specific listeners
252
+ const listeners = this.#listeners.get(event.runId);
253
+ if (listeners) {
254
+ for (const cb of listeners) {
255
+ try {
256
+ cb(event);
257
+ } catch {
258
+ /* subscriber errors are non-fatal */
259
+ }
260
+ }
261
+ }
262
+
263
+ // Existing: global listeners
264
+ for (const cb of this.#globalListeners) {
265
+ try {
266
+ cb(event);
267
+ } catch {
268
+ /* subscriber errors are non-fatal */
269
+ }
270
+ }
271
+
272
+ // New: channel listeners
273
+ const channelListeners = this.#channelListeners.get(channel);
274
+ if (channelListeners) {
275
+ for (const cb of channelListeners) {
276
+ try {
277
+ cb(event);
278
+ } catch {
279
+ /* subscriber errors are non-fatal */
280
+ }
281
+ }
282
+ }
283
+
284
+ // New: channel+runId listeners
285
+ const runKey = `${channel}::${event.runId}`;
286
+ const runMap = this.#channelRunListeners.get(runKey);
287
+ if (runMap) {
288
+ const runChannelListeners = runMap.get(channel);
289
+ if (runChannelListeners) {
290
+ for (const cb of runChannelListeners) {
291
+ try {
292
+ cb(event);
293
+ } catch {
294
+ /* subscriber errors are non-fatal */
295
+ }
296
+ }
297
+ }
298
+ }
299
+ }
300
+
301
+ /** Dispose all subscriptions including channel-based ones. */
302
+ dispose(): void {
303
+ this.#disposed = true;
304
+ this.#listeners.clear();
305
+ this.#globalListeners.clear();
306
+ this.#channelListeners.clear();
307
+ this.#channelRunListeners.clear();
308
+ this.#emitQueue.length = 0;
309
+ this.#flushScheduled = false;
310
+ }
311
+
312
+ listenerCount(runId?: string): number {
313
+ if (runId) return this.#listeners.get(runId)?.size ?? 0;
314
+ let total = this.#globalListeners.size;
315
+ for (const set of this.#listeners.values()) total += set.size;
316
+ for (const set of this.#channelListeners.values()) total += set.size;
317
+ for (const runMap of this.#channelRunListeners.values()) {
318
+ for (const set of runMap.values()) total += set.size;
319
+ }
320
+ return total;
321
+ }
322
+ }
323
+
324
+ /** Global singleton run event bus for UI-first event delivery. */
325
+ export const runEventBus = new RunEventBus();
326
+
327
+ /**
328
+ * 1.10 (UI-P1-1): adapt `runEventBus.onChannel` to the
329
+ * `RenderSchedulerEventBus` interface so overlays can route their
330
+ * `run:state` / `worker:lifecycle` / `ui:invalidate` subscriptions through
331
+ * a `RenderScheduler` (debounce + fallback + per-runId coalescing) instead of
332
+ * calling `runEventBus.onChannel(...)` directly three times. Without the
333
+ * scheduler, a single event triggers up to 9 callbacks across the 3 overlays
334
+ * (dashboard + sidebar + widget) and bursts into ~150 invalidate+requestRender
335
+ * /sec under load.
336
+ *
337
+ * Returns a fresh adapter whose `on(event, handler)` is a thin shim over
338
+ * `runEventBus.onChannel`. The channels list is closed-over so we can do a
339
+ * defensive membership check without re-reading the channel set on every
340
+ * subscription.
341
+ */
342
+ export function runEventBusAsRenderScheduler(channels: readonly EventChannel[]): RenderSchedulerEventBus {
343
+ const allowed = new Set<EventChannel>(channels);
344
+ return {
345
+ on: (event: string, handler: (payload: unknown) => void): (() => void) | void => {
346
+ if (!allowed.has(event as EventChannel)) return undefined;
347
+ return runEventBus.onChannel(event as EventChannel, handler);
348
+ },
349
+ };
350
+ }
351
+
352
+ /** Derive a RunEventType from a TeamEvent. */
353
+ export function teamEventToRunEventType(event: TeamEvent): RunEventType | undefined {
354
+ const type = event.type;
355
+ if (type === "task.started") return "task_started";
356
+ if (type === "task.completed") return "task_completed";
357
+ if (type === "task.failed") return "task_failed";
358
+ if (type === "run.completed") return "run_completed";
359
+ if (type === "run.blocked") return "run_blocked";
360
+ if (type === "run.running") return "run_started";
361
+ if (type === "run.cancelled") return "run_cancelled";
362
+ if (type === "task.progress" || type === "mailbox.message_queued" || type === "mailbox.message_delivered") return "mailbox_updated";
363
+ if (type === "run.effectiveness" || type === "task.attention") return "effectiveness_changed";
364
+ return undefined;
365
+ }
366
+
367
+ /** Emit a run event from a TeamEvent. */
368
+ export function emitFromTeamEvent(event: TeamEvent): void {
369
+ const type = teamEventToRunEventType(event);
370
+ if (!type) return;
371
+ runEventBus.emit({
372
+ type,
373
+ runId: event.runId,
374
+ taskId: event.taskId,
375
+ timestamp: event.time,
376
+ data: event.data,
377
+ // L1: stamp the durable-log seq so onWithReplay() can dedup live
378
+ // delivery against replayed events.
379
+ seq: event.metadata?.seq,
380
+ });
381
+ }