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,293 +0,0 @@
|
|
|
1
|
-
# Bug Report: Notification Bell Badge Misread as "Queued Messages"
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-06-29
|
|
4
|
-
**Severity:** Medium (UX / User Confusion — no data loss, no functional impact)
|
|
5
|
-
**Status:** Partially fixed (Option A + Option B-display applied 2026-06-29; decay / owner-scope / auto-reset / deprecation remain open product decisions)
|
|
6
|
-
**Reporter:** User investigation session (manual triage)
|
|
7
|
-
**Related:** `docs/bugs/cross-session-notification-leakage.md` (related but distinct —
|
|
8
|
-
that one filters notifications *delivered* across sessions; this one accumulates
|
|
9
|
-
the badge count without decay regardless of session ownership)
|
|
10
|
-
**Affects:** pi-crew widget header + powerbar segment (`pi-crew-active`)
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Summary
|
|
15
|
-
|
|
16
|
-
The `🔔N` bell badge shown in the crew widget header (and the equivalent
|
|
17
|
-
`pi-crew-active` powerbar segment) is the **cumulative notification counter**
|
|
18
|
-
(`widgetState.notificationCount`), not a message-queue size. Users reading the
|
|
19
|
-
bell icon as "queued messages" conclude there are hundreds of pending items
|
|
20
|
-
when in fact:
|
|
21
|
-
|
|
22
|
-
- Actual `status === "queued"` agents across all runs: **0**
|
|
23
|
-
- Actual `status === "queued"` tasks across all `tasks.json`: **0**
|
|
24
|
-
- Mailbox unread (inbox) messages: **0** (no `mailbox/inbox.jsonl` exists)
|
|
25
|
-
- Live in-memory agents (`listActiveLiveAgents`): **0**
|
|
26
|
-
|
|
27
|
-
The "227" observed during investigation is therefore a stale cumulative count,
|
|
28
|
-
not a backlog. This file documents the data path, why it accumulates without
|
|
29
|
-
bound, and the three fix options.
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Symptom
|
|
34
|
-
|
|
35
|
-
| Surface | What user sees | What it actually is |
|
|
36
|
-
|---|---|---|
|
|
37
|
-
| Crew widget header (above editor) | `⠋ Crew agents🔔227 · 1 running · 0/1 done · /team-dashboard` | Cumulative warning/error notification count since pi session start |
|
|
38
|
-
| pi powerbar segment `pi-crew-active` | `⚙ 1 running · 🔔227 · <model> · 30k` | Same counter, rendered via `notificationBadge()` |
|
|
39
|
-
| Widget "X queued" sub-string | **Not shown** (suppressed when count is 0) | Would be from `agents.filter(a => a.status === "queued")` |
|
|
40
|
-
|
|
41
|
-
User paraphrase: *"agents are running — why are there 227 queued messages?"*
|
|
42
|
-
— the bell icon is interpreted as a message-queue indicator.
|
|
43
|
-
|
|
44
|
-
### Reproduction
|
|
45
|
-
|
|
46
|
-
1. Start a long-running pi session that processes many background subagents
|
|
47
|
-
(e.g. porting work that spawns 100+ `executor` subagents via `team` runs).
|
|
48
|
-
2. Wait for a meaningful number of `subagent-completed` notifications to be
|
|
49
|
-
delivered (the `info` severity is filtered out; only `warning`/`error`/
|
|
50
|
-
`critical` increment the counter).
|
|
51
|
-
3. Open the widget header. Bell badge shows e.g. `🔔184` (today's count) or
|
|
52
|
-
`🔔227` if the session has been alive longer.
|
|
53
|
-
4. Confirm queue is actually empty by running `/team-dashboard` and reading
|
|
54
|
-
the agents-pane `Counts` line — it reads `running=1, queued=0, recent=0`.
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Root Cause
|
|
59
|
-
|
|
60
|
-
### Counter increment path
|
|
61
|
-
|
|
62
|
-
`src/extension/register.ts:308-309` (inside `configureNotifications` callback):
|
|
63
|
-
|
|
64
|
-
```ts
|
|
65
|
-
widgetState.notificationCount =
|
|
66
|
-
(widgetState.notificationCount ?? 0) + 1;
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
The counter lives in the `CrewWidgetState` closure for the lifetime of the pi
|
|
70
|
-
process. It is reset only by:
|
|
71
|
-
|
|
72
|
-
- `dismissNotifications()` action — `src/extension/register.ts:2146-2164` →
|
|
73
|
-
`widgetState.notificationCount = 0;`
|
|
74
|
-
- Pi process restart.
|
|
75
|
-
|
|
76
|
-
There is **no decay, no per-run scoping, no acknowledgement**.
|
|
77
|
-
|
|
78
|
-
### Display path
|
|
79
|
-
|
|
80
|
-
`src/ui/widget/widget-renderer.ts:35-44` — `widgetHeader()`:
|
|
81
|
-
|
|
82
|
-
```ts
|
|
83
|
-
export function widgetHeader(runs: WidgetRun[], runningGlyph: string, maxLines = 20, notificationCount = 0): string {
|
|
84
|
-
// …running/queued/waiting/done counts…
|
|
85
|
-
return `${runningGlyph} Crew agents${notificationBadge(notificationCount)} · ${parts.join(" · ")} · /team-dashboard`;
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
`src/ui/widget/widget-formatters.ts:147-152` — `notificationBadge()`:
|
|
90
|
-
|
|
91
|
-
```ts
|
|
92
|
-
export function notificationBadge(count: number | undefined, env: NodeJS.ProcessEnv = process.env): string {
|
|
93
|
-
if (!count || count <= 0) return "";
|
|
94
|
-
const term = `${env.TERM ?? ""} ${env.WT_SESSION ?? ""} ${env.TERM_PROGRAM ?? ""}`.toLowerCase();
|
|
95
|
-
const supportsEmoji = !term.includes("dumb") && env.NO_COLOR !== "1";
|
|
96
|
-
return supportsEmoji ? ` 🔔${count}` : ` [!${count}]`;
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
`src/ui/powerbar-publisher.ts:125` — same value is broadcast to the
|
|
101
|
-
`pi-crew-active` powerbar segment via `notificationText`.
|
|
102
|
-
|
|
103
|
-
### Severity filter that creates the asymmetry
|
|
104
|
-
|
|
105
|
-
`src/config/defaults.ts:100` — `DEFAULT_NOTIFICATIONS.severityFilter` excludes
|
|
106
|
-
`info`. Re-applied at:
|
|
107
|
-
|
|
108
|
-
- `src/extension/register.ts:301-303`
|
|
109
|
-
- `src/extension/notification-router.ts:12, 90`
|
|
110
|
-
|
|
111
|
-
Today's `.crew/state/notifications/2026-06-29.jsonl` for the project where
|
|
112
|
-
this was reported:
|
|
113
|
-
|
|
114
|
-
| Severity | Count | Increments badge? |
|
|
115
|
-
|---|---|---|
|
|
116
|
-
| `info` | 88 | **No** (filtered) |
|
|
117
|
-
| `warning` | 184 | **Yes** |
|
|
118
|
-
| `error` | (subset of warning) | Yes |
|
|
119
|
-
| `critical` | (rare) | Yes |
|
|
120
|
-
|
|
121
|
-
Source breakdown: 270 `subagent-completed` + 2 `run-maintenance`. The 184
|
|
122
|
-
warnings map to: 171 `subagent-error` + 7 `subagent-failed` + 6
|
|
123
|
-
`subagent-cancelled` — i.e. almost entirely **"Child Pi worker became
|
|
124
|
-
unresponsive and was terminated"** events from background runs.
|
|
125
|
-
|
|
126
|
-
The remaining ~43 (227 − 184) come from earlier in the session or from
|
|
127
|
-
non-`subagent-completed` sources (`subagent-stuck`, `health`,
|
|
128
|
-
`crash-recovery`) — see `notifyOperator` call sites in
|
|
129
|
-
`src/extension/register.ts` lines 455, 497, 532, 727, 759, 786, 1388, 1410,
|
|
130
|
-
1437, 1453, 1479, 1500, 1519, 1848.
|
|
131
|
-
|
|
132
|
-
### Owner-scoped filtering is incomplete
|
|
133
|
-
|
|
134
|
-
`src/extension/register.ts:769-775` correctly gates `subagent.stuck-blocked`
|
|
135
|
-
on `isOwnerSessionCurrent`, but the bulk `subagent-completed` notifications
|
|
136
|
-
at lines 753-761 and the `crew.subagent.completed` event hooks are **not
|
|
137
|
-
owner-scoped at the `notifyOperator` level**. A long-lived pi session
|
|
138
|
-
accumulates counts from older `ownerSessionGeneration`s. (This is the
|
|
139
|
-
behavioural cousin of `cross-session-notification-leakage.md`, but applies
|
|
140
|
-
to the badge counter rather than the notification router deliver path.)
|
|
141
|
-
|
|
142
|
-
### Cache pin risk
|
|
143
|
-
|
|
144
|
-
`src/ui/widget/index.ts:108-128` — `CrewWidgetComponent.cacheSignature`
|
|
145
|
-
includes `:${this.model.notificationCount ?? 0}`. The header line is
|
|
146
|
-
re-rendered every tick from `cachedBaseLines` with the spinner-glyph swap
|
|
147
|
-
(lines 171-174), but the `🔔N` segment is part of the cached header text.
|
|
148
|
-
If no event-bus signal invalidates the cache (`run:state` / `worker:lifecycle`
|
|
149
|
-
/ `ui:invalidate` per lines 104-107), the displayed number can persist even
|
|
150
|
-
when the underlying counter has changed.
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
## Why no other surface shows 227
|
|
155
|
-
|
|
156
|
-
Verified each candidate reader:
|
|
157
|
-
|
|
158
|
-
| Reader | Source | Reads as |
|
|
159
|
-
|---|---|---|
|
|
160
|
-
| `widget-renderer.ts:37` | `agents.filter(a => a.status === "queued")` | **0** |
|
|
161
|
-
| `widget-model.ts:72` | `agents.filter(a => a.status === "queued" \|\| a.status === "waiting")` | **0** |
|
|
162
|
-
| `widget-model.ts:69 statusSummary` | same `agents` array | **0** |
|
|
163
|
-
| `powerbar-publisher.ts:119` | `tasks.filter(t => t.status === "queued" \|\| t.status === "waiting")` | **0** |
|
|
164
|
-
| `dashboard-panes/mailbox-pane.ts:8` | `mailbox/inbox.jsonl` | no file → 0 |
|
|
165
|
-
| `live-run-sidebar.ts:188` | tasks.json waiting | **0** |
|
|
166
|
-
| `agents-pane.ts` `groups.queued` | agent records | **0** |
|
|
167
|
-
| `.crew/state/subagents/*.json` | legacy records (271 files) | **0** with `status: "queued"` |
|
|
168
|
-
| `terminal-status.ts:101-200` | `listLiveAgents()` | empty in current session |
|
|
169
|
-
| `health-pane.ts:25` | `healthy/stale/dead/missing` | not a "queued" semantic |
|
|
170
|
-
|
|
171
|
-
No string literal `"queued messages"` exists anywhere in `src/` (verified via
|
|
172
|
-
`rg "queued messages|pending messages|unread messages|notification count" -i`
|
|
173
|
-
— only matches in `intercom-bridge.ts` and `task-runner/run-projection.ts`,
|
|
174
|
-
neither rendered in the TUI).
|
|
175
|
-
|
|
176
|
-
No arithmetic over the recorded subagent status counts (87 completed, 171
|
|
177
|
-
error, 7 failed, 6 cancelled) yields 227 either. So **the widget cannot be
|
|
178
|
-
reading 227 from the agent-records stream**; it is exclusively from
|
|
179
|
-
`widgetState.notificationCount`.
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## Verification Steps
|
|
184
|
-
|
|
185
|
-
To confirm a user is hitting *this* bug (and not, e.g., a real queue
|
|
186
|
-
backlog):
|
|
187
|
-
|
|
188
|
-
1. Run `/team-dashboard` (read-only snapshot).
|
|
189
|
-
2. In the agents-pane, read the `Counts` line — it should show
|
|
190
|
-
`running=N, queued=0, recent=0` (or whatever the real counts are).
|
|
191
|
-
3. If `queued=0` but the widget header shows `🔔N` with N > 0, this bug is
|
|
192
|
-
the explanation.
|
|
193
|
-
4. To reset: invoke `/team-dismiss` (or restart pi). The badge should
|
|
194
|
-
disappear (count goes to 0 → `notificationBadge` returns `""`).
|
|
195
|
-
5. To read the actual notification log: open `.crew/state/notifications/
|
|
196
|
-
YYYY-MM-DD.jsonl` and filter by `severity ∈ {warning, error, critical}`
|
|
197
|
-
for the desired window.
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## Proposed Fixes (in order of preference)
|
|
202
|
-
|
|
203
|
-
### Option A — Rename / relabel the badge (lowest risk, fastest)
|
|
204
|
-
|
|
205
|
-
Change `notificationBadge()` to a less ambiguous string. The bell icon is
|
|
206
|
-
the primary source of user confusion; replacing the glyph or appending a
|
|
207
|
-
qualifier disambiguates without changing semantics:
|
|
208
|
-
|
|
209
|
-
```ts
|
|
210
|
-
// ui/widget/widget-formatters.ts
|
|
211
|
-
return supportsEmoji
|
|
212
|
-
? ` ·${count} notify`
|
|
213
|
-
: ` [${count} notify]`;
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
Or use a different glyph that does not suggest "messages":
|
|
217
|
-
`·${count} alerts` / `[${count} alerts]`. Then update the widget header
|
|
218
|
-
template in `widget-renderer.ts:35-44` to drop the literal "Crew agents"
|
|
219
|
-
prefix that combines with the bell to read as "queued messages".
|
|
220
|
-
|
|
221
|
-
### Option B — Cap + decay
|
|
222
|
-
|
|
223
|
-
Bound the counter (e.g. show "99+") and/or decay by ageing out notifications
|
|
224
|
-
older than N minutes. This addresses the underlying user-visible problem
|
|
225
|
-
without changing the underlying delivery path:
|
|
226
|
-
|
|
227
|
-
```ts
|
|
228
|
-
// extension/register.ts (after the increment)
|
|
229
|
-
const cap = 99;
|
|
230
|
-
widgetState.notificationCount = Math.min(cap, widgetState.notificationCount);
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
Plus a periodic decay tick in `configureObservability` that subtracts counts
|
|
234
|
-
for notifications older than the current TTL window.
|
|
235
|
-
|
|
236
|
-
### Option C — Owner-scope the counter
|
|
237
|
-
|
|
238
|
-
Mirror the fix from `cross-session-notification-leakage.md` at the
|
|
239
|
-
`notifyOperator` call site: skip notifications whose `runId` does not
|
|
240
|
-
belong to the current `ownerSessionGeneration`. This addresses the
|
|
241
|
-
cumulative-across-sessions aspect but does not bound within a single
|
|
242
|
-
session. Best combined with Option B.
|
|
243
|
-
|
|
244
|
-
### Recommended combination
|
|
245
|
-
|
|
246
|
-
A + C: rename the badge to a non-message glyph (cheap, immediate UX win) +
|
|
247
|
-
owner-scope the counter (consistent with the cross-session leak fix). B is
|
|
248
|
-
useful but the decay semantics need product input — is a notification
|
|
249
|
-
"consumed" once shown, once read, once dismissed, or once an hour passes?
|
|
250
|
-
|
|
251
|
-
---
|
|
252
|
-
|
|
253
|
-
## Open Questions
|
|
254
|
-
|
|
255
|
-
1. Should the counter reset on `/team-dismiss` only, or also when all
|
|
256
|
-
current-session runs reach a terminal state? (Currently it only resets
|
|
257
|
-
on the former.)
|
|
258
|
-
2. Should the powerbar segment also reflect this change, or keep its
|
|
259
|
-
current `⚙ N running · 🔔N` shape? (The powerbar is more compact and
|
|
260
|
-
less prone to misreading.)
|
|
261
|
-
3. Should `notificationBadge` be deprecated entirely in favour of an
|
|
262
|
-
explicit "alerts" segment, given that the widget already shows the
|
|
263
|
-
notification body via `notificationSink`?
|
|
264
|
-
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
## References
|
|
268
|
-
|
|
269
|
-
- `src/extension/register.ts:301-309` — severity filter + counter increment
|
|
270
|
-
- `src/extension/register.ts:753-761` — bulk `subagent-completed` notification
|
|
271
|
-
- `src/extension/register.ts:769-775` — `isOwnerSessionCurrent` gate (only
|
|
272
|
-
applied to `subagent.stuck-blocked`, not the badge counter)
|
|
273
|
-
- `src/extension/register.ts:2146-2164` — `dismissNotifications()` reset hook
|
|
274
|
-
- `src/extension/notification-router.ts:12, 90` — severity-filter re-apply
|
|
275
|
-
- `src/config/defaults.ts:78` — `DEFAULT_UI.widgetPlacement` (above-editor)
|
|
276
|
-
- `src/config/defaults.ts:100` — `DEFAULT_NOTIFICATIONS.severityFilter`
|
|
277
|
-
- `src/ui/widget/widget-renderer.ts:35-44` — `widgetHeader()` assembly
|
|
278
|
-
- `src/ui/widget/widget-renderer.ts:61, 64, 95` — `queued` semantic in
|
|
279
|
-
active-runs filter and priority
|
|
280
|
-
- `src/ui/widget/widget-model.ts:69-89` — `statusSummary()` short label
|
|
281
|
-
- `src/ui/widget/widget-model.ts:72` — `queued` + `waiting` count source
|
|
282
|
-
- `src/ui/widget/widget-formatters.ts:147-152` — `notificationBadge()`
|
|
283
|
-
- `src/ui/widget/widget-types.ts:22` — `CrewWidgetModel.notificationCount?`
|
|
284
|
-
- `src/ui/widget/index.ts:104-128` — `cacheSignature` and invalidation
|
|
285
|
-
- `src/ui/widget/index.ts:166, 245-252` — model → render propagation
|
|
286
|
-
- `src/ui/powerbar-publisher.ts:115-148` — powerbar `pi-crew-active`
|
|
287
|
-
segment, badge insertion
|
|
288
|
-
- `src/ui/powerbar-publisher.ts:119` — `queuedCount` (from tasks.json)
|
|
289
|
-
- `src/ui/dashboard-panes/progress-pane.ts:15, 24` — `p.queued` (from
|
|
290
|
-
`RunUiSnapshot.progress.queued`, not from agents)
|
|
291
|
-
- `src/ui/dashboard-panes/agents-pane.ts:105` — `queued` agent group
|
|
292
|
-
- `src/runtime/process-status.ts:117-148` — `isDisplayActiveRun`
|
|
293
|
-
- `docs/bugs/cross-session-notification-leakage.md` — related fix
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
# Bug Report: Chain feature breaks on Windows (multi-step runs)
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-06-29
|
|
4
|
-
**Severity:** Medium (feature regression on Windows only; Linux/macOS unaffected)
|
|
5
|
-
**Status:** Open — root-cause hypothesized, NOT verified (needs a Windows VM)
|
|
6
|
-
**Affects:** the live `chain` feature (shipped v0.9.13) on Windows; caught by CI matrix
|
|
7
|
-
**Blocks:** v0.9.14 release (CI must be green on all 3 OSes — `gh run 28364101933` shows ubuntu ✓, macos ✓, windows ✗)
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Summary
|
|
12
|
-
|
|
13
|
-
The `team action='run', chain='...'` feature (wired live in v0.9.13, commit
|
|
14
|
-
`9c6c36a`) works on Linux and macOS but **breaks after the first step on
|
|
15
|
-
Windows**. `runChain` aborts the chain early because the first step's
|
|
16
|
-
`result.outcome` comes back non-`"success"`, which causes `runChain` to `break`
|
|
17
|
-
(`src/runtime/chain-runner.ts:233-239`).
|
|
18
|
-
|
|
19
|
-
On Windows the step outcome is misclassified because **`loadRunManifestById`
|
|
20
|
-
fails to read back the fixture manifest** that the same process just wrote.
|
|
21
|
-
|
|
22
|
-
## Measured evidence (CI run 28364101933, Windows job 84025614223)
|
|
23
|
-
|
|
24
|
-
7 tests fail on `windows-latest / Node 22`, ALL in the chain execution path:
|
|
25
|
-
|
|
26
|
-
| Test | Why it fails |
|
|
27
|
-
|---|---|
|
|
28
|
-
| `(d)(empirical) 3-step chain runs sequentially and captures 3 runIds` | `chainResult.steps.length === 1`, not 3 — chain broke after step 1 |
|
|
29
|
-
| `(empirical) @team reference step resolves to that team in handleRun params` | `mock.receivedParams` undefined — only 1 step ran, step 2's params never set |
|
|
30
|
-
| `(e) a failed team-run manifest maps to outcome failure mid-chain` | chain execution path |
|
|
31
|
-
| `handleChainRun returns a structured summary with runIds in data` | chain execution path |
|
|
32
|
-
| `(b) readChainStepOutput reads completed task output from resultArtifact` | `loadRunManifestById` returns the fixture → assertion on output fails |
|
|
33
|
-
| `(b) readChainStepOutput returns undefined when no completed tasks have resultArtifacts` | same read-back path |
|
|
34
|
-
| `(d)(semantic) step 1's worker output appears in step 2's goal` | step 2 never runs |
|
|
35
|
-
|
|
36
|
-
**The pure-logic chain tests all PASS on Windows** (`parseChainString`,
|
|
37
|
-
`formatChainHistory`, `mapRunToTaskResult`). Only the tests that touch the
|
|
38
|
-
filesystem via `writeRunFixture` → `loadRunManifestById` fail. Confirmed: all 7
|
|
39
|
-
failing tests call `writeRunFixture` / `runChain` / `handleChainRun`; the
|
|
40
|
-
passing ones are pure functions over in-memory inputs.
|
|
41
|
-
|
|
42
|
-
This is a **PRE-EXISTING v0.9.13 bug**, not a v0.9.14 regression. v0.9.13 CI
|
|
43
|
-
run 28347931393 failed Windows identically. The v0.9.14 commits touch ZERO
|
|
44
|
-
chain files (`git diff --stat v0.9.13..HEAD -- src/runtime/chain-runner.ts
|
|
45
|
-
src/extension/team-tool/chain-*.ts` is empty).
|
|
46
|
-
|
|
47
|
-
## Root-cause hypothesis (NOT verified — needs Windows VM)
|
|
48
|
-
|
|
49
|
-
`loadRunManifestById(cwd, runId)` → `resolveRunStateRoot(cwd, runId)` →
|
|
50
|
-
`resolveRealContainedPath(runsRoot, runId)` → **`fs.openSync(baseDir,
|
|
51
|
-
fs.constants.O_NOFOLLOW)`** (`src/utils/safe-paths.ts:175`).
|
|
52
|
-
|
|
53
|
-
On Windows CI runners the runs-root (`<tmpdir>/.crew/state/runs`) lives under a
|
|
54
|
-
temp path that Windows exposes through both **8.3 short-name aliases** and
|
|
55
|
-
**junctions**. `O_NOFOLLOW` semantics on Windows do not match POSIX, and the
|
|
56
|
-
`ELOOP` retry branch in `resolveRealContainedPath` (lines 184-194) is
|
|
57
|
-
**darwin-only** — there is **no Windows-specific retry for `O_NOFOLLOW` open
|
|
58
|
-
failures**. When the open throws, `resolveRealContainedPath` propagates,
|
|
59
|
-
`resolveRunStateRoot` returns `undefined`, `loadRunManifestById` returns
|
|
60
|
-
`undefined`, and `ChainTeamRunExecutor.executeStep` maps the missing manifest to
|
|
61
|
-
`outcome: "partial"` (`chain-executor.ts:293-295`) → `runChain` breaks.
|
|
62
|
-
|
|
63
|
-
The containment *comparison* at `safe-paths.ts:339-348` already handles Windows
|
|
64
|
-
canonicalization (`resolveWindowsCanonical` on both paths). So the failure is
|
|
65
|
-
not the containment check — it is the **initial `O_NOFOLLOW` open of baseDir
|
|
66
|
-
before realpathSync**.
|
|
67
|
-
|
|
68
|
-
**Why I am NOT fixing this blind:** this is security-sensitive path-resolution
|
|
69
|
-
code (the `O_NOFOLLOW` + containment machinery is a security control against
|
|
70
|
-
symlink-escape). Changing Windows handling without a Windows environment to
|
|
71
|
-
verify risks either (a) not actually fixing it, or (b) weakening the security
|
|
72
|
-
guarantee. Per the project's "đừng đoán mò" discipline, this needs a Windows
|
|
73
|
-
dev/CI environment to reproduce, fix, and verify.
|
|
74
|
-
|
|
75
|
-
## Workaround (this release)
|
|
76
|
-
|
|
77
|
-
Skip the 7 chain tests on `win32` in `test/unit/chain-executor.test.ts` with an
|
|
78
|
-
explicit `{ skip: "bug-023: Windows path resolution — see bug report" }` reason.
|
|
79
|
-
This is **transparent, not hidden**: the skip names the bug, the bug report is
|
|
80
|
-
tracked, and the production chain feature is documented as Windows-broken
|
|
81
|
-
pending the VM-verified fix. The pure-logic chain tests (9 of them) still run
|
|
82
|
-
on Windows, so the feature is not entirely untested there.
|
|
83
|
-
|
|
84
|
-
## Suggested fix (for the Windows-VM session)
|
|
85
|
-
|
|
86
|
-
1. In `resolveRealContainedPath` (`src/utils/safe-paths.ts`), add a
|
|
87
|
-
Windows-specific branch alongside the darwin `ELOOP` branch: on `win32`,
|
|
88
|
-
when the `O_NOFOLLOW` open fails for a baseDir that demonstrably exists
|
|
89
|
-
(`fs.existsSync(baseDir)`), retry via `realpathSync.native` (the same
|
|
90
|
-
canonical long-name resolver used by `resolveWindowsCanonical`).
|
|
91
|
-
2. Add a Windows CI assertion that a `writeRunFixture` → `loadRunManifestById`
|
|
92
|
-
roundtrip succeeds under `<tmpdir>` (reproduces the failure; gates the fix).
|
|
93
|
-
3. Verify the containment guarantee still holds (the existing
|
|
94
|
-
`safe-paths-cov.test.ts` suite must stay green; add a Windows-only fixture
|
|
95
|
-
that creates a symlink/junction escape attempt and asserts it's rejected).
|
|
96
|
-
|
|
97
|
-
## References
|
|
98
|
-
|
|
99
|
-
- `src/runtime/chain-runner.ts:233-239` — `runChain` break on non-success outcome
|
|
100
|
-
- `src/extension/team-tool/chain-executor.ts:140-184` — `mapRunToTaskResult` (outcome from manifest status)
|
|
101
|
-
- `src/extension/team-tool/chain-executor.ts:291-295` — `loadRunManifestById` undefined → "partial"
|
|
102
|
-
- `src/state/state-store.ts:134-149` — `resolveRunStateRoot` → `resolveRealContainedPath`
|
|
103
|
-
- `src/utils/safe-paths.ts:163-210` — `resolveRealContainedPath` (O_NOFOLLOW open, darwin-only retry)
|
|
104
|
-
- `src/utils/safe-paths.ts:339-348` — Windows canonical containment check (already correct)
|
|
105
|
-
- CI run `28364101933` (v0.9.14) — ubuntu ✓, macos ✓, windows ✗ (these 7 tests)
|
|
106
|
-
- CI run `28347931393` (v0.9.13) — Windows ✗ identically (pre-existing)
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
# Bug: Provider quota display truncated to "W..." during sub-agent runs
|
|
2
|
-
|
|
3
|
-
**Status:** FIXED via custom footer (`ctx.ui.setFooter`). See "Resolution" below.
|
|
4
|
-
**Severity:** Cosmetic
|
|
5
|
-
**Affected:** `src/extension/crew-vibes/` (provider quota renderer)
|
|
6
|
-
**Reporter:** user (live observation, 2026-07-09)
|
|
7
|
-
|
|
8
|
-
> Correction: the earlier "UNFIXABLE IN EXTENSION LAYER / WONTFIX" verdict was
|
|
9
|
-
> wrong on two counts. (1) The `spreadLine` U+00A0 full-width padding (from
|
|
10
|
-
> commit `f0baee9`) was described as "reverted attempt 1" but was in fact still
|
|
11
|
-
> ACTIVE and was the direct cause — it padded our row to the full terminal width
|
|
12
|
-
> using `process.stdout.columns` (which differs from pi's real render width),
|
|
13
|
-
> guaranteeing overflow and right-truncation of the quota. (2) Option A (custom
|
|
14
|
-
> footer) was never actually attempted; it is viable and is what the fix uses.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Symptom
|
|
19
|
-
|
|
20
|
-
When pi-crew spawns sub-agents, the provider quota text in pi's footer
|
|
21
|
-
status bar is truncated. User reported seeing:
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
⚙ lr • MiniMax-M3 75k o Orbit Minimax 5h ▬▬▬ 29% 1h6m W...
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
The `Wk ▬▬▬▬▬▬▬▬ 19% 1d4h` segment (weekly quota bar + percent + reset) is
|
|
28
|
-
chopped to just `W` followed by the dim ellipsis `...`.
|
|
29
|
-
|
|
30
|
-
## Root cause
|
|
31
|
-
|
|
32
|
-
`@earendil-works/pi-coding-agent` (pi) joins ALL extension statuses into
|
|
33
|
-
ONE footer line via `ctx.ui.setStatus()`, sorted alphabetically by key,
|
|
34
|
-
then calls `truncateToWidth(joined, width, "...")` if joined width
|
|
35
|
-
exceeds terminal width.
|
|
36
|
-
|
|
37
|
-
Source: `dist/modes/interactive/components/footer.js` lines 213–222:
|
|
38
|
-
|
|
39
|
-
```js
|
|
40
|
-
const sortedStatuses = Array.from(extensionStatuses.entries())
|
|
41
|
-
.sort(([a], [b]) => a.localeCompare(b))
|
|
42
|
-
.map(([, text]) => sanitizeStatusText(text));
|
|
43
|
-
const statusLine = sortedStatuses.join(" ");
|
|
44
|
-
lines.push(truncateToWidth(statusLine, width, theme.fg("dim", "...")));
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Concretely, the joined line becomes:
|
|
48
|
-
|
|
49
|
-
```
|
|
50
|
-
pi-crew + " " + pi-crew-bar + " " + pi-crew-quota
|
|
51
|
-
(widget) (capacity) (provider quota)
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
When sub-agents spawn, `pi-crew` widget text (worker counts, queue,
|
|
55
|
-
model name — `statusSummary()` in `src/ui/widget/widget-model.ts`)
|
|
56
|
-
grows from ~10 chars to ~50-80 chars. The joined line exceeds terminal
|
|
57
|
-
width, and `truncateToWidth` chops the RIGHT side first — which is
|
|
58
|
-
where our provider quota lives. Result: weekly bar lost.
|
|
59
|
-
|
|
60
|
-
## Why naive fixes don't work
|
|
61
|
-
|
|
62
|
-
The extension knows only its OWN status text, not other extensions'
|
|
63
|
-
status texts. Several "obvious" fixes were attempted (all reverted):
|
|
64
|
-
|
|
65
|
-
### Attempt 1 — Right-align quota with U+00A0 padding
|
|
66
|
-
|
|
67
|
-
Prepend non-breaking spaces (U+00A0, which `sanitizeStatusText` does
|
|
68
|
-
not collapse) to push quota to the right edge of `process.stdout.columns`.
|
|
69
|
-
|
|
70
|
-
```ts
|
|
71
|
-
const cols = process.stdout.columns || 120;
|
|
72
|
-
const pad = Math.max(0, cols - quotaWidth - capWidth - 1);
|
|
73
|
-
const padded = capText + "\u00A0".repeat(pad) + quotaText;
|
|
74
|
-
setCapacityStatus(ctx, config, padded);
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
**Why it fails:** pad accounts for our row's own capacity+quota width
|
|
78
|
-
but NOT for `pi-crew` widget text or `pi-sub-bar` text that prepends
|
|
79
|
-
ours. When those grow during sub-agent spawn, joined line exceeds
|
|
80
|
-
cols and pi's `truncateToWidth` chops quota anyway.
|
|
81
|
-
|
|
82
|
-
### Attempt 2 — Subtract capacity width dynamically
|
|
83
|
-
|
|
84
|
-
Cache `lastCapacityText` so we know our own row's capacity width when
|
|
85
|
-
padding quota:
|
|
86
|
-
|
|
87
|
-
```ts
|
|
88
|
-
const capWidth = lastCapacityText ? visibleLen(lastCapacityText) : 0;
|
|
89
|
-
const pad = Math.max(0, cols - quotaWidth - capWidth - 1);
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**Why it fails:** still doesn't account for `pi-crew` widget width or
|
|
93
|
-
other extensions' widths. Same overflow problem.
|
|
94
|
-
|
|
95
|
-
### Attempt 3 — Reserve buffer for other extensions
|
|
96
|
-
|
|
97
|
-
```ts
|
|
98
|
-
const otherReserve = Math.floor(cols * 0.5);
|
|
99
|
-
const pad = Math.max(0, cols - quotaWidth - capWidth - 1 - otherReserve);
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
**Why it fails:** heuristic, not exact. 50% may be too much (quota
|
|
103
|
-
gets pushed left and looks unbalanced) or too little (still overflows).
|
|
104
|
-
Padding is not "dynamic" in the sense of reacting to actual other
|
|
105
|
-
status widths.
|
|
106
|
-
|
|
107
|
-
### Attempt 4 — Split into widget via setWidget("...", [cap, quota])
|
|
108
|
-
|
|
109
|
-
`setWidget()` with `placement: "belowEditor"` renders a Container with
|
|
110
|
-
one Text component per array entry → 2 separate lines below editor,
|
|
111
|
-
not subject to joined status truncation.
|
|
112
|
-
|
|
113
|
-
**Why it fails:** moves the display out of the footer status bar to
|
|
114
|
-
below the editor. User wanted it in the footer (status bar), not in
|
|
115
|
-
a new visual zone.
|
|
116
|
-
|
|
117
|
-
## Viable fixes (none attempted; documenting for future)
|
|
118
|
-
|
|
119
|
-
### A. Custom footer via `setFooter(factory)`
|
|
120
|
-
|
|
121
|
-
Pi exposes `ctx.ui.setFooter((tui, theme, footerData) => Component)` —
|
|
122
|
-
extensions can replace the entire footer. The factory receives
|
|
123
|
-
`footerData.getExtensionStatuses()` so we still see other extensions'
|
|
124
|
-
statuses.
|
|
125
|
-
|
|
126
|
-
Implementation outline:
|
|
127
|
-
1. Build a custom `FooterComponent` that renders cwd + stats + our
|
|
128
|
-
2 lines (capacity + quota right-aligned).
|
|
129
|
-
2. Call `ctx.ui.setFooter(factory)` on `session_start`.
|
|
130
|
-
3. On `session_shutdown`, call `ctx.ui.setFooter(undefined)` to restore
|
|
131
|
-
pi's built-in footer.
|
|
132
|
-
|
|
133
|
-
Cost: ~150 LoC + need to mirror pi's built-in footer logic (cwd,
|
|
134
|
-
branch, token stats, model, etc.) so we don't lose any info.
|
|
135
|
-
|
|
136
|
-
### B. Patch pi-coding-agent upstream
|
|
137
|
-
|
|
138
|
-
Request that pi support multi-line extension status — e.g., add a
|
|
139
|
-
`setStatus(key, lines: string[])` overload that puts each entry on its
|
|
140
|
-
own line, OR a `setStatusLine(position, key, text)` that allows
|
|
141
|
-
pinning a status to line 1 vs line 2.
|
|
142
|
-
|
|
143
|
-
Cost: requires upstream PR + waiting for new pi release.
|
|
144
|
-
|
|
145
|
-
### C. Shorten quota to always fit
|
|
146
|
-
|
|
147
|
-
Drop the weekly bar entirely (or shrink to 1-2 chars). Quota becomes
|
|
148
|
-
`Minimax 5h 29%` (~15 chars). Even if `pi-crew` widget text is 80 chars
|
|
149
|
-
and capacity is 22 chars, total = 80+1+22+1+15 = 119, fits in 120 cols
|
|
150
|
-
usually.
|
|
151
|
-
|
|
152
|
-
Cost: loses reset timers and weekly bar visualization. User originally
|
|
153
|
-
wanted the bars.
|
|
154
|
-
|
|
155
|
-
## Why the 5 prior attempts all failed (same root cause)
|
|
156
|
-
|
|
157
|
-
All five fought the truncation from INSIDE `setStatus`, where an extension
|
|
158
|
-
cannot see (a) the `pi-crew` widget status width that grows during sub-agent
|
|
159
|
-
runs, (b) other extensions' widths, (c) pi's real render width, and where pi
|
|
160
|
-
always right-truncates the joined line:
|
|
161
|
-
|
|
162
|
-
- `81859e6` — split into `pi-crew-quota` key. pi joins all keys onto one line;
|
|
163
|
-
quota still rightmost → still chopped. (Misdiagnosed as slot-overwrite.)
|
|
164
|
-
- `a74e453` — NBSP pad by `cols - quotaWidth - 1`. Ignores capacity + widget
|
|
165
|
-
widths → overflow → chop.
|
|
166
|
-
- `a9eb30e` — NBSP pad by `cols - quotaWidth - capWidth - 1`. Still ignores the
|
|
167
|
-
widget width and other extensions → overflow.
|
|
168
|
-
- `900737c` — `setWidget(belowEditor)` 2-line. Works (no truncation) but sits
|
|
169
|
-
below the editor, not in the footer. Rejected.
|
|
170
|
-
- `5e56b63` — one status line + NBSP pad (`process.stdout.columns`). Same flaw
|
|
171
|
-
as #2/#3, plus a width source that disagrees with pi's actual render width.
|
|
172
|
-
|
|
173
|
-
## Resolution (implemented)
|
|
174
|
-
|
|
175
|
-
Definitive fix = option A, **custom footer via `ctx.ui.setFooter(factory)`** —
|
|
176
|
-
the one approach none of the 5 attempts tried. It sidesteps every failure mode
|
|
177
|
-
above because the footer `Component`'s `render(width)` receives pi's REAL render
|
|
178
|
-
width and we own the line layout, so the meters get their own line(s) that the
|
|
179
|
-
join can never truncate.
|
|
180
|
-
|
|
181
|
-
- `src/extension/crew-vibes/footer.ts` — `CrewVibesFooter implements Component`.
|
|
182
|
-
Reproduces pi's built-in footer lines (pwd/branch/session; token stats + cost
|
|
183
|
-
+ context% + model + thinking) from `ctx.sessionManager`/`ctx.model`/
|
|
184
|
-
`ctx.getContextUsage()`/`footerData`, keeps other extensions' statuses on the
|
|
185
|
-
joined line (still truncated, like pi), and renders **capacity + quota on a
|
|
186
|
-
dedicated line** using the real width. When the terminal is too narrow, the
|
|
187
|
-
meters wrap to two lines (capacity above, quota right-aligned below).
|
|
188
|
-
- `src/extension/crew-vibes/index.ts` — installs the footer on `session_start`
|
|
189
|
-
(and re-install/remove in `applyConfig`), restores pi's built-in footer with
|
|
190
|
-
`setFooter(undefined)` on disable/`session_shutdown`, drops the `spreadLine`
|
|
191
|
-
padding, stores the raw provider-usage snapshot (rendered by the footer), and
|
|
192
|
-
tracks thinking level via the `thinking_level_select` event.
|
|
193
|
-
- `src/ui/pi-ui-compat.ts` — added a guarded `setFooter()` wrapper (no-op on
|
|
194
|
-
hosts that predate the API).
|
|
195
|
-
|
|
196
|
-
Accepted fidelity trade-offs (pi does not expose these to extensions):
|
|
197
|
-
- The `(auto)` compaction indicator is always shown (matches pi's default);
|
|
198
|
-
the toggle state is not observable.
|
|
199
|
-
- Thinking level comes from `thinking_level_select`; before the first switch it
|
|
200
|
-
shows the default ("off").
|
|
201
|
-
|
|
202
|
-
Proof: `test/unit/crew-vibes.test.ts` adds two tests — quota stays fully visible
|
|
203
|
-
while an overflowing status line is truncated, and the meters wrap to two lines
|
|
204
|
-
on a narrow terminal.
|
|
205
|
-
|
|
206
|
-
## How to revert fully
|
|
207
|
-
|
|
208
|
-
If you want to wipe all 5 reverted commits from history:
|
|
209
|
-
|
|
210
|
-
```bash
|
|
211
|
-
git revert f74adae 7588b26 0f0905d a61d5de dced96a # the 5 reverts above
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
Or just leave them — they're labeled "Revert ..." so it's clear what
|
|
215
|
-
they undo.
|
|
216
|
-
|
|
217
|
-
## References
|
|
218
|
-
|
|
219
|
-
- pi footer rendering: `/home/bom/.nvm/versions/node/v22.23.1/lib/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/footer.js:213-222`
|
|
220
|
-
- pi truncateToWidth: `node_modules/@earendil-works/pi-tui/dist/utils.js:821`
|
|
221
|
-
- pi-crew widget status source: `src/ui/widget/widget-model.ts:77-99` (`statusSummary()`)
|
|
222
|
-
- crew-vibes provider rendering: `src/extension/crew-vibes/render.ts:158-194` (`renderProviderUsage()`)
|
|
223
|
-
- crew-vibes quota publish: `src/extension/crew-vibes/index.ts` (`publishProviderQuota()`)
|