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
package/src/ui/pi-ui-compat.ts
CHANGED
|
@@ -13,12 +13,7 @@ type WidgetOptionsWithPersist = WidgetOptions & { persist?: boolean };
|
|
|
13
13
|
|
|
14
14
|
type CustomOptions = Parameters<ExtensionUi["custom"]>[1];
|
|
15
15
|
|
|
16
|
-
type CustomFactory<T> = (
|
|
17
|
-
tui: unknown,
|
|
18
|
-
theme: unknown,
|
|
19
|
-
keybindings: unknown,
|
|
20
|
-
done: (result: T) => void,
|
|
21
|
-
) => unknown;
|
|
16
|
+
type CustomFactory<T> = (tui: unknown, theme: unknown, keybindings: unknown, done: (result: T) => void) => unknown;
|
|
22
17
|
type GenericCustom = <T>(factory: CustomFactory<T>, options?: CustomOptions) => Promise<T>;
|
|
23
18
|
|
|
24
19
|
function maybeRecord(value: unknown): Record<string, unknown> | undefined {
|
|
@@ -41,7 +36,12 @@ export function setWorkingIndicator(ctx: UiContext, options?: WorkingIndicatorOp
|
|
|
41
36
|
if (typeof fn === "function") fn.call(ctx.ui, options);
|
|
42
37
|
}
|
|
43
38
|
|
|
44
|
-
export function setExtensionWidget(
|
|
39
|
+
export function setExtensionWidget(
|
|
40
|
+
ctx: UiContext,
|
|
41
|
+
key: string,
|
|
42
|
+
content: WidgetContent | undefined,
|
|
43
|
+
options?: WidgetOptionsWithPersist,
|
|
44
|
+
): void {
|
|
45
45
|
const { persist: _persist, ...widgetOptions } = options ?? {};
|
|
46
46
|
ctx.ui.setWidget(key, content as never, widgetOptions as WidgetOptions);
|
|
47
47
|
}
|
|
@@ -1,22 +1,34 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
|
-
import { listRecentRuns } from "../extension/run-index.ts";
|
|
3
2
|
import type { CrewUiConfig } from "../config/config.ts";
|
|
3
|
+
import { listRecentRuns } from "../extension/run-index.ts";
|
|
4
4
|
import { readCrewAgents } from "../runtime/crew-agent-records.ts";
|
|
5
|
-
import { readJsonFileCoalesced } from "../utils/file-coalescer.ts";
|
|
6
|
-
import type { TeamTaskState, TeamRunManifest } from "../state/types.ts";
|
|
7
|
-
import { aggregateUsage } from "../state/usage.ts";
|
|
8
|
-
import { isDisplayActiveRun } from "../runtime/process-status.ts";
|
|
9
5
|
import { listLiveAgents } from "../runtime/live-agent-manager.ts";
|
|
10
|
-
import { logInternalError } from "../utils/internal-error.ts";
|
|
11
6
|
import type { ManifestCache } from "../runtime/manifest-cache.ts";
|
|
12
|
-
import
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
7
|
+
import { isDisplayActiveRun } from "../runtime/process-status.ts";
|
|
8
|
+
import type { TeamRunManifest, TeamTaskState } from "../state/types.ts";
|
|
9
|
+
import { aggregateUsage } from "../state/usage.ts";
|
|
10
|
+
import { readJsonFileCoalesced } from "../utils/file-coalescer.ts";
|
|
11
|
+
import { logInternalError } from "../utils/internal-error.ts";
|
|
15
12
|
import { allWorkflows, discoverWorkflows } from "../workflows/discover-workflows.ts";
|
|
16
13
|
import type { WorkflowConfig, WorkflowStep } from "../workflows/workflow-config.ts";
|
|
14
|
+
import { RenderCoalescer } from "./render-coalescer.ts";
|
|
15
|
+
import type { RunSnapshotCache, RunUiSnapshot } from "./snapshot-types.ts";
|
|
16
|
+
import { notificationBadge } from "./widget/widget-formatters.ts";
|
|
17
17
|
|
|
18
|
-
type EventBus =
|
|
19
|
-
|
|
18
|
+
type EventBus =
|
|
19
|
+
| {
|
|
20
|
+
emit?: (event: string, data: unknown) => void;
|
|
21
|
+
listenerCount?: (event: string) => number;
|
|
22
|
+
}
|
|
23
|
+
| undefined;
|
|
24
|
+
type StatusContext =
|
|
25
|
+
| {
|
|
26
|
+
hasUI?: boolean;
|
|
27
|
+
ui?: {
|
|
28
|
+
setStatus?: (key: string, text: string | undefined) => void;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
| undefined;
|
|
20
32
|
|
|
21
33
|
const TASK_READ_TTL_MS = 200;
|
|
22
34
|
|
|
@@ -63,33 +75,59 @@ export function compactTokens(total: number): string {
|
|
|
63
75
|
|
|
64
76
|
export function registerPiCrewPowerbarSegments(events: EventBus, config?: CrewUiConfig): void {
|
|
65
77
|
if (config?.powerbar === false) return;
|
|
66
|
-
safeEmit(events, "powerbar:register-segment", {
|
|
67
|
-
|
|
68
|
-
|
|
78
|
+
safeEmit(events, "powerbar:register-segment", {
|
|
79
|
+
id: "pi-crew-active",
|
|
80
|
+
label: "pi-crew active agents",
|
|
81
|
+
});
|
|
82
|
+
safeEmit(events, "powerbar:register-segment", {
|
|
83
|
+
id: "pi-crew-progress",
|
|
84
|
+
label: "pi-crew run progress",
|
|
85
|
+
});
|
|
86
|
+
safeEmit(events, "powerbar:register-segment", {
|
|
87
|
+
id: "pi-crew-steps",
|
|
88
|
+
label: "pi-crew workflow steps",
|
|
89
|
+
});
|
|
69
90
|
}
|
|
70
91
|
|
|
71
|
-
export function updatePiCrewPowerbar(
|
|
92
|
+
export function updatePiCrewPowerbar(
|
|
93
|
+
events: EventBus,
|
|
94
|
+
cwd: string,
|
|
95
|
+
config?: CrewUiConfig,
|
|
96
|
+
manifestCache?: ManifestCache,
|
|
97
|
+
snapshotCache?: RunSnapshotCache,
|
|
98
|
+
ctx?: StatusContext,
|
|
99
|
+
notificationCount = 0,
|
|
100
|
+
preloadedManifests?: TeamRunManifest[],
|
|
101
|
+
): void {
|
|
72
102
|
if (config?.powerbar === false) return;
|
|
73
103
|
const useStatusFallback = !hasPowerbarConsumer(events);
|
|
74
104
|
const runs = preloadedManifests ?? (manifestCache ? manifestCache.list(20) : listRecentRuns(cwd, 20));
|
|
75
|
-
const active = runs
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
105
|
+
const active = runs
|
|
106
|
+
.map((run) => {
|
|
107
|
+
let snapshot: RunUiSnapshot | undefined;
|
|
108
|
+
try {
|
|
109
|
+
// 1.2: render path is read-only. Use cache.get() only; the background
|
|
110
|
+
// preload loop in register.ts populates entries on its own cadence.
|
|
111
|
+
snapshot = snapshotCache?.get(run.runId);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
logInternalError("powerbar.snapshot", error, run.runId);
|
|
114
|
+
}
|
|
115
|
+
if (snapshot)
|
|
116
|
+
return {
|
|
117
|
+
run: snapshot.manifest,
|
|
118
|
+
agents: snapshot.agents,
|
|
119
|
+
tasks: snapshot.tasks,
|
|
120
|
+
snapshot,
|
|
121
|
+
};
|
|
122
|
+
let agents: ReturnType<typeof readCrewAgents> = [];
|
|
123
|
+
try {
|
|
124
|
+
agents = readCrewAgents(run);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
logInternalError("powerbar.readCrewAgents", error, run.runId);
|
|
127
|
+
}
|
|
128
|
+
return { run, agents, tasks: readTasks(run.tasksPath), snapshot };
|
|
129
|
+
})
|
|
130
|
+
.filter((item) => isDisplayActiveRun(item.run, item.agents));
|
|
93
131
|
if (!active.length) {
|
|
94
132
|
lastActiveKey = undefined;
|
|
95
133
|
lastProgressKey = undefined;
|
|
@@ -102,25 +140,56 @@ export function updatePiCrewPowerbar(events: EventBus, cwd: string, config?: Cre
|
|
|
102
140
|
const agents = active.flatMap((item) => item.agents);
|
|
103
141
|
const tasks = active.flatMap((item) => item.tasks);
|
|
104
142
|
const running = agents.filter((agent) => agent.status === "running").length;
|
|
105
|
-
const waiting = active.reduce(
|
|
106
|
-
|
|
143
|
+
const waiting = active.reduce(
|
|
144
|
+
(sum, item) =>
|
|
145
|
+
sum +
|
|
146
|
+
(item.snapshot
|
|
147
|
+
? item.snapshot.progress.queued + (item.snapshot.progress.waiting ?? 0)
|
|
148
|
+
: item.tasks.reduce((s, t) => s + (t.status === "queued" || t.status === "waiting" ? 1 : 0), 0)),
|
|
149
|
+
0,
|
|
150
|
+
);
|
|
151
|
+
const completed = active.reduce(
|
|
152
|
+
(sum, item) => sum + (item.snapshot?.progress.completed ?? item.tasks.reduce((s, t) => s + (t.status === "completed" ? 1 : 0), 0)),
|
|
153
|
+
0,
|
|
154
|
+
);
|
|
107
155
|
const total = Math.max(1, active.reduce((sum, item) => sum + (item.snapshot?.progress.total ?? item.tasks.length), 0) || agents.length);
|
|
108
156
|
const usage = aggregateUsage(tasks);
|
|
109
|
-
const snapshotTokens = active.reduce(
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
157
|
+
const snapshotTokens = active.reduce(
|
|
158
|
+
(sum, item) => sum + (item.snapshot ? item.snapshot.usage.tokensIn + item.snapshot.usage.tokensOut : 0),
|
|
159
|
+
0,
|
|
160
|
+
);
|
|
161
|
+
const hasUsage = usage && (usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0) > 0;
|
|
162
|
+
const tokenTotal = hasUsage
|
|
163
|
+
? (usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0)
|
|
164
|
+
: snapshotTokens;
|
|
165
|
+
const model =
|
|
166
|
+
config?.showModel === false
|
|
167
|
+
? undefined
|
|
168
|
+
: agents
|
|
169
|
+
.find((agent) => agent.model)
|
|
170
|
+
?.model?.split("/")
|
|
171
|
+
.at(-1);
|
|
113
172
|
const tokenText = config?.showTokens === false || !tokenTotal ? undefined : compactTokens(tokenTotal);
|
|
114
173
|
const liveRunning = listLiveAgents().filter((a) => a.status === "running").length;
|
|
115
174
|
// Always show consistent status: running count + queued count from live tasks only
|
|
116
175
|
// Avoid snapshot cache for counts to prevent UI jumping
|
|
117
176
|
const runningCount = agents.filter((a) => a.status === "running").length;
|
|
118
177
|
// Count queued/waiting tasks directly from tasks array (not snapshot) for consistency
|
|
119
|
-
const queuedCount = active.reduce(
|
|
178
|
+
const queuedCount = active.reduce(
|
|
179
|
+
(sum, item) => sum + item.tasks.reduce((s, t) => s + (t.status === "queued" || t.status === "waiting" ? 1 : 0), 0),
|
|
180
|
+
0,
|
|
181
|
+
);
|
|
120
182
|
// Format: "1 running", "2 running · 1 queued", "3 queued", "idle"
|
|
121
183
|
const runningLabel = runningCount === 1 ? "1 running" : `${runningCount} running`;
|
|
122
184
|
const queuedLabel = queuedCount === 1 ? "1 queued" : `${queuedCount} queued`;
|
|
123
|
-
const crewStatus =
|
|
185
|
+
const crewStatus =
|
|
186
|
+
runningCount > 0 && queuedCount > 0
|
|
187
|
+
? `${runningLabel} · ${queuedLabel}`
|
|
188
|
+
: runningCount > 0
|
|
189
|
+
? runningLabel
|
|
190
|
+
: queuedCount > 0
|
|
191
|
+
? queuedLabel
|
|
192
|
+
: "idle";
|
|
124
193
|
const liveSuffix = liveRunning > 0 ? ` (${liveRunning} live)` : "";
|
|
125
194
|
const notificationText = notificationBadge(notificationCount);
|
|
126
195
|
// Always show model + tokens as suffix when available (for activePayload consistency)
|
|
@@ -288,7 +357,16 @@ export function requestPowerbarUpdate(
|
|
|
288
357
|
preloadedManifests?: TeamRunManifest[],
|
|
289
358
|
): void {
|
|
290
359
|
if (config?.powerbar === false) return;
|
|
291
|
-
latestArgs = {
|
|
360
|
+
latestArgs = {
|
|
361
|
+
events,
|
|
362
|
+
cwd,
|
|
363
|
+
config,
|
|
364
|
+
manifestCache,
|
|
365
|
+
snapshotCache,
|
|
366
|
+
ctx,
|
|
367
|
+
notificationCount,
|
|
368
|
+
preloadedManifests,
|
|
369
|
+
};
|
|
292
370
|
powerbarCoalescer.request();
|
|
293
371
|
}
|
|
294
372
|
|
package/src/ui/render-diff.ts
CHANGED
|
@@ -4,7 +4,8 @@ import { asCrewTheme } from "./theme-adapter.ts";
|
|
|
4
4
|
|
|
5
5
|
interface ParsedDiffLine {
|
|
6
6
|
prefix: string;
|
|
7
|
-
lineNum: string;
|
|
7
|
+
lineNum: string;
|
|
8
|
+
content: string;
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
interface DiffLineContent {
|
|
@@ -108,7 +109,10 @@ export function renderDiff(diffText: string, options: RenderDiffOptions = {}): s
|
|
|
108
109
|
while (i < lines.length) {
|
|
109
110
|
const nextParsed = parseDiffLine(lines[i] ?? "");
|
|
110
111
|
if (!nextParsed || nextParsed.prefix !== "-") break;
|
|
111
|
-
removedLines.push({
|
|
112
|
+
removedLines.push({
|
|
113
|
+
lineNum: nextParsed.lineNum,
|
|
114
|
+
content: nextParsed.content,
|
|
115
|
+
});
|
|
112
116
|
i++;
|
|
113
117
|
}
|
|
114
118
|
|
|
@@ -116,7 +120,10 @@ export function renderDiff(diffText: string, options: RenderDiffOptions = {}): s
|
|
|
116
120
|
while (i < lines.length) {
|
|
117
121
|
const nextParsed = parseDiffLine(lines[i] ?? "");
|
|
118
122
|
if (!nextParsed || nextParsed.prefix !== "+") break;
|
|
119
|
-
addedLines.push({
|
|
123
|
+
addedLines.push({
|
|
124
|
+
lineNum: nextParsed.lineNum,
|
|
125
|
+
content: nextParsed.content,
|
|
126
|
+
});
|
|
120
127
|
i++;
|
|
121
128
|
}
|
|
122
129
|
|
|
@@ -132,9 +132,13 @@ export class RenderScheduler {
|
|
|
132
132
|
*/
|
|
133
133
|
private invalidate(payload: unknown): void {
|
|
134
134
|
try {
|
|
135
|
-
const runId =
|
|
136
|
-
|
|
137
|
-
|
|
135
|
+
const runId =
|
|
136
|
+
typeof payload === "object" &&
|
|
137
|
+
payload !== null &&
|
|
138
|
+
"runId" in payload &&
|
|
139
|
+
typeof (payload as { runId: unknown }).runId === "string"
|
|
140
|
+
? (payload as { runId: string }).runId
|
|
141
|
+
: undefined;
|
|
138
142
|
if (runId === undefined || this.invalidateCoalesceMs <= 0) {
|
|
139
143
|
this.onInvalidate?.(payload);
|
|
140
144
|
return;
|
|
@@ -210,7 +214,11 @@ export class RenderScheduler {
|
|
|
210
214
|
this.invalidateTimer = undefined;
|
|
211
215
|
this.invalidateBuffer.clear();
|
|
212
216
|
for (const unsub of this.unsubs.splice(0)) {
|
|
213
|
-
try {
|
|
217
|
+
try {
|
|
218
|
+
unsub();
|
|
219
|
+
} catch (error) {
|
|
220
|
+
logInternalError("render-scheduler.unsubscribe", error);
|
|
221
|
+
}
|
|
214
222
|
}
|
|
215
223
|
}
|
|
216
224
|
}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import type { MetricRegistry } from "../observability/metric-registry.ts";
|
|
3
2
|
// Lazy-loaded: team-tool.ts pulls in entire runtime chain.
|
|
4
3
|
import type { handleTeamTool as HandleTeamToolFn } from "../extension/team-tool.ts";
|
|
4
|
+
import type { MetricRegistry } from "../observability/metric-registry.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: avoid pulling team-tool.ts (and its entire runtime chain) into module load.
|
|
9
13
|
const mod = await import("../extension/team-tool.ts");
|
|
@@ -11,12 +15,13 @@ 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 "../extension/tool-result.ts";
|
|
15
|
-
import { loadRunManifestById, saveRunTasks } from "../state/state-store.ts";
|
|
16
|
-
import { appendEvent } from "../state/event-log.ts";
|
|
17
20
|
import { readCrewAgents } from "../runtime/crew-agent-records.ts";
|
|
18
21
|
import { exportDiagnostic } from "../runtime/diagnostic-export.ts";
|
|
22
|
+
import { appendEvent } from "../state/event-log.ts";
|
|
19
23
|
import type { MailboxDirection, MailboxMessage } from "../state/mailbox.ts";
|
|
24
|
+
import { loadRunManifestById, saveRunTasks } from "../state/state-store.ts";
|
|
20
25
|
|
|
21
26
|
export interface RunActionResult {
|
|
22
27
|
ok: boolean;
|
|
@@ -25,11 +30,18 @@ export interface RunActionResult {
|
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
function okFromTool(result: Awaited<ReturnType<typeof handleTeamTool>>): RunActionResult {
|
|
28
|
-
return {
|
|
33
|
+
return {
|
|
34
|
+
ok: !isToolError(result),
|
|
35
|
+
message: textFromToolResult(result),
|
|
36
|
+
data: result,
|
|
37
|
+
};
|
|
29
38
|
}
|
|
30
39
|
|
|
31
40
|
function err(error: unknown): RunActionResult {
|
|
32
|
-
return {
|
|
41
|
+
return {
|
|
42
|
+
ok: false,
|
|
43
|
+
message: error instanceof Error ? error.message : String(error),
|
|
44
|
+
};
|
|
33
45
|
}
|
|
34
46
|
|
|
35
47
|
async function dispatchApi(ctx: ExtensionContext, runId: string, config: Record<string, unknown>): Promise<RunActionResult> {
|
|
@@ -44,7 +56,10 @@ function parseMailboxMessages(text: string): MailboxMessage[] {
|
|
|
44
56
|
try {
|
|
45
57
|
const parsed = JSON.parse(text) as unknown;
|
|
46
58
|
if (!Array.isArray(parsed)) return [];
|
|
47
|
-
return parsed.filter(
|
|
59
|
+
return parsed.filter(
|
|
60
|
+
(item): item is MailboxMessage =>
|
|
61
|
+
Boolean(item) && typeof item === "object" && !Array.isArray(item) && typeof (item as { id?: unknown }).id === "string",
|
|
62
|
+
);
|
|
48
63
|
} catch {
|
|
49
64
|
return [];
|
|
50
65
|
}
|
|
@@ -55,28 +70,56 @@ export function dispatchMailboxAck(ctx: ExtensionContext, runId: string, message
|
|
|
55
70
|
}
|
|
56
71
|
|
|
57
72
|
export function dispatchMailboxNudge(ctx: ExtensionContext, runId: string, agentId: string, message: string): Promise<RunActionResult> {
|
|
58
|
-
return dispatchApi(ctx, runId, {
|
|
73
|
+
return dispatchApi(ctx, runId, {
|
|
74
|
+
operation: "nudge-agent",
|
|
75
|
+
agentId,
|
|
76
|
+
message,
|
|
77
|
+
});
|
|
59
78
|
}
|
|
60
79
|
|
|
61
|
-
export function dispatchMailboxCompose(
|
|
80
|
+
export function dispatchMailboxCompose(
|
|
81
|
+
ctx: ExtensionContext,
|
|
82
|
+
runId: string,
|
|
83
|
+
payload: {
|
|
84
|
+
from: string;
|
|
85
|
+
to: string;
|
|
86
|
+
body: string;
|
|
87
|
+
taskId?: string;
|
|
88
|
+
direction: MailboxDirection;
|
|
89
|
+
},
|
|
90
|
+
): Promise<RunActionResult> {
|
|
62
91
|
return dispatchApi(ctx, runId, { operation: "send-message", ...payload });
|
|
63
92
|
}
|
|
64
93
|
|
|
65
94
|
export async function dispatchMailboxAckAll(ctx: ExtensionContext, runId: string): Promise<RunActionResult> {
|
|
66
|
-
const listed = await dispatchApi(ctx, runId, {
|
|
95
|
+
const listed = await dispatchApi(ctx, runId, {
|
|
96
|
+
operation: "read-mailbox",
|
|
97
|
+
direction: "inbox",
|
|
98
|
+
});
|
|
67
99
|
if (!listed.ok) return listed;
|
|
68
100
|
const messages = parseMailboxMessages(listed.message).filter((message) => message.status !== "acknowledged");
|
|
69
101
|
let count = 0;
|
|
70
102
|
for (const message of messages) {
|
|
71
103
|
const acked = await dispatchMailboxAck(ctx, runId, message.id);
|
|
72
|
-
if (!acked.ok)
|
|
104
|
+
if (!acked.ok)
|
|
105
|
+
return {
|
|
106
|
+
ok: false,
|
|
107
|
+
message: `Acknowledged ${count}/${messages.length}; failed ${message.id}: ${acked.message}`,
|
|
108
|
+
};
|
|
73
109
|
count += 1;
|
|
74
110
|
}
|
|
75
|
-
return {
|
|
111
|
+
return {
|
|
112
|
+
ok: true,
|
|
113
|
+
message: `Acknowledged ${count} messages.`,
|
|
114
|
+
data: { count },
|
|
115
|
+
};
|
|
76
116
|
}
|
|
77
117
|
|
|
78
118
|
export function dispatchHealthRecovery(ctx: ExtensionContext, runId: string): Promise<RunActionResult> {
|
|
79
|
-
return dispatchApi(ctx, runId, {
|
|
119
|
+
return dispatchApi(ctx, runId, {
|
|
120
|
+
operation: "foreground-interrupt",
|
|
121
|
+
reason: "operator health recovery",
|
|
122
|
+
});
|
|
80
123
|
}
|
|
81
124
|
|
|
82
125
|
export async function dispatchKillStaleWorkers(ctx: ExtensionContext, runId: string): Promise<RunActionResult> {
|
|
@@ -92,20 +135,40 @@ export async function dispatchKillStaleWorkers(ctx: ExtensionContext, runId: str
|
|
|
92
135
|
const lastSeenMs = Date.parse(task.heartbeat.lastSeenAt);
|
|
93
136
|
if (!Number.isFinite(lastSeenMs) || currentMs - lastSeenMs <= staleMs) return task;
|
|
94
137
|
count += 1;
|
|
95
|
-
return {
|
|
138
|
+
return {
|
|
139
|
+
...task,
|
|
140
|
+
heartbeat: { ...task.heartbeat, alive: false, lastSeenAt: now },
|
|
141
|
+
};
|
|
96
142
|
});
|
|
97
143
|
saveRunTasks(loaded.manifest, tasks);
|
|
98
|
-
appendEvent(loaded.manifest.eventsPath, {
|
|
99
|
-
|
|
144
|
+
appendEvent(loaded.manifest.eventsPath, {
|
|
145
|
+
type: "worker.kill_stale",
|
|
146
|
+
runId,
|
|
147
|
+
message: `Marked ${count} stale worker heartbeat(s) dead.`,
|
|
148
|
+
data: { count },
|
|
149
|
+
});
|
|
150
|
+
return {
|
|
151
|
+
ok: true,
|
|
152
|
+
message: `Marked ${count} stale worker heartbeat(s) dead.`,
|
|
153
|
+
data: { count },
|
|
154
|
+
};
|
|
100
155
|
} catch (error) {
|
|
101
156
|
return err(error);
|
|
102
157
|
}
|
|
103
158
|
}
|
|
104
159
|
|
|
105
|
-
export async function dispatchDiagnosticExport(
|
|
160
|
+
export async function dispatchDiagnosticExport(
|
|
161
|
+
ctx: ExtensionContext,
|
|
162
|
+
runId: string,
|
|
163
|
+
options: { registry?: MetricRegistry } = {},
|
|
164
|
+
): Promise<RunActionResult> {
|
|
106
165
|
try {
|
|
107
166
|
const exported = await exportDiagnostic(ctx, runId, options);
|
|
108
|
-
return {
|
|
167
|
+
return {
|
|
168
|
+
ok: true,
|
|
169
|
+
message: `Diagnostic exported to ${exported.path}`,
|
|
170
|
+
data: exported.path,
|
|
171
|
+
};
|
|
109
172
|
} catch (error) {
|
|
110
173
|
return err(error);
|
|
111
174
|
}
|