@rubytech/create-realagent 1.0.714 → 1.0.716
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/dist/index.js +33 -0
- package/package.json +1 -1
- package/payload/platform/lib/graph-search/dist/index.d.ts +27 -11
- package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-search/dist/index.js +29 -13
- package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-search/src/__tests__/fulltext-coverage.test.ts +267 -0
- package/payload/platform/lib/graph-search/src/index.ts +27 -12
- package/payload/platform/neo4j/schema.cypher +53 -7
- package/payload/platform/plugins/docs/references/internals.md +4 -4
- package/payload/platform/plugins/memory/references/graph-primitives.md +9 -3
- package/payload/platform/scripts/embed-backfill.sh +370 -0
- package/payload/platform/scripts/seed-neo4j.sh +10 -4
- package/payload/server/public/assets/{Checkbox-DD2mv2dU.js → Checkbox-DzNre1pt.js} +1 -1
- package/payload/server/public/assets/{admin-BmuLrDs2.js → admin-BtlXk1uc.js} +1 -1
- package/payload/server/public/assets/{data-BiexCwhp.js → data-BTKZGy84.js} +1 -1
- package/payload/server/public/assets/{file-CXzgVus7.js → file-DTW7TZ7G.js} +1 -1
- package/payload/server/public/assets/{graph-DOWTWpqy.js → graph-CkcuUDtA.js} +1 -1
- package/payload/server/public/assets/{house-DuPFyfb8.js → house-DKctRD9t.js} +1 -1
- package/payload/server/public/assets/{jsx-runtime-UA_LoTFj.css → jsx-runtime-97_Z_wBZ.css} +1 -1
- package/payload/server/public/assets/{public-Tjx3543Z.js → public-CYQSF6Xf.js} +1 -1
- package/payload/server/public/assets/{share-2-C_nKw-UZ.js → share-2--beVI26B.js} +1 -1
- package/payload/server/public/assets/{useVoiceRecorder-aDBUrrIb.js → useVoiceRecorder-CACPhPdW.js} +1 -1
- package/payload/server/public/assets/{x-Do7BO9Ow.js → x-DGk8kvbj.js} +1 -1
- package/payload/server/public/data.html +6 -6
- package/payload/server/public/graph.html +7 -7
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +1 -1
- /package/payload/server/public/assets/{jsx-runtime-DV3X_CC7.js → jsx-runtime-C-H-0vwA.js} +0 -0
package/dist/index.js
CHANGED
|
@@ -1451,6 +1451,39 @@ function setupAccount() {
|
|
|
1451
1451
|
if (existsSync(seedScript)) {
|
|
1452
1452
|
shell("bash", [seedScript], { cwd: INSTALL_DIR });
|
|
1453
1453
|
}
|
|
1454
|
+
// Task 748 — universal embedding coverage backfill. Run after seed so the
|
|
1455
|
+
// entity_search index is in place and any pre-Task-748 nodes (e.g. the
|
|
1456
|
+
// 5096 LinkedIn-imported Persons on existing Pis that bulk-import skipped
|
|
1457
|
+
// embedding for) get a vector populated. Idempotent — instant no-op when
|
|
1458
|
+
// nothing is pending, so re-running on every install is harmless.
|
|
1459
|
+
//
|
|
1460
|
+
// Failure-mode policy: WARN, do not abort. The fulltext index is already
|
|
1461
|
+
// applied above, so BM25 search works end-to-end without embeddings; the
|
|
1462
|
+
// only gap is vector ranking quality on legacy nodes. Aborting the
|
|
1463
|
+
// installer on an Ollama hiccup would block every install for a
|
|
1464
|
+
// strictly-degradable feature. The script's own loud-failure output
|
|
1465
|
+
// tells the operator how to re-run.
|
|
1466
|
+
const backfillScript = join(INSTALL_DIR, "platform/scripts/embed-backfill.sh");
|
|
1467
|
+
if (existsSync(backfillScript)) {
|
|
1468
|
+
const start = Date.now();
|
|
1469
|
+
logFile(`> bash ${backfillScript} (warn-not-abort)`);
|
|
1470
|
+
const result = spawnSync("bash", [backfillScript], {
|
|
1471
|
+
stdio: "inherit",
|
|
1472
|
+
timeout: 30 * 60_000,
|
|
1473
|
+
cwd: INSTALL_DIR,
|
|
1474
|
+
});
|
|
1475
|
+
const dur = ((Date.now() - start) / 1000).toFixed(1);
|
|
1476
|
+
if (result.status !== 0 || result.signal) {
|
|
1477
|
+
const reason = result.signal ? `signal=${result.signal}` : `exit=${result.status}`;
|
|
1478
|
+
logFile(` WARN: embed-backfill non-zero (${reason}) after ${dur}s`);
|
|
1479
|
+
console.warn(`\n WARNING: embed-backfill did not complete (${reason}) — BM25 search works,\n` +
|
|
1480
|
+
` but vector ranking on legacy nodes will be sparse until you re-run:\n` +
|
|
1481
|
+
` bash ${backfillScript}\n`);
|
|
1482
|
+
}
|
|
1483
|
+
else {
|
|
1484
|
+
logFile(` OK embed-backfill in ${dur}s`);
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1454
1487
|
}
|
|
1455
1488
|
// ---------------------------------------------------------------------------
|
|
1456
1489
|
// Tunnel script shortcuts
|
package/package.json
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared hybrid search primitive over the Neo4j knowledge graph.
|
|
3
3
|
*
|
|
4
|
-
* Pre-Task-675 there were two BM25 implementations over the same
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* Pre-Task-675 there were two BM25 implementations over the same fulltext
|
|
5
|
+
* index — one in the memory MCP tool, one in the admin Hono route — with
|
|
6
|
+
* divergent filter semantics (soft-delete primitive) and divergent ranking
|
|
7
|
+
* (agent ran hybrid vector+BM25, UI ran BM25-only). Task 675 collapses both
|
|
8
|
+
* into this lib; memory MCP + admin route now share a single code path so
|
|
9
|
+
* `/graph` UI ranking matches what the agent sees.
|
|
10
|
+
*
|
|
11
|
+
* Task 748 — fulltext index `knowledge_fulltext` was renamed to `entity_search`
|
|
12
|
+
* and its label union expanded from 3 labels (KnowledgeDocument | Section |
|
|
13
|
+
* Chunk) to the full operator-meaningful label set (~40 labels) on every
|
|
14
|
+
* textual property the schema's writers assign. The lib references the new
|
|
15
|
+
* name via FULLTEXT_INDEX_NAME below; the doctrine test at
|
|
16
|
+
* `__tests__/fulltext-coverage.test.ts` parses `platform/neo4j/schema.cypher`
|
|
17
|
+
* and asserts the index covers the union of `GRAPH_LABEL_COLOURS` and every
|
|
18
|
+
* label declared in the schema.
|
|
10
19
|
*
|
|
11
20
|
* QUERY --> EMBED --> VECTOR SEARCH (per index) --> ┐
|
|
12
21
|
* │ ├--> MERGE --> EXPAND --> RESULTS
|
|
@@ -30,6 +39,13 @@
|
|
|
30
39
|
* line with the prefix and fields it wants.
|
|
31
40
|
*/
|
|
32
41
|
import { type Session } from "neo4j-driver";
|
|
42
|
+
/**
|
|
43
|
+
* Name of the universal fulltext index (Task 748). Mirrors the `CREATE FULLTEXT
|
|
44
|
+
* INDEX` declaration in `platform/neo4j/schema.cypher`. The doctrine test
|
|
45
|
+
* (`__tests__/fulltext-coverage.test.ts`) asserts the schema's index name
|
|
46
|
+
* matches this constant — drift between the two breaks BM25 silently.
|
|
47
|
+
*/
|
|
48
|
+
export declare const FULLTEXT_INDEX_NAME = "entity_search";
|
|
33
49
|
export interface SearchHit {
|
|
34
50
|
nodeId: string;
|
|
35
51
|
labels: string[];
|
|
@@ -118,10 +134,10 @@ export declare function discoverIndexes(session: Session): Promise<Map<string, s
|
|
|
118
134
|
/** Clear the index cache — call after schema changes. */
|
|
119
135
|
export declare function clearIndexCache(): void;
|
|
120
136
|
/**
|
|
121
|
-
* BM25 full-text search against the `
|
|
137
|
+
* BM25 full-text search against the universal `entity_search` index (Task 748).
|
|
122
138
|
* Returns [] when the index doesn't exist — matches memory-search.ts
|
|
123
|
-
* graceful-fallback semantics so a fresh account
|
|
124
|
-
* doesn't 500 the caller.
|
|
139
|
+
* graceful-fallback semantics so a fresh account or a Pi mid-migration
|
|
140
|
+
* (POPULATING window) doesn't 500 the caller.
|
|
125
141
|
*/
|
|
126
142
|
export declare function bm25Only(session: Session, params: Bm25OnlyParams): Promise<SearchHit[]>;
|
|
127
143
|
/**
|
|
@@ -134,8 +150,8 @@ export declare function bm25Only(session: Session, params: Bm25OnlyParams): Prom
|
|
|
134
150
|
* 2. Vector search per label (one query per vector index discovered at
|
|
135
151
|
* boot). Nodes-by-label filter short-circuits when the requested
|
|
136
152
|
* labels have no index.
|
|
137
|
-
* 3. BM25 search on
|
|
138
|
-
* vector half (scope/agent/keyword/trashed).
|
|
153
|
+
* 3. BM25 search on the universal `entity_search` index (Task 748) —
|
|
154
|
+
* same filter semantics as vector half (scope/agent/keyword/trashed).
|
|
139
155
|
* 4. Keyword subscriptions (when set): BM25 per keyword + property
|
|
140
156
|
* lookup against `node.keywords` array. Both bypass the agentSlug
|
|
141
157
|
* filter — subscriptions are scope-inclusive by design (matches
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,21 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Shared hybrid search primitive over the Neo4j knowledge graph.
|
|
4
4
|
*
|
|
5
|
-
* Pre-Task-675 there were two BM25 implementations over the same
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* Pre-Task-675 there were two BM25 implementations over the same fulltext
|
|
6
|
+
* index — one in the memory MCP tool, one in the admin Hono route — with
|
|
7
|
+
* divergent filter semantics (soft-delete primitive) and divergent ranking
|
|
8
|
+
* (agent ran hybrid vector+BM25, UI ran BM25-only). Task 675 collapses both
|
|
9
|
+
* into this lib; memory MCP + admin route now share a single code path so
|
|
10
|
+
* `/graph` UI ranking matches what the agent sees.
|
|
11
|
+
*
|
|
12
|
+
* Task 748 — fulltext index `knowledge_fulltext` was renamed to `entity_search`
|
|
13
|
+
* and its label union expanded from 3 labels (KnowledgeDocument | Section |
|
|
14
|
+
* Chunk) to the full operator-meaningful label set (~40 labels) on every
|
|
15
|
+
* textual property the schema's writers assign. The lib references the new
|
|
16
|
+
* name via FULLTEXT_INDEX_NAME below; the doctrine test at
|
|
17
|
+
* `__tests__/fulltext-coverage.test.ts` parses `platform/neo4j/schema.cypher`
|
|
18
|
+
* and asserts the index covers the union of `GRAPH_LABEL_COLOURS` and every
|
|
19
|
+
* label declared in the schema.
|
|
11
20
|
*
|
|
12
21
|
* QUERY --> EMBED --> VECTOR SEARCH (per index) --> ┐
|
|
13
22
|
* │ ├--> MERGE --> EXPAND --> RESULTS
|
|
@@ -31,6 +40,7 @@
|
|
|
31
40
|
* line with the prefix and fields it wants.
|
|
32
41
|
*/
|
|
33
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.FULLTEXT_INDEX_NAME = void 0;
|
|
34
44
|
exports.escapeLucene = escapeLucene;
|
|
35
45
|
exports.normaliseBm25Scores = normaliseBm25Scores;
|
|
36
46
|
exports.discoverIndexes = discoverIndexes;
|
|
@@ -41,7 +51,13 @@ const neo4j_driver_1 = require("neo4j-driver");
|
|
|
41
51
|
const index_js_1 = require("../../graph-trash/dist/index.js");
|
|
42
52
|
const VECTOR_WEIGHT = 0.7;
|
|
43
53
|
const BM25_WEIGHT = 0.3;
|
|
44
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Name of the universal fulltext index (Task 748). Mirrors the `CREATE FULLTEXT
|
|
56
|
+
* INDEX` declaration in `platform/neo4j/schema.cypher`. The doctrine test
|
|
57
|
+
* (`__tests__/fulltext-coverage.test.ts`) asserts the schema's index name
|
|
58
|
+
* matches this constant — drift between the two breaks BM25 silently.
|
|
59
|
+
*/
|
|
60
|
+
exports.FULLTEXT_INDEX_NAME = "entity_search";
|
|
45
61
|
/**
|
|
46
62
|
* Lucene-escape special characters per Neo4j's fulltext query grammar.
|
|
47
63
|
* `/[+\-&|!(){}[\]^"~*?:\\/]/g` — matches memory-search.ts:127 and
|
|
@@ -97,10 +113,10 @@ function buildKeywordFilter(keywords, keywordMatch = "any") {
|
|
|
97
113
|
};
|
|
98
114
|
}
|
|
99
115
|
/**
|
|
100
|
-
* BM25 full-text search against the `
|
|
116
|
+
* BM25 full-text search against the universal `entity_search` index (Task 748).
|
|
101
117
|
* Returns [] when the index doesn't exist — matches memory-search.ts
|
|
102
|
-
* graceful-fallback semantics so a fresh account
|
|
103
|
-
* doesn't 500 the caller.
|
|
118
|
+
* graceful-fallback semantics so a fresh account or a Pi mid-migration
|
|
119
|
+
* (POPULATING window) doesn't 500 the caller.
|
|
104
120
|
*/
|
|
105
121
|
async function bm25Only(session, params) {
|
|
106
122
|
const { query, accountId, limit, allowedScopes, agentSlug, keywords, keywordMatch, labels } = params;
|
|
@@ -128,7 +144,7 @@ async function bm25Only(session, params) {
|
|
|
128
144
|
RETURN node, score, labels(node) AS nodeLabels, elementId(node) AS nodeId
|
|
129
145
|
ORDER BY score DESC
|
|
130
146
|
LIMIT $limit`, {
|
|
131
|
-
indexName: FULLTEXT_INDEX_NAME,
|
|
147
|
+
indexName: exports.FULLTEXT_INDEX_NAME,
|
|
132
148
|
query: escaped,
|
|
133
149
|
accountId,
|
|
134
150
|
limit: (0, neo4j_driver_1.int)(limit),
|
|
@@ -167,8 +183,8 @@ async function bm25Only(session, params) {
|
|
|
167
183
|
* 2. Vector search per label (one query per vector index discovered at
|
|
168
184
|
* boot). Nodes-by-label filter short-circuits when the requested
|
|
169
185
|
* labels have no index.
|
|
170
|
-
* 3. BM25 search on
|
|
171
|
-
* vector half (scope/agent/keyword/trashed).
|
|
186
|
+
* 3. BM25 search on the universal `entity_search` index (Task 748) —
|
|
187
|
+
* same filter semantics as vector half (scope/agent/keyword/trashed).
|
|
172
188
|
* 4. Keyword subscriptions (when set): BM25 per keyword + property
|
|
173
189
|
* lookup against `node.keywords` array. Both bypass the agentSlug
|
|
174
190
|
* filter — subscriptions are scope-inclusive by design (matches
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { FULLTEXT_INDEX_NAME } from "../index.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Doctrine test (Task 748) — pins the universal-coverage invariant for the
|
|
9
|
+
* fulltext index so future schema edits cannot silently re-narrow.
|
|
10
|
+
*
|
|
11
|
+
* The pre-Task-748 fulltext index `knowledge_fulltext` covered 3 of ~40
|
|
12
|
+
* registered labels (`KnowledgeDocument | Section | Chunk`); BM25 silently
|
|
13
|
+
* returned zero hits for Person/Organization/Task/Conversation/etc. queries
|
|
14
|
+
* regardless of term. The doctrine: search is "find any node in my graph
|
|
15
|
+
* that mentions this term" — there is no allowlist of search-eligible labels.
|
|
16
|
+
*
|
|
17
|
+
* This test reads `platform/neo4j/schema.cypher` (the schema source of truth)
|
|
18
|
+
* and `platform/ui/app/lib/graph-labels.ts` (the canvas label registry) at
|
|
19
|
+
* runtime, parses both, and asserts:
|
|
20
|
+
*
|
|
21
|
+
* 1. The fulltext index name in `schema.cypher` matches the
|
|
22
|
+
* `FULLTEXT_INDEX_NAME` constant in the lib. Drift between the two
|
|
23
|
+
* breaks BM25 silently — the lib queries an index name that doesn't
|
|
24
|
+
* exist, hits the graceful-fallback `[]` branch, and search returns
|
|
25
|
+
* no BM25 hits.
|
|
26
|
+
* 2. The label union in the index ⊇ union of:
|
|
27
|
+
* - `Object.keys(GRAPH_LABEL_COLOURS)` (canvas-registered labels)
|
|
28
|
+
* - every label declared via `CREATE CONSTRAINT|INDEX FOR (n:Label)`
|
|
29
|
+
* in `schema.cypher` (write-targeted labels)
|
|
30
|
+
* minus a small explicit excluded set (`Trashed`, `GraphPreference`)
|
|
31
|
+
* that carry no operator-meaningful textual content.
|
|
32
|
+
* 3. The property union in the index ⊇ the canonical text-property list
|
|
33
|
+
* (the properties that writers across the codebase assign to nodes).
|
|
34
|
+
* New writers extending the canon must add their property here.
|
|
35
|
+
*
|
|
36
|
+
* Failing assertions point the next person at exactly the schema drift to
|
|
37
|
+
* close — not "search is mysteriously broken."
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
41
|
+
const SCHEMA_PATH = resolve(__dirname, "../../../../neo4j/schema.cypher");
|
|
42
|
+
const LABELS_PATH = resolve(__dirname, "../../../../ui/app/lib/graph-labels.ts");
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Labels declared in `schema.cypher` or `GRAPH_LABEL_COLOURS` that legitimately
|
|
46
|
+
* carry no searchable textual content. The doctrine test allows these to be
|
|
47
|
+
* absent from the fulltext index union without failing.
|
|
48
|
+
*
|
|
49
|
+
* - `Trashed` — soft-delete flag label; nodes carrying it are
|
|
50
|
+
* already excluded from every search via `notTrashed()`
|
|
51
|
+
* in the lib.
|
|
52
|
+
* - `GraphPreference`— per-(accountId, userId) UI metadata for /graph;
|
|
53
|
+
* carries no textual content, never operator-visible
|
|
54
|
+
* as a search hit.
|
|
55
|
+
*/
|
|
56
|
+
const EXCLUDED_FROM_INDEX = new Set(["Trashed", "GraphPreference"]);
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Canonical text-property list — every property the platform's writers
|
|
60
|
+
* assign that the operator might search for. Extending the canon in a new
|
|
61
|
+
* writer means extending this list AND the schema's `ON EACH [...]` clause.
|
|
62
|
+
* Discovered via codebase sweep during Task 748 across `memory-write`,
|
|
63
|
+
* `memory-archive-write`, `memory-ingest`, `email-store`, `neo4j-store`,
|
|
64
|
+
* `workflow-create`, `tool-call-writer`, `review-detector/writer`.
|
|
65
|
+
*/
|
|
66
|
+
const CANONICAL_TEXT_PROPERTIES = [
|
|
67
|
+
// Generic
|
|
68
|
+
"name", "title", "summary", "body", "content", "text", "description",
|
|
69
|
+
"headline", "abstract", "note", "label", "value", "message", "preview",
|
|
70
|
+
"tagline",
|
|
71
|
+
// Person
|
|
72
|
+
"firstName", "lastName", "givenName", "familyName", "email",
|
|
73
|
+
// Email
|
|
74
|
+
"subject", "bodyPreview", "fromName", "fromAddress", "screeningReason",
|
|
75
|
+
// EmailAccount
|
|
76
|
+
"agentAddress",
|
|
77
|
+
// Credential
|
|
78
|
+
"authority",
|
|
79
|
+
// AccessGrant
|
|
80
|
+
"contactValue",
|
|
81
|
+
// ToolCall
|
|
82
|
+
"toolName",
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
interface IndexDeclaration {
|
|
86
|
+
name: string;
|
|
87
|
+
labels: Set<string>;
|
|
88
|
+
properties: Set<string>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Extract the `CREATE FULLTEXT INDEX entity_search ... ;` block from
|
|
93
|
+
* `schema.cypher` and parse its label and property sets.
|
|
94
|
+
*
|
|
95
|
+
* Uses a paren-balanced scan from the matched `CREATE FULLTEXT INDEX <name>`
|
|
96
|
+
* to the next semicolon — survives whitespace/comment/line-break formatting
|
|
97
|
+
* drift that a single monolithic regex would not. Failing here means the
|
|
98
|
+
* declaration's shape diverged from `CREATE FULLTEXT INDEX <name> IF NOT EXISTS
|
|
99
|
+
* FOR (n:A|B|...) ON EACH [n.x, n.y, ...];` in a way the parser does not
|
|
100
|
+
* recognise — extend this function before the test.
|
|
101
|
+
*/
|
|
102
|
+
function parseFulltextIndex(rawCypher: string, indexName: string): IndexDeclaration {
|
|
103
|
+
// Strip line comments first so a historical note like
|
|
104
|
+
// `// pre-Task-748: CREATE FULLTEXT INDEX entity_search FOR (n:OldLabel)`
|
|
105
|
+
// does not fool the extractor into parsing the comment instead of the
|
|
106
|
+
// live declaration.
|
|
107
|
+
const cypher = stripLineComments(rawCypher);
|
|
108
|
+
const declStart = cypher.search(
|
|
109
|
+
new RegExp(`CREATE\\s+FULLTEXT\\s+INDEX\\s+${indexName}\\b`, "m"),
|
|
110
|
+
);
|
|
111
|
+
if (declStart < 0) {
|
|
112
|
+
throw new Error(
|
|
113
|
+
`parseFulltextIndex: could not find 'CREATE FULLTEXT INDEX ${indexName}' in schema.cypher. ` +
|
|
114
|
+
`Drift between schema and FULLTEXT_INDEX_NAME constant in graph-search/src/index.ts.`,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
const declEnd = cypher.indexOf(";", declStart);
|
|
118
|
+
if (declEnd < 0) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`parseFulltextIndex: no terminating ';' after 'CREATE FULLTEXT INDEX ${indexName}' — schema.cypher is malformed.`,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
const block = cypher.slice(declStart, declEnd);
|
|
124
|
+
|
|
125
|
+
const forMatch = block.match(/FOR\s+\(n:([^\)]+)\)/);
|
|
126
|
+
if (!forMatch) {
|
|
127
|
+
throw new Error(
|
|
128
|
+
`parseFulltextIndex: could not extract FOR (n:...) clause from index ${indexName}. Block: ${block.slice(0, 200)}...`,
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
const labels = new Set(
|
|
132
|
+
forMatch[1]
|
|
133
|
+
.split("|")
|
|
134
|
+
.map((s) => s.trim())
|
|
135
|
+
.filter((s) => s.length > 0),
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const onEachMatch = block.match(/ON\s+EACH\s+\[([^\]]+)\]/);
|
|
139
|
+
if (!onEachMatch) {
|
|
140
|
+
throw new Error(
|
|
141
|
+
`parseFulltextIndex: could not extract ON EACH [...] clause from index ${indexName}. Block: ${block.slice(0, 200)}...`,
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
const properties = new Set(
|
|
145
|
+
onEachMatch[1]
|
|
146
|
+
.split(",")
|
|
147
|
+
.map((s) => s.trim().replace(/^n\./, ""))
|
|
148
|
+
.filter((s) => s.length > 0),
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
return { name: indexName, labels, properties };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Strip Cypher `// line comments` before regex-parsing so an example or
|
|
156
|
+
* migration note inside a comment block — e.g. `// previously: CREATE
|
|
157
|
+
* INDEX FOR (g:Goal) ON (g.embedding)` — does not inject a phantom label
|
|
158
|
+
* into the schema-declared set. Block comments `/* ... */` are not
|
|
159
|
+
* stripped because schema.cypher does not use them today.
|
|
160
|
+
*/
|
|
161
|
+
function stripLineComments(cypher: string): string {
|
|
162
|
+
return cypher.replace(/^\s*\/\/.*$/gm, "");
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Extract every label declared in `schema.cypher` via `FOR (alias:Label)`.
|
|
167
|
+
* Each `CREATE CONSTRAINT|INDEX|VECTOR INDEX|FULLTEXT INDEX` clause that
|
|
168
|
+
* targets a label produces one entry. The fulltext index itself uses
|
|
169
|
+
* `FOR (n:A|B|...)` — we extract the union of all alternatives.
|
|
170
|
+
*/
|
|
171
|
+
function parseSchemaDeclaredLabels(cypher: string): Set<string> {
|
|
172
|
+
const labels = new Set<string>();
|
|
173
|
+
const stripped = stripLineComments(cypher);
|
|
174
|
+
const matches = stripped.matchAll(/FOR\s+\(\w+:([^\)]+)\)/g);
|
|
175
|
+
for (const m of matches) {
|
|
176
|
+
for (const label of m[1].split("|")) {
|
|
177
|
+
const trimmed = label.trim();
|
|
178
|
+
// Filter out anything that doesn't look like a Neo4j label (defensive
|
|
179
|
+
// against future schema patterns that might inject non-label tokens).
|
|
180
|
+
if (/^[A-Z][A-Za-z0-9]*$/.test(trimmed)) {
|
|
181
|
+
labels.add(trimmed);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return labels;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Extract `Object.keys(GRAPH_LABEL_COLOURS)` from `graph-labels.ts` by
|
|
190
|
+
* matching the export's object-literal keys. Tolerates trailing commas,
|
|
191
|
+
* inline comments between keys, and leading whitespace.
|
|
192
|
+
*/
|
|
193
|
+
function parseGraphLabelColours(source: string): Set<string> {
|
|
194
|
+
const exportMatch = source.match(
|
|
195
|
+
/export\s+const\s+GRAPH_LABEL_COLOURS\s*:\s*[^=]+=\s*\{([\s\S]+?)\n\}/m,
|
|
196
|
+
);
|
|
197
|
+
if (!exportMatch) {
|
|
198
|
+
throw new Error(
|
|
199
|
+
"parseGraphLabelColours: could not find 'export const GRAPH_LABEL_COLOURS' object literal in graph-labels.ts.",
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
const labels = new Set<string>();
|
|
203
|
+
// Match keys that are bare identifiers (camelCase or PascalCase). Skip
|
|
204
|
+
// commented-out lines and string-quoted keys (none today, but defensive).
|
|
205
|
+
for (const m of exportMatch[1].matchAll(/^\s*([A-Z][A-Za-z0-9]*)\s*:/gm)) {
|
|
206
|
+
labels.add(m[1]);
|
|
207
|
+
}
|
|
208
|
+
return labels;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
describe("entity_search fulltext index — universal-coverage doctrine (Task 748)", () => {
|
|
212
|
+
const schemaCypher = readFileSync(SCHEMA_PATH, "utf-8");
|
|
213
|
+
const labelsSource = readFileSync(LABELS_PATH, "utf-8");
|
|
214
|
+
|
|
215
|
+
const indexDecl = parseFulltextIndex(schemaCypher, FULLTEXT_INDEX_NAME);
|
|
216
|
+
const schemaDeclaredLabels = parseSchemaDeclaredLabels(schemaCypher);
|
|
217
|
+
const colourLabels = parseGraphLabelColours(labelsSource);
|
|
218
|
+
|
|
219
|
+
const requiredLabels = new Set<string>();
|
|
220
|
+
for (const l of colourLabels) if (!EXCLUDED_FROM_INDEX.has(l)) requiredLabels.add(l);
|
|
221
|
+
for (const l of schemaDeclaredLabels) if (!EXCLUDED_FROM_INDEX.has(l)) requiredLabels.add(l);
|
|
222
|
+
|
|
223
|
+
it("schema declares the index under the FULLTEXT_INDEX_NAME constant", () => {
|
|
224
|
+
// The lib's BM25 path queries `db.index.fulltext.queryNodes($indexName)`.
|
|
225
|
+
// If `schema.cypher` declares a different name, the lib hits its
|
|
226
|
+
// graceful-fallback `[]` branch and BM25 silently returns no hits —
|
|
227
|
+
// the precise drift Task 748's rename was meant to delete.
|
|
228
|
+
expect(indexDecl.name).toBe(FULLTEXT_INDEX_NAME);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it("index labels ⊇ Object.keys(GRAPH_LABEL_COLOURS) − {excluded}", () => {
|
|
232
|
+
const missing = [...colourLabels]
|
|
233
|
+
.filter((l) => !EXCLUDED_FROM_INDEX.has(l))
|
|
234
|
+
.filter((l) => !indexDecl.labels.has(l));
|
|
235
|
+
expect(missing).toEqual([]);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it("index labels ⊇ every schema-declared label − {excluded}", () => {
|
|
239
|
+
// Position, Credential, etc. — labels written by the platform but not
|
|
240
|
+
// (yet) registered in GRAPH_LABEL_COLOURS. The doctrine: every label
|
|
241
|
+
// the platform writes is searchable on day 1. Registering for canvas
|
|
242
|
+
// colour is a separate concern.
|
|
243
|
+
const missing = [...schemaDeclaredLabels]
|
|
244
|
+
.filter((l) => !EXCLUDED_FROM_INDEX.has(l))
|
|
245
|
+
.filter((l) => !indexDecl.labels.has(l));
|
|
246
|
+
expect(missing).toEqual([]);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it("index properties ⊇ canonical text-property list", () => {
|
|
250
|
+
// Adding a new text property in a writer (e.g. `Position.companyName`
|
|
251
|
+
// hypothetically) without extending the schema's `ON EACH [...]` clause
|
|
252
|
+
// means BM25 cannot match on that property. Catch it here.
|
|
253
|
+
const missing = CANONICAL_TEXT_PROPERTIES.filter(
|
|
254
|
+
(p) => !indexDecl.properties.has(p),
|
|
255
|
+
);
|
|
256
|
+
expect(missing).toEqual([]);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it("required-label set is non-trivial — sanity check that the parsers ran", () => {
|
|
260
|
+
// Defensive: if the parsers above silently regressed to "no labels
|
|
261
|
+
// found", the supersets above would vacuously pass. Assert a meaningful
|
|
262
|
+
// floor (we expect ~40 labels post-Task-748).
|
|
263
|
+
expect(requiredLabels.size).toBeGreaterThanOrEqual(30);
|
|
264
|
+
expect(indexDecl.labels.size).toBeGreaterThanOrEqual(30);
|
|
265
|
+
expect(indexDecl.properties.size).toBeGreaterThanOrEqual(20);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared hybrid search primitive over the Neo4j knowledge graph.
|
|
3
3
|
*
|
|
4
|
-
* Pre-Task-675 there were two BM25 implementations over the same
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* Pre-Task-675 there were two BM25 implementations over the same fulltext
|
|
5
|
+
* index — one in the memory MCP tool, one in the admin Hono route — with
|
|
6
|
+
* divergent filter semantics (soft-delete primitive) and divergent ranking
|
|
7
|
+
* (agent ran hybrid vector+BM25, UI ran BM25-only). Task 675 collapses both
|
|
8
|
+
* into this lib; memory MCP + admin route now share a single code path so
|
|
9
|
+
* `/graph` UI ranking matches what the agent sees.
|
|
10
|
+
*
|
|
11
|
+
* Task 748 — fulltext index `knowledge_fulltext` was renamed to `entity_search`
|
|
12
|
+
* and its label union expanded from 3 labels (KnowledgeDocument | Section |
|
|
13
|
+
* Chunk) to the full operator-meaningful label set (~40 labels) on every
|
|
14
|
+
* textual property the schema's writers assign. The lib references the new
|
|
15
|
+
* name via FULLTEXT_INDEX_NAME below; the doctrine test at
|
|
16
|
+
* `__tests__/fulltext-coverage.test.ts` parses `platform/neo4j/schema.cypher`
|
|
17
|
+
* and asserts the index covers the union of `GRAPH_LABEL_COLOURS` and every
|
|
18
|
+
* label declared in the schema.
|
|
10
19
|
*
|
|
11
20
|
* QUERY --> EMBED --> VECTOR SEARCH (per index) --> ┐
|
|
12
21
|
* │ ├--> MERGE --> EXPAND --> RESULTS
|
|
@@ -35,7 +44,13 @@ import { notTrashed } from "../../graph-trash/dist/index.js";
|
|
|
35
44
|
|
|
36
45
|
const VECTOR_WEIGHT = 0.7;
|
|
37
46
|
const BM25_WEIGHT = 0.3;
|
|
38
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Name of the universal fulltext index (Task 748). Mirrors the `CREATE FULLTEXT
|
|
49
|
+
* INDEX` declaration in `platform/neo4j/schema.cypher`. The doctrine test
|
|
50
|
+
* (`__tests__/fulltext-coverage.test.ts`) asserts the schema's index name
|
|
51
|
+
* matches this constant — drift between the two breaks BM25 silently.
|
|
52
|
+
*/
|
|
53
|
+
export const FULLTEXT_INDEX_NAME = "entity_search";
|
|
39
54
|
|
|
40
55
|
export interface SearchHit {
|
|
41
56
|
nodeId: string;
|
|
@@ -182,10 +197,10 @@ function buildKeywordFilter(
|
|
|
182
197
|
}
|
|
183
198
|
|
|
184
199
|
/**
|
|
185
|
-
* BM25 full-text search against the `
|
|
200
|
+
* BM25 full-text search against the universal `entity_search` index (Task 748).
|
|
186
201
|
* Returns [] when the index doesn't exist — matches memory-search.ts
|
|
187
|
-
* graceful-fallback semantics so a fresh account
|
|
188
|
-
* doesn't 500 the caller.
|
|
202
|
+
* graceful-fallback semantics so a fresh account or a Pi mid-migration
|
|
203
|
+
* (POPULATING window) doesn't 500 the caller.
|
|
189
204
|
*/
|
|
190
205
|
export async function bm25Only(
|
|
191
206
|
session: Session,
|
|
@@ -259,8 +274,8 @@ export async function bm25Only(
|
|
|
259
274
|
* 2. Vector search per label (one query per vector index discovered at
|
|
260
275
|
* boot). Nodes-by-label filter short-circuits when the requested
|
|
261
276
|
* labels have no index.
|
|
262
|
-
* 3. BM25 search on
|
|
263
|
-
* vector half (scope/agent/keyword/trashed).
|
|
277
|
+
* 3. BM25 search on the universal `entity_search` index (Task 748) —
|
|
278
|
+
* same filter semantics as vector half (scope/agent/keyword/trashed).
|
|
264
279
|
* 4. Keyword subscriptions (when set): BM25 per keyword + property
|
|
265
280
|
* lookup against `node.keywords` array. Both bypass the agentSlug
|
|
266
281
|
* filter — subscriptions are scope-inclusive by design (matches
|