@rubytech/create-realagent-code 0.1.254 → 0.1.255
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/.docs/search-surface-contract.md +58 -0
- package/payload/platform/lib/embed-client/dist/index.d.ts +4 -0
- package/payload/platform/lib/embed-client/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/embed-client/dist/index.js +53 -0
- package/payload/platform/lib/embed-client/dist/index.js.map +1 -0
- package/payload/platform/lib/embed-client/src/index.ts +53 -0
- package/payload/platform/lib/embed-client/tsconfig.json +8 -0
- package/payload/platform/lib/graph-search/dist/index.d.ts +27 -6
- package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-search/dist/index.js +19 -1
- package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-search/src/index.ts +28 -6
- package/payload/platform/lib/graph-write/dist/index.d.ts +25 -0
- package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-write/dist/index.js +78 -2
- package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-write/src/index.ts +96 -1
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +3 -3
- package/payload/platform/plugins/admin/hooks/__tests__/{session-end-retrospective.test.sh → insight.test.sh} +152 -153
- package/payload/platform/plugins/admin/hooks/insight.sh +219 -0
- package/payload/platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh +5 -5
- package/payload/platform/plugins/admin/mcp/dist/index.js +33 -19
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +23 -23
- package/payload/platform/plugins/docs/references/graph.md +2 -0
- package/payload/platform/plugins/docs/references/internals.md +12 -1
- package/payload/platform/plugins/docs/references/neo4j.md +2 -2
- package/payload/platform/plugins/docs/references/platform.md +1 -1
- package/payload/platform/plugins/docs/references/session-retrospective.md +5 -18
- package/payload/platform/plugins/email/PLUGIN.md +2 -2
- package/payload/platform/plugins/email/mcp/dist/index.js +8 -0
- package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts +19 -0
- package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js +64 -0
- package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts +4 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js +6 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-send.js +7 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-send.js.map +1 -1
- package/payload/platform/plugins/email/references/email-reference.md +4 -0
- package/payload/platform/plugins/memory/PLUGIN.md +1 -2
- package/payload/platform/plugins/memory/mcp/dist/index.js +5 -43
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js +41 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js +90 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js +27 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts +10 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js +47 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts +1 -2
- package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js +5 -28
- package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js +20 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js +67 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js +34 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js +61 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js +23 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js +87 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js +3 -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-search-threshold.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js +34 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js +19 -4
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +33 -6
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +280 -10
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js +76 -37
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js.map +1 -1
- 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 +11 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +3 -3
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +2 -2
- 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 +10 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +6 -3
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/vitest.config.ts +5 -0
- package/payload/platform/plugins/memory/references/schema-base.md +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js +15 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +4 -0
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
- package/payload/platform/scripts/identity-forbidden-token-check.mjs +0 -1
- package/payload/platform/scripts/setup-account.sh +2 -8
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts +23 -0
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js +29 -0
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +0 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- 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 +8 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts +13 -1
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js +26 -2
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +12 -3
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js +3 -2
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +2 -2
- package/payload/platform/templates/specialists/agents/database-operator.md +2 -6
- package/payload/server/{chunk-M6A6EZD4.js → chunk-76HRO7NX.js} +16 -2
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/server.js +473 -28
- package/payload/platform/plugins/admin/hooks/session-end-retrospective.sh +0 -214
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { writeNodeWithEdges } from "../../../../../../lib/graph-write/dist/index.js";
|
|
3
|
+
function rec(map) {
|
|
4
|
+
return { get: (k) => map[k] };
|
|
5
|
+
}
|
|
6
|
+
// A fake tx/session that resolves the target pre-check, the CREATE, and the
|
|
7
|
+
// per-edge CREATE so writeNodeWithEdges runs end to end. Captures the props the
|
|
8
|
+
// node CREATE received so the test can inspect the embedding.
|
|
9
|
+
function makeFakeSession(targetId) {
|
|
10
|
+
let createdProps = null;
|
|
11
|
+
const tx = {
|
|
12
|
+
run: vi.fn(async (q, params) => {
|
|
13
|
+
if (q.includes("UNWIND $ids")) {
|
|
14
|
+
return { records: [rec({ id: targetId, labels: ["Task"] })] };
|
|
15
|
+
}
|
|
16
|
+
if (q.startsWith("CREATE (n:")) {
|
|
17
|
+
createdProps = params.props;
|
|
18
|
+
return {
|
|
19
|
+
records: [rec({ nodeId: "node-1", nodeLabels: ["Person"] })],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// per-edge CREATE
|
|
23
|
+
return {
|
|
24
|
+
summary: { counters: { updates: () => ({ relationshipsCreated: 1 }) } },
|
|
25
|
+
};
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
const session = {
|
|
29
|
+
executeWrite: async (fn) => fn(tx),
|
|
30
|
+
};
|
|
31
|
+
return { session, getCreatedProps: () => createdProps };
|
|
32
|
+
}
|
|
33
|
+
const baseParams = (extra) => ({
|
|
34
|
+
labels: ["Person"],
|
|
35
|
+
props: { accountId: "acct-1", givenName: "Ada" },
|
|
36
|
+
relationships: [
|
|
37
|
+
{ type: "PRODUCED", direction: "incoming", targetNodeId: "target-1" },
|
|
38
|
+
],
|
|
39
|
+
createdBy: { agent: "test", session: "s1", tool: "unit" },
|
|
40
|
+
expectedAccountId: "acct-1",
|
|
41
|
+
...extra,
|
|
42
|
+
});
|
|
43
|
+
describe("writeNodeWithEdges embed safety net", () => {
|
|
44
|
+
it("fills a missing embedding for an indexed label when embed is injected", async () => {
|
|
45
|
+
const { session, getCreatedProps } = makeFakeSession("target-1");
|
|
46
|
+
const embed = vi.fn(async () => [0.1, 0.2, 0.3]);
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
|
+
await writeNodeWithEdges({ session, embed, ...baseParams({}) });
|
|
49
|
+
expect(embed).toHaveBeenCalledOnce();
|
|
50
|
+
expect(getCreatedProps()?.embedding).toEqual([0.1, 0.2, 0.3]);
|
|
51
|
+
});
|
|
52
|
+
it("does not embed a non-indexed label", async () => {
|
|
53
|
+
const { session } = makeFakeSession("target-1");
|
|
54
|
+
const embed = vi.fn(async () => [0.1]);
|
|
55
|
+
await writeNodeWithEdges({
|
|
56
|
+
session,
|
|
57
|
+
embed,
|
|
58
|
+
...baseParams({ labels: ["StepResult"] }),
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
});
|
|
61
|
+
expect(embed).not.toHaveBeenCalled();
|
|
62
|
+
});
|
|
63
|
+
it("does not re-embed when an embedding is already present", async () => {
|
|
64
|
+
const { session, getCreatedProps } = makeFakeSession("target-1");
|
|
65
|
+
const embed = vi.fn(async () => [9, 9, 9]);
|
|
66
|
+
await writeNodeWithEdges({
|
|
67
|
+
session,
|
|
68
|
+
embed,
|
|
69
|
+
...baseParams({ props: { accountId: "acct-1", givenName: "Ada", embedding: [1, 2] } }),
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
|
+
});
|
|
72
|
+
expect(embed).not.toHaveBeenCalled();
|
|
73
|
+
expect(getCreatedProps()?.embedding).toEqual([1, 2]);
|
|
74
|
+
});
|
|
75
|
+
it("proceeds with the write when the embedder throws", async () => {
|
|
76
|
+
const { session, getCreatedProps } = makeFakeSession("target-1");
|
|
77
|
+
const embed = vi.fn(async () => {
|
|
78
|
+
throw new Error("ollama down");
|
|
79
|
+
});
|
|
80
|
+
const result = await writeNodeWithEdges({
|
|
81
|
+
session,
|
|
82
|
+
embed,
|
|
83
|
+
...baseParams({}),
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
85
|
+
});
|
|
86
|
+
expect(result.nodeId).toBe("node-1");
|
|
87
|
+
expect(getCreatedProps()?.embedding).toBeUndefined();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=graph-write-embed-net.test.js.map
|
package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-write-embed-net.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/graph-write-embed-net.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-indexed-labels-drift.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/vector-indexed-labels-drift.test.ts"],"names":[],"mappings":""}
|
package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { VECTOR_INDEXED_LABELS, DOCUMENT_ARCHIVE_LABELS, } from "../../../../../../lib/graph-write/dist/index.js";
|
|
5
|
+
// Task 636 — drift guard. graph-write must know which labels carry a vector
|
|
6
|
+
// index so the chokepoint can detect a null-embedding write of an indexed
|
|
7
|
+
// label, but it stays out of the node:fs import chain (it is bundled into the
|
|
8
|
+
// ESM payload), so it cannot read schema.cypher at runtime. The label set is a
|
|
9
|
+
// hardcoded constant; this test pins it to schema.cypher so a new
|
|
10
|
+
// `CREATE VECTOR INDEX … FOR (n:Label) ON (n.embedding)` cannot silently
|
|
11
|
+
// diverge from the constant.
|
|
12
|
+
const SCHEMA_CYPHER_PATH = resolve(import.meta.dirname, "../../../../../../neo4j/schema.cypher");
|
|
13
|
+
describe("VECTOR_INDEXED_LABELS matches schema.cypher", () => {
|
|
14
|
+
it("equals exactly the labels with a vector index on .embedding", () => {
|
|
15
|
+
const text = readFileSync(SCHEMA_CYPHER_PATH, "utf8");
|
|
16
|
+
const re = /CREATE VECTOR INDEX[\s\S]*?FOR \(\w+:(\w+)\) ON \(\w+\.embedding\)/g;
|
|
17
|
+
const fromSchema = new Set([...text.matchAll(re)].map((m) => m[1]));
|
|
18
|
+
expect(fromSchema.size).toBeGreaterThan(20); // sanity: parser found indexes
|
|
19
|
+
expect([...VECTOR_INDEXED_LABELS].sort()).toEqual([...fromSchema].sort());
|
|
20
|
+
});
|
|
21
|
+
it("DOCUMENT_ARCHIVE_LABELS is a subset of VECTOR_INDEXED_LABELS", () => {
|
|
22
|
+
for (const l of DOCUMENT_ARCHIVE_LABELS) {
|
|
23
|
+
expect(VECTOR_INDEXED_LABELS.has(l)).toBe(true);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=vector-indexed-labels-drift.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-indexed-labels-drift.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/vector-indexed-labels-drift.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,iDAAiD,CAAC;AAEzD,4EAA4E;AAC5E,0EAA0E;AAC1E,8EAA8E;AAC9E,+EAA+E;AAC/E,kEAAkE;AAClE,yEAAyE;AACzE,6BAA6B;AAE7B,MAAM,kBAAkB,GAAG,OAAO,CAChC,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,uCAAuC,CACxC,CAAC;AAEF,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,IAAI,GAAG,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,qEAAqE,CAAC;QACjF,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACxC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,+BAA+B;QAC5E,MAAM,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,KAAK,MAAM,CAAC,IAAI,uBAAuB,EAAE,CAAC;YACxC,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface DocSection {
|
|
2
|
+
title: string;
|
|
3
|
+
body: string;
|
|
4
|
+
}
|
|
5
|
+
export interface SectionisedDoc {
|
|
6
|
+
summary: string;
|
|
7
|
+
sections: DocSection[];
|
|
8
|
+
}
|
|
9
|
+
export declare function sectioniseDocument(body: string): SectionisedDoc;
|
|
10
|
+
//# sourceMappingURL=document-sectioniser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-sectioniser.d.ts","sourceRoot":"","sources":["../../src/lib/document-sectioniser.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAsC/D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Deterministic document sectioniser for the archive-ingest path (LinkedIn /
|
|
2
|
+
// Obsidian / Notion). Unlike memory-ingest, that path has no LLM section
|
|
3
|
+
// classifier, so sectioning must be deterministic: split on markdown ATX
|
|
4
|
+
// headings when present, otherwise into fixed-size windows. The parent
|
|
5
|
+
// `summary` is a bounded head excerpt — deterministic, no paraphrase. The
|
|
6
|
+
// produced sections carry the same { title, body } shape the :Section writer
|
|
7
|
+
// expects, so the HAS_SECTION / NEXT graph shape is identical regardless of
|
|
8
|
+
// ingest source (Task 636).
|
|
9
|
+
const SECTION_MAX_CHARS = 4000;
|
|
10
|
+
const SUMMARY_MAX_CHARS = 500;
|
|
11
|
+
export function sectioniseDocument(body) {
|
|
12
|
+
const trimmed = (body ?? "").trim();
|
|
13
|
+
if (trimmed.length === 0)
|
|
14
|
+
return { summary: "", sections: [] };
|
|
15
|
+
const summary = trimmed.length > SUMMARY_MAX_CHARS ? trimmed.slice(0, SUMMARY_MAX_CHARS) : trimmed;
|
|
16
|
+
const headingRe = /^#{1,6}\s+(.+)$/gm;
|
|
17
|
+
const matches = [...trimmed.matchAll(headingRe)];
|
|
18
|
+
const sections = [];
|
|
19
|
+
if (matches.length > 0) {
|
|
20
|
+
// Non-empty text before the first heading would otherwise be dropped from
|
|
21
|
+
// every per-section vector — capture it as a leading "Introduction" section
|
|
22
|
+
// so the split is lossless.
|
|
23
|
+
const preamble = trimmed.slice(0, matches[0].index ?? 0).trim();
|
|
24
|
+
if (preamble.length > 0) {
|
|
25
|
+
sections.push({
|
|
26
|
+
title: "Introduction",
|
|
27
|
+
body: preamble.length > SECTION_MAX_CHARS ? preamble.slice(0, SECTION_MAX_CHARS) : preamble,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
for (let i = 0; i < matches.length; i++) {
|
|
31
|
+
const title = matches[i][1].trim();
|
|
32
|
+
const start = (matches[i].index ?? 0) + matches[i][0].length;
|
|
33
|
+
const end = i + 1 < matches.length ? (matches[i + 1].index ?? trimmed.length) : trimmed.length;
|
|
34
|
+
let secBody = trimmed.slice(start, end).trim();
|
|
35
|
+
if (secBody.length > SECTION_MAX_CHARS)
|
|
36
|
+
secBody = secBody.slice(0, SECTION_MAX_CHARS);
|
|
37
|
+
sections.push({ title, body: secBody });
|
|
38
|
+
}
|
|
39
|
+
return { summary, sections };
|
|
40
|
+
}
|
|
41
|
+
// No headings — fixed-size windows.
|
|
42
|
+
for (let i = 0, part = 1; i < trimmed.length; i += SECTION_MAX_CHARS, part++) {
|
|
43
|
+
sections.push({ title: `Part ${part}`, body: trimmed.slice(i, i + SECTION_MAX_CHARS) });
|
|
44
|
+
}
|
|
45
|
+
return { summary, sections };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=document-sectioniser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-sectioniser.js","sourceRoot":"","sources":["../../src/lib/document-sectioniser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
export declare function embedBatch(texts: string[]): Promise<number[][]>;
|
|
1
|
+
export { embed, embedBatch, EMBED_INPUT_MAX_CHARS, } from "../../../../../lib/embed-client/dist/index.js";
|
|
3
2
|
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/lib/embeddings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/lib/embeddings.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,EACL,UAAU,EACV,qBAAqB,GACtB,MAAM,+CAA+C,CAAC"}
|
|
@@ -1,29 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
headers: { "Content-Type": "application/json" },
|
|
7
|
-
body: JSON.stringify({ model: EMBED_MODEL, input: text }),
|
|
8
|
-
});
|
|
9
|
-
if (!res.ok) {
|
|
10
|
-
const body = await res.text();
|
|
11
|
-
throw new Error(`Ollama embedding failed (${res.status}): ${body}`);
|
|
12
|
-
}
|
|
13
|
-
const data = (await res.json());
|
|
14
|
-
return data.embeddings[0];
|
|
15
|
-
}
|
|
16
|
-
export async function embedBatch(texts) {
|
|
17
|
-
const res = await fetch(`${OLLAMA_URL}/api/embed`, {
|
|
18
|
-
method: "POST",
|
|
19
|
-
headers: { "Content-Type": "application/json" },
|
|
20
|
-
body: JSON.stringify({ model: EMBED_MODEL, input: texts }),
|
|
21
|
-
});
|
|
22
|
-
if (!res.ok) {
|
|
23
|
-
const body = await res.text();
|
|
24
|
-
throw new Error(`Ollama batch embedding failed (${res.status}): ${body}`);
|
|
25
|
-
}
|
|
26
|
-
const data = (await res.json());
|
|
27
|
-
return data.embeddings;
|
|
28
|
-
}
|
|
1
|
+
// The Ollama embed client now lives in platform/lib/embed-client so admin MCP,
|
|
2
|
+
// scheduling ICS ingest, and the UI all share one capped implementation. This
|
|
3
|
+
// module re-exports it to preserve every `../lib/embeddings.js` import site in
|
|
4
|
+
// the memory plugin (Task 636).
|
|
5
|
+
export { embed, embedBatch, EMBED_INPUT_MAX_CHARS, } from "../../../../../lib/embed-client/dist/index.js";
|
|
29
6
|
//# sourceMappingURL=embeddings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/lib/embeddings.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/lib/embeddings.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,gCAAgC;AAChC,OAAO,EACL,KAAK,EACL,UAAU,EACV,qBAAqB,GACtB,MAAM,+CAA+C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-text-representation-bound.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/build-text-representation-bound.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { buildTextRepresentation } from "../memory-write.js";
|
|
3
|
+
describe("buildTextRepresentation bounding", () => {
|
|
4
|
+
it("caps total output length", () => {
|
|
5
|
+
const out = buildTextRepresentation(["Message"], { body: "z".repeat(50_000) });
|
|
6
|
+
expect(out.length).toBeLessThanOrEqual(8200); // label preamble + total cap
|
|
7
|
+
});
|
|
8
|
+
it("caps each value so one huge prop cannot crowd out later props", () => {
|
|
9
|
+
const out = buildTextRepresentation(["Person"], {
|
|
10
|
+
bio: "z".repeat(50_000),
|
|
11
|
+
givenName: "Ada",
|
|
12
|
+
});
|
|
13
|
+
expect(out).toContain("givenName: Ada");
|
|
14
|
+
});
|
|
15
|
+
it("leaves a small representation unchanged", () => {
|
|
16
|
+
const out = buildTextRepresentation(["Person"], { givenName: "Ada", familyName: "Lovelace" });
|
|
17
|
+
expect(out).toBe("[Person] | givenName: Ada | familyName: Lovelace");
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=build-text-representation-bound.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-text-representation-bound.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/build-text-representation-bound.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAAE;YAC9C,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YACvB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9F,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-archive-preference-embed.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/conversation-archive-preference-embed.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
// Task 636 — a Preference proposal must carry an embedding so the wired node is
|
|
6
|
+
// findable by vector search at creation, not only after a reindex.
|
|
7
|
+
const mockSession = {
|
|
8
|
+
run: vi.fn(),
|
|
9
|
+
close: vi.fn().mockResolvedValue(undefined),
|
|
10
|
+
};
|
|
11
|
+
vi.mock("../../lib/neo4j.js", () => ({ getSession: () => mockSession }));
|
|
12
|
+
vi.mock("../../lib/log-ingest.js", () => ({
|
|
13
|
+
withWriteEvent: async (_i, body) => body(),
|
|
14
|
+
}));
|
|
15
|
+
vi.mock("../../lib/embeddings.js", () => ({
|
|
16
|
+
embed: vi.fn().mockResolvedValue([0.4, 0.5, 0.6]),
|
|
17
|
+
}));
|
|
18
|
+
describe("conversation-archive-derive-insights — preference embedding", () => {
|
|
19
|
+
let scratch;
|
|
20
|
+
let orig;
|
|
21
|
+
let deriveInsights;
|
|
22
|
+
beforeEach(async () => {
|
|
23
|
+
scratch = mkdtempSync(resolve(tmpdir(), "pref-embed-"));
|
|
24
|
+
orig = process.env.PLATFORM_ROOT;
|
|
25
|
+
process.env.PLATFORM_ROOT = resolve(scratch, "platform");
|
|
26
|
+
mockSession.run.mockReset();
|
|
27
|
+
vi.resetModules();
|
|
28
|
+
deriveInsights = (await import("../conversation-archive-derive-insights.js"))
|
|
29
|
+
.conversationArchiveDeriveInsights;
|
|
30
|
+
});
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
if (orig === undefined)
|
|
33
|
+
delete process.env.PLATFORM_ROOT;
|
|
34
|
+
else
|
|
35
|
+
process.env.PLATFORM_ROOT = orig;
|
|
36
|
+
rmSync(scratch, { recursive: true, force: true });
|
|
37
|
+
});
|
|
38
|
+
it("embeds the Preference proposal (mergeCypher + mergeParams)", async () => {
|
|
39
|
+
mockSession.run.mockResolvedValueOnce({
|
|
40
|
+
records: [{ get: (k) => (k === "eid" ? "4:CHUNK:1" : null) }],
|
|
41
|
+
});
|
|
42
|
+
const result = await deriveInsights({
|
|
43
|
+
accountId: "acct",
|
|
44
|
+
archiveElementId: "4:ARCH:1",
|
|
45
|
+
chunkElementId: "4:CHUNK:1",
|
|
46
|
+
claims: [
|
|
47
|
+
{
|
|
48
|
+
kind: "preference",
|
|
49
|
+
evidenceSnippet: "only meets on Tuesdays",
|
|
50
|
+
subject: null,
|
|
51
|
+
object: null,
|
|
52
|
+
payload: {
|
|
53
|
+
preferenceCategory: "meeting",
|
|
54
|
+
preferenceKey: "day-of-week",
|
|
55
|
+
preferenceValue: "Tuesday",
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
});
|
|
60
|
+
expect(result.proposals).toHaveLength(1);
|
|
61
|
+
const p = result.proposals[0];
|
|
62
|
+
expect(p.kind).toBe("preference");
|
|
63
|
+
expect(p.mergeCypher).toContain("p.embedding = $embedding");
|
|
64
|
+
expect(p.mergeParams.embedding).toEqual([0.4, 0.5, 0.6]);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=conversation-archive-preference-embed.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-archive-preference-embed.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/conversation-archive-preference-embed.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings-cap.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/embeddings-cap.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
describe("embed input capping", () => {
|
|
3
|
+
beforeEach(() => vi.restoreAllMocks());
|
|
4
|
+
it("caps an oversized input to EMBED_INPUT_MAX_CHARS before POST and returns a vector", async () => {
|
|
5
|
+
const huge = "x".repeat(100_000);
|
|
6
|
+
let sentInput;
|
|
7
|
+
vi.stubGlobal("fetch", vi.fn(async (_url, init) => {
|
|
8
|
+
sentInput = JSON.parse(init.body).input;
|
|
9
|
+
return {
|
|
10
|
+
ok: true,
|
|
11
|
+
json: async () => ({ embeddings: [[0.1, 0.2]] }),
|
|
12
|
+
};
|
|
13
|
+
}));
|
|
14
|
+
const { embed, EMBED_INPUT_MAX_CHARS } = await import("../../lib/embeddings.js");
|
|
15
|
+
const vec = await embed(huge);
|
|
16
|
+
expect(vec).toEqual([0.1, 0.2]);
|
|
17
|
+
expect(sentInput.length).toBe(EMBED_INPUT_MAX_CHARS);
|
|
18
|
+
});
|
|
19
|
+
it("embedBatch caps each oversized element, leaves short ones intact", async () => {
|
|
20
|
+
let sent = [];
|
|
21
|
+
vi.stubGlobal("fetch", vi.fn(async (_u, init) => {
|
|
22
|
+
sent = JSON.parse(init.body).input;
|
|
23
|
+
return {
|
|
24
|
+
ok: true,
|
|
25
|
+
json: async () => ({ embeddings: sent.map(() => [0.1]) }),
|
|
26
|
+
};
|
|
27
|
+
}));
|
|
28
|
+
const { embedBatch, EMBED_INPUT_MAX_CHARS } = await import("../../lib/embeddings.js");
|
|
29
|
+
await embedBatch(["short", "y".repeat(50_000)]);
|
|
30
|
+
expect(sent[0]).toBe("short");
|
|
31
|
+
expect(sent[1].length).toBe(EMBED_INPUT_MAX_CHARS);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=embeddings-cap.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings-cap.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/embeddings-cap.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,SAAkB,CAAC;QACvB,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,IAAsB,EAAE,EAAE;YACnD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;YACxC,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;aAC1B,CAAC;QAC3B,CAAC,CAAC,CACH,CAAC;QACF,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACjF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAChC,MAAM,CAAE,SAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,IAAI,IAAI,GAAa,EAAE,CAAC;QACxB,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAU,EAAE,IAAsB,EAAE,EAAE;YACjD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;YACnC,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;aACnC,CAAC;QAC3B,CAAC,CAAC,CACH,CAAC;QACF,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACtF,MAAM,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-archive-section-writer.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-archive-section-writer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { writeKnowledgeDocSections } from "../memory-archive-write.js";
|
|
3
|
+
// Task 636 — the archive :Section writer is idempotent (DETACH DELETE prior
|
|
4
|
+
// sections), creates one :Section per chunk with its embedding, and chains them
|
|
5
|
+
// with :NEXT. This drives a fake tx so no live Neo4j is needed.
|
|
6
|
+
function makeFakeTx() {
|
|
7
|
+
const calls = [];
|
|
8
|
+
let n = 0;
|
|
9
|
+
const tx = {
|
|
10
|
+
run: vi.fn(async (q, p = {}) => {
|
|
11
|
+
calls.push({ q, p });
|
|
12
|
+
if (q.includes("CREATE (s:Section)")) {
|
|
13
|
+
return { records: [{ get: (_k) => `sec-${n++}` }] };
|
|
14
|
+
}
|
|
15
|
+
return { records: [] };
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
return { tx, calls };
|
|
19
|
+
}
|
|
20
|
+
describe("writeKnowledgeDocSections", () => {
|
|
21
|
+
it("deletes prior sections, creates one per chunk with embedding, and chains NEXT", async () => {
|
|
22
|
+
const { tx, calls } = makeFakeTx();
|
|
23
|
+
await writeKnowledgeDocSections(tx, {
|
|
24
|
+
docId: "doc-1",
|
|
25
|
+
accountId: "acct",
|
|
26
|
+
scope: "admin",
|
|
27
|
+
source: "obsidian",
|
|
28
|
+
createdByAgent: "obsidian-import",
|
|
29
|
+
sessionId: "s1",
|
|
30
|
+
sourceDocumentKey: "notes/a.md",
|
|
31
|
+
sections: [
|
|
32
|
+
{ title: "A", body: "alpha", embedding: [0.1] },
|
|
33
|
+
{ title: "B", body: "beta", embedding: [0.2] },
|
|
34
|
+
],
|
|
35
|
+
});
|
|
36
|
+
const deletes = calls.filter((c) => c.q.includes("DETACH DELETE s"));
|
|
37
|
+
expect(deletes).toHaveLength(1);
|
|
38
|
+
const creates = calls.filter((c) => c.q.includes("CREATE (s:Section)"));
|
|
39
|
+
expect(creates).toHaveLength(2);
|
|
40
|
+
expect(creates[0].p.props.embedding).toEqual([0.1]);
|
|
41
|
+
expect(creates[0].p.props.title).toBe("A");
|
|
42
|
+
const nexts = calls.filter((c) => c.q.includes("[n:NEXT]"));
|
|
43
|
+
expect(nexts).toHaveLength(1); // 2 sections → 1 chain edge
|
|
44
|
+
});
|
|
45
|
+
it("no sections → only the cleanup delete runs", async () => {
|
|
46
|
+
const { tx, calls } = makeFakeTx();
|
|
47
|
+
await writeKnowledgeDocSections(tx, {
|
|
48
|
+
docId: "doc-1",
|
|
49
|
+
accountId: "acct",
|
|
50
|
+
scope: "admin",
|
|
51
|
+
source: "notion",
|
|
52
|
+
createdByAgent: "notion-import",
|
|
53
|
+
sessionId: null,
|
|
54
|
+
sourceDocumentKey: "nid",
|
|
55
|
+
sections: [],
|
|
56
|
+
});
|
|
57
|
+
expect(calls).toHaveLength(1);
|
|
58
|
+
expect(calls[0].q).toContain("DETACH DELETE s");
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=memory-archive-section-writer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-archive-section-writer.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-archive-section-writer.test.ts"],"names":[],"mappings":"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"}
|
package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* is a current-job snapshot — re-import without a title is authoritative).
|
|
29
29
|
*/
|
|
30
30
|
import { describe, it, expect } from "vitest";
|
|
31
|
-
import { PERSON_AND_CONNECTED_EDGE_CYPHER, ORG_AND_WORKS_FOR_CYPHER, } from "../memory-archive-write.js";
|
|
31
|
+
import { PERSON_AND_CONNECTED_EDGE_CYPHER, ORG_AND_WORKS_FOR_CYPHER, OBSIDIAN_PAGE_CYPHER, OBSIDIAN_TAG_CYPHER, OBSIDIAN_ATTACHMENT_CYPHER, NOTION_PAGE_CYPHER, } from "../memory-archive-write.js";
|
|
32
32
|
describe("memory-archive-write currentTitle denormalisation", () => {
|
|
33
33
|
it("PERSON_AND_CONNECTED_EDGE_CYPHER writes p.currentTitle = row.title in the SET clause", () => {
|
|
34
34
|
expect(PERSON_AND_CONNECTED_EDGE_CYPHER).toMatch(/p\.currentTitle\s*=\s*row\.title/);
|
|
@@ -81,4 +81,26 @@ describe("memory-archive-write connectedOn stays edge-only", () => {
|
|
|
81
81
|
expect(PERSON_AND_CONNECTED_EDGE_CYPHER).toMatch(/c\.connectedOn\s*=\s*date\(row\.connectedOn\)/);
|
|
82
82
|
});
|
|
83
83
|
});
|
|
84
|
+
// Task 636 — every vector-indexed label written by this tool stamps an
|
|
85
|
+
// embedding. Entities get a props embedding (row/dynamic-map param); real-bodied
|
|
86
|
+
// documents (Obsidian/Notion pages) get a parent summary embedding plus a
|
|
87
|
+
// returned doc list that drives :Section creation.
|
|
88
|
+
describe("memory-archive-write embeds every indexed label (Task 636)", () => {
|
|
89
|
+
it("LinkedIn Person and Organization carry an embedding param", () => {
|
|
90
|
+
expect(PERSON_AND_CONNECTED_EDGE_CYPHER).toMatch(/p\.embedding\s*=\s*row\.personEmbedding/);
|
|
91
|
+
expect(ORG_AND_WORKS_FOR_CYPHER).toMatch(/o\.embedding\s*=\s*row\.orgEmbedding/);
|
|
92
|
+
});
|
|
93
|
+
it("Obsidian DefinedTerm and DigitalDocument carry a dynamic-map embedding", () => {
|
|
94
|
+
expect(OBSIDIAN_TAG_CYPHER).toMatch(/t\.embedding\s*=\s*\$tagEmbeddings\[tagName\]/);
|
|
95
|
+
expect(OBSIDIAN_ATTACHMENT_CYPHER).toMatch(/d\.embedding\s*=\s*\$attachmentEmbeddings\[att\.archivePath\]/);
|
|
96
|
+
});
|
|
97
|
+
it("Obsidian and Notion KnowledgeDocument set summary + parent embedding and return docs for sectioning", () => {
|
|
98
|
+
expect(OBSIDIAN_PAGE_CYPHER).toMatch(/k\.summary\s*=\s*row\.summary/);
|
|
99
|
+
expect(OBSIDIAN_PAGE_CYPHER).toMatch(/k\.embedding\s*=\s*row\.docEmbedding/);
|
|
100
|
+
expect(OBSIDIAN_PAGE_CYPHER).toMatch(/RETURN collect\(\{ key: row\.obsidianPath, docId: elementId\(k\) \}\) AS docs/);
|
|
101
|
+
expect(NOTION_PAGE_CYPHER).toMatch(/k\.summary\s*=\s*row\.summary/);
|
|
102
|
+
expect(NOTION_PAGE_CYPHER).toMatch(/k\.embedding\s*=\s*row\.docEmbedding/);
|
|
103
|
+
expect(NOTION_PAGE_CYPHER).toMatch(/RETURN collect\(\{ key: row\.notionId, docId: elementId\(k\) \}\) AS docs/);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
84
106
|
//# sourceMappingURL=memory-archive-write.test.js.map
|
package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-archive-write.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-archive-write.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,gCAAgC,EAChC,wBAAwB,
|
|
1
|
+
{"version":3,"file":"memory-archive-write.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-archive-write.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-reindex.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-reindex.test.ts"],"names":[],"mappings":""}
|