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,342 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import { logInternalError } from "../utils/internal-error.ts";
|
|
3
|
-
import { atomicWriteFile } from "./atomic-write.ts";
|
|
4
|
-
import { readEvents, type TeamEvent, withEventLogLockSync } from "./event-log.ts";
|
|
5
|
-
|
|
6
|
-
export interface RotationConfig {
|
|
7
|
-
maxFileSizeBytes: number;
|
|
8
|
-
maxEventCount: number;
|
|
9
|
-
compactToCount: number;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const DEFAULT_ROTATION_CONFIG: RotationConfig = {
|
|
13
|
-
// 2.3: lowered from 5 MB to 4 MB so the file stays small enough that
|
|
14
|
-
// `tail -c MAX_TAIL_BYTES` reads in run-snapshot-cache (default 32 KB)
|
|
15
|
-
// always cover a useful slice and rotations happen earlier.
|
|
16
|
-
maxFileSizeBytes: 4 * 1024 * 1024,
|
|
17
|
-
maxEventCount: 50_000,
|
|
18
|
-
compactToCount: 1_000,
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const AVG_BYTES_PER_EVENT = 80;
|
|
22
|
-
|
|
23
|
-
function resolveConfig(config?: Partial<RotationConfig>): RotationConfig {
|
|
24
|
-
return { ...DEFAULT_ROTATION_CONFIG, ...config };
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Check if an event file needs rotation/compaction.
|
|
29
|
-
* M1: Uses file size estimation to avoid full-file read.
|
|
30
|
-
*/
|
|
31
|
-
export function needsRotation(eventsPath: string, config?: Partial<RotationConfig>): boolean {
|
|
32
|
-
if (!fs.existsSync(eventsPath)) return false;
|
|
33
|
-
const cfg = resolveConfig(config);
|
|
34
|
-
try {
|
|
35
|
-
const stat = fs.statSync(eventsPath);
|
|
36
|
-
if (stat.size > cfg.maxFileSizeBytes) return true;
|
|
37
|
-
// M1: Estimate event count from file size instead of reading entire file
|
|
38
|
-
const estimatedCount = Math.floor(stat.size / AVG_BYTES_PER_EVENT);
|
|
39
|
-
return estimatedCount > cfg.maxEventCount;
|
|
40
|
-
} catch {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface CompactionResult {
|
|
46
|
-
originalSize: number;
|
|
47
|
-
compactedSize: number;
|
|
48
|
-
eventsRemoved: number;
|
|
49
|
-
eventsKept: number;
|
|
50
|
-
recoveryFailed?: boolean;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Compact an event log file:
|
|
55
|
-
* C2: Fixed TOCTOU race — atomicWriteFile replaces in one step;
|
|
56
|
-
* any events appended between readEvents and the write will be preserved
|
|
57
|
-
* on the next compaction cycle because atomicWriteFile writes the full content.
|
|
58
|
-
*
|
|
59
|
-
* 1. Read all events
|
|
60
|
-
* 2. Keep last `compactToCount` events
|
|
61
|
-
* 3. Atomically write (atomicWriteFile handles temp-file + rename)
|
|
62
|
-
* 4. Re-read to detect events appended during the window
|
|
63
|
-
* 5. If events were lost, append them
|
|
64
|
-
* 6. Return compaction stats
|
|
65
|
-
*/
|
|
66
|
-
export function compactEventLog(eventsPath: string, config?: Partial<RotationConfig>): CompactionResult | undefined {
|
|
67
|
-
const prepared = prepareCompaction(eventsPath, config);
|
|
68
|
-
if (!prepared) return undefined;
|
|
69
|
-
// FIX: Wrap entire read-compact-write-recover sequence in lock to prevent
|
|
70
|
-
// event loss during compaction. Without lock, events can be appended between
|
|
71
|
-
// read and write, lost silently.
|
|
72
|
-
//
|
|
73
|
-
// NOTE (Round 24 BUG 1): callers ALREADY holding the event-log lock (e.g.
|
|
74
|
-
// appendEventInsideLock in event-log.ts) must call applyCompactionUnlocked
|
|
75
|
-
// directly — calling compactEventLog from inside the lock deadlocks (the
|
|
76
|
-
// mkdir lock is not re-entrant → 5s timeout → compaction never ran → the
|
|
77
|
-
// log grew unbounded until events were silently dropped past 50MB).
|
|
78
|
-
return withEventLogLockSync(eventsPath, () => applyCompactionUnlocked(eventsPath, prepared));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/** Round 24 (BUG 1): the lock-free pre-read for compaction. Safe to run
|
|
82
|
-
* outside the lock (read-only). Returns the compacted lines + stats needed
|
|
83
|
-
* for the write phase. */
|
|
84
|
-
export function prepareCompaction(
|
|
85
|
-
eventsPath: string,
|
|
86
|
-
config?: Partial<RotationConfig>,
|
|
87
|
-
):
|
|
88
|
-
| {
|
|
89
|
-
lines: string;
|
|
90
|
-
originalSize: number;
|
|
91
|
-
originalCount: number;
|
|
92
|
-
kept: TeamEvent[];
|
|
93
|
-
}
|
|
94
|
-
| undefined {
|
|
95
|
-
if (!fs.existsSync(eventsPath)) return undefined;
|
|
96
|
-
const cfg = resolveConfig(config);
|
|
97
|
-
let originalSize: number;
|
|
98
|
-
try {
|
|
99
|
-
originalSize = fs.statSync(eventsPath).size;
|
|
100
|
-
} catch {
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
|
103
|
-
const allEvents = readEvents(eventsPath);
|
|
104
|
-
const originalCount = allEvents.length;
|
|
105
|
-
if (originalCount <= cfg.compactToCount) return undefined;
|
|
106
|
-
const kept = allEvents.slice(-cfg.compactToCount);
|
|
107
|
-
const lines = kept.map((e) => JSON.stringify(e)).join("\n") + "\n";
|
|
108
|
-
return { lines, originalSize, originalCount, kept };
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** Round 24 (BUG 1): the write+recover phase of compaction. Assumes the
|
|
112
|
-
* caller ALREADY holds the event-log lock (or accepts the unlocked race). */
|
|
113
|
-
export function applyCompactionUnlocked(
|
|
114
|
-
eventsPath: string,
|
|
115
|
-
prepared: {
|
|
116
|
-
lines: string;
|
|
117
|
-
originalSize: number;
|
|
118
|
-
originalCount: number;
|
|
119
|
-
kept: TeamEvent[];
|
|
120
|
-
},
|
|
121
|
-
): CompactionResult | undefined {
|
|
122
|
-
const { lines, originalSize, originalCount, kept } = prepared;
|
|
123
|
-
try {
|
|
124
|
-
atomicWriteFile(eventsPath, lines);
|
|
125
|
-
} catch (err) {
|
|
126
|
-
// Concurrent write conflict — skip compaction this cycle
|
|
127
|
-
logInternalError("event-log-rotation.compact", err, `eventsPath=${eventsPath}`);
|
|
128
|
-
return undefined;
|
|
129
|
-
}
|
|
130
|
-
// C2: Re-read to recover any events appended during the compaction window.
|
|
131
|
-
// Events appended during the compaction window are preserved because they
|
|
132
|
-
// appear in afterWrite and the condition afterWrite.length >= kept.length is
|
|
133
|
-
// true, so they are included in the return stats without entering the
|
|
134
|
-
// recovery branch.
|
|
135
|
-
try {
|
|
136
|
-
const afterWrite = readEvents(eventsPath);
|
|
137
|
-
// FIX: Check if events were actually lost (afterWrite.length < kept.length)
|
|
138
|
-
// rather than using appendedDuringWindow >= 0 which is always true.
|
|
139
|
-
// Also use sequence numbers for comparison instead of JSON.stringify
|
|
140
|
-
// which is fragile due to key ordering and floating point differences.
|
|
141
|
-
if (afterWrite.length >= kept.length) {
|
|
142
|
-
return {
|
|
143
|
-
originalSize,
|
|
144
|
-
compactedSize: fs.statSync(eventsPath).size,
|
|
145
|
-
eventsRemoved: originalCount - kept.length,
|
|
146
|
-
eventsKept: kept.length + Math.max(0, afterWrite.length - kept.length),
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
// afterWrite.length < kept.length — events were lost during compaction window.
|
|
150
|
-
const afterSeqs = new Set(afterWrite.map((e) => e.metadata?.seq).filter((s): s is number => s !== undefined));
|
|
151
|
-
const missingEvents = kept.filter((e) => e.metadata?.seq === undefined || !afterSeqs.has(e.metadata.seq));
|
|
152
|
-
let recoveredCount = 0;
|
|
153
|
-
let recoveryFailed = false;
|
|
154
|
-
if (missingEvents.length > 0) {
|
|
155
|
-
const recoveryLines = missingEvents.map((e) => JSON.stringify(e) + "\n").join("");
|
|
156
|
-
try {
|
|
157
|
-
fs.appendFileSync(eventsPath, recoveryLines);
|
|
158
|
-
recoveredCount = missingEvents.length;
|
|
159
|
-
} catch (err) {
|
|
160
|
-
recoveryFailed = true;
|
|
161
|
-
logInternalError("event-log-rotation.recovery", err, `eventsPath=${eventsPath} lostEvents=${missingEvents.length}`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return {
|
|
165
|
-
originalSize,
|
|
166
|
-
compactedSize: fs.statSync(eventsPath).size,
|
|
167
|
-
eventsRemoved: originalCount - kept.length,
|
|
168
|
-
eventsKept: kept.length + recoveredCount,
|
|
169
|
-
recoveryFailed,
|
|
170
|
-
};
|
|
171
|
-
} catch {
|
|
172
|
-
// Post-write verification failed — compaction likely succeeded.
|
|
173
|
-
return {
|
|
174
|
-
originalSize,
|
|
175
|
-
compactedSize: fs.statSync(eventsPath).size,
|
|
176
|
-
eventsRemoved: originalCount - kept.length,
|
|
177
|
-
eventsKept: kept.length,
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Rotate an event log file by archiving it with a timestamp.
|
|
184
|
-
* The current file is renamed to `<eventsPath>.<timestamp>.archive.jsonl`
|
|
185
|
-
* and a fresh empty file is created in its place.
|
|
186
|
-
* Readers using `readEvents` will see the new file; archived files can be
|
|
187
|
-
* picked up by snapshot replay if needed.
|
|
188
|
-
*/
|
|
189
|
-
export function rotateEventLog(eventsPath: string): boolean {
|
|
190
|
-
if (!fs.existsSync(eventsPath)) return false;
|
|
191
|
-
// FIX: Wrap rotation in lock to prevent race conditions with concurrent readers.
|
|
192
|
-
// Order of operations: (1) create new empty file, (2) rename old file to archive.
|
|
193
|
-
// This ensures eventsPath always exists — a reader never sees a missing file.
|
|
194
|
-
//
|
|
195
|
-
// NOTE (Round 24 BUG 1): callers ALREADY holding the lock must call
|
|
196
|
-
// rotateEventLogUnlocked directly — this locked variant is NOT re-entrant.
|
|
197
|
-
return withEventLogLockSync(eventsPath, () => rotateEventLogUnlocked(eventsPath));
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/** Round 24 (BUG 1): the lock-free core of rotation. Assumes the caller
|
|
201
|
-
* already holds the event-log lock (or accepts the unlocked race). */
|
|
202
|
-
export function rotateEventLogUnlocked(eventsPath: string): boolean {
|
|
203
|
-
if (!fs.existsSync(eventsPath)) return false;
|
|
204
|
-
try {
|
|
205
|
-
const ts = new Date().toISOString().replace(/[:.]/g, "-");
|
|
206
|
-
let archivePath = `${eventsPath}.${ts}.archive.jsonl`;
|
|
207
|
-
// Round 12: avoid timestamp collisions when two rotations happen within
|
|
208
|
-
// the same millisecond (copyFileSync would silently overwrite the
|
|
209
|
-
// first archive). Append a counter until the path is free.
|
|
210
|
-
let collision = 1;
|
|
211
|
-
while (fs.existsSync(archivePath)) {
|
|
212
|
-
archivePath = `${eventsPath}.${ts}.${collision}.archive.jsonl`;
|
|
213
|
-
collision++;
|
|
214
|
-
}
|
|
215
|
-
// BUGFIX (Round 12 C1): the previous order (atomicWriteFile empty THEN
|
|
216
|
-
// rename) destroyed ALL events — atomicWriteFile replaces the file
|
|
217
|
-
// in place, so the rename then moved an EMPTY file to the archive.
|
|
218
|
-
// FIX: copy current content to the archive first (archive is populated,
|
|
219
|
-
// original still intact), then truncate the original to empty in place.
|
|
220
|
-
// copyFileSync + writeFileSync("") ensures eventsPath ALWAYS exists
|
|
221
|
-
// (no missing-file window for concurrent readers).
|
|
222
|
-
fs.copyFileSync(eventsPath, archivePath);
|
|
223
|
-
atomicWriteFile(eventsPath, "");
|
|
224
|
-
return true;
|
|
225
|
-
} catch (error) {
|
|
226
|
-
logInternalError("event-log.rotate", error, `eventsPath=${eventsPath}`);
|
|
227
|
-
return false;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
export interface EventLogStats {
|
|
232
|
-
fileSizeBytes: number;
|
|
233
|
-
eventCount: number;
|
|
234
|
-
oldestTimestamp?: string;
|
|
235
|
-
newestTimestamp?: string;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* L3: Get event log stats using optimized reads.
|
|
240
|
-
* Uses efficient line counting and reads only first/last ~4KB for timestamps.
|
|
241
|
-
*/
|
|
242
|
-
export function getEventLogStats(eventsPath: string): EventLogStats | undefined {
|
|
243
|
-
if (!fs.existsSync(eventsPath)) return undefined;
|
|
244
|
-
try {
|
|
245
|
-
const stat = fs.statSync(eventsPath);
|
|
246
|
-
const fileSizeBytes = stat.size;
|
|
247
|
-
if (fileSizeBytes === 0) {
|
|
248
|
-
return { fileSizeBytes: 0, eventCount: 0 };
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// NEW-9 fix: stream-scan for line count (no full-file load).
|
|
252
|
-
// Read last up-to-1KB for newest timestamp.
|
|
253
|
-
let newestTimestamp: string | undefined;
|
|
254
|
-
let lastLine = "";
|
|
255
|
-
const tailSize = Math.min(fileSizeBytes, 1024);
|
|
256
|
-
{
|
|
257
|
-
const tailBuf = Buffer.alloc(tailSize);
|
|
258
|
-
const fd = fs.openSync(eventsPath, "r");
|
|
259
|
-
try {
|
|
260
|
-
fs.readSync(fd, tailBuf, 0, tailSize, fileSizeBytes - tailSize);
|
|
261
|
-
} finally {
|
|
262
|
-
fs.closeSync(fd);
|
|
263
|
-
}
|
|
264
|
-
const tailStr = tailBuf.toString("utf-8");
|
|
265
|
-
// JSONL files end with "\n", so the last newline bounds an empty string.
|
|
266
|
-
// Walk backwards to find the last non-empty line.
|
|
267
|
-
let searchFrom = tailStr.length;
|
|
268
|
-
for (;;) {
|
|
269
|
-
const nl = tailStr.lastIndexOf("\n", searchFrom - 1);
|
|
270
|
-
if (nl < 0) {
|
|
271
|
-
lastLine = tailStr.trim();
|
|
272
|
-
break;
|
|
273
|
-
}
|
|
274
|
-
const candidate = tailStr.slice(nl + 1, searchFrom).trim();
|
|
275
|
-
if (candidate) {
|
|
276
|
-
lastLine = candidate;
|
|
277
|
-
break;
|
|
278
|
-
}
|
|
279
|
-
searchFrom = nl;
|
|
280
|
-
}
|
|
281
|
-
try {
|
|
282
|
-
if (lastLine) {
|
|
283
|
-
newestTimestamp = (JSON.parse(lastLine) as { time: string }).time;
|
|
284
|
-
}
|
|
285
|
-
} catch {
|
|
286
|
-
/* corrupt tail */
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// Stream-scan to count newlines and find first line boundary.
|
|
291
|
-
let eventCount = 0;
|
|
292
|
-
let firstLineBytes = 0;
|
|
293
|
-
const buf = Buffer.alloc(8192);
|
|
294
|
-
let offset = 0;
|
|
295
|
-
let newlineCount = 0;
|
|
296
|
-
const scanFd = fs.openSync(eventsPath, "r");
|
|
297
|
-
try {
|
|
298
|
-
let bytesRead: number;
|
|
299
|
-
while ((bytesRead = fs.readSync(scanFd, buf, 0, buf.length, offset)) > 0) {
|
|
300
|
-
for (let i = 0; i < bytesRead; i++) {
|
|
301
|
-
if (buf[i] === 10) {
|
|
302
|
-
if (newlineCount === 0) firstLineBytes = offset + i + 1;
|
|
303
|
-
newlineCount++;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
offset += bytesRead;
|
|
307
|
-
}
|
|
308
|
-
} finally {
|
|
309
|
-
fs.closeSync(scanFd);
|
|
310
|
-
}
|
|
311
|
-
eventCount = newlineCount;
|
|
312
|
-
|
|
313
|
-
// Read first line for oldest timestamp.
|
|
314
|
-
let oldestTimestamp: string | undefined;
|
|
315
|
-
if (firstLineBytes > 0) {
|
|
316
|
-
try {
|
|
317
|
-
const firstBuf = Buffer.alloc(firstLineBytes);
|
|
318
|
-
const fd = fs.openSync(eventsPath, "r");
|
|
319
|
-
try {
|
|
320
|
-
fs.readSync(fd, firstBuf, 0, firstLineBytes, 0);
|
|
321
|
-
} finally {
|
|
322
|
-
fs.closeSync(fd);
|
|
323
|
-
}
|
|
324
|
-
const firstLine = firstBuf.toString("utf-8").trim();
|
|
325
|
-
if (firstLine) {
|
|
326
|
-
oldestTimestamp = (JSON.parse(firstLine) as { time: string }).time;
|
|
327
|
-
}
|
|
328
|
-
} catch {
|
|
329
|
-
/* corrupt head */
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
return {
|
|
334
|
-
fileSizeBytes,
|
|
335
|
-
eventCount,
|
|
336
|
-
oldestTimestamp,
|
|
337
|
-
newestTimestamp,
|
|
338
|
-
};
|
|
339
|
-
} catch {
|
|
340
|
-
return undefined;
|
|
341
|
-
}
|
|
342
|
-
}
|