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,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
|
+
}
|