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.
- package/README.md +154 -0
- package/dist/src/agent-tools.d.ts +32 -0
- package/dist/src/agent-tools.d.ts.map +1 -0
- package/dist/src/agent-tools.js +263 -0
- package/dist/src/agent-tools.js.map +1 -0
- package/dist/src/config.d.ts +93 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +120 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/db-retry.d.ts +21 -0
- package/dist/src/db-retry.d.ts.map +1 -0
- package/dist/src/db-retry.js +94 -0
- package/dist/src/db-retry.js.map +1 -0
- package/dist/src/embedding-client.d.ts +13 -0
- package/dist/src/embedding-client.d.ts.map +1 -0
- package/dist/src/embedding-client.js +79 -0
- package/dist/src/embedding-client.js.map +1 -0
- package/dist/src/graph-model.d.ts +49 -0
- package/dist/src/graph-model.d.ts.map +1 -0
- package/dist/src/graph-model.js +112 -0
- package/dist/src/graph-model.js.map +1 -0
- package/dist/src/graph-queries.d.ts +83 -0
- package/dist/src/graph-queries.d.ts.map +1 -0
- package/dist/src/graph-queries.js +727 -0
- package/dist/src/graph-queries.js.map +1 -0
- package/dist/src/graph-store.d.ts +57 -0
- package/dist/src/graph-store.d.ts.map +1 -0
- package/dist/src/graph-store.js +327 -0
- package/dist/src/graph-store.js.map +1 -0
- package/dist/src/horizon-migrator.d.ts +49 -0
- package/dist/src/horizon-migrator.d.ts.map +1 -0
- package/dist/src/horizon-migrator.js +231 -0
- package/dist/src/horizon-migrator.js.map +1 -0
- package/dist/src/horizon-store.d.ts +116 -0
- package/dist/src/horizon-store.d.ts.map +1 -0
- package/dist/src/horizon-store.js +563 -0
- package/dist/src/horizon-store.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +21 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/preconditions.d.ts +16 -0
- package/dist/src/preconditions.d.ts.map +1 -0
- package/dist/src/preconditions.js +99 -0
- package/dist/src/preconditions.js.map +1 -0
- package/dist/src/query-builder.d.ts +37 -0
- package/dist/src/query-builder.d.ts.map +1 -0
- package/dist/src/query-builder.js +82 -0
- package/dist/src/query-builder.js.map +1 -0
- package/dist/src/sql-util.d.ts +20 -0
- package/dist/src/sql-util.d.ts.map +1 -0
- package/dist/src/sql-util.js +40 -0
- package/dist/src/sql-util.js.map +1 -0
- package/dist/src/types.d.ts +16 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +35 -0
- package/dist/src/types.js.map +1 -0
- package/migrations/0001_facts_table.sql +77 -0
- package/migrations/0002_indexes.sql +27 -0
- package/migrations/0003_age_bootstrap.sql +13 -0
- package/migrations/0004_facts_procs.sql +253 -0
- package/migrations/0005_embedder_workflow.sql +119 -0
- package/migrations/0006_facts_read_uncrawled_embedded_gate.sql +33 -0
- package/migrations/0007_embed_key_value_text.sql +122 -0
- package/migrations/0008_embedder_failure_recovery.sql +409 -0
- package/migrations/0009_search_text_full_value.sql +52 -0
- package/migrations/0010_minimal_two_loop_embedder.sql +392 -0
- package/migrations/0011_unified_api_embedder_workflow.sql +273 -0
- package/migrations/0012_facts_soft_delete.sql +587 -0
- package/migrations/0013_graph_namespaces.sql +60 -0
- 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"}
|