@rubytech/create-maxy-code 0.1.146 → 0.1.148
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-search/dist/index.d.ts +34 -11
- package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-search/dist/index.js +42 -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 +75 -40
- package/payload/platform/lib/graph-search/src/index.ts +45 -12
- package/payload/platform/neo4j/schema.cypher +38 -14
- package/payload/platform/plugins/admin/PLUGIN.md +0 -1
- package/payload/platform/plugins/admin/hooks/__tests__/post-turn-graph-pass.test.sh +472 -0
- package/payload/platform/plugins/admin/hooks/__tests__/session-end-retrospective.test.sh +2 -2
- package/payload/platform/plugins/admin/hooks/session-end-retrospective.sh +6 -3
- package/payload/platform/plugins/memory/mcp/dist/index.js +21 -19
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-revision.test.js +4 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-revision.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-rewriter-operator-hint.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-rewriter-operator-hint.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-rewriter-operator-hint.test.js +90 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-rewriter-operator-hint.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-rewriter.d.ts +14 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-rewriter.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-rewriter.js +27 -4
- package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-rewriter.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-operator-hint.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-operator-hint.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-operator-hint.test.js +329 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-operator-hint.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-compiled-truth-rejection.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-compiled-truth-rejection.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-compiled-truth-rejection.test.js +39 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-compiled-truth-rejection.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js +1 -11
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.d.ts +27 -18
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.js +83 -70
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +27 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/vitest.config.ts +2 -0
- package/payload/platform/plugins/memory/references/schema-base.md +5 -4
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +0 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +1 -1
- package/payload/server/server.js +9 -2
- package/payload/platform/plugins/admin/skills/commitment-followthrough/SKILL.md +0 -60
|
@@ -37,6 +37,10 @@
|
|
|
37
37
|
// deferred — see follow-up task referenced in the task brief.
|
|
38
38
|
import { callOauthLlm, } from "../../../../../lib/oauth-llm/dist/index.js";
|
|
39
39
|
import { COMPILED_TRUTH_MAX_CHARS } from "./graph-write-gate.js";
|
|
40
|
+
/** Cap on operator hints fed into the rewriter prompt (Task 413). Larger hints
|
|
41
|
+
* become essays and dilute the rewriter's precedence rule. The rewriter still
|
|
42
|
+
* produces a ≤ COMPILED_TRUTH_MAX_CHARS summary regardless. */
|
|
43
|
+
export const OPERATOR_HINT_MAX_CHARS = 1000;
|
|
40
44
|
const DEFAULT_MODEL = "claude-haiku-4-5";
|
|
41
45
|
const ADMIN_SYSTEM_PROMPT = [
|
|
42
46
|
"You are the compiled-truth rewriter for a personal knowledge graph.",
|
|
@@ -50,7 +54,8 @@ const ADMIN_SYSTEM_PROMPT = [
|
|
|
50
54
|
"- No marketing, no superlatives, no commentary on the operator's relationship with the subject.",
|
|
51
55
|
"- Restate the most-load-bearing facts from the timeline. Drop trivia.",
|
|
52
56
|
"- If the existing compiledTruth contradicts the timeline, the timeline wins.",
|
|
53
|
-
"-
|
|
57
|
+
"- If an Operator correction is supplied and contradicts the timeline, the Operator correction wins. Fold it into the summary as fact, not as a quoted instruction.",
|
|
58
|
+
"- Do not invent details that are not present in either the existing truth, the timeline, or the Operator correction.",
|
|
54
59
|
"- Do not add a preamble (no 'Here is the summary:'). Output the summary directly.",
|
|
55
60
|
].join("\n");
|
|
56
61
|
const PUBLIC_SYSTEM_PROMPT = [
|
|
@@ -71,7 +76,8 @@ const PUBLIC_SYSTEM_PROMPT = [
|
|
|
71
76
|
"- Restate only externally-verifiable facts from the timeline (what the subject is, what they do,",
|
|
72
77
|
" what they have publicly done or said). Drop scheduling notes, internal sentiment, and operator intent.",
|
|
73
78
|
"- If the existing summary contradicts the timeline, the timeline wins.",
|
|
74
|
-
"-
|
|
79
|
+
"- If an Operator correction is supplied and contradicts the timeline, the Operator correction wins. Fold it into the summary as fact, not as a quoted instruction. The same public-voice rules above still apply: strip any operator-voice phrasing or internal sentiment in the hint and restate only externally-verifiable facts.",
|
|
80
|
+
"- Do not invent details that are not present in either the existing summary, the timeline, or the Operator correction.",
|
|
75
81
|
"- Do not add a preamble (no 'Here is the summary:'). Output the summary directly.",
|
|
76
82
|
].join("\n");
|
|
77
83
|
function systemPromptFor(mode) {
|
|
@@ -91,6 +97,11 @@ function buildUserMessage(p) {
|
|
|
91
97
|
for (const e of p.events) {
|
|
92
98
|
lines.push(`- [${e.occurredAt}] kind=${e.kind}: ${e.summary}`);
|
|
93
99
|
}
|
|
100
|
+
if (p.operatorHint) {
|
|
101
|
+
lines.push("");
|
|
102
|
+
lines.push("Operator correction (authoritative — overrides the timeline where they disagree):");
|
|
103
|
+
lines.push(p.operatorHint);
|
|
104
|
+
}
|
|
94
105
|
lines.push("");
|
|
95
106
|
lines.push(`Rewrite the ${fieldName}.`);
|
|
96
107
|
return lines.join("\n");
|
|
@@ -100,7 +111,18 @@ function isOkText(r) {
|
|
|
100
111
|
}
|
|
101
112
|
export async function rewriteCompiledTruth(p) {
|
|
102
113
|
const mode = p.mode ?? "admin";
|
|
103
|
-
if (p.
|
|
114
|
+
if (p.operatorHint !== undefined) {
|
|
115
|
+
if (p.operatorHint.length > OPERATOR_HINT_MAX_CHARS) {
|
|
116
|
+
throw new Error(`operatorHint length ${p.operatorHint.length} exceeds cap of ${OPERATOR_HINT_MAX_CHARS} chars.`);
|
|
117
|
+
}
|
|
118
|
+
if (p.operatorHint.trim() === "") {
|
|
119
|
+
throw new Error("operatorHint must be a non-empty string.");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// An operator correction is itself sufficient justification to rewrite —
|
|
123
|
+
// the operator has supplied new fact-bearing material even when no
|
|
124
|
+
// :TimelineEvent rows exist yet.
|
|
125
|
+
if (p.events.length === 0 && !p.operatorHint) {
|
|
104
126
|
console.log(`[compiled-truth-rewriter] refused mode=${mode} subject="${p.subjectName}" reason=no-events`);
|
|
105
127
|
return { kind: "refused", reason: "no-events" };
|
|
106
128
|
}
|
|
@@ -119,7 +141,8 @@ export async function rewriteCompiledTruth(p) {
|
|
|
119
141
|
const truth = result.text.trim();
|
|
120
142
|
const before = p.currentTruth.length;
|
|
121
143
|
const after = truth.length;
|
|
122
|
-
|
|
144
|
+
const hintFragment = p.operatorHint ? ` operatorHint=true hintLen=${p.operatorHint.length}` : "";
|
|
145
|
+
console.log(`[compiled-truth-rewriter] mode=${mode} subject="${p.subjectName}" subjectLabel=${p.subjectLabel} charsBefore=${before} charsAfter=${after} events=${p.events.length}${hintFragment}`);
|
|
123
146
|
if (after > COMPILED_TRUTH_MAX_CHARS) {
|
|
124
147
|
// One retry with a stricter prompt before surfacing the over-cap failure.
|
|
125
148
|
// Per eng review: avoids losing the rewrite on a single LLM verbosity slip.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiled-truth-rewriter.js","sourceRoot":"","sources":["../../src/lib/compiled-truth-rewriter.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AACpE,kEAAkE;AAClE,uEAAuE;AACvE,oEAAoE;AACpE,oEAAoE;AACpE,uEAAuE;AACvE,mCAAmC;AACnC,EAAE;AACF,6BAA6B;AAC7B,wEAAwE;AACxE,wEAAwE;AACxE,8DAA8D;AAC9D,wEAAwE;AACxE,sEAAsE;AACtE,iEAAiE;AACjE,sEAAsE;AACtE,2CAA2C;AAC3C,EAAE;AACF,sCAAsC;AACtC,iCAAiC;AACjC,gDAAgD;AAChD,0EAA0E;AAC1E,6DAA6D;AAC7D,mCAAmC;AACnC,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,6DAA6D;AAC7D,qEAAqE;AACrE,mEAAmE;AACnE,EAAE;AACF,uEAAuE;AACvE,8DAA8D;AAE9D,OAAO,EACL,YAAY,GAGb,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"compiled-truth-rewriter.js","sourceRoot":"","sources":["../../src/lib/compiled-truth-rewriter.ts"],"names":[],"mappings":"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"}
|
package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js
CHANGED
|
@@ -13,6 +13,7 @@ vi.mock("../../lib/embeddings.js", () => ({
|
|
|
13
13
|
const hybridMock = vi.fn();
|
|
14
14
|
vi.mock("../../../../../../lib/graph-search/dist/index.js", () => ({
|
|
15
15
|
hybrid: (...args) => hybridMock(...args),
|
|
16
|
+
isPublicOnlyScope: (allowedScopes) => Array.isArray(allowedScopes) && allowedScopes.length === 1 && allowedScopes[0] === "public",
|
|
16
17
|
}));
|
|
17
18
|
import { memorySearch } from "../memory-search.js";
|
|
18
19
|
function makeResult() {
|
package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-search-fields.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-search-fields.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,yEAAyE;AACzE,8DAA8D;AAC9D,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACjB,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;KAC7B,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CACpC,CAAC,CAAC,CAAC;AAEJ,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC3B,EAAE,CAAC,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"memory-search-fields.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-search-fields.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-update-operator-hint.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-update-operator-hint.test.ts"],"names":[],"mappings":""}
|
package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-operator-hint.test.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// Task 413 / Task 420 — memory-update operator-hint integration.
|
|
2
|
+
//
|
|
3
|
+
// Validates: admin operatorHint passes through to the rewriter; SET stamps
|
|
4
|
+
// source='operator' and the revision row receives source='operator'; the 7-day
|
|
5
|
+
// cooldown does not block hint passes; the public-twin auto-fire is skipped;
|
|
6
|
+
// hint without rewriteCompiledTruth throws.
|
|
7
|
+
//
|
|
8
|
+
// Public publicOperatorHint (Task 420): hint folds into the public rewriter
|
|
9
|
+
// call; public SET stamps source='operator'; public-cooldown bypassed; fires
|
|
10
|
+
// regardless of whether admin pass changed the truth; refuses on :Person;
|
|
11
|
+
// refuses without rewriteCompiledTruth; respects the length cap; admin and
|
|
12
|
+
// public hints are independent.
|
|
13
|
+
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
14
|
+
const mockSession = {
|
|
15
|
+
run: vi.fn(),
|
|
16
|
+
close: vi.fn().mockResolvedValue(undefined),
|
|
17
|
+
};
|
|
18
|
+
vi.mock("../../lib/neo4j.js", () => ({
|
|
19
|
+
getSession: () => mockSession,
|
|
20
|
+
}));
|
|
21
|
+
vi.mock("../../lib/embeddings.js", () => ({
|
|
22
|
+
embed: vi.fn().mockResolvedValue([0.1]),
|
|
23
|
+
}));
|
|
24
|
+
vi.mock("../../lib/graph-write-gate.js", () => ({
|
|
25
|
+
checkGraphWriteGate: vi.fn().mockResolvedValue({ ok: true }),
|
|
26
|
+
checkPropertyWriteGate: vi.fn().mockReturnValue({ ok: true }),
|
|
27
|
+
checkLabelWriteGate: vi.fn().mockReturnValue({ ok: true }),
|
|
28
|
+
COMPILED_TRUTH_MAX_CHARS: 2000,
|
|
29
|
+
}));
|
|
30
|
+
vi.mock("../../lib/label-origin-gate.js", () => ({
|
|
31
|
+
checkLabelOriginGate: vi.fn().mockReturnValue({ ok: true }),
|
|
32
|
+
}));
|
|
33
|
+
const rewriterMock = vi.fn();
|
|
34
|
+
vi.mock("../../lib/compiled-truth-rewriter.js", () => ({
|
|
35
|
+
rewriteCompiledTruth: (...args) => rewriterMock(...args),
|
|
36
|
+
OPERATOR_HINT_MAX_CHARS: 1000,
|
|
37
|
+
}));
|
|
38
|
+
vi.mock("./memory-write.js", () => ({
|
|
39
|
+
buildTextRepresentation: () => "stub",
|
|
40
|
+
}));
|
|
41
|
+
import { memoryUpdate } from "../memory-update.js";
|
|
42
|
+
function labelRecord(overrides = {}) {
|
|
43
|
+
const base = {
|
|
44
|
+
nodeLabels: ["Organization"],
|
|
45
|
+
compiledTruth: "old summary",
|
|
46
|
+
compiledTruthSource: "operator",
|
|
47
|
+
compiledTruthUpdatedAt: { toString: () => new Date().toISOString() }, // recent
|
|
48
|
+
compiledTruthPublic: "old public",
|
|
49
|
+
compiledTruthPublicSource: "rewriter",
|
|
50
|
+
compiledTruthPublicUpdatedAt: null,
|
|
51
|
+
name: "Acme",
|
|
52
|
+
...overrides,
|
|
53
|
+
};
|
|
54
|
+
return { get: (k) => base[k] };
|
|
55
|
+
}
|
|
56
|
+
describe("memory-update — operator hint (Task 413)", () => {
|
|
57
|
+
beforeEach(() => {
|
|
58
|
+
mockSession.run.mockReset();
|
|
59
|
+
rewriterMock.mockReset();
|
|
60
|
+
rewriterMock.mockResolvedValue({ kind: "ok", compiledTruth: "Adam now works at Anthropic." });
|
|
61
|
+
});
|
|
62
|
+
it("passes operatorHint through to the rewriter and stamps source='operator' on the SET", async () => {
|
|
63
|
+
// call sequence:
|
|
64
|
+
// 1. label probe
|
|
65
|
+
// 2. allProps probe (no safeProps so we skip the SET branch)
|
|
66
|
+
// 3. timeline events query
|
|
67
|
+
// 4. SET + revision compound statement
|
|
68
|
+
mockSession.run
|
|
69
|
+
.mockResolvedValueOnce({ records: [labelRecord()] })
|
|
70
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Acme" }) }] })
|
|
71
|
+
.mockResolvedValueOnce({ records: [] }) // empty events
|
|
72
|
+
.mockResolvedValueOnce({ records: [] }); // SET
|
|
73
|
+
await memoryUpdate({
|
|
74
|
+
nodeId: "4:n:1",
|
|
75
|
+
properties: {},
|
|
76
|
+
accountId: "acct-1",
|
|
77
|
+
createdBy: { agent: "test", session: "s1" },
|
|
78
|
+
rewriteCompiledTruth: true,
|
|
79
|
+
operatorHint: "Adam now works at Anthropic.",
|
|
80
|
+
});
|
|
81
|
+
// rewriter called with the hint
|
|
82
|
+
const rewriterArgs = rewriterMock.mock.calls[0][0];
|
|
83
|
+
expect(rewriterArgs.operatorHint).toBe("Adam now works at Anthropic.");
|
|
84
|
+
// SET runs with source='operator' bound as $source
|
|
85
|
+
const setCall = mockSession.run.mock.calls.find(([cypher]) => typeof cypher === "string" && cypher.includes("n.compiledTruthSource = $source"));
|
|
86
|
+
expect(setCall).toBeDefined();
|
|
87
|
+
expect(setCall[1]).toMatchObject({ source: "operator" });
|
|
88
|
+
});
|
|
89
|
+
it("bypasses the 7-day operator cooldown when operatorHint is set", async () => {
|
|
90
|
+
// currentSource='operator' + recent timestamp would normally refuse.
|
|
91
|
+
mockSession.run
|
|
92
|
+
.mockResolvedValueOnce({ records: [labelRecord()] })
|
|
93
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Acme" }) }] })
|
|
94
|
+
.mockResolvedValueOnce({ records: [] })
|
|
95
|
+
.mockResolvedValueOnce({ records: [] });
|
|
96
|
+
const result = await memoryUpdate({
|
|
97
|
+
nodeId: "4:n:1",
|
|
98
|
+
properties: {},
|
|
99
|
+
accountId: "acct-1",
|
|
100
|
+
createdBy: { agent: "test", session: "s1" },
|
|
101
|
+
rewriteCompiledTruth: true,
|
|
102
|
+
operatorHint: "correction",
|
|
103
|
+
});
|
|
104
|
+
expect(result.rewriter?.kind).toBe("ok");
|
|
105
|
+
// Without the hint, the same setup refuses.
|
|
106
|
+
mockSession.run.mockReset();
|
|
107
|
+
mockSession.run
|
|
108
|
+
.mockResolvedValueOnce({ records: [labelRecord()] })
|
|
109
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Acme" }) }] });
|
|
110
|
+
const refused = await memoryUpdate({
|
|
111
|
+
nodeId: "4:n:1",
|
|
112
|
+
properties: {},
|
|
113
|
+
accountId: "acct-1",
|
|
114
|
+
createdBy: { agent: "test", session: "s1" },
|
|
115
|
+
rewriteCompiledTruth: true,
|
|
116
|
+
});
|
|
117
|
+
expect(refused.rewriter).toMatchObject({ kind: "refused", reason: "operator-edit-cooldown" });
|
|
118
|
+
});
|
|
119
|
+
it("skips the public-twin auto-fire when operatorHint is set", async () => {
|
|
120
|
+
// Fresh public state — would normally trigger public pass on :Organization.
|
|
121
|
+
mockSession.run
|
|
122
|
+
.mockResolvedValueOnce({
|
|
123
|
+
records: [labelRecord({ compiledTruthSource: "rewriter", compiledTruthPublicSource: "rewriter" })],
|
|
124
|
+
})
|
|
125
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Acme" }) }] })
|
|
126
|
+
.mockResolvedValueOnce({ records: [] })
|
|
127
|
+
.mockResolvedValueOnce({ records: [] });
|
|
128
|
+
const result = await memoryUpdate({
|
|
129
|
+
nodeId: "4:n:1",
|
|
130
|
+
properties: {},
|
|
131
|
+
accountId: "acct-1",
|
|
132
|
+
createdBy: { agent: "test", session: "s1" },
|
|
133
|
+
rewriteCompiledTruth: true,
|
|
134
|
+
operatorHint: "correction",
|
|
135
|
+
});
|
|
136
|
+
// Only one rewriter call — admin pass; no public-twin call.
|
|
137
|
+
expect(rewriterMock).toHaveBeenCalledTimes(1);
|
|
138
|
+
expect(result.publicRewriter).toBeUndefined();
|
|
139
|
+
});
|
|
140
|
+
it("rejects operatorHint without rewriteCompiledTruth", async () => {
|
|
141
|
+
await expect(memoryUpdate({
|
|
142
|
+
nodeId: "4:n:1",
|
|
143
|
+
properties: { name: "Acme" },
|
|
144
|
+
accountId: "acct-1",
|
|
145
|
+
createdBy: { agent: "test", session: "s1" },
|
|
146
|
+
operatorHint: "x",
|
|
147
|
+
})).rejects.toThrow(/requires rewriteCompiledTruth/);
|
|
148
|
+
});
|
|
149
|
+
it("rejects operatorHint over the cap", async () => {
|
|
150
|
+
await expect(memoryUpdate({
|
|
151
|
+
nodeId: "4:n:1",
|
|
152
|
+
properties: {},
|
|
153
|
+
accountId: "acct-1",
|
|
154
|
+
createdBy: { agent: "test", session: "s1" },
|
|
155
|
+
rewriteCompiledTruth: true,
|
|
156
|
+
operatorHint: "x".repeat(1001),
|
|
157
|
+
})).rejects.toThrow(/exceeds cap/);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe("memory-update — public operator hint (Task 420)", () => {
|
|
161
|
+
beforeEach(() => {
|
|
162
|
+
mockSession.run.mockReset();
|
|
163
|
+
rewriterMock.mockReset();
|
|
164
|
+
// Admin pass returns the same string as the current truth — a no-op
|
|
165
|
+
// admin rewrite. The public pass under publicOperatorHint must still fire.
|
|
166
|
+
rewriterMock.mockImplementation((args) => {
|
|
167
|
+
if (args.mode === "public") {
|
|
168
|
+
return Promise.resolve({ kind: "ok", compiledTruth: "Acme is a company." });
|
|
169
|
+
}
|
|
170
|
+
return Promise.resolve({ kind: "ok", compiledTruth: args.currentTruth });
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
function publicLabelRecord(overrides = {}) {
|
|
174
|
+
const base = {
|
|
175
|
+
nodeLabels: ["Organization"],
|
|
176
|
+
compiledTruth: "admin truth",
|
|
177
|
+
compiledTruthSource: "rewriter",
|
|
178
|
+
compiledTruthUpdatedAt: null,
|
|
179
|
+
compiledTruthPublic: "old public",
|
|
180
|
+
compiledTruthPublicSource: "operator",
|
|
181
|
+
compiledTruthPublicUpdatedAt: { toString: () => new Date().toISOString() }, // in cooldown
|
|
182
|
+
name: "Acme",
|
|
183
|
+
...overrides,
|
|
184
|
+
};
|
|
185
|
+
return { get: (k) => base[k] };
|
|
186
|
+
}
|
|
187
|
+
it("folds publicOperatorHint into the public rewriter call and stamps public SET source='operator'", async () => {
|
|
188
|
+
// call sequence:
|
|
189
|
+
// 1. label probe
|
|
190
|
+
// 2. allProps probe
|
|
191
|
+
// 3. timeline events
|
|
192
|
+
// 4. admin SET + revision
|
|
193
|
+
// 5. public SET
|
|
194
|
+
mockSession.run
|
|
195
|
+
.mockResolvedValueOnce({ records: [publicLabelRecord()] })
|
|
196
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Acme" }) }] })
|
|
197
|
+
.mockResolvedValueOnce({ records: [] })
|
|
198
|
+
.mockResolvedValueOnce({ records: [] })
|
|
199
|
+
.mockResolvedValueOnce({ records: [] });
|
|
200
|
+
const result = await memoryUpdate({
|
|
201
|
+
nodeId: "4:n:1",
|
|
202
|
+
properties: {},
|
|
203
|
+
accountId: "acct-1",
|
|
204
|
+
createdBy: { agent: "test", session: "s1" },
|
|
205
|
+
rewriteCompiledTruth: true,
|
|
206
|
+
publicOperatorHint: "Acme is publicly recognised for X.",
|
|
207
|
+
});
|
|
208
|
+
// Two rewriter calls — admin pass + public pass with the hint.
|
|
209
|
+
expect(rewriterMock).toHaveBeenCalledTimes(2);
|
|
210
|
+
const publicCall = rewriterMock.mock.calls.find(([args]) => args.mode === "public");
|
|
211
|
+
expect(publicCall).toBeDefined();
|
|
212
|
+
expect(publicCall[0].operatorHint).toBe("Acme is publicly recognised for X.");
|
|
213
|
+
// Public SET runs with source='operator' bound as $source.
|
|
214
|
+
const publicSet = mockSession.run.mock.calls.find(([cypher]) => typeof cypher === "string" && cypher.includes("n.compiledTruthPublic = $truth"));
|
|
215
|
+
expect(publicSet).toBeDefined();
|
|
216
|
+
expect(publicSet[1]).toMatchObject({ source: "operator" });
|
|
217
|
+
expect(result.publicRewriter).toMatchObject({ kind: "ok", source: "operator" });
|
|
218
|
+
});
|
|
219
|
+
it("fires the public pass even when the admin rewrite is a no-op (string-identical)", async () => {
|
|
220
|
+
// Admin pass returns currentTruth verbatim (no change). Without a public
|
|
221
|
+
// hint, the public pass would be skipped; with a hint it must still fire.
|
|
222
|
+
mockSession.run
|
|
223
|
+
.mockResolvedValueOnce({ records: [publicLabelRecord({ compiledTruthPublicSource: "rewriter" })] })
|
|
224
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Acme" }) }] })
|
|
225
|
+
.mockResolvedValueOnce({ records: [] })
|
|
226
|
+
.mockResolvedValueOnce({ records: [] })
|
|
227
|
+
.mockResolvedValueOnce({ records: [] });
|
|
228
|
+
const result = await memoryUpdate({
|
|
229
|
+
nodeId: "4:n:1",
|
|
230
|
+
properties: {},
|
|
231
|
+
accountId: "acct-1",
|
|
232
|
+
createdBy: { agent: "test", session: "s1" },
|
|
233
|
+
rewriteCompiledTruth: true,
|
|
234
|
+
publicOperatorHint: "Force-fire",
|
|
235
|
+
});
|
|
236
|
+
expect(result.publicRewriter?.kind).toBe("ok");
|
|
237
|
+
expect(rewriterMock).toHaveBeenCalledTimes(2);
|
|
238
|
+
});
|
|
239
|
+
it("bypasses the public-cooldown when publicOperatorHint is set", async () => {
|
|
240
|
+
// compiledTruthPublicSource='operator' + recent timestamp would normally
|
|
241
|
+
// refuse the public pass.
|
|
242
|
+
mockSession.run
|
|
243
|
+
.mockResolvedValueOnce({ records: [publicLabelRecord()] })
|
|
244
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Acme" }) }] })
|
|
245
|
+
.mockResolvedValueOnce({ records: [] })
|
|
246
|
+
.mockResolvedValueOnce({ records: [] })
|
|
247
|
+
.mockResolvedValueOnce({ records: [] });
|
|
248
|
+
const result = await memoryUpdate({
|
|
249
|
+
nodeId: "4:n:1",
|
|
250
|
+
properties: {},
|
|
251
|
+
accountId: "acct-1",
|
|
252
|
+
createdBy: { agent: "test", session: "s1" },
|
|
253
|
+
rewriteCompiledTruth: true,
|
|
254
|
+
publicOperatorHint: "Bypass",
|
|
255
|
+
});
|
|
256
|
+
expect(result.publicRewriter?.kind).toBe("ok");
|
|
257
|
+
});
|
|
258
|
+
it("refuses publicOperatorHint on a :Person label", async () => {
|
|
259
|
+
mockSession.run
|
|
260
|
+
.mockResolvedValueOnce({
|
|
261
|
+
records: [publicLabelRecord({ nodeLabels: ["Person"], compiledTruthPublicSource: "rewriter" })],
|
|
262
|
+
})
|
|
263
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Adam" }) }] });
|
|
264
|
+
await expect(memoryUpdate({
|
|
265
|
+
nodeId: "4:n:1",
|
|
266
|
+
properties: {},
|
|
267
|
+
accountId: "acct-1",
|
|
268
|
+
createdBy: { agent: "test", session: "s1" },
|
|
269
|
+
rewriteCompiledTruth: true,
|
|
270
|
+
publicOperatorHint: "no public twin",
|
|
271
|
+
})).rejects.toThrow(/requires a public-twin label/);
|
|
272
|
+
});
|
|
273
|
+
it("rejects publicOperatorHint without rewriteCompiledTruth", async () => {
|
|
274
|
+
await expect(memoryUpdate({
|
|
275
|
+
nodeId: "4:n:1",
|
|
276
|
+
properties: { name: "Acme" },
|
|
277
|
+
accountId: "acct-1",
|
|
278
|
+
createdBy: { agent: "test", session: "s1" },
|
|
279
|
+
publicOperatorHint: "x",
|
|
280
|
+
})).rejects.toThrow(/requires rewriteCompiledTruth/);
|
|
281
|
+
});
|
|
282
|
+
it("rejects publicOperatorHint over the cap", async () => {
|
|
283
|
+
await expect(memoryUpdate({
|
|
284
|
+
nodeId: "4:n:1",
|
|
285
|
+
properties: {},
|
|
286
|
+
accountId: "acct-1",
|
|
287
|
+
createdBy: { agent: "test", session: "s1" },
|
|
288
|
+
rewriteCompiledTruth: true,
|
|
289
|
+
publicOperatorHint: "x".repeat(1001),
|
|
290
|
+
})).rejects.toThrow(/exceeds cap/);
|
|
291
|
+
});
|
|
292
|
+
it("admin and public hints are independent — admin-only hint skips public, public-only hint runs both", async () => {
|
|
293
|
+
// Case A: admin-only hint — public pass skipped (Task 413 behaviour).
|
|
294
|
+
mockSession.run
|
|
295
|
+
.mockResolvedValueOnce({ records: [publicLabelRecord({ compiledTruthPublicSource: "rewriter" })] })
|
|
296
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Acme" }) }] })
|
|
297
|
+
.mockResolvedValueOnce({ records: [] })
|
|
298
|
+
.mockResolvedValueOnce({ records: [] });
|
|
299
|
+
const adminOnly = await memoryUpdate({
|
|
300
|
+
nodeId: "4:n:1",
|
|
301
|
+
properties: {},
|
|
302
|
+
accountId: "acct-1",
|
|
303
|
+
createdBy: { agent: "test", session: "s1" },
|
|
304
|
+
rewriteCompiledTruth: true,
|
|
305
|
+
operatorHint: "admin correction",
|
|
306
|
+
});
|
|
307
|
+
expect(adminOnly.publicRewriter).toBeUndefined();
|
|
308
|
+
// Case B: public-only hint — admin pass runs as no-op, public pass fires.
|
|
309
|
+
rewriterMock.mockClear();
|
|
310
|
+
mockSession.run.mockReset();
|
|
311
|
+
mockSession.run
|
|
312
|
+
.mockResolvedValueOnce({ records: [publicLabelRecord({ compiledTruthPublicSource: "rewriter" })] })
|
|
313
|
+
.mockResolvedValueOnce({ records: [{ get: () => ({ name: "Acme" }) }] })
|
|
314
|
+
.mockResolvedValueOnce({ records: [] })
|
|
315
|
+
.mockResolvedValueOnce({ records: [] })
|
|
316
|
+
.mockResolvedValueOnce({ records: [] });
|
|
317
|
+
const publicOnly = await memoryUpdate({
|
|
318
|
+
nodeId: "4:n:1",
|
|
319
|
+
properties: {},
|
|
320
|
+
accountId: "acct-1",
|
|
321
|
+
createdBy: { agent: "test", session: "s1" },
|
|
322
|
+
rewriteCompiledTruth: true,
|
|
323
|
+
publicOperatorHint: "public correction",
|
|
324
|
+
});
|
|
325
|
+
expect(publicOnly.rewriter?.kind).toBe("ok");
|
|
326
|
+
expect(publicOnly.publicRewriter?.kind).toBe("ok");
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
//# sourceMappingURL=memory-update-operator-hint.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-update-operator-hint.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-update-operator-hint.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-write-compiled-truth-rejection.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-write-compiled-truth-rejection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Task 413 — memory-write refuses operator-supplied compiled-truth fields.
|
|
2
|
+
//
|
|
3
|
+
// The six system-managed keys (compiledTruth{,UpdatedAt,Source} and
|
|
4
|
+
// compiledTruthPublic{,UpdatedAt,Source}) can only be written by the
|
|
5
|
+
// defaults block on first write (caller-supplied value is undefined) and
|
|
6
|
+
// by the rewriter via memory-update. Any caller passing one of them in
|
|
7
|
+
// the properties bag is bypassing the audit chain.
|
|
8
|
+
import { describe, it, expect, vi } from "vitest";
|
|
9
|
+
vi.mock("../../lib/neo4j.js", () => ({
|
|
10
|
+
getSession: () => ({
|
|
11
|
+
run: vi.fn(),
|
|
12
|
+
close: vi.fn().mockResolvedValue(undefined),
|
|
13
|
+
}),
|
|
14
|
+
}));
|
|
15
|
+
import { memoryWrite } from "../memory-write.js";
|
|
16
|
+
const REJECTED_KEYS = [
|
|
17
|
+
"compiledTruth",
|
|
18
|
+
"compiledTruthUpdatedAt",
|
|
19
|
+
"compiledTruthSource",
|
|
20
|
+
"compiledTruthPublic",
|
|
21
|
+
"compiledTruthPublicUpdatedAt",
|
|
22
|
+
"compiledTruthPublicSource",
|
|
23
|
+
];
|
|
24
|
+
describe("memory-write — system-managed compiled-truth keys (Task 413)", () => {
|
|
25
|
+
for (const key of REJECTED_KEYS) {
|
|
26
|
+
it(`rejects properties.${key}`, async () => {
|
|
27
|
+
await expect(memoryWrite({
|
|
28
|
+
labels: ["Person"],
|
|
29
|
+
properties: { name: "Adam", [key]: "operator wrote this" },
|
|
30
|
+
accountId: "acct-1",
|
|
31
|
+
scope: "admin",
|
|
32
|
+
relationships: [{ targetId: "x", type: "MENTIONS", direction: "outbound" }],
|
|
33
|
+
createdBy: { agent: "test", session: "s1" },
|
|
34
|
+
validator: { schema: { brandVertical: undefined }, recognisedLabels: () => new Set(["Person"]) },
|
|
35
|
+
})).rejects.toThrow(/system-managed-key/);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=memory-write-compiled-truth-rejection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-write-compiled-truth-rejection.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-write-compiled-truth-rejection.test.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,oEAAoE;AACpE,qEAAqE;AACrE,yEAAyE;AACzE,uEAAuE;AACvE,mDAAmD;AAEnD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACjB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC5C,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,aAAa,GAAG;IACpB,eAAe;IACf,wBAAwB;IACxB,qBAAqB;IACrB,qBAAqB;IACrB,8BAA8B;IAC9B,2BAA2B;CAC5B,CAAC;AAEF,QAAQ,CAAC,8DAA8D,EAAE,GAAG,EAAE;IAC5E,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,EAAE,CAAC,sBAAsB,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,MAAM,CACV,WAAW,CAAC;gBACV,MAAM,EAAE,CAAC,QAAQ,CAAC;gBAClB,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,qBAAqB,EAAE;gBAC1D,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,OAAO;gBACd,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,CAAU;gBACpF,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAW;gBACpD,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAW;aAC1G,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAmFhI,MAAM,MAAM,kBAAkB,GAC1B,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,GAC3B;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE1C,wBAAsB,YAAY,CAChC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,EAAE,CAAC,CA2GzB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getSession } from "../lib/neo4j.js";
|
|
2
2
|
import { embed } from "../lib/embeddings.js";
|
|
3
|
-
import { hybrid } from "../../../../../lib/graph-search/dist/index.js";
|
|
3
|
+
import { hybrid, isPublicOnlyScope } from "../../../../../lib/graph-search/dist/index.js";
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
// Memory search — thin adapter over the shared `graph-search` lib.
|
|
6
6
|
// The hybrid pipeline, Lucene escape, BM25 normalisation, and graph expand
|
|
@@ -34,16 +34,6 @@ const PUBLIC_TWIN_LABELS = new Set([
|
|
|
34
34
|
"Project",
|
|
35
35
|
"LocalBusiness",
|
|
36
36
|
]);
|
|
37
|
-
/**
|
|
38
|
-
* Detect the public-agent read shape: scope filter is exactly `['public']`.
|
|
39
|
-
* Admin reads pass no scope filter or a broader allowedScopes list; either
|
|
40
|
-
* leaves the property bag untouched. Anything narrower than the exact
|
|
41
|
-
* `['public']` shape (e.g. `['public', 'shared']`) is treated as admin —
|
|
42
|
-
* we only project for the verified public-only entry point.
|
|
43
|
-
*/
|
|
44
|
-
function isPublicOnlyScope(allowedScopes) {
|
|
45
|
-
return Array.isArray(allowedScopes) && allowedScopes.length === 1 && allowedScopes[0] === "public";
|
|
46
|
-
}
|
|
47
37
|
/**
|
|
48
38
|
* Rewrite the property bag on a single result row to surface the public twin.
|
|
49
39
|
* - Public-twin labels: swap `compiledTruth` → `compiledTruthPublic` (drop the admin field).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-search.js","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAwC,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"memory-search.js","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"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"}
|