@vheins/local-memory-mcp 0.4.12 → 0.5.1

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 (201) hide show
  1. package/README.md +21 -0
  2. package/bin/mcp-memory-server.js +1 -1
  3. package/dist/dashboard/public/assets/index-KxrQ6fPK.css +1 -0
  4. package/dist/dashboard/public/assets/index-Lu37nzOi.js +72 -0
  5. package/dist/dashboard/public/index.html +11 -1772
  6. package/dist/dashboard/server.js +115 -5
  7. package/dist/dashboard/server.js.map +1 -1
  8. package/dist/mcp/capabilities.d.ts +22 -0
  9. package/dist/mcp/capabilities.d.ts.map +1 -0
  10. package/dist/mcp/capabilities.js +38 -0
  11. package/dist/mcp/capabilities.js.map +1 -0
  12. package/dist/mcp/client.js +3 -3
  13. package/dist/mcp/client.js.map +1 -1
  14. package/dist/mcp/completion.d.ts +25 -0
  15. package/dist/mcp/completion.d.ts.map +1 -0
  16. package/dist/mcp/completion.js +127 -0
  17. package/dist/mcp/completion.js.map +1 -0
  18. package/dist/mcp/prompts/registry.d.ts +330 -0
  19. package/dist/mcp/prompts/registry.d.ts.map +1 -0
  20. package/dist/mcp/prompts/registry.js +1066 -0
  21. package/dist/mcp/prompts/registry.js.map +1 -0
  22. package/dist/mcp/resources/index.d.ts +68 -0
  23. package/dist/mcp/resources/index.d.ts.map +1 -0
  24. package/dist/mcp/resources/index.js +323 -0
  25. package/dist/mcp/resources/index.js.map +1 -0
  26. package/dist/mcp/router.d.ts +14 -0
  27. package/dist/mcp/router.d.ts.map +1 -0
  28. package/dist/mcp/router.js +242 -0
  29. package/dist/mcp/router.js.map +1 -0
  30. package/dist/mcp/server.d.ts +3 -0
  31. package/dist/mcp/server.d.ts.map +1 -0
  32. package/dist/mcp/server.js +338 -0
  33. package/dist/mcp/server.js.map +1 -0
  34. package/dist/mcp/storage/sqlite.d.ts +83 -0
  35. package/dist/mcp/storage/sqlite.d.ts.map +1 -0
  36. package/dist/mcp/storage/sqlite.js +1237 -0
  37. package/dist/mcp/storage/sqlite.js.map +1 -0
  38. package/dist/mcp/storage/vectors.d.ts +19 -0
  39. package/dist/mcp/storage/vectors.d.ts.map +1 -0
  40. package/dist/mcp/storage/vectors.js +74 -0
  41. package/dist/mcp/storage/vectors.js.map +1 -0
  42. package/dist/mcp/storage/vectors.stub.d.ts +12 -0
  43. package/dist/mcp/storage/vectors.stub.d.ts.map +1 -0
  44. package/dist/mcp/storage/vectors.stub.js +88 -0
  45. package/dist/mcp/storage/vectors.stub.js.map +1 -0
  46. package/dist/mcp/tests/client.test.d.ts +2 -0
  47. package/dist/mcp/tests/client.test.d.ts.map +1 -0
  48. package/dist/mcp/tests/client.test.js +130 -0
  49. package/dist/mcp/tests/client.test.js.map +1 -0
  50. package/dist/mcp/tests/dashboard.test.d.ts +2 -0
  51. package/dist/mcp/tests/dashboard.test.d.ts.map +1 -0
  52. package/dist/mcp/tests/dashboard.test.js +370 -0
  53. package/dist/mcp/tests/dashboard.test.js.map +1 -0
  54. package/dist/mcp/tests/e2e.test.d.ts +2 -0
  55. package/dist/mcp/tests/e2e.test.d.ts.map +1 -0
  56. package/dist/mcp/tests/e2e.test.js +250 -0
  57. package/dist/mcp/tests/e2e.test.js.map +1 -0
  58. package/dist/mcp/tests/index.test.d.ts +2 -0
  59. package/dist/mcp/tests/index.test.d.ts.map +1 -0
  60. package/dist/mcp/tests/index.test.js +185 -0
  61. package/dist/mcp/tests/index.test.js.map +1 -0
  62. package/dist/mcp/tests/logger.test.d.ts +2 -0
  63. package/dist/mcp/tests/logger.test.d.ts.map +1 -0
  64. package/dist/mcp/tests/logger.test.js +104 -0
  65. package/dist/mcp/tests/logger.test.js.map +1 -0
  66. package/dist/mcp/tests/memory.bulk.test.d.ts +2 -0
  67. package/dist/mcp/tests/memory.bulk.test.d.ts.map +1 -0
  68. package/dist/mcp/tests/memory.bulk.test.js +52 -0
  69. package/dist/mcp/tests/memory.bulk.test.js.map +1 -0
  70. package/dist/mcp/tests/memory.search.test.d.ts +2 -0
  71. package/dist/mcp/tests/memory.search.test.d.ts.map +1 -0
  72. package/dist/mcp/tests/memory.search.test.js +181 -0
  73. package/dist/mcp/tests/memory.search.test.js.map +1 -0
  74. package/dist/mcp/tests/normalize.test.d.ts +2 -0
  75. package/dist/mcp/tests/normalize.test.d.ts.map +1 -0
  76. package/dist/mcp/tests/normalize.test.js +181 -0
  77. package/dist/mcp/tests/normalize.test.js.map +1 -0
  78. package/dist/mcp/tests/query-expander.test.d.ts +2 -0
  79. package/dist/mcp/tests/query-expander.test.d.ts.map +1 -0
  80. package/dist/mcp/tests/query-expander.test.js +33 -0
  81. package/dist/mcp/tests/query-expander.test.js.map +1 -0
  82. package/dist/mcp/tests/router.test.d.ts +2 -0
  83. package/dist/mcp/tests/router.test.d.ts.map +1 -0
  84. package/dist/mcp/tests/router.test.js +470 -0
  85. package/dist/mcp/tests/router.test.js.map +1 -0
  86. package/dist/mcp/tests/sqlite.test.d.ts +2 -0
  87. package/dist/mcp/tests/sqlite.test.d.ts.map +1 -0
  88. package/dist/mcp/tests/sqlite.test.js +367 -0
  89. package/dist/mcp/tests/sqlite.test.js.map +1 -0
  90. package/dist/mcp/tests/tasks-search.test.d.ts +2 -0
  91. package/dist/mcp/tests/tasks-search.test.d.ts.map +1 -0
  92. package/dist/mcp/tests/tasks-search.test.js +154 -0
  93. package/dist/mcp/tests/tasks-search.test.js.map +1 -0
  94. package/dist/mcp/tests/tasks-transition.test.d.ts +2 -0
  95. package/dist/mcp/tests/tasks-transition.test.d.ts.map +1 -0
  96. package/dist/mcp/tests/tasks-transition.test.js +174 -0
  97. package/dist/mcp/tests/tasks-transition.test.js.map +1 -0
  98. package/dist/mcp/tests/tasks.bulk.test.d.ts +2 -0
  99. package/dist/mcp/tests/tasks.bulk.test.d.ts.map +1 -0
  100. package/dist/mcp/tests/tasks.bulk.test.js +254 -0
  101. package/dist/mcp/tests/tasks.bulk.test.js.map +1 -0
  102. package/dist/mcp/tests/tasks.e2e.test.d.ts +2 -0
  103. package/dist/mcp/tests/tasks.e2e.test.d.ts.map +1 -0
  104. package/dist/mcp/tests/tasks.e2e.test.js +289 -0
  105. package/dist/mcp/tests/tasks.e2e.test.js.map +1 -0
  106. package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts +2 -0
  107. package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts.map +1 -0
  108. package/dist/mcp/tests/tasks.pending-limit-refined.test.js +72 -0
  109. package/dist/mcp/tests/tasks.pending-limit-refined.test.js.map +1 -0
  110. package/dist/mcp/tests/v2-features.test.d.ts +2 -0
  111. package/dist/mcp/tests/v2-features.test.d.ts.map +1 -0
  112. package/dist/mcp/tests/v2-features.test.js +209 -0
  113. package/dist/mcp/tests/v2-features.test.js.map +1 -0
  114. package/dist/mcp/tools/memory.acknowledge.d.ts +4 -0
  115. package/dist/mcp/tools/memory.acknowledge.d.ts.map +1 -0
  116. package/dist/mcp/tools/memory.acknowledge.js +30 -0
  117. package/dist/mcp/tools/memory.acknowledge.js.map +1 -0
  118. package/dist/mcp/tools/memory.bulk-delete.d.ts +4 -0
  119. package/dist/mcp/tools/memory.bulk-delete.d.ts.map +1 -0
  120. package/dist/mcp/tools/memory.bulk-delete.js +39 -0
  121. package/dist/mcp/tools/memory.bulk-delete.js.map +1 -0
  122. package/dist/mcp/tools/memory.delete.d.ts +9 -0
  123. package/dist/mcp/tools/memory.delete.d.ts.map +1 -0
  124. package/dist/mcp/tools/memory.delete.js +39 -0
  125. package/dist/mcp/tools/memory.delete.js.map +1 -0
  126. package/dist/mcp/tools/memory.recap.d.ts +4 -0
  127. package/dist/mcp/tools/memory.recap.d.ts.map +1 -0
  128. package/dist/mcp/tools/memory.recap.js +90 -0
  129. package/dist/mcp/tools/memory.recap.js.map +1 -0
  130. package/dist/mcp/tools/memory.search.d.ts +5 -0
  131. package/dist/mcp/tools/memory.search.d.ts.map +1 -0
  132. package/dist/mcp/tools/memory.search.js +134 -0
  133. package/dist/mcp/tools/memory.search.js.map +1 -0
  134. package/dist/mcp/tools/memory.store.d.ts +5 -0
  135. package/dist/mcp/tools/memory.store.d.ts.map +1 -0
  136. package/dist/mcp/tools/memory.store.js +117 -0
  137. package/dist/mcp/tools/memory.store.js.map +1 -0
  138. package/dist/mcp/tools/memory.summarize.d.ts +4 -0
  139. package/dist/mcp/tools/memory.summarize.d.ts.map +1 -0
  140. package/dist/mcp/tools/memory.summarize.js +31 -0
  141. package/dist/mcp/tools/memory.summarize.js.map +1 -0
  142. package/dist/mcp/tools/memory.synthesize.d.ts +14 -0
  143. package/dist/mcp/tools/memory.synthesize.d.ts.map +1 -0
  144. package/dist/mcp/tools/memory.synthesize.js +228 -0
  145. package/dist/mcp/tools/memory.synthesize.js.map +1 -0
  146. package/dist/mcp/tools/memory.update.d.ts +5 -0
  147. package/dist/mcp/tools/memory.update.d.ts.map +1 -0
  148. package/dist/mcp/tools/memory.update.js +73 -0
  149. package/dist/mcp/tools/memory.update.js.map +1 -0
  150. package/dist/mcp/tools/schemas.d.ts +2762 -0
  151. package/dist/mcp/tools/schemas.d.ts.map +1 -0
  152. package/dist/mcp/tools/schemas.js +952 -0
  153. package/dist/mcp/tools/schemas.js.map +1 -0
  154. package/dist/mcp/tools/task.bulk-manage.d.ts +4 -0
  155. package/dist/mcp/tools/task.bulk-manage.d.ts.map +1 -0
  156. package/dist/mcp/tools/task.bulk-manage.js +146 -0
  157. package/dist/mcp/tools/task.bulk-manage.js.map +1 -0
  158. package/dist/mcp/tools/task.manage.d.ts +16 -0
  159. package/dist/mcp/tools/task.manage.d.ts.map +1 -0
  160. package/dist/mcp/tools/task.manage.js +395 -0
  161. package/dist/mcp/tools/task.manage.js.map +1 -0
  162. package/dist/mcp/types.d.ts +87 -0
  163. package/dist/mcp/types.d.ts.map +1 -0
  164. package/dist/mcp/types.js +3 -0
  165. package/dist/mcp/types.js.map +1 -0
  166. package/dist/mcp/utils/completion.d.ts +2 -0
  167. package/dist/mcp/utils/completion.d.ts.map +1 -0
  168. package/dist/mcp/utils/completion.js +28 -0
  169. package/dist/mcp/utils/completion.js.map +1 -0
  170. package/dist/mcp/utils/git-scope.d.ts +8 -0
  171. package/dist/mcp/utils/git-scope.d.ts.map +1 -0
  172. package/dist/mcp/utils/git-scope.js +38 -0
  173. package/dist/mcp/utils/git-scope.js.map +1 -0
  174. package/dist/mcp/utils/logger.d.ts +25 -0
  175. package/dist/mcp/utils/logger.d.ts.map +1 -0
  176. package/dist/mcp/utils/logger.js +152 -0
  177. package/dist/mcp/utils/logger.js.map +1 -0
  178. package/dist/mcp/utils/mcp-response.d.ts +96 -0
  179. package/dist/mcp/utils/mcp-response.d.ts.map +1 -0
  180. package/dist/mcp/utils/mcp-response.js +131 -0
  181. package/dist/mcp/utils/mcp-response.js.map +1 -0
  182. package/dist/mcp/utils/normalize.d.ts +9 -0
  183. package/dist/mcp/utils/normalize.d.ts.map +1 -0
  184. package/dist/mcp/utils/normalize.js +62 -0
  185. package/dist/mcp/utils/normalize.js.map +1 -0
  186. package/dist/mcp/utils/pagination.d.ts +6 -0
  187. package/dist/mcp/utils/pagination.d.ts.map +1 -0
  188. package/dist/mcp/utils/pagination.js +32 -0
  189. package/dist/mcp/utils/pagination.js.map +1 -0
  190. package/dist/mcp/utils/query-expander.d.ts +2 -0
  191. package/dist/mcp/utils/query-expander.d.ts.map +1 -0
  192. package/dist/mcp/utils/query-expander.js +29 -0
  193. package/dist/mcp/utils/query-expander.js.map +1 -0
  194. package/dist/storage/sqlite.d.ts +3 -0
  195. package/dist/storage/sqlite.d.ts.map +1 -1
  196. package/dist/storage/sqlite.js +38 -9
  197. package/dist/storage/sqlite.js.map +1 -1
  198. package/package.json +17 -5
  199. package/dist/dashboard/public/app.js +0 -2779
  200. package/dist/dashboard/public/chart.js +0 -0
  201. package/dist/dashboard/public/screenshot.png +0 -0
