pi-crew 0.9.16 → 0.9.18
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 +130 -0
- package/README.md +19 -0
- package/dist/build-meta.json +21784 -0
- package/dist/index.mjs +83169 -0
- package/dist/index.mjs.map +7 -0
- package/docs/A +358 -0
- package/docs/M-A +357 -0
- package/docs/REVIEW-FINDINGS-2026-06 +357 -0
- package/docs/Y +357 -0
- package/docs/a +357 -0
- package/docs/aA +358 -0
- package/docs/archive/README.md +91 -0
- package/docs/migration/atomic-write-v2-migration.md +297 -0
- package/docs/patterns/command-agent-skill.md +1 -1
- package/docs/perf/performance-review-2026-07.md +287 -0
- package/docs/skills/REFERENCE.md +0 -17
- package/docs//303/242mmaAAA/303/242 +357 -0
- package/index.bundle.ts +25 -0
- package/index.ts +95 -4
- package/package.json +15 -4
- package/skills/iterative-audit/SKILL.md +0 -1
- package/skills/widget-rendering/SKILL.md +17 -0
- package/src/adapters/claude-adapter.ts +1 -3
- package/src/adapters/export-util.ts +16 -16
- package/src/adapters/index.ts +5 -5
- package/src/agents/agent-config.ts +20 -14
- package/src/agents/agent-serializer.ts +1 -1
- package/src/agents/discover-agents.ts +83 -39
- package/src/benchmark/benchmark-runner.ts +51 -51
- package/src/benchmark/feedback-loop.ts +1 -1
- package/src/config/config.ts +303 -591
- package/src/config/defaults.ts +28 -2
- package/src/config/drift-detector.ts +11 -14
- package/src/config/markers.ts +201 -203
- package/src/config/resilient-parser.ts +14 -6
- package/src/config/role-tools.ts +3 -3
- package/src/config/suggestions.ts +5 -12
- package/src/config/types.ts +9 -25
- package/src/errors.ts +151 -157
- package/src/extension/action-suggestions.ts +54 -9
- package/src/extension/async-notifier.ts +43 -13
- package/src/extension/autonomous-policy.ts +77 -37
- package/src/extension/command-completions.ts +9 -8
- package/src/extension/context-status-injection.ts +14 -12
- package/src/extension/crew-autocomplete.ts +8 -16
- package/src/extension/crew-cleanup.ts +2 -1
- package/src/extension/crew-shortcuts.ts +9 -6
- package/src/extension/cross-extension-rpc.ts +136 -42
- package/src/extension/help.ts +1 -1
- package/src/extension/import-index.ts +10 -5
- package/src/extension/knowledge-injection.ts +88 -15
- package/src/extension/management.ts +89 -349
- package/src/extension/message-renderers.ts +3 -4
- package/src/extension/notification-router.ts +22 -5
- package/src/extension/notification-sink.ts +6 -3
- package/src/extension/pi-api.ts +17 -8
- package/src/extension/plan-orchestrate.ts +8 -27
- package/src/extension/project-init.ts +21 -6
- package/src/extension/register.ts +329 -975
- package/src/extension/registration/artifact-cleanup.ts +9 -4
- package/src/extension/registration/command-utils.ts +5 -1
- package/src/extension/registration/commands.ts +806 -314
- package/src/extension/registration/compaction-guard.ts +15 -15
- package/src/extension/registration/lifecycle.ts +259 -0
- package/src/extension/registration/observability.ts +293 -0
- package/src/extension/registration/subagent-helpers.ts +29 -7
- package/src/extension/registration/subagent-tools.ts +253 -44
- package/src/extension/registration/team-tool.ts +19 -84
- package/src/extension/registration/ui.ts +168 -0
- package/src/extension/registration/viewers.ts +64 -24
- package/src/extension/result-watcher.ts +18 -7
- package/src/extension/run-bundle-schema.ts +21 -6
- package/src/extension/run-export.ts +15 -6
- package/src/extension/run-import.ts +64 -29
- package/src/extension/run-index.ts +28 -9
- package/src/extension/run-maintenance.ts +32 -12
- package/src/extension/session-summary.ts +1 -1
- package/src/extension/team-manager-command.ts +64 -7
- package/src/extension/team-onboard.ts +149 -150
- package/src/extension/team-recommendation.ts +121 -21
- package/src/extension/team-tool/anchor.ts +31 -64
- package/src/extension/team-tool/api.ts +929 -141
- package/src/extension/team-tool/auto-summarize.ts +14 -26
- package/src/extension/team-tool/cache-control.ts +1 -5
- package/src/extension/team-tool/cancel.ts +138 -38
- package/src/extension/team-tool/chain-dispatch.ts +5 -13
- package/src/extension/team-tool/chain-executor.ts +29 -51
- package/src/extension/team-tool/config-patch.ts +1 -1
- package/src/extension/team-tool/context.ts +40 -20
- package/src/extension/team-tool/destructive-gate.ts +10 -5
- package/src/extension/team-tool/doctor.ts +170 -51
- package/src/extension/team-tool/explain.ts +228 -214
- package/src/extension/team-tool/failure-patterns.ts +3 -9
- package/src/extension/team-tool/goal-wrap.ts +71 -29
- package/src/extension/team-tool/goal.ts +185 -35
- package/src/extension/team-tool/handle-schedule.ts +34 -15
- package/src/extension/team-tool/handle-settings.ts +94 -56
- package/src/extension/team-tool/health-monitor.ts +27 -108
- package/src/extension/team-tool/inspect.ts +42 -9
- package/src/extension/team-tool/intent-policy.ts +4 -1
- package/src/extension/team-tool/lifecycle-actions.ts +244 -48
- package/src/extension/team-tool/orchestrate.ts +7 -18
- package/src/extension/team-tool/parallel-dispatch.ts +51 -29
- package/src/extension/team-tool/plan.ts +29 -5
- package/src/extension/team-tool/respond.ts +49 -16
- package/src/extension/team-tool/run-not-found.ts +3 -8
- package/src/extension/team-tool/run.ts +80 -317
- package/src/extension/team-tool/status.ts +135 -43
- package/src/extension/team-tool/workflow-manage.ts +92 -25
- package/src/extension/team-tool-types.ts +8 -1
- package/src/extension/team-tool.ts +142 -551
- package/src/extension/validate-resources.ts +39 -8
- package/src/hooks/registry.ts +66 -17
- package/src/hooks/types.ts +1 -1
- package/src/i18n.ts +25 -11
- package/src/observability/correlation.ts +17 -3
- package/src/observability/event-bus.ts +51 -56
- package/src/observability/event-to-metric.ts +117 -15
- package/src/observability/exporters/otlp-exporter.ts +56 -17
- package/src/observability/exporters/prometheus-exporter.ts +1 -1
- package/src/observability/metric-registry.ts +16 -4
- package/src/observability/metric-retention.ts +8 -2
- package/src/observability/metric-sink.ts +11 -3
- package/src/observability/metrics-primitives.ts +42 -9
- package/src/plugins/plugin-define.ts +2 -2
- package/src/plugins/plugin-registry.ts +25 -25
- package/src/plugins/plugins/index.ts +1 -1
- package/src/plugins/plugins/nextjs.ts +16 -16
- package/src/plugins/plugins/vite.ts +7 -11
- package/src/plugins/plugins/vitest.ts +6 -11
- package/src/runtime/adaptive-plan.ts +225 -40
- package/src/runtime/agent-control.ts +58 -15
- package/src/runtime/agent-memory.ts +15 -9
- package/src/runtime/agent-observability.ts +10 -2
- package/src/runtime/anchor-manager.ts +27 -25
- package/src/runtime/async-marker.ts +7 -1
- package/src/runtime/async-runner.ts +39 -24
- package/src/runtime/auto-summarize.ts +7 -13
- package/src/runtime/background-runner.ts +189 -251
- package/src/runtime/batch-barrier.ts +18 -16
- package/src/runtime/cancellation-token.ts +16 -6
- package/src/runtime/cancellation.ts +46 -8
- package/src/runtime/capability-inventory.ts +6 -4
- package/src/runtime/chain-parser.ts +44 -11
- package/src/runtime/chain-runner.ts +63 -69
- package/src/runtime/checkpoint.ts +12 -56
- package/src/runtime/child-pi.ts +344 -79
- package/src/runtime/coalesce-tasks.ts +268 -0
- package/src/runtime/code-summary.ts +71 -26
- package/src/runtime/compact-stages/index.ts +15 -5
- package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
- package/src/runtime/compact-stages/truncation-stage.ts +4 -1
- package/src/runtime/compaction-summary.ts +17 -10
- package/src/runtime/completion-guard.ts +33 -16
- package/src/runtime/crash-classification.ts +28 -7
- package/src/runtime/crash-recovery.ts +177 -37
- package/src/runtime/crew-agent-records.ts +145 -47
- package/src/runtime/crew-hooks.ts +9 -24
- package/src/runtime/cross-extension-rpc.ts +25 -23
- package/src/runtime/custom-tools/irc-tool.ts +43 -15
- package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
- package/src/runtime/delivery-coordinator.ts +34 -7
- package/src/runtime/delta-conflict.ts +9 -21
- package/src/runtime/deterministic-ast.ts +1 -1
- package/src/runtime/diagnostic-export.ts +53 -20
- package/src/runtime/direct-run.ts +12 -2
- package/src/runtime/dwf-state-store.ts +1 -1
- package/src/runtime/dynamic-workflow-context.ts +187 -59
- package/src/runtime/dynamic-workflow-runner.ts +42 -20
- package/src/runtime/effectiveness.ts +16 -8
- package/src/runtime/errors/crew-errors.ts +7 -11
- package/src/runtime/event-stream-bridge.ts +9 -3
- package/src/runtime/foreground-control.ts +54 -14
- package/src/runtime/foreground-watchdog.ts +9 -6
- package/src/runtime/goal-achievement.ts +27 -10
- package/src/runtime/goal-evaluator.ts +54 -19
- package/src/runtime/goal-loop-runner.ts +280 -99
- package/src/runtime/goal-state-store.ts +27 -17
- package/src/runtime/green-contract.ts +11 -2
- package/src/runtime/group-join.ts +64 -31
- package/src/runtime/handoff-manager.ts +37 -42
- package/src/runtime/heartbeat-gradient.ts +10 -2
- package/src/runtime/heartbeat-watcher.ts +32 -6
- package/src/runtime/hidden-handoff.ts +13 -31
- package/src/runtime/important-line-classifier.ts +12 -2
- package/src/runtime/iteration-hooks.ts +25 -15
- package/src/runtime/live-agent-control.ts +55 -7
- package/src/runtime/live-agent-manager.ts +130 -27
- package/src/runtime/live-control-realtime.ts +23 -3
- package/src/runtime/live-irc.ts +4 -1
- package/src/runtime/live-session-health.ts +12 -4
- package/src/runtime/live-session-runtime.ts +379 -117
- package/src/runtime/manifest-cache.ts +28 -12
- package/src/runtime/mcp-proxy.ts +10 -18
- package/src/runtime/metric-parser.ts +1 -5
- package/src/runtime/model-fallback.ts +55 -18
- package/src/runtime/model-resolver.ts +2 -6
- package/src/runtime/model-scope.ts +19 -3
- package/src/runtime/notebook-helpers.ts +60 -62
- package/src/runtime/orphan-worker-registry.ts +37 -26
- package/src/runtime/output-validator.ts +18 -3
- package/src/runtime/overflow-recovery.ts +5 -4
- package/src/runtime/parallel-research.ts +29 -5
- package/src/runtime/parallel-utils.ts +9 -11
- package/src/runtime/path-overlap.ts +150 -0
- package/src/runtime/peer-dep.ts +12 -17
- package/src/runtime/per-write-validator.ts +1 -3
- package/src/runtime/phase-tracker.ts +342 -330
- package/src/runtime/pi-args.ts +26 -8
- package/src/runtime/pi-json-output.ts +1 -1
- package/src/runtime/pi-spawn.ts +30 -19
- package/src/runtime/pipeline-runner.ts +56 -55
- package/src/runtime/plan-templates.ts +5 -6
- package/src/runtime/policy-engine.ts +43 -7
- package/src/runtime/post-checks.ts +12 -4
- package/src/runtime/post-exit-stdio-guard.ts +2 -2
- package/src/runtime/process-lifecycle.ts +20 -10
- package/src/runtime/process-status.ts +16 -5
- package/src/runtime/progress-event-coalescer.ts +2 -1
- package/src/runtime/progress-tracker.ts +103 -103
- package/src/runtime/prose-compressor.ts +9 -11
- package/src/runtime/recovery-recipes.ts +118 -24
- package/src/runtime/replace.ts +25 -10
- package/src/runtime/resilient-edit.ts +10 -25
- package/src/runtime/result-extractor.ts +2 -6
- package/src/runtime/retry-executor.ts +20 -4
- package/src/runtime/retry-runner.ts +27 -51
- package/src/runtime/role-permission.ts +6 -1
- package/src/runtime/run-coalesced-task-group.ts +256 -0
- package/src/runtime/run-drift.ts +14 -15
- package/src/runtime/run-tracker.ts +6 -28
- package/src/runtime/runtime-policy.ts +1 -6
- package/src/runtime/runtime-resolver.ts +80 -15
- package/src/runtime/scheduler.ts +47 -18
- package/src/runtime/semaphore.ts +5 -7
- package/src/runtime/sensitive-paths.ts +2 -1
- package/src/runtime/session-usage.ts +1 -1
- package/src/runtime/settings-store.ts +16 -12
- package/src/runtime/sidechain-output.ts +6 -2
- package/src/runtime/single-agent-compose.ts +1 -4
- package/src/runtime/skill-effectiveness.ts +29 -97
- package/src/runtime/skill-instructions.ts +40 -83
- package/src/runtime/stale-reconciler.ts +73 -197
- package/src/runtime/stream-preview.ts +1 -1
- package/src/runtime/streaming-output.ts +1 -1
- package/src/runtime/subagent-manager.ts +44 -169
- package/src/runtime/subprocess-tool-registry.ts +4 -1
- package/src/runtime/supervisor-contact.ts +10 -5
- package/src/runtime/task-display.ts +19 -5
- package/src/runtime/task-graph-scheduler.ts +95 -21
- package/src/runtime/task-graph.ts +5 -11
- package/src/runtime/task-health.ts +54 -47
- package/src/runtime/task-id.ts +12 -19
- package/src/runtime/task-output-context.ts +265 -81
- package/src/runtime/task-packet.ts +12 -20
- package/src/runtime/task-quality.ts +6 -14
- package/src/runtime/task-runner/context-retrieval.ts +4 -13
- package/src/runtime/task-runner/live-executor.ts +114 -36
- package/src/runtime/task-runner/output-splitter.ts +152 -0
- package/src/runtime/task-runner/progress.ts +50 -12
- package/src/runtime/task-runner/prompt-builder.ts +31 -7
- package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
- package/src/runtime/task-runner/result-utils.ts +3 -1
- package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
- package/src/runtime/task-runner/run-projection.ts +27 -8
- package/src/runtime/task-runner/state-helpers.ts +50 -14
- package/src/runtime/task-runner/tail-read.ts +2 -6
- package/src/runtime/task-runner.ts +180 -326
- package/src/runtime/team-runner-artifacts.ts +13 -0
- package/src/runtime/team-runner.ts +456 -974
- package/src/runtime/tool-output-pruner.ts +6 -9
- package/src/runtime/tool-progress.ts +11 -21
- package/src/runtime/verification-gates.ts +33 -24
- package/src/runtime/verification-integrity.ts +2 -7
- package/src/runtime/verification-worktree.ts +62 -12
- package/src/runtime/worker-heartbeat.ts +5 -1
- package/src/runtime/worker-startup.ts +29 -5
- package/src/runtime/workflow-state.ts +17 -9
- package/src/runtime/workspace-lock.ts +30 -35
- package/src/runtime/workspace-tree.ts +20 -32
- package/src/runtime/yield-handler.ts +43 -9
- package/src/runtime/zombie-scanner.ts +5 -4
- package/src/schema/config-schema.ts +266 -172
- package/src/schema/team-tool-schema.ts +29 -74
- package/src/schema/validation-types.ts +25 -17
- package/src/skills/discover-skills.ts +35 -10
- package/src/skills/skill-templates.ts +109 -27
- package/src/skills/validate.ts +26 -8
- package/src/state/active-run-registry.ts +87 -28
- package/src/state/artifact-store.ts +9 -5
- package/src/state/atomic-write-v2.ts +85 -63
- package/src/state/atomic-write.ts +106 -27
- package/src/state/blob-store.ts +47 -20
- package/src/state/contracts.ts +20 -5
- package/src/state/crew-init.ts +5 -22
- package/src/state/decision-ledger.ts +19 -73
- package/src/state/event-log-rotation.ts +41 -15
- package/src/state/event-log.ts +168 -53
- package/src/state/event-reconstructor.ts +11 -1
- package/src/state/gitignore-manager.ts +2 -8
- package/src/state/health-store.ts +57 -57
- package/src/state/hook-instinct-bridge.ts +1 -1
- package/src/state/hook-integrations.ts +1 -1
- package/src/state/instinct-store.ts +17 -5
- package/src/state/jsonl-writer.ts +1 -1
- package/src/state/locks.ts +23 -9
- package/src/state/mailbox.ts +151 -28
- package/src/state/observation-store.ts +20 -14
- package/src/state/run-cache.ts +142 -135
- package/src/state/run-graph.ts +6 -15
- package/src/state/run-metrics.ts +5 -18
- package/src/state/schedule.ts +15 -9
- package/src/state/state-store.ts +137 -47
- package/src/state/task-claims.ts +12 -2
- package/src/state/tiered-eval.ts +52 -43
- package/src/state/types-eval.ts +2 -2
- package/src/state/types.ts +24 -20
- package/src/state/usage.ts +20 -4
- package/src/state/worker-atomic-writer.ts +6 -3
- package/src/subagents/index.ts +2 -2
- package/src/teams/discover-teams.ts +21 -6
- package/src/tools/safe-bash-extension.ts +5 -6
- package/src/tools/safe-bash.ts +10 -11
- package/src/types/new-api-types.ts +6 -10
- package/src/ui/agent-management-overlay.ts +52 -40
- package/src/ui/card-colors.ts +13 -4
- package/src/ui/crew-footer.ts +8 -7
- package/src/ui/crew-select-list.ts +1 -1
- package/src/ui/dashboard-panes/agents-pane.ts +41 -25
- package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
- package/src/ui/dashboard-panes/capability-pane.ts +32 -15
- package/src/ui/dashboard-panes/health-pane.ts +2 -1
- package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
- package/src/ui/dashboard-panes/progress-pane.ts +12 -9
- package/src/ui/heartbeat-aggregator.ts +15 -4
- package/src/ui/keybinding-map.ts +40 -7
- package/src/ui/live-conversation-overlay.ts +36 -20
- package/src/ui/live-duration.ts +1 -4
- package/src/ui/live-run-sidebar.ts +88 -25
- package/src/ui/loaders.ts +2 -8
- package/src/ui/mascot.ts +20 -36
- package/src/ui/overlays/agent-picker-overlay.ts +11 -3
- package/src/ui/overlays/confirm-overlay.ts +4 -2
- package/src/ui/overlays/help-overlay.ts +25 -14
- package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
- package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
- package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
- package/src/ui/pi-ui-compat.ts +7 -7
- package/src/ui/powerbar-publisher.ts +120 -42
- package/src/ui/render-diff.ts +10 -3
- package/src/ui/render-scheduler.ts +12 -4
- package/src/ui/run-action-dispatcher.ts +81 -18
- package/src/ui/run-dashboard.ts +172 -76
- package/src/ui/run-event-bus.ts +59 -37
- package/src/ui/run-snapshot-cache.ts +276 -86
- package/src/ui/settings-overlay.ts +361 -74
- package/src/ui/status-colors.ts +12 -1
- package/src/ui/syntax-highlight.ts +1 -1
- package/src/ui/terminal-status.ts +1 -3
- package/src/ui/theme-adapter.ts +16 -14
- package/src/ui/theme-discovery.ts +13 -2
- package/src/ui/tool-progress-formatter.ts +7 -7
- package/src/ui/tool-render.ts +128 -56
- package/src/ui/tool-renderers/brief-mode.ts +45 -27
- package/src/ui/tool-renderers/index.ts +109 -43
- package/src/ui/transcript-cache.ts +32 -6
- package/src/ui/transcript-entries.ts +25 -23
- package/src/ui/transcript-viewer.ts +78 -29
- package/src/ui/widget/index.ts +99 -40
- package/src/ui/widget/widget-formatters.ts +13 -6
- package/src/ui/widget/widget-model.ts +19 -8
- package/src/ui/widget/widget-renderer.ts +23 -13
- package/src/ui/widget/widget-types.ts +1 -1
- package/src/utils/bm25-search.ts +199 -199
- package/src/utils/conflict-detect.ts +22 -21
- package/src/utils/env-filter.ts +14 -7
- package/src/utils/file-coalescer.ts +5 -1
- package/src/utils/fingerprint.ts +3 -6
- package/src/utils/frontmatter.ts +3 -1
- package/src/utils/fs-watch.ts +2 -6
- package/src/utils/gh-protocol.ts +119 -44
- package/src/utils/git.ts +13 -15
- package/src/utils/guards.ts +2 -5
- package/src/utils/ids.ts +9 -2
- package/src/utils/incremental-reader.ts +14 -3
- package/src/utils/internal-error.ts +2 -1
- package/src/utils/names.ts +12 -3
- package/src/utils/paths.ts +49 -5
- package/src/utils/project-detector.ts +2 -2
- package/src/utils/redaction.ts +29 -19
- package/src/utils/resolve-shell.ts +9 -7
- package/src/utils/run-watcher-registry.ts +19 -31
- package/src/utils/safe-paths.ts +46 -29
- package/src/utils/scan-cache.ts +9 -2
- package/src/utils/session-utils.ts +2 -4
- package/src/utils/sleep.ts +12 -5
- package/src/utils/sse-parser.ts +5 -17
- package/src/utils/visual.ts +52 -32
- package/src/workflows/discover-workflows.ts +41 -109
- package/src/workflows/intermediate-store.ts +5 -21
- package/src/workflows/preflight-validator.ts +6 -33
- package/src/workflows/topology-analyzer.ts +5 -21
- package/src/workflows/workflow-config.ts +7 -6
- package/src/worktree/branch-freshness.ts +66 -8
- package/src/worktree/cleanup.ts +130 -20
- package/src/worktree/worktree-manager.ts +212 -69
- package/skills/artifact-analysis-loop/SKILL.md +0 -303
- package/skills/detection-pipeline-design/SKILL.md +0 -286
- package/skills/hunting-investigation-loop/SKILL.md +0 -402
- package/skills/incident-playbook-construction/SKILL.md +0 -384
- package/skills/security-review/SKILL.md +0 -561
- package/skills/threat-hypothesis-framework/SKILL.md +0 -176
- package/skills/ui-render-performance/SKILL.md +0 -58
- /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
- /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
- /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
- /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
- /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
- /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
- /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
- /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
- /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
- /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
- /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
- /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
- /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
- /package/docs/{pi-subagents3-deep-analysis.md → archive/pi-subagents3-deep-analysis.md} +0 -0
|
@@ -3,14 +3,10 @@
|
|
|
3
3
|
* Provides on/off/status commands for auto-summarization.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { type AutoSummarizeService, createAutoSummarizeService, DEFAULT_AUTO_SUMMARIZE_CONFIG } from "../../runtime/auto-summarize.ts";
|
|
6
7
|
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
7
8
|
import type { PiTeamsToolResult } from "../tool-result.ts";
|
|
8
9
|
import { result, type TeamContext } from "./context.ts";
|
|
9
|
-
import {
|
|
10
|
-
AutoSummarizeService,
|
|
11
|
-
createAutoSummarizeService,
|
|
12
|
-
DEFAULT_AUTO_SUMMARIZE_CONFIG,
|
|
13
|
-
} from "../../runtime/auto-summarize.ts";
|
|
14
10
|
|
|
15
11
|
// Global auto-summarize service instance for CLI usage
|
|
16
12
|
let globalAutoSummarize: AutoSummarizeService | null = null;
|
|
@@ -22,10 +18,7 @@ function getAutoSummarize(): AutoSummarizeService {
|
|
|
22
18
|
return globalAutoSummarize;
|
|
23
19
|
}
|
|
24
20
|
|
|
25
|
-
export function handleAutoSummarizeOn(
|
|
26
|
-
params: TeamToolParamsValue,
|
|
27
|
-
ctx: TeamContext,
|
|
28
|
-
): PiTeamsToolResult {
|
|
21
|
+
export function handleAutoSummarizeOn(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
|
|
29
22
|
const service = getAutoSummarize();
|
|
30
23
|
const cfg = params.config ?? {};
|
|
31
24
|
|
|
@@ -61,24 +54,18 @@ export function handleAutoSummarizeOn(
|
|
|
61
54
|
);
|
|
62
55
|
}
|
|
63
56
|
|
|
64
|
-
export function handleAutoSummarizeOff(
|
|
65
|
-
params: TeamToolParamsValue,
|
|
66
|
-
ctx: TeamContext,
|
|
67
|
-
): PiTeamsToolResult {
|
|
57
|
+
export function handleAutoSummarizeOff(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
|
|
68
58
|
const service = getAutoSummarize();
|
|
69
59
|
|
|
70
60
|
service.disable();
|
|
71
61
|
|
|
72
|
-
return result(
|
|
73
|
-
"
|
|
74
|
-
|
|
75
|
-
);
|
|
62
|
+
return result("Auto-summarize disabled.", {
|
|
63
|
+
action: "auto-summarize",
|
|
64
|
+
status: "ok",
|
|
65
|
+
});
|
|
76
66
|
}
|
|
77
67
|
|
|
78
|
-
export function handleAutoSummarizeStatus(
|
|
79
|
-
params: TeamToolParamsValue,
|
|
80
|
-
ctx: TeamContext,
|
|
81
|
-
): PiTeamsToolResult {
|
|
68
|
+
export function handleAutoSummarizeStatus(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
|
|
82
69
|
const service = getAutoSummarize();
|
|
83
70
|
const config = service.getConfig();
|
|
84
71
|
const isEnabled = service.isEnabled();
|
|
@@ -103,15 +90,16 @@ export function handleAutoSummarizeStatus(
|
|
|
103
90
|
);
|
|
104
91
|
}
|
|
105
92
|
|
|
106
|
-
export function handleAutoSummarizeConfig(
|
|
107
|
-
params: TeamToolParamsValue,
|
|
108
|
-
ctx: TeamContext,
|
|
109
|
-
): PiTeamsToolResult {
|
|
93
|
+
export function handleAutoSummarizeConfig(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
|
|
110
94
|
const service = getAutoSummarize();
|
|
111
95
|
const cfg = params.config ?? {};
|
|
112
96
|
|
|
113
97
|
// Parse config options
|
|
114
|
-
const updates: {
|
|
98
|
+
const updates: {
|
|
99
|
+
threshold?: number;
|
|
100
|
+
minTools?: number;
|
|
101
|
+
collapseContext?: boolean;
|
|
102
|
+
} = {};
|
|
115
103
|
|
|
116
104
|
if (cfg.threshold !== undefined) {
|
|
117
105
|
const threshold = typeof cfg.threshold === "number" ? cfg.threshold : parseInt(String(cfg.threshold), 10);
|
|
@@ -10,11 +10,7 @@ export interface CacheControlDeps {
|
|
|
10
10
|
* a runEventBus event so the render scheduler coalescer fires immediately.
|
|
11
11
|
* Call this after any state mutation that changes task/agent status.
|
|
12
12
|
*/
|
|
13
|
-
export function invalidateSnapshot(
|
|
14
|
-
runId: string,
|
|
15
|
-
runCwd: string,
|
|
16
|
-
deps: CacheControlDeps,
|
|
17
|
-
): void {
|
|
13
|
+
export function invalidateSnapshot(runId: string, runCwd: string, deps: CacheControlDeps): void {
|
|
18
14
|
// 1. Invalidate snapshot cache entry
|
|
19
15
|
deps.getRunSnapshotCache(runCwd).invalidate(runId);
|
|
20
16
|
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
5
|
import { writeForegroundInterruptRequest } from "../../runtime/foreground-control.ts";
|
|
6
|
-
import { cancellationReasonFromUnknown, buildSyntheticTerminalEvidence, type CancellationReason } from "../../runtime/cancellation.ts";
|
|
7
6
|
import { terminateLiveAgentsForRun } from "../../runtime/live-agent-manager.ts";
|
|
7
|
+
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
8
8
|
import { appendEvent } from "../../state/event-log.ts";
|
|
9
|
-
import {
|
|
9
|
+
import { withRunLockSync } from "../../state/locks.ts";
|
|
10
|
+
import { loadRunManifestById, saveRunTasks, updateRunStatus } from "../../state/state-store.ts";
|
|
10
11
|
import { logInternalError } from "../../utils/internal-error.ts";
|
|
11
|
-
import { executeHook, appendHookEvent } from "../../hooks/registry.ts";
|
|
12
|
-
import type { PiTeamsToolResult } from "../tool-result.ts";
|
|
13
12
|
import { locateRunCwd } from "../team-tool.ts";
|
|
13
|
+
import type { PiTeamsToolResult } from "../tool-result.ts";
|
|
14
|
+
import { type CacheControlDeps, invalidateSnapshot } from "./cache-control.ts";
|
|
14
15
|
import { result, type TeamContext } from "./context.ts";
|
|
15
|
-
import { RUN_NOT_FOUND_HINT } from "./run-not-found.ts";
|
|
16
16
|
import { enforceDestructiveIntent, intentFromConfig } from "./intent-policy.ts";
|
|
17
|
-
import {
|
|
17
|
+
import { RUN_NOT_FOUND_HINT } from "./run-not-found.ts";
|
|
18
18
|
|
|
19
19
|
export interface AbortOwnedResult {
|
|
20
20
|
abortedIds: string[];
|
|
@@ -34,18 +34,17 @@ export interface AbortOwnedResult {
|
|
|
34
34
|
* the ownerSessionId comes from the context. Foreign detection compares
|
|
35
35
|
* the requesting session against the run's creating session.
|
|
36
36
|
*/
|
|
37
|
-
export function abortOwned(
|
|
38
|
-
runId: string,
|
|
39
|
-
taskIds: string[] | undefined,
|
|
40
|
-
ctx: TeamContext,
|
|
41
|
-
force?: boolean,
|
|
42
|
-
): AbortOwnedResult {
|
|
37
|
+
export function abortOwned(runId: string, taskIds: string[] | undefined, ctx: TeamContext, force?: boolean): AbortOwnedResult {
|
|
43
38
|
const runCwd = locateRunCwd(runId, ctx.cwd);
|
|
44
39
|
if (!runCwd) return { abortedIds: [], missingIds: taskIds ?? [], foreignIds: [] };
|
|
45
40
|
const loaded = loadRunManifestById(runCwd, runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
|
|
46
41
|
if (!loaded) return { abortedIds: [], missingIds: taskIds ?? [], foreignIds: [] };
|
|
47
42
|
|
|
48
|
-
const result: AbortOwnedResult = {
|
|
43
|
+
const result: AbortOwnedResult = {
|
|
44
|
+
abortedIds: [],
|
|
45
|
+
missingIds: [],
|
|
46
|
+
foreignIds: [],
|
|
47
|
+
};
|
|
49
48
|
const taskMap = new Map(loaded.tasks.map((t) => [t.id, t] as const));
|
|
50
49
|
const targetIds = taskIds ?? loaded.tasks.map((t) => t.id);
|
|
51
50
|
const foreignRun = typeof loaded.manifest.ownerSessionId === "string" && loaded.manifest.ownerSessionId !== ctx.sessionId;
|
|
@@ -74,7 +73,13 @@ function configFromParams(params: TeamToolParamsValue): Record<string, unknown>
|
|
|
74
73
|
function cancelReasonFromParams(params: TeamToolParamsValue): CancellationReason {
|
|
75
74
|
const config = configFromParams(params);
|
|
76
75
|
const rawReason = config?.reason ?? config?.cancelReason;
|
|
77
|
-
const reason =
|
|
76
|
+
const reason =
|
|
77
|
+
rawReason === undefined
|
|
78
|
+
? {
|
|
79
|
+
code: "caller_cancelled" as const,
|
|
80
|
+
message: "Run cancelled by user request.",
|
|
81
|
+
}
|
|
82
|
+
: cancellationReasonFromUnknown(rawReason);
|
|
78
83
|
return { code: reason.code, message: reason.message };
|
|
79
84
|
}
|
|
80
85
|
|
|
@@ -88,14 +93,25 @@ export async function handleRetry(params: TeamToolParamsValue, ctx: TeamContext,
|
|
|
88
93
|
// Pre-lock ownership check: reject foreign-owned runs unless force is set
|
|
89
94
|
const foreignRun = typeof loaded.manifest.ownerSessionId === "string" && loaded.manifest.ownerSessionId !== ctx.sessionId;
|
|
90
95
|
if (foreignRun && !params.force) {
|
|
91
|
-
return result(
|
|
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
|
+
);
|
|
92
101
|
}
|
|
93
102
|
|
|
94
103
|
// Execute before_retry hook after ownership confirmed, before mutation lock
|
|
95
|
-
const hookReport = await executeHook("before_retry", {
|
|
104
|
+
const hookReport = await executeHook("before_retry", {
|
|
105
|
+
runId: loaded.manifest.runId,
|
|
106
|
+
cwd: ctx.cwd,
|
|
107
|
+
});
|
|
96
108
|
appendHookEvent(loaded.manifest, hookReport);
|
|
97
109
|
if (hookReport.outcome === "block") {
|
|
98
|
-
return result(
|
|
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
|
+
);
|
|
99
115
|
}
|
|
100
116
|
|
|
101
117
|
const targetTaskId = typeof params.taskId === "string" ? params.taskId : undefined;
|
|
@@ -109,7 +125,15 @@ export async function handleRetry(params: TeamToolParamsValue, ctx: TeamContext,
|
|
|
109
125
|
});
|
|
110
126
|
|
|
111
127
|
if (matchingTasks.length === 0) {
|
|
112
|
-
return result(
|
|
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
|
+
);
|
|
113
137
|
}
|
|
114
138
|
|
|
115
139
|
const retriedIds = new Set(matchingTasks.map((t) => t.id));
|
|
@@ -120,14 +144,22 @@ export async function handleRetry(params: TeamToolParamsValue, ctx: TeamContext,
|
|
|
120
144
|
});
|
|
121
145
|
saveRunTasks(loaded.manifest, tasks);
|
|
122
146
|
try {
|
|
123
|
-
saveCrewAgents(
|
|
147
|
+
saveCrewAgents(
|
|
148
|
+
loaded.manifest,
|
|
149
|
+
tasks.map((task) => recordFromTask(loaded.manifest, task, "child-process")),
|
|
150
|
+
);
|
|
124
151
|
} catch (error) {
|
|
125
152
|
logInternalError("team-tool.handleRetry.crewAgents", error, `runId=${loaded.manifest.runId}`);
|
|
126
153
|
}
|
|
127
154
|
|
|
128
155
|
const retriedTaskIds = [...retriedIds];
|
|
129
156
|
for (const taskId of retriedTaskIds) {
|
|
130
|
-
appendEvent(loaded.manifest.eventsPath, {
|
|
157
|
+
appendEvent(loaded.manifest.eventsPath, {
|
|
158
|
+
type: "task.retried",
|
|
159
|
+
runId: loaded.manifest.runId,
|
|
160
|
+
taskId,
|
|
161
|
+
message: `Task ${taskId} queued for retry.`,
|
|
162
|
+
});
|
|
131
163
|
}
|
|
132
164
|
|
|
133
165
|
if (deps) invalidateSnapshot(loaded.manifest.runId, runCwd, deps);
|
|
@@ -153,14 +185,30 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
|
|
|
153
185
|
// Pre-lock ownership check: reject foreign-owned runs unless force is set
|
|
154
186
|
const preCheck = abortOwned(loaded.manifest.runId, undefined, ctx, params.force);
|
|
155
187
|
if (preCheck.abortedIds.length === 0 && preCheck.foreignIds.length > 0 && !params.force) {
|
|
156
|
-
return result(
|
|
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
|
+
);
|
|
157
198
|
}
|
|
158
199
|
|
|
159
200
|
// Execute before_cancel hook after ownership confirmed, before mutation lock
|
|
160
|
-
const hookReport = await executeHook("before_cancel", {
|
|
201
|
+
const hookReport = await executeHook("before_cancel", {
|
|
202
|
+
runId: loaded.manifest.runId,
|
|
203
|
+
cwd: ctx.cwd,
|
|
204
|
+
});
|
|
161
205
|
appendHookEvent(loaded.manifest, hookReport);
|
|
162
206
|
if (hookReport.outcome === "block") {
|
|
163
|
-
return result(
|
|
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
|
+
);
|
|
164
212
|
}
|
|
165
213
|
await terminateLiveAgentsForRun(loaded.manifest.runId, "cancelled", appendEvent, loaded.manifest.eventsPath);
|
|
166
214
|
|
|
@@ -170,19 +218,42 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
|
|
|
170
218
|
if (asyncPid !== undefined && asyncPid > 0) {
|
|
171
219
|
try {
|
|
172
220
|
killProcessPid(asyncPid);
|
|
173
|
-
appendEvent(loaded.manifest.eventsPath, {
|
|
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
|
+
});
|
|
174
227
|
} catch (error) {
|
|
175
228
|
logInternalError("team-tool.handleCancel.killAsync", error, `runId=${loaded.manifest.runId},pid=${asyncPid}`);
|
|
176
229
|
}
|
|
177
230
|
}
|
|
178
231
|
|
|
179
232
|
return withRunLockSync(loaded.manifest, () => {
|
|
180
|
-
if ((loaded.manifest.status === "completed" || loaded.manifest.status === "cancelled") && !params.force)
|
|
233
|
+
if ((loaded.manifest.status === "completed" || loaded.manifest.status === "cancelled") && !params.force)
|
|
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
|
+
);
|
|
181
243
|
|
|
182
244
|
// Classify tasks for foreign-aware cancellation
|
|
183
245
|
const abortResult = abortOwned(loaded.manifest.runId, undefined, ctx, params.force);
|
|
184
246
|
if (abortResult.abortedIds.length === 0 && abortResult.foreignIds.length > 0 && !params.force) {
|
|
185
|
-
return result(
|
|
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
|
+
);
|
|
186
257
|
}
|
|
187
258
|
const cancellableIds = new Set(abortResult.abortedIds);
|
|
188
259
|
const cancelReason = cancelReasonFromParams(params);
|
|
@@ -192,9 +263,20 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
|
|
|
192
263
|
|
|
193
264
|
const tasks = loaded.tasks.map((task) => {
|
|
194
265
|
if (cancellableIds.has(task.id) && (task.status === "queued" || task.status === "running" || task.status === "waiting")) {
|
|
195
|
-
const base = {
|
|
266
|
+
const base = {
|
|
267
|
+
...task,
|
|
268
|
+
status: "cancelled" as const,
|
|
269
|
+
finishedAt: new Date().toISOString(),
|
|
270
|
+
error: cancelMessage,
|
|
271
|
+
};
|
|
196
272
|
if (task.status === "running") {
|
|
197
|
-
return {
|
|
273
|
+
return {
|
|
274
|
+
...base,
|
|
275
|
+
terminalEvidence: [
|
|
276
|
+
...(task.terminalEvidence ?? []),
|
|
277
|
+
buildSyntheticTerminalEvidence("worker", cancelReason, task.startedAt),
|
|
278
|
+
],
|
|
279
|
+
};
|
|
198
280
|
}
|
|
199
281
|
return base;
|
|
200
282
|
}
|
|
@@ -202,7 +284,10 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
|
|
|
202
284
|
});
|
|
203
285
|
saveRunTasks(loaded.manifest, tasks);
|
|
204
286
|
try {
|
|
205
|
-
saveCrewAgents(
|
|
287
|
+
saveCrewAgents(
|
|
288
|
+
loaded.manifest,
|
|
289
|
+
tasks.map((task) => recordFromTask(loaded.manifest, task, loaded.manifest.runtimeResolution?.kind ?? "child-process")),
|
|
290
|
+
);
|
|
206
291
|
} catch (error) {
|
|
207
292
|
logInternalError("team-tool.handleCancel.crewAgents", error, `runId=${loaded.manifest.runId}`);
|
|
208
293
|
}
|
|
@@ -213,14 +298,29 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
|
|
|
213
298
|
}
|
|
214
299
|
ctx.abortForegroundRun?.(loaded.manifest.runId);
|
|
215
300
|
for (const taskId of abortResult.abortedIds) {
|
|
216
|
-
appendEvent(loaded.manifest.eventsPath, {
|
|
301
|
+
appendEvent(loaded.manifest.eventsPath, {
|
|
302
|
+
type: "task.cancelled",
|
|
303
|
+
runId: loaded.manifest.runId,
|
|
304
|
+
taskId,
|
|
305
|
+
message: cancelMessage,
|
|
306
|
+
data: cancelData,
|
|
307
|
+
});
|
|
217
308
|
}
|
|
218
|
-
const updated = updateRunStatus(
|
|
309
|
+
const updated = updateRunStatus(
|
|
310
|
+
loaded.manifest,
|
|
311
|
+
"cancelled",
|
|
312
|
+
`${cancelMessage} Already-finished worker processes are not retroactively changed.`,
|
|
313
|
+
{ data: cancelData },
|
|
314
|
+
);
|
|
219
315
|
|
|
220
316
|
// Build descriptive message including foreign/missing info
|
|
221
317
|
const parts = [`Cancelled run ${updated.runId}.`];
|
|
222
|
-
if (abortResult.foreignIds.length > 0)
|
|
223
|
-
|
|
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(", ")}.`);
|
|
224
324
|
|
|
225
325
|
if (deps) invalidateSnapshot(updated.runId, runCwd, deps);
|
|
226
326
|
return result(parts.join(""), {
|
|
@@ -234,4 +334,4 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
|
|
|
234
334
|
intent: cancelIntent,
|
|
235
335
|
});
|
|
236
336
|
});
|
|
237
|
-
}
|
|
337
|
+
}
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
import { ChainRunner, parseChainString } from "../../runtime/chain-runner.ts";
|
|
17
17
|
import { HandoffManager } from "../../runtime/handoff-manager.ts";
|
|
18
|
-
import { ChainTeamRunExecutor, type HandleRunFn } from "./chain-executor.ts";
|
|
19
|
-
import { result, type TeamContext } from "./context.ts";
|
|
20
18
|
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
21
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
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Execute a chain expression (`"a -> b -> c"`). Each step runs a real team run
|
|
@@ -30,11 +30,7 @@ import type { PiTeamsToolResult } from "../tool-result.ts";
|
|
|
30
30
|
* @param ctx - The team tool context (cwd is used to load run manifests).
|
|
31
31
|
* @param handleRun - The run.ts `handleRun` function reference (injected).
|
|
32
32
|
*/
|
|
33
|
-
export async function handleChainRun(
|
|
34
|
-
params: TeamToolParamsValue,
|
|
35
|
-
ctx: TeamContext,
|
|
36
|
-
handleRun: HandleRunFn,
|
|
37
|
-
): Promise<PiTeamsToolResult> {
|
|
33
|
+
export async function handleChainRun(params: TeamToolParamsValue, ctx: TeamContext, handleRun: HandleRunFn): Promise<PiTeamsToolResult> {
|
|
38
34
|
const chainString = params.chain;
|
|
39
35
|
if (!chainString || chainString.trim().length === 0) {
|
|
40
36
|
return result("Chain expression is empty.", { action: "run", status: "error" }, true);
|
|
@@ -43,7 +39,7 @@ export async function handleChainRun(
|
|
|
43
39
|
const spec = parseChainString(chainString);
|
|
44
40
|
if (spec.steps.length === 0) {
|
|
45
41
|
return result(
|
|
46
|
-
|
|
42
|
+
'Chain must contain at least one step. Use the form: "step1 -> step2 -> step3".',
|
|
47
43
|
{ action: "run", status: "error" },
|
|
48
44
|
true,
|
|
49
45
|
);
|
|
@@ -72,11 +68,7 @@ export async function handleChainRun(
|
|
|
72
68
|
];
|
|
73
69
|
for (const s of chainResult.steps) {
|
|
74
70
|
const runId = executor.stepRunIds[s.step - 1];
|
|
75
|
-
const tag =
|
|
76
|
-
s.outcome === "success" ? "✓"
|
|
77
|
-
: s.outcome === "failure" ? "✗"
|
|
78
|
-
: s.outcome === "partial" ? "≈"
|
|
79
|
-
: "⊘";
|
|
71
|
+
const tag = s.outcome === "success" ? "✓" : s.outcome === "failure" ? "✗" : s.outcome === "partial" ? "≈" : "⊘";
|
|
80
72
|
lines.push(
|
|
81
73
|
`${tag} Step ${s.step} [${s.name}]: ${s.outcome} (${s.duration}ms)${runId ? ` runId=${runId}` : ""}${s.error ? ` | ${s.error}` : ""}`,
|
|
82
74
|
);
|
|
@@ -24,27 +24,24 @@
|
|
|
24
24
|
* @see src/extension/team-tool/run.ts (handleRun — the reused machinery)
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
+
import * as fs from "node:fs";
|
|
28
|
+
import * as path from "node:path";
|
|
27
29
|
import type { ChainTaskRunner } from "../../runtime/chain-runner.ts";
|
|
28
|
-
import type { TaskPacket, TaskResult
|
|
29
|
-
import { loadRunManifestById, createRunPaths } from "../../state/state-store.ts";
|
|
30
|
+
import type { Decision, TaskPacket, TaskResult } from "../../runtime/handoff-manager.ts";
|
|
30
31
|
import { readIfSmallWithTee } from "../../runtime/task-output-context.ts";
|
|
32
|
+
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
33
|
+
import { createRunPaths, loadRunManifestById } from "../../state/state-store.ts";
|
|
31
34
|
import type { TeamRunManifest, TeamTaskState } from "../../state/types.ts";
|
|
32
35
|
import type { PiTeamsToolResult } from "../tool-result.ts";
|
|
33
36
|
import { textFromToolResult } from "../tool-result.ts";
|
|
34
|
-
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
35
37
|
import type { TeamContext } from "./context.ts";
|
|
36
|
-
import * as fs from "node:fs";
|
|
37
|
-
import * as path from "node:path";
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
40
|
* Signature of `handleRun`, declared locally (type-only) to break the
|
|
41
41
|
* import cycle with run.ts. Structurally identical to
|
|
42
42
|
* `(params, ctx) => Promise<PiTeamsToolResult>`.
|
|
43
43
|
*/
|
|
44
|
-
export type HandleRunFn = (
|
|
45
|
-
params: TeamToolParamsValue,
|
|
46
|
-
ctx: TeamContext,
|
|
47
|
-
) => Promise<PiTeamsToolResult>;
|
|
44
|
+
export type HandleRunFn = (params: TeamToolParamsValue, ctx: TeamContext) => Promise<PiTeamsToolResult>;
|
|
48
45
|
|
|
49
46
|
/** Per-step team/workflow/model overrides forwarded from the chain invocation. */
|
|
50
47
|
export interface ChainExecutorOverrides {
|
|
@@ -94,8 +91,8 @@ export function formatChainHistory(context: Record<string, unknown>): string {
|
|
|
94
91
|
if (entry.decisions?.length) {
|
|
95
92
|
lines.push("Decisions:");
|
|
96
93
|
for (const d of entry.decisions) {
|
|
97
|
-
const rationale =
|
|
98
|
-
const decisionOutcome =
|
|
94
|
+
const rationale = d && typeof d === "object" && "rationale" in d ? String(d.rationale) : "(undocumented)";
|
|
95
|
+
const decisionOutcome = d && typeof d === "object" && "outcome" in d ? String(d.outcome) : "";
|
|
99
96
|
lines.push(`- ${rationale}${decisionOutcome ? ` → ${decisionOutcome}` : ""}`);
|
|
100
97
|
}
|
|
101
98
|
}
|
|
@@ -133,19 +130,12 @@ export function formatChainHistory(context: Record<string, unknown>): string {
|
|
|
133
130
|
*
|
|
134
131
|
* Extracted as a pure function for unit testability (acceptance criterion 6b).
|
|
135
132
|
*/
|
|
136
|
-
export function mapRunToTaskResult(
|
|
137
|
-
manifest: TeamRunManifest,
|
|
138
|
-
tasks: TeamTaskState[],
|
|
139
|
-
): TaskResult {
|
|
133
|
+
export function mapRunToTaskResult(manifest: TeamRunManifest, tasks: TeamTaskState[]): TaskResult {
|
|
140
134
|
// Determine outcome from manifest status.
|
|
141
135
|
let outcome: TaskResult["outcome"];
|
|
142
136
|
if (manifest.status === "completed") {
|
|
143
137
|
outcome = "success";
|
|
144
|
-
} else if (
|
|
145
|
-
manifest.status === "failed" ||
|
|
146
|
-
manifest.status === "blocked" ||
|
|
147
|
-
manifest.status === "cancelled"
|
|
148
|
-
) {
|
|
138
|
+
} else if (manifest.status === "failed" || manifest.status === "blocked" || manifest.status === "cancelled") {
|
|
149
139
|
outcome = "failure";
|
|
150
140
|
} else {
|
|
151
141
|
// queued / planning / running → not terminal yet
|
|
@@ -196,10 +186,7 @@ export function mapRunToTaskResult(
|
|
|
196
186
|
*
|
|
197
187
|
* Returns the concatenated output text, or undefined if no artifacts were readable.
|
|
198
188
|
*/
|
|
199
|
-
export function readChainStepOutput(
|
|
200
|
-
manifest: TeamRunManifest,
|
|
201
|
-
tasks: TeamTaskState[],
|
|
202
|
-
): string | undefined {
|
|
189
|
+
export function readChainStepOutput(manifest: TeamRunManifest, tasks: TeamTaskState[]): string | undefined {
|
|
203
190
|
const parts: string[] = [];
|
|
204
191
|
for (const t of tasks) {
|
|
205
192
|
if (t.status !== "completed" || !t.resultArtifact?.path) continue;
|
|
@@ -247,21 +234,12 @@ export class ChainTeamRunExecutor implements ChainTaskRunner {
|
|
|
247
234
|
// 1. Format chain history into the goal — this is how context reaches the worker.
|
|
248
235
|
// Mirrors the parentContext pattern in child-pi.ts (parent context + task delimiter).
|
|
249
236
|
const historyPrefix = formatChainHistory(context);
|
|
250
|
-
const enrichedGoal = historyPrefix
|
|
251
|
-
? `${historyPrefix}\n\n---\n# Current Chain Step\n${packet.goal}`
|
|
252
|
-
: packet.goal;
|
|
237
|
+
const enrichedGoal = historyPrefix ? `${historyPrefix}\n\n---\n# Current Chain Step\n${packet.goal}` : packet.goal;
|
|
253
238
|
|
|
254
239
|
// 2. Resolve team/workflow/model: step config (set by executeStep) → overrides → default.
|
|
255
|
-
const stepTeam =
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
"default";
|
|
259
|
-
const stepWorkflow =
|
|
260
|
-
(context.__chainStepWorkflow as string | undefined) ??
|
|
261
|
-
this.overrides.workflow;
|
|
262
|
-
const stepModel =
|
|
263
|
-
(context.__chainStepModel as string | undefined) ??
|
|
264
|
-
this.overrides.model;
|
|
240
|
+
const stepTeam = (context.__chainStepTeam as string | undefined) ?? this.overrides.team ?? "default";
|
|
241
|
+
const stepWorkflow = (context.__chainStepWorkflow as string | undefined) ?? this.overrides.workflow;
|
|
242
|
+
const stepModel = (context.__chainStepModel as string | undefined) ?? this.overrides.model;
|
|
265
243
|
|
|
266
244
|
// 3. Call handleRun for the heavy lifting. async:false forces each step to
|
|
267
245
|
// complete synchronously (overrides asyncByDefault) so the chain is sequential.
|
|
@@ -341,22 +319,22 @@ export function writeRunFixture(
|
|
|
341
319
|
retention: "run" as const,
|
|
342
320
|
};
|
|
343
321
|
if (!tasks || tasks.length === 0) {
|
|
344
|
-
tasks = [
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
322
|
+
tasks = [
|
|
323
|
+
{
|
|
324
|
+
id: taskId,
|
|
325
|
+
runId,
|
|
326
|
+
role: "executor",
|
|
327
|
+
agent: "executor",
|
|
328
|
+
title: "(chain step fixture)",
|
|
329
|
+
status: "completed",
|
|
330
|
+
dependsOn: [],
|
|
331
|
+
cwd,
|
|
332
|
+
resultArtifact,
|
|
333
|
+
},
|
|
334
|
+
];
|
|
355
335
|
} else {
|
|
356
336
|
// Attach resultArtifact to the first task if it doesn't have one.
|
|
357
|
-
tasks = tasks.map((t, i) => i === 0 && !t.resultArtifact
|
|
358
|
-
? { ...t, resultArtifact }
|
|
359
|
-
: t);
|
|
337
|
+
tasks = tasks.map((t, i) => (i === 0 && !t.resultArtifact ? { ...t, resultArtifact } : t));
|
|
360
338
|
}
|
|
361
339
|
}
|
|
362
340
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { effectiveAutonomousConfig,
|
|
1
|
+
import { effectiveAutonomousConfig, type PiTeamsAutonomousConfig, type PiTeamsConfig, parseConfig } from "../../config/config.ts";
|
|
2
2
|
|
|
3
3
|
const DANGEROUS_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
4
4
|
|