@rubytech/create-maxy-code 0.1.64 → 0.1.65

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 (98) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/docs/references/admin-session.md +4 -2
  3. package/payload/platform/plugins/docs/references/internals.md +7 -1
  4. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/_helpers/emit-capture.d.ts +22 -0
  5. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/_helpers/emit-capture.d.ts.map +1 -0
  6. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/_helpers/emit-capture.js +44 -0
  7. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/_helpers/emit-capture.js.map +1 -0
  8. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights-emit.test.d.ts +2 -0
  9. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights-emit.test.d.ts.map +1 -0
  10. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights-emit.test.js +68 -0
  11. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights-emit.test.js.map +1 -0
  12. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-enrich-rejection-emit.test.d.ts +2 -0
  13. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-enrich-rejection-emit.test.d.ts.map +1 -0
  14. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-enrich-rejection-emit.test.js +48 -0
  15. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-enrich-rejection-emit.test.js.map +1 -0
  16. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.d.ts +2 -0
  17. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.d.ts.map +1 -0
  18. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.js +53 -0
  19. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.js.map +1 -0
  20. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/graph-prune-denylist-add-emit.test.d.ts +2 -0
  21. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/graph-prune-denylist-add-emit.test.d.ts.map +1 -0
  22. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/graph-prune-denylist-add-emit.test.js +40 -0
  23. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/graph-prune-denylist-add-emit.test.js.map +1 -0
  24. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/graph-prune-denylist-remove-emit.test.d.ts +2 -0
  25. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/graph-prune-denylist-remove-emit.test.d.ts.map +1 -0
  26. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/graph-prune-denylist-remove-emit.test.js +39 -0
  27. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/graph-prune-denylist-remove-emit.test.js.map +1 -0
  28. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write-emit.test.d.ts +2 -0
  29. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write-emit.test.d.ts.map +1 -0
  30. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write-emit.test.js +88 -0
  31. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write-emit.test.js.map +1 -0
  32. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-classify-emit.test.d.ts +2 -0
  33. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-classify-emit.test.d.ts.map +1 -0
  34. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-classify-emit.test.js +58 -0
  35. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-classify-emit.test.js.map +1 -0
  36. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-emit.test.d.ts +2 -0
  37. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-emit.test.d.ts.map +1 -0
  38. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-emit.test.js +58 -0
  39. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-emit.test.js.map +1 -0
  40. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-edit-attachment-emit.test.d.ts +2 -0
  41. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-edit-attachment-emit.test.d.ts.map +1 -0
  42. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-edit-attachment-emit.test.js +70 -0
  43. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-edit-attachment-emit.test.js.map +1 -0
  44. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-emit.test.d.ts +2 -0
  45. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-emit.test.d.ts.map +1 -0
  46. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-emit.test.js +48 -0
  47. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-emit.test.js.map +1 -0
  48. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-emit.test.d.ts +2 -0
  49. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-emit.test.d.ts.map +1 -0
  50. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-emit.test.js +74 -0
  51. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-emit.test.js.map +1 -0
  52. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-extract-emit.test.d.ts +2 -0
  53. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-extract-emit.test.d.ts.map +1 -0
  54. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-extract-emit.test.js +47 -0
  55. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-extract-emit.test.js.map +1 -0
  56. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-web-emit.test.d.ts +2 -0
  57. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-web-emit.test.d.ts.map +1 -0
  58. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-web-emit.test.js +65 -0
  59. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-web-emit.test.js.map +1 -0
  60. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex-emit.test.d.ts +2 -0
  61. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex-emit.test.d.ts.map +1 -0
  62. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex-emit.test.js +43 -0
  63. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex-emit.test.js.map +1 -0
  64. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-rename-attachment-emit.test.d.ts +2 -0
  65. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-rename-attachment-emit.test.d.ts.map +1 -0
  66. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-rename-attachment-emit.test.js +65 -0
  67. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-rename-attachment-emit.test.js.map +1 -0
  68. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-restore-emit.test.d.ts +2 -0
  69. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-restore-emit.test.d.ts.map +1 -0
  70. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-restore-emit.test.js +49 -0
  71. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-restore-emit.test.js.map +1 -0
  72. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-emit.test.d.ts +2 -0
  73. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-emit.test.d.ts.map +1 -0
  74. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-emit.test.js +74 -0
  75. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-emit.test.js.map +1 -0
  76. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-emit.test.d.ts +2 -0
  77. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-emit.test.d.ts.map +1 -0
  78. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-emit.test.js +74 -0
  79. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-emit.test.js.map +1 -0
  80. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-delete-emit.test.d.ts +2 -0
  81. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-delete-emit.test.d.ts.map +1 -0
  82. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-delete-emit.test.js +62 -0
  83. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-delete-emit.test.js.map +1 -0
  84. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-emit.test.d.ts +2 -0
  85. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-emit.test.d.ts.map +1 -0
  86. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-emit.test.js +76 -0
  87. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-emit.test.js.map +1 -0
  88. package/payload/platform/services/claude-session-manager/dist/index.js +75 -2
  89. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  90. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +8 -0
  91. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  92. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +14 -1
  93. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  94. package/payload/platform/services/claude-session-manager/dist/specialist-drift.d.ts +24 -4
  95. package/payload/platform/services/claude-session-manager/dist/specialist-drift.d.ts.map +1 -1
  96. package/payload/platform/services/claude-session-manager/dist/specialist-drift.js +39 -9
  97. package/payload/platform/services/claude-session-manager/dist/specialist-drift.js.map +1 -1
  98. package/payload/server/server-init.cjs +40 -0
