@telora/daemon 0.16.0 → 0.16.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "commitSha": "0a0f28ed",
3
- "builtAt": "2026-05-23T21:29:31.901Z",
2
+ "commitSha": "60e8cbc9",
3
+ "builtAt": "2026-05-23T22:31:36.180Z",
4
4
  "expectedMigrations": [
5
5
  "20250829113330_create_org_nodes_table.sql",
6
6
  "20250829113402_fix_function_security_search_path.sql",
@@ -577,6 +577,7 @@
577
577
  "20260523021605_security_workflow_entity_type_delivery.sql",
578
578
  "20260523095104_backfill_resolved_ude_frt_desired_effect.sql",
579
579
  "20260523112133_create_token_efficiency_views.sql",
580
- "20260523202844_retire_human_verification_method.sql"
580
+ "20260523202844_retire_human_verification_method.sql",
581
+ "20260523203000_token_efficiency_views_add_labels.sql"
581
582
  ]
582
583
  }
@@ -11,19 +11,45 @@
11
11
  * Runs at startup immediately after validateTrackerAuth so the daemon
12
12
  * never reaches its write path with a deploy-order schema drift.
13
13
  *
14
+ * Deploy-race tolerance: infra's apply-migrations.sh applies a migration
15
+ * and writes its public._migrations ledger row in SEPARATE (non-atomic)
16
+ * psql invocations. Across a multi-migration deploy this leaves an
17
+ * inter-migration window where the schema is live but the newest ledger
18
+ * rows are not written yet -- a daemon (re)starting in that window reads
19
+ * recently-applied migrations as "missing". To avoid false-tripping into
20
+ * read-only mode, the gate classifies the missing set: a small number of
21
+ * only-very-recent missing migrations is a transient eventual-consistency
22
+ * gap, so the gate re-polls the ledger with bounded backoff (early-exit
23
+ * the moment the gap closes) before deciding. A large gap, or any missing
24
+ * migration older than the recency margin, is genuine drift and trips
25
+ * immediately with no added latency.
26
+ *
14
27
  * Operator runbook: docs/runbook-schema-version-gate.md
15
28
  * Incident: 2026-05-21 escalation 4bffb633.
16
29
  */
17
30
  export type SchemaGateMode = 'fail-fast' | 'warn' | 'off';
31
+ /** How the initial missing set was classified before any decision. */
32
+ export type GapClassification = 'ok' | 'transient' | 'drift';
18
33
  export interface SchemaGateResult {
19
34
  mode: SchemaGateMode;
20
35
  /** Expected migration versions (timestamp prefixes, e.g. '20260521233716'). */
21
36
  expected: string[];
22
- /** Applied migration versions returned by the live DB. */
37
+ /** Applied migration versions returned by the live DB (final read). */
23
38
  applied: string[];
24
- /** Expected ∖ applied. Empty when ok. */
39
+ /** Expected ∖ applied after the final ledger read. Empty when ok. */
25
40
  missing: string[];
26
41
  ok: boolean;
42
+ /**
43
+ * Classification of the initial missing set:
44
+ * 'ok' -- nothing missing on the first read.
45
+ * 'transient' -- small gap of only very-recent migrations; the gate
46
+ * re-polled before deciding (ok may be true or false).
47
+ * 'drift' -- large gap or an older missing migration; tripped
48
+ * immediately with no re-poll.
49
+ */
50
+ classification: GapClassification;
51
+ /** Total ledger reads performed (1 = no re-poll; >1 = transient re-poll). */
52
+ attempts: number;
27
53
  }
28
54
  /**
29
55
  * Resolve the operating mode from environment.
@@ -41,10 +67,70 @@ export declare function resolveSchemaGateMode(env?: NodeJS.ProcessEnv): SchemaGa
41
67
  * -> '20260521233716'. Returns the input unchanged if no underscore.
42
68
  */
43
69
  export declare function versionPrefix(filename: string): string;
