pi-crew 0.9.16 → 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 +81 -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 +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 +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 +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 +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
|
@@ -2,10 +2,10 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { appendEvent } from "../state/event-log.ts";
|
|
4
4
|
import type { TeamRunManifest, TeamTaskState } from "../state/types.ts";
|
|
5
|
-
import { checkProcessLiveness, isActiveRunStatus } from "./process-status.ts";
|
|
6
|
-
import { readCrewAgents } from "./crew-agent-records.ts";
|
|
7
5
|
import { logInternalError } from "../utils/internal-error.ts";
|
|
8
6
|
import { sleepSync } from "../utils/sleep.ts";
|
|
7
|
+
import { readCrewAgents } from "./crew-agent-records.ts";
|
|
8
|
+
import { checkProcessLiveness, isActiveRunStatus } from "./process-status.ts";
|
|
9
9
|
|
|
10
10
|
export type ForegroundControlRequestType = "interrupt" | "status";
|
|
11
11
|
|
|
@@ -36,7 +36,9 @@ export function foregroundControlPath(manifest: TeamRunManifest): string {
|
|
|
36
36
|
function readLastRequest(controlPath: string): ForegroundControlRequest | undefined {
|
|
37
37
|
if (!fs.existsSync(controlPath)) return undefined;
|
|
38
38
|
try {
|
|
39
|
-
const parsed = JSON.parse(fs.readFileSync(controlPath, "utf-8")) as {
|
|
39
|
+
const parsed = JSON.parse(fs.readFileSync(controlPath, "utf-8")) as {
|
|
40
|
+
requests?: ForegroundControlRequest[];
|
|
41
|
+
};
|
|
40
42
|
return parsed.requests?.at(-1);
|
|
41
43
|
} catch {
|
|
42
44
|
return undefined;
|
|
@@ -53,13 +55,18 @@ export function readForegroundControlStatus(manifest: TeamRunManifest, tasks: Te
|
|
|
53
55
|
asyncPid: manifest.async?.pid,
|
|
54
56
|
asyncAlive,
|
|
55
57
|
runningTasks: tasks.filter((task) => task.status === "running").map((task) => task.id),
|
|
56
|
-
runningAgents: readCrewAgents(manifest)
|
|
58
|
+
runningAgents: readCrewAgents(manifest)
|
|
59
|
+
.filter((agent) => agent.status === "running")
|
|
60
|
+
.map((agent) => agent.id),
|
|
57
61
|
controlPath,
|
|
58
62
|
lastRequest: readLastRequest(controlPath),
|
|
59
63
|
};
|
|
60
64
|
}
|
|
61
65
|
|
|
62
|
-
export function writeForegroundInterruptRequest(
|
|
66
|
+
export function writeForegroundInterruptRequest(
|
|
67
|
+
manifest: TeamRunManifest,
|
|
68
|
+
reason = "User requested foreground interrupt.",
|
|
69
|
+
): ForegroundControlRequest {
|
|
63
70
|
const controlPath = foregroundControlPath(manifest);
|
|
64
71
|
const lockDir = `${controlPath}.lock`;
|
|
65
72
|
const pidFile = path.join(lockDir, "pid");
|
|
@@ -74,7 +81,11 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
|
|
|
74
81
|
while (true) {
|
|
75
82
|
try {
|
|
76
83
|
fs.mkdirSync(lockDir, { recursive: true });
|
|
77
|
-
try {
|
|
84
|
+
try {
|
|
85
|
+
fs.writeFileSync(pidFile, String(process.pid), "utf-8");
|
|
86
|
+
} catch {
|
|
87
|
+
/* best-effort */
|
|
88
|
+
}
|
|
78
89
|
break;
|
|
79
90
|
} catch {
|
|
80
91
|
if (Date.now() - start > timeout) {
|
|
@@ -84,10 +95,18 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
|
|
|
84
95
|
const ownerPid = Number.parseInt(raw, 10);
|
|
85
96
|
if (!Number.isNaN(ownerPid) && ownerPid !== process.pid) {
|
|
86
97
|
let alive = false;
|
|
87
|
-
try {
|
|
98
|
+
try {
|
|
99
|
+
process.kill(ownerPid, 0);
|
|
100
|
+
alive = true;
|
|
101
|
+
} catch {
|
|
102
|
+
/* dead */
|
|
103
|
+
}
|
|
88
104
|
if (!alive) {
|
|
89
105
|
// Lock is stale — clear it and retry
|
|
90
|
-
fs.rmSync(lockDir, {
|
|
106
|
+
fs.rmSync(lockDir, {
|
|
107
|
+
recursive: true,
|
|
108
|
+
force: true,
|
|
109
|
+
});
|
|
91
110
|
continue;
|
|
92
111
|
}
|
|
93
112
|
// Lock held by live process — throw
|
|
@@ -95,7 +114,9 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
|
|
|
95
114
|
logInternalError("foreground-control.lock-timeout", err, `controlPath=${controlPath}`);
|
|
96
115
|
throw err;
|
|
97
116
|
}
|
|
98
|
-
} catch {
|
|
117
|
+
} catch {
|
|
118
|
+
/* no pid file — continue to throw */
|
|
119
|
+
}
|
|
99
120
|
const err = new Error(`Foreground control lock timeout for ${controlPath}`);
|
|
100
121
|
logInternalError("foreground-control.lock-timeout", err, `controlPath=${controlPath}`);
|
|
101
122
|
throw err;
|
|
@@ -106,23 +127,37 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
|
|
|
106
127
|
const ownerPid = Number.parseInt(raw, 10);
|
|
107
128
|
if (!Number.isNaN(ownerPid) && ownerPid !== process.pid) {
|
|
108
129
|
let alive = false;
|
|
109
|
-
try {
|
|
130
|
+
try {
|
|
131
|
+
process.kill(ownerPid, 0);
|
|
132
|
+
alive = true;
|
|
133
|
+
} catch {
|
|
134
|
+
/* dead */
|
|
135
|
+
}
|
|
110
136
|
if (!alive) {
|
|
111
137
|
const stat = fs.statSync(lockDir);
|
|
112
138
|
if (Date.now() - stat.mtimeMs > staleMs) {
|
|
113
|
-
fs.rmSync(lockDir, {
|
|
139
|
+
fs.rmSync(lockDir, {
|
|
140
|
+
recursive: true,
|
|
141
|
+
force: true,
|
|
142
|
+
});
|
|
114
143
|
continue;
|
|
115
144
|
}
|
|
116
145
|
}
|
|
117
146
|
}
|
|
118
|
-
} catch {
|
|
147
|
+
} catch {
|
|
148
|
+
/* no pid file — fall through to sleep */
|
|
149
|
+
}
|
|
119
150
|
// Brief sleep to avoid CPU spinning
|
|
120
151
|
sleepSync(10);
|
|
121
152
|
}
|
|
122
153
|
}
|
|
123
154
|
};
|
|
124
155
|
const releaseLock = (): void => {
|
|
125
|
-
try {
|
|
156
|
+
try {
|
|
157
|
+
fs.rmSync(lockDir, { recursive: true, force: true });
|
|
158
|
+
} catch {
|
|
159
|
+
/* best-effort */
|
|
160
|
+
}
|
|
126
161
|
};
|
|
127
162
|
|
|
128
163
|
acquireLock();
|
|
@@ -144,7 +179,12 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
|
|
|
144
179
|
};
|
|
145
180
|
fs.mkdirSync(path.dirname(controlPath), { recursive: true });
|
|
146
181
|
fs.writeFileSync(controlPath, `${JSON.stringify({ requests: [...requests, request] }, null, 2)}\n`, "utf-8");
|
|
147
|
-
appendEvent(manifest.eventsPath, {
|
|
182
|
+
appendEvent(manifest.eventsPath, {
|
|
183
|
+
type: "foreground.interrupt_requested",
|
|
184
|
+
runId: manifest.runId,
|
|
185
|
+
message: reason,
|
|
186
|
+
data: { requestId: request.id, controlPath },
|
|
187
|
+
});
|
|
148
188
|
return request;
|
|
149
189
|
} finally {
|
|
150
190
|
releaseLock();
|
|
@@ -90,11 +90,12 @@ export function startForegroundWatchdog(opts: WatchdogOptions): void {
|
|
|
90
90
|
if (!isActiveRunStatus(manifest.status)) {
|
|
91
91
|
const teamName = manifest.team ?? "unknown";
|
|
92
92
|
try {
|
|
93
|
-
pi.sendUserMessage(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
93
|
+
pi.sendUserMessage(`pi-crew run ${manifest.status}: ${runId} (${teamName}/${manifest.workflow ?? "default"})`, {
|
|
94
|
+
deliverAs: "followUp",
|
|
95
|
+
});
|
|
96
|
+
} catch {
|
|
97
|
+
/* non-critical */
|
|
98
|
+
}
|
|
98
99
|
activeWatchdogs.delete(runId);
|
|
99
100
|
return;
|
|
100
101
|
}
|
|
@@ -109,7 +110,9 @@ export function startForegroundWatchdog(opts: WatchdogOptions): void {
|
|
|
109
110
|
`pi-crew watchdog: run ${runId} appears hung (${detail}). Consider running team action='cancel' runId='${runId}' or team action='doctor'.`,
|
|
110
111
|
{ deliverAs: "followUp" },
|
|
111
112
|
);
|
|
112
|
-
} catch {
|
|
113
|
+
} catch {
|
|
114
|
+
/* non-critical */
|
|
115
|
+
}
|
|
113
116
|
// Don't stop — keep monitoring. The assistant or user may intervene.
|
|
114
117
|
}
|
|
115
118
|
} catch {
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { spawnSync } from "node:child_process";
|
|
21
21
|
import type { TeamRunManifest, TeamTaskState } from "../state/types.ts";
|
|
22
|
-
import type { WorkflowConfig } from "../workflows/workflow-config.ts";
|
|
23
22
|
import { findRepoRoot } from "../utils/paths.ts";
|
|
23
|
+
import type { WorkflowConfig } from "../workflows/workflow-config.ts";
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* Roles whose job is to EDIT project source/test files (changes that appear in
|
|
@@ -71,18 +71,30 @@ export function assessGoalAchievement(
|
|
|
71
71
|
// (1) Only code-mutating workflows can be false-green. Read-only/doc runs
|
|
72
72
|
// legitimately make no project edits — never accuse them.
|
|
73
73
|
if (!workflowIsMutating(workflow)) {
|
|
74
|
-
return {
|
|
74
|
+
return {
|
|
75
|
+
achieved: "unknown",
|
|
76
|
+
reason: "read-only / doc-only workflow (no executor/test-engineer steps)",
|
|
77
|
+
signals: [],
|
|
78
|
+
};
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
// (2) Need a git repo to inspect the working tree.
|
|
78
82
|
const tree = isGitWorkingTreeClean(manifest.cwd);
|
|
79
83
|
if (tree.clean === "unknown" || !tree.repoRoot) {
|
|
80
|
-
return {
|
|
84
|
+
return {
|
|
85
|
+
achieved: "unknown",
|
|
86
|
+
reason: "not a git repo or git unavailable",
|
|
87
|
+
signals: [],
|
|
88
|
+
};
|
|
81
89
|
}
|
|
82
90
|
|
|
83
91
|
// (3) Non-empty working tree → the mutating run made edits. Achieved.
|
|
84
92
|
if (!tree.clean) {
|
|
85
|
-
return {
|
|
93
|
+
return {
|
|
94
|
+
achieved: true,
|
|
95
|
+
reason: "git working tree has changes (mutating run edited project files)",
|
|
96
|
+
signals: [`repoRoot=${tree.repoRoot}`],
|
|
97
|
+
};
|
|
86
98
|
}
|
|
87
99
|
|
|
88
100
|
// (4) Mutating run + CLEAN working tree → suspicious. The executor's job was
|
|
@@ -113,13 +125,18 @@ export function applyGoalAchievement(
|
|
|
113
125
|
manifest: TeamRunManifest,
|
|
114
126
|
assessment: GoalAchievementAssessment,
|
|
115
127
|
): { manifest: TeamRunManifest; downgraded: boolean } {
|
|
116
|
-
const note =
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
128
|
+
const note =
|
|
129
|
+
assessment.achieved === false
|
|
130
|
+
? `goal-achievement: FALSE-GREEN — ${assessment.reason}. ${assessment.signals.join("; ")}`
|
|
131
|
+
: assessment.achieved === true
|
|
132
|
+
? `goal-achievement: OK — ${assessment.reason}`
|
|
133
|
+
: `goal-achievement: unknown — ${assessment.reason}`;
|
|
121
134
|
|
|
122
|
-
const updated: TeamRunManifest = {
|
|
135
|
+
const updated: TeamRunManifest = {
|
|
136
|
+
...manifest,
|
|
137
|
+
goalAchieved: assessment.achieved,
|
|
138
|
+
goalAchievementNote: note,
|
|
139
|
+
};
|
|
123
140
|
|
|
124
141
|
// Downgrade only on the highest-confidence false-green: a failed task
|
|
125
142
|
// corroborates that the run genuinely did not succeed.
|
|
@@ -23,15 +23,15 @@
|
|
|
23
23
|
* + verification-gates results + transcript tail (~8 KiB bounded read).
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
import {
|
|
26
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
27
|
+
import type { AgentConfig } from "../agents/agent-config.ts";
|
|
28
|
+
import type { GoalVerdict } from "../state/types.ts";
|
|
29
|
+
import { logInternalError } from "../utils/internal-error.ts";
|
|
30
|
+
import { redactSecretString } from "../utils/redaction.ts";
|
|
27
31
|
import { runChildPi } from "./child-pi.ts";
|
|
32
|
+
import { collectToolCallsFromEvent } from "./completion-guard.ts";
|
|
28
33
|
import { parsePiJsonOutput } from "./pi-json-output.ts";
|
|
29
34
|
import { extractStructuredResult } from "./result-extractor.ts";
|
|
30
|
-
import { collectToolCallsFromEvent } from "./completion-guard.ts";
|
|
31
|
-
import { logInternalError } from "../utils/internal-error.ts";
|
|
32
|
-
import { redactSecretString } from "../utils/redaction.ts";
|
|
33
|
-
import type { AgentConfig } from "../agents/agent-config.ts";
|
|
34
|
-
import type { GoalVerdict } from "../state/types.ts";
|
|
35
35
|
|
|
36
36
|
export interface GoalEvidence {
|
|
37
37
|
/** Tail slice of the turn's worker transcript (bounded ~8 KiB). */
|
|
@@ -39,7 +39,11 @@ export interface GoalEvidence {
|
|
|
39
39
|
/** Structured tool-call summary extracted from transcript events. */
|
|
40
40
|
toolCalls: Array<{ tool: string; args?: unknown }>;
|
|
41
41
|
/** Verification command results (exit codes + output refs), if verification ran. */
|
|
42
|
-
verificationResults?: Array<{
|
|
42
|
+
verificationResults?: Array<{
|
|
43
|
+
command: string;
|
|
44
|
+
exitCode: number | null;
|
|
45
|
+
passed: boolean;
|
|
46
|
+
}>;
|
|
43
47
|
}
|
|
44
48
|
|
|
45
49
|
export interface EvaluateGoalInput {
|
|
@@ -102,10 +106,7 @@ Respond with ONLY a single JSON object, no prose, no markdown fences:
|
|
|
102
106
|
|
|
103
107
|
/** Build the judge task prompt: objective + scope + verification + evidence. */
|
|
104
108
|
function buildJudgeTask(input: EvaluateGoalInput): string {
|
|
105
|
-
const lines: string[] = [
|
|
106
|
-
"# Goal to evaluate",
|
|
107
|
-
input.objective,
|
|
108
|
-
];
|
|
109
|
+
const lines: string[] = ["# Goal to evaluate", input.objective];
|
|
109
110
|
if (input.scope) lines.push("", "# Scope (allowed changes)", input.scope);
|
|
110
111
|
if (input.verification?.commands?.length) {
|
|
111
112
|
lines.push("", "# Acceptance verification (ALL must pass with exit code 0)", ...input.verification.commands.map((c) => `- ${c}`));
|
|
@@ -118,7 +119,9 @@ function buildJudgeTask(input: EvaluateGoalInput): string {
|
|
|
118
119
|
lines.push("", "# ⚠ VERIFICATION COMPROMISED — objective oracle UNRELIABLE for this turn");
|
|
119
120
|
lines.push("The following project-manifest files changed during the loop (detected by integrity snapshot):");
|
|
120
121
|
lines.push(...input.verificationCompromised.map((f) => `- ${f}`));
|
|
121
|
-
lines.push(
|
|
122
|
+
lines.push(
|
|
123
|
+
"Do NOT trust any verification-result 'PASS' for this turn. A worker may have rewritten the manifest to satisfy the command. Judge completion SOLELY from the transcript + artifact evidence, and default to achieved:false unless the transcript shows concrete finished work that does not depend on the compromised command.",
|
|
124
|
+
);
|
|
122
125
|
}
|
|
123
126
|
lines.push("", "# Evidence");
|
|
124
127
|
if (input.evidence.verificationResults?.length) {
|
|
@@ -170,7 +173,11 @@ function tryParseDirectVerdict(stdout: string): { achieved: boolean; reason: str
|
|
|
170
173
|
const parsed = JSON.parse(trimmed) as Record<string, unknown>;
|
|
171
174
|
if (typeof parsed.achieved !== "boolean" || typeof parsed.reason !== "string") return undefined;
|
|
172
175
|
const refs = Array.isArray(parsed.evidenceRefs) ? parsed.evidenceRefs.filter((r): r is string => typeof r === "string") : undefined;
|
|
173
|
-
return {
|
|
176
|
+
return {
|
|
177
|
+
achieved: parsed.achieved,
|
|
178
|
+
reason: parsed.reason,
|
|
179
|
+
...(refs ? { evidenceRefs: refs } : {}),
|
|
180
|
+
};
|
|
174
181
|
} catch {
|
|
175
182
|
return undefined;
|
|
176
183
|
}
|
|
@@ -205,7 +212,12 @@ export async function evaluateGoal(input: EvaluateGoalInput): Promise<GoalVerdic
|
|
|
205
212
|
});
|
|
206
213
|
|
|
207
214
|
if (result.exitCode !== 0 || result.error) {
|
|
208
|
-
return blockedVerdict(
|
|
215
|
+
return blockedVerdict(
|
|
216
|
+
input.turn,
|
|
217
|
+
input.model,
|
|
218
|
+
evaluatedAt,
|
|
219
|
+
`judge spawn failed (exit=${result.exitCode}): ${result.error ?? result.stderr.slice(0, 200)}`,
|
|
220
|
+
);
|
|
209
221
|
}
|
|
210
222
|
|
|
211
223
|
const parsed = parsePiJsonOutput(result.stdout);
|
|
@@ -232,11 +244,19 @@ export async function evaluateGoal(input: EvaluateGoalInput): Promise<GoalVerdic
|
|
|
232
244
|
}
|
|
233
245
|
|
|
234
246
|
const extracted = extractStructuredResult(finalText);
|
|
235
|
-
const data = extracted.structured
|
|
247
|
+
const data = extracted.structured
|
|
248
|
+
? (extracted.data as {
|
|
249
|
+
achieved?: unknown;
|
|
250
|
+
reason?: unknown;
|
|
251
|
+
evidenceRefs?: unknown;
|
|
252
|
+
})
|
|
253
|
+
: undefined;
|
|
236
254
|
if (!data || typeof data.achieved !== "boolean" || typeof data.reason !== "string") {
|
|
237
255
|
return blockedVerdict(input.turn, input.model, evaluatedAt, `judge output not valid verdict JSON: ${truncate(finalText, 200)}`);
|
|
238
256
|
}
|
|
239
|
-
const evidenceRefs = Array.isArray(data.evidenceRefs)
|
|
257
|
+
const evidenceRefs = Array.isArray(data.evidenceRefs)
|
|
258
|
+
? data.evidenceRefs.filter((r): r is string => typeof r === "string")
|
|
259
|
+
: undefined;
|
|
240
260
|
return {
|
|
241
261
|
turn: input.turn,
|
|
242
262
|
achieved: data.achieved,
|
|
@@ -247,12 +267,23 @@ export async function evaluateGoal(input: EvaluateGoalInput): Promise<GoalVerdic
|
|
|
247
267
|
};
|
|
248
268
|
} catch (error) {
|
|
249
269
|
logInternalError("goal-evaluator.evaluateGoal", error, `turn=${input.turn}`);
|
|
250
|
-
return blockedVerdict(
|
|
270
|
+
return blockedVerdict(
|
|
271
|
+
input.turn,
|
|
272
|
+
input.model,
|
|
273
|
+
evaluatedAt,
|
|
274
|
+
`judge threw: ${error instanceof Error ? error.message : String(error)}`,
|
|
275
|
+
);
|
|
251
276
|
}
|
|
252
277
|
}
|
|
253
278
|
|
|
254
279
|
function blockedVerdict(turn: number, model: string, evaluatedAt: string, reason: string): GoalVerdict {
|
|
255
|
-
return {
|
|
280
|
+
return {
|
|
281
|
+
turn,
|
|
282
|
+
achieved: false,
|
|
283
|
+
reason: `BLOCKED: ${reason}`,
|
|
284
|
+
evaluatorModel: model,
|
|
285
|
+
evaluatedAt,
|
|
286
|
+
};
|
|
256
287
|
}
|
|
257
288
|
|
|
258
289
|
/**
|
|
@@ -290,5 +321,9 @@ export function bundleEvidence(
|
|
|
290
321
|
}
|
|
291
322
|
}
|
|
292
323
|
|
|
293
|
-
return {
|
|
324
|
+
return {
|
|
325
|
+
transcriptSlice,
|
|
326
|
+
toolCalls: toolCalls.slice(-50),
|
|
327
|
+
verificationResults,
|
|
328
|
+
};
|
|
294
329
|
}
|