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,109 +0,0 @@
|
|
|
1
|
-
# Bug #10: Child-Process Silent Timeout — MINIMAX_API_KEY Filtered Out
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-05-19
|
|
4
|
-
**Severity:** HIGH
|
|
5
|
-
**Type:** Bug (not design issue)
|
|
6
|
-
**Status:** OPEN — Fix applied, pending verification
|
|
7
|
-
|
|
8
|
-
## Summary
|
|
9
|
-
|
|
10
|
-
Background child-process workers silently time out after 300 seconds with zero output
|
|
11
|
-
because `MINIMAX_API_KEY` is filtered out by `sanitizeEnvSecrets()` before the child
|
|
12
|
-
process is spawned. The child Pi has no API credentials to call the model.
|
|
13
|
-
|
|
14
|
-
## Root Cause
|
|
15
|
-
|
|
16
|
-
In `src/runtime/child-pi.ts` line 159-161:
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
function buildChildPiSpawnOptions(cwd: string, env: NodeJS.ProcessEnv): SpawnOptions {
|
|
20
|
-
const filteredEnv = sanitizeEnvSecrets(env); // ← STRIPS ALL *API_KEY* VARS
|
|
21
|
-
return {
|
|
22
|
-
cwd,
|
|
23
|
-
env: { ...filteredEnv, PI_CREW_PARENT_PID: String(process.pid) },
|
|
24
|
-
...
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
The `sanitizeEnvSecrets()` function (in `src/utils/env-filter.ts`) uses a deny-list
|
|
30
|
-
pattern to filter out keys matching secret patterns:
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
SECRET_KEY_PATTERN = /(?:^|[_.-])(token|api[-_]?key|password|passwd|secret|credential|authorization|private[-_]?key)(?:$|[_.-])/i;
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
`MINIMAX_API_KEY` matches this pattern because `_API_KEY` contains `api_key` as a
|
|
37
|
-
substring, which matches the `api[-_]?key` part of the regex.
|
|
38
|
-
|
|
39
|
-
### Why foreground (live-session) works fine
|
|
40
|
-
|
|
41
|
-
The live-session runtime in `live-session-runtime.ts` uses the SAME parent Pi session
|
|
42
|
-
that already has the API key loaded. There's no separate child process — the live
|
|
43
|
-
session inherits the parent's environment directly. No `sanitizeEnvSecrets()` call.
|
|
44
|
-
|
|
45
|
-
### Why background (child-process) fails
|
|
46
|
-
|
|
47
|
-
1. `team action='run'` with async=true → `background-runner.ts` → `child-pi.ts`
|
|
48
|
-
2. Child Pi is spawned via `spawn()` with `buildChildPiSpawnOptions()`
|
|
49
|
-
3. `buildChildPiSpawnOptions` calls `sanitizeEnvSecrets()` which strips `MINIMAX_API_KEY`
|
|
50
|
-
4. Child Pi starts with no API key → cannot authenticate with MiniMax → hangs silently
|
|
51
|
-
5. After 300s of no output, `response_timeout` fires and kills the process
|
|
52
|
-
|
|
53
|
-
## Evidence
|
|
54
|
-
|
|
55
|
-
All 7+ failed background workers show the same pattern:
|
|
56
|
-
- `worker.spawned` — PID confirmed, process is alive
|
|
57
|
-
- `task.attention` — 223+ seconds of idle (no stdout, no stderr, no jsonEvents)
|
|
58
|
-
- `worker.response_timeout` — "No output for 300000ms"
|
|
59
|
-
- `worker.exit` — `exitCode=null` (SIGTERM kill)
|
|
60
|
-
|
|
61
|
-
No error output because the child Pi can't even report an auth failure — it simply
|
|
62
|
-
silently waits for a model response that never comes.
|
|
63
|
-
|
|
64
|
-
## Fix
|
|
65
|
-
|
|
66
|
-
**File:** `src/runtime/child-pi.ts`
|
|
67
|
-
|
|
68
|
-
In `buildChildPiSpawnOptions()`, change the `sanitizeEnvSecrets()` call to preserve
|
|
69
|
-
model provider API keys:
|
|
70
|
-
|
|
71
|
-
```typescript
|
|
72
|
-
function buildChildPiSpawnOptions(cwd: string, env: NodeJS.ProcessEnv): SpawnOptions {
|
|
73
|
-
// Preserve model provider API keys (MINIMAX_API_KEY, OPENAI_API_KEY, etc.)
|
|
74
|
-
// These are needed by the child Pi to call the configured model provider.
|
|
75
|
-
const filteredEnv = sanitizeEnvSecrets(env, {
|
|
76
|
-
allowList: ["MINIMAX_*", "OPENAI_*", "ANTHROPIC_*", "GOOGLE_*", "AZURE_*", "AWS_*", "ZEU_*", "ZERODEV_*", "*_API_KEY", "*_TOKEN", "*_SECRET"],
|
|
77
|
-
});
|
|
78
|
-
return {
|
|
79
|
-
cwd,
|
|
80
|
-
env: { ...filteredEnv, PI_CREW_PARENT_PID: String(process.pid) },
|
|
81
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
82
|
-
detached: process.platform !== "win32",
|
|
83
|
-
windowsHide: true,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
This uses the allow-list mode of `sanitizeEnvSecrets()` which only preserves keys
|
|
89
|
-
matching the globs. All other secret-like keys (passwords, credentials, etc.) are still
|
|
90
|
-
stripped. Only model API keys needed for the child process to call the LLM are
|
|
91
|
-
preserved.
|
|
92
|
-
|
|
93
|
-
## Why this is safe
|
|
94
|
-
|
|
95
|
-
- Model API keys are not sensitive in the same way as passwords — they're designed
|
|
96
|
-
to be passed to API endpoints
|
|
97
|
-
- The allow-list is specific to known provider prefixes — it doesn't blanket-allow
|
|
98
|
-
all env vars
|
|
99
|
-
- Other secrets (DB passwords, internal credentials) are still filtered out
|
|
100
|
-
- The `PI_CREW_PARENT_PID` is added after filtering so it won't conflict
|
|
101
|
-
|
|
102
|
-
## Verification Plan
|
|
103
|
-
|
|
104
|
-
1. Apply the fix to `src/runtime/child-pi.ts`
|
|
105
|
-
2. Restart Pi to reload the extension
|
|
106
|
-
3. Run a background team (e.g., `team action='run', team='research', async=true`)
|
|
107
|
-
4. Verify the child process produces output within the first 30 seconds
|
|
108
|
-
5. Compare env of child process (add temporary debug logging) to confirm
|
|
109
|
-
`MINIMAX_API_KEY` is present
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# Bug #11: Background Runner "spawn pi ENOENT" — pi binary not in PATH
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-05-19
|
|
4
|
-
**Severity:** 🔴 HIGH
|
|
5
|
-
**Type:** Regression (broken in current session)
|
|
6
|
-
**Status:** ✅ Fixed — added `resolvePiCliScript()` call for non-Windows platforms
|
|
7
|
-
|
|
8
|
-
## Summary
|
|
9
|
-
|
|
10
|
-
Background async team runs fail immediately with "spawn pi ENOENT" because the `getPiSpawnCommand()` function returns `command: "pi"` without resolving the full path on non-Windows platforms. When the detached background-runner process starts with a minimal PATH environment, it cannot find the `pi` binary.
|
|
11
|
-
|
|
12
|
-
## Root Cause
|
|
13
|
-
|
|
14
|
-
In `src/runtime/pi-spawn.ts` line 153-171:
|
|
15
|
-
|
|
16
|
-
```typescript
|
|
17
|
-
export function getPiSpawnCommand(args: string[]): PiSpawnCommand {
|
|
18
|
-
// ...
|
|
19
|
-
if (process.platform === "win32") {
|
|
20
|
-
const script = resolvePiCliScript(); // ← Only called on Windows!
|
|
21
|
-
if (script) return { command: process.execPath, args: [script, ...args] };
|
|
22
|
-
}
|
|
23
|
-
return { command: "pi", args }; // ← Returns bare "pi" on Linux/macOS!
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
On Windows, the full path to the Pi entry point script is resolved via `resolvePiCliScript()`. On Linux/macOS, the function returns `command: "pi"` which relies on PATH lookup. When the detached background-runner process inherits a minimal PATH, `pi` is not found → `ENOENT`.
|
|
28
|
-
|
|
29
|
-
## Why Live-Session Works
|
|
30
|
-
|
|
31
|
-
Live-session runs use `child-pi.ts` → `getPiSpawnCommand()` for spawning child workers, but the parent Pi session has the full PATH including `/home/bom/.nvm/versions/node/v22.22.0/bin`. However, there was also a live-session failure in round 3 with "caller_cancelled" — likely a different issue (compaction guard, Bug #6).
|
|
32
|
-
|
|
33
|
-
## Why Earlier Async Runs Worked
|
|
34
|
-
|
|
35
|
-
Earlier async runs (before current session) had workers that:
|
|
36
|
-
1. Spawned successfully (`worker.spawned` event with real PID)
|
|
37
|
-
2. Ran for 5 minutes producing zero output
|
|
38
|
-
3. Timed out with `response_timeout`
|
|
39
|
-
|
|
40
|
-
Those were the SAME underlying bug (#10/8): `MINIMAX_API_KEY` filtered out. But they DID find the `pi` binary — meaning something changed in the current session that broke the PATH further.
|
|
41
|
-
|
|
42
|
-
The NEW "spawn pi ENOENT" failure in the current session test is a SEPARATE issue: the background runner itself can't find `pi`, not just the child workers.
|
|
43
|
-
|
|
44
|
-
## Fix
|
|
45
|
-
|
|
46
|
-
**File:** `src/runtime/pi-spawn.ts`
|
|
47
|
-
|
|
48
|
-
Changed from:
|
|
49
|
-
|
|
50
|
-
```typescript
|
|
51
|
-
if (process.platform === "win32") {
|
|
52
|
-
const script = resolvePiCliScript();
|
|
53
|
-
if (script) return { command: process.execPath, args: [script, ...args] };
|
|
54
|
-
}
|
|
55
|
-
return { command: "pi", args };
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
To:
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
if (process.platform === "win32") {
|
|
62
|
-
const script = resolvePiCliScript();
|
|
63
|
-
if (script) return { command: process.execPath, args: [script, ...args] };
|
|
64
|
-
}
|
|
65
|
-
// Linux/macOS: also resolve the full path so child processes can find 'pi' even if
|
|
66
|
-
// PATH is minimal (e.g. in detached background-runner processes). Fall back to "pi"
|
|
67
|
-
// only if resolution fails.
|
|
68
|
-
const script = resolvePiCliScript();
|
|
69
|
-
if (script) return { command: process.execPath, args: [script, ...args] };
|
|
70
|
-
return { command: "pi", args };
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
`resolvePiCliScript()` on Linux walks from `argv[1]` upward to find the pi-crew package root, then locates the Pi CLI script from the package bin. This gives an absolute path that doesn't depend on PATH.
|
|
74
|
-
|
|
75
|
-
## Why `resolvePiCliScript()` Works
|
|
76
|
-
|
|
77
|
-
On Linux, `process.argv[1]` for the running Node process points to the pi-crew entry script. Walking up the directory tree finds the `@mariozechner/pi-coding-agent` package root, then reads its `bin.pi` field to get the absolute path to the Pi CLI script (e.g., `/home/bom/.nvm/versions/node/v22.22.0/lib/node_modules/@mariozechner/pi-coding-agent/dist/cli.cjs`).
|
|
78
|
-
|
|
79
|
-
This absolute path is then passed to `process.execPath` (Node.js) as the first argument, so the child process runs with:
|
|
80
|
-
```
|
|
81
|
-
node /path/to/pi/dist/cli.cjs [args]
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
This doesn't need PATH at all.
|
|
85
|
-
|
|
86
|
-
## Verification Plan
|
|
87
|
-
|
|
88
|
-
1. Restart Pi to reload pi-crew with the fix
|
|
89
|
-
2. Run `team action='run', async=true` with a simple research task
|
|
90
|
-
3. Verify `worker.spawned` events appear within 5 seconds
|
|
91
|
-
4. Verify workers produce output within 60 seconds (not 300s timeout)
|
|
92
|
-
5. Verify final run status is `completed` not `failed`
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
# Bug #12: Child-process crash "Failed to run npm root -g" — essential env vars stripped
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-05-19
|
|
4
|
-
**Severity:** 🔴 HIGH
|
|
5
|
-
**Type:** Bug (regression from Bug #10 fix)
|
|
6
|
-
**Status:** ✅ Fixed — added essential env vars to allow-list
|
|
7
|
-
|
|
8
|
-
## Summary
|
|
9
|
-
|
|
10
|
-
Child Pi workers crash immediately after spawning with:
|
|
11
|
-
```
|
|
12
|
-
Error: Failed to run npm root -g: undefined
|
|
13
|
-
at DefaultPackageManager.runNpmCommandSync (...)
|
|
14
|
-
at DefaultPackageManager.getGlobalNpmRoot (...)
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
The child Pi starts but can't find `npm` because `PATH` was stripped from its environment.
|
|
18
|
-
|
|
19
|
-
## Root Cause
|
|
20
|
-
|
|
21
|
-
**Bug #10's fix introduced Bug #12.** The `sanitizeEnvSecrets()` function in allow-list mode ONLY preserves keys matching the allow-list. All other keys are stripped. The Bug #10 fix used an allow-list that only included model provider API keys, but stripped ALL other env vars including essential ones like `PATH`, `HOME`, `USER`, etc.
|
|
22
|
-
|
|
23
|
-
```typescript
|
|
24
|
-
// Bug #10 fix (BROKEN):
|
|
25
|
-
const filteredEnv = sanitizeEnvSecrets(env, {
|
|
26
|
-
allowList: [
|
|
27
|
-
"MINIMAX_*", "OPENAI_*", "*_API_KEY", "*_TOKEN", "*_SECRET",
|
|
28
|
-
// Missing: PATH, HOME, USER, etc.
|
|
29
|
-
],
|
|
30
|
-
});
|
|
31
|
-
// Result: child process gets ONLY model API keys, nothing else
|
|
32
|
-
// → Child can't find npm/node/PATH → crashes immediately
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
**The `sanitizeEnvSecrets` allow-list mode works like this:**
|
|
36
|
-
- With allow-list: preserve ONLY keys matching the list, strip everything else
|
|
37
|
-
- Without allow-list: strip only keys matching SECRET_KEY_PATTERN, preserve everything else
|
|
38
|
-
|
|
39
|
-
So the Bug #10 fix preserved `MINIMAX_API_KEY` but stripped `PATH`, making it impossible for the child Pi to find `npm`.
|
|
40
|
-
|
|
41
|
-
## Why It Looked Like "spawn pi ENOENT" Before (Bug #11)
|
|
42
|
-
|
|
43
|
-
In the previous session, background workers failed with `spawn pi ENOENT` immediately because:
|
|
44
|
-
1. `getPiSpawnCommand()` returned bare `"pi"` without path resolution (Bug #11)
|
|
45
|
-
2. The detached background runner had minimal PATH
|
|
46
|
-
3. Fix: added `resolvePiCliScript()` for non-Windows (Bug #11 fix)
|
|
47
|
-
|
|
48
|
-
After Bug #11 fix + Pi restart, workers spawn OK but crash with `npm root -g` error because:
|
|
49
|
-
1. `getPiSpawnCommand()` now resolves full path
|
|
50
|
-
2. Child process starts but has no `PATH` → can't find `npm`
|
|
51
|
-
3. Pi's package manager calls `npm root -g` → fails with ENOENT
|
|
52
|
-
|
|
53
|
-
## Fix Applied
|
|
54
|
-
|
|
55
|
-
**File:** `src/runtime/child-pi.ts` — `buildChildPiSpawnOptions()`
|
|
56
|
-
|
|
57
|
-
Added essential non-secret env vars to the allow-list:
|
|
58
|
-
|
|
59
|
-
```typescript
|
|
60
|
-
const filteredEnv = sanitizeEnvSecrets(env, {
|
|
61
|
-
allowList: [
|
|
62
|
-
// Model provider API keys (Bug #10)
|
|
63
|
-
"MINIMAX_*", "OPENAI_*", "ANTHROPIC_*", "GOOGLE_*",
|
|
64
|
-
"AZURE_*", "AWS_*", "ZEU_*", "ZERODEV_*",
|
|
65
|
-
"*_API_KEY", "*_TOKEN", "*_SECRET",
|
|
66
|
-
// Essential non-secret vars (Bug #12 fix)
|
|
67
|
-
"PATH", "HOME", "USER", "SHELL", "TERM", "LANG", "LC_*", "XDG_*",
|
|
68
|
-
"NVM_*", "NODE_*", "npm_*", "PI_*", "PI_CREW_*", "PI_TEAMS_*",
|
|
69
|
-
],
|
|
70
|
-
});
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
This preserves both:
|
|
74
|
-
1. Model provider API keys (Bug #10 fix)
|
|
75
|
-
2. Essential environment variables so child process can function (Bug #12 fix)
|
|
76
|
-
|
|
77
|
-
## Why Not Use Deny-List Mode?
|
|
78
|
-
|
|
79
|
-
In deny-list mode (no allow-list), `SECRET_KEY_PATTERN` strips any key matching secret patterns including `MINIMAX_API_KEY` (because `_API_KEY` matches the pattern). This was the original Bug #10 root cause.
|
|
80
|
-
|
|
81
|
-
The allow-list approach is correct — we just need to include both model API keys AND essential env vars.
|
|
82
|
-
|
|
83
|
-
## Verification
|
|
84
|
-
|
|
85
|
-
After this fix, background workers should:
|
|
86
|
-
1. Spawn successfully (Bug #11 verified)
|
|
87
|
-
2. Find `npm` and `node` via PATH (Bug #12 verified)
|
|
88
|
-
3. Authenticate with MiniMax via `MINIMAX_API_KEY` (Bug #10 verified)
|
|
89
|
-
4. Produce output within 60 seconds (not 300s timeout)
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
# Bug #13 Fix: Background Runner Death — Full Fix
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-19
|
|
4
|
-
**Root Cause**: Background runner process dies ~59s after spawning — likely OOM killer or external SIGKILL
|
|
5
|
-
**Status**: ✅ Fixed (3-layer protection)
|
|
6
|
-
|
|
7
|
-
## Problem
|
|
8
|
-
|
|
9
|
-
Background runner process (PID 512666) died ~59 seconds after spawning. Workers spawned but produced zero output. The stale reconciler detected the dead PID and repaired the run.
|
|
10
|
-
|
|
11
|
-
Key evidence:
|
|
12
|
-
- `async.started` event written (runner started successfully)
|
|
13
|
-
- Workers spawned (PIDs 512751, 512759)
|
|
14
|
-
- No output from workers (Bug #10: MINIMAX_API_KEY stripped)
|
|
15
|
-
- `pid_dead` found at 14:19:04 (~59s after start)
|
|
16
|
-
- No `async.failed` event written (SIGKILL can't be caught)
|
|
17
|
-
- dmesg OOM was for different PID (vitest PID 2910570)
|
|
18
|
-
|
|
19
|
-
## Fixes Applied (3 Layers)
|
|
20
|
-
|
|
21
|
-
### Layer 1: Heartbeat Mechanism (prevents false repairs)
|
|
22
|
-
|
|
23
|
-
Files: `src/runtime/background-runner.ts`, `src/runtime/stale-reconciler.ts`
|
|
24
|
-
|
|
25
|
-
The background runner writes a `heartbeat.json` file every 15 seconds with PID, timestamp, and memory usage. The stale reconciler checks the heartbeat before declaring a PID dead:
|
|
26
|
-
- If heartbeat is < 5 minutes old → treat as alive (don't repair)
|
|
27
|
-
- If heartbeat is > 5 minutes old AND PID is dead → repair
|
|
28
|
-
|
|
29
|
-
This prevents the stale reconciler from false-positive repairs when the runner was killed by SIGKILL.
|
|
30
|
-
|
|
31
|
-
### Layer 2: Memory Limit (prevents OOM kills)
|
|
32
|
-
|
|
33
|
-
File: `src/runtime/async-runner.ts`
|
|
34
|
-
|
|
35
|
-
Added `--max-old-space-size=512` to the background runner's Node.js arguments:
|
|
36
|
-
```typescript
|
|
37
|
-
const memoryLimit = "--max-old-space-size=512";
|
|
38
|
-
// args: [memoryLimit, "--import", loaderPath, runnerPath, ...]
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
This limits V8 heap to 512MB (generous for the lightweight runner). Without this limit, Node.js defaults to ~1.5GB on 64-bit, which combined with jiti compilation and child processes can exhaust system memory and trigger the OOM killer.
|
|
42
|
-
|
|
43
|
-
### Layer 3: Signal Handlers + Memory Monitoring (diagnostic)
|
|
44
|
-
|
|
45
|
-
File: `src/runtime/background-runner.ts`
|
|
46
|
-
|
|
47
|
-
1. **SIGTERM/SIGINT handlers**: Log `async.failed` event before exiting. This distinguishes:
|
|
48
|
-
- OOM/SIGKILL: no event written (can't catch SIGKILL)
|
|
49
|
-
- SIGTERM/SIGINT: event written with signal name
|
|
50
|
-
- Normal exit: `async.completed` event
|
|
51
|
-
|
|
52
|
-
2. **Memory monitoring in heartbeat**: Each heartbeat writes `heapUsedMb` and `rssMb`:
|
|
53
|
-
```json
|
|
54
|
-
{ "pid": 12345, "at": 1718794685321, "runId": "...", "memory": { "heapUsedMb": 87, "rssMb": 145 } }
|
|
55
|
-
```
|
|
56
|
-
This allows post-mortem analysis — if `rssMb` was climbing before death, OOM is confirmed.
|
|
57
|
-
|
|
58
|
-
## Files Modified
|
|
59
|
-
|
|
60
|
-
| File | Change |
|
|
61
|
-
|---|---|
|
|
62
|
-
| `src/runtime/async-runner.ts` | Added `--max-old-space-size=512` to background runner args |
|
|
63
|
-
| `src/runtime/background-runner.ts` | Heartbeat with memory stats; SIGTERM/SIGINT handlers |
|
|
64
|
-
| `src/runtime/stale-reconciler.ts` | Heartbeat-aware PID liveness check (from earlier fix) |
|
|
65
|
-
|
|
66
|
-
## Verification
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
cd /home/bom/source/my_pi/pi-crew
|
|
70
|
-
npx tsc --noEmit # No errors
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Diagnosis Flow (Post-Fix)
|
|
74
|
-
|
|
75
|
-
When a background runner dies:
|
|
76
|
-
|
|
77
|
-
1. Check events for `async.failed` with `signal: "SIGTERM"/"SIGINT"` → signal kill (Layer 3)
|
|
78
|
-
2. Check `heartbeat.json` for `memory.rssMb` → if climbing → OOM (Layer 2 prevents)
|
|
79
|
-
3. Check `heartbeat.json` for `at` timestamp → if fresh → false-positive repair prevented (Layer 1)
|
|
80
|
-
4. No `async.failed` event AND stale heartbeat → SIGKILL/OOM (uncatchable)
|
|
81
|
-
|
|
82
|
-
## Remaining Risk
|
|
83
|
-
|
|
84
|
-
If the Linux OOM killer sends SIGKILL (uncatchable), the background runner will die without writing any event. The heartbeat mechanism prevents false repairs for 5 minutes, giving time for investigation. The memory limit (`--max-old-space-size=512`) significantly reduces the chance of triggering the OOM killer by keeping the runner's memory footprint small.
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
# Bug #14 Fix: Infinite Retry Loop — needs_attention Task Re-scheduled
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-20
|
|
4
|
-
**Root Cause**: `needs_attention` task status had `queue: "blocked"` instead of `queue: "done"` in task graph
|
|
5
|
-
**Status**: ✅ Fixed
|
|
6
|
-
|
|
7
|
-
## Problem
|
|
8
|
-
|
|
9
|
-
When a task ended with `needs_attention` status (worker completed without calling `submit_result`), the team-runner kept re-scheduling the task in an infinite loop.
|
|
10
|
-
|
|
11
|
-
### Symptoms
|
|
12
|
-
- 942 `task.started` events for `01_explore`
|
|
13
|
-
- 1882 `task.needs_attention` events
|
|
14
|
-
- Task `01_explore` had `status: "running"` but `finishedAt: "2026-05-20T01:57:46.097Z"` (finished but status was "running")
|
|
15
|
-
- `queue: "blocked"` in task graph for `needs_attention` tasks
|
|
16
|
-
- No `task.completed` events
|
|
17
|
-
|
|
18
|
-
### Run Data (from `team_20260520015649_42079220e6ef2860`)
|
|
19
|
-
```
|
|
20
|
-
Task 01_explore:
|
|
21
|
-
status: running
|
|
22
|
-
stepId: explore
|
|
23
|
-
graph.queue: blocked
|
|
24
|
-
dependsOn: []
|
|
25
|
-
finishedAt: 2026-05-20T01:57:46.114Z
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Root Cause
|
|
29
|
-
|
|
30
|
-
In `src/runtime/task-graph-scheduler.ts`, the `withQueue()` function assigned `queue: "done"` only for `"completed"` and `"skipped"` statuses, but NOT for `"needs_attention"`:
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
// BEFORE (bug):
|
|
34
|
-
if (task.status === "completed" || task.status === "skipped") {
|
|
35
|
-
return { ...task, graph: { ...task.graph, queue: "done" } };
|
|
36
|
-
}
|
|
37
|
-
return { ...task, graph: { ...task.graph, queue: "blocked" } };
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
This meant `needs_attention` tasks got `queue: "blocked"`, making them appear in `taskGraphSnapshot(tasks).ready` as "ready" even though they were terminal.
|
|
41
|
-
|
|
42
|
-
The team-runner's main loop:
|
|
43
|
-
1. Computed `effectiveReady` from `taskGraphSnapshot(tasks).ready`
|
|
44
|
-
2. `effectiveReady` included tasks with `queue: "blocked"` (because they had `needs_attention` status)
|
|
45
|
-
3. These tasks were added to `readyBatch` and re-spawned
|
|
46
|
-
|
|
47
|
-
## Fix
|
|
48
|
-
|
|
49
|
-
Added `needs_attention` to the terminal status check in `withQueue()`:
|
|
50
|
-
|
|
51
|
-
```typescript
|
|
52
|
-
// AFTER (fix):
|
|
53
|
-
if (task.status === "completed" || task.status === "skipped" || task.status === "needs_attention") {
|
|
54
|
-
return { ...task, graph: { ...task.graph, queue: "done" } };
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## File Changed
|
|
59
|
-
|
|
60
|
-
| File | Change |
|
|
61
|
-
|---|---|
|
|
62
|
-
| `src/runtime/task-graph-scheduler.ts` | Added `needs_attention` to terminal queue assignment |
|
|
63
|
-
|
|
64
|
-
## Verification
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
cd /home/bom/source/my_pi/pi-crew
|
|
68
|
-
npx tsc --noEmit # No errors
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
After fix, `needs_attention` tasks have `queue: "done"` in task graph, so they won't be re-scheduled.
|
|
72
|
-
|
|
73
|
-
## Related Behavior
|
|
74
|
-
|
|
75
|
-
- `needs_attention` already correctly blocks phase advancement in `team-runner.ts` (`terminalStatuses` includes `needs_attention`)
|
|
76
|
-
- `needs_attention` correctly does NOT satisfy DAG dependencies (only `completed` does)
|
|
77
|
-
- Phase advancement checks `terminalStatuses.has(task.status)` which includes `needs_attention`
|
|
78
|
-
|
|
79
|
-
This ensures:
|
|
80
|
-
1. `needs_attention` tasks are treated as terminal (don't block phases)
|
|
81
|
-
2. `needs_attention` tasks have `queue: "done"` (don't get re-scheduled)
|
|
82
|
-
3. Downstream tasks with `dependsOn` on a `needs_attention` task correctly stay blocked
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# Bug #15: Background Runner Receives SIGTERM ~3s After Spawn
|
|
2
|
-
|
|
3
|
-
## Status: ✅ Fixed — Disabled async by default
|
|
4
|
-
|
|
5
|
-
## Fix Applied: Disable Async by Default
|
|
6
|
-
**File:** `src/extension/team-tool/run.ts`
|
|
7
|
-
```typescript
|
|
8
|
-
// Background runners are disabled by default because Pi infrastructure sends SIGTERM to
|
|
9
|
-
// async children ~3s after spawn (Bug #15). Set to true to enable background runs.
|
|
10
|
-
// const runAsync = params.async ?? loadedConfig.config.asyncByDefault ?? false;
|
|
11
|
-
const runAsync = false; // TEMP: always false until SIGTERM issue is fixed
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
**Verification (2026-05-20):** Full 4-task team run `team_20260520091127_8bcd4ca6f9fa84f5` completed successfully in ~4 minutes using foreground blocking mode. 01_explore, 02_plan, 03_execute, 04_verify all completed with `status=completed`. No SIGTERM because no background runner was spawned.
|
|
15
|
-
|
|
16
|
-
**Root Cause:** Pi CLI infrastructure sends SIGTERM to async background runners ~3s after spawn. `setsid:true` does not work in Node.js 22.22.0. No fix available from pi-crew side — requires Pi infrastructure change or Node.js fix.
|
|
17
|
-
|
|
18
|
-
## Symptom (Historical)
|
|
19
|
-
All async background runners die with SIGTERM approximately 3 seconds after spawning, regardless of workload or configuration. The SIGTERM comes from the Pi CLI process.
|
|
20
|
-
|
|
21
|
-
## Timeline (from events.jsonl)
|
|
22
|
-
```
|
|
23
|
-
06:56:31.549 async.spawned (background runner created, pid noted)
|
|
24
|
-
06:56:32.466 async.started (background runner main() begins executing)
|
|
25
|
-
06:56:32.691 worker.spawned 01_explore (child Pi worker spawned)
|
|
26
|
-
06:56:32.706 worker.spawned 02_plan (child Pi worker spawned)
|
|
27
|
-
06:56:35.713 async.failed SIGTERM received from pi process (ppid=1509889)
|
|
28
|
-
→ background runner exits with code 143
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Root Cause Analysis
|
|
32
|
-
|
|
33
|
-
### Pi Infrastructure Cleanup — CONFIRMED
|
|
34
|
-
Pi CLI infrastructure sends SIGTERM to direct children when the tool call that spawned them returns. This is normal cleanup behavior for detached processes.
|
|
35
|
-
|
|
36
|
-
**Evidence:**
|
|
37
|
-
- SIGTERM sender PID = Pi process (1509889) — exactly where `crew_agent` tool runs
|
|
38
|
-
- SIGTERM arrives at a consistent ~3s interval after `async.started`
|
|
39
|
-
- No OOM, no dmesg entries, no pi-crew internal kill(SIGTERM) calls exist
|
|
40
|
-
- Pi source has SIGTERM handling for subprocess cleanup
|
|
41
|
-
|
|
42
|
-
### setsid Bug in Node.js 22.22.0 — Confirmed
|
|
43
|
-
`setsid: true` does not actually create a new session in Node.js 22.22.0. The background runner remains in the Pi process's process group (PGID=1509889). This was confirmed by direct testing showing that `detached: true` + `setsid: true` does NOT result in the child having its own PGID.
|
|
44
|
-
|
|
45
|
-
### Key Discovery: Orphaned Workers Survive
|
|
46
|
-
After SIGTERM kills the background runner, orphaned workers continue running:
|
|
47
|
-
```
|
|
48
|
-
07:03:39.148 SIGTERM → background runner DIES but orphaned workers CONTINUE
|
|
49
|
-
07:08:39 stale-reconciler detects dead heartbeat → cancel orphaned tasks
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
This proves:
|
|
53
|
-
1. Child workers are properly detached (PPID=1 or independent PG)
|
|
54
|
-
2. Pi only sends SIGTERM to **direct children** (background runner), not grandchildren
|
|
55
|
-
3. The issue is that background-runner is a direct child and gets killed
|
|
56
|
-
|
|
57
|
-
## Files Modified
|
|
58
|
-
```
|
|
59
|
-
src/extension/team-tool/run.ts — runAsync = false (disabled async by default)
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## Future Considerations
|
|
63
|
-
1. **Re-enable async** when Pi infrastructure is fixed or Node.js setsid works correctly
|
|
64
|
-
2. **Shell wrapper approach** — spawn via `/bin/sh -c 'exec setsid node ...'` as intermediate process
|
|
65
|
-
3. **Report to Pi maintainers** — the Pi infrastructure's cleanup behavior may need adjustment for long-running async workers
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Bug #17: Background Runner Dies at ~35s — Root Cause
|
|
2
|
-
|
|
3
|
-
## Summary
|
|
4
|
-
|
|
5
|
-
Background runners (async mode) were dying ~35 seconds after spawn — before workers could complete. This was NOT caused by Pi's `killTrackedDetachedChildren` mechanism or any external kill signal.
|
|
6
|
-
|
|
7
|
-
## Root Cause
|
|
8
|
-
|
|
9
|
-
**`session_shutdown` fires frequently during normal operation**, not just on exit.
|
|
10
|
-
|
|
11
|
-
Pi's agent-session fires `session_shutdown` for:
|
|
12
|
-
- `session_fork` — when a subagent/fork session starts
|
|
13
|
-
- `session_resume` — when resuming a previous session
|
|
14
|
-
- `session_new` — when creating a new session
|
|
15
|
-
|
|
16
|
-
Every time `session_shutdown` fires, pi-crew's `cleanupRuntime()` was called:
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
// register.ts - OLD CODE (BUG #17)
|
|
20
|
-
pi.on("session_shutdown", () => cleanupRuntime());
|
|
21
|
-
|
|
22
|
-
// Inside cleanupRuntime():
|
|
23
|
-
for (const manifest of manifestCache.list(50)) {
|
|
24
|
-
if (manifest.async?.pid !== undefined && checkProcessLiveness(manifest.async.pid).alive) {
|
|
25
|
-
killProcessPid(manifest.async.pid); // ← THIS KILLED THE RUNNER
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
Since `session_shutdown` fires every 30-35 seconds during normal operation (whenever the agent session forks/resumes), this kill loop terminated the background runner almost immediately.
|
|
31
|
-
|
|
32
|
-
## Why setsid+detached didn't fully help
|
|
33
|
-
|
|
34
|
-
`detached: true` + `setsid: true` gives the runner its own session and process group, making it immune to terminal signals and process group kills. However, `killProcessPid(pid)` sends `SIGKILL` directly to the specific PID — and since the kill loop was actively reading the manifest cache, it knew the exact runner PID to kill.
|
|
35
|
-
|
|
36
|
-
## The Fix
|
|
37
|
-
|
|
38
|
-
Comment out the async runner kill loop in `cleanupRuntime()`:
|
|
39
|
-
|
|
40
|
-
```typescript
|
|
41
|
-
// register.ts - FIXED CODE
|
|
42
|
-
// NOTE: Background runners are designed to outlive the Pi session.
|
|
43
|
-
// Do NOT kill them on session_shutdown — they manage their own lifecycle.
|
|
44
|
-
// (The kill loop was commented out here)
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Async runners are designed to outlive the parent Pi session. They self-terminate when:
|
|
48
|
-
- The run completes (async.completed event written)
|
|
49
|
-
- The run fails (async.failed event written)
|
|
50
|
-
- The stale reconciler detects they're truly dead
|
|
51
|
-
- They detect their parent (Pi) is gone via parent-guard
|
|
52
|
-
|
|
53
|
-
## Files Changed
|
|
54
|
-
|
|
55
|
-
- `src/extension/register.ts` — commented out killAsync loop in cleanupRuntime
|
|
56
|
-
|
|
57
|
-
## Verification
|
|
58
|
-
|
|
59
|
-
After the fix, a background runner (PID 55515) with systemd-run survived 160+ seconds and completed its lifecycle normally (timed out at 5 min due to unresponsive model — different issue).
|
|
60
|
-
|
|
61
|
-
## Related Investigation
|
|
62
|
-
|
|
63
|
-
- `systemd-run --user` was tested as an alternative spawn method — it works and provides additional isolation
|
|
64
|
-
- `setsid: true` is confirmed working in Node.js 22.22.0 (creates own session/PGID)
|
|
65
|
-
- The strace diagnostic was crucial: showed PID 20654 (Pi bash child) calling `kill(-20533, SIGTERM/SIGKILL)` on all old runner PIDs — this was Pi's cleanup hitting the strace wrapper's PID, not the runner itself
|
|
66
|
-
- Final spawn uses `spawn()` with `detached: true`, `setsid: true as any`, stdio ignored, unref'd — clean and minimal
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# Bug #17: Background Runner Killed by Pi's SIGKILL After Tool Execution
|
|
2
|
-
|
|
3
|
-
## Status: ✅ Fixed — Direct spawn with SIGTERM ignore-all
|
|
4
|
-
|
|
5
|
-
## Symptom
|
|
6
|
-
Background runner process dies silently ~7 seconds after spawning. No error events, no catch blocks fire. The process simply disappears.
|
|
7
|
-
|
|
8
|
-
## Root Cause
|
|
9
|
-
Pi's infrastructure sends SIGTERM to child processes when tool execution completes. The background runner (spawned by the team tool) receives these SIGTERMs and, with the original signal handler that checked `isPiProcess()`, would exit on non-Pi SIGTERMs. Even after fixing the SIGTERM handler to ignore all, the runner was being killed during jiti compilation of `team-runner.ts` — likely due to the runner being in Pi's process group.
|
|
10
|
-
|
|
11
|
-
## Fix Applied
|
|
12
|
-
**Direct spawn with `setsid: true` and ignore-all SIGTERM handler:**
|
|
13
|
-
|
|
14
|
-
1. **`async-runner.ts`**: Spawn runner directly (no double-fork detacher) with `detached: true, setsid: true` — runner gets its own session/process group
|
|
15
|
-
2. **`background-runner.ts`**: SIGTERM handler ignores ALL SIGTERMs (removed `isPiProcess()` check), since with setsid the runner is its own session leader
|
|
16
|
-
3. **`background-runner.ts`**: Removed `process.exit(1)` from unhandled rejection guard — now just sets exitCode and continues
|
|
17
|
-
4. **`child-pi.ts`**: Added `setsid: true` to child Pi spawn options — workers get their own PGIDs, preventing cascade kills
|
|
18
|
-
|
|
19
|
-
## What Didn't Work
|
|
20
|
-
- **Double-fork (detacher)**: Created an intermediate "detacher" process that spawned the runner then exited. The runner died at t+7s even with detacher alive. Root cause unclear — possibly fd inheritance issue or jiti compilation interaction.
|
|
21
|
-
- **`setsid` only**: With setsid but without ignore-all SIGTERM handler, runner received SIGTERMs and exited.
|
|
22
|
-
- **Ignore SIGTERM from Pi only**: With `isPiProcess()` check, SIGTERMs from systemd (after double-fork reparenting) weren't ignored.
|
|
23
|
-
|
|
24
|
-
## Verification
|
|
25
|
-
- Direct spawn runner alive after 2+ minutes ✅
|
|
26
|
-
- Workers spawned and running ✅
|
|
27
|
-
- SIGTERMs properly ignored ✅
|
|
28
|
-
- `sleep 60` via double-fork survived (rules out Pi directly killing random PIDs) ✅
|