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,238 @@
1
+ /**
2
+ * Foreground run controller for pi-crew.
3
+ *
4
+ * Owns the three helpers consumed by the team-tool / subagent-tools /
5
+ * team-commands modules:
6
+ * • `startForegroundRun` — spawn a foreground team run with watchdog,
7
+ * abort signal, and completion-handling (status notification + widget
8
+ * refresh + crew.run.* event emission).
9
+ * • `abortForegroundRun` — abort a foreground team run by runId.
10
+ * • `openLiveSidebar` — open the per-run live sidebar UI overlay.
11
+ *
12
+ * These three are conceptually one unit (all manipulate the same
13
+ * foreground-team-run controllers + live sidebar state), so they share
14
+ * a single file.
15
+ */
16
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
17
+ import { loadConfig } from "../../config/config.ts";
18
+ import { loadRunManifestById, updateRunStatus } from "../../state/state-store.ts";
19
+ import { setWorkingIndicator } from "../../ui/pi-ui-compat.ts";
20
+ import { requestPowerbarUpdate } from "../../ui/powerbar-publisher.ts";
21
+ import { updateCrewWidget } from "../../ui/widget/index.ts";
22
+ import { logInternalError } from "../../utils/internal-error.ts";
23
+ import type { RegistrationContext } from "./registration-types.ts";
24
+
25
+ /**
26
+ * Install the foreground-run controller helpers into the registration
27
+ * context. Re-call safe — each call rebinds `ctx.startForegroundRun`,
28
+ * `ctx.abortForegroundRun`, and `ctx.openLiveSidebar` to fresh closures
29
+ * (the underlying state lives on `ctx`).
30
+ */
31
+ export function installForegroundRunController(pi: ExtensionAPI, ctx: RegistrationContext): void {
32
+ ctx.openLiveSidebar = (extCtx, runId) => {
33
+ void openLiveSidebarImpl(pi, ctx, extCtx, runId);
34
+ };
35
+ ctx.startForegroundRun = (extCtx, runner, runId) => startForegroundRunImpl(pi, ctx, extCtx, runner, runId);
36
+ ctx.abortForegroundRun = (runId) => {
37
+ const controller = ctx.foregroundTeamRunControllers.get(runId);
38
+ if (!controller) return false;
39
+ controller.abort();
40
+ return true;
41
+ };
42
+ }
43
+
44
+ /**
45
+ * Open the live sidebar for a specific run.
46
+ *
47
+ * Defers the actual install to registration/ui.ts via a lazy dynamic
48
+ * import — only invoked when a sidebar is actually requested, never at
49
+ * module load.
50
+ */
51
+ async function openLiveSidebarImpl(
52
+ pi: ExtensionAPI,
53
+ ctx: RegistrationContext,
54
+ extensionCtx: ExtensionContext,
55
+ runId: string,
56
+ ): Promise<void> {
57
+ // LAZY: registration/ui pulls in transcript-viewer + heavy UI modules.
58
+ const uiModule = await import("./ui.ts");
59
+ await uiModule.installLiveSidebar(extensionCtx, runId, ctx.uiState, {
60
+ pi,
61
+ widgetState: ctx.widgetState,
62
+ getManifestCache: ctx.getManifestCache,
63
+ getRunSnapshotCache: ctx.getRunSnapshotCache,
64
+ isCleanedUp: () => ctx.cleanedUp,
65
+ getCurrentCtx: () => ctx.currentCtx,
66
+ });
67
+ }
68
+
69
+ /**
70
+ * Spawn a foreground team run.
71
+ *
72
+ * The runner executes on the next macrotask (`setImmediate`) so this
73
+ * function returns synchronously to Pi. The runner receives an AbortSignal
74
+ * that fires when:
75
+ * • `abortForegroundRun(runId)` is called (e.g., from a tool cancel),
76
+ * • `cleanupRuntime()` fires (session shutdown with reason=quit/reload).
77
+ *
78
+ * A foreground-watchdog is started per runId to surface hung runs to the
79
+ * assistant. The .finally block handles: abort propagation, working-message
80
+ * clearing, status notification, run-completed session entry, and crew.run.*
81
+ * event emission.
82
+ */
83
+ function startForegroundRunImpl(
84
+ pi: ExtensionAPI,
85
+ ctx: RegistrationContext,
86
+ extensionCtx: ExtensionContext,
87
+ runner: (signal?: AbortSignal) => Promise<void>,
88
+ runId?: string,
89
+ ): void {
90
+ const ownerGeneration = ctx.captureSessionGeneration();
91
+ const controller = new AbortController();
92
+ const key = runId ?? Symbol();
93
+ ctx.foregroundTeamRunControllers.set(key, controller);
94
+ if (extensionCtx.hasUI) {
95
+ setWorkingIndicator(extensionCtx, {
96
+ frames: ["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"],
97
+ intervalMs: 80,
98
+ });
99
+ extensionCtx.ui.setWorkingMessage(runId ? `pi-crew foreground run ${runId}...` : "pi-crew foreground run...");
100
+ }
101
+ if (runId) {
102
+ void import("../../runtime/foreground-watchdog.ts")
103
+ .then(({ startForegroundWatchdog }) => {
104
+ startForegroundWatchdog({ pi, cwd: extensionCtx.cwd, runId });
105
+ })
106
+ .catch((error) => {
107
+ logInternalError("register.foreground-watchdog-import", error);
108
+ });
109
+ }
110
+ setImmediate(() => {
111
+ void runner(controller.signal)
112
+ .catch((error) => {
113
+ const message = error instanceof Error ? error.message : String(error);
114
+ if (runId) {
115
+ try {
116
+ const loaded = loadRunManifestById(extensionCtx.cwd, runId);
117
+ if (
118
+ loaded &&
119
+ loaded.manifest.status !== "completed" &&
120
+ loaded.manifest.status !== "failed" &&
121
+ loaded.manifest.status !== "cancelled" &&
122
+ loaded.manifest.status !== "blocked"
123
+ )
124
+ updateRunStatus(loaded.manifest, "failed", message);
125
+ } catch (statusError) {
126
+ logInternalError("register.foreground-run-failure", statusError, `runId=${runId}`);
127
+ }
128
+ }
129
+ if (ctx.isContextCurrent(extensionCtx, ownerGeneration)) {
130
+ extensionCtx.ui.notify(`pi-crew foreground run failed: ${message}`, "error");
131
+ } else {
132
+ logInternalError("register.foreground-run-failure", error, `runId=${runId} context disposed`);
133
+ }
134
+ })
135
+ .finally(() => {
136
+ ctx.foregroundTeamRunControllers.delete(key);
137
+ if (runId) {
138
+ void import("../../runtime/foreground-watchdog.ts")
139
+ .then(({ stopWatchdog }) => {
140
+ stopWatchdog(runId);
141
+ })
142
+ .catch((error) => logInternalError("register.foreground-watchdog", error, `runId=${runId}`));
143
+ }
144
+ const ownerCurrent = ctx.isContextCurrent(extensionCtx, ownerGeneration);
145
+ if (extensionCtx.hasUI) {
146
+ try {
147
+ setWorkingIndicator(extensionCtx);
148
+ extensionCtx.ui.setWorkingMessage();
149
+ } catch {
150
+ /* ignore */
151
+ }
152
+ }
153
+ if (ownerCurrent && runId) {
154
+ const loaded = loadRunManifestById(extensionCtx.cwd, runId);
155
+ const status = loaded?.manifest.status ?? "finished";
156
+ const level = status === "failed" || status === "blocked" ? "error" : status === "cancelled" ? "warning" : "info";
157
+ extensionCtx.ui.notify(
158
+ `pi-crew run ${runId} ${status}. Use /team-summary ${runId} or /team-status ${runId}.`,
159
+ level as "info" | "warning" | "error",
160
+ );
161
+ pi.appendEntry("crew:run-completed", {
162
+ runId,
163
+ team: loaded?.manifest.team,
164
+ workflow: loaded?.manifest.workflow,
165
+ goal: loaded?.manifest.goal,
166
+ status,
167
+ taskCount: loaded?.tasks.length,
168
+ durationMs: loaded?.manifest.createdAt ? Date.now() - new Date(loaded.manifest.createdAt).getTime() : 0,
169
+ timestamp: Date.now(),
170
+ });
171
+ const eventType =
172
+ status === "completed"
173
+ ? "crew.run.completed"
174
+ : status === "failed" || status === "blocked"
175
+ ? "crew.run.failed"
176
+ : status === "cancelled"
177
+ ? "crew.run.cancelled"
178
+ : undefined;
179
+ if (eventType) {
180
+ pi.events?.emit?.(eventType, {
181
+ runId,
182
+ team: loaded?.manifest.team,
183
+ workflow: loaded?.manifest.workflow,
184
+ status,
185
+ taskCount: loaded?.tasks.length,
186
+ goal: loaded?.manifest.goal,
187
+ durationMs: loaded?.manifest.createdAt ? Date.now() - new Date(loaded.manifest.createdAt).getTime() : 0,
188
+ });
189
+ }
190
+
191
+ // Emit per-task events so task-level metrics (crew.task.count,
192
+ // crew.task.duration_ms, crew.task.tokens_total) record actual values.
193
+ const terminalTaskStatuses = new Set(["completed", "failed", "needs_attention"]);
194
+ for (const task of loaded?.tasks ?? []) {
195
+ if (!terminalTaskStatuses.has(task.status)) continue;
196
+ const taskEventType =
197
+ task.status === "completed"
198
+ ? "crew.task.completed"
199
+ : task.status === "failed"
200
+ ? "crew.task.failed"
201
+ : "crew.task.needs_attention";
202
+ pi.events?.emit?.(taskEventType, {
203
+ runId,
204
+ team: loaded?.manifest.team,
205
+ workflow: loaded?.manifest.workflow,
206
+ taskId: task.id,
207
+ taskCount: loaded?.tasks.length,
208
+ role: task.role,
209
+ durationMs:
210
+ task.startedAt && task.finishedAt
211
+ ? new Date(task.finishedAt).getTime() - new Date(task.startedAt).getTime()
212
+ : 0,
213
+ tokens: (task.usage?.input ?? 0) + (task.usage?.output ?? 0),
214
+ });
215
+ }
216
+ }
217
+ if (ownerCurrent && ctx.currentCtx) {
218
+ const config = loadConfig(ctx.currentCtx.cwd).config.ui;
219
+ updateCrewWidget(
220
+ ctx.currentCtx,
221
+ ctx.widgetState,
222
+ config,
223
+ ctx.getManifestCache(ctx.currentCtx.cwd),
224
+ ctx.getRunSnapshotCache(ctx.currentCtx.cwd),
225
+ );
226
+ requestPowerbarUpdate(
227
+ pi.events,
228
+ ctx.currentCtx.cwd,
229
+ config,
230
+ ctx.getManifestCache(ctx.currentCtx.cwd),
231
+ ctx.getRunSnapshotCache(ctx.currentCtx.cwd),
232
+ ctx.currentCtx,
233
+ ctx.widgetState.notificationCount ?? 0,
234
+ );
235
+ }
236
+ });
237
+ });
238
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Generic event-hook installer for pi-crew.
3
+ *
4
+ * Owns the non-lifecycle `pi.on(...)` subscribers:
5
+ * • `tool_call` — destructive-team-action permission gate.
6
+ * • `tool_result` — per-write validation (catches malformed config at
7
+ * write time, not at next load).
8
+ * • `resources_discover` — injects pi-crew skill paths.
9
+ *
10
+ * Session-lifecycle hooks (`session_start`, `session_shutdown`,
11
+ * `session_before_switch`) live in `lifecycle-handlers.ts` because they
12
+ * are heavy and own the deferred-cleanup + scheduler + render-loop setup.
13
+ *
14
+ * Compaction-guard hooks live in `compaction-guard.ts` because they were
15
+ * already extracted; this file does NOT re-register them.
16
+ */
17
+ import * as fs from "node:fs";
18
+ import * as path from "node:path";
19
+ import { fileURLToPath } from "node:url";
20
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
21
+ import { asRecord, loadConfig } from "../../config/config.ts";
22
+ import { buildValidationBlocker, extractPathFromInput, validateWrittenFile } from "../../runtime/per-write-validator.ts";
23
+ import { resolveRealContainedPath } from "../../utils/safe-paths.ts";
24
+ import { shouldBlockDestructiveTeamAction } from "../team-tool/destructive-gate.ts";
25
+ import type { RegistrationContext } from "./registration-types.ts";
26
+
27
+ /**
28
+ * Register all non-lifecycle event hooks on the ExtensionAPI.
29
+ *
30
+ * Safe to call once during `registerPiTeams`. Does not stack idempotency
31
+ * guards — these hooks are intentionally re-registered on reload (the
32
+ * orchestrator's `previousRuntimeCleanup` handles cleanup of derived state).
33
+ */
34
+ export function installPiHooks(pi: ExtensionAPI, ctx: RegistrationContext): void {
35
+ installResourcesDiscoverHook(pi, ctx);
36
+ installToolCallHook(pi, ctx);
37
+ installToolResultHook(pi, ctx);
38
+ }
39
+
40
+ /**
41
+ * Phase 11a: Dynamic resource discovery — inject pi-crew skill paths.
42
+ *
43
+ * Older Pi versions without `resources_discover` are tolerated (try/catch
44
+ * around pi.on; missing support is a no-op).
45
+ */
46
+ function installResourcesDiscoverHook(pi: ExtensionAPI, ctx: RegistrationContext): void {
47
+ try {
48
+ pi.on("resources_discover", () => {
49
+ const sessionCwd = ctx.currentCtx?.cwd ?? process.cwd();
50
+ const skillDir = path.resolve(sessionCwd, "skills");
51
+ const extSkillDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "skills");
52
+ const paths: string[] = [];
53
+ if (fs.existsSync(extSkillDir)) paths.push(extSkillDir);
54
+ if (skillDir !== extSkillDir && fs.existsSync(skillDir)) {
55
+ // Validate skillDir is within sessionCwd to prevent path traversal
56
+ try {
57
+ resolveRealContainedPath(sessionCwd, "skills");
58
+ paths.push(skillDir);
59
+ } catch {
60
+ // skillDir outside sessionCwd boundary — skip
61
+ }
62
+ }
63
+ return paths.length > 0 ? { skillPaths: paths } : {};
64
+ });
65
+ } catch {
66
+ /* older Pi without resources_discover */
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Phase 1.4: Permission gate for destructive team actions.
72
+ *
73
+ * AGENTS.md requires `confirm: true` for management deletes. We enforce it
74
+ * at the tool_call boundary so the user gets a clear error rather than
75
+ * executing a destructive action silently.
76
+ */
77
+ function installToolCallHook(_pi: ExtensionAPI, _ctx: RegistrationContext): void {
78
+ _pi.on("tool_call", async (event) => {
79
+ if (event.toolName !== "team") return;
80
+ const rawInput = event.input;
81
+ if (!rawInput || typeof rawInput !== "object") return;
82
+ const input = asRecord(rawInput);
83
+ if (!input) return;
84
+ const action = typeof input.action === "string" ? input.action : undefined;
85
+ const reason = shouldBlockDestructiveTeamAction(action, input);
86
+ if (!reason) return;
87
+ return {
88
+ block: true as const,
89
+ reason,
90
+ };
91
+ });
92
+ }
93
+
94
+ /**
95
+ * T5 (v0.8.5): per-write validation. On write/edit, run a zero-cost
96
+ * SYNCHRONOUS validator (v1: JSON.parse) and append a 🔴 blocker to the
97
+ * tool result on failure — catches malformed config the moment it's
98
+ * written, not at the next load. Latency-safe by construction: no process
99
+ * spawn, one disk read ONLY for validated extensions, dedup'd by content.
100
+ * Toggle via runtime.reliability.perWriteValidation (default true).
101
+ * Process-spawning validators (.js/.sh/.py) are a future opt-in.
102
+ */
103
+ function installToolResultHook(_pi: ExtensionAPI, _ctx: RegistrationContext): void {
104
+ _pi.on("tool_result", (event, ctx) => {
105
+ try {
106
+ if (event.toolName !== "write" && event.toolName !== "edit") return;
107
+ if (loadConfig(ctx.cwd).config.reliability?.perWriteValidation === false) return;
108
+ const filePath = extractPathFromInput(event.input);
109
+ if (!filePath) return;
110
+ const result = validateWrittenFile(filePath);
111
+ if (!result || result.ok) return;
112
+ return {
113
+ content: [...event.content, buildValidationBlocker(filePath, result.error ?? "validation failed")],
114
+ };
115
+ } catch {
116
+ // best-effort: never break a tool result
117
+ }
118
+ });
119
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Lazy lifecycle/observability configurers for pi-crew.
3
+ *
4
+ * These three small functions wire up the heavy runtime subsystems on
5
+ * the first session_start. They are kept as LAZY dynamic imports because:
6
+ * • `./registration/lifecycle.ts` pulls in notification-router + sink
7
+ * (~10 KB + heavy deps),
8
+ * • `./registration/observability.ts` pulls in HeartbeatWatcher +
9
+ * metric stack (~12 KB + heavy deps).
10
+ *
11
+ * Pre-loading them at register-time would force every cold start of
12
+ * pi-crew to pay the cost even if the user never opens a session.
13
+ *
14
+ * The orchestrator (`register.ts`) installs these via
15
+ * `installLazyConfigurers`, which binds them as `ctx.configureNotifications`,
16
+ * `ctx.configureObservability`, `ctx.configureDeliveryCoordinator`. The
17
+ * session_start handler invokes them via the context — see
18
+ * `lifecycle-handlers.ts`.
19
+ */
20
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
21
+ import { reconcileAllStaleRuns } from "../../runtime/crash-recovery.ts";
22
+ import { appendDeadletter } from "../../runtime/deadletter.ts";
23
+ import { cleanupLegacyOrphanTempDirs, cleanupOrphanTempDirs } from "../../runtime/pi-args.ts";
24
+ import { reconcileOrphanedTempWorkspaces } from "../../runtime/stale-reconciler.ts";
25
+ import { requestPowerbarUpdate } from "../../ui/powerbar-publisher.ts";
26
+ import { logInternalError } from "../../utils/internal-error.ts";
27
+ import type { RegistrationContext } from "./registration-types.ts";
28
+ import { sendAgentWakeUp, sendFollowUp } from "./subagent-helpers.ts";
29
+
30
+ /**
31
+ * Bind the three lazy configurers onto the registration context. After
32
+ * this call:
33
+ * • `ctx.configureNotifications(ctx)` fires the registration/lifecycle
34
+ * install with the bound deps bag.
35
+ * • `ctx.configureObservability(ctx)` fires the registration/observability
36
+ * install (metric registry, OTLP exporter, heartbeat watcher).
37
+ * • `ctx.configureDeliveryCoordinator()` wires the delivery coordinator
38
+ * + overflow tracker (no dynamic import — already loaded by the
39
+ * registration/lifecycle module).
40
+ */
41
+ export function installLazyConfigurers(pi: ExtensionAPI, ctx: RegistrationContext): void {
42
+ ctx.configureNotifications = (extCtx: ExtensionContext): void => {
43
+ void configureNotificationsImpl(pi, ctx, extCtx);
44
+ };
45
+ ctx.configureObservability = (extCtx: ExtensionContext): void => {
46
+ void configureObservabilityImpl(pi, ctx, extCtx);
47
+ };
48
+ ctx.configureDeliveryCoordinator = (): void => {
49
+ void configureDeliveryCoordinatorImpl(pi, ctx);
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Lazy-load registration/lifecycle.ts and wire its notifications system.
55
+ *
56
+ * The deps bag is built once-per-call (cheap — just object literals) so
57
+ * every session_start cycle gets a fresh closure that reads the latest
58
+ * `ctx.currentCtx` and caches.
59
+ */
60
+ async function configureNotificationsImpl(pi: ExtensionAPI, ctx: RegistrationContext, extCtx: ExtensionContext): Promise<void> {
61
+ try {
62
+ // LAZY: registration/lifecycle is heavy (notification-router + sink)
63
+ const lifecycleModule = await import("./lifecycle.ts");
64
+ await lifecycleModule.configureNotifications(extCtx, ctx.lifecycleState, {
65
+ pi,
66
+ widgetState: ctx.widgetState,
67
+ getCurrentCtx: () => ctx.currentCtx,
68
+ getManifestCache: ctx.getManifestCache,
69
+ getRunSnapshotCache: ctx.getRunSnapshotCache,
70
+ requestPowerbarUpdate,
71
+ });
72
+ } catch (error) {
73
+ logInternalError("register.configureNotifications", error);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Lazy-load registration/observability.ts and wire its metric stack.
79
+ *
80
+ * In addition to the metric registry / OTLP exporter, this is where the
81
+ * stale-reconcile and orphan-temp-dir timers are installed — see
82
+ * registration/observability.ts for details.
83
+ */
84
+ async function configureObservabilityImpl(pi: ExtensionAPI, ctx: RegistrationContext, extCtx: ExtensionContext): Promise<void> {
85
+ try {
86
+ // LAZY: registration/observability is heavy (HeartbeatWatcher + metric stack)
87
+ const observabilityModule = await import("./observability.ts");
88
+ await observabilityModule.configureObservability(extCtx, ctx.observabilityState, {
89
+ pi,
90
+ getManifestCache: ctx.getManifestCache,
91
+ notifyOperator: ctx.notifyOperator,
92
+ isCleanedUp: () => ctx.cleanedUp,
93
+ reconcileStaleRuns: (cwd, cache) => reconcileAllStaleRuns(cwd, cache),
94
+ reconcileOrphanedTempWorkspaces: (now, opts) => reconcileOrphanedTempWorkspaces(now, opts),
95
+ cleanupOrphanTempDirs,
96
+ cleanupLegacyOrphanTempDirs,
97
+ appendDeadletter: (manifest, entry) => appendDeadletter(manifest, entry as Parameters<typeof appendDeadletter>[1]),
98
+ importCrashRecovery: ctx.importCrashRecovery,
99
+ });
100
+ } catch (error) {
101
+ logInternalError("register.configureObservability", error);
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Wire delivery coordinator + overflow tracker. Uses the
107
+ * registration/lifecycle module's configureDeliveryCoordinator helper.
108
+ * No dynamic import needed — lifecycle is already loaded by configureNotifications.
109
+ */
110
+ async function configureDeliveryCoordinatorImpl(pi: ExtensionAPI, ctx: RegistrationContext): Promise<void> {
111
+ try {
112
+ // LAZY: lifecycle.ts may not be loaded yet if configureNotifications hasn't fired.
113
+ const lifecycleModule = await import("./lifecycle.ts");
114
+ await lifecycleModule.configureDeliveryCoordinator(ctx.lifecycleState, {
115
+ pi,
116
+ observabilityState: ctx.observabilityState,
117
+ notifyOperator: ctx.notifyOperator,
118
+ sendFollowUp,
119
+ sendAgentWakeUp,
120
+ });
121
+ } catch (error) {
122
+ logInternalError("register.configureDeliveryCoordinator", error);
123
+ }
124
+ }