70
+ /**
71
+ * Tunables governing when a missing set is treated as a transient
72
+ * deploy-race tail vs genuine drift, and how the bounded re-poll behaves.
73
+ */
74
+ export interface TransientToleranceConfig {
75
+ /** Max missing count that can still qualify as transient. Above -> drift. */
76
+ maxMissing: number;
77
+ /**
78
+ * Recency margin (ms). A missing migration qualifies as "very recent"
79
+ * only if its timestamp is newer than (newest-applied minus this margin).
80
+ * Any older missing migration -> drift. The margin absorbs the small
81
+ * out-of-order interleaving that concurrent migration authoring can
82
+ * produce around the newest-applied boundary.
83
+ */
84
+ recencyMarginMs: number;
85
+ /** Max additional ledger reads after the first (the re-poll budget). */
86
+ repollAttempts: number;
87
+ /** Total wall-clock budget (ms) for all re-polls combined. */
88
+ repollWindowMs: number;
89
+ }
90
+ export declare const DEFAULT_TRANSIENT_TOLERANCE: TransientToleranceConfig;
91
+ /**
92
+ * Resolve transient-tolerance tunables from environment. Recency margin and
93
+ * the re-poll window are configured in SECONDS for operator friendliness;
94
+ * everything is stored internally in ms.
95
+ *
96
+ * TELORA_SCHEMA_GATE_TRANSIENT_MAX -> maxMissing (count)
97
+ * TELORA_SCHEMA_GATE_RECENCY_MARGIN_SEC -> recencyMarginMs
98
+ * TELORA_SCHEMA_GATE_REPOLL_ATTEMPTS -> repollAttempts (count)
99
+ * TELORA_SCHEMA_GATE_REPOLL_WINDOW_SEC -> repollWindowMs
100
+ */
101
+ export declare function resolveTransientToleranceConfig(env?: NodeJS.ProcessEnv): TransientToleranceConfig;
102
+ /**
103
+ * Parse a 14-digit migration version (YYYYMMDDHHMMSS, UTC) into epoch ms.
104
+ * Returns NaN for anything that is not exactly 14 digits -- callers treat
105
+ * an unparseable timestamp as non-recent (i.e. genuine drift), which is the
106
+ * conservative choice.
107
+ */
108
+ export declare function parseMigrationTimestamp(version: string): number;
109
+ /**
110
+ * Classify a non-empty missing set as a transient deploy-race tail or
111
+ * genuine drift, given the currently-applied versions.
112
+ *
113
+ * Transient requires BOTH:
114
+ * - count <= maxMissing, AND
115
+ * - every missing timestamp is "very recent": newer than the newest
116
+ * applied timestamp minus the recency margin.
117
+ *
118
+ * Drift otherwise -- including the degenerate cases (no applied baseline,
119
+ * or an unparseable timestamp), which cannot be a recoverable deploy tail.
120
+ */
121
+ export declare function classifyMissing(missing: string[], applied: string[], cfg: TransientToleranceConfig): Exclude<GapClassification, 'ok'>;
44
122
  export interface CheckSchemaVersionDeps {
45
123
  mode?: SchemaGateMode;
46
124
  getExpected?: () => string[];
47
125
  getApplied?: () => Promise<string[]>;
126
+ /** Transient-tolerance tunables (defaults resolved from env). */
127
+ transientTolerance?: TransientToleranceConfig;
128
+ /** Injectable sleep for deterministic re-poll tests. */
129
+ sleep?: (ms: number) => Promise<void>;
130
+ /** Injectable clock for deterministic re-poll-window tests. */
131
+ now?: () => number;
132
+ /** Injectable logger (defaults to console.log) for re-poll progress. */
133
+ log?: (msg: string) => void;
48
134
  }
49
135
  export declare function checkSchemaVersion(deps?: CheckSchemaVersionDeps): Promise<SchemaGateResult>;
50
136
  export declare function reportSchemaGateResult(result: SchemaGateResult): void;
