@grackle-ai/knowledge-core 0.75.13 → 0.76.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -393,16 +393,21 @@ The following schema objects are created:
393
393
  | `INDEX_KIND` | Index on `kind` for efficient filtering by node type |
394
394
  | `INDEX_WORKSPACE` | Index on `workspaceId` for scoped queries |
395
395
  | `INDEX_SOURCE` | Composite index on `(sourceType, sourceId)` for reference lookups |
396
- | `VECTOR_INDEX` | Vector index on `embedding` for cosine similarity search (1536 dimensions) |
396
+ | `VECTOR_INDEX` | Vector index on `embedding` for cosine similarity search (dimensions configurable) |
397
397
 
398
398
  ```typescript
399
+ const embedder = createLocalEmbedder();
399
400
  await openNeo4j();
400
- await initSchema();
401
+ await initSchema(embedder.dimensions); // creates a 384-dim vector index
401
402
  ```
402
403
 
404
+ #### `buildSchemaStatements(dimensions?: number): Record<string, string>`
405
+
406
+ Build the Cypher schema statements with a custom vector index dimensionality. Defaults to `EMBEDDING_DIMENSIONS` (1536) if omitted.
407
+
403
408
  #### `SCHEMA_STATEMENTS: Record<string, string>`
404
409
 
405
- The raw Cypher statements used by `initSchema()`, exported for inspection and testing.
410
+ The raw Cypher statements using the default 1536 dimensions. Prefer `buildSchemaStatements(dimensions)` for custom dimensions.
406
411
 
407
412
  ### Embedders
408
413
 
@@ -457,9 +462,14 @@ const customEmbedder = createLocalEmbedder({
457
462
  });
