@telora/daemon 0.20.28 → 0.20.53
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 +2 -2
- package/dist/agent-state.d.ts +4 -6
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +4 -10
- package/dist/agent-state.js.map +1 -1
- package/dist/auto-update.d.ts +87 -0
- package/dist/auto-update.d.ts.map +1 -1
- package/dist/auto-update.js +142 -8
- package/dist/auto-update.js.map +1 -1
- package/dist/branch-status.d.ts +25 -3
- package/dist/branch-status.d.ts.map +1 -1
- package/dist/branch-status.js +130 -59
- package/dist/branch-status.js.map +1 -1
- package/dist/completion/completion-decision.d.ts +29 -3
- package/dist/completion/completion-decision.d.ts.map +1 -1
- package/dist/completion/completion-decision.js +15 -3
- package/dist/completion/completion-decision.js.map +1 -1
- package/dist/completion/event-entry-phases.d.ts +57 -0
- package/dist/completion/event-entry-phases.d.ts.map +1 -0
- package/dist/completion/event-entry-phases.js +205 -0
- package/dist/completion/event-entry-phases.js.map +1 -0
- package/dist/completion/event-phases.d.ts +14 -42
- package/dist/completion/event-phases.d.ts.map +1 -1
- package/dist/completion/event-phases.js +63 -190
- package/dist/completion/event-phases.js.map +1 -1
- package/dist/completion/event.d.ts +11 -1
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +5 -2
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/index.d.ts +0 -3
- package/dist/completion/index.d.ts.map +1 -1
- package/dist/completion/index.js +0 -3
- package/dist/completion/index.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts +2 -1
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +41 -1
- package/dist/completion/review-exit-phase.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 +14 -28
- package/dist/completion/status-advance-phase.js.map +1 -1
- package/dist/completion/team-completion.js +1 -1
- package/dist/completion/team-completion.js.map +1 -1
- package/dist/completion/terminated-work-reconcile.d.ts.map +1 -1
- package/dist/completion/terminated-work-reconcile.js +10 -0
- package/dist/completion/terminated-work-reconcile.js.map +1 -1
- package/dist/constants.d.ts +0 -8
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +0 -8
- package/dist/constants.js.map +1 -1
- package/dist/delivery-close-actions.d.ts +39 -0
- package/dist/delivery-close-actions.d.ts.map +1 -0
- package/dist/delivery-close-actions.js +53 -0
- package/dist/delivery-close-actions.js.map +1 -0
- package/dist/delivery-lifecycle.d.ts +11 -0
- package/dist/delivery-lifecycle.d.ts.map +1 -1
- package/dist/delivery-lifecycle.js +13 -14
- package/dist/delivery-lifecycle.js.map +1 -1
- package/dist/delivery-reconciler.d.ts +18 -4
- package/dist/delivery-reconciler.d.ts.map +1 -1
- package/dist/delivery-reconciler.js +18 -4
- package/dist/delivery-reconciler.js.map +1 -1
- package/dist/directive-executor.d.ts +1 -1
- package/dist/directive-executor.js +1 -1
- package/dist/discovery-fetch.d.ts +76 -0
- package/dist/discovery-fetch.d.ts.map +1 -0
- package/dist/discovery-fetch.js +206 -0
- package/dist/discovery-fetch.js.map +1 -0
- package/dist/discovery-poll.d.ts +1 -51
- package/dist/discovery-poll.d.ts.map +1 -1
- package/dist/discovery-poll.js +10 -192
- package/dist/discovery-poll.js.map +1 -1
- package/dist/drain-teardown.d.ts +11 -6
- package/dist/drain-teardown.d.ts.map +1 -1
- package/dist/drain-teardown.js +3 -2
- package/dist/drain-teardown.js.map +1 -1
- package/dist/focus-branch-ahead.d.ts +42 -0
- package/dist/focus-branch-ahead.d.ts.map +1 -0
- package/dist/focus-branch-ahead.js +45 -0
- package/dist/focus-branch-ahead.js.map +1 -0
- package/dist/focus-engine.d.ts.map +1 -1
- package/dist/focus-engine.js +21 -43
- package/dist/focus-engine.js.map +1 -1
- package/dist/focus-executor.js +2 -2
- package/dist/focus-executor.js.map +1 -1
- package/dist/focus-lifecycle.d.ts.map +1 -1
- package/dist/focus-lifecycle.js +32 -3
- package/dist/focus-lifecycle.js.map +1 -1
- package/dist/focus-loop-registry.d.ts.map +1 -1
- package/dist/focus-loop-registry.js +27 -0
- package/dist/focus-loop-registry.js.map +1 -1
- package/dist/focus-loop.d.ts +34 -12
- package/dist/focus-loop.d.ts.map +1 -1
- package/dist/focus-loop.js +78 -15
- package/dist/focus-loop.js.map +1 -1
- package/dist/focus-merge.d.ts.map +1 -1
- package/dist/focus-merge.js +6 -1
- package/dist/focus-merge.js.map +1 -1
- package/dist/focus-phase.d.ts +18 -3
- package/dist/focus-phase.d.ts.map +1 -1
- package/dist/focus-phase.js +85 -31
- package/dist/focus-phase.js.map +1 -1
- package/dist/focus-prompt-builder.d.ts.map +1 -1
- package/dist/focus-prompt-builder.js +13 -1
- package/dist/focus-prompt-builder.js.map +1 -1
- package/dist/focus-provisioning.d.ts.map +1 -1
- package/dist/focus-provisioning.js +4 -0
- package/dist/focus-provisioning.js.map +1 -1
- package/dist/focus-stage-lifecycle/planning-release.d.ts +35 -17
- package/dist/focus-stage-lifecycle/planning-release.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/planning-release.js +53 -22
- package/dist/focus-stage-lifecycle/planning-release.js.map +1 -1
- package/dist/focus-worktree-state.d.ts +17 -6
- package/dist/focus-worktree-state.d.ts.map +1 -1
- package/dist/focus-worktree-state.js +21 -11
- package/dist/focus-worktree-state.js.map +1 -1
- package/dist/guard-engine.d.ts +1 -2
- package/dist/guard-engine.d.ts.map +1 -1
- package/dist/guard-engine.js +1 -2
- package/dist/guard-engine.js.map +1 -1
- package/dist/health-events.d.ts +10 -0
- package/dist/health-events.d.ts.map +1 -0
- package/dist/health-events.js +10 -0
- package/dist/health-events.js.map +1 -0
- package/dist/heartbeat.d.ts.map +1 -1
- package/dist/heartbeat.js +98 -21
- package/dist/heartbeat.js.map +1 -1
- package/dist/host-control/catalog.d.ts.map +1 -1
- package/dist/host-control/catalog.js +4 -1
- package/dist/host-control/catalog.js.map +1 -1
- package/dist/host-control/client.d.ts +3 -4
- package/dist/host-control/client.d.ts.map +1 -1
- package/dist/host-control/client.js +4 -5
- package/dist/host-control/client.js.map +1 -1
- package/dist/listener-auto-advance.d.ts +2 -1
- package/dist/listener-auto-advance.d.ts.map +1 -1
- package/dist/listener-auto-advance.js +36 -40
- package/dist/listener-auto-advance.js.map +1 -1
- package/dist/listener.d.ts +2 -7
- package/dist/listener.d.ts.map +1 -1
- package/dist/listener.js +11 -9
- package/dist/listener.js.map +1 -1
- package/dist/operator-hold.d.ts +66 -0
- package/dist/operator-hold.d.ts.map +1 -0
- package/dist/operator-hold.js +99 -0
- package/dist/operator-hold.js.map +1 -0
- package/dist/poll-trigger.d.ts +28 -0
- package/dist/poll-trigger.d.ts.map +1 -0
- package/dist/poll-trigger.js +31 -0
- package/dist/poll-trigger.js.map +1 -0
- package/dist/prompt-listing.d.ts +25 -0
- package/dist/prompt-listing.d.ts.map +1 -1
- package/dist/prompt-listing.js +67 -0
- package/dist/prompt-listing.js.map +1 -1
- package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
- package/dist/prompt-sections/execution-sections.js +24 -0
- package/dist/prompt-sections/execution-sections.js.map +1 -1
- package/dist/queries/context-lock-queries.d.ts.map +1 -1
- package/dist/queries/context-lock-queries.js +4 -1
- package/dist/queries/context-lock-queries.js.map +1 -1
- package/dist/queries/deliveries.d.ts +17 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/issues.d.ts +98 -0
- package/dist/queries/issues.d.ts.map +1 -1
- package/dist/queries/issues.js +135 -0
- package/dist/queries/issues.js.map +1 -1
- package/dist/queries/schemas.d.ts +3 -3
- package/dist/security-scan-engine.d.ts +9 -1
- package/dist/security-scan-engine.d.ts.map +1 -1
- package/dist/security-scan-engine.js +25 -2
- package/dist/security-scan-engine.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +2 -0
- package/dist/spawn/worktree-session.js.map +1 -1
- package/dist/spawner/index.d.ts +7 -9
- package/dist/spawner/index.d.ts.map +1 -1
- package/dist/spawner/index.js +13 -11
- package/dist/spawner/index.js.map +1 -1
- package/dist/spawner/lifecycle.d.ts +1 -18
- package/dist/spawner/lifecycle.d.ts.map +1 -1
- package/dist/spawner/lifecycle.js +1 -54
- package/dist/spawner/lifecycle.js.map +1 -1
- package/dist/spawner/liveness.d.ts +5 -14
- package/dist/spawner/liveness.d.ts.map +1 -1
- package/dist/spawner/liveness.js +5 -67
- package/dist/spawner/liveness.js.map +1 -1
- package/dist/spawner/state.d.ts +8 -20
- package/dist/spawner/state.d.ts.map +1 -1
- package/dist/spawner/state.js +8 -34
- package/dist/spawner/state.js.map +1 -1
- package/dist/staleness-sensor.d.ts +153 -0
- package/dist/staleness-sensor.d.ts.map +1 -0
- package/dist/staleness-sensor.js +308 -0
- package/dist/staleness-sensor.js.map +1 -0
- package/dist/types/focus.d.ts +9 -0
- package/dist/types/focus.d.ts.map +1 -1
- package/dist/types/session.d.ts +0 -44
- package/dist/types/session.d.ts.map +1 -1
- package/dist/unified-shell.d.ts.map +1 -1
- package/dist/unified-shell.js +19 -0
- package/dist/unified-shell.js.map +1 -1
- package/dist/verification-engine.d.ts +6 -4
- package/dist/verification-engine.d.ts.map +1 -1
- package/dist/verification-engine.js +9 -43
- package/dist/verification-engine.js.map +1 -1
- package/dist/verification-feedback.d.ts +42 -0
- package/dist/verification-feedback.d.ts.map +1 -1
- package/dist/verification-feedback.js +93 -0
- package/dist/verification-feedback.js.map +1 -1
- package/dist/version-check.d.ts +6 -0
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +1 -1
- package/dist/version-check.js.map +1 -1
- package/package.json +2 -3
- package/dist/completion/agent-completion.d.ts +0 -48
- package/dist/completion/agent-completion.d.ts.map +0 -1
- package/dist/completion/agent-completion.js +0 -205
- package/dist/completion/agent-completion.js.map +0 -1
- package/dist/delivery-guards.d.ts +0 -41
- package/dist/delivery-guards.d.ts.map +0 -1
- package/dist/delivery-guards.js +0 -200
- package/dist/delivery-guards.js.map +0 -1
- package/dist/spawner/spawn-team.d.ts +0 -20
- package/dist/spawner/spawn-team.d.ts.map +0 -1
- package/dist/spawner/spawn-team.js +0 -19
- package/dist/spawner/spawn-team.js.map +0 -1
- package/dist/spawner/timeout.d.ts +0 -32
- package/dist/spawner/timeout.d.ts.map +0 -1
- package/dist/spawner/timeout.js +0 -126
- package/dist/spawner/timeout.js.map +0 -1
package/build-info.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"commitSha": "
|
|
3
|
-
"builtAt": "2026-07-
|
|
2
|
+
"commitSha": "ac45f221c",
|
|
3
|
+
"builtAt": "2026-07-26T11:48:14.301Z",
|
|
4
4
|
"expectedMigrations": [
|
|
5
5
|
"20250829113330_create_org_nodes_table.sql",
|
|
6
6
|
"20250829113402_fix_function_security_search_path.sql",
|
package/dist/agent-state.d.ts
CHANGED
|
@@ -3,15 +3,13 @@
|
|
|
3
3
|
* heartbeat.ts and spawner.ts by centralizing state that both modules need.
|
|
4
4
|
*
|
|
5
5
|
* Contains:
|
|
6
|
-
* - Running agents map (read by heartbeat, written by spawner)
|
|
7
6
|
* - Session completion counters (written by spawner/completion-handler, read by heartbeat)
|
|
8
7
|
* - Activity tracking (written by spawner/listener, read by heartbeat)
|
|
8
|
+
*
|
|
9
|
+
* The legacy per-delivery `runningAgents` map was removed: the only live spawn
|
|
10
|
+
* path (`spawnFocusTeam`) tracks team leads in `activeTeams`, reaped by the
|
|
11
|
+
* single `reapWorkerFleet` teardown. See packages/daemon/CLAUDE.md.
|
|
9
12
|
*/
|
|
10
|
-
import type { RunningAgent } from './types.js';
|
|
11
|
-
/**
|
|
12
|
-
* Get map of running agents.
|
|
13
|
-
*/
|
|
14
|
-
export declare function getRunningAgents(): Map<string, RunningAgent>;
|
|
15
13
|
/**
|
|
16
14
|
* Record a completed session (called by spawner when an agent finishes).
|
|
17
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-state.d.ts","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"agent-state.d.ts","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,CAEA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAC3C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAIP;AAMD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
package/dist/agent-state.js
CHANGED
|
@@ -3,19 +3,13 @@
|
|
|
3
3
|
* heartbeat.ts and spawner.ts by centralizing state that both modules need.
|
|
4
4
|
*
|
|
5
5
|
* Contains:
|
|
6
|
-
* - Running agents map (read by heartbeat, written by spawner)
|
|
7
6
|
* - Session completion counters (written by spawner/completion-handler, read by heartbeat)
|
|
8
7
|
* - Activity tracking (written by spawner/listener, read by heartbeat)
|
|
8
|
+
*
|
|
9
|
+
* The legacy per-delivery `runningAgents` map was removed: the only live spawn
|
|
10
|
+
* path (`spawnFocusTeam`) tracks team leads in `activeTeams`, reaped by the
|
|
11
|
+
* single `reapWorkerFleet` teardown. See packages/daemon/CLAUDE.md.
|
|
9
12
|
*/
|
|
10
|
-
// ── Running agents map ──────────────────────────────────────────────
|
|
11
|
-
/** Running agents map: sessionId -> RunningAgent */
|
|
12
|
-
const runningAgents = new Map();
|
|
13
|
-
/**
|
|
14
|
-
* Get map of running agents.
|
|
15
|
-
*/
|
|
16
|
-
export function getRunningAgents() {
|
|
17
|
-
return runningAgents;
|
|
18
|
-
}
|
|
19
13
|
// ── Session completion counters ─────────────────────────────────────
|
|
20
14
|
let completedSessionCount = 0;
|
|
21
15
|
let totalTokensUsed = 0;
|
package/dist/agent-state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-state.js","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"agent-state.js","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,uEAAuE;AAEvE,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAC9B,IAAI,eAAe,GAAG,CAAC,CAAC;AACxB,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,IAAY;IACjE,qBAAqB,EAAE,CAAC;IACxB,eAAe,IAAI,MAAM,CAAC;IAC1B,SAAS,IAAI,IAAI,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAKhC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAIlC;IACC,qBAAqB,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IACvD,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;IAC3C,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;AACjC,CAAC;AAED,uEAAuE;AAEvE,IAAI,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
package/dist/auto-update.d.ts
CHANGED
|
@@ -21,6 +21,83 @@ export declare const EXIT_CODE_UPDATE = 75;
|
|
|
21
21
|
* traffic is unaffected (the candidate version comes from the warm cache).
|
|
22
22
|
*/
|
|
23
23
|
export declare const DEFAULT_SAMPLE_INTERVAL_MS = 30000;
|
|
24
|
+
/**
|
|
25
|
+
* Steady-state heartbeat for the default decision-logging sink. In the common
|
|
26
|
+
* "checked and current" / "candidate pending" states the sink suppresses
|
|
27
|
+
* duplicate consecutive lines, but re-emits at least this often so that an
|
|
28
|
+
* ABSENT trace positively identifies a controller that is NOT running (the
|
|
29
|
+
* invisibility this module exists to close: a 7-version gap survived 198h
|
|
30
|
+
* precisely because ran-and-found-nothing looked identical to never-ran).
|
|
31
|
+
* With ~30s sampling, a 1h heartbeat caps steady-state log volume at ~24
|
|
32
|
+
* lines/day while making any >1h silence diagnostic.
|
|
33
|
+
*/
|
|
34
|
+
export declare const DEFAULT_DECISION_HEARTBEAT_MS = 3600000;
|
|
35
|
+
/**
|
|
36
|
+
* The classified outcome of a controller tick, handed to
|
|
37
|
+
* {@link AutoUpdateDeps.onDecision}. Every tick emits at least one decision (its
|
|
38
|
+
* terminal state); the drain-arming boundary emits an extra `drain-armed` event
|
|
39
|
+
* alongside the pending state. This is the durable trace that makes the
|
|
40
|
+
* controller's activity observable so an absent trace means "not running".
|
|
41
|
+
*/
|
|
42
|
+
export type UpdateDecision = {
|
|
43
|
+
kind: 'current';
|
|
44
|
+
} | {
|
|
45
|
+
kind: 'candidate-pending';
|
|
46
|
+
candidate: string;
|
|
47
|
+
reason: 'busy' | 'awaiting-idle-edge';
|
|
48
|
+
} | {
|
|
49
|
+
kind: 'drain-armed';
|
|
50
|
+
candidate: string;
|
|
51
|
+
} | {
|
|
52
|
+
kind: 'applying';
|
|
53
|
+
candidate: string;
|
|
54
|
+
trigger: 'idle-seam' | 'urgent';
|
|
55
|
+
} | {
|
|
56
|
+
kind: 'applied';
|
|
57
|
+
candidate: string;
|
|
58
|
+
} | {
|
|
59
|
+
kind: 'failed';
|
|
60
|
+
candidate: string;
|
|
61
|
+
trigger: 'idle-seam' | 'urgent';
|
|
62
|
+
error: string;
|
|
63
|
+
} | {
|
|
64
|
+
kind: 'error';
|
|
65
|
+
error: string;
|
|
66
|
+
};
|
|
67
|
+
/** A decision rendered for logging: level, message, and steady-state throttle keys. */
|
|
68
|
+
export interface DescribedDecision {
|
|
69
|
+
level: 'info' | 'warn';
|
|
70
|
+
message: string;
|
|
71
|
+
/** True for the recurring no-action states ('current' / 'candidate-pending') the sink throttles. */
|
|
72
|
+
steady: boolean;
|
|
73
|
+
/** Stable identity used to suppress duplicate consecutive steady-state lines. */
|
|
74
|
+
signature: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Render a decision into a loggable line. Exhaustive over {@link UpdateDecision}
|
|
78
|
+
* (the trailing `never` assignment fails the build if a case is added without a
|
|
79
|
+
* message). All lines share the `[auto-update]` prefix so the trace is greppable
|
|
80
|
+
* and assertable.
|
|
81
|
+
*/
|
|
82
|
+
export declare function describeUpdateDecision(decision: UpdateDecision, currentVersion: string): DescribedDecision;
|
|
83
|
+
/** Minimal logger shape the decision sink needs (satisfied by {@link createLogger}). */
|
|
84
|
+
export interface DecisionLogger {
|
|
85
|
+
info: (message: string) => void;
|
|
86
|
+
warn: (message: string) => void;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Build the default {@link AutoUpdateDeps.onDecision} sink: it logs every
|
|
90
|
+
* actionable decision immediately (loud on failure), and throttles the
|
|
91
|
+
* recurring steady-state decisions to at most one line per heartbeat window so
|
|
92
|
+
* the log stays readable without ever going fully silent while the controller
|
|
93
|
+
* runs.
|
|
94
|
+
*/
|
|
95
|
+
export declare function createLoggingDecisionSink(opts: {
|
|
96
|
+
logger: DecisionLogger;
|
|
97
|
+
currentVersion: string;
|
|
98
|
+
heartbeatMs?: number;
|
|
99
|
+
now?: () => number;
|
|
100
|
+
}): (decision: UpdateDecision) => void;
|
|
24
101
|
/** Dependencies for the update controller (all injectable for tests). */
|
|
25
102
|
export interface AutoUpdateDeps {
|
|
26
103
|
/** Current daemon version string (e.g., "0.10.48"). */
|
|
@@ -63,6 +140,16 @@ export interface AutoUpdateDeps {
|
|
|
63
140
|
* implemented here): it would be OR-ed into this predicate.
|
|
64
141
|
*/
|
|
65
142
|
isUrgent?: () => boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Observability sink: called with the classified {@link UpdateDecision} on
|
|
145
|
+
* EVERY tick, so the controller's activity leaves a durable trace and an
|
|
146
|
+
* absent trace identifies a controller that is not running. Defaults to a
|
|
147
|
+
* heartbeat-throttled logging sink ({@link createLoggingDecisionSink}).
|
|
148
|
+
* Injected in tests to assert the decision contract directly.
|
|
149
|
+
*/
|
|
150
|
+
onDecision?: (decision: UpdateDecision) => void;
|
|
151
|
+
/** Steady-state heartbeat (ms) for the default logging sink. Default: {@link DEFAULT_DECISION_HEARTBEAT_MS}. */
|
|
152
|
+
decisionHeartbeatMs?: number;
|
|
66
153
|
}
|
|
67
154
|
/** Options for {@link startAutoUpdateLoop}: controller deps + sampling cadence. */
|
|
68
155
|
export interface AutoUpdateOptions extends AutoUpdateDeps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB;;;;OAIG;IACH,yBAAyB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,UAAY,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,uFAAuF;AACvF,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,MAAM,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,MAAM,GACrB,iBAAiB,CAiEnB;AAED,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,GAAG,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAoBrC;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB;;;;OAIG;IACH,yBAAyB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IAChD,gHAAgH;IAChH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,mFAAmF;AACnF,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBvE;AAED,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,CAiI7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,IAAI,CA4BvE"}
|
package/dist/auto-update.js
CHANGED
|
@@ -27,6 +27,117 @@ export const EXIT_CODE_UPDATE = 75;
|
|
|
27
27
|
* traffic is unaffected (the candidate version comes from the warm cache).
|
|
28
28
|
*/
|
|
29
29
|
export const DEFAULT_SAMPLE_INTERVAL_MS = 30_000;
|
|
30
|
+
/**
|
|
31
|
+
* Steady-state heartbeat for the default decision-logging sink. In the common
|
|
32
|
+
* "checked and current" / "candidate pending" states the sink suppresses
|
|
33
|
+
* duplicate consecutive lines, but re-emits at least this often so that an
|
|
34
|
+
* ABSENT trace positively identifies a controller that is NOT running (the
|
|
35
|
+
* invisibility this module exists to close: a 7-version gap survived 198h
|
|
36
|
+
* precisely because ran-and-found-nothing looked identical to never-ran).
|
|
37
|
+
* With ~30s sampling, a 1h heartbeat caps steady-state log volume at ~24
|
|
38
|
+
* lines/day while making any >1h silence diagnostic.
|
|
39
|
+
*/
|
|
40
|
+
export const DEFAULT_DECISION_HEARTBEAT_MS = 3_600_000;
|
|
41
|
+
/**
|
|
42
|
+
* Render a decision into a loggable line. Exhaustive over {@link UpdateDecision}
|
|
43
|
+
* (the trailing `never` assignment fails the build if a case is added without a
|
|
44
|
+
* message). All lines share the `[auto-update]` prefix so the trace is greppable
|
|
45
|
+
* and assertable.
|
|
46
|
+
*/
|
|
47
|
+
export function describeUpdateDecision(decision, currentVersion) {
|
|
48
|
+
switch (decision.kind) {
|
|
49
|
+
case 'current':
|
|
50
|
+
return {
|
|
51
|
+
level: 'info',
|
|
52
|
+
steady: true,
|
|
53
|
+
signature: 'current',
|
|
54
|
+
message: `[auto-update] Checked: up to date (v${currentVersion}); no newer version available`,
|
|
55
|
+
};
|
|
56
|
+
case 'candidate-pending':
|
|
57
|
+
return {
|
|
58
|
+
level: 'info',
|
|
59
|
+
steady: true,
|
|
60
|
+
signature: `pending:${decision.reason}:${decision.candidate}`,
|
|
61
|
+
message: decision.reason === 'busy'
|
|
62
|
+
? `[auto-update] Candidate v${decision.candidate} available but daemon busy; waiting for a safe seam (current v${currentVersion})`
|
|
63
|
+
: `[auto-update] Candidate v${decision.candidate} available and idle; awaiting rising idle edge (current v${currentVersion})`,
|
|
64
|
+
};
|
|
65
|
+
case 'drain-armed':
|
|
66
|
+
return {
|
|
67
|
+
level: 'info',
|
|
68
|
+
steady: false,
|
|
69
|
+
signature: `drain-armed:${decision.candidate}`,
|
|
70
|
+
message: `[auto-update] Drain armed to create a safe seam for v${decision.candidate} (current v${currentVersion})`,
|
|
71
|
+
};
|
|
72
|
+
case 'applying':
|
|
73
|
+
return {
|
|
74
|
+
level: 'info',
|
|
75
|
+
steady: false,
|
|
76
|
+
signature: `applying:${decision.trigger}:${decision.candidate}`,
|
|
77
|
+
message: decision.trigger === 'urgent'
|
|
78
|
+
? `[auto-update] URGENT signal set -- applying update v${decision.candidate} mid-batch, preempting in-flight work (current v${currentVersion})`
|
|
79
|
+
: `[auto-update] Batch-safe idle seam reached; applying update v${decision.candidate} (current v${currentVersion})`,
|
|
80
|
+
};
|
|
81
|
+
case 'applied':
|
|
82
|
+
return {
|
|
83
|
+
level: 'info',
|
|
84
|
+
steady: false,
|
|
85
|
+
signature: `applied:${decision.candidate}`,
|
|
86
|
+
message: `[auto-update] Update to v${decision.candidate} installed; signaling restart (exit ${EXIT_CODE_UPDATE})`,
|
|
87
|
+
};
|
|
88
|
+
case 'failed':
|
|
89
|
+
return {
|
|
90
|
+
level: 'warn',
|
|
91
|
+
steady: false,
|
|
92
|
+
signature: `failed:${decision.trigger}:${decision.candidate}`,
|
|
93
|
+
message: decision.trigger === 'urgent'
|
|
94
|
+
? `[auto-update] Urgent install of v${decision.candidate} FAILED: ${decision.error}; will retry next tick`
|
|
95
|
+
: `[auto-update] Install of v${decision.candidate} FAILED at idle seam: ${decision.error}; will retry on the next idle edge`,
|
|
96
|
+
};
|
|
97
|
+
case 'error':
|
|
98
|
+
return {
|
|
99
|
+
level: 'warn',
|
|
100
|
+
steady: false,
|
|
101
|
+
signature: 'error',
|
|
102
|
+
message: `[auto-update] Unexpected error: ${decision.error}`,
|
|
103
|
+
};
|
|
104
|
+
default: {
|
|
105
|
+
const _exhaustive = decision;
|
|
106
|
+
return _exhaustive;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Build the default {@link AutoUpdateDeps.onDecision} sink: it logs every
|
|
112
|
+
* actionable decision immediately (loud on failure), and throttles the
|
|
113
|
+
* recurring steady-state decisions to at most one line per heartbeat window so
|
|
114
|
+
* the log stays readable without ever going fully silent while the controller
|
|
115
|
+
* runs.
|
|
116
|
+
*/
|
|
117
|
+
export function createLoggingDecisionSink(opts) {
|
|
118
|
+
const { logger, currentVersion, heartbeatMs = DEFAULT_DECISION_HEARTBEAT_MS, now = Date.now } = opts;
|
|
119
|
+
let lastSteadySignature = null;
|
|
120
|
+
let lastSteadyLoggedAt = Number.NEGATIVE_INFINITY;
|
|
121
|
+
return (decision) => {
|
|
122
|
+
const described = describeUpdateDecision(decision, currentVersion);
|
|
123
|
+
if (described.steady) {
|
|
124
|
+
const heartbeatDue = now() - lastSteadyLoggedAt >= heartbeatMs;
|
|
125
|
+
if (described.signature === lastSteadySignature && !heartbeatDue)
|
|
126
|
+
return;
|
|
127
|
+
lastSteadySignature = described.signature;
|
|
128
|
+
lastSteadyLoggedAt = now();
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// An actionable event breaks the steady-state run; the next steady tick
|
|
132
|
+
// re-logs its current state rather than being suppressed as a duplicate.
|
|
133
|
+
lastSteadySignature = null;
|
|
134
|
+
}
|
|
135
|
+
if (described.level === 'warn')
|
|
136
|
+
logger.warn(described.message);
|
|
137
|
+
else
|
|
138
|
+
logger.info(described.message);
|
|
139
|
+
};
|
|
140
|
+
}
|
|
30
141
|
/**
|
|
31
142
|
* Run `npm install -g <package>@latest` as a child process.
|
|
32
143
|
* Returns true on success, false on failure.
|
|
@@ -64,7 +175,12 @@ export function performSelfUpdate(packageName) {
|
|
|
64
175
|
* re-arms only when the daemon leaves and re-enters the ready state.
|
|
65
176
|
*/
|
|
66
177
|
export function createUpdateController(deps) {
|
|
67
|
-
const { currentVersion, packageName = '@telora/daemon', isIdle, getCachedCandidateVersion, onUpdateReady, performUpdate = performSelfUpdate, now = Date.now, stalenessThresholdMs = Number.POSITIVE_INFINITY, armDrain = armDrainForUpdate, releaseDrain = releaseDrainForUpdate, isUrgent = () => false, } = deps;
|
|
178
|
+
const { currentVersion, packageName = '@telora/daemon', isIdle, getCachedCandidateVersion, onUpdateReady, performUpdate = performSelfUpdate, now = Date.now, stalenessThresholdMs = Number.POSITIVE_INFINITY, armDrain = armDrainForUpdate, releaseDrain = releaseDrainForUpdate, isUrgent = () => false, decisionHeartbeatMs = DEFAULT_DECISION_HEARTBEAT_MS, onDecision, } = deps;
|
|
179
|
+
// Observability sink: every tick emits exactly one classified decision here.
|
|
180
|
+
// Default logs (heartbeat-throttled) so activity is never fully silent; tests
|
|
181
|
+
// inject their own sink to assert the decision contract.
|
|
182
|
+
const emit = onDecision ??
|
|
183
|
+
createLoggingDecisionSink({ logger: log, currentVersion, heartbeatMs: decisionHeartbeatMs, now });
|
|
68
184
|
// True while the "ready to update" condition (idle + newer version) held on
|
|
69
185
|
// the previous tick. The controller acts only on the false->true transition.
|
|
70
186
|
let wasReady = false;
|
|
@@ -103,13 +219,15 @@ export function createUpdateController(deps) {
|
|
|
103
219
|
// interrupt an in-flight batch, and it is NEVER the loop's own decision.
|
|
104
220
|
// Absent the signal, behavior is exactly deliveries A-C.
|
|
105
221
|
if (haveNewer && isUrgent()) {
|
|
106
|
-
|
|
107
|
-
|
|
222
|
+
// candidate is non-null here (haveNewer implies it).
|
|
223
|
+
const target = candidate;
|
|
224
|
+
emit({ kind: 'applying', candidate: target, trigger: 'urgent' });
|
|
108
225
|
const ok = await performUpdate(packageName);
|
|
109
226
|
if (!ok) {
|
|
110
|
-
|
|
227
|
+
emit({ kind: 'failed', candidate: target, trigger: 'urgent', error: 'npm install did not succeed' });
|
|
111
228
|
return;
|
|
112
229
|
}
|
|
230
|
+
emit({ kind: 'applied', candidate: target });
|
|
113
231
|
onUpdateReady();
|
|
114
232
|
return;
|
|
115
233
|
}
|
|
@@ -124,24 +242,40 @@ export function createUpdateController(deps) {
|
|
|
124
242
|
!idleNow &&
|
|
125
243
|
now() - pendingSince >= stalenessThresholdMs) {
|
|
126
244
|
armDrain();
|
|
245
|
+
emit({ kind: 'drain-armed', candidate: candidate });
|
|
127
246
|
}
|
|
128
247
|
const ready = idleNow && haveNewer;
|
|
129
248
|
const risingEdge = ready && !wasReady;
|
|
130
249
|
wasReady = ready;
|
|
131
|
-
if (!risingEdge)
|
|
250
|
+
if (!risingEdge) {
|
|
251
|
+
// No install this tick -- still emit the classified steady state so the
|
|
252
|
+
// controller's liveness is observable (silence never means "not run").
|
|
253
|
+
if (!haveNewer) {
|
|
254
|
+
emit({ kind: 'current' });
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
emit({
|
|
258
|
+
kind: 'candidate-pending',
|
|
259
|
+
candidate: candidate,
|
|
260
|
+
reason: idleNow ? 'awaiting-idle-edge' : 'busy',
|
|
261
|
+
});
|
|
262
|
+
}
|
|
132
263
|
return;
|
|
133
|
-
|
|
264
|
+
}
|
|
265
|
+
const target = candidate;
|
|
266
|
+
emit({ kind: 'applying', candidate: target, trigger: 'idle-seam' });
|
|
134
267
|
const ok = await performUpdate(packageName);
|
|
135
268
|
if (!ok) {
|
|
136
269
|
// Consume the edge: do not retry until the daemon leaves and re-enters
|
|
137
270
|
// the ready state, so a persistent install failure cannot spam npm.
|
|
138
|
-
|
|
271
|
+
emit({ kind: 'failed', candidate: target, trigger: 'idle-seam', error: 'npm install did not succeed' });
|
|
139
272
|
return;
|
|
140
273
|
}
|
|
274
|
+
emit({ kind: 'applied', candidate: target });
|
|
141
275
|
onUpdateReady();
|
|
142
276
|
}
|
|
143
277
|
catch (err) {
|
|
144
|
-
|
|
278
|
+
emit({ kind: 'error', error: err instanceof Error ? err.message : String(err) });
|
|
145
279
|
}
|
|
146
280
|
}
|
|
147
281
|
return { tick };
|
package/dist/auto-update.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;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;AACpD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAGpD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
|
package/dist/branch-status.d.ts
CHANGED
|
@@ -7,10 +7,30 @@
|
|
|
7
7
|
* 3. Each focus worktree vs integration
|
|
8
8
|
*
|
|
9
9
|
* Results ride in the heartbeat metadata field (no new tables).
|
|
10
|
+
*
|
|
11
|
+
* Multi-product: computeBranchStatus is called once per configured product
|
|
12
|
+
* with a product-scoped config (configForProduct). The focus worktree map
|
|
13
|
+
* spans all products, so this module scopes it by each entry's productId and
|
|
14
|
+
* runs git against the entry's own repoPath — evaluating a worktree against
|
|
15
|
+
* a repository that does not own it is unrepresentable here. All caches are
|
|
16
|
+
* keyed per product so one product's tick cannot evict another's state.
|
|
17
|
+
*
|
|
18
|
+
* Failure semantics (two distinct kinds, deliberately kept apart):
|
|
19
|
+
* - TRANSIENT git failures (lock contention, mid-rebase, timeouts) fall
|
|
20
|
+
* back to the last good cached status without raising anything — this
|
|
21
|
+
* tolerance predates this module split and prevents UI flicker.
|
|
22
|
+
* - PERMANENT failures (unknown revision, not a git repository, bad
|
|
23
|
+
* object) mean the branch we believe exists cannot be resolved where we
|
|
24
|
+
* looked: an attribution error, not contention. These are surfaced via
|
|
25
|
+
* a healthEvent + error log (once per focus per daemon run) instead of
|
|
26
|
+
* silently rendering identically to "no worktree". A worktree entry in
|
|
27
|
+
* the map IS the claim that its branch should exist; a legitimately
|
|
28
|
+
* deleted branch is removed from the map (removeFocusWorktree) before
|
|
29
|
+
* ever being evaluated here, so ordinary deletions raise no events.
|
|
10
30
|
*/
|
|
11
31
|
import type { DaemonConfig } from './types.js';
|
|
12
32
|
import type { BranchMonitorEntry } from './queries/products.js';
|
|
13
|
-
/** Reset
|
|
33
|
+
/** Reset all caches. Exported for tests only. */
|
|
14
34
|
export declare function resetBranchStatusCache(): void;
|
|
15
35
|
export type BranchHealth = 'clean' | 'dirty' | 'conflict';
|
|
16
36
|
export interface IntegrationBranchStatus {
|
|
@@ -44,13 +64,15 @@ export interface BranchStatusOptions {
|
|
|
44
64
|
branchMonitors?: BranchMonitorEntry[];
|
|
45
65
|
}
|
|
46
66
|
/**
|
|
47
|
-
* Compute branch status for all three tiers.
|
|
67
|
+
* Compute branch status for all three tiers of ONE product.
|
|
48
68
|
*
|
|
49
69
|
* Safe to call from the heartbeat loop: uses short git timeouts
|
|
50
70
|
* and catches all errors so a single failure skips that entry
|
|
51
71
|
* rather than failing the entire heartbeat.
|
|
52
72
|
*
|
|
53
|
-
* @param config -
|
|
73
|
+
* @param config - Product-scoped daemon config (configForProduct); provides
|
|
74
|
+
* productId, repoPath, integrationBranch. Only worktrees owned by
|
|
75
|
+
* config.productId are evaluated, each against its own repoPath.
|
|
54
76
|
* @param options - Optional overrides for mainBranch and branchMonitors from the product record
|
|
55
77
|
*/
|
|
56
78
|
export declare function computeBranchStatus(config: DaemonConfig, options?: BranchStatusOptions): BranchStatusPayload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-status.d.ts","sourceRoot":"","sources":["../src/branch-status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"branch-status.d.ts","sourceRoot":"","sources":["../src/branch-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsChE,iDAAiD;AACjD,wBAAgB,sBAAsB,IAAI,IAAI,CAG7C;AAID,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC5C,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC;AA6ED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,CAuM5G"}
|