@@ -1 +1 @@
1
- {"version":3,"file":"schema-version-gate.d.ts","sourceRoot":"","sources":["../src/schema-version-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yCAAyC;IACzC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,EAAE,EAAE,OAAO,CAAC;CACb;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CAO1F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtC;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,sBAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAcrG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAoBrE"}
1
+ {"version":3,"file":"schema-version-gate.d.ts","sourceRoot":"","sources":["../src/schema-version-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1D,sEAAsE;AACtE,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uEAAuE;IACvE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qEAAqE;IACrE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,EAAE,EAAE,OAAO,CAAC;IACZ;;;;;;;OAOG;IACH,cAAc,EAAE,iBAAiB,CAAC;IAClC,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CAO1F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAItD;AAMD;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,2BAA2B,EAAE,wBAKzC,CAAC;AAYF;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,wBAAwB,CAqB1B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,EAAE,wBAAwB,GAC5B,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAclC;AASD,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C,wDAAwD;IACxD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,wEAAwE;IACxE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,sBAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgErG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA8BrE"}
@@ -11,6 +11,19 @@
11
11
  * Runs at startup immediately after validateTrackerAuth so the daemon
12
12
  * never reaches its write path with a deploy-order schema drift.
13
13
  *
14
+ * Deploy-race tolerance: infra's apply-migrations.sh applies a migration
15
+ * and writes its public._migrations ledger row in SEPARATE (non-atomic)
16
+ * psql invocations. Across a multi-migration deploy this leaves an
17
+ * inter-migration window where the schema is live but the newest ledger
18
+ * rows are not written yet -- a daemon (re)starting in that window reads
19
+ * recently-applied migrations as "missing". To avoid false-tripping into
20
+ * read-only mode, the gate classifies the missing set: a small number of
21
+ * only-very-recent missing migrations is a transient eventual-consistency
22
+ * gap, so the gate re-polls the ledger with bounded backoff (early-exit
23
+ * the moment the gap closes) before deciding. A large gap, or any missing
24
+ * migration older than the recency margin, is genuine drift and trips
25
+ * immediately with no added latency.
26
+ *
14
27
  * Operator runbook: docs/runbook-schema-version-gate.md
15
28
  * Incident: 2026-05-21 escalation 4bffb633.
16
29
  */
@@ -47,28 +60,155 @@ export function versionPrefix(filename) {
47
60
  return filename;
48
61
  return filename.slice(0, underscore);
49
62
  }
63
+ export const DEFAULT_TRANSIENT_TOLERANCE = {
64
+ maxMissing: 3,
65
+ recencyMarginMs: 10 * 60 * 1000, // 10 minutes
66
+ repollAttempts: 6,
67
+ repollWindowMs: 45_000, // 45 seconds
68
+ };
69
+ /** Initial re-poll delay; doubles each attempt up to MAX_REPOLL_DELAY_MS. */
70
+ const INITIAL_REPOLL_DELAY_MS = 1_000;
71
+ const MAX_REPOLL_DELAY_MS = 8_000;
72
+ function parseNonNegInt(raw, fallback) {
73
+ if (raw == null || raw.trim() === '')
74
+ return fallback;
75
+ const n = Number(raw);
76
+ return Number.isFinite(n) && n >= 0 ? Math.floor(n) : fallback;
77
+ }
78
+ /**
79
+ * Resolve transient-tolerance tunables from environment. Recency margin and
80
+ * the re-poll window are configured in SECONDS for operator friendliness;
81
+ * everything is stored internally in ms.
82
+ *
83
+ * TELORA_SCHEMA_GATE_TRANSIENT_MAX -> maxMissing (count)
84
+ * TELORA_SCHEMA_GATE_RECENCY_MARGIN_SEC -> recencyMarginMs
85
+ * TELORA_SCHEMA_GATE_REPOLL_ATTEMPTS -> repollAttempts (count)
86
+ * TELORA_SCHEMA_GATE_REPOLL_WINDOW_SEC -> repollWindowMs
87
+ */
88
+ export function resolveTransientToleranceConfig(env = process.env) {
89
+ return {
90
+ maxMissing: parseNonNegInt(env.TELORA_SCHEMA_GATE_TRANSIENT_MAX, DEFAULT_TRANSIENT_TOLERANCE.maxMissing),
91
+ recencyMarginMs: parseNonNegInt(env.TELORA_SCHEMA_GATE_RECENCY_MARGIN_SEC, DEFAULT_TRANSIENT_TOLERANCE.recencyMarginMs / 1000) * 1000,
92
+ repollAttempts: parseNonNegInt(env.TELORA_SCHEMA_GATE_REPOLL_ATTEMPTS, DEFAULT_TRANSIENT_TOLERANCE.repollAttempts),
93
+ repollWindowMs: parseNonNegInt(env.TELORA_SCHEMA_GATE_REPOLL_WINDOW_SEC, DEFAULT_TRANSIENT_TOLERANCE.repollWindowMs / 1000) * 1000,
94
+ };
95
+ }
96
+ /**
97
+ * Parse a 14-digit migration version (YYYYMMDDHHMMSS, UTC) into epoch ms.
98
+ * Returns NaN for anything that is not exactly 14 digits -- callers treat
99
+ * an unparseable timestamp as non-recent (i.e. genuine drift), which is the
100
+ * conservative choice.
101
+ */
102
+ export function parseMigrationTimestamp(version) {
103
+ const m = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/.exec(version);
104
+ if (!m)
105
+ return NaN;
106
+ const [, y, mo, d, h, mi, s] = m;
107
+ return Date.UTC(Number(y), Number(mo) - 1, Number(d), Number(h), Number(mi), Number(s));
108
+ }
109
+ /**
110
+ * Classify a non-empty missing set as a transient deploy-race tail or
111
+ * genuine drift, given the currently-applied versions.
112
+ *
113
+ * Transient requires BOTH:
114
+ * - count <= maxMissing, AND
115
+ * - every missing timestamp is "very recent": newer than the newest
116
+ * applied timestamp minus the recency margin.
117
+ *
118
+ * Drift otherwise -- including the degenerate cases (no applied baseline,
119
+ * or an unparseable timestamp), which cannot be a recoverable deploy tail.
120
+ */
121
+ export function classifyMissing(missing, applied, cfg) {
122
+ if (missing.length > cfg.maxMissing)
123
+ return 'drift';
124
+ const appliedTs = applied.map(parseMigrationTimestamp).filter((n) => !Number.isNaN(n));
125
+ if (appliedTs.length === 0)
126
+ return 'drift'; // no baseline to call anything "recent"
127
+ const newestApplied = Math.max(...appliedTs);
128
+ const recencyThreshold = newestApplied - cfg.recencyMarginMs;
129
+ for (const v of missing) {
130
+ const ts = parseMigrationTimestamp(v);
131
+ if (Number.isNaN(ts))
132
+ return 'drift';
133
+ if (ts <= recencyThreshold)
134
+ return 'drift'; // older than the margin -> not a deploy tail
135
+ }
136
+ return 'transient';
137
+ }
138
+ function computeMissing(expected, applied) {
139
+ const appliedSet = new Set(applied);
140
+ return expected.filter((v) => !appliedSet.has(v));
141
+ }
142
+ const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
50
143
  export async function checkSchemaVersion(deps = {}) {
51
144
  const mode = deps.mode ?? resolveSchemaGateMode();
145
+ const cfg = deps.transientTolerance ?? resolveTransientToleranceConfig();
146
+ const getApplied = deps.getApplied ?? defaultGetApplied;
147
+ const sleep = deps.sleep ?? defaultSleep;
148
+ const now = deps.now ?? Date.now;
149
+ const log = deps.log ?? ((msg) => console.log(msg));
52
150
  const expectedFilenames = (deps.getExpected ?? defaultGetExpected)();
53
151
  const expected = expectedFilenames.map(versionPrefix);
54
152
  // Dev mode -- build-info missing or empty. Skip the gate.
55
153
  if (expected.length === 0) {
56
- return { mode, expected: [], applied: [], missing: [], ok: true };
154
+ return { mode, expected: [], applied: [], missing: [], ok: true, classification: 'ok', attempts: 0 };
57
155
  }
58
- const applied = await (deps.getApplied ?? defaultGetApplied)();
59
- const appliedSet = new Set(applied);
60
- const missing = expected.filter((v) => !appliedSet.has(v));
61
- return { mode, expected, applied, missing, ok: missing.length === 0 };
156
+ let applied = await getApplied();
157
+ let attempts = 1;
158
+ let missing = computeMissing(expected, applied);
159
+ if (missing.length === 0) {
160
+ return { mode, expected, applied, missing, ok: true, classification: 'ok', attempts };
161
+ }
162
+ // Something is missing -- transient deploy tail, or genuine drift?
163
+ const classification = classifyMissing(missing, applied, cfg);
164
+ if (classification === 'drift') {
165
+ // Genuine drift: trip immediately, no re-poll, no added latency.
166
+ return { mode, expected, applied, missing, ok: false, classification: 'drift', attempts };
167
+ }
168
+ // Transient: re-poll the ledger with bounded backoff, exiting early the
169
+ // moment the gap closes. Bounded by BOTH the attempt count and the total
170
+ // wall-clock window so a never-resolving gap still trips read-only.
171
+ log(`[schema-gate] Transient gap: ${missing.length} very-recent migration(s) missing ` +
172
+ `(<= ${cfg.maxMissing}); re-polling up to ${cfg.repollAttempts}x over ${Math.round(cfg.repollWindowMs / 1000)}s ` +
173
+ 'before deciding (deploy-race tolerance).');
174
+ const start = now();
175
+ let delay = INITIAL_REPOLL_DELAY_MS;
176
+ let repolls = 0;
177
+ while (repolls < cfg.repollAttempts) {
178
+ const elapsed = now() - start;
179
+ if (elapsed >= cfg.repollWindowMs)
180
+ break;
181
+ const remaining = cfg.repollWindowMs - elapsed;
182
+ await sleep(Math.min(delay, remaining));
183
+ applied = await getApplied();
184
+ attempts += 1;
185
+ repolls += 1;
186
+ missing = computeMissing(expected, applied);
187
+ if (missing.length === 0) {
188
+ log(`[schema-gate] Transient gap closed after ${repolls} re-poll(s) -- proceeding in write mode.`);
189
+ return { mode, expected, applied, missing, ok: true, classification: 'transient', attempts };
190
+ }
191
+ delay = Math.min(delay * 2, MAX_REPOLL_DELAY_MS);
192
+ }
193
+ // Window exhausted and the gap remains -- treat as drift for the decision.
194
+ log(`[schema-gate] Transient gap did not close after ${repolls} re-poll(s) -- ${missing.length} migration(s) still missing.`);
195
+ return { mode, expected, applied, missing, ok: false, classification: 'transient', attempts };
62
196
  }
63
197
  export function reportSchemaGateResult(result) {
64
198
  if (result.mode === 'off')
65
199
  return;
66
200
  if (result.ok) {
67
- console.log(`[schema-gate] OK -- all ${result.expected.length} expected migrations applied`);
201
+ const repolled = result.classification === 'transient'
202
+ ? ` (transient deploy-race gap closed after ${result.attempts} ledger read(s))`
203
+ : '';
204
+ console.log(`[schema-gate] OK -- all ${result.expected.length} expected migrations applied${repolled}`);
68
205
  return;
69
206
  }
207
+ const cause = result.classification === 'transient'
208
+ ? ' (transient gap did not close within the re-poll window)'
209
+ : ' (genuine drift -- large gap or non-recent missing migration)';
70
210
  const lines = result.missing.map((m) => ` - ${m}`).join('\n');
71
- const body = `[schema-gate] Missing ${result.missing.length} migration(s) in live DB:\n${lines}`;
211
+ const body = `[schema-gate] Missing ${result.missing.length} migration(s) in live DB${cause}:\n${lines}`;
72
212
  if (result.mode === 'fail-fast') {
73
213
  console.error(body);
74
214
  console.error('[schema-gate] Refusing to start. Apply missing migrations or set TELORA_SCHEMA_GATE=warn to override. ' +
@@ -1 +1 @@
1
- {"version":3,"file":"schema-version-gate.js","sourceRoot":"","sources":["../src/schema-version-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-version-gate.js","sourceRoot":"","sources":["../src/schema-version-gate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telora/daemon",
3
- "version": "0.16.0",
3
+ "version": "0.16.1",
4
4
  "description": "Agent orchestration daemon for Telora - spawns and manages Claude Code instances",
5
5
  "type": "module",
6
6
  "bin": {