pilotswarm-horizon-store 0.2.2

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 (71) hide show
  1. package/README.md +154 -0
  2. package/dist/src/agent-tools.d.ts +32 -0
  3. package/dist/src/agent-tools.d.ts.map +1 -0
  4. package/dist/src/agent-tools.js +263 -0
  5. package/dist/src/agent-tools.js.map +1 -0
  6. package/dist/src/config.d.ts +93 -0
  7. package/dist/src/config.d.ts.map +1 -0
  8. package/dist/src/config.js +120 -0
  9. package/dist/src/config.js.map +1 -0
  10. package/dist/src/db-retry.d.ts +21 -0
  11. package/dist/src/db-retry.d.ts.map +1 -0
  12. package/dist/src/db-retry.js +94 -0
  13. package/dist/src/db-retry.js.map +1 -0
  14. package/dist/src/embedding-client.d.ts +13 -0
  15. package/dist/src/embedding-client.d.ts.map +1 -0
  16. package/dist/src/embedding-client.js +79 -0
  17. package/dist/src/embedding-client.js.map +1 -0
  18. package/dist/src/graph-model.d.ts +49 -0
  19. package/dist/src/graph-model.d.ts.map +1 -0
  20. package/dist/src/graph-model.js +112 -0
  21. package/dist/src/graph-model.js.map +1 -0
  22. package/dist/src/graph-queries.d.ts +83 -0
  23. package/dist/src/graph-queries.d.ts.map +1 -0
  24. package/dist/src/graph-queries.js +727 -0
  25. package/dist/src/graph-queries.js.map +1 -0
  26. package/dist/src/graph-store.d.ts +57 -0
  27. package/dist/src/graph-store.d.ts.map +1 -0
  28. package/dist/src/graph-store.js +327 -0
  29. package/dist/src/graph-store.js.map +1 -0
  30. package/dist/src/horizon-migrator.d.ts +49 -0
  31. package/dist/src/horizon-migrator.d.ts.map +1 -0
  32. package/dist/src/horizon-migrator.js +231 -0
  33. package/dist/src/horizon-migrator.js.map +1 -0
  34. package/dist/src/horizon-store.d.ts +116 -0
  35. package/dist/src/horizon-store.d.ts.map +1 -0
  36. package/dist/src/horizon-store.js +563 -0
  37. package/dist/src/horizon-store.js.map +1 -0
  38. package/dist/src/index.d.ts +13 -0
  39. package/dist/src/index.d.ts.map +1 -0
  40. package/dist/src/index.js +21 -0
  41. package/dist/src/index.js.map +1 -0
  42. package/dist/src/preconditions.d.ts +16 -0
  43. package/dist/src/preconditions.d.ts.map +1 -0
  44. package/dist/src/preconditions.js +99 -0
  45. package/dist/src/preconditions.js.map +1 -0
  46. package/dist/src/query-builder.d.ts +37 -0
  47. package/dist/src/query-builder.d.ts.map +1 -0
  48. package/dist/src/query-builder.js +82 -0
  49. package/dist/src/query-builder.js.map +1 -0
  50. package/dist/src/sql-util.d.ts +20 -0
  51. package/dist/src/sql-util.d.ts.map +1 -0
  52. package/dist/src/sql-util.js +40 -0
  53. package/dist/src/sql-util.js.map +1 -0
  54. package/dist/src/types.d.ts +16 -0
  55. package/dist/src/types.d.ts.map +1 -0
  56. package/dist/src/types.js +35 -0
  57. package/dist/src/types.js.map +1 -0
  58. package/migrations/0001_facts_table.sql +77 -0
  59. package/migrations/0002_indexes.sql +27 -0
  60. package/migrations/0003_age_bootstrap.sql +13 -0
  61. package/migrations/0004_facts_procs.sql +253 -0
  62. package/migrations/0005_embedder_workflow.sql +119 -0
  63. package/migrations/0006_facts_read_uncrawled_embedded_gate.sql +33 -0
  64. package/migrations/0007_embed_key_value_text.sql +122 -0
  65. package/migrations/0008_embedder_failure_recovery.sql +409 -0
  66. package/migrations/0009_search_text_full_value.sql +52 -0
  67. package/migrations/0010_minimal_two_loop_embedder.sql +392 -0
  68. package/migrations/0011_unified_api_embedder_workflow.sql +273 -0
  69. package/migrations/0012_facts_soft_delete.sql +587 -0
  70. package/migrations/0013_graph_namespaces.sql +60 -0
  71. package/package.json +69 -0