@@ -0,0 +1,228 @@
1
+ import { extractTextFromContent, extractToolUses, } from "../sampling.js";
2
+ import { inferRepoFromSession, } from "../session.js";
3
+ import { extractAcceptedElicitationContent, } from "../elicitation.js";
4
+ import { createMcpResponse } from "../utils/mcp-response.js";
5
+ import { logger } from "../utils/logger.js";
6
+ import { MemorySynthesizeSchema } from "./schemas.js";
7
+ import { normalizeRepo } from "../utils/normalize.js";
8
+ import { handleMemoryRecap } from "./memory.recap.js";
9
+ import { handleMemorySearch } from "./memory.search.js";
10
+ import { handleTaskList } from "./task.manage.js";
11
+ export async function handleMemorySynthesize(params, db, vectors, options = {}) {
12
+ const validated = MemorySynthesizeSchema.parse(params);
13
+ const session = options.session;
14
+ if (!options.sampleMessage || !session?.supportsSampling) {
15
+ throw new Error("Client does not advertise MCP sampling support");
16
+ }
17
+ const repo = await resolveRepository(validated.repo, session, options.elicit);
18
+ if (!repo) {
19
+ throw new Error("repo is required when repo cannot be inferred from active MCP roots");
20
+ }
21
+ const recap = await handleMemoryRecap({ repo, limit: 8, offset: 0 }, db);
22
+ const recapText = recap.content[0]?.type === "text" ? recap.content[0].text : "";
23
+ const summary = validated.include_summary ? db.getSummary(repo)?.summary : "";
24
+ const taskSnapshot = validated.include_tasks
25
+ ? await handleTaskList({ repo, status: "backlog,pending,in_progress,blocked", limit: 15, offset: 0 }, db)
26
+ : null;
27
+ const taskText = taskSnapshot?.content[0]?.type === "text" ? taskSnapshot.content[0].text : "";
28
+ const systemPrompt = [
29
+ "You are a repository memory synthesizer.",
30
+ "Answer strictly from grounded MCP context and tool results.",
31
+ "If memory is insufficient, say so explicitly instead of inventing details.",
32
+ "Prefer concise, technical answers with explicit caveats when evidence is incomplete.",
33
+ ].join(" ");
34
+ const contextBlock = [
35
+ `Repository: ${repo}`,
36
+ validated.current_file_path ? `Current file: ${validated.current_file_path}` : "",
37
+ summary ? `Summary:\n${summary}` : "",
38
+ recapText ? `Recent context:\n${recapText}` : "",
39
+ taskText ? `Active tasks:\n${taskText}` : "",
40
+ ].filter(Boolean).join("\n\n");
41
+ const messages = [
42
+ {
43
+ role: "user",
44
+ content: {
45
+ type: "text",
46
+ text: `Objective: ${validated.objective}\n\nGrounding context:\n${contextBlock || "No additional context provided."}`,
47
+ },
48
+ },
49
+ ];
50
+ const toolDefinitions = buildSamplingTools(session, validated.use_tools);
51
+ let lastResponse = null;
52
+ let totalToolCalls = 0;
53
+ let iterations = 0;
54
+ while (iterations < validated.max_iterations) {
55
+ iterations += 1;
56
+ const response = await options.sampleMessage({
57
+ messages,
58
+ systemPrompt,
59
+ maxTokens: validated.max_tokens,
60
+ tools: toolDefinitions.length > 0 ? toolDefinitions : undefined,
61
+ toolChoice: toolDefinitions.length > 0
62
+ ? { mode: iterations === validated.max_iterations ? "none" : "auto" }
63
+ : undefined,
64
+ modelPreferences: {
65
+ intelligencePriority: 0.9,
66
+ speedPriority: 0.4,
67
+ },
68
+ });
69
+ lastResponse = response;
70
+ messages.push({
71
+ role: "assistant",
72
+ content: response.content,
73
+ });
74
+ const toolUses = extractToolUses(response.content);
75
+ if (toolUses.length === 0) {
76
+ break;
77
+ }
78
+ totalToolCalls += toolUses.length;
79
+ const toolResults = await Promise.all(toolUses.map(async (toolUse) => ({
80
+ type: "tool_result",
81
+ toolUseId: toolUse.id,
82
+ content: [
83
+ {
84
+ type: "text",
85
+ text: await executeSamplingTool(toolUse.name, toolUse.input, db, vectors),
86
+ },
87
+ ],
88
+ })));
89
+ messages.push({
90
+ role: "user",
91
+ content: toolResults,
92
+ });
93
+ }
94
+ const answer = lastResponse ? extractTextFromContent(lastResponse.content).trim() : "";
95
+ if (!answer) {
96
+ throw new Error("Sampling did not return a final text answer");
97
+ }
98
+ logger.info("[MCP] memory.synthesize", {
99
+ repo,
100
+ objective: validated.objective,
101
+ iterations,
102
+ toolCalls: totalToolCalls,
103
+ });
104
+ return createMcpResponse({
105
+ repo,
106
+ objective: validated.objective,
107
+ answer,
108
+ model: lastResponse?.model,
109
+ stopReason: lastResponse?.stopReason,
110
+ iterations,
111
+ toolCalls: totalToolCalls,
112
+ }, `Synthesized answer for "${validated.objective}" using repository "${repo}"`);
113
+ }
114
+ async function resolveRepository(repo, session, elicit) {
115
+ if (repo)
116
+ return normalizeRepo(repo);
117
+ const inferredRepo = inferRepoFromSession(session);
118
+ if (inferredRepo)
119
+ return normalizeRepo(inferredRepo);
120
+ if (!session?.supportsElicitationForm || !elicit) {
121
+ return undefined;
122
+ }
123
+ const elicited = extractAcceptedElicitationContent(await elicit({
124
+ mode: "form",
125
+ message: "Repository tidak bisa diinfer dari roots aktif. Pilih repository yang ingin disintesis.",
126
+ requestedSchema: {
127
+ type: "object",
128
+ properties: {
129
+ repo: {
130
+ type: "string",
131
+ title: "Repository",
132
+ description: "Nama repository yang akan dipakai untuk sintesis memori.",
133
+ minLength: 1,
134
+ },
135
+ },
136
+ required: ["repo"],
137
+ },
138
+ }));
139
+ return typeof elicited.repo === "string" && elicited.repo.trim()
140
+ ? normalizeRepo(elicited.repo.trim())
141
+ : undefined;
142
+ }
143
+ function buildSamplingTools(session, useTools) {
144
+ if (!useTools || !session?.supportsSamplingTools) {
145
+ return [];
146
+ }
147
+ return [
148
+ {
149
+ name: "memory_search",
150
+ description: "Search local repository memories for relevant context.",
151
+ inputSchema: {
152
+ type: "object",
153
+ properties: {
154
+ repo: { type: "string" },
155
+ query: { type: "string" },
156
+ limit: { type: "number", minimum: 1, maximum: 10 },
157
+ },
158
+ required: ["repo", "query"],
159
+ },
160
+ },
161
+ {
162
+ name: "memory_recap",
163
+ description: "Fetch a recap of the most recent memories and active tasks.",
164
+ inputSchema: {
165
+ type: "object",
166
+ properties: {
167
+ repo: { type: "string" },
168
+ limit: { type: "number", minimum: 1, maximum: 20 },
169
+ },
170
+ required: ["repo"],
171
+ },
172
+ },
173
+ {
174
+ name: "task_list",
175
+ description: "List tasks by status or search term for the repository.",
176
+ inputSchema: {
177
+ type: "object",
178
+ properties: {
179
+ repo: { type: "string" },
180
+ status: { type: "string" },
181
+ search: { type: "string" },
182
+ limit: { type: "number", minimum: 1, maximum: 20 },
183
+ },
184
+ required: ["repo"],
185
+ },
186
+ },
187
+ ];
188
+ }
189
+ async function executeSamplingTool(toolName, rawInput, db, vectors) {
190
+ switch (toolName) {
191
+ case "memory_search": {
192
+ const response = await handleMemorySearch({
193
+ repo: rawInput.repo,
194
+ query: rawInput.query,
195
+ limit: rawInput.limit ?? 5,
196
+ }, db, vectors);
197
+ return response.content.map(formatContentForToolResult).join("\n");
198
+ }
199
+ case "memory_recap": {
200
+ const response = await handleMemoryRecap({
201
+ repo: rawInput.repo,
202
+ limit: rawInput.limit ?? 8,
203
+ offset: 0,
204
+ }, db);
205
+ return response.content.map(formatContentForToolResult).join("\n");
206
+ }
207
+ case "task_list": {
208
+ const response = await handleTaskList({
209
+ repo: rawInput.repo,
210
+ status: rawInput.status,
211
+ search: rawInput.search,
212
+ limit: rawInput.limit ?? 10,
213
+ offset: 0,
214
+ }, db);
215
+ return response.content.map(formatContentForToolResult).join("\n");
216
+ }
217
+ default:
218
+ throw new Error(`Unsupported sampling tool: ${toolName}`);
219
+ }
220
+ }
221
+ function formatContentForToolResult(content) {
222
+ if (content.type === "text")
223
+ return content.text;
224
+ if (content.type === "resource")
225
+ return JSON.stringify(content.resource);
226
+ return JSON.stringify(content);
227
+ }
228
+ //# sourceMappingURL=memory.synthesize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.synthesize.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.synthesize.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,sBAAsB,EACtB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,iCAAiC,GAClC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQlD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAW,EACX,EAAe,EACf,OAAoB,EACpB,UAA6B,EAAE;IAE/B,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,MAAM,YAAY,GAAG,SAAS,CAAC,aAAa;QAC1C,CAAC,CAAC,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,qCAAqC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACzG,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,QAAQ,GAAG,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/F,MAAM,YAAY,GAAG;QACnB,0CAA0C;QAC1C,6DAA6D;QAC7D,4EAA4E;QAC5E,sFAAsF;KACvF,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,MAAM,YAAY,GAAG;QACnB,eAAe,IAAI,EAAE;QACrB,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,SAAS,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE;QACjF,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QACrC,SAAS,CAAC,CAAC,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;QAChD,QAAQ,CAAC,CAAC,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;KAC7C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,QAAQ,GAAU;QACtB;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,cAAc,SAAS,CAAC,SAAS,2BAA2B,YAAY,IAAI,iCAAiC,EAAE;aACtH;SACF;KACF,CAAC;IAEF,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACzE,IAAI,YAAY,GAAuC,IAAI,CAAC;IAC5D,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,UAAU,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;QAC7C,UAAU,IAAI,CAAC,CAAC;QAEhB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC;YAC3C,QAAQ;YACR,YAAY;YACZ,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,KAAK,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YAC/D,UAAU,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;gBACpC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE;gBACrE,CAAC,CAAC,SAAS;YACb,gBAAgB,EAAE;gBAChB,oBAAoB,EAAE,GAAG;gBACzB,aAAa,EAAE,GAAG;aACnB;SACF,CAAC,CAAC;QAEH,YAAY,GAAG,QAAQ,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM;QACR,CAAC;QAED,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACrE,IAAI,EAAE,aAAsB;YAC5B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,MAAM,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC;iBAC1E;aACF;SACF,CAAC,CAAC,CAAC,CAAC;QAEL,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,sBAAsB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;QACrC,IAAI;QACJ,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,UAAU;QACV,SAAS,EAAE,cAAc;KAC1B,CAAC,CAAC;IAEH,OAAO,iBAAiB,CACtB;QACE,IAAI;QACJ,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,MAAM;QACN,KAAK,EAAE,YAAY,EAAE,KAAK;QAC1B,UAAU,EAAE,YAAY,EAAE,UAAU;QACpC,UAAU;QACV,SAAS,EAAE,cAAc;KAC1B,EACD,2BAA2B,SAAS,CAAC,SAAS,uBAAuB,IAAI,GAAG,CAC7E,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAwB,EACxB,OAAmC,EACnC,MAA6C;IAE7C,IAAI,IAAI;QAAE,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,YAAY;QAAE,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC;IAErD,IAAI,CAAC,OAAO,EAAE,uBAAuB,IAAI,CAAC,MAAM,EAAE,CAAC;QACjD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,iCAAiC,CAAC,MAAM,MAAM,CAAC;QAC9D,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,yFAAyF;QAClG,eAAe,EAAE;YACf,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,0DAA0D;oBACvE,SAAS,EAAE,CAAC;iBACb;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF,CAAC,CAAC,CAAC;IAEJ,OAAO,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;QAC9D,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACrC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAmC,EAAE,QAAiB;IAChF,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,CAAC;QACjD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL;YACE,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,wDAAwD;YACrE,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;iBACnD;gBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;aAC5B;SACF;QACD;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,6DAA6D;YAC1E,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;iBACnD;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;QACD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,yDAAyD;YACtE,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;iBACnD;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,QAAgB,EAChB,QAAiC,EACjC,EAAe,EACf,OAAoB;IAEpB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC;gBACxC,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;aAC3B,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAChB,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;gBACvC,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;gBAC1B,MAAM,EAAE,CAAC;aACV,EAAE,EAAE,CAAC,CAAC;YACP,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC;gBACpC,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;gBAC3B,MAAM,EAAE,CAAC;aACV,EAAE,EAAE,CAAC,CAAC;YACP,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAY;IAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IACjD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { SQLiteStore } from "../storage/sqlite.js";
2
+ import { VectorStore } from "../types.js";
3
+ import { McpResponse } from "../utils/mcp-response.js";
4
+ export declare function handleMemoryUpdate(params: any, db: SQLiteStore, vectors: VectorStore): Promise<McpResponse>;
5
+ //# sourceMappingURL=memory.update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.update.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAQ1E,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CA+DtB"}
@@ -0,0 +1,73 @@
1
+ import { MemoryUpdateSchema } from "./schemas.js";
2
+ import { createMcpResponse } from "../utils/mcp-response.js";
3
+ import { logger } from "../utils/logger.js";
4
+ function hasMetadataLikeTitle(title) {
5
+ const normalized = title.trim();
6
+ return /^\[[^\]]{0,200}(agent:|role:|model:|\d{4}-\d{2}-\d{2}|source_)[^\]]*\]/i.test(normalized);
7
+ }
8
+ export async function handleMemoryUpdate(params, db, vectors) {
9
+ // Validate input
10
+ const validated = MemoryUpdateSchema.parse(params);
11
+ // Check if memory exists
12
+ const existing = db.getById(validated.id);
13
+ if (!existing) {
14
+ throw new Error(`Memory not found: ${validated.id}`);
15
+ }
16
+ if (validated.title !== undefined && hasMetadataLikeTitle(validated.title)) {
17
+ throw new Error("Title appears to contain metadata. Keep title concise and move agent/role/date details into metadata or dedicated fields.");
18
+ }
19
+ // Update in SQLite
20
+ const updates = {};
21
+ if (validated.type !== undefined)
22
+ updates.type = validated.type;
23
+ if (validated.title !== undefined)
24
+ updates.title = validated.title;
25
+ if (validated.content !== undefined)
26
+ updates.content = validated.content;
27
+ if (validated.importance !== undefined)
28
+ updates.importance = validated.importance;
29
+ if (validated.agent !== undefined)
30
+ updates.agent = validated.agent;
31
+ if (validated.role !== undefined)
32
+ updates.role = validated.role;
33
+ if (validated.status !== undefined)
34
+ updates.status = validated.status;
35
+ if (validated.supersedes !== undefined)
36
+ updates.supersedes = validated.supersedes;
37
+ if (validated.tags !== undefined)
38
+ updates.tags = validated.tags;
39
+ if (validated.metadata !== undefined)
40
+ updates.metadata = validated.metadata;
41
+ if (validated.is_global !== undefined)
42
+ updates.is_global = validated.is_global;
43
+ if (validated.completed_at !== undefined)
44
+ updates.completed_at = validated.completed_at;
45
+ db.update(validated.id, updates);
46
+ // Update vector if content changed
47
+ if (validated.content !== undefined) {
48
+ await vectors.upsert(validated.id, validated.content);
49
+ }
50
+ // Log the update action
51
+ db.logAction('update', existing.scope.repo, { memoryId: validated.id, resultCount: 1 });
52
+ logger.info("[MCP] memory.update", { repo: existing.scope.repo, id: validated.id, fields: Object.keys(updates) });
53
+ return createMcpResponse({
54
+ success: true,
55
+ id: validated.id,
56
+ repo: existing.scope.repo,
57
+ updatedFields: Object.keys(updates),
58
+ }, `Updated memory ${validated.id.slice(0, 8)}...`, {
59
+ resourceLinks: [
60
+ {
61
+ uri: `memory://${validated.id}`,
62
+ name: existing.title || validated.id,
63
+ description: `Updated memory in repo ${existing.scope.repo}`,
64
+ mimeType: "application/json",
65
+ annotations: {
66
+ audience: ["assistant"],
67
+ priority: 0.9,
68
+ },
69
+ },
70
+ ],
71
+ });
72
+ }
73
+ //# sourceMappingURL=memory.update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.update.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.update.ts"],"names":[],"mappings":"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"}