@rubytech/create-maxy 1.0.743 → 1.0.745
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/package.json +1 -1
- package/payload/platform/lib/graph-mcp/dist/__tests__/cypher-validate-write.test.d.ts +2 -0
- package/payload/platform/lib/graph-mcp/dist/__tests__/cypher-validate-write.test.d.ts.map +1 -0
- package/payload/platform/lib/graph-mcp/dist/__tests__/cypher-validate-write.test.js +97 -0
- package/payload/platform/lib/graph-mcp/dist/__tests__/cypher-validate-write.test.js.map +1 -0
- package/payload/platform/lib/graph-mcp/dist/cypher-rewrite-stamp.d.ts +37 -0
- package/payload/platform/lib/graph-mcp/dist/cypher-rewrite-stamp.d.ts.map +1 -0
- package/payload/platform/lib/graph-mcp/dist/cypher-rewrite-stamp.js +333 -0
- package/payload/platform/lib/graph-mcp/dist/cypher-rewrite-stamp.js.map +1 -0
- package/payload/platform/lib/graph-mcp/dist/cypher-shim-write.d.ts +71 -0
- package/payload/platform/lib/graph-mcp/dist/cypher-shim-write.d.ts.map +1 -0
- package/payload/platform/lib/graph-mcp/dist/cypher-shim-write.js +168 -0
- package/payload/platform/lib/graph-mcp/dist/cypher-shim-write.js.map +1 -0
- package/payload/platform/lib/graph-mcp/dist/cypher-validate.d.ts +13 -1
- package/payload/platform/lib/graph-mcp/dist/cypher-validate.d.ts.map +1 -1
- package/payload/platform/lib/graph-mcp/dist/cypher-validate.js +70 -3
- package/payload/platform/lib/graph-mcp/dist/cypher-validate.js.map +1 -1
- package/payload/platform/lib/graph-mcp/dist/index.js +297 -11
- package/payload/platform/lib/graph-mcp/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-mcp/dist/schema-cache.d.ts +3 -6
- package/payload/platform/lib/graph-mcp/dist/schema-cache.d.ts.map +1 -1
- package/payload/platform/lib/graph-mcp/dist/schema-cache.js +30 -7
- package/payload/platform/lib/graph-mcp/dist/schema-cache.js.map +1 -1
- package/payload/platform/lib/graph-mcp/src/__tests__/cypher-validate-write.test.ts +150 -0
- package/payload/platform/lib/graph-mcp/src/cypher-rewrite-stamp.ts +349 -0
- package/payload/platform/lib/graph-mcp/src/cypher-shim-write.ts +240 -0
- package/payload/platform/lib/graph-mcp/src/cypher-validate.ts +95 -3
- package/payload/platform/lib/graph-mcp/src/index.ts +415 -18
- package/payload/platform/lib/graph-mcp/src/schema-cache.ts +37 -7
- package/payload/platform/lib/graph-write/dist/__tests__/audit.test.d.ts +2 -0
- package/payload/platform/lib/graph-write/dist/__tests__/audit.test.d.ts.map +1 -0
- package/payload/platform/lib/graph-write/dist/__tests__/audit.test.js +147 -0
- package/payload/platform/lib/graph-write/dist/__tests__/audit.test.js.map +1 -0
- package/payload/platform/lib/graph-write/dist/audit.d.ts +84 -0
- package/payload/platform/lib/graph-write/dist/audit.d.ts.map +1 -0
- package/payload/platform/lib/graph-write/dist/audit.js +129 -0
- package/payload/platform/lib/graph-write/dist/audit.js.map +1 -0
- package/payload/platform/lib/graph-write/dist/index.d.ts +1 -0
- package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-write/dist/index.js +18 -22
- package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-write/src/__tests__/audit.test.ts +162 -0
- package/payload/platform/lib/graph-write/src/audit.ts +182 -0
- package/payload/platform/lib/graph-write/src/index.ts +5 -0
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/docs/references/deployment.md +2 -1
- package/payload/platform/plugins/docs/references/memory-guide.md +2 -0
- package/payload/platform/plugins/docs/references/troubleshooting.md +16 -0
- package/payload/platform/templates/specialists/agents/database-operator.md +20 -6
- package/payload/server/chunk-2T4RRIJK.js +9462 -0
- package/payload/server/chunk-SPTD7L7Z.js +9474 -0
- package/payload/server/maxy-edge.js +94 -16
- package/payload/server/public/assets/{graph-DhNy70eS.js → graph-BoSJpLG3.js} +1 -1
- package/payload/server/public/graph.html +1 -1
- package/payload/server/server.js +1 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pure helpers for the shim-owned write_neo4j_cypher path (Task 797).
|
|
4
|
+
* Extracted from index.ts so the executeWrite tx body, response synthesis,
|
|
5
|
+
* and value serialization can be unit-tested without the shim's top-level
|
|
6
|
+
* process bootstrap (which spawns uvx and opens stdin/stdout pipes).
|
|
7
|
+
*
|
|
8
|
+
* The shim's index.ts wires these up: rewriter → shared driver → session.
|
|
9
|
+
* executeWrite(tx => runWriteTxBody(...)) → response synth → stdout.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.OrphanRollbackError = exports.ORPHAN_CHECK_CYPHER = void 0;
|
|
13
|
+
exports.serializeValue = serializeValue;
|
|
14
|
+
exports.runWriteTxBody = runWriteTxBody;
|
|
15
|
+
exports.synthesiseWriteResponse = synthesiseWriteResponse;
|
|
16
|
+
exports.synthesiseOrphanRollback = synthesiseOrphanRollback;
|
|
17
|
+
exports.synthesiseShimError = synthesiseShimError;
|
|
18
|
+
exports.ORPHAN_CHECK_CYPHER = "MATCH (n) WHERE n.createdBySession = $__autoSession " +
|
|
19
|
+
"AND n.createdAt >= $__autoStartTimestamp " +
|
|
20
|
+
"AND NOT (n)--() " +
|
|
21
|
+
"RETURN collect(elementId(n)) AS orphanIds, " +
|
|
22
|
+
"collect(distinct labels(n)) AS labelSets";
|
|
23
|
+
class OrphanRollbackError extends Error {
|
|
24
|
+
orphanIds;
|
|
25
|
+
sampleLabels;
|
|
26
|
+
constructor(orphanIds, sampleLabels) {
|
|
27
|
+
super(`orphan rollback: ${orphanIds.length} unattached node(s)`);
|
|
28
|
+
this.orphanIds = orphanIds;
|
|
29
|
+
this.sampleLabels = sampleLabels;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.OrphanRollbackError = OrphanRollbackError;
|
|
33
|
+
function serializeValue(v) {
|
|
34
|
+
if (v === null || v === undefined)
|
|
35
|
+
return v;
|
|
36
|
+
if (typeof v === "string" || typeof v === "boolean" || typeof v === "number") {
|
|
37
|
+
return v;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(v))
|
|
40
|
+
return v.map(serializeValue);
|
|
41
|
+
if (typeof v === "object") {
|
|
42
|
+
const obj = v;
|
|
43
|
+
if ("low" in obj &&
|
|
44
|
+
"high" in obj &&
|
|
45
|
+
typeof obj.low === "number" &&
|
|
46
|
+
typeof obj.high === "number" &&
|
|
47
|
+
Object.keys(obj).length === 2) {
|
|
48
|
+
if (obj.high === 0 || obj.high === -1)
|
|
49
|
+
return obj.low;
|
|
50
|
+
return String(obj);
|
|
51
|
+
}
|
|
52
|
+
if ("properties" in obj && "labels" in obj) {
|
|
53
|
+
return {
|
|
54
|
+
labels: obj.labels,
|
|
55
|
+
elementId: obj.elementId,
|
|
56
|
+
properties: serializeValue(obj.properties),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if ("properties" in obj && "type" in obj && "elementId" in obj) {
|
|
60
|
+
return {
|
|
61
|
+
type: obj.type,
|
|
62
|
+
elementId: obj.elementId,
|
|
63
|
+
properties: serializeValue(obj.properties),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (obj.constructor &&
|
|
67
|
+
obj.constructor.name &&
|
|
68
|
+
obj.constructor.name !== "Object" &&
|
|
69
|
+
obj.constructor.name !== "Array") {
|
|
70
|
+
return String(obj);
|
|
71
|
+
}
|
|
72
|
+
const out = {};
|
|
73
|
+
for (const [k, val] of Object.entries(obj)) {
|
|
74
|
+
out[k] = serializeValue(val);
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
return v;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Body of the executeWrite tx. Runs the rewritten cypher, captures counters,
|
|
82
|
+
* runs the orphan check, throws OrphanRollbackError if any orphans remain
|
|
83
|
+
* (executeWrite catches the throw and rolls back the entire tx).
|
|
84
|
+
*
|
|
85
|
+
* Caller is responsible for: (a) opening the session, (b) wrapping this in
|
|
86
|
+
* `session.executeWrite(tx => runWriteTxBody(tx, ...))`, (c) calling close()
|
|
87
|
+
* in finally, (d) translating the outcome / OrphanRollbackError into the
|
|
88
|
+
* synthesised MCP response and audit log lines.
|
|
89
|
+
*/
|
|
90
|
+
async function runWriteTxBody(tx, rewrittenCypher, operatorParams, autoCtx) {
|
|
91
|
+
const tsRes = await tx.run("RETURN datetime() AS now");
|
|
92
|
+
const startTs = tsRes.records[0].get("now");
|
|
93
|
+
const merged = {
|
|
94
|
+
...operatorParams,
|
|
95
|
+
__autoStartTimestamp: startTs,
|
|
96
|
+
__autoAgent: autoCtx.agent,
|
|
97
|
+
__autoSession: autoCtx.session,
|
|
98
|
+
};
|
|
99
|
+
const writeRes = await tx.run(rewrittenCypher, merged);
|
|
100
|
+
const counters = writeRes.summary.counters.updates();
|
|
101
|
+
const nodesCreated = counters.nodesCreated;
|
|
102
|
+
const relsCreated = counters.relationshipsCreated;
|
|
103
|
+
const propertiesSet = counters.propertiesSet;
|
|
104
|
+
const keys = writeRes.records.length > 0 ? writeRes.records[0].keys.map(String) : [];
|
|
105
|
+
const serializedRecords = writeRes.records.map((rec) => {
|
|
106
|
+
const out = {};
|
|
107
|
+
for (const k of keys) {
|
|
108
|
+
out[k] = serializeValue(rec.get(k));
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
});
|
|
112
|
+
const orphanRes = await tx.run(exports.ORPHAN_CHECK_CYPHER, merged);
|
|
113
|
+
const orphanIds = orphanRes.records[0].get("orphanIds") ?? [];
|
|
114
|
+
const labelSets = orphanRes.records[0].get("labelSets") ?? [];
|
|
115
|
+
if (orphanIds.length > 0) {
|
|
116
|
+
const flatLabels = Array.from(new Set(labelSets.flat()));
|
|
117
|
+
throw new OrphanRollbackError(orphanIds, flatLabels);
|
|
118
|
+
}
|
|
119
|
+
return { nodesCreated, relsCreated, propertiesSet, serializedRecords };
|
|
120
|
+
}
|
|
121
|
+
function synthesiseWriteResponse(id, w) {
|
|
122
|
+
const parts = [];
|
|
123
|
+
if (w.records.length > 0) {
|
|
124
|
+
parts.push(`${w.records.length} record${w.records.length === 1 ? "" : "s"} returned`);
|
|
125
|
+
}
|
|
126
|
+
parts.push(`${w.nodesCreated} nodes created`);
|
|
127
|
+
parts.push(`${w.relsCreated} relationships created`);
|
|
128
|
+
if (w.propertiesSet > 0)
|
|
129
|
+
parts.push(`${w.propertiesSet} properties set`);
|
|
130
|
+
if (w.records.length > 0) {
|
|
131
|
+
parts.push("");
|
|
132
|
+
parts.push(JSON.stringify(w.records, null, 2));
|
|
133
|
+
}
|
|
134
|
+
return JSON.stringify({
|
|
135
|
+
jsonrpc: "2.0",
|
|
136
|
+
id,
|
|
137
|
+
result: {
|
|
138
|
+
content: [{ type: "text", text: parts.join("\n") }],
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function synthesiseOrphanRollback(id, orphanCount, sampleLabels) {
|
|
143
|
+
const labelLine = sampleLabels.length > 0
|
|
144
|
+
? sampleLabels.slice(0, 5).join(", ")
|
|
145
|
+
: "(unknown — orphans had no labels)";
|
|
146
|
+
const text = `orphan rollback — ${orphanCount} node(s) created without an edge in the same transaction.\n` +
|
|
147
|
+
`Sample labels: ${labelLine}.\n\n` +
|
|
148
|
+
`The transaction was aborted; nothing was persisted. Anchor each new node to its semantic parent in the same statement (Graph Stewardship Doctrine Rule 1 in database-operator.md).`;
|
|
149
|
+
return JSON.stringify({
|
|
150
|
+
jsonrpc: "2.0",
|
|
151
|
+
id,
|
|
152
|
+
result: {
|
|
153
|
+
content: [{ type: "text", text }],
|
|
154
|
+
isError: true,
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
function synthesiseShimError(id, prefix, errMsg) {
|
|
159
|
+
return JSON.stringify({
|
|
160
|
+
jsonrpc: "2.0",
|
|
161
|
+
id,
|
|
162
|
+
result: {
|
|
163
|
+
content: [{ type: "text", text: `${prefix}: ${errMsg}` }],
|
|
164
|
+
isError: true,
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=cypher-shim-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cypher-shim-write.js","sourceRoot":"","sources":["../src/cypher-shim-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,11 +28,23 @@ export interface UnknownToken {
|
|
|
28
28
|
nearest: string[];
|
|
29
29
|
hint: string;
|
|
30
30
|
}
|
|
31
|
+
export type ForbiddenKind = "drop-database" | "create-index" | "create-constraint" | "call-dbms" | "call-db-create";
|
|
32
|
+
export interface ForbiddenPattern {
|
|
33
|
+
kind: ForbiddenKind;
|
|
34
|
+
match: string;
|
|
35
|
+
hint: string;
|
|
36
|
+
}
|
|
31
37
|
export interface ValidationResult {
|
|
32
38
|
ok: boolean;
|
|
33
39
|
unknown: UnknownToken[];
|
|
40
|
+
forbidden: ForbiddenPattern[];
|
|
34
41
|
labelTokens: string[];
|
|
35
42
|
edgeTokens: string[];
|
|
36
43
|
}
|
|
37
|
-
export
|
|
44
|
+
export interface ValidateOptions {
|
|
45
|
+
/** "read" (default) skips DDL/admin forbidden checks. "write" applies them. */
|
|
46
|
+
mode?: "read" | "write";
|
|
47
|
+
}
|
|
48
|
+
export declare function stripStringLiterals(cypher: string): string;
|
|
49
|
+
export declare function validate(cypher: string, snapshot: SchemaSnapshot, options?: ValidateOptions): ValidationResult;
|
|
38
50
|
//# sourceMappingURL=cypher-validate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cypher-validate.d.ts","sourceRoot":"","sources":["../src/cypher-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"cypher-validate.d.ts","sourceRoot":"","sources":["../src/cypher-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,cAAc,GACd,mBAAmB,GACnB,WAAW,GACX,gBAAgB,CAAC;AAErB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AA8DD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1D;AA4ED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,eAAoB,GAC5B,gBAAgB,CA4ClB"}
|
|
@@ -20,7 +20,46 @@
|
|
|
20
20
|
* `:Foo` inside quoted content (e.g. `WHERE n.note CONTAINS ':Foo'`).
|
|
21
21
|
*/
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.stripStringLiterals = stripStringLiterals;
|
|
23
24
|
exports.validate = validate;
|
|
25
|
+
// DDL / admin patterns that the database-operator's raw write surface must
|
|
26
|
+
// reject. The graph MCP shim is the only enforcement point — Neo4j Community
|
|
27
|
+
// has no per-tool ACL, so the shim filters by syntactic shape before
|
|
28
|
+
// forwarding the JSON-RPC line to the upstream cypher driver. Each pattern
|
|
29
|
+
// is applied to a string-literal-stripped cypher body so that prose inside
|
|
30
|
+
// quoted strings cannot trip a false positive.
|
|
31
|
+
//
|
|
32
|
+
// CALL apoc.* is intentionally NOT forbidden — apoc.refactor.mergeNodes is
|
|
33
|
+
// the documented dedup primitive. CALL db.labels() and other read-only db.*
|
|
34
|
+
// calls are allowed; only db.create* (createLabel, createProperty,
|
|
35
|
+
// createRelationshipType) is forbidden because those are schema-mutating.
|
|
36
|
+
const FORBIDDEN_PATTERNS = [
|
|
37
|
+
{
|
|
38
|
+
kind: "drop-database",
|
|
39
|
+
pattern: /\bDROP\s+(?:DATABASE|ALIAS|USER|ROLE)\b/i,
|
|
40
|
+
hint: "DROP DATABASE/USER/ROLE/ALIAS is admin DDL — not permitted on the operator surface.",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
kind: "create-index",
|
|
44
|
+
pattern: /\bCREATE\s+(?:OR\s+REPLACE\s+)?(?:RANGE\s+|TEXT\s+|POINT\s+|LOOKUP\s+|FULLTEXT\s+|BTREE\s+|VECTOR\s+)?INDEX\b/i,
|
|
45
|
+
hint: "Index DDL is admin-owned (seed-neo4j.sh applies indexes). Not permitted on the operator surface.",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
kind: "create-constraint",
|
|
49
|
+
pattern: /\bCREATE\s+(?:OR\s+REPLACE\s+)?CONSTRAINT\b/i,
|
|
50
|
+
hint: "Constraint DDL is admin-owned (seed-neo4j.sh applies constraints). Not permitted on the operator surface.",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
kind: "call-dbms",
|
|
54
|
+
pattern: /\bCALL\s+dbms\./i,
|
|
55
|
+
hint: "CALL dbms.* is admin/security surface. Not permitted on the operator surface.",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
kind: "call-db-create",
|
|
59
|
+
pattern: /\bCALL\s+db\.create/i,
|
|
60
|
+
hint: "CALL db.create* mutates schema (label/property/type registration). Not permitted on the operator surface.",
|
|
61
|
+
},
|
|
62
|
+
];
|
|
24
63
|
// Bracket content containing a type reference. Examples this matches:
|
|
25
64
|
// [:PART_OF]
|
|
26
65
|
// [r:PART_OF]
|
|
@@ -33,6 +72,9 @@ const EDGE_PATTERN = /\[[^\]]*?:([A-Z_][A-Za-z0-9_]*(?:\|[A-Z_][A-Za-z0-9_]*)*)[
|
|
|
33
72
|
// already had edge-bracket substrings stripped, so there is no overlap with
|
|
34
73
|
// the edge pattern. The [A-Z] anchor excludes lowercase map keys.
|
|
35
74
|
const LABEL_PATTERN = /:([A-Z][A-Za-z0-9_]*)/g;
|
|
75
|
+
// Exported so the post-write audit (graph-write/audit.ts) can reuse the same
|
|
76
|
+
// literal-stripping pass before its own static parsing — avoids duplicate
|
|
77
|
+
// false-positive treatment across the two surfaces.
|
|
36
78
|
function stripStringLiterals(cypher) {
|
|
37
79
|
// Replace single- and double-quoted literals with empty quotes. Preserves
|
|
38
80
|
// positional structure without retaining content that could match the
|
|
@@ -93,16 +135,35 @@ function hintFor(token, kind, nearest) {
|
|
|
93
135
|
const didYouMean = nearest.length > 0 ? `Did you mean :${nearest[0]}? ` : "";
|
|
94
136
|
return `${didYouMean}Unknown ${kind} '${token}' — not in the current Neo4j schema. See .docs/neo4j.md for the canonical taxonomy.`;
|
|
95
137
|
}
|
|
96
|
-
function
|
|
138
|
+
function detectForbidden(cypher) {
|
|
139
|
+
// Strip literals so a property value like 'CREATE INDEX archive' cannot
|
|
140
|
+
// trip a false rejection. The shared `stripStringLiterals` keeps this
|
|
141
|
+
// treatment uniform with token extraction and audit static parsing.
|
|
142
|
+
const cleaned = stripStringLiterals(cypher);
|
|
143
|
+
const out = [];
|
|
144
|
+
for (const { kind, pattern, hint } of FORBIDDEN_PATTERNS) {
|
|
145
|
+
const found = cleaned.match(pattern);
|
|
146
|
+
if (found) {
|
|
147
|
+
out.push({ kind, match: found[0], hint });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
function validate(cypher, snapshot, options = {}) {
|
|
153
|
+
const mode = options.mode ?? "read";
|
|
154
|
+
const forbidden = mode === "write" ? detectForbidden(cypher) : [];
|
|
97
155
|
const { labels, edges } = extractTokens(cypher);
|
|
98
156
|
// Fail-open when the snapshot is empty. An empty snapshot means "schema
|
|
99
157
|
// cache not loaded" (boot race, Neo4j unreachable). Rejecting every token
|
|
100
158
|
// would wedge the admin agent; letting it through preserves the observable
|
|
101
159
|
// `validated=false` signal on the existing [graph-query] line.
|
|
160
|
+
// Forbidden DDL/admin patterns still apply — those are syntactic, not
|
|
161
|
+
// schema-derived.
|
|
102
162
|
if (snapshot.labels.size === 0 && snapshot.relationshipTypes.size === 0) {
|
|
103
163
|
return {
|
|
104
|
-
ok:
|
|
164
|
+
ok: forbidden.length === 0,
|
|
105
165
|
unknown: [],
|
|
166
|
+
forbidden,
|
|
106
167
|
labelTokens: [...labels],
|
|
107
168
|
edgeTokens: [...edges],
|
|
108
169
|
};
|
|
@@ -120,9 +181,15 @@ function validate(cypher, snapshot) {
|
|
|
120
181
|
unknown.push({ token, kind: "relationship", nearest, hint: hintFor(token, "relationship", nearest) });
|
|
121
182
|
}
|
|
122
183
|
}
|
|
184
|
+
// Write-mode caller treats `unknown` as a soft warning (audit), not a
|
|
185
|
+
// hard reject — operators legitimately introduce new labels via REMOVE
|
|
186
|
+
// n:Old SET n:New. Read-mode preserves prior behaviour: any unknown
|
|
187
|
+
// → ok=false.
|
|
188
|
+
const tokensOk = mode === "write" ? true : unknown.length === 0;
|
|
123
189
|
return {
|
|
124
|
-
ok:
|
|
190
|
+
ok: tokensOk && forbidden.length === 0,
|
|
125
191
|
unknown,
|
|
192
|
+
forbidden,
|
|
126
193
|
labelTokens: [...labels],
|
|
127
194
|
edgeTokens: [...edges],
|
|
128
195
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cypher-validate.js","sourceRoot":"","sources":["../src/cypher-validate.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;
|
|
1
|
+
{"version":3,"file":"cypher-validate.js","sourceRoot":"","sources":["../src/cypher-validate.ts"],"names":[],"mappings":"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"}
|