@@ -0,0 +1,563 @@
1
+ // pilotswarm-horizon-store — HorizonDB-backed EnhancedFactStore provider.
2
+ //
3
+ // DROP-IN: implements the full FactStore API with identical semantics, so it
4
+ // can replace PgFactStore anywhere a FactStore is expected. It ADDS:
5
+ // - searchFacts (lexical BM25 / semantic / hybrid — facts store only)
6
+ // - similarFacts (semantic kNN of a known fact; inaccessible anchor ≡ unknown)
7
+ // - crawl tracking (readUncrawledFacts / markFactsCrawled — PRIVILEGED)
8
+ // - the embedder lifecycle (configure/start/stop/status; restart-on-configure)
9
+ //
10
+ // The open knowledge graph is a SEPARATE provider — HorizonDBGraphStore in
11
+ // graph-store.ts (07 D2). This class implements EnhancedFactStore only.
12
+ //
13
+ // Layering (03-design §1): ALL relational + vector data access goes through
14
+ // stored procedures created by the numbered migrations — no inline SQL here
15
+ // (the 04 §6 M1 grep guard enforces it). Graph access goes through
16
+ // graph-queries.ts. df.* calls are durable-orchestration control, not data
17
+ // access.
18
+ import { resolveConfig, buildPoolConfig } from "./config.js";
19
+ import { EmbeddingClient, toVectorLiteral } from "./embedding-client.js";
20
+ import { loadMigrations, runMigrations, HORIZON_FACTS_LOCK_SEED, hashSchemaName, isGraphOwnedMigration } from "./horizon-migrator.js";
21
+ import { assertFactExtensions, assertDurableHttpUsable } from "./preconditions.js";
22
+ import { ident } from "./sql-util.js";
23
+ import { withDbRetry } from "./db-retry.js";
24
+ import { buildLexicalQuery, namespacePrefix, fuseWeighted } from "./query-builder.js";
25
+ function computeScopeKey(key, shared, sessionId) {
26
+ if (shared)
27
+ return `shared:${key}`;
28
+ if (!sessionId)
29
+ throw new Error("Session-scoped facts require a sessionId.");
30
+ return `session:${sessionId}:${key}`;
31
+ }
32
+ /** df-allow-list normalization: the Azure AI Foundry unified host is blocked
33
+ * for df.http; the classic AOAI host points at the same deployment. */
34
+ export function toAllowlistedAzureHost(url) {
35
+ try {
36
+ const u = new URL(url);
37
+ if (u.hostname.endsWith(".services.ai.azure.com")) {
38
+ const sub = u.hostname.slice(0, -".services.ai.azure.com".length);
39
+ u.hostname = `${sub}.openai.azure.com`;
40
+ return { url: u.toString(), rewritten: true };
41
+ }
42
+ }
43
+ catch { /* not a parseable URL — leave as-is */ }
44
+ return { url, rewritten: false };
45
+ }
46
+ const EMBED_VAR_SUFFIXES = ["url", "model", "dim", "key", "keyhdr", "bearer", "inputfield", "timeout", "interval", "batch"];
47
+ export class HorizonDBFactStore {
48
+ cfg;
49
+ pool;
50
+ initialized = false;
51
+ /** Snapshot of the configured endpoint (mirrors the durable vars). */
52
+ embedConfig;
53
+ queryEmbedder;
54
+ /** Capability descriptor (enhancedfactstore 07 §1.4) — HorizonDB always
55
+ * backs multi-signal search (lexical works with no endpoint). `embedder`
56
+ * reflects whether an embedding endpoint was provisioned at construction:
57
+ * the durable in-DB embed loop only runs (and semantic/hybrid return
58
+ * semantic hits) when one is configured. A store created without
59
+ * `embedding` reports `embedder:false` so the runtime can gate the embedder
60
+ * lifecycle on real configuration rather than a hardcoded `true`. */
61
+ capabilities;
62
+ constructor(pool, cfg) {
63
+ this.cfg = cfg;
64
+ this.pool = pool;
65
+ this.capabilities = { search: true, embedder: !!cfg.embedding };
66
+ }
67
+ static async create(config = {}) {
68
+ const cfg = resolveConfig(config);
69
+ // Managed-identity / AAD token auth is not yet implemented in this
70
+ // provider — it would require minting AAD tokens via @azure/identity in
71
+ // a pg `password` callback, and the provider deliberately keeps its
72
+ // runtime dependency surface to `pg` only (07 P2). Fail FAST and loud
73
+ // rather than silently building a pool that ignores the request and
74
+ // authenticates with whatever (if anything) the URL carries.
75
+ if (cfg.useManagedIdentity) {
76
+ throw new Error("HorizonDBFactStore does not support managed-identity (AAD token) auth yet. " +
77
+ "Provide a connection string with embedded credentials, or use the default " +
78
+ "PgFactStore for managed-identity deployments. (enhancedfactstore 07 P5)");
79
+ }
80
+ const { default: pg } = await import("pg");
81
+ const pool = new pg.Pool(buildPoolConfig(cfg.connectionString, cfg.poolMax));
82
+ pool.on("error", (err) => console.error("[horizon-facts] pool error (non-fatal):", err.message));
83
+ return new HorizonDBFactStore(pool, cfg);
84
+ }
85
+ get schema() { return this.cfg.schema; }
86
+ get s() { return ident(this.schema); }
87
+ // ─── lifecycle ────────────────────────────────────────────────────────────
88
+ /**
89
+ * Fail-fast (01 §5.5): verify every required extension is available —
90
+ * itemized error otherwise — then apply the numbered migrations, then
91
+ * verify df.http usability. When the config carries an embedding endpoint,
92
+ * configure the embedder from it.
93
+ */
94
+ async initialize() {
95
+ if (this.initialized)
96
+ return;
97
+ await assertFactExtensions(this.pool);
98
+ await runMigrations(this.pool, this.schema,
99
+ // Facts provider runs the facts migrations only — the graph-owned
100
+ // migrations (AGE bootstrap + namespace registry) belong to
101
+ // HorizonDBGraphStore (07 D2). graphName/registrySchema are still passed
102
+ // for token validation; the filtered set excludes graph-owned files.
103
+ loadMigrations({
104
+ schema: this.schema,
105
+ graphName: this.cfg.graphName,
106
+ registrySchema: this.cfg.registrySchema,
107
+ embeddingDim: this.cfg.embeddingDim,
108
+ }).filter((m) => !isGraphOwnedMigration(m.version)), HORIZON_FACTS_LOCK_SEED);
109
+ await assertDurableHttpUsable(this.pool);
110
+ this.initialized = true;
111
+ if (this.cfg.embedding) {
112
+ // Auto-start the eternal embed loop on init. configureEmbedder with
113
+ // restartIfRunning:false refreshes the durable config vars WITHOUT
114
+ // bouncing a loop another instance already started, and
115
+ // startEmbedder is idempotent + advisory-locked, so repeated /
116
+ // concurrent provider instantiations converge on exactly one
117
+ // running loop per schema rather than creating duplicates.
118
+ //
119
+ // NON-FATAL (07 P5): the durable embedder is a best-effort enhancement.
120
+ // If configure/start fails (endpoint unreachable, df.http hiccup,
121
+ // transient lock contention), the store must still come up so the
122
+ // worker boots — semantic/hybrid search simply degrades to lexical
123
+ // until a later boot or an explicit configureEmbedder() succeeds.
124
+ // `initialized` is already true above, so migrations are never re-run.
125
+ try {
126
+ await this.configureEmbedder(this.cfg.embedding, { restartIfRunning: false });
127
+ await this.startEmbedder();
128
+ }
129
+ catch (err) {
130
+ console.error("[horizon-facts] embedder auto-start failed (non-fatal; search degrades to lexical): " +
131
+ (err?.message || String(err)));
132
+ }
133
+ }
134
+ }
135
+ async close() {
136
+ await this.pool.end();
137
+ }
138
+ async storeFact(input) {
139
+ const inputs = Array.isArray(input) ? input : [input];
140
+ if (inputs.length === 0)
141
+ return { stored: 0, facts: [] };
142
+ const facts = inputs.map((input) => {
143
+ const shared = input.shared === true;
144
+ return {
145
+ scopeKey: computeScopeKey(input.key, shared, input.sessionId),
146
+ key: input.key,
147
+ value: input.value,
148
+ agentId: input.agentId ?? null,
149
+ sessionId: input.sessionId ?? null,
150
+ shared,
151
+ tags: input.tags ?? [],
152
+ };
153
+ });
154
+ await withDbRetry("facts_store", () => this.pool.query(`SELECT ${this.s}.facts_store($1::jsonb)`, [JSON.stringify(facts)]));
155
+ const storedFacts = facts.map((fact) => ({ key: fact.key, shared: fact.shared, stored: true }));
156
+ const result = { stored: facts.length, facts: storedFacts };
157
+ return Array.isArray(input) ? result : result.facts[0];
158
+ }
159
+ async readFacts(query, access) {
160
+ const keyPattern = query.keyPattern
161
+ ? (query.keyPattern.includes("%") ? query.keyPattern : query.keyPattern.replaceAll("*", "%"))
162
+ : null;
163
+ const { rows } = await withDbRetry("facts_read", () => this.pool.query(`SELECT * FROM ${this.s}.facts_read($1, $2, $3, $4, $5, $6, $7, $8, $9)`, [
164
+ access?.readerSessionId ?? query.sessionId ?? null,
165
+ access?.grantedSessionIds ?? [],
166
+ access?.unrestricted === true,
167
+ query.scope ?? "accessible",
168
+ keyPattern,
169
+ query.scopeKeys ?? null,
170
+ query.tags?.length ? query.tags : null,
171
+ query.agentId ?? null,
172
+ Math.min(query.limit ?? 50, 1000),
173
+ ]));
174
+ return { count: rows.length, facts: rows.map(mapFactRow) };
175
+ }
176
+ async deleteFact(input) {
177
+ if (input.pattern === true) {
178
+ const keyPattern = input.key?.includes("%") ? input.key : input.key?.replaceAll("*", "%");
179
+ if (!keyPattern)
180
+ throw new Error("deleteFact pattern mode requires key");
181
+ const scope = input.scope ?? (input.shared === true ? "shared" : "session");
182
+ const { rows } = await withDbRetry("facts_delete", () => this.pool.query(`SELECT ${this.s}.facts_delete($1, $2, $3, $4, $5) AS deleted`, [keyPattern, true, scope, input.sessionId ?? null, input.unrestricted === true]));
183
+ return { keyPattern, scope, deleted: Number(rows[0]?.deleted ?? 0) };
184
+ }
185
+ const shared = input.shared === true;
186
+ const scopeKey = computeScopeKey(input.key, shared, input.sessionId);
187
+ const { rows } = await withDbRetry("facts_delete", () => this.pool.query(`SELECT ${this.s}.facts_delete($1, $2, $3, $4, $5) AS deleted`, [scopeKey, false, null, null, false]));
188
+ return { key: input.key, shared, deleted: Number(rows[0]?.deleted ?? 0) > 0 };
189
+ }
190
+ async deleteSessionFactsForSession(sessionId) {
191
+ const { rows } = await withDbRetry("facts_delete_session", () => this.pool.query(`SELECT ${this.s}.facts_delete_session($1) AS n`, [sessionId]));
192
+ return Number(rows[0]?.n ?? 0);
193
+ }
194
+ async stats(mode, sessionIds) {
195
+ const { rows } = await withDbRetry("facts_stats", () => this.pool.query(`SELECT * FROM ${this.s}.facts_stats($1, $2)`, [mode, sessionIds]));
196
+ return rows.map((r) => ({
197
+ namespace: r.namespace,
198
+ factCount: Number(r.fact_count),
199
+ totalValueBytes: Number(r.total_value_bytes),
200
+ oldestCreatedAt: r.oldest_created_at,
201
+ newestUpdatedAt: r.newest_updated_at,
202
+ }));
203
+ }
204
+ getSessionFactsStats(sessionId) {
205
+ return this.stats("session", [sessionId]);
206
+ }
207
+ getFactsStatsForSessions(sessionIds) {
208
+ return this.stats("sessions", sessionIds);
209
+ }
210
+ getSharedFactsStats() {
211
+ return this.stats("shared", []);
212
+ }
213
+ // ─── enhanced retrieval (02 §3) ───────────────────────────────────────────
214
+ async searchFacts(query, opts = {}, access = {}) {
215
+ const mode = opts.mode ?? "hybrid";
216
+ if (mode !== "lexical" && mode !== "semantic" && mode !== "hybrid") {
217
+ throw new Error(`searchFacts: unknown mode ${JSON.stringify(mode)} (no "graph" mode — use the graph API)`);
218
+ }
219
+ const limit = opts.limit ?? 20;
220
+ const pool = opts.candidatePool ?? 50;
221
+ const normalized = buildLexicalQuery(query);
222
+ if (!normalized)
223
+ return { count: 0, mode, facts: [] }; // defined empty (04 L4)
224
+ const byKey = new Map();
225
+ const records = new Map();
226
+ const upsert = (sk, sig, rec) => {
227
+ const c = byKey.get(sk) ?? { scopeKey: sk };
228
+ Object.assign(c, sig);
229
+ byKey.set(sk, c);
230
+ records.set(sk, rec);
231
+ };
232
+ // A zero weight disables its signal entirely (04 H2/H3: weight
233
+ // overrides emulate the single mode — membership included, not just
234
+ // ranking), and saves the fetch.
235
+ const w = { lexical: opts.weights?.lexical ?? 1, semantic: opts.weights?.semantic ?? 1 };
236
+ const doLexical = mode === "lexical" || (mode === "hybrid" && w.lexical !== 0);
237
+ let doSemantic = mode === "semantic" || (mode === "hybrid" && w.semantic !== 0);
238
+ // Hybrid-degrade (enhancedfactstore 07 P5 / HIGH#5): when no embedding
239
+ // endpoint is configured, the semantic signal cannot run. For HYBRID
240
+ // (the default mode) degrade gracefully to lexical-only instead of
241
+ // throwing — a deployment with search but no embedder must still serve
242
+ // facts_search. For an EXPLICIT `semantic` request we preserve the
243
+ // clear error (the caller asked for something the store can't provide).
244
+ if (doSemantic && !(await this.hasEmbedder())) {
245
+ if (mode === "semantic") {
246
+ throw new Error("semantic search requires a configured embedding endpoint — " +
247
+ "configure horizonEmbed / call configureEmbedder(endpoint) first, or use mode 'lexical'/'hybrid'.");
248
+ }
249
+ doSemantic = false; // hybrid → lexical-only
250
+ }
251
+ if (doLexical) {
252
+ for (const r of await this.lexicalCandidates(normalized, opts, access, pool)) {
253
+ upsert(r.fact.scope_key, { lexical: r.score }, mapFactRow(r.fact));
254
+ }
255
+ }
256
+ if (doSemantic) {
257
+ for (const r of await this.semanticCandidates(query, opts, access, pool)) {
258
+ upsert(r.fact.scope_key, { semantic: r.score }, mapFactRow(r.fact));
259
+ }
260
+ }
261
+ const fused = fuseWeighted([...byKey.values()], opts.weights).slice(0, limit);
262
+ const facts = fused.map((f) => ({
263
+ ...records.get(f.scopeKey),
264
+ score: f.score,
265
+ signals: f.signals,
266
+ }));
267
+ return { count: facts.length, mode, facts };
268
+ }
269
+ aclParams(access, scope) {
270
+ return [
271
+ access.readerSessionId ?? null,
272
+ access.grantedSessionIds ?? [],
273
+ access.unrestricted === true,
274
+ scope ?? "accessible",
275
+ ];
276
+ }
277
+ async lexicalCandidates(query, opts, access, poolN) {
278
+ const { rows } = await withDbRetry("facts_search_lexical", () => this.pool.query(`SELECT * FROM ${this.s}.facts_search_lexical($1, $2, $3, $4, $5, $6, $7, $8)`, [query, ...this.aclParams(access, opts.scope),
279
+ namespacePrefix(opts.namespace), opts.tags?.length ? opts.tags : null, poolN]));
280
+ return rows.map((r) => ({ fact: r, score: Number(r.rank) }));
281
+ }
282
+ async semanticCandidates(query, opts, access, poolN) {
283
+ const embedder = await this.requireQueryEmbedder();
284
+ const vec = toVectorLiteral(await embedder.client.embed(query));
285
+ const { rows } = await withDbRetry("facts_search_semantic", () => this.pool.query(`SELECT * FROM ${this.s}.facts_search_semantic($1::vector, $2, $3, $4, $5, $6, $7, $8, $9, $10)`, [vec, embedder.model, ...this.aclParams(access, opts.scope),
286
+ namespacePrefix(opts.namespace), opts.tags?.length ? opts.tags : null,
287
+ opts.minSemanticScore ?? 0, poolN]));
288
+ return rows.map((r) => ({ fact: r, score: Number(r.sim) }));
289
+ }
290
+ async similarFacts(scopeKey, opts = {}, access = {}) {
291
+ // The anchor is ACL-checked INSIDE the proc: an existing-but-inaccessible
292
+ // anchor returns empty, byte-identical to an unknown key (01 §4.3).
293
+ const model = this.embedConfig?.model ?? null;
294
+ const { rows } = await withDbRetry("facts_similar", () => this.pool.query(`SELECT * FROM ${this.s}.facts_similar($1, $2, $3, $4, $5, $6, $7, $8, $9)`, [scopeKey, model, ...this.aclParams(access, "accessible"),
295
+ namespacePrefix(opts.namespace), opts.minScore ?? 0, Math.max(1, Math.min(opts.k ?? 8, 100))]));
296
+ const facts = rows.map((r) => ({
297
+ ...mapFactRow(r), score: Number(r.sim), signals: { semantic: Number(r.sim) },
298
+ }));
299
+ return { count: facts.length, mode: "semantic", facts };
300
+ }
301
+ // ─── crawl tracking (02 §3a — PRIVILEGED harvester surface) ──────────────
302
+ async readUncrawledFacts(opts = {}) {
303
+ const { rows } = await withDbRetry("facts_read_uncrawled", () => this.pool.query(`SELECT * FROM ${this.s}.facts_read_uncrawled($1, $2, $3)`, [namespacePrefix(opts.namespace), Math.min(opts.limit ?? 20, 500), opts.embeddedOnly ?? false]));
304
+ const facts = rows.map(mapFactRow);
305
+ return { count: facts.length, facts };
306
+ }
307
+ async markFactsCrawled(stamps) {
308
+ if (!Array.isArray(stamps) || stamps.length === 0)
309
+ return { marked: 0, skipped: 0 };
310
+ // Coerce etag like the SQL does (numeric strings accepted): LLM tool JSON
311
+ // frequently serializes numbers as strings. Reject only genuinely missing
312
+ // / non-numeric receipts so harvester bugs still surface loudly.
313
+ const normalized = stamps.map((st) => {
314
+ const etag = Number(st?.etag);
315
+ if (!st?.scopeKey || !Number.isInteger(etag) || etag <= 0) {
316
+ throw new Error("markFactsCrawled: every stamp requires { scopeKey, etag } (the receipt from readUncrawledFacts)");
317
+ }
318
+ return { scopeKey: st.scopeKey, etag };
319
+ });
320
+ const { rows } = await withDbRetry("facts_mark_crawled", () => this.pool.query(`SELECT * FROM ${this.s}.facts_mark_crawled($1::jsonb)`, [JSON.stringify(normalized)]));
321
+ return { marked: Number(rows[0]?.marked ?? 0), skipped: Number(rows[0]?.skipped ?? 0) };
322
+ }
323
+ async purgeExpiredFacts(ttlSeconds, limit = 1000) {
324
+ const { rows } = await withDbRetry("facts_purge_expired", () => this.pool.query(`SELECT ${this.s}.facts_purge_expired($1, $2) AS purged`, [Math.max(0, Math.floor(ttlSeconds)), Math.max(1, Math.floor(limit))]));
325
+ return Number(rows[0]?.purged ?? 0);
326
+ }
327
+ async getFactsTombstoneStats(ttlSeconds = 21_600) {
328
+ const { rows } = await withDbRetry("facts_tombstone_stats", () => this.pool.query(`SELECT * FROM ${this.s}.facts_tombstone_stats($1)`, [Math.max(0, Math.floor(ttlSeconds))]));
329
+ return mapTombstoneStatsRow(rows[0] ?? {});
330
+ }
331
+ async forcePurgeFacts(input) {
332
+ const cutoff = input.cutoff instanceof Date ? input.cutoff : new Date(input.cutoff);
333
+ const { rows } = await withDbRetry("facts_force_purge", () => this.pool.query(`SELECT ${this.s}.facts_force_purge($1, $2, $3, $4) AS purged`, [
334
+ cutoff,
335
+ input.onlyUnreconciled === true,
336
+ input.keyPrefix ?? null,
337
+ Math.max(1, Math.floor(input.limit ?? 1000)),
338
+ ]));
339
+ return Number(rows[0]?.purged ?? 0);
340
+ }
341
+ // ─── embedder lifecycle (02 §4) ──────────────────────────────────────────
342
+ //
343
+ // Config lives in durable variables (df.setvar), namespaced per schema.
344
+ // pg_durable captures variables at df.start and they are immutable for the
345
+ // run, so configureEmbedder RESTARTS a running loop to apply changes —
346
+ // including key rotation (03-design §3).
347
+ varName(suffix) {
348
+ return `hz_${this.schema}_${suffix}`;
349
+ }
350
+ embedderLabel(kind) {
351
+ return `hz-embed-${kind}-cron:${this.schema}`;
352
+ }
353
+ get legacyEmbedderLabel() {
354
+ return `hz-embed-cron:${this.schema}`;
355
+ }
356
+ get embedderLabels() {
357
+ return { batch: this.embedderLabel("batch"), retry: this.embedderLabel("retry") };
358
+ }
359
+ async cancelRunningLabel(label, reason, exec = this.pool) {
360
+ const { rows } = await exec.query(`SELECT id FROM df.instances
361
+ WHERE label = $1 AND status IN ('pending', 'running')
362
+ ORDER BY created_at DESC`, [label]);
363
+ for (const row of rows) {
364
+ await exec.query(`SELECT df.cancel($1, $2)`, [row.id, reason]);
365
+ }
366
+ }
367
+ /**
368
+ * Serialize embedder start/restart across processes. Two providers
369
+ * initializing the same schema concurrently must not both df.start (the
370
+ * design is ONE loop per schema, label hz-embed-cron:<schema>). Reuses the
371
+ * migrator's advisory-lock pattern: hold a session-level lock on a single
372
+ * checked-out client for the whole critical section, then release it.
373
+ */
374
+ async withEmbedderLock(fn) {
375
+ const lockKey = hashSchemaName(`hz-embed-cron:${this.schema}`, HORIZON_FACTS_LOCK_SEED);
376
+ const client = await this.pool.connect();
377
+ try {
378
+ await client.query("SELECT pg_advisory_lock($1)", [lockKey]);
379
+ return await fn(client);
380
+ }
381
+ finally {
382
+ await client.query("SELECT pg_advisory_unlock($1)", [lockKey]).catch(() => { });
383
+ client.release();
384
+ }
385
+ }
386
+ async configureEmbedder(endpoint, opts = {}) {
387
+ const restartIfRunning = opts.restartIfRunning ?? true;
388
+ if (!endpoint?.url || !endpoint?.model) {
389
+ throw new Error("configureEmbedder requires { url, model, dim }");
390
+ }
391
+ if (Math.trunc(endpoint.dim) !== this.cfg.embeddingDim) {
392
+ throw new Error(`configureEmbedder: endpoint dim ${endpoint.dim} != vector(${this.cfg.embeddingDim}) column. ` +
393
+ `A dimension change requires a column migration + full re-embed (01 §5.2).`);
394
+ }
395
+ const { url } = toAllowlistedAzureHost(endpoint.url);
396
+ const vars = {
397
+ url,
398
+ model: endpoint.model,
399
+ dim: String(Math.trunc(endpoint.dim)),
400
+ key: endpoint.apiKey ?? null, // ⚠ plaintext at rest — accepted incubation TODO (01 §5.4)
401
+ keyhdr: endpoint.apiKeyHeader ?? "api-key",
402
+ bearer: endpoint.bearer ? "true" : "false",
403
+ inputfield: endpoint.inputField ?? "input",
404
+ timeout: String(Math.max(1, Math.ceil((endpoint.timeoutMs ?? 30_000) / 1000))),
405
+ interval: null, // written by startEmbedder
406
+ batch: null,
407
+ };
408
+ for (const suffix of EMBED_VAR_SUFFIXES) {
409
+ const v = vars[suffix];
410
+ if (v === null)
411
+ continue;
412
+ await this.pool.query(`SELECT df.setvar($1, $2)`, [this.varName(suffix), v]);
413
+ }
414
+ this.embedConfig = { ...endpoint, url };
415
+ this.queryEmbedder = undefined;
416
+ // Restart-on-configure: a running loop never sees new config otherwise
417
+ // (pg_durable captures vars at df.start). Skipped when restartIfRunning
418
+ // is false — the auto-start path on initialize() must not bounce a loop
419
+ // another instance is already running.
420
+ if (!restartIfRunning)
421
+ return this.embedderStatus();
422
+ return this.withEmbedderLock(async (client) => {
423
+ const st = await this.embedderStatus(client);
424
+ if (!st.running)
425
+ return st;
426
+ for (const loop of st.loops ?? []) {
427
+ if (loop.running && loop.instanceId)
428
+ await client.query(`SELECT df.cancel($1, $2)`, [loop.instanceId, "reconfigured"]);
429
+ }
430
+ await this.cancelRunningLabel(this.legacyEmbedderLabel, "reconfigured", client);
431
+ const interval = await this.getvar("interval");
432
+ const batch = await this.getvar("batch");
433
+ return this.startLoops(Number(interval ?? 5), Number(batch ?? 128), client);
434
+ });
435
+ }
436
+ async startEmbedder(opts = {}) {
437
+ const intervalSeconds = opts.intervalSeconds ?? 5;
438
+ const batch = opts.batch ?? 128;
439
+ if (!Number.isInteger(intervalSeconds) || intervalSeconds < 1) {
440
+ throw new Error(`intervalSeconds must be a positive integer, got ${intervalSeconds}`);
441
+ }
442
+ const url = this.embedConfig?.url ?? (await this.getvar("url"));
443
+ if (!url) {
444
+ throw new Error("startEmbedder: embedder not configured — call configureEmbedder(endpoint) first.");
445
+ }
446
+ // Advisory-locked check-then-start so concurrent callers can't both
447
+ // df.start: re-check status UNDER the lock and only start if no loop is
448
+ // already running (E3 idempotent).
449
+ return this.withEmbedderLock(async (client) => {
450
+ const existing = await this.embedderStatus(client);
451
+ if (existing.running)
452
+ return existing;
453
+ return this.startLoops(intervalSeconds, batch, client);
454
+ });
455
+ }
456
+ async startLoops(intervalSeconds, batch, exec = this.pool) {
457
+ await exec.query(`SELECT df.setvar($1, $2)`, [this.varName("interval"), String(intervalSeconds)]);
458
+ await exec.query(`SELECT df.setvar($1, $2)`, [this.varName("batch"), String(batch)]);
459
+ const labels = this.embedderLabels;
460
+ await this.cancelRunningLabel(this.legacyEmbedderLabel, "superseded by two-loop embedder", exec);
461
+ await exec.query(`SELECT df.start(${this.s}.embedder_workflow($1, $2, $3), $4, NULL) AS iid`, ["batch", intervalSeconds, batch, labels.batch]);
462
+ await exec.query(`SELECT df.start(${this.s}.embedder_workflow($1, $2, $3), $4, NULL) AS iid`, ["retry", intervalSeconds, 1, labels.retry]);
463
+ return this.embedderStatus(exec);
464
+ }
465
+ async stopEmbedder(reason = "stopped by host") {
466
+ const st = await this.embedderStatus();
467
+ for (const loop of st.loops ?? []) {
468
+ if (loop.running && loop.instanceId) {
469
+ await this.pool.query(`SELECT df.cancel($1, $2)`, [loop.instanceId, reason]);
470
+ }
471
+ }
472
+ await this.cancelRunningLabel(this.legacyEmbedderLabel, reason);
473
+ return this.embedderStatus();
474
+ }
475
+ async embedderStatus(exec = this.pool) {
476
+ const labels = this.embedderLabels;
477
+ const loops = [];
478
+ for (const name of ["batch", "retry"]) {
479
+ const { rows } = await exec.query(`SELECT id, status FROM df.instances
480
+ WHERE label = $1 ORDER BY created_at DESC LIMIT 1`, [labels[name]]);
481
+ const row = rows[0];
482
+ const status = row ? String(row.status) : undefined;
483
+ const running = status === "pending" || status === "running";
484
+ loops.push({ name, label: labels[name], running, instanceId: row ? String(row.id) : undefined, status });
485
+ }
486
+ const running = loops.every((loop) => loop.running);
487
+ return {
488
+ running,
489
+ instanceId: loops.find((loop) => loop.name === "batch")?.instanceId,
490
+ status: running ? "running" : loops.map((loop) => `${loop.name}:${loop.status ?? "missing"}`).join(","),
491
+ loops,
492
+ };
493
+ }
494
+ async getvar(suffix) {
495
+ const { rows } = await withDbRetry(`embedder_getvar_${suffix}`, () => this.pool.query(`SELECT df.getvar($1) AS v`, [this.varName(suffix)]));
496
+ return rows[0]?.v ?? null;
497
+ }
498
+ /** Query-time embedding client, resolved from the configured endpoint
499
+ * (memory snapshot → durable vars). Throws when semantic search is
500
+ * attempted with no endpoint configured (02 §6). */
501
+ /**
502
+ * Whether an embedding endpoint is available to this store — either the
503
+ * in-memory snapshot or the durable config vars written by configureEmbedder
504
+ * (possibly by another process). Non-throwing; used by searchFacts to decide
505
+ * whether HYBRID can include the semantic signal or must degrade to lexical.
506
+ */
507
+ async hasEmbedder() {
508
+ if (this.embedConfig || this.queryEmbedder)
509
+ return true;
510
+ const [url, model, dim] = await Promise.all([
511
+ this.getvar("url"), this.getvar("model"), this.getvar("dim"),
512
+ ]);
513
+ return !!(url && model && dim);
514
+ }
515
+ async requireQueryEmbedder() {
516
+ if (!this.queryEmbedder) {
517
+ let cfg = this.embedConfig;
518
+ if (!cfg) {
519
+ const [url, model, dim, key, keyhdr, bearer, inputfield, timeout] = await Promise.all([
520
+ this.getvar("url"), this.getvar("model"), this.getvar("dim"), this.getvar("key"),
521
+ this.getvar("keyhdr"), this.getvar("bearer"), this.getvar("inputfield"), this.getvar("timeout"),
522
+ ]);
523
+ if (url && model && dim) {
524
+ cfg = {
525
+ url, model, dim: Number(dim),
526
+ apiKey: key ?? undefined,
527
+ apiKeyHeader: keyhdr ?? undefined,
528
+ bearer: bearer === "true",
529
+ inputField: inputfield ?? undefined,
530
+ timeoutMs: timeout ? Number(timeout) * 1000 : undefined,
531
+ };
532
+ this.embedConfig = cfg;
533
+ }
534
+ }
535
+ if (!cfg) {
536
+ throw new Error("semantic search requires a configured embedding endpoint — call configureEmbedder(endpoint) first.");
537
+ }
538
+ this.queryEmbedder = new EmbeddingClient(cfg);
539
+ }
540
+ return { client: this.queryEmbedder, model: this.embedConfig.model };
541
+ }
542
+ }
543
+ // ─── row mapping ─────────────────────────────────────────────────────────────
544
+ function mapFactRow(r) {
545
+ return {
546
+ scopeKey: r.scope_key,
547
+ key: r.key, value: r.value, agentId: r.agent_id ?? null, sessionId: r.session_id ?? null,
548
+ shared: !!r.shared, tags: r.tags ?? [], createdAt: r.created_at, updatedAt: r.updated_at,
549
+ deletedAt: r.deleted_at ? new Date(r.deleted_at) : null,
550
+ etag: Number(r.etag ?? 0),
551
+ };
552
+ }
553
+ function mapTombstoneStatsRow(row) {
554
+ const age = row.oldest_unreconciled_age_seconds;
555
+ return {
556
+ pendingTotal: Number(row.pending_total ?? 0),
557
+ unreconciled: Number(row.unreconciled ?? 0),
558
+ ttlBlocked: Number(row.ttl_blocked ?? 0),
559
+ oldestUnreconciledAgeSeconds: age == null ? null : Number(age),
560
+ reconciledUnswept: Number(row.reconciled_unswept ?? 0),
561
+ };
562
+ }
563
+ //# sourceMappingURL=horizon-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"horizon-store.js","sourceRoot":"","sources":["../../src/horizon-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export * from "./types.js";
2
+ export * from "./query-builder.js";
3
+ export * from "./graph-model.js";
4
+ export * from "./config.js";
5
+ export * from "./embedding-client.js";
6
+ export * from "./horizon-store.js";
7
+ export * from "./graph-store.js";
8
+ export * from "./agent-tools.js";
9
+ export { isTransientDbError, withDbRetry, setDbRetryHooks } from "./db-retry.js";
10
+ export { GraphQueries, prepareAgeSession } from "./graph-queries.js";
11
+ export { loadMigrations, runMigrations, migrationsDir, HORIZON_FACTS_LOCK_SEED, GRAPH_OWNED_MIGRATIONS, isGraphOwnedMigration } from "./horizon-migrator.js";
12
+ export { assertExtensionsAvailable, assertFactExtensions, assertGraphExtensions, assertDurableHttpUsable, missingExtensions, missingFactExtensions, missingGraphExtensions, } from "./preconditions.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AASA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC7J,OAAO,EACH,yBAAyB,EAAE,oBAAoB,EAAE,qBAAqB,EACtE,uBAAuB,EACvB,iBAAiB,EAAE,qBAAqB,EAAE,sBAAsB,GACnE,MAAM,oBAAoB,CAAC"}