458
463
  ```
459
464
 
460
- **Important:** The default local embedder produces 384-dimensional vectors, while the default Neo4j vector index schema created by `initSchema()` is configured for 1536 dimensions (see the `EMBEDDING_DIMENSIONS` constant in the library source). Because that constant is baked into the schema definition, downstream applications cannot realistically change it at runtime. If you use the local embedder, you should either:
461
- - Use an embedding model that produces 1536-dimensional vectors so it matches the default schema created by `initSchema()`, or
462
- - Skip `initSchema()` and create a custom Neo4j vector index whose dimensions match your embedder (for example, 384 for the default local model).
465
+ **Dimension matching:** `initSchema()` accepts an optional `dimensions` parameter that controls the vector index size. Pass your embedder's dimensions to ensure they match:
466
+
467
+ ```typescript
468
+ const embedder = createLocalEmbedder();
469
+ await initSchema(embedder.dimensions); // creates a 384-dim vector index
470
+ ```
471
+
472
+ If omitted, `initSchema()` defaults to `EMBEDDING_DIMENSIONS` (1536). Use `buildSchemaStatements(dimensions)` for custom dimensions when building statements manually.
463
473
 
464
474
  ### Chunkers
465
475
 
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  */
10
10
  export { openNeo4j, closeNeo4j, healthCheck, getSession, getDriver } from "./client.js";
11
11
  export type { Neo4jClientConfig } from "./client.js";
12
- export { initSchema, SCHEMA_STATEMENTS } from "./schema.js";
12
+ export { initSchema, buildSchemaStatements, SCHEMA_STATEMENTS } from "./schema.js";
13
13
  export { logger } from "./logger.js";
14
14
  export * from "./types.js";
15
15
  export { DEFAULT_NEO4J_URL, DEFAULT_NEO4J_USER, DEFAULT_NEO4J_DATABASE, NEO4J_MAX_POOL_SIZE, NEO4J_CONNECTION_ACQUISITION_TIMEOUT, NODE_LABEL, VECTOR_INDEX_NAME, EMBEDDING_DIMENSIONS, VECTOR_SIMILARITY_FUNCTION, } from "./constants.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxF,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,oCAAoC,EACpC,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxF,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,oCAAoC,EACpC,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@
8
8
  * @packageDocumentation
9
9
  */
10
10
  export { openNeo4j, closeNeo4j, healthCheck, getSession, getDriver } from "./client.js";
11
- export { initSchema, SCHEMA_STATEMENTS } from "./schema.js";
11
+ export { initSchema, buildSchemaStatements, SCHEMA_STATEMENTS } from "./schema.js";
12
12
  export { logger } from "./logger.js";
13
13
  export * from "./types.js";
14
14
  export { DEFAULT_NEO4J_URL, DEFAULT_NEO4J_USER, DEFAULT_NEO4J_DATABASE, NEO4J_MAX_POOL_SIZE, NEO4J_CONNECTION_ACQUISITION_TIMEOUT, NODE_LABEL, VECTOR_INDEX_NAME, EMBEDDING_DIMENSIONS, VECTOR_SIMILARITY_FUNCTION, } from "./constants.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,oCAAoC,EACpC,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExF,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,oCAAoC,EACpC,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/schema.d.ts CHANGED
@@ -7,17 +7,30 @@
7
7
  * @module
8
8
  */
9
9
  /**
10
- * Cypher statements for schema initialization.
10
+ * Build the Cypher statements for schema initialization.
11
11
  *
12
- * Exported so tests can verify the exact statements that will be executed.
12
+ * @param dimensions - Dimensionality of the vector index. Should match the
13
+ * embedder being used (e.g., 384 for the default local embedder). Defaults
14
+ * to {@link EMBEDDING_DIMENSIONS} (1536).
15
+ */
16
+ export declare function buildSchemaStatements(dimensions?: number): Record<string, string>;
17
+ /**
18
+ * Static statements using the default dimensions (1536).
19
+ *
20
+ * @deprecated Use {@link buildSchemaStatements} with the embedder's actual dimensions.
13
21
  */
14
22
  export declare const SCHEMA_STATEMENTS: Record<string, string>;
15
23
  /**
16
24
  * Initialize the Neo4j schema: constraints, property indexes, and the
17
25
  * vector index.
18
26
  *
19
- * All statements are idempotent (`IF NOT EXISTS`). Call once at startup
20
- * after {@link openNeo4j}.
27
+ * All statements are idempotent (`IF NOT EXISTS`). Transient errors
28
+ * (deadlocks from concurrent initialization) are retried automatically.
29
+ * Call once at startup after {@link openNeo4j}.
30
+ *
31
+ * @param dimensions - Vector index dimensionality. Should match the
32
+ * embedder (e.g., 384 for the default local embedder). Defaults to
33
+ * {@link EMBEDDING_DIMENSIONS} (1536).
21
34
  */
22
- export declare function initSchema(): Promise<void>;
35
+ export declare function initSchema(dimensions?: number): Promise<void>;
23
36
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4BpD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBhD"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,GAAE,MAA6B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BvG;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAA2B,CAAC;AAwDjF;;;;;;;;;;;GAWG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBnE"}
package/dist/schema.js CHANGED
@@ -9,55 +9,110 @@
9
9
  import { getSession } from "./client.js";
10
10
  import { logger } from "./logger.js";
11
11
  import { NODE_LABEL, VECTOR_INDEX_NAME, EMBEDDING_DIMENSIONS, VECTOR_SIMILARITY_FUNCTION, } from "./constants.js";
12
+ // ---------------------------------------------------------------------------
13
+ // Schema statement builders
14
+ // ---------------------------------------------------------------------------
12
15
  /**
13
- * Cypher statements for schema initialization.
16
+ * Build the Cypher statements for schema initialization.
14
17
  *
15
- * Exported so tests can verify the exact statements that will be executed.
18
+ * @param dimensions - Dimensionality of the vector index. Should match the
19
+ * embedder being used (e.g., 384 for the default local embedder). Defaults
20
+ * to {@link EMBEDDING_DIMENSIONS} (1536).
16
21
  */
17
- export const SCHEMA_STATEMENTS = {
18
- /** Uniqueness constraint on node ID. */
19
- UNIQUE_NODE_ID: `CREATE CONSTRAINT knowledge_node_id_unique IF NOT EXISTS
22
+ export function buildSchemaStatements(dimensions = EMBEDDING_DIMENSIONS) {
23
+ return {
24
+ /** Uniqueness constraint on node ID. */
25
+ UNIQUE_NODE_ID: `CREATE CONSTRAINT knowledge_node_id_unique IF NOT EXISTS
20
26
  FOR (n:${NODE_LABEL}) REQUIRE n.id IS UNIQUE`,
21
- /** Index on the kind property for efficient filtering. */
22
- INDEX_KIND: `CREATE INDEX knowledge_node_kind IF NOT EXISTS
27
+ /** Index on the kind property for efficient filtering. */
28
+ INDEX_KIND: `CREATE INDEX knowledge_node_kind IF NOT EXISTS
23
29
  FOR (n:${NODE_LABEL}) ON (n.kind)`,
24
- /** Index on workspaceId for scoped queries. */
25
- INDEX_WORKSPACE: `CREATE INDEX knowledge_node_workspace IF NOT EXISTS
30
+ /** Index on workspaceId for scoped queries. */
31
+ INDEX_WORKSPACE: `CREATE INDEX knowledge_node_workspace IF NOT EXISTS
26
32
  FOR (n:${NODE_LABEL}) ON (n.workspaceId)`,
27
- /** Composite index for reference node lookups by source. */
28
- INDEX_SOURCE: `CREATE INDEX knowledge_node_source IF NOT EXISTS
33
+ /** Composite index for reference node lookups by source. */
34
+ INDEX_SOURCE: `CREATE INDEX knowledge_node_source IF NOT EXISTS
29
35
  FOR (n:${NODE_LABEL}) ON (n.sourceType, n.sourceId)`,
30
- /** Vector index for embedding similarity search. */
31
- VECTOR_INDEX: [
32
- `CREATE VECTOR INDEX ${VECTOR_INDEX_NAME} IF NOT EXISTS`,
33
- `FOR (n:${NODE_LABEL}) ON (n.embedding)`,
34
- `OPTIONS {`,
35
- ` indexConfig: {`,
36
- ` \`vector.dimensions\`: ${EMBEDDING_DIMENSIONS},`,
37
- ` \`vector.similarity_function\`: '${VECTOR_SIMILARITY_FUNCTION}'`,
38
- ` }`,
39
- `}`,
40
- ].join("\n"),
41
- };
36
+ /** Vector index for embedding similarity search. */
37
+ VECTOR_INDEX: [
38
+ `CREATE VECTOR INDEX ${VECTOR_INDEX_NAME} IF NOT EXISTS`,
39
+ `FOR (n:${NODE_LABEL}) ON (n.embedding)`,
40
+ `OPTIONS {`,
41
+ ` indexConfig: {`,
42
+ ` \`vector.dimensions\`: ${dimensions},`,
43
+ ` \`vector.similarity_function\`: '${VECTOR_SIMILARITY_FUNCTION}'`,
44
+ ` }`,
45
+ `}`,
46
+ ].join("\n"),
47
+ };
48
+ }
49
+ /**
50
+ * Static statements using the default dimensions (1536).
51
+ *
52
+ * @deprecated Use {@link buildSchemaStatements} with the embedder's actual dimensions.
53
+ */
54
+ export const SCHEMA_STATEMENTS = buildSchemaStatements();
55
+ // ---------------------------------------------------------------------------
56
+ // Retry helpers
57
+ // ---------------------------------------------------------------------------
58
+ /** Maximum number of retry attempts for transient Neo4j errors. */
59
+ const SCHEMA_RETRY_LIMIT = 3;
60
+ /** Base delay (ms) between retries — multiplied by attempt number. */
61
+ const SCHEMA_RETRY_DELAY_MS = 500;
62
+ /**
63
+ * Run a single schema statement with retry for transient errors and
64
+ * tolerance for "already exists" collisions.
65
+ */
66
+ async function runStatementWithRetry(session, name, cypher) {
67
+ for (let attempt = 1; attempt <= SCHEMA_RETRY_LIMIT; attempt++) {
68
+ try {
69
+ await session.run(cypher);
70
+ return;
71
+ }
72
+ catch (error) {
73
+ const code = error.code ?? "";
74
+ // Neo4j CE throws EquivalentSchemaRuleAlreadyExists even with IF NOT EXISTS
75
+ // when an equivalent index exists with a different internal name.
76
+ if (code.includes("EquivalentSchemaRuleAlreadyExists")) {
77
+ logger.debug({ statement: name }, "Schema element already exists, skipping");
78
+ return;
79
+ }
80
+ // Transient errors (deadlocks, lock contention) are retryable
81
+ const retryable = error.retryable === true;
82
+ if (retryable && attempt < SCHEMA_RETRY_LIMIT) {
83
+ logger.warn({ statement: name, attempt }, "Transient schema error, retrying");
84
+ await new Promise((resolve) => setTimeout(resolve, SCHEMA_RETRY_DELAY_MS * attempt));
85
+ continue;
86
+ }
87
+ logger.error({ err: error, statement: name }, "Schema statement failed");
88
+ throw new Error(`Schema statement "${name}" failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
89
+ }
90
+ }
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Public API
94
+ // ---------------------------------------------------------------------------
42
95
  /**
43
96
  * Initialize the Neo4j schema: constraints, property indexes, and the
44
97
  * vector index.
45
98
  *
46
- * All statements are idempotent (`IF NOT EXISTS`). Call once at startup
47
- * after {@link openNeo4j}.
99
+ * All statements are idempotent (`IF NOT EXISTS`). Transient errors
100
+ * (deadlocks from concurrent initialization) are retried automatically.
101
+ * Call once at startup after {@link openNeo4j}.
102
+ *
103
+ * @param dimensions - Vector index dimensionality. Should match the
104
+ * embedder (e.g., 384 for the default local embedder). Defaults to
105
+ * {@link EMBEDDING_DIMENSIONS} (1536).
48
106
  */
49
- export async function initSchema() {
107
+ export async function initSchema(dimensions) {
108
+ const statements = dimensions !== undefined
109
+ ? buildSchemaStatements(dimensions)
110
+ : SCHEMA_STATEMENTS;
50
111
  const session = getSession();
51
112
  try {
52
- for (const [name, cypher] of Object.entries(SCHEMA_STATEMENTS)) {
113
+ for (const [name, cypher] of Object.entries(statements)) {
53
114
  logger.debug({ statement: name }, "Running schema statement");
54
- try {
55
- await session.run(cypher);
56
- }
57
- catch (error) {
58
- logger.error({ err: error, statement: name }, "Schema statement failed");
59
- throw new Error(`Schema statement "${name}" failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
60
- }
115
+ await runStatementWithRetry(session, name, cypher);
61
116
  }
62
117
  logger.info("Knowledge graph schema initialized");
63
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AAExB;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,wCAAwC;IACxC,cAAc,EAAE;aACL,UAAU,0BAA0B;IAE/C,0DAA0D;IAC1D,UAAU,EAAE;aACD,UAAU,eAAe;IAEpC,+CAA+C;IAC/C,eAAe,EAAE;aACN,UAAU,sBAAsB;IAE3C,4DAA4D;IAC5D,YAAY,EAAE;aACH,UAAU,iCAAiC;IAEtD,oDAAoD;IACpD,YAAY,EAAE;QACZ,uBAAuB,iBAAiB,gBAAgB;QACxD,UAAU,UAAU,oBAAoB;QACxC,WAAW;QACX,kBAAkB;QAClB,8BAA8B,oBAAoB,GAAG;QACrD,wCAAwC,0BAA0B,GAAG;QACrE,KAAK;QACL,GAAG;KACJ,CAAC,IAAI,CAAC,IAAI,CAAC;CACb,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,0BAA0B,CAAC,CAAC;YAC9D,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,yBAAyB,CAAC,CAAC;gBACzE,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC9F,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,2DAA2D,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grackle-ai/knowledge-core",
3
- "version": "0.75.13",
3
+ "version": "0.76.1",
4
4
  "description": "Generic knowledge graph SDK on top of Neo4j with vector search, graph traversal, and pluggable embedders/chunkers",
5
5
  "license": "MIT",
6
6
  "repository": {