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.
- package/CHANGELOG.md +45 -0
- package/package.json +6 -3
- package/scripts/clean-strip-types.mjs +60 -0
- package/src/adapters/claude-adapter.ts +23 -0
- package/src/adapters/codex-adapter.ts +21 -0
- package/src/adapters/cursor-adapter.ts +17 -0
- package/src/adapters/export-util.ts +143 -0
- package/src/adapters/index.ts +15 -0
- package/src/adapters/registry.ts +18 -0
- package/src/adapters/types.ts +23 -0
- package/src/agents/agent-config.ts +194 -0
- package/src/agents/agent-search.ts +98 -0
- package/src/agents/agent-serializer.ts +38 -0
- package/src/agents/discover-agents.ts +623 -0
- package/src/benchmark/benchmark-runner.ts +313 -0
- package/src/benchmark/feedback-loop.ts +73 -0
- package/src/config/config.ts +1270 -0
- package/src/config/defaults.ts +193 -0
- package/src/config/drift-detector.ts +290 -0
- package/src/config/markers.ts +330 -0
- package/src/config/resilient-parser.ts +117 -0
- package/src/config/role-tools.ts +118 -0
- package/src/config/suggestions.ts +75 -0
- package/src/config/types.ts +280 -0
- package/src/errors.ts +194 -0
- package/src/extension/action-suggestions.ts +117 -0
- package/src/extension/async-notifier.ts +179 -0
- package/src/extension/autonomous-policy.ts +209 -0
- package/src/extension/command-completions.ts +120 -0
- package/src/extension/context-status-injection.ts +185 -0
- package/src/extension/crew-autocomplete.ts +131 -0
- package/src/extension/crew-cleanup.ts +168 -0
- package/src/extension/crew-input-router.ts +93 -0
- package/src/extension/crew-shortcuts.ts +87 -0
- package/src/extension/crew-vibes/cat-frames.ts +18 -0
- package/src/extension/crew-vibes/config.ts +195 -0
- package/src/extension/crew-vibes/figures.ts +101 -0
- package/src/extension/crew-vibes/font-detect.ts +71 -0
- package/src/extension/crew-vibes/footer.ts +292 -0
- package/src/extension/crew-vibes/index.ts +432 -0
- package/src/extension/crew-vibes/provider-usage.ts +396 -0
- package/src/extension/crew-vibes/render.ts +206 -0
- package/src/extension/crew-vibes/speed.ts +286 -0
- package/src/extension/cross-extension-rpc.ts +350 -0
- package/src/extension/help.ts +62 -0
- package/src/extension/import-index.ts +74 -0
- package/src/extension/knowledge-injection.ts +402 -0
- package/src/extension/management.ts +571 -0
- package/src/extension/message-renderers.ts +108 -0
- package/src/extension/notification-router.ts +152 -0
- package/src/extension/notification-sink.ts +54 -0
- package/src/extension/pi-api.ts +56 -0
- package/src/extension/plan-orchestrate.ts +302 -0
- package/src/extension/project-init.ts +170 -0
- package/src/extension/register.ts +113 -0
- package/src/extension/registration/artifact-cleanup.ts +20 -0
- package/src/extension/registration/command-registration.ts +58 -0
- package/src/extension/registration/command-utils.ts +58 -0
- package/src/extension/registration/commands.ts +1228 -0
- package/src/extension/registration/compaction-guard.ts +333 -0
- package/src/extension/registration/context-builder.ts +135 -0
- package/src/extension/registration/crash-recovery-cache.ts +54 -0
- package/src/extension/registration/foreground-run-controller.ts +238 -0
- package/src/extension/registration/hook-registration.ts +119 -0
- package/src/extension/registration/lazy-configurers.ts +124 -0
- package/src/extension/registration/lifecycle-handlers.ts +923 -0
- package/src/extension/registration/lifecycle.ts +259 -0
- package/src/extension/registration/observability.ts +322 -0
- package/src/extension/registration/registration-types.ts +158 -0
- package/src/extension/registration/runtime-cleanup.ts +230 -0
- package/src/extension/registration/subagent-helpers.ts +125 -0
- package/src/extension/registration/subagent-manager-setup.ts +330 -0
- package/src/extension/registration/subagent-tools.ts +456 -0
- package/src/extension/registration/team-tool.ts +225 -0
- package/src/extension/registration/tool-registration.ts +50 -0
- package/src/extension/registration/ui.ts +172 -0
- package/src/extension/registration/viewers.ts +121 -0
- package/src/extension/registration/wire-cross-extension.ts +37 -0
- package/src/extension/result-watcher.ts +139 -0
- package/src/extension/rpc-hmac.ts +256 -0
- package/src/extension/run-bundle-schema.ts +104 -0
- package/src/extension/run-export.ts +97 -0
- package/src/extension/run-import.ts +168 -0
- package/src/extension/run-index.ts +131 -0
- package/src/extension/run-maintenance.ts +190 -0
- package/src/extension/session-summary.ts +18 -0
- package/src/extension/team-manager-command.ts +153 -0
- package/src/extension/team-onboard.ts +180 -0
- package/src/extension/team-recommendation.ts +288 -0
- package/src/extension/team-tool/anchor.ts +172 -0
- package/src/extension/team-tool/api.ts +1244 -0
- package/src/extension/team-tool/auto-summarize.ts +142 -0
- package/src/extension/team-tool/cache-control.ts +19 -0
- package/src/extension/team-tool/cancel.ts +337 -0
- package/src/extension/team-tool/chain-dispatch.ts +95 -0
- package/src/extension/team-tool/chain-executor.ts +379 -0
- package/src/extension/team-tool/config-patch.ts +50 -0
- package/src/extension/team-tool/context.ts +149 -0
- package/src/extension/team-tool/destructive-gate.ts +52 -0
- package/src/extension/team-tool/dispatch/automate.ts +80 -0
- package/src/extension/team-tool/dispatch/control.ts +42 -0
- package/src/extension/team-tool/dispatch/index.ts +95 -0
- package/src/extension/team-tool/dispatch/manage.ts +161 -0
- package/src/extension/team-tool/dispatch/run.ts +53 -0
- package/src/extension/team-tool/dispatch/status.ts +187 -0
- package/src/extension/team-tool/doctor.ts +431 -0
- package/src/extension/team-tool/explain.ts +282 -0
- package/src/extension/team-tool/failure-patterns.ts +118 -0
- package/src/extension/team-tool/goal-wrap.ts +330 -0
- package/src/extension/team-tool/goal.ts +556 -0
- package/src/extension/team-tool/handle-schedule.ts +332 -0
- package/src/extension/team-tool/handle-settings.ts +520 -0
- package/src/extension/team-tool/health-monitor.ts +481 -0
- package/src/extension/team-tool/inspect.ts +88 -0
- package/src/extension/team-tool/intent-policy.ts +45 -0
- package/src/extension/team-tool/lifecycle-actions.ts +615 -0
- package/src/extension/team-tool/orchestrate.ts +98 -0
- package/src/extension/team-tool/parallel-dispatch.ts +183 -0
- package/src/extension/team-tool/plan.ts +50 -0
- package/src/extension/team-tool/respond.ts +150 -0
- package/src/extension/team-tool/run-deadline.ts +66 -0
- package/src/extension/team-tool/run-not-found.ts +49 -0
- package/src/extension/team-tool/run.ts +1051 -0
- package/src/extension/team-tool/status.ts +260 -0
- package/src/extension/team-tool/workflow-manage.ts +261 -0
- package/src/extension/team-tool-types.ts +26 -0
- package/src/extension/team-tool.ts +750 -0
- package/src/extension/tool-result.ts +16 -0
- package/src/extension/validate-resources.ts +108 -0
- package/src/hooks/registry.ts +200 -0
- package/src/hooks/types.ts +69 -0
- package/src/i18n.ts +212 -0
- package/src/observability/correlation.ts +50 -0
- package/src/observability/event-bus.ts +86 -0
- package/src/observability/event-to-metric.ts +170 -0
- package/src/observability/exporters/adapter.ts +27 -0
- package/src/observability/exporters/otlp-exporter.ts +356 -0
- package/src/observability/exporters/prometheus-exporter.ts +54 -0
- package/src/observability/metric-registry.ts +100 -0
- package/src/observability/metric-retention.ts +64 -0
- package/src/observability/metric-sink.ts +99 -0
- package/src/observability/metrics-primitives.ts +219 -0
- package/src/plugins/plugin-define.ts +6 -0
- package/src/plugins/plugin-registry.ts +32 -0
- package/src/plugins/plugins/index.ts +3 -0
- package/src/plugins/plugins/nextjs.ts +19 -0
- package/src/plugins/plugins/vite.ts +10 -0
- package/src/plugins/plugins/vitest.ts +9 -0
- package/src/prompt/prompt-runtime.ts +380 -0
- package/src/runtime/adaptive-plan.ts +563 -0
- package/src/runtime/agent-control.ts +215 -0
- package/src/runtime/agent-memory.ts +81 -0
- package/src/runtime/agent-observability.ts +122 -0
- package/src/runtime/anchor-manager.ts +475 -0
- package/src/runtime/async-marker.ts +32 -0
- package/src/runtime/async-runner.ts +381 -0
- package/src/runtime/attention-events.ts +28 -0
- package/src/runtime/auto-summarize.ts +344 -0
- package/src/runtime/background-runner.ts +840 -0
- package/src/runtime/batch-barrier.ts +147 -0
- package/src/runtime/broker-issuer.ts +39 -0
- package/src/runtime/cancellation-token.ts +99 -0
- package/src/runtime/cancellation.ts +99 -0
- package/src/runtime/capability-inventory.ts +137 -0
- package/src/runtime/chain-parser.ts +237 -0
- package/src/runtime/chain-runner.ts +606 -0
- package/src/runtime/checkpoint.ts +291 -0
- package/src/runtime/child-pi-constants.ts +42 -0
- package/src/runtime/child-pi-kill.ts +180 -0
- package/src/runtime/child-pi-pool.ts +68 -0
- package/src/runtime/child-pi-spawn.ts +287 -0
- package/src/runtime/child-pi-steering.ts +128 -0
- package/src/runtime/child-pi-streams.ts +296 -0
- package/src/runtime/child-pi-transcript.ts +169 -0
- package/src/runtime/child-pi.ts +1105 -0
- package/src/runtime/coalesce-tasks.ts +268 -0
- package/src/runtime/code-summary.ts +292 -0
- package/src/runtime/command-trace.ts +105 -0
- package/src/runtime/compact-pipeline.ts +56 -0
- package/src/runtime/compact-stages/ansi-strip-stage.ts +25 -0
- package/src/runtime/compact-stages/blank-collapse-stage.ts +31 -0
- package/src/runtime/compact-stages/deduplicate-stage.ts +34 -0
- package/src/runtime/compact-stages/head-snap-stage.ts +57 -0
- package/src/runtime/compact-stages/index.ts +23 -0
- package/src/runtime/compact-stages/tail-capture-stage.ts +77 -0
- package/src/runtime/compact-stages/truncation-stage.ts +74 -0
- package/src/runtime/compaction-summary.ts +278 -0
- package/src/runtime/completion-guard.ts +207 -0
- package/src/runtime/concurrency.ts +58 -0
- package/src/runtime/crash-classification.ts +229 -0
- package/src/runtime/crash-recovery.ts +594 -0
- package/src/runtime/crew-agent-records.ts +595 -0
- package/src/runtime/crew-agent-runtime.ts +62 -0
- package/src/runtime/crew-broker-child.ts +88 -0
- package/src/runtime/crew-broker-client.ts +673 -0
- package/src/runtime/crew-broker-tokens.ts +159 -0
- package/src/runtime/crew-broker.ts +1304 -0
- package/src/runtime/crew-hooks.ts +227 -0
- package/src/runtime/cross-extension-rpc.ts +143 -0
- package/src/runtime/custom-tools/irc-tool.ts +282 -0
- package/src/runtime/custom-tools/submit-result-tool.ts +102 -0
- package/src/runtime/deadletter.ts +47 -0
- package/src/runtime/delivery-coordinator.ts +211 -0
- package/src/runtime/delta-conflict.ts +348 -0
- package/src/runtime/deterministic-ast.ts +161 -0
- package/src/runtime/diagnostic-export.ts +171 -0
- package/src/runtime/direct-run.ts +45 -0
- package/src/runtime/dwf-state-store.ts +102 -0
- package/src/runtime/dynamic-workflow-context.ts +1013 -0
- package/src/runtime/dynamic-workflow-runner.ts +325 -0
- package/src/runtime/effectiveness.ts +90 -0
- package/src/runtime/errors/crew-errors.ts +162 -0
- package/src/runtime/event-stream-bridge.ts +98 -0
- package/src/runtime/foreground-control.ts +193 -0
- package/src/runtime/foreground-watchdog.ts +132 -0
- package/src/runtime/global-worker-cap.ts +96 -0
- package/src/runtime/goal-achievement.ts +148 -0
- package/src/runtime/goal-evaluator.ts +365 -0
- package/src/runtime/goal-loop-runner.ts +825 -0
- package/src/runtime/goal-state-store.ts +219 -0
- package/src/runtime/green-contract.ts +55 -0
- package/src/runtime/group-join.ts +267 -0
- package/src/runtime/handoff-manager.ts +598 -0
- package/src/runtime/heartbeat-gradient.ts +36 -0
- package/src/runtime/heartbeat-watcher.ts +239 -0
- package/src/runtime/hidden-handoff.ts +407 -0
- package/src/runtime/important-line-classifier.ts +140 -0
- package/src/runtime/intercom-bridge.ts +187 -0
- package/src/runtime/iteration-hooks.ts +305 -0
- package/src/runtime/live-agent-control.ts +136 -0
- package/src/runtime/live-agent-manager.ts +704 -0
- package/src/runtime/live-control-realtime.ts +56 -0
- package/src/runtime/live-extension-bridge.ts +148 -0
- package/src/runtime/live-irc.ts +97 -0
- package/src/runtime/live-session-health.ts +108 -0
- package/src/runtime/live-session-runtime.ts +1146 -0
- package/src/runtime/loop-gates.ts +128 -0
- package/src/runtime/manifest-cache.ts +375 -0
- package/src/runtime/mcp-proxy.ts +105 -0
- package/src/runtime/metric-parser.ts +36 -0
- package/src/runtime/model-fallback.ts +409 -0
- package/src/runtime/model-resolver.ts +126 -0
- package/src/runtime/model-scope.ts +158 -0
- package/src/runtime/orphan-worker-registry.ts +465 -0
- package/src/runtime/output-validator.ts +202 -0
- package/src/runtime/overflow-recovery.ts +206 -0
- package/src/runtime/parallel-research.ts +68 -0
- package/src/runtime/parallel-utils.ts +160 -0
- package/src/runtime/parent-guard.ts +134 -0
- package/src/runtime/path-overlap.ts +150 -0
- package/src/runtime/peer-dep.ts +292 -0
- package/src/runtime/per-write-validator.ts +181 -0
- package/src/runtime/phase-progress.ts +217 -0
- package/src/runtime/phase-tracker.ts +385 -0
- package/src/runtime/pi-args.ts +655 -0
- package/src/runtime/pi-json-output.ts +170 -0
- package/src/runtime/pi-spawn.ts +273 -0
- package/src/runtime/pipeline-runner.ts +523 -0
- package/src/runtime/plan-templates.ts +201 -0
- package/src/runtime/policy-engine.ts +115 -0
- package/src/runtime/post-checks.ts +142 -0
- package/src/runtime/post-exit-stdio-guard.ts +109 -0
- package/src/runtime/process-lifecycle.ts +491 -0
- package/src/runtime/process-status.ts +154 -0
- package/src/runtime/progress-event-coalescer.ts +44 -0
- package/src/runtime/progress-tracker.ts +124 -0
- package/src/runtime/prose-compressor.ts +162 -0
- package/src/runtime/recovery-recipes.ts +203 -0
- package/src/runtime/replace.ts +570 -0
- package/src/runtime/resilient-edit.ts +153 -0
- package/src/runtime/result-extractor.ts +217 -0
- package/src/runtime/retry-executor.ts +109 -0
- package/src/runtime/retry-runner.ts +336 -0
- package/src/runtime/role-permission.ts +59 -0
- package/src/runtime/run-coalesced-task-group.ts +308 -0
- package/src/runtime/run-drift.ts +219 -0
- package/src/runtime/run-tracker.ts +116 -0
- package/src/runtime/run-worker.ts +78 -0
- package/src/runtime/runtime-policy.ts +29 -0
- package/src/runtime/runtime-resolver.ts +172 -0
- package/src/runtime/runtime-warmup.ts +160 -0
- package/src/runtime/scheduler.ts +353 -0
- package/src/runtime/semaphore.ts +141 -0
- package/src/runtime/sensitive-paths.ts +93 -0
- package/src/runtime/session-resources.ts +25 -0
- package/src/runtime/session-snapshot.ts +59 -0
- package/src/runtime/session-usage.ts +79 -0
- package/src/runtime/settings-store.ts +155 -0
- package/src/runtime/sidechain-output.ts +35 -0
- package/src/runtime/single-agent-compose.ts +84 -0
- package/src/runtime/skill-effectiveness.ts +524 -0
- package/src/runtime/skill-instructions.ts +394 -0
- package/src/runtime/stale-reconciler.ts +680 -0
- package/src/runtime/stream-preview.ts +184 -0
- package/src/runtime/streaming-output.ts +50 -0
- package/src/runtime/subagent-manager.ts +561 -0
- package/src/runtime/subprocess-tool-registry.ts +70 -0
- package/src/runtime/supervisor-contact.ts +64 -0
- package/src/runtime/task-display.ts +52 -0
- package/src/runtime/task-graph-scheduler.ts +227 -0
- package/src/runtime/task-graph.ts +290 -0
- package/src/runtime/task-health.ts +83 -0
- package/src/runtime/task-id.ts +161 -0
- package/src/runtime/task-output-context.ts +602 -0
- package/src/runtime/task-packet.ts +268 -0
- package/src/runtime/task-quality.ts +199 -0
- package/src/runtime/task-runner/capabilities.ts +78 -0
- package/src/runtime/task-runner/child-executor.ts +790 -0
- package/src/runtime/task-runner/context-retrieval.ts +163 -0
- package/src/runtime/task-runner/live-executor.ts +227 -0
- package/src/runtime/task-runner/output-splitter.ts +152 -0
- package/src/runtime/task-runner/post-execution.ts +480 -0
- package/src/runtime/task-runner/pre-execution.ts +365 -0
- package/src/runtime/task-runner/progress.ts +157 -0
- package/src/runtime/task-runner/prompt-builder.ts +278 -0
- package/src/runtime/task-runner/prompt-pipeline.ts +88 -0
- package/src/runtime/task-runner/result-utils.ts +16 -0
- package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
- package/src/runtime/task-runner/run-projection.ts +125 -0
- package/src/runtime/task-runner/scaffold-executor.ts +25 -0
- package/src/runtime/task-runner/state-helpers.ts +176 -0
- package/src/runtime/task-runner/tail-read.ts +34 -0
- package/src/runtime/task-runner.ts +216 -0
- package/src/runtime/team-runner-artifacts.ts +13 -0
- package/src/runtime/team-runner.ts +2396 -0
- package/src/runtime/tool-output-pruner.ts +333 -0
- package/src/runtime/tool-progress.ts +278 -0
- package/src/runtime/usage-tracker.ts +73 -0
- package/src/runtime/verification-gates.ts +579 -0
- package/src/runtime/verification-integrity.ts +108 -0
- package/src/runtime/verification-worktree.ts +186 -0
- package/src/runtime/worker-heartbeat.ts +25 -0
- package/src/runtime/worker-startup.ts +83 -0
- package/src/runtime/workflow-state.ts +195 -0
- package/src/runtime/workspace-lock.ts +443 -0
- package/src/runtime/workspace-tree.ts +312 -0
- package/src/runtime/yield-handler.ts +224 -0
- package/src/runtime/zombie-scanner.ts +298 -0
- package/src/schema/config-schema.ts +327 -0
- package/src/schema/team-tool-schema.ts +492 -0
- package/src/schema/validation-types.ts +159 -0
- package/src/skills/discover-skills.ts +203 -0
- package/src/skills/skill-templates.ts +456 -0
- package/src/skills/validate.ts +285 -0
- package/src/state/active-run-registry.ts +439 -0
- package/src/state/artifact-store.ts +176 -0
- package/src/state/atomic-write.ts +970 -0
- package/src/state/blob-store.ts +308 -0
- package/src/state/contracts.ts +160 -0
- package/src/state/crew-init.ts +269 -0
- package/src/state/decision-ledger.ts +372 -0
- package/src/state/event-log-rotation.ts +399 -0
- package/src/state/event-log.ts +1465 -0
- package/src/state/event-reconstructor.ts +229 -0
- package/src/state/gitignore-manager.ts +46 -0
- package/src/state/health-store.ts +79 -0
- package/src/state/hook-instinct-bridge.ts +94 -0
- package/src/state/hook-integrations.ts +51 -0
- package/src/state/instinct-store.ts +275 -0
- package/src/state/jsonl-writer.ts +107 -0
- package/src/state/locks.ts +562 -0
- package/src/state/mailbox.ts +916 -0
- package/src/state/observation-store.ts +176 -0
- package/src/state/run-cache.ts +193 -0
- package/src/state/run-graph.ts +183 -0
- package/src/state/run-metrics.ts +165 -0
- package/src/state/schedule.ts +166 -0
- package/src/state/session-state-map.ts +51 -0
- package/src/state/state-store.ts +973 -0
- package/src/state/task-claims.ts +61 -0
- package/src/state/tiered-eval.ts +480 -0
- package/src/state/types-eval.ts +58 -0
- package/src/state/types.ts +447 -0
- package/src/state/usage.ts +138 -0
- package/src/state/worker-atomic-writer.ts +198 -0
- package/src/subagents/async-entry.ts +1 -0
- package/src/subagents/index.ts +3 -0
- package/src/subagents/live/control.ts +1 -0
- package/src/subagents/live/manager.ts +1 -0
- package/src/subagents/live/realtime.ts +1 -0
- package/src/subagents/live/session-runtime.ts +1 -0
- package/src/subagents/manager.ts +1 -0
- package/src/subagents/spawn.ts +1 -0
- package/src/teams/discover-teams.ts +187 -0
- package/src/teams/team-config.ts +27 -0
- package/src/teams/team-serializer.ts +38 -0
- package/src/tools/safe-bash-extension.ts +54 -0
- package/src/tools/safe-bash.ts +505 -0
- package/src/types/diff.d.ts +18 -0
- package/src/types/new-api-types.ts +35 -0
- package/src/ui/agent-management-overlay.ts +160 -0
- package/src/ui/card-colors.ts +139 -0
- package/src/ui/crew-footer.ts +102 -0
- package/src/ui/crew-select-list.ts +112 -0
- package/src/ui/dashboard-panes/agents-pane.ts +164 -0
- package/src/ui/dashboard-panes/cancellation-pane.ts +66 -0
- package/src/ui/dashboard-panes/capability-pane.ts +77 -0
- package/src/ui/dashboard-panes/health-pane.ts +31 -0
- package/src/ui/dashboard-panes/mailbox-pane.ts +35 -0
- package/src/ui/dashboard-panes/metrics-pane.ts +37 -0
- package/src/ui/dashboard-panes/progress-pane.ts +38 -0
- package/src/ui/dashboard-panes/transcript-pane.ts +10 -0
- package/src/ui/deploy-bundled-themes.ts +71 -0
- package/src/ui/dwf-phase-display.ts +151 -0
- package/src/ui/dynamic-border.ts +35 -0
- package/src/ui/format-helpers.ts +31 -0
- package/src/ui/heartbeat-aggregator.ts +74 -0
- package/src/ui/key-utils.ts +42 -0
- package/src/ui/keybinding-map.ts +248 -0
- package/src/ui/layout-primitives.ts +106 -0
- package/src/ui/live-conversation-overlay.ts +183 -0
- package/src/ui/live-duration.ts +55 -0
- package/src/ui/live-run-sidebar.ts +293 -0
- package/src/ui/loaders.ts +6 -0
- package/src/ui/mascot.ts +449 -0
- package/src/ui/overlays/agent-picker-overlay.ts +66 -0
- package/src/ui/overlays/confirm-overlay.ts +60 -0
- package/src/ui/overlays/help-overlay.ts +177 -0
- package/src/ui/overlays/mailbox-compose-overlay.ts +181 -0
- package/src/ui/overlays/mailbox-compose-preview.ts +78 -0
- package/src/ui/overlays/mailbox-detail-overlay.ts +155 -0
- package/src/ui/pi-ui-compat.ts +68 -0
- package/src/ui/powerbar-publisher.ts +459 -0
- package/src/ui/render-coalescer.ts +101 -0
- package/src/ui/render-diff.ts +160 -0
- package/src/ui/render-scheduler.ts +278 -0
- package/src/ui/run-action-dispatcher.ts +182 -0
- package/src/ui/run-dashboard.ts +910 -0
- package/src/ui/run-event-bus.ts +381 -0
- package/src/ui/run-snapshot-cache.ts +1057 -0
- package/src/ui/settings-overlay.ts +1067 -0
- package/src/ui/shared-overlay-scheduler.ts +96 -0
- package/src/ui/snapshot-types.ts +90 -0
- package/src/ui/spinner.ts +17 -0
- package/src/ui/status-colors.ts +143 -0
- package/src/ui/syntax-highlight.ts +136 -0
- package/src/ui/terminal-status.ts +269 -0
- package/src/ui/theme-adapter.ts +271 -0
- package/src/ui/theme-discovery.ts +199 -0
- package/src/ui/tool-progress-formatter.ts +93 -0
- package/src/ui/tool-renderers/brief-mode.ts +225 -0
- package/src/ui/tool-renderers/index.ts +726 -0
- package/src/ui/transcript-cache.ts +128 -0
- package/src/ui/transcript-entries.ts +256 -0
- package/src/ui/transcript-viewer.ts +424 -0
- package/src/ui/widget/index.ts +418 -0
- package/src/ui/widget/widget-formatters.ts +182 -0
- package/src/ui/widget/widget-model.ts +110 -0
- package/src/ui/widget/widget-renderer.ts +182 -0
- package/src/ui/widget/widget-types.ts +36 -0
- package/src/utils/bm25-search.ts +235 -0
- package/src/utils/completion-dedupe.ts +63 -0
- package/src/utils/conflict-detect.ts +668 -0
- package/src/utils/env-allowlist.ts +30 -0
- package/src/utils/env-filter.ts +155 -0
- package/src/utils/file-coalescer.ts +98 -0
- package/src/utils/fingerprint.ts +180 -0
- package/src/utils/frontmatter.ts +70 -0
- package/src/utils/fs-watch.ts +37 -0
- package/src/utils/gh-protocol.ts +556 -0
- package/src/utils/git.ts +260 -0
- package/src/utils/guards.ts +107 -0
- package/src/utils/ids.ts +24 -0
- package/src/utils/incremental-reader.ts +220 -0
- package/src/utils/internal-error.ts +10 -0
- package/src/utils/names.ts +36 -0
- package/src/utils/ndjson.ts +115 -0
- package/src/utils/paths.ts +227 -0
- package/src/utils/project-detector.ts +160 -0
- package/src/utils/redaction.ts +370 -0
- package/src/utils/resolve-shell.ts +36 -0
- package/src/utils/run-watcher-registry.ts +152 -0
- package/src/utils/safe-paths.ts +393 -0
- package/src/utils/scan-cache.ts +144 -0
- package/src/utils/session-utils.ts +110 -0
- package/src/utils/sleep.ts +54 -0
- package/src/utils/socket-path.ts +164 -0
- package/src/utils/sse-parser.ts +131 -0
- package/src/utils/task-name-generator.ts +337 -0
- package/src/utils/timings.ts +33 -0
- package/src/utils/token-counter.ts +200 -0
- package/src/utils/visual.ts +207 -0
- package/src/workflows/cost-estimator.ts +34 -0
- package/src/workflows/discover-workflows.ts +308 -0
- package/src/workflows/intermediate-store.ts +166 -0
- package/src/workflows/preflight-validator.ts +168 -0
- package/src/workflows/topology-analyzer.ts +203 -0
- package/src/workflows/validate-workflow.ts +50 -0
- package/src/workflows/workflow-config.ts +75 -0
- package/src/workflows/workflow-serializer.ts +32 -0
- package/src/worktree/branch-freshness.ts +112 -0
- package/src/worktree/cleanup.ts +341 -0
- package/src/worktree/worktree-manager.ts +1204 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the registration modules under `src/extension/registration/`.
|
|
3
|
+
*
|
|
4
|
+
* The orchestrator (`src/extension/register.ts`) builds a single mutable
|
|
5
|
+
* `RegistrationContext` object once and threads it through each install
|
|
6
|
+
* function. This avoids passing 20+ parameters to every module and keeps
|
|
7
|
+
* the orchestrator's mutable state in one place where each module can read
|
|
8
|
+
* it without ceremony.
|
|
9
|
+
*
|
|
10
|
+
* Every field is described inline so refactors can keep the contract
|
|
11
|
+
* observable. If you add a new dependency here, document it; future
|
|
12
|
+
* contributors will look at this file to discover the seam between the
|
|
13
|
+
* orchestrator and its extracted modules.
|
|
14
|
+
*/
|
|
15
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
16
|
+
import type { BatchBarrier } from "../../runtime/batch-barrier.ts";
|
|
17
|
+
import type { createManifestCache } from "../../runtime/manifest-cache.ts";
|
|
18
|
+
import type { CrewScheduler } from "../../runtime/scheduler.ts";
|
|
19
|
+
import type { SubagentManager } from "../../subagents/manager.ts";
|
|
20
|
+
import type { RenderScheduler } from "../../ui/render-scheduler.ts";
|
|
21
|
+
import type { createRunSnapshotCache } from "../../ui/run-snapshot-cache.ts";
|
|
22
|
+
import type { TerminalStatusController } from "../../ui/terminal-status.ts";
|
|
23
|
+
import type { CrewWidgetState } from "../../ui/widget/index.ts";
|
|
24
|
+
import type { RunWatcherRegistry } from "../../utils/run-watcher-registry.ts";
|
|
25
|
+
import type { AsyncNotifierState } from "../async-notifier.ts";
|
|
26
|
+
import type { PiCrewRpcHandle } from "../cross-extension-rpc.ts";
|
|
27
|
+
import type { NotificationDescriptor } from "../notification-router.ts";
|
|
28
|
+
import type { CrashRecoveryCache } from "./crash-recovery-cache.ts";
|
|
29
|
+
import type { LifecycleState } from "./lifecycle.ts";
|
|
30
|
+
import type { ObservabilityState } from "./observability.ts";
|
|
31
|
+
import type { UiState } from "./ui.ts";
|
|
32
|
+
|
|
33
|
+
/** Foreground team-run & subagent abort controllers. */
|
|
34
|
+
export type AbortKey = string | symbol;
|
|
35
|
+
export type AbortControllerMap = Map<AbortKey, AbortController>;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Single auto-recovery cooldown gate entry. Tracked by the render-tick
|
|
39
|
+
* health notifier so the same warning doesn't fire repeatedly within a
|
|
40
|
+
* 5-minute cooldown. Uses LRU-like semantics — see register.ts.
|
|
41
|
+
*/
|
|
42
|
+
export interface AutoRecoveryEntry {
|
|
43
|
+
insertedAt: number;
|
|
44
|
+
lastAccessAt: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Mutable context bag passed from the orchestrator to every
|
|
49
|
+
* registration module. Treat as a shared object: modules read
|
|
50
|
+
* `ctx.X` to consume orchestrator state and may write back to
|
|
51
|
+
* fields like `ctx.currentCtx` to keep it fresh.
|
|
52
|
+
*
|
|
53
|
+
* Splitting this into many interfaces would buy little — the
|
|
54
|
+
* modules genuinely share this state, and TypeScript's structural
|
|
55
|
+
* typing means each module only sees the fields it imports.
|
|
56
|
+
*/
|
|
57
|
+
export interface RegistrationContext {
|
|
58
|
+
pi: ExtensionAPI;
|
|
59
|
+
|
|
60
|
+
// ── Mutable session/runtime state ──────────────────────────────────
|
|
61
|
+
/** Current ExtensionContext (set on session_start, cleared on cleanup). */
|
|
62
|
+
currentCtx: ExtensionContext | undefined;
|
|
63
|
+
/** Bumped on session_start + cleanup. Owner tokens compare against this. */
|
|
64
|
+
sessionGeneration: number;
|
|
65
|
+
/** Idempotency flag for cleanup. */
|
|
66
|
+
cleanedUp: boolean;
|
|
67
|
+
/** Active RPC handle (set once at registration, cleared on cleanup). */
|
|
68
|
+
rpcHandle: PiCrewRpcHandle | undefined;
|
|
69
|
+
|
|
70
|
+
// ── Caches (per-cwd, lazily swapped) ────────────────────────────────
|
|
71
|
+
manifestCache: ReturnType<typeof createManifestCache>;
|
|
72
|
+
runSnapshotCache: ReturnType<typeof createRunSnapshotCache>;
|
|
73
|
+
cacheCwd: string;
|
|
74
|
+
getManifestCache: (cwd: string) => ReturnType<typeof createManifestCache>;
|
|
75
|
+
getRunSnapshotCache: (cwd: string) => ReturnType<typeof createRunSnapshotCache>;
|
|
76
|
+
|
|
77
|
+
// ── UI / widget state ──────────────────────────────────────────────
|
|
78
|
+
widgetState: CrewWidgetState;
|
|
79
|
+
uiState: UiState;
|
|
80
|
+
|
|
81
|
+
// ── Observability + lifecycle state ────────────────────────────────
|
|
82
|
+
observabilityState: ObservabilityState;
|
|
83
|
+
lifecycleState: LifecycleState;
|
|
84
|
+
|
|
85
|
+
// ── Async notifier ─────────────────────────────────────────────────
|
|
86
|
+
notifierState: AsyncNotifierState;
|
|
87
|
+
|
|
88
|
+
// ── Abort controllers ──────────────────────────────────────────────
|
|
89
|
+
foregroundControllers: AbortControllerMap;
|
|
90
|
+
foregroundTeamRunControllers: AbortControllerMap;
|
|
91
|
+
|
|
92
|
+
// ── Render & terminal state ────────────────────────────────────────
|
|
93
|
+
renderScheduler: RenderScheduler | undefined;
|
|
94
|
+
renderSchedulerUnsubscribers: Array<() => void>;
|
|
95
|
+
terminalStatus: TerminalStatusController | undefined;
|
|
96
|
+
terminalStatusActive: boolean;
|
|
97
|
+
|
|
98
|
+
// ── Scheduler + watch timers ───────────────────────────────────────
|
|
99
|
+
crewScheduler: CrewScheduler | undefined;
|
|
100
|
+
preloadTimer: ReturnType<typeof setTimeout> | undefined;
|
|
101
|
+
crewRunWatchers: RunWatcherRegistry | undefined;
|
|
102
|
+
userCrewWatchers: RunWatcherRegistry | undefined;
|
|
103
|
+
|
|
104
|
+
// ── Subagents + batching ───────────────────────────────────────────
|
|
105
|
+
subagentManager: SubagentManager;
|
|
106
|
+
batchBarrier: BatchBarrier;
|
|
107
|
+
|
|
108
|
+
// ── Autocomplete guard (register-once) ─────────────────────────────
|
|
109
|
+
crewAutocompleteRegistered: boolean;
|
|
110
|
+
|
|
111
|
+
// ── Cooldown map for health notifications ──────────────────────────
|
|
112
|
+
autoRecoveryLast: Map<string, AutoRecoveryEntry>;
|
|
113
|
+
/** Defensive cap on autoRecoveryLast size (LRU eviction). */
|
|
114
|
+
AUTO_RECOVERY_LAST_MAX_ENTRIES: number;
|
|
115
|
+
|
|
116
|
+
// ── i18n teardown ──────────────────────────────────────────────────
|
|
117
|
+
disposeI18n: () => void;
|
|
118
|
+
|
|
119
|
+
// ── Global store for cross-instance cleanup handoff ────────────────
|
|
120
|
+
globalStore: Record<string | symbol, unknown>;
|
|
121
|
+
runtimeCleanupStoreKey: symbol;
|
|
122
|
+
|
|
123
|
+
// ── Bound predicates ───────────────────────────────────────────────
|
|
124
|
+
captureSessionGeneration: () => number;
|
|
125
|
+
isOwnerSessionCurrent: (ownerGeneration: number | undefined) => boolean;
|
|
126
|
+
isContextCurrent: (ctx: ExtensionContext, ownerGeneration: number) => boolean;
|
|
127
|
+
telemetryEnabled: () => boolean;
|
|
128
|
+
|
|
129
|
+
// ── Bound notification sink ────────────────────────────────────────
|
|
130
|
+
notifyOperator: (notification: NotificationDescriptor) => void;
|
|
131
|
+
|
|
132
|
+
// ── Bound cleanup + lifecycle methods ──────────────────────────────
|
|
133
|
+
cleanupSessionResourcesOnly: () => void;
|
|
134
|
+
cleanupRuntime: () => void;
|
|
135
|
+
disposeRenderSchedulerSubscriptions: () => void;
|
|
136
|
+
stopSessionBoundSubagents: () => void;
|
|
137
|
+
|
|
138
|
+
// ── Bound helpers (configure* lazily install lifecycle/observability) ──
|
|
139
|
+
configureNotifications: (ctx: ExtensionContext) => void;
|
|
140
|
+
configureObservability: (ctx: ExtensionContext) => void;
|
|
141
|
+
configureDeliveryCoordinator: () => void;
|
|
142
|
+
importCrashRecovery: () => Promise<CrashRecoveryCache>;
|
|
143
|
+
purgeStaleActiveRunIndexSyncIfLoaded: () => void;
|
|
144
|
+
|
|
145
|
+
// ── Foreground helpers (consumed by tools + commands) ─────────────
|
|
146
|
+
startForegroundRun: (ctx: ExtensionContext, runner: (signal?: AbortSignal) => Promise<void>, runId?: string) => void;
|
|
147
|
+
abortForegroundRun: (runId: string) => boolean;
|
|
148
|
+
openLiveSidebar: (ctx: ExtensionContext, runId: string) => void;
|
|
149
|
+
/**
|
|
150
|
+
* Phase 0 inter-pi broker lifecycle controller. Set by `register.ts`
|
|
151
|
+
* after `installSessionLifecycleHandlers`. The controller is a no-op
|
|
152
|
+
* when the broker is disabled or the current process is a subagent;
|
|
153
|
+
* callers (e.g. child-pi-spawn consumers) MUST handle the case where
|
|
154
|
+
* `issueForChild` returns undefined. The controller is stopped
|
|
155
|
+
* during session_shutdown via `stop()`.
|
|
156
|
+
*/
|
|
157
|
+
brokerController: import("./lifecycle-handlers.ts").CrewBrokerLifecycleController | undefined;
|
|
158
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime cleanup installer for pi-crew.
|
|
3
|
+
*
|
|
4
|
+
* Owns the two cleanup functions used at session boundaries:
|
|
5
|
+
* • `cleanupRuntime` — full shutdown. Aborts foreground team runs,
|
|
6
|
+
* stops scheduler, disposes all caches, disposes notifier, etc.
|
|
7
|
+
* • `cleanupSessionResourcesOnly` — session switch (resume/new/fork).
|
|
8
|
+
* Same as above but does NOT abort foreground team runs — they share
|
|
9
|
+
* the process with the session and clean up naturally when the
|
|
10
|
+
* ExtensionContext tears down.
|
|
11
|
+
*
|
|
12
|
+
* Both also handle the global-runtime-handoff symbol: if a previous
|
|
13
|
+
* pi-crew instance left a cleanup handler in `globalStore[runtimeCleanupStoreKey]`,
|
|
14
|
+
* it is fired-and-forgotten before we install our own.
|
|
15
|
+
*
|
|
16
|
+
* Other bounded helpers used by these functions (stopSessionBoundSubagents,
|
|
17
|
+
* disposeRenderSchedulerSubscriptions) are co-located here because they
|
|
18
|
+
* belong to the same lifecycle phase.
|
|
19
|
+
*/
|
|
20
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
21
|
+
import { loadConfig } from "../../config/config.ts";
|
|
22
|
+
import { clearHooksScoped } from "../../hooks/registry.ts";
|
|
23
|
+
import { terminateActiveChildPiProcesses } from "../../subagents/spawn.ts";
|
|
24
|
+
import { clearPiCrewPowerbar, disposePowerbarCoalescer } from "../../ui/powerbar-publisher.ts";
|
|
25
|
+
import { stopCrewWidget } from "../../ui/widget/index.ts";
|
|
26
|
+
import { logInternalError } from "../../utils/internal-error.ts";
|
|
27
|
+
import { clearProjectRootCache } from "../../utils/paths.ts";
|
|
28
|
+
import { stopAsyncRunNotifier } from "../async-notifier.ts";
|
|
29
|
+
import { uninstallCrewGlobalRegistry } from "../team-tool.ts";
|
|
30
|
+
import { disposeNotifications } from "./lifecycle.ts";
|
|
31
|
+
import { disposeObservability } from "./observability.ts";
|
|
32
|
+
import type { RegistrationContext } from "./registration-types.ts";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Install both cleanup functions into the registration context AND wire
|
|
36
|
+
* the global handoff symbol so a previous instance's cleanup runs first.
|
|
37
|
+
*/
|
|
38
|
+
export function installRuntimeCleanup(_pi: ExtensionAPI, ctx: RegistrationContext): void {
|
|
39
|
+
// Best-effort cleanup of the previous runtime instance. Errors are logged but
|
|
40
|
+
// do not halt new registration — a failing cleanup from a prior instance is
|
|
41
|
+
// preferable to leaving pi-crew unregistered, and any stale state from the
|
|
42
|
+
// previous instance will be reconciled when the new instance initializes.
|
|
43
|
+
const previousRuntimeCleanup = ctx.globalStore[ctx.runtimeCleanupStoreKey];
|
|
44
|
+
if (typeof previousRuntimeCleanup === "function") {
|
|
45
|
+
try {
|
|
46
|
+
previousRuntimeCleanup();
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logInternalError("register.prev-cleanup", error);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
ctx.cleanupSessionResourcesOnly = buildCleanupSessionResourcesOnly(ctx);
|
|
53
|
+
ctx.cleanupRuntime = buildCleanupRuntime(ctx);
|
|
54
|
+
ctx.disposeRenderSchedulerSubscriptions = buildDisposeRenderSchedulerSubscriptions(ctx);
|
|
55
|
+
ctx.stopSessionBoundSubagents = buildStopSessionBoundSubagents(ctx);
|
|
56
|
+
|
|
57
|
+
ctx.globalStore[ctx.runtimeCleanupStoreKey] = ctx.cleanupRuntime;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Build a cleanup function for session-switch events. Same teardown as
|
|
62
|
+
* cleanupRuntime except foreground team-run controllers are NOT aborted.
|
|
63
|
+
*/
|
|
64
|
+
function buildCleanupSessionResourcesOnly(ctx: RegistrationContext): () => void {
|
|
65
|
+
return (): void => {
|
|
66
|
+
if (ctx.cleanedUp) return;
|
|
67
|
+
ctx.cleanedUp = true;
|
|
68
|
+
if (ctx.preloadTimer) {
|
|
69
|
+
clearTimeout(ctx.preloadTimer);
|
|
70
|
+
ctx.preloadTimer = undefined;
|
|
71
|
+
}
|
|
72
|
+
ctx.crewRunWatchers?.closeAll();
|
|
73
|
+
ctx.crewRunWatchers = undefined;
|
|
74
|
+
ctx.userCrewWatchers?.closeAll();
|
|
75
|
+
ctx.userCrewWatchers = undefined;
|
|
76
|
+
ctx.stopSessionBoundSubagents();
|
|
77
|
+
// P0 fix: Do NOT abort foreground team runs on session switch.
|
|
78
|
+
// Foreground team runs run in the same process as the session; they naturally clean up
|
|
79
|
+
// when the session context is torn down. Only subagents need explicit abort on switch.
|
|
80
|
+
// Foreground runs will be aborted by cleanupRuntime() during actual session shutdown.
|
|
81
|
+
ctx.crewScheduler?.stop();
|
|
82
|
+
stopAsyncRunNotifier(ctx.notifierState);
|
|
83
|
+
|
|
84
|
+
// P0: Purge all stale active-run-index entries on session cleanup.
|
|
85
|
+
ctx.purgeStaleActiveRunIndexSyncIfLoaded();
|
|
86
|
+
|
|
87
|
+
stopCrewWidget(ctx.currentCtx, ctx.widgetState, ctx.currentCtx ? loadConfig(ctx.currentCtx.cwd).config.ui : undefined);
|
|
88
|
+
clearPiCrewPowerbar(ctx.pi.events);
|
|
89
|
+
disposePowerbarCoalescer();
|
|
90
|
+
void disposeObservability(ctx.observabilityState, ctx.cleanedUp);
|
|
91
|
+
ctx.lifecycleState.deliveryCoordinator?.dispose();
|
|
92
|
+
clearHooksScoped();
|
|
93
|
+
uninstallCrewGlobalRegistry();
|
|
94
|
+
ctx.lifecycleState.overflowTracker?.dispose();
|
|
95
|
+
ctx.lifecycleState.deliveryCoordinator = undefined;
|
|
96
|
+
ctx.lifecycleState.overflowTracker = undefined;
|
|
97
|
+
ctx.manifestCache.dispose();
|
|
98
|
+
ctx.runSnapshotCache.dispose?.();
|
|
99
|
+
clearProjectRootCache();
|
|
100
|
+
ctx.renderScheduler?.dispose();
|
|
101
|
+
ctx.renderScheduler = undefined;
|
|
102
|
+
ctx.autoRecoveryLast.clear();
|
|
103
|
+
disposeNotifications(ctx.lifecycleState);
|
|
104
|
+
ctx.rpcHandle?.unsubscribe();
|
|
105
|
+
ctx.rpcHandle = undefined;
|
|
106
|
+
ctx.disposeI18n();
|
|
107
|
+
ctx.sessionGeneration += 1;
|
|
108
|
+
ctx.currentCtx = undefined;
|
|
109
|
+
if (ctx.globalStore[ctx.runtimeCleanupStoreKey] === ctx.cleanupSessionResourcesOnly) {
|
|
110
|
+
delete ctx.globalStore[ctx.runtimeCleanupStoreKey];
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Build the full shutdown cleanup. Aborts both subagent controllers AND
|
|
117
|
+
* foreground team-run controllers.
|
|
118
|
+
*/
|
|
119
|
+
function buildCleanupRuntime(ctx: RegistrationContext): () => void {
|
|
120
|
+
return (): void => {
|
|
121
|
+
if (ctx.cleanedUp) return;
|
|
122
|
+
ctx.cleanedUp = true;
|
|
123
|
+
if (ctx.preloadTimer) {
|
|
124
|
+
clearTimeout(ctx.preloadTimer);
|
|
125
|
+
ctx.preloadTimer = undefined;
|
|
126
|
+
}
|
|
127
|
+
ctx.crewRunWatchers?.closeAll();
|
|
128
|
+
ctx.crewRunWatchers = undefined;
|
|
129
|
+
ctx.userCrewWatchers?.closeAll();
|
|
130
|
+
ctx.userCrewWatchers = undefined;
|
|
131
|
+
ctx.stopSessionBoundSubagents();
|
|
132
|
+
// P0 fix: also abort foreground team runs on session shutdown (not on session switch).
|
|
133
|
+
// This is the only place where foreground team run controllers should be aborted.
|
|
134
|
+
for (const controller of ctx.foregroundTeamRunControllers.values()) controller.abort();
|
|
135
|
+
ctx.foregroundTeamRunControllers.clear();
|
|
136
|
+
ctx.crewScheduler?.stop();
|
|
137
|
+
stopAsyncRunNotifier(ctx.notifierState);
|
|
138
|
+
|
|
139
|
+
// Best-effort: kill any async background runners that are still alive.
|
|
140
|
+
// NOTE: Background runners are designed to outlive the Pi session.
|
|
141
|
+
// Do NOT kill them on session_shutdown — they manage their own lifecycle.
|
|
142
|
+
// Only kill foreground child processes (handled above via abort controllers).
|
|
143
|
+
// See Bug #17: killing async runners on session_shutdown was the root cause
|
|
144
|
+
// of the "background runner dies at ~35s" bug.
|
|
145
|
+
// (kill-async block intentionally omitted — see history.)
|
|
146
|
+
|
|
147
|
+
// P0: Purge all stale active-run-index entries on session cleanup.
|
|
148
|
+
// This handles: normal exit, SIGTERM, Ctrl+C — any case where cleanupRuntime fires.
|
|
149
|
+
// For SIGKILL / crash / SIGHUP (where cleanupRuntime does NOT fire),
|
|
150
|
+
// purgeStaleActiveRunIndex() runs at next session_start instead.
|
|
151
|
+
// 2.7: only purge if crash-recovery has been loaded already; otherwise
|
|
152
|
+
// the next session_start will fire the lazy import + purge.
|
|
153
|
+
ctx.purgeStaleActiveRunIndexSyncIfLoaded();
|
|
154
|
+
|
|
155
|
+
stopCrewWidget(ctx.currentCtx, ctx.widgetState, ctx.currentCtx ? loadConfig(ctx.currentCtx.cwd).config.ui : undefined);
|
|
156
|
+
clearPiCrewPowerbar(ctx.pi.events);
|
|
157
|
+
disposePowerbarCoalescer();
|
|
158
|
+
// H3-L2 split: observability disposal delegated to registration/observability.ts.
|
|
159
|
+
void disposeObservability(ctx.observabilityState, ctx.cleanedUp);
|
|
160
|
+
ctx.lifecycleState.deliveryCoordinator?.dispose();
|
|
161
|
+
clearHooksScoped();
|
|
162
|
+
uninstallCrewGlobalRegistry();
|
|
163
|
+
ctx.lifecycleState.overflowTracker?.dispose();
|
|
164
|
+
ctx.lifecycleState.deliveryCoordinator = undefined;
|
|
165
|
+
ctx.lifecycleState.overflowTracker = undefined;
|
|
166
|
+
ctx.manifestCache.dispose();
|
|
167
|
+
ctx.runSnapshotCache.dispose?.();
|
|
168
|
+
// 2.10: drop cached findRepoRoot results when the extension reloads.
|
|
169
|
+
clearProjectRootCache();
|
|
170
|
+
ctx.renderScheduler?.dispose();
|
|
171
|
+
ctx.renderScheduler = undefined;
|
|
172
|
+
ctx.autoRecoveryLast.clear();
|
|
173
|
+
// H3-L2 split: notification disposal delegated to registration/lifecycle.ts.
|
|
174
|
+
disposeNotifications(ctx.lifecycleState);
|
|
175
|
+
ctx.rpcHandle?.unsubscribe();
|
|
176
|
+
ctx.rpcHandle = undefined;
|
|
177
|
+
ctx.disposeI18n();
|
|
178
|
+
ctx.sessionGeneration += 1;
|
|
179
|
+
ctx.currentCtx = undefined;
|
|
180
|
+
if (ctx.globalStore[ctx.runtimeCleanupStoreKey] === ctx.cleanupRuntime) {
|
|
181
|
+
delete ctx.globalStore[ctx.runtimeCleanupStoreKey];
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Build the dispose-render-scheduler-subscriptions helper. Unsubscribes
|
|
188
|
+
* every entry in `ctx.renderSchedulerUnsubscribers`, then clears the list.
|
|
189
|
+
* Errors per-entry are logged but don't abort the loop.
|
|
190
|
+
*/
|
|
191
|
+
function buildDisposeRenderSchedulerSubscriptions(ctx: RegistrationContext): () => void {
|
|
192
|
+
return (): void => {
|
|
193
|
+
for (const unsub of ctx.renderSchedulerUnsubscribers.splice(0)) {
|
|
194
|
+
try {
|
|
195
|
+
unsub();
|
|
196
|
+
} catch (error) {
|
|
197
|
+
logInternalError("register.renderScheduler.unsubscribe", error);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Build the stop-session-bound-subagents helper. Aborts every foreground
|
|
205
|
+
* subagent controller (NOT foreground team runs — those are owned by the
|
|
206
|
+
* team-tool, not the subagent manager). Disposes render scheduler,
|
|
207
|
+
* terminal status, live sidebar, and clears the powerbar.
|
|
208
|
+
*/
|
|
209
|
+
function buildStopSessionBoundSubagents(ctx: RegistrationContext): () => void {
|
|
210
|
+
return (): void => {
|
|
211
|
+
// Only abort subagent controllers — NOT foreground team runs.
|
|
212
|
+
// Foreground team runs are bound to the session lifecycle; they will be aborted
|
|
213
|
+
// by cleanupRuntime during session_shutdown.
|
|
214
|
+
for (const controller of ctx.foregroundControllers.values()) controller.abort();
|
|
215
|
+
ctx.foregroundControllers.clear();
|
|
216
|
+
ctx.subagentManager.abortAll("Session switching — foreground subagents cancelled.");
|
|
217
|
+
terminateActiveChildPiProcesses();
|
|
218
|
+
ctx.disposeRenderSchedulerSubscriptions();
|
|
219
|
+
ctx.renderScheduler?.dispose();
|
|
220
|
+
ctx.renderScheduler = undefined;
|
|
221
|
+
ctx.terminalStatus?.dispose();
|
|
222
|
+
ctx.terminalStatus = undefined;
|
|
223
|
+
ctx.terminalStatusActive = false;
|
|
224
|
+
ctx.uiState.liveSidebarRunId = undefined;
|
|
225
|
+
if (ctx.currentCtx) {
|
|
226
|
+
stopCrewWidget(ctx.currentCtx, ctx.widgetState, loadConfig(ctx.currentCtx.cwd).config.ui);
|
|
227
|
+
}
|
|
228
|
+
clearPiCrewPowerbar(ctx.pi.events);
|
|
229
|
+
};
|
|
230
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { loadRunManifestById } from "../../state/state-store.ts";
|
|
4
|
+
import { type SubagentRecord, type SubagentSpawnOptions, savePersistedSubagentRecord } from "../../subagents/manager.ts";
|
|
5
|
+
import { resolveRealContainedPath } from "../../utils/safe-paths.ts";
|
|
6
|
+
|
|
7
|
+
interface FollowUpCapablePi {
|
|
8
|
+
sendMessage?: (message: unknown, options?: unknown) => void;
|
|
9
|
+
sendUserMessage?: (content: string, options?: unknown) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function sendFollowUp(pi: ExtensionAPI, content: string): void {
|
|
13
|
+
const api = pi as unknown as FollowUpCapablePi;
|
|
14
|
+
if (typeof api.sendMessage !== "function") return;
|
|
15
|
+
api.sendMessage.call(
|
|
16
|
+
pi,
|
|
17
|
+
{ customType: "pi-crew-subagent-notification", content, display: true },
|
|
18
|
+
{ deliverAs: "followUp", triggerTurn: true },
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function sendAgentWakeUp(pi: ExtensionAPI, content: string): boolean {
|
|
23
|
+
const api = pi as unknown as FollowUpCapablePi;
|
|
24
|
+
try {
|
|
25
|
+
if (typeof api.sendUserMessage === "function") {
|
|
26
|
+
api.sendUserMessage.call(pi, content, {
|
|
27
|
+
deliverAs: "followUp",
|
|
28
|
+
triggerTurn: true,
|
|
29
|
+
});
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
if (typeof api.sendMessage === "function") {
|
|
33
|
+
api.sendMessage.call(
|
|
34
|
+
pi,
|
|
35
|
+
{
|
|
36
|
+
customType: "pi-crew-subagent-wakeup",
|
|
37
|
+
content,
|
|
38
|
+
display: true,
|
|
39
|
+
},
|
|
40
|
+
{ deliverAs: "followUp", triggerTurn: true },
|
|
41
|
+
);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
} catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function refreshPersistedSubagentRecord(ctx: ExtensionContext | ExtensionCommandContext, record: SubagentRecord): SubagentRecord {
|
|
51
|
+
if (!record.runId) return record;
|
|
52
|
+
const loaded = loadRunManifestById(ctx.cwd, record.runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
|
|
53
|
+
if (!loaded) return record;
|
|
54
|
+
if (
|
|
55
|
+
loaded.manifest.status === "completed" ||
|
|
56
|
+
loaded.manifest.status === "failed" ||
|
|
57
|
+
loaded.manifest.status === "cancelled" ||
|
|
58
|
+
loaded.manifest.status === "blocked"
|
|
59
|
+
) {
|
|
60
|
+
const refreshed = {
|
|
61
|
+
...record,
|
|
62
|
+
status: loaded.manifest.status,
|
|
63
|
+
error: loaded.manifest.status === "completed" || loaded.manifest.status === "blocked" ? undefined : loaded.manifest.summary,
|
|
64
|
+
completedAt: loaded.manifest.status === "blocked" ? undefined : (record.completedAt ?? Date.now()),
|
|
65
|
+
};
|
|
66
|
+
savePersistedSubagentRecord(ctx.cwd, refreshed);
|
|
67
|
+
return refreshed;
|
|
68
|
+
}
|
|
69
|
+
return record;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function formatSubagentRecord(record: SubagentRecord): string {
|
|
73
|
+
const duration = record.completedAt ? `${Math.round((record.completedAt - record.startedAt) / 1000)}s` : "running";
|
|
74
|
+
return [
|
|
75
|
+
`Agent: ${record.id}`,
|
|
76
|
+
`Type: ${record.type}`,
|
|
77
|
+
`Status: ${record.status}`,
|
|
78
|
+
record.runId ? `Run: ${record.runId}` : undefined,
|
|
79
|
+
`Description: ${record.description}`,
|
|
80
|
+
record.model ? `Model: ${record.model}` : undefined,
|
|
81
|
+
`Duration: ${duration}`,
|
|
82
|
+
record.error ? `Error: ${record.error}` : undefined,
|
|
83
|
+
]
|
|
84
|
+
.filter((line): line is string => Boolean(line))
|
|
85
|
+
.join("\n");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function readSubagentRunResult(ctx: ExtensionContext | ExtensionCommandContext, record: SubagentRecord): string | undefined {
|
|
89
|
+
if (!record.runId) return record.result;
|
|
90
|
+
const loaded = loadRunManifestById(ctx.cwd, record.runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
|
|
91
|
+
const task = loaded?.tasks.find((item) => item.resultArtifact) ?? loaded?.tasks[0];
|
|
92
|
+
const artifactPath = task?.resultArtifact?.path;
|
|
93
|
+
if (!artifactPath || !loaded) return undefined;
|
|
94
|
+
try {
|
|
95
|
+
const safePath = resolveRealContainedPath(loaded.manifest.artifactsRoot, artifactPath);
|
|
96
|
+
return fs.readFileSync(safePath, "utf-8").trim();
|
|
97
|
+
} catch {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function subagentToolResult(text: string, details: Record<string, unknown> = {}, isError = false) {
|
|
103
|
+
return { content: [{ type: "text" as const, text }], details, isError };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function parseSkillParam(value: unknown): string | string[] | false | undefined {
|
|
107
|
+
if (value === false) return false;
|
|
108
|
+
if (typeof value === "string") return value;
|
|
109
|
+
if (Array.isArray(value) && value.every((entry) => typeof entry === "string")) return value;
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function __test__subagentSpawnParams(params: Record<string, unknown>, ctx: Pick<ExtensionContext, "cwd">): SubagentSpawnOptions {
|
|
114
|
+
return {
|
|
115
|
+
cwd: ctx.cwd,
|
|
116
|
+
type: typeof params.subagent_type === "string" && params.subagent_type.trim() ? params.subagent_type.trim() : "executor",
|
|
117
|
+
description: typeof params.description === "string" && params.description.trim() ? params.description.trim() : "pi-crew subagent",
|
|
118
|
+
prompt: typeof params.prompt === "string" ? params.prompt : "",
|
|
119
|
+
background: params.run_in_background === true,
|
|
120
|
+
model: typeof params.model === "string" && params.model.trim() ? params.model.trim() : undefined,
|
|
121
|
+
skill: parseSkillParam(params.skill),
|
|
122
|
+
maxTurns: typeof params.max_turns === "number" && Number.isFinite(params.max_turns) ? params.max_turns : undefined,
|
|
123
|
+
batchId: typeof params.batch_id === "string" && params.batch_id.trim() ? params.batch_id.trim() : undefined,
|
|
124
|
+
};
|
|
125
|
+
}
|