@telora/daemon 0.22.13 → 0.22.42
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 +5 -3
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/index.js +1 -0
- package/dist/backends/index.js.map +1 -1
- package/dist/ci/ci-status.d.ts.map +1 -1
- package/dist/ci/ci-status.js +1 -0
- package/dist/ci/ci-status.js.map +1 -1
- package/dist/completion/detector.d.ts +9 -0
- package/dist/completion/detector.d.ts.map +1 -1
- package/dist/completion/detector.js +18 -0
- package/dist/completion/detector.js.map +1 -1
- package/dist/completion/event-phases.d.ts +17 -0
- package/dist/completion/event-phases.d.ts.map +1 -1
- package/dist/completion/event-phases.js +34 -13
- package/dist/completion/event-phases.js.map +1 -1
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +1 -0
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/liveness-firing.d.ts +27 -0
- package/dist/completion/liveness-firing.d.ts.map +1 -0
- package/dist/completion/liveness-firing.js +79 -0
- package/dist/completion/liveness-firing.js.map +1 -0
- package/dist/completion/stdin-turn-tracker.d.ts +19 -0
- package/dist/completion/stdin-turn-tracker.d.ts.map +1 -0
- package/dist/completion/stdin-turn-tracker.js +57 -0
- package/dist/completion/stdin-turn-tracker.js.map +1 -0
- package/dist/completion/supervision-firing-record.d.ts +190 -0
- package/dist/completion/supervision-firing-record.d.ts.map +1 -0
- package/dist/completion/supervision-firing-record.js +232 -0
- package/dist/completion/supervision-firing-record.js.map +1 -0
- package/dist/completion/team-lifecycle.d.ts.map +1 -1
- package/dist/completion/team-lifecycle.js +3 -0
- package/dist/completion/team-lifecycle.js.map +1 -1
- package/dist/directive/directive-dispatch.d.ts +7 -1
- package/dist/directive/directive-dispatch.d.ts.map +1 -1
- package/dist/directive/directive-dispatch.js +75 -12
- package/dist/directive/directive-dispatch.js.map +1 -1
- package/dist/directive/directive-executor.d.ts +1 -1
- package/dist/directive/directive-executor.d.ts.map +1 -1
- package/dist/directive/directive-executor.js +4 -1
- package/dist/directive/directive-executor.js.map +1 -1
- package/dist/directive/directive-queue.d.ts +35 -9
- package/dist/directive/directive-queue.d.ts.map +1 -1
- package/dist/directive/directive-queue.js +15 -8
- package/dist/directive/directive-queue.js.map +1 -1
- package/dist/directive/directive-verify-hold-gate.d.ts +20 -0
- package/dist/directive/directive-verify-hold-gate.d.ts.map +1 -0
- package/dist/directive/directive-verify-hold-gate.js +47 -0
- package/dist/directive/directive-verify-hold-gate.js.map +1 -0
- package/dist/drift/staleness-sensor.d.ts +62 -67
- package/dist/drift/staleness-sensor.d.ts.map +1 -1
- package/dist/drift/staleness-sensor.js +233 -68
- package/dist/drift/staleness-sensor.js.map +1 -1
- package/dist/drift/staleness.d.ts +8 -0
- package/dist/drift/staleness.d.ts.map +1 -1
- package/dist/drift/staleness.js +7 -1
- package/dist/drift/staleness.js.map +1 -1
- package/dist/focus/focus-engine.js +1 -1
- package/dist/focus/focus-engine.js.map +1 -1
- package/dist/focus/focus-team-state.d.ts.map +1 -1
- package/dist/focus/focus-team-state.js +1 -0
- package/dist/focus/focus-team-state.js.map +1 -1
- package/dist/focus/focus-worktree-state.d.ts.map +1 -1
- package/dist/focus/focus-worktree-state.js +4 -2
- package/dist/focus/focus-worktree-state.js.map +1 -1
- package/dist/focus/listener-spawn.d.ts +37 -0
- package/dist/focus/listener-spawn.d.ts.map +1 -1
- package/dist/focus/listener-spawn.js +121 -24
- package/dist/focus/listener-spawn.js.map +1 -1
- package/dist/focus/listener.d.ts.map +1 -1
- package/dist/focus/listener.js +20 -11
- package/dist/focus/listener.js.map +1 -1
- package/dist/focus/team-actionable-work.d.ts +22 -0
- package/dist/focus/team-actionable-work.d.ts.map +1 -1
- package/dist/focus/team-actionable-work.js +43 -5
- package/dist/focus/team-actionable-work.js.map +1 -1
- package/dist/nexus/return.d.ts +60 -1
- package/dist/nexus/return.d.ts.map +1 -1
- package/dist/nexus/return.js +78 -2
- package/dist/nexus/return.js.map +1 -1
- package/dist/shell/heartbeat-metadata.d.ts +91 -0
- package/dist/shell/heartbeat-metadata.d.ts.map +1 -0
- package/dist/shell/heartbeat-metadata.js +169 -0
- package/dist/shell/heartbeat-metadata.js.map +1 -0
- package/dist/shell/heartbeat.d.ts +7 -22
- package/dist/shell/heartbeat.d.ts.map +1 -1
- package/dist/shell/heartbeat.js +120 -89
- package/dist/shell/heartbeat.js.map +1 -1
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +21 -12
- 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 +32 -1
- package/dist/spawn/process-spawn.d.ts.map +1 -1
- package/dist/spawn/process-spawn.js +43 -5
- package/dist/spawn/process-spawn.js.map +1 -1
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/update/auto-update-idle.d.ts +22 -0
- package/dist/update/auto-update-idle.d.ts.map +1 -1
- package/dist/update/auto-update-idle.js +8 -1
- package/dist/update/auto-update-idle.js.map +1 -1
- package/dist/update/auto-update.d.ts +0 -6
- package/dist/update/auto-update.d.ts.map +1 -1
- package/dist/update/auto-update.js +20 -6
- package/dist/update/auto-update.js.map +1 -1
- package/dist/update/version-check.d.ts +73 -0
- package/dist/update/version-check.d.ts.map +1 -1
- package/dist/update/version-check.js +107 -11
- package/dist/update/version-check.js.map +1 -1
- package/dist/worktree/verify-interlock.d.ts.map +1 -1
- package/dist/worktree/verify-interlock.js +2 -1
- package/dist/worktree/verify-interlock.js.map +1 -1
- package/package.json +3 -3
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { execFile } from 'node:child_process';
|
|
21
21
|
import { detectInstallMode } from './self-update.js';
|
|
22
|
-
import { isNewerVersion } from './version-check.js';
|
|
22
|
+
import { isNewerVersion, versionDistance } from './version-check.js';
|
|
23
23
|
import { armDrainForUpdate, releaseDrainForUpdate } from '../shell/intake-control.js';
|
|
24
24
|
import { createLogger } from '../shell/log.js';
|
|
25
25
|
const log = createLogger({ module: 'auto-update' });
|
|
@@ -48,9 +48,23 @@ export const DEFAULT_DECISION_HEARTBEAT_MS = 3_600_000;
|
|
|
48
48
|
* message). All lines share the `[auto-update]` prefix so the trace is greppable
|
|
49
49
|
* and assertable.
|
|
50
50
|
*/
|
|
51
|
+
/**
|
|
52
|
+
* " behind M.m.p" suffix naming how far the running version trails the candidate,
|
|
53
|
+
* so every behind-case decision line names running + latest + LAG (not just the
|
|
54
|
+
* two versions). A fix that shipped but is not running is then legible from the
|
|
55
|
+
* one steady-state line, without cross-referencing the two version numbers by eye.
|
|
56
|
+
*/
|
|
57
|
+
function lagSuffix(currentVersion, candidate) {
|
|
58
|
+
const d = versionDistance(currentVersion, candidate);
|
|
59
|
+
return `, behind ${d.major}.${d.minor}.${d.patch}`;
|
|
60
|
+
}
|
|
51
61
|
export function describeUpdateDecision(decision, currentVersion) {
|
|
52
62
|
switch (decision.kind) {
|
|
53
63
|
case 'current':
|
|
64
|
+
// The ONLY line that reads "up to date": reached solely when the check
|
|
65
|
+
// found no newer version (updateAvailable false). Every behind state below
|
|
66
|
+
// names running + latest + lag instead, so "up to date" can never stand in
|
|
67
|
+
// for a lagging daemon (the mars 0.22.4-vs-0.22.13 blindness).
|
|
54
68
|
return {
|
|
55
69
|
level: 'info',
|
|
56
70
|
steady: true,
|
|
@@ -63,15 +77,15 @@ export function describeUpdateDecision(decision, currentVersion) {
|
|
|
63
77
|
steady: true,
|
|
64
78
|
signature: `pending:${decision.reason}:${decision.candidate}`,
|
|
65
79
|
message: decision.reason === 'busy'
|
|
66
|
-
? `[auto-update] Candidate v${decision.candidate} available but daemon busy; waiting for a safe seam (current v${currentVersion})`
|
|
67
|
-
: `[auto-update] Candidate v${decision.candidate} available and idle; awaiting rising idle edge (current v${currentVersion})`,
|
|
80
|
+
? `[auto-update] Candidate v${decision.candidate} available but daemon busy; waiting for a safe seam (current v${currentVersion}${lagSuffix(currentVersion, decision.candidate)})`
|
|
81
|
+
: `[auto-update] Candidate v${decision.candidate} available and idle; awaiting rising idle edge (current v${currentVersion}${lagSuffix(currentVersion, decision.candidate)})`,
|
|
68
82
|
};
|
|
69
83
|
case 'drain-armed':
|
|
70
84
|
return {
|
|
71
85
|
level: 'info',
|
|
72
86
|
steady: false,
|
|
73
87
|
signature: `drain-armed:${decision.candidate}`,
|
|
74
|
-
message: `[auto-update] Drain armed to create a safe seam for v${decision.candidate} (current v${currentVersion})`,
|
|
88
|
+
message: `[auto-update] Drain armed to create a safe seam for v${decision.candidate} (current v${currentVersion}${lagSuffix(currentVersion, decision.candidate)})`,
|
|
75
89
|
};
|
|
76
90
|
case 'applying':
|
|
77
91
|
return {
|
|
@@ -79,8 +93,8 @@ export function describeUpdateDecision(decision, currentVersion) {
|
|
|
79
93
|
steady: false,
|
|
80
94
|
signature: `applying:${decision.trigger}:${decision.candidate}`,
|
|
81
95
|
message: decision.trigger === 'urgent'
|
|
82
|
-
? `[auto-update] URGENT signal set -- applying update v${decision.candidate} mid-batch, preempting in-flight work (current v${currentVersion})`
|
|
83
|
-
: `[auto-update] Batch-safe idle seam reached; applying update v${decision.candidate} (current v${currentVersion})`,
|
|
96
|
+
? `[auto-update] URGENT signal set -- applying update v${decision.candidate} mid-batch, preempting in-flight work (current v${currentVersion}${lagSuffix(currentVersion, decision.candidate)})`
|
|
97
|
+
: `[auto-update] Batch-safe idle seam reached; applying update v${decision.candidate} (current v${currentVersion}${lagSuffix(currentVersion, decision.candidate)})`,
|
|
84
98
|
};
|
|
85
99
|
case 'applied':
|
|
86
100
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/update/auto-update.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,uEAAuE;AACvE,mDAAmD;AACnD,gBAAgB;AAEhB;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/update/auto-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,67 @@
|
|
|
1
1
|
export interface VersionCheckResult {
|
|
2
2
|
latestVersion: string;
|
|
3
3
|
updateAvailable: boolean;
|
|
4
|
+
/**
|
|
5
|
+
* The registry URL this check actually consulted, resolved via
|
|
6
|
+
* {@link resolveRegistryUrl}. Carried on the result so a caller can name the
|
|
7
|
+
* registry alongside the version it read -- a host's reading then always
|
|
8
|
+
* identifies the registry it consulted, not just the answer. Optional so
|
|
9
|
+
* injected test fakes need not supply it; the real {@link checkForUpdates}
|
|
10
|
+
* always populates it.
|
|
11
|
+
*/
|
|
12
|
+
registryUrl?: string;
|
|
4
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Read a single npm config value via `npm config get <key>`.
|
|
16
|
+
*
|
|
17
|
+
* Returns a trimmed http(s) URL, or null when npm is unavailable, the key is
|
|
18
|
+
* unset (npm prints an empty line or the literal "undefined"/"null"), or the
|
|
19
|
+
* value is not an http(s) URL. Fails soft so a host without `npm` on PATH still
|
|
20
|
+
* resolves through the fallback chain rather than throwing.
|
|
21
|
+
*/
|
|
22
|
+
export declare function readNpmConfigValue(key: string): string | null;
|
|
23
|
+
/** Injected dependencies for {@link resolveRegistryUrl} (pure + unit-testable). */
|
|
24
|
+
export interface RegistryResolutionDeps {
|
|
25
|
+
env: NodeJS.ProcessEnv;
|
|
26
|
+
npmConfigGet: (key: string) => string | null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the registry URL the update check should target, so the CHECK asks npm
|
|
30
|
+
* the same question the INSTALL resolves. `self-update.ts` runs
|
|
31
|
+
* `npm install -g @telora/daemon@latest`, which resolves the @telora scope from
|
|
32
|
+
* npm config (~/.npmrc -> Gitea on the daemon hosts); a check that targeted a
|
|
33
|
+
* different registry would be blind to a Gitea-only publish -- the exact failure
|
|
34
|
+
* this focus exists to close.
|
|
35
|
+
*
|
|
36
|
+
* Resolution order:
|
|
37
|
+
* 1. TELORA_REGISTRY_URL when EXPLICITLY set in the environment -> override.
|
|
38
|
+
* Read straight from `env` (NOT through loadEnvConfig, whose typed default
|
|
39
|
+
* would make an unset var indistinguishable from an explicit npmjs choice).
|
|
40
|
+
* 2. `npm config get @telora:registry` -> the scope registry the installer uses.
|
|
41
|
+
* 3. `npm config get registry` -> npm's configured default registry.
|
|
42
|
+
* 4. the public npmjs registry -> last-resort fallback (npm absent / unset).
|
|
43
|
+
*
|
|
44
|
+
* Pure over injected deps; {@link getRegistryUrl} binds the real env + npm reader.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveRegistryUrl(deps: RegistryResolutionDeps): string;
|
|
47
|
+
/**
|
|
48
|
+
* The registry `npm install -g @telora/daemon@latest` ACTUALLY resolves: npm
|
|
49
|
+
* config (@telora scope, then default), ignoring the TELORA_REGISTRY_URL CHECK
|
|
50
|
+
* override -- the installer reads ~/.npmrc, never that env var. This is the
|
|
51
|
+
* registry a version reading must be ATTRIBUTABLE to for its agreement to count:
|
|
52
|
+
* an operator who points the check elsewhere (override) has not changed where
|
|
53
|
+
* an install lands, so a reading from the override registry cannot certify the
|
|
54
|
+
* installed version is current.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveInstallRegistryUrl(npmConfigGet?: (key: string) => string | null): string;
|
|
57
|
+
/**
|
|
58
|
+
* True when a reading taken from `readingRegistry` can be ATTRIBUTED to the
|
|
59
|
+
* registry npm resolves for an install (`installRegistry`) -- only then does the
|
|
60
|
+
* agreement/lag it reports count. A null/absent reading registry (legacy cache,
|
|
61
|
+
* unstamped) is unattributable, and so is a reading from a different registry
|
|
62
|
+
* than the installer resolves. Trailing-slash / case insensitive.
|
|
63
|
+
*/
|
|
64
|
+
export declare function isReadingAttributable(readingRegistry: string | null | undefined, installRegistry: string): boolean;
|
|
5
65
|
/**
|
|
6
66
|
* Parse a semver string's numeric major.minor.patch core, ignoring any
|
|
7
67
|
* pre-release / build suffix (e.g. "1.2.3-beta.1" -> [1, 2, 3]).
|
|
@@ -14,6 +74,19 @@ export declare function parseVersionCore(version: string): [number, number, numb
|
|
|
14
74
|
* either version cannot be parsed, so a malformed tag never silently no-ops.
|
|
15
75
|
*/
|
|
16
76
|
export declare function isNewerVersion(candidate: string, current: string): boolean;
|
|
77
|
+
/** Component-wise magnitude of how far one version is behind another (clamped at 0). */
|
|
78
|
+
export interface VersionDistance {
|
|
79
|
+
major: number;
|
|
80
|
+
minor: number;
|
|
81
|
+
patch: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Component-wise (newest - running) semver distance, clamped at 0 per component.
|
|
85
|
+
* Returns a zero distance when either version's core cannot be parsed. Pure --
|
|
86
|
+
* the single home for the running-vs-latest lag math shared by the heartbeat
|
|
87
|
+
* (lag field) and the propagation-staleness sensor (threshold decision).
|
|
88
|
+
*/
|
|
89
|
+
export declare function versionDistance(running: string, newest: string): VersionDistance;
|
|
17
90
|
/**
|
|
18
91
|
* Check the npm registry for the latest published version of @telora/daemon.
|
|
19
92
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/update/version-check.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/update/version-check.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa7D;AAED,mFAAmF;AACnF,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAUvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAyB,GAChE,MAAM,CAER;AAMD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAGlH;AASD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAWjF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAS1E;AAED,wFAAwF;AACxF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAShF;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,SAAmB,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA6DhI"}
|
|
@@ -10,24 +10,97 @@
|
|
|
10
10
|
* a registry outage never prevents startup or normal operation -- but logs a
|
|
11
11
|
* warn line so a broken update path produces a signal instead of silent rot.
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
13
|
+
import { execFileSync } from 'node:child_process';
|
|
14
14
|
import { createLogger } from '../shell/log.js';
|
|
15
15
|
const log = createLogger({ module: 'auto-update' });
|
|
16
16
|
const CHECK_TIMEOUT_MS = 5000;
|
|
17
|
+
const SCOPE_REGISTRY_KEY = '@telora:registry';
|
|
18
|
+
const DEFAULT_REGISTRY_KEY = 'registry';
|
|
19
|
+
const NPMJS_FALLBACK = 'https://registry.npmjs.org/';
|
|
17
20
|
/**
|
|
18
|
-
*
|
|
21
|
+
* Read a single npm config value via `npm config get <key>`.
|
|
19
22
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* override (declared + defaulted in the typed env-config).
|
|
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.
|
|
25
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
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve the registry URL the update check should target, so the CHECK asks npm
|
|
47
|
+
* the same question the INSTALL resolves. `self-update.ts` runs
|
|
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.
|
|
52
|
+
*
|
|
53
|
+
* Resolution order:
|
|
54
|
+
* 1. TELORA_REGISTRY_URL when EXPLICITLY set in the environment -> override.
|
|
55
|
+
* Read straight from `env` (NOT through loadEnvConfig, whose typed default
|
|
56
|
+
* would make an unset var indistinguishable from an explicit npmjs choice).
|
|
57
|
+
* 2. `npm config get @telora:registry` -> the scope registry the installer uses.
|
|
58
|
+
* 3. `npm config get registry` -> npm's configured default registry.
|
|
59
|
+
* 4. the public npmjs registry -> last-resort fallback (npm absent / unset).
|
|
60
|
+
*
|
|
61
|
+
* Pure over injected deps; {@link getRegistryUrl} binds the real env + npm reader.
|
|
62
|
+
*/
|
|
63
|
+
export function resolveRegistryUrl(deps) {
|
|
64
|
+
const override = deps.env.TELORA_REGISTRY_URL;
|
|
65
|
+
if (typeof override === 'string' && override.trim().length > 0) {
|
|
66
|
+
return override.trim();
|
|
67
|
+
}
|
|
68
|
+
return (deps.npmConfigGet(SCOPE_REGISTRY_KEY) ??
|
|
69
|
+
deps.npmConfigGet(DEFAULT_REGISTRY_KEY) ??
|
|
70
|
+
NPMJS_FALLBACK);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The registry `npm install -g @telora/daemon@latest` ACTUALLY resolves: npm
|
|
74
|
+
* config (@telora scope, then default), ignoring the TELORA_REGISTRY_URL CHECK
|
|
75
|
+
* override -- the installer reads ~/.npmrc, never that env var. This is the
|
|
76
|
+
* registry a version reading must be ATTRIBUTABLE to for its agreement to count:
|
|
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.
|
|
80
|
+
*/
|
|
81
|
+
export function resolveInstallRegistryUrl(npmConfigGet = readNpmConfigValue) {
|
|
82
|
+
return resolveRegistryUrl({ env: {}, npmConfigGet });
|
|
83
|
+
}
|
|
84
|
+
function normalizeRegistry(url) {
|
|
85
|
+
return url.trim().replace(/\/+$/, '').toLowerCase();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* True when a reading taken from `readingRegistry` can be ATTRIBUTED to the
|
|
89
|
+
* registry npm resolves for an install (`installRegistry`) -- only then does the
|
|
90
|
+
* agreement/lag it reports count. A null/absent reading registry (legacy cache,
|
|
91
|
+
* unstamped) is unattributable, and so is a reading from a different registry
|
|
92
|
+
* than the installer resolves. Trailing-slash / case insensitive.
|
|
93
|
+
*/
|
|
94
|
+
export function isReadingAttributable(readingRegistry, installRegistry) {
|
|
95
|
+
if (!readingRegistry)
|
|
96
|
+
return false;
|
|
97
|
+
return normalizeRegistry(readingRegistry) === normalizeRegistry(installRegistry);
|
|
98
|
+
}
|
|
26
99
|
function getRegistryUrl() {
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
return
|
|
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 });
|
|
31
104
|
}
|
|
32
105
|
/**
|
|
33
106
|
* Parse a semver string's numeric major.minor.patch core, ignoring any
|
|
@@ -66,6 +139,23 @@ export function isNewerVersion(candidate, current) {
|
|
|
66
139
|
}
|
|
67
140
|
return false;
|
|
68
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Component-wise (newest - running) semver distance, clamped at 0 per component.
|
|
144
|
+
* Returns a zero distance when either version's core cannot be parsed. Pure --
|
|
145
|
+
* the single home for the running-vs-latest lag math shared by the heartbeat
|
|
146
|
+
* (lag field) and the propagation-staleness sensor (threshold decision).
|
|
147
|
+
*/
|
|
148
|
+
export function versionDistance(running, newest) {
|
|
149
|
+
const r = parseVersionCore(running);
|
|
150
|
+
const n = parseVersionCore(newest);
|
|
151
|
+
if (!r || !n)
|
|
152
|
+
return { major: 0, minor: 0, patch: 0 };
|
|
153
|
+
return {
|
|
154
|
+
major: Math.max(0, n[0] - r[0]),
|
|
155
|
+
minor: Math.max(0, n[1] - r[1]),
|
|
156
|
+
patch: Math.max(0, n[2] - r[2]),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
69
159
|
/**
|
|
70
160
|
* Check the npm registry for the latest published version of @telora/daemon.
|
|
71
161
|
*
|
|
@@ -99,9 +189,15 @@ export async function checkForUpdates(currentVersion, packageName = '@telora/dae
|
|
|
99
189
|
log.warn(`[auto-update] Version check inconclusive: no dist-tags.latest for ${packageName} at registry ${registryUrl}`);
|
|
100
190
|
return null;
|
|
101
191
|
}
|
|
192
|
+
// Name the registry this check consulted alongside its result, so a host's
|
|
193
|
+
// reading always identifies WHICH registry answered -- the mars incident
|
|
194
|
+
// (hourly "up to date (v0.22.4)" while Gitea served 0.22.13) would have been
|
|
195
|
+
// visible the moment the check named its npmjs.org registry.
|
|
196
|
+
log.info(`[auto-update] Version check: ${packageName} latest v${latestVersion} via registry ${registryUrl} (running v${currentVersion})`);
|
|
102
197
|
return {
|
|
103
198
|
latestVersion,
|
|
104
199
|
updateAvailable: isNewerVersion(latestVersion, currentVersion),
|
|
200
|
+
registryUrl,
|
|
105
201
|
};
|
|
106
202
|
}
|
|
107
203
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/update/version-check.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,iEAAiE;AACjE,qDAAqD;AACrD,gBAAgB;AAEhB;;;;;;;GAOG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/update/version-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-interlock.d.ts","sourceRoot":"","sources":["../../src/worktree/verify-interlock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verify-interlock.d.ts","sourceRoot":"","sources":["../../src/worktree/verify-interlock.ts"],"names":[],"mappings":"AA4DA;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,IAAI,CAgBlE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,2EAA2E;AAC3E,MAAM,WAAW,6BAA6B;IAC5C,6EAA6E;IAC7E,qBAAqB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3D;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAChC;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GAClB;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC;AAEnC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iCAAiC,CAAC,CAAC,EACjD,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,CAAC,EACf,IAAI,GAAE,6BAAkC,GACvC,sBAAsB,CAAC,CAAC,CAAC,CAM3B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
-
// Pinned by:
|
|
2
|
+
// Pinned by: packages/daemon/src/directive/directive-verify-hold-gate.test.ts,
|
|
3
|
+
// packages/daemon/src/focus/pending-spawn-verify-hold.test.ts
|
|
3
4
|
// PINNED-BY-END
|
|
4
5
|
/**
|
|
5
6
|
* Per-worktree verify interlock.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-interlock.js","sourceRoot":"","sources":["../../src/worktree/verify-interlock.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,
|
|
1
|
+
{"version":3,"file":"verify-interlock.js","sourceRoot":"","sources":["../../src/worktree/verify-interlock.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+EAA+E;AAC/E,gEAAgE;AAChE,gBAAgB;AAEhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;AAExC,gFAAgF;AAChF,SAAS,MAAM,CAAC,YAAoB;IAClC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACjC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,GAAG,CAAC,KAAK,CAAC,uCAAuC,GAAG,WAAW,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClF,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACd,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,uCAAuC,GAAG,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAC1F,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAAoB;IACxD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,kBAAkB;IAChC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAgBD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iCAAiC,CAC/C,YAAoB,EACpB,MAAe,EACf,OAAsC,EAAE;IAExC,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,IAAI,qBAAqB,CAAC;IACxE,IAAI,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;AAC/C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telora/daemon",
|
|
3
|
-
"version": "0.22.
|
|
3
|
+
"version": "0.22.42",
|
|
4
4
|
"description": "Agent orchestration daemon for Telora - spawns and manages Claude Code instances",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
},
|
|
38
38
|
"//testRunner": "Uses Node.js built-in test runner (node:test) via tsx for TypeScript support. The root package uses Vitest; this is a deliberate choice for the daemon package to avoid framework dependencies. Test files live beside the modules they exercise (owner-directory layout); the runner discovers them recursively.",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@telora/daemon-core": "^0.2.
|
|
41
|
-
"@telora/mcp-products": "^0.22.
|
|
40
|
+
"@telora/daemon-core": "^0.2.89",
|
|
41
|
+
"@telora/mcp-products": "^0.22.135",
|
|
42
42
|
"commander": "^14.0.3",
|
|
43
43
|
"yaml": "^2.4.0",
|
|
44
44
|
"zod": "^4.3.6"
|