@telora/daemon 0.21.83 → 0.21.134
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 +10 -3
- package/dist/audit/audit-hooks.d.ts +106 -0
- package/dist/audit/audit-hooks.d.ts.map +1 -1
- package/dist/audit/audit-hooks.js +149 -17
- package/dist/audit/audit-hooks.js.map +1 -1
- package/dist/ci/ci-sensor-loop.d.ts +6 -0
- package/dist/ci/ci-sensor-loop.d.ts.map +1 -1
- package/dist/ci/ci-sensor-loop.js +50 -3
- package/dist/ci/ci-sensor-loop.js.map +1 -1
- package/dist/ci/ci-status.d.ts +63 -11
- package/dist/ci/ci-status.d.ts.map +1 -1
- package/dist/ci/ci-status.js +94 -27
- package/dist/ci/ci-status.js.map +1 -1
- package/dist/completion/coverage-drift-state.d.ts +29 -2
- package/dist/completion/coverage-drift-state.d.ts.map +1 -1
- package/dist/completion/coverage-drift-state.js +42 -2
- package/dist/completion/coverage-drift-state.js.map +1 -1
- package/dist/completion/coverage-stabilized.d.ts +58 -0
- package/dist/completion/coverage-stabilized.d.ts.map +1 -0
- package/dist/completion/coverage-stabilized.js +84 -0
- package/dist/completion/coverage-stabilized.js.map +1 -0
- package/dist/completion/delivery-advancement-guard.d.ts +21 -0
- package/dist/completion/delivery-advancement-guard.d.ts.map +1 -1
- package/dist/completion/delivery-advancement-guard.js +31 -3
- package/dist/completion/delivery-advancement-guard.js.map +1 -1
- package/dist/completion/event-escalations.d.ts +15 -0
- package/dist/completion/event-escalations.d.ts.map +1 -1
- package/dist/completion/event-escalations.js +42 -4
- package/dist/completion/event-escalations.js.map +1 -1
- package/dist/completion/event-phases.d.ts.map +1 -1
- package/dist/completion/event-phases.js +10 -5
- package/dist/completion/event-phases.js.map +1 -1
- package/dist/completion/machine-remediable-demotion.d.ts +74 -0
- package/dist/completion/machine-remediable-demotion.d.ts.map +1 -0
- package/dist/completion/machine-remediable-demotion.js +147 -0
- package/dist/completion/machine-remediable-demotion.js.map +1 -0
- package/dist/completion/review-exit-escalations.d.ts +36 -1
- package/dist/completion/review-exit-escalations.d.ts.map +1 -1
- package/dist/completion/review-exit-escalations.js +81 -0
- package/dist/completion/review-exit-escalations.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts +4 -2
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +49 -54
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/settle-injection-sweep.d.ts +55 -0
- package/dist/completion/settle-injection-sweep.d.ts.map +1 -0
- package/dist/completion/settle-injection-sweep.js +88 -0
- package/dist/completion/settle-injection-sweep.js.map +1 -0
- package/dist/completion/state-cascade.d.ts.map +1 -1
- package/dist/completion/state-cascade.js +41 -0
- package/dist/completion/state-cascade.js.map +1 -1
- package/dist/completion/status-advance-phase.d.ts.map +1 -1
- package/dist/completion/status-advance-phase.js +28 -30
- package/dist/completion/status-advance-phase.js.map +1 -1
- package/dist/completion/team-lifecycle.d.ts +42 -0
- package/dist/completion/team-lifecycle.d.ts.map +1 -1
- package/dist/completion/team-lifecycle.js +79 -2
- package/dist/completion/team-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-lifecycle.d.ts +19 -33
- package/dist/delivery/delivery-lifecycle.d.ts.map +1 -1
- package/dist/delivery/delivery-lifecycle.js +26 -160
- package/dist/delivery/delivery-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-merge-ops.d.ts +46 -0
- package/dist/delivery/delivery-merge-ops.d.ts.map +1 -0
- package/dist/delivery/delivery-merge-ops.js +154 -0
- package/dist/delivery/delivery-merge-ops.js.map +1 -0
- package/dist/delivery/delivery-reconciler-apply.d.ts +108 -66
- package/dist/delivery/delivery-reconciler-apply.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler-apply.js +87 -61
- package/dist/delivery/delivery-reconciler-apply.js.map +1 -1
- package/dist/delivery/delivery-reconciler.d.ts +7 -2
- package/dist/delivery/delivery-reconciler.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler.js +34 -5
- package/dist/delivery/delivery-reconciler.js.map +1 -1
- package/dist/delivery/external-hold-surface.d.ts +32 -0
- package/dist/delivery/external-hold-surface.d.ts.map +1 -0
- package/dist/delivery/external-hold-surface.js +67 -0
- package/dist/delivery/external-hold-surface.js.map +1 -0
- package/dist/delivery/external-hold.d.ts +38 -0
- package/dist/delivery/external-hold.d.ts.map +1 -1
- package/dist/delivery/external-hold.js +69 -6
- package/dist/delivery/external-hold.js.map +1 -1
- package/dist/delivery/operator-hold.d.ts +1 -2
- package/dist/delivery/operator-hold.d.ts.map +1 -1
- package/dist/delivery/operator-hold.js +1 -2
- package/dist/delivery/operator-hold.js.map +1 -1
- package/dist/delivery/paused-revival.d.ts +140 -0
- package/dist/delivery/paused-revival.d.ts.map +1 -0
- package/dist/delivery/paused-revival.js +229 -0
- package/dist/delivery/paused-revival.js.map +1 -0
- package/dist/delivery/wait-reachability.d.ts +149 -0
- package/dist/delivery/wait-reachability.d.ts.map +1 -0
- package/dist/delivery/wait-reachability.js +193 -0
- package/dist/delivery/wait-reachability.js.map +1 -0
- package/dist/directive/close-loop-dispatcher.d.ts +16 -263
- package/dist/directive/close-loop-dispatcher.d.ts.map +1 -1
- package/dist/directive/close-loop-dispatcher.js +21 -259
- package/dist/directive/close-loop-dispatcher.js.map +1 -1
- package/dist/directive/directive-dispatch.d.ts +19 -0
- package/dist/directive/directive-dispatch.d.ts.map +1 -1
- package/dist/directive/directive-dispatch.js +18 -0
- package/dist/directive/directive-dispatch.js.map +1 -1
- package/dist/directive/directive-executor.d.ts +1 -3
- package/dist/directive/directive-executor.d.ts.map +1 -1
- package/dist/directive/directive-executor.js +23 -21
- package/dist/directive/directive-executor.js.map +1 -1
- package/dist/directive/phase-sync.d.ts +28 -15
- package/dist/directive/phase-sync.d.ts.map +1 -1
- package/dist/directive/phase-sync.js +28 -36
- package/dist/directive/phase-sync.js.map +1 -1
- package/dist/directive/resolver-dispatch.d.ts +19 -92
- package/dist/directive/resolver-dispatch.d.ts.map +1 -1
- package/dist/directive/resolver-dispatch.js +19 -65
- package/dist/directive/resolver-dispatch.js.map +1 -1
- package/dist/focus/focus-engine.d.ts.map +1 -1
- package/dist/focus/focus-engine.js +26 -0
- 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 +290 -256
- package/dist/focus/focus-executor.js.map +1 -1
- package/dist/focus/focus-loop-registry.d.ts.map +1 -1
- package/dist/focus/focus-loop-registry.js +43 -1
- package/dist/focus/focus-loop-registry.js.map +1 -1
- package/dist/focus/focus-respawn-guard.d.ts.map +1 -1
- package/dist/focus/focus-respawn-guard.js +11 -2
- package/dist/focus/focus-respawn-guard.js.map +1 -1
- package/dist/focus/focus-team-state.d.ts +11 -0
- package/dist/focus/focus-team-state.d.ts.map +1 -1
- package/dist/focus/focus-team-state.js +17 -0
- package/dist/focus/focus-team-state.js.map +1 -1
- package/dist/focus/listener-auto-advance.d.ts +13 -1
- package/dist/focus/listener-auto-advance.d.ts.map +1 -1
- package/dist/focus/listener-auto-advance.js +112 -76
- package/dist/focus/listener-auto-advance.js.map +1 -1
- package/dist/focus/listener.d.ts.map +1 -1
- package/dist/focus/listener.js +141 -75
- package/dist/focus/listener.js.map +1 -1
- package/dist/focus/tick-deadline.d.ts +55 -0
- package/dist/focus/tick-deadline.d.ts.map +1 -0
- package/dist/focus/tick-deadline.js +91 -0
- package/dist/focus/tick-deadline.js.map +1 -0
- package/dist/focus-stage-lifecycle/index.d.ts +18 -25
- package/dist/focus-stage-lifecycle/index.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/index.js +26 -38
- package/dist/focus-stage-lifecycle/index.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts +52 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js +94 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +18 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +57 -7
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/git/merge.d.ts.map +1 -1
- package/dist/git/merge.js +12 -3
- package/dist/git/merge.js.map +1 -1
- package/dist/guard/condition-evaluators.d.ts +9 -0
- package/dist/guard/condition-evaluators.d.ts.map +1 -1
- package/dist/guard/condition-evaluators.js +15 -0
- package/dist/guard/condition-evaluators.js.map +1 -1
- package/dist/guard/guard-evaluator.d.ts +17 -1
- package/dist/guard/guard-evaluator.d.ts.map +1 -1
- package/dist/guard/guard-evaluator.js +61 -2
- package/dist/guard/guard-evaluator.js.map +1 -1
- package/dist/guard/trigger-executor.d.ts +30 -18
- package/dist/guard/trigger-executor.d.ts.map +1 -1
- package/dist/guard/trigger-executor.js +55 -31
- package/dist/guard/trigger-executor.js.map +1 -1
- package/dist/prompt/team-prompt-base.d.ts +1 -1
- package/dist/prompt/team-prompt-base.d.ts.map +1 -1
- package/dist/prompt/team-prompt-base.js +1 -1
- package/dist/prompt/team-prompt-base.js.map +1 -1
- package/dist/prompt-sections/persona-sections.d.ts +0 -32
- package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
- package/dist/prompt-sections/persona-sections.js +19 -88
- package/dist/prompt-sections/persona-sections.js.map +1 -1
- package/dist/queries/deliveries.d.ts +33 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +7 -0
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/focuses.d.ts +46 -0
- package/dist/queries/focuses.d.ts.map +1 -1
- package/dist/queries/focuses.js +60 -0
- package/dist/queries/focuses.js.map +1 -1
- package/dist/queries/guards.d.ts +10 -0
- package/dist/queries/guards.d.ts.map +1 -1
- package/dist/queries/guards.js +14 -1
- package/dist/queries/guards.js.map +1 -1
- package/dist/queries/issues.d.ts +65 -1
- package/dist/queries/issues.d.ts.map +1 -1
- package/dist/queries/issues.js +135 -2
- package/dist/queries/issues.js.map +1 -1
- package/dist/queries/schemas.d.ts +53 -0
- package/dist/queries/schemas.d.ts.map +1 -1
- package/dist/queries/schemas.js +38 -0
- package/dist/queries/schemas.js.map +1 -1
- package/dist/queries/verification.d.ts +5 -6
- package/dist/queries/verification.d.ts.map +1 -1
- package/dist/queries/verification.js +5 -6
- package/dist/queries/verification.js.map +1 -1
- package/dist/resolvers/loop-persona.d.ts +1 -11
- package/dist/resolvers/loop-persona.d.ts.map +1 -1
- package/dist/resolvers/loop-persona.js +2 -16
- package/dist/resolvers/loop-persona.js.map +1 -1
- package/dist/shell/heartbeat.d.ts +7 -0
- package/dist/shell/heartbeat.d.ts.map +1 -1
- package/dist/shell/heartbeat.js +1 -1
- package/dist/shell/heartbeat.js.map +1 -1
- package/dist/shell/unified-shell-provisioning.d.ts +40 -0
- package/dist/shell/unified-shell-provisioning.d.ts.map +1 -1
- package/dist/shell/unified-shell-provisioning.js +72 -0
- package/dist/shell/unified-shell-provisioning.js.map +1 -1
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +18 -1
- package/dist/shell/unified-shell.js.map +1 -1
- package/dist/spawn/helpers.d.ts.map +1 -1
- package/dist/spawn/helpers.js +6 -1
- package/dist/spawn/helpers.js.map +1 -1
- package/dist/spawn/process-spawn.d.ts.map +1 -1
- package/dist/spawn/process-spawn.js +7 -0
- package/dist/spawn/process-spawn.js.map +1 -1
- package/dist/spawn/respawn-cycle-escalation.d.ts +41 -0
- package/dist/spawn/respawn-cycle-escalation.d.ts.map +1 -0
- package/dist/spawn/respawn-cycle-escalation.js +83 -0
- package/dist/spawn/respawn-cycle-escalation.js.map +1 -0
- package/dist/spawn/spawn-cooldown.d.ts +119 -2
- package/dist/spawn/spawn-cooldown.d.ts.map +1 -1
- package/dist/spawn/spawn-cooldown.js +120 -10
- package/dist/spawn/spawn-cooldown.js.map +1 -1
- package/dist/spawn/spawn-decision.d.ts.map +1 -1
- package/dist/spawn/spawn-decision.js +33 -1
- package/dist/spawn/spawn-decision.js.map +1 -1
- package/dist/testing/fixtures/index.d.ts +64 -0
- package/dist/testing/fixtures/index.d.ts.map +1 -0
- package/dist/testing/fixtures/index.js +220 -0
- package/dist/testing/fixtures/index.js.map +1 -0
- package/dist/update/build-info.d.ts +1 -0
- package/dist/update/build-info.d.ts.map +1 -1
- package/dist/update/build-info.js +1 -1
- package/dist/update/build-info.js.map +1 -1
- package/dist/verify/stall-detector-config.d.ts +8 -0
- package/dist/verify/stall-detector-config.d.ts.map +1 -1
- package/dist/verify/stall-detector-config.js +40 -0
- package/dist/verify/stall-detector-config.js.map +1 -1
- package/dist/verify/stall-detectors.d.ts +57 -14
- package/dist/verify/stall-detectors.d.ts.map +1 -1
- package/dist/verify/stall-detectors.js +72 -55
- package/dist/verify/stall-detectors.js.map +1 -1
- package/dist/verify/verification-feedback.d.ts +3 -4
- package/dist/verify/verification-feedback.d.ts.map +1 -1
- package/dist/verify/verification-feedback.js +3 -12
- package/dist/verify/verification-feedback.js.map +1 -1
- package/dist/workflow/gate-failure-policy.d.ts +48 -0
- package/dist/workflow/gate-failure-policy.d.ts.map +1 -0
- package/dist/workflow/gate-failure-policy.js +57 -0
- package/dist/workflow/gate-failure-policy.js.map +1 -0
- package/dist/workflow/pipeline-config.d.ts +2 -2
- package/dist/workflow/pipeline-config.js +2 -2
- package/package.json +3 -3
- package/dist/directive/close-loop-stage.d.ts +0 -50
- package/dist/directive/close-loop-stage.d.ts.map +0 -1
- package/dist/directive/close-loop-stage.js +0 -210
- package/dist/directive/close-loop-stage.js.map +0 -1
- package/dist/focus-stage-lifecycle/review-convergence.d.ts +0 -133
- package/dist/focus-stage-lifecycle/review-convergence.d.ts.map +0 -1
- package/dist/focus-stage-lifecycle/review-convergence.js +0 -237
- package/dist/focus-stage-lifecycle/review-convergence.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-hold-surface.js","sourceRoot":"","sources":["../../src/delivery/external-hold-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAEtD,oFAAoF;AACpF,MAAM,CAAC,MAAM,uCAAuC,GAAG,oCAAoC,CAAC;AAE5F;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE7C,wCAAwC;AACxC,MAAM,UAAU,kCAAkC;IAChD,kBAAkB,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qCAAqC,CACnD,UAAkB,EAClB,YAAoB,EACpB,kBAA2B,EAC3B,IAA+E;IAE/E,IAAI,kBAAkB,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO;QAC/C,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACnC,GAAG,CAAC,IAAI,CACN,6BAA6B,YAAY,MAAM,UAAU,kCAAkC;YAC3F,mBAAmB,IAAI,CAAC,UAAU,4DAA4D;YAC9F,4BAA4B,uCAAuC,GAAG,CACvE,CAAC;QACF,YAAY,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,YAAY,UAAU,EAAE;YAChC,IAAI,EAAE,uCAAuC;YAC7C,OAAO,EACL,aAAa,YAAY,0DAA0D;gBACnF,KAAK,IAAI,CAAC,SAAS,mBAAmB,IAAI,CAAC,UAAU,cAAc,IAAI,CAAC,UAAU,cAAc;gBAChG,iGAAiG;gBACjG,oFAAoF;SACvF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,iFAAiF;IACjF,gDAAgD;IAChD,IAAI,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,YAAY,CAAC,aAAa,CAAC,uCAAuC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|
|
@@ -29,6 +29,18 @@
|
|
|
29
29
|
* @module external-hold
|
|
30
30
|
*/
|
|
31
31
|
import type { ExternalHoldState, updateDeliveryStatus } from '../queries/deliveries.js';
|
|
32
|
+
/**
|
|
33
|
+
* Pure decision: is this held, reference-less external hold now STALE (age-bounded)?
|
|
34
|
+
*
|
|
35
|
+
* True when the hold is reference-less -- its wait is UNREACHABLE (nothing the
|
|
36
|
+
* daemon can re-read will ever fire it: crossProductRequestWait over an empty
|
|
37
|
+
* reference set classifies as not-`canStillFire`) -- AND it has been declared
|
|
38
|
+
* longer ago than the bound. This is the live branch on the wait-reachability
|
|
39
|
+
* verdict (previously render-only): a reachable wait (a hold with a re-readable
|
|
40
|
+
* request reference) is NEVER stale-surfaced, because it self-clears when the
|
|
41
|
+
* request closes. Exported for direct unit testing (no clock, no daemon-core).
|
|
42
|
+
*/
|
|
43
|
+
export declare function isReferenceLessHoldStale(hold: Pick<ExternalHoldState, 'declaredAt' | 'clearsWhenRequestsClosed'>, nowMs: number, boundMs?: number): boolean;
|
|
32
44
|
/** The slice of deps this gate needs (structural, so no import cycle). */
|
|
33
45
|
export interface ExternalHoldDeps {
|
|
34
46
|
updateDeliveryStatus: typeof updateDeliveryStatus;
|
|
@@ -82,6 +94,23 @@ export type RequestStatusReader = (requestIds: string[]) => Promise<Array<{
|
|
|
82
94
|
* from the reader propagates the same way.
|
|
83
95
|
*/
|
|
84
96
|
export declare function makeRequestClosureEvaluator(readStatuses: RequestStatusReader): ExternalConditionEvaluator;
|
|
97
|
+
/**
|
|
98
|
+
* The production external-condition evaluator wired at every verify->done hold
|
|
99
|
+
* gate: re-read the cross-product requests a hold references via
|
|
100
|
+
* queries/requests.ts and clear only when all have reached closure.
|
|
101
|
+
*
|
|
102
|
+
* The request query is loaded with a DEFERRED dynamic `import()` rather than a
|
|
103
|
+
* static top-of-module import on purpose: queries/requests.js -> queries/shared.js
|
|
104
|
+
* pulls a bare `@telora/daemon-core` VALUE import that mis-resolves under the
|
|
105
|
+
* node:test module-mock loader, so a load-time static import would poison every
|
|
106
|
+
* mocked listener/review-exit test that transitively loads this module. The
|
|
107
|
+
* dynamic import resolves ONLY when a request-referenced hold is actually re-read
|
|
108
|
+
* (never in mocked tests that carry no such hold); behavior is identical in
|
|
109
|
+
* production. This is the single definition of that evaluator, shared by the
|
|
110
|
+
* discovery-only auto-advance path (listener-auto-advance) and the review-exit
|
|
111
|
+
* path (review-exit-phase) so the deferred-import boilerplate lives in one place.
|
|
112
|
+
*/
|
|
113
|
+
export declare function makeDeferredRequestClosureEvaluator(productId: string): ExternalConditionEvaluator;
|
|
85
114
|
/** The resolved external-hold state for one delivery. */
|
|
86
115
|
export interface ExternalHold {
|
|
87
116
|
/** True when an unmet external hold is present on the delivery. */
|
|
@@ -99,6 +128,15 @@ export interface ExternalHold {
|
|
|
99
128
|
* not held, when cleared, or when the hold carries a reference.
|
|
100
129
|
*/
|
|
101
130
|
referenceLess?: boolean;
|
|
131
|
+
/**
|
|
132
|
+
* True when the hold is reference-less AND has been held past the staleness
|
|
133
|
+
* age bound (isReferenceLessHoldStale): it can never self-clear and has now sat
|
|
134
|
+
* long enough to be SURFACED so a human re-declares it with a clearing reference
|
|
135
|
+
* or clears it. The caller emits the operator-visible signal (this module stays
|
|
136
|
+
* free of the @telora/daemon-core value import health surfacing needs). Absent/
|
|
137
|
+
* false when not held, reference-less but within the bound, or reference-bearing.
|
|
138
|
+
*/
|
|
139
|
+
staleReferenceLess?: boolean;
|
|
102
140
|
}
|
|
103
141
|
/** Narrow a delivery's `gate_state` JSONB to its externalHold, if any. */
|
|
104
142
|
export declare function readExternalHoldState(gateState: unknown): ExternalHoldState | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-hold.d.ts","sourceRoot":"","sources":["../../src/delivery/external-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAqB,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"external-hold.d.ts","sourceRoot":"","sources":["../../src/delivery/external-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAqB,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAyC3G;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,0BAA0B,CAAC,EACxE,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAqC,GAC7C,OAAO,CAMT;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;CACnD;AAED;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG,CACvC,IAAI,EAAE,iBAAiB,KACpB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAE,0BAAwC,CAAC;AAElF;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,UAAU,EAAE,MAAM,EAAE,KACjB,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAErD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,mBAAmB,GAChC,0BAA0B,CAe5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mCAAmC,CAAC,SAAS,EAAE,MAAM,GAAG,0BAA0B,CAKjG;AAED,yDAAyD;AACzD,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,IAAI,EAAE,OAAO,CAAC;IACd,4DAA4D;IAC5D,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/B,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAmBlF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACzG,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO,EAClB,iBAAiB,EAAE,0BAA0B,EAC7C,KAAK,GAAE,MAAM,MAAuC,GACnD,OAAO,CAAC,YAAY,CAAC,CA2CvB;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAmB/D"}
|
|
@@ -29,6 +29,8 @@
|
|
|
29
29
|
* @module external-hold
|
|
30
30
|
*/
|
|
31
31
|
import { createLogger } from '../shell/log.js';
|
|
32
|
+
import { classifyWaitReachability, describeWaitReachability, crossProductRequestWait, canStillFire, } from './wait-reachability.js';
|
|
33
|
+
import { safetyGateFailsClosed } from '../workflow/gate-failure-policy.js';
|
|
32
34
|
const log = createLogger({ module: 'external-hold' });
|
|
33
35
|
// The `verify` status re-asserted by a gate_state write. Daemon-local literal
|
|
34
36
|
// for the same reason as operator-hold.ts's VERIFY_STATUS: this module is
|
|
@@ -47,6 +49,35 @@ const VERIFY_STATUS = 'verify';
|
|
|
47
49
|
// is non-terminal-for-the-source and 'declined' is a terminal exit that is NOT
|
|
48
50
|
// closure -- neither clears the hold, only 'closed' does.
|
|
49
51
|
const REQUEST_STATUS_CLOSED = 'closed';
|
|
52
|
+
/**
|
|
53
|
+
* How long a REFERENCE-LESS external hold may sit before it is surfaced as stale.
|
|
54
|
+
* A reference-less hold has nothing for the daemon to re-read, so it can NEVER
|
|
55
|
+
* self-clear; left silent it withholds the delivery from done -- and the focus
|
|
56
|
+
* from winding_down -- forever. After this age it is surfaced (age-bounded) so a
|
|
57
|
+
* human can re-declare it with a clearing reference or clear it. Daemon-local
|
|
58
|
+
* (this module avoids a bare @telora/daemon-core VALUE import; see VERIFY_STATUS).
|
|
59
|
+
*/
|
|
60
|
+
const REFERENCE_LESS_HOLD_STALE_MS = 24 * 3_600_000;
|
|
61
|
+
/**
|
|
62
|
+
* Pure decision: is this held, reference-less external hold now STALE (age-bounded)?
|
|
63
|
+
*
|
|
64
|
+
* True when the hold is reference-less -- its wait is UNREACHABLE (nothing the
|
|
65
|
+
* daemon can re-read will ever fire it: crossProductRequestWait over an empty
|
|
66
|
+
* reference set classifies as not-`canStillFire`) -- AND it has been declared
|
|
67
|
+
* longer ago than the bound. This is the live branch on the wait-reachability
|
|
68
|
+
* verdict (previously render-only): a reachable wait (a hold with a re-readable
|
|
69
|
+
* request reference) is NEVER stale-surfaced, because it self-clears when the
|
|
70
|
+
* request closes. Exported for direct unit testing (no clock, no daemon-core).
|
|
71
|
+
*/
|
|
72
|
+
export function isReferenceLessHoldStale(hold, nowMs, boundMs = REFERENCE_LESS_HOLD_STALE_MS) {
|
|
73
|
+
const wait = crossProductRequestWait(hold.clearsWhenRequestsClosed ?? []);
|
|
74
|
+
if (canStillFire(wait))
|
|
75
|
+
return false; // has a re-readable reference -> self-clears
|
|
76
|
+
const declaredMs = Date.parse(hold.declaredAt);
|
|
77
|
+
if (Number.isNaN(declaredMs))
|
|
78
|
+
return false;
|
|
79
|
+
return nowMs - declaredMs >= boundMs;
|
|
80
|
+
}
|
|
50
81
|
/**
|
|
51
82
|
* The default production evaluator: an irreducibly-external dependency does not
|
|
52
83
|
* auto-clear from its free-text condition -- there is no generic probe for
|
|
@@ -93,6 +124,28 @@ export function makeRequestClosureEvaluator(readStatuses) {
|
|
|
93
124
|
return true; // every referenced request closed -> dependency met
|
|
94
125
|
};
|
|
95
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* The production external-condition evaluator wired at every verify->done hold
|
|
129
|
+
* gate: re-read the cross-product requests a hold references via
|
|
130
|
+
* queries/requests.ts and clear only when all have reached closure.
|
|
131
|
+
*
|
|
132
|
+
* The request query is loaded with a DEFERRED dynamic `import()` rather than a
|
|
133
|
+
* static top-of-module import on purpose: queries/requests.js -> queries/shared.js
|
|
134
|
+
* pulls a bare `@telora/daemon-core` VALUE import that mis-resolves under the
|
|
135
|
+
* node:test module-mock loader, so a load-time static import would poison every
|
|
136
|
+
* mocked listener/review-exit test that transitively loads this module. The
|
|
137
|
+
* dynamic import resolves ONLY when a request-referenced hold is actually re-read
|
|
138
|
+
* (never in mocked tests that carry no such hold); behavior is identical in
|
|
139
|
+
* production. This is the single definition of that evaluator, shared by the
|
|
140
|
+
* discovery-only auto-advance path (listener-auto-advance) and the review-exit
|
|
141
|
+
* path (review-exit-phase) so the deferred-import boilerplate lives in one place.
|
|
142
|
+
*/
|
|
143
|
+
export function makeDeferredRequestClosureEvaluator(productId) {
|
|
144
|
+
return makeRequestClosureEvaluator(async (ids) => {
|
|
145
|
+
const { listOutgoingRequestStatuses } = await import('../queries/requests.js');
|
|
146
|
+
return listOutgoingRequestStatuses(productId, ids);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
96
149
|
/** Narrow a delivery's `gate_state` JSONB to its externalHold, if any. */
|
|
97
150
|
export function readExternalHoldState(gateState) {
|
|
98
151
|
if (gateState === null || typeof gateState !== 'object')
|
|
@@ -181,14 +234,19 @@ export async function resolveExternalHold(deps, deliveryId, gateState, evaluateC
|
|
|
181
234
|
// for the daemon to re-read, so it cannot self-clear -- surface it rather than
|
|
182
235
|
// let it read as a normal, self-clearing hold.
|
|
183
236
|
const referenceLess = !hold.clearsWhenRequestsClosed || hold.clearsWhenRequestsClosed.length === 0;
|
|
237
|
+
// Age-bound the reference-less hold (branches on the wait-reachability verdict,
|
|
238
|
+
// previously render-only): once it has sat past REFERENCE_LESS_HOLD_STALE_MS it
|
|
239
|
+
// is surfaced by the caller so it is never a silent permanent hold.
|
|
240
|
+
const staleReferenceLess = isReferenceLessHoldStale(hold, Date.parse(clock()));
|
|
184
241
|
let conditionMet = false;
|
|
185
242
|
try {
|
|
186
243
|
conditionMet = await evaluateCondition(hold);
|
|
187
244
|
}
|
|
188
245
|
catch (err) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
246
|
+
// SAFETY GATE (the external-hold verify->done gate) -> FAIL CLOSED per the
|
|
247
|
+
// stated per-class policy: hold. A missed external hold lets an
|
|
248
|
+
// externally-blocked delivery reach done -- the failure this focus fights.
|
|
249
|
+
return safetyGateFailsClosed(`external-hold verify->done delivery ${deliveryId}`, err, { held: true, hold, cleared: false, referenceLess, staleReferenceLess });
|
|
192
250
|
}
|
|
193
251
|
if (conditionMet) {
|
|
194
252
|
try {
|
|
@@ -203,7 +261,7 @@ export async function resolveExternalHold(deps, deliveryId, gateState, evaluateC
|
|
|
203
261
|
}
|
|
204
262
|
return { held: false, hold, cleared: true };
|
|
205
263
|
}
|
|
206
|
-
return { held: true, hold, cleared: false, referenceLess };
|
|
264
|
+
return { held: true, hold, cleared: false, referenceLess, staleReferenceLess };
|
|
207
265
|
}
|
|
208
266
|
/** Human-readable hold reason for an exit/advance log line. */
|
|
209
267
|
export function describeExternalHold(hold) {
|
|
@@ -211,12 +269,17 @@ export function describeExternalHold(hold) {
|
|
|
211
269
|
return 'external hold cleared (condition re-evaluated true)';
|
|
212
270
|
if (hold.hold) {
|
|
213
271
|
const base = `external hold: ${hold.hold.condition} (clears when: ${hold.hold.clearsWhen})`;
|
|
272
|
+
// An external dependency is a wait on ANOTHER ACTOR (a third party / peer
|
|
273
|
+
// product) -- carry the shared reachability marker so this hold is legible
|
|
274
|
+
// in the same vocabulary as every other wait, and distinguishable from a
|
|
275
|
+
// wait blocked on itself or on a recorded fact.
|
|
276
|
+
const marker = describeWaitReachability(classifyWaitReachability(crossProductRequestWait(hold.hold.clearsWhenRequestsClosed ?? [])));
|
|
214
277
|
// Name the reference-less case so it is not mistaken for a self-clearing
|
|
215
278
|
// hold: nothing references what would clear it, so the daemon cannot re-read
|
|
216
279
|
// it to done -- it needs a reality change or a re-declaration with a reference.
|
|
217
280
|
return hold.referenceLess
|
|
218
|
-
? `${base} [no machine-readable clearing reference -- will not self-clear]`
|
|
219
|
-
: base
|
|
281
|
+
? `${base} [${marker}; no machine-readable clearing reference -- will not self-clear]`
|
|
282
|
+
: `${base} [${marker}]`;
|
|
220
283
|
}
|
|
221
284
|
return 'not held';
|
|
222
285
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-hold.js","sourceRoot":"","sources":["../../src/delivery/external-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"external-hold.js","sourceRoot":"","sources":["../../src/delivery/external-hold.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,8 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Sibling of the shortfall hold (completion/review-exit-shortfall.ts) -- the same
|
|
14
14
|
* shape: resolve the hold async, and gate the write DOWNSTREAM of the reconciler's
|
|
15
|
-
* target decision (the reconciler models neither hold
|
|
16
|
-
* spurious [reconciler-divergence] logs). Two differences from the shortfall hold:
|
|
15
|
+
* target decision (the reconciler models neither hold). Two differences from the shortfall hold:
|
|
17
16
|
* it is per-DELIVERY (escalations anchor to a delivery, not a focus), and its
|
|
18
17
|
* failure direction is the inverse -- see resolveOperatorHold.
|
|
19
18
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operator-hold.d.ts","sourceRoot":"","sources":["../../src/delivery/operator-hold.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"operator-hold.d.ts","sourceRoot":"","sources":["../../src/delivery/operator-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,+BAA+B,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAaxF,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,IAAI,EAAE,OAAO,CAAC;IACd,8EAA8E;IAC9E,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC1C,kFAAkF;IAClF,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B,EAAE,OAAO,+BAA+B,CAAC;IACxE,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;CACnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAWvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAO/D"}
|
|
@@ -12,8 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Sibling of the shortfall hold (completion/review-exit-shortfall.ts) -- the same
|
|
14
14
|
* shape: resolve the hold async, and gate the write DOWNSTREAM of the reconciler's
|
|
15
|
-
* target decision (the reconciler models neither hold
|
|
16
|
-
* spurious [reconciler-divergence] logs). Two differences from the shortfall hold:
|
|
15
|
+
* target decision (the reconciler models neither hold). Two differences from the shortfall hold:
|
|
17
16
|
* it is per-DELIVERY (escalations anchor to a delivery, not a focus), and its
|
|
18
17
|
* failure direction is the inverse -- see resolveOperatorHold.
|
|
19
18
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operator-hold.js","sourceRoot":"","sources":["../../src/delivery/operator-hold.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"operator-hold.js","sourceRoot":"","sources":["../../src/delivery/operator-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAEtD,iFAAiF;AACjF,8EAA8E;AAC9E,8EAA8E;AAC9E,gFAAgF;AAChF,2EAA2E;AAC3E,uFAAuF;AACvF,MAAM,aAAa,GAAG,QAAQ,CAAC;AAkB/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAsB,EACtB,UAAkB,EAClB,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,uEAAuE,UAAU,MAAM;YACvF,uCAAwC,GAAa,CAAC,OAAO,EAAE,CAChE,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAsB,EACtB,UAAkB,EAClB,IAAkB;IAElB,MAAM,SAAS,GAAsB;QACnC,uEAAuE;QACvE,0EAA0E;QAC1E,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,YAAY,EAAE,IAAI,CAAC,UAAU;YAC3B,CAAC,CAAC;gBACE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;gBAChC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc;gBAC9C,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;aACzC;YACH,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;KACtF,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,oBAAoB,CAC7B,UAAU,EACV,aAAa,EACb,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,CACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,yEAAyE,UAAU,GAAG;YACtF,uDAAwD,GAAa,CAAC,OAAO,EAAE,CAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,oBAAoB,CAAC,IAAkB;IACrD,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,yCAAyC,CAAC;IACtE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,QAAQ,IAAI,CAAC,UAAU,CAAC,WAAW,eAAe,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE;YAC3E,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paused-delivery revival -- the daemon-traversable EXIT from `paused` (TEL-1:
|
|
3
|
+
* "Every path into `paused` has a daemon-traversable exit or a named human-act
|
|
4
|
+
* hold").
|
|
5
|
+
*
|
|
6
|
+
* A `paused` delivery is a guard BLOCK on a transition (coding->verify or
|
|
7
|
+
* verify->done), written with an open `transition_blocks` row carrying the
|
|
8
|
+
* blocked transition and its human decision_paths (retry / override). Before
|
|
9
|
+
* this consumer, that block row was written but "nothing read it back": a paused
|
|
10
|
+
* delivery was skipped by every actionable-status pass, never re-evaluated, and
|
|
11
|
+
* -- because paused BLOCKS lower-ranked deliveries -- it wedged the whole ranked
|
|
12
|
+
* queue until a human re-queued it. On an ARMED focus that human never comes
|
|
13
|
+
* (2026-07-28 ruling: an armed focus reaches its terminal without a human;
|
|
14
|
+
* decide-and-record, reversibility as tiebreaker).
|
|
15
|
+
*
|
|
16
|
+
* This module reads the block row back. Each sweep, for every paused delivery it
|
|
17
|
+
* re-evaluates the SAME blocked transition's guards and routes the fresh verdict
|
|
18
|
+
* through the single-writer reconciler (delivery-reconciler `paused` case):
|
|
19
|
+
* - guard CLEARED -> revive `paused` -> `queued` (the canonical revival edge);
|
|
20
|
+
* the normal walk re-drives and re-hits the gate. This is
|
|
21
|
+
* the daemon-traversable exit.
|
|
22
|
+
* - guard STILL blocks -> hold. The pause stays a NAMED human-act hold (its
|
|
23
|
+
* gate_state blocking conditions + the block's `override`
|
|
24
|
+
* decision path name the act only a human can perform), and
|
|
25
|
+
* the wedge watchdog surfaces it. The daemon never OVERRIDES
|
|
26
|
+
* an unclear gate -- that irreversible act is the human's.
|
|
27
|
+
*
|
|
28
|
+
* A paused delivery with NO open block row is NOT abandoned: the blocked FORWARD
|
|
29
|
+
* transition (coding->verify / verify->done) is recovered from the delivery's
|
|
30
|
+
* preserved source stage and re-evaluated the same way -- so a hard-guard pause
|
|
31
|
+
* that wrote no block_transition row still gets a daemon-traversable exit. Only a
|
|
32
|
+
* pause whose stage yields no recoverable forward transition (unknown/ambiguous)
|
|
33
|
+
* stays `no-block` for the watchdog.
|
|
34
|
+
*
|
|
35
|
+
* DI-first: `reconcilePausedDelivery` + `checkPausedDeliveriesForRevival` take a
|
|
36
|
+
* deps object so they unit-test with plain stubs (no `mock.module`, which would
|
|
37
|
+
* poison the daemon-core bare-import loader). `buildDefaultPausedRevivalDeps`
|
|
38
|
+
* wires the real query/guard functions for the listener.
|
|
39
|
+
*/
|
|
40
|
+
/** The minimal paused-delivery shape this consumer reads. */
|
|
41
|
+
export interface PausedDeliveryInfo {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
executionStatus: string | null;
|
|
45
|
+
/**
|
|
46
|
+
* The delivery's workflow stage id. A pause PRESERVES this at the SOURCE stage
|
|
47
|
+
* of the blocked advance (delivery-lifecycle sets deliveryStageId=currentStageId
|
|
48
|
+
* on a guard block), so it recovers the blocked FORWARD transition even when no
|
|
49
|
+
* transition_blocks row was written (a hard guard with no block_transition
|
|
50
|
+
* trigger). Absent => the derived-transition fallback is skipped.
|
|
51
|
+
*/
|
|
52
|
+
currentWorkflowStageId?: string | null;
|
|
53
|
+
}
|
|
54
|
+
/** Per-delivery revival deps (the I/O seam). */
|
|
55
|
+
export interface PausedRevivalDeps {
|
|
56
|
+
/**
|
|
57
|
+
* The open (unresolved) transition block for a paused delivery, yielding the
|
|
58
|
+
* blocked transition id. null when the paused delivery has no block row
|
|
59
|
+
* (nothing to re-evaluate).
|
|
60
|
+
*/
|
|
61
|
+
getActiveTransitionBlock(deliveryId: string): Promise<{
|
|
62
|
+
id: string;
|
|
63
|
+
transitionId: string;
|
|
64
|
+
} | null>;
|
|
65
|
+
/**
|
|
66
|
+
* Fallback transition recovery for a paused delivery with NO open block row:
|
|
67
|
+
* derive the blocked FORWARD transition (coding->verify / verify->done) from
|
|
68
|
+
* the delivery's preserved source stage. Returns the transition id, or null
|
|
69
|
+
* when the stage is unknown/ambiguous (then the delivery stays paused for the
|
|
70
|
+
* watchdog). Only consulted when getActiveTransitionBlock returns null.
|
|
71
|
+
*/
|
|
72
|
+
resolveForwardTransitionId(deliveryId: string, currentStageId: string | null | undefined): Promise<string | null>;
|
|
73
|
+
/**
|
|
74
|
+
* Re-evaluate the blocked transition's guards. Returns whether they STILL
|
|
75
|
+
* block (true = still blocked, false = cleared). Pure measurement -- MUST NOT
|
|
76
|
+
* write the delivery's execution_status.
|
|
77
|
+
*/
|
|
78
|
+
reEvaluateGuardBlocked(deliveryId: string, organizationId: string, transitionId: string): Promise<boolean>;
|
|
79
|
+
/** Resolve the workflow stage id for a status name on this delivery's effective workflow. */
|
|
80
|
+
resolveStageId(deliveryId: string, statusName: string): Promise<string | undefined>;
|
|
81
|
+
/**
|
|
82
|
+
* The single physical writer (queries/deliveries.updateDeliveryStatus). Param
|
|
83
|
+
* order mirrors the real writer: (id, status, stageId, gateState,
|
|
84
|
+
* completionArtifacts, transition). Revival passes null gateState +
|
|
85
|
+
* completionArtifacts (clearing the block's gate_state on the way out).
|
|
86
|
+
*/
|
|
87
|
+
updateDeliveryStatus(deliveryId: string, status: string, stageId: string | null | undefined, gateState: unknown, completionArtifacts: unknown, transition: {
|
|
88
|
+
organizationId: string;
|
|
89
|
+
fromStatus: string;
|
|
90
|
+
}): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Close out the transition block this revival acted on (stamps decided_at +
|
|
93
|
+
* decision_path, decided_by stays NULL). Called ONLY on a successful revival
|
|
94
|
+
* that read an open block row; a derived-forward revival (no block row) has
|
|
95
|
+
* nothing to close. Best-effort: a failure is logged, never blocks the
|
|
96
|
+
* already-decided revival.
|
|
97
|
+
*/
|
|
98
|
+
resolveTransitionBlock(blockId: string, decisionPath: string): Promise<boolean>;
|
|
99
|
+
}
|
|
100
|
+
export type PausedRevivalOutcome = 'revived' | 'held' | 'no-block';
|
|
101
|
+
/**
|
|
102
|
+
* Re-evaluate one paused delivery's blocking guard and, if it has cleared,
|
|
103
|
+
* traverse it out of paused via the single-writer reconciler. Returns the
|
|
104
|
+
* outcome for sweep accounting. Never throws for an expected I/O failure -- a
|
|
105
|
+
* guard-reeval failure holds the delivery (safe: stays paused) rather than
|
|
106
|
+
* risking a wrong revival.
|
|
107
|
+
*/
|
|
108
|
+
export declare function reconcilePausedDelivery(delivery: PausedDeliveryInfo, organizationId: string, deps: PausedRevivalDeps): Promise<PausedRevivalOutcome>;
|
|
109
|
+
/** Sweep deps: per-delivery deps plus the focus/delivery fetchers. */
|
|
110
|
+
export interface PausedRevivalSweepDeps extends PausedRevivalDeps {
|
|
111
|
+
getActiveFocuses(organizationId: string, productId: string): Promise<Array<{
|
|
112
|
+
focus_id: string;
|
|
113
|
+
}>>;
|
|
114
|
+
getFocusDeliveries(focusId: string): Promise<PausedDeliveryInfo[]>;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Sweep every active focus's paused deliveries and revive the ones whose
|
|
118
|
+
* blocking guard has cleared. Runs on TEAMLESS focuses too (a paused delivery
|
|
119
|
+
* wedges the queue so no team spawns) -- hence it iterates active focuses, not
|
|
120
|
+
* activeTeams. Best-effort per focus/delivery: one failure never aborts the
|
|
121
|
+
* sweep.
|
|
122
|
+
*/
|
|
123
|
+
export declare function checkPausedDeliveriesForRevival(config: {
|
|
124
|
+
organizationId: string;
|
|
125
|
+
productId: string;
|
|
126
|
+
}, deps: PausedRevivalSweepDeps): Promise<{
|
|
127
|
+
revived: number;
|
|
128
|
+
held: number;
|
|
129
|
+
noBlock: number;
|
|
130
|
+
}>;
|
|
131
|
+
/**
|
|
132
|
+
* Wire the real query + guard functions into a sweep-deps object for the
|
|
133
|
+
* listener. Kept as thin adapters (not direct assignments) so the wide,
|
|
134
|
+
* strictly-typed writer/query signatures reduce to this consumer's narrow seam.
|
|
135
|
+
* `reEvaluateGuardBlocked` is PURE measurement: evaluateGuardsAtTransition
|
|
136
|
+
* fetches guards + builds context and returns a verdict; it does NOT write the
|
|
137
|
+
* delivery's execution_status (that stays the reconciler's job here).
|
|
138
|
+
*/
|
|
139
|
+
export declare function buildDefaultPausedRevivalDeps(): PausedRevivalSweepDeps;
|
|
140
|
+
//# sourceMappingURL=paused-revival.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paused-revival.d.ts","sourceRoot":"","sources":["../../src/delivery/paused-revival.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAgBH,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAwBD,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACnG;;;;;;OAMG;IACH,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClH;;;;OAIG;IACH,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3G,6FAA6F;IAC7F,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpF;;;;;OAKG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,SAAS,EAAE,OAAO,EAClB,mBAAmB,EAAE,OAAO,EAC5B,UAAU,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;;OAMG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjF;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnE;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,kBAAkB,EAC5B,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,oBAAoB,CAAC,CAwE/B;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAClG,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CACpE;AAED;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,MAAM,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACrD,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAwC7D;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,IAAI,sBAAsB,CA4CtE"}
|