@intentface/latch-drizzle 0.9.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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/dist/adapter.d.ts +18 -0
  4. package/dist/adapter.d.ts.map +1 -0
  5. package/dist/adapter.js +33 -0
  6. package/dist/adapter.js.map +1 -0
  7. package/dist/adapter.pg.d.ts +10 -0
  8. package/dist/adapter.pg.d.ts.map +1 -0
  9. package/dist/adapter.pg.js +18 -0
  10. package/dist/adapter.pg.js.map +1 -0
  11. package/dist/adapter.shared.d.ts +55 -0
  12. package/dist/adapter.shared.d.ts.map +1 -0
  13. package/dist/adapter.shared.js +527 -0
  14. package/dist/adapter.shared.js.map +1 -0
  15. package/dist/agent-store.d.ts +34 -0
  16. package/dist/agent-store.d.ts.map +1 -0
  17. package/dist/agent-store.js +236 -0
  18. package/dist/agent-store.js.map +1 -0
  19. package/dist/agent-store.smoke.d.ts +2 -0
  20. package/dist/agent-store.smoke.d.ts.map +1 -0
  21. package/dist/agent-store.smoke.js +77 -0
  22. package/dist/agent-store.smoke.js.map +1 -0
  23. package/dist/index.d.ts +24 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +22 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/limit-store.d.ts +5 -0
  28. package/dist/limit-store.d.ts.map +1 -0
  29. package/dist/limit-store.js +7 -0
  30. package/dist/limit-store.js.map +1 -0
  31. package/dist/limit-store.pg.d.ts +5 -0
  32. package/dist/limit-store.pg.d.ts.map +1 -0
  33. package/dist/limit-store.pg.js +7 -0
  34. package/dist/limit-store.pg.js.map +1 -0
  35. package/dist/limit-store.shared.d.ts +14 -0
  36. package/dist/limit-store.shared.d.ts.map +1 -0
  37. package/dist/limit-store.shared.js +60 -0
  38. package/dist/limit-store.shared.js.map +1 -0
  39. package/dist/limit-store.smoke.shared.d.ts +7 -0
  40. package/dist/limit-store.smoke.shared.d.ts.map +1 -0
  41. package/dist/limit-store.smoke.shared.js +33 -0
  42. package/dist/limit-store.smoke.shared.js.map +1 -0
  43. package/dist/memory-job-store.d.ts +5 -0
  44. package/dist/memory-job-store.d.ts.map +1 -0
  45. package/dist/memory-job-store.js +7 -0
  46. package/dist/memory-job-store.js.map +1 -0
  47. package/dist/memory-job-store.pg.d.ts +5 -0
  48. package/dist/memory-job-store.pg.d.ts.map +1 -0
  49. package/dist/memory-job-store.pg.js +7 -0
  50. package/dist/memory-job-store.pg.js.map +1 -0
  51. package/dist/memory-job-store.shared.d.ts +23 -0
  52. package/dist/memory-job-store.shared.d.ts.map +1 -0
  53. package/dist/memory-job-store.shared.js +294 -0
  54. package/dist/memory-job-store.shared.js.map +1 -0
  55. package/dist/memory-job-store.smoke.shared.d.ts +18 -0
  56. package/dist/memory-job-store.smoke.shared.d.ts.map +1 -0
  57. package/dist/memory-job-store.smoke.shared.js +149 -0
  58. package/dist/memory-job-store.smoke.shared.js.map +1 -0
  59. package/dist/migrate.d.ts +10 -0
  60. package/dist/migrate.d.ts.map +1 -0
  61. package/dist/migrate.js +202 -0
  62. package/dist/migrate.js.map +1 -0
  63. package/dist/migrate.pg.d.ts +3 -0
  64. package/dist/migrate.pg.d.ts.map +1 -0
  65. package/dist/migrate.pg.js +120 -0
  66. package/dist/migrate.pg.js.map +1 -0
  67. package/dist/run-lease.smoke.shared.d.ts +13 -0
  68. package/dist/run-lease.smoke.shared.d.ts.map +1 -0
  69. package/dist/run-lease.smoke.shared.js +65 -0
  70. package/dist/run-lease.smoke.shared.js.map +1 -0
  71. package/dist/schedule.smoke.shared.d.ts +16 -0
  72. package/dist/schedule.smoke.shared.d.ts.map +1 -0
  73. package/dist/schedule.smoke.shared.js +104 -0
  74. package/dist/schedule.smoke.shared.js.map +1 -0
  75. package/dist/schema.d.ts +2348 -0
  76. package/dist/schema.d.ts.map +1 -0
  77. package/dist/schema.js +225 -0
  78. package/dist/schema.js.map +1 -0
  79. package/dist/schema.pg.d.ts +2215 -0
  80. package/dist/schema.pg.d.ts.map +1 -0
  81. package/dist/schema.pg.js +197 -0
  82. package/dist/schema.pg.js.map +1 -0
  83. package/dist/secret-store.d.ts +11 -0
  84. package/dist/secret-store.d.ts.map +1 -0
  85. package/dist/secret-store.js +11 -0
  86. package/dist/secret-store.js.map +1 -0
  87. package/dist/secret-store.pg.d.ts +6 -0
  88. package/dist/secret-store.pg.d.ts.map +1 -0
  89. package/dist/secret-store.pg.js +7 -0
  90. package/dist/secret-store.pg.js.map +1 -0
  91. package/dist/secret-store.shared.d.ts +25 -0
  92. package/dist/secret-store.shared.d.ts.map +1 -0
  93. package/dist/secret-store.shared.js +67 -0
  94. package/dist/secret-store.shared.js.map +1 -0
  95. package/dist/smoke.d.ts +2 -0
  96. package/dist/smoke.d.ts.map +1 -0
  97. package/dist/smoke.js +108 -0
  98. package/dist/smoke.js.map +1 -0
  99. package/dist/smoke.pg.d.ts +2 -0
  100. package/dist/smoke.pg.d.ts.map +1 -0
  101. package/dist/smoke.pg.js +107 -0
  102. package/dist/smoke.pg.js.map +1 -0
  103. package/package.json +62 -0
