pi-crew 0.9.50 → 0.9.52
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 +150 -0
- package/README.md +216 -20
- package/dist/build-meta.json +2222 -1761
- package/dist/index.mjs +18636 -17603
- package/docs/actions-reference.md +431 -1
- package/package.json +19 -9
- package/schema.json +41 -0
- package/scripts/check-bundle-size.mjs +38 -0
- package/scripts/test-runner.mjs +11 -1
- package/skills/distill-software/SKILL.md +24 -1
- package/dist/index.mjs.map +0 -7
- package/docs/FEATURE_INTAKE.md +0 -126
- package/docs/HARNESS.md +0 -87
- package/docs/HARNESS_BACKLOG.md +0 -89
- package/docs/PROJECT_REVIEW.md +0 -270
- package/docs/PROJECT_REVIEW_FIXES.md +0 -342
- package/docs/PROJECT_REVIEW_ROUND4.md +0 -156
- package/docs/PROJECT_REVIEW_ROUND5.md +0 -86
- package/docs/REVIEW-FINDINGS-2026-06 +0 -357
- package/docs/REVIEW-FINDINGS-2026-07-CORE.md +0 -139
- package/docs/REVIEW-FINDINGS-2026-07.md +0 -125
- package/docs/TEST_MATRIX.md +0 -51
- package/docs/archive/README.md +0 -91
- package/docs/archive/followup-review-round3-2026-05-12.md +0 -342
- package/docs/archive/followup-review-round4-2026-05-13.md +0 -107
- package/docs/archive/pi-crew-bugs.md +0 -961
- package/docs/archive/pi-crew-test-final.md +0 -120
- package/docs/archive/pi-crew-test-results.md +0 -260
- package/docs/archive/pi-crew-test-round2.md +0 -136
- package/docs/archive/pi-crew-test-round4.md +0 -100
- package/docs/archive/pi-crew-test-round5.md +0 -70
- package/docs/archive/pi-crew-test-round6.md +0 -110
- package/docs/archive/pi-crew-v0.5.10-audit-fix-plan.md +0 -60
- package/docs/archive/pi-crew-v0.5.11-audit-fix-plan.md +0 -92
- package/docs/archive/pi-crew-v0.5.12-audit-fix-plan.md +0 -76
- package/docs/archive/pi-crew-v0.5.13-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.14-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.16-audit-fix-plan.md +0 -35
- package/docs/archive/pi-crew-v0.5.17-audit-fix-plan.md +0 -80
- package/docs/archive/pi-crew-v0.5.5-audit-fix-plan.md +0 -133
- package/docs/archive/pi-crew-v0.5.9-audit-fix-plan.md +0 -88
- package/docs/archive/pi-mono-opportunities.md +0 -969
- package/docs/archive/pi-mono-review.md +0 -291
- package/docs/archive/pi-subagent4-comparison.md +0 -261
- package/docs/archive/pi-subagents3-deep-analysis.md +0 -508
- package/docs/bugs/bug-021-notification-badge-counter-misleading.md +0 -293
- package/docs/bugs/bug-023-chain-windows-path-resolution.md +0 -106
- package/docs/bugs/bug-quota-display-truncation.md +0 -223
- package/docs/bugs/cross-session-notification-leakage.md +0 -82
- package/docs/code-review-2026-05-11.md +0 -592
- package/docs/coding-agent-optimization.md +0 -268
- package/docs/comparison-pi-subagents-vs-pi-crew.md +0 -303
- package/docs/decisions/0001-durable-state.md +0 -41
- package/docs/decisions/0002-child-process-for-async.md +0 -42
- package/docs/decisions/0003-depth-guard.md +0 -36
- package/docs/decisions/0004-execfile-over-exec.md +0 -34
- package/docs/decisions/0005-no-parameter-properties.md +0 -49
- package/docs/decisions/0006-publish-bundled-esm.md +0 -63
- package/docs/decisions/0007-active-run-binary-index.md +0 -54
- package/docs/decisions/0008-child-pi-warm-pool.md +0 -61
- package/docs/decisions/2026-07-21-broker-phase4-default-on.md +0 -77
- package/docs/decisions/2026-07-21-broker-windows-perms.md +0 -91
- package/docs/decisions/2026-07-22-broker-phase4-gated-on.md +0 -99
- package/docs/decisions/2026-07-24-oidc-trusted-publishing.md +0 -112
- package/docs/decisions/README.md +0 -26
- package/docs/deep-review-report.md +0 -384
- package/docs/distillation/cybersecurity-patterns.md +0 -294
- package/docs/feature-analysis-subagent4.md +0 -305
- package/docs/fix-plan-disabletools-exit-null.md +0 -219
- package/docs/fixes/BATCH_A_H1_H2.md +0 -86
- package/docs/fixes/bug-006-foreground-cancel-concurrent.md +0 -78
- package/docs/fixes/bug-007-async-notifier-stale-ctx.md +0 -112
- package/docs/fixes/bug-008-child-process-silent-timeout.md +0 -100
- package/docs/fixes/bug-009-executor-yield-limit-needs-attention.md +0 -75
- package/docs/fixes/bug-010-child-process-api-key-filtered.md +0 -109
- package/docs/fixes/bug-011-spawn-pi-enoent.md +0 -92
- package/docs/fixes/bug-012-essential-env-stripped.md +0 -89
- package/docs/fixes/bug-013-background-runner-death.md +0 -84
- package/docs/fixes/bug-014-infinite-retry-loop-needs-attention.md +0 -82
- package/docs/fixes/bug-015-background-runner-sigterm.md +0 -65
- package/docs/fixes/bug-017-background-runner-session-shutdown.md +0 -66
- package/docs/fixes/bug-017-background-runner-sigkill-double-fork.md +0 -28
- package/docs/fixes/bug-018-child-pi-worker-stdin-hang.md +0 -61
- package/docs/fixes/bug-019-phantom-runs-temp-workspace.md +0 -52
- package/docs/fixes/bug-020-infinite-retry-loop-needs-attention.md +0 -47
- package/docs/fixes/v0.9.10/locks-fix-verify.md +0 -3
- package/docs/fixes/v0.9.10/smoke-test.md +0 -12
- package/docs/followup-plan-2026-05-12.md +0 -463
- package/docs/followup-review-2026-05-12.md +0 -297
- package/docs/goals.md +0 -59
- package/docs/implementation-plan-top3.md +0 -333
- package/docs/issue-29-analysis.md +0 -189
- package/docs/live-mailbox-runtime.md +0 -36
- package/docs/migration/atomic-write-v2-migration.md +0 -299
- package/docs/next-upgrade-roadmap.md +0 -808
- package/docs/oh-my-pi-research.md +0 -509
- package/docs/optimization-plan-2026-07.md +0 -366
- package/docs/optimization-plan.md +0 -644
- package/docs/patterns/command-agent-skill.md +0 -71
- package/docs/perf/baseline-2026-05.md +0 -113
- package/docs/perf/final-report-2026-05.md +0 -206
- package/docs/perf/optimization-plan-2026-07-verified.md +0 -396
- package/docs/perf/performance-audit-report-2026-07.md +0 -948
- package/docs/perf/performance-review-2026-07.md +0 -287
- package/docs/perf/sprint-1-report.md +0 -71
- package/docs/perf/sprint-2-report.md +0 -81
- package/docs/perf/sprint-2.5-report.md +0 -53
- package/docs/perf/sprint-3-report.md +0 -36
- package/docs/perf/sprint-4-report.md +0 -47
- package/docs/perf/sprint-5-report.md +0 -51
- package/docs/perf/sprint-6-report.md +0 -94
- package/docs/perf/sprint-7-report.md +0 -74
- package/docs/perf/upgrade-plan-2026-05.md +0 -147
- package/docs/performance-optimization-execution-plan.md +0 -520
- package/docs/phase4-triage.md +0 -58
- package/docs/pi-crew-investigation-report.md +0 -411
- package/docs/product/README.md +0 -31
- package/docs/product/platform.md +0 -27
- package/docs/product/runtime-safety.md +0 -37
- package/docs/product/team-run.md +0 -39
- package/docs/product/team-tool.md +0 -37
- package/docs/runtime-analysis-child-vs-live.md +0 -171
- package/docs/runtime-migration-in-process-analysis.md +0 -250
- package/docs/skills/REFERENCE.md +0 -138
- package/docs/stories/README.md +0 -32
- package/docs/stories/US-DEPS-major-upgrade.md +0 -62
- package/docs/stories/backlog.md +0 -36
- package/docs/superpowers/plans/2026-06-09-fallow-patterns-adoption.md +0 -1270
- package/docs/templates/decision.md +0 -27
- package/docs/templates/story.md +0 -44
- package/docs/templates/validation-report.md +0 -32
- package/docs/ui-optimization-plan.md +0 -447
- package/src/adapters/claude-adapter.ts +0 -23
- package/src/adapters/codex-adapter.ts +0 -21
- package/src/adapters/cursor-adapter.ts +0 -17
- package/src/adapters/export-util.ts +0 -143
- package/src/adapters/index.ts +0 -15
- package/src/adapters/registry.ts +0 -18
- package/src/adapters/types.ts +0 -23
- package/src/agents/agent-config.ts +0 -194
- package/src/agents/agent-search.ts +0 -98
- package/src/agents/agent-serializer.ts +0 -38
- package/src/agents/discover-agents.ts +0 -623
- package/src/benchmark/benchmark-runner.ts +0 -313
- package/src/benchmark/feedback-loop.ts +0 -73
- package/src/config/config.ts +0 -1269
- package/src/config/defaults.ts +0 -193
- package/src/config/drift-detector.ts +0 -290
- package/src/config/markers.ts +0 -330
- package/src/config/resilient-parser.ts +0 -117
- package/src/config/role-tools.ts +0 -118
- package/src/config/suggestions.ts +0 -75
- package/src/config/types.ts +0 -278
- package/src/errors.ts +0 -194
- package/src/extension/action-suggestions.ts +0 -117
- package/src/extension/async-notifier.ts +0 -179
- package/src/extension/autonomous-policy.ts +0 -209
- package/src/extension/command-completions.ts +0 -120
- package/src/extension/context-status-injection.ts +0 -185
- package/src/extension/crew-autocomplete.ts +0 -131
- package/src/extension/crew-cleanup.ts +0 -168
- package/src/extension/crew-input-router.ts +0 -93
- package/src/extension/crew-shortcuts.ts +0 -87
- package/src/extension/crew-vibes/cat-frames.ts +0 -18
- package/src/extension/crew-vibes/config.ts +0 -195
- package/src/extension/crew-vibes/figures.ts +0 -101
- package/src/extension/crew-vibes/font-detect.ts +0 -71
- package/src/extension/crew-vibes/footer.ts +0 -292
- package/src/extension/crew-vibes/index.ts +0 -432
- package/src/extension/crew-vibes/provider-usage.ts +0 -396
- package/src/extension/crew-vibes/render.ts +0 -206
- package/src/extension/crew-vibes/speed.ts +0 -286
- package/src/extension/cross-extension-rpc.ts +0 -350
- package/src/extension/help.ts +0 -62
- package/src/extension/import-index.ts +0 -74
- package/src/extension/knowledge-injection.ts +0 -402
- package/src/extension/management.ts +0 -571
- package/src/extension/message-renderers.ts +0 -108
- package/src/extension/notification-router.ts +0 -152
- package/src/extension/notification-sink.ts +0 -54
- package/src/extension/pi-api.ts +0 -56
- package/src/extension/plan-orchestrate.ts +0 -302
- package/src/extension/project-init.ts +0 -170
- package/src/extension/register.ts +0 -113
- package/src/extension/registration/artifact-cleanup.ts +0 -20
- package/src/extension/registration/command-registration.ts +0 -58
- package/src/extension/registration/command-utils.ts +0 -58
- package/src/extension/registration/commands.ts +0 -1228
- package/src/extension/registration/compaction-guard.ts +0 -333
- package/src/extension/registration/context-builder.ts +0 -135
- package/src/extension/registration/crash-recovery-cache.ts +0 -54
- package/src/extension/registration/foreground-run-controller.ts +0 -238
- package/src/extension/registration/hook-registration.ts +0 -119
- package/src/extension/registration/lazy-configurers.ts +0 -124
- package/src/extension/registration/lifecycle-handlers.ts +0 -923
- package/src/extension/registration/lifecycle.ts +0 -259
- package/src/extension/registration/observability.ts +0 -322
- package/src/extension/registration/registration-types.ts +0 -158
- package/src/extension/registration/runtime-cleanup.ts +0 -230
- package/src/extension/registration/subagent-helpers.ts +0 -125
- package/src/extension/registration/subagent-manager-setup.ts +0 -330
- package/src/extension/registration/subagent-tools.ts +0 -456
- package/src/extension/registration/team-tool.ts +0 -220
- package/src/extension/registration/tool-registration.ts +0 -50
- package/src/extension/registration/ui.ts +0 -172
- package/src/extension/registration/viewers.ts +0 -121
- package/src/extension/registration/wire-cross-extension.ts +0 -37
- package/src/extension/result-watcher.ts +0 -139
- package/src/extension/rpc-hmac.ts +0 -256
- package/src/extension/run-bundle-schema.ts +0 -104
- package/src/extension/run-export.ts +0 -97
- package/src/extension/run-import.ts +0 -168
- package/src/extension/run-index.ts +0 -131
- package/src/extension/run-maintenance.ts +0 -190
- package/src/extension/session-summary.ts +0 -18
- package/src/extension/team-manager-command.ts +0 -153
- package/src/extension/team-onboard.ts +0 -177
- package/src/extension/team-recommendation.ts +0 -288
- package/src/extension/team-tool/anchor.ts +0 -172
- package/src/extension/team-tool/api.ts +0 -1244
- package/src/extension/team-tool/auto-summarize.ts +0 -142
- package/src/extension/team-tool/cache-control.ts +0 -19
- package/src/extension/team-tool/cancel.ts +0 -337
- package/src/extension/team-tool/chain-dispatch.ts +0 -95
- package/src/extension/team-tool/chain-executor.ts +0 -379
- package/src/extension/team-tool/config-patch.ts +0 -50
- package/src/extension/team-tool/context.ts +0 -149
- package/src/extension/team-tool/destructive-gate.ts +0 -52
- package/src/extension/team-tool/doctor.ts +0 -431
- package/src/extension/team-tool/explain.ts +0 -282
- package/src/extension/team-tool/failure-patterns.ts +0 -118
- package/src/extension/team-tool/goal-wrap.ts +0 -330
- package/src/extension/team-tool/goal.ts +0 -556
- package/src/extension/team-tool/handle-schedule.ts +0 -332
- package/src/extension/team-tool/handle-settings.ts +0 -520
- package/src/extension/team-tool/health-monitor.ts +0 -481
- package/src/extension/team-tool/inspect.ts +0 -88
- package/src/extension/team-tool/intent-policy.ts +0 -45
- package/src/extension/team-tool/lifecycle-actions.ts +0 -615
- package/src/extension/team-tool/orchestrate.ts +0 -98
- package/src/extension/team-tool/parallel-dispatch.ts +0 -183
- package/src/extension/team-tool/plan.ts +0 -50
- package/src/extension/team-tool/respond.ts +0 -150
- package/src/extension/team-tool/run-not-found.ts +0 -49
- package/src/extension/team-tool/run.ts +0 -1035
- package/src/extension/team-tool/status.ts +0 -260
- package/src/extension/team-tool/workflow-manage.ts +0 -261
- package/src/extension/team-tool-types.ts +0 -26
- package/src/extension/team-tool.ts +0 -1116
- package/src/extension/tool-result.ts +0 -16
- package/src/extension/validate-resources.ts +0 -108
- package/src/hooks/registry.ts +0 -200
- package/src/hooks/types.ts +0 -69
- package/src/i18n.ts +0 -212
- package/src/observability/correlation.ts +0 -50
- package/src/observability/event-bus.ts +0 -86
- package/src/observability/event-to-metric.ts +0 -170
- package/src/observability/exporters/adapter.ts +0 -27
- package/src/observability/exporters/otlp-exporter.ts +0 -356
- package/src/observability/exporters/prometheus-exporter.ts +0 -54
- package/src/observability/metric-registry.ts +0 -100
- package/src/observability/metric-retention.ts +0 -64
- package/src/observability/metric-sink.ts +0 -99
- package/src/observability/metrics-primitives.ts +0 -219
- package/src/plugins/plugin-define.ts +0 -6
- package/src/plugins/plugin-registry.ts +0 -32
- package/src/plugins/plugins/index.ts +0 -3
- package/src/plugins/plugins/nextjs.ts +0 -19
- package/src/plugins/plugins/vite.ts +0 -10
- package/src/plugins/plugins/vitest.ts +0 -9
- package/src/prompt/prompt-runtime.ts +0 -380
- package/src/runtime/adaptive-plan.ts +0 -563
- package/src/runtime/agent-control.ts +0 -215
- package/src/runtime/agent-memory.ts +0 -81
- package/src/runtime/agent-observability.ts +0 -122
- package/src/runtime/anchor-manager.ts +0 -475
- package/src/runtime/async-marker.ts +0 -32
- package/src/runtime/async-runner.ts +0 -381
- package/src/runtime/attention-events.ts +0 -28
- package/src/runtime/auto-summarize.ts +0 -344
- package/src/runtime/background-runner.ts +0 -837
- package/src/runtime/batch-barrier.ts +0 -147
- package/src/runtime/broker-issuer.ts +0 -37
- package/src/runtime/cancellation-token.ts +0 -99
- package/src/runtime/cancellation.ts +0 -99
- package/src/runtime/capability-inventory.ts +0 -137
- package/src/runtime/chain-parser.ts +0 -237
- package/src/runtime/chain-runner.ts +0 -606
- package/src/runtime/checkpoint.ts +0 -291
- package/src/runtime/child-pi-constants.ts +0 -42
- package/src/runtime/child-pi-kill.ts +0 -180
- package/src/runtime/child-pi-pool.ts +0 -68
- package/src/runtime/child-pi-spawn.ts +0 -287
- package/src/runtime/child-pi-steering.ts +0 -128
- package/src/runtime/child-pi-streams.ts +0 -296
- package/src/runtime/child-pi-transcript.ts +0 -169
- package/src/runtime/child-pi.ts +0 -1105
- package/src/runtime/coalesce-tasks.ts +0 -268
- package/src/runtime/code-summary.ts +0 -292
- package/src/runtime/command-trace.ts +0 -105
- package/src/runtime/compact-pipeline.ts +0 -56
- package/src/runtime/compact-stages/ansi-strip-stage.ts +0 -25
- package/src/runtime/compact-stages/blank-collapse-stage.ts +0 -31
- package/src/runtime/compact-stages/deduplicate-stage.ts +0 -34
- package/src/runtime/compact-stages/head-snap-stage.ts +0 -57
- package/src/runtime/compact-stages/index.ts +0 -23
- package/src/runtime/compact-stages/tail-capture-stage.ts +0 -77
- package/src/runtime/compact-stages/truncation-stage.ts +0 -74
- package/src/runtime/compaction-summary.ts +0 -278
- package/src/runtime/completion-guard.ts +0 -207
- package/src/runtime/concurrency.ts +0 -58
- package/src/runtime/crash-classification.ts +0 -229
- package/src/runtime/crash-recovery.ts +0 -577
- package/src/runtime/crew-agent-records.ts +0 -593
- package/src/runtime/crew-agent-runtime.ts +0 -62
- package/src/runtime/crew-broker-child.ts +0 -88
- package/src/runtime/crew-broker-client.ts +0 -673
- package/src/runtime/crew-broker-tokens.ts +0 -84
- package/src/runtime/crew-broker.ts +0 -1276
- package/src/runtime/crew-hooks.ts +0 -227
- package/src/runtime/cross-extension-rpc.ts +0 -143
- package/src/runtime/custom-tools/irc-tool.ts +0 -282
- package/src/runtime/custom-tools/submit-result-tool.ts +0 -102
- package/src/runtime/deadletter.ts +0 -47
- package/src/runtime/delivery-coordinator.ts +0 -211
- package/src/runtime/delta-conflict.ts +0 -348
- package/src/runtime/deterministic-ast.ts +0 -161
- package/src/runtime/diagnostic-export.ts +0 -171
- package/src/runtime/direct-run.ts +0 -45
- package/src/runtime/dwf-state-store.ts +0 -102
- package/src/runtime/dynamic-workflow-context.ts +0 -1016
- package/src/runtime/dynamic-workflow-runner.ts +0 -310
- package/src/runtime/effectiveness.ts +0 -90
- package/src/runtime/errors/crew-errors.ts +0 -162
- package/src/runtime/event-stream-bridge.ts +0 -98
- package/src/runtime/foreground-control.ts +0 -193
- package/src/runtime/foreground-watchdog.ts +0 -132
- package/src/runtime/global-worker-cap.ts +0 -96
- package/src/runtime/goal-achievement.ts +0 -148
- package/src/runtime/goal-evaluator.ts +0 -361
- package/src/runtime/goal-loop-runner.ts +0 -828
- package/src/runtime/goal-state-store.ts +0 -219
- package/src/runtime/green-contract.ts +0 -55
- package/src/runtime/group-join.ts +0 -267
- package/src/runtime/handoff-manager.ts +0 -598
- package/src/runtime/heartbeat-gradient.ts +0 -36
- package/src/runtime/heartbeat-watcher.ts +0 -239
- package/src/runtime/hidden-handoff.ts +0 -407
- package/src/runtime/important-line-classifier.ts +0 -140
- package/src/runtime/intercom-bridge.ts +0 -187
- package/src/runtime/iteration-hooks.ts +0 -305
- package/src/runtime/live-agent-control.ts +0 -136
- package/src/runtime/live-agent-manager.ts +0 -704
- package/src/runtime/live-control-realtime.ts +0 -56
- package/src/runtime/live-extension-bridge.ts +0 -148
- package/src/runtime/live-irc.ts +0 -97
- package/src/runtime/live-session-health.ts +0 -108
- package/src/runtime/live-session-runtime.ts +0 -1139
- package/src/runtime/loop-gates.ts +0 -128
- package/src/runtime/manifest-cache.ts +0 -375
- package/src/runtime/mcp-proxy.ts +0 -105
- package/src/runtime/metric-parser.ts +0 -36
- package/src/runtime/model-fallback.ts +0 -409
- package/src/runtime/model-resolver.ts +0 -126
- package/src/runtime/model-scope.ts +0 -158
- package/src/runtime/orphan-worker-registry.ts +0 -465
- package/src/runtime/output-validator.ts +0 -202
- package/src/runtime/overflow-recovery.ts +0 -206
- package/src/runtime/parallel-research.ts +0 -68
- package/src/runtime/parallel-utils.ts +0 -160
- package/src/runtime/parent-guard.ts +0 -134
- package/src/runtime/path-overlap.ts +0 -150
- package/src/runtime/peer-dep.ts +0 -292
- package/src/runtime/per-write-validator.ts +0 -181
- package/src/runtime/phase-progress.ts +0 -217
- package/src/runtime/phase-tracker.ts +0 -385
- package/src/runtime/pi-args.ts +0 -655
- package/src/runtime/pi-json-output.ts +0 -170
- package/src/runtime/pi-spawn.ts +0 -273
- package/src/runtime/pipeline-runner.ts +0 -523
- package/src/runtime/plan-templates.ts +0 -201
- package/src/runtime/policy-engine.ts +0 -115
- package/src/runtime/post-checks.ts +0 -142
- package/src/runtime/post-exit-stdio-guard.ts +0 -104
- package/src/runtime/process-lifecycle.ts +0 -491
- package/src/runtime/process-status.ts +0 -154
- package/src/runtime/progress-event-coalescer.ts +0 -44
- package/src/runtime/progress-tracker.ts +0 -124
- package/src/runtime/prose-compressor.ts +0 -162
- package/src/runtime/recovery-recipes.ts +0 -203
- package/src/runtime/replace.ts +0 -570
- package/src/runtime/resilient-edit.ts +0 -153
- package/src/runtime/result-extractor.ts +0 -213
- package/src/runtime/retry-executor.ts +0 -100
- package/src/runtime/retry-runner.ts +0 -336
- package/src/runtime/role-permission.ts +0 -59
- package/src/runtime/run-coalesced-task-group.ts +0 -308
- package/src/runtime/run-drift.ts +0 -219
- package/src/runtime/run-tracker.ts +0 -116
- package/src/runtime/runtime-policy.ts +0 -29
- package/src/runtime/runtime-resolver.ts +0 -172
- package/src/runtime/runtime-warmup.ts +0 -160
- package/src/runtime/scheduler.ts +0 -353
- package/src/runtime/semaphore.ts +0 -141
- package/src/runtime/sensitive-paths.ts +0 -93
- package/src/runtime/session-resources.ts +0 -25
- package/src/runtime/session-snapshot.ts +0 -59
- package/src/runtime/session-usage.ts +0 -79
- package/src/runtime/settings-store.ts +0 -155
- package/src/runtime/sidechain-output.ts +0 -35
- package/src/runtime/single-agent-compose.ts +0 -84
- package/src/runtime/skill-effectiveness.ts +0 -524
- package/src/runtime/skill-instructions.ts +0 -391
- package/src/runtime/stale-reconciler.ts +0 -680
- package/src/runtime/stream-preview.ts +0 -184
- package/src/runtime/streaming-output.ts +0 -50
- package/src/runtime/subagent-manager.ts +0 -561
- package/src/runtime/subprocess-tool-registry.ts +0 -70
- package/src/runtime/supervisor-contact.ts +0 -64
- package/src/runtime/task-display.ts +0 -52
- package/src/runtime/task-graph-scheduler.ts +0 -227
- package/src/runtime/task-graph.ts +0 -290
- package/src/runtime/task-health.ts +0 -83
- package/src/runtime/task-id.ts +0 -161
- package/src/runtime/task-output-context.ts +0 -602
- package/src/runtime/task-packet.ts +0 -268
- package/src/runtime/task-quality.ts +0 -199
- package/src/runtime/task-runner/capabilities.ts +0 -78
- package/src/runtime/task-runner/context-retrieval.ts +0 -163
- package/src/runtime/task-runner/live-executor.ts +0 -227
- package/src/runtime/task-runner/output-splitter.ts +0 -152
- package/src/runtime/task-runner/progress.ts +0 -157
- package/src/runtime/task-runner/prompt-builder.ts +0 -278
- package/src/runtime/task-runner/prompt-pipeline.ts +0 -88
- package/src/runtime/task-runner/result-utils.ts +0 -16
- package/src/runtime/task-runner/retrieval-orchestrator.ts +0 -310
- package/src/runtime/task-runner/run-projection.ts +0 -125
- package/src/runtime/task-runner/state-helpers.ts +0 -176
- package/src/runtime/task-runner/tail-read.ts +0 -34
- package/src/runtime/task-runner.ts +0 -1420
- package/src/runtime/team-runner-artifacts.ts +0 -13
- package/src/runtime/team-runner.ts +0 -1993
- package/src/runtime/tool-output-pruner.ts +0 -333
- package/src/runtime/tool-progress.ts +0 -278
- package/src/runtime/usage-tracker.ts +0 -73
- package/src/runtime/verification-gates.ts +0 -571
- package/src/runtime/verification-integrity.ts +0 -105
- package/src/runtime/verification-worktree.ts +0 -186
- package/src/runtime/worker-heartbeat.ts +0 -25
- package/src/runtime/worker-startup.ts +0 -83
- package/src/runtime/workflow-state.ts +0 -195
- package/src/runtime/workspace-lock.ts +0 -443
- package/src/runtime/workspace-tree.ts +0 -312
- package/src/runtime/yield-handler.ts +0 -224
- package/src/runtime/zombie-scanner.ts +0 -298
- package/src/schema/config-schema.ts +0 -327
- package/src/schema/team-tool-schema.ts +0 -415
- package/src/schema/validation-types.ts +0 -159
- package/src/skills/discover-skills.ts +0 -197
- package/src/skills/skill-templates.ts +0 -456
- package/src/skills/validate.ts +0 -285
- package/src/state/active-run-registry.ts +0 -439
- package/src/state/artifact-store.ts +0 -176
- package/src/state/atomic-write.ts +0 -903
- package/src/state/blob-store.ts +0 -308
- package/src/state/contracts.ts +0 -158
- package/src/state/crew-init.ts +0 -269
- package/src/state/decision-ledger.ts +0 -345
- package/src/state/event-log-rotation.ts +0 -342
- package/src/state/event-log.ts +0 -1311
- package/src/state/event-reconstructor.ts +0 -229
- package/src/state/gitignore-manager.ts +0 -46
- package/src/state/health-store.ts +0 -79
- package/src/state/hook-instinct-bridge.ts +0 -94
- package/src/state/hook-integrations.ts +0 -51
- package/src/state/instinct-store.ts +0 -275
- package/src/state/jsonl-writer.ts +0 -107
- package/src/state/locks.ts +0 -562
- package/src/state/mailbox.ts +0 -916
- package/src/state/observation-store.ts +0 -176
- package/src/state/run-cache.ts +0 -193
- package/src/state/run-graph.ts +0 -183
- package/src/state/run-metrics.ts +0 -165
- package/src/state/schedule.ts +0 -166
- package/src/state/session-state-map.ts +0 -51
- package/src/state/state-store.ts +0 -958
- package/src/state/task-claims.ts +0 -61
- package/src/state/tiered-eval.ts +0 -480
- package/src/state/types-eval.ts +0 -58
- package/src/state/types.ts +0 -440
- package/src/state/usage.ts +0 -138
- package/src/state/worker-atomic-writer.ts +0 -194
- package/src/subagents/async-entry.ts +0 -1
- package/src/subagents/index.ts +0 -3
- package/src/subagents/live/control.ts +0 -1
- package/src/subagents/live/manager.ts +0 -1
- package/src/subagents/live/realtime.ts +0 -1
- package/src/subagents/live/session-runtime.ts +0 -1
- package/src/subagents/manager.ts +0 -1
- package/src/subagents/spawn.ts +0 -1
- package/src/teams/discover-teams.ts +0 -187
- package/src/teams/team-config.ts +0 -27
- package/src/teams/team-serializer.ts +0 -38
- package/src/tools/safe-bash-extension.ts +0 -54
- package/src/tools/safe-bash.ts +0 -505
- package/src/types/diff.d.ts +0 -18
- package/src/types/new-api-types.ts +0 -35
- package/src/ui/agent-management-overlay.ts +0 -160
- package/src/ui/card-colors.ts +0 -139
- package/src/ui/crew-footer.ts +0 -102
- package/src/ui/crew-select-list.ts +0 -111
- package/src/ui/dashboard-panes/agents-pane.ts +0 -164
- package/src/ui/dashboard-panes/cancellation-pane.ts +0 -66
- package/src/ui/dashboard-panes/capability-pane.ts +0 -77
- package/src/ui/dashboard-panes/health-pane.ts +0 -31
- package/src/ui/dashboard-panes/mailbox-pane.ts +0 -35
- package/src/ui/dashboard-panes/metrics-pane.ts +0 -37
- package/src/ui/dashboard-panes/progress-pane.ts +0 -38
- package/src/ui/dashboard-panes/transcript-pane.ts +0 -10
- package/src/ui/deploy-bundled-themes.ts +0 -71
- package/src/ui/dwf-phase-display.ts +0 -151
- package/src/ui/dynamic-border.ts +0 -35
- package/src/ui/heartbeat-aggregator.ts +0 -74
- package/src/ui/key-utils.ts +0 -42
- package/src/ui/keybinding-map.ts +0 -248
- package/src/ui/layout-primitives.ts +0 -106
- package/src/ui/live-conversation-overlay.ts +0 -183
- package/src/ui/live-duration.ts +0 -55
- package/src/ui/live-run-sidebar.ts +0 -301
- package/src/ui/loaders.ts +0 -176
- package/src/ui/mascot.ts +0 -436
- package/src/ui/overlays/agent-picker-overlay.ts +0 -65
- package/src/ui/overlays/confirm-overlay.ts +0 -60
- package/src/ui/overlays/help-overlay.ts +0 -177
- package/src/ui/overlays/mailbox-compose-overlay.ts +0 -181
- package/src/ui/overlays/mailbox-compose-preview.ts +0 -78
- package/src/ui/overlays/mailbox-detail-overlay.ts +0 -154
- package/src/ui/pi-ui-compat.ts +0 -68
- package/src/ui/powerbar-publisher.ts +0 -459
- package/src/ui/render-coalescer.ts +0 -101
- package/src/ui/render-diff.ts +0 -160
- package/src/ui/render-scheduler.ts +0 -224
- package/src/ui/run-action-dispatcher.ts +0 -182
- package/src/ui/run-dashboard.ts +0 -913
- package/src/ui/run-event-bus.ts +0 -381
- package/src/ui/run-snapshot-cache.ts +0 -1057
- package/src/ui/settings-overlay.ts +0 -1067
- package/src/ui/snapshot-types.ts +0 -90
- package/src/ui/spinner.ts +0 -17
- package/src/ui/status-colors.ts +0 -143
- package/src/ui/syntax-highlight.ts +0 -136
- package/src/ui/terminal-status.ts +0 -269
- package/src/ui/theme-adapter.ts +0 -271
- package/src/ui/theme-discovery.ts +0 -199
- package/src/ui/tool-progress-formatter.ts +0 -93
- package/src/ui/tool-render.ts +0 -453
- package/src/ui/tool-renderers/brief-mode.ts +0 -225
- package/src/ui/tool-renderers/index.ts +0 -726
- package/src/ui/transcript-cache.ts +0 -128
- package/src/ui/transcript-entries.ts +0 -256
- package/src/ui/transcript-viewer.ts +0 -424
- package/src/ui/widget/index.ts +0 -357
- package/src/ui/widget/widget-formatters.ts +0 -182
- package/src/ui/widget/widget-model.ts +0 -110
- package/src/ui/widget/widget-renderer.ts +0 -182
- package/src/ui/widget/widget-types.ts +0 -36
- package/src/utils/bm25-search.ts +0 -235
- package/src/utils/completion-dedupe.ts +0 -63
- package/src/utils/conflict-detect.ts +0 -668
- package/src/utils/env-allowlist.ts +0 -30
- package/src/utils/env-filter.ts +0 -155
- package/src/utils/file-coalescer.ts +0 -98
- package/src/utils/fingerprint.ts +0 -180
- package/src/utils/frontmatter.ts +0 -70
- package/src/utils/fs-watch.ts +0 -37
- package/src/utils/gh-protocol.ts +0 -556
- package/src/utils/git.ts +0 -260
- package/src/utils/guards.ts +0 -107
- package/src/utils/ids.ts +0 -24
- package/src/utils/incremental-reader.ts +0 -220
- package/src/utils/internal-error.ts +0 -10
- package/src/utils/names.ts +0 -36
- package/src/utils/ndjson.ts +0 -115
- package/src/utils/paths.ts +0 -227
- package/src/utils/project-detector.ts +0 -160
- package/src/utils/redaction.ts +0 -347
- package/src/utils/resolve-shell.ts +0 -36
- package/src/utils/run-watcher-registry.ts +0 -152
- package/src/utils/safe-paths.ts +0 -383
- package/src/utils/scan-cache.ts +0 -144
- package/src/utils/session-utils.ts +0 -110
- package/src/utils/sleep.ts +0 -54
- package/src/utils/socket-path.ts +0 -127
- package/src/utils/sse-parser.ts +0 -129
- package/src/utils/task-name-generator.ts +0 -337
- package/src/utils/timings.ts +0 -33
- package/src/utils/token-counter.ts +0 -200
- package/src/utils/visual.ts +0 -207
- package/src/workflows/cost-estimator.ts +0 -34
- package/src/workflows/discover-workflows.ts +0 -290
- package/src/workflows/intermediate-store.ts +0 -166
- package/src/workflows/preflight-validator.ts +0 -168
- package/src/workflows/topology-analyzer.ts +0 -203
- package/src/workflows/validate-workflow.ts +0 -50
- package/src/workflows/workflow-config.ts +0 -70
- package/src/workflows/workflow-serializer.ts +0 -32
- package/src/worktree/branch-freshness.ts +0 -112
- package/src/worktree/cleanup.ts +0 -341
- package/src/worktree/worktree-manager.ts +0 -1200
|
@@ -1,456 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI, ToolDefinition } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { Type } from "@sinclair/typebox";
|
|
3
|
-
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
4
|
-
import { withSessionId } from "../team-tool/context.ts";
|
|
5
|
-
// Lazy-loaded: team-tool.ts pulls in entire runtime chain.
|
|
6
|
-
import type { handleTeamTool as HandleTeamToolFn } from "../team-tool.ts";
|
|
7
|
-
|
|
8
|
-
let _cachedHandleTeamTool: typeof HandleTeamToolFn | undefined;
|
|
9
|
-
async function handleTeamTool(
|
|
10
|
-
params: Parameters<typeof HandleTeamToolFn>[0],
|
|
11
|
-
ctx: Parameters<typeof HandleTeamToolFn>[1],
|
|
12
|
-
): Promise<Awaited<ReturnType<typeof HandleTeamToolFn>>> {
|
|
13
|
-
if (!_cachedHandleTeamTool) {
|
|
14
|
-
// LAZY: team-tool.ts pulls in entire runtime chain.
|
|
15
|
-
const mod = await import("../team-tool.ts");
|
|
16
|
-
_cachedHandleTeamTool = mod.handleTeamTool;
|
|
17
|
-
}
|
|
18
|
-
return _cachedHandleTeamTool(params, ctx);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
import { Text } from "@earendil-works/pi-tui";
|
|
22
|
-
import { loadConfig } from "../../config/config.ts";
|
|
23
|
-
import { t } from "../../i18n.ts";
|
|
24
|
-
import type { BatchBarrier } from "../../runtime/batch-barrier.ts";
|
|
25
|
-
import { readCrewAgents } from "../../runtime/crew-agent-records.ts";
|
|
26
|
-
import { checkSubagentSpawnPermission, currentCrewRole } from "../../runtime/role-permission.ts";
|
|
27
|
-
import { loadRunManifestById } from "../../state/state-store.ts";
|
|
28
|
-
import {
|
|
29
|
-
readPersistedSubagentRecord,
|
|
30
|
-
type SubagentManager,
|
|
31
|
-
type SubagentSpawnOptions,
|
|
32
|
-
savePersistedSubagentRecord,
|
|
33
|
-
} from "../../subagents/manager.ts";
|
|
34
|
-
import { formatCompactToolProgress } from "../../ui/tool-progress-formatter.ts";
|
|
35
|
-
import { agentToolRenderer } from "../../ui/tool-renderers/index.ts";
|
|
36
|
-
import { logInternalError } from "../../utils/internal-error.ts";
|
|
37
|
-
import {
|
|
38
|
-
__test__subagentSpawnParams,
|
|
39
|
-
formatSubagentRecord,
|
|
40
|
-
readSubagentRunResult,
|
|
41
|
-
refreshPersistedSubagentRecord,
|
|
42
|
-
subagentToolResult,
|
|
43
|
-
} from "./subagent-helpers.ts";
|
|
44
|
-
|
|
45
|
-
const TOOL_PROGRESS_TICK_MS = 1000;
|
|
46
|
-
|
|
47
|
-
type OnUpdate = (chunk: { content: { type: "text"; text: string }[] }) => void;
|
|
48
|
-
|
|
49
|
-
export interface SubagentToolRegistrationOptions {
|
|
50
|
-
ownerSessionGeneration?: () => number;
|
|
51
|
-
startForegroundRun?: (ctx: unknown, runner: (signal?: AbortSignal) => Promise<void>, runId?: string) => void;
|
|
52
|
-
/** Rule 1 batch barrier. When present, agents spawned with a batchId are
|
|
53
|
-
* registered here so their completion notifications are coalesced. */
|
|
54
|
-
batchBarrier?: BatchBarrier;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function registerSubagentTools(
|
|
58
|
-
pi: ExtensionAPI,
|
|
59
|
-
subagentManager: SubagentManager,
|
|
60
|
-
options: SubagentToolRegistrationOptions = {},
|
|
61
|
-
): void {
|
|
62
|
-
const agentTool: ToolDefinition = {
|
|
63
|
-
name: "Agent",
|
|
64
|
-
label: "Agent",
|
|
65
|
-
description:
|
|
66
|
-
"Launch a real pi-crew subagent. Uses pi-crew's durable child-process runtime by default; set run_in_background=true for parallel/background work, then use get_subagent_result.",
|
|
67
|
-
promptSnippet:
|
|
68
|
-
"Use Agent to delegate focused work to a real pi-crew subagent. Use run_in_background=true for parallel work and get_subagent_result to join results.",
|
|
69
|
-
promptGuidelines: [
|
|
70
|
-
"Use Agent for independent exploration, review, verification, or implementation subtasks instead of doing all work in the parent turn.",
|
|
71
|
-
"For parallel work, launch multiple Agent calls with run_in_background=true, then call get_subagent_result for each result.",
|
|
72
|
-
"Available pi-crew subagent types include explorer, planner, analyst, executor, reviewer, verifier, writer, security-reviewer, and test-engineer.",
|
|
73
|
-
],
|
|
74
|
-
parameters: Type.Object({
|
|
75
|
-
prompt: Type.String({
|
|
76
|
-
description: "The task for the subagent to perform.",
|
|
77
|
-
}),
|
|
78
|
-
description: Type.String({
|
|
79
|
-
description: "Short 3-5 word task description.",
|
|
80
|
-
}),
|
|
81
|
-
subagent_type: Type.String({
|
|
82
|
-
description:
|
|
83
|
-
"pi-crew agent name, e.g. explorer, planner, executor, reviewer, verifier, writer, security-reviewer, test-engineer.",
|
|
84
|
-
}),
|
|
85
|
-
model: Type.Optional(
|
|
86
|
-
Type.String({
|
|
87
|
-
description: "Optional model override. If omitted, pi-crew uses Pi-configured model fallback.",
|
|
88
|
-
}),
|
|
89
|
-
),
|
|
90
|
-
skill: Type.Optional(
|
|
91
|
-
Type.Union([Type.String(), Type.Array(Type.String()), Type.Boolean()], {
|
|
92
|
-
description: "Skill name(s) to inject for this subagent, or false to disable selected/default skills.",
|
|
93
|
-
}),
|
|
94
|
-
),
|
|
95
|
-
max_turns: Type.Optional(
|
|
96
|
-
Type.Number({
|
|
97
|
-
description: "Reserved for live-session subagents; child-process runtime may ignore this.",
|
|
98
|
-
}),
|
|
99
|
-
),
|
|
100
|
-
run_in_background: Type.Optional(
|
|
101
|
-
Type.Boolean({
|
|
102
|
-
description: "Run in background and return an agent ID immediately.",
|
|
103
|
-
}),
|
|
104
|
-
),
|
|
105
|
-
batch_id: Type.Optional(
|
|
106
|
-
Type.String({
|
|
107
|
-
description:
|
|
108
|
-
"Optional batch grouping id. Background agents sharing the same batch_id receive ONE consolidated completion notification when ALL members finish (instead of N individual notifications). Use this when launching several background agents in one turn and you do not join them immediately. Omit for the default individual-notification behavior.",
|
|
109
|
-
}),
|
|
110
|
-
),
|
|
111
|
-
}) as never,
|
|
112
|
-
async execute(_id, params, signal, onUpdate, ctx) {
|
|
113
|
-
// Diagnostic: detect pre-aborted signal before spawn
|
|
114
|
-
if (signal?.aborted) {
|
|
115
|
-
logInternalError(
|
|
116
|
-
"subagent-tools.pre-aborted-signal",
|
|
117
|
-
undefined,
|
|
118
|
-
`aborted=true paramsKeys=${Object.keys(params as object).join(",")}`,
|
|
119
|
-
);
|
|
120
|
-
return subagentToolResult(
|
|
121
|
-
"Agent tool signal was already aborted before execution started. This usually means Pi cancelled the tool call before it ran.",
|
|
122
|
-
{ action: "agent", status: "error" },
|
|
123
|
-
true,
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
const currentRole = currentCrewRole();
|
|
127
|
-
const permission = checkSubagentSpawnPermission(currentRole);
|
|
128
|
-
if (!permission.allowed)
|
|
129
|
-
return subagentToolResult(
|
|
130
|
-
permission.reason ?? "Current role cannot spawn subagents.",
|
|
131
|
-
{ role: currentRole, mode: permission.mode },
|
|
132
|
-
true,
|
|
133
|
-
);
|
|
134
|
-
const spawnOptions = __test__subagentSpawnParams(params as Record<string, unknown>, ctx);
|
|
135
|
-
spawnOptions.ownerSessionGeneration = options.ownerSessionGeneration?.();
|
|
136
|
-
if (!spawnOptions.prompt.trim()) return subagentToolResult(t("agent.requiresPrompt"), {}, true);
|
|
137
|
-
// Extract sessionId from sessionManager.getSessionId() so team runs created
|
|
138
|
-
// by the Agent tool have proper session ownership for isolation.
|
|
139
|
-
const ctxWithSession = withSessionId(ctx);
|
|
140
|
-
const runner = async (currentOptions: SubagentSpawnOptions, childSignal?: AbortSignal) =>
|
|
141
|
-
handleTeamTool(
|
|
142
|
-
{
|
|
143
|
-
action: "run",
|
|
144
|
-
agent: currentOptions.type,
|
|
145
|
-
goal: currentOptions.prompt,
|
|
146
|
-
model: currentOptions.model,
|
|
147
|
-
skill: currentOptions.skill,
|
|
148
|
-
async: currentOptions.background,
|
|
149
|
-
config: currentOptions.maxTurns ? { runtime: { maxTurns: currentOptions.maxTurns } } : undefined,
|
|
150
|
-
} as TeamToolParamsValue,
|
|
151
|
-
{
|
|
152
|
-
...ctxWithSession,
|
|
153
|
-
signal: childSignal,
|
|
154
|
-
...(options.startForegroundRun
|
|
155
|
-
? {
|
|
156
|
-
startForegroundRun: (runRunner: (sig?: AbortSignal) => Promise<void>, runId?: string) =>
|
|
157
|
-
options.startForegroundRun!(ctxWithSession, runRunner, runId),
|
|
158
|
-
}
|
|
159
|
-
: {}),
|
|
160
|
-
},
|
|
161
|
-
);
|
|
162
|
-
const record = subagentManager.spawn(spawnOptions, runner, spawnOptions.background ? undefined : signal);
|
|
163
|
-
// Rule 1: register batch membership so completions can be coalesced.
|
|
164
|
-
if (spawnOptions.batchId && spawnOptions.background) {
|
|
165
|
-
options.batchBarrier?.register(spawnOptions.batchId, record.id, { description: record.description, type: record.type });
|
|
166
|
-
}
|
|
167
|
-
if (spawnOptions.background || record.status === "queued") {
|
|
168
|
-
// Phase 1.1a: Terminate turn for background queued — no LLM follow-up needed.
|
|
169
|
-
// Phase 1.6: Record was terminated for telemetry.
|
|
170
|
-
record.terminated = true;
|
|
171
|
-
savePersistedSubagentRecord(ctx.cwd, record);
|
|
172
|
-
return {
|
|
173
|
-
...subagentToolResult(
|
|
174
|
-
[
|
|
175
|
-
t("agent.started", {
|
|
176
|
-
state: record.status === "queued" ? "queued" : "started",
|
|
177
|
-
}),
|
|
178
|
-
t("agent.id", { id: record.id }),
|
|
179
|
-
t("agent.type", { type: record.type }),
|
|
180
|
-
t("agent.description", {
|
|
181
|
-
description: record.description,
|
|
182
|
-
}),
|
|
183
|
-
t("agent.retrieveHint"),
|
|
184
|
-
].join("\n"),
|
|
185
|
-
{ agentId: record.id, status: record.status },
|
|
186
|
-
),
|
|
187
|
-
terminate: true,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
const stopProgress = startAgentToolProgress(ctx.cwd, record.id, onUpdate as OnUpdate | undefined, subagentManager);
|
|
191
|
-
try {
|
|
192
|
-
await record.promise;
|
|
193
|
-
} finally {
|
|
194
|
-
stopProgress();
|
|
195
|
-
}
|
|
196
|
-
// Diagnostic: log when foreground subagent ends in "stopped" to surface the abort reason
|
|
197
|
-
if (record.status === "stopped") {
|
|
198
|
-
logInternalError(
|
|
199
|
-
"subagent-tools.foreground-stopped",
|
|
200
|
-
undefined,
|
|
201
|
-
`agentId=${record.id} runId=${record.runId ?? ""} error=${record.error ?? "(none)"} result=${(record.result ?? "").slice(0, 200)}`,
|
|
202
|
-
);
|
|
203
|
-
}
|
|
204
|
-
const output = readSubagentRunResult(ctx, record) ?? record.result ?? record.error ?? t("agent.noOutput");
|
|
205
|
-
const foregroundResult = subagentToolResult(
|
|
206
|
-
[
|
|
207
|
-
t("agent.foregroundStatus", {
|
|
208
|
-
id: record.id,
|
|
209
|
-
status: record.status,
|
|
210
|
-
}),
|
|
211
|
-
"",
|
|
212
|
-
output,
|
|
213
|
-
].join("\n"),
|
|
214
|
-
{
|
|
215
|
-
agentId: record.id,
|
|
216
|
-
runId: record.runId,
|
|
217
|
-
status: record.status,
|
|
218
|
-
},
|
|
219
|
-
record.status === "failed" || record.status === "error" || record.status === "stopped",
|
|
220
|
-
);
|
|
221
|
-
if (loadConfig(ctx.cwd).config.tools?.terminateOnForeground === true) {
|
|
222
|
-
record.terminated = true;
|
|
223
|
-
savePersistedSubagentRecord(ctx.cwd, record);
|
|
224
|
-
return { ...foregroundResult, terminate: true };
|
|
225
|
-
}
|
|
226
|
-
return foregroundResult;
|
|
227
|
-
},
|
|
228
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
229
|
-
renderCall(args: any, theme: any, context: any): any {
|
|
230
|
-
return agentToolRenderer.renderCall(args, theme, context);
|
|
231
|
-
},
|
|
232
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
233
|
-
renderResult(result: any, options: any, theme: any, context: any): any {
|
|
234
|
-
try {
|
|
235
|
-
return agentToolRenderer.renderResult(result, options, theme, context);
|
|
236
|
-
} catch (e: any) {
|
|
237
|
-
return new Text("agent-err: " + (e?.message ?? "unknown"), 0, 0);
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
const getSubagentResultTool: ToolDefinition = {
|
|
243
|
-
name: "get_subagent_result",
|
|
244
|
-
label: "Get Agent Result",
|
|
245
|
-
description: "Check status and retrieve results from a pi-crew background subagent.",
|
|
246
|
-
parameters: Type.Object({
|
|
247
|
-
agent_id: Type.String({
|
|
248
|
-
description: "Agent ID returned by Agent.",
|
|
249
|
-
}),
|
|
250
|
-
wait: Type.Optional(
|
|
251
|
-
Type.Boolean({
|
|
252
|
-
description: "Wait for completion before returning.",
|
|
253
|
-
}),
|
|
254
|
-
),
|
|
255
|
-
verbose: Type.Optional(
|
|
256
|
-
Type.Boolean({
|
|
257
|
-
description: "Include status metadata before output.",
|
|
258
|
-
}),
|
|
259
|
-
),
|
|
260
|
-
}) as never,
|
|
261
|
-
async execute(_id, params, signal, _onUpdate, ctx) {
|
|
262
|
-
const p = params as {
|
|
263
|
-
agent_id?: string;
|
|
264
|
-
wait?: boolean;
|
|
265
|
-
verbose?: boolean;
|
|
266
|
-
};
|
|
267
|
-
if (!p.agent_id) return subagentToolResult(t("result.requiresAgentId"), {}, true);
|
|
268
|
-
const inMemory = subagentManager.getRecord(p.agent_id);
|
|
269
|
-
const record = inMemory ?? readPersistedSubagentRecord(ctx.cwd, p.agent_id);
|
|
270
|
-
if (!record) return subagentToolResult(t("result.notFound", { id: p.agent_id }), {}, true);
|
|
271
|
-
let current = refreshPersistedSubagentRecord(ctx, record);
|
|
272
|
-
if (inMemory && current !== inMemory) Object.assign(inMemory, current);
|
|
273
|
-
if (!inMemory && !current.runId && (current.status === "running" || current.status === "queued")) {
|
|
274
|
-
current = {
|
|
275
|
-
...current,
|
|
276
|
-
status: "error",
|
|
277
|
-
error: t("result.unrecoverable"),
|
|
278
|
-
completedAt: current.completedAt ?? Date.now(),
|
|
279
|
-
};
|
|
280
|
-
savePersistedSubagentRecord(ctx.cwd, current);
|
|
281
|
-
}
|
|
282
|
-
if (p.wait && (current.status === "running" || current.status === "queued")) {
|
|
283
|
-
const waited = await subagentManager.waitForRecord(current.id);
|
|
284
|
-
if (waited) current = waited;
|
|
285
|
-
if (current.status === "blocked") {
|
|
286
|
-
current.resultConsumed = false;
|
|
287
|
-
if (inMemory) inMemory.resultConsumed = false;
|
|
288
|
-
savePersistedSubagentRecord(ctx.cwd, current);
|
|
289
|
-
} else {
|
|
290
|
-
const waitStartMs = Date.now();
|
|
291
|
-
const maxWaitMs = 300_000; // 5 minutes
|
|
292
|
-
while (current.status === "running" || current.status === "queued") {
|
|
293
|
-
if (signal?.aborted) {
|
|
294
|
-
current = {
|
|
295
|
-
...current,
|
|
296
|
-
status: "error",
|
|
297
|
-
error: t("result.waitAborted"),
|
|
298
|
-
completedAt: Date.now(),
|
|
299
|
-
};
|
|
300
|
-
savePersistedSubagentRecord(ctx.cwd, current);
|
|
301
|
-
break;
|
|
302
|
-
}
|
|
303
|
-
if (Date.now() - waitStartMs > maxWaitMs) {
|
|
304
|
-
current = {
|
|
305
|
-
...current,
|
|
306
|
-
status: "error",
|
|
307
|
-
error: t("result.waitTimeout"),
|
|
308
|
-
completedAt: Date.now(),
|
|
309
|
-
};
|
|
310
|
-
savePersistedSubagentRecord(ctx.cwd, current);
|
|
311
|
-
break;
|
|
312
|
-
}
|
|
313
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
314
|
-
current = refreshPersistedSubagentRecord(ctx, current);
|
|
315
|
-
if (!current.runId) break;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
const output = readSubagentRunResult(ctx, current);
|
|
320
|
-
if (current.status !== "running" && current.status !== "queued" && current.status !== "blocked") {
|
|
321
|
-
current.resultConsumed = true;
|
|
322
|
-
if (inMemory) inMemory.resultConsumed = true;
|
|
323
|
-
savePersistedSubagentRecord(ctx.cwd, current);
|
|
324
|
-
}
|
|
325
|
-
const text = [
|
|
326
|
-
p.verbose ? formatSubagentRecord(current) : undefined,
|
|
327
|
-
output
|
|
328
|
-
? `${p.verbose ? "\n" : ""}${output}`
|
|
329
|
-
: current.status === "running" || current.status === "queued"
|
|
330
|
-
? t("result.stillRunning")
|
|
331
|
-
: (current.error ?? t("agent.noOutput")),
|
|
332
|
-
]
|
|
333
|
-
.filter((line): line is string => Boolean(line))
|
|
334
|
-
.join("\n");
|
|
335
|
-
return subagentToolResult(
|
|
336
|
-
text,
|
|
337
|
-
{
|
|
338
|
-
agentId: current.id,
|
|
339
|
-
runId: current.runId,
|
|
340
|
-
status: current.status,
|
|
341
|
-
},
|
|
342
|
-
current.status === "failed" || current.status === "error",
|
|
343
|
-
);
|
|
344
|
-
},
|
|
345
|
-
};
|
|
346
|
-
|
|
347
|
-
const steerSubagentTool: ToolDefinition = {
|
|
348
|
-
name: "steer_subagent",
|
|
349
|
-
label: "Steer Agent",
|
|
350
|
-
description:
|
|
351
|
-
"Send a steering note to a running pi-crew subagent. Live-session steering is planned; child-process runs expose durable status and can be cancelled if needed.",
|
|
352
|
-
parameters: Type.Object({
|
|
353
|
-
agent_id: Type.String(),
|
|
354
|
-
message: Type.String(),
|
|
355
|
-
}) as never,
|
|
356
|
-
async execute(_id, params, _signal, _onUpdate, ctx) {
|
|
357
|
-
const p = params as { agent_id?: string; message?: string };
|
|
358
|
-
const record = p.agent_id
|
|
359
|
-
? (subagentManager.getRecord(p.agent_id) ?? readPersistedSubagentRecord(ctx.cwd, p.agent_id))
|
|
360
|
-
: undefined;
|
|
361
|
-
if (!record) return subagentToolResult(t("result.notFound", { id: p.agent_id ?? "" }), {}, true);
|
|
362
|
-
return subagentToolResult(
|
|
363
|
-
[
|
|
364
|
-
t("steer.noted", { id: record.id }),
|
|
365
|
-
t("steer.unavailable"),
|
|
366
|
-
record.runId ? t("steer.cancelHint", { runId: record.runId }) : undefined,
|
|
367
|
-
]
|
|
368
|
-
.filter((line): line is string => Boolean(line))
|
|
369
|
-
.join("\n"),
|
|
370
|
-
{
|
|
371
|
-
agentId: record.id,
|
|
372
|
-
runId: record.runId,
|
|
373
|
-
status: record.status,
|
|
374
|
-
},
|
|
375
|
-
);
|
|
376
|
-
},
|
|
377
|
-
};
|
|
378
|
-
|
|
379
|
-
const crewAgentTool: ToolDefinition = {
|
|
380
|
-
...agentTool,
|
|
381
|
-
name: "crew_agent",
|
|
382
|
-
label: "Crew Agent",
|
|
383
|
-
description: "Launch a real pi-crew subagent using a conflict-safe pi-crew-specific tool name.",
|
|
384
|
-
promptSnippet: "Use crew_agent when you need pi-crew subagents and another extension may own the generic Agent tool.",
|
|
385
|
-
};
|
|
386
|
-
const crewAgentResultTool: ToolDefinition = {
|
|
387
|
-
...getSubagentResultTool,
|
|
388
|
-
name: "crew_agent_result",
|
|
389
|
-
label: "Get Crew Agent Result",
|
|
390
|
-
description: "Check status and retrieve results from a pi-crew subagent using the conflict-safe tool name.",
|
|
391
|
-
};
|
|
392
|
-
const crewAgentSteerTool: ToolDefinition = {
|
|
393
|
-
...steerSubagentTool,
|
|
394
|
-
name: "crew_agent_steer",
|
|
395
|
-
label: "Steer Crew Agent",
|
|
396
|
-
description: "Send a steering note to a pi-crew subagent using the conflict-safe tool name.",
|
|
397
|
-
};
|
|
398
|
-
const toolConfig = loadConfig(process.cwd()).config.tools;
|
|
399
|
-
const enableSteer = toolConfig?.enableSteer !== false;
|
|
400
|
-
const enableClaudeStyleAliases = toolConfig?.enableClaudeStyleAliases !== false;
|
|
401
|
-
|
|
402
|
-
for (const extraTool of enableSteer ? [crewAgentTool, crewAgentResultTool, crewAgentSteerTool] : [crewAgentTool, crewAgentResultTool])
|
|
403
|
-
pi.registerTool(extraTool);
|
|
404
|
-
if (enableClaudeStyleAliases) {
|
|
405
|
-
for (const extraTool of enableSteer ? [agentTool, getSubagentResultTool, steerSubagentTool] : [agentTool, getSubagentResultTool]) {
|
|
406
|
-
try {
|
|
407
|
-
pi.registerTool(extraTool);
|
|
408
|
-
} catch (error) {
|
|
409
|
-
logInternalError("register.duplicate-tool", error, `tool=${extraTool.name}`);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
function startAgentToolProgress(cwd: string, agentRecordId: string, onUpdate: OnUpdate | undefined, manager: SubagentManager): () => void {
|
|
416
|
-
if (!onUpdate) return () => {};
|
|
417
|
-
const startedAt = Date.now();
|
|
418
|
-
const tick = (): void => {
|
|
419
|
-
try {
|
|
420
|
-
const record = manager.getRecord(agentRecordId);
|
|
421
|
-
if (!record) return;
|
|
422
|
-
let manifest;
|
|
423
|
-
let tasks;
|
|
424
|
-
let agents;
|
|
425
|
-
if (record.runId) {
|
|
426
|
-
const loaded = loadRunManifestById(cwd, record.runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
|
|
427
|
-
if (loaded) {
|
|
428
|
-
manifest = loaded.manifest;
|
|
429
|
-
tasks = loaded.tasks;
|
|
430
|
-
try {
|
|
431
|
-
agents = readCrewAgents(loaded.manifest);
|
|
432
|
-
} catch {
|
|
433
|
-
/* ignore */
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
const text = formatCompactToolProgress({
|
|
438
|
-
agentId: record.id,
|
|
439
|
-
status: record.status,
|
|
440
|
-
runId: record.runId,
|
|
441
|
-
startedAt: record.startedAt ?? startedAt,
|
|
442
|
-
manifest,
|
|
443
|
-
tasks,
|
|
444
|
-
agents,
|
|
445
|
-
error: record.error,
|
|
446
|
-
});
|
|
447
|
-
onUpdate({ content: [{ type: "text", text }] });
|
|
448
|
-
} catch (error) {
|
|
449
|
-
logInternalError("subagent-tools.progress", error, `agentId=${agentRecordId}`);
|
|
450
|
-
}
|
|
451
|
-
};
|
|
452
|
-
tick();
|
|
453
|
-
const timer = setInterval(tick, TOOL_PROGRESS_TICK_MS);
|
|
454
|
-
if (typeof timer.unref === "function") timer.unref();
|
|
455
|
-
return () => clearInterval(timer);
|
|
456
|
-
}
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import { statSync } from "node:fs";
|
|
2
|
-
import type { ExtensionAPI, ExtensionContext, ToolDefinition } from "@earendil-works/pi-coding-agent";
|
|
3
|
-
import { Text } from "@earendil-works/pi-tui";
|
|
4
|
-
import { loadConfig } from "../../config/config.ts";
|
|
5
|
-
import type { MetricRegistry } from "../../observability/metric-registry.ts";
|
|
6
|
-
import type { createManifestCache } from "../../runtime/manifest-cache.ts";
|
|
7
|
-
import { TeamToolParams, type TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
8
|
-
import { updatePiCrewPowerbar } from "../../ui/powerbar-publisher.ts";
|
|
9
|
-
import type { createRunSnapshotCache } from "../../ui/run-snapshot-cache.ts";
|
|
10
|
-
import { statusIcon, teamToolRenderer } from "../../ui/tool-renderers/index.ts";
|
|
11
|
-
import type { CrewWidgetState } from "../../ui/widget/index.ts";
|
|
12
|
-
import { updateCrewWidget } from "../../ui/widget/index.ts";
|
|
13
|
-
import { resolveRealContainedPath } from "../../utils/safe-paths.ts";
|
|
14
|
-
// Team tool handler — lazy-loaded because team-tool.ts imports many modules
|
|
15
|
-
import type { handleTeamTool as HandleTeamToolFn } from "../team-tool.ts";
|
|
16
|
-
|
|
17
|
-
let _cachedHandleTeamTool: typeof HandleTeamToolFn | undefined;
|
|
18
|
-
async function handleTeamTool(
|
|
19
|
-
params: Parameters<typeof HandleTeamToolFn>[0],
|
|
20
|
-
ctx: Parameters<typeof HandleTeamToolFn>[1],
|
|
21
|
-
): Promise<ReturnType<typeof HandleTeamToolFn>> {
|
|
22
|
-
if (!_cachedHandleTeamTool) {
|
|
23
|
-
// LAZY: team-tool.ts imports many modules — defer until first use.
|
|
24
|
-
const mod = await import("../team-tool.ts");
|
|
25
|
-
_cachedHandleTeamTool = mod.handleTeamTool;
|
|
26
|
-
}
|
|
27
|
-
return _cachedHandleTeamTool(params, ctx);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
import { readCrewAgents } from "../../runtime/crew-agent-records.ts";
|
|
31
|
-
import { loadRunManifestById } from "../../state/state-store.ts";
|
|
32
|
-
import { formatCompactToolProgress } from "../../ui/tool-progress-formatter.ts";
|
|
33
|
-
import { logInternalError } from "../../utils/internal-error.ts";
|
|
34
|
-
import { withSessionId } from "../team-tool/context.ts";
|
|
35
|
-
import { toolResult } from "../tool-result.ts";
|
|
36
|
-
|
|
37
|
-
const TEAM_TOOL_PROGRESS_TICK_MS = 1000;
|
|
38
|
-
|
|
39
|
-
type OnUpdate = (chunk: { content: { type: "text"; text: string }[] }) => void;
|
|
40
|
-
|
|
41
|
-
export interface RegisterTeamToolDeps {
|
|
42
|
-
foregroundControllers: Map<string | symbol, AbortController>;
|
|
43
|
-
startForegroundRun: (ctx: ExtensionContext, runner: (signal?: AbortSignal) => Promise<void>, runId?: string) => void;
|
|
44
|
-
abortForegroundRun: (runId: string) => boolean;
|
|
45
|
-
openLiveSidebar: (ctx: ExtensionContext, runId: string) => void;
|
|
46
|
-
getManifestCache: (cwd: string) => ReturnType<typeof createManifestCache>;
|
|
47
|
-
getRunSnapshotCache?: (cwd: string) => ReturnType<typeof createRunSnapshotCache>;
|
|
48
|
-
getMetricRegistry?: () => MetricRegistry | undefined;
|
|
49
|
-
widgetState: CrewWidgetState;
|
|
50
|
-
onJsonEvent?: (taskId: string, runId: string, event: unknown) => void;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function resolveCwdOverride(
|
|
54
|
-
baseCwd: string,
|
|
55
|
-
override: string | undefined,
|
|
56
|
-
): { ok: true; cwd: string } | { ok: false; error: string } {
|
|
57
|
-
if (!override) return { ok: true, cwd: baseCwd };
|
|
58
|
-
try {
|
|
59
|
-
const resolved = resolveRealContainedPath(baseCwd, override);
|
|
60
|
-
const stat = statSync(resolved);
|
|
61
|
-
if (!stat.isDirectory())
|
|
62
|
-
return {
|
|
63
|
-
ok: false,
|
|
64
|
-
error: `cwd override is not a directory: ${resolved}`,
|
|
65
|
-
};
|
|
66
|
-
return { ok: true, cwd: resolved };
|
|
67
|
-
} catch (error) {
|
|
68
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
69
|
-
return { ok: false, error: `Invalid cwd override: ${message}` };
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function registerTeamTool(pi: ExtensionAPI, deps: RegisterTeamToolDeps): void {
|
|
74
|
-
const tool: ToolDefinition = {
|
|
75
|
-
name: "team",
|
|
76
|
-
label: "Team",
|
|
77
|
-
description: [
|
|
78
|
-
"Coordinate Pi teams. Use proactively for complex multi-file work, planning, implementation, tests, reviews, security audits, research, async/background runs, and worktree-isolated execution. Use action='recommend' when unsure which team/workflow to choose. Destructive actions require explicit user confirmation.",
|
|
79
|
-
"",
|
|
80
|
-
"ℹ️ ADVISORY NOTE (preflight, never blocks): pi-crew prints informational notes about workflow topology. Review the note, then decide. There is no BLOCK — agents always exercise judgment.",
|
|
81
|
-
"- Single-task run: raw `Agent` tool would be ~30× faster and ~5× cheaper. pi-crew notes this and proceeds anyway.",
|
|
82
|
-
"- 2–3 step sequential run: measured 5.7× slower than raw `Agent` calls in Run #3. pi-crew notes this and proceeds anyway.",
|
|
83
|
-
"- ≥3 concurrent or complex DAG: validated good use case, pi-crew notes 'validated use case'.",
|
|
84
|
-
"If unsure, call { action: 'recommend', goal } first to get a team/workflow suggestion.",
|
|
85
|
-
].join("\n"),
|
|
86
|
-
promptSnippet: [
|
|
87
|
-
"Use the team tool for multi-agent orchestration when you need ≥3 concurrent agents or a complex DAG.",
|
|
88
|
-
"For single tasks or 2–3 sequential steps, the raw Agent tool is usually faster (raw calls = ~5× faster for 3-step chains).",
|
|
89
|
-
"pi-crew notes the topology (informational only) but proceeds either way — you decide based on your context (audit trail, team coordination, etc.).",
|
|
90
|
-
"If unsure, call { action: 'recommend', goal } first.",
|
|
91
|
-
].join("\n"),
|
|
92
|
-
parameters: TeamToolParams as never,
|
|
93
|
-
async execute(_id, params, signal, onUpdate, ctx) {
|
|
94
|
-
const controller = new AbortController();
|
|
95
|
-
const toolKey = Symbol();
|
|
96
|
-
deps.foregroundControllers.set(toolKey, controller);
|
|
97
|
-
const abort = (): void => controller.abort();
|
|
98
|
-
signal?.addEventListener("abort", abort, { once: true });
|
|
99
|
-
const stopProgress = startTeamToolProgressBinder(onUpdate as OnUpdate | undefined);
|
|
100
|
-
try {
|
|
101
|
-
const resolved = params as TeamToolParamsValue;
|
|
102
|
-
const cwdOverride = resolveCwdOverride(ctx.cwd, resolved.cwd);
|
|
103
|
-
if (!cwdOverride.ok) return toolResult(cwdOverride.error, { action: resolved.action ?? "list", status: "error" }, true);
|
|
104
|
-
const toolCtx = withSessionId({ ...ctx, cwd: cwdOverride.cwd });
|
|
105
|
-
// Phase 1.5: Auto-set session name from team run context
|
|
106
|
-
if (resolved.action === "run" && resolved.goal && !pi.getSessionName()) {
|
|
107
|
-
const runLabel = resolved.team ?? resolved.agent ?? "direct";
|
|
108
|
-
pi.setSessionName(`pi-crew: ${runLabel}/${resolved.workflow ?? "default"} — ${resolved.goal.slice(0, 60)}`);
|
|
109
|
-
}
|
|
110
|
-
const output = await handleTeamTool(resolved, {
|
|
111
|
-
...toolCtx,
|
|
112
|
-
signal: controller.signal,
|
|
113
|
-
metricRegistry: deps.getMetricRegistry?.(),
|
|
114
|
-
startForegroundRun: (runner, runId) => deps.startForegroundRun(toolCtx, runner, runId),
|
|
115
|
-
abortForegroundRun: deps.abortForegroundRun,
|
|
116
|
-
onRunStarted: (runId) => {
|
|
117
|
-
stopProgress.attach(toolCtx.cwd, runId);
|
|
118
|
-
deps.openLiveSidebar(toolCtx, runId);
|
|
119
|
-
},
|
|
120
|
-
onJsonEvent: deps.onJsonEvent,
|
|
121
|
-
getRunSnapshotCache: deps.getRunSnapshotCache,
|
|
122
|
-
});
|
|
123
|
-
if (resolved.action === "run" && !output.isError && typeof output.details?.runId === "string") {
|
|
124
|
-
pi.appendEntry("crew:run-started", {
|
|
125
|
-
runId: output.details.runId,
|
|
126
|
-
team: resolved.team,
|
|
127
|
-
workflow: resolved.workflow,
|
|
128
|
-
agent: resolved.agent,
|
|
129
|
-
goal: resolved.goal,
|
|
130
|
-
status: output.details?.status,
|
|
131
|
-
timestamp: Date.now(),
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
const config = loadConfig(toolCtx.cwd).config.ui;
|
|
135
|
-
const cache = deps.getManifestCache(toolCtx.cwd);
|
|
136
|
-
const snapshotCache = deps.getRunSnapshotCache?.(toolCtx.cwd);
|
|
137
|
-
updateCrewWidget(toolCtx, deps.widgetState, config, cache, snapshotCache);
|
|
138
|
-
updatePiCrewPowerbar(pi.events, toolCtx.cwd, config, cache, snapshotCache, toolCtx);
|
|
139
|
-
return output;
|
|
140
|
-
} finally {
|
|
141
|
-
signal?.removeEventListener("abort", abort);
|
|
142
|
-
deps.foregroundControllers.delete(toolKey);
|
|
143
|
-
stopProgress.stop();
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
147
|
-
renderCall(args: any, theme: any, context: any): any {
|
|
148
|
-
return teamToolRenderer.renderCall(args, theme, context);
|
|
149
|
-
},
|
|
150
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
151
|
-
renderResult(result: any, options: any, theme: any, context: any): any {
|
|
152
|
-
try {
|
|
153
|
-
return teamToolRenderer.renderResult(result, options, theme, context);
|
|
154
|
-
} catch {
|
|
155
|
-
return new Text(statusIcon("completed", theme) + " done", 0, 0);
|
|
156
|
-
}
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
pi.registerTool(tool);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
interface TeamToolProgressBinder {
|
|
163
|
-
attach: (cwd: string, runId: string) => void;
|
|
164
|
-
stop: () => void;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
function startTeamToolProgressBinder(onUpdate: OnUpdate | undefined): TeamToolProgressBinder {
|
|
168
|
-
if (!onUpdate) {
|
|
169
|
-
return { attach: () => {}, stop: () => {} };
|
|
170
|
-
}
|
|
171
|
-
const startedAt = Date.now();
|
|
172
|
-
let cwd: string | undefined;
|
|
173
|
-
let runId: string | undefined;
|
|
174
|
-
const tick = (): void => {
|
|
175
|
-
try {
|
|
176
|
-
if (!cwd || !runId) {
|
|
177
|
-
const elapsed = Math.max(0, Math.round((Date.now() - startedAt) / 1000));
|
|
178
|
-
const msg = `team status=starting elapsed=${elapsed}s`;
|
|
179
|
-
onUpdate({ content: [{ type: "text", text: msg }] });
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
const loaded = loadRunManifestById(cwd, runId);
|
|
183
|
-
if (!loaded) {
|
|
184
|
-
const elapsed = Math.max(0, Math.round((Date.now() - startedAt) / 1000));
|
|
185
|
-
const msg = `team run=${runId} elapsed=${elapsed}s (manifest pending)`;
|
|
186
|
-
onUpdate({ content: [{ type: "text", text: msg }] });
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
let agents;
|
|
190
|
-
try {
|
|
191
|
-
agents = readCrewAgents(loaded.manifest);
|
|
192
|
-
} catch {
|
|
193
|
-
/* ignore */
|
|
194
|
-
}
|
|
195
|
-
const text = formatCompactToolProgress({
|
|
196
|
-
agentId: runId,
|
|
197
|
-
status: loaded.manifest.status,
|
|
198
|
-
runId,
|
|
199
|
-
startedAt,
|
|
200
|
-
manifest: loaded.manifest,
|
|
201
|
-
tasks: loaded.tasks,
|
|
202
|
-
agents,
|
|
203
|
-
});
|
|
204
|
-
onUpdate({ content: [{ type: "text", text }] });
|
|
205
|
-
} catch (error) {
|
|
206
|
-
logInternalError("team-tool.progress", error, `runId=${runId ?? ""}`);
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
|
-
tick();
|
|
210
|
-
const timer = setInterval(tick, TEAM_TOOL_PROGRESS_TICK_MS);
|
|
211
|
-
if (typeof timer.unref === "function") timer.unref();
|
|
212
|
-
return {
|
|
213
|
-
attach: (boundCwd: string, boundRunId: string) => {
|
|
214
|
-
cwd = boundCwd;
|
|
215
|
-
runId = boundRunId;
|
|
216
|
-
tick();
|
|
217
|
-
},
|
|
218
|
-
stop: () => clearInterval(timer),
|
|
219
|
-
};
|
|
220
|
-
}
|