@telora/daemon 0.22.132 → 0.22.136
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 +6 -3
- package/dist/audit/audit-hooks.d.ts +6 -2
- package/dist/audit/audit-hooks.d.ts.map +1 -1
- package/dist/audit/audit-hooks.js +12 -5
- package/dist/audit/audit-hooks.js.map +1 -1
- package/dist/audit/audit-phase.js +1 -1
- package/dist/audit/audit-phase.js.map +1 -1
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/index.js +1 -0
- package/dist/backends/index.js.map +1 -1
- package/dist/completion/completion-phase-registry.d.ts +4 -0
- package/dist/completion/completion-phase-registry.d.ts.map +1 -1
- package/dist/completion/completion-phase-registry.js +63 -18
- package/dist/completion/completion-phase-registry.js.map +1 -1
- package/dist/completion/exit-classification.d.ts.map +1 -1
- package/dist/completion/exit-classification.js +1 -0
- package/dist/completion/exit-classification.js.map +1 -1
- package/dist/completion/review-approved-head-gate.d.ts +53 -0
- package/dist/completion/review-approved-head-gate.d.ts.map +1 -0
- package/dist/completion/review-approved-head-gate.js +124 -0
- package/dist/completion/review-approved-head-gate.js.map +1 -0
- package/dist/completion/review-census-record.d.ts +52 -0
- package/dist/completion/review-census-record.d.ts.map +1 -0
- package/dist/completion/review-census-record.js +145 -0
- package/dist/completion/review-census-record.js.map +1 -0
- package/dist/completion/review-exit-deps.d.ts +5 -1
- package/dist/completion/review-exit-deps.d.ts.map +1 -1
- package/dist/completion/review-exit-deps.js +7 -2
- package/dist/completion/review-exit-deps.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +29 -16
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/review-exit-progress.d.ts +8 -0
- package/dist/completion/review-exit-progress.d.ts.map +1 -1
- package/dist/completion/review-exit-progress.js +14 -0
- package/dist/completion/review-exit-progress.js.map +1 -1
- package/dist/completion/review-exit-shortfall-park.d.ts +14 -0
- package/dist/completion/review-exit-shortfall-park.d.ts.map +1 -0
- package/dist/completion/review-exit-shortfall-park.js +52 -0
- package/dist/completion/review-exit-shortfall-park.js.map +1 -0
- package/dist/completion/review-exit-shortfall.js +1 -1
- package/dist/completion/review-exit-shortfall.js.map +1 -1
- package/dist/completion/review-exit-verdict-gate.d.ts +58 -0
- package/dist/completion/review-exit-verdict-gate.d.ts.map +1 -1
- package/dist/completion/review-exit-verdict-gate.js +68 -8
- package/dist/completion/review-exit-verdict-gate.js.map +1 -1
- package/dist/completion/review-next-step.d.ts +15 -3
- package/dist/completion/review-next-step.d.ts.map +1 -1
- package/dist/completion/review-next-step.js +7 -2
- package/dist/completion/review-next-step.js.map +1 -1
- package/dist/completion/standing-approval-convergence.d.ts +68 -0
- package/dist/completion/standing-approval-convergence.d.ts.map +1 -0
- package/dist/completion/standing-approval-convergence.js +230 -0
- package/dist/completion/standing-approval-convergence.js.map +1 -0
- package/dist/completion/standing-approval-deps.d.ts +5 -0
- package/dist/completion/standing-approval-deps.d.ts.map +1 -0
- package/dist/completion/standing-approval-deps.js +37 -0
- package/dist/completion/standing-approval-deps.js.map +1 -0
- package/dist/completion/state-cascade.d.ts +11 -0
- package/dist/completion/state-cascade.d.ts.map +1 -1
- package/dist/completion/state-cascade.js +40 -1
- package/dist/completion/state-cascade.js.map +1 -1
- package/dist/completion/team-lifecycle.d.ts +14 -2
- package/dist/completion/team-lifecycle.d.ts.map +1 -1
- package/dist/completion/team-lifecycle.js +36 -36
- package/dist/completion/team-lifecycle.js.map +1 -1
- package/dist/completion/terminated-work-reconcile.d.ts +3 -1
- package/dist/completion/terminated-work-reconcile.d.ts.map +1 -1
- package/dist/completion/terminated-work-reconcile.js +24 -11
- package/dist/completion/terminated-work-reconcile.js.map +1 -1
- package/dist/delivery/delivery-advance-block.d.ts +6 -0
- package/dist/delivery/delivery-advance-block.d.ts.map +1 -1
- package/dist/delivery/delivery-advance-block.js +29 -3
- package/dist/delivery/delivery-advance-block.js.map +1 -1
- package/dist/delivery/delivery-reconciler.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler.js +4 -1
- package/dist/delivery/delivery-reconciler.js.map +1 -1
- package/dist/delivery/operator-hold.d.ts.map +1 -1
- package/dist/delivery/operator-hold.js +3 -1
- package/dist/delivery/operator-hold.js.map +1 -1
- package/dist/directive/directive-executor.d.ts.map +1 -1
- package/dist/directive/directive-executor.js +6 -0
- package/dist/directive/directive-executor.js.map +1 -1
- package/dist/directive/directive-queue.d.ts +8 -0
- package/dist/directive/directive-queue.d.ts.map +1 -1
- package/dist/directive/directive-queue.js +20 -0
- package/dist/directive/directive-queue.js.map +1 -1
- package/dist/directive/phase-sync.d.ts +5 -0
- package/dist/directive/phase-sync.d.ts.map +1 -1
- package/dist/directive/phase-sync.js +11 -1
- package/dist/directive/phase-sync.js.map +1 -1
- package/dist/directive/stranded-review-reroute.d.ts +37 -0
- package/dist/directive/stranded-review-reroute.d.ts.map +1 -0
- package/dist/directive/stranded-review-reroute.js +150 -0
- package/dist/directive/stranded-review-reroute.js.map +1 -0
- package/dist/focus/focus-engine.d.ts.map +1 -1
- package/dist/focus/focus-engine.js +15 -3
- package/dist/focus/focus-engine.js.map +1 -1
- package/dist/focus/focus-executor.d.ts.map +1 -1
- package/dist/focus/focus-executor.js +9 -65
- package/dist/focus/focus-executor.js.map +1 -1
- package/dist/focus/focus-lifecycle.d.ts +12 -0
- package/dist/focus/focus-lifecycle.d.ts.map +1 -1
- package/dist/focus/focus-lifecycle.js +66 -37
- package/dist/focus/focus-lifecycle.js.map +1 -1
- package/dist/focus/focus-phase.d.ts.map +1 -1
- package/dist/focus/focus-phase.js +6 -0
- package/dist/focus/focus-phase.js.map +1 -1
- package/dist/focus/focus-spawn-decision.d.ts.map +1 -1
- package/dist/focus/focus-spawn-decision.js +1 -0
- package/dist/focus/focus-spawn-decision.js.map +1 -1
- package/dist/focus/focus-team-state.d.ts +10 -0
- package/dist/focus/focus-team-state.d.ts.map +1 -1
- package/dist/focus/focus-team-state.js +19 -1
- package/dist/focus/focus-team-state.js.map +1 -1
- package/dist/focus/listener-auto-advance.d.ts.map +1 -1
- package/dist/focus/listener-auto-advance.js +1 -0
- package/dist/focus/listener-auto-advance.js.map +1 -1
- package/dist/focus/listener-spawn.d.ts +10 -0
- package/dist/focus/listener-spawn.d.ts.map +1 -1
- package/dist/focus/listener-spawn.js +46 -4
- package/dist/focus/listener-spawn.js.map +1 -1
- package/dist/focus/listener-state.d.ts.map +1 -1
- package/dist/focus/listener-state.js +11 -1
- package/dist/focus/listener-state.js.map +1 -1
- package/dist/focus/listener.d.ts +42 -0
- package/dist/focus/listener.d.ts.map +1 -1
- package/dist/focus/listener.js +62 -33
- package/dist/focus/listener.js.map +1 -1
- package/dist/focus/pending-review-approved-head.d.ts +41 -0
- package/dist/focus/pending-review-approved-head.d.ts.map +1 -0
- package/dist/focus/pending-review-approved-head.js +198 -0
- package/dist/focus/pending-review-approved-head.js.map +1 -0
- package/dist/focus/pending-spawn-pass-deps.d.ts +5 -0
- package/dist/focus/pending-spawn-pass-deps.d.ts.map +1 -1
- package/dist/focus/pending-spawn-pass-deps.js +2 -1
- package/dist/focus/pending-spawn-pass-deps.js.map +1 -1
- package/dist/focus/pending-spawn-review-next-step.d.ts.map +1 -1
- package/dist/focus/pending-spawn-review-next-step.js +26 -4
- package/dist/focus/pending-spawn-review-next-step.js.map +1 -1
- package/dist/focus/review-spawn-coverage.d.ts +87 -0
- package/dist/focus/review-spawn-coverage.d.ts.map +1 -0
- package/dist/focus/review-spawn-coverage.js +104 -0
- package/dist/focus/review-spawn-coverage.js.map +1 -0
- package/dist/focus/session-health.d.ts +5 -2
- package/dist/focus/session-health.d.ts.map +1 -1
- package/dist/focus/session-health.js +2 -1
- package/dist/focus/session-health.js.map +1 -1
- package/dist/focus/session-process-reap.d.ts +50 -0
- package/dist/focus/session-process-reap.d.ts.map +1 -0
- package/dist/focus/session-process-reap.js +77 -0
- package/dist/focus/session-process-reap.js.map +1 -0
- package/dist/focus/unchanged-reviewed-head.d.ts +40 -0
- package/dist/focus/unchanged-reviewed-head.d.ts.map +1 -0
- package/dist/focus/unchanged-reviewed-head.js +84 -0
- package/dist/focus/unchanged-reviewed-head.js.map +1 -0
- package/dist/focus/verify-open-issues.d.ts +4 -19
- package/dist/focus/verify-open-issues.d.ts.map +1 -1
- package/dist/focus/verify-open-issues.js +83 -41
- package/dist/focus/verify-open-issues.js.map +1 -1
- package/dist/git/focus-integration-sync.d.ts +61 -0
- package/dist/git/focus-integration-sync.d.ts.map +1 -0
- package/dist/git/focus-integration-sync.js +73 -0
- package/dist/git/focus-integration-sync.js.map +1 -0
- package/dist/git/focus-own-delta.d.ts +38 -0
- package/dist/git/focus-own-delta.d.ts.map +1 -0
- package/dist/git/focus-own-delta.js +193 -0
- package/dist/git/focus-own-delta.js.map +1 -0
- package/dist/git/index.d.ts +2 -0
- package/dist/git/index.d.ts.map +1 -1
- package/dist/git/index.js +4 -0
- package/dist/git/index.js.map +1 -1
- package/dist/git/merge.d.ts.map +1 -1
- package/dist/git/merge.js +11 -1
- package/dist/git/merge.js.map +1 -1
- package/dist/git/resolution-restore.d.ts +66 -0
- package/dist/git/resolution-restore.d.ts.map +1 -0
- package/dist/git/resolution-restore.js +331 -0
- package/dist/git/resolution-restore.js.map +1 -0
- package/dist/loops/engine.d.ts.map +1 -1
- package/dist/loops/engine.js.map +1 -1
- package/dist/merge/abandoned-merge-recovery.d.ts +72 -0
- package/dist/merge/abandoned-merge-recovery.d.ts.map +1 -0
- package/dist/merge/abandoned-merge-recovery.js +117 -0
- package/dist/merge/abandoned-merge-recovery.js.map +1 -0
- package/dist/merge/focus-merge.d.ts +19 -0
- package/dist/merge/focus-merge.d.ts.map +1 -1
- package/dist/merge/focus-merge.js +136 -99
- package/dist/merge/focus-merge.js.map +1 -1
- package/dist/merge/merge-back-activity.d.ts +11 -0
- package/dist/merge/merge-back-activity.d.ts.map +1 -0
- package/dist/merge/merge-back-activity.js +57 -0
- package/dist/merge/merge-back-activity.js.map +1 -0
- package/dist/merge/merge-back-conflict.d.ts +119 -0
- package/dist/merge/merge-back-conflict.d.ts.map +1 -0
- package/dist/merge/merge-back-conflict.js +178 -0
- package/dist/merge/merge-back-conflict.js.map +1 -0
- package/dist/merge/merge-back-followup.d.ts +109 -0
- package/dist/merge/merge-back-followup.d.ts.map +1 -0
- package/dist/merge/merge-back-followup.js +316 -0
- package/dist/merge/merge-back-followup.js.map +1 -0
- package/dist/merge/merge-back-loop.d.ts +2 -0
- package/dist/merge/merge-back-loop.d.ts.map +1 -1
- package/dist/merge/merge-back-loop.js +14 -15
- package/dist/merge/merge-back-loop.js.map +1 -1
- package/dist/merge/merge-conflict-escalation.d.ts +12 -0
- package/dist/merge/merge-conflict-escalation.d.ts.map +1 -1
- package/dist/merge/merge-conflict-escalation.js +37 -2
- package/dist/merge/merge-conflict-escalation.js.map +1 -1
- package/dist/merge/merge-gate-coverage.d.ts.map +1 -1
- package/dist/merge/merge-gate-coverage.js +1 -0
- package/dist/merge/merge-gate-coverage.js.map +1 -1
- package/dist/prompt/prompt-listing.d.ts +5 -0
- package/dist/prompt/prompt-listing.d.ts.map +1 -1
- package/dist/prompt/prompt-listing.js +35 -0
- package/dist/prompt/prompt-listing.js.map +1 -1
- package/dist/prompt-sections/routing-decider-sections.d.ts.map +1 -1
- package/dist/prompt-sections/routing-decider-sections.js +2 -0
- package/dist/prompt-sections/routing-decider-sections.js.map +1 -1
- package/dist/prompt-sections/shortfall-park-section.d.ts +43 -0
- package/dist/prompt-sections/shortfall-park-section.d.ts.map +1 -0
- package/dist/prompt-sections/shortfall-park-section.js +36 -0
- package/dist/prompt-sections/shortfall-park-section.js.map +1 -0
- package/dist/queries/agent-resolvable-promotion.d.ts +16 -2
- package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -1
- package/dist/queries/agent-resolvable-promotion.js +30 -3
- package/dist/queries/agent-resolvable-promotion.js.map +1 -1
- package/dist/queries/cause-key.d.ts +17 -22
- package/dist/queries/cause-key.d.ts.map +1 -1
- package/dist/queries/cause-key.js +50 -1
- package/dist/queries/cause-key.js.map +1 -1
- package/dist/queries/commit-attributions.d.ts +18 -0
- package/dist/queries/commit-attributions.d.ts.map +1 -0
- package/dist/queries/commit-attributions.js +39 -0
- package/dist/queries/commit-attributions.js.map +1 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +3 -1
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/delivery-gate-state.d.ts +21 -5
- package/dist/queries/delivery-gate-state.d.ts.map +1 -1
- package/dist/queries/delivery-gate-state.js +35 -9
- package/dist/queries/delivery-gate-state.js.map +1 -1
- package/dist/queries/escalation-consumption.d.ts.map +1 -1
- package/dist/queries/escalation-consumption.js +2 -1
- package/dist/queries/escalation-consumption.js.map +1 -1
- package/dist/queries/escalation-field-bounds.d.ts +48 -0
- package/dist/queries/escalation-field-bounds.d.ts.map +1 -0
- package/dist/queries/escalation-field-bounds.js +83 -0
- package/dist/queries/escalation-field-bounds.js.map +1 -0
- package/dist/queries/escalation-refusal.d.ts +88 -0
- package/dist/queries/escalation-refusal.d.ts.map +1 -0
- package/dist/queries/escalation-refusal.js +217 -0
- package/dist/queries/escalation-refusal.js.map +1 -0
- package/dist/queries/escalation-suppression.d.ts +6 -0
- package/dist/queries/escalation-suppression.d.ts.map +1 -1
- package/dist/queries/escalation-suppression.js +4 -13
- package/dist/queries/escalation-suppression.js.map +1 -1
- package/dist/queries/escalations.d.ts +5 -13
- package/dist/queries/escalations.d.ts.map +1 -1
- package/dist/queries/escalations.js +25 -30
- package/dist/queries/escalations.js.map +1 -1
- package/dist/queries/filing-observation.d.ts.map +1 -1
- package/dist/queries/filing-observation.js +3 -1
- package/dist/queries/filing-observation.js.map +1 -1
- package/dist/queries/focus-review-approval.d.ts +2 -0
- package/dist/queries/focus-review-approval.d.ts.map +1 -1
- package/dist/queries/focus-review-approval.js +7 -2
- package/dist/queries/focus-review-approval.js.map +1 -1
- package/dist/queries/focuses.d.ts.map +1 -1
- package/dist/queries/focuses.js +2 -1
- package/dist/queries/focuses.js.map +1 -1
- package/dist/queries/incident-correlation.d.ts.map +1 -1
- package/dist/queries/incident-correlation.js +4 -1
- package/dist/queries/incident-correlation.js.map +1 -1
- package/dist/queries/misattributed-commits-record.d.ts +26 -0
- package/dist/queries/misattributed-commits-record.d.ts.map +1 -0
- package/dist/queries/misattributed-commits-record.js +5 -0
- package/dist/queries/misattributed-commits-record.js.map +1 -0
- package/dist/queries/reality-tree.d.ts.map +1 -1
- package/dist/queries/reality-tree.js +2 -1
- package/dist/queries/reality-tree.js.map +1 -1
- package/dist/queries/schemas.d.ts +3 -0
- package/dist/queries/schemas.d.ts.map +1 -1
- package/dist/queries/schemas.js +1 -0
- package/dist/queries/schemas.js.map +1 -1
- package/dist/queries/shared.js +1 -1
- package/dist/queries/shortfall-park-record.d.ts +48 -0
- package/dist/queries/shortfall-park-record.d.ts.map +1 -0
- package/dist/queries/shortfall-park-record.js +31 -0
- package/dist/queries/shortfall-park-record.js.map +1 -0
- package/dist/queries/shortfall-rulings.d.ts +71 -0
- package/dist/queries/shortfall-rulings.d.ts.map +1 -0
- package/dist/queries/shortfall-rulings.js +53 -0
- package/dist/queries/shortfall-rulings.js.map +1 -0
- package/dist/queries/verification.d.ts +20 -1
- package/dist/queries/verification.d.ts.map +1 -1
- package/dist/queries/verification.js +48 -8
- package/dist/queries/verification.js.map +1 -1
- package/dist/resolvers/index.d.ts +2 -2
- package/dist/resolvers/index.d.ts.map +1 -1
- package/dist/resolvers/index.js +1 -1
- package/dist/resolvers/index.js.map +1 -1
- package/dist/resolvers/shared/delivery-trailer.d.ts +99 -0
- package/dist/resolvers/shared/delivery-trailer.d.ts.map +1 -0
- package/dist/resolvers/shared/delivery-trailer.js +103 -0
- package/dist/resolvers/shared/delivery-trailer.js.map +1 -0
- package/dist/resolvers/shared/git-diff.d.ts +11 -84
- package/dist/resolvers/shared/git-diff.d.ts.map +1 -1
- package/dist/resolvers/shared/git-diff.js +17 -84
- package/dist/resolvers/shared/git-diff.js.map +1 -1
- package/dist/resolvers/shared/review-window-commits.d.ts.map +1 -1
- package/dist/resolvers/shared/review-window-commits.js +1 -0
- package/dist/resolvers/shared/review-window-commits.js.map +1 -1
- package/dist/session/session-lineage.d.ts.map +1 -1
- package/dist/session/session-lineage.js +1 -0
- package/dist/session/session-lineage.js.map +1 -1
- package/dist/shell/config.d.ts +2 -1
- package/dist/shell/config.d.ts.map +1 -1
- package/dist/shell/config.js +21 -4
- package/dist/shell/config.js.map +1 -1
- package/dist/shell/crash-recovery.d.ts +3 -7
- package/dist/shell/crash-recovery.d.ts.map +1 -1
- package/dist/shell/crash-recovery.js +28 -31
- package/dist/shell/crash-recovery.js.map +1 -1
- package/dist/shell/orphan-capture.d.ts +42 -0
- package/dist/shell/orphan-capture.d.ts.map +1 -0
- package/dist/shell/orphan-capture.js +53 -0
- package/dist/shell/orphan-capture.js.map +1 -0
- package/dist/shell/worker-pidfile.d.ts +22 -4
- package/dist/shell/worker-pidfile.d.ts.map +1 -1
- package/dist/shell/worker-pidfile.js +51 -13
- package/dist/shell/worker-pidfile.js.map +1 -1
- package/dist/spawn/helpers.d.ts +3 -0
- package/dist/spawn/helpers.d.ts.map +1 -1
- package/dist/spawn/helpers.js +28 -9
- package/dist/spawn/helpers.js.map +1 -1
- package/dist/spawn/lead-launch.d.ts +34 -0
- package/dist/spawn/lead-launch.d.ts.map +1 -0
- package/dist/spawn/lead-launch.js +34 -0
- package/dist/spawn/lead-launch.js.map +1 -0
- package/dist/spawn/lead-process-ownership.d.ts +91 -0
- package/dist/spawn/lead-process-ownership.d.ts.map +1 -0
- package/dist/spawn/lead-process-ownership.js +120 -0
- package/dist/spawn/lead-process-ownership.js.map +1 -0
- package/dist/spawn/lifecycle.d.ts +43 -3
- package/dist/spawn/lifecycle.d.ts.map +1 -1
- package/dist/spawn/lifecycle.js +75 -44
- package/dist/spawn/lifecycle.js.map +1 -1
- package/dist/spawn/liveness.d.ts.map +1 -1
- package/dist/spawn/liveness.js +5 -1
- package/dist/spawn/liveness.js.map +1 -1
- package/dist/spawn/one-shot-process-ownership.d.ts +48 -0
- package/dist/spawn/one-shot-process-ownership.d.ts.map +1 -0
- package/dist/spawn/one-shot-process-ownership.js +44 -0
- package/dist/spawn/one-shot-process-ownership.js.map +1 -0
- package/dist/spawn/process-group-kill.d.ts +79 -0
- package/dist/spawn/process-group-kill.d.ts.map +1 -0
- package/dist/spawn/process-group-kill.js +210 -0
- package/dist/spawn/process-group-kill.js.map +1 -0
- package/dist/spawn/process-spawn.d.ts +18 -1
- package/dist/spawn/process-spawn.d.ts.map +1 -1
- package/dist/spawn/process-spawn.js +51 -20
- package/dist/spawn/process-spawn.js.map +1 -1
- package/dist/spawn/resolution-budget.d.ts +38 -0
- package/dist/spawn/resolution-budget.d.ts.map +1 -0
- package/dist/spawn/resolution-budget.js +87 -0
- package/dist/spawn/resolution-budget.js.map +1 -0
- package/dist/spawn/review-hold-park.d.ts.map +1 -1
- package/dist/spawn/review-hold-park.js +37 -5
- package/dist/spawn/review-hold-park.js.map +1 -1
- package/dist/spawn/spawn-cooldown.d.ts.map +1 -1
- package/dist/spawn/spawn-cooldown.js +9 -0
- package/dist/spawn/spawn-cooldown.js.map +1 -1
- package/dist/spawn/untracked-lead-sweep.d.ts +29 -0
- package/dist/spawn/untracked-lead-sweep.d.ts.map +1 -0
- package/dist/spawn/untracked-lead-sweep.js +100 -0
- package/dist/spawn/untracked-lead-sweep.js.map +1 -0
- package/dist/spawn/worker-registry.d.ts.map +1 -1
- package/dist/spawn/worker-registry.js +4 -1
- package/dist/spawn/worker-registry.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +8 -6
- package/dist/spawn/worktree-session.js.map +1 -1
- package/dist/testing/fixtures/exit-capture-verify.d.ts +41 -0
- package/dist/testing/fixtures/exit-capture-verify.d.ts.map +1 -0
- package/dist/testing/fixtures/exit-capture-verify.js +152 -0
- package/dist/testing/fixtures/exit-capture-verify.js.map +1 -0
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/testing/fixtures/pending-spawn-world.d.ts +7 -0
- package/dist/testing/fixtures/pending-spawn-world.d.ts.map +1 -1
- package/dist/testing/fixtures/pending-spawn-world.js +21 -1
- package/dist/testing/fixtures/pending-spawn-world.js.map +1 -1
- package/dist/testing/fixtures/stubborn-lead-process.d.ts +22 -0
- package/dist/testing/fixtures/stubborn-lead-process.d.ts.map +1 -0
- package/dist/testing/fixtures/stubborn-lead-process.js +68 -0
- package/dist/testing/fixtures/stubborn-lead-process.js.map +1 -0
- package/dist/types/config.d.ts +13 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/focus.d.ts +7 -0
- package/dist/types/focus.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/verify/commit-verdict-record.d.ts +13 -3
- package/dist/verify/commit-verdict-record.d.ts.map +1 -1
- package/dist/verify/commit-verdict-record.js +45 -25
- package/dist/verify/commit-verdict-record.js.map +1 -1
- package/dist/verify/credit-rearm.d.ts +18 -0
- package/dist/verify/credit-rearm.d.ts.map +1 -0
- package/dist/verify/credit-rearm.js +69 -0
- package/dist/verify/credit-rearm.js.map +1 -0
- package/dist/verify/delivery-commit-set.d.ts +10 -0
- package/dist/verify/delivery-commit-set.d.ts.map +1 -0
- package/dist/verify/delivery-commit-set.js +82 -0
- package/dist/verify/delivery-commit-set.js.map +1 -0
- package/dist/verify/explicit-rearm.d.ts.map +1 -1
- package/dist/verify/explicit-rearm.js +2 -0
- package/dist/verify/explicit-rearm.js.map +1 -1
- package/dist/verify/failure-signature.d.ts.map +1 -1
- package/dist/verify/failure-signature.js +1 -0
- package/dist/verify/failure-signature.js.map +1 -1
- package/dist/verify/gate-run-registry.d.ts.map +1 -1
- package/dist/verify/gate-run-registry.js +3 -0
- package/dist/verify/gate-run-registry.js.map +1 -1
- package/dist/verify/injection-stamp.d.ts +29 -0
- package/dist/verify/injection-stamp.d.ts.map +1 -0
- package/dist/verify/injection-stamp.js +139 -0
- package/dist/verify/injection-stamp.js.map +1 -0
- package/dist/verify/misattributed-commits-read.d.ts +31 -0
- package/dist/verify/misattributed-commits-read.d.ts.map +1 -0
- package/dist/verify/misattributed-commits-read.js +47 -0
- package/dist/verify/misattributed-commits-read.js.map +1 -0
- package/dist/verify/misattributed-commits.d.ts +52 -0
- package/dist/verify/misattributed-commits.d.ts.map +1 -0
- package/dist/verify/misattributed-commits.js +148 -0
- package/dist/verify/misattributed-commits.js.map +1 -0
- package/dist/verify/no-own-delta-verdict.d.ts +47 -0
- package/dist/verify/no-own-delta-verdict.d.ts.map +1 -0
- package/dist/verify/no-own-delta-verdict.js +74 -0
- package/dist/verify/no-own-delta-verdict.js.map +1 -0
- package/dist/verify/shortfall-park-escalation.d.ts +41 -0
- package/dist/verify/shortfall-park-escalation.d.ts.map +1 -0
- package/dist/verify/shortfall-park-escalation.js +177 -0
- package/dist/verify/shortfall-park-escalation.js.map +1 -0
- package/dist/verify/shortfall-park.d.ts +109 -0
- package/dist/verify/shortfall-park.d.ts.map +1 -0
- package/dist/verify/shortfall-park.js +208 -0
- package/dist/verify/shortfall-park.js.map +1 -0
- package/dist/verify/shortfall-repeat.d.ts +47 -16
- package/dist/verify/shortfall-repeat.d.ts.map +1 -1
- package/dist/verify/shortfall-repeat.js +77 -23
- package/dist/verify/shortfall-repeat.js.map +1 -1
- package/dist/verify/shortfall-rulings.d.ts +106 -0
- package/dist/verify/shortfall-rulings.d.ts.map +1 -0
- package/dist/verify/shortfall-rulings.js +118 -0
- package/dist/verify/shortfall-rulings.js.map +1 -0
- package/dist/verify/stall-detectors.d.ts.map +1 -1
- package/dist/verify/stall-detectors.js +10 -4
- package/dist/verify/stall-detectors.js.map +1 -1
- package/dist/verify/verification-attribution-base.d.ts +26 -0
- package/dist/verify/verification-attribution-base.d.ts.map +1 -0
- package/dist/verify/verification-attribution-base.js +127 -0
- package/dist/verify/verification-attribution-base.js.map +1 -0
- package/dist/verify/verification-attribution-deps.d.ts +32 -0
- package/dist/verify/verification-attribution-deps.d.ts.map +1 -0
- package/dist/verify/verification-attribution-deps.js +209 -0
- package/dist/verify/verification-attribution-deps.js.map +1 -0
- package/dist/verify/verification-baseline.d.ts +6 -0
- package/dist/verify/verification-baseline.d.ts.map +1 -1
- package/dist/verify/verification-baseline.js +27 -11
- package/dist/verify/verification-baseline.js.map +1 -1
- package/dist/verify/verification-commit-sharing.d.ts.map +1 -1
- package/dist/verify/verification-commit-sharing.js +30 -8
- package/dist/verify/verification-commit-sharing.js.map +1 -1
- package/dist/verify/verification-config.d.ts.map +1 -1
- package/dist/verify/verification-config.js +2 -0
- package/dist/verify/verification-config.js.map +1 -1
- package/dist/verify/verification-default-on.d.ts +3 -0
- package/dist/verify/verification-default-on.d.ts.map +1 -1
- package/dist/verify/verification-default-on.js +5 -1
- package/dist/verify/verification-default-on.js.map +1 -1
- package/dist/verify/verification-deps-default.d.ts.map +1 -1
- package/dist/verify/verification-deps-default.js +61 -120
- package/dist/verify/verification-deps-default.js.map +1 -1
- package/dist/verify/verification-deps.d.ts +26 -4
- package/dist/verify/verification-deps.d.ts.map +1 -1
- package/dist/verify/verification-deterministic.d.ts +15 -0
- package/dist/verify/verification-deterministic.d.ts.map +1 -1
- package/dist/verify/verification-deterministic.js +1 -12
- package/dist/verify/verification-deterministic.js.map +1 -1
- package/dist/verify/verification-engine.d.ts +9 -6
- package/dist/verify/verification-engine.d.ts.map +1 -1
- package/dist/verify/verification-engine.js +43 -62
- package/dist/verify/verification-engine.js.map +1 -1
- package/dist/verify/verification-evidence-unavailable-feedback.d.ts +2 -1
- package/dist/verify/verification-evidence-unavailable-feedback.d.ts.map +1 -1
- package/dist/verify/verification-evidence-unavailable-feedback.js +19 -1
- package/dist/verify/verification-evidence-unavailable-feedback.js.map +1 -1
- package/dist/verify/verification-failure-parser.d.ts +57 -1
- package/dist/verify/verification-failure-parser.d.ts.map +1 -1
- package/dist/verify/verification-failure-parser.js +116 -10
- package/dist/verify/verification-failure-parser.js.map +1 -1
- package/dist/verify/verification-feedback.d.ts +60 -43
- package/dist/verify/verification-feedback.d.ts.map +1 -1
- package/dist/verify/verification-feedback.js +115 -120
- package/dist/verify/verification-feedback.js.map +1 -1
- package/dist/verify/verification-history-reset.d.ts +2 -1
- package/dist/verify/verification-history-reset.d.ts.map +1 -1
- package/dist/verify/verification-history-reset.js +4 -2
- package/dist/verify/verification-history-reset.js.map +1 -1
- package/dist/verify/verification-rework-issue.d.ts +87 -0
- package/dist/verify/verification-rework-issue.d.ts.map +1 -0
- package/dist/verify/verification-rework-issue.js +212 -0
- package/dist/verify/verification-rework-issue.js.map +1 -0
- package/dist/verify/verification-rework-messages.d.ts.map +1 -1
- package/dist/verify/verification-rework-messages.js +10 -0
- package/dist/verify/verification-rework-messages.js.map +1 -1
- package/dist/verify/verify-gate-stall.d.ts +2 -0
- package/dist/verify/verify-gate-stall.d.ts.map +1 -1
- package/dist/verify/verify-gate-stall.js +35 -9
- package/dist/verify/verify-gate-stall.js.map +1 -1
- package/dist/verify/verify-restatement.d.ts.map +1 -1
- package/dist/verify/verify-restatement.js +9 -2
- package/dist/verify/verify-restatement.js.map +1 -1
- package/dist/worktree/capture-attribution-read.d.ts +47 -0
- package/dist/worktree/capture-attribution-read.d.ts.map +1 -0
- package/dist/worktree/capture-attribution-read.js +98 -0
- package/dist/worktree/capture-attribution-read.js.map +1 -0
- package/dist/worktree/capture-attribution.d.ts +26 -0
- package/dist/worktree/capture-attribution.d.ts.map +1 -0
- package/dist/worktree/capture-attribution.js +111 -0
- package/dist/worktree/capture-attribution.js.map +1 -0
- package/dist/worktree/index.d.ts.map +1 -1
- package/dist/worktree/index.js +2 -1
- package/dist/worktree/index.js.map +1 -1
- package/dist/worktree/provision.d.ts.map +1 -1
- package/dist/worktree/provision.js +23 -6
- package/dist/worktree/provision.js.map +1 -1
- package/dist/worktree/safety.d.ts +14 -4
- package/dist/worktree/safety.d.ts.map +1 -1
- package/dist/worktree/safety.js +37 -7
- package/dist/worktree/safety.js.map +1 -1
- package/dist/worktree/scratch-guard.d.ts +53 -2
- package/dist/worktree/scratch-guard.d.ts.map +1 -1
- package/dist/worktree/scratch-guard.js +115 -30
- package/dist/worktree/scratch-guard.js.map +1 -1
- package/dist/worktree/unmerged-capture-escalation.d.ts +52 -0
- package/dist/worktree/unmerged-capture-escalation.d.ts.map +1 -0
- package/dist/worktree/unmerged-capture-escalation.js +64 -0
- package/dist/worktree/unmerged-capture-escalation.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge-back conflict handling with failure containment.
|
|
3
|
+
*
|
|
4
|
+
* When merging integration back into a focus branch conflicts, the daemon asks
|
|
5
|
+
* a resolver to finish the merge in the live focus worktree: the team lead when
|
|
6
|
+
* one is executing, otherwise a short-lived fallback resolution agent. This
|
|
7
|
+
* module owns what happens when that resolver CANNOT finish: the half-merged
|
|
8
|
+
* worktree (MERGE_HEAD, unmerged paths, partial edits) is preserved as a named
|
|
9
|
+
* ref + patch and restored to the committed focus HEAD captured before the
|
|
10
|
+
* merge-back, so no automatic path stays blocked on a dirty tree and the next
|
|
11
|
+
* actor starts from a sane worktree (Nexus request 8679bae1, 2026-09-17).
|
|
12
|
+
*
|
|
13
|
+
* Restore runs only when no live resolver still owns the tree: always after the
|
|
14
|
+
* fallback agent (it has exited or been killed by the time it returns), and on
|
|
15
|
+
* the team-lead path only once the lead is no longer alive.
|
|
16
|
+
*
|
|
17
|
+
* Sliced out of focus-merge.ts (file-size limit). It deliberately does NOT call
|
|
18
|
+
* mergeBackFromIntegration -- MERGE_OWNERSHIP_POLICY keeps that entry point in
|
|
19
|
+
* focus-merge.ts -- and the team-lead collaborators defined in focus-merge.ts are
|
|
20
|
+
* injected, so this module imports nothing from it and closes no cycle.
|
|
21
|
+
*/
|
|
22
|
+
import type { DaemonConfig, FocusTeamState, MergeConflictResolutionResult } from '../types/index.js';
|
|
23
|
+
import { preserveAndRestoreFocusWorktree, type PreserveAndRestoreResult } from '../git/index.js';
|
|
24
|
+
import { reportGitState } from '../queries/deliveries.js';
|
|
25
|
+
import { spawnResolutionAgent } from '../spawn/lifecycle.js';
|
|
26
|
+
import { escalateMergeConflict } from './merge-conflict-escalation.js';
|
|
27
|
+
/** Collaborators of the merge-back conflict handler. */
|
|
28
|
+
export interface MergeBackConflictDeps {
|
|
29
|
+
requestTeamLeadResolution: (teamState: FocusTeamState, conflictFiles: string[], branchName: string, integrationBranch: string) => Promise<MergeConflictResolutionResult>;
|
|
30
|
+
isResolverStillAlive: (teamState: FocusTeamState) => boolean;
|
|
31
|
+
spawnResolutionAgent: typeof spawnResolutionAgent;
|
|
32
|
+
preserveAndRestore: typeof preserveAndRestoreFocusWorktree;
|
|
33
|
+
escalateMergeConflict: typeof escalateMergeConflict;
|
|
34
|
+
reportGitState: typeof reportGitState;
|
|
35
|
+
/** Current HEAD of a worktree, or null when unreadable. */
|
|
36
|
+
readHead: (worktreePath: string) => string | null;
|
|
37
|
+
/** Clock for the per-branch resolver attempt bound (merge/merge-back-followup.ts). */
|
|
38
|
+
now: () => number;
|
|
39
|
+
}
|
|
40
|
+
/** Whether a worktree's HEAD already contains the integration tip (origin/<branch> when the repo has an origin). */
|
|
41
|
+
export declare function integrationMergedIntoHead(worktreePath: string, integrationBranch: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Pure over git: why a resolver's reported success is NOT a completed merge-back,
|
|
44
|
+
* or null when it is. Completed means HEAD moved past the committed focus HEAD,
|
|
45
|
+
* still contains it, and contains the integration tip. A clean tree alone is not
|
|
46
|
+
* enough: a resolver that aborts the merge and commits something unrelated leaves
|
|
47
|
+
* a clean tree with a new HEAD, and that is not a merge of integration.
|
|
48
|
+
*/
|
|
49
|
+
export declare function mergeBackIncompleteReason(worktreePath: string, preMergeHead: string, integrationBranch: string, readHead: (worktreePath: string) => string | null): string | null;
|
|
50
|
+
/** Default git HEAD reader. */
|
|
51
|
+
export declare function readWorktreeHead(worktreePath: string): string | null;
|
|
52
|
+
/** The outcome of a contained resolution attempt. */
|
|
53
|
+
export type ContainedResolutionResult = {
|
|
54
|
+
resolved: true;
|
|
55
|
+
} | {
|
|
56
|
+
resolved: false;
|
|
57
|
+
error: string;
|
|
58
|
+
restore: PreserveAndRestoreResult | null;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Pure: the containment line appended to a merge_conflict escalation, so the
|
|
62
|
+
* record names where the partial work went and whether the tree is sane.
|
|
63
|
+
*/
|
|
64
|
+
export declare function describeContainment(restore: PreserveAndRestoreResult | null): string;
|
|
65
|
+
/**
|
|
66
|
+
* Run the fallback resolution agent and contain its failure. Success requires a
|
|
67
|
+
* finished merge in a clean tree (spawnResolutionAgent) whose HEAD contains both
|
|
68
|
+
* `preMergeHead` and the integration tip ({@link mergeBackIncompleteReason}).
|
|
69
|
+
* Anything else -- timeout, spawn error, conflicts remaining, a merge left
|
|
70
|
+
* uncommitted, an aborted merge, an unrelated commit -- preserves the partial
|
|
71
|
+
* work and restores the worktree.
|
|
72
|
+
*
|
|
73
|
+
* Every run counts against the branch's bounded resolver episode
|
|
74
|
+
* (merge/merge-back-followup.ts). Each run gets an escalating budget and is seeded
|
|
75
|
+
* with the previous run's preserved partial resolution. While the episode is
|
|
76
|
+
* backing off or exhausted, or the run cannot be spent durably first, no agent is spawned: the fresh merge's markers are
|
|
77
|
+
* cleared (nothing worth preserving) and the attempt reports unresolved.
|
|
78
|
+
*/
|
|
79
|
+
export declare function runContainedFallbackResolution(params: ContainedResolutionParams, deps: Pick<MergeBackConflictDeps, 'spawnResolutionAgent' | 'preserveAndRestore' | 'readHead' | 'now'>): Promise<ContainedResolutionResult>;
|
|
80
|
+
/** Inputs of runContainedFallbackResolution. */
|
|
81
|
+
interface ContainedResolutionParams {
|
|
82
|
+
config: DaemonConfig;
|
|
83
|
+
worktreePath: string;
|
|
84
|
+
branchName: string;
|
|
85
|
+
integrationBranch: string;
|
|
86
|
+
conflictFiles: string[];
|
|
87
|
+
focusDescription: string;
|
|
88
|
+
model: string | null;
|
|
89
|
+
focusId: string | null;
|
|
90
|
+
/** The committed focus HEAD read before merge-back; callers refuse merge-back without one. */
|
|
91
|
+
preMergeHead: string;
|
|
92
|
+
}
|
|
93
|
+
/** Inputs of the merge-back conflict handler (all already resolved by mergeFocusBranch). */
|
|
94
|
+
export interface MergeBackConflictArgs {
|
|
95
|
+
config: DaemonConfig;
|
|
96
|
+
teamState: FocusTeamState;
|
|
97
|
+
sessionId: string;
|
|
98
|
+
branchName: string;
|
|
99
|
+
representativeDeliveryId: string;
|
|
100
|
+
worktreePath: string;
|
|
101
|
+
/** The committed focus HEAD read before mergeBackFromIntegration ran (merge-back is refused without one). */
|
|
102
|
+
preMergeHead: string;
|
|
103
|
+
conflictFiles: string[];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolve a merge-back conflict via the live team lead or the fallback agent.
|
|
107
|
+
* On failure: contain it (when no live resolver owns the tree), file the
|
|
108
|
+
* merge_conflict record naming the containment, and report unresolved.
|
|
109
|
+
*/
|
|
110
|
+
export declare function handleMergeBackConflict(args: MergeBackConflictArgs, deps: MergeBackConflictDeps): Promise<MergeBackConflictOutcome>;
|
|
111
|
+
type MergeBackConflictOutcome = {
|
|
112
|
+
resolved: true;
|
|
113
|
+
} | {
|
|
114
|
+
resolved: false;
|
|
115
|
+
exitReason: 'merge_back_conflict_unresolved';
|
|
116
|
+
restore: PreserveAndRestoreResult | null;
|
|
117
|
+
};
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=merge-back-conflict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-back-conflict.d.ts","sourceRoot":"","sources":["../../src/merge/merge-back-conflict.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/integration/merge-back-resolver-timeout-regression.test.ts,
|
|
3
|
+
// packages/daemon/src/merge/merge-back-conflict.test.ts,
|
|
4
|
+
// packages/daemon/src/merge/merge-back-followup.test.ts, packages/daemon/src/merge/merge-back-loop.test.ts
|
|
5
|
+
// PINNED-BY-END
|
|
6
|
+
import { runGitSync, hasOriginRemote } from '../git/index.js';
|
|
7
|
+
import { withMergeBackInFlight } from './merge-back-activity.js';
|
|
8
|
+
import { decideResolverAttempt, consumeResolverAttempt, getResolverAttemptState, recordResolverFailure, recordResolverSuccess, MAX_RESOLVER_ATTEMPTS, } from './merge-back-followup.js';
|
|
9
|
+
import { createLogger } from '../shell/log.js';
|
|
10
|
+
const log = createLogger({ module: 'focus-merge' });
|
|
11
|
+
/** Whether a worktree's HEAD already contains the integration tip (origin/<branch> when the repo has an origin). */
|
|
12
|
+
export function integrationMergedIntoHead(worktreePath, integrationBranch) {
|
|
13
|
+
const tip = hasOriginRemote(worktreePath) ? `origin/${integrationBranch}` : integrationBranch;
|
|
14
|
+
return runGitSync(['merge-base', '--is-ancestor', tip, 'HEAD'], worktreePath).success;
|
|
15
|
+
}
|
|
16
|
+
/** Whether `ancestor` is reachable from `descendant`. */
|
|
17
|
+
function isAncestor(worktreePath, ancestor, descendant) {
|
|
18
|
+
return runGitSync(['merge-base', '--is-ancestor', ancestor, descendant], worktreePath).success;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Pure over git: why a resolver's reported success is NOT a completed merge-back,
|
|
22
|
+
* or null when it is. Completed means HEAD moved past the committed focus HEAD,
|
|
23
|
+
* still contains it, and contains the integration tip. A clean tree alone is not
|
|
24
|
+
* enough: a resolver that aborts the merge and commits something unrelated leaves
|
|
25
|
+
* a clean tree with a new HEAD, and that is not a merge of integration.
|
|
26
|
+
*/
|
|
27
|
+
export function mergeBackIncompleteReason(worktreePath, preMergeHead, integrationBranch, readHead) {
|
|
28
|
+
const head = readHead(worktreePath);
|
|
29
|
+
if (head === null)
|
|
30
|
+
return 'could not read HEAD after the resolver exited';
|
|
31
|
+
if (head === preMergeHead)
|
|
32
|
+
return 'resolver exited without committing the merge (HEAD did not advance)';
|
|
33
|
+
if (!isAncestor(worktreePath, preMergeHead, head))
|
|
34
|
+
return `resolver left HEAD ${head}, which no longer contains the committed focus HEAD ${preMergeHead}`;
|
|
35
|
+
if (!integrationMergedIntoHead(worktreePath, integrationBranch)) {
|
|
36
|
+
return `resolver left HEAD ${head}, which does not contain the ${integrationBranch} tip (the merge was not completed)`;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/** Default git HEAD reader. */
|
|
41
|
+
export function readWorktreeHead(worktreePath) {
|
|
42
|
+
const r = runGitSync(['rev-parse', 'HEAD'], worktreePath);
|
|
43
|
+
return r.success && r.output.length > 0 ? r.output : null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Pure: the containment line appended to a merge_conflict escalation, so the
|
|
47
|
+
* record names where the partial work went and whether the tree is sane.
|
|
48
|
+
*/
|
|
49
|
+
export function describeContainment(restore) {
|
|
50
|
+
if (restore === null) {
|
|
51
|
+
return 'The worktree was NOT restored: the resolver still owns it.';
|
|
52
|
+
}
|
|
53
|
+
const kept = restore.preservedRef || restore.patchPath
|
|
54
|
+
? `Partial resolution preserved at ${restore.preservedRef ?? '(no ref)'}${restore.patchPath ? ` (patch: ${restore.patchPath})` : ''}.`
|
|
55
|
+
: `No partial resolution preserved${restore.preserveError ? ` (${restore.preserveError})` : ' (nothing differed from the committed HEAD)'}.`;
|
|
56
|
+
const tree = restore.clean
|
|
57
|
+
? 'The focus worktree was restored to its committed HEAD (no MERGE_HEAD, no unmerged paths, no uncommitted edits).'
|
|
58
|
+
: `The focus worktree could NOT be confirmed clean after restore: ${restore.residue ?? 'unknown residue'}`;
|
|
59
|
+
return `${kept} ${tree}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Run the fallback resolution agent and contain its failure. Success requires a
|
|
63
|
+
* finished merge in a clean tree (spawnResolutionAgent) whose HEAD contains both
|
|
64
|
+
* `preMergeHead` and the integration tip ({@link mergeBackIncompleteReason}).
|
|
65
|
+
* Anything else -- timeout, spawn error, conflicts remaining, a merge left
|
|
66
|
+
* uncommitted, an aborted merge, an unrelated commit -- preserves the partial
|
|
67
|
+
* work and restores the worktree.
|
|
68
|
+
*
|
|
69
|
+
* Every run counts against the branch's bounded resolver episode
|
|
70
|
+
* (merge/merge-back-followup.ts). Each run gets an escalating budget and is seeded
|
|
71
|
+
* with the previous run's preserved partial resolution. While the episode is
|
|
72
|
+
* backing off or exhausted, or the run cannot be spent durably first, no agent is spawned: the fresh merge's markers are
|
|
73
|
+
* cleared (nothing worth preserving) and the attempt reports unresolved.
|
|
74
|
+
*/
|
|
75
|
+
export async function runContainedFallbackResolution(params, deps) {
|
|
76
|
+
// In flight until the run and its containment settle: abandoned-merge recovery must not touch the tree meanwhile.
|
|
77
|
+
return withMergeBackInFlight(params.worktreePath, () => runContainedFallbackResolutionNow(params, deps));
|
|
78
|
+
}
|
|
79
|
+
async function runContainedFallbackResolutionNow(params, deps) {
|
|
80
|
+
const { worktreePath, branchName, preMergeHead } = params;
|
|
81
|
+
const decision = decideResolverAttempt(getResolverAttemptState({ branchName, worktreePath }), deps.now());
|
|
82
|
+
if (decision.kind !== 'attempt') {
|
|
83
|
+
const error = decision.kind === 'exhausted'
|
|
84
|
+
? `resolver attempts exhausted (${decision.failures} of ${MAX_RESOLVER_ATTEMPTS} failed); no agent spawned`
|
|
85
|
+
: `resolver backing off until ${new Date(decision.retryAt).toISOString()} after a failed run; no agent spawned`;
|
|
86
|
+
return { resolved: false, error, restore: deps.preserveAndRestore({ worktreePath, preMergeHead, branchName, preserve: false }) };
|
|
87
|
+
}
|
|
88
|
+
// Spend the run durably before it starts: a daemon that dies mid-run must not be granted it again.
|
|
89
|
+
if (!consumeResolverAttempt({ branchName, worktreePath }, deps.now())) {
|
|
90
|
+
const error = 'the resolver attempt could not be recorded durably; no agent spawned (fails closed to the bounded hand-off)';
|
|
91
|
+
return { resolved: false, error, restore: deps.preserveAndRestore({ worktreePath, preMergeHead, branchName, preserve: false }) };
|
|
92
|
+
}
|
|
93
|
+
const agent = await deps.spawnResolutionAgent({
|
|
94
|
+
config: params.config,
|
|
95
|
+
worktreePath,
|
|
96
|
+
branchName,
|
|
97
|
+
integrationBranch: params.integrationBranch,
|
|
98
|
+
conflictFiles: params.conflictFiles,
|
|
99
|
+
focusDescription: params.focusDescription,
|
|
100
|
+
model: params.model,
|
|
101
|
+
focusId: params.focusId,
|
|
102
|
+
budgetMultiplier: decision.budgetMultiplier,
|
|
103
|
+
priorPartialRef: decision.priorPartialRef,
|
|
104
|
+
});
|
|
105
|
+
let error = agent.error ?? 'unknown';
|
|
106
|
+
if (agent.success) {
|
|
107
|
+
const incomplete = mergeBackIncompleteReason(worktreePath, preMergeHead, params.integrationBranch, deps.readHead);
|
|
108
|
+
if (incomplete === null) {
|
|
109
|
+
recordResolverSuccess({ branchName, worktreePath });
|
|
110
|
+
return { resolved: true };
|
|
111
|
+
}
|
|
112
|
+
error = incomplete;
|
|
113
|
+
}
|
|
114
|
+
const restore = deps.preserveAndRestore({ worktreePath, preMergeHead, branchName });
|
|
115
|
+
recordResolverFailure({ branchName, worktreePath }, deps.now(), restore.preservedRef);
|
|
116
|
+
return { resolved: false, error: `${error} (resolver run ${decision.attempt} of ${MAX_RESOLVER_ATTEMPTS})`, restore };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Resolve a merge-back conflict via the live team lead or the fallback agent.
|
|
120
|
+
* On failure: contain it (when no live resolver owns the tree), file the
|
|
121
|
+
* merge_conflict record naming the containment, and report unresolved.
|
|
122
|
+
*/
|
|
123
|
+
export async function handleMergeBackConflict(args, deps) {
|
|
124
|
+
// In flight while the team lead or the fallback agent resolves (abandoned-merge recovery reads it).
|
|
125
|
+
return withMergeBackInFlight(args.worktreePath, () => handleMergeBackConflictNow(args, deps));
|
|
126
|
+
}
|
|
127
|
+
async function handleMergeBackConflictNow(args, deps) {
|
|
128
|
+
const { config, teamState, sessionId, branchName, representativeDeliveryId, worktreePath, preMergeHead, conflictFiles } = args;
|
|
129
|
+
let failure;
|
|
130
|
+
let restore = null;
|
|
131
|
+
if (teamState.leadStdin && teamState.phase === 'executing') {
|
|
132
|
+
const resolution = await deps.requestTeamLeadResolution(teamState, conflictFiles, branchName, config.integrationBranch);
|
|
133
|
+
if (resolution.resolved) {
|
|
134
|
+
log.info(`Conflict resolved by team lead for "${teamState.focusName}", proceeding`);
|
|
135
|
+
return { resolved: true };
|
|
136
|
+
}
|
|
137
|
+
failure = `Merge-back conflict unresolved: ${resolution.reason ?? 'unknown'}`;
|
|
138
|
+
if (!deps.isResolverStillAlive(teamState)) {
|
|
139
|
+
restore = deps.preserveAndRestore({ worktreePath, preMergeHead, branchName });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
log.info(`No active team lead for "${teamState.focusName}", spawning fallback resolution agent`);
|
|
144
|
+
for (const deliveryId of teamState.knownDeliveryIds) {
|
|
145
|
+
if (!teamState.mergedDeliveryIds.has(deliveryId)) {
|
|
146
|
+
deps.reportGitState(deliveryId, 'resolving_conflict').catch(err => log.warn(`reportGitState resolving_conflict failed for ${deliveryId}:`, err.message));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const result = await runContainedFallbackResolution({
|
|
150
|
+
config, worktreePath, branchName,
|
|
151
|
+
integrationBranch: config.integrationBranch,
|
|
152
|
+
conflictFiles,
|
|
153
|
+
focusDescription: teamState.focusName,
|
|
154
|
+
model: teamState.pipelineConfig?.model ?? null,
|
|
155
|
+
focusId: teamState.focusId,
|
|
156
|
+
preMergeHead,
|
|
157
|
+
}, deps);
|
|
158
|
+
if (result.resolved) {
|
|
159
|
+
log.info(`Fallback resolution agent resolved conflicts for "${teamState.focusName}", proceeding`);
|
|
160
|
+
return { resolved: true };
|
|
161
|
+
}
|
|
162
|
+
// "conflict" stays in the text: classifyMergeFailure reads it as a content conflict.
|
|
163
|
+
failure = `Merge-back conflict unresolved: fallback resolution agent failed: ${result.error}`;
|
|
164
|
+
restore = result.restore;
|
|
165
|
+
}
|
|
166
|
+
await deps.escalateMergeConflict({
|
|
167
|
+
organizationId: teamState.organizationId,
|
|
168
|
+
sessionId,
|
|
169
|
+
deliveryId: representativeDeliveryId,
|
|
170
|
+
deliveryName: teamState.focusName,
|
|
171
|
+
focusId: teamState.focusId,
|
|
172
|
+
branchName,
|
|
173
|
+
integrationBranch: config.integrationBranch,
|
|
174
|
+
mergeError: `${failure}. ${describeContainment(restore)}`,
|
|
175
|
+
});
|
|
176
|
+
return { resolved: false, exitReason: 'merge_back_conflict_unresolved', restore };
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=merge-back-conflict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-back-conflict.js","sourceRoot":"","sources":["../../src/merge/merge-back-conflict.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { DaemonConfig, PipelineConfig } from '../types/index.js';
|
|
2
|
+
import { type PreserveAndRestoreResult } from '../git/index.js';
|
|
3
|
+
/** Follow-up resolver runs after the inline fallback, per conflict episode. */
|
|
4
|
+
export declare const MERGE_BACK_FOLLOWUP_MAX_ATTEMPTS = 2;
|
|
5
|
+
/** Every resolver run a conflict episode may spend: the inline fallback + the follow-ups. */
|
|
6
|
+
export declare const MAX_RESOLVER_ATTEMPTS: number;
|
|
7
|
+
/** Minimum gap between a failed resolver run and the next follow-up. */
|
|
8
|
+
export declare const MERGE_BACK_FOLLOWUP_BACKOFF_MS: number;
|
|
9
|
+
interface ResolverAttemptState {
|
|
10
|
+
/** Resolver runs consumed this episode. Counted BEFORE a run spawns, so a crash mid-run still spent it. */
|
|
11
|
+
failures: number;
|
|
12
|
+
lastFailureAt: number;
|
|
13
|
+
/** The partial resolution the latest failed run preserved, handed to the next run. */
|
|
14
|
+
lastPartialRef: string | null;
|
|
15
|
+
/** Set only once the resolver-exhausted observation was actually filed, so a failed filing is retried. */
|
|
16
|
+
exhaustionFiled: boolean;
|
|
17
|
+
/** A run was consumed and has not reported back yet (or the daemon died during it). */
|
|
18
|
+
inFlight?: boolean;
|
|
19
|
+
/** Why the durable record could not be trusted; the episode is then treated as exhausted. */
|
|
20
|
+
storageError?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Which conflict episode: the focus branch, and a worktree of the repo whose git dir holds its durable record. */
|
|
23
|
+
export interface ResolverEpisodeKey {
|
|
24
|
+
branchName: string;
|
|
25
|
+
worktreePath: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Test seam: drop the in-memory cache, exactly what a daemon restart does. Durable
|
|
29
|
+
* records are untouched (each test repo is its own tmpdir, so none leak).
|
|
30
|
+
*/
|
|
31
|
+
export declare function __resetResolverAttemptsForTesting(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Where a branch's episode is recorded: <git-common-dir>/telora/resolver-attempts/<branch-slug>.json,
|
|
34
|
+
* beside the preserved partial patches, so it survives a daemon restart and belongs to the repo.
|
|
35
|
+
* The common dir is canonicalised, so every worktree of one repo resolves to the same record.
|
|
36
|
+
* Null when the worktree's git dir cannot be read.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolverAttemptRecordPath(key: ResolverEpisodeKey): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* The current episode for a branch, or undefined when none is open. Hydrates from the durable record after a
|
|
41
|
+
* restart. A record that cannot be located or read fails closed: it reads as an exhausted episode.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getResolverAttemptState(key: ResolverEpisodeKey): Readonly<ResolverAttemptState> | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Durably spend one resolver run BEFORE it spawns (write-ahead), so a daemon that dies mid-run cannot grant the
|
|
46
|
+
* run again. False when the spend could not be persisted: the caller must not spawn.
|
|
47
|
+
*/
|
|
48
|
+
export declare function consumeResolverAttempt(key: ResolverEpisodeKey, now: number): boolean;
|
|
49
|
+
/** Record a failed resolver run. A run already spent by {@link consumeResolverAttempt} is not counted twice. */
|
|
50
|
+
export declare function recordResolverFailure(key: ResolverEpisodeKey, now: number, partialRef: string | null): void;
|
|
51
|
+
/** A completed merge-back ends the episode. */
|
|
52
|
+
export declare function recordResolverSuccess(key: ResolverEpisodeKey): void;
|
|
53
|
+
/** Pure: the budget multiplier for the next run. The 1st run gets 1x, the 2nd 2x, the 3rd 3x (each still clamped by the budget ceiling). */
|
|
54
|
+
export declare function budgetMultiplierForNextAttempt(state: Pick<ResolverAttemptState, 'failures'> | undefined): number;
|
|
55
|
+
export type ResolverAttemptDecision = {
|
|
56
|
+
kind: 'attempt';
|
|
57
|
+
attempt: number;
|
|
58
|
+
budgetMultiplier: number;
|
|
59
|
+
priorPartialRef: string | null;
|
|
60
|
+
} | {
|
|
61
|
+
kind: 'backoff';
|
|
62
|
+
retryAt: number;
|
|
63
|
+
} | {
|
|
64
|
+
kind: 'exhausted';
|
|
65
|
+
failures: number;
|
|
66
|
+
};
|
|
67
|
+
/** Pure: may another resolver run start for this branch now? */
|
|
68
|
+
export declare function decideResolverAttempt(state: Pick<ResolverAttemptState, 'failures' | 'lastFailureAt' | 'lastPartialRef'> | undefined, now: number): ResolverAttemptDecision;
|
|
69
|
+
/** The outcome of one merge-back completion attempt. */
|
|
70
|
+
export type MergeBackAttemptOutcome = {
|
|
71
|
+
kind: 'merged';
|
|
72
|
+
} | {
|
|
73
|
+
kind: 'failed';
|
|
74
|
+
error: string;
|
|
75
|
+
restore: PreserveAndRestoreResult | null;
|
|
76
|
+
} | {
|
|
77
|
+
kind: 'error';
|
|
78
|
+
message: string;
|
|
79
|
+
};
|
|
80
|
+
/** The focus branch the follow-up works on (the merge-back loop's per-branch info). */
|
|
81
|
+
export interface MergeBackFollowUpTarget {
|
|
82
|
+
focusId: string;
|
|
83
|
+
organizationId: string;
|
|
84
|
+
focusName: string;
|
|
85
|
+
branchName: string;
|
|
86
|
+
worktreePath: string;
|
|
87
|
+
pipelineConfig: PipelineConfig | null;
|
|
88
|
+
readOnly: boolean;
|
|
89
|
+
}
|
|
90
|
+
export interface MergeBackFollowUpDeps {
|
|
91
|
+
/** Re-run merge-back and, on conflict, the contained fallback resolver (merge/focus-merge.ts). */
|
|
92
|
+
attempt: (config: DaemonConfig, target: MergeBackFollowUpTarget) => Promise<MergeBackAttemptOutcome>;
|
|
93
|
+
/** Resolve the open merge_conflict record(s) for the focus; returns how many. */
|
|
94
|
+
resolveConflictRecord: (focusId: string) => Promise<number>;
|
|
95
|
+
/** Whether the focus branch already contains the integration tip (a merge finished outside this loop). */
|
|
96
|
+
integrationMergedIn: (config: DaemonConfig, target: MergeBackFollowUpTarget) => boolean;
|
|
97
|
+
/** File the one cause-keyed resolver-exhausted observation for the branch (idempotent). */
|
|
98
|
+
fileExhausted: (target: MergeBackFollowUpTarget, failures: number, lastPartialRef: string | null) => Promise<void>;
|
|
99
|
+
now: () => number;
|
|
100
|
+
}
|
|
101
|
+
export type MergeBackFollowUpResult = 'merged' | 'failed' | 'backoff' | 'exhausted' | 'error' | 'skipped';
|
|
102
|
+
/**
|
|
103
|
+
* One follow-up step for a focus branch with an open merge-back merge_conflict.
|
|
104
|
+
* The caller has already established that no team is writing the worktree and
|
|
105
|
+
* that it is clean. Never throws.
|
|
106
|
+
*/
|
|
107
|
+
export declare function runMergeBackFollowUp(config: DaemonConfig, target: MergeBackFollowUpTarget, deps: MergeBackFollowUpDeps): Promise<MergeBackFollowUpResult>;
|
|
108
|
+
export {};
|
|
109
|
+
//# sourceMappingURL=merge-back-followup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-back-followup.d.ts","sourceRoot":"","sources":["../../src/merge/merge-back-followup.ts"],"names":[],"mappings":"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"}
|