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
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import * as crypto from "node:crypto";
|
|
1
2
|
import * as fs from "node:fs";
|
|
2
3
|
import * as path from "node:path";
|
|
3
|
-
import * as crypto from "node:crypto";
|
|
4
|
-
import { assertRunBundle } from "./run-bundle-schema.ts";
|
|
5
|
-
import { projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
|
|
6
4
|
import { DEFAULT_PATHS } from "../config/defaults.ts";
|
|
5
|
+
import { type ConflictReport, detectImportConflicts } from "../runtime/delta-conflict.ts";
|
|
6
|
+
import { projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
|
|
7
7
|
import { assertSafePathId, resolveContainedRelativePath, resolveRealContainedPath } from "../utils/safe-paths.ts";
|
|
8
|
-
import {
|
|
8
|
+
import { assertRunBundle } from "./run-bundle-schema.ts";
|
|
9
9
|
|
|
10
10
|
export interface ImportedRunBundleInfo {
|
|
11
11
|
runId: string;
|
|
@@ -29,8 +29,16 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
|
|
|
29
29
|
// Path containment: use resolveRealContainedPath for canonical real-path check
|
|
30
30
|
// to prevent symlink/../ bypass of the startsWith string comparison.
|
|
31
31
|
const allowedBases: string[] = [];
|
|
32
|
-
try {
|
|
33
|
-
|
|
32
|
+
try {
|
|
33
|
+
allowedBases.push(userCrewRoot());
|
|
34
|
+
} catch {
|
|
35
|
+
/* ignore */
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
allowedBases.push(projectCrewRoot(cwd));
|
|
39
|
+
} catch {
|
|
40
|
+
/* ignore */
|
|
41
|
+
}
|
|
34
42
|
allowedBases.push(cwd); // always include cwd last (highest priority)
|
|
35
43
|
let isContained = false;
|
|
36
44
|
for (const base of allowedBases) {
|
|
@@ -38,7 +46,9 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
|
|
|
38
46
|
resolveRealContainedPath(base, resolvedPath);
|
|
39
47
|
isContained = true;
|
|
40
48
|
break;
|
|
41
|
-
} catch {
|
|
49
|
+
} catch {
|
|
50
|
+
/* not contained — try next base */
|
|
51
|
+
}
|
|
42
52
|
}
|
|
43
53
|
if (!isContained) throw new Error(`Import path must be within project directory or crew root: ${resolvedPath}`);
|
|
44
54
|
const raw = JSON.parse(fs.readFileSync(resolvedPath, "utf-8")) as unknown;
|
|
@@ -46,12 +56,19 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
|
|
|
46
56
|
|
|
47
57
|
// Integrity check: verify SHA-256 hash if present in manifest
|
|
48
58
|
const bundleJson = fs.readFileSync(resolvedPath, "utf-8");
|
|
49
|
-
const parsedForHash = JSON.parse(bundleJson) as {
|
|
59
|
+
const parsedForHash = JSON.parse(bundleJson) as {
|
|
60
|
+
manifest?: { sha256?: string };
|
|
61
|
+
};
|
|
50
62
|
if (parsedForHash.manifest?.sha256) {
|
|
51
63
|
const expectedHash = parsedForHash.manifest.sha256;
|
|
52
64
|
// Recompute hash by stringifying the bundle without the sha256 field
|
|
53
|
-
const { sha256: _sha256, ...manifestWithoutHash } = parsedForHash.manifest as Record<string, unknown> & {
|
|
54
|
-
|
|
65
|
+
const { sha256: _sha256, ...manifestWithoutHash } = parsedForHash.manifest as Record<string, unknown> & {
|
|
66
|
+
sha256?: string;
|
|
67
|
+
};
|
|
68
|
+
const bundleForHash = {
|
|
69
|
+
...parsedForHash,
|
|
70
|
+
manifest: manifestWithoutHash,
|
|
71
|
+
};
|
|
55
72
|
const recomputedHash = crypto.createHash("sha256").update(JSON.stringify(bundleForHash)).digest("hex");
|
|
56
73
|
if (recomputedHash !== expectedHash) {
|
|
57
74
|
throw new Error(`Integrity check failed: SHA-256 mismatch. Expected ${expectedHash}, got ${recomputedHash}`);
|
|
@@ -66,9 +83,15 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
|
|
|
66
83
|
try {
|
|
67
84
|
const existingManifestPath = path.join(importRoot(cwd, scope), runId, "run-export.json");
|
|
68
85
|
if (fs.existsSync(existingManifestPath)) {
|
|
69
|
-
const existingRaw = JSON.parse(fs.readFileSync(existingManifestPath, "utf-8")) as {
|
|
86
|
+
const existingRaw = JSON.parse(fs.readFileSync(existingManifestPath, "utf-8")) as {
|
|
87
|
+
manifest?: Record<string, unknown>;
|
|
88
|
+
tasks?: unknown[];
|
|
89
|
+
};
|
|
70
90
|
conflictReport = detectImportConflicts(
|
|
71
|
-
{
|
|
91
|
+
{
|
|
92
|
+
manifest: raw.manifest as unknown as Record<string, unknown>,
|
|
93
|
+
tasks: raw.tasks as unknown[],
|
|
94
|
+
},
|
|
72
95
|
{ manifest: existingRaw.manifest, tasks: existingRaw.tasks },
|
|
73
96
|
);
|
|
74
97
|
}
|
|
@@ -94,20 +117,32 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
|
|
|
94
117
|
if (fs.existsSync(target) && fs.lstatSync(target).isSymbolicLink()) throw new Error(`Invalid import target: ${target}`);
|
|
95
118
|
}
|
|
96
119
|
fs.writeFileSync(targetJson, `${JSON.stringify({ ...raw, importedAt, importedFrom: resolvedPath }, null, 2)}\n`, "utf-8");
|
|
97
|
-
fs.writeFileSync(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
120
|
+
fs.writeFileSync(
|
|
121
|
+
targetSummary,
|
|
122
|
+
[
|
|
123
|
+
`# Imported pi-crew run ${runId}`,
|
|
124
|
+
"",
|
|
125
|
+
`Imported: ${importedAt}`,
|
|
126
|
+
`Source: ${resolvedPath}`,
|
|
127
|
+
`Original export: ${raw.exportedAt}`,
|
|
128
|
+
`Status: ${raw.manifest.status}`,
|
|
129
|
+
`Team: ${raw.manifest.team}`,
|
|
130
|
+
`Workflow: ${raw.manifest.workflow ?? "(none)"}`,
|
|
131
|
+
`Goal: ${raw.manifest.goal}`,
|
|
132
|
+
"",
|
|
133
|
+
"## Tasks",
|
|
134
|
+
...raw.tasks.map(
|
|
135
|
+
(task) => `- ${task.id}: ${task.status} (${task.role} -> ${task.agent})${task.error ? ` - ${task.error}` : ""}`,
|
|
136
|
+
),
|
|
137
|
+
"",
|
|
138
|
+
].join("\n"),
|
|
139
|
+
"utf-8",
|
|
140
|
+
);
|
|
141
|
+
return {
|
|
142
|
+
runId,
|
|
143
|
+
importedAt,
|
|
144
|
+
bundlePath: targetJson,
|
|
145
|
+
summaryPath: targetSummary,
|
|
146
|
+
...(conflictReport?.hasConflicts ? { conflictReport } : {}),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as os from "node:os";
|
|
3
3
|
import * as path from "node:path";
|
|
4
|
-
import type { TeamRunManifest } from "../state/types.ts";
|
|
5
4
|
import { DEFAULT_PATHS } from "../config/defaults.ts";
|
|
6
|
-
import {
|
|
5
|
+
import { createCancellationToken } from "../runtime/cancellation-token.ts";
|
|
7
6
|
import { activeRunEntries } from "../state/active-run-registry.ts";
|
|
7
|
+
import type { TeamRunManifest } from "../state/types.ts";
|
|
8
|
+
import { findRepoRoot, projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
|
|
8
9
|
import { isSafePathId, resolveRealContainedPath } from "../utils/safe-paths.ts";
|
|
9
10
|
import { sharedScanCache } from "../utils/scan-cache.ts";
|
|
10
|
-
import { createCancellationToken } from "../runtime/cancellation-token.ts";
|
|
11
11
|
|
|
12
12
|
function readManifest(filePath: string): TeamRunManifest | undefined {
|
|
13
13
|
const cached = sharedScanCache.readAndCache("manifests", filePath, filePath);
|
|
@@ -29,7 +29,8 @@ function collectRuns(root: string, maxEntries?: number, signal?: AbortSignal): T
|
|
|
29
29
|
const tempDirs = [os.tmpdir(), "/var/tmp", "/tmp"];
|
|
30
30
|
const isTempRoot = tempDirs.some((t) => root.startsWith(t + path.sep));
|
|
31
31
|
const token = createCancellationToken({ signal });
|
|
32
|
-
const entries = fs
|
|
32
|
+
const entries = fs
|
|
33
|
+
.readdirSync(runsRoot, { withFileTypes: true })
|
|
33
34
|
.filter((entry) => entry.isDirectory() && isSafePathId(entry.name))
|
|
34
35
|
.map((entry) => entry.name)
|
|
35
36
|
.sort((a, b) => (b ?? "").localeCompare(a ?? ""));
|
|
@@ -42,7 +43,12 @@ function collectRuns(root: string, maxEntries?: number, signal?: AbortSignal): T
|
|
|
42
43
|
if (!manifest) continue;
|
|
43
44
|
// Filter out ghost runs: active status but CWD no longer exists.
|
|
44
45
|
// These are deadletter/replay/temp runs whose temp dirs were cleaned up.
|
|
45
|
-
if (
|
|
46
|
+
if (
|
|
47
|
+
(manifest.status === "queued" || manifest.status === "running" || manifest.status === "planning") &&
|
|
48
|
+
manifest.cwd &&
|
|
49
|
+
!fs.existsSync(manifest.cwd)
|
|
50
|
+
)
|
|
51
|
+
continue;
|
|
46
52
|
// 2.19 — for runs in temp directories, verify the background process is alive.
|
|
47
53
|
// Without this, runs that completed/crashed but left stale manifests will still show.
|
|
48
54
|
if (isTempRoot && (manifest.status === "running" || manifest.status === "queued" || manifest.status === "planning")) {
|
|
@@ -51,12 +57,20 @@ function collectRuns(root: string, maxEntries?: number, signal?: AbortSignal): T
|
|
|
51
57
|
const pidData = JSON.parse(fs.readFileSync(asyncPidPath, "utf-8"));
|
|
52
58
|
const pid = pidData?.pid;
|
|
53
59
|
if (pid && typeof pid === "number") {
|
|
54
|
-
try {
|
|
60
|
+
try {
|
|
61
|
+
process.kill(pid, 0);
|
|
62
|
+
} catch {
|
|
63
|
+
continue;
|
|
64
|
+
} // PID dead, skip this run
|
|
55
65
|
}
|
|
56
|
-
} catch {
|
|
66
|
+
} catch {
|
|
67
|
+
/* no async.pid or parse error — keep the run */
|
|
68
|
+
}
|
|
57
69
|
}
|
|
58
70
|
results.push(manifest);
|
|
59
|
-
} catch {
|
|
71
|
+
} catch {
|
|
72
|
+
/* skip unreadable manifests */
|
|
73
|
+
}
|
|
60
74
|
}
|
|
61
75
|
return results;
|
|
62
76
|
}
|
|
@@ -98,7 +112,12 @@ export function listRecentRuns(cwd: string, max = 20, signal?: AbortSignal): Tea
|
|
|
98
112
|
* - "user": only runs in the user crew root
|
|
99
113
|
* - "all" (default): merge both scopes (current behavior)
|
|
100
114
|
*/
|
|
101
|
-
export function listRunsByScope(
|
|
115
|
+
export function listRunsByScope(
|
|
116
|
+
cwd: string,
|
|
117
|
+
scope: "project" | "user" | "all" = "all",
|
|
118
|
+
max?: number,
|
|
119
|
+
signal?: AbortSignal,
|
|
120
|
+
): TeamRunManifest[] {
|
|
102
121
|
const projectRoot = findRepoRoot(cwd);
|
|
103
122
|
switch (scope) {
|
|
104
123
|
case "project":
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
+
import { DEFAULT_PATHS } from "../config/defaults.ts";
|
|
4
|
+
import { createCancellationToken } from "../runtime/cancellation-token.ts";
|
|
3
5
|
import type { TeamRunManifest } from "../state/types.ts";
|
|
4
|
-
import { resolveRealContainedPath } from "../utils/safe-paths.ts";
|
|
5
|
-
import { projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
|
|
6
|
-
import { listRuns } from "./run-index.ts";
|
|
7
6
|
import { logInternalError } from "../utils/internal-error.ts";
|
|
7
|
+
import { projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
|
|
8
8
|
import { redactSecrets } from "../utils/redaction.ts";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { isSafePathId } from "../utils/safe-paths.ts";
|
|
9
|
+
import { isSafePathId, resolveRealContainedPath } from "../utils/safe-paths.ts";
|
|
10
|
+
import { listRuns } from "./run-index.ts";
|
|
12
11
|
|
|
13
12
|
export interface PruneRunsResult {
|
|
14
13
|
kept: string[];
|
|
@@ -50,7 +49,9 @@ function appendPruneAudit(cwd: string, payload: Record<string, unknown>): string
|
|
|
50
49
|
|
|
51
50
|
export function pruneFinishedRuns(cwd: string, keep: number, options: PruneRunsOptions = {}): PruneRunsResult {
|
|
52
51
|
const token = createCancellationToken({ signal: options.signal });
|
|
53
|
-
const finished = listRuns(cwd, options.signal)
|
|
52
|
+
const finished = listRuns(cwd, options.signal)
|
|
53
|
+
.filter((run) => run.cwd === cwd && isFinished(run))
|
|
54
|
+
.sort((a, b) => (b.updatedAt ?? "").localeCompare(a.updatedAt ?? ""));
|
|
54
55
|
const kept = finished.slice(0, keep).map((run) => run.runId);
|
|
55
56
|
const removed: string[] = [];
|
|
56
57
|
const toRemove = finished.slice(keep);
|
|
@@ -58,14 +59,24 @@ export function pruneFinishedRuns(cwd: string, keep: number, options: PruneRunsO
|
|
|
58
59
|
if (i % 5 === 0) token.heartbeat(`prune:${i}/${toRemove.length}`);
|
|
59
60
|
const run = toRemove[i];
|
|
60
61
|
if (!isSafeToPrune(cwd, run)) {
|
|
61
|
-
logInternalError(
|
|
62
|
+
logInternalError(
|
|
63
|
+
"prune.path-unsafe",
|
|
64
|
+
new Error(`Skipping unsafe prune: stateRoot=${run.stateRoot}, artifactsRoot=${run.artifactsRoot}`),
|
|
65
|
+
`runId=${run.runId}`,
|
|
66
|
+
);
|
|
62
67
|
continue;
|
|
63
68
|
}
|
|
64
69
|
fs.rmSync(run.stateRoot, { recursive: true, force: true });
|
|
65
70
|
fs.rmSync(run.artifactsRoot, { recursive: true, force: true });
|
|
66
71
|
removed.push(run.runId);
|
|
67
72
|
}
|
|
68
|
-
const auditPath = appendPruneAudit(cwd, {
|
|
73
|
+
const auditPath = appendPruneAudit(cwd, {
|
|
74
|
+
action: "prune",
|
|
75
|
+
keep,
|
|
76
|
+
intent: options.intent,
|
|
77
|
+
kept,
|
|
78
|
+
removed,
|
|
79
|
+
});
|
|
69
80
|
return { kept, removed, auditPath };
|
|
70
81
|
}
|
|
71
82
|
|
|
@@ -85,9 +96,15 @@ export function pruneUserLevelRuns(keep: number): PruneRunsResult {
|
|
|
85
96
|
|
|
86
97
|
// Read all run directories, parse manifests, filter to finished
|
|
87
98
|
const MAX_DIRS = 500;
|
|
88
|
-
const finished: Array<{
|
|
99
|
+
const finished: Array<{
|
|
100
|
+
runId: string;
|
|
101
|
+
updatedAt: string;
|
|
102
|
+
stateRoot: string;
|
|
103
|
+
artifactsRoot: string;
|
|
104
|
+
}> = [];
|
|
89
105
|
const ghostRemoved: string[] = [];
|
|
90
|
-
const dirs = fs
|
|
106
|
+
const dirs = fs
|
|
107
|
+
.readdirSync(runsRoot, { withFileTypes: true })
|
|
91
108
|
.filter((entry) => entry.isDirectory() && isSafePathId(entry.name))
|
|
92
109
|
.slice(0, MAX_DIRS)
|
|
93
110
|
.map((entry) => entry.name);
|
|
@@ -105,7 +122,10 @@ export function pruneUserLevelRuns(keep: number): PruneRunsResult {
|
|
|
105
122
|
// These are deadletter/replay/temp runs from dead Pi sessions.
|
|
106
123
|
const isActive = manifest.status === "queued" || manifest.status === "running" || manifest.status === "planning";
|
|
107
124
|
if (isActive && manifest.cwd && !fs.existsSync(manifest.cwd)) {
|
|
108
|
-
fs.rmSync(path.join(runsRoot, dir), {
|
|
125
|
+
fs.rmSync(path.join(runsRoot, dir), {
|
|
126
|
+
recursive: true,
|
|
127
|
+
force: true,
|
|
128
|
+
});
|
|
109
129
|
ghostRemoved.push(manifest.runId);
|
|
110
130
|
continue;
|
|
111
131
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { readCrewAgents } from "../runtime/crew-agent-records.ts";
|
|
2
3
|
import { isDisplayActiveRun } from "../runtime/process-status.ts";
|
|
3
4
|
import { listRuns } from "./run-index.ts";
|
|
4
|
-
import { readCrewAgents } from "../runtime/crew-agent-records.ts";
|
|
5
5
|
|
|
6
6
|
export function notifyActiveRuns(ctx: ExtensionContext): void {
|
|
7
7
|
const active = listRuns(ctx.cwd)
|
|
@@ -2,8 +2,12 @@ import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
|
2
2
|
import { listRuns } from "./run-index.ts";
|
|
3
3
|
// Lazy-loaded: team-tool.ts pulls in entire runtime chain.
|
|
4
4
|
import type { handleTeamTool as HandleTeamToolFn } from "./team-tool.ts";
|
|
5
|
+
|
|
5
6
|
let _cachedHandleTeamTool: typeof HandleTeamToolFn | undefined;
|
|
6
|
-
async function handleTeamTool(
|
|
7
|
+
async function handleTeamTool(
|
|
8
|
+
params: Parameters<typeof HandleTeamToolFn>[0],
|
|
9
|
+
ctx: Parameters<typeof HandleTeamToolFn>[1],
|
|
10
|
+
): Promise<Awaited<ReturnType<typeof HandleTeamToolFn>>> {
|
|
7
11
|
if (!_cachedHandleTeamTool) {
|
|
8
12
|
// LAZY: team-tool.ts pulls in the entire runtime chain.
|
|
9
13
|
const mod = await import("./team-tool.ts");
|
|
@@ -11,6 +15,7 @@ async function handleTeamTool(params: Parameters<typeof HandleTeamToolFn>[0], ct
|
|
|
11
15
|
}
|
|
12
16
|
return _cachedHandleTeamTool(params, ctx);
|
|
13
17
|
}
|
|
18
|
+
|
|
14
19
|
import { isToolError, textFromToolResult } from "./tool-result.ts";
|
|
15
20
|
|
|
16
21
|
async function notifyResult(ctx: ExtensionCommandContext, result: Awaited<ReturnType<typeof handleTeamTool>>): Promise<void> {
|
|
@@ -53,14 +58,48 @@ export async function handleTeamManagerCommand(_args: string, ctx: ExtensionComm
|
|
|
53
58
|
const avoidWhen = await ctx.ui.input("Avoid when (comma-separated)", "");
|
|
54
59
|
const cost = await ctx.ui.select("Cost", ["cheap", "free", "expensive"]);
|
|
55
60
|
const category = await ctx.ui.input("Category", "custom");
|
|
56
|
-
const baseConfig = {
|
|
61
|
+
const baseConfig = {
|
|
62
|
+
name,
|
|
63
|
+
description,
|
|
64
|
+
scope: "project",
|
|
65
|
+
triggers,
|
|
66
|
+
useWhen,
|
|
67
|
+
avoidWhen,
|
|
68
|
+
cost,
|
|
69
|
+
category,
|
|
70
|
+
};
|
|
57
71
|
if (resource === "agent") {
|
|
58
72
|
const systemPrompt = isUpdate ? undefined : `You are ${name}.`;
|
|
59
|
-
await notifyResult(
|
|
73
|
+
await notifyResult(
|
|
74
|
+
ctx,
|
|
75
|
+
await handleTeamTool(
|
|
76
|
+
{
|
|
77
|
+
action: isUpdate ? "update" : "create",
|
|
78
|
+
resource,
|
|
79
|
+
agent: name,
|
|
80
|
+
config: { ...baseConfig, systemPrompt },
|
|
81
|
+
},
|
|
82
|
+
ctx,
|
|
83
|
+
),
|
|
84
|
+
);
|
|
60
85
|
return;
|
|
61
86
|
}
|
|
62
87
|
const agent = await ctx.ui.input("Role agent", "executor");
|
|
63
|
-
await notifyResult(
|
|
88
|
+
await notifyResult(
|
|
89
|
+
ctx,
|
|
90
|
+
await handleTeamTool(
|
|
91
|
+
{
|
|
92
|
+
action: isUpdate ? "update" : "create",
|
|
93
|
+
resource,
|
|
94
|
+
team: name,
|
|
95
|
+
config: {
|
|
96
|
+
...baseConfig,
|
|
97
|
+
roles: [{ name: "executor", agent: agent || "executor" }],
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
ctx,
|
|
101
|
+
),
|
|
102
|
+
);
|
|
64
103
|
return;
|
|
65
104
|
}
|
|
66
105
|
|
|
@@ -71,7 +110,19 @@ export async function handleTeamManagerCommand(_args: string, ctx: ExtensionComm
|
|
|
71
110
|
if (!goal) return;
|
|
72
111
|
const asyncRun = await ctx.ui.confirm("Async run?", "Run in detached background mode?");
|
|
73
112
|
const worktree = await ctx.ui.confirm("Worktree mode?", "Use git worktrees for task workspaces? Requires a clean repo by default.");
|
|
74
|
-
await notifyResult(
|
|
113
|
+
await notifyResult(
|
|
114
|
+
ctx,
|
|
115
|
+
await handleTeamTool(
|
|
116
|
+
{
|
|
117
|
+
action: "run",
|
|
118
|
+
team: team || "default",
|
|
119
|
+
goal,
|
|
120
|
+
async: asyncRun,
|
|
121
|
+
workspaceMode: worktree ? "worktree" : "single",
|
|
122
|
+
},
|
|
123
|
+
ctx,
|
|
124
|
+
),
|
|
125
|
+
);
|
|
75
126
|
return;
|
|
76
127
|
}
|
|
77
128
|
|
|
@@ -80,7 +131,10 @@ export async function handleTeamManagerCommand(_args: string, ctx: ExtensionComm
|
|
|
80
131
|
ctx.ui.notify("No pi-crew runs found.", "info");
|
|
81
132
|
return;
|
|
82
133
|
}
|
|
83
|
-
const selected = await ctx.ui.select(
|
|
134
|
+
const selected = await ctx.ui.select(
|
|
135
|
+
"Select run",
|
|
136
|
+
runs.map((run) => `${run.runId} [${run.status}] ${run.team}/${run.workflow ?? "none"}`),
|
|
137
|
+
);
|
|
84
138
|
if (!selected) return;
|
|
85
139
|
const runId = selected.split(" ")[0];
|
|
86
140
|
if (!runId) return;
|
|
@@ -90,7 +144,10 @@ export async function handleTeamManagerCommand(_args: string, ctx: ExtensionComm
|
|
|
90
144
|
return;
|
|
91
145
|
}
|
|
92
146
|
if (action === "Cleanup run worktrees") {
|
|
93
|
-
const force = await ctx.ui.confirm(
|
|
147
|
+
const force = await ctx.ui.confirm(
|
|
148
|
+
"Force cleanup?",
|
|
149
|
+
"Force may remove dirty worktrees. Choose false to preserve dirty worktrees and capture cleanup diffs.",
|
|
150
|
+
);
|
|
94
151
|
await notifyResult(ctx, await handleTeamTool({ action: "cleanup", runId, force }, ctx));
|
|
95
152
|
}
|
|
96
153
|
}
|