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,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-summarize commands for team tool.
|
|
3
|
+
* Provides on/off/status commands for auto-summarization.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { type AutoSummarizeService, createAutoSummarizeService, DEFAULT_AUTO_SUMMARIZE_CONFIG } from "../../runtime/auto-summarize.ts";
|
|
7
|
+
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
8
|
+
import type { PiTeamsToolResult } from "../tool-result.ts";
|
|
9
|
+
import { result, type TeamContext } from "./context.ts";
|
|
10
|
+
|
|
11
|
+
// Global auto-summarize service instance for CLI usage
|
|
12
|
+
let globalAutoSummarize: AutoSummarizeService | null = null;
|
|
13
|
+
|
|
14
|
+
function getAutoSummarize(): AutoSummarizeService {
|
|
15
|
+
if (!globalAutoSummarize) {
|
|
16
|
+
globalAutoSummarize = createAutoSummarizeService();
|
|
17
|
+
}
|
|
18
|
+
return globalAutoSummarize;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function handleAutoSummarizeOn(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
|
|
22
|
+
const service = getAutoSummarize();
|
|
23
|
+
const cfg = params.config ?? {};
|
|
24
|
+
|
|
25
|
+
// Apply config updates if provided
|
|
26
|
+
if (cfg.threshold !== undefined) {
|
|
27
|
+
const threshold = typeof cfg.threshold === "number" ? cfg.threshold : parseInt(String(cfg.threshold), 10);
|
|
28
|
+
if (!Number.isNaN(threshold) && threshold >= 0) {
|
|
29
|
+
service.setThreshold(threshold);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (cfg.minTools !== undefined) {
|
|
34
|
+
const minTools = typeof cfg.minTools === "number" ? cfg.minTools : parseInt(String(cfg.minTools), 10);
|
|
35
|
+
if (!Number.isNaN(minTools) && minTools >= 0) {
|
|
36
|
+
service.setMinToolsUsed(minTools);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const previousState = service.isEnabled();
|
|
41
|
+
service.enable();
|
|
42
|
+
const config = service.getConfig();
|
|
43
|
+
|
|
44
|
+
return result(
|
|
45
|
+
[
|
|
46
|
+
`Auto-summarize enabled.`,
|
|
47
|
+
``,
|
|
48
|
+
`Configuration:`,
|
|
49
|
+
` Token threshold: ${config.threshold}`,
|
|
50
|
+
` Min tools: ${config.minToolsUsed}`,
|
|
51
|
+
` Collapse context: ${config.collapseContext}`,
|
|
52
|
+
].join("\n"),
|
|
53
|
+
{ action: "auto-summarize", status: "ok" },
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function handleAutoSummarizeOff(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
|
|
58
|
+
const service = getAutoSummarize();
|
|
59
|
+
|
|
60
|
+
service.disable();
|
|
61
|
+
|
|
62
|
+
return result("Auto-summarize disabled.", {
|
|
63
|
+
action: "auto-summarize",
|
|
64
|
+
status: "ok",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function handleAutoSummarizeStatus(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
|
|
69
|
+
const service = getAutoSummarize();
|
|
70
|
+
const config = service.getConfig();
|
|
71
|
+
const isEnabled = service.isEnabled();
|
|
72
|
+
|
|
73
|
+
return result(
|
|
74
|
+
[
|
|
75
|
+
`Auto-summarize Status`,
|
|
76
|
+
`──────────────────`,
|
|
77
|
+
`Enabled: ${isEnabled ? "Yes" : "No"}`,
|
|
78
|
+
``,
|
|
79
|
+
`Configuration:`,
|
|
80
|
+
` Token threshold: ${config.threshold} (default: ${DEFAULT_AUTO_SUMMARIZE_CONFIG.threshold})`,
|
|
81
|
+
` Min tools used: ${config.minToolsUsed} (default: ${DEFAULT_AUTO_SUMMARIZE_CONFIG.minToolsUsed})`,
|
|
82
|
+
` Collapse context: ${config.collapseContext ? "Yes" : "No"} (default: ${DEFAULT_AUTO_SUMMARIZE_CONFIG.collapseContext ? "Yes" : "No"})`,
|
|
83
|
+
``,
|
|
84
|
+
`Triggers:`,
|
|
85
|
+
` - Token count >= ${config.threshold}`,
|
|
86
|
+
` - Tool count >= ${config.minToolsUsed}`,
|
|
87
|
+
` - High token-to-tool ratio (>1000 tokens/tool with 3+ tools)`,
|
|
88
|
+
].join("\n"),
|
|
89
|
+
{ action: "auto-summarize", status: "ok" },
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function handleAutoSummarizeConfig(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
|
|
94
|
+
const service = getAutoSummarize();
|
|
95
|
+
const cfg = params.config ?? {};
|
|
96
|
+
|
|
97
|
+
// Parse config options
|
|
98
|
+
const updates: {
|
|
99
|
+
threshold?: number;
|
|
100
|
+
minTools?: number;
|
|
101
|
+
collapseContext?: boolean;
|
|
102
|
+
} = {};
|
|
103
|
+
|
|
104
|
+
if (cfg.threshold !== undefined) {
|
|
105
|
+
const threshold = typeof cfg.threshold === "number" ? cfg.threshold : parseInt(String(cfg.threshold), 10);
|
|
106
|
+
if (!Number.isNaN(threshold) && threshold >= 0) {
|
|
107
|
+
updates.threshold = threshold;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (cfg.minTools !== undefined) {
|
|
112
|
+
const minTools = typeof cfg.minTools === "number" ? cfg.minTools : parseInt(String(cfg.minTools), 10);
|
|
113
|
+
if (!Number.isNaN(minTools) && minTools >= 0) {
|
|
114
|
+
updates.minTools = minTools;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (cfg.collapseContext !== undefined) {
|
|
119
|
+
updates.collapseContext = Boolean(cfg.collapseContext);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (Object.keys(updates).length > 0) {
|
|
123
|
+
service.updateConfig(updates);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const config = service.getConfig();
|
|
127
|
+
|
|
128
|
+
return result(
|
|
129
|
+
[
|
|
130
|
+
`Auto-summarize configuration updated.`,
|
|
131
|
+
``,
|
|
132
|
+
`Current settings:`,
|
|
133
|
+
` Token threshold: ${config.threshold}`,
|
|
134
|
+
` Min tools used: ${config.minToolsUsed}`,
|
|
135
|
+
` Collapse context: ${config.collapseContext ? "Yes" : "No"}`,
|
|
136
|
+
` Enabled: ${config.enabled ? "Yes" : "No"}`,
|
|
137
|
+
].join("\n"),
|
|
138
|
+
{ action: "auto-summarize", status: "ok" },
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
// Re-export for team-tool.ts
|
|
142
|
+
export { createAutoSummarizeService } from "../../runtime/auto-summarize.ts";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { runEventBus } from "../../ui/run-event-bus.ts";
|
|
2
|
+
import type { RunSnapshotCache } from "../../ui/run-snapshot-cache.ts";
|
|
3
|
+
|
|
4
|
+
export interface CacheControlDeps {
|
|
5
|
+
getRunSnapshotCache: (cwd: string) => RunSnapshotCache;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Invalidate the run snapshot cache for a specific runId and emit
|
|
10
|
+
* a runEventBus event so the render scheduler coalescer fires immediately.
|
|
11
|
+
* Call this after any state mutation that changes task/agent status.
|
|
12
|
+
*/
|
|
13
|
+
export function invalidateSnapshot(runId: string, runCwd: string, deps: CacheControlDeps): void {
|
|
14
|
+
// 1. Invalidate snapshot cache entry
|
|
15
|
+
deps.getRunSnapshotCache(runCwd).invalidate(runId);
|
|
16
|
+
|
|
17
|
+
// 2. Emit runEventBus event so renderScheduler coalescer fires
|
|
18
|
+
runEventBus.emit({ runId, type: "run.cache_invalidated" });
|
|
19
|
+
}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { appendHookEvent, executeHook } from "../../hooks/registry.ts";
|
|
2
|
+
import { buildSyntheticTerminalEvidence, type CancellationReason, cancellationReasonFromUnknown } from "../../runtime/cancellation.ts";
|
|
3
|
+
import { killProcessPid } from "../../runtime/child-pi.ts";
|
|
4
|
+
import { recordFromTask, saveCrewAgents } from "../../runtime/crew-agent-records.ts";
|
|
5
|
+
import { writeForegroundInterruptRequest } from "../../runtime/foreground-control.ts";
|
|
6
|
+
import { terminateLiveAgentsForRun } from "../../runtime/live-agent-manager.ts";
|
|
7
|
+
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
8
|
+
import { appendEvent } from "../../state/event-log.ts";
|
|
9
|
+
import { withRunLockSync } from "../../state/locks.ts";
|
|
10
|
+
import { loadRunManifestById, saveRunTasks, updateRunStatus } from "../../state/state-store.ts";
|
|
11
|
+
import { logInternalError } from "../../utils/internal-error.ts";
|
|
12
|
+
import { locateRunCwd } from "../team-tool.ts";
|
|
13
|
+
import type { PiTeamsToolResult } from "../tool-result.ts";
|
|
14
|
+
import { type CacheControlDeps, invalidateSnapshot } from "./cache-control.ts";
|
|
15
|
+
import { result, type TeamContext } from "./context.ts";
|
|
16
|
+
import { enforceDestructiveIntent, intentFromConfig } from "./intent-policy.ts";
|
|
17
|
+
import { RUN_NOT_FOUND_HINT } from "./run-not-found.ts";
|
|
18
|
+
|
|
19
|
+
export interface AbortOwnedResult {
|
|
20
|
+
abortedIds: string[];
|
|
21
|
+
missingIds: string[];
|
|
22
|
+
foreignIds: string[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Classify task IDs by ownership.
|
|
27
|
+
* - Tasks with status "queued" or "running" that belong to the current session → abortedIds
|
|
28
|
+
* - Task IDs not found in the run → missingIds
|
|
29
|
+
* - Tasks with status "queued" or "running" that belong to a different session → foreignIds
|
|
30
|
+
* - Tasks already completed/failed/cancelled → neither (not included in any list)
|
|
31
|
+
*
|
|
32
|
+
* Currently, task ownership is determined by the manifest's run-level ownership.
|
|
33
|
+
* Since tasks in a single run are all owned by the session that created the run,
|
|
34
|
+
* the ownerSessionId comes from the context. Foreign detection compares
|
|
35
|
+
* the requesting session against the run's creating session.
|
|
36
|
+
*/
|
|
37
|
+
export function abortOwned(runId: string, taskIds: string[] | undefined, ctx: TeamContext, force?: boolean): AbortOwnedResult {
|
|
38
|
+
const runCwd = locateRunCwd(runId, ctx.cwd);
|
|
39
|
+
if (!runCwd) return { abortedIds: [], missingIds: taskIds ?? [], foreignIds: [] };
|
|
40
|
+
const loaded = loadRunManifestById(runCwd, runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
|
|
41
|
+
if (!loaded) return { abortedIds: [], missingIds: taskIds ?? [], foreignIds: [] };
|
|
42
|
+
|
|
43
|
+
const result: AbortOwnedResult = {
|
|
44
|
+
abortedIds: [],
|
|
45
|
+
missingIds: [],
|
|
46
|
+
foreignIds: [],
|
|
47
|
+
};
|
|
48
|
+
const taskMap = new Map(loaded.tasks.map((t) => [t.id, t] as const));
|
|
49
|
+
const targetIds = taskIds ?? loaded.tasks.map((t) => t.id);
|
|
50
|
+
const foreignRun = typeof loaded.manifest.ownerSessionId === "string" && loaded.manifest.ownerSessionId !== ctx.sessionId;
|
|
51
|
+
|
|
52
|
+
for (const id of targetIds) {
|
|
53
|
+
const task = taskMap.get(id);
|
|
54
|
+
if (!task) {
|
|
55
|
+
result.missingIds.push(id);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (task.status !== "queued" && task.status !== "running" && task.status !== "waiting") continue;
|
|
59
|
+
if (foreignRun && force !== true) {
|
|
60
|
+
result.foreignIds.push(id);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
result.abortedIds.push(id);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function configFromParams(params: TeamToolParamsValue): Record<string, unknown> | undefined {
|
|
70
|
+
return params.config && typeof params.config === "object" && !Array.isArray(params.config) ? params.config : undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function cancelReasonFromParams(params: TeamToolParamsValue): CancellationReason {
|
|
74
|
+
const config = configFromParams(params);
|
|
75
|
+
const rawReason = config?.reason ?? config?.cancelReason;
|
|
76
|
+
const reason =
|
|
77
|
+
rawReason === undefined
|
|
78
|
+
? {
|
|
79
|
+
code: "caller_cancelled" as const,
|
|
80
|
+
message: "Run cancelled by user request.",
|
|
81
|
+
}
|
|
82
|
+
: cancellationReasonFromUnknown(rawReason);
|
|
83
|
+
return { code: reason.code, message: reason.message };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export async function handleRetry(params: TeamToolParamsValue, ctx: TeamContext, deps?: CacheControlDeps): Promise<PiTeamsToolResult> {
|
|
87
|
+
if (!params.runId) return result("Retry requires runId.", { action: "retry", status: "error" }, true);
|
|
88
|
+
const runCwd = locateRunCwd(params.runId, ctx.cwd);
|
|
89
|
+
if (!runCwd) return result(`Run '${params.runId}' not found.${RUN_NOT_FOUND_HINT}`, { action: "retry", status: "error" }, true);
|
|
90
|
+
const loaded = loadRunManifestById(runCwd, params.runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
|
|
91
|
+
if (!loaded) return result(`Run '${params.runId}' not found.${RUN_NOT_FOUND_HINT}`, { action: "retry", status: "error" }, true);
|
|
92
|
+
|
|
93
|
+
// Pre-lock ownership check: reject foreign-owned runs unless force is set
|
|
94
|
+
const foreignRun = typeof loaded.manifest.ownerSessionId === "string" && loaded.manifest.ownerSessionId !== ctx.sessionId;
|
|
95
|
+
if (foreignRun && params.force !== true) {
|
|
96
|
+
return result(
|
|
97
|
+
`Run ${loaded.manifest.runId} belongs to another session. Use force: true to override.`,
|
|
98
|
+
{ action: "retry", status: "error", runId: loaded.manifest.runId },
|
|
99
|
+
true,
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Execute before_retry hook after ownership confirmed, before mutation lock
|
|
104
|
+
const hookReport = await executeHook("before_retry", {
|
|
105
|
+
runId: loaded.manifest.runId,
|
|
106
|
+
cwd: ctx.cwd,
|
|
107
|
+
});
|
|
108
|
+
appendHookEvent(loaded.manifest, hookReport);
|
|
109
|
+
if (hookReport.outcome === "block") {
|
|
110
|
+
return result(
|
|
111
|
+
`Retry blocked by hook: ${hookReport.reason ?? "before_retry hook blocked the operation."}`,
|
|
112
|
+
{ action: "retry", status: "error", runId: loaded.manifest.runId },
|
|
113
|
+
true,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const targetTaskId = typeof params.taskId === "string" ? params.taskId : undefined;
|
|
118
|
+
|
|
119
|
+
return withRunLockSync(loaded.manifest, () => {
|
|
120
|
+
const retryableStatuses: ReadonlySet<string> = new Set(["failed", "cancelled"]);
|
|
121
|
+
|
|
122
|
+
const matchingTasks = loaded.tasks.filter((task) => {
|
|
123
|
+
if (targetTaskId && task.id !== targetTaskId) return false;
|
|
124
|
+
return retryableStatuses.has(task.status);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
if (matchingTasks.length === 0) {
|
|
128
|
+
return result(
|
|
129
|
+
targetTaskId ? `Task '${targetTaskId}' is not failed/cancelled; nothing to retry.` : "No failed/cancelled tasks to retry.",
|
|
130
|
+
{
|
|
131
|
+
action: "retry",
|
|
132
|
+
status: "error",
|
|
133
|
+
runId: loaded.manifest.runId,
|
|
134
|
+
},
|
|
135
|
+
true,
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const retriedIds = new Set(matchingTasks.map((t) => t.id));
|
|
140
|
+
const tasks = loaded.tasks.map((task) => {
|
|
141
|
+
if (!retriedIds.has(task.id)) return task;
|
|
142
|
+
const { error: _error, finishedAt: _finishedAt, terminalEvidence: _terminalEvidence, ...rest } = task;
|
|
143
|
+
return { ...rest, status: "queued" as const };
|
|
144
|
+
});
|
|
145
|
+
saveRunTasks(loaded.manifest, tasks);
|
|
146
|
+
try {
|
|
147
|
+
saveCrewAgents(
|
|
148
|
+
loaded.manifest,
|
|
149
|
+
tasks.map((task) => recordFromTask(loaded.manifest, task, "child-process")),
|
|
150
|
+
);
|
|
151
|
+
} catch (error) {
|
|
152
|
+
logInternalError("team-tool.handleRetry.crewAgents", error, `runId=${loaded.manifest.runId}`);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const retriedTaskIds = [...retriedIds];
|
|
156
|
+
for (const taskId of retriedTaskIds) {
|
|
157
|
+
appendEvent(loaded.manifest.eventsPath, {
|
|
158
|
+
type: "task.retried",
|
|
159
|
+
runId: loaded.manifest.runId,
|
|
160
|
+
taskId,
|
|
161
|
+
message: `Task ${taskId} queued for retry.`,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (deps) invalidateSnapshot(loaded.manifest.runId, runCwd, deps);
|
|
166
|
+
return result(`Retried ${retriedTaskIds.length} task(s) in run ${loaded.manifest.runId}.`, {
|
|
167
|
+
action: "retry",
|
|
168
|
+
status: "ok",
|
|
169
|
+
runId: loaded.manifest.runId,
|
|
170
|
+
retriedTaskIds: retriedTaskIds,
|
|
171
|
+
intent: `retrying ${retriedTaskIds.length} task(s) in ${loaded.manifest.runId}`,
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext, deps?: CacheControlDeps): Promise<PiTeamsToolResult> {
|
|
177
|
+
const intentError = enforceDestructiveIntent("cancel", params, ctx.config);
|
|
178
|
+
if (intentError) return intentError;
|
|
179
|
+
if (!params.runId) return result("Cancel requires runId.", { action: "cancel", status: "error" }, true);
|
|
180
|
+
const runCwd = locateRunCwd(params.runId, ctx.cwd);
|
|
181
|
+
if (!runCwd) return result(`Run '${params.runId}' not found.${RUN_NOT_FOUND_HINT}`, { action: "cancel", status: "error" }, true);
|
|
182
|
+
const loaded = loadRunManifestById(runCwd, params.runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
|
|
183
|
+
if (!loaded) return result(`Run '${params.runId}' not found.${RUN_NOT_FOUND_HINT}`, { action: "cancel", status: "error" }, true);
|
|
184
|
+
|
|
185
|
+
// Pre-lock ownership check: reject foreign-owned runs unless force is set
|
|
186
|
+
const preCheck = abortOwned(loaded.manifest.runId, undefined, ctx, params.force);
|
|
187
|
+
if (preCheck.abortedIds.length === 0 && preCheck.foreignIds.length > 0 && params.force !== true) {
|
|
188
|
+
return result(
|
|
189
|
+
`Run ${loaded.manifest.runId} belongs to another session. Use force: true to override.`,
|
|
190
|
+
{
|
|
191
|
+
action: "cancel",
|
|
192
|
+
status: "error",
|
|
193
|
+
runId: loaded.manifest.runId,
|
|
194
|
+
foreignIds: preCheck.foreignIds,
|
|
195
|
+
},
|
|
196
|
+
true,
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Execute before_cancel hook after ownership confirmed, before mutation lock
|
|
201
|
+
const hookReport = await executeHook("before_cancel", {
|
|
202
|
+
runId: loaded.manifest.runId,
|
|
203
|
+
cwd: ctx.cwd,
|
|
204
|
+
});
|
|
205
|
+
appendHookEvent(loaded.manifest, hookReport);
|
|
206
|
+
if (hookReport.outcome === "block") {
|
|
207
|
+
return result(
|
|
208
|
+
`Cancel blocked by hook: ${hookReport.reason ?? "before_cancel hook blocked the operation."}`,
|
|
209
|
+
{ action: "cancel", status: "error", runId: loaded.manifest.runId },
|
|
210
|
+
true,
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
await terminateLiveAgentsForRun(loaded.manifest.runId, "cancelled", appendEvent, loaded.manifest.eventsPath);
|
|
214
|
+
|
|
215
|
+
// Best-effort: kill the async background runner process so it doesn't
|
|
216
|
+
// overwrite the cancelled state while we hold the run lock.
|
|
217
|
+
const asyncPid = loaded.manifest.async?.pid;
|
|
218
|
+
if (asyncPid !== undefined && asyncPid > 0) {
|
|
219
|
+
try {
|
|
220
|
+
killProcessPid(asyncPid);
|
|
221
|
+
appendEvent(loaded.manifest.eventsPath, {
|
|
222
|
+
type: "async.kill_requested",
|
|
223
|
+
runId: loaded.manifest.runId,
|
|
224
|
+
message: "Sent SIGTERM to background runner process.",
|
|
225
|
+
data: { pid: asyncPid },
|
|
226
|
+
});
|
|
227
|
+
} catch (error) {
|
|
228
|
+
logInternalError("team-tool.handleCancel.killAsync", error, `runId=${loaded.manifest.runId},pid=${asyncPid}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return withRunLockSync(loaded.manifest, () => {
|
|
233
|
+
if ((loaded.manifest.status === "completed" || loaded.manifest.status === "cancelled") && params.force !== true)
|
|
234
|
+
return result(
|
|
235
|
+
`Run ${loaded.manifest.runId} is already ${loaded.manifest.status}; nothing to cancel. Use force: true to mark it cancelled anyway.`,
|
|
236
|
+
{
|
|
237
|
+
action: "cancel",
|
|
238
|
+
status: "ok",
|
|
239
|
+
runId: loaded.manifest.runId,
|
|
240
|
+
artifactsRoot: loaded.manifest.artifactsRoot,
|
|
241
|
+
},
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
// Classify tasks for foreign-aware cancellation
|
|
245
|
+
const abortResult = abortOwned(loaded.manifest.runId, undefined, ctx, params.force);
|
|
246
|
+
if (abortResult.abortedIds.length === 0 && abortResult.foreignIds.length > 0 && params.force !== true) {
|
|
247
|
+
return result(
|
|
248
|
+
`Run ${loaded.manifest.runId} belongs to another session. Use force: true to override.`,
|
|
249
|
+
{
|
|
250
|
+
action: "cancel",
|
|
251
|
+
status: "error",
|
|
252
|
+
runId: loaded.manifest.runId,
|
|
253
|
+
foreignIds: abortResult.foreignIds,
|
|
254
|
+
},
|
|
255
|
+
true,
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
const cancellableIds = new Set(abortResult.abortedIds);
|
|
259
|
+
const cancelReason = cancelReasonFromParams(params);
|
|
260
|
+
const cancelIntent = intentFromConfig(params.config);
|
|
261
|
+
const cancelData = cancelIntent ? { reason: cancelReason.code, intent: cancelIntent } : { reason: cancelReason.code };
|
|
262
|
+
const cancelMessage = `${cancelReason.message} (${cancelReason.code})`;
|
|
263
|
+
|
|
264
|
+
const tasks = loaded.tasks.map((task) => {
|
|
265
|
+
if (cancellableIds.has(task.id) && (task.status === "queued" || task.status === "running" || task.status === "waiting")) {
|
|
266
|
+
const base = {
|
|
267
|
+
...task,
|
|
268
|
+
status: "cancelled" as const,
|
|
269
|
+
finishedAt: new Date().toISOString(),
|
|
270
|
+
error: cancelMessage,
|
|
271
|
+
};
|
|
272
|
+
if (task.status === "running") {
|
|
273
|
+
return {
|
|
274
|
+
...base,
|
|
275
|
+
terminalEvidence: [
|
|
276
|
+
...(task.terminalEvidence ?? []),
|
|
277
|
+
buildSyntheticTerminalEvidence("worker", cancelReason, task.startedAt),
|
|
278
|
+
],
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
return base;
|
|
282
|
+
}
|
|
283
|
+
return task;
|
|
284
|
+
});
|
|
285
|
+
saveRunTasks(loaded.manifest, tasks);
|
|
286
|
+
try {
|
|
287
|
+
saveCrewAgents(
|
|
288
|
+
loaded.manifest,
|
|
289
|
+
tasks.map((task) => recordFromTask(loaded.manifest, task, loaded.manifest.runtimeResolution?.kind ?? "child-process")),
|
|
290
|
+
);
|
|
291
|
+
} catch (error) {
|
|
292
|
+
logInternalError("team-tool.handleCancel.crewAgents", error, `runId=${loaded.manifest.runId}`);
|
|
293
|
+
}
|
|
294
|
+
try {
|
|
295
|
+
writeForegroundInterruptRequest(loaded.manifest, cancelMessage);
|
|
296
|
+
} catch (error) {
|
|
297
|
+
logInternalError("team-tool.handleCancel.interruptRequest", error, `runId=${loaded.manifest.runId}`);
|
|
298
|
+
}
|
|
299
|
+
ctx.abortForegroundRun?.(loaded.manifest.runId);
|
|
300
|
+
for (const taskId of abortResult.abortedIds) {
|
|
301
|
+
appendEvent(loaded.manifest.eventsPath, {
|
|
302
|
+
type: "task.cancelled",
|
|
303
|
+
runId: loaded.manifest.runId,
|
|
304
|
+
taskId,
|
|
305
|
+
message: cancelMessage,
|
|
306
|
+
data: cancelData,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
const updated = updateRunStatus(
|
|
310
|
+
loaded.manifest,
|
|
311
|
+
"cancelled",
|
|
312
|
+
`${cancelMessage} Already-finished worker processes are not retroactively changed.`,
|
|
313
|
+
{ data: cancelData },
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
// Build descriptive message including foreign/missing info
|
|
317
|
+
const parts = [`Cancelled run ${updated.runId}.`];
|
|
318
|
+
if (abortResult.foreignIds.length > 0)
|
|
319
|
+
parts.push(
|
|
320
|
+
` ${abortResult.foreignIds.length} task(s) belong to another session and were not cancelled: ${abortResult.foreignIds.join(", ")}.`,
|
|
321
|
+
);
|
|
322
|
+
if (abortResult.missingIds.length > 0)
|
|
323
|
+
parts.push(` ${abortResult.missingIds.length} task ID(s) not found: ${abortResult.missingIds.join(", ")}.`);
|
|
324
|
+
|
|
325
|
+
if (deps) invalidateSnapshot(updated.runId, runCwd, deps);
|
|
326
|
+
return result(parts.join(""), {
|
|
327
|
+
action: "cancel",
|
|
328
|
+
status: "ok",
|
|
329
|
+
runId: updated.runId,
|
|
330
|
+
artifactsRoot: updated.artifactsRoot,
|
|
331
|
+
abortedIds: abortResult.abortedIds,
|
|
332
|
+
missingIds: abortResult.missingIds,
|
|
333
|
+
foreignIds: abortResult.foreignIds,
|
|
334
|
+
intent: cancelIntent,
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team-tool entry point for the `chain` feature.
|
|
3
|
+
*
|
|
4
|
+
* Dispatched from `handleRun` (run.ts) via an early-return guard:
|
|
5
|
+
* if (params.chain) → handleChainRun(params, ctx, handleRun)
|
|
6
|
+
*
|
|
7
|
+
* `handleRun` is passed by reference (NOT imported) to break the
|
|
8
|
+
* run.ts ↔ chain-dispatch.ts import cycle. This file imports only
|
|
9
|
+
* chain-runner, handoff-manager, chain-executor, and the shared
|
|
10
|
+
* tool-result helpers — none of which import run.ts.
|
|
11
|
+
*
|
|
12
|
+
* @see src/extension/team-tool/chain-executor.ts (ChainTeamRunExecutor)
|
|
13
|
+
* @see src/runtime/chain-runner.ts (ChainRunner.runChain, parseChainString)
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { ChainRunner, parseChainString } from "../../runtime/chain-runner.ts";
|
|
17
|
+
import { HandoffManager } from "../../runtime/handoff-manager.ts";
|
|
18
|
+
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
19
|
+
import type { PiTeamsToolResult } from "../tool-result.ts";
|
|
20
|
+
import { ChainTeamRunExecutor, type HandleRunFn } from "./chain-executor.ts";
|
|
21
|
+
import { result, type TeamContext } from "./context.ts";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Execute a chain expression (`"a -> b -> c"`). Each step runs a real team run
|
|
25
|
+
* via the injected `handleRun`, with handoff context passed forward through the
|
|
26
|
+
* goal text. Returns a multi-line summary plus structured `data` for the TUI.
|
|
27
|
+
*
|
|
28
|
+
* @param params - Must contain `chain`. `team`/`workflow`/`model` are forwarded
|
|
29
|
+
* as per-step overrides when a step does not declare its own.
|
|
30
|
+
* @param ctx - The team tool context (cwd is used to load run manifests).
|
|
31
|
+
* @param handleRun - The run.ts `handleRun` function reference (injected).
|
|
32
|
+
*/
|
|
33
|
+
export async function handleChainRun(params: TeamToolParamsValue, ctx: TeamContext, handleRun: HandleRunFn): Promise<PiTeamsToolResult> {
|
|
34
|
+
const chainString = params.chain;
|
|
35
|
+
if (!chainString || chainString.trim().length === 0) {
|
|
36
|
+
return result("Chain expression is empty.", { action: "run", status: "error" }, true);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const spec = parseChainString(chainString);
|
|
40
|
+
if (spec.steps.length === 0) {
|
|
41
|
+
return result(
|
|
42
|
+
'Chain must contain at least one step. Use the form: "step1 -> step2 -> step3".',
|
|
43
|
+
{ action: "run", status: "error" },
|
|
44
|
+
true,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Construct the concrete executor with per-step overrides forwarded from the
|
|
49
|
+
// chain invocation (overridden by any step that parsed to a @team reference).
|
|
50
|
+
const executor = new ChainTeamRunExecutor({
|
|
51
|
+
handleRun,
|
|
52
|
+
ctx,
|
|
53
|
+
overrides: {
|
|
54
|
+
team: params.team,
|
|
55
|
+
workflow: params.workflow,
|
|
56
|
+
model: params.model,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Surface the global continueOnError from the parsed spec (e.g. --continue-on-error=true).
|
|
61
|
+
const runner = new ChainRunner(executor, new HandoffManager());
|
|
62
|
+
const chainResult = await runner.runChain(spec, {}, undefined);
|
|
63
|
+
|
|
64
|
+
// Build a readable multi-line summary.
|
|
65
|
+
const lines: string[] = [
|
|
66
|
+
`Chain ${chainResult.success ? "completed" : "ended"}: ${spec.steps.length} step(s), ${chainResult.totalHandoffs.length} handoff(s).`,
|
|
67
|
+
"",
|
|
68
|
+
];
|
|
69
|
+
for (const s of chainResult.steps) {
|
|
70
|
+
const runId = executor.stepRunIds[s.step - 1];
|
|
71
|
+
const tag = s.outcome === "success" ? "✓" : s.outcome === "failure" ? "✗" : s.outcome === "partial" ? "≈" : "⊘";
|
|
72
|
+
lines.push(
|
|
73
|
+
`${tag} Step ${s.step} [${s.name}]: ${s.outcome} (${s.duration}ms)${runId ? ` runId=${runId}` : ""}${s.error ? ` | ${s.error}` : ""}`,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
lines.push("");
|
|
77
|
+
lines.push(
|
|
78
|
+
`Total: ${chainResult.totalDuration}ms${chainResult.totalTokens !== undefined ? `, ${chainResult.totalTokens} tokens` : ""}`,
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return result(
|
|
82
|
+
lines.join("\n"),
|
|
83
|
+
{
|
|
84
|
+
action: "run",
|
|
85
|
+
status: chainResult.success ? "ok" : "error",
|
|
86
|
+
data: {
|
|
87
|
+
chain: true,
|
|
88
|
+
steps: chainResult.steps.length,
|
|
89
|
+
totalTokens: chainResult.totalTokens,
|
|
90
|
+
runIds: executor.stepRunIds,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
!chainResult.success,
|
|
94
|
+
);
|
|
95
|
+
}
|