@telora/daemon 0.20.2 → 0.20.9
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/build-info.json +7 -3
- package/dist/ai-inspection-context.d.ts.map +1 -1
- package/dist/ai-inspection-context.js +5 -3
- package/dist/ai-inspection-context.js.map +1 -1
- package/dist/assembly-engine.d.ts.map +1 -1
- package/dist/assembly-engine.js +4 -2
- package/dist/assembly-engine.js.map +1 -1
- package/dist/audit-hooks.d.ts.map +1 -1
- package/dist/audit-hooks.js +3 -1
- package/dist/audit-hooks.js.map +1 -1
- package/dist/auth-liveness.d.ts.map +1 -1
- package/dist/auth-liveness.js +4 -2
- package/dist/auth-liveness.js.map +1 -1
- package/dist/auto-update.d.ts.map +1 -1
- package/dist/auto-update.js +14 -12
- package/dist/auto-update.js.map +1 -1
- package/dist/backends/codex/codex-backend.d.ts.map +1 -1
- package/dist/backends/codex/codex-backend.js +4 -2
- package/dist/backends/codex/codex-backend.js.map +1 -1
- package/dist/backends/codex/codex-mcp-proxy.d.ts.map +1 -1
- package/dist/backends/codex/codex-mcp-proxy.js +3 -1
- package/dist/backends/codex/codex-mcp-proxy.js.map +1 -1
- package/dist/backends/lacuna/lifecycle.d.ts.map +1 -1
- package/dist/backends/lacuna/lifecycle.js +4 -2
- package/dist/backends/lacuna/lifecycle.js.map +1 -1
- package/dist/backends/resolve.d.ts.map +1 -1
- package/dist/backends/resolve.js +3 -1
- package/dist/backends/resolve.js.map +1 -1
- package/dist/cascade-restatement.d.ts.map +1 -1
- package/dist/cascade-restatement.js +15 -13
- package/dist/cascade-restatement.js.map +1 -1
- package/dist/ci-escalation.d.ts.map +1 -1
- package/dist/ci-escalation.js +4 -2
- package/dist/ci-escalation.js.map +1 -1
- package/dist/ci-sensor-loop.d.ts.map +1 -1
- package/dist/ci-sensor-loop.js +6 -4
- package/dist/ci-sensor-loop.js.map +1 -1
- package/dist/ci-status-git.d.ts +5 -6
- package/dist/ci-status-git.d.ts.map +1 -1
- package/dist/ci-status-git.js +7 -7
- package/dist/ci-status-git.js.map +1 -1
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +9 -2
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/open.d.ts.map +1 -1
- package/dist/cli/open.js +9 -2
- package/dist/cli/open.js.map +1 -1
- package/dist/cli/session-state.d.ts.map +1 -1
- package/dist/cli/session-state.js +2 -0
- package/dist/cli/session-state.js.map +1 -1
- package/dist/cli/verify-setup.d.ts.map +1 -1
- package/dist/cli/verify-setup.js +9 -4
- package/dist/cli/verify-setup.js.map +1 -1
- package/dist/close-loop-dispatcher.d.ts.map +1 -1
- package/dist/close-loop-dispatcher.js +6 -4
- package/dist/close-loop-dispatcher.js.map +1 -1
- package/dist/completion/advanceability.d.ts.map +1 -1
- package/dist/completion/advanceability.js +3 -1
- package/dist/completion/advanceability.js.map +1 -1
- package/dist/completion/agent-completion.d.ts.map +1 -1
- package/dist/completion/agent-completion.js +11 -9
- package/dist/completion/agent-completion.js.map +1 -1
- package/dist/completion/event-escalations.d.ts.map +1 -1
- package/dist/completion/event-escalations.js +10 -8
- package/dist/completion/event-escalations.js.map +1 -1
- package/dist/completion/event-phases.d.ts +104 -0
- package/dist/completion/event-phases.d.ts.map +1 -0
- package/dist/completion/event-phases.js +572 -0
- package/dist/completion/event-phases.js.map +1 -0
- package/dist/completion/event.d.ts +1 -1
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +36 -592
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/merge-phase.d.ts.map +1 -1
- package/dist/completion/merge-phase.js +14 -12
- package/dist/completion/merge-phase.js.map +1 -1
- package/dist/completion/read-only-pristine.d.ts.map +1 -1
- package/dist/completion/read-only-pristine.js +6 -4
- package/dist/completion/read-only-pristine.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +28 -26
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/status-advance-phase.d.ts.map +1 -1
- package/dist/completion/status-advance-phase.js +16 -14
- package/dist/completion/status-advance-phase.js.map +1 -1
- package/dist/completion/team-completion.d.ts.map +1 -1
- package/dist/completion/team-completion.js +16 -14
- package/dist/completion/team-completion.js.map +1 -1
- package/dist/completion/team-lifecycle.d.ts.map +1 -1
- package/dist/completion/team-lifecycle.js +32 -33
- package/dist/completion/team-lifecycle.js.map +1 -1
- package/dist/completion/terminated-work-reconcile.d.ts.map +1 -1
- package/dist/completion/terminated-work-reconcile.js +11 -9
- package/dist/completion/terminated-work-reconcile.js.map +1 -1
- package/dist/condition-evaluators.d.ts.map +1 -1
- package/dist/condition-evaluators.js +3 -1
- package/dist/condition-evaluators.js.map +1 -1
- package/dist/config-reconcile.d.ts.map +1 -1
- package/dist/config-reconcile.js +3 -1
- package/dist/config-reconcile.js.map +1 -1
- package/dist/config.d.ts +4 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +56 -42
- package/dist/config.js.map +1 -1
- package/dist/control-state.d.ts.map +1 -1
- package/dist/control-state.js +26 -24
- package/dist/control-state.js.map +1 -1
- package/dist/crash-recovery.d.ts.map +1 -1
- package/dist/crash-recovery.js +43 -41
- package/dist/crash-recovery.js.map +1 -1
- package/dist/daemon-logs.d.ts.map +1 -1
- package/dist/daemon-logs.js +21 -3
- package/dist/daemon-logs.js.map +1 -1
- package/dist/daemon-process.d.ts +0 -1
- package/dist/daemon-process.d.ts.map +1 -1
- package/dist/daemon-process.js +15 -10
- package/dist/daemon-process.js.map +1 -1
- package/dist/delivery-advance-block.d.ts +4 -4
- package/dist/delivery-advance-block.d.ts.map +1 -1
- package/dist/delivery-advance-block.js +25 -18
- package/dist/delivery-advance-block.js.map +1 -1
- package/dist/delivery-guards.d.ts.map +1 -1
- package/dist/delivery-guards.js +11 -9
- package/dist/delivery-guards.js.map +1 -1
- package/dist/delivery-lifecycle.d.ts.map +1 -1
- package/dist/delivery-lifecycle.js +23 -21
- package/dist/delivery-lifecycle.js.map +1 -1
- package/dist/delivery-merge.d.ts.map +1 -1
- package/dist/delivery-merge.js +10 -8
- package/dist/delivery-merge.js.map +1 -1
- package/dist/delivery-reconciler-apply.d.ts.map +1 -1
- package/dist/delivery-reconciler-apply.js +5 -8
- package/dist/delivery-reconciler-apply.js.map +1 -1
- package/dist/delivery-reconciler-shadow.d.ts.map +1 -1
- package/dist/delivery-reconciler-shadow.js +5 -6
- package/dist/delivery-reconciler-shadow.js.map +1 -1
- package/dist/directive/close-loop-stage.d.ts.map +1 -1
- package/dist/directive/close-loop-stage.js +9 -7
- package/dist/directive/close-loop-stage.js.map +1 -1
- package/dist/directive/directive-assembly.d.ts.map +1 -1
- package/dist/directive/directive-assembly.js +3 -1
- package/dist/directive/directive-assembly.js.map +1 -1
- package/dist/directive/directive-dispatch.d.ts.map +1 -1
- package/dist/directive/directive-dispatch.js +16 -14
- package/dist/directive/directive-dispatch.js.map +1 -1
- package/dist/directive/directive-queue.d.ts +27 -0
- package/dist/directive/directive-queue.d.ts.map +1 -1
- package/dist/directive/directive-queue.js +28 -0
- package/dist/directive/directive-queue.js.map +1 -1
- package/dist/directive/phase-sync.d.ts.map +1 -1
- package/dist/directive/phase-sync.js +8 -6
- package/dist/directive/phase-sync.js.map +1 -1
- package/dist/directive-executor.d.ts +1 -1
- package/dist/directive-executor.d.ts.map +1 -1
- package/dist/directive-executor.js +12 -10
- package/dist/directive-executor.js.map +1 -1
- package/dist/discovery-poll.d.ts.map +1 -1
- package/dist/discovery-poll.js +8 -6
- package/dist/discovery-poll.js.map +1 -1
- package/dist/drain-teardown.d.ts.map +1 -1
- package/dist/drain-teardown.js +6 -19
- package/dist/drain-teardown.js.map +1 -1
- package/dist/drift-eval-loop.d.ts.map +1 -1
- package/dist/drift-eval-loop.js +10 -8
- package/dist/drift-eval-loop.js.map +1 -1
- package/dist/escalation-provenance.d.ts.map +1 -1
- package/dist/escalation-provenance.js +8 -3
- package/dist/escalation-provenance.js.map +1 -1
- package/dist/focus-engine.d.ts.map +1 -1
- package/dist/focus-engine.js +36 -34
- package/dist/focus-engine.js.map +1 -1
- package/dist/focus-executor.d.ts +2 -1
- package/dist/focus-executor.d.ts.map +1 -1
- package/dist/focus-executor.js +17 -15
- package/dist/focus-executor.js.map +1 -1
- package/dist/focus-lifecycle.d.ts.map +1 -1
- package/dist/focus-lifecycle.js +56 -44
- package/dist/focus-lifecycle.js.map +1 -1
- package/dist/focus-loop-registry.d.ts.map +1 -1
- package/dist/focus-loop-registry.js +38 -36
- package/dist/focus-loop-registry.js.map +1 -1
- package/dist/focus-merge.d.ts.map +1 -1
- package/dist/focus-merge.js +40 -34
- package/dist/focus-merge.js.map +1 -1
- package/dist/focus-provisioning.d.ts.map +1 -1
- package/dist/focus-provisioning.js +15 -13
- package/dist/focus-provisioning.js.map +1 -1
- package/dist/focus-respawn-guard.d.ts.map +1 -1
- package/dist/focus-respawn-guard.js +4 -2
- package/dist/focus-respawn-guard.js.map +1 -1
- package/dist/focus-stage-lifecycle/planning-release.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/planning-release.js +10 -8
- package/dist/focus-stage-lifecycle/planning-release.js.map +1 -1
- package/dist/focus-stage-lifecycle/review-convergence.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/review-convergence.js +11 -9
- package/dist/focus-stage-lifecycle/review-convergence.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +7 -5
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/focus-stage-lifecycle.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle.js +7 -5
- package/dist/focus-stage-lifecycle.js.map +1 -1
- package/dist/focus-team-state.d.ts +18 -9
- package/dist/focus-team-state.d.ts.map +1 -1
- package/dist/focus-team-state.js +37 -18
- package/dist/focus-team-state.js.map +1 -1
- package/dist/focus-worktree-state.d.ts.map +1 -1
- package/dist/focus-worktree-state.js +6 -4
- package/dist/focus-worktree-state.js.map +1 -1
- package/dist/git/branch.d.ts.map +1 -1
- package/dist/git/branch.js +7 -5
- package/dist/git/branch.js.map +1 -1
- package/dist/git/genesis.d.ts.map +1 -1
- package/dist/git/genesis.js +3 -1
- package/dist/git/genesis.js.map +1 -1
- package/dist/git/integration.d.ts.map +1 -1
- package/dist/git/integration.js +4 -2
- package/dist/git/integration.js.map +1 -1
- package/dist/git/merge-helpers.d.ts.map +1 -1
- package/dist/git/merge-helpers.js +6 -4
- package/dist/git/merge-helpers.js.map +1 -1
- package/dist/git/merge-lock.d.ts +0 -7
- package/dist/git/merge-lock.d.ts.map +1 -1
- package/dist/git/merge-lock.js +5 -3
- package/dist/git/merge-lock.js.map +1 -1
- package/dist/git/merge.d.ts.map +1 -1
- package/dist/git/merge.js +10 -8
- package/dist/git/merge.js.map +1 -1
- package/dist/git/state-detector.d.ts.map +1 -1
- package/dist/git/state-detector.js +9 -7
- package/dist/git/state-detector.js.map +1 -1
- package/dist/git/utils.d.ts.map +1 -1
- package/dist/git/utils.js +6 -4
- package/dist/git/utils.js.map +1 -1
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +16 -14
- package/dist/git.js.map +1 -1
- package/dist/guard-evaluator.d.ts.map +1 -1
- package/dist/guard-evaluator.js +3 -1
- package/dist/guard-evaluator.js.map +1 -1
- package/dist/heartbeat.d.ts.map +1 -1
- package/dist/heartbeat.js +14 -11
- package/dist/heartbeat.js.map +1 -1
- package/dist/host-control/catalog.d.ts.map +1 -1
- package/dist/host-control/catalog.js +4 -2
- package/dist/host-control/catalog.js.map +1 -1
- package/dist/host-control/client.d.ts.map +1 -1
- package/dist/host-control/client.js +3 -1
- package/dist/host-control/client.js.map +1 -1
- package/dist/host-control/sizing.d.ts.map +1 -1
- package/dist/host-control/sizing.js +4 -1
- package/dist/host-control/sizing.js.map +1 -1
- package/dist/index.js +110 -127
- package/dist/index.js.map +1 -1
- package/dist/install-probe-tick.d.ts.map +1 -1
- package/dist/install-probe-tick.js +6 -4
- package/dist/install-probe-tick.js.map +1 -1
- package/dist/intake-control.d.ts +0 -16
- package/dist/intake-control.d.ts.map +1 -1
- package/dist/intake-control.js +4 -2
- package/dist/intake-control.js.map +1 -1
- package/dist/listener-auto-advance.d.ts.map +1 -1
- package/dist/listener-auto-advance.js +26 -24
- package/dist/listener-auto-advance.js.map +1 -1
- package/dist/listener.d.ts.map +1 -1
- package/dist/listener.js +59 -39
- package/dist/listener.js.map +1 -1
- package/dist/log.d.ts +84 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +182 -0
- package/dist/log.js.map +1 -0
- package/dist/loops/context-audit-pass.d.ts.map +1 -1
- package/dist/loops/context-audit-pass.js +8 -5
- package/dist/loops/context-audit-pass.js.map +1 -1
- package/dist/loops/engine.d.ts.map +1 -1
- package/dist/loops/engine.js +26 -24
- package/dist/loops/engine.js.map +1 -1
- package/dist/loops/llm-client.d.ts.map +1 -1
- package/dist/loops/llm-client.js +4 -2
- package/dist/loops/llm-client.js.map +1 -1
- package/dist/loops/llm-flag.d.ts +4 -28
- package/dist/loops/llm-flag.d.ts.map +1 -1
- package/dist/loops/llm-flag.js +11 -30
- package/dist/loops/llm-flag.js.map +1 -1
- package/dist/loops/prompt-builder.d.ts.map +1 -1
- package/dist/loops/prompt-builder.js +3 -1
- package/dist/loops/prompt-builder.js.map +1 -1
- package/dist/merge-back-loop.d.ts.map +1 -1
- package/dist/merge-back-loop.js +20 -18
- package/dist/merge-back-loop.js.map +1 -1
- package/dist/merge-detector.d.ts.map +1 -1
- package/dist/merge-detector.js +7 -5
- package/dist/merge-detector.js.map +1 -1
- package/dist/nexus/endpoint-clearance.d.ts.map +1 -1
- package/dist/nexus/endpoint-clearance.js +3 -1
- package/dist/nexus/endpoint-clearance.js.map +1 -1
- package/dist/nexus/escalation-bridge.d.ts.map +1 -1
- package/dist/nexus/escalation-bridge.js +3 -1
- package/dist/nexus/escalation-bridge.js.map +1 -1
- package/dist/nexus/incoming.d.ts.map +1 -1
- package/dist/nexus/incoming.js +3 -1
- package/dist/nexus/incoming.js.map +1 -1
- package/dist/nexus/intake-spawn.d.ts.map +1 -1
- package/dist/nexus/intake-spawn.js +6 -4
- package/dist/nexus/intake-spawn.js.map +1 -1
- package/dist/nexus/intake.d.ts.map +1 -1
- package/dist/nexus/intake.js +3 -1
- package/dist/nexus/intake.js.map +1 -1
- package/dist/nexus/return.d.ts.map +1 -1
- package/dist/nexus/return.js +3 -1
- package/dist/nexus/return.js.map +1 -1
- package/dist/non-interactive-init.d.ts.map +1 -1
- package/dist/non-interactive-init.js +0 -0
- package/dist/non-interactive-init.js.map +1 -1
- package/dist/otlp/port-manager.d.ts.map +1 -1
- package/dist/otlp/port-manager.js +7 -5
- package/dist/otlp/port-manager.js.map +1 -1
- package/dist/otlp/receiver.d.ts.map +1 -1
- package/dist/otlp/receiver.js +14 -12
- package/dist/otlp/receiver.js.map +1 -1
- package/dist/output-monitor.d.ts.map +1 -1
- package/dist/output-monitor.js +6 -4
- package/dist/output-monitor.js.map +1 -1
- package/dist/prd/controller.d.ts.map +1 -1
- package/dist/prd/controller.js +7 -5
- package/dist/prd/controller.js.map +1 -1
- package/dist/prd/focus-pushdown.d.ts.map +1 -1
- package/dist/prd/focus-pushdown.js +3 -1
- package/dist/prd/focus-pushdown.js.map +1 -1
- package/dist/product-scaffold.d.ts.map +1 -1
- package/dist/product-scaffold.js +8 -6
- package/dist/product-scaffold.js.map +1 -1
- package/dist/queries/context-assembly.d.ts.map +1 -1
- package/dist/queries/context-assembly.js +3 -1
- package/dist/queries/context-assembly.js.map +1 -1
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +7 -5
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/focuses.d.ts.map +1 -1
- package/dist/queries/focuses.js +3 -1
- package/dist/queries/focuses.js.map +1 -1
- package/dist/queries/guards.d.ts.map +1 -1
- package/dist/queries/guards.js +3 -1
- package/dist/queries/guards.js.map +1 -1
- package/dist/queries/issues.d.ts.map +1 -1
- package/dist/queries/issues.js +3 -1
- package/dist/queries/issues.js.map +1 -1
- package/dist/queries/system-session.d.ts.map +1 -1
- package/dist/queries/system-session.js +5 -3
- package/dist/queries/system-session.js.map +1 -1
- package/dist/queries/verification.d.ts.map +1 -1
- package/dist/queries/verification.js +6 -4
- package/dist/queries/verification.js.map +1 -1
- package/dist/reality-pole-capture.d.ts.map +1 -1
- package/dist/reality-pole-capture.js +7 -4
- package/dist/reality-pole-capture.js.map +1 -1
- package/dist/reality-pole.d.ts.map +1 -1
- package/dist/reality-pole.js +4 -2
- package/dist/reality-pole.js.map +1 -1
- package/dist/resolvers/agent-escalations.d.ts.map +1 -1
- package/dist/resolvers/agent-escalations.js +3 -1
- package/dist/resolvers/agent-escalations.js.map +1 -1
- package/dist/resolvers/agent-session-summaries.d.ts.map +1 -1
- package/dist/resolvers/agent-session-summaries.js +3 -1
- package/dist/resolvers/agent-session-summaries.js.map +1 -1
- package/dist/resolvers/deployment-profile.d.ts.map +1 -1
- package/dist/resolvers/deployment-profile.js +3 -1
- package/dist/resolvers/deployment-profile.js.map +1 -1
- package/dist/resolvers/escalation-answers.d.ts.map +1 -1
- package/dist/resolvers/escalation-answers.js +4 -2
- package/dist/resolvers/escalation-answers.js.map +1 -1
- package/dist/resolvers/focus-anchoring-injections.d.ts.map +1 -1
- package/dist/resolvers/focus-anchoring-injections.js +3 -1
- package/dist/resolvers/focus-anchoring-injections.js.map +1 -1
- package/dist/resolvers/focus-injections.d.ts.map +1 -1
- package/dist/resolvers/focus-injections.js +3 -1
- package/dist/resolvers/focus-injections.js.map +1 -1
- package/dist/resolvers/focus-last-review-report.d.ts.map +1 -1
- package/dist/resolvers/focus-last-review-report.js +3 -1
- package/dist/resolvers/focus-last-review-report.js.map +1 -1
- package/dist/resolvers/focus-reality-tree.d.ts.map +1 -1
- package/dist/resolvers/focus-reality-tree.js +3 -1
- package/dist/resolvers/focus-reality-tree.js.map +1 -1
- package/dist/resolvers/git-diff-against-base.d.ts.map +1 -1
- package/dist/resolvers/git-diff-against-base.js +3 -1
- package/dist/resolvers/git-diff-against-base.js.map +1 -1
- package/dist/resolvers/guards-evaluation-results.d.ts.map +1 -1
- package/dist/resolvers/guards-evaluation-results.js +3 -1
- package/dist/resolvers/guards-evaluation-results.js.map +1 -1
- package/dist/resolvers/loop-context.d.ts.map +1 -1
- package/dist/resolvers/loop-context.js +6 -2
- package/dist/resolvers/loop-context.js.map +1 -1
- package/dist/resolvers/loop-delivery-index.d.ts.map +1 -1
- package/dist/resolvers/loop-delivery-index.js +3 -1
- package/dist/resolvers/loop-delivery-index.js.map +1 -1
- package/dist/resolvers/loop-documents.d.ts.map +1 -1
- package/dist/resolvers/loop-documents.js +3 -1
- package/dist/resolvers/loop-documents.js.map +1 -1
- package/dist/resolvers/loop-expected-effects.d.ts.map +1 -1
- package/dist/resolvers/loop-expected-effects.js +3 -1
- package/dist/resolvers/loop-expected-effects.js.map +1 -1
- package/dist/resolvers/loop-frt-statement.d.ts.map +1 -1
- package/dist/resolvers/loop-frt-statement.js +3 -1
- package/dist/resolvers/loop-frt-statement.js.map +1 -1
- package/dist/resolvers/loop-injection.d.ts.map +1 -1
- package/dist/resolvers/loop-injection.js +3 -1
- package/dist/resolvers/loop-injection.js.map +1 -1
- package/dist/resolvers/loop-persona.d.ts.map +1 -1
- package/dist/resolvers/loop-persona.js +3 -1
- package/dist/resolvers/loop-persona.js.map +1 -1
- package/dist/resolvers/loop-questions.d.ts.map +1 -1
- package/dist/resolvers/loop-questions.js +3 -1
- package/dist/resolvers/loop-questions.js.map +1 -1
- package/dist/resolvers/loop-upstream-udes.d.ts.map +1 -1
- package/dist/resolvers/loop-upstream-udes.js +3 -1
- package/dist/resolvers/loop-upstream-udes.js.map +1 -1
- package/dist/resolvers/prd-context.d.ts.map +1 -1
- package/dist/resolvers/prd-context.js +3 -1
- package/dist/resolvers/prd-context.js.map +1 -1
- package/dist/resolvers/reality-metrics.d.ts.map +1 -1
- package/dist/resolvers/reality-metrics.js +3 -1
- package/dist/resolvers/reality-metrics.js.map +1 -1
- package/dist/resolvers/reality-projections.d.ts.map +1 -1
- package/dist/resolvers/reality-projections.js +3 -1
- package/dist/resolvers/reality-projections.js.map +1 -1
- package/dist/resolvers/reality-tree-snapshot.d.ts.map +1 -1
- package/dist/resolvers/reality-tree-snapshot.js +3 -1
- package/dist/resolvers/reality-tree-snapshot.js.map +1 -1
- package/dist/resolvers/retired-injections.d.ts.map +1 -1
- package/dist/resolvers/retired-injections.js +3 -1
- package/dist/resolvers/retired-injections.js.map +1 -1
- package/dist/resolvers/review-outcomes.d.ts.map +1 -1
- package/dist/resolvers/review-outcomes.js +3 -1
- package/dist/resolvers/review-outcomes.js.map +1 -1
- package/dist/resolvers/security-advisory.d.ts.map +1 -1
- package/dist/resolvers/security-advisory.js +3 -1
- package/dist/resolvers/security-advisory.js.map +1 -1
- package/dist/resolvers/shared/wiki.d.ts.map +1 -1
- package/dist/resolvers/shared/wiki.js +5 -3
- package/dist/resolvers/shared/wiki.js.map +1 -1
- package/dist/resolvers/wiki-topic.d.ts.map +1 -1
- package/dist/resolvers/wiki-topic.js +3 -1
- package/dist/resolvers/wiki-topic.js.map +1 -1
- package/dist/resolvers/workflow-stages.d.ts.map +1 -1
- package/dist/resolvers/workflow-stages.js +3 -1
- package/dist/resolvers/workflow-stages.js.map +1 -1
- package/dist/schema-version-gate.d.ts.map +1 -1
- package/dist/schema-version-gate.js +16 -18
- package/dist/schema-version-gate.js.map +1 -1
- package/dist/security-finding-gate.d.ts.map +1 -1
- package/dist/security-finding-gate.js +3 -1
- package/dist/security-finding-gate.js.map +1 -1
- package/dist/security-rescan-resolution.d.ts.map +1 -1
- package/dist/security-rescan-resolution.js +4 -2
- package/dist/security-rescan-resolution.js.map +1 -1
- package/dist/security-scan-engine.d.ts.map +1 -1
- package/dist/security-scan-engine.js +9 -6
- package/dist/security-scan-engine.js.map +1 -1
- package/dist/self-update.d.ts.map +1 -1
- package/dist/self-update.js +48 -39
- package/dist/self-update.js.map +1 -1
- package/dist/sensor-sweep.d.ts.map +1 -1
- package/dist/sensor-sweep.js +5 -2
- package/dist/sensor-sweep.js.map +1 -1
- package/dist/session-stamp.d.ts.map +1 -1
- package/dist/session-stamp.js +4 -2
- package/dist/session-stamp.js.map +1 -1
- package/dist/spawn/model-routing.d.ts +18 -0
- package/dist/spawn/model-routing.d.ts.map +1 -1
- package/dist/spawn/model-routing.js +53 -18
- package/dist/spawn/model-routing.js.map +1 -1
- package/dist/spawn/process-spawn.d.ts.map +1 -1
- package/dist/spawn/process-spawn.js +29 -22
- package/dist/spawn/process-spawn.js.map +1 -1
- package/dist/spawn/prompt-assembly.d.ts.map +1 -1
- package/dist/spawn/prompt-assembly.js +6 -4
- package/dist/spawn/prompt-assembly.js.map +1 -1
- package/dist/spawn/spawn-decision.d.ts.map +1 -1
- package/dist/spawn/spawn-decision.js +16 -14
- package/dist/spawn/spawn-decision.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +13 -11
- package/dist/spawn/worktree-session.js.map +1 -1
- package/dist/spawn-cooldown.d.ts +0 -7
- package/dist/spawn-cooldown.d.ts.map +1 -1
- package/dist/spawn-cooldown.js +3 -1
- package/dist/spawn-cooldown.js.map +1 -1
- package/dist/spawn-environment.d.ts.map +1 -1
- package/dist/spawn-environment.js +4 -1
- package/dist/spawn-environment.js.map +1 -1
- package/dist/spawner/helpers.d.ts.map +1 -1
- package/dist/spawner/helpers.js +19 -17
- package/dist/spawner/helpers.js.map +1 -1
- package/dist/spawner/lifecycle.d.ts.map +1 -1
- package/dist/spawner/lifecycle.js +17 -13
- package/dist/spawner/lifecycle.js.map +1 -1
- package/dist/spawner/liveness.d.ts.map +1 -1
- package/dist/spawner/liveness.js +7 -5
- package/dist/spawner/liveness.js.map +1 -1
- package/dist/spawner/resolution.d.ts.map +1 -1
- package/dist/spawner/resolution.js +7 -5
- package/dist/spawner/resolution.js.map +1 -1
- package/dist/spawner/stream-handlers.d.ts +6 -55
- package/dist/spawner/stream-handlers.d.ts.map +1 -1
- package/dist/spawner/stream-handlers.js +10 -172
- package/dist/spawner/stream-handlers.js.map +1 -1
- package/dist/spawner/timeout.d.ts.map +1 -1
- package/dist/spawner/timeout.js +11 -9
- package/dist/spawner/timeout.js.map +1 -1
- package/dist/staleness.d.ts.map +1 -1
- package/dist/staleness.js +4 -1
- package/dist/staleness.js.map +1 -1
- package/dist/stall-detector-config.d.ts +6 -17
- package/dist/stall-detector-config.d.ts.map +1 -1
- package/dist/stall-detector-config.js +10 -36
- package/dist/stall-detector-config.js.map +1 -1
- package/dist/stall-detectors.d.ts.map +1 -1
- package/dist/stall-detectors.js +6 -4
- package/dist/stall-detectors.js.map +1 -1
- package/dist/state-cascade.d.ts.map +1 -1
- package/dist/state-cascade.js +9 -7
- package/dist/state-cascade.js.map +1 -1
- package/dist/stop-request.d.ts.map +1 -1
- package/dist/stop-request.js +6 -2
- package/dist/stop-request.js.map +1 -1
- package/dist/supabase.d.ts.map +1 -1
- package/dist/supabase.js +3 -1
- package/dist/supabase.js.map +1 -1
- package/dist/telemetry-writer.d.ts.map +1 -1
- package/dist/telemetry-writer.js +11 -9
- package/dist/telemetry-writer.js.map +1 -1
- package/dist/trigger-executor.d.ts.map +1 -1
- package/dist/trigger-executor.js +28 -26
- package/dist/trigger-executor.js.map +1 -1
- package/dist/unified-engine-lifecycle.d.ts +19 -11
- package/dist/unified-engine-lifecycle.d.ts.map +1 -1
- package/dist/unified-engine-lifecycle.js +71 -70
- package/dist/unified-engine-lifecycle.js.map +1 -1
- package/dist/unified-init.d.ts.map +1 -1
- package/dist/unified-init.js +41 -36
- package/dist/unified-init.js.map +1 -1
- package/dist/unified-shell-config.d.ts +8 -1
- package/dist/unified-shell-config.d.ts.map +1 -1
- package/dist/unified-shell-config.js +57 -34
- package/dist/unified-shell-config.js.map +1 -1
- package/dist/unified-shell-status.d.ts.map +1 -1
- package/dist/unified-shell-status.js +39 -37
- package/dist/unified-shell-status.js.map +1 -1
- package/dist/unified-shell.d.ts.map +1 -1
- package/dist/unified-shell.js +37 -41
- package/dist/unified-shell.js.map +1 -1
- package/dist/verification-baseline.d.ts.map +1 -1
- package/dist/verification-baseline.js +7 -4
- package/dist/verification-baseline.js.map +1 -1
- package/dist/verification-config.d.ts +3 -3
- package/dist/verification-config.d.ts.map +1 -1
- package/dist/verification-config.js +8 -19
- package/dist/verification-config.js.map +1 -1
- package/dist/verification-default-on.d.ts +6 -6
- package/dist/verification-default-on.d.ts.map +1 -1
- package/dist/verification-default-on.js +9 -7
- package/dist/verification-default-on.js.map +1 -1
- package/dist/verification-deterministic.d.ts.map +1 -1
- package/dist/verification-deterministic.js +6 -3
- package/dist/verification-deterministic.js.map +1 -1
- package/dist/verification-engine.d.ts.map +1 -1
- package/dist/verification-engine.js +20 -16
- package/dist/verification-engine.js.map +1 -1
- package/dist/verification-feedback.d.ts.map +1 -1
- package/dist/verification-feedback.js +4 -2
- package/dist/verification-feedback.js.map +1 -1
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +5 -3
- package/dist/version-check.js.map +1 -1
- package/dist/worker-pidfile.d.ts.map +1 -1
- package/dist/worker-pidfile.js +8 -3
- package/dist/worker-pidfile.js.map +1 -1
- package/dist/worktree/focus.d.ts.map +1 -1
- package/dist/worktree/focus.js +15 -13
- package/dist/worktree/focus.js.map +1 -1
- package/dist/worktree/safety.d.ts.map +1 -1
- package/dist/worktree/safety.js +13 -11
- package/dist/worktree/safety.js.map +1 -1
- package/dist/worktree.d.ts.map +1 -1
- package/dist/worktree.js +41 -39
- package/dist/worktree.js.map +1 -1
- package/package.json +3 -3
package/dist/control-state.js
CHANGED
|
@@ -13,6 +13,8 @@ import { getActiveTeams, terminateTeam } from './focus-executor.js';
|
|
|
13
13
|
import { getControlStateChanges, setControlStateRunning } from './queries/control-state.js';
|
|
14
14
|
import { getActiveFocuses } from './queries/deliveries.js';
|
|
15
15
|
import { sendMessage } from '@telora/daemon-core';
|
|
16
|
+
import { createLogger } from './log.js';
|
|
17
|
+
const log = createLogger({ module: 'control-state' });
|
|
16
18
|
// Track focuses that have already been suspended to avoid repeated SIGSTOP.
|
|
17
19
|
const suspendedFocuses = new Set();
|
|
18
20
|
/**
|
|
@@ -33,7 +35,7 @@ export async function checkControlStateChanges(config) {
|
|
|
33
35
|
changes = await getControlStateChanges(config.productId);
|
|
34
36
|
}
|
|
35
37
|
catch (err) {
|
|
36
|
-
|
|
38
|
+
log.warn('Failed to check control state changes:', err.message);
|
|
37
39
|
return;
|
|
38
40
|
}
|
|
39
41
|
if (changes.length === 0) {
|
|
@@ -64,11 +66,11 @@ export async function checkControlStateChanges(config) {
|
|
|
64
66
|
handleStopped(change);
|
|
65
67
|
break;
|
|
66
68
|
default:
|
|
67
|
-
|
|
69
|
+
log.warn(`Unknown control state: ${change.controlState} for ${change.entityId}`);
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
catch (err) {
|
|
71
|
-
|
|
73
|
+
log.error(`[control-state] Failed to handle ${change.controlState} for ${change.entityType} ${change.entityId}:`, err.message);
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
76
|
}
|
|
@@ -80,7 +82,7 @@ export function handleHumanControl(change) {
|
|
|
80
82
|
const activeTeams = getActiveTeams();
|
|
81
83
|
const team = activeTeams.get(entityId);
|
|
82
84
|
if (!team) {
|
|
83
|
-
|
|
85
|
+
log.info(`No active team for focus ${entityId} -- acknowledging human_control`);
|
|
84
86
|
return;
|
|
85
87
|
}
|
|
86
88
|
// Avoid repeated SIGSTOP
|
|
@@ -88,16 +90,16 @@ export function handleHumanControl(change) {
|
|
|
88
90
|
return;
|
|
89
91
|
}
|
|
90
92
|
if (!team.leadPid) {
|
|
91
|
-
|
|
93
|
+
log.warn(`Team for "${team.focusName}" has no PID -- cannot suspend`);
|
|
92
94
|
return;
|
|
93
95
|
}
|
|
94
96
|
try {
|
|
95
97
|
process.kill(team.leadPid, 'SIGSTOP');
|
|
96
98
|
suspendedFocuses.add(entityId);
|
|
97
|
-
|
|
99
|
+
log.info(`[control-state] Suspended team "${team.focusName}" (PID: ${team.leadPid}) -- human_control`);
|
|
98
100
|
}
|
|
99
101
|
catch (err) {
|
|
100
|
-
|
|
102
|
+
log.error(`[control-state] Failed to SIGSTOP PID ${team.leadPid} for "${team.focusName}":`, err.message);
|
|
101
103
|
}
|
|
102
104
|
}
|
|
103
105
|
/**
|
|
@@ -108,23 +110,23 @@ export async function handleResuming(change) {
|
|
|
108
110
|
const activeTeams = getActiveTeams();
|
|
109
111
|
const team = activeTeams.get(entityId);
|
|
110
112
|
if (!team) {
|
|
111
|
-
|
|
113
|
+
log.info(`No active team for focus ${entityId} -- setting to running`);
|
|
112
114
|
try {
|
|
113
115
|
await setControlStateRunning(entityType, entityId);
|
|
114
116
|
}
|
|
115
117
|
catch (err) {
|
|
116
|
-
|
|
118
|
+
log.warn(`Failed to set control state to running for focus ${entityId}:`, err.message);
|
|
117
119
|
}
|
|
118
120
|
suspendedFocuses.delete(entityId);
|
|
119
121
|
return;
|
|
120
122
|
}
|
|
121
123
|
if (!team.leadPid) {
|
|
122
|
-
|
|
124
|
+
log.warn(`Team for "${team.focusName}" has no PID -- setting to running`);
|
|
123
125
|
try {
|
|
124
126
|
await setControlStateRunning(entityType, entityId);
|
|
125
127
|
}
|
|
126
128
|
catch (err) {
|
|
127
|
-
|
|
129
|
+
log.warn(`Failed to set control state to running for "${team.focusName}":`, err.message);
|
|
128
130
|
}
|
|
129
131
|
suspendedFocuses.delete(entityId);
|
|
130
132
|
return;
|
|
@@ -132,19 +134,19 @@ export async function handleResuming(change) {
|
|
|
132
134
|
// Send SIGCONT to resume the suspended process
|
|
133
135
|
try {
|
|
134
136
|
process.kill(team.leadPid, 'SIGCONT');
|
|
135
|
-
|
|
137
|
+
log.info(`[control-state] Resumed team "${team.focusName}" (PID: ${team.leadPid}) -- SIGCONT sent`);
|
|
136
138
|
}
|
|
137
139
|
catch (err) {
|
|
138
|
-
|
|
140
|
+
log.error(`[control-state] Failed to SIGCONT PID ${team.leadPid} for "${team.focusName}":`, err.message);
|
|
139
141
|
}
|
|
140
142
|
// Inject operator note if present
|
|
141
143
|
if (controlNote && team.leadStdin) {
|
|
142
144
|
try {
|
|
143
145
|
sendMessage(team.leadStdin, `Human operator note: ${controlNote}`);
|
|
144
|
-
|
|
146
|
+
log.info(`Injected operator note for "${team.focusName}"`);
|
|
145
147
|
}
|
|
146
148
|
catch (err) {
|
|
147
|
-
|
|
149
|
+
log.warn(`[control-state] Failed to inject operator note for "${team.focusName}":`, err.message);
|
|
148
150
|
}
|
|
149
151
|
}
|
|
150
152
|
// Update control state to running
|
|
@@ -152,7 +154,7 @@ export async function handleResuming(change) {
|
|
|
152
154
|
await setControlStateRunning(entityType, entityId);
|
|
153
155
|
}
|
|
154
156
|
catch (err) {
|
|
155
|
-
|
|
157
|
+
log.warn(`[control-state] Failed to set control state to running for "${team.focusName}":`, err.message);
|
|
156
158
|
}
|
|
157
159
|
suspendedFocuses.delete(entityId);
|
|
158
160
|
}
|
|
@@ -183,7 +185,7 @@ export function initiateCooperativeStop(focusId, options, deps = defaultCooperat
|
|
|
183
185
|
const activeTeams = deps.getActiveTeams();
|
|
184
186
|
const team = activeTeams.get(focusId);
|
|
185
187
|
if (!team) {
|
|
186
|
-
|
|
188
|
+
log.info(`No active team for focus ${focusId} -- acknowledging stop`);
|
|
187
189
|
suspendedFocuses.delete(focusId);
|
|
188
190
|
return;
|
|
189
191
|
}
|
|
@@ -192,20 +194,20 @@ export function initiateCooperativeStop(focusId, options, deps = defaultCooperat
|
|
|
192
194
|
if (suspendedFocuses.has(focusId) && team.leadPid) {
|
|
193
195
|
try {
|
|
194
196
|
process.kill(team.leadPid, 'SIGCONT');
|
|
195
|
-
|
|
197
|
+
log.info(`Sent SIGCONT before stop for "${team.focusName}" (was suspended)`);
|
|
196
198
|
}
|
|
197
199
|
catch (err) {
|
|
198
|
-
|
|
200
|
+
log.debug(`SIGCONT before stop failed (process may have exited):`, err.message);
|
|
199
201
|
}
|
|
200
202
|
}
|
|
201
203
|
// Send the cooperative shutdown message via stdin.
|
|
202
204
|
if (team.leadStdin) {
|
|
203
205
|
try {
|
|
204
206
|
sendMessage(team.leadStdin, options.message);
|
|
205
|
-
|
|
207
|
+
log.info(`Sent stop message to "${team.focusName}"`);
|
|
206
208
|
}
|
|
207
209
|
catch (err) {
|
|
208
|
-
|
|
210
|
+
log.warn(`[control-state] Failed to send stop message to "${team.focusName}":`, err.message);
|
|
209
211
|
}
|
|
210
212
|
}
|
|
211
213
|
// Mark the shutdown reason so handleTeamCompletion classifies the exit as a
|
|
@@ -217,7 +219,7 @@ export function initiateCooperativeStop(focusId, options, deps = defaultCooperat
|
|
|
217
219
|
const graceMs = options.graceMs ?? COOPERATIVE_STOP_GRACE_MS;
|
|
218
220
|
const timer = setTimeout(() => {
|
|
219
221
|
if (deps.getActiveTeams().has(focusId)) {
|
|
220
|
-
|
|
222
|
+
log.info(`Grace period expired for "${team.focusName}" -- terminating`);
|
|
221
223
|
deps.terminateTeam(focusId, options.shutdownReason);
|
|
222
224
|
}
|
|
223
225
|
}, graceMs);
|
|
@@ -279,7 +281,7 @@ export async function reapDisarmedTeams(config, deps = defaultReapDeps) {
|
|
|
279
281
|
catch (err) {
|
|
280
282
|
// If the active-focus read fails, leave teams running rather than reaping
|
|
281
283
|
// on incomplete information.
|
|
282
|
-
|
|
284
|
+
log.warn(`[disarm-reaper] Cannot determine armed focuses (skipping reap): ${err.message}`);
|
|
283
285
|
return;
|
|
284
286
|
}
|
|
285
287
|
// focusId -> armed? (status active AND role non-null). Only status='active'
|
|
@@ -304,7 +306,7 @@ export async function reapDisarmedTeams(config, deps = defaultReapDeps) {
|
|
|
304
306
|
// Still armed (idle-but-armed / in review / paused) -> not a disarm.
|
|
305
307
|
if (armed.get(focusId))
|
|
306
308
|
continue;
|
|
307
|
-
|
|
309
|
+
log.info(`[disarm-reaper] Focus "${team.focusName}" disarmed (agent role cleared) -- ` +
|
|
308
310
|
`cooperatively stopping the running team`);
|
|
309
311
|
pendingDisarmStops.add(focusId);
|
|
310
312
|
deps.initiateCooperativeStop(focusId, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-state.js","sourceRoot":"","sources":["../src/control-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAE5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"control-state.js","sourceRoot":"","sources":["../src/control-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crash-recovery.d.ts","sourceRoot":"","sources":["../src/crash-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS7D,OAAO,EAAoB,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"crash-recovery.d.ts","sourceRoot":"","sources":["../src/crash-recovery.ts"],"names":[],"mappings":"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"}
|
package/dist/crash-recovery.js
CHANGED
|
@@ -16,6 +16,8 @@ import { createEscalation } from './queries/issues.js';
|
|
|
16
16
|
import { getActiveFocuses } from './queries/deliveries.js';
|
|
17
17
|
import { scanAllFocuses } from './queries/focuses.js';
|
|
18
18
|
import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS, removeWorktreeBase } from '@telora/daemon-core';
|
|
19
|
+
import { createLogger } from './log.js';
|
|
20
|
+
const log = createLogger({ module: 'crash-recovery' });
|
|
19
21
|
/**
|
|
20
22
|
* Default focus-key resolver: scan the product's focuses and match the 8-char
|
|
21
23
|
* prefix to a full focus id. Orphans are inactive by construction, so this
|
|
@@ -31,7 +33,7 @@ async function defaultResolveFocusByKeyPrefix(keyPrefix, productId) {
|
|
|
31
33
|
return match?.id ? { focusId: match.id, productId } : null;
|
|
32
34
|
}
|
|
33
35
|
catch (err) {
|
|
34
|
-
|
|
36
|
+
log.warn(`[crash-recovery] Failed to resolve focus from key ${keyPrefix}: ${err instanceof Error ? err.message : String(err)}`);
|
|
35
37
|
return null;
|
|
36
38
|
}
|
|
37
39
|
}
|
|
@@ -104,7 +106,7 @@ export async function detectOrphanedWorktrees(config, deps = defaultDeps) {
|
|
|
104
106
|
return statSync(fullPath).isDirectory();
|
|
105
107
|
}
|
|
106
108
|
catch (e) {
|
|
107
|
-
|
|
109
|
+
log.debug(`Failed to stat ${fullPath} (may have been deleted):`, e.message);
|
|
108
110
|
return false;
|
|
109
111
|
}
|
|
110
112
|
});
|
|
@@ -123,7 +125,7 @@ export async function detectOrphanedWorktrees(config, deps = defaultDeps) {
|
|
|
123
125
|
activeSessions = await deps.getActiveSessions();
|
|
124
126
|
}
|
|
125
127
|
catch (err) {
|
|
126
|
-
|
|
128
|
+
log.warn(`[crash-recovery] Failed to query active sessions from DB: ${err instanceof Error ? err.message : String(err)}. ` +
|
|
127
129
|
`Treating all worktrees as orphaned.`);
|
|
128
130
|
}
|
|
129
131
|
// Build set of branch names with active sessions
|
|
@@ -142,7 +144,7 @@ export async function detectOrphanedWorktrees(config, deps = defaultDeps) {
|
|
|
142
144
|
}
|
|
143
145
|
}
|
|
144
146
|
catch (err) {
|
|
145
|
-
|
|
147
|
+
log.warn(`[crash-recovery] Failed to query active focuses: ${err instanceof Error ? err.message : String(err)}. ` +
|
|
146
148
|
`Persistent focus worktrees may be incorrectly classified as orphaned.`);
|
|
147
149
|
}
|
|
148
150
|
// 4. Classify each worktree subdirectory
|
|
@@ -155,11 +157,11 @@ export async function detectOrphanedWorktrees(config, deps = defaultDeps) {
|
|
|
155
157
|
// Check if it belongs to an active focus before classifying as orphan.
|
|
156
158
|
const idPrefix = extractFocusIdPrefix(subdir);
|
|
157
159
|
if (idPrefix && activeFocusIdPrefixes.has(idPrefix)) {
|
|
158
|
-
|
|
160
|
+
log.info(`Worktree belongs to active focus (persistent, no git entry): ${fullPath}`);
|
|
159
161
|
continue;
|
|
160
162
|
}
|
|
161
163
|
// Try to infer branch from directory name (agent-role-delivery pattern).
|
|
162
|
-
|
|
164
|
+
log.info(`Worktree directory has no git entry: ${fullPath}`);
|
|
163
165
|
orphans.push({
|
|
164
166
|
worktreePath: fullPath,
|
|
165
167
|
branchName: subdir.replace(/-/g, '/').replace(/^agent\//, 'agent/'),
|
|
@@ -169,13 +171,13 @@ export async function detectOrphanedWorktrees(config, deps = defaultDeps) {
|
|
|
169
171
|
}
|
|
170
172
|
if (activeBranches.has(branchName)) {
|
|
171
173
|
// Active session exists — leave alone
|
|
172
|
-
|
|
174
|
+
log.info(`Worktree is active (has DB session): ${fullPath} [${branchName}]`);
|
|
173
175
|
continue;
|
|
174
176
|
}
|
|
175
177
|
// Check if this worktree belongs to an active focus (persistent worktree)
|
|
176
178
|
const idPrefix = extractFocusIdPrefix(subdir);
|
|
177
179
|
if (idPrefix && activeFocusIdPrefixes.has(idPrefix)) {
|
|
178
|
-
|
|
180
|
+
log.info(`Worktree belongs to active focus (persistent): ${fullPath} [${branchName}]`);
|
|
179
181
|
continue;
|
|
180
182
|
}
|
|
181
183
|
// No active session and no active focus — orphaned
|
|
@@ -216,11 +218,11 @@ function cleanupSingleOrphan(orphan, config, deps) {
|
|
|
216
218
|
let safetyCommitFailed = false;
|
|
217
219
|
if (existsSync(worktreePath) && worktreeHasUncommittedChanges(worktreePath)) {
|
|
218
220
|
const deliveryName = branchName.split('/').slice(2).join('/') || 'unknown';
|
|
219
|
-
|
|
221
|
+
log.info(`Safety-committing dirty worktree: ${worktreePath}`);
|
|
220
222
|
const hash = safetyCommitWorktree(worktreePath, deliveryName);
|
|
221
223
|
if (hash) {
|
|
222
224
|
commitHash = hash.trim();
|
|
223
|
-
|
|
225
|
+
log.info(`Safety commit created: ${commitHash.slice(0, 8)} on ${branchName}`);
|
|
224
226
|
}
|
|
225
227
|
else {
|
|
226
228
|
// The work is dirty AND uncommittable: it is not on any ref. Removing the
|
|
@@ -228,14 +230,14 @@ function cleanupSingleOrphan(orphan, config, deps) {
|
|
|
228
230
|
// unrecoverable corner (handled by the caller -- escalate only if the
|
|
229
231
|
// focus also cannot be anchored).
|
|
230
232
|
safetyCommitFailed = true;
|
|
231
|
-
|
|
233
|
+
log.warn(`Safety commit failed for ${worktreePath}, preserving worktree as-is`);
|
|
232
234
|
}
|
|
233
235
|
}
|
|
234
236
|
// Step 2: Check if branch is already merged to integration
|
|
235
237
|
const hasUnmerged = branchHasUnmergedCommits(branchName, integrationBranch, repoPath);
|
|
236
238
|
if (!hasUnmerged) {
|
|
237
239
|
// Fully merged — safe to remove (UNCHANGED behavior: worktree + branch both go)
|
|
238
|
-
|
|
240
|
+
log.info(`Removing merged orphan: ${worktreePath} [${branchName}]`);
|
|
239
241
|
removeWorktree(repoPath, worktreePath, {
|
|
240
242
|
branchName,
|
|
241
243
|
integrationBranch,
|
|
@@ -244,7 +246,7 @@ function cleanupSingleOrphan(orphan, config, deps) {
|
|
|
244
246
|
// Also delete the branch since it's merged
|
|
245
247
|
const deleteResult = runGitSync(['branch', '-d', branchName], repoPath);
|
|
246
248
|
if (deleteResult.success) {
|
|
247
|
-
|
|
249
|
+
log.info(`Deleted merged branch: ${branchName}`);
|
|
248
250
|
}
|
|
249
251
|
return {
|
|
250
252
|
worktreePath,
|
|
@@ -262,7 +264,7 @@ function cleanupSingleOrphan(orphan, config, deps) {
|
|
|
262
264
|
// would lose the work) and the branch; the caller decides whether to escalate
|
|
263
265
|
// based on whether the focus can be anchored.
|
|
264
266
|
if (safetyCommitFailed) {
|
|
265
|
-
|
|
267
|
+
log.warn(`[crash-recovery] Preserving worktree + branch (uncommitted work could not be captured): ${worktreePath} [${branchName}]`);
|
|
266
268
|
return {
|
|
267
269
|
worktreePath,
|
|
268
270
|
branchName,
|
|
@@ -279,10 +281,10 @@ function cleanupSingleOrphan(orphan, config, deps) {
|
|
|
279
281
|
// DROP THE WORKTREE DIRECTORY (no disk detritus). removeWorktreeDir does a
|
|
280
282
|
// `git worktree remove --force` + prune, leaving the branch ref intact --
|
|
281
283
|
// bypassing removeWorktree's unmerged-commit guard since we keep the branch.
|
|
282
|
-
|
|
284
|
+
log.info(`[crash-recovery] Preserving branch + dropping worktree for orphan with ${unmergedCount} unmerged commit(s): ${worktreePath} [${branchName}]`);
|
|
283
285
|
const worktreeRemoved = deps.removeWorktreeDir(repoPath, worktreePath);
|
|
284
286
|
if (!worktreeRemoved) {
|
|
285
|
-
|
|
287
|
+
log.warn(`[crash-recovery] Failed to remove worktree dir (branch ${branchName} still preserved): ${worktreePath}`);
|
|
286
288
|
}
|
|
287
289
|
return {
|
|
288
290
|
worktreePath,
|
|
@@ -311,10 +313,10 @@ export async function cleanupOrphanedWorktrees(orphans, config, deps = defaultDe
|
|
|
311
313
|
exit_category: 'recovery_cleanup',
|
|
312
314
|
ended_at: new Date().toISOString(),
|
|
313
315
|
});
|
|
314
|
-
|
|
316
|
+
log.info(`Marked session ${orphan.session.id} as failed (crash recovery)`);
|
|
315
317
|
}
|
|
316
318
|
catch (err) {
|
|
317
|
-
|
|
319
|
+
log.warn(`[crash-recovery] Failed to update session ${orphan.session.id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
318
320
|
}
|
|
319
321
|
}
|
|
320
322
|
}
|
|
@@ -325,7 +327,7 @@ export async function cleanupOrphanedWorktrees(orphans, config, deps = defaultDe
|
|
|
325
327
|
actions.push(action);
|
|
326
328
|
}
|
|
327
329
|
catch (err) {
|
|
328
|
-
|
|
330
|
+
log.error(`[crash-recovery] Error cleaning up orphan ${orphan.worktreePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
329
331
|
}
|
|
330
332
|
}
|
|
331
333
|
// Resolve the owning focus from each preserved orphan's branch focus-key, so
|
|
@@ -353,7 +355,7 @@ export async function cleanupOrphanedWorktrees(orphans, config, deps = defaultDe
|
|
|
353
355
|
? `focus-key ${a.focusKey}`
|
|
354
356
|
: 'focus unresolved';
|
|
355
357
|
const worktreeNote = a.worktreeRemoved ? 'worktree dropped' : 'worktree kept';
|
|
356
|
-
|
|
358
|
+
log.info(`[crash-recovery] Housekeeping: preserved branch ${a.branchName} ` +
|
|
357
359
|
`(${worktreeNote}; ${focusRef}` +
|
|
358
360
|
(a.unmergedCommitCount ? `; ${a.unmergedCommitCount} unmerged commit(s)` : '') +
|
|
359
361
|
(a.commitHash ? `; safety commit ${a.commitHash.slice(0, 8)}` : '') +
|
|
@@ -363,7 +365,7 @@ export async function cleanupOrphanedWorktrees(orphans, config, deps = defaultDe
|
|
|
363
365
|
// clean "worktree dropped" outcome -- surface it distinctly at WARN so the
|
|
364
366
|
// leftover dir is visible; recoverFromCrash also lifts it into the summary.
|
|
365
367
|
if (!a.worktreeRemoved) {
|
|
366
|
-
|
|
368
|
+
log.warn(`[crash-recovery] Worktree dir could NOT be removed for preserved branch ` +
|
|
367
369
|
`${a.branchName}; leftover dir remains on disk (manual prune may be needed): ${a.worktreePath}`);
|
|
368
370
|
}
|
|
369
371
|
}
|
|
@@ -405,10 +407,10 @@ export async function cleanupOrphanedWorktrees(orphans, config, deps = defaultDe
|
|
|
405
407
|
whatWasTried: 'Daemon crash recovery preserved the worktree; the uncommitted work could not be captured on a branch and the focus could not be resolved from the branch name.',
|
|
406
408
|
helpNeeded: 'Inspect the preserved worktree and recover or discard the uncommitted work.',
|
|
407
409
|
});
|
|
408
|
-
|
|
410
|
+
log.info(`Created escalation for ${unrecoverable.length} unrecoverable orphan(s)`);
|
|
409
411
|
}
|
|
410
412
|
catch (err) {
|
|
411
|
-
|
|
413
|
+
log.warn(`[crash-recovery] Failed to create escalation: ${err instanceof Error ? err.message : String(err)}`);
|
|
412
414
|
}
|
|
413
415
|
}
|
|
414
416
|
return actions;
|
|
@@ -441,7 +443,7 @@ export function pruneStaleAgentBranches(config) {
|
|
|
441
443
|
const pruned = [];
|
|
442
444
|
const preserved = [];
|
|
443
445
|
if (branches.length === 0) {
|
|
444
|
-
|
|
446
|
+
log.info('No stale agent branches found');
|
|
445
447
|
return { pruned, preserved };
|
|
446
448
|
}
|
|
447
449
|
// Get set of branches that have active worktrees
|
|
@@ -454,7 +456,7 @@ export function pruneStaleAgentBranches(config) {
|
|
|
454
456
|
// Check for unmerged commits
|
|
455
457
|
if (branchHasUnmergedCommits(branch, integrationBranch, repoPath)) {
|
|
456
458
|
const focusKey = extractFocusKeyFromBranch(branch);
|
|
457
|
-
|
|
459
|
+
log.info(`[crash-recovery] Housekeeping: preserving stale branch with unmerged commits: ${branch}` +
|
|
458
460
|
(focusKey ? ` (focus-key ${focusKey})` : ''));
|
|
459
461
|
preserved.push(branch);
|
|
460
462
|
continue;
|
|
@@ -462,14 +464,14 @@ export function pruneStaleAgentBranches(config) {
|
|
|
462
464
|
// Safe to delete
|
|
463
465
|
const deleteResult = runGitSync(['branch', '-D', branch], repoPath);
|
|
464
466
|
if (deleteResult.success) {
|
|
465
|
-
|
|
467
|
+
log.info(`Pruned stale branch: ${branch}`);
|
|
466
468
|
pruned.push(branch);
|
|
467
469
|
}
|
|
468
470
|
else {
|
|
469
|
-
|
|
471
|
+
log.warn(`Failed to prune branch ${branch}: ${deleteResult.error}`);
|
|
470
472
|
}
|
|
471
473
|
}
|
|
472
|
-
|
|
474
|
+
log.info(`[crash-recovery] Branch pruning: ${pruned.length} pruned, ${preserved.length} preserved with unmerged work`);
|
|
473
475
|
return { pruned, preserved };
|
|
474
476
|
}
|
|
475
477
|
// ── Main recovery orchestrator ───────────────────────────────────
|
|
@@ -480,7 +482,7 @@ export function pruneStaleAgentBranches(config) {
|
|
|
480
482
|
* with no new crashes finds nothing to clean.
|
|
481
483
|
*/
|
|
482
484
|
export async function recoverFromCrash(config, deps = defaultDeps) {
|
|
483
|
-
|
|
485
|
+
log.info('Starting crash recovery scan...');
|
|
484
486
|
const result = {
|
|
485
487
|
orphansDetected: 0,
|
|
486
488
|
orphansCleaned: 0,
|
|
@@ -498,15 +500,15 @@ export async function recoverFromCrash(config, deps = defaultDeps) {
|
|
|
498
500
|
}
|
|
499
501
|
catch (err) {
|
|
500
502
|
const msg = `Failed to detect orphaned worktrees: ${err instanceof Error ? err.message : String(err)}`;
|
|
501
|
-
|
|
503
|
+
log.error(`${msg}`);
|
|
502
504
|
result.errors.push(msg);
|
|
503
505
|
orphans = [];
|
|
504
506
|
}
|
|
505
507
|
if (orphans.length === 0) {
|
|
506
|
-
|
|
508
|
+
log.info('No orphaned worktrees found');
|
|
507
509
|
}
|
|
508
510
|
else {
|
|
509
|
-
|
|
511
|
+
log.info(`Found ${orphans.length} orphaned worktree(s)`);
|
|
510
512
|
}
|
|
511
513
|
// Step 2: Clean up orphans
|
|
512
514
|
if (orphans.length > 0) {
|
|
@@ -525,7 +527,7 @@ export async function recoverFromCrash(config, deps = defaultDeps) {
|
|
|
525
527
|
}
|
|
526
528
|
catch (err) {
|
|
527
529
|
const msg = `Failed during orphan cleanup: ${err instanceof Error ? err.message : String(err)}`;
|
|
528
|
-
|
|
530
|
+
log.error(`${msg}`);
|
|
529
531
|
result.errors.push(msg);
|
|
530
532
|
}
|
|
531
533
|
}
|
|
@@ -537,7 +539,7 @@ export async function recoverFromCrash(config, deps = defaultDeps) {
|
|
|
537
539
|
}
|
|
538
540
|
catch (err) {
|
|
539
541
|
const msg = `Failed during branch pruning: ${err instanceof Error ? err.message : String(err)}`;
|
|
540
|
-
|
|
542
|
+
log.error(`${msg}`);
|
|
541
543
|
result.errors.push(msg);
|
|
542
544
|
}
|
|
543
545
|
// Step 4: Mark any remaining active sessions as failed (DB-driven reconciliation)
|
|
@@ -551,7 +553,7 @@ export async function recoverFromCrash(config, deps = defaultDeps) {
|
|
|
551
553
|
.map(o => o.session.id));
|
|
552
554
|
const remainingSessions = activeSessions.filter(s => !alreadyHandledSessionIds.has(s.id));
|
|
553
555
|
if (remainingSessions.length > 0) {
|
|
554
|
-
|
|
556
|
+
log.info(`Found ${remainingSessions.length} orphaned session(s) without worktrees, marking as failed`);
|
|
555
557
|
const sessionResults = await Promise.allSettled(remainingSessions.map(session => deps.updateSession(session.id, {
|
|
556
558
|
status: 'failed',
|
|
557
559
|
exit_reason: 'Daemon crash recovery: session was active when daemon restarted',
|
|
@@ -561,29 +563,29 @@ export async function recoverFromCrash(config, deps = defaultDeps) {
|
|
|
561
563
|
const succeeded = sessionResults.filter(r => r.status === 'fulfilled').length;
|
|
562
564
|
const failed = sessionResults.filter(r => r.status === 'rejected').length;
|
|
563
565
|
if (failed > 0) {
|
|
564
|
-
|
|
566
|
+
log.warn(`${failed} session update(s) failed during DB reconciliation`);
|
|
565
567
|
}
|
|
566
|
-
|
|
568
|
+
log.info(`Marked ${succeeded} orphaned session(s) as failed (DB reconciliation)`);
|
|
567
569
|
}
|
|
568
570
|
else if (activeSessions.length > 0) {
|
|
569
|
-
|
|
571
|
+
log.info(`All ${activeSessions.length} active session(s) were already handled during worktree cleanup`);
|
|
570
572
|
}
|
|
571
573
|
}
|
|
572
574
|
catch (err) {
|
|
573
575
|
const msg = `Failed during DB session reconciliation: ${err instanceof Error ? err.message : String(err)}`;
|
|
574
|
-
|
|
576
|
+
log.error(`${msg}`);
|
|
575
577
|
result.errors.push(msg);
|
|
576
578
|
}
|
|
577
579
|
// Summary. Preserved counts are housekeeping (branch kept, worktree dropped),
|
|
578
580
|
// not pending human work -- they are logged so the count stays visible.
|
|
579
|
-
|
|
581
|
+
log.info(`[crash-recovery] Recovery complete: ` +
|
|
580
582
|
`${result.orphansDetected} orphan(s) detected, ` +
|
|
581
583
|
`${result.orphansCleaned} cleaned, ` +
|
|
582
584
|
`${result.orphansPreserved} branch(es) preserved (housekeeping), ` +
|
|
583
585
|
`${result.branchesPruned} branch(es) pruned, ` +
|
|
584
586
|
`${result.branchesPreserved} stale branch(es) preserved (housekeeping)`);
|
|
585
587
|
if (result.errors.length > 0) {
|
|
586
|
-
|
|
588
|
+
log.warn(`${result.errors.length} error(s) during recovery (non-fatal)`);
|
|
587
589
|
}
|
|
588
590
|
return result;
|
|
589
591
|
}
|