@@ -0,0 +1,5 @@
1
+ import type { PgDatabase } from "drizzle-orm/pg-core";
2
+ import type { MemoryJobStore } from "@intentface/latch-memory";
3
+ /** MemoryJobStore on a Drizzle Postgres database (node-postgres / postgres-js / PGlite). */
4
+ export declare function createPostgresMemoryJobStore(db: PgDatabase<any, any, any>): MemoryJobStore;
5
+ //# sourceMappingURL=memory-job-store.pg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-job-store.pg.d.ts","sourceRoot":"","sources":["../src/memory-job-store.pg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,4FAA4F;AAC5F,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,cAAc,CAE1F"}
@@ -0,0 +1,7 @@
1
+ import * as schema from "./schema.pg.js";
2
+ import { makeMemoryJobStore } from "./memory-job-store.shared.js";
3
+ /** MemoryJobStore on a Drizzle Postgres database (node-postgres / postgres-js / PGlite). */
4
+ export function createPostgresMemoryJobStore(db) {
5
+ return makeMemoryJobStore(db, schema);
6
+ }
7
+ //# sourceMappingURL=memory-job-store.pg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-job-store.pg.js","sourceRoot":"","sources":["../src/memory-job-store.pg.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,4FAA4F;AAC5F,MAAM,UAAU,4BAA4B,CAAC,EAA6B;IACxE,OAAO,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { MemoryJobStore } from "@intentface/latch-memory";
2
+ /**
3
+ * Dialect-shared MemoryJobStore implementation. The sqlite and pg entry points
4
+ * pass their dialect's schema tables; every query below uses the common
5
+ * query-builder surface (insert/onConflict/update/returning), which both
6
+ * dialects support.
7
+ *
8
+ * SECURITY: the list/read ops here are SYSTEM ops — principal-free and
9
+ * cross-tenant (the `claimDueSchedules` precedent). Results must only feed
10
+ * runs executed under the chat's own reconstructed principal.
11
+ */
12
+ /** The tables the job store touches, in either dialect's schema. */
13
+ interface MemoryJobSchema {
14
+ chats: any;
15
+ messages: any;
16
+ runs: any;
17
+ memoryChatState: any;
18
+ memoryScopeState: any;
19
+ memoryUsage: any;
20
+ }
21
+ export declare function makeMemoryJobStore(db: any, s: MemoryJobSchema): MemoryJobStore;
22
+ export {};
23
+ //# sourceMappingURL=memory-job-store.shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-job-store.shared.d.ts","sourceRoot":"","sources":["../src/memory-job-store.shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EAGf,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;GASG;AAEH,oEAAoE;AACpE,UAAU,eAAe;IACvB,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,GAAG,CAAC;IACV,eAAe,EAAE,GAAG,CAAC;IACrB,gBAAgB,EAAE,GAAG,CAAC;IACtB,WAAW,EAAE,GAAG,CAAC;CAClB;AAsBD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,eAAe,GAAG,cAAc,CA2U9E"}
@@ -0,0 +1,294 @@
1
+ import { and, desc, eq, inArray, isNull, lt, lte, or, sql } from "drizzle-orm";
2
+ const PENDING_EPISODES_MAX = 100;
3
+ /** Safety valve: never load more rows than could plausibly fill the char cap. */
4
+ const MESSAGES_AFTER_ROW_CAP = 500;
5
+ function textOfParts(parts) {
6
+ if (!Array.isArray(parts))
7
+ return "";
8
+ return parts
9
+ .map((p) => p && typeof p === "object" && p.type === "text"
10
+ ? String(p.text ?? "")
11
+ : "")
12
+ .filter(Boolean)
13
+ .join("\n");
14
+ }
15
+ function pendingOf(value) {
16
+ return Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
17
+ }
18
+ export function makeMemoryJobStore(db, s) {
19
+ const cs = s.memoryChatState;
20
+ const ss = s.memoryScopeState;
21
+ const mu = s.memoryUsage;
22
+ const rowToScopeState = (r) => ({
23
+ scopeKey: r.scopeKey,
24
+ owner: r.owner,
25
+ agent: r.agent,
26
+ connection: r.connection,
27
+ identity: r.identity ?? undefined,
28
+ hasNew: r.hasNew === 1,
29
+ pendingEpisodes: pendingOf(r.pendingEpisodes),
30
+ consolidationWatermark: r.consolidationWatermark ?? undefined,
31
+ lastConsolidatedAt: r.lastConsolidatedAt ?? undefined,
32
+ nextEligibleAt: r.nextEligibleAt,
33
+ failures: r.failures,
34
+ });
35
+ return {
36
+ async listExtractionCandidates({ now, idleMs, agents, limit }) {
37
+ if (agents.length === 0)
38
+ return [];
39
+ const maxSeqExpr = sql `(select max(${s.messages.seq}) from ${s.messages} where ${s.messages.chatId} = ${s.chats.id})`;
40
+ const rows = await db
41
+ .select({
42
+ chatId: s.chats.id,
43
+ owner: s.chats.owner,
44
+ agent: s.chats.agent,
45
+ updatedAt: s.chats.updatedAt,
46
+ lastExtractedSeq: sql `coalesce(${cs.lastExtractedSeq}, -1)`,
47
+ lastExtractedKey: cs.lastExtractedKey,
48
+ maxSeq: maxSeqExpr,
49
+ // Left join: a never-seen chat has no state row, so 0 failures.
50
+ failures: sql `coalesce(${cs.failures}, 0)`,
51
+ })
52
+ .from(s.chats)
53
+ .leftJoin(cs, eq(cs.chatId, s.chats.id))
54
+ .where(and(eq(s.chats.kind, "user"), inArray(s.chats.agent, agents), lte(s.chats.updatedAt, now - idleMs),
55
+ // Never seen, or eligible again and not currently leased.
56
+ or(isNull(cs.chatId), and(lte(cs.nextEligibleAt, now), or(isNull(cs.leaseOwner), lt(cs.leaseExpiresAt, now)))), sql `${maxSeqExpr} > coalesce(${cs.lastExtractedSeq}, -1)`))
57
+ .orderBy(desc(s.chats.updatedAt))
58
+ .limit(limit);
59
+ return rows
60
+ .filter((r) => r.maxSeq != null)
61
+ .map((r) => ({
62
+ ...r,
63
+ lastExtractedKey: r.lastExtractedKey ?? undefined,
64
+ }));
65
+ },
66
+ async latestRunIdentity(chatId) {
67
+ const rows = await db
68
+ .select({ identity: s.runs.identity })
69
+ .from(s.runs)
70
+ .where(eq(s.runs.chatId, chatId))
71
+ .orderBy(desc(s.runs.startedAt))
72
+ .limit(1);
73
+ return rows[0]?.identity ?? undefined;
74
+ },
75
+ async messagesAfter(chatId, afterSeq, maxChars) {
76
+ const rows = await db
77
+ .select({ seq: s.messages.seq, role: s.messages.role, parts: s.messages.parts })
78
+ .from(s.messages)
79
+ .where(and(eq(s.messages.chatId, chatId), sql `${s.messages.seq} > ${afterSeq}`))
80
+ .orderBy(s.messages.seq)
81
+ .limit(MESSAGES_AFTER_ROW_CAP);
82
+ const out = [];
83
+ let used = 0;
84
+ for (const r of rows) {
85
+ const text = textOfParts(r.parts);
86
+ if (!text)
87
+ continue;
88
+ const remaining = maxChars - used;
89
+ if (remaining <= 0)
90
+ break;
91
+ const clipped = text.length > remaining ? `${text.slice(0, remaining)}…` : text;
92
+ out.push({ seq: r.seq, role: r.role, text: clipped });
93
+ used += clipped.length;
94
+ }
95
+ return out;
96
+ },
97
+ async claimChatExtraction(chatId, meta, leaseOwner, ttlMs, now) {
98
+ await db
99
+ .insert(cs)
100
+ .values({
101
+ chatId,
102
+ owner: meta.owner,
103
+ agent: meta.agent,
104
+ scopeKey: meta.scopeKey,
105
+ lastExtractedSeq: -1,
106
+ nextEligibleAt: 0,
107
+ failures: 0,
108
+ createdAt: now,
109
+ updatedAt: now,
110
+ })
111
+ .onConflictDoNothing();
112
+ const claimed = await db
113
+ .update(cs)
114
+ .set({ leaseOwner, leaseExpiresAt: now + ttlMs, updatedAt: now })
115
+ .where(and(eq(cs.chatId, chatId), lte(cs.nextEligibleAt, now), or(isNull(cs.leaseOwner), lt(cs.leaseExpiresAt, now))))
116
+ .returning({ chatId: cs.chatId });
117
+ return claimed.length > 0;
118
+ },
119
+ async completeChatExtraction(chatId, patch, leaseOwner) {
120
+ const now = Date.now();
121
+ await db
122
+ .update(cs)
123
+ .set({
124
+ ...(patch.ok && patch.lastExtractedSeq !== undefined
125
+ ? { lastExtractedSeq: patch.lastExtractedSeq }
126
+ : {}),
127
+ // The idempotency key advances only with a COMPLETED run — a failed
128
+ // attempt must leave the previous key (and thus retryability) intact.
129
+ ...(patch.ok && patch.extractionKey !== undefined
130
+ ? { lastExtractedKey: patch.extractionKey }
131
+ : {}),
132
+ failures: patch.ok ? 0 : sql `${cs.failures} + 1`,
133
+ nextEligibleAt: patch.nextEligibleAt,
134
+ leaseOwner: null,
135
+ leaseExpiresAt: null,
136
+ updatedAt: now,
137
+ })
138
+ // Fenced by the claim lease (the completeSchedule pattern).
139
+ .where(and(eq(cs.chatId, chatId), eq(cs.leaseOwner, leaseOwner)));
140
+ },
141
+ async touchScope(args, opts) {
142
+ const { now, cooldownMs } = opts;
143
+ // Ensure-then-update: the empty insert is race-tolerant, and the update
144
+ // recomputes everything from the row it reads. A lost race between two
145
+ // concurrent touches can drop one pending path — the pending list is an
146
+ // optimization; the consolidator reads the index/episodes it's given.
147
+ await db
148
+ .insert(ss)
149
+ .values({
150
+ scopeKey: args.scopeKey,
151
+ owner: args.owner,
152
+ agent: args.agent,
153
+ connection: args.connection,
154
+ identity: args.identity ?? null,
155
+ hasNew: 0,
156
+ pendingEpisodes: [],
157
+ nextEligibleAt: 0,
158
+ failures: 0,
159
+ createdAt: now,
160
+ updatedAt: now,
161
+ })
162
+ .onConflictDoNothing();
163
+ const row = (await db.select().from(ss).where(eq(ss.scopeKey, args.scopeKey)).limit(1))[0];
164
+ if (!row)
165
+ return;
166
+ const pending = pendingOf(row.pendingEpisodes);
167
+ if (args.episodePath && !pending.includes(args.episodePath)) {
168
+ pending.push(args.episodePath);
169
+ if (pending.length > PENDING_EPISODES_MAX)
170
+ pending.splice(0, pending.length - PENDING_EPISODES_MAX);
171
+ }
172
+ await db
173
+ .update(ss)
174
+ .set({
175
+ hasNew: 1,
176
+ identity: args.identity ?? row.identity,
177
+ pendingEpisodes: pending,
178
+ // Respect a failure backoff and the consolidation cooldown; a fresh
179
+ // scope (both 0) becomes eligible immediately.
180
+ nextEligibleAt: Math.max(row.nextEligibleAt ?? 0, (row.lastConsolidatedAt ?? 0) + cooldownMs),
181
+ // Strictly increasing, so completeScopeConsolidation's updatedAt CAS
182
+ // always sees a same-millisecond touch as a conflict.
183
+ updatedAt: Math.max(now, (row.updatedAt ?? 0) + 1),
184
+ })
185
+ .where(eq(ss.scopeKey, args.scopeKey));
186
+ },
187
+ async listConsolidationCandidates({ now, limit }) {
188
+ const rows = await db
189
+ .select()
190
+ .from(ss)
191
+ .where(and(eq(ss.hasNew, 1), lte(ss.nextEligibleAt, now), or(isNull(ss.leaseOwner), lt(ss.leaseExpiresAt, now))))
192
+ .orderBy(ss.nextEligibleAt)
193
+ .limit(limit);
194
+ return rows.map(rowToScopeState);
195
+ },
196
+ async scopeState(scopeKey) {
197
+ const row = (await db.select().from(ss).where(eq(ss.scopeKey, scopeKey)).limit(1))[0];
198
+ return row ? rowToScopeState(row) : undefined;
199
+ },
200
+ async claimScopeConsolidation(scopeKey, leaseOwner, ttlMs, now) {
201
+ const claimed = await db
202
+ .update(ss)
203
+ .set({ leaseOwner, leaseExpiresAt: now + ttlMs, updatedAt: now })
204
+ .where(and(eq(ss.scopeKey, scopeKey), eq(ss.hasNew, 1), lte(ss.nextEligibleAt, now), or(isNull(ss.leaseOwner), lt(ss.leaseExpiresAt, now))))
205
+ .returning({ scopeKey: ss.scopeKey });
206
+ return claimed.length > 0;
207
+ },
208
+ async completeScopeConsolidation(scopeKey, patch, leaseOwner) {
209
+ if (!patch.ok) {
210
+ // Failure path touches no episode state — a plain fenced update is safe.
211
+ await db
212
+ .update(ss)
213
+ .set({
214
+ failures: sql `${ss.failures} + 1`,
215
+ nextEligibleAt: patch.nextEligibleAt,
216
+ leaseOwner: null,
217
+ leaseExpiresAt: null,
218
+ updatedAt: Date.now(),
219
+ })
220
+ .where(and(eq(ss.scopeKey, scopeKey), eq(ss.leaseOwner, leaseOwner)));
221
+ return;
222
+ }
223
+ // Success rewrites pendingEpisodes/hasNew from a read — a touchScope
224
+ // landing between the read and the write would be clobbered (its new
225
+ // episode dropped AND the dirty flag cleared). CAS on updatedAt and
226
+ // retry so a concurrent touch's episode always survives.
227
+ const consumed = new Set(patch.consumedEpisodes ?? []);
228
+ for (let attempt = 0; attempt < 5; attempt++) {
229
+ const now = Date.now();
230
+ const row = (await db
231
+ .select()
232
+ .from(ss)
233
+ .where(and(eq(ss.scopeKey, scopeKey), eq(ss.leaseOwner, leaseOwner)))
234
+ .limit(1))[0];
235
+ if (!row)
236
+ return; // lease lost — another node owns the row now
237
+ const remaining = pendingOf(row.pendingEpisodes).filter((p) => !consumed.has(p));
238
+ const updated = await db
239
+ .update(ss)
240
+ .set({
241
+ hasNew: remaining.length > 0 ? 1 : 0,
242
+ pendingEpisodes: remaining,
243
+ ...(patch.watermark ? { consolidationWatermark: patch.watermark } : {}),
244
+ lastConsolidatedAt: now,
245
+ nextEligibleAt: patch.nextEligibleAt,
246
+ failures: 0,
247
+ leaseOwner: null,
248
+ leaseExpiresAt: null,
249
+ updatedAt: Math.max(now, row.updatedAt + 1), // CAS token must move
250
+ })
251
+ .where(and(eq(ss.scopeKey, scopeKey), eq(ss.leaseOwner, leaseOwner), eq(ss.updatedAt, row.updatedAt)))
252
+ .returning({ scopeKey: ss.scopeKey });
253
+ if (updated.length > 0)
254
+ return;
255
+ // CAS conflict: a touch moved the row — re-read and re-apply.
256
+ }
257
+ // Persistently contended (shouldn't happen): release the lease and
258
+ // advance eligibility WITHOUT touching pendingEpisodes/hasNew — the
259
+ // consumed episodes get re-consolidated next pass, nothing is lost.
260
+ await db
261
+ .update(ss)
262
+ .set({
263
+ lastConsolidatedAt: Date.now(),
264
+ nextEligibleAt: patch.nextEligibleAt,
265
+ failures: 0,
266
+ leaseOwner: null,
267
+ leaseExpiresAt: null,
268
+ updatedAt: Date.now(),
269
+ })
270
+ .where(and(eq(ss.scopeKey, scopeKey), eq(ss.leaseOwner, leaseOwner)));
271
+ },
272
+ async recordUsage(scopeKey, memoryIds, at) {
273
+ for (const memoryId of memoryIds) {
274
+ await db
275
+ .insert(mu)
276
+ .values({ scopeKey, memoryId, usageCount: 1, lastUsedAt: at, createdAt: at })
277
+ .onConflictDoUpdate({
278
+ target: [mu.scopeKey, mu.memoryId],
279
+ set: { usageCount: sql `${mu.usageCount} + 1`, lastUsedAt: at },
280
+ });
281
+ }
282
+ },
283
+ async usageFor(scopeKey) {
284
+ const rows = await db.select().from(mu).where(eq(mu.scopeKey, scopeKey));
285
+ return rows.map((r) => ({
286
+ memoryId: r.memoryId,
287
+ usageCount: r.usageCount,
288
+ lastUsedAt: r.lastUsedAt ?? undefined,
289
+ createdAt: r.createdAt,
290
+ }));
291
+ },
292
+ };
293
+ }
294
+ //# sourceMappingURL=memory-job-store.shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-job-store.shared.js","sourceRoot":"","sources":["../src/memory-job-store.shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { StorageAdapter } from "@intentface/latch-core";
2
+ import type { MemoryJobStore } from "@intentface/latch-memory";
3
+ /**
4
+ * Dialect-shared smoke for the MemoryJobStore: candidate gating (idle /
5
+ * watermark / lease), claim races, completion fencing, scope touch/claim/
6
+ * complete, and usage upserts. Called by both `smoke.ts` and `smoke.pg.ts`
7
+ * with their dialect's stores.
8
+ */
9
+ export declare function memoryJobStoreSmoke<P extends {
10
+ org: string;
11
+ user?: string;
12
+ }>(args: {
13
+ jobs: MemoryJobStore;
14
+ store: StorageAdapter<P>;
15
+ principal: P;
16
+ assert: (cond: boolean, msg: string) => void;
17
+ }): Promise<void>;
18
+ //# sourceMappingURL=memory-job-store.smoke.shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-job-store.smoke.shared.d.ts","sourceRoot":"","sources":["../src/memory-job-store.smoke.shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,SAAS;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE;IACxF,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACzB,SAAS,EAAE,CAAC,CAAC;IACb,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,GAAG,OAAO,CAAC,IAAI,CAAC,CAgOhB"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Dialect-shared smoke for the MemoryJobStore: candidate gating (idle /
3
+ * watermark / lease), claim races, completion fencing, scope touch/claim/
4
+ * complete, and usage upserts. Called by both `smoke.ts` and `smoke.pg.ts`
5
+ * with their dialect's stores.
6
+ */
7
+ export async function memoryJobStoreSmoke(args) {
8
+ const { jobs, store, principal: me, assert } = args;
9
+ const HOUR = 3_600_000;
10
+ const chat = await store.createChat(me, { agent: "mem-coach" });
11
+ const msg = (id, role, text) => ({
12
+ id,
13
+ role,
14
+ parts: [{ type: "text", text }],
15
+ metadata: { visibility: "user", createdAt: Date.now() },
16
+ });
17
+ await store.appendMessages(chat.id, [msg("m1", "user", "hello"), msg("m2", "assistant", "hi!")]);
18
+ await store.createRun(me, { chatId: chat.id, agent: "mem-coach" });
19
+ const t0 = Date.now();
20
+ const fresh = await jobs.listExtractionCandidates({
21
+ now: t0,
22
+ idleMs: HOUR,
23
+ agents: ["mem-coach"],
24
+ limit: 10,
25
+ });
26
+ assert(fresh.length === 0, "active chat is idle-gated out of extraction");
27
+ const t1 = t0 + 2 * HOUR;
28
+ const cands = await jobs.listExtractionCandidates({
29
+ now: t1,
30
+ idleMs: HOUR,
31
+ agents: ["mem-coach"],
32
+ limit: 10,
33
+ });
34
+ assert(cands.length === 1 && cands[0].chatId === chat.id, "idle chat becomes a candidate");
35
+ assert(cands[0].lastExtractedSeq === -1 && cands[0].maxSeq === 1, "candidate carries seq range");
36
+ const otherAgent = await jobs.listExtractionCandidates({
37
+ now: t1,
38
+ idleMs: HOUR,
39
+ agents: ["someone-else"],
40
+ limit: 10,
41
+ });
42
+ assert(otherAgent.length === 0, "agent filter applies");
43
+ const identity = await jobs.latestRunIdentity(chat.id);
44
+ assert(JSON.stringify(identity) === JSON.stringify(me), "latest run identity round-trips");
45
+ const msgs = await jobs.messagesAfter(chat.id, -1, 10_000);
46
+ assert(msgs.length === 2 && msgs[0].text === "hello" && msgs[1].seq === 1, "messagesAfter returns ordered plain text");
47
+ const capped = await jobs.messagesAfter(chat.id, -1, 3);
48
+ assert(capped.length === 1 && capped[0].text.length <= 4, "messagesAfter respects the char cap");
49
+ const meta = { owner: cands[0].owner, agent: "mem-coach", scopeKey: "conn:_memory/mem-coach/u-x" };
50
+ assert((await jobs.claimChatExtraction(chat.id, meta, "node1", 60_000, t1)) === true, "first extraction claim wins");
51
+ assert((await jobs.claimChatExtraction(chat.id, meta, "node2", 60_000, t1)) === false, "second concurrent claim loses");
52
+ const whileLeased = await jobs.listExtractionCandidates({
53
+ now: t1,
54
+ idleMs: HOUR,
55
+ agents: ["mem-coach"],
56
+ limit: 10,
57
+ });
58
+ assert(whileLeased.length === 0, "leased chat is not re-listed");
59
+ await jobs.completeChatExtraction(chat.id, { lastExtractedSeq: 1, ok: true, nextEligibleAt: t1 + HOUR }, "node2");
60
+ await jobs.completeChatExtraction(chat.id, { lastExtractedSeq: 1, extractionKey: "x1:aaaa", ok: true, nextEligibleAt: t1 + HOUR }, "node1");
61
+ const afterDone = await jobs.listExtractionCandidates({
62
+ now: t1 + 3 * HOUR,
63
+ idleMs: HOUR,
64
+ agents: ["mem-coach"],
65
+ limit: 10,
66
+ });
67
+ assert(afterDone.length === 0, "fully extracted chat (watermark = maxSeq) is not a candidate");
68
+ // ---- extraction idempotency key ----
69
+ await store.appendMessages(chat.id, [msg("m3", "user", "one more thing")]);
70
+ const withKey = await jobs.listExtractionCandidates({
71
+ now: t1 + 5 * HOUR,
72
+ idleMs: HOUR,
73
+ agents: ["mem-coach"],
74
+ limit: 10,
75
+ });
76
+ assert(withKey.length === 1 && withKey[0].lastExtractedKey === "x1:aaaa", "candidate carries the last completed run's idempotency key");
77
+ assert((await jobs.claimChatExtraction(chat.id, meta, "node1", 60_000, t1 + 5 * HOUR)) === true, "chat with new messages is claimable again");
78
+ // A FAILED attempt must not clobber the key (nor advance the watermark) —
79
+ // the window stays retryable under its previous identity.
80
+ await jobs.completeChatExtraction(chat.id, { extractionKey: "x1:bbbb", ok: false, nextEligibleAt: t1 + 5 * HOUR }, "node1");
81
+ const afterFail = await jobs.listExtractionCandidates({
82
+ now: t1 + 6 * HOUR,
83
+ idleMs: HOUR,
84
+ agents: ["mem-coach"],
85
+ limit: 10,
86
+ });
87
+ assert(afterFail.length === 1 &&
88
+ afterFail[0].lastExtractedKey === "x1:aaaa" &&
89
+ afterFail[0].lastExtractedSeq === 1, "failed completion leaves key and watermark untouched (retryable)");
90
+ assert((await jobs.claimChatExtraction(chat.id, meta, "node1", 60_000, t1 + 6 * HOUR)) === true, "failed chat is claimable again after backoff");
91
+ await jobs.completeChatExtraction(chat.id, { lastExtractedSeq: 2, extractionKey: "x1:cccc", ok: true, nextEligibleAt: t1 + 7 * HOUR }, "node1");
92
+ const afterTombstone = await jobs.listExtractionCandidates({
93
+ now: t1 + 9 * HOUR,
94
+ idleMs: HOUR,
95
+ agents: ["mem-coach"],
96
+ limit: 10,
97
+ });
98
+ assert(afterTombstone.length === 0, "completed run (even zero-yield) tombstones the window via watermark + key");
99
+ // ---- scope consolidation state ----
100
+ const scopeKey = "conn:_memory/mem-coach/u-x";
101
+ await jobs.touchScope({
102
+ scopeKey,
103
+ owner: meta.owner,
104
+ agent: "mem-coach",
105
+ connection: "conn",
106
+ identity: me,
107
+ episodePath: "_memory/mem-coach/u-x/episodes/2026-07-27-10-00-a.md",
108
+ }, { cooldownMs: 1_000, now: t1 });
109
+ await jobs.touchScope({
110
+ scopeKey,
111
+ owner: meta.owner,
112
+ agent: "mem-coach",
113
+ connection: "conn",
114
+ identity: me,
115
+ episodePath: "_memory/mem-coach/u-x/episodes/2026-07-27-11-00-b.md",
116
+ }, { cooldownMs: 1_000, now: t1 });
117
+ const scopes = await jobs.listConsolidationCandidates({ now: t1 + 2_000, limit: 10 });
118
+ assert(scopes.length === 1 && scopes[0].pendingEpisodes.length === 2, "touched scope is due with its pending episodes");
119
+ assert(JSON.stringify(scopes[0].identity) === JSON.stringify(me), "scope carries the touch identity");
120
+ assert((await jobs.claimScopeConsolidation(scopeKey, "node1", 60_000, t1 + 2_000)) === true, "first consolidation claim wins");
121
+ assert((await jobs.claimScopeConsolidation(scopeKey, "node2", 60_000, t1 + 2_000)) === false, "second consolidation claim loses");
122
+ await jobs.completeScopeConsolidation(scopeKey, {
123
+ ok: true,
124
+ watermark: "2026-07-27-10-00-a.md",
125
+ nextEligibleAt: t1 + HOUR,
126
+ // Only the first episode was folded in — the second must survive.
127
+ consumedEpisodes: ["_memory/mem-coach/u-x/episodes/2026-07-27-10-00-a.md"],
128
+ }, "node1");
129
+ const remaining = await jobs.listConsolidationCandidates({ now: t1 + 2 * HOUR, limit: 10 });
130
+ assert(remaining.length === 1 && remaining[0].pendingEpisodes.length === 1, "unconsumed episode keeps the scope dirty");
131
+ assert((await jobs.claimScopeConsolidation(scopeKey, "node1", 60_000, t1 + 2 * HOUR)) === true, "scope claimable again after cooldown");
132
+ await jobs.completeScopeConsolidation(scopeKey, {
133
+ ok: true,
134
+ watermark: "2026-07-27-11-00-b.md",
135
+ nextEligibleAt: t1 + 3 * HOUR,
136
+ consumedEpisodes: ["_memory/mem-coach/u-x/episodes/2026-07-27-11-00-b.md"],
137
+ }, "node1");
138
+ const clean = await jobs.listConsolidationCandidates({ now: t1 + 100 * HOUR, limit: 10 });
139
+ assert(clean.length === 0, "fully consolidated scope is clean (hasNew cleared)");
140
+ // ---- usage / retention ----
141
+ await jobs.recordUsage(scopeKey, ["m-aaaaaa"], t1);
142
+ await jobs.recordUsage(scopeKey, ["m-aaaaaa", "m-bbbbbb"], t1 + 5);
143
+ const usage = await jobs.usageFor(scopeKey);
144
+ const a = usage.find((u) => u.memoryId === "m-aaaaaa");
145
+ const b = usage.find((u) => u.memoryId === "m-bbbbbb");
146
+ assert(a?.usageCount === 2 && a.lastUsedAt === t1 + 5, "usage upsert increments + stamps");
147
+ assert(b?.usageCount === 1, "new memory id starts at 1");
148
+ }
149
+ //# sourceMappingURL=memory-job-store.smoke.shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-job-store.smoke.shared.js","sourceRoot":"","sources":["../src/memory-job-store.smoke.shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Client } from "@libsql/client";
2
+ /**
3
+ * Run the schema against any executor — a driver-agnostic seam so a consumer on
4
+ * a non-libsql driver (e.g. better-sqlite3's `db.run`) can create the tables
5
+ * without pulling in a libsql `Client`. `exec` runs one statement; ALTERs that
6
+ * fail because the column already exists are swallowed.
7
+ */
8
+ export declare function migrateWith(exec: (sql: string) => unknown | Promise<unknown>): Promise<void>;
9
+ export declare function migrate(client: Client): Promise<void>;
10
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AA2I7C;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAChD,OAAO,CAAC,IAAI,CAAC,CAef;AA2CD,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3D"}