@rubytech/create-realagent 1.0.664 → 1.0.666

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.
Files changed (53) hide show
  1. package/dist/index.js +5 -1
  2. package/package.json +1 -1
  3. package/payload/platform/neo4j/schema.cypher +13 -3
  4. package/payload/platform/plugins/docs/references/memory-guide.md +1 -1
  5. package/payload/platform/plugins/docs/references/platform.md +1 -1
  6. package/payload/platform/plugins/docs/references/troubleshooting.md +24 -6
  7. package/payload/platform/scripts/vnc.sh +174 -2
  8. package/payload/server/public/assets/{admin-Bo3NKS_u.js → admin-Brug36E-.js} +5 -5
  9. package/payload/server/public/assets/{data-DQcIUUZW.js → data-woLf2Tmp.js} +1 -1
  10. package/payload/server/public/assets/{file-BhFSdU7V.js → file-rN5uuyaV.js} +1 -1
  11. package/payload/server/public/assets/{graph-DSUSNmfO.js → graph-BYaOEZUg.js} +17 -17
  12. package/payload/server/public/assets/{house-CA7LcTyb.js → house-DnFgpCt2.js} +1 -1
  13. package/payload/server/public/assets/jsx-runtime-CSCPZpLN.css +1 -0
  14. package/payload/server/public/assets/{public-C7sPrAvE.js → public-BRrqpeVH.js} +1 -1
  15. package/payload/server/public/assets/{share-2-CVCJTVW7.js → share-2-DLjRUEiG.js} +1 -1
  16. package/payload/server/public/assets/{useVoiceRecorder-DwMKR9su.js → useVoiceRecorder-D_efR3Nx.js} +1 -1
  17. package/payload/server/public/assets/{x-Dnw-ie9I.js → x-L6KPMfIN.js} +1 -1
  18. package/payload/server/public/brand/claude.png +0 -0
  19. package/payload/server/public/data.html +6 -6
  20. package/payload/server/public/graph.html +6 -6
  21. package/payload/server/public/index.html +7 -7
  22. package/payload/server/public/public.html +4 -4
  23. package/payload/server/server.js +267 -115
  24. package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.test.d.ts +0 -2
  25. package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.test.d.ts.map +0 -1
  26. package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.test.js +0 -224
  27. package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.test.js.map +0 -1
  28. package/payload/platform/plugins/documents/mcp/dist/index.d.ts +0 -2
  29. package/payload/platform/plugins/documents/mcp/dist/index.d.ts.map +0 -1
  30. package/payload/platform/plugins/documents/mcp/dist/index.js +0 -98
  31. package/payload/platform/plugins/documents/mcp/dist/index.js.map +0 -1
  32. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.test.d.ts +0 -2
  33. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.test.d.ts.map +0 -1
  34. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.test.js +0 -233
  35. package/payload/platform/plugins/memory/mcp/dist/lib/semantic-chunker.test.js.map +0 -1
  36. package/payload/platform/plugins/memory/mcp/dist/scripts/graph-prune.d.ts +0 -18
  37. package/payload/platform/plugins/memory/mcp/dist/scripts/graph-prune.d.ts.map +0 -1
  38. package/payload/platform/plugins/memory/mcp/dist/scripts/graph-prune.js +0 -80
  39. package/payload/platform/plugins/memory/mcp/dist/scripts/graph-prune.js.map +0 -1
  40. package/payload/platform/plugins/memory/mcp/dist/tools/graph-prune-run.d.ts +0 -7
  41. package/payload/platform/plugins/memory/mcp/dist/tools/graph-prune-run.d.ts.map +0 -1
  42. package/payload/platform/plugins/memory/mcp/dist/tools/graph-prune-run.js +0 -10
  43. package/payload/platform/plugins/memory/mcp/dist/tools/graph-prune-run.js.map +0 -1
  44. package/payload/platform/plugins/waitlist/mcp/dist/lib/anthropic.d.ts +0 -23
  45. package/payload/platform/plugins/waitlist/mcp/dist/lib/anthropic.d.ts.map +0 -1
  46. package/payload/platform/plugins/waitlist/mcp/dist/lib/anthropic.js +0 -115
  47. package/payload/platform/plugins/waitlist/mcp/dist/lib/anthropic.js.map +0 -1
  48. package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-extract.d.ts +0 -12
  49. package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-extract.d.ts.map +0 -1
  50. package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-extract.js +0 -197
  51. package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-extract.js.map +0 -1
  52. package/payload/server/public/assets/jsx-runtime-CH3XaSdT.css +0 -1
  53. /package/payload/server/public/assets/{jsx-runtime-BZgdWJ0Y.js → jsx-runtime-XWiDQoTG.js} +0 -0
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=onboarding.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onboarding.test.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding.test.ts"],"names":[],"mappings":""}
@@ -1,224 +0,0 @@
1
- import { describe, it, beforeEach } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { getOnboardingState, completeOnboardingStep } from "./onboarding.js";
4
- import { mkdtempSync, writeFileSync, readFileSync } from "node:fs";
5
- import { join } from "node:path";
6
- import { tmpdir } from "node:os";
7
- // Mock Neo4j session factory
8
- function createMockSession(records = []) {
9
- const mockRecords = records.map((r) => ({
10
- get(key) { return r[key]; },
11
- }));
12
- return {
13
- async run(_query, _params) {
14
- return { records: mockRecords };
15
- },
16
- async close() { },
17
- };
18
- }
19
- // Stateful mock that tracks MERGE/SET calls and returns dynamic records
20
- function createStatefulMockSession(opts = {}) {
21
- const queries = [];
22
- return {
23
- queries,
24
- async run(query, params) {
25
- queries.push({ query, params });
26
- if (query.includes("MERGE") && opts.mergeRecords) {
27
- return { records: opts.mergeRecords.map((r) => ({ get(key) { return r[key]; } })) };
28
- }
29
- if (query.includes("MATCH") && query.includes("SET") && opts.mergeRecords) {
30
- return { records: opts.mergeRecords.map((r) => ({ get(key) { return r[key]; } })) };
31
- }
32
- if (opts.matchRecords) {
33
- return { records: opts.matchRecords.map((r) => ({ get(key) { return r[key]; } })) };
34
- }
35
- return { records: [] };
36
- },
37
- async close() { },
38
- };
39
- }
40
- function makeTmpAccountDir() {
41
- const dir = mkdtempSync(join(tmpdir(), "maxy-test-"));
42
- return dir;
43
- }
44
- // ============================================================
45
- // getOnboardingState
46
- // ============================================================
47
- describe("getOnboardingState", () => {
48
- let accountDir;
49
- beforeEach(() => {
50
- accountDir = makeTmpAccountDir();
51
- });
52
- it("returns existing state when OnboardingState node exists", async () => {
53
- const now = new Date().toISOString();
54
- const session = createMockSession([{
55
- currentStep: 3,
56
- step1CompletedAt: now,
57
- step2CompletedAt: now,
58
- step3CompletedAt: now,
59
- step4CompletedAt: null,
60
- step5CompletedAt: null,
61
- step6CompletedAt: null,
62
- step7CompletedAt: null,
63
- createdAt: now,
64
- updatedAt: now,
65
- }]);
66
- const state = await getOnboardingState(() => session, "test-account", accountDir);
67
- assert.equal(state.currentStep, 3);
68
- assert.equal(state.step1CompletedAt, now);
69
- assert.equal(state.step4CompletedAt, null);
70
- });
71
- it("migrates from account.json when no graph node exists", async () => {
72
- // Write account.json with onboardingStep
73
- writeFileSync(join(accountDir, "account.json"), JSON.stringify({
74
- accountId: "test-account",
75
- onboardingStep: 4,
76
- outputStyle: "default",
77
- }));
78
- const now = new Date().toISOString();
79
- const session = createStatefulMockSession({
80
- matchRecords: undefined, // no existing node
81
- mergeRecords: [{
82
- currentStep: 4,
83
- step1CompletedAt: now,
84
- step2CompletedAt: now,
85
- step3CompletedAt: now,
86
- step4CompletedAt: now,
87
- step5CompletedAt: null,
88
- step6CompletedAt: null,
89
- step7CompletedAt: null,
90
- createdAt: now,
91
- updatedAt: now,
92
- }],
93
- });
94
- const state = await getOnboardingState(() => session, "test-account", accountDir);
95
- assert.equal(state.currentStep, 4);
96
- // Verify account.json no longer has onboardingStep
97
- const updated = JSON.parse(readFileSync(join(accountDir, "account.json"), "utf-8"));
98
- assert.equal(updated.onboardingStep, undefined);
99
- assert.equal(updated.outputStyle, "default"); // other fields preserved
100
- });
101
- it("creates fresh state when no graph node and no account.json exists", async () => {
102
- const now = new Date().toISOString();
103
- const session = createStatefulMockSession({
104
- mergeRecords: [{
105
- currentStep: 0,
106
- step1CompletedAt: null,
107
- step2CompletedAt: null,
108
- step3CompletedAt: null,
109
- step4CompletedAt: null,
110
- step5CompletedAt: null,
111
- step6CompletedAt: null,
112
- step7CompletedAt: null,
113
- createdAt: now,
114
- updatedAt: now,
115
- }],
116
- });
117
- const state = await getOnboardingState(() => session, "test-account", accountDir);
118
- assert.equal(state.currentStep, 0);
119
- });
120
- it("creates fresh state when account.json has no onboardingStep field", async () => {
121
- writeFileSync(join(accountDir, "account.json"), JSON.stringify({
122
- accountId: "test-account",
123
- outputStyle: "default",
124
- }));
125
- const now = new Date().toISOString();
126
- const session = createStatefulMockSession({
127
- mergeRecords: [{
128
- currentStep: 0,
129
- step1CompletedAt: null,
130
- step2CompletedAt: null,
131
- step3CompletedAt: null,
132
- step4CompletedAt: null,
133
- step5CompletedAt: null,
134
- step6CompletedAt: null,
135
- step7CompletedAt: null,
136
- createdAt: now,
137
- updatedAt: now,
138
- }],
139
- });
140
- const state = await getOnboardingState(() => session, "test-account", accountDir);
141
- assert.equal(state.currentStep, 0);
142
- });
143
- it("handles malformed account.json during migration", async () => {
144
- writeFileSync(join(accountDir, "account.json"), "not valid json {{{");
145
- const now = new Date().toISOString();
146
- const session = createStatefulMockSession({
147
- mergeRecords: [{
148
- currentStep: 0,
149
- step1CompletedAt: null,
150
- step2CompletedAt: null,
151
- step3CompletedAt: null,
152
- step4CompletedAt: null,
153
- step5CompletedAt: null,
154
- step6CompletedAt: null,
155
- step7CompletedAt: null,
156
- createdAt: now,
157
- updatedAt: now,
158
- }],
159
- });
160
- const state = await getOnboardingState(() => session, "test-account", accountDir);
161
- assert.equal(state.currentStep, 0); // defaults to fresh
162
- });
163
- });
164
- // ============================================================
165
- // completeOnboardingStep
166
- // ============================================================
167
- describe("completeOnboardingStep", () => {
168
- it("sets timestamp and bumps currentStep for a valid step", async () => {
169
- const now = new Date().toISOString();
170
- const session = createStatefulMockSession({
171
- matchRecords: [{ exists: true }],
172
- mergeRecords: [{
173
- currentStep: 3,
174
- step1CompletedAt: now,
175
- step2CompletedAt: now,
176
- step3CompletedAt: now,
177
- step4CompletedAt: null,
178
- step5CompletedAt: null,
179
- step6CompletedAt: null,
180
- step7CompletedAt: null,
181
- createdAt: now,
182
- updatedAt: now,
183
- }],
184
- });
185
- const state = await completeOnboardingStep(() => session, "test-account", 3);
186
- assert.equal(state.currentStep, 3);
187
- assert.ok(state.step3CompletedAt !== null);
188
- });
189
- it("is idempotent — completing an already-completed step is a no-op", async () => {
190
- const existingTimestamp = "2026-03-20T10:00:00.000Z";
191
- const session = createStatefulMockSession({
192
- matchRecords: [{ exists: true }],
193
- mergeRecords: [{
194
- currentStep: 5,
195
- step1CompletedAt: existingTimestamp,
196
- step2CompletedAt: existingTimestamp,
197
- step3CompletedAt: existingTimestamp,
198
- step4CompletedAt: existingTimestamp,
199
- step5CompletedAt: existingTimestamp,
200
- step6CompletedAt: null,
201
- step7CompletedAt: null,
202
- createdAt: existingTimestamp,
203
- updatedAt: existingTimestamp,
204
- }],
205
- });
206
- const state = await completeOnboardingStep(() => session, "test-account", 3);
207
- // Should return current state without error
208
- assert.equal(state.currentStep, 5);
209
- assert.equal(state.step3CompletedAt, existingTimestamp);
210
- });
211
- it("rejects invalid step numbers", async () => {
212
- const session = createMockSession();
213
- await assert.rejects(() => completeOnboardingStep(() => session, "test-account", 0), { message: /step must be between 1 and 7/i });
214
- await assert.rejects(() => completeOnboardingStep(() => session, "test-account", 8), { message: /step must be between 1 and 7/i });
215
- await assert.rejects(() => completeOnboardingStep(() => session, "test-account", -1), { message: /step must be between 1 and 7/i });
216
- });
217
- it("errors when no OnboardingState node exists", async () => {
218
- const session = createStatefulMockSession({
219
- matchRecords: [], // no node
220
- });
221
- await assert.rejects(() => completeOnboardingStep(() => session, "test-account", 1), { message: /no onboarding state found/i });
222
- });
223
- });
224
- //# sourceMappingURL=onboarding.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onboarding.test.js","sourceRoot":"","sources":["../../src/lib/onboarding.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -1,98 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import { z } from "zod";
4
- import QRCode from "qrcode";
5
- // ---------------------------------------------------------------------------
6
- const server = new McpServer({
7
- name: "maxy-documents",
8
- version: "0.1.0",
9
- });
10
- server.tool("qr-generate", "Generate a QR code from text or a URL. Returns the QR code as a data URI (PNG) or saves to a file path.", {
11
- data: z.string().describe("The text or URL to encode in the QR code"),
12
- outputPath: z
13
- .string()
14
- .optional()
15
- .describe("File path to save the PNG. If omitted, returns a data URI."),
16
- width: z.number().optional().describe("Width in pixels (default 300)"),
17
- }, async ({ data, outputPath, width }) => {
18
- try {
19
- const options = { width: width ?? 300, margin: 2 };
20
- if (outputPath) {
21
- await QRCode.toFile(outputPath, data, options);
22
- return {
23
- content: [
24
- {
25
- type: "text",
26
- text: `QR code saved to ${outputPath}`,
27
- },
28
- ],
29
- };
30
- }
31
- const dataUri = await QRCode.toDataURL(data, options);
32
- return {
33
- content: [
34
- {
35
- type: "text",
36
- text: `QR code generated for: ${data}`,
37
- },
38
- {
39
- type: "image",
40
- data: dataUri.replace(/^data:image\/png;base64,/, ""),
41
- mimeType: "image/png",
42
- },
43
- ],
44
- };
45
- }
46
- catch (err) {
47
- return {
48
- content: [
49
- {
50
- type: "text",
51
- text: `QR generation failed: ${err instanceof Error ? err.message : String(err)}`,
52
- },
53
- ],
54
- isError: true,
55
- };
56
- }
57
- });
58
- server.tool("document-ingest", "DEPRECATED — use memory-ingest-extract + memory-ingest (in the memory MCP server) instead. " +
59
- "This tool has been replaced by a hierarchical ingestion pipeline with LLM-generated summaries.", {
60
- attachmentId: z.string().uuid().describe("UUID of the attachment"),
61
- accountId: z.string().describe("Account this attachment belongs to"),
62
- storagePath: z.string().describe("Absolute path to the stored file on disk"),
63
- filename: z.string().describe("Original filename as uploaded"),
64
- mimeType: z.string().describe("MIME type of the file"),
65
- sizeBytes: z.number().int().describe("File size in bytes"),
66
- }, async () => ({
67
- content: [{
68
- type: "text",
69
- text: "document-ingest is deprecated. Use memory-ingest-extract to extract text, then memory-ingest to store the document hierarchy with LLM-generated summaries. Both tools are in the memory MCP server.",
70
- }],
71
- isError: true,
72
- }));
73
- server.tool("document-create-pdf", "Generate a PDF document from markdown or HTML content", {
74
- content: z.string(),
75
- format: z.enum(["markdown", "html"]).optional(),
76
- title: z.string().optional(),
77
- }, async () => ({
78
- content: [
79
- {
80
- type: "text",
81
- text: "PDF generation is not available in Phase 0. This capability will be added in Phase 1.",
82
- },
83
- ],
84
- }));
85
- server.tool("document-list", "List documents for an account", {
86
- accountId: z.string().optional(),
87
- type: z.string().optional(),
88
- }, async () => ({
89
- content: [
90
- {
91
- type: "text",
92
- text: "Document management is not available in Phase 0. This capability will be added in Phase 1.",
93
- },
94
- ],
95
- }));
96
- const transport = new StdioServerTransport();
97
- await server.connect(transport);
98
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=semantic-chunker.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-chunker.test.d.ts","sourceRoot":"","sources":["../../src/lib/semantic-chunker.test.ts"],"names":[],"mappings":""}
@@ -1,233 +0,0 @@
1
- import { describe, it } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { splitIntoParagraphs, aggregateBlocks, cosine, similarityCurve, valleyDepths, selectBoundaries, snapToHeadings, buildSections, chunkText } from "./semantic-chunker.js";
4
- describe("splitIntoParagraphs", () => {
5
- it("splits on double newlines", () => {
6
- const text = "First paragraph.\n\nSecond paragraph.\n\nThird.";
7
- const result = splitIntoParagraphs(text);
8
- assert.deepStrictEqual(result, [
9
- "First paragraph.",
10
- "Second paragraph.",
11
- "Third.",
12
- ]);
13
- });
14
- it("falls back to sentence splitting for wall of text", () => {
15
- const wall = "First sentence. Second sentence. Third sentence here.";
16
- const result = splitIntoParagraphs(wall);
17
- assert.ok(result.length >= 2, `Expected >=2 paragraphs, got ${result.length}`);
18
- });
19
- it("filters empty paragraphs", () => {
20
- const text = "A.\n\n\n\nB.\n\n\n\nC.";
21
- const result = splitIntoParagraphs(text);
22
- assert.deepStrictEqual(result, ["A.", "B.", "C."]);
23
- });
24
- });
25
- describe("aggregateBlocks", () => {
26
- it("merges short paragraphs until minimum size", () => {
27
- const paragraphs = ["Hi.", "Hello.", "Short.", "This is a much longer paragraph that should definitely exceed the minimum block size on its own without needing any merging at all because it has enough content."];
28
- const blocks = aggregateBlocks(paragraphs, 100);
29
- assert.ok(blocks.length >= 1);
30
- assert.ok(blocks.length <= paragraphs.length);
31
- for (const b of blocks) {
32
- if (b !== blocks[blocks.length - 1]) {
33
- assert.ok(b.text.length >= 100, `Block too small: ${b.text.length} bytes`);
34
- }
35
- }
36
- });
37
- it("preserves paragraph list in each block", () => {
38
- const paragraphs = ["Short A.", "Short B.", "Long paragraph that exceeds minimum size on its own easily."];
39
- const blocks = aggregateBlocks(paragraphs, 50);
40
- const allParagraphs = blocks.flatMap((b) => b.paragraphs);
41
- assert.deepStrictEqual(allParagraphs, paragraphs);
42
- });
43
- it("detects headings in blocks", () => {
44
- const paragraphs = ["## Section Title\n\nSome content here.", "More content."];
45
- const blocks = aggregateBlocks(paragraphs, 10);
46
- const headingBlock = blocks.find((b) => b.headingLine !== null);
47
- assert.ok(headingBlock, "Expected a block with a heading");
48
- assert.strictEqual(headingBlock.headingLine, "## Section Title");
49
- });
50
- });
51
- describe("cosine", () => {
52
- it("returns 1.0 for identical vectors", () => {
53
- const v = [1, 2, 3];
54
- assert.ok(Math.abs(cosine(v, v) - 1.0) < 0.001);
55
- });
56
- it("returns 0.0 for orthogonal vectors", () => {
57
- const a = [1, 0, 0];
58
- const b = [0, 1, 0];
59
- assert.ok(Math.abs(cosine(a, b)) < 0.001);
60
- });
61
- it("returns -1.0 for opposite vectors", () => {
62
- const a = [1, 0];
63
- const b = [-1, 0];
64
- assert.ok(Math.abs(cosine(a, b) - (-1.0)) < 0.001);
65
- });
66
- });
67
- describe("similarityCurve", () => {
68
- it("computes cosine between consecutive embeddings", () => {
69
- const embeddings = [[1, 0], [1, 0], [1, 0]];
70
- const curve = similarityCurve(embeddings);
71
- assert.strictEqual(curve.length, 2);
72
- assert.ok(Math.abs(curve[0] - 1.0) < 0.001);
73
- assert.ok(Math.abs(curve[1] - 1.0) < 0.001);
74
- });
75
- it("detects low similarity between different vectors", () => {
76
- const embeddings = [[1, 0], [0, 1], [1, 0]];
77
- const curve = similarityCurve(embeddings);
78
- assert.strictEqual(curve.length, 2);
79
- assert.ok(curve[0] < 0.1);
80
- assert.ok(curve[1] < 0.1);
81
- });
82
- });
83
- describe("valleyDepths", () => {
84
- it("finds deep valley between peaks", () => {
85
- const curve = [0.9, 0.8, 0.2, 0.85, 0.9];
86
- const depths = valleyDepths(curve);
87
- assert.strictEqual(depths.length, curve.length);
88
- const maxIdx = depths.indexOf(Math.max(...depths));
89
- assert.strictEqual(maxIdx, 2);
90
- });
91
- it("returns zeros for flat curve", () => {
92
- const curve = [0.8, 0.8, 0.8, 0.8];
93
- const depths = valleyDepths(curve);
94
- for (const d of depths) {
95
- assert.ok(Math.abs(d) < 0.001);
96
- }
97
- });
98
- });
99
- describe("selectBoundaries", () => {
100
- it("selects top N deepest valleys sorted by position", () => {
101
- const depths = [0, 0.5, 0.1, 0.8, 0];
102
- const boundaries = selectBoundaries(depths, 2);
103
- assert.deepStrictEqual(boundaries, [1, 3]);
104
- });
105
- it("never selects more than available positions", () => {
106
- const depths = [0.5, 0.3];
107
- const boundaries = selectBoundaries(depths, 10);
108
- assert.ok(boundaries.length <= 2);
109
- });
110
- it("skips zero-depth positions", () => {
111
- const depths = [0, 0, 0];
112
- const boundaries = selectBoundaries(depths, 5);
113
- assert.strictEqual(boundaries.length, 0);
114
- });
115
- });
116
- describe("snapToHeadings", () => {
117
- it("snaps boundary to nearby heading", () => {
118
- const blocks = [
119
- { text: "Intro text", paragraphs: ["Intro text"], headingLine: null },
120
- { text: "More intro", paragraphs: ["More intro"], headingLine: null },
121
- { text: "## New Topic\nContent", paragraphs: ["## New Topic\nContent"], headingLine: "## New Topic" },
122
- { text: "Topic content", paragraphs: ["Topic content"], headingLine: null },
123
- ];
124
- const snapped = snapToHeadings([1], blocks, 2);
125
- assert.deepStrictEqual(snapped, [2]);
126
- });
127
- it("converts curve index to block index when no heading nearby", () => {
128
- const blocks = [
129
- { text: "A", paragraphs: ["A"], headingLine: null },
130
- { text: "B", paragraphs: ["B"], headingLine: null },
131
- { text: "C", paragraphs: ["C"], headingLine: null },
132
- ];
133
- // Curve index 1 = gap between block 1 and 2 → new section starts at block 2
134
- const snapped = snapToHeadings([1], blocks, 2);
135
- assert.deepStrictEqual(snapped, [2]);
136
- });
137
- });
138
- describe("buildSections", () => {
139
- it("creates sections from blocks and boundaries", () => {
140
- const blocks = [
141
- { text: "First para. Second sentence here.", paragraphs: ["First para. Second sentence here."], headingLine: null },
142
- { text: "## Topic B\nContent of B.", paragraphs: ["## Topic B\nContent of B."], headingLine: "## Topic B" },
143
- { text: "More B content here.", paragraphs: ["More B content here."], headingLine: null },
144
- ];
145
- const sections = buildSections(blocks, [1]);
146
- assert.strictEqual(sections.length, 2);
147
- assert.strictEqual(sections[0].title, "First para.");
148
- assert.strictEqual(sections[1].title, "Topic B");
149
- assert.ok(sections[0].chunks.length >= 1);
150
- assert.ok(sections[1].chunks.length >= 1);
151
- });
152
- it("assigns sequential chunk IDs across sections", () => {
153
- const blocks = [
154
- { text: "A content.", paragraphs: ["A content."], headingLine: null },
155
- { text: "B content.", paragraphs: ["B content."], headingLine: null },
156
- ];
157
- const sections = buildSections(blocks, [1]);
158
- const allIds = sections.flatMap((s) => s.chunks.map((c) => c.id));
159
- const expected = allIds.map((_, i) => i);
160
- assert.deepStrictEqual(allIds, expected);
161
- });
162
- });
163
- // Mock embedder: deterministic vectors from text hash
164
- function mockEmbed(texts) {
165
- return Promise.resolve(texts.map((t) => {
166
- let hash = 0;
167
- for (let i = 0; i < t.length; i++)
168
- hash = ((hash << 5) - hash + t.charCodeAt(i)) | 0;
169
- return [
170
- Math.sin(hash),
171
- Math.cos(hash),
172
- Math.sin(hash * 2),
173
- Math.cos(hash * 3),
174
- ];
175
- }));
176
- }
177
- describe("chunkText", () => {
178
- it("returns single section for very short text", async () => {
179
- const sections = await chunkText("Short text.", mockEmbed);
180
- assert.strictEqual(sections.length, 1);
181
- assert.strictEqual(sections[0].chunks.length, 1);
182
- });
183
- it("produces multiple sections for multi-topic document", async () => {
184
- const topic1 = Array(10).fill("The financial quarterly earnings report shows strong revenue growth in the technology sector with cloud computing services leading the expansion.").join("\n\n");
185
- const topic2 = Array(10).fill("The recipe for chocolate cake requires flour sugar eggs butter cocoa powder baking soda vanilla extract and a pinch of salt mixed together carefully.").join("\n\n");
186
- const text = topic1 + "\n\n" + topic2;
187
- const sections = await chunkText(text, mockEmbed);
188
- assert.ok(sections.length >= 2, `Expected >=2 sections, got ${sections.length}`);
189
- });
190
- it("respects MAX_SECTIONS ceiling", async () => {
191
- const bigText = Array(200).fill("Paragraph content that is different each time number " + Math.random() + " to ensure variety.").join("\n\n");
192
- const sections = await chunkText(bigText, mockEmbed);
193
- assert.ok(sections.length <= 25, `Expected <=25 sections, got ${sections.length}`);
194
- });
195
- it("handles markdown with headings as tiebreakers", async () => {
196
- const text = [
197
- "# Introduction",
198
- "Welcome to the document. This covers many topics in great detail.",
199
- "",
200
- "Some introductory material about the background and context of this work.",
201
- "",
202
- "# Methods",
203
- "We used a comprehensive approach to analyze the data collected from various sources.",
204
- "",
205
- "Statistical methods included regression analysis and hypothesis testing.",
206
- ].join("\n");
207
- const sections = await chunkText(text, mockEmbed);
208
- assert.ok(sections.length >= 1);
209
- const titles = sections.map((s) => s.title);
210
- const hasIntro = titles.some((t) => t.includes("Introduction"));
211
- const hasMethods = titles.some((t) => t.includes("Methods"));
212
- assert.ok(hasIntro || hasMethods, `Expected heading-derived titles, got: ${titles.join(", ")}`);
213
- });
214
- it("all chunks have sequential IDs starting from 0", async () => {
215
- const text = Array(20).fill("Some paragraph content that is moderately long to ensure multiple blocks.").join("\n\n");
216
- const sections = await chunkText(text, mockEmbed);
217
- const allIds = sections.flatMap((s) => s.chunks.map((c) => c.id));
218
- for (let i = 0; i < allIds.length; i++) {
219
- assert.strictEqual(allIds[i], i, `Expected chunk ID ${i}, got ${allIds[i]}`);
220
- }
221
- });
222
- it("every chunk has a preview", async () => {
223
- const text = Array(15).fill("Content paragraph with enough text to be meaningful and create blocks.").join("\n\n");
224
- const sections = await chunkText(text, mockEmbed);
225
- for (const section of sections) {
226
- for (const chunk of section.chunks) {
227
- assert.ok(chunk.preview.length > 0, "Chunk preview must not be empty");
228
- assert.ok(chunk.preview.length <= 150, "Chunk preview must not exceed 150 chars");
229
- }
230
- }
231
- });
232
- });
233
- //# sourceMappingURL=semantic-chunker.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-chunker.test.js","sourceRoot":"","sources":["../../src/lib/semantic-chunker.test.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- /**
2
- * Cron script: graph-prune
3
- *
4
- * Daily Neo4j hygiene runner. Triggered by crontab at the configured local
5
- * hour (default 03:00). Reads ${configDir}/graph-prune.config.json for the
6
- * disable switch; reads ${configDir}/graph-prune-denylist.json for the
7
- * operator-curated bad-string list. All actual rule logic lives in
8
- * lib/graph-prune.ts so the on-demand graph-prune-run MCP tool exercises the
9
- * same code path.
10
- *
11
- * Exit codes are advisory only — cron does not surface them. The script logs
12
- * its outcome via [graph:prune:*] lines on stderr; logs-read ${configDir}/logs/graph-prune.log
13
- * is the canonical reader.
14
- *
15
- * PLATFORM_ROOT=... ACCOUNT_ID=... node dist/scripts/graph-prune.js
16
- */
17
- export {};
18
- //# sourceMappingURL=graph-prune.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"graph-prune.d.ts","sourceRoot":"","sources":["../../src/scripts/graph-prune.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}