@@ -0,0 +1,58 @@
1
+ // Task 168 — per-tool emit assertion for memory-classify.
2
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
3
+ import { setupEmitCapture } from "./_helpers/emit-capture.js";
4
+ vi.mock("../memory-ingest-extract.js", () => ({
5
+ extractCache: new Map(),
6
+ memoryIngestExtract: vi.fn(),
7
+ }));
8
+ vi.mock("../../lib/llm-classifier.js", () => ({
9
+ classifyDocument: vi.fn(),
10
+ }));
11
+ import { memoryClassify } from "../memory-classify.js";
12
+ import { extractCache } from "../memory-ingest-extract.js";
13
+ import { classifyDocument } from "../../lib/llm-classifier.js";
14
+ const liveSchemaSource = {
15
+ recognisedLabels: () => new Set(["UserProfile", "Position", "Education"]),
16
+ };
17
+ describe("memory-classify — emit wrapper wired", () => {
18
+ let emit;
19
+ beforeEach(() => {
20
+ emit = setupEmitCapture();
21
+ vi.mocked(classifyDocument).mockReset();
22
+ extractCache.clear();
23
+ });
24
+ afterEach(() => emit.restore());
25
+ it("emits result=ok line on happy path", async () => {
26
+ extractCache.set("att-1", { text: "doc body" });
27
+ vi.mocked(classifyDocument).mockResolvedValue({
28
+ sections: [],
29
+ documentEdges: [],
30
+ });
31
+ await memoryClassify({
32
+ accountId: "acct-1",
33
+ attachmentId: "att-1",
34
+ anchorDescription: "subject = UserProfile",
35
+ liveSchemaSource,
36
+ });
37
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
38
+ const body = emit.captures()[0];
39
+ expect(body.tag).toBe("mcp:memory");
40
+ expect(body.level).toBe("info");
41
+ expect(body.line).toContain("memory-classify");
42
+ expect(body.line).toContain("result=ok");
43
+ });
44
+ it("emits result=error line when cached extract is missing", async () => {
45
+ await expect(memoryClassify({
46
+ accountId: "acct-1",
47
+ attachmentId: "missing",
48
+ anchorDescription: "subject = UserProfile",
49
+ liveSchemaSource,
50
+ })).rejects.toThrow(/No cached extract/);
51
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
52
+ const body = emit.captures()[0];
53
+ expect(body.level).toBe("error");
54
+ expect(body.line).toContain("memory-classify");
55
+ expect(body.line).toContain("result=error");
56
+ });
57
+ });
58
+ //# sourceMappingURL=memory-classify-emit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-classify-emit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-classify-emit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-delete-emit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-delete-emit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-delete-emit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ // Task 168 — per-tool emit assertion for memory-delete.
2
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
3
+ import { setupEmitCapture, makeMockSession } from "./_helpers/emit-capture.js";
4
+ const mockSession = makeMockSession();
5
+ vi.mock("../../lib/neo4j.js", () => ({
6
+ getSession: () => mockSession,
7
+ }));
8
+ vi.mock("../../../../../../lib/graph-trash/dist/index.js", () => ({
9
+ trashNode: vi.fn(),
10
+ }));
11
+ vi.mock("../../lib/filter-token.js", () => ({
12
+ verifyFilterToken: vi.fn(),
13
+ filterTokenFingerprint: () => "fp",
14
+ }));
15
+ vi.mock("../memory-find-candidates.js", () => ({
16
+ reverifyCandidate: vi.fn(),
17
+ }));
18
+ import { memoryDelete } from "../memory-delete.js";
19
+ import { trashNode } from "../../../../../../lib/graph-trash/dist/index.js";
20
+ import { verifyFilterToken } from "../../lib/filter-token.js";
21
+ describe("memory-delete — emit wrapper wired", () => {
22
+ let emit;
23
+ beforeEach(() => {
24
+ emit = setupEmitCapture();
25
+ vi.mocked(trashNode).mockReset();
26
+ vi.mocked(verifyFilterToken).mockReset();
27
+ mockSession.run.mockReset();
28
+ });
29
+ afterEach(() => emit.restore());
30
+ it("emits result=ok line on happy path (no filter token)", async () => {
31
+ vi.mocked(trashNode).mockResolvedValue({
32
+ trashed: true,
33
+ alreadyTrashed: false,
34
+ nodeId: "4:eid:1",
35
+ labels: ["Person"],
36
+ trashedAt: "2026-05-19T00:00:00Z",
37
+ originalKeys: {},
38
+ });
39
+ await memoryDelete({ accountId: "acct-1", elementId: "4:eid:1" });
40
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
41
+ const body = emit.captures()[0];
42
+ expect(body.tag).toBe("mcp:memory");
43
+ expect(body.level).toBe("info");
44
+ expect(body.line).toContain("memory-delete");
45
+ expect(body.line).toContain("result=ok");
46
+ });
47
+ it("emits result=error line when trashNode throws", async () => {
48
+ vi.mocked(trashNode).mockRejectedValue(new Error("Node not found or not owned by this account (ID: 4:eid:1)."));
49
+ await expect(memoryDelete({ accountId: "acct-1", elementId: "4:eid:1" })).rejects.toThrow(/not found/);
50
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
51
+ const body = emit.captures()[0];
52
+ expect(body.level).toBe("error");
53
+ expect(body.line).toContain("memory-delete");
54
+ expect(body.line).toContain("result=error");
55
+ expect(body.line).toContain("reason=invalid-input");
56
+ });
57
+ });
58
+ //# sourceMappingURL=memory-delete-emit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-delete-emit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-delete-emit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-edit-attachment-emit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-edit-attachment-emit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-edit-attachment-emit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ // Task 168 — per-tool emit assertion for memory-edit-attachment.
2
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
3
+ import { setupEmitCapture } from "./_helpers/emit-capture.js";
4
+ vi.mock("../../lib/attachments.js", () => ({
5
+ assertUUID: vi.fn(),
6
+ readMeta: vi.fn(),
7
+ findDataFile: vi.fn(),
8
+ attachmentDir: () => "/tmp/task-168-stub",
9
+ }));
10
+ vi.mock("../memory-ingest-extract.js", () => ({
11
+ memoryIngestExtract: vi.fn().mockResolvedValue({
12
+ text: "stub",
13
+ filename: "stub.md",
14
+ cached: true,
15
+ }),
16
+ }));
17
+ vi.mock("node:fs/promises", async () => {
18
+ const actual = await vi.importActual("node:fs/promises");
19
+ return {
20
+ ...actual,
21
+ writeFile: vi.fn().mockResolvedValue(undefined),
22
+ stat: vi.fn().mockResolvedValue({ size: 10 }),
23
+ };
24
+ });
25
+ import { memoryEditAttachment } from "../memory-edit-attachment.js";
26
+ import { readMeta, findDataFile } from "../../lib/attachments.js";
27
+ describe("memory-edit-attachment — emit wrapper wired", () => {
28
+ let emit;
29
+ beforeEach(() => {
30
+ emit = setupEmitCapture();
31
+ vi.mocked(readMeta).mockReset();
32
+ vi.mocked(findDataFile).mockReset();
33
+ });
34
+ afterEach(() => emit.restore());
35
+ it("emits result=ok line on happy path", async () => {
36
+ vi.mocked(readMeta).mockResolvedValue({
37
+ filename: "doc.md",
38
+ mimeType: "text/markdown",
39
+ attachmentId: "00000000-0000-0000-0000-000000000001",
40
+ sizeBytes: 0,
41
+ uploadedAt: "2026-01-01T00:00:00Z",
42
+ });
43
+ vi.mocked(findDataFile).mockResolvedValue("/tmp/task-168-stub/data.md");
44
+ await memoryEditAttachment({
45
+ accountId: "acct-1",
46
+ attachmentId: "00000000-0000-0000-0000-000000000001",
47
+ content: "new content",
48
+ });
49
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
50
+ const body = emit.captures()[0];
51
+ expect(body.tag).toBe("mcp:memory");
52
+ expect(body.level).toBe("info");
53
+ expect(body.line).toContain("memory-edit-attachment");
54
+ expect(body.line).toContain("result=ok");
55
+ });
56
+ it("emits result=error line when readMeta returns null (attachment not found)", async () => {
57
+ vi.mocked(readMeta).mockResolvedValue(null);
58
+ await expect(memoryEditAttachment({
59
+ accountId: "acct-1",
60
+ attachmentId: "00000000-0000-0000-0000-000000000001",
61
+ content: "new",
62
+ })).rejects.toThrow(/not found/);
63
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
64
+ const body = emit.captures()[0];
65
+ expect(body.level).toBe("error");
66
+ expect(body.line).toContain("memory-edit-attachment");
67
+ expect(body.line).toContain("result=error");
68
+ });
69
+ });
70
+ //# sourceMappingURL=memory-edit-attachment-emit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-edit-attachment-emit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-edit-attachment-emit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-empty-trash-emit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-empty-trash-emit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-empty-trash-emit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ // Task 168 — per-tool emit assertion for memory-empty-trash.
2
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
3
+ import { setupEmitCapture, makeMockSession } from "./_helpers/emit-capture.js";
4
+ const mockSession = makeMockSession();
5
+ vi.mock("../../lib/neo4j.js", () => ({
6
+ getSession: () => mockSession,
7
+ }));
8
+ vi.mock("../../../../../../lib/graph-trash/dist/index.js", () => ({
9
+ emptyTrash: vi.fn(),
10
+ }));
11
+ vi.mock("../../lib/attachments.js", () => ({
12
+ removeAttachmentDir: vi.fn().mockResolvedValue(undefined),
13
+ }));
14
+ import { memoryEmptyTrash } from "../memory-empty-trash.js";
15
+ import { emptyTrash } from "../../../../../../lib/graph-trash/dist/index.js";
16
+ describe("memory-empty-trash — emit wrapper wired", () => {
17
+ let emit;
18
+ beforeEach(() => {
19
+ emit = setupEmitCapture();
20
+ vi.mocked(emptyTrash).mockReset();
21
+ });
22
+ afterEach(() => emit.restore());
23
+ it("emits result=ok line on happy path", async () => {
24
+ vi.mocked(emptyTrash).mockResolvedValue({
25
+ graceDays: 30,
26
+ dryRun: false,
27
+ candidates: [],
28
+ emptied: 0,
29
+ });
30
+ await memoryEmptyTrash({ accountId: "acct-1" });
31
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
32
+ const body = emit.captures()[0];
33
+ expect(body.tag).toBe("mcp:memory");
34
+ expect(body.level).toBe("info");
35
+ expect(body.line).toContain("memory-empty-trash");
36
+ expect(body.line).toContain("result=ok");
37
+ });
38
+ it("emits result=error line when emptyTrash throws", async () => {
39
+ vi.mocked(emptyTrash).mockRejectedValue(new Error("session expired"));
40
+ await expect(memoryEmptyTrash({ accountId: "acct-1" })).rejects.toThrow(/session expired/);
41
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
42
+ const body = emit.captures()[0];
43
+ expect(body.level).toBe("error");
44
+ expect(body.line).toContain("memory-empty-trash");
45
+ expect(body.line).toContain("result=error");
46
+ });
47
+ });
48
+ //# sourceMappingURL=memory-empty-trash-emit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-empty-trash-emit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-empty-trash-emit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-ingest-emit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-ingest-emit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-ingest-emit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ // Task 168 — per-tool emit assertion for memory-ingest.
2
+ //
3
+ // Happy-path stub would require unraveling document-hierarchy, embeddings,
4
+ // llm-classifier, graph-trash, and the entire section-write cypher batch —
5
+ // out of proportion with the brief's "minimal new test file" guidance. The
6
+ // error path is sufficient to verify the wrapper-is-wired contract per the
7
+ // brief's drop-wrapper experiment, plus a no-deep-deps happy path via the
8
+ // ConversationArchive branch is verified by the existing memory-ingest
9
+ // behaviour tests (content gates in memory-ingest.test.ts).
10
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
11
+ import { setupEmitCapture, makeMockSession } from "./_helpers/emit-capture.js";
12
+ const mockSession = makeMockSession();
13
+ vi.mock("../../lib/neo4j.js", () => ({
14
+ getSession: () => mockSession,
15
+ }));
16
+ vi.mock("../../lib/embeddings.js", () => ({
17
+ embed: vi.fn(),
18
+ embedBatch: vi.fn(),
19
+ }));
20
+ vi.mock("../memory-ingest-extract.js", () => ({
21
+ extractCache: new Map(),
22
+ memoryIngestExtract: vi.fn(),
23
+ }));
24
+ vi.mock("../../lib/document-hierarchy.js", () => ({
25
+ deleteDocumentChildren: vi.fn(),
26
+ }));
27
+ vi.mock("../../../../../../lib/graph-trash/dist/index.js", () => ({
28
+ restoreNode: vi.fn(),
29
+ }));
30
+ import { memoryIngest } from "../memory-ingest.js";
31
+ describe("memory-ingest — emit wrapper wired", () => {
32
+ let emit;
33
+ beforeEach(() => {
34
+ emit = setupEmitCapture();
35
+ mockSession.run.mockReset();
36
+ });
37
+ afterEach(() => emit.restore());
38
+ it("emits result=error reason=invalid-input on missing scope", async () => {
39
+ await expect(memoryIngest({
40
+ accountId: "acct-1",
41
+ attachmentId: "att-1",
42
+ documentSummary: "doc",
43
+ anchorNodeId: "4:anchor:1",
44
+ anchorLabel: "UserProfile",
45
+ sections: [],
46
+ scope: "",
47
+ })).rejects.toThrow(/scope is required/);
48
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
49
+ const body = emit.captures()[0];
50
+ expect(body.tag).toBe("mcp:memory");
51
+ expect(body.level).toBe("error");
52
+ expect(body.line).toContain("memory-ingest");
53
+ expect(body.line).toContain("result=error");
54
+ expect(body.line).toContain("reason=invalid-input");
55
+ });
56
+ it("emits result=error on missing anchorNodeId (invalid-input via 'is required')", async () => {
57
+ await expect(memoryIngest({
58
+ accountId: "acct-1",
59
+ attachmentId: "att-1",
60
+ documentSummary: "doc",
61
+ anchorNodeId: "",
62
+ anchorLabel: "UserProfile",
63
+ sections: [],
64
+ scope: "shared",
65
+ })).rejects.toThrow(/anchorNodeId is required/);
66
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
67
+ const body = emit.captures()[0];
68
+ expect(body.level).toBe("error");
69
+ expect(body.line).toContain("memory-ingest");
70
+ expect(body.line).toContain("result=error");
71
+ expect(body.line).toContain("reason=invalid-input");
72
+ });
73
+ });
74
+ //# sourceMappingURL=memory-ingest-emit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-ingest-emit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-ingest-emit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-ingest-extract-emit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-ingest-extract-emit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-ingest-extract-emit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ // Task 168 — per-tool emit assertion for memory-ingest-extract.
2
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
3
+ import { setupEmitCapture } from "./_helpers/emit-capture.js";
4
+ vi.mock("node:fs/promises", async () => {
5
+ const actual = await vi.importActual("node:fs/promises");
6
+ return {
7
+ ...actual,
8
+ readFile: vi.fn().mockResolvedValue("hello world\n"),
9
+ stat: vi.fn().mockResolvedValue({ size: 12 }),
10
+ };
11
+ });
12
+ import { memoryIngestExtract } from "../memory-ingest-extract.js";
13
+ describe("memory-ingest-extract — emit wrapper wired", () => {
14
+ let emit;
15
+ beforeEach(() => {
16
+ emit = setupEmitCapture();
17
+ });
18
+ afterEach(() => emit.restore());
19
+ it("emits result=ok line on happy path (text/plain)", async () => {
20
+ await memoryIngestExtract({
21
+ storagePath: "/tmp/task-168/stub.txt",
22
+ filename: "stub.txt",
23
+ mimeType: "text/plain",
24
+ attachmentId: "00000000-0000-0000-0000-000000000001",
25
+ });
26
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
27
+ const body = emit.captures()[0];
28
+ expect(body.tag).toBe("mcp:memory");
29
+ expect(body.level).toBe("info");
30
+ expect(body.line).toContain("memory-ingest-extract");
31
+ expect(body.line).toContain("result=ok");
32
+ });
33
+ it("emits result=error line when attachmentId is missing (invalid-input)", async () => {
34
+ await expect(memoryIngestExtract({
35
+ storagePath: "/tmp/task-168/stub.txt",
36
+ filename: "stub.txt",
37
+ mimeType: "text/plain",
38
+ attachmentId: "",
39
+ })).rejects.toThrow(/requires attachmentId/);
40
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
41
+ const body = emit.captures()[0];
42
+ expect(body.level).toBe("error");
43
+ expect(body.line).toContain("memory-ingest-extract");
44
+ expect(body.line).toContain("result=error");
45
+ });
46
+ });
47
+ //# sourceMappingURL=memory-ingest-extract-emit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-ingest-extract-emit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-ingest-extract-emit.test.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;IACrC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAoC,kBAAkB,CAAC,CAAC;IAC5F,OAAO;QACL,GAAG,MAAM;QACT,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,eAAe,CAAC;QACpD,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,IAAI,IAAyC,CAAC;IAC9C,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAEhC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,mBAAmB,CAAC;YACxB,WAAW,EAAE,wBAAwB;YACrC,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,YAAY;YACtB,YAAY,EAAE,sCAAsC;SACrD,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,MAAM,CACV,mBAAmB,CAAC;YAClB,WAAW,EAAE,wBAAwB;YACrC,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,YAAY;YACtB,YAAY,EAAE,EAAE;SACjB,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-ingest-web-emit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-ingest-web-emit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-ingest-web-emit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ // Task 168 — per-tool emit assertion for memory-ingest-web.
2
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
3
+ import { setupEmitCapture, makeMockSession } from "./_helpers/emit-capture.js";
4
+ const mockSession = makeMockSession();
5
+ vi.mock("../../lib/neo4j.js", () => ({
6
+ getSession: () => mockSession,
7
+ }));
8
+ vi.mock("../memory-ingest-extract.js", () => ({
9
+ memoryIngestExtract: vi.fn(),
10
+ extractCache: new Map(),
11
+ }));
12
+ vi.mock("node:fs/promises", async () => {
13
+ const actual = await vi.importActual("node:fs/promises");
14
+ return {
15
+ ...actual,
16
+ writeFile: vi.fn().mockResolvedValue(undefined),
17
+ unlink: vi.fn().mockResolvedValue(undefined),
18
+ };
19
+ });
20
+ import { memoryIngestWeb } from "../memory-ingest-web.js";
21
+ import { memoryIngestExtract } from "../memory-ingest-extract.js";
22
+ describe("memory-ingest-web — emit wrapper wired", () => {
23
+ let emit;
24
+ beforeEach(() => {
25
+ emit = setupEmitCapture();
26
+ mockSession.run.mockReset();
27
+ vi.mocked(memoryIngestExtract).mockReset();
28
+ });
29
+ afterEach(() => emit.restore());
30
+ it("emits result=ok line on happy path", async () => {
31
+ // checkExistingDocument: no record.
32
+ mockSession.run.mockResolvedValue({ records: [] });
33
+ vi.mocked(memoryIngestExtract).mockResolvedValue({
34
+ filename: "Page Title",
35
+ mimeType: "text/markdown",
36
+ sizeBytes: 10,
37
+ textLength: 10,
38
+ preview: "hello",
39
+ });
40
+ await memoryIngestWeb({
41
+ accountId: "acct-1",
42
+ url: "https://example.com/page",
43
+ content: "# Page Title\n\nbody",
44
+ });
45
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
46
+ const body = emit.captures()[0];
47
+ expect(body.tag).toBe("mcp:memory");
48
+ expect(body.level).toBe("info");
49
+ expect(body.line).toContain("memory-ingest-web");
50
+ expect(body.line).toContain("result=ok");
51
+ });
52
+ it("emits result=error line on empty content (invalid-input via guidance message)", async () => {
53
+ await expect(memoryIngestWeb({
54
+ accountId: "acct-1",
55
+ url: "https://example.com/page",
56
+ content: " ",
57
+ })).rejects.toThrow(/empty/);
58
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
59
+ const body = emit.captures()[0];
60
+ expect(body.level).toBe("error");
61
+ expect(body.line).toContain("memory-ingest-web");
62
+ expect(body.line).toContain("result=error");
63
+ });
64
+ });
65
+ //# sourceMappingURL=memory-ingest-web-emit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-ingest-web-emit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-ingest-web-emit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-reindex-emit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-reindex-emit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-reindex-emit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ // Task 168 — per-tool emit assertion for memory-reindex.
2
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
3
+ import { setupEmitCapture, makeMockSession } from "./_helpers/emit-capture.js";
4
+ const mockSession = makeMockSession();
5
+ vi.mock("../../lib/neo4j.js", () => ({
6
+ getSession: () => mockSession,
7
+ }));
8
+ vi.mock("../../lib/embeddings.js", () => ({
9
+ embedBatch: vi.fn().mockResolvedValue([]),
10
+ }));
11
+ import { memoryReindex } from "../memory-reindex.js";
12
+ describe("memory-reindex — emit wrapper wired", () => {
13
+ let emit;
14
+ beforeEach(() => {
15
+ emit = setupEmitCapture();
16
+ mockSession.run.mockReset();
17
+ mockSession.close.mockReset();
18
+ });
19
+ afterEach(() => emit.restore());
20
+ it("emits result=ok line on happy path (all nodes have embeddings)", async () => {
21
+ // First call: count returns total=0, tool returns early.
22
+ mockSession.run.mockResolvedValueOnce({
23
+ records: [{ get: () => ({ toNumber: () => 0 }) }],
24
+ });
25
+ await memoryReindex("acct-1");
26
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
27
+ const body = emit.captures()[0];
28
+ expect(body.tag).toBe("mcp:memory");
29
+ expect(body.level).toBe("info");
30
+ expect(body.line).toContain("memory-reindex");
31
+ expect(body.line).toContain("result=ok");
32
+ });
33
+ it("emits result=error line when session.run throws", async () => {
34
+ mockSession.run.mockRejectedValue(new Error("driver disconnected"));
35
+ await expect(memoryReindex("acct-1")).rejects.toThrow(/driver disconnected/);
36
+ expect(emit.fetchSpy).toHaveBeenCalledTimes(1);
37
+ const body = emit.captures()[0];
38
+ expect(body.level).toBe("error");
39
+ expect(body.line).toContain("memory-reindex");
40
+ expect(body.line).toContain("result=error");
41
+ });
42
+ });
43
+ //# sourceMappingURL=memory-reindex-emit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-reindex-emit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-reindex-emit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-rename-attachment-emit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-rename-attachment-emit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/memory-rename-attachment-emit.test.ts"],"names":[],"mappings":""}