pi-crew 0.9.15 → 0.9.17
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 +145 -0
- package/README.md +19 -0
- package/dist/build-meta.json +21790 -0
- package/dist/index.mjs +83070 -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/patterns/command-agent-skill.md +1 -1
- 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 +166 -590
- 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 +151 -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 +27 -23
- 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 +343 -78
- 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 +193 -40
- 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 +186 -58
- 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 +12 -30
- 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 +8 -16
- 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 +1 -2
- package/src/runtime/retry-executor.ts +20 -4
- package/src/runtime/retry-runner.ts +26 -50
- 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 +86 -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 +11 -18
- 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 +29 -8
- 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 +1 -4
- 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 +105 -26
- 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 +129 -45
- 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/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 +45 -24
- 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
|
@@ -1,45 +1,26 @@
|
|
|
1
1
|
import { allAgents, discoverAgents } from "../../agents/discover-agents.ts";
|
|
2
2
|
import { loadConfig } from "../../config/config.ts";
|
|
3
|
-
import {
|
|
4
|
-
PipelineRunner,
|
|
5
|
-
type PipelineWorkflow,
|
|
6
|
-
} from "../../runtime/pipeline-runner.ts";
|
|
3
|
+
import { PipelineRunner, type PipelineWorkflow } from "../../runtime/pipeline-runner.ts";
|
|
7
4
|
// Heavy runtime — lazy-loaded to avoid 1.4s import cost at extension registration.
|
|
8
5
|
import type { executeTeamRun as ExecuteTeamRunFn } from "../../runtime/team-runner.ts";
|
|
9
6
|
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
10
|
-
import {
|
|
11
|
-
registerActiveRun,
|
|
12
|
-
unregisterActiveRun,
|
|
13
|
-
} from "../../state/active-run-registry.ts";
|
|
7
|
+
import { registerActiveRun, unregisterActiveRun } from "../../state/active-run-registry.ts";
|
|
14
8
|
import { writeArtifact } from "../../state/artifact-store.ts";
|
|
15
9
|
import { atomicWriteJson } from "../../state/atomic-write.ts";
|
|
16
|
-
import {
|
|
17
|
-
createRunManifest,
|
|
18
|
-
loadRunManifestById,
|
|
19
|
-
updateRunStatus,
|
|
20
|
-
} from "../../state/state-store.ts";
|
|
10
|
+
import { createRunManifest, loadRunManifestById, updateRunStatus } from "../../state/state-store.ts";
|
|
21
11
|
import { allTeams, discoverTeams } from "../../teams/discover-teams.ts";
|
|
22
|
-
import {
|
|
23
|
-
allWorkflows,
|
|
24
|
-
discoverWorkflows,
|
|
25
|
-
} from "../../workflows/discover-workflows.ts";
|
|
12
|
+
import { allWorkflows, discoverWorkflows } from "../../workflows/discover-workflows.ts";
|
|
26
13
|
import { validateWorkflowForTeam } from "../../workflows/validate-workflow.ts";
|
|
27
|
-
import {
|
|
28
|
-
assertCleanLeader,
|
|
29
|
-
findGitRoot,
|
|
30
|
-
} from "../../worktree/worktree-manager.ts";
|
|
14
|
+
import { assertCleanLeader, findGitRoot } from "../../worktree/worktree-manager.ts";
|
|
31
15
|
|
|
32
16
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- type-only import for TS inference
|
|
33
|
-
const _typeCheck: typeof ExecuteTeamRunFn =
|
|
34
|
-
null as never as typeof ExecuteTeamRunFn;
|
|
17
|
+
const _typeCheck: typeof ExecuteTeamRunFn = null as never as typeof ExecuteTeamRunFn;
|
|
35
18
|
|
|
36
19
|
import { logInternalError } from "../../utils/internal-error.ts";
|
|
37
20
|
import { resolveRealContainedPath } from "../../utils/safe-paths.ts";
|
|
38
21
|
|
|
39
22
|
let _cachedExecuteTeamRun: typeof ExecuteTeamRunFn | undefined;
|
|
40
|
-
async function executeTeamRun(
|
|
41
|
-
...args: Parameters<typeof ExecuteTeamRunFn>
|
|
42
|
-
): Promise<Awaited<ReturnType<typeof ExecuteTeamRunFn>>> {
|
|
23
|
+
async function executeTeamRun(...args: Parameters<typeof ExecuteTeamRunFn>): Promise<Awaited<ReturnType<typeof ExecuteTeamRunFn>>> {
|
|
43
24
|
if (!_cachedExecuteTeamRun) {
|
|
44
25
|
// LAZY: heavy runtime — defer 1.4s import cost until team run actually executes.
|
|
45
26
|
const mod = await import("../../runtime/team-runner.ts");
|
|
@@ -49,10 +30,7 @@ async function executeTeamRun(
|
|
|
49
30
|
}
|
|
50
31
|
|
|
51
32
|
import { expandParallelResearchWorkflow } from "../../runtime/parallel-research.ts";
|
|
52
|
-
import {
|
|
53
|
-
resolveCrewRuntime,
|
|
54
|
-
runtimeResolutionState,
|
|
55
|
-
} from "../../runtime/runtime-resolver.ts";
|
|
33
|
+
import { resolveCrewRuntime, runtimeResolutionState } from "../../runtime/runtime-resolver.ts";
|
|
56
34
|
import { normalizeSkillOverride } from "../../runtime/skill-instructions.ts";
|
|
57
35
|
import { appendEventAsync, readEvents } from "../../state/event-log.ts";
|
|
58
36
|
import { spawnBackgroundTeamRun } from "../../subagents/async-entry.ts";
|
|
@@ -84,9 +62,7 @@ import { spawnBackgroundTeamRun } from "../../subagents/async-entry.ts";
|
|
|
84
62
|
* `team action='run' workflow='<dynamic>'` → "Cannot access 'crewInitPromise'
|
|
85
63
|
* before initialization" at run.ts load. See RFC 17 + commit fixing this.
|
|
86
64
|
*/
|
|
87
|
-
var crewInitPromise:
|
|
88
|
-
| Promise<typeof import("../../state/crew-init.ts")>
|
|
89
|
-
| undefined;
|
|
65
|
+
var crewInitPromise: Promise<typeof import("../../state/crew-init.ts")> | undefined;
|
|
90
66
|
function loadCrewInit(): Promise<typeof import("../../state/crew-init.ts")> {
|
|
91
67
|
if (!crewInitPromise) {
|
|
92
68
|
crewInitPromise = import("../../state/crew-init.ts");
|
|
@@ -97,20 +73,13 @@ function loadCrewInit(): Promise<typeof import("../../state/crew-init.ts")> {
|
|
|
97
73
|
import * as fs from "node:fs";
|
|
98
74
|
import * as path from "node:path";
|
|
99
75
|
import { hasAsyncStartMarker } from "../../runtime/async-marker.ts";
|
|
100
|
-
import {
|
|
101
|
-
checkProcessLiveness,
|
|
102
|
-
isActiveRunStatus,
|
|
103
|
-
} from "../../runtime/process-status.ts";
|
|
76
|
+
import { checkProcessLiveness, isActiveRunStatus } from "../../runtime/process-status.ts";
|
|
104
77
|
import { waitForRun } from "../../runtime/run-tracker.ts";
|
|
105
78
|
import { collectRunMetrics } from "../../state/run-metrics.ts";
|
|
106
79
|
import type { PiTeamsToolResult } from "../tool-result.ts";
|
|
107
80
|
import { effectiveRunConfig } from "./config-patch.ts";
|
|
108
81
|
import { buildParentContext, result, type TeamContext } from "./context.ts";
|
|
109
|
-
import {
|
|
110
|
-
isGoalWrapEnabled,
|
|
111
|
-
shouldGoalWrap,
|
|
112
|
-
startGoalWrappedRun,
|
|
113
|
-
} from "./goal-wrap.ts";
|
|
82
|
+
import { isGoalWrapEnabled, shouldGoalWrap, startGoalWrappedRun } from "./goal-wrap.ts";
|
|
114
83
|
|
|
115
84
|
function tailFile(filePath: string, maxBytes = 4096): string | undefined {
|
|
116
85
|
try {
|
|
@@ -131,12 +100,7 @@ function tailFile(filePath: string, maxBytes = 4096): string | undefined {
|
|
|
131
100
|
}
|
|
132
101
|
}
|
|
133
102
|
|
|
134
|
-
function scheduleBackgroundEarlyExitGuard(
|
|
135
|
-
cwd: string,
|
|
136
|
-
runId: string,
|
|
137
|
-
pid: number | undefined,
|
|
138
|
-
logPath: string,
|
|
139
|
-
): void {
|
|
103
|
+
function scheduleBackgroundEarlyExitGuard(cwd: string, runId: string, pid: number | undefined, logPath: string): void {
|
|
140
104
|
if (process.env.PI_CREW_ASYNC_EARLY_EXIT_GUARD === "0") return;
|
|
141
105
|
const timer = setTimeout(() => {
|
|
142
106
|
const loaded = loadRunManifestById(cwd, runId);
|
|
@@ -144,10 +108,7 @@ function scheduleBackgroundEarlyExitGuard(
|
|
|
144
108
|
if (hasAsyncStartMarker(loaded.manifest)) return;
|
|
145
109
|
if (
|
|
146
110
|
readEvents(loaded.manifest.eventsPath).some(
|
|
147
|
-
(event) =>
|
|
148
|
-
event.type === "async.started" ||
|
|
149
|
-
event.type === "async.completed" ||
|
|
150
|
-
event.type === "async.failed",
|
|
111
|
+
(event) => event.type === "async.started" || event.type === "async.completed" || event.type === "async.failed",
|
|
151
112
|
)
|
|
152
113
|
)
|
|
153
114
|
return;
|
|
@@ -155,11 +116,7 @@ function scheduleBackgroundEarlyExitGuard(
|
|
|
155
116
|
if (liveness.alive) return;
|
|
156
117
|
const tail = tailFile(logPath);
|
|
157
118
|
const message = `Background runner exited within 3s; see background.log${tail ? `\n${tail}` : ""}`;
|
|
158
|
-
const failed = updateRunStatus(
|
|
159
|
-
loaded.manifest,
|
|
160
|
-
"failed",
|
|
161
|
-
"Background runner exited within 3s; see background.log",
|
|
162
|
-
);
|
|
119
|
+
const failed = updateRunStatus(loaded.manifest, "failed", "Background runner exited within 3s; see background.log");
|
|
163
120
|
void appendEventAsync(failed.eventsPath, {
|
|
164
121
|
type: "async.failed",
|
|
165
122
|
runId: failed.runId,
|
|
@@ -170,10 +127,7 @@ function scheduleBackgroundEarlyExitGuard(
|
|
|
170
127
|
timer.unref();
|
|
171
128
|
}
|
|
172
129
|
|
|
173
|
-
export async function handleRun(
|
|
174
|
-
params: TeamToolParamsValue,
|
|
175
|
-
ctx: TeamContext,
|
|
176
|
-
): Promise<PiTeamsToolResult> {
|
|
130
|
+
export async function handleRun(params: TeamToolParamsValue, ctx: TeamContext): Promise<PiTeamsToolResult> {
|
|
177
131
|
// CHAIN DISPATCH: runs before goal validation since a chain has no top-level
|
|
178
132
|
// goal. The injected handleRun reference breaks the run.ts ↔ chain-dispatch.ts
|
|
179
133
|
// import cycle; the lazy import defers the chain-executor cost until a chain is
|
|
@@ -184,12 +138,7 @@ export async function handleRun(
|
|
|
184
138
|
return handleChainRun(params, ctx, handleRun);
|
|
185
139
|
}
|
|
186
140
|
const goal = params.goal ?? params.task;
|
|
187
|
-
if (!goal)
|
|
188
|
-
return result(
|
|
189
|
-
"Run requires goal or task.",
|
|
190
|
-
{ action: "run", status: "error" },
|
|
191
|
-
true,
|
|
192
|
-
);
|
|
141
|
+
if (!goal) return result("Run requires goal or task.", { action: "run", status: "error" }, true);
|
|
193
142
|
const intentPrefix = goal.length > 60 ? `${goal.slice(0, 57)}...` : goal;
|
|
194
143
|
|
|
195
144
|
// P0: Ensure .crew directory structure exists before creating any manifests.
|
|
@@ -251,15 +200,8 @@ export async function handleRun(
|
|
|
251
200
|
const teams = allTeams(discoverTeams(resolvedCtx.cwd));
|
|
252
201
|
const workflows = allWorkflows(discoverWorkflows(resolvedCtx.cwd));
|
|
253
202
|
const agents = allAgents(discoverAgents(resolvedCtx.cwd));
|
|
254
|
-
const directAgent = params.agent
|
|
255
|
-
|
|
256
|
-
: undefined;
|
|
257
|
-
if (params.agent && !directAgent)
|
|
258
|
-
return result(
|
|
259
|
-
`Agent '${params.agent}' not found.`,
|
|
260
|
-
{ action: "run", status: "error" },
|
|
261
|
-
true,
|
|
262
|
-
);
|
|
203
|
+
const directAgent = params.agent ? agents.find((item) => item.name === params.agent) : undefined;
|
|
204
|
+
if (params.agent && !directAgent) return result(`Agent '${params.agent}' not found.`, { action: "run", status: "error" }, true);
|
|
263
205
|
const teamName = params.team ?? "default";
|
|
264
206
|
const team = directAgent
|
|
265
207
|
? {
|
|
@@ -278,15 +220,8 @@ export async function handleRun(
|
|
|
278
220
|
workspaceMode: params.workspaceMode,
|
|
279
221
|
}
|
|
280
222
|
: teams.find((item) => item.name === teamName);
|
|
281
|
-
if (!team)
|
|
282
|
-
|
|
283
|
-
`Team '${teamName}' not found.`,
|
|
284
|
-
{ action: "run", status: "error" },
|
|
285
|
-
true,
|
|
286
|
-
);
|
|
287
|
-
const workflowName = directAgent
|
|
288
|
-
? "direct-agent"
|
|
289
|
-
: (params.workflow ?? team.defaultWorkflow ?? "default");
|
|
223
|
+
if (!team) return result(`Team '${teamName}' not found.`, { action: "run", status: "error" }, true);
|
|
224
|
+
const workflowName = directAgent ? "direct-agent" : (params.workflow ?? team.defaultWorkflow ?? "default");
|
|
290
225
|
const baseWorkflow = directAgent
|
|
291
226
|
? {
|
|
292
227
|
name: "direct-agent",
|
|
@@ -303,21 +238,10 @@ export async function handleRun(
|
|
|
303
238
|
],
|
|
304
239
|
}
|
|
305
240
|
: workflows.find((item) => item.name === workflowName);
|
|
306
|
-
if (!baseWorkflow)
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
true,
|
|
311
|
-
);
|
|
312
|
-
// LAZY: dodge the jiti ESM/CJS interop TDZ race on the static `import { expandParallelResearchWorkflow }` above (issue #28, RFC 17). At call time the module body has fully evaluated, so the dynamic import returns a live binding.
|
|
313
|
-
// LAZY: marker duplicated for biome-check compatibility (script checks `lineNum - 2`).
|
|
314
|
-
// LAZY: keep import on single line so the `// LAZY:` marker above remains 1-line away from `await import`.
|
|
315
|
-
const { expandParallelResearchWorkflow: expandParallelResearch } = await import(
|
|
316
|
-
"../../runtime/parallel-research.ts",
|
|
317
|
-
);
|
|
318
|
-
const workflow = directAgent
|
|
319
|
-
? baseWorkflow
|
|
320
|
-
: expandParallelResearch(baseWorkflow, resolvedCtx.cwd);
|
|
241
|
+
if (!baseWorkflow) return result(`Workflow '${workflowName}' not found.`, { action: "run", status: "error" }, true);
|
|
242
|
+
// LAZY: dodge the jiti ESM/CJS interop TDZ race on the static `import { expandParallelResearchWorkflow }` above (issue #28, RFC 17). At call time the module body has fully evaluated, so the dynamic import returns a live binding. Multi-line form breaks scripts/check-lazy-imports.mjs (which does `lines[lineNum - 2]`), so keep destructuring + await import on one line.
|
|
243
|
+
const { expandParallelResearchWorkflow: expandParallelResearch } = await import("../../runtime/parallel-research.ts");
|
|
244
|
+
const workflow = directAgent ? baseWorkflow : expandParallelResearch(baseWorkflow, resolvedCtx.cwd);
|
|
321
245
|
|
|
322
246
|
// PREFLIGHT (advisory only, since v0.9.15): classify workflow topology and emit
|
|
323
247
|
// informational notes per the rule in .crew/knowledge.md "pi-crew USAGE THRESHOLD
|
|
@@ -327,22 +251,13 @@ export async function handleRun(
|
|
|
327
251
|
// Skip for direct-agent runs (they bypass the workflow system entirely).
|
|
328
252
|
if (!directAgent) {
|
|
329
253
|
// LAZY: defer preflight-validator import until a team run actually requests it.
|
|
330
|
-
const { validateWorkflowUsage } = await import(
|
|
331
|
-
"../../workflows/preflight-validator.ts"
|
|
332
|
-
);
|
|
254
|
+
const { validateWorkflowUsage } = await import("../../workflows/preflight-validator.ts");
|
|
333
255
|
const preflight = validateWorkflowUsage(workflow, {
|
|
334
256
|
force: params.force === true,
|
|
335
257
|
});
|
|
336
|
-
const icon =
|
|
337
|
-
preflight.level === "warn"
|
|
338
|
-
? "⚠️ "
|
|
339
|
-
: preflight.level === "note"
|
|
340
|
-
? "ℹ️ "
|
|
341
|
-
: "";
|
|
258
|
+
const icon = preflight.level === "warn" ? "⚠️ " : preflight.level === "note" ? "ℹ️ " : "";
|
|
342
259
|
const tag = preflight.level.toUpperCase();
|
|
343
|
-
console.warn(
|
|
344
|
-
`${icon}[team-tool.preflight] ${tag}: ${preflight.message} (workflow=${workflow.name})`,
|
|
345
|
-
);
|
|
260
|
+
console.warn(`${icon}[team-tool.preflight] ${tag}: ${preflight.message} (workflow=${workflow.name})`);
|
|
346
261
|
if (preflight.suggestion) {
|
|
347
262
|
console.warn(`[team-tool.preflight] → ${preflight.suggestion}`);
|
|
348
263
|
}
|
|
@@ -358,11 +273,7 @@ export async function handleRun(
|
|
|
358
273
|
// transition). When goal-wrap is unsafe for this workflow, we do NOT error
|
|
359
274
|
// out — we fall through to the normal team-run path so the user still gets
|
|
360
275
|
// the run they asked for. The disabled reason is logged for traceability.
|
|
361
|
-
if (
|
|
362
|
-
!directAgent &&
|
|
363
|
-
workflow.source === "builtin" &&
|
|
364
|
-
isGoalWrapEnabled(resolvedCtx.cwd, workflow.name)
|
|
365
|
-
) {
|
|
276
|
+
if (!directAgent && workflow.source === "builtin" && isGoalWrapEnabled(resolvedCtx.cwd, workflow.name)) {
|
|
366
277
|
const decision = shouldGoalWrap(resolvedCtx.cwd, workflow);
|
|
367
278
|
if (decision.enabled) {
|
|
368
279
|
return await startGoalWrappedRun(params, ctx, workflow, goal);
|
|
@@ -401,9 +312,7 @@ export async function handleRun(
|
|
|
401
312
|
|
|
402
313
|
// For now, show pipeline workflow info - full integration would require
|
|
403
314
|
// connecting PipelineRunner to the actual team execution system
|
|
404
|
-
const stageInfo = pipelineWorkflow.stages
|
|
405
|
-
.map((s) => `- ${s.name} (${s.team})`)
|
|
406
|
-
.join("\n");
|
|
315
|
+
const stageInfo = pipelineWorkflow.stages.map((s) => `- ${s.name} (${s.team})`).join("\n");
|
|
407
316
|
return result(
|
|
408
317
|
[
|
|
409
318
|
`Pipeline workflow '${workflow.name}' is not yet wired into the team execution system.`,
|
|
@@ -424,25 +333,20 @@ export async function handleRun(
|
|
|
424
333
|
}
|
|
425
334
|
|
|
426
335
|
// LAZY: dodge the jiti ESM/CJS interop TDZ race on the static `import { validateWorkflowForTeam }` above (issue #28, RFC 17).
|
|
427
|
-
const { validateWorkflowForTeam: validateWorkflow } = await import(
|
|
428
|
-
"../../workflows/validate-workflow.ts"
|
|
429
|
-
);
|
|
336
|
+
const { validateWorkflowForTeam: validateWorkflow } = await import("../../workflows/validate-workflow.ts");
|
|
430
337
|
const validationErrors = validateWorkflow(workflow, team);
|
|
431
338
|
if (validationErrors.length > 0) {
|
|
432
339
|
return result(
|
|
433
|
-
[
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
].join("\n"),
|
|
340
|
+
[`Workflow '${workflow.name}' is not valid for team '${team.name}':`, ...validationErrors.map((error) => `- ${error}`)].join(
|
|
341
|
+
"\n",
|
|
342
|
+
),
|
|
437
343
|
{ action: "run", status: "error" },
|
|
438
344
|
true,
|
|
439
345
|
);
|
|
440
346
|
}
|
|
441
347
|
|
|
442
348
|
// LAZY: dodge the jiti ESM/CJS interop TDZ race on the static `import { normalizeSkillOverride }` above (issue #28, RFC 17).
|
|
443
|
-
const { normalizeSkillOverride: normalizeSkill } = await import(
|
|
444
|
-
"../../runtime/skill-instructions.ts"
|
|
445
|
-
);
|
|
349
|
+
const { normalizeSkillOverride: normalizeSkill } = await import("../../runtime/skill-instructions.ts");
|
|
446
350
|
const skillOverride = normalizeSkill(params.skill);
|
|
447
351
|
const { manifest, tasks, paths } = createRunManifest({
|
|
448
352
|
cwd: resolvedCtx.cwd,
|
|
@@ -464,8 +368,7 @@ export async function handleRun(
|
|
|
464
368
|
...manifest,
|
|
465
369
|
...(skillOverride !== undefined ? { skillOverride } : {}),
|
|
466
370
|
artifacts: [goalArtifact],
|
|
467
|
-
summary:
|
|
468
|
-
"Run manifest created; worker execution is not implemented yet.",
|
|
371
|
+
summary: "Run manifest created; worker execution is not implemented yet.",
|
|
469
372
|
};
|
|
470
373
|
atomicWriteJson(paths.manifestPath, updatedManifest);
|
|
471
374
|
registerActiveRun(updatedManifest);
|
|
@@ -474,16 +377,9 @@ export async function handleRun(
|
|
|
474
377
|
// run it via runDynamicWorkflow instead of the static executeTeamRun path. The script
|
|
475
378
|
// orchestrates subagents via ctx.agent(); only ctx.setResult() reaches the main context.
|
|
476
379
|
// Placed AFTER manifest creation so runId/paths/artifactsRoot are available.
|
|
477
|
-
if (
|
|
478
|
-
!directAgent &&
|
|
479
|
-
(
|
|
480
|
-
workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig
|
|
481
|
-
).runtime === "dynamic"
|
|
482
|
-
) {
|
|
380
|
+
if (!directAgent && (workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig).runtime === "dynamic") {
|
|
483
381
|
// LAZY: defer dynamic import of ../../runtime/dynamic-workflow-runner.ts to its call site.
|
|
484
|
-
const { runDynamicWorkflow } = await import(
|
|
485
|
-
"../../runtime/dynamic-workflow-runner.ts"
|
|
486
|
-
);
|
|
382
|
+
const { runDynamicWorkflow } = await import("../../runtime/dynamic-workflow-runner.ts");
|
|
487
383
|
// Re-synthesize a dynamic-team (§0c C9) for role resolution.
|
|
488
384
|
const dwfTeam: import("../../teams/team-config.ts").TeamConfig = {
|
|
489
385
|
name: `dwf-${manifest.runId.slice(-12)}`,
|
|
@@ -500,39 +396,27 @@ export async function handleRun(
|
|
|
500
396
|
};
|
|
501
397
|
atomicWriteJson(paths.manifestPath, dwfManifest);
|
|
502
398
|
try {
|
|
503
|
-
let dwfResult:
|
|
504
|
-
| import("../../runtime/dynamic-workflow-runner.ts").RunDynamicWorkflowResult
|
|
505
|
-
| undefined;
|
|
399
|
+
let dwfResult: import("../../runtime/dynamic-workflow-runner.ts").RunDynamicWorkflowResult | undefined;
|
|
506
400
|
try {
|
|
507
401
|
dwfResult = await runDynamicWorkflow({
|
|
508
402
|
manifest: dwfManifest,
|
|
509
|
-
workflow:
|
|
510
|
-
workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig,
|
|
403
|
+
workflow: workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig,
|
|
511
404
|
team: dwfTeam,
|
|
512
405
|
signal: ctx.signal ?? AbortSignal.timeout(3_600_000),
|
|
513
406
|
modelOverride: params.model,
|
|
514
407
|
tokenBudget:
|
|
515
408
|
params.tokenBudget ??
|
|
516
|
-
(
|
|
517
|
-
workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig
|
|
518
|
-
).maxTokenBudget,
|
|
409
|
+
(workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig).maxTokenBudget,
|
|
519
410
|
});
|
|
520
411
|
} catch (runnerError) {
|
|
521
412
|
// Round-11 runtime fix: persist manifest with status=failed when runner throws
|
|
522
413
|
// (e.g., script timeout, script syntax error, async failure). Previously the
|
|
523
414
|
// manifest stayed at 'queued' indefinitely, leaving an orphan state file.
|
|
524
|
-
const failureReason =
|
|
525
|
-
runnerError instanceof Error
|
|
526
|
-
? runnerError.message
|
|
527
|
-
: String(runnerError);
|
|
415
|
+
const failureReason = runnerError instanceof Error ? runnerError.message : String(runnerError);
|
|
528
416
|
const failedManifest = {
|
|
529
417
|
...dwfManifest,
|
|
530
418
|
status: "failed" as const,
|
|
531
|
-
summary:
|
|
532
|
-
`Dynamic workflow '${workflow.name}' failed: ${failureReason}`.slice(
|
|
533
|
-
0,
|
|
534
|
-
2000,
|
|
535
|
-
),
|
|
419
|
+
summary: `Dynamic workflow '${workflow.name}' failed: ${failureReason}`.slice(0, 2000),
|
|
536
420
|
updatedAt: new Date().toISOString(),
|
|
537
421
|
};
|
|
538
422
|
atomicWriteJson(paths.manifestPath, failedManifest);
|
|
@@ -555,8 +439,7 @@ export async function handleRun(
|
|
|
555
439
|
`Dynamic workflow '${workflow.name}' completed.\n${dwfResult.manifest.summary ?? ""}`,
|
|
556
440
|
{
|
|
557
441
|
action: "run",
|
|
558
|
-
status:
|
|
559
|
-
dwfResult.manifest.status === "failed" ? "error" : "ok",
|
|
442
|
+
status: dwfResult.manifest.status === "failed" ? "error" : "ok",
|
|
560
443
|
runId: dwfResult.manifest.runId,
|
|
561
444
|
artifactsRoot: dwfResult.manifest.artifactsRoot,
|
|
562
445
|
},
|
|
@@ -573,10 +456,7 @@ export async function handleRun(
|
|
|
573
456
|
// it shows in the run timeline and status, and log it. A malformed config
|
|
574
457
|
// (bad JSON / wrong types) should not be a silent no-op — doctor/config
|
|
575
458
|
// actions already surface these; run should too.
|
|
576
|
-
const configIssues = [
|
|
577
|
-
...(loadedConfig.error ? [`Config error: ${loadedConfig.error}`] : []),
|
|
578
|
-
...(loadedConfig.warnings ?? []),
|
|
579
|
-
];
|
|
459
|
+
const configIssues = [...(loadedConfig.error ? [`Config error: ${loadedConfig.error}`] : []), ...(loadedConfig.warnings ?? [])];
|
|
580
460
|
if (configIssues.length > 0) {
|
|
581
461
|
void appendEventAsync(updatedManifest.eventsPath, {
|
|
582
462
|
type: "config.warning",
|
|
@@ -587,23 +467,14 @@ export async function handleRun(
|
|
|
587
467
|
warnings: loadedConfig.warnings,
|
|
588
468
|
path: loadedConfig.path,
|
|
589
469
|
},
|
|
590
|
-
}).catch((error) =>
|
|
591
|
-
logInternalError(
|
|
592
|
-
"team-tool.run.configWarning",
|
|
593
|
-
error,
|
|
594
|
-
`runId=${updatedManifest.runId}`,
|
|
595
|
-
),
|
|
596
|
-
);
|
|
470
|
+
}).catch((error) => logInternalError("team-tool.run.configWarning", error, `runId=${updatedManifest.runId}`));
|
|
597
471
|
logInternalError(
|
|
598
472
|
"team-tool.run.configWarning",
|
|
599
473
|
new Error(`config issues: ${configIssues.join("; ")}`),
|
|
600
474
|
`runId=${updatedManifest.runId} path=${loadedConfig.path ?? "(defaults)"}`,
|
|
601
475
|
);
|
|
602
476
|
}
|
|
603
|
-
const executedConfig = effectiveRunConfig(
|
|
604
|
-
loadedConfig.config,
|
|
605
|
-
params.config,
|
|
606
|
-
);
|
|
477
|
+
const executedConfig = effectiveRunConfig(loadedConfig.config, params.config);
|
|
607
478
|
const runtime = await resolveCrewRuntime(executedConfig);
|
|
608
479
|
const runtimeResolution = runtimeResolutionState(runtime);
|
|
609
480
|
const executionManifest = {
|
|
@@ -618,13 +489,7 @@ export async function handleRun(
|
|
|
618
489
|
runId: executionManifest.runId,
|
|
619
490
|
message: `Runtime resolved: ${runtime.kind} safety=${runtime.safety}`,
|
|
620
491
|
data: { runtimeResolution },
|
|
621
|
-
}).catch((error) =>
|
|
622
|
-
logInternalError(
|
|
623
|
-
"team-tool.run.resolved",
|
|
624
|
-
error,
|
|
625
|
-
`runId=${executionManifest.runId}`,
|
|
626
|
-
),
|
|
627
|
-
);
|
|
492
|
+
}).catch((error) => logInternalError("team-tool.run.resolved", error, `runId=${executionManifest.runId}`));
|
|
628
493
|
const runAsync = params.async ?? executedConfig.asyncByDefault ?? false;
|
|
629
494
|
let effectiveRuntime = runtime;
|
|
630
495
|
if (runAsync && runtime.kind === "live-session") {
|
|
@@ -638,10 +503,7 @@ export async function handleRun(
|
|
|
638
503
|
reason: "Background runner cannot use live-session; falling back to child-process.",
|
|
639
504
|
};
|
|
640
505
|
}
|
|
641
|
-
const effectiveRuntimeResolution =
|
|
642
|
-
effectiveRuntime !== runtime
|
|
643
|
-
? runtimeResolutionState(effectiveRuntime)
|
|
644
|
-
: runtimeResolution;
|
|
506
|
+
const effectiveRuntimeResolution = effectiveRuntime !== runtime ? runtimeResolutionState(effectiveRuntime) : runtimeResolution;
|
|
645
507
|
const effectiveManifest =
|
|
646
508
|
effectiveRuntime !== runtime
|
|
647
509
|
? {
|
|
@@ -657,26 +519,15 @@ export async function handleRun(
|
|
|
657
519
|
runId: effectiveManifest.runId,
|
|
658
520
|
message: `Runtime overridden: child-process (async fallback from live-session)`,
|
|
659
521
|
data: { runtimeResolution: effectiveRuntimeResolution },
|
|
660
|
-
}).catch((error) =>
|
|
661
|
-
logInternalError(
|
|
662
|
-
"team-tool.run.override",
|
|
663
|
-
error,
|
|
664
|
-
`runId=${effectiveManifest.runId}`,
|
|
665
|
-
),
|
|
666
|
-
);
|
|
522
|
+
}).catch((error) => logInternalError("team-tool.run.override", error, `runId=${effectiveManifest.runId}`));
|
|
667
523
|
}
|
|
668
524
|
if (runAsync) {
|
|
669
525
|
if (effectiveRuntime.safety === "blocked") {
|
|
670
|
-
const runningManifest = updateRunStatus(
|
|
671
|
-
effectiveManifest,
|
|
672
|
-
"running",
|
|
673
|
-
"Checking worker runtime availability.",
|
|
674
|
-
);
|
|
526
|
+
const runningManifest = updateRunStatus(effectiveManifest, "running", "Checking worker runtime availability.");
|
|
675
527
|
const blocked = updateRunStatus(
|
|
676
528
|
runningManifest,
|
|
677
529
|
"blocked",
|
|
678
|
-
effectiveRuntime.reason ??
|
|
679
|
-
"Child worker execution is disabled; refusing to create no-op scaffold subagents.",
|
|
530
|
+
effectiveRuntime.reason ?? "Child worker execution is disabled; refusing to create no-op scaffold subagents.",
|
|
680
531
|
);
|
|
681
532
|
void appendEventAsync(blocked.eventsPath, {
|
|
682
533
|
type: "run.blocked",
|
|
@@ -688,8 +539,7 @@ export async function handleRun(
|
|
|
688
539
|
async: true,
|
|
689
540
|
diagnostics: {
|
|
690
541
|
requestedMode: effectiveRuntime.requestedMode,
|
|
691
|
-
workersDisabled:
|
|
692
|
-
executedConfig.executeWorkers === false,
|
|
542
|
+
workersDisabled: executedConfig.executeWorkers === false,
|
|
693
543
|
envCrew: process.env.PI_CREW_EXECUTE_WORKERS,
|
|
694
544
|
envTeams: process.env.PI_TEAMS_EXECUTE_WORKERS,
|
|
695
545
|
},
|
|
@@ -729,23 +579,11 @@ export async function handleRun(
|
|
|
729
579
|
data: { pid: spawned.pid, logPath: spawned.logPath },
|
|
730
580
|
});
|
|
731
581
|
ctx.onRunStarted?.(effectiveManifest.runId);
|
|
732
|
-
scheduleBackgroundEarlyExitGuard(
|
|
733
|
-
resolvedCtx.cwd,
|
|
734
|
-
effectiveManifest.runId,
|
|
735
|
-
spawned.pid,
|
|
736
|
-
spawned.logPath,
|
|
737
|
-
);
|
|
582
|
+
scheduleBackgroundEarlyExitGuard(resolvedCtx.cwd, effectiveManifest.runId, spawned.pid, spawned.logPath);
|
|
738
583
|
// Wait for the async run to complete and return actual results.
|
|
739
584
|
try {
|
|
740
|
-
const completed = await waitForRun(
|
|
741
|
-
|
|
742
|
-
resolvedCtx.cwd,
|
|
743
|
-
{ timeoutMs: 3600000 },
|
|
744
|
-
);
|
|
745
|
-
const metrics = collectRunMetrics(
|
|
746
|
-
resolvedCtx.cwd,
|
|
747
|
-
completed.manifest.runId,
|
|
748
|
-
);
|
|
585
|
+
const completed = await waitForRun(updatedManifest.runId, resolvedCtx.cwd, { timeoutMs: 3600000 });
|
|
586
|
+
const metrics = collectRunMetrics(resolvedCtx.cwd, completed.manifest.runId);
|
|
749
587
|
const lines: string[] = [
|
|
750
588
|
`pi-crew run ${completed.manifest.status}: ${completed.manifest.runId} (${team.name})`,
|
|
751
589
|
`Goal: ${goal.slice(0, 100)}`,
|
|
@@ -760,19 +598,11 @@ export async function handleRun(
|
|
|
760
598
|
if (completed.tasks.length > 0) {
|
|
761
599
|
// Read run-level summary artifact if present
|
|
762
600
|
let summaryContent: string | undefined;
|
|
763
|
-
const summaryArtifact = completed.manifest.artifacts?.find(
|
|
764
|
-
(a: { kind?: string }) => a.kind === "summary",
|
|
765
|
-
);
|
|
601
|
+
const summaryArtifact = completed.manifest.artifacts?.find((a: { kind?: string }) => a.kind === "summary");
|
|
766
602
|
if (summaryArtifact) {
|
|
767
603
|
try {
|
|
768
|
-
const sumPath = path.join(
|
|
769
|
-
|
|
770
|
-
summaryArtifact.path,
|
|
771
|
-
);
|
|
772
|
-
summaryContent = fs
|
|
773
|
-
.readFileSync(sumPath, "utf-8")
|
|
774
|
-
.trim()
|
|
775
|
-
.slice(0, 4000);
|
|
604
|
+
const sumPath = path.join(completed.manifest.artifactsRoot, summaryArtifact.path);
|
|
605
|
+
summaryContent = fs.readFileSync(sumPath, "utf-8").trim().slice(0, 4000);
|
|
776
606
|
} catch {
|
|
777
607
|
/* summary unavailable */
|
|
778
608
|
}
|
|
@@ -789,34 +619,19 @@ export async function handleRun(
|
|
|
789
619
|
// inside artifactsRoot via the project's safe-path primitive. Rejects
|
|
790
620
|
// absolute paths (/etc/passwd) and ../ traversal that the old
|
|
791
621
|
// path.isAbsolute shortcut + bare path.join allowed.
|
|
792
|
-
const resPath = resolveRealContainedPath(
|
|
793
|
-
|
|
794
|
-
task.resultArtifact.path,
|
|
795
|
-
);
|
|
796
|
-
resultExcerpt = fs
|
|
797
|
-
.readFileSync(resPath, "utf-8")
|
|
798
|
-
.trim()
|
|
799
|
-
.slice(0, 2000);
|
|
622
|
+
const resPath = resolveRealContainedPath(completed.manifest.artifactsRoot, task.resultArtifact.path);
|
|
623
|
+
resultExcerpt = fs.readFileSync(resPath, "utf-8").trim().slice(0, 2000);
|
|
800
624
|
} catch {
|
|
801
625
|
resultExcerpt = "(result unavailable)";
|
|
802
626
|
}
|
|
803
627
|
}
|
|
804
628
|
const shortResult = resultExcerpt.slice(0, 500);
|
|
805
629
|
const statusTag =
|
|
806
|
-
task.status === "completed"
|
|
807
|
-
? "✓"
|
|
808
|
-
: task.status === "failed"
|
|
809
|
-
? "✗"
|
|
810
|
-
: task.status === "cancelled"
|
|
811
|
-
? "⊘"
|
|
812
|
-
: "·";
|
|
630
|
+
task.status === "completed" ? "✓" : task.status === "failed" ? "✗" : task.status === "cancelled" ? "⊘" : "·";
|
|
813
631
|
taskLines.push(
|
|
814
632
|
`- ${statusTag} ${task.id} [${task.role}]: ${task.status}${shortResult ? " — " + shortResult : ""}${task.error ? ` | Error: ${task.error.slice(0, 200)}` : ""}`,
|
|
815
633
|
);
|
|
816
|
-
if (
|
|
817
|
-
task.status === "failed" ||
|
|
818
|
-
task.status === "needs_attention"
|
|
819
|
-
) {
|
|
634
|
+
if (task.status === "failed" || task.status === "needs_attention") {
|
|
820
635
|
failedCount++;
|
|
821
636
|
failedIds.push(task.id);
|
|
822
637
|
}
|
|
@@ -837,9 +652,7 @@ export async function handleRun(
|
|
|
837
652
|
lines.push("All tasks completed successfully.");
|
|
838
653
|
} else {
|
|
839
654
|
lines.push("");
|
|
840
|
-
lines.push(
|
|
841
|
-
`${failedCount} task(s) failed: ${failedIds.join(", ")}. Consider retrying.`,
|
|
842
|
-
);
|
|
655
|
+
lines.push(`${failedCount} task(s) failed: ${failedIds.join(", ")}. Consider retrying.`);
|
|
843
656
|
}
|
|
844
657
|
} else {
|
|
845
658
|
lines.push(
|
|
@@ -849,9 +662,7 @@ export async function handleRun(
|
|
|
849
662
|
);
|
|
850
663
|
}
|
|
851
664
|
|
|
852
|
-
const runFailed =
|
|
853
|
-
completed.manifest.status === "failed" ||
|
|
854
|
-
completed.manifest.status === "blocked";
|
|
665
|
+
const runFailed = completed.manifest.status === "failed" || completed.manifest.status === "blocked";
|
|
855
666
|
return result(
|
|
856
667
|
lines.join("\n"),
|
|
857
668
|
{
|
|
@@ -864,10 +675,7 @@ export async function handleRun(
|
|
|
864
675
|
runFailed,
|
|
865
676
|
);
|
|
866
677
|
} catch (waitError: unknown) {
|
|
867
|
-
const errorMessage =
|
|
868
|
-
waitError instanceof Error
|
|
869
|
-
? waitError.message
|
|
870
|
-
: String(waitError);
|
|
678
|
+
const errorMessage = waitError instanceof Error ? waitError.message : String(waitError);
|
|
871
679
|
return result(
|
|
872
680
|
[
|
|
873
681
|
`pi-crew run timed out or failed: ${updatedManifest.runId}`,
|
|
@@ -891,16 +699,11 @@ export async function handleRun(
|
|
|
891
699
|
}
|
|
892
700
|
|
|
893
701
|
if (runtime.safety === "blocked") {
|
|
894
|
-
const runningManifest = updateRunStatus(
|
|
895
|
-
executionManifest,
|
|
896
|
-
"running",
|
|
897
|
-
"Checking worker runtime availability.",
|
|
898
|
-
);
|
|
702
|
+
const runningManifest = updateRunStatus(executionManifest, "running", "Checking worker runtime availability.");
|
|
899
703
|
const blocked = updateRunStatus(
|
|
900
704
|
runningManifest,
|
|
901
705
|
"blocked",
|
|
902
|
-
runtime.reason ??
|
|
903
|
-
"Child worker execution is disabled; refusing to create no-op scaffold subagents.",
|
|
706
|
+
runtime.reason ?? "Child worker execution is disabled; refusing to create no-op scaffold subagents.",
|
|
904
707
|
);
|
|
905
708
|
void appendEventAsync(blocked.eventsPath, {
|
|
906
709
|
type: "run.blocked",
|
|
@@ -971,15 +774,8 @@ export async function handleRun(
|
|
|
971
774
|
|
|
972
775
|
// Wait for the foreground run to complete and return actual results.
|
|
973
776
|
try {
|
|
974
|
-
const completed = await waitForRun(
|
|
975
|
-
|
|
976
|
-
resolvedCtx.cwd,
|
|
977
|
-
{ timeoutMs: 3600000 },
|
|
978
|
-
);
|
|
979
|
-
const metrics = collectRunMetrics(
|
|
980
|
-
resolvedCtx.cwd,
|
|
981
|
-
completed.manifest.runId,
|
|
982
|
-
);
|
|
777
|
+
const completed = await waitForRun(updatedManifest.runId, resolvedCtx.cwd, { timeoutMs: 3600000 });
|
|
778
|
+
const metrics = collectRunMetrics(resolvedCtx.cwd, completed.manifest.runId);
|
|
983
779
|
const lines: string[] = [
|
|
984
780
|
`pi-crew run ${completed.manifest.status}: ${completed.manifest.runId} (${team.name})`,
|
|
985
781
|
`Goal: ${goal.slice(0, 100)}`,
|
|
@@ -994,19 +790,11 @@ export async function handleRun(
|
|
|
994
790
|
if (completed.tasks.length > 0) {
|
|
995
791
|
// Read run-level summary artifact if present
|
|
996
792
|
let summaryContent: string | undefined;
|
|
997
|
-
const summaryArtifact = completed.manifest.artifacts?.find(
|
|
998
|
-
(a: { kind?: string }) => a.kind === "summary",
|
|
999
|
-
);
|
|
793
|
+
const summaryArtifact = completed.manifest.artifacts?.find((a: { kind?: string }) => a.kind === "summary");
|
|
1000
794
|
if (summaryArtifact) {
|
|
1001
795
|
try {
|
|
1002
|
-
const sumPath = path.join(
|
|
1003
|
-
|
|
1004
|
-
summaryArtifact.path,
|
|
1005
|
-
);
|
|
1006
|
-
summaryContent = fs
|
|
1007
|
-
.readFileSync(sumPath, "utf-8")
|
|
1008
|
-
.trim()
|
|
1009
|
-
.slice(0, 4000);
|
|
796
|
+
const sumPath = path.join(completed.manifest.artifactsRoot, summaryArtifact.path);
|
|
797
|
+
summaryContent = fs.readFileSync(sumPath, "utf-8").trim().slice(0, 4000);
|
|
1010
798
|
} catch {
|
|
1011
799
|
/* summary unavailable */
|
|
1012
800
|
}
|
|
@@ -1023,34 +811,19 @@ export async function handleRun(
|
|
|
1023
811
|
// inside artifactsRoot via the project's safe-path primitive. Rejects
|
|
1024
812
|
// absolute paths (/etc/passwd) and ../ traversal that the old
|
|
1025
813
|
// path.isAbsolute shortcut + bare path.join allowed.
|
|
1026
|
-
const resPath = resolveRealContainedPath(
|
|
1027
|
-
|
|
1028
|
-
task.resultArtifact.path,
|
|
1029
|
-
);
|
|
1030
|
-
resultExcerpt = fs
|
|
1031
|
-
.readFileSync(resPath, "utf-8")
|
|
1032
|
-
.trim()
|
|
1033
|
-
.slice(0, 2000);
|
|
814
|
+
const resPath = resolveRealContainedPath(completed.manifest.artifactsRoot, task.resultArtifact.path);
|
|
815
|
+
resultExcerpt = fs.readFileSync(resPath, "utf-8").trim().slice(0, 2000);
|
|
1034
816
|
} catch {
|
|
1035
817
|
resultExcerpt = "(result unavailable)";
|
|
1036
818
|
}
|
|
1037
819
|
}
|
|
1038
820
|
const shortResult = resultExcerpt.slice(0, 500);
|
|
1039
821
|
const statusTag =
|
|
1040
|
-
task.status === "completed"
|
|
1041
|
-
? "✓"
|
|
1042
|
-
: task.status === "failed"
|
|
1043
|
-
? "✗"
|
|
1044
|
-
: task.status === "cancelled"
|
|
1045
|
-
? "⊘"
|
|
1046
|
-
: "·";
|
|
822
|
+
task.status === "completed" ? "✓" : task.status === "failed" ? "✗" : task.status === "cancelled" ? "⊘" : "·";
|
|
1047
823
|
taskLines.push(
|
|
1048
824
|
`- ${statusTag} ${task.id} [${task.role}]: ${task.status}${shortResult ? " — " + shortResult : ""}${task.error ? ` | Error: ${task.error.slice(0, 200)}` : ""}`,
|
|
1049
825
|
);
|
|
1050
|
-
if (
|
|
1051
|
-
task.status === "failed" ||
|
|
1052
|
-
task.status === "needs_attention"
|
|
1053
|
-
) {
|
|
826
|
+
if (task.status === "failed" || task.status === "needs_attention") {
|
|
1054
827
|
failedCount++;
|
|
1055
828
|
failedIds.push(task.id);
|
|
1056
829
|
}
|
|
@@ -1071,9 +844,7 @@ export async function handleRun(
|
|
|
1071
844
|
lines.push("All tasks completed successfully.");
|
|
1072
845
|
} else {
|
|
1073
846
|
lines.push("");
|
|
1074
|
-
lines.push(
|
|
1075
|
-
`${failedCount} task(s) failed: ${failedIds.join(", ")}. Consider retrying.`,
|
|
1076
|
-
);
|
|
847
|
+
lines.push(`${failedCount} task(s) failed: ${failedIds.join(", ")}. Consider retrying.`);
|
|
1077
848
|
}
|
|
1078
849
|
} else {
|
|
1079
850
|
lines.push(
|
|
@@ -1083,9 +854,7 @@ export async function handleRun(
|
|
|
1083
854
|
);
|
|
1084
855
|
}
|
|
1085
856
|
|
|
1086
|
-
const runFailed =
|
|
1087
|
-
completed.manifest.status === "failed" ||
|
|
1088
|
-
completed.manifest.status === "blocked";
|
|
857
|
+
const runFailed = completed.manifest.status === "failed" || completed.manifest.status === "blocked";
|
|
1089
858
|
return result(
|
|
1090
859
|
lines.join("\n"),
|
|
1091
860
|
{
|
|
@@ -1098,10 +867,7 @@ export async function handleRun(
|
|
|
1098
867
|
runFailed,
|
|
1099
868
|
);
|
|
1100
869
|
} catch (waitError: unknown) {
|
|
1101
|
-
const errorMessage =
|
|
1102
|
-
waitError instanceof Error
|
|
1103
|
-
? waitError.message
|
|
1104
|
-
: String(waitError);
|
|
870
|
+
const errorMessage = waitError instanceof Error ? waitError.message : String(waitError);
|
|
1105
871
|
return result(
|
|
1106
872
|
[
|
|
1107
873
|
`pi-crew run timed out or failed: ${updatedManifest.runId}`,
|
|
@@ -1171,10 +937,7 @@ export async function handleRun(
|
|
|
1171
937
|
status: executed.manifest.status === "failed" ? "error" : "ok",
|
|
1172
938
|
runId: executed.manifest.runId,
|
|
1173
939
|
artifactsRoot: executed.manifest.artifactsRoot,
|
|
1174
|
-
metrics: collectRunMetrics(
|
|
1175
|
-
resolvedCtx.cwd,
|
|
1176
|
-
executed.manifest.runId,
|
|
1177
|
-
),
|
|
940
|
+
metrics: collectRunMetrics(resolvedCtx.cwd, executed.manifest.runId),
|
|
1178
941
|
},
|
|
1179
942
|
executed.manifest.status === "failed",
|
|
1180
943
|
);
|