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,231 @@
1
+ // pilotswarm-horizon-store — vendored migration runner.
2
+ //
3
+ // VENDORED from packages/sdk/src/pg-migrator.ts (advisory-locked, versioned,
4
+ // one transaction per migration). TODO(graduation): merge back into
5
+ // pg-migrator.ts when this package moves into packages/* — do not let the two
6
+ // copies drift.
7
+ //
8
+ // The loader half is horizon-specific: it reads the numbered migrations/*.sql
9
+ // files that ship with the package and substitutes the deployment tokens
10
+ // ({{SCHEMA}}, {{GRAPH_NAME}}, {{EMBEDDING_DIM}}) before handing them to the
11
+ // runner. All DDL lives in those files — none in TypeScript (04 §6 M1 guard).
12
+ import { readdirSync, readFileSync } from "node:fs";
13
+ import { fileURLToPath } from "node:url";
14
+ import path from "node:path";
15
+ /** Seed for the advisory lock — distinct from the SDK CMS/facts seeds. */
16
+ export const HORIZON_FACTS_LOCK_SEED = 0x48_5a_46; // "HZF"
17
+ /**
18
+ * Migration versions OWNED BY THE GRAPH PROVIDER (HorizonDBGraphStore), not the
19
+ * facts provider. The facts store filters these out of its run set; the graph
20
+ * store runs them inline as part of its idempotent bootstrap.
21
+ * 0003 — AGE extension + create_graph (the graph bootstrap).
22
+ * 0013 — graph_namespaces registry sidecar (graph-fact-search enhancements).
23
+ */
24
+ export const GRAPH_OWNED_MIGRATIONS = ["0003", "0013"];
25
+ export const HORIZON_GLOBAL_DDL_LOCK_LABEL = "__horizon_facts_global_ddl__";
26
+ export const DEFAULT_MIGRATION_LOCK_TIMEOUT_MS = 60_000;
27
+ const GLOBAL_DDL_SQL = /\bCREATE\s+EXTENSION\b|\bag_catalog\.create_graph\b/i;
28
+ /** Whether a migration version is graph-owned (run by the graph store, not facts). */
29
+ export function isGraphOwnedMigration(version) {
30
+ return GRAPH_OWNED_MIGRATIONS.includes(version);
31
+ }
32
+ /** Whether a migration contains database-global DDL that needs global serialization. */
33
+ export function migrationRequiresGlobalDdlLock(migration) {
34
+ return GLOBAL_DDL_SQL.test(migration.sql);
35
+ }
36
+ /**
37
+ * Run all pending migrations against the given schema.
38
+ *
39
+ * Uses a PostgreSQL advisory lock keyed on `lockSeed` + schema name to
40
+ * serialize concurrent workers. Each migration runs in its own transaction.
41
+ * Throws (never "repairs") when the migrations table records a version the
42
+ * code does not know — a newer deployment owns this schema.
43
+ */
44
+ export async function runMigrations(pool, schema, migrations, lockSeed) {
45
+ const lockKey = hashSchemaName(schema, lockSeed);
46
+ const globalDdlLockKey = hashSchemaName(HORIZON_GLOBAL_DDL_LOCK_LABEL, lockSeed);
47
+ const client = await pool.connect();
48
+ let schemaLockHeld = false;
49
+ try {
50
+ // Serialize concurrent initializers for the same schema, but keep other
51
+ // schemas moving. The database-global DDL lock is acquired only inside
52
+ // the specific migration transactions that need it.
53
+ await acquireSessionAdvisoryLock(client, lockKey, `horizon schema migration for ${schema}`);
54
+ schemaLockHeld = true;
55
+ await client.query(`CREATE SCHEMA IF NOT EXISTS "${schema}"`);
56
+ const migrationsTable = `"${schema}".schema_migrations`;
57
+ await client.query(`
58
+ CREATE TABLE IF NOT EXISTS ${migrationsTable} (
59
+ version TEXT PRIMARY KEY,
60
+ name TEXT NOT NULL,
61
+ applied_at TIMESTAMPTZ NOT NULL DEFAULT now()
62
+ )
63
+ `);
64
+ const { rows: applied } = await client.query(`SELECT version FROM ${migrationsTable} ORDER BY version`);
65
+ const appliedSet = new Set(applied.map((r) => r.version));
66
+ const knownSet = new Set(migrations.map((m) => m.version));
67
+ const unknown = [...appliedSet].filter((v) => !knownSet.has(v));
68
+ if (unknown.length > 0) {
69
+ throw new Error(`horizon-facts migrations: schema "${schema}" records versions this build does not know ` +
70
+ `(${unknown.join(", ")}). A newer deployment owns this schema; refusing to continue.`);
71
+ }
72
+ for (const migration of migrations) {
73
+ if (appliedSet.has(migration.version))
74
+ continue;
75
+ for (let attempt = 1; attempt <= 5; attempt++) {
76
+ try {
77
+ await client.query("BEGIN");
78
+ if (migrationRequiresGlobalDdlLock(migration)) {
79
+ await acquireTransactionAdvisoryLock(client, globalDdlLockKey, `horizon global DDL migration ${migration.version} (${migration.name})`);
80
+ }
81
+ await client.query(migration.sql);
82
+ await client.query(`INSERT INTO ${migrationsTable} (version, name) VALUES ($1, $2)`, [migration.version, migration.name]);
83
+ await client.query("COMMIT");
84
+ break;
85
+ }
86
+ catch (err) {
87
+ await client.query("ROLLBACK").catch(() => { });
88
+ if (!isRetryableMigrationRace(err) || attempt === 5)
89
+ throw err;
90
+ await new Promise((resolve) => setTimeout(resolve, 200 * attempt));
91
+ }
92
+ }
93
+ }
94
+ }
95
+ finally {
96
+ if (schemaLockHeld)
97
+ await client.query("SELECT pg_advisory_unlock($1)", [lockKey]).catch(() => { });
98
+ client.release();
99
+ }
100
+ }
101
+ function migrationLockTimeoutMs() {
102
+ const raw = process.env.HORIZON_MIGRATION_LOCK_TIMEOUT_MS;
103
+ if (raw == null || raw === "")
104
+ return DEFAULT_MIGRATION_LOCK_TIMEOUT_MS;
105
+ const value = Number(raw);
106
+ if (!Number.isFinite(value) || value < 0) {
107
+ throw new Error(`HORIZON_MIGRATION_LOCK_TIMEOUT_MS must be a non-negative number, got ${JSON.stringify(raw)}`);
108
+ }
109
+ return Math.trunc(value);
110
+ }
111
+ async function acquireSessionAdvisoryLock(client, key, label) {
112
+ await acquireAdvisoryLock(client, key, label, "pg_try_advisory_lock");
113
+ }
114
+ async function acquireTransactionAdvisoryLock(client, key, label) {
115
+ await acquireAdvisoryLock(client, key, label, "pg_try_advisory_xact_lock");
116
+ }
117
+ async function acquireAdvisoryLock(client, key, label, fnName) {
118
+ const timeoutMs = migrationLockTimeoutMs();
119
+ const deadline = Date.now() + timeoutMs;
120
+ for (;;) {
121
+ const { rows } = await client.query(`SELECT ${fnName}($1) AS locked`, [key]);
122
+ if (rows[0]?.locked === true)
123
+ return;
124
+ if (Date.now() >= deadline) {
125
+ throw new Error(await advisoryLockTimeoutMessage(client, key, label, timeoutMs));
126
+ }
127
+ await new Promise((resolve) => setTimeout(resolve, 250));
128
+ }
129
+ }
130
+ async function advisoryLockTimeoutMessage(client, key, label, timeoutMs) {
131
+ try {
132
+ const { classid, objid } = advisoryLockKeyParts(key);
133
+ const { rows } = await client.query(`SELECT a.pid,
134
+ a.state,
135
+ a.wait_event_type,
136
+ a.wait_event,
137
+ now() - a.query_start AS age,
138
+ left(a.query, 160) AS query
139
+ FROM pg_locks l
140
+ LEFT JOIN pg_stat_activity a ON a.pid = l.pid
141
+ WHERE l.locktype = 'advisory'
142
+ AND l.granted
143
+ AND l.classid::bigint = $1
144
+ AND l.objid::bigint = $2
145
+ ORDER BY a.query_start NULLS LAST
146
+ LIMIT 5`, [String(classid), String(objid)]);
147
+ const holders = rows.length > 0
148
+ ? rows.map((row) => `pid=${row.pid} state=${row.state ?? "unknown"} wait=${row.wait_event_type ?? ""}/${row.wait_event ?? ""} query=${JSON.stringify(row.query ?? "")}`).join("; ")
149
+ : "no granted holder found";
150
+ return `${label} could not acquire advisory lock ${key} within ${timeoutMs}ms; holders: ${holders}`;
151
+ }
152
+ catch (err) {
153
+ return `${label} could not acquire advisory lock ${key} within ${timeoutMs}ms; holder lookup failed: ${err?.message ?? err}`;
154
+ }
155
+ }
156
+ export function advisoryLockKeyParts(key) {
157
+ const unsigned = BigInt.asUintN(64, BigInt(Math.trunc(key)));
158
+ return {
159
+ classid: String((unsigned >> 32n) & 0xffffffffn),
160
+ objid: String(unsigned & 0xffffffffn),
161
+ };
162
+ }
163
+ // Concurrent first-time creation of the same global object (extension, AGE
164
+ // graph schema, catalog row) surfaces as one of these races. The losing tx
165
+ // rolled back and committed nothing, and the object now exists, so re-running
166
+ // the same idempotent migration statement succeeds.
167
+ function isRetryableMigrationRace(err) {
168
+ const text = `${err?.code ?? ""} ${err?.message ?? ""} ${err?.detail ?? ""}`;
169
+ return /tuple concurrently updated|deadlock detected|could not serialize access|already exists/i.test(text);
170
+ }
171
+ /** Stable 32-bit hash of a schema name combined with a per-system seed. */
172
+ export function hashSchemaName(schema, seed) {
173
+ let hash = seed;
174
+ for (let i = 0; i < schema.length; i++) {
175
+ hash = ((hash << 5) - hash + schema.charCodeAt(i)) | 0;
176
+ }
177
+ return hash;
178
+ }
179
+ const MIGRATION_FILE = /^(\d{4})_([a-z0-9_]+)\.sql$/;
180
+ /** Resolve the packaged migrations/ directory (works from src/ and dist/src/). */
181
+ export function migrationsDir() {
182
+ const here = path.dirname(fileURLToPath(import.meta.url));
183
+ // src/ → ../migrations ; dist/src/ → ../../migrations
184
+ for (const rel of ["../migrations", "../../migrations"]) {
185
+ const dir = path.resolve(here, rel);
186
+ try {
187
+ readdirSync(dir);
188
+ return dir;
189
+ }
190
+ catch { /* try next */ }
191
+ }
192
+ throw new Error(`horizon-facts: cannot locate migrations/ relative to ${here}`);
193
+ }
194
+ /** Load the numbered migrations, token-substituted for this deployment. */
195
+ export function loadMigrations(tokens) {
196
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tokens.schema)) {
197
+ throw new Error(`unsafe schema name: ${JSON.stringify(tokens.schema)}`);
198
+ }
199
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tokens.graphName)) {
200
+ throw new Error(`unsafe graph name: ${JSON.stringify(tokens.graphName)}`);
201
+ }
202
+ const registrySchema = tokens.registrySchema ?? `${tokens.graphName}_registry`;
203
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(registrySchema)) {
204
+ throw new Error(`unsafe registry schema name: ${JSON.stringify(registrySchema)}`);
205
+ }
206
+ const dim = Math.trunc(tokens.embeddingDim);
207
+ if (!Number.isFinite(dim) || dim < 1) {
208
+ throw new Error(`embeddingDim must be a positive integer, got ${tokens.embeddingDim}`);
209
+ }
210
+ const dir = migrationsDir();
211
+ const files = readdirSync(dir).filter((f) => MIGRATION_FILE.test(f)).sort();
212
+ if (files.length === 0)
213
+ throw new Error(`horizon-facts: no migrations found in ${dir}`);
214
+ let last = 0;
215
+ return files.map((f) => {
216
+ const m = MIGRATION_FILE.exec(f);
217
+ const num = Number(m[1]);
218
+ if (num !== last + 1) {
219
+ throw new Error(`horizon-facts migrations: non-contiguous numbering at ${f} (expected ${String(last + 1).padStart(4, "0")})`);
220
+ }
221
+ last = num;
222
+ const raw = readFileSync(path.join(dir, f), "utf8");
223
+ const sql = raw
224
+ .replaceAll("{{SCHEMA}}", tokens.schema)
225
+ .replaceAll("{{GRAPH_NAME}}", tokens.graphName)
226
+ .replaceAll("{{REGISTRY_SCHEMA}}", registrySchema)
227
+ .replaceAll("{{EMBEDDING_DIM}}", String(dim));
228
+ return { version: m[1], name: m[2], sql };
229
+ });
230
+ }
231
+ //# sourceMappingURL=horizon-migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"horizon-migrator.js","sourceRoot":"","sources":["../../src/horizon-migrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import type { AccessContext, CrawledFactStamp, DeletedFactResult, DeletedFactsResult, DeleteFactInput, EmbedderStatus, EmbeddingEndpointConfig, EnhancedFactStore, FactRecord, FactsStatsRow, FactsTombstoneStats, ForcePurgeFactsInput, ReadFactsQuery, SearchOpts, SearchResult, SimilarOpts, StoreFactInput, StoredFactResult } from "./types.js";
2
+ import type { HorizonFactsConfig } from "./config.js";
3
+ /** df-allow-list normalization: the Azure AI Foundry unified host is blocked
4
+ * for df.http; the classic AOAI host points at the same deployment. */
5
+ export declare function toAllowlistedAzureHost(url: string): {
6
+ url: string;
7
+ rewritten: boolean;
8
+ };
9
+ export declare class HorizonDBFactStore implements EnhancedFactStore {
10
+ private readonly cfg;
11
+ private pool;
12
+ private initialized;
13
+ /** Snapshot of the configured endpoint (mirrors the durable vars). */
14
+ private embedConfig?;
15
+ private queryEmbedder?;
16
+ /** Capability descriptor (enhancedfactstore 07 §1.4) — HorizonDB always
17
+ * backs multi-signal search (lexical works with no endpoint). `embedder`
18
+ * reflects whether an embedding endpoint was provisioned at construction:
19
+ * the durable in-DB embed loop only runs (and semantic/hybrid return
20
+ * semantic hits) when one is configured. A store created without
21
+ * `embedding` reports `embedder:false` so the runtime can gate the embedder
22
+ * lifecycle on real configuration rather than a hardcoded `true`. */
23
+ readonly capabilities: {
24
+ search: boolean;
25
+ embedder: boolean;
26
+ };
27
+ private constructor();
28
+ static create(config?: Partial<HorizonFactsConfig>): Promise<HorizonDBFactStore>;
29
+ private get schema();
30
+ private get s();
31
+ /**
32
+ * Fail-fast (01 §5.5): verify every required extension is available —
33
+ * itemized error otherwise — then apply the numbered migrations, then
34
+ * verify df.http usability. When the config carries an embedding endpoint,
35
+ * configure the embedder from it.
36
+ */
37
+ initialize(): Promise<void>;
38
+ close(): Promise<void>;
39
+ storeFact(input: StoreFactInput): Promise<StoredFactResult>;
40
+ storeFact(input: StoreFactInput[]): Promise<{
41
+ stored: number;
42
+ facts: StoredFactResult[];
43
+ }>;
44
+ readFacts(query: ReadFactsQuery, access?: AccessContext): Promise<{
45
+ count: number;
46
+ facts: FactRecord[];
47
+ }>;
48
+ deleteFact(input: DeleteFactInput & {
49
+ pattern: true;
50
+ }): Promise<DeletedFactsResult>;
51
+ deleteFact(input: DeleteFactInput & {
52
+ pattern?: false | undefined;
53
+ }): Promise<DeletedFactResult>;
54
+ deleteFact(input: DeleteFactInput): Promise<DeletedFactResult | DeletedFactsResult>;
55
+ deleteSessionFactsForSession(sessionId: string): Promise<number>;
56
+ private stats;
57
+ getSessionFactsStats(sessionId: string): Promise<FactsStatsRow[]>;
58
+ getFactsStatsForSessions(sessionIds: string[]): Promise<FactsStatsRow[]>;
59
+ getSharedFactsStats(): Promise<FactsStatsRow[]>;
60
+ searchFacts(query: string, opts?: SearchOpts, access?: AccessContext): Promise<SearchResult>;
61
+ private aclParams;
62
+ private lexicalCandidates;
63
+ private semanticCandidates;
64
+ similarFacts(scopeKey: string, opts?: SimilarOpts, access?: AccessContext): Promise<SearchResult>;
65
+ readUncrawledFacts(opts?: {
66
+ namespace?: string;
67
+ limit?: number;
68
+ embeddedOnly?: boolean;
69
+ }): Promise<{
70
+ count: number;
71
+ facts: FactRecord[];
72
+ }>;
73
+ markFactsCrawled(stamps: CrawledFactStamp[]): Promise<{
74
+ marked: number;
75
+ skipped: number;
76
+ }>;
77
+ purgeExpiredFacts(ttlSeconds: number, limit?: number): Promise<number>;
78
+ getFactsTombstoneStats(ttlSeconds?: number): Promise<FactsTombstoneStats>;
79
+ forcePurgeFacts(input: ForcePurgeFactsInput): Promise<number>;
80
+ private varName;
81
+ private embedderLabel;
82
+ private get legacyEmbedderLabel();
83
+ private get embedderLabels();
84
+ private cancelRunningLabel;
85
+ /**
86
+ * Serialize embedder start/restart across processes. Two providers
87
+ * initializing the same schema concurrently must not both df.start (the
88
+ * design is ONE loop per schema, label hz-embed-cron:<schema>). Reuses the
89
+ * migrator's advisory-lock pattern: hold a session-level lock on a single
90
+ * checked-out client for the whole critical section, then release it.
91
+ */
92
+ private withEmbedderLock;
93
+ configureEmbedder(endpoint: EmbeddingEndpointConfig, opts?: {
94
+ restartIfRunning?: boolean;
95
+ }): Promise<EmbedderStatus>;
96
+ startEmbedder(opts?: {
97
+ intervalSeconds?: number;
98
+ batch?: number;
99
+ }): Promise<EmbedderStatus>;
100
+ private startLoops;
101
+ stopEmbedder(reason?: string): Promise<EmbedderStatus>;
102
+ embedderStatus(exec?: any): Promise<EmbedderStatus>;
103
+ private getvar;
104
+ /** Query-time embedding client, resolved from the configured endpoint
105
+ * (memory snapshot → durable vars). Throws when semantic search is
106
+ * attempted with no endpoint configured (02 §6). */
107
+ /**
108
+ * Whether an embedding endpoint is available to this store — either the
109
+ * in-memory snapshot or the durable config vars written by configureEmbedder
110
+ * (possibly by another process). Non-throwing; used by searchFacts to decide
111
+ * whether HYBRID can include the semantic signal or must degrade to lexical.
112
+ */
113
+ private hasEmbedder;
114
+ private requireQueryEmbedder;
115
+ }
116
+ //# sourceMappingURL=horizon-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"horizon-store.d.ts","sourceRoot":"","sources":["../../src/horizon-store.ts"],"names":[],"mappings":"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"}