@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,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bound every daemon escalation text field below the server's field limit.
|
|
3
|
+
*
|
|
4
|
+
* The escalation create endpoint (supabase/functions/_shared/validation.ts
|
|
5
|
+
* validateEscalationFields) refuses a description, whatWasTried or helpNeeded
|
|
6
|
+
* longer than ESCALATION_FIELD_MAX with a validation error that no resubmission
|
|
7
|
+
* can clear. Detector text embeds gate state -- failing-test lists, shortfall
|
|
8
|
+
* reasons, gate_state JSON -- whose length grows with the product's test suite,
|
|
9
|
+
* so a producer that composes blind sooner or later composes past the cap, and
|
|
10
|
+
* the filing (and the signal it carries) is lost. The chokepoint
|
|
11
|
+
* (queries/escalations.ts createEscalation) therefore fits EVERY field it sends
|
|
12
|
+
* through boundEscalationFields, whatever produced it.
|
|
13
|
+
*
|
|
14
|
+
* An over-cap field keeps its HEAD (where producers state the delivery and the
|
|
15
|
+
* cause) and its TAIL (where they point at the full detail, e.g. a log path),
|
|
16
|
+
* cuts the middle, and says so in-line: that it was shortened, from how many
|
|
17
|
+
* characters, and where the full text is. Producers that can summarize better
|
|
18
|
+
* than a middle cut (verify/verify-gate-stall.ts) fit themselves first; this is
|
|
19
|
+
* the floor no path can go under.
|
|
20
|
+
*
|
|
21
|
+
* Pure; no imports.
|
|
22
|
+
*/
|
|
23
|
+
/** The server-side cap on each escalation text field (description, whatWasTried, helpNeeded). */
|
|
24
|
+
export declare const ESCALATION_FIELD_MAX = 5000;
|
|
25
|
+
/** The description cap. The same number as every other field; named for producers that fit a description. */
|
|
26
|
+
export declare const ESCALATION_DESCRIPTION_MAX = 5000;
|
|
27
|
+
/** The in-line note an over-cap field carries in place of its cut middle. */
|
|
28
|
+
export declare function shortenedMarker(originalLength: number, cap?: number): string;
|
|
29
|
+
/**
|
|
30
|
+
* Pure: fit one field under `cap`. A field at or under the cap is returned
|
|
31
|
+
* unchanged; an over-cap field keeps its head and tail around shortenedMarker.
|
|
32
|
+
* The result's length is always <= cap.
|
|
33
|
+
*/
|
|
34
|
+
export declare function boundEscalationField(text: string, cap?: number): string;
|
|
35
|
+
/** The text fields a filing sends. */
|
|
36
|
+
export interface EscalationTextFields {
|
|
37
|
+
description: string;
|
|
38
|
+
whatWasTried: string | undefined;
|
|
39
|
+
helpNeeded: string | undefined;
|
|
40
|
+
}
|
|
41
|
+
/** The bounded fields, plus the original length of each field that had to be shortened. */
|
|
42
|
+
export interface BoundedEscalationFields extends EscalationTextFields {
|
|
43
|
+
/** field name -> original length, for every field that was shortened; empty when none was. */
|
|
44
|
+
shortened: Record<string, number>;
|
|
45
|
+
}
|
|
46
|
+
/** Pure: fit every text field of a filing under `cap`, recording which were shortened. */
|
|
47
|
+
export declare function boundEscalationFields(fields: EscalationTextFields, cap?: number): BoundedEscalationFields;
|
|
48
|
+
//# sourceMappingURL=escalation-field-bounds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation-field-bounds.d.ts","sourceRoot":"","sources":["../../src/queries/escalation-field-bounds.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,iGAAiG;AACjG,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,6GAA6G;AAC7G,eAAO,MAAM,0BAA0B,OAAuB,CAAC;AAK/D,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,GAAE,MAA6B,GAAG,MAAM,CAMlG;AASD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAA6B,GAAG,MAAM,CAU7F;AAED,sCAAsC;AACtC,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,2FAA2F;AAC3F,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,0FAA0F;AAC1F,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,oBAAoB,EAC5B,GAAG,GAAE,MAA6B,GACjC,uBAAuB,CAazB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/queries/escalation-field-bounds.test.ts,
|
|
3
|
+
// packages/daemon/src/queries/escalation-refusal.test.ts,
|
|
4
|
+
// packages/daemon/src/queries/filing-chokepoint.test.ts, packages/daemon/src/verify/stall-detectors.test.ts
|
|
5
|
+
// PINNED-BY-END
|
|
6
|
+
/**
|
|
7
|
+
* Bound every daemon escalation text field below the server's field limit.
|
|
8
|
+
*
|
|
9
|
+
* The escalation create endpoint (supabase/functions/_shared/validation.ts
|
|
10
|
+
* validateEscalationFields) refuses a description, whatWasTried or helpNeeded
|
|
11
|
+
* longer than ESCALATION_FIELD_MAX with a validation error that no resubmission
|
|
12
|
+
* can clear. Detector text embeds gate state -- failing-test lists, shortfall
|
|
13
|
+
* reasons, gate_state JSON -- whose length grows with the product's test suite,
|
|
14
|
+
* so a producer that composes blind sooner or later composes past the cap, and
|
|
15
|
+
* the filing (and the signal it carries) is lost. The chokepoint
|
|
16
|
+
* (queries/escalations.ts createEscalation) therefore fits EVERY field it sends
|
|
17
|
+
* through boundEscalationFields, whatever produced it.
|
|
18
|
+
*
|
|
19
|
+
* An over-cap field keeps its HEAD (where producers state the delivery and the
|
|
20
|
+
* cause) and its TAIL (where they point at the full detail, e.g. a log path),
|
|
21
|
+
* cuts the middle, and says so in-line: that it was shortened, from how many
|
|
22
|
+
* characters, and where the full text is. Producers that can summarize better
|
|
23
|
+
* than a middle cut (verify/verify-gate-stall.ts) fit themselves first; this is
|
|
24
|
+
* the floor no path can go under.
|
|
25
|
+
*
|
|
26
|
+
* Pure; no imports.
|
|
27
|
+
*/
|
|
28
|
+
/** The server-side cap on each escalation text field (description, whatWasTried, helpNeeded). */
|
|
29
|
+
export const ESCALATION_FIELD_MAX = 5000;
|
|
30
|
+
/** The description cap. The same number as every other field; named for producers that fit a description. */
|
|
31
|
+
export const ESCALATION_DESCRIPTION_MAX = ESCALATION_FIELD_MAX;
|
|
32
|
+
/** Share of the kept budget given to the head; the rest keeps the tail. */
|
|
33
|
+
const HEAD_SHARE = 0.7;
|
|
34
|
+
/** The in-line note an over-cap field carries in place of its cut middle. */
|
|
35
|
+
export function shortenedMarker(originalLength, cap = ESCALATION_FIELD_MAX) {
|
|
36
|
+
return (`\n\n[... shortened by the daemon to fit the ${cap}-character escalation field limit ` +
|
|
37
|
+
`(original ${originalLength} characters); the full text was written to the daemon log ` +
|
|
38
|
+
`(telora-daemon logs) when this escalation was filed ...]\n\n`);
|
|
39
|
+
}
|
|
40
|
+
/** True when index `i` would split a UTF-16 surrogate pair. */
|
|
41
|
+
function splitsSurrogatePair(text, i) {
|
|
42
|
+
if (i <= 0 || i >= text.length)
|
|
43
|
+
return false;
|
|
44
|
+
const prev = text.charCodeAt(i - 1);
|
|
45
|
+
return prev >= 0xd800 && prev <= 0xdbff;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Pure: fit one field under `cap`. A field at or under the cap is returned
|
|
49
|
+
* unchanged; an over-cap field keeps its head and tail around shortenedMarker.
|
|
50
|
+
* The result's length is always <= cap.
|
|
51
|
+
*/
|
|
52
|
+
export function boundEscalationField(text, cap = ESCALATION_FIELD_MAX) {
|
|
53
|
+
if (text.length <= cap)
|
|
54
|
+
return text;
|
|
55
|
+
const marker = shortenedMarker(text.length, cap);
|
|
56
|
+
const budget = cap - marker.length;
|
|
57
|
+
if (budget <= 0)
|
|
58
|
+
return marker.slice(0, cap);
|
|
59
|
+
let head = Math.ceil(budget * HEAD_SHARE);
|
|
60
|
+
if (splitsSurrogatePair(text, head))
|
|
61
|
+
head -= 1;
|
|
62
|
+
let tailStart = text.length - (budget - head);
|
|
63
|
+
if (splitsSurrogatePair(text, tailStart))
|
|
64
|
+
tailStart += 1;
|
|
65
|
+
return `${text.slice(0, head)}${marker}${text.slice(tailStart)}`;
|
|
66
|
+
}
|
|
67
|
+
/** Pure: fit every text field of a filing under `cap`, recording which were shortened. */
|
|
68
|
+
export function boundEscalationFields(fields, cap = ESCALATION_FIELD_MAX) {
|
|
69
|
+
const shortened = {};
|
|
70
|
+
const fit = (name, value) => {
|
|
71
|
+
if (value === undefined || value.length <= cap)
|
|
72
|
+
return value;
|
|
73
|
+
shortened[name] = value.length;
|
|
74
|
+
return boundEscalationField(value, cap);
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
description: fit('description', fields.description),
|
|
78
|
+
whatWasTried: fit('whatWasTried', fields.whatWasTried),
|
|
79
|
+
helpNeeded: fit('helpNeeded', fields.helpNeeded),
|
|
80
|
+
shortened,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=escalation-field-bounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation-field-bounds.js","sourceRoot":"","sources":["../../src/queries/escalation-field-bounds.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0EAA0E;AAC1E,4DAA4D;AAC5D,8GAA8G;AAC9G,gBAAgB;AAEhB;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,iGAAiG;AACjG,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,6GAA6G;AAC7G,MAAM,CAAC,MAAM,0BAA0B,GAAG,oBAAoB,CAAC;AAE/D,2EAA2E;AAC3E,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,cAAsB,EAAE,MAAc,oBAAoB;IACxF,OAAO,CACL,+CAA+C,GAAG,oCAAoC;QACtF,aAAa,cAAc,4DAA4D;QACvF,8DAA8D,CAC/D,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,SAAS,mBAAmB,CAAC,IAAY,EAAE,CAAS;IAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,OAAO,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,MAAc,oBAAoB;IACnF,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IAC1C,IAAI,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,IAAI,IAAI,CAAC,CAAC;IAC/C,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,IAAI,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC;QAAE,SAAS,IAAI,CAAC,CAAC;IACzD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;AACnE,CAAC;AAeD,0FAA0F;AAC1F,MAAM,UAAU,qBAAqB,CACnC,MAA4B,EAC5B,MAAc,oBAAoB;IAElC,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,CAA+B,IAAY,EAAE,KAAQ,EAAK,EAAE;QACtE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;YAAE,OAAO,KAAK,CAAC;QAC7D,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/B,OAAO,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAM,CAAC;IAC/C,CAAC,CAAC;IACF,OAAO;QACL,WAAW,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC;QACnD,YAAY,EAAE,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC;QACtD,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC;QAChD,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { CallApiDeps } from './shared.js';
|
|
2
|
+
/** Longest server reason / original-text head the refusal record quotes. */
|
|
3
|
+
export declare const REFUSAL_REASON_MAX = 500;
|
|
4
|
+
export declare const REFUSAL_HEAD_MAX = 1500;
|
|
5
|
+
/** Health-event code for a refused escalation filing. */
|
|
6
|
+
export declare const ESCALATION_FILING_REFUSED_CODE = "escalation.filing_refused";
|
|
7
|
+
/** The escalation_create fields the chokepoint sends. */
|
|
8
|
+
export interface EscalationCreateFields {
|
|
9
|
+
reasonType: string;
|
|
10
|
+
description: string;
|
|
11
|
+
whatWasTried?: string;
|
|
12
|
+
helpNeeded?: string;
|
|
13
|
+
escalationKind?: string;
|
|
14
|
+
metadata?: Record<string, unknown>;
|
|
15
|
+
productId?: string;
|
|
16
|
+
focusId?: string;
|
|
17
|
+
deliveryId?: string;
|
|
18
|
+
targetProductId?: string;
|
|
19
|
+
disposition?: string;
|
|
20
|
+
}
|
|
21
|
+
/** One remembered refusal. */
|
|
22
|
+
export interface FilingRefusal {
|
|
23
|
+
statusCode: number;
|
|
24
|
+
reason: string;
|
|
25
|
+
refusedAt: string;
|
|
26
|
+
/** The refusal record's escalation id once filed; null while unfiled, or when it was itself refused. */
|
|
27
|
+
recordEscalationId: string | null;
|
|
28
|
+
/** 'pending' = not yet filed (retried on the next identical filing); 'filed'; 'refused' = the record itself was refused. */
|
|
29
|
+
recordState: 'pending' | 'filed' | 'refused';
|
|
30
|
+
}
|
|
31
|
+
/** What the write produced. */
|
|
32
|
+
export interface SendEscalationCreateResult {
|
|
33
|
+
escalationId: string | null;
|
|
34
|
+
/** Set when the filing was refused (now or on an earlier identical attempt); escalationId is then the refusal record's. */
|
|
35
|
+
refusal?: FilingRefusal;
|
|
36
|
+
}
|
|
37
|
+
export type FilingRefusalMemory = Map<string, FilingRefusal>;
|
|
38
|
+
/** A health event as the daemon-core buffer takes it. */
|
|
39
|
+
export interface RefusalHealthEvent {
|
|
40
|
+
severity: 'error';
|
|
41
|
+
source: string;
|
|
42
|
+
code: string;
|
|
43
|
+
message: string;
|
|
44
|
+
productId?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SendEscalationCreateDeps extends CallApiDeps {
|
|
47
|
+
refusalMemory?: FilingRefusalMemory;
|
|
48
|
+
emitHealthEvent?: (event: RefusalHealthEvent) => void | Promise<void>;
|
|
49
|
+
now?: () => string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Pure: whether a failed write is a refusal no identical resubmission can clear.
|
|
53
|
+
* Follows daemon-core's own retryability semantics (resilience.ts
|
|
54
|
+
* classifyHttpStatus): a server response whose status is 4xx and that the client
|
|
55
|
+
* marked non-retryable -- 400, 401, 403, 404, 409, 413, 422, ... -- or a CHECK
|
|
56
|
+
* violation. 429 is marked retryable there and stays transient, as do network
|
|
57
|
+
* errors, 5xx, and a ReadOnlyModeError (503, non-retryable but not a refusal of the
|
|
58
|
+
* content). Duck-typed over daemon-core's ApiError: this module takes no
|
|
59
|
+
* daemon-core value import (see queries/escalations.ts).
|
|
60
|
+
*/
|
|
61
|
+
export declare function isNonTransientRefusal(err: unknown): err is Error & {
|
|
62
|
+
statusCode: number;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Pure: the content fingerprint -- everything the server judges: the text fields,
|
|
66
|
+
* kind, disposition, anchors and the metadata bag (canonicalized), minus only the
|
|
67
|
+
* per-tick metadata the chokepoint re-stamps. A corrected metadata value is a
|
|
68
|
+
* different filing and is sent again.
|
|
69
|
+
*/
|
|
70
|
+
export declare function filingFingerprint(fields: EscalationCreateFields): string;
|
|
71
|
+
/** Pure: who the filing was for, for the log line and the health event. */
|
|
72
|
+
export declare function filingSubject(fields: EscalationCreateFields): string;
|
|
73
|
+
/**
|
|
74
|
+
* Pure: the minimal, fixed-size record filed in place of a refused filing. It keeps
|
|
75
|
+
* the kind, anchors, disposition, cause key and incident key (so dedup and incident
|
|
76
|
+
* correlation still see the condition), quotes the server's reason and the head of
|
|
77
|
+
* the refused description (which names the delivery and the cause), and says where
|
|
78
|
+
* the full text is. Every field is far under the server's field limits.
|
|
79
|
+
*/
|
|
80
|
+
export declare function refusalRecordFields(fields: EscalationCreateFields, refusal: FilingRefusal): EscalationCreateFields;
|
|
81
|
+
type CreateCall = NonNullable<CallApiDeps['callApi']>;
|
|
82
|
+
/**
|
|
83
|
+
* The chokepoint's escalation_create write, with non-transient refusal memory (see
|
|
84
|
+
* the module header). Throws only a transient failure.
|
|
85
|
+
*/
|
|
86
|
+
export declare function sendEscalationCreate(call: CreateCall, issueId: string | null, fields: EscalationCreateFields, deps?: SendEscalationCreateDeps): Promise<SendEscalationCreateResult>;
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=escalation-refusal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation-refusal.d.ts","sourceRoot":"","sources":["../../src/queries/escalation-refusal.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,yDAAyD;AACzD,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAK1E,yDAAyD;AACzD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,wGAAwG;IACxG,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,4HAA4H;IAC5H,WAAW,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;CAC9C;AAED,+BAA+B;AAC/B,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2HAA2H;IAC3H,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAK7D,yDAAyD;AACzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,KAAK,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAMzF;AAiBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAWxE;AAMD,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAMpE;AAKD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,aAAa,GAAG,sBAAsB,CAgBlH;AAmBD,KAAK,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AA0BtD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,sBAAsB,EAC9B,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,0BAA0B,CAAC,CAsCrC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/queries/escalation-refusal.test.ts
|
|
3
|
+
// PINNED-BY-END
|
|
4
|
+
/**
|
|
5
|
+
* A filing the server refuses for a non-transient reason is sent once, logged
|
|
6
|
+
* once, and surfaced to an operator -- never resubmitted identically every tick.
|
|
7
|
+
*
|
|
8
|
+
* Incident (daemon v0.22.132, 2026-09-16..17): the verify-gate stall detector's
|
|
9
|
+
* escalation was refused ("escalation description exceeds maximum length of 5000
|
|
10
|
+
* characters"); the refusal is a non-retryable 400, so withRetry threw at once, the
|
|
11
|
+
* detector downgraded it to a warn, and the next ~30s tick rebuilt and resubmitted
|
|
12
|
+
* the same text -- 181 refused filings, and an empty inbox while a delivery looped.
|
|
13
|
+
* Bounding the fields (queries/escalation-field-bounds.ts) removes that particular
|
|
14
|
+
* refusal; this module removes the loop for ANY refusal no resubmission can clear.
|
|
15
|
+
*
|
|
16
|
+
* sendEscalationCreate is the chokepoint's one escalation_create write
|
|
17
|
+
* (queries/escalations.ts createEscalation, and so the spool drain too):
|
|
18
|
+
*
|
|
19
|
+
* - A transient failure (network, timeout, 5xx, read-only mode) is rethrown
|
|
20
|
+
* unchanged -- the caller's retry and the next tick still apply.
|
|
21
|
+
* - A non-transient refusal (any non-retryable 4xx, or a CHECK violation) is remembered
|
|
22
|
+
* by the filing's content fingerprint, logged ONCE at error level naming the
|
|
23
|
+
* server's reason and the delivery/focus, and emitted as an error health event
|
|
24
|
+
* (heartbeat metadata -> the dashboard). A minimal, fixed-size record of the
|
|
25
|
+
* refusal is then filed in its place with the same kind, anchors, cause key and
|
|
26
|
+
* incident key, so the inbox carries the condition and the open row keeps the
|
|
27
|
+
* cause-keyed detector from filing again.
|
|
28
|
+
* - A later filing with the same fingerprint is not sent. If its refusal record
|
|
29
|
+
* is still unfiled (a transient failure), only the record is retried.
|
|
30
|
+
*
|
|
31
|
+
* The memory is in-process: after a restart a refused filing is sent once more,
|
|
32
|
+
* and its refusal record's open row (cause key / incident key) is what keeps the
|
|
33
|
+
* detector quiet across the restart.
|
|
34
|
+
*/
|
|
35
|
+
import { createHash } from 'node:crypto';
|
|
36
|
+
import { createLogger } from '../shell/log.js';
|
|
37
|
+
const log = createLogger({ module: 'escalations' });
|
|
38
|
+
/** Longest server reason / original-text head the refusal record quotes. */
|
|
39
|
+
export const REFUSAL_REASON_MAX = 500;
|
|
40
|
+
export const REFUSAL_HEAD_MAX = 1500;
|
|
41
|
+
/** Health-event code for a refused escalation filing. */
|
|
42
|
+
export const ESCALATION_FILING_REFUSED_CODE = 'escalation.filing_refused';
|
|
43
|
+
/** Bound on remembered fingerprints; the oldest is forgotten first. */
|
|
44
|
+
const REFUSAL_MEMORY_MAX = 500;
|
|
45
|
+
/** The process-wide memory. Tests pass their own through deps. */
|
|
46
|
+
const processMemory = new Map();
|
|
47
|
+
/**
|
|
48
|
+
* Pure: whether a failed write is a refusal no identical resubmission can clear.
|
|
49
|
+
* Follows daemon-core's own retryability semantics (resilience.ts
|
|
50
|
+
* classifyHttpStatus): a server response whose status is 4xx and that the client
|
|
51
|
+
* marked non-retryable -- 400, 401, 403, 404, 409, 413, 422, ... -- or a CHECK
|
|
52
|
+
* violation. 429 is marked retryable there and stays transient, as do network
|
|
53
|
+
* errors, 5xx, and a ReadOnlyModeError (503, non-retryable but not a refusal of the
|
|
54
|
+
* content). Duck-typed over daemon-core's ApiError: this module takes no
|
|
55
|
+
* daemon-core value import (see queries/escalations.ts).
|
|
56
|
+
*/
|
|
57
|
+
export function isNonTransientRefusal(err) {
|
|
58
|
+
if (!(err instanceof Error))
|
|
59
|
+
return false;
|
|
60
|
+
const e = err;
|
|
61
|
+
if (e.isRetryable === true)
|
|
62
|
+
return false;
|
|
63
|
+
if (e.name === 'SchemaConstraintViolation')
|
|
64
|
+
return true;
|
|
65
|
+
return typeof e.statusCode === 'number' && e.statusCode >= 400 && e.statusCode < 500;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Metadata the chokepoint re-stamps on every attempt with per-tick values
|
|
69
|
+
* (incident symptoms carry observed_at), so it is not part of the content identity.
|
|
70
|
+
*/
|
|
71
|
+
const VOLATILE_METADATA_KEYS = new Set(['symptoms']);
|
|
72
|
+
/** Pure: JSON with object keys sorted at every depth, so equal content hashes equally. */
|
|
73
|
+
function canonicalJson(value) {
|
|
74
|
+
return JSON.stringify(value, (_key, v) => {
|
|
75
|
+
if (v === null || typeof v !== 'object' || Array.isArray(v))
|
|
76
|
+
return v;
|
|
77
|
+
const obj = v;
|
|
78
|
+
return Object.fromEntries(Object.keys(obj).sort().map((k) => [k, obj[k]]));
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Pure: the content fingerprint -- everything the server judges: the text fields,
|
|
83
|
+
* kind, disposition, anchors and the metadata bag (canonicalized), minus only the
|
|
84
|
+
* per-tick metadata the chokepoint re-stamps. A corrected metadata value is a
|
|
85
|
+
* different filing and is sent again.
|
|
86
|
+
*/
|
|
87
|
+
export function filingFingerprint(fields) {
|
|
88
|
+
const metadata = fields.metadata
|
|
89
|
+
? Object.fromEntries(Object.entries(fields.metadata).filter(([k]) => !VOLATILE_METADATA_KEYS.has(k)))
|
|
90
|
+
: null;
|
|
91
|
+
const identity = [
|
|
92
|
+
fields.reasonType, fields.escalationKind ?? null, fields.disposition ?? null,
|
|
93
|
+
fields.productId ?? null, fields.focusId ?? null, fields.deliveryId ?? null, fields.targetProductId ?? null,
|
|
94
|
+
fields.description, fields.whatWasTried ?? null, fields.helpNeeded ?? null,
|
|
95
|
+
metadata,
|
|
96
|
+
];
|
|
97
|
+
return createHash('sha256').update(canonicalJson(identity)).digest('hex');
|
|
98
|
+
}
|
|
99
|
+
function clip(text, max) {
|
|
100
|
+
return text.length <= max ? text : `${text.slice(0, max - 3)}...`;
|
|
101
|
+
}
|
|
102
|
+
/** Pure: who the filing was for, for the log line and the health event. */
|
|
103
|
+
export function filingSubject(fields) {
|
|
104
|
+
const parts = [
|
|
105
|
+
fields.deliveryId ? `delivery ${fields.deliveryId}` : null,
|
|
106
|
+
fields.focusId ? `focus ${fields.focusId}` : null,
|
|
107
|
+
].filter((p) => p !== null);
|
|
108
|
+
return parts.length ? parts.join(', ') : 'no delivery or focus anchor';
|
|
109
|
+
}
|
|
110
|
+
/** Metadata keys the refusal record keeps: the ones that tie it to its cause and incident. */
|
|
111
|
+
const RECORD_METADATA_KEYS = ['cause', 'cause_key', 'original_cause_key', 'incident_key', 'symptoms', 'observation'];
|
|
112
|
+
/**
|
|
113
|
+
* Pure: the minimal, fixed-size record filed in place of a refused filing. It keeps
|
|
114
|
+
* the kind, anchors, disposition, cause key and incident key (so dedup and incident
|
|
115
|
+
* correlation still see the condition), quotes the server's reason and the head of
|
|
116
|
+
* the refused description (which names the delivery and the cause), and says where
|
|
117
|
+
* the full text is. Every field is far under the server's field limits.
|
|
118
|
+
*/
|
|
119
|
+
export function refusalRecordFields(fields, refusal) {
|
|
120
|
+
const kept = {};
|
|
121
|
+
for (const k of RECORD_METADATA_KEYS)
|
|
122
|
+
if (fields.metadata?.[k] !== undefined)
|
|
123
|
+
kept[k] = fields.metadata[k];
|
|
124
|
+
return {
|
|
125
|
+
...fields,
|
|
126
|
+
description: `The daemon's ${fields.escalationKind ?? 'unkinded'} escalation for ${filingSubject(fields)} was refused by ` +
|
|
127
|
+
`the server (${refusal.statusCode}: ${clip(refusal.reason, REFUSAL_REASON_MAX)}), so this shortened record ` +
|
|
128
|
+
`of it is filed instead and the refused text is not resubmitted. The full refused filing was written to the ` +
|
|
129
|
+
`daemon log (telora-daemon logs) at ${refusal.refusedAt}. It began:\n\n${clip(fields.description, REFUSAL_HEAD_MAX)}`,
|
|
130
|
+
whatWasTried: 'The daemon sent the filing once; the server refused it for a reason no identical resubmission can clear, ' +
|
|
131
|
+
'so it was not retried.',
|
|
132
|
+
helpNeeded: fields.helpNeeded === undefined ? undefined : clip(fields.helpNeeded, REFUSAL_HEAD_MAX),
|
|
133
|
+
metadata: { ...kept, filing_refused: { status_code: refusal.statusCode, reason: clip(refusal.reason, REFUSAL_REASON_MAX), refused_at: refusal.refusedAt } },
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
async function defaultEmitHealthEvent(event) {
|
|
137
|
+
// Deferred: the daemon-core value import behind this seam is only needed on a
|
|
138
|
+
// refusal, and a static one would poison mock-loaded tests that import the chokepoint.
|
|
139
|
+
const { healthEvents } = await import('../shell/health-events.js');
|
|
140
|
+
healthEvents.emit({ ...event, timestamp: new Date().toISOString() });
|
|
141
|
+
}
|
|
142
|
+
function remember(memory, fingerprint, refusal) {
|
|
143
|
+
memory.delete(fingerprint);
|
|
144
|
+
memory.set(fingerprint, refusal);
|
|
145
|
+
while (memory.size > REFUSAL_MEMORY_MAX) {
|
|
146
|
+
const oldest = memory.keys().next().value;
|
|
147
|
+
if (oldest === undefined)
|
|
148
|
+
break;
|
|
149
|
+
memory.delete(oldest);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async function create(call, issueId, fields) {
|
|
153
|
+
const res = await call('escalation_create', { issueId, fields });
|
|
154
|
+
return res.escalation?.id ?? null;
|
|
155
|
+
}
|
|
156
|
+
/** File the refusal record for `refusal`; a transient failure leaves it pending, a refusal of the record ends it. */
|
|
157
|
+
async function fileRefusalRecord(call, issueId, fields, refusal) {
|
|
158
|
+
try {
|
|
159
|
+
refusal.recordEscalationId = await create(call, issueId, refusalRecordFields(fields, refusal));
|
|
160
|
+
refusal.recordState = 'filed';
|
|
161
|
+
log.info(`[escalations] filed the refusal record ${refusal.recordEscalationId ?? '(no id)'} for the refused ${fields.escalationKind ?? 'unkinded'} filing (${filingSubject(fields)})`);
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (!isNonTransientRefusal(err))
|
|
165
|
+
throw err;
|
|
166
|
+
refusal.recordState = 'refused';
|
|
167
|
+
log.error(`[escalations] the server also refused the refusal record for the ${fields.escalationKind ?? 'unkinded'} filing (${filingSubject(fields)}): ${err.message}; the refusal stays visible as the ${ESCALATION_FILING_REFUSED_CODE} health event`);
|
|
168
|
+
}
|
|
169
|
+
return { escalationId: refusal.recordEscalationId, refusal };
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* The chokepoint's escalation_create write, with non-transient refusal memory (see
|
|
173
|
+
* the module header). Throws only a transient failure.
|
|
174
|
+
*/
|
|
175
|
+
export async function sendEscalationCreate(call, issueId, fields, deps = {}) {
|
|
176
|
+
const memory = deps.refusalMemory ?? processMemory;
|
|
177
|
+
const fingerprint = filingFingerprint(fields);
|
|
178
|
+
const known = memory.get(fingerprint);
|
|
179
|
+
if (known) {
|
|
180
|
+
if (known.recordState === 'pending')
|
|
181
|
+
return fileRefusalRecord(call, issueId, fields, known);
|
|
182
|
+
log.debug(`[escalations] not resubmitting a ${fields.escalationKind ?? 'unkinded'} filing the server refused at ${known.refusedAt} (${filingSubject(fields)})`);
|
|
183
|
+
return { escalationId: known.recordEscalationId, refusal: known };
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
return { escalationId: await create(call, issueId, fields) };
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
if (!isNonTransientRefusal(err))
|
|
190
|
+
throw err;
|
|
191
|
+
const refusal = {
|
|
192
|
+
statusCode: err.statusCode ?? 400,
|
|
193
|
+
reason: err.message,
|
|
194
|
+
refusedAt: (deps.now ?? (() => new Date().toISOString()))(),
|
|
195
|
+
recordEscalationId: null,
|
|
196
|
+
recordState: 'pending',
|
|
197
|
+
};
|
|
198
|
+
remember(memory, fingerprint, refusal);
|
|
199
|
+
const message = `The server refused the daemon's ${fields.escalationKind ?? 'unkinded'} escalation for ${filingSubject(fields)} ` +
|
|
200
|
+
`(${refusal.statusCode}: ${clip(refusal.reason, REFUSAL_REASON_MAX)}); it will not be resubmitted with identical content.`;
|
|
201
|
+
log.error(`[escalations] ${message} Refused filing: ${JSON.stringify(fields)}`);
|
|
202
|
+
try {
|
|
203
|
+
await (deps.emitHealthEvent ?? defaultEmitHealthEvent)({
|
|
204
|
+
severity: 'error',
|
|
205
|
+
source: 'escalations',
|
|
206
|
+
code: ESCALATION_FILING_REFUSED_CODE,
|
|
207
|
+
message,
|
|
208
|
+
...(fields.productId ? { productId: fields.productId } : {}),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (emitErr) {
|
|
212
|
+
log.warn(`[escalations] could not emit the ${ESCALATION_FILING_REFUSED_CODE} health event: ${emitErr.message}`);
|
|
213
|
+
}
|
|
214
|
+
return fileRefusalRecord(call, issueId, fields, refusal);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=escalation-refusal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation-refusal.js","sourceRoot":"","sources":["../../src/queries/escalation-refusal.ts"],"names":[],"mappings":"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"}
|
|
@@ -88,6 +88,12 @@ export interface FileEscalationIdempotentResult {
|
|
|
88
88
|
* failed before this row was filed; null otherwise.
|
|
89
89
|
*/
|
|
90
90
|
incidentEscalationId?: string | null;
|
|
91
|
+
/**
|
|
92
|
+
* Whether the server refused the filing non-transiently (queries/escalation-refusal.ts):
|
|
93
|
+
* filed is then false, and escalationId is the refusal record filed in its place (null
|
|
94
|
+
* while unfiled or itself refused).
|
|
95
|
+
*/
|
|
96
|
+
refused?: boolean;
|
|
91
97
|
}
|
|
92
98
|
/**
|
|
93
99
|
* File an escalation ONLY if its cause key is not already suppressed (open,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation-suppression.d.ts","sourceRoot":"","sources":["../../src/queries/escalation-suppression.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"escalation-suppression.d.ts","sourceRoot":"","sources":["../../src/queries/escalation-suppression.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAYtF;;;;;GAKG;AACH,MAAM,WAAW,yBAA0B,SAAQ,WAAW;IAC5D,wEAAwE;IACxE,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACpF,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;CAC5C;AAiCD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK5F;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,EAC/B,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,oDAAoD;AACpD,MAAM,WAAW,8BAA+B,SAAQ,sBAAsB;IAC5E,2FAA2F;IAC3F,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,+CAA+C;AAC/C,MAAM,WAAW,8BAA8B;IAC7C,0DAA0D;IAC1D,KAAK,EAAE,OAAO,CAAC;IACf,mFAAmF;IACnF,UAAU,EAAE,OAAO,CAAC;IACpB,wGAAwG;IACxG,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,8BAA8B,EACtC,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,8BAA8B,CAAC,CAuBzC"}
|
|
@@ -1,16 +1,5 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
-
// Pinned by: packages/daemon/src/
|
|
3
|
-
// packages/daemon/src/drift/drift-eval-loop.test.ts,
|
|
4
|
-
// packages/daemon/src/integration/resolution-class-routing-flow.test.ts,
|
|
5
|
-
// packages/daemon/src/integration/verification-history-round-trip.test.ts,
|
|
6
|
-
// packages/daemon/src/queries/escalation-cause-key.test.ts,
|
|
7
|
-
// packages/daemon/src/queries/escalation-noise-regressions.test.ts,
|
|
8
|
-
// packages/daemon/src/queries/filing-chokepoint.test.ts,
|
|
9
|
-
// packages/daemon/src/queries/incident-correlation.test.ts,
|
|
10
|
-
// packages/daemon/src/queries/loop-refusal-observation.test.ts,
|
|
11
|
-
// packages/daemon/src/spawn/spawn-cooldown.test.ts, packages/daemon/src/verify/shortfall-routing.test.ts,
|
|
12
|
-
// packages/daemon/src/verify/stall-detectors.test.ts,
|
|
13
|
-
// packages/daemon/src/verify/unreviewed-settle-detector.test.ts
|
|
2
|
+
// Pinned by: 22 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/queries/escalation-suppression.ts
|
|
14
3
|
// PINNED-BY-END
|
|
15
4
|
/**
|
|
16
5
|
* Cause-keyed escalation suppression + idempotent filing.
|
|
@@ -126,12 +115,14 @@ export async function fileEscalationIdempotent(params, deps = {}) {
|
|
|
126
115
|
};
|
|
127
116
|
const created = await (deps.createEscalation ?? createEscalation)(keyed, deps.callApi ? { callApi: deps.callApi } : {});
|
|
128
117
|
const correlated = created.correlated === true;
|
|
118
|
+
const refused = created.refusal !== undefined;
|
|
129
119
|
return {
|
|
130
|
-
filed: !correlated,
|
|
120
|
+
filed: !correlated && !refused,
|
|
131
121
|
suppressed: false,
|
|
132
122
|
escalationId: correlated ? null : created.escalationId,
|
|
133
123
|
correlated,
|
|
134
124
|
incidentEscalationId: created.incidentEscalationId ?? null,
|
|
125
|
+
refused,
|
|
135
126
|
};
|
|
136
127
|
}
|
|
137
128
|
//# sourceMappingURL=escalation-suppression.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation-suppression.js","sourceRoot":"","sources":["../../src/queries/escalation-suppression.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,
|
|
1
|
+
{"version":3,"file":"escalation-suppression.js","sourceRoot":"","sources":["../../src/queries/escalation-suppression.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,18 +13,8 @@ import type { EscalationResolutionClass } from '@telora/daemon-core';
|
|
|
13
13
|
import { type CallApiDeps } from './shared.js';
|
|
14
14
|
import { resolveProvenance, type EscalationAnchor } from '../completion/escalation-provenance.js';
|
|
15
15
|
import { type HumanAct } from './filing-observation.js';
|
|
16
|
+
import { type FilingRefusal, type SendEscalationCreateDeps } from './escalation-refusal.js';
|
|
16
17
|
import { type IncidentRow, type SymptomClearing } from './incident-correlation.js';
|
|
17
|
-
/**
|
|
18
|
-
* The escalation `description` hard cap enforced server-side by
|
|
19
|
-
* supabase/functions/_shared/validation.ts (validateMaxLength(description, 5000)).
|
|
20
|
-
* Every daemon-side producer that composes a description MUST fit it under this
|
|
21
|
-
* ONE number rather than compose blind and let the edge reject on length --
|
|
22
|
-
* the disagreement that let an over-cap description be re-submitted forever
|
|
23
|
-
* (Nexus notifications, and the former agent_resolvable promotion refile, which
|
|
24
|
-
* the daemon no longer files). The Nexus producer (nexus/return.ts) imports it
|
|
25
|
-
* from here so producer and server agree on the limit.
|
|
26
|
-
*/
|
|
27
|
-
export declare const ESCALATION_DESCRIPTION_MAX = 5000;
|
|
28
18
|
/**
|
|
29
19
|
* Parameters for creating an escalation request.
|
|
30
20
|
*/
|
|
@@ -94,9 +84,9 @@ export interface CreateEscalationParams {
|
|
|
94
84
|
* (derives the anchor's product/focus/delivery columns). Tests inject fakes THROUGH
|
|
95
85
|
* deps, registering ZERO mock.module; production callers pass nothing.
|
|
96
86
|
*/
|
|
97
|
-
export interface CreateEscalationDeps extends
|
|
87
|
+
export interface CreateEscalationDeps extends SendEscalationCreateDeps {
|
|
98
88
|
resolveProvenance?: typeof resolveProvenance;
|
|
99
|
-
/** ISO-8601 clock for the symptom's observed_at. */
|
|
89
|
+
/** ISO-8601 clock for the symptom's observed_at (and a refusal's refused_at). */
|
|
100
90
|
now?: () => string;
|
|
101
91
|
}
|
|
102
92
|
/** Outcome of a filing through the chokepoint. */
|
|
@@ -107,6 +97,8 @@ export interface CreateEscalationResult {
|
|
|
107
97
|
correlated?: boolean;
|
|
108
98
|
/** The lane row it correlated onto, or whose attach failed before this row was filed; else null. */
|
|
109
99
|
incidentEscalationId?: string | null;
|
|
100
|
+
/** Set when the server refused the filing non-transiently (queries/escalation-refusal.ts); escalationId is then its refusal record's. */
|
|
101
|
+
refusal?: FilingRefusal;
|
|
110
102
|
}
|
|
111
103
|
/**
|
|
112
104
|
* Create an escalation request -- the single filing chokepoint. Provenance is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalations.d.ts","sourceRoot":"","sources":["../../src/queries/escalations.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAGlG,OAAO,EAA0B,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"escalations.d.ts","sourceRoot":"","sources":["../../src/queries/escalations.ts"],"names":[],"mappings":"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"}
|