@evelinka-ai/core 0.1.6 → 0.2.0

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.
Files changed (36) hide show
  1. package/dist/agent-lib/managed-tool.d.ts +13 -1
  2. package/dist/agent-lib/managed-tool.d.ts.map +1 -1
  3. package/dist/agent-lib/managed-tool.js +20 -1
  4. package/dist/agent-lib/managed-tool.js.map +1 -1
  5. package/dist/channels/model-providers.d.ts +31 -0
  6. package/dist/channels/model-providers.d.ts.map +1 -0
  7. package/dist/channels/model-providers.js +81 -0
  8. package/dist/channels/model-providers.js.map +1 -0
  9. package/dist/lib/coordination/checkpoints.d.ts +33 -0
  10. package/dist/lib/coordination/checkpoints.d.ts.map +1 -0
  11. package/dist/lib/coordination/checkpoints.js +105 -0
  12. package/dist/lib/coordination/checkpoints.js.map +1 -0
  13. package/dist/lib/coordination/head-lease.d.ts +91 -0
  14. package/dist/lib/coordination/head-lease.d.ts.map +1 -0
  15. package/dist/lib/coordination/head-lease.js +402 -0
  16. package/dist/lib/coordination/head-lease.js.map +1 -0
  17. package/dist/lib/coordination/pg.d.ts +30 -0
  18. package/dist/lib/coordination/pg.d.ts.map +1 -0
  19. package/dist/lib/coordination/pg.js +52 -0
  20. package/dist/lib/coordination/pg.js.map +1 -0
  21. package/dist/lib/coordination/reconciler.d.ts +156 -0
  22. package/dist/lib/coordination/reconciler.d.ts.map +1 -0
  23. package/dist/lib/coordination/reconciler.js +287 -0
  24. package/dist/lib/coordination/reconciler.js.map +1 -0
  25. package/dist/lib/coordination/work-queue.d.ts +81 -0
  26. package/dist/lib/coordination/work-queue.d.ts.map +1 -0
  27. package/dist/lib/coordination/work-queue.js +305 -0
  28. package/dist/lib/coordination/work-queue.js.map +1 -0
  29. package/dist/lib/observability/event-bus.d.ts +1 -0
  30. package/dist/lib/observability/event-bus.d.ts.map +1 -1
  31. package/dist/lib/observability/event-bus.js.map +1 -1
  32. package/dist/lib/observability/recorder.d.ts +26 -0
  33. package/dist/lib/observability/recorder.d.ts.map +1 -1
  34. package/dist/lib/observability/recorder.js +60 -1
  35. package/dist/lib/observability/recorder.js.map +1 -1
  36. package/package.json +21 -1
