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,447 @@
1
+ import type { CrashClass } from "../runtime/crash-classification.ts";
2
+ import type { CrewAgentProgress } from "../runtime/crew-agent-runtime.ts";
3
+ import type { WorkerHeartbeatState } from "../runtime/worker-heartbeat.ts";
4
+ import type { TeamRunStatus, TeamTaskStatus } from "./contracts.ts";
5
+ import type { CoherenceMark, RolloutEntry } from "./decision-ledger.ts";
6
+ import type { TaskClaimState } from "./task-claims.ts";
7
+
8
+ export type { TeamRunStatus, TeamTaskStatus } from "./contracts.ts";
9
+ export type { CoherenceMark, CrewAgentProgress, RolloutEntry };
10
+
11
+ export interface ArtifactDescriptor {
12
+ kind: "plan" | "prompt" | "result" | "summary" | "log" | "diff" | "patch" | "progress" | "notepad" | "metadata";
13
+ path: string;
14
+ createdAt: string;
15
+ producer: string;
16
+ sizeBytes?: number;
17
+ contentHash?: string;
18
+ retention: "run" | "project" | "temporary";
19
+ expiresAt?: string;
20
+ }
21
+
22
+ export type TaskScope = "workspace" | "module" | "single_file" | "custom";
23
+ export type GreenLevel = "none" | "targeted" | "package" | "workspace" | "merge_ready";
24
+
25
+ export interface VerificationCommandResult {
26
+ cmd: string;
27
+ status: "passed" | "failed" | "not_run";
28
+ exitCode?: number | null;
29
+ durationMs?: number;
30
+ outputArtifact?: ArtifactDescriptor;
31
+ }
32
+
33
+ export interface VerificationContract {
34
+ requiredGreenLevel: GreenLevel;
35
+ commands: string[];
36
+ allowManualEvidence: boolean;
37
+ }
38
+
39
+ export interface VerificationEvidence {
40
+ requiredGreenLevel: GreenLevel;
41
+ observedGreenLevel: GreenLevel;
42
+ satisfied: boolean;
43
+ commands: VerificationCommandResult[];
44
+ notes?: string;
45
+ }
46
+
47
+ export interface TaskOutputSchema {
48
+ /** Output format expected from the worker */
49
+ format: "json" | "markdown" | "text";
50
+ /** JTD or JSON Schema for validating JSON output (only when format="json") */
51
+ schema?: Record<string, unknown>;
52
+ /** Human-readable description of expected output */
53
+ description?: string;
54
+ /** Example of valid output (for prompt guidance) */
55
+ example?: string;
56
+ }
57
+
58
+ export interface TaskPacket {
59
+ objective: string;
60
+ scope: TaskScope;
61
+ scopePath?: string;
62
+ repo: string;
63
+ worktree?: string;
64
+ branchPolicy: string;
65
+ acceptanceTests: string[];
66
+ commitPolicy: string;
67
+ reportingContract: string;
68
+ escalationPolicy: string;
69
+ constraints: string[];
70
+ expectedArtifacts: string[];
71
+ verification: VerificationContract;
72
+ outputSchema?: TaskOutputSchema;
73
+ }
74
+
75
+ export type PolicyDecisionAction = "retry" | "reassign" | "escalate" | "block" | "notify" | "cleanup" | "closeout" | "fail";
76
+ export type PolicyDecisionReason =
77
+ | "task_failed"
78
+ | "worker_stale"
79
+ | "green_unsatisfied"
80
+ | "limit_exceeded"
81
+ | "run_complete"
82
+ | "mailbox_timeout"
83
+ | "review_rejected"
84
+ | "branch_stale"
85
+ | "scope_mismatch"
86
+ | "ineffective_worker";
87
+
88
+ export interface PolicyDecision {
89
+ action: PolicyDecisionAction;
90
+ reason: PolicyDecisionReason;
91
+ message: string;
92
+ taskId?: string;
93
+ createdAt: string;
94
+ }
95
+
96
+ export interface TaskGraphNode {
97
+ taskId: string;
98
+ parentId?: string;
99
+ children: string[];
100
+ dependencies: string[];
101
+ queue: "ready" | "blocked" | "running" | "done";
102
+ sessionForkFrom?: string;
103
+ }
104
+
105
+ export interface AsyncRunState {
106
+ pid?: number;
107
+ logPath: string;
108
+ spawnedAt: string;
109
+ }
110
+
111
+ export interface RuntimeResolutionState {
112
+ kind: "scaffold" | "child-process" | "live-session";
113
+ requestedMode: "auto" | "scaffold" | "child-process" | "live-session";
114
+ safety: "trusted" | "explicit_dry_run" | "blocked";
115
+ available: boolean;
116
+ fallback?: "scaffold" | "child-process" | "live-session";
117
+ reason?: string;
118
+ resolvedAt: string;
119
+ }
120
+
121
+ export interface WorkerExitStatus {
122
+ exitCode: number | null;
123
+ cancelled: boolean;
124
+ timedOut: boolean;
125
+ killed: boolean;
126
+ signal?: string;
127
+ cleanupErrors: string[];
128
+ finalDrainMs: number;
129
+ /** Categorical classification of the exit (P0 crash taxonomy). Optional
130
+ * because it is populated by child-pi.ts at settle time; older/synthetic
131
+ * exit statuses may omit it. */
132
+ crashClass?: CrashClass;
133
+ /** Phase-0 diagnostic (HB-003a): final-drain race state for the exit-null
134
+ * disableTools bug. Optional + read-only — absent when no drain timer was
135
+ * ever armed. Phase 1 will use `finalDrainArmed` to decide whether a
136
+ * signal-death (exitCode=null) should be treated as a forced final drain. */
137
+ finalDrainArmed?: boolean;
138
+ forcedFinalDrain?: boolean;
139
+ finalDrainFiredMonotonicMs?: number;
140
+ }
141
+
142
+ export interface OperationTerminalEvidence {
143
+ operation: "worker" | "tool" | "model";
144
+ status: "cancelled" | "failed" | "completed";
145
+ startedAt?: string;
146
+ finishedAt: string;
147
+ attemptId?: string;
148
+ reason?: {
149
+ code: string;
150
+ message: string;
151
+ };
152
+ exitStatus?: WorkerExitStatus;
153
+ }
154
+
155
+ export interface PlanApprovalState {
156
+ required: boolean;
157
+ status: "pending" | "approved" | "cancelled";
158
+ requestedAt: string;
159
+ updatedAt: string;
160
+ approvedAt?: string;
161
+ cancelledAt?: string;
162
+ planTaskId?: string;
163
+ planArtifactPath?: string;
164
+ }
165
+
166
+ export type CrewActivityState = "active" | "active_long_running" | "needs_attention" | "stale";
167
+ export type CrewAttentionReason = "idle" | "tool_failures" | "completion_guard" | "heartbeat_stale" | "plan_approval_pending";
168
+
169
+ export interface CrewAttentionEventData {
170
+ activityState: CrewActivityState;
171
+ reason: CrewAttentionReason;
172
+ elapsedMs?: number;
173
+ taskId?: string;
174
+ agentName?: string;
175
+ suggestedAction?: string;
176
+ observedTools?: string[];
177
+ }
178
+
179
+ /**
180
+ * S-01: schemaVersion sentinel for the run manifest. Increment on breaking
181
+ * state changes; add migration logic in state-store load paths. Loaded
182
+ * manifests whose schemaVersion differs emit a console.warn (no throw).
183
+ */
184
+ export const CURRENT_SCHEMA_VERSION = 1 as const;
185
+
186
+ export interface TeamRunManifest {
187
+ schemaVersion: typeof CURRENT_SCHEMA_VERSION;
188
+ runId: string;
189
+ /** pi session ID aligned with run ID for cross-referencing (e.g., "crew-team20260528") */
190
+ sessionId?: string;
191
+ team: string;
192
+ workflow?: string;
193
+ goal: string;
194
+ status: TeamRunStatus;
195
+ workspaceMode: "single" | "worktree";
196
+ createdAt: string;
197
+ updatedAt: string;
198
+ cwd: string;
199
+ stateRoot: string;
200
+ artifactsRoot: string;
201
+ tasksPath: string;
202
+ eventsPath: string;
203
+ artifacts: ArtifactDescriptor[];
204
+ async?: AsyncRunState;
205
+ planApproval?: PlanApprovalState;
206
+ /** Pi session that created the run, when available. Used to prevent cross-session destructive actions. */
207
+ ownerSessionId?: string;
208
+ /** pi-crew skill override selected when the run was created. false disables injected skill instructions. */
209
+ skillOverride?: string[] | false;
210
+ /** Resolved runtime/safety mode used for execution. Optional for backward compatibility with older manifests. */
211
+ runtimeResolution?: RuntimeResolutionState;
212
+ /** Effective run config snapshot used by async background workers. Optional for backward compatibility. */
213
+ runConfig?: unknown;
214
+ /** Background dispatch discriminator. Default "team-run" runs executeTeamRun; "goal-loop" / "dynamic-workflow" dispatch to their respective runners. Absent = "team-run" for backward compatibility. */
215
+ runKind?: "team-run" | "goal-loop" | "dynamic-workflow";
216
+ /** round-14 P1-5: typed workflow arguments accessible in .dwf.ts scripts via ctx.args<T>(). Any JSON value; default {} when unset. */
217
+ args?: unknown;
218
+ /** Per-run token budget snapshot. budgetTotal is the cap; budgetWarning/budgetAbort are fractions in [0,1] at which the team-runner emits run.budget_warning / run.budget_abort. budgetUnlimited=true opts out of enforcement. Optional for backward compat. */
219
+ budgetTotal?: number;
220
+ budgetWarning?: number;
221
+ budgetAbort?: number;
222
+ budgetUnlimited?: boolean;
223
+ summary?: string;
224
+ policyDecisions?: PolicyDecision[];
225
+ /** #2 (assessment): goal-achievement verdict — kills the silent false-green. */
226
+ goalAchieved?: boolean | "unknown";
227
+ goalAchievementNote?: string;
228
+ }
229
+
230
+ export interface UsageState {
231
+ input?: number;
232
+ output?: number;
233
+ cacheRead?: number;
234
+ cacheWrite?: number;
235
+ cost?: number;
236
+ turns?: number;
237
+ }
238
+
239
+ // ───────────────────────────────────────────────────────────────────────────
240
+ // Goal loop types (P0/P1 — autonomous goal loop, Claude-Code-style /goal).
241
+ // Spec: research-findings/goal-workflow/00-SPEC.md §2.3; plan 07-PLAN.md v3 §0b G2 + §0c.
242
+ // ───────────────────────────────────────────────────────────────────────────
243
+
244
+ /**
245
+ * Outer-state lifecycle of a goal loop. Inner per-turn state lives on each turn's TeamRunManifest.
246
+ *
247
+ * P1b (RFC v0.5 §P1b): `"stuck"` is NON-TERMINAL and RE-HINTABLE. Legal transitions:
248
+ * running → stuck (only by the background loop, after the oscillation detector fires)
249
+ * stuck → running (only by `goal resume`, atomically via GoalStore.compareAndSetStatus)
250
+ * stuck → cancelled (by the idle-timeout sweeper OR `goal stop`)
251
+ */
252
+ export type GoalLoopStatus = "running" | "paused" | "stuck" | "achieved" | "max_turns" | "budget_exceeded" | "blocked" | "cancelled";
253
+
254
+ /** One evaluation by the goal-judge model after a turn. */
255
+ export interface GoalVerdict {
256
+ turn: number;
257
+ achieved: boolean;
258
+ /** "achieved: all tests pass" | "not-achieved: 2/8 tests failing" | "BLOCKED: <reason>" (BLOCKED: prefix → status='blocked'). */
259
+ reason: string;
260
+ evidenceRefs?: string[];
261
+ evaluatorModel: string;
262
+ evaluatedAt: string;
263
+ }
264
+
265
+ /** Persisted at <crewRoot>/state/goals/<goalId>.json by GoalStore. Survives session restart. */
266
+ export interface GoalLoopState {
267
+ goalId: string;
268
+ ownerSessionId: string;
269
+ objective: string;
270
+ scope?: string;
271
+ /** Acceptance conditions as shell commands (exit 0 = pass). Reuses VerificationContract semantics. */
272
+ verification?: { commands: string[]; allowManualEvidence?: boolean };
273
+ state: GoalLoopStatus;
274
+ maxTurns: number;
275
+ turnsUsed: number;
276
+ budgetTotal?: number;
277
+ /** P1d (RFC v0.5 §P1d): when true, budget enforcement is skipped (explicit opt-out; audit-logged at start). */
278
+ budgetUnlimited?: boolean;
279
+ budgetWarning?: number;
280
+ budgetAbort?: number;
281
+ budgetUsed: number;
282
+ /**
283
+ * P1a (RFC v0.5 §P1a): bookend integrity snapshot of project-manifest files
284
+ * taken at goal start (only when verification.commands is declared). The
285
+ * goal-loop-runner re-hashes before (T_snap) and after (T_verify_done) each
286
+ * verification command to detect persistent manifest tampering. The literal
287
+ * `"none-text-only"` marks goals started in text-only verification mode
288
+ * (no objective oracle → no snapshot taken).
289
+ */
290
+ verificationIntegrity?: { snapshot: Record<string, string>; takenAt: string } | "none-text-only";
291
+ evaluatorModel: string;
292
+ workerModel?: string;
293
+ /** subagent_type / agent name for worker turns (default "executor"). */
294
+ workerAgent?: string;
295
+ team?: string;
296
+ cwd: string;
297
+ /** Feedback from turn N's verdict, prepended into turn N+1's manifest.goal (G1). */
298
+ nextTurnFeedback?: string;
299
+ /** The team-run of the current in-flight turn (for cancel/steer). */
300
+ currentRunId?: string;
301
+ verdicts: GoalVerdict[];
302
+ history: {
303
+ runId: string;
304
+ outcome: string;
305
+ learnedAt: string;
306
+ turn: number;
307
+ }[];
308
+ createdAt: string;
309
+ updatedAt: string;
310
+ /** Mirror of manifest.async for PID-liveness checks (cf. AsyncRunState). */
311
+ async?: { pid: number; logPath: string; spawnedAt: string };
312
+ }
313
+
314
+ export interface ModelAttemptState {
315
+ model: string;
316
+ success: boolean;
317
+ exitCode?: number | null;
318
+ error?: string;
319
+ }
320
+
321
+ export interface ModelRoutingState {
322
+ requested?: string;
323
+ resolved: string;
324
+ fallbackChain: string[];
325
+ reason?: string;
326
+ usedAttempt: number;
327
+ }
328
+
329
+ export interface TaskWorktreeState {
330
+ path: string;
331
+ branch: string;
332
+ reused: boolean;
333
+ }
334
+
335
+ export interface TaskCheckpointState {
336
+ phase: "started" | "child-spawned" | "child-stdout-final" | "artifact-written";
337
+ updatedAt: string;
338
+ childPid?: number;
339
+ }
340
+
341
+ export interface TaskAttemptState {
342
+ attemptId?: string;
343
+ startedAt: string;
344
+ endedAt?: string;
345
+ error?: string;
346
+ }
347
+
348
+ export interface TeamTaskState {
349
+ id: string;
350
+ runId: string;
351
+ stepId?: string;
352
+ role: string;
353
+ agent: string;
354
+ title: string;
355
+ displayName?: string;
356
+ status: TeamTaskStatus;
357
+ dependsOn: string[];
358
+ cwd: string;
359
+ worktree?: TaskWorktreeState;
360
+ promptArtifact?: ArtifactDescriptor;
361
+ resultArtifact?: ArtifactDescriptor;
362
+ logArtifact?: ArtifactDescriptor;
363
+ transcriptArtifact?: ArtifactDescriptor;
364
+ startedAt?: string;
365
+ finishedAt?: string;
366
+ exitCode?: number | null;
367
+ model?: string;
368
+ modelAttempts?: ModelAttemptState[];
369
+ modelRouting?: ModelRoutingState;
370
+ usage?: UsageState;
371
+ jsonEvents?: number;
372
+ agentProgress?: CrewAgentProgress;
373
+ error?: string;
374
+ claim?: TaskClaimState;
375
+ heartbeat?: WorkerHeartbeatState;
376
+ checkpoint?: TaskCheckpointState;
377
+ attempts?: TaskAttemptState[];
378
+ workerExitStatus?: WorkerExitStatus;
379
+ terminalEvidence?: OperationTerminalEvidence[];
380
+ taskPacket?: TaskPacket;
381
+ verification?: VerificationEvidence;
382
+ graph?: TaskGraphNode;
383
+ adaptive?: {
384
+ phase: string;
385
+ task: string;
386
+ };
387
+ policy?: {
388
+ retryCount?: number;
389
+ lastDecision?: PolicyDecision;
390
+ };
391
+ controlReservation?: ControlReservation;
392
+
393
+ /** Structured diagnostics per task (ASI pattern from pi-autoresearch). */
394
+ diagnostics?: Record<string, unknown>;
395
+
396
+ /** Segment counter for task retry isolation. Default 0 (first attempt). Incremented on retry. */
397
+ segment?: number;
398
+
399
+ /** Parsed metric key-values from worker output (CREW_METRIC lines). */
400
+ metrics?: Record<string, number>;
401
+
402
+ /** Lifetime token usage accumulated via message_end events. Survives compaction
403
+ * (session.stats reset on compaction, but this is an independent accumulator). */
404
+ lifetimeUsage?: { input: number; output: number; cacheWrite: number };
405
+
406
+ /** Steering messages queued before the task's session was ready.
407
+ * Delivered when the session initializes (mirrors pi-subagents3 pendingSteers pattern). */
408
+ pendingSteers?: string[];
409
+ }
410
+
411
+ export interface ControlReservation {
412
+ reservedAt: string;
413
+ controllerId: string;
414
+ acceptsControlEvents: boolean;
415
+ }
416
+
417
+ /**
418
+ * A task scheduled to fire on a cron expression, interval, or one-shot.
419
+ * Persisted at `<cwd>/.crew/state/schedules/<sessionId>.json`.
420
+ * Session-scoped: survives /resume, resets on /new.
421
+ */
422
+ export interface ScheduledTask {
423
+ id: string;
424
+ name: string;
425
+ description: string;
426
+ /** Raw schedule: cron expr | "+10m" | "5m" | ISO timestamp */
427
+ schedule: string;
428
+ scheduleType: "cron" | "interval" | "once";
429
+ intervalMs?: number;
430
+ /** Workflow/step to execute when the schedule fires */
431
+ workflowName: string;
432
+ stepId?: string;
433
+ /** Resolved at create time from workflow/step config */
434
+ agentName: string;
435
+ model?: string;
436
+ enabled: boolean;
437
+ createdAt: string;
438
+ lastRun?: string;
439
+ lastStatus?: "success" | "error" | "running";
440
+ nextRun?: string;
441
+ runCount: number;
442
+ }
443
+
444
+ export interface ScheduleStoreData {
445
+ version: 1;
446
+ jobs: ScheduledTask[];
447
+ }
@@ -0,0 +1,138 @@
1
+ import type { TeamTaskState, UsageState } from "./types.ts";
2
+
3
+ /**
4
+ * Lifetime usage — accumulated via message_end events, survives compaction.
5
+ * cacheRead is excluded because each turn's cacheRead is the cumulative cached
6
+ * prefix re-read on that one call — summing across turns would count it N times.
7
+ * See: https://github.com/nichekate/pi-subagents3/issues/38
8
+ */
9
+ export type LifetimeUsage = {
10
+ input: number;
11
+ output: number;
12
+ cacheWrite: number;
13
+ };
14
+
15
+ /** Sum of lifetime usage components, or 0 if undefined. */
16
+ export function getLifetimeTotal(u?: LifetimeUsage): number {
17
+ return u ? u.input + u.output + u.cacheWrite : 0;
18
+ }
19
+
20
+ /** Add a usage delta into a target accumulator (mutates target). */
21
+ export function addUsage(into: LifetimeUsage, delta: LifetimeUsage): void {
22
+ into.input += delta.input;
23
+ into.output += delta.output;
24
+ into.cacheWrite += delta.cacheWrite;
25
+ }
26
+
27
+ export function aggregateUsage(tasks: TeamTaskState[]): UsageState | undefined {
28
+ const total: UsageState = {};
29
+ let found = false;
30
+ for (const task of tasks) {
31
+ if (!task.usage) continue;
32
+ found = true;
33
+ total.input = (total.input ?? 0) + (task.usage.input ?? 0);
34
+ total.output = (total.output ?? 0) + (task.usage.output ?? 0);
35
+ total.cacheRead = (total.cacheRead ?? 0) + (task.usage.cacheRead ?? 0);
36
+ total.cacheWrite = (total.cacheWrite ?? 0) + (task.usage.cacheWrite ?? 0);
37
+ total.cost = (total.cost ?? 0) + (task.usage.cost ?? 0);
38
+ total.turns = (total.turns ?? 0) + (task.usage.turns ?? 0);
39
+ }
40
+ return found ? total : undefined;
41
+ }
42
+
43
+ export function formatUsage(usage: UsageState | undefined): string {
44
+ if (!usage) return "(none)";
45
+ const parts: string[] = [];
46
+ if (usage.input !== undefined) parts.push(`input=${usage.input}`);
47
+ if (usage.output !== undefined) parts.push(`output=${usage.output}`);
48
+ if (usage.cacheRead !== undefined) parts.push(`cacheRead=${usage.cacheRead}`);
49
+ if (usage.cacheWrite !== undefined) parts.push(`cacheWrite=${usage.cacheWrite}`);
50
+ if (usage.cost !== undefined && Number.isFinite(usage.cost)) parts.push(`cost=${usage.cost.toFixed(6)}`);
51
+ if (usage.turns !== undefined) parts.push(`turns=${usage.turns}`);
52
+ return parts.join(", ") || "(none)";
53
+ }
54
+
55
+ /** Human-readable compact token count (12345 -> "12.3k"). */
56
+ export function formatTokens(n: number): string {
57
+ if (n < 1000) return `${n}`;
58
+ if (n < 1_000_000) return n < 10_000 ? `${(n / 1000).toFixed(1)}k` : `${Math.round(n / 1000)}k`;
59
+ return `${(n / 1_000_000).toFixed(2)}M`;
60
+ }
61
+
62
+ /** Human-readable cost ($0.001234 -> "$0.001234", $1.5 -> "$1.50"). */
63
+ export function formatCost(cost: number | undefined): string {
64
+ if (cost === undefined || !Number.isFinite(cost)) return "$0.00";
65
+ if (cost === 0) return "$0.00";
66
+ if (cost < 0.01) return `$${cost.toFixed(6)}`;
67
+ return `$${cost.toFixed(cost < 1 ? 4 : 2)}`;
68
+ }
69
+
70
+ export interface RoleUsage {
71
+ role: string;
72
+ input: number;
73
+ output: number;
74
+ cacheWrite: number;
75
+ cost: number;
76
+ turns: number;
77
+ taskCount: number;
78
+ }
79
+
80
+ /** Aggregate usage per-role (and per-task) for cost attribution. */
81
+ export function aggregateUsageByRole(tasks: TeamTaskState[]): RoleUsage[] {
82
+ const byRole = new Map<string, RoleUsage>();
83
+ for (const task of tasks) {
84
+ const role = task.role || "unknown";
85
+ let bucket = byRole.get(role);
86
+ if (!bucket) {
87
+ bucket = {
88
+ role,
89
+ input: 0,
90
+ output: 0,
91
+ cacheWrite: 0,
92
+ cost: 0,
93
+ turns: 0,
94
+ taskCount: 0,
95
+ };
96
+ byRole.set(role, bucket);
97
+ }
98
+ bucket.taskCount++;
99
+ if (!task.usage) continue;
100
+ bucket.input += task.usage.input ?? 0;
101
+ bucket.output += task.usage.output ?? 0;
102
+ bucket.cacheWrite += task.usage.cacheWrite ?? 0;
103
+ bucket.cost += task.usage.cost ?? 0;
104
+ bucket.turns += task.usage.turns ?? 0;
105
+ }
106
+ return [...byRole.values()].sort((a, b) => b.cost - a.cost);
107
+ }
108
+
109
+ /**
110
+ * Build a multi-line cost report with per-role attribution.
111
+ * Used by the `summary` action for cost visibility (roadmap T1.1).
112
+ */
113
+ export function formatCostReport(tasks: TeamTaskState[]): string {
114
+ const usage = aggregateUsage(tasks);
115
+ if (!usage) return "Cost: (no usage data recorded)";
116
+ const byRole = aggregateUsageByRole(tasks);
117
+ const totalTokens = (usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheWrite ?? 0);
118
+ const lines: string[] = [];
119
+ lines.push("═══ Cost Report ═══");
120
+ lines.push(
121
+ `Tokens: ${formatTokens(totalTokens)} (in ${formatTokens(usage.input ?? 0)}, out ${formatTokens(usage.output ?? 0)}, cache-write ${formatTokens(usage.cacheWrite ?? 0)})`,
122
+ );
123
+ lines.push(`Cost: ${formatCost(usage.cost)}${usage.turns ? ` across ${usage.turns} turn(s)` : ""}`);
124
+ if (byRole.length > 1) {
125
+ lines.push("");
126
+ lines.push("By role:");
127
+ for (const r of byRole) {
128
+ const pct = usage.cost && usage.cost > 0 ? Math.round((r.cost / usage.cost) * 100) : 0;
129
+ const tok = r.input + r.output + r.cacheWrite;
130
+ lines.push(
131
+ ` ${r.role} (${r.taskCount} task${r.taskCount === 1 ? "" : "s"}): ${formatCost(r.cost)}${pct ? ` — ${pct}%` : ""}, ${formatTokens(tok)} tok, ${r.turns} turns`,
132
+ );
133
+ }
134
+ }
135
+ lines.push("");
136
+ lines.push("Track budget via budgetTotal/budgetWarning/budgetAbort on team run.");
137
+ return lines.join("\n");
138
+ }