@vheins/local-memory-mcp 0.4.8 → 0.4.11

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 (164) hide show
  1. package/dist/capabilities.d.ts +7 -7
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +7 -7
  4. package/dist/capabilities.js.map +1 -1
  5. package/dist/completion.d.ts +25 -0
  6. package/dist/completion.d.ts.map +1 -0
  7. package/dist/completion.js +127 -0
  8. package/dist/completion.js.map +1 -0
  9. package/dist/mcp/client.d.ts.map +1 -1
  10. package/dist/mcp/client.js +8 -1
  11. package/dist/mcp/client.js.map +1 -1
  12. package/dist/mcp/elicitation.d.ts +24 -0
  13. package/dist/mcp/elicitation.d.ts.map +1 -0
  14. package/dist/mcp/elicitation.js +13 -0
  15. package/dist/mcp/elicitation.js.map +1 -0
  16. package/dist/mcp/sampling.d.ts +69 -0
  17. package/dist/mcp/sampling.d.ts.map +1 -0
  18. package/dist/mcp/sampling.js +13 -0
  19. package/dist/mcp/sampling.js.map +1 -0
  20. package/dist/mcp/session.d.ts +28 -0
  21. package/dist/mcp/session.d.ts.map +1 -0
  22. package/dist/mcp/session.js +106 -0
  23. package/dist/mcp/session.js.map +1 -0
  24. package/dist/prompts/registry.d.ts +55 -0
  25. package/dist/prompts/registry.d.ts.map +1 -1
  26. package/dist/prompts/registry.js +455 -7
  27. package/dist/prompts/registry.js.map +1 -1
  28. package/dist/resources/index.d.ts +55 -4
  29. package/dist/resources/index.d.ts.map +1 -1
  30. package/dist/resources/index.js +222 -52
  31. package/dist/resources/index.js.map +1 -1
  32. package/dist/router.d.ts +11 -1
  33. package/dist/router.d.ts.map +1 -1
  34. package/dist/router.js +151 -34
  35. package/dist/router.js.map +1 -1
  36. package/dist/server.js +212 -13
  37. package/dist/server.js.map +1 -1
  38. package/dist/tests/client.test.d.ts +2 -0
  39. package/dist/tests/client.test.d.ts.map +1 -0
  40. package/dist/tests/client.test.js +130 -0
  41. package/dist/tests/client.test.js.map +1 -0
  42. package/dist/tests/dashboard.test.d.ts +2 -0
  43. package/dist/tests/dashboard.test.d.ts.map +1 -0
  44. package/dist/tests/dashboard.test.js +370 -0
  45. package/dist/tests/dashboard.test.js.map +1 -0
  46. package/dist/tests/e2e.test.d.ts +2 -0
  47. package/dist/tests/e2e.test.d.ts.map +1 -0
  48. package/dist/tests/e2e.test.js +250 -0
  49. package/dist/tests/e2e.test.js.map +1 -0
  50. package/dist/tests/index.test.d.ts +2 -0
  51. package/dist/tests/index.test.d.ts.map +1 -0
  52. package/dist/tests/index.test.js +185 -0
  53. package/dist/tests/index.test.js.map +1 -0
  54. package/dist/tests/logger.test.d.ts +2 -0
  55. package/dist/tests/logger.test.d.ts.map +1 -0
  56. package/dist/tests/logger.test.js +104 -0
  57. package/dist/tests/logger.test.js.map +1 -0
  58. package/dist/tests/memory.bulk.test.d.ts +2 -0
  59. package/dist/tests/memory.bulk.test.d.ts.map +1 -0
  60. package/dist/tests/memory.bulk.test.js +52 -0
  61. package/dist/tests/memory.bulk.test.js.map +1 -0
  62. package/dist/tests/memory.search.test.d.ts +2 -0
  63. package/dist/tests/memory.search.test.d.ts.map +1 -0
  64. package/dist/tests/memory.search.test.js +181 -0
  65. package/dist/tests/memory.search.test.js.map +1 -0
  66. package/dist/tests/normalize.test.d.ts +2 -0
  67. package/dist/tests/normalize.test.d.ts.map +1 -0
  68. package/dist/tests/normalize.test.js +181 -0
  69. package/dist/tests/normalize.test.js.map +1 -0
  70. package/dist/tests/query-expander.test.d.ts +2 -0
  71. package/dist/tests/query-expander.test.d.ts.map +1 -0
  72. package/dist/tests/query-expander.test.js +33 -0
  73. package/dist/tests/query-expander.test.js.map +1 -0
  74. package/dist/tests/router.test.d.ts +2 -0
  75. package/dist/tests/router.test.d.ts.map +1 -0
  76. package/dist/tests/router.test.js +470 -0
  77. package/dist/tests/router.test.js.map +1 -0
  78. package/dist/tests/sqlite.test.d.ts +2 -0
  79. package/dist/tests/sqlite.test.d.ts.map +1 -0
  80. package/dist/tests/sqlite.test.js +367 -0
  81. package/dist/tests/sqlite.test.js.map +1 -0
  82. package/dist/tests/tasks-search.test.d.ts +2 -0
  83. package/dist/tests/tasks-search.test.d.ts.map +1 -0
  84. package/dist/tests/tasks-search.test.js +154 -0
  85. package/dist/tests/tasks-search.test.js.map +1 -0
  86. package/dist/tests/tasks-transition.test.d.ts +2 -0
  87. package/dist/tests/tasks-transition.test.d.ts.map +1 -0
  88. package/dist/tests/tasks-transition.test.js +174 -0
  89. package/dist/tests/tasks-transition.test.js.map +1 -0
  90. package/dist/tests/tasks.bulk.test.d.ts +2 -0
  91. package/dist/tests/tasks.bulk.test.d.ts.map +1 -0
  92. package/dist/tests/tasks.bulk.test.js +254 -0
  93. package/dist/tests/tasks.bulk.test.js.map +1 -0
  94. package/dist/tests/tasks.e2e.test.d.ts +2 -0
  95. package/dist/tests/tasks.e2e.test.d.ts.map +1 -0
  96. package/dist/tests/tasks.e2e.test.js +289 -0
  97. package/dist/tests/tasks.e2e.test.js.map +1 -0
  98. package/dist/tests/tasks.pending-limit-refined.test.d.ts +2 -0
  99. package/dist/tests/tasks.pending-limit-refined.test.d.ts.map +1 -0
  100. package/dist/tests/tasks.pending-limit-refined.test.js +72 -0
  101. package/dist/tests/tasks.pending-limit-refined.test.js.map +1 -0
  102. package/dist/tests/v2-features.test.d.ts +2 -0
  103. package/dist/tests/v2-features.test.d.ts.map +1 -0
  104. package/dist/tests/v2-features.test.js +209 -0
  105. package/dist/tests/v2-features.test.js.map +1 -0
  106. package/dist/tools/memory.bulk-delete.d.ts +1 -7
  107. package/dist/tools/memory.bulk-delete.d.ts.map +1 -1
  108. package/dist/tools/memory.bulk-delete.js +30 -8
  109. package/dist/tools/memory.bulk-delete.js.map +1 -1
  110. package/dist/tools/memory.delete.d.ts.map +1 -1
  111. package/dist/tools/memory.delete.js +18 -1
  112. package/dist/tools/memory.delete.js.map +1 -1
  113. package/dist/tools/memory.recap.d.ts.map +1 -1
  114. package/dist/tools/memory.recap.js +24 -1
  115. package/dist/tools/memory.recap.js.map +1 -1
  116. package/dist/tools/memory.search.d.ts.map +1 -1
  117. package/dist/tools/memory.search.js +16 -1
  118. package/dist/tools/memory.search.js.map +1 -1
  119. package/dist/tools/memory.store.d.ts.map +1 -1
  120. package/dist/tools/memory.store.js +31 -1
  121. package/dist/tools/memory.store.js.map +1 -1
  122. package/dist/tools/memory.summarize.d.ts.map +1 -1
  123. package/dist/tools/memory.summarize.js +19 -1
  124. package/dist/tools/memory.summarize.js.map +1 -1
  125. package/dist/tools/memory.synthesize.d.ts +14 -0
  126. package/dist/tools/memory.synthesize.d.ts.map +1 -0
  127. package/dist/tools/memory.synthesize.js +228 -0
  128. package/dist/tools/memory.synthesize.js.map +1 -0
  129. package/dist/tools/memory.update.d.ts.map +1 -1
  130. package/dist/tools/memory.update.js +19 -1
  131. package/dist/tools/memory.update.js.map +1 -1
  132. package/dist/tools/schemas.d.ts +1750 -263
  133. package/dist/tools/schemas.d.ts.map +1 -1
  134. package/dist/tools/schemas.js +482 -14
  135. package/dist/tools/schemas.js.map +1 -1
  136. package/dist/tools/task.bulk-manage.d.ts +1 -7
  137. package/dist/tools/task.bulk-manage.d.ts.map +1 -1
  138. package/dist/tools/task.bulk-manage.js +60 -15
  139. package/dist/tools/task.bulk-manage.js.map +1 -1
  140. package/dist/tools/task.manage.d.ts +12 -28
  141. package/dist/tools/task.manage.d.ts.map +1 -1
  142. package/dist/tools/task.manage.js +198 -31
  143. package/dist/tools/task.manage.js.map +1 -1
  144. package/dist/utils/completion.d.ts +2 -0
  145. package/dist/utils/completion.d.ts.map +1 -0
  146. package/dist/utils/completion.js +28 -0
  147. package/dist/utils/completion.js.map +1 -0
  148. package/dist/utils/logger.d.ts +18 -0
  149. package/dist/utils/logger.d.ts.map +1 -1
  150. package/dist/utils/logger.js +101 -29
  151. package/dist/utils/logger.js.map +1 -1
  152. package/dist/utils/mcp-response.d.ts +50 -0
  153. package/dist/utils/mcp-response.d.ts.map +1 -1
  154. package/dist/utils/mcp-response.js +54 -7
  155. package/dist/utils/mcp-response.js.map +1 -1
  156. package/dist/utils/normalize.d.ts +5 -0
  157. package/dist/utils/normalize.d.ts.map +1 -1
  158. package/dist/utils/normalize.js +11 -0
  159. package/dist/utils/normalize.js.map +1 -1
  160. package/dist/utils/pagination.d.ts +6 -0
  161. package/dist/utils/pagination.d.ts.map +1 -0
  162. package/dist/utils/pagination.js +32 -0
  163. package/dist/utils/pagination.js.map +1 -0
  164. package/package.json +1 -1