@@ -0,0 +1,402 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { logger } from "../observability/logger.js";
3
+ import { intervalMs, pgBrick } from "./pg.js";
4
+ const log = logger.child({ module: "head-lease" });
5
+ export const LEASE_HEARTBEAT_MS = 20_000;
6
+ export const LEASE_TTL_MS = 75_000;
7
+ export const LEASE_PROGRESS_STALL_MS = 15 * 60_000;
8
+ export const SAME_BOOT_REAP_GRACE_MS = 60_000;
9
+ export const STALLED_LEASE_MS = 60 * 60_000;
10
+ export const PROCESS_BOOT_ID = randomUUID();
11
+ export function leaseKey(itemKey, head) {
12
+ return `${itemKey}@${head}`;
13
+ }
14
+ export function splitLeaseKey(key) {
15
+ const at = key.lastIndexOf("@");
16
+ if (at <= 0 || at === key.length - 1)
17
+ return null;
18
+ return { itemKey: key.slice(0, at), head: key.slice(at + 1) };
19
+ }
20
+ const TERMINAL_RUN_STATUSES = ["completed", "failed", "cancelled"];
21
+ const DEFAULT_RUNS_TABLE = "workflow.workflow_runs";
22
+ export async function workflowRunState(p, runId, runsTable = DEFAULT_RUNS_TABLE) {
23
+ return (await workflowRunStates(p, [runId], runsTable)).get(runId) ?? "absent";
24
+ }
25
+ export async function workflowRunStates(p, runIds, runsTable = DEFAULT_RUNS_TABLE) {
26
+ const out = new Map();
27
+ const ids = [...new Set(runIds.filter((id) => id !== ""))];
28
+ if (!ids.length)
29
+ return out;
30
+ try {
31
+ const r = await p.query(`SELECT id, status::text AS status,
32
+ attributes->>'$eve.type' AS type,
33
+ attributes->>'$eve.parent' AS parent,
34
+ attributes->>'$eve.root' AS root
35
+ FROM ${runsTable}
36
+ WHERE id = ANY($1)
37
+ OR attributes->>'$eve.parent' = ANY($1)
38
+ OR attributes->>'$eve.root' = ANY($1)`, [ids]);
39
+ const sessions = new Set(r.rows.filter((row) => ids.includes(row.id)).map((row) => row.id));
40
+ const turns = new Map();
41
+ for (const row of r.rows) {
42
+ if (row.type !== "turn")
43
+ continue;
44
+ for (const owner of new Set([row.parent, row.root])) {
45
+ if (owner && ids.includes(owner))
46
+ turns.set(owner, [...(turns.get(owner) ?? []), row.status]);
47
+ }
48
+ }
49
+ for (const id of ids) {
50
+ const statuses = turns.get(id) ?? [];
51
+ if (statuses.some((s) => !TERMINAL_RUN_STATUSES.includes(s))) {
52
+ out.set(id, "active");
53
+ }
54
+ else if (statuses.length || sessions.has(id))
55
+ out.set(id, "terminal");
56
+ else
57
+ out.set(id, "absent");
58
+ }
59
+ return out;
60
+ }
61
+ catch (err) {
62
+ const code = err?.code;
63
+ const state = code === "42P01" || code === "3F000" ? "absent" : "error";
64
+ if (state === "absent") {
65
+ log.info({ code, runsTable, ids: ids.length }, "workflow run table absent — no engine evidence (TTL rule)");
66
+ }
67
+ else {
68
+ log.warn({ err: String(err), ids: ids.length }, "workflow run state lookup failed — leases preserved");
69
+ }
70
+ for (const id of ids)
71
+ out.set(id, state);
72
+ return out;
73
+ }
74
+ }
75
+ const toHolder = (row) => ({
76
+ owner: row.owner,
77
+ runId: row.run_id,
78
+ sessionId: row.session_id,
79
+ bootId: row.boot_id,
80
+ phase: row.phase,
81
+ heartbeatAt: new Date(row.heartbeat_at).toISOString(),
82
+ progressAt: new Date(row.progress_at).toISOString(),
83
+ });
84
+ export async function holderVerdict(holder, p, deps, known) {
85
+ if (holder.runId === "")
86
+ return { verdict: "take", state: "reservation" };
87
+ const state = known ??
88
+ (deps.runState
89
+ ? await deps.runState({ runId: holder.runId, sessionId: holder.sessionId })
90
+ : await workflowRunState(p, holder.runId, deps.runsTable));
91
+ return { verdict: state === "absent" || state === "terminal" ? "take" : "refuse", state };
92
+ }
93
+ export function isLeaseDead(row, opts) {
94
+ const hb = Date.parse(row.heartbeatAt);
95
+ if (!Number.isFinite(hb))
96
+ return true;
97
+ const age = Math.max(0, opts.now - hb);
98
+ if (age < LEASE_TTL_MS)
99
+ return false;
100
+ return row.bootId !== opts.bootId || age >= LEASE_TTL_MS + SAME_BOOT_REAP_GRACE_MS;
101
+ }
102
+ const noRelease = async () => undefined;
103
+ const trueOwner = () => true;
104
+ const trueProgress = async () => true;
105
+ export function defineHeadLease(config) {
106
+ const { table } = config;
107
+ const pg = pgBrick([
108
+ `CREATE TABLE IF NOT EXISTS ${table} (
109
+ key text PRIMARY KEY,
110
+ owner text NOT NULL DEFAULT '',
111
+ claimed_at timestamptz NOT NULL DEFAULT now(),
112
+ heartbeat_at timestamptz NOT NULL DEFAULT now(),
113
+ progress_at timestamptz NOT NULL DEFAULT now(),
114
+ run_id text NOT NULL DEFAULT '',
115
+ session_id text,
116
+ boot_id text NOT NULL DEFAULT '',
117
+ phase text NOT NULL DEFAULT 'claimed'
118
+ )`,
119
+ `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS owner text NOT NULL DEFAULT ''`,
120
+ `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS heartbeat_at timestamptz NOT NULL DEFAULT now()`,
121
+ `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS progress_at timestamptz NOT NULL DEFAULT now()`,
122
+ `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS run_id text NOT NULL DEFAULT ''`,
123
+ `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS session_id text`,
124
+ `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS boot_id text NOT NULL DEFAULT ''`,
125
+ `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS phase text NOT NULL DEFAULT 'claimed'`,
126
+ ]);
127
+ const bootIdOf = (deps) => deps.bootId ?? config.bootId ?? PROCESS_BOOT_ID;
128
+ async function readHolder(p, key) {
129
+ const r = await p.query(`SELECT owner, run_id, session_id, boot_id, phase, heartbeat_at, progress_at,
130
+ heartbeat_at < now() - ($2 || ' milliseconds')::interval AS stale
131
+ FROM ${table} WHERE key = $1`, [key, intervalMs(LEASE_TTL_MS)]);
132
+ return r.rows[0] ? { ...toHolder(r.rows[0]), stale: r.rows[0].stale === true } : undefined;
133
+ }
134
+ async function takeOver(p, key, holder, next, deps) {
135
+ if (!holder.stale)
136
+ return false;
137
+ const { verdict, state } = await holderVerdict(holder, p, deps);
138
+ if (verdict === "refuse") {
139
+ log.info({ key, holderRun: holder.runId, holderBoot: holder.bootId, state }, "stale lease NOT taken over — the engine still runs it (or could not be asked)");
140
+ return false;
141
+ }
142
+ const r = await p.query(`UPDATE ${table}
143
+ SET owner = $2, claimed_at = now(), heartbeat_at = now(), progress_at = now(),
144
+ run_id = $3, session_id = $4, boot_id = $5, phase = $6
145
+ WHERE key = $1 AND owner = $7
146
+ AND heartbeat_at < now() - ($8 || ' milliseconds')::interval
147
+ RETURNING key`, [
148
+ key,
149
+ next.owner,
150
+ next.runId,
151
+ next.sessionId,
152
+ next.bootId,
153
+ next.phase,
154
+ holder.owner,
155
+ intervalMs(LEASE_TTL_MS),
156
+ ]);
157
+ return (r.rowCount ?? 0) > 0;
158
+ }
159
+ const reserve = async (key, deps = {}) => {
160
+ try {
161
+ const p = await pg.poolFor(deps);
162
+ if (!p)
163
+ return { held: true, release: noRelease };
164
+ const owner = randomUUID();
165
+ const bootId = bootIdOf(deps);
166
+ const r = await p.query(`INSERT INTO ${table}
167
+ (key, owner, claimed_at, heartbeat_at, progress_at, run_id, session_id, boot_id, phase)
168
+ VALUES ($1, $2, now(), now(), now(), '', NULL, $3, 'reserved')
169
+ ON CONFLICT (key) DO NOTHING
170
+ RETURNING key`, [key, owner, bootId]);
171
+ if ((r.rowCount ?? 0) === 0) {
172
+ const holder = await readHolder(p, key);
173
+ const taken = holder !== undefined &&
174
+ (await takeOver(p, key, holder, { owner, runId: "", sessionId: null, bootId, phase: "reserved" }, deps));
175
+ if (!taken)
176
+ return { held: false, holder, release: noRelease };
177
+ }
178
+ return {
179
+ held: true,
180
+ owner,
181
+ release: async () => {
182
+ try {
183
+ await p.query(`DELETE FROM ${table} WHERE key = $1 AND owner = $2`, [key, owner]);
184
+ }
185
+ catch (err) {
186
+ log.warn({ err: String(err), key }, "lease reservation release failed (TTL reclaims)");
187
+ }
188
+ },
189
+ };
190
+ }
191
+ catch (err) {
192
+ log.warn({ err: String(err), key }, "lease reservation failed — failing open");
193
+ return { held: true, release: noRelease };
194
+ }
195
+ };
196
+ const adopt = async (key, meta, deps = {}) => {
197
+ try {
198
+ const p = await pg.poolFor(deps);
199
+ if (!p)
200
+ return { held: true, isOwner: trueOwner, progress: trueProgress, release: noRelease };
201
+ const owner = randomUUID();
202
+ const bootId = bootIdOf(deps);
203
+ const sessionId = meta.sessionId ?? null;
204
+ const values = [key, owner, meta.runId, sessionId, bootId];
205
+ const upgraded = await p.query(`UPDATE ${table}
206
+ SET owner = $2, claimed_at = now(), heartbeat_at = now(), progress_at = now(),
207
+ run_id = $3, session_id = $4, boot_id = $5, phase = 'adopted'
208
+ WHERE key = $1 AND (run_id = '' OR run_id = $3)
209
+ RETURNING key`, values);
210
+ let held = (upgraded.rowCount ?? 0) > 0;
211
+ if (!held) {
212
+ const inserted = await p.query(`INSERT INTO ${table}
213
+ (key, owner, claimed_at, heartbeat_at, progress_at, run_id, session_id, boot_id, phase)
214
+ VALUES ($1, $2, now(), now(), now(), $3, $4, $5, 'adopted')
215
+ ON CONFLICT (key) DO NOTHING
216
+ RETURNING key`, values);
217
+ held = (inserted.rowCount ?? 0) > 0;
218
+ }
219
+ if (!held) {
220
+ const holder = await readHolder(p, key);
221
+ held =
222
+ holder !== undefined &&
223
+ (await takeOver(p, key, holder, { owner, runId: meta.runId, sessionId, bootId, phase: "adopted" }, deps));
224
+ if (!held) {
225
+ return {
226
+ held: false,
227
+ isOwner: () => false,
228
+ progress: async () => false,
229
+ holder,
230
+ release: noRelease,
231
+ };
232
+ }
233
+ }
234
+ let lost = false;
235
+ let released = false;
236
+ let lastProgressAt = (deps.now ?? Date.now)();
237
+ const heartbeat = async () => {
238
+ if (released || lost)
239
+ return;
240
+ if ((deps.now ?? Date.now)() - lastProgressAt > LEASE_PROGRESS_STALL_MS) {
241
+ log.error({ key, owner, runId: meta.runId }, "head lease stopped renewing — progress stall");
242
+ lost = true;
243
+ return;
244
+ }
245
+ try {
246
+ const renewed = await p.query(`UPDATE ${table} SET heartbeat_at = now() WHERE key = $1 AND owner = $2`, [key, owner]);
247
+ if ((renewed.rowCount ?? 0) === 0)
248
+ lost = true;
249
+ }
250
+ catch (err) {
251
+ log.warn({ err: String(err), key, owner }, "head-lease heartbeat failed");
252
+ }
253
+ };
254
+ const timer = setInterval(() => void heartbeat(), LEASE_HEARTBEAT_MS);
255
+ timer.unref?.();
256
+ return {
257
+ held: true,
258
+ owner,
259
+ runId: meta.runId,
260
+ isOwner: () => !lost && !released,
261
+ progress: async (phase) => {
262
+ if (released || lost)
263
+ return false;
264
+ try {
265
+ const updated = await p.query(`UPDATE ${table}
266
+ SET heartbeat_at = now(), progress_at = now(), phase = $3
267
+ WHERE key = $1 AND owner = $2`, [key, owner, phase.slice(0, 100)]);
268
+ if ((updated.rowCount ?? 0) === 0) {
269
+ lost = true;
270
+ return false;
271
+ }
272
+ lastProgressAt = (deps.now ?? Date.now)();
273
+ return true;
274
+ }
275
+ catch (err) {
276
+ log.warn({ err: String(err), key, owner, phase }, "head-lease progress update failed");
277
+ lost = true;
278
+ return false;
279
+ }
280
+ },
281
+ release: async () => {
282
+ if (released)
283
+ return;
284
+ released = true;
285
+ clearInterval(timer);
286
+ try {
287
+ await p.query(`DELETE FROM ${table} WHERE key = $1 AND owner = $2`, [key, owner]);
288
+ }
289
+ catch (err) {
290
+ log.warn({ err: String(err), key }, "head-lease release failed (TTL will reclaim)");
291
+ }
292
+ },
293
+ };
294
+ }
295
+ catch (err) {
296
+ log.warn({ err: String(err), key }, "head-lease adopt failed — failing open");
297
+ return { held: true, isOwner: trueOwner, progress: trueProgress, release: noRelease };
298
+ }
299
+ };
300
+ const liveFor = async (itemKey, deps = {}) => {
301
+ try {
302
+ const p = await pg.poolFor(deps);
303
+ if (!p)
304
+ return undefined;
305
+ const r = await p.query(`SELECT key, owner, run_id, session_id, boot_id, phase, heartbeat_at, progress_at
306
+ FROM ${table}
307
+ WHERE key LIKE $1 AND heartbeat_at > now() - ($2 || ' milliseconds')::interval
308
+ ORDER BY heartbeat_at DESC LIMIT 1`, [`${itemKey}@%`, intervalMs(LEASE_TTL_MS)]);
309
+ return r.rows[0] ? { ...toHolder(r.rows[0]), key: r.rows[0].key } : null;
310
+ }
311
+ catch (err) {
312
+ log.warn({ err: String(err), itemKey }, "live-lease probe failed");
313
+ return undefined;
314
+ }
315
+ };
316
+ const list = async (deps = {}) => {
317
+ try {
318
+ const p = await pg.poolFor(deps);
319
+ if (!p)
320
+ return null;
321
+ const r = await p.query(`SELECT key, owner, claimed_at, run_id, session_id, boot_id, phase, heartbeat_at, progress_at
322
+ FROM ${table}`);
323
+ return r.rows.map((row) => ({
324
+ ...toHolder(row),
325
+ key: row.key,
326
+ claimedAt: new Date(row.claimed_at).toISOString(),
327
+ }));
328
+ }
329
+ catch (err) {
330
+ log.warn({ err: String(err) }, "listing head leases failed");
331
+ return null;
332
+ }
333
+ };
334
+ const reapDetailed = async (deps = {}) => {
335
+ const none = { reaped: [], deferred: [] };
336
+ const rows = await list(deps);
337
+ if (!rows)
338
+ return none;
339
+ const now = (deps.now ?? Date.now)();
340
+ const bootId = bootIdOf(deps);
341
+ const stale = rows.filter((row) => isLeaseDead(row, { now, bootId }));
342
+ if (!stale.length)
343
+ return none;
344
+ const p = await pg.poolFor(deps);
345
+ if (!p)
346
+ return none;
347
+ const dead = [];
348
+ const deferred = [];
349
+ const known = deps.runState
350
+ ? undefined
351
+ : await workflowRunStates(p, stale.map((row) => row.runId), deps.runsTable);
352
+ for (const row of stale) {
353
+ const { verdict, state } = await holderVerdict(row, p, deps, known?.get(row.runId));
354
+ if (verdict === "take") {
355
+ dead.push({ ...row, reapReason: "dead" });
356
+ continue;
357
+ }
358
+ const age = Math.max(0, now - Date.parse(row.heartbeatAt));
359
+ if (age < STALLED_LEASE_MS) {
360
+ log[state === "error" ? "warn" : "info"]({
361
+ key: row.key,
362
+ runId: row.runId,
363
+ bootId: row.bootId,
364
+ heartbeatAt: row.heartbeatAt,
365
+ state,
366
+ }, state === "error"
367
+ ? "lease heartbeat stale but the engine could not be asked — not reaped (deferred)"
368
+ : "lease heartbeat stale but the engine still runs its turn — not reaped (resumed run)");
369
+ deferred.push(row);
370
+ continue;
371
+ }
372
+ log.error({ key: row.key, runId: row.runId, heartbeatAt: row.heartbeatAt, state }, "lease past the stall ceiling without an engine verdict of death — reaped as stalled");
373
+ dead.push({ ...row, reapReason: "stalled" });
374
+ }
375
+ const reaped = [];
376
+ for (const row of dead) {
377
+ try {
378
+ const r = await p.query(`DELETE FROM ${table} WHERE key = $1 AND owner = $2`, [
379
+ row.key,
380
+ row.owner,
381
+ ]);
382
+ if ((r.rowCount ?? 0) > 0)
383
+ reaped.push(row);
384
+ }
385
+ catch (err) {
386
+ log.warn({ err: String(err), key: row.key }, "reaping a dead lease failed");
387
+ }
388
+ }
389
+ return { reaped, deferred };
390
+ };
391
+ return {
392
+ table,
393
+ ensureSchema: pg.ensureSchema,
394
+ reserve,
395
+ adopt,
396
+ liveFor,
397
+ list,
398
+ reapDetailed,
399
+ reap: async (deps = {}) => (await reapDetailed(deps)).reaped,
400
+ };
401
+ }
402
+ //# sourceMappingURL=head-lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head-lease.js","sourceRoot":"","sources":["../../../src/lib/coordination/head-lease.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface QueryPool {
2
+ query<R = Record<string, unknown>>(sql: string, values?: unknown[]): Promise<{
3
+ rows: R[];
4
+ rowCount: number | null;
5
+ }>;
6
+ }
7
+ export interface PgDeps {
8
+ pool?: QueryPool;
9
+ ensureSchema?: boolean;
10
+ }
11
+ export interface PgBrick {
12
+ ensureSchema(p: QueryPool): Promise<void>;
13
+ poolFor(deps: PgDeps): Promise<QueryPool | undefined>;
14
+ }
15
+ export declare function pgBrick(ddl: readonly string[]): PgBrick;
16
+ export declare const iso: (v: Date | string | null | undefined) => string | null;
17
+ export declare const intervalMs: (n: number) => string;
18
+ export interface KeyPlan<K extends Record<string, number>> {
19
+ fields: (keyof K & string)[];
20
+ columns: string[];
21
+ list: string;
22
+ where(from?: number, alias?: string): string;
23
+ params(from?: number): string;
24
+ values(key: K): number[];
25
+ fromRow(row: Record<string, unknown>): K;
26
+ }
27
+ export declare function keyPlan<K extends Record<string, number>>(map: {
28
+ readonly [F in keyof K]: string;
29
+ }): KeyPlan<K>;
30
+ //# sourceMappingURL=pg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../../../src/lib/coordination/pg.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IAEtB,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;CACvD;AAGD,wBAAgB,OAAO,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CA6BvD;AAGD,eAAO,MAAM,GAAG,GAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAAM,GAAG,IAC7B,CAAC;AAGvC,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,KAAG,MAAgC,CAAC;AAGxE,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IACvD,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,IAAI,EAAE,MAAM,CAAC;IAEb,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE7C,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;CAC1C;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtD,GAAG,EAAE;IACH,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM;CAChC,GACA,OAAO,CAAC,CAAC,CAAC,CAcZ"}
@@ -0,0 +1,52 @@
1
+ import { Pool } from "pg";
2
+ export function pgBrick(ddl) {
3
+ let pool;
4
+ let ensured;
5
+ const envPool = () => {
6
+ const url = process.env.WORKFLOW_POSTGRES_URL;
7
+ if (!url)
8
+ return undefined;
9
+ if (!pool)
10
+ pool = new Pool({ connectionString: url, max: 2 });
11
+ return pool;
12
+ };
13
+ const ensureSchema = (p) => {
14
+ if (!ensured) {
15
+ ensured = (async () => {
16
+ for (const s of ddl)
17
+ await p.query(s);
18
+ })().catch((err) => {
19
+ ensured = undefined;
20
+ throw err;
21
+ });
22
+ }
23
+ return ensured;
24
+ };
25
+ return {
26
+ ensureSchema,
27
+ poolFor: async (deps) => {
28
+ const p = deps.pool ?? envPool();
29
+ if (!p)
30
+ return undefined;
31
+ if (deps.ensureSchema !== false)
32
+ await ensureSchema(p);
33
+ return p;
34
+ },
35
+ };
36
+ }
37
+ export const iso = (v) => v ? new Date(v).toISOString() : null;
38
+ export const intervalMs = (n) => String(Math.max(0, n));
39
+ export function keyPlan(map) {
40
+ const fields = Object.keys(map);
41
+ const columns = fields.map((f) => map[f]);
42
+ return {
43
+ fields,
44
+ columns,
45
+ list: columns.join(", "),
46
+ where: (from = 1, alias = "") => columns.map((c, i) => `${alias}${c} = $${from + i}`).join(" AND "),
47
+ params: (from = 1) => columns.map((_, i) => `$${from + i}`).join(", "),
48
+ values: (key) => fields.map((f) => key[f]),
49
+ fromRow: (row) => Object.fromEntries(fields.map((f, i) => [f, Number(row[columns[i]])])),
50
+ };
51
+ }
52
+ //# sourceMappingURL=pg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.js","sourceRoot":"","sources":["../../../src/lib/coordination/pg.ts"],"names":[],"mappings":"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"}