@telora/daemon 0.22.85 → 0.22.91
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 +4 -3
- package/dist/backends/index.d.ts +1 -1
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/index.js +1 -1
- package/dist/backends/index.js.map +1 -1
- package/dist/backends/resolve.d.ts +37 -8
- package/dist/backends/resolve.d.ts.map +1 -1
- package/dist/backends/resolve.js +62 -28
- package/dist/backends/resolve.js.map +1 -1
- package/dist/ci/ci-escalation.d.ts +17 -1
- package/dist/ci/ci-escalation.d.ts.map +1 -1
- package/dist/ci/ci-escalation.js +51 -3
- package/dist/ci/ci-escalation.js.map +1 -1
- package/dist/ci/ci-red-attribution.d.ts +85 -0
- package/dist/ci/ci-red-attribution.d.ts.map +1 -0
- package/dist/ci/ci-red-attribution.js +108 -0
- package/dist/ci/ci-red-attribution.js.map +1 -0
- package/dist/ci/ci-sensor-loop.d.ts +84 -80
- package/dist/ci/ci-sensor-loop.d.ts.map +1 -1
- package/dist/ci/ci-sensor-loop.js +132 -129
- package/dist/ci/ci-sensor-loop.js.map +1 -1
- package/dist/cli/connect/config-write.d.ts +7 -4
- package/dist/cli/connect/config-write.d.ts.map +1 -1
- package/dist/cli/connect/config-write.js +13 -7
- package/dist/cli/connect/config-write.js.map +1 -1
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +11 -1
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/update-commands.d.ts.map +1 -1
- package/dist/cli/update-commands.js +2 -1
- package/dist/cli/update-commands.js.map +1 -1
- package/dist/completion/coverage-stabilized.d.ts.map +1 -1
- package/dist/completion/coverage-stabilized.js +1 -1
- package/dist/completion/coverage-stabilized.js.map +1 -1
- package/dist/completion/escalations.d.ts +40 -5
- package/dist/completion/escalations.d.ts.map +1 -1
- package/dist/completion/escalations.js +19 -11
- package/dist/completion/escalations.js.map +1 -1
- package/dist/completion/event-escalations.d.ts +12 -1
- package/dist/completion/event-escalations.d.ts.map +1 -1
- package/dist/completion/event-escalations.js +73 -37
- package/dist/completion/event-escalations.js.map +1 -1
- package/dist/completion/event.d.ts +4 -1
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +1 -1
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/human-only-act.d.ts +1 -1
- package/dist/completion/human-only-act.js +1 -1
- package/dist/completion/machine-remediable-demotion.d.ts +28 -1
- package/dist/completion/machine-remediable-demotion.d.ts.map +1 -1
- package/dist/completion/machine-remediable-demotion.js +9 -6
- package/dist/completion/machine-remediable-demotion.js.map +1 -1
- package/dist/completion/read-only-pristine.d.ts.map +1 -1
- package/dist/completion/read-only-pristine.js +4 -0
- package/dist/completion/read-only-pristine.js.map +1 -1
- package/dist/completion/review-exit-deps.js +1 -1
- package/dist/completion/review-exit-deps.js.map +1 -1
- package/dist/completion/review-exit-escalations.d.ts +10 -0
- package/dist/completion/review-exit-escalations.d.ts.map +1 -1
- package/dist/completion/review-exit-escalations.js +38 -3
- package/dist/completion/review-exit-escalations.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +8 -7
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/review-exit-shortfall.d.ts +5 -1
- package/dist/completion/review-exit-shortfall.d.ts.map +1 -1
- package/dist/completion/review-exit-shortfall.js +8 -3
- package/dist/completion/review-exit-shortfall.js.map +1 -1
- package/dist/completion/status-advance-phase.d.ts +2 -0
- package/dist/completion/status-advance-phase.d.ts.map +1 -1
- package/dist/completion/status-advance-phase.js +2 -1
- package/dist/completion/status-advance-phase.js.map +1 -1
- package/dist/completion/terminated-work-reconcile.js +2 -2
- package/dist/completion/terminated-work-reconcile.js.map +1 -1
- package/dist/delivery/delivery-advance-block.d.ts +3 -3
- package/dist/delivery/delivery-advance-block.d.ts.map +1 -1
- package/dist/delivery/delivery-advance-block.js +13 -8
- package/dist/delivery/delivery-advance-block.js.map +1 -1
- package/dist/delivery/delivery-lifecycle.d.ts +10 -0
- package/dist/delivery/delivery-lifecycle.d.ts.map +1 -1
- package/dist/delivery/delivery-lifecycle.js +12 -6
- package/dist/delivery/delivery-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-merge-ops.d.ts.map +1 -1
- package/dist/delivery/delivery-merge-ops.js +39 -21
- package/dist/delivery/delivery-merge-ops.js.map +1 -1
- package/dist/delivery/external-hold.d.ts +8 -2
- package/dist/delivery/external-hold.d.ts.map +1 -1
- package/dist/delivery/external-hold.js +12 -5
- package/dist/delivery/external-hold.js.map +1 -1
- package/dist/delivery/operator-hold.d.ts +6 -1
- package/dist/delivery/operator-hold.d.ts.map +1 -1
- package/dist/delivery/operator-hold.js +31 -10
- package/dist/delivery/operator-hold.js.map +1 -1
- package/dist/delivery/paused-revival.d.ts +6 -0
- package/dist/delivery/paused-revival.d.ts.map +1 -1
- package/dist/delivery/paused-revival.js +3 -1
- package/dist/delivery/paused-revival.js.map +1 -1
- package/dist/directive/directive-dispatch.d.ts.map +1 -1
- package/dist/directive/directive-dispatch.js +6 -3
- package/dist/directive/directive-dispatch.js.map +1 -1
- package/dist/directive/directive-queue.d.ts.map +1 -1
- package/dist/directive/directive-queue.js +4 -1
- package/dist/directive/directive-queue.js.map +1 -1
- package/dist/drift/staleness-sensor.d.ts +20 -0
- package/dist/drift/staleness-sensor.d.ts.map +1 -1
- package/dist/drift/staleness-sensor.js +54 -21
- package/dist/drift/staleness-sensor.js.map +1 -1
- package/dist/drift/staleness.d.ts +18 -5
- package/dist/drift/staleness.d.ts.map +1 -1
- package/dist/drift/staleness.js +28 -15
- package/dist/drift/staleness.js.map +1 -1
- package/dist/focus/focus-executor.d.ts.map +1 -1
- package/dist/focus/focus-executor.js +6 -8
- 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 +23 -13
- 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 +21 -4
- package/dist/focus/focus-respawn-guard.js.map +1 -1
- package/dist/focus/listener-auto-advance.d.ts.map +1 -1
- package/dist/focus/listener-auto-advance.js +10 -6
- package/dist/focus/listener-auto-advance.js.map +1 -1
- package/dist/focus/verify-open-issues.d.ts.map +1 -1
- package/dist/focus/verify-open-issues.js +21 -1
- package/dist/focus/verify-open-issues.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +35 -14
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/loops/index.d.ts.map +1 -1
- package/dist/loops/index.js +2 -1
- package/dist/loops/index.js.map +1 -1
- package/dist/merge/focus-merge.d.ts +1 -1
- package/dist/merge/focus-merge.d.ts.map +1 -1
- package/dist/merge/focus-merge.js +5 -1
- package/dist/merge/focus-merge.js.map +1 -1
- package/dist/merge/merge-back-loop.d.ts +2 -1
- package/dist/merge/merge-back-loop.d.ts.map +1 -1
- package/dist/merge/merge-back-loop.js +15 -12
- package/dist/merge/merge-back-loop.js.map +1 -1
- package/dist/merge/merge-conflict-escalation.d.ts.map +1 -1
- package/dist/merge/merge-conflict-escalation.js +4 -0
- package/dist/merge/merge-conflict-escalation.js.map +1 -1
- package/dist/nexus/return.d.ts +14 -15
- package/dist/nexus/return.d.ts.map +1 -1
- package/dist/nexus/return.js +41 -31
- package/dist/nexus/return.js.map +1 -1
- package/dist/prompt-sections/execution-sections.d.ts +13 -5
- package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
- package/dist/prompt-sections/execution-sections.js +78 -18
- package/dist/prompt-sections/execution-sections.js.map +1 -1
- package/dist/prompt-sections/routing-decider-sections.d.ts +60 -0
- package/dist/prompt-sections/routing-decider-sections.d.ts.map +1 -0
- package/dist/prompt-sections/routing-decider-sections.js +197 -0
- package/dist/prompt-sections/routing-decider-sections.js.map +1 -0
- package/dist/queries/agent-resolvable-aging.d.ts +4 -3
- package/dist/queries/agent-resolvable-aging.d.ts.map +1 -1
- package/dist/queries/agent-resolvable-aging.js +5 -4
- package/dist/queries/agent-resolvable-aging.js.map +1 -1
- package/dist/queries/agent-resolvable-promotion.d.ts +172 -124
- package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -1
- package/dist/queries/agent-resolvable-promotion.js +332 -307
- package/dist/queries/agent-resolvable-promotion.js.map +1 -1
- package/dist/queries/agent-resolvable-retirement.d.ts +105 -0
- package/dist/queries/agent-resolvable-retirement.d.ts.map +1 -0
- package/dist/queries/agent-resolvable-retirement.js +227 -0
- package/dist/queries/agent-resolvable-retirement.js.map +1 -0
- package/dist/queries/cause-key.d.ts +109 -0
- package/dist/queries/cause-key.d.ts.map +1 -1
- package/dist/queries/cause-key.js +93 -1
- package/dist/queries/cause-key.js.map +1 -1
- package/dist/queries/deliveries.d.ts +14 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +20 -2
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/delivery-gate-state.d.ts +130 -5
- package/dist/queries/delivery-gate-state.d.ts.map +1 -1
- package/dist/queries/delivery-gate-state.js +111 -2
- package/dist/queries/delivery-gate-state.js.map +1 -1
- package/dist/queries/escalation-consumption.d.ts +95 -15
- package/dist/queries/escalation-consumption.d.ts.map +1 -1
- package/dist/queries/escalation-consumption.js +162 -24
- package/dist/queries/escalation-consumption.js.map +1 -1
- package/dist/queries/escalation-dispositions.d.ts +19 -7
- package/dist/queries/escalation-dispositions.d.ts.map +1 -1
- package/dist/queries/escalation-dispositions.js +7 -0
- package/dist/queries/escalation-dispositions.js.map +1 -1
- package/dist/queries/escalation-suppression.d.ts +63 -19
- package/dist/queries/escalation-suppression.d.ts.map +1 -1
- package/dist/queries/escalation-suppression.js +64 -35
- package/dist/queries/escalation-suppression.js.map +1 -1
- package/dist/queries/escalations.d.ts +127 -70
- package/dist/queries/escalations.d.ts.map +1 -1
- package/dist/queries/escalations.js +170 -188
- package/dist/queries/escalations.js.map +1 -1
- package/dist/queries/filing-observation.d.ts +82 -0
- package/dist/queries/filing-observation.d.ts.map +1 -0
- package/dist/queries/filing-observation.js +157 -0
- package/dist/queries/filing-observation.js.map +1 -0
- package/dist/queries/holds.d.ts +69 -2
- package/dist/queries/holds.d.ts.map +1 -1
- package/dist/queries/holds.js +106 -11
- package/dist/queries/holds.js.map +1 -1
- package/dist/queries/incident-correlation.d.ts +291 -0
- package/dist/queries/incident-correlation.d.ts.map +1 -0
- package/dist/queries/incident-correlation.js +408 -0
- package/dist/queries/incident-correlation.js.map +1 -0
- package/dist/queries/routing-measurement.d.ts +48 -1
- package/dist/queries/routing-measurement.d.ts.map +1 -1
- package/dist/queries/routing-measurement.js +64 -2
- package/dist/queries/routing-measurement.js.map +1 -1
- package/dist/queries/routing-quality.d.ts +8 -0
- package/dist/queries/routing-quality.d.ts.map +1 -1
- package/dist/queries/routing-quality.js +12 -3
- package/dist/queries/routing-quality.js.map +1 -1
- package/dist/queries/shared.js +1 -1
- package/dist/shell/crash-recovery.d.ts.map +1 -1
- package/dist/shell/crash-recovery.js +6 -6
- package/dist/shell/crash-recovery.js.map +1 -1
- package/dist/shell/heartbeat-metadata.d.ts +18 -0
- package/dist/shell/heartbeat-metadata.d.ts.map +1 -1
- package/dist/shell/heartbeat-metadata.js +24 -0
- package/dist/shell/heartbeat-metadata.js.map +1 -1
- package/dist/shell/heartbeat.d.ts.map +1 -1
- package/dist/shell/heartbeat.js +6 -17
- package/dist/shell/heartbeat.js.map +1 -1
- package/dist/shell/install-probe-tick.d.ts.map +1 -1
- package/dist/shell/install-probe-tick.js +3 -1
- package/dist/shell/install-probe-tick.js.map +1 -1
- package/dist/shell/model-resolution.d.ts +9 -4
- package/dist/shell/model-resolution.d.ts.map +1 -1
- package/dist/shell/model-resolution.js +46 -7
- package/dist/shell/model-resolution.js.map +1 -1
- package/dist/shell/unified-init.d.ts +24 -0
- package/dist/shell/unified-init.d.ts.map +1 -1
- package/dist/shell/unified-init.js +22 -17
- package/dist/shell/unified-init.js.map +1 -1
- package/dist/spawn/model-id-guards.d.ts +50 -0
- package/dist/spawn/model-id-guards.d.ts.map +1 -0
- package/dist/spawn/model-id-guards.js +110 -0
- package/dist/spawn/model-id-guards.js.map +1 -0
- package/dist/spawn/model-routing.d.ts +1 -43
- package/dist/spawn/model-routing.d.ts.map +1 -1
- package/dist/spawn/model-routing.js +3 -94
- package/dist/spawn/model-routing.js.map +1 -1
- package/dist/spawn/respawn-cycle-escalation.d.ts +10 -2
- package/dist/spawn/respawn-cycle-escalation.d.ts.map +1 -1
- package/dist/spawn/respawn-cycle-escalation.js +16 -2
- package/dist/spawn/respawn-cycle-escalation.js.map +1 -1
- package/dist/spawn/routing-decider-spawn.d.ts +93 -0
- package/dist/spawn/routing-decider-spawn.d.ts.map +1 -0
- package/dist/spawn/routing-decider-spawn.js +185 -0
- package/dist/spawn/routing-decider-spawn.js.map +1 -0
- package/dist/spawn/routing-decider.d.ts +42 -0
- package/dist/spawn/routing-decider.d.ts.map +1 -0
- package/dist/spawn/routing-decider.js +95 -0
- package/dist/spawn/routing-decider.js.map +1 -0
- package/dist/spawn/shared.d.ts +8 -0
- package/dist/spawn/shared.d.ts.map +1 -1
- package/dist/spawn/shared.js +1 -1
- package/dist/spawn/shared.js.map +1 -1
- package/dist/spawn/spawn-decision.d.ts +24 -16
- package/dist/spawn/spawn-decision.d.ts.map +1 -1
- package/dist/spawn/spawn-decision.js +28 -11
- package/dist/spawn/spawn-decision.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts +23 -7
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +54 -22
- package/dist/spawn/worktree-session.js.map +1 -1
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/update/auto-update.d.ts +20 -3
- package/dist/update/auto-update.d.ts.map +1 -1
- package/dist/update/auto-update.js +8 -24
- package/dist/update/auto-update.js.map +1 -1
- package/dist/update/self-update.d.ts +43 -4
- package/dist/update/self-update.d.ts.map +1 -1
- package/dist/update/self-update.js +61 -38
- package/dist/update/self-update.js.map +1 -1
- package/dist/update/version-check.d.ts +29 -45
- package/dist/update/version-check.d.ts.map +1 -1
- package/dist/update/version-check.js +48 -79
- package/dist/update/version-check.js.map +1 -1
- package/dist/verify/failure-signature.d.ts +91 -0
- package/dist/verify/failure-signature.d.ts.map +1 -0
- package/dist/verify/failure-signature.js +233 -0
- package/dist/verify/failure-signature.js.map +1 -0
- package/dist/verify/shortfall-repeat.d.ts +12 -9
- package/dist/verify/shortfall-repeat.d.ts.map +1 -1
- package/dist/verify/shortfall-repeat.js +38 -14
- package/dist/verify/shortfall-repeat.js.map +1 -1
- package/dist/verify/stall-detectors.d.ts +19 -43
- package/dist/verify/stall-detectors.d.ts.map +1 -1
- package/dist/verify/stall-detectors.js +26 -101
- package/dist/verify/stall-detectors.js.map +1 -1
- package/dist/verify/unreviewed-settle-detector.d.ts +8 -0
- package/dist/verify/unreviewed-settle-detector.d.ts.map +1 -1
- package/dist/verify/unreviewed-settle-detector.js +15 -1
- package/dist/verify/unreviewed-settle-detector.js.map +1 -1
- package/dist/verify/verification-deps-default.d.ts.map +1 -1
- package/dist/verify/verification-deps-default.js +14 -2
- package/dist/verify/verification-deps-default.js.map +1 -1
- package/dist/verify/verification-evidence-unavailable-feedback.d.ts.map +1 -1
- package/dist/verify/verification-evidence-unavailable-feedback.js +8 -2
- package/dist/verify/verification-evidence-unavailable-feedback.js.map +1 -1
- package/dist/verify/verification-feedback.d.ts +62 -14
- package/dist/verify/verification-feedback.d.ts.map +1 -1
- package/dist/verify/verification-feedback.js +101 -28
- package/dist/verify/verification-feedback.js.map +1 -1
- package/dist/verify/verify-gate-stall.d.ts +116 -0
- package/dist/verify/verify-gate-stall.d.ts.map +1 -0
- package/dist/verify/verify-gate-stall.js +169 -0
- package/dist/verify/verify-gate-stall.js.map +1 -0
- package/dist/verify/verify-restatement.d.ts.map +1 -1
- package/dist/verify/verify-restatement.js +2 -1
- package/dist/verify/verify-restatement.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,106 +1,74 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
2
|
// Pinned by: packages/daemon/src/drift/staleness-signal.test.ts,
|
|
3
|
-
// packages/daemon/src/update/version-check.test.ts
|
|
3
|
+
// packages/daemon/src/shell/heartbeat-version-lag.test.ts, packages/daemon/src/update/version-check.test.ts
|
|
4
4
|
// PINNED-BY-END
|
|
5
5
|
/**
|
|
6
|
-
* Non-blocking npm registry version check
|
|
6
|
+
* Non-blocking npm registry version check, and the daemon's declared update
|
|
7
|
+
* channel.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* The daemon updates from ONE channel: the public npmjs registry infra
|
|
10
|
+
* publishes releases to, overridable only by TELORA_REGISTRY_URL. The version
|
|
11
|
+
* check reads that channel, every install pins the @telora scope to it, and the
|
|
12
|
+
* staleness sensor / heartbeat attribute readings to it -- the host's ~/.npmrc
|
|
13
|
+
* (Gitea-scoped on the daemon hosts, for development tooling) never decides where
|
|
14
|
+
* @telora/daemon comes from.
|
|
15
|
+
*
|
|
16
|
+
* The check fails open on any error -- a registry outage never prevents startup
|
|
17
|
+
* or normal operation -- but logs a warn line so a broken update path produces a
|
|
18
|
+
* signal instead of silent rot.
|
|
12
19
|
*/
|
|
13
|
-
import {
|
|
20
|
+
import { loadEnvConfig } from '@telora/daemon-core';
|
|
14
21
|
import { createLogger } from '../shell/log.js';
|
|
15
22
|
const log = createLogger({ module: 'auto-update' });
|
|
16
23
|
const CHECK_TIMEOUT_MS = 5000;
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
const NPMJS_FALLBACK = 'https://registry.npmjs.org/';
|
|
20
|
-
/**
|
|
21
|
-
* Read a single npm config value via `npm config get <key>`.
|
|
22
|
-
*
|
|
23
|
-
* Returns a trimmed http(s) URL, or null when npm is unavailable, the key is
|
|
24
|
-
* unset (npm prints an empty line or the literal "undefined"/"null"), or the
|
|
25
|
-
* value is not an http(s) URL. Fails soft so a host without `npm` on PATH still
|
|
26
|
-
* resolves through the fallback chain rather than throwing.
|
|
27
|
-
*/
|
|
28
|
-
export function readNpmConfigValue(key) {
|
|
29
|
-
try {
|
|
30
|
-
const out = execFileSync('npm', ['config', 'get', key], {
|
|
31
|
-
encoding: 'utf-8',
|
|
32
|
-
timeout: 5000,
|
|
33
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
34
|
-
}).trim();
|
|
35
|
-
if (!out || out === 'undefined' || out === 'null')
|
|
36
|
-
return null;
|
|
37
|
-
if (!/^https?:\/\//i.test(out))
|
|
38
|
-
return null;
|
|
39
|
-
return out;
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
24
|
+
/** The public npmjs registry: the release channel infra publishes @telora/daemon to. */
|
|
25
|
+
export const NPMJS_RELEASE_REGISTRY = 'https://registry.npmjs.org/';
|
|
45
26
|
/**
|
|
46
|
-
* Resolve the
|
|
47
|
-
*
|
|
48
|
-
* `npm install -g @telora/daemon@latest`, which resolves the @telora scope from
|
|
49
|
-
* npm config (~/.npmrc -> Gitea on the daemon hosts); a check that targeted a
|
|
50
|
-
* different registry would be blind to a Gitea-only publish -- the exact failure
|
|
51
|
-
* this focus exists to close.
|
|
27
|
+
* Resolve the daemon's update channel: TELORA_REGISTRY_URL when set (trimmed; a
|
|
28
|
+
* blank value is unset), otherwise the npmjs release registry.
|
|
52
29
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
30
|
+
* npm config is deliberately NOT consulted. The daemon hosts scope @telora to the
|
|
31
|
+
* Gitea development registry in ~/.npmrc, and inheriting that made running
|
|
32
|
+
* daemons track unreleased development builds. Check and install must still
|
|
33
|
+
* agree on ONE registry (a check=npmjs / install=Gitea split once made
|
|
34
|
+
* Gitea-only publishes invisible), so both resolve through this function: the
|
|
35
|
+
* check fetches from it and every install pins `--@telora:registry=` to it
|
|
36
|
+
* ({@link scopedInstallArgs}).
|
|
60
37
|
*
|
|
61
|
-
*
|
|
38
|
+
* Read on every call (not memoized): the env can change between calls in tests,
|
|
39
|
+
* and resolution is a cheap parse with no shell-out.
|
|
62
40
|
*/
|
|
63
|
-
export function
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
return override.trim();
|
|
67
|
-
}
|
|
68
|
-
return (deps.npmConfigGet(SCOPE_REGISTRY_KEY) ??
|
|
69
|
-
deps.npmConfigGet(DEFAULT_REGISTRY_KEY) ??
|
|
70
|
-
NPMJS_FALLBACK);
|
|
41
|
+
export function resolveUpdateChannelUrl(env = process.env) {
|
|
42
|
+
const configured = loadEnvConfig(env).TELORA_REGISTRY_URL.trim();
|
|
43
|
+
return configured.length > 0 ? configured : NPMJS_RELEASE_REGISTRY;
|
|
71
44
|
}
|
|
72
45
|
/**
|
|
73
|
-
* The
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* an operator who points the check elsewhere (override) has not changed where
|
|
78
|
-
* an install lands, so a reading from the override registry cannot certify the
|
|
79
|
-
* installed version is current.
|
|
46
|
+
* The npm argv that installs `target` from `channel`, pinning ONLY the @telora
|
|
47
|
+
* scope (`--@telora:registry=<channel>`). Never a global `--registry`: that would
|
|
48
|
+
* send every non-@telora dependency to the channel host too, and against a wrong
|
|
49
|
+
* host/port npm hangs in SYN-SENT with no output.
|
|
80
50
|
*/
|
|
81
|
-
export function
|
|
82
|
-
return
|
|
51
|
+
export function scopedInstallArgs(target, channel) {
|
|
52
|
+
return ['install', '-g', `--@telora:registry=${channel}`, target];
|
|
53
|
+
}
|
|
54
|
+
/** The same install as {@link scopedInstallArgs}, rendered as a command a human can run. */
|
|
55
|
+
export function scopedInstallCommand(target, channel) {
|
|
56
|
+
return ['npm', ...scopedInstallArgs(target, channel)].join(' ');
|
|
83
57
|
}
|
|
84
58
|
function normalizeRegistry(url) {
|
|
85
59
|
return url.trim().replace(/\/+$/, '').toLowerCase();
|
|
86
60
|
}
|
|
87
61
|
/**
|
|
88
62
|
* True when a reading taken from `readingRegistry` can be ATTRIBUTED to the
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
63
|
+
* update channel (`channelRegistry`) -- only then does the agreement/lag it
|
|
64
|
+
* reports count. A null/absent reading registry (legacy cache, unstamped) is
|
|
65
|
+
* unattributable, and so is a reading from any other registry (e.g. a cache
|
|
66
|
+
* stamped with the Gitea URL). Trailing-slash / case insensitive.
|
|
93
67
|
*/
|
|
94
|
-
export function isReadingAttributable(readingRegistry,
|
|
68
|
+
export function isReadingAttributable(readingRegistry, channelRegistry) {
|
|
95
69
|
if (!readingRegistry)
|
|
96
70
|
return false;
|
|
97
|
-
return normalizeRegistry(readingRegistry) === normalizeRegistry(
|
|
98
|
-
}
|
|
99
|
-
function getRegistryUrl() {
|
|
100
|
-
// Read the LIVE environment + npm config on every call (the update check can
|
|
101
|
-
// run long after startup, and tests mutate the env between calls) rather than
|
|
102
|
-
// a memoized startup snapshot.
|
|
103
|
-
return resolveRegistryUrl({ env: process.env, npmConfigGet: readNpmConfigValue });
|
|
71
|
+
return normalizeRegistry(readingRegistry) === normalizeRegistry(channelRegistry);
|
|
104
72
|
}
|
|
105
73
|
/**
|
|
106
74
|
* Parse a semver string's numeric major.minor.patch core, ignoring any
|
|
@@ -166,8 +134,9 @@ export function versionDistance(running, newest) {
|
|
|
166
134
|
* resolved registry URL so a broken update path is observable in the daemon log.
|
|
167
135
|
*/
|
|
168
136
|
export async function checkForUpdates(currentVersion, packageName = '@telora/daemon') {
|
|
169
|
-
|
|
137
|
+
let registryUrl = '(unresolved update channel)';
|
|
170
138
|
try {
|
|
139
|
+
registryUrl = resolveUpdateChannelUrl();
|
|
171
140
|
const base = registryUrl.endsWith('/') ? registryUrl : registryUrl + '/';
|
|
172
141
|
// Scoped package names use URL-encoded slash in the npm protocol
|
|
173
142
|
const encodedName = packageName.replace('/', '%2F');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/update/version-check.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,iEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/update/version-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type VerificationSignatureRun } from '../queries/delivery-gate-state.js';
|
|
2
|
+
/** Stage label when failing tests were parsed but no npm script header names a stage. */
|
|
3
|
+
export declare const UNNAMED_STAGE_LABEL = "failing-tests";
|
|
4
|
+
/**
|
|
5
|
+
* Normalize ONE output line so two runs of the same failure compare equal:
|
|
6
|
+
* strips ANSI, replaces the run's cwd, uuids, ISO timestamps, clock times, tmp
|
|
7
|
+
* paths, hex shas and durations with placeholders, then every remaining digit run
|
|
8
|
+
* with '#' (line counts, over-by deltas, pids, versions), collapsing whitespace.
|
|
9
|
+
* Pure -- exported for direct testing.
|
|
10
|
+
*/
|
|
11
|
+
export declare function normalizeVolatileDetail(line: string, cwd?: string | null): string;
|
|
12
|
+
/** Where the failing stage's own output begins, and the stage's label. */
|
|
13
|
+
export interface FailingStage {
|
|
14
|
+
/** "<package> <script>" with the version stripped (volatile across deliveries). */
|
|
15
|
+
label: string;
|
|
16
|
+
/** Index of the first line after the failing stage's header. */
|
|
17
|
+
detailStart: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Locate the failing npm script in a gate log (see the module doc for why the
|
|
21
|
+
* LAST header names it). Null when the log carries no npm script header at all.
|
|
22
|
+
* Pure -- exported for direct testing.
|
|
23
|
+
*/
|
|
24
|
+
export declare function locateFailingStage(lines: readonly string[]): FailingStage | null;
|
|
25
|
+
export interface FailureSignatureInput {
|
|
26
|
+
/** The run's output: the full verification log when available, else the captured tails. */
|
|
27
|
+
logText: string;
|
|
28
|
+
/** Failing-test ids that GATE the rejection (baseline-attributed new failures, or all parsed). */
|
|
29
|
+
failingTests?: readonly string[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Derive the failure signature "<stage>#<hash>" of a rejected verify run.
|
|
33
|
+
*
|
|
34
|
+
* The hash covers the failing stage's normalized detail: the gating failing-test
|
|
35
|
+
* ids when there are any (so a test stage is keyed on WHICH tests fail, not on
|
|
36
|
+
* the ok-lines of whatever tests the targeted selector picked), otherwise the
|
|
37
|
+
* stage's own output lines. Detail lines are normalized (normalizeVolatileDetail),
|
|
38
|
+
* de-duplicated and sorted, so volatile values and interleaving order never make
|
|
39
|
+
* one failure look like two. A different stage -- or the same stage failing on a
|
|
40
|
+
* different file, function, claim or test -- yields a different signature.
|
|
41
|
+
*
|
|
42
|
+
* Null when underivable: an empty log, or one with neither an npm script header
|
|
43
|
+
* nor a parseable failing test. Pure -- no I/O.
|
|
44
|
+
*/
|
|
45
|
+
export declare function deriveFailureSignature(input: FailureSignatureInput): string | null;
|
|
46
|
+
/**
|
|
47
|
+
* Advance the run-length record by one rejection. A signature equal to the prior
|
|
48
|
+
* run's increments `consecutive`; a different one resets it to 1; a null
|
|
49
|
+
* (underivable) signature records 0 -- an unknown failure never counts as a
|
|
50
|
+
* repeat, and the next known signature starts a fresh run. Bounded by
|
|
51
|
+
* construction: one current + one previous signature, never a history. Pure.
|
|
52
|
+
*/
|
|
53
|
+
export declare function advanceSignatureRun(prior: VerificationSignatureRun | null, signature: string | null): VerificationSignatureRun;
|
|
54
|
+
/**
|
|
55
|
+
* The signature run recorded on a delivery's LATEST deterministic rejection
|
|
56
|
+
* (gate_state.verification), or null when none is usable: no verification
|
|
57
|
+
* detail (a guard-only, shortfall or evidence-unavailable gate_state), a legacy
|
|
58
|
+
* row written before signatures existed, or an underivable (null) signature.
|
|
59
|
+
* The stall detector falls back to the iteration cap on null. Pure.
|
|
60
|
+
*/
|
|
61
|
+
export declare function readRecordedSignatureRun(gateState: unknown): {
|
|
62
|
+
signature: string;
|
|
63
|
+
consecutive: number;
|
|
64
|
+
} | null;
|
|
65
|
+
/** The slice of a verify StrategyResult the signature reads its text from. */
|
|
66
|
+
export interface VerificationLogSource {
|
|
67
|
+
logPath?: string;
|
|
68
|
+
stdoutTail?: string;
|
|
69
|
+
stderrTail?: string;
|
|
70
|
+
}
|
|
71
|
+
/** The full verification log when it exists on disk, else the captured tails. */
|
|
72
|
+
export declare function readVerificationLogText(source: VerificationLogSource): string;
|
|
73
|
+
/** Injected I/O for stamping a signature onto a rejection; the default reads the real log. */
|
|
74
|
+
export interface FailureSignatureDeps {
|
|
75
|
+
readLogText: (source: VerificationLogSource) => string;
|
|
76
|
+
}
|
|
77
|
+
export declare const defaultFailureSignatureDeps: () => FailureSignatureDeps;
|
|
78
|
+
/**
|
|
79
|
+
* Compute the signature fields a rejection's gate_state.verification carries.
|
|
80
|
+
* The run extends the one recorded on the delivery's PRIOR gate_state, whether
|
|
81
|
+
* live or carried forward across the coding -> verify advance
|
|
82
|
+
* (readVerificationHistory). Best-effort: an unreadable log yields a null
|
|
83
|
+
* signature, so consecutive is 0 and the detector falls back to the iteration
|
|
84
|
+
* cap. A prior gate_state with no usable run counts as none. A signature fault
|
|
85
|
+
* must never block the rejection write.
|
|
86
|
+
*/
|
|
87
|
+
export declare function computeFailureSignatureRecord(deliveryId: string, source: VerificationLogSource, failingTests: readonly string[], priorGateState: unknown, deps: FailureSignatureDeps): {
|
|
88
|
+
failureSignature: string | null;
|
|
89
|
+
signatureRun: VerificationSignatureRun;
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=failure-signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-signature.d.ts","sourceRoot":"","sources":["../../src/verify/failure-signature.ts"],"names":[],"mappings":"AAoDA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,mCAAmC,CAAC;AAK3C,yFAAyF;AACzF,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AAyBnD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CAavF;AAED,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CAoBhF;AAED,MAAM,WAAW,qBAAqB;IACpC,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,kGAAkG;IAClG,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI,CAkBlF;AAMD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAAG,IAAI,EACtC,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,wBAAwB,CAO1B;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS9G;AAMD,8EAA8E;AAC9E,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAS7E;AAED,8FAA8F;AAC9F,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,MAAM,CAAC;CACxD;AAED,eAAO,MAAM,2BAA2B,QAAO,oBAE7C,CAAC;AAEH;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,qBAAqB,EAC7B,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,cAAc,EAAE,OAAO,EACvB,IAAI,EAAE,oBAAoB,GACzB;IAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,wBAAwB,CAAA;CAAE,CAS7E"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/integration/verification-history-round-trip.test.ts,
|
|
3
|
+
// packages/daemon/src/verify/failure-signature.test.ts, packages/daemon/src/verify/stall-detectors.test.ts,
|
|
4
|
+
// packages/daemon/src/verify/verification-feedback.test.ts
|
|
5
|
+
// PINNED-BY-END
|
|
6
|
+
/**
|
|
7
|
+
* Failure SIGNATURE of a rejected deterministic verify run, and the run-length
|
|
8
|
+
* record that tells a delivery failing IDENTICALLY from one CONVERGING.
|
|
9
|
+
*
|
|
10
|
+
* iteration_count counts rejections; it cannot say whether they were the SAME
|
|
11
|
+
* rejection. Delivery e8e8fa15 (2026-09-11) ran 16 cycles through verify:gate and
|
|
12
|
+
* failed a DIFFERENT stage each time -- types drift, then daemon-file-size, then
|
|
13
|
+
* daemon-function-size, then lint:counted-claims -- every fix correct, each one
|
|
14
|
+
* uncovering the next gate. A count-keyed stall detector read that as "will not
|
|
15
|
+
* converge". A signature is the discriminator: which stage failed and what it
|
|
16
|
+
* said, with the detail that varies between two runs of the SAME failure
|
|
17
|
+
* (timestamps, durations, line and over-by counts, tmp paths, pids, shas, the
|
|
18
|
+
* package version in npm's script header) normalized away.
|
|
19
|
+
*
|
|
20
|
+
* Three parts:
|
|
21
|
+
* 1. deriveFailureSignature -- PURE: log text (+ the gating failing-test ids)
|
|
22
|
+
* -> "<stage>#<detail-hash>", or null when underivable.
|
|
23
|
+
* 2. advanceSignatureRun -- PURE: prior run + this signature -> the bounded
|
|
24
|
+
* run-length record (reset on change, +1 on repeat; a null signature never
|
|
25
|
+
* counts as a repeat).
|
|
26
|
+
* 3. The PRIOR run's home: gate_state, and nothing else. The rejection stamps
|
|
27
|
+
* the run on gate_state.verification. The stall detector reads it there,
|
|
28
|
+
* from the delivery row it already has. Between two rejections the delivery
|
|
29
|
+
* walks verify_failed -> queued -> coding -> verify, and every writer that
|
|
30
|
+
* clears or replaces the gate on the way (above all the guard-pass coding ->
|
|
31
|
+
* verify advance) carries the run forward under
|
|
32
|
+
* gate_state.verificationHistory (queries/delivery-gate-state.ts
|
|
33
|
+
* carryVerificationHistory). The next rejection reads it back off its prior
|
|
34
|
+
* gate_state (computeFailureSignatureRecord). A verify pass resets it
|
|
35
|
+
* (clearVerificationHistory).
|
|
36
|
+
*
|
|
37
|
+
* Stage location: npm 10 prints NO "Lifecycle script failed" line for a nested
|
|
38
|
+
* npm-run failure, only the "> <pkg>@<version> <script>" header of every script
|
|
39
|
+
* it starts. verify:gate chains its stages with &&, so nothing starts after the
|
|
40
|
+
* failing script and the LAST header in the log names it. When an older npm's
|
|
41
|
+
* "Lifecycle script ... failed" line is present, its first (innermost) occurrence
|
|
42
|
+
* wins. Known imprecision: a stage that itself spawns an npm script
|
|
43
|
+
* (check:types-drift -> gen:types:ephemeral) is labelled by the nested script --
|
|
44
|
+
* stable across repeats, so the discriminator still holds.
|
|
45
|
+
*
|
|
46
|
+
* @module verify/failure-signature
|
|
47
|
+
*/
|
|
48
|
+
import { createHash } from 'node:crypto';
|
|
49
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
50
|
+
import { createLogger } from '../shell/log.js';
|
|
51
|
+
import { parseSignatureRun, readVerificationHistory, } from '../queries/delivery-gate-state.js';
|
|
52
|
+
import { parseFailingTests } from './verification-failure-parser.js';
|
|
53
|
+
const log = createLogger({ module: 'verification' });
|
|
54
|
+
/** Stage label when failing tests were parsed but no npm script header names a stage. */
|
|
55
|
+
export const UNNAMED_STAGE_LABEL = 'failing-tests';
|
|
56
|
+
const STAGE_LABEL_MAX_CHARS = 120;
|
|
57
|
+
const DETAIL_HASH_CHARS = 12;
|
|
58
|
+
/** ANSI CSI/SGR sequences, built from a char code so no control char sits in a regex literal. */
|
|
59
|
+
const ANSI_RE = new RegExp(`${String.fromCharCode(27)}\\[[0-9;?]*[A-Za-z]`, 'g');
|
|
60
|
+
const UUID_RE = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi;
|
|
61
|
+
const ISO_TS_RE = /\b\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(?::\d{2}(?:[.,]\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?/g;
|
|
62
|
+
const CLOCK_RE = /\b\d{1,2}:\d{2}:\d{2}(?:\.\d+)?\b/g;
|
|
63
|
+
const TMP_PATH_RE = /(?:\/private)?\/(?:tmp|var\/tmp|var\/folders)\/[^\s'"`),;]+/g;
|
|
64
|
+
/** Lowercase hex runs holding at least one letter AND one digit (git shas, hex ids). */
|
|
65
|
+
const HEX_SHA_RE = /\b(?=[0-9a-f]*[a-f])(?=[0-9a-f]*\d)[0-9a-f]{7,64}\b/g;
|
|
66
|
+
const DURATION_RE = /\b\d+(?:\.\d+)?\s?(?:ms|ns|s|secs?|seconds?|m|mins?|minutes?|h|hrs?|hours?)\b/g;
|
|
67
|
+
const DIGITS_RE = /\d+/g;
|
|
68
|
+
/** npm's per-script header: "> <name>@<version> <script>" (name may be scoped). */
|
|
69
|
+
const NPM_HEADER_RE = /^> ((?:@[^\s@/]+\/)?[^\s@]+)@\S+ (\S+)\s*$/;
|
|
70
|
+
/** npm 7-9 innermost-failure line (npm 10 omits it for nested runs). */
|
|
71
|
+
const NPM_LIFECYCLE_FAILED_RE = /^npm (?:error|ERR!) Lifecycle script `([^`]+)` failed/;
|
|
72
|
+
/** npm / gate chrome lines -- never failure detail. */
|
|
73
|
+
const CHROME_RE = /^(?:npm (?:error|ERR!|warn|WARN|notice)\b|> |TELORA_GATE_COMPLETE:)/;
|
|
74
|
+
/** The "(cwd: <path>)" line runDeterministicStrategy writes at the top of every log. */
|
|
75
|
+
const CWD_HEADER_RE = /^\(cwd: (.+)\)$/m;
|
|
76
|
+
/**
|
|
77
|
+
* Normalize ONE output line so two runs of the same failure compare equal:
|
|
78
|
+
* strips ANSI, replaces the run's cwd, uuids, ISO timestamps, clock times, tmp
|
|
79
|
+
* paths, hex shas and durations with placeholders, then every remaining digit run
|
|
80
|
+
* with '#' (line counts, over-by deltas, pids, versions), collapsing whitespace.
|
|
81
|
+
* Pure -- exported for direct testing.
|
|
82
|
+
*/
|
|
83
|
+
export function normalizeVolatileDetail(line, cwd = null) {
|
|
84
|
+
let s = line.replace(ANSI_RE, '');
|
|
85
|
+
if (cwd)
|
|
86
|
+
s = s.split(cwd).join('<cwd>');
|
|
87
|
+
return s
|
|
88
|
+
.replace(UUID_RE, '<uuid>')
|
|
89
|
+
.replace(ISO_TS_RE, '<ts>')
|
|
90
|
+
.replace(CLOCK_RE, '<time>')
|
|
91
|
+
.replace(TMP_PATH_RE, '<tmp>')
|
|
92
|
+
.replace(HEX_SHA_RE, '<sha>')
|
|
93
|
+
.replace(DURATION_RE, '<dur>')
|
|
94
|
+
.replace(DIGITS_RE, '#')
|
|
95
|
+
.replace(/\s+/g, ' ')
|
|
96
|
+
.trim();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Locate the failing npm script in a gate log (see the module doc for why the
|
|
100
|
+
* LAST header names it). Null when the log carries no npm script header at all.
|
|
101
|
+
* Pure -- exported for direct testing.
|
|
102
|
+
*/
|
|
103
|
+
export function locateFailingStage(lines) {
|
|
104
|
+
const headers = [];
|
|
105
|
+
let lifecycle = null;
|
|
106
|
+
for (let index = 0; index < lines.length; index++) {
|
|
107
|
+
const line = lines[index];
|
|
108
|
+
const header = NPM_HEADER_RE.exec(line);
|
|
109
|
+
if (header)
|
|
110
|
+
headers.push({ index, name: header[1], script: header[2] });
|
|
111
|
+
const failed = lifecycle === null ? NPM_LIFECYCLE_FAILED_RE.exec(line) : null;
|
|
112
|
+
if (failed)
|
|
113
|
+
lifecycle = { script: failed[1], index };
|
|
114
|
+
}
|
|
115
|
+
const label = (name, script) => `${name} ${script}`.slice(0, STAGE_LABEL_MAX_CHARS);
|
|
116
|
+
if (lifecycle !== null) {
|
|
117
|
+
const failedAt = lifecycle;
|
|
118
|
+
const owner = headers.filter((h) => h.index < failedAt.index && h.script === failedAt.script).pop();
|
|
119
|
+
return owner
|
|
120
|
+
? { label: label(owner.name, owner.script), detailStart: owner.index + 1 }
|
|
121
|
+
: { label: failedAt.script.slice(0, STAGE_LABEL_MAX_CHARS), detailStart: 0 };
|
|
122
|
+
}
|
|
123
|
+
const last = headers[headers.length - 1];
|
|
124
|
+
return last ? { label: label(last.name, last.script), detailStart: last.index + 1 } : null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Derive the failure signature "<stage>#<hash>" of a rejected verify run.
|
|
128
|
+
*
|
|
129
|
+
* The hash covers the failing stage's normalized detail: the gating failing-test
|
|
130
|
+
* ids when there are any (so a test stage is keyed on WHICH tests fail, not on
|
|
131
|
+
* the ok-lines of whatever tests the targeted selector picked), otherwise the
|
|
132
|
+
* stage's own output lines. Detail lines are normalized (normalizeVolatileDetail),
|
|
133
|
+
* de-duplicated and sorted, so volatile values and interleaving order never make
|
|
134
|
+
* one failure look like two. A different stage -- or the same stage failing on a
|
|
135
|
+
* different file, function, claim or test -- yields a different signature.
|
|
136
|
+
*
|
|
137
|
+
* Null when underivable: an empty log, or one with neither an npm script header
|
|
138
|
+
* nor a parseable failing test. Pure -- no I/O.
|
|
139
|
+
*/
|
|
140
|
+
export function deriveFailureSignature(input) {
|
|
141
|
+
const text = typeof input.logText === 'string' ? input.logText.replace(ANSI_RE, '') : '';
|
|
142
|
+
if (text.trim().length === 0)
|
|
143
|
+
return null;
|
|
144
|
+
const cwd = CWD_HEADER_RE.exec(text)?.[1] ?? null;
|
|
145
|
+
const lines = text.split(/\r?\n/);
|
|
146
|
+
const stage = locateFailingStage(lines);
|
|
147
|
+
const segment = lines.slice(stage?.detailStart ?? 0);
|
|
148
|
+
const tests = input.failingTests && input.failingTests.length > 0
|
|
149
|
+
? [...input.failingTests]
|
|
150
|
+
: [...parseFailingTests(segment.join('\n'))];
|
|
151
|
+
if (stage === null && tests.length === 0)
|
|
152
|
+
return null;
|
|
153
|
+
const rawDetail = tests.length > 0 ? tests : segment.filter((line) => !CHROME_RE.test(line));
|
|
154
|
+
const detail = [...new Set(rawDetail.map((line) => normalizeVolatileDetail(line, cwd)).filter((line) => line.length > 0))].sort();
|
|
155
|
+
const hash = createHash('sha256').update(detail.join('\n')).digest('hex').slice(0, DETAIL_HASH_CHARS);
|
|
156
|
+
return `${stage?.label ?? UNNAMED_STAGE_LABEL}#${hash}`;
|
|
157
|
+
}
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
// Run-length record
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
/**
|
|
162
|
+
* Advance the run-length record by one rejection. A signature equal to the prior
|
|
163
|
+
* run's increments `consecutive`; a different one resets it to 1; a null
|
|
164
|
+
* (underivable) signature records 0 -- an unknown failure never counts as a
|
|
165
|
+
* repeat, and the next known signature starts a fresh run. Bounded by
|
|
166
|
+
* construction: one current + one previous signature, never a history. Pure.
|
|
167
|
+
*/
|
|
168
|
+
export function advanceSignatureRun(prior, signature) {
|
|
169
|
+
const previousSignature = prior?.signature ?? null;
|
|
170
|
+
if (signature === null)
|
|
171
|
+
return { signature: null, previousSignature, consecutive: 0 };
|
|
172
|
+
const consecutive = prior && prior.signature === signature && prior.consecutive >= 1
|
|
173
|
+
? prior.consecutive + 1
|
|
174
|
+
: 1;
|
|
175
|
+
return { signature, previousSignature, consecutive };
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The signature run recorded on a delivery's LATEST deterministic rejection
|
|
179
|
+
* (gate_state.verification), or null when none is usable: no verification
|
|
180
|
+
* detail (a guard-only, shortfall or evidence-unavailable gate_state), a legacy
|
|
181
|
+
* row written before signatures existed, or an underivable (null) signature.
|
|
182
|
+
* The stall detector falls back to the iteration cap on null. Pure.
|
|
183
|
+
*/
|
|
184
|
+
export function readRecordedSignatureRun(gateState) {
|
|
185
|
+
if (gateState == null || typeof gateState !== 'object')
|
|
186
|
+
return null;
|
|
187
|
+
const verification = gateState.verification;
|
|
188
|
+
if (verification == null || typeof verification !== 'object')
|
|
189
|
+
return null;
|
|
190
|
+
const v = verification;
|
|
191
|
+
if (typeof v.failureSignature !== 'string' || v.failureSignature.length === 0)
|
|
192
|
+
return null;
|
|
193
|
+
const run = parseSignatureRun(v.signatureRun);
|
|
194
|
+
if (!run || run.signature !== v.failureSignature || run.consecutive < 1)
|
|
195
|
+
return null;
|
|
196
|
+
return { signature: run.signature, consecutive: run.consecutive };
|
|
197
|
+
}
|
|
198
|
+
/** The full verification log when it exists on disk, else the captured tails. */
|
|
199
|
+
export function readVerificationLogText(source) {
|
|
200
|
+
if (source.logPath && existsSync(source.logPath)) {
|
|
201
|
+
try {
|
|
202
|
+
return readFileSync(source.logPath, 'utf8');
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
log.debug('verification log unreadable; using tails', { error: String(err?.message ?? err) });
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return `${source.stdoutTail ?? ''}\n${source.stderrTail ?? ''}`;
|
|
209
|
+
}
|
|
210
|
+
export const defaultFailureSignatureDeps = () => ({
|
|
211
|
+
readLogText: readVerificationLogText,
|
|
212
|
+
});
|
|
213
|
+
/**
|
|
214
|
+
* Compute the signature fields a rejection's gate_state.verification carries.
|
|
215
|
+
* The run extends the one recorded on the delivery's PRIOR gate_state, whether
|
|
216
|
+
* live or carried forward across the coding -> verify advance
|
|
217
|
+
* (readVerificationHistory). Best-effort: an unreadable log yields a null
|
|
218
|
+
* signature, so consecutive is 0 and the detector falls back to the iteration
|
|
219
|
+
* cap. A prior gate_state with no usable run counts as none. A signature fault
|
|
220
|
+
* must never block the rejection write.
|
|
221
|
+
*/
|
|
222
|
+
export function computeFailureSignatureRecord(deliveryId, source, failingTests, priorGateState, deps) {
|
|
223
|
+
let failureSignature = null;
|
|
224
|
+
try {
|
|
225
|
+
failureSignature = deriveFailureSignature({ logText: deps.readLogText(source), failingTests });
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
log.warn(`failure signature derivation failed for delivery ${deliveryId}:`, err.message);
|
|
229
|
+
}
|
|
230
|
+
const prior = readVerificationHistory(priorGateState).signatureRun ?? null;
|
|
231
|
+
return { failureSignature, signatureRun: advanceSignatureRun(prior, failureSignature) };
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=failure-signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-signature.js","sourceRoot":"","sources":["../../src/verify/failure-signature.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,14 +18,14 @@
|
|
|
18
18
|
* that count reaches the threshold, the caller diagnoses a DEFECT IN THE CLAIM
|
|
19
19
|
* (a modelling act for a human) instead of charging the team another re-work.
|
|
20
20
|
*
|
|
21
|
-
* SELF-CONTAINED
|
|
22
|
-
*
|
|
23
|
-
* daemon-core mock-loader chain into a test. It is pure and deterministic
|
|
24
|
-
*
|
|
21
|
+
* SELF-CONTAINED and mock-safe: this module imports only the gate-state vocabulary,
|
|
22
|
+
* which itself imports nothing, and NO daemon-core VALUE. It never drags the
|
|
23
|
+
* daemon-core mock-loader chain into a test. It is pure and deterministic, tested
|
|
24
|
+
* directly with no DB.
|
|
25
25
|
*
|
|
26
26
|
* @module verify/shortfall-repeat
|
|
27
27
|
*/
|
|
28
|
-
import type
|
|
28
|
+
import { type DeliveryGateState } from '../queries/delivery-gate-state.js';
|
|
29
29
|
import type { TargetShortfall } from './verify-restatement.js';
|
|
30
30
|
/** The persisted repeat state carried in gate_state (shortfallReconciliation.repeat). */
|
|
31
31
|
export interface ShortfallRepeat {
|
|
@@ -67,10 +67,13 @@ export declare const UNCLEARABLE_SHORTFALL_REPEAT_THRESHOLD = 3;
|
|
|
67
67
|
*/
|
|
68
68
|
export declare function shortfallSignature(shortfalls: readonly TargetShortfall[]): string;
|
|
69
69
|
/**
|
|
70
|
-
* Read the repeat state
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
70
|
+
* Read the repeat state the previous shortfall iteration left on a delivery's
|
|
71
|
+
* gate_state. It is either LIVE (`shortfallReconciliation.repeat`, the gate is
|
|
72
|
+
* still that shortfall) or CARRIED forward under `verificationHistory` after the
|
|
73
|
+
* guard-pass coding -> verify advance cleared the gate. Before the carry
|
|
74
|
+
* existed, that clear wiped the record and every count restarted at 1.
|
|
75
|
+
* Defensive over the loosely typed slot: returns null when the record is absent
|
|
76
|
+
* or malformed (a first shortfall, a verify pass reset it, or a legacy row).
|
|
74
77
|
*/
|
|
75
78
|
export declare function readPriorRepeat(priorGateState: DeliveryGateState | null | undefined): ShortfallRepeat | null;
|
|
76
79
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortfall-repeat.d.ts","sourceRoot":"","sources":["../../src/verify/shortfall-repeat.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"shortfall-repeat.d.ts","sourceRoot":"","sources":["../../src/verify/shortfall-repeat.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAMxD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAKjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAE5G;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACpD,UAAU,EAAE,SAAS,eAAe,EAAE,EACtC,SAAS,GAAE,MAA+C,GACzD;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAKnD"}
|