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,333 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Staleness-aware tool output pruning.
|
|
3
|
-
*
|
|
4
|
-
* Identifies tool results that have been superseded by a later result for the
|
|
5
|
-
* same target (same file read again, same search re-run) or invalidated by a
|
|
6
|
-
* later successful edit/write to a covered file, and replaces the stale
|
|
7
|
-
* content with a compact digest notice. Protect-window and minimum-savings
|
|
8
|
-
* hysteresis ensure recent results are preserved and pruning only fires when
|
|
9
|
-
* the savings justify it.
|
|
10
|
-
*
|
|
11
|
-
* Ported and adapted from gajae-code's compaction/pruning.ts to pi-crew's
|
|
12
|
-
* data shapes. Pi-crew delegates conversation management to child Pi
|
|
13
|
-
* processes, so this module operates on a generic {@link ToolResultEntry}
|
|
14
|
-
* sequence rather than SessionEntry[]. The primary integration point is
|
|
15
|
-
* task-output-context.ts (dependency output context injected into worker
|
|
16
|
-
* prompts), but the module is designed to be reusable for any in-process
|
|
17
|
-
* tool-result sequence.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
// Types
|
|
22
|
-
// ---------------------------------------------------------------------------
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* A single tool result in a sequence (oldest → newest).
|
|
26
|
-
* Adapted to pi-crew's shapes — does not depend on gajae-code's SessionEntry.
|
|
27
|
-
*/
|
|
28
|
-
export interface ToolResultEntry {
|
|
29
|
-
/** Stable identifier for deduplication and correlation. */
|
|
30
|
-
id: string;
|
|
31
|
-
/** Tool name: "read", "bash", "grep", "search", "edit", "write", etc. */
|
|
32
|
-
toolName: string;
|
|
33
|
-
/**
|
|
34
|
-
* Target identity: file path for read/edit/write, search pattern for
|
|
35
|
-
* grep/search, or undefined for tools without a natural target key.
|
|
36
|
-
*/
|
|
37
|
-
target?: string;
|
|
38
|
-
/** The tool result content text. */
|
|
39
|
-
content: string;
|
|
40
|
-
/** Whether the tool result represents an error. */
|
|
41
|
-
isError?: boolean;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** A file mutation event (edit/write) that can invalidate earlier reads. */
|
|
45
|
-
export interface FileEditEvent {
|
|
46
|
-
/** The file path that was mutated. */
|
|
47
|
-
target: string;
|
|
48
|
-
/**
|
|
49
|
-
* Sequence index of this edit relative to tool results. A read at index
|
|
50
|
-
* `i` is stale if an edit at index `j > i` touches the same file.
|
|
51
|
-
*/
|
|
52
|
-
index: number;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface PruneConfig {
|
|
56
|
-
/** Keep the most recent tool output tokens intact (protect window). */
|
|
57
|
-
protectTokens: number;
|
|
58
|
-
/** Only prune if total savings meets this threshold (hysteresis). */
|
|
59
|
-
minimumSavings: number;
|
|
60
|
-
/** Tool names that should never be pruned. */
|
|
61
|
-
protectedTools: string[];
|
|
62
|
-
/**
|
|
63
|
-
* Tools in `protectedTools` whose protection is waived once the result is
|
|
64
|
-
* superseded (a later result for the same target, or a later successful
|
|
65
|
-
* edit/write to the covered file). The most recent result per target is
|
|
66
|
-
* never considered superseded. Optional; defaults to none.
|
|
67
|
-
*/
|
|
68
|
-
staleOverridableTools?: string[];
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export const DEFAULT_PRUNE_CONFIG: PruneConfig = {
|
|
72
|
-
protectTokens: 40_000,
|
|
73
|
-
minimumSavings: 20_000,
|
|
74
|
-
protectedTools: ["read"],
|
|
75
|
-
staleOverridableTools: ["read"],
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
export interface PruneResult {
|
|
79
|
-
/** Number of entries pruned. */
|
|
80
|
-
prunedCount: number;
|
|
81
|
-
/** Estimated tokens saved. */
|
|
82
|
-
tokensSaved: number;
|
|
83
|
-
/** The pruned result entries (same length as input, content replaced for pruned). */
|
|
84
|
-
results: ToolResultEntry[];
|
|
85
|
-
/** IDs of entries that were pruned. */
|
|
86
|
-
prunedIds: string[];
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
// Token estimation (rough char/4 heuristic, matching gajae-code)
|
|
91
|
-
// ---------------------------------------------------------------------------
|
|
92
|
-
|
|
93
|
-
import { countTokens } from "../utils/token-counter.ts";
|
|
94
|
-
|
|
95
|
-
function estimateTokens(text: string): number {
|
|
96
|
-
return countTokens(text);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// ---------------------------------------------------------------------------
|
|
100
|
-
// Digest notice generation
|
|
101
|
-
// ---------------------------------------------------------------------------
|
|
102
|
-
|
|
103
|
-
const DIGEST_NOTICE_TOKEN_CAP_MULTIPLIER = 1.25;
|
|
104
|
-
|
|
105
|
-
function firstErrorLine(text: string): string | undefined {
|
|
106
|
-
return text
|
|
107
|
-
.split(/\r?\n/)
|
|
108
|
-
.find((line) => /error|failed|exception|panic/i.test(line))
|
|
109
|
-
?.trim();
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
function truncateField(value: string, maxLength: number): string {
|
|
113
|
-
if (value.length <= maxLength) return value;
|
|
114
|
-
if (maxLength <= 1) return "…";
|
|
115
|
-
return `${value.slice(0, maxLength - 1)}…`;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Generate a compact digest of a tool result for the digest notice.
|
|
120
|
-
* Supports bash (exit code + tail line), grep/search (match/file counts),
|
|
121
|
-
* and falls back to undefined for tools without a known digest format.
|
|
122
|
-
*/
|
|
123
|
-
export function resultDigest(toolName: string, content: string, isError?: boolean): string | undefined {
|
|
124
|
-
const name = toolName.toLowerCase();
|
|
125
|
-
const text = content ?? "";
|
|
126
|
-
if (name === "bash") {
|
|
127
|
-
const exitCode = isError ? 1 : 0;
|
|
128
|
-
const tail = text.trim().split(/\r?\n/).filter(Boolean).at(-1) ?? "";
|
|
129
|
-
const error = firstErrorLine(text);
|
|
130
|
-
return [`exit=${exitCode}`, tail ? `tail=${tail}` : undefined, error ? `error=${error}` : undefined]
|
|
131
|
-
.filter((part): part is string => part !== undefined)
|
|
132
|
-
.join("; ");
|
|
133
|
-
}
|
|
134
|
-
if (name === "search" || name === "grep") {
|
|
135
|
-
const match = text.match(/(\d+)\s+matches?/i) ?? text.match(/totalMatches["']?:\s*(\d+)/i);
|
|
136
|
-
const files = text.match(/(\d+)\s+files?/i) ?? text.match(/filesWithMatches["']?:\s*(\d+)/i);
|
|
137
|
-
const error = firstErrorLine(text);
|
|
138
|
-
return (
|
|
139
|
-
[match ? `matches=${match[1]}` : undefined, files ? `files=${files[1]}` : undefined, error ? `error=${error}` : undefined]
|
|
140
|
-
.filter((part): part is string => part !== undefined)
|
|
141
|
-
.join("; ") || "search digest unavailable"
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
return undefined;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function createPrunedNotice(tokens: number, entry: ToolResultEntry): string {
|
|
148
|
-
const generic = `[Output pruned — ${tokens} tokens]`;
|
|
149
|
-
const digest = resultDigest(entry.toolName, entry.content, entry.isError);
|
|
150
|
-
if (!digest) return generic;
|
|
151
|
-
const genericTokens = countTokens(generic);
|
|
152
|
-
const maxTokens = Math.max(genericTokens, Math.floor(genericTokens * DIGEST_NOTICE_TOKEN_CAP_MULTIPLIER));
|
|
153
|
-
const prefix = `[Output pruned — ${tokens} tokens; `;
|
|
154
|
-
const suffix = "]";
|
|
155
|
-
const maxChars = Math.max(0, maxTokens * 4 - prefix.length - suffix.length);
|
|
156
|
-
return `${prefix}${truncateField(digest, maxChars)}${suffix}`;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// ---------------------------------------------------------------------------
|
|
160
|
-
// Target key resolution
|
|
161
|
-
// ---------------------------------------------------------------------------
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Trailing read selectors (`:50`, `:50-200`, `:50+150`, `:5-16,960-973`,
|
|
165
|
-
* `:raw`, `:conflicts`), possibly stacked. Stripped to resolve the
|
|
166
|
-
* underlying file for edit invalidation.
|
|
167
|
-
*/
|
|
168
|
-
const READ_SELECTOR_SUFFIX = /:(?:raw|conflicts|\d+(?:[-+]\d+)?(?:,\d+(?:[-+]\d+)?)*)$/;
|
|
169
|
-
|
|
170
|
-
/** Base file path of a read target with any line/mode selectors stripped. */
|
|
171
|
-
function readBasePath(filePath: string): string {
|
|
172
|
-
let base = filePath;
|
|
173
|
-
while (READ_SELECTOR_SUFFIX.test(base)) {
|
|
174
|
-
base = base.replace(READ_SELECTOR_SUFFIX, "");
|
|
175
|
-
}
|
|
176
|
-
return base;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Stable identity for "the same logical lookup": same tool re-targeting the
|
|
181
|
-
* same subject. A later result with the same key supersedes earlier ones.
|
|
182
|
-
*/
|
|
183
|
-
function toolTargetKey(entry: ToolResultEntry): string | undefined {
|
|
184
|
-
if (!entry.target || entry.target.length === 0) return undefined;
|
|
185
|
-
return JSON.stringify([entry.toolName, entry.target]);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// ---------------------------------------------------------------------------
|
|
189
|
-
// Staleness index
|
|
190
|
-
// ---------------------------------------------------------------------------
|
|
191
|
-
|
|
192
|
-
export interface StalenessIndex {
|
|
193
|
-
/** Indices of tool results superseded by a later same-target result or edit. */
|
|
194
|
-
staleIndices: Set<number>;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Build a staleness index over a sequence of tool results (oldest → newest):
|
|
199
|
-
* - a tool result is stale when a later non-error result shares its target key;
|
|
200
|
-
* - a `read` result is stale when a later edit event touches its file.
|
|
201
|
-
* The most recent result per target is never stale.
|
|
202
|
-
*
|
|
203
|
-
* @param toolResults Ordered tool result entries (oldest first).
|
|
204
|
-
* @param fileEdits Optional file mutation events with sequence indices.
|
|
205
|
-
*/
|
|
206
|
-
export function buildStalenessIndex(toolResults: ToolResultEntry[], fileEdits: FileEditEvent[] = []): StalenessIndex {
|
|
207
|
-
// Map target key → last result index that has it.
|
|
208
|
-
const lastResultIndexByKey = new Map<string, number>();
|
|
209
|
-
for (let i = 0; i < toolResults.length; i++) {
|
|
210
|
-
const entry = toolResults[i]!;
|
|
211
|
-
if (entry.isError) continue;
|
|
212
|
-
const key = toolTargetKey(entry);
|
|
213
|
-
if (key !== undefined) lastResultIndexByKey.set(key, i);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// Map file path → last edit index.
|
|
217
|
-
const lastEditIndexByPath = new Map<string, number>();
|
|
218
|
-
for (const edit of fileEdits) {
|
|
219
|
-
lastEditIndexByPath.set(edit.target, edit.index);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
const staleIndices = new Set<number>();
|
|
223
|
-
for (let i = 0; i < toolResults.length; i++) {
|
|
224
|
-
const entry = toolResults[i]!;
|
|
225
|
-
// Check superseded by same-target re-read.
|
|
226
|
-
const key = toolTargetKey(entry);
|
|
227
|
-
if (key !== undefined) {
|
|
228
|
-
const lastIndex = lastResultIndexByKey.get(key);
|
|
229
|
-
if (lastIndex !== undefined && lastIndex > i) {
|
|
230
|
-
staleIndices.add(i);
|
|
231
|
-
continue;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
// Check invalidated by later file edit (read-specific).
|
|
235
|
-
if (entry.toolName.toLowerCase() === "read" && entry.target) {
|
|
236
|
-
const basePath = readBasePath(entry.target);
|
|
237
|
-
const editIndex = lastEditIndexByPath.get(basePath);
|
|
238
|
-
if (editIndex !== undefined && editIndex > i) {
|
|
239
|
-
staleIndices.add(i);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
return { staleIndices };
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// ---------------------------------------------------------------------------
|
|
248
|
-
// Pruning
|
|
249
|
-
// ---------------------------------------------------------------------------
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Prune stale tool outputs from a sequence, replacing superseded content with
|
|
253
|
-
* compact digest notices. Protect-window, protected-tools immunity, and
|
|
254
|
-
* minimum-savings hysteresis are all respected.
|
|
255
|
-
*
|
|
256
|
-
* OPT-IN by default: {@link DEFAULT_PRUNE_CONFIG} protects recent results via
|
|
257
|
-
* a generous `protectTokens` window. Only results outside the window AND not
|
|
258
|
-
* protected AND stale (or old enough) are pruned.
|
|
259
|
-
*
|
|
260
|
-
* @param results Ordered tool result entries (oldest first).
|
|
261
|
-
* @param config Prune configuration. Defaults to {@link DEFAULT_PRUNE_CONFIG}.
|
|
262
|
-
*/
|
|
263
|
-
export function pruneToolOutputs(results: ToolResultEntry[], config: PruneConfig = DEFAULT_PRUNE_CONFIG): PruneResult {
|
|
264
|
-
const { staleIndices } = buildStalenessIndex(results);
|
|
265
|
-
const staleOverridable = new Set(config.staleOverridableTools ?? []);
|
|
266
|
-
|
|
267
|
-
let accumulatedTokens = 0;
|
|
268
|
-
let tokensSaved = 0;
|
|
269
|
-
let prunedCount = 0;
|
|
270
|
-
|
|
271
|
-
interface Candidate {
|
|
272
|
-
index: number;
|
|
273
|
-
entry: ToolResultEntry;
|
|
274
|
-
tokens: number;
|
|
275
|
-
notice: string;
|
|
276
|
-
savings: number;
|
|
277
|
-
}
|
|
278
|
-
const candidates: Candidate[] = [];
|
|
279
|
-
const prunedIds: string[] = [];
|
|
280
|
-
|
|
281
|
-
// Iterate newest → oldest to accumulate the protect window from the tail.
|
|
282
|
-
for (let i = results.length - 1; i >= 0; i--) {
|
|
283
|
-
const entry = results[i]!;
|
|
284
|
-
const tokens = estimateTokens(entry.content);
|
|
285
|
-
const isStale = staleIndices.has(i);
|
|
286
|
-
|
|
287
|
-
// Staleness waives protected-tool immunity for overridable tools
|
|
288
|
-
// (e.g. a superseded `read`); the most recent result per target is
|
|
289
|
-
// never stale, so the latest read of each file stays protected.
|
|
290
|
-
const isProtected = config.protectedTools.includes(entry.toolName) && !(isStale && staleOverridable.has(entry.toolName));
|
|
291
|
-
|
|
292
|
-
// Stale results are prunable even inside the recency protect window —
|
|
293
|
-
// they are superseded, so recency no longer implies relevance. They
|
|
294
|
-
// still count toward window accounting so non-stale protection is
|
|
295
|
-
// unchanged.
|
|
296
|
-
const insideProtectWindow = accumulatedTokens < config.protectTokens;
|
|
297
|
-
if ((insideProtectWindow && !isStale) || isProtected) {
|
|
298
|
-
accumulatedTokens += tokens;
|
|
299
|
-
continue;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const notice = createPrunedNotice(tokens, entry);
|
|
303
|
-
candidates.push({
|
|
304
|
-
index: i,
|
|
305
|
-
entry,
|
|
306
|
-
tokens,
|
|
307
|
-
notice,
|
|
308
|
-
savings: Math.max(0, tokens - countTokens(notice)),
|
|
309
|
-
});
|
|
310
|
-
accumulatedTokens += tokens;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
for (const candidate of candidates) {
|
|
314
|
-
tokensSaved += candidate.savings;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// Hysteresis: only prune if savings meet the threshold.
|
|
318
|
-
if (tokensSaved < config.minimumSavings || candidates.length === 0) {
|
|
319
|
-
return { prunedCount: 0, tokensSaved: 0, results, prunedIds: [] };
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
const prunedResults = [...results];
|
|
323
|
-
for (const candidate of candidates) {
|
|
324
|
-
prunedResults[candidate.index] = {
|
|
325
|
-
...candidate.entry,
|
|
326
|
-
content: candidate.notice,
|
|
327
|
-
};
|
|
328
|
-
prunedIds.push(candidate.entry.id);
|
|
329
|
-
prunedCount++;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
return { prunedCount, tokensSaved, results: prunedResults, prunedIds };
|
|
333
|
-
}
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Progress Event System
|
|
3
|
-
*
|
|
4
|
-
* Provides real-time visibility into tool execution within child Pi workers.
|
|
5
|
-
*
|
|
6
|
-
* Event flow:
|
|
7
|
-
* 1. Child Pi emits JSON events on stdout (tool_execution_start, tool_execution_end, etc.)
|
|
8
|
-
* 2. child-pi.ts parses these events and passes them to onJsonEvent callback
|
|
9
|
-
* 3. task-runner.ts calls applyAgentProgressEvent() to update task state
|
|
10
|
-
* 4. This module provides structured types and utilities for the event system
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { CrewAgentProgress } from "../state/types.ts";
|
|
14
|
-
|
|
15
|
-
// ── Event Types ─────────────────────────────────────────────────────────
|
|
16
|
-
|
|
17
|
-
export interface ToolExecutionStartEvent {
|
|
18
|
-
type: "tool_execution_start";
|
|
19
|
-
toolName: string;
|
|
20
|
-
toolCallId: string;
|
|
21
|
-
args?: Record<string, unknown>;
|
|
22
|
-
timestamp: number;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface ToolExecutionEndEvent {
|
|
26
|
-
type: "tool_execution_end";
|
|
27
|
-
toolName: string;
|
|
28
|
-
toolCallId: string;
|
|
29
|
-
result?: unknown;
|
|
30
|
-
timestamp: number;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface ToolExecutionUpdateEvent {
|
|
34
|
-
type: "tool_execution_update";
|
|
35
|
-
toolName: string;
|
|
36
|
-
toolCallId: string;
|
|
37
|
-
partialResult?: unknown;
|
|
38
|
-
timestamp: number;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface ToolExecutionErrorEvent {
|
|
42
|
-
type: "tool_execution_error" | "tool_execution_failed";
|
|
43
|
-
toolName: string;
|
|
44
|
-
toolCallId: string;
|
|
45
|
-
error?: string;
|
|
46
|
-
timestamp: number;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface MessageEndEvent {
|
|
50
|
-
type: "message_end";
|
|
51
|
-
message: {
|
|
52
|
-
role: "assistant" | "user" | "system";
|
|
53
|
-
content?: unknown[];
|
|
54
|
-
usage?: UsageStats;
|
|
55
|
-
model?: string;
|
|
56
|
-
stopReason?: string;
|
|
57
|
-
};
|
|
58
|
-
timestamp: number;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export interface UsageStats {
|
|
62
|
-
input: number;
|
|
63
|
-
output: number;
|
|
64
|
-
cacheRead?: number;
|
|
65
|
-
cacheWrite?: number;
|
|
66
|
-
cost?: { total: number };
|
|
67
|
-
turns?: number;
|
|
68
|
-
totalTokens?: number;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Union type of all tool progress events
|
|
72
|
-
export type ToolProgressEvent =
|
|
73
|
-
| ToolExecutionStartEvent
|
|
74
|
-
| ToolExecutionEndEvent
|
|
75
|
-
| ToolExecutionUpdateEvent
|
|
76
|
-
| ToolExecutionErrorEvent
|
|
77
|
-
| MessageEndEvent;
|
|
78
|
-
|
|
79
|
-
// ── Event Utilities ───────────────────────────────────────────────────────
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Extract tool name from any event type
|
|
83
|
-
*/
|
|
84
|
-
export function getToolName(event: ToolProgressEvent): string | undefined {
|
|
85
|
-
if ("toolName" in event) return event.toolName;
|
|
86
|
-
return undefined;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Check if event indicates tool is running
|
|
91
|
-
*/
|
|
92
|
-
export function isToolRunning(event: ToolProgressEvent): boolean {
|
|
93
|
-
return event.type === "tool_execution_start";
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Check if event indicates tool completed
|
|
98
|
-
*/
|
|
99
|
-
export function isToolComplete(event: ToolProgressEvent): boolean {
|
|
100
|
-
return event.type === "tool_execution_end";
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Check if event indicates tool failed
|
|
105
|
-
*/
|
|
106
|
-
export function isToolError(event: ToolProgressEvent): boolean {
|
|
107
|
-
return event.type === "tool_execution_error" || event.type === "tool_execution_failed";
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Get usage stats from message_end event
|
|
112
|
-
*/
|
|
113
|
-
export function getUsage(event: ToolProgressEvent): UsageStats | undefined {
|
|
114
|
-
if (event.type === "message_end" && event.message?.usage) {
|
|
115
|
-
return event.message.usage as UsageStats;
|
|
116
|
-
}
|
|
117
|
-
return undefined;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// ── Progress Display ──────────────────────────────────────────────────────
|
|
121
|
-
|
|
122
|
-
export interface ToolProgressDisplay {
|
|
123
|
-
/** Current/last tool being executed */
|
|
124
|
-
currentTool?: string;
|
|
125
|
-
/** Preview of tool arguments (truncated) */
|
|
126
|
-
currentToolArgs?: string;
|
|
127
|
-
/** When tool started */
|
|
128
|
-
currentToolStartedAt?: string;
|
|
129
|
-
/** All recent tools with their args */
|
|
130
|
-
recentTools: Array<{
|
|
131
|
-
tool: string;
|
|
132
|
-
args?: string;
|
|
133
|
-
startedAt?: string;
|
|
134
|
-
endedAt?: string;
|
|
135
|
-
status: "running" | "done" | "error";
|
|
136
|
-
}>;
|
|
137
|
-
/** Token usage snapshot */
|
|
138
|
-
tokens?: number;
|
|
139
|
-
/** Context window usage percentage */
|
|
140
|
-
contextPercent?: number;
|
|
141
|
-
/** Total tool count */
|
|
142
|
-
toolCount: number;
|
|
143
|
-
/** Last activity timestamp */
|
|
144
|
-
lastActivityAt?: string;
|
|
145
|
-
/** Activity state */
|
|
146
|
-
activityState: "active" | "idle" | "done";
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Format tool progress for display
|
|
151
|
-
*/
|
|
152
|
-
export function formatToolProgress(progress: CrewAgentProgress, maxContextTokens = 128000): ToolProgressDisplay {
|
|
153
|
-
const recentTools: Array<{
|
|
154
|
-
tool: string;
|
|
155
|
-
args?: string;
|
|
156
|
-
startedAt?: string;
|
|
157
|
-
endedAt?: string;
|
|
158
|
-
status: "running" | "done" | "error";
|
|
159
|
-
}> = progress.recentTools.map((t) => ({
|
|
160
|
-
tool: t.tool,
|
|
161
|
-
args: t.args,
|
|
162
|
-
startedAt: t.startedAt,
|
|
163
|
-
endedAt: t.endedAt,
|
|
164
|
-
status: t.endedAt ? ("done" as const) : ("running" as const),
|
|
165
|
-
}));
|
|
166
|
-
|
|
167
|
-
// If there's a currentTool but no endedAt, it's still running
|
|
168
|
-
const currentRunning = progress.recentTools.find((t) => !t.endedAt && t.tool === progress.currentTool);
|
|
169
|
-
if (currentRunning && progress.currentTool) {
|
|
170
|
-
recentTools.push({
|
|
171
|
-
tool: progress.currentTool,
|
|
172
|
-
args: progress.currentToolArgs,
|
|
173
|
-
startedAt: progress.currentToolStartedAt,
|
|
174
|
-
endedAt: undefined as string | undefined,
|
|
175
|
-
status: "running" as const,
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
const tokens = progress.tokens ?? 0;
|
|
180
|
-
const contextPercent = maxContextTokens > 0 ? Math.round((tokens / maxContextTokens) * 100) : 0;
|
|
181
|
-
|
|
182
|
-
return {
|
|
183
|
-
currentTool: progress.currentTool,
|
|
184
|
-
currentToolArgs: progress.currentToolArgs,
|
|
185
|
-
currentToolStartedAt: progress.currentToolStartedAt,
|
|
186
|
-
recentTools,
|
|
187
|
-
tokens,
|
|
188
|
-
contextPercent,
|
|
189
|
-
toolCount: progress.toolCount,
|
|
190
|
-
lastActivityAt: progress.lastActivityAt,
|
|
191
|
-
activityState: progress.activityState as "active" | "idle" | "done",
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Format a single line summary of current tool
|
|
197
|
-
*/
|
|
198
|
-
export function formatCurrentToolLine(progress: CrewAgentProgress): string {
|
|
199
|
-
if (!progress.currentTool) return "";
|
|
200
|
-
|
|
201
|
-
const args = progress.currentToolArgs
|
|
202
|
-
? ` ${progress.currentToolArgs.slice(0, 50)}${progress.currentToolArgs.length > 50 ? "..." : ""}`
|
|
203
|
-
: "";
|
|
204
|
-
|
|
205
|
-
const toolCount = progress.toolCount > 0 ? ` (${progress.toolCount})` : "";
|
|
206
|
-
|
|
207
|
-
return `${progress.currentTool}${args}${toolCount}`;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Format token usage for display
|
|
212
|
-
*/
|
|
213
|
-
export function formatTokenUsage(progress: CrewAgentProgress, maxTokens = 128000): string {
|
|
214
|
-
const tokens = progress.tokens ?? 0;
|
|
215
|
-
const percent = maxTokens > 0 ? Math.round((tokens / maxTokens) * 100) : 0;
|
|
216
|
-
return `${tokens.toLocaleString()} / ${maxTokens.toLocaleString()} (${percent}%)`;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// ── Progress Bar Rendering ────────────────────────────────────────────────
|
|
220
|
-
|
|
221
|
-
export interface ProgressBarOptions {
|
|
222
|
-
width?: number;
|
|
223
|
-
showPercent?: boolean;
|
|
224
|
-
showCount?: boolean;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Render a progress bar for tool execution
|
|
229
|
-
*/
|
|
230
|
-
export function renderProgressBar(progress: CrewAgentProgress, options: ProgressBarOptions = {}): string {
|
|
231
|
-
const width = options.width ?? 20;
|
|
232
|
-
const showPercent = options.showPercent ?? true;
|
|
233
|
-
const showCount = options.showCount ?? true;
|
|
234
|
-
|
|
235
|
-
// Calculate based on recent tools (max 10)
|
|
236
|
-
const recentCount = Math.min(progress.recentTools.length, 10);
|
|
237
|
-
const filled = Math.round((recentCount / 10) * width);
|
|
238
|
-
const empty = width - filled;
|
|
239
|
-
|
|
240
|
-
const bar = "█".repeat(filled) + "░".repeat(empty);
|
|
241
|
-
const percent = showPercent ? ` ${progress.toolCount} tools` : "";
|
|
242
|
-
const tokens = progress.tokens ? ` | ${(progress.tokens / 1000).toFixed(1)}k tokens` : "";
|
|
243
|
-
|
|
244
|
-
return `[${bar}]${percent}${tokens}`;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// ── Event Filtering ──────────────────────────────────────────────────────
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Filter events to only tool execution events
|
|
251
|
-
*/
|
|
252
|
-
export function filterToolEvents(events: ToolProgressEvent[]): ToolProgressEvent[] {
|
|
253
|
-
return events.filter(
|
|
254
|
-
(e) =>
|
|
255
|
-
e.type === "tool_execution_start" ||
|
|
256
|
-
e.type === "tool_execution_end" ||
|
|
257
|
-
e.type === "tool_execution_update" ||
|
|
258
|
-
e.type === "tool_execution_error" ||
|
|
259
|
-
e.type === "tool_execution_failed",
|
|
260
|
-
);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Get events for a specific tool
|
|
265
|
-
*/
|
|
266
|
-
export function getEventsForTool(events: ToolProgressEvent[], toolName: string): ToolProgressEvent[] {
|
|
267
|
-
return events.filter((e) => {
|
|
268
|
-
if ("toolName" in e) return e.toolName === toolName;
|
|
269
|
-
return false;
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Check if any event indicates an error
|
|
275
|
-
*/
|
|
276
|
-
export function hasError(events: ToolProgressEvent[]): boolean {
|
|
277
|
-
return events.some(isToolError);
|
|
278
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import type { TeamRunManifest, TeamTaskState, UsageState } from "../state/types.ts";
|
|
2
|
-
|
|
3
|
-
export interface LifetimeUsage {
|
|
4
|
-
input: number;
|
|
5
|
-
output: number;
|
|
6
|
-
cacheWrite: number;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function emptyLifetimeUsage(): LifetimeUsage {
|
|
10
|
-
return { input: 0, output: 0, cacheWrite: 0 };
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function addUsage(into: LifetimeUsage, delta: { input?: number; output?: number; cacheWrite?: number }): void {
|
|
14
|
-
if (typeof delta.input === "number") into.input += delta.input;
|
|
15
|
-
if (typeof delta.output === "number") into.output += delta.output;
|
|
16
|
-
if (typeof delta.cacheWrite === "number") into.cacheWrite += delta.cacheWrite;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** @internal */
|
|
20
|
-
function lifetimeUsageFromState(state: UsageState | undefined): LifetimeUsage {
|
|
21
|
-
if (!state) return emptyLifetimeUsage();
|
|
22
|
-
return {
|
|
23
|
-
input: state.input ?? 0,
|
|
24
|
-
output: state.output ?? 0,
|
|
25
|
-
cacheWrite: state.cacheWrite ?? 0,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function usageStateFromLifetime(lifetime: LifetimeUsage): UsageState {
|
|
30
|
-
return {
|
|
31
|
-
input: lifetime.input,
|
|
32
|
-
output: lifetime.output,
|
|
33
|
-
cacheWrite: lifetime.cacheWrite,
|
|
34
|
-
cacheRead: 0,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const taskUsageMap = new Map<string, LifetimeUsage>();
|
|
39
|
-
|
|
40
|
-
export function trackTaskUsage(taskId: string, delta: { input?: number; output?: number; cacheWrite?: number }): void {
|
|
41
|
-
const existing = taskUsageMap.get(taskId) ?? emptyLifetimeUsage();
|
|
42
|
-
addUsage(existing, delta);
|
|
43
|
-
taskUsageMap.set(taskId, existing);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function getTrackedTaskUsage(taskId: string): LifetimeUsage {
|
|
47
|
-
return taskUsageMap.get(taskId) ?? emptyLifetimeUsage();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function clearTrackedTaskUsage(taskId: string): void {
|
|
51
|
-
taskUsageMap.delete(taskId);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function clearAllTrackedTaskUsage(): void {
|
|
55
|
-
taskUsageMap.clear();
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Aliases for public API
|
|
59
|
-
export const getTaskUsage = getTrackedTaskUsage;
|
|
60
|
-
export const getRunUsage = getTrackedTaskUsage;
|
|
61
|
-
export const clearAllTaskUsage = clearAllTrackedTaskUsage;
|
|
62
|
-
|
|
63
|
-
/** @internal */
|
|
64
|
-
function aggregateTrackedUsageForRun(manifest: TeamRunManifest, tasks: TeamTaskState[]): UsageState {
|
|
65
|
-
const total = emptyLifetimeUsage();
|
|
66
|
-
for (const task of tasks) {
|
|
67
|
-
const tracked = getTrackedTaskUsage(task.id);
|
|
68
|
-
addUsage(total, tracked);
|
|
69
|
-
// Also add any usage already stored on the task
|
|
70
|
-
if (task.usage) addUsage(total, task.usage);
|
|
71
|
-
}
|
|
72
|
-
return usageStateFromLifetime(total);
|
|
73
|
-
}
|