@@ -0,0 +1,289 @@
1
+ import { describe, it, expect, beforeEach } from "vitest";
2
+ import { createRouter } from "../router.js";
3
+ import { SQLiteStore } from "../storage/sqlite.js";
4
+ import { StubVectorStore } from "../storage/vectors.stub.js";
5
+ describe("MCP Local Memory - Task Management Workflow E2E", () => {
6
+ let db;
7
+ let vectors;
8
+ let router;
9
+ const REPO = "workflow-test-repo";
10
+ beforeEach(() => {
11
+ db = new SQLiteStore(":memory:");
12
+ vectors = new StubVectorStore(db);
13
+ router = createRouter(db, vectors);
14
+ });
15
+ it("should follow the complete task management lifecycle: Plan -> Execute -> Verify", async () => {
16
+ // ---- 1. INITIAL CHECK ----
17
+ const initialRes = await router("resources/read", {
18
+ uri: `tasks://current?repo=${REPO}`
19
+ });
20
+ const initialTasks = JSON.parse(initialRes.contents[0].text);
21
+ expect(initialTasks.length).toBe(0);
22
+ // ---- 2. PLANNING PHASE ----
23
+ const taskARes = await router("tools/call", {
24
+ name: "task-create",
25
+ arguments: {
26
+ repo: REPO,
27
+ task_code: "TASK-001",
28
+ phase: "research",
29
+ title: "Research Architecture",
30
+ description: "Analyze the current system architecture and propose changes",
31
+ status: "pending",
32
+ priority: 5,
33
+ est_tokens: 120
34
+ }
35
+ });
36
+ const taskAId = db.getTasksByRepo(REPO)[0].id;
37
+ const taskBRes = await router("tools/call", {
38
+ name: "task-create",
39
+ arguments: {
40
+ repo: REPO,
41
+ task_code: "TASK-002",
42
+ phase: "implementation",
43
+ title: "Implement Core Logic",
44
+ description: "Write the core implementation based on research",
45
+ status: "backlog",
46
+ depends_on: taskAId,
47
+ priority: 4,
48
+ est_tokens: 240
49
+ }
50
+ });
51
+ const taskBId = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-002").id;
52
+ // Verify both are pending
53
+ const plannedRes = await router("resources/read", { uri: `tasks://current?repo=${REPO}` });
54
+ const plannedTasks = JSON.parse(plannedRes.contents[0].text);
55
+ expect(plannedTasks.length).toBe(2);
56
+ // Verify task-list tool works
57
+ const listToolRes = await router("tools/call", {
58
+ name: "task-list",
59
+ arguments: { repo: REPO }
60
+ });
61
+ const listToolTasks = JSON.parse(listToolRes.content[0].text);
62
+ expect(listToolTasks.length).toBe(2);
63
+ // ---- 3. EXECUTION PHASE ----
64
+ await router("tools/call", {
65
+ name: "task-update",
66
+ arguments: {
67
+ repo: REPO,
68
+ id: taskAId,
69
+ status: "in_progress",
70
+ comment: "Started architecture review",
71
+ agent: "Agent A",
72
+ role: "backend",
73
+ model: "gpt-5.4",
74
+ est_tokens: 180
75
+ }
76
+ });
77
+ const inProgressRes = await router("resources/read", { uri: `tasks://current?repo=${REPO}` });
78
+ const inProgressTasks = JSON.parse(inProgressRes.contents[0].text);
79
+ expect(inProgressTasks.find((t) => t.id === taskAId).status).toBe("in_progress");
80
+ // ---- 4. VALIDATION PHASE (Task A) ----
81
+ await router("tools/call", {
82
+ name: "task-update",
83
+ arguments: {
84
+ repo: REPO,
85
+ id: taskAId,
86
+ status: "completed",
87
+ comment: "Architecture review finished and documented",
88
+ agent: "Agent A",
89
+ role: "backend",
90
+ model: "gpt-5.4",
91
+ est_tokens: 180
92
+ }
93
+ });
94
+ const afterARes = await router("resources/read", { uri: `tasks://current?repo=${REPO}` });
95
+ const afterATasks = JSON.parse(afterARes.contents[0].text);
96
+ expect(afterATasks.length).toBe(1);
97
+ expect(afterATasks[0].id).toBe(taskBId);
98
+ // ---- 5. RESUME WORKFLOW (Task B) ----
99
+ await router("tools/call", {
100
+ name: "task-update",
101
+ arguments: {
102
+ repo: REPO,
103
+ id: taskBId,
104
+ status: "in_progress",
105
+ comment: "Implementation started after dependency was cleared",
106
+ agent: "Agent B",
107
+ role: "frontend",
108
+ model: "gpt-5.4-mini",
109
+ est_tokens: 320
110
+ }
111
+ });
112
+ const finalCheckRes = await router("resources/read", { uri: `tasks://current?repo=${REPO}` });
113
+ const finalCheckTasks = JSON.parse(finalCheckRes.contents[0].text);
114
+ expect(finalCheckTasks[0].status).toBe("in_progress");
115
+ const updatedTask = db.getTaskById(taskBId);
116
+ expect(updatedTask.comments).toHaveLength(1);
117
+ expect(updatedTask.comments[0].comment).toContain("Implementation started");
118
+ expect(updatedTask.comments[0].agent).toBe("Agent B");
119
+ expect(updatedTask.comments[0].model).toBe("gpt-5.4-mini");
120
+ expect(updatedTask.comments[0].previous_status).toBe("backlog");
121
+ expect(updatedTask.comments[0].next_status).toBe("in_progress");
122
+ });
123
+ it("requires comment when status changes", async () => {
124
+ await router("tools/call", {
125
+ name: "task-create",
126
+ arguments: {
127
+ repo: REPO,
128
+ task_code: "TASK-003",
129
+ phase: "implementation",
130
+ title: "Comment enforcement",
131
+ description: "Task used to verify status change comment enforcement",
132
+ status: "pending",
133
+ priority: 3,
134
+ est_tokens: 90
135
+ }
136
+ });
137
+ const taskId = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-003")?.id;
138
+ expect(taskId).toBeDefined();
139
+ await expect(router("tools/call", {
140
+ name: "task-update",
141
+ arguments: {
142
+ repo: REPO,
143
+ id: taskId,
144
+ status: "in_progress",
145
+ agent: "TestAgent",
146
+ role: "testing",
147
+ est_tokens: 50
148
+ }
149
+ })).rejects.toThrow("comment is required when changing task status");
150
+ });
151
+ it("allows task-create without est_tokens", async () => {
152
+ await router("tools/call", {
153
+ name: "task-create",
154
+ arguments: {
155
+ repo: REPO,
156
+ task_code: "TASK-003A",
157
+ phase: "implementation",
158
+ title: "Create without token estimate",
159
+ description: "Should still be accepted during planning",
160
+ status: "pending",
161
+ priority: 3
162
+ }
163
+ });
164
+ const task = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-003A");
165
+ expect(task).toBeDefined();
166
+ expect(task?.est_tokens).toBe(0);
167
+ });
168
+ it("requires est_tokens when changing task status to completed", async () => {
169
+ await router("tools/call", {
170
+ name: "task-create",
171
+ arguments: {
172
+ repo: REPO,
173
+ task_code: "TASK-003B",
174
+ phase: "implementation",
175
+ title: "Completion requires token estimate",
176
+ description: "Used to verify completed status analytics requirement",
177
+ status: "backlog",
178
+ priority: 3
179
+ }
180
+ });
181
+ const taskId = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-003B")?.id;
182
+ expect(taskId).toBeDefined();
183
+ await router("tools/call", {
184
+ name: "task-update",
185
+ arguments: {
186
+ repo: REPO,
187
+ id: taskId,
188
+ status: "in_progress",
189
+ comment: "Starting work",
190
+ agent: "Agent E",
191
+ role: "backend"
192
+ }
193
+ });
194
+ await expect(router("tools/call", {
195
+ name: "task-update",
196
+ arguments: {
197
+ repo: REPO,
198
+ id: taskId,
199
+ status: "completed",
200
+ comment: "Finished work but forgot token estimate",
201
+ agent: "Agent E",
202
+ role: "backend"
203
+ }
204
+ })).rejects.toThrow("est_tokens is required when changing task status to completed");
205
+ });
206
+ it("stores standalone comments without mutating description", async () => {
207
+ await router("tools/call", {
208
+ name: "task-create",
209
+ arguments: {
210
+ repo: REPO,
211
+ task_code: "TASK-004",
212
+ phase: "implementation",
213
+ title: "Standalone comments",
214
+ description: "Original description",
215
+ status: "pending",
216
+ priority: 3,
217
+ est_tokens: 90,
218
+ agent: "Seeder",
219
+ role: "user"
220
+ }
221
+ });
222
+ const taskId = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-004")?.id;
223
+ expect(taskId).toBeDefined();
224
+ await router("tools/call", {
225
+ name: "task-update",
226
+ arguments: {
227
+ repo: REPO,
228
+ id: taskId,
229
+ comment: "Investigated root cause and prepared next steps",
230
+ agent: "Agent C",
231
+ role: "security",
232
+ model: "gpt-5.4",
233
+ est_tokens: 75,
234
+ }
235
+ });
236
+ const task = db.getTaskById(taskId);
237
+ expect(task.description).toBe("Original description");
238
+ expect(task.comments).toHaveLength(1);
239
+ expect(task.comments[0].previous_status).toBeNull();
240
+ expect(task.comments[0].next_status).toBeNull();
241
+ });
242
+ it("auto-populates timestamps from status so agents do not need to send them manually", async () => {
243
+ await router("tools/call", {
244
+ name: "task-create",
245
+ arguments: {
246
+ repo: REPO,
247
+ task_code: "TASK-005",
248
+ phase: "implementation",
249
+ title: "Auto timestamp on create",
250
+ description: "Created as backlog then moved to in progress",
251
+ status: "backlog",
252
+ priority: 3,
253
+ est_tokens: 110
254
+ }
255
+ });
256
+ const createdTask = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-005");
257
+ expect(createdTask?.in_progress_at).toBeNull();
258
+ expect(createdTask?.finished_at).toBeNull();
259
+ await router("tools/call", {
260
+ name: "task-update",
261
+ arguments: {
262
+ repo: REPO,
263
+ id: createdTask.id,
264
+ status: "in_progress",
265
+ comment: "Starting work",
266
+ agent: "Agent D",
267
+ role: "backend"
268
+ }
269
+ });
270
+ const inProgressTask = db.getTaskById(createdTask.id);
271
+ expect(inProgressTask.in_progress_at).toBeTruthy();
272
+ await router("tools/call", {
273
+ name: "task-update",
274
+ arguments: {
275
+ repo: REPO,
276
+ id: createdTask.id,
277
+ status: "completed",
278
+ comment: "Done without providing timestamps manually",
279
+ agent: "Agent D",
280
+ role: "backend",
281
+ est_tokens: 210
282
+ }
283
+ });
284
+ const completedTask = db.getTaskById(createdTask.id);
285
+ expect(completedTask.in_progress_at).toBeTruthy();
286
+ expect(completedTask.finished_at).toBeTruthy();
287
+ });
288
+ });
289
+ //# sourceMappingURL=tasks.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.e2e.test.js","sourceRoot":"","sources":["../../src/tests/tasks.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tasks.pending-limit-refined.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.pending-limit-refined.test.d.ts","sourceRoot":"","sources":["../../src/tests/tasks.pending-limit-refined.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,72 @@
1
+ import { describe, it, expect, beforeEach, vi } from "vitest";
2
+ import { handleTaskCreate, handleTaskUpdate } from "../tools/task.manage.js";
3
+ import { SQLiteStore } from "../storage/sqlite.js";
4
+ describe("Task Pending Limit Refined Validation", () => {
5
+ let db;
6
+ let mockVectors;
7
+ const REPO = "test-repo";
8
+ beforeEach(() => {
9
+ db = new SQLiteStore(":memory:");
10
+ mockVectors = {
11
+ upsert: vi.fn().mockResolvedValue(undefined),
12
+ remove: vi.fn().mockResolvedValue(undefined),
13
+ search: vi.fn().mockResolvedValue([])
14
+ };
15
+ });
16
+ async function createManyPending(count) {
17
+ for (let i = 0; i < count; i++) {
18
+ await handleTaskCreate({
19
+ repo: REPO,
20
+ task_code: `TASK-${i}`,
21
+ phase: "test",
22
+ title: "Test Task",
23
+ description: "Test Description",
24
+ status: "pending",
25
+ agent: "test-agent",
26
+ role: "test-role"
27
+ }, db);
28
+ }
29
+ }
30
+ it("should block creating the 11th pending task", async () => {
31
+ await createManyPending(10);
32
+ await expect(handleTaskCreate({
33
+ repo: REPO,
34
+ task_code: "TASK-11",
35
+ phase: "test",
36
+ title: "11th Task",
37
+ description: "Should fail",
38
+ status: "pending",
39
+ agent: "test-agent",
40
+ role: "test-role"
41
+ }, db)).rejects.toThrow(/Maximum of 10 pending tasks reached/);
42
+ });
43
+ it("should ALLOW moving from backlog to pending even if limit reached", async () => {
44
+ await createManyPending(10);
45
+ // Create one backlog task (allowed)
46
+ await handleTaskCreate({
47
+ repo: REPO,
48
+ task_code: "TASK-BACKLOG",
49
+ phase: "test",
50
+ title: "Backlog Task",
51
+ description: "In backlog",
52
+ status: "backlog",
53
+ agent: "test-agent",
54
+ role: "test-role"
55
+ }, db);
56
+ const task = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-BACKLOG");
57
+ // Move to pending (should be ALLOWED now)
58
+ await handleTaskUpdate({
59
+ repo: REPO,
60
+ id: task.id,
61
+ status: "pending",
62
+ comment: "ready to start",
63
+ agent: "test-agent",
64
+ role: "test-role"
65
+ }, db, mockVectors);
66
+ const updatedTask = db.getTaskById(task.id);
67
+ expect(updatedTask.status).toBe("pending");
68
+ const stats = db.getTaskStats(REPO);
69
+ expect(stats.todo).toBe(11);
70
+ });
71
+ });
72
+ //# sourceMappingURL=tasks.pending-limit-refined.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.pending-limit-refined.test.js","sourceRoot":"","sources":["../../src/tests/tasks.pending-limit-refined.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=v2-features.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-features.test.d.ts","sourceRoot":"","sources":["../../src/tests/v2-features.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,209 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { SQLiteStore } from "../storage/sqlite.js";
3
+ import { handleMemoryStore } from "../tools/memory.store.js";
4
+ import { handleMemorySearch } from "../tools/memory.search.js";
5
+ import { handleMemoryAcknowledge } from "../tools/memory.acknowledge.js";
6
+ import { handleMemoryUpdate } from "../tools/memory.update.js";
7
+ const VALID_UUID_1 = "11111111-1111-4111-a111-111111111111";
8
+ const VALID_UUID_2 = "22222222-2222-4222-a222-222222222222";
9
+ const mockVectors = {
10
+ upsert: vi.fn().mockResolvedValue(undefined),
11
+ remove: vi.fn().mockResolvedValue(undefined),
12
+ search: vi.fn().mockResolvedValue([]),
13
+ };
14
+ function makeEntry(overrides) {
15
+ return {
16
+ id: overrides.id || VALID_UUID_1,
17
+ type: overrides.type || "decision",
18
+ title: overrides.title || "Test Title",
19
+ content: overrides.content || "Test content for memory",
20
+ importance: overrides.importance || 3,
21
+ agent: overrides.agent || "test-agent",
22
+ role: "unknown",
23
+ model: overrides.model || "test-model",
24
+ scope: { repo: overrides.repo || "test-repo" },
25
+ created_at: new Date().toISOString(),
26
+ updated_at: new Date().toISOString(),
27
+ completed_at: null,
28
+ hit_count: 0,
29
+ recall_count: 0,
30
+ last_used_at: null,
31
+ expires_at: null,
32
+ supersedes: overrides.supersedes || null,
33
+ status: overrides.status || "active",
34
+ tags: overrides.tags || [],
35
+ metadata: overrides.metadata || {},
36
+ is_global: overrides.is_global || false,
37
+ };
38
+ }
39
+ describe("V2 Enhanced Memory Features", () => {
40
+ describe("1. Conflict Detection & Supersedes", () => {
41
+ it("should store memories with the file_claim type", async () => {
42
+ const db = new SQLiteStore(":memory:");
43
+ const repo = "file-claim-repo";
44
+ const response = await handleMemoryStore({
45
+ type: "file_claim",
46
+ title: "Claim ownership of migration file",
47
+ content: "Agent A is working on src/storage/sqlite.ts migration changes.",
48
+ importance: 4,
49
+ scope: { repo },
50
+ agent: "test-agent",
51
+ model: "test-model"
52
+ }, db, mockVectors);
53
+ const stored = db.getById(response.data.id);
54
+ expect(stored?.type).toBe("file_claim");
55
+ db.close();
56
+ });
57
+ it("should store structured metadata on memories", async () => {
58
+ const db = new SQLiteStore(":memory:");
59
+ const repo = "metadata-repo";
60
+ const response = await handleMemoryStore({
61
+ type: "decision",
62
+ title: "JSON:API response standard restored",
63
+ content: "Responses must use the JSON:API envelope for consistency.",
64
+ importance: 4,
65
+ scope: { repo },
66
+ agent: "codex",
67
+ role: "rules-optimizer",
68
+ model: "gpt-5.4",
69
+ metadata: {
70
+ source_agent: "codex",
71
+ source_role: "rules-optimizer",
72
+ source_timestamp: "2026-04-03T00:00:00.000Z"
73
+ }
74
+ }, db, mockVectors);
75
+ const stored = db.getById(response.data.id);
76
+ expect(stored?.metadata).toEqual({
77
+ source_agent: "codex",
78
+ source_role: "rules-optimizer",
79
+ source_timestamp: "2026-04-03T00:00:00.000Z"
80
+ });
81
+ db.close();
82
+ });
83
+ it("should reject titles that look like embedded metadata", async () => {
84
+ const db = new SQLiteStore(":memory:");
85
+ await expect(handleMemoryStore({
86
+ type: "decision",
87
+ title: "[agent: codex | role: rules-optimizer | 2026-04-03] JSON:API response standard restored",
88
+ content: "Responses must use the JSON:API envelope for consistency.",
89
+ importance: 4,
90
+ scope: { repo: "metadata-guard-repo" },
91
+ agent: "codex",
92
+ role: "rules-optimizer",
93
+ model: "gpt-5.4"
94
+ }, db, mockVectors)).rejects.toThrow("Title appears to contain metadata");
95
+ db.close();
96
+ });
97
+ it("should reject a new memory if a similar one exists (>0.85) and no supersedes is provided", async () => {
98
+ const db = new SQLiteStore(":memory:");
99
+ const repo = "conflict-repo";
100
+ db.insert(makeEntry({ id: VALID_UUID_1, repo, content: "React frontend" }));
101
+ mockVectors.search = vi.fn().mockResolvedValue([{ id: VALID_UUID_1, score: 0.9 }]);
102
+ const params = {
103
+ type: "decision",
104
+ title: "Conflict Test",
105
+ content: "React frontend again",
106
+ importance: 5,
107
+ scope: { repo },
108
+ agent: "test-agent",
109
+ model: "test-model"
110
+ };
111
+ const response = await handleMemoryStore(params, db, mockVectors);
112
+ expect(response.content[0].text).toContain("conflict");
113
+ db.close();
114
+ });
115
+ it("should archive old memory when superseded", async () => {
116
+ const db = new SQLiteStore(":memory:");
117
+ const repo = "supersede-repo";
118
+ db.insert(makeEntry({ id: VALID_UUID_1, repo }));
119
+ const params = {
120
+ type: "decision",
121
+ title: "New One",
122
+ content: "Better content",
123
+ importance: 5,
124
+ scope: { repo },
125
+ agent: "test-agent",
126
+ model: "test-model",
127
+ supersedes: VALID_UUID_1
128
+ };
129
+ await handleMemoryStore(params, db, mockVectors);
130
+ const old = db.getById(VALID_UUID_1);
131
+ expect(old?.status).toBe("archived");
132
+ db.close();
133
+ });
134
+ });
135
+ describe("2. Strict Search Threshold (0.72)", () => {
136
+ it("should filter out results using dynamic threshold", async () => {
137
+ const db = new SQLiteStore(":memory:");
138
+ const repo = "threshold-repo";
139
+ db.insert(makeEntry({ id: VALID_UUID_1, repo, content: "Target" }));
140
+ db.insert(makeEntry({ id: VALID_UUID_2, repo, content: "Noisy" }));
141
+ // Adding more memories to force a stricter threshold (> 5 memories)
142
+ for (let i = 0; i < 5; i++) {
143
+ db.insert(makeEntry({ id: `00000000-0000-4000-a000-00000000000${i + 3}`, repo, content: "Irrelevant" }));
144
+ }
145
+ mockVectors.search = vi.fn().mockResolvedValue([
146
+ { id: VALID_UUID_1, score: 0.8 },
147
+ { id: VALID_UUID_2, score: 0.2 }, // Should be filtered out if threshold is high
148
+ { id: "00000000-0000-4000-a000-000000000003", score: 0.1 }
149
+ ]);
150
+ const params = { query: "Target", repo };
151
+ const response = await handleMemorySearch(params, db, mockVectors);
152
+ const text = response.content[0].text;
153
+ // With > 5 memories, threshold should be 0.40
154
+ expect(text).toContain("Found 1 memories");
155
+ db.close();
156
+ });
157
+ });
158
+ describe("3. Feedback Loop", () => {
159
+ it("should allow updating memory type to file_claim", async () => {
160
+ const db = new SQLiteStore(":memory:");
161
+ db.insert(makeEntry({ id: VALID_UUID_1, type: "decision" }));
162
+ await handleMemoryUpdate({
163
+ id: VALID_UUID_1,
164
+ type: "file_claim"
165
+ }, db, mockVectors);
166
+ const updated = db.getById(VALID_UUID_1);
167
+ expect(updated?.type).toBe("file_claim");
168
+ db.close();
169
+ });
170
+ it("should allow updating memory metadata", async () => {
171
+ const db = new SQLiteStore(":memory:");
172
+ db.insert(makeEntry({ id: VALID_UUID_1, metadata: { source_agent: "old-agent" } }));
173
+ await handleMemoryUpdate({
174
+ id: VALID_UUID_1,
175
+ metadata: {
176
+ source_agent: "codex",
177
+ source_role: "rules-optimizer"
178
+ }
179
+ }, db, mockVectors);
180
+ const updated = db.getById(VALID_UUID_1);
181
+ expect(updated?.metadata).toEqual({
182
+ source_agent: "codex",
183
+ source_role: "rules-optimizer"
184
+ });
185
+ db.close();
186
+ });
187
+ it("should reject metadata-like titles on update", async () => {
188
+ const db = new SQLiteStore(":memory:");
189
+ db.insert(makeEntry({ id: VALID_UUID_1, title: "Clean title" }));
190
+ await expect(handleMemoryUpdate({
191
+ id: VALID_UUID_1,
192
+ title: "[agent: codex | role: rules-optimizer | 2026-04-03] Noisy title"
193
+ }, db, mockVectors)).rejects.toThrow("Title appears to contain metadata");
194
+ db.close();
195
+ });
196
+ it("should increment recall_count on 'used'", async () => {
197
+ const db = new SQLiteStore(":memory:");
198
+ db.insert(makeEntry({ id: VALID_UUID_1 }));
199
+ await handleMemoryAcknowledge({
200
+ memory_id: VALID_UUID_1,
201
+ status: "used"
202
+ }, db);
203
+ const updated = db.getById(VALID_UUID_1);
204
+ expect(updated?.recall_count).toBe(1);
205
+ db.close();
206
+ });
207
+ });
208
+ });
209
+ //# sourceMappingURL=v2-features.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-features.test.js","sourceRoot":"","sources":["../../src/tests/v2-features.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,4 @@
1
1
  import { SQLiteStore } from "../storage/sqlite.js";
2
2
  import { VectorStore } from "../types.js";
3
- export declare function handleMemoryBulkDelete(args: any, storage: SQLiteStore, vectors: VectorStore): Promise<{
4
- content: {
5
- type: string;
6
- text: string;
7
- }[];
8
- isError: boolean;
9
- }>;
3
+ export declare function handleMemoryBulkDelete(args: any, storage: SQLiteStore, vectors: VectorStore, onProgress?: (progress: number, total?: number) => void): Promise<import("../utils/mcp-response.js").McpResponse>;
10
4
  //# sourceMappingURL=memory.bulk-delete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.bulk-delete.d.ts","sourceRoot":"","sources":["../../src/tools/memory.bulk-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW;;;;;;GAkBrB"}
1
+ {"version":3,"file":"memory.bulk-delete.d.ts","sourceRoot":"","sources":["../../src/tools/memory.bulk-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,2DA6CxD"}