@danielmarbach/mnemonic-mcp 0.27.2 → 0.29.0

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 (250) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/README.md +7 -0
  3. package/build/auto-relate.d.ts.map +1 -1
  4. package/build/auto-relate.js +11 -5
  5. package/build/auto-relate.js.map +1 -1
  6. package/build/brands.d.ts +38 -0
  7. package/build/brands.d.ts.map +1 -0
  8. package/build/brands.js +51 -0
  9. package/build/brands.js.map +1 -0
  10. package/build/cache.d.ts.map +1 -1
  11. package/build/cache.js +10 -12
  12. package/build/cache.js.map +1 -1
  13. package/build/cli/import-claude-memory.d.ts +4 -0
  14. package/build/cli/import-claude-memory.d.ts.map +1 -0
  15. package/build/cli/import-claude-memory.js +146 -0
  16. package/build/cli/import-claude-memory.js.map +1 -0
  17. package/build/cli/migrate.d.ts +2 -0
  18. package/build/cli/migrate.d.ts.map +1 -0
  19. package/build/cli/migrate.js +104 -0
  20. package/build/cli/migrate.js.map +1 -0
  21. package/build/config.d.ts +2 -0
  22. package/build/config.d.ts.map +1 -1
  23. package/build/config.js +52 -23
  24. package/build/config.js.map +1 -1
  25. package/build/consolidate.d.ts +2 -1
  26. package/build/consolidate.d.ts.map +1 -1
  27. package/build/consolidate.js +3 -6
  28. package/build/consolidate.js.map +1 -1
  29. package/build/context.d.ts +5 -0
  30. package/build/context.d.ts.map +1 -0
  31. package/build/context.js +47 -0
  32. package/build/context.js.map +1 -0
  33. package/build/date-utils.d.ts +3 -0
  34. package/build/date-utils.d.ts.map +1 -0
  35. package/build/date-utils.js +10 -0
  36. package/build/date-utils.js.map +1 -0
  37. package/build/domain-errors.d.ts +49 -0
  38. package/build/domain-errors.d.ts.map +1 -0
  39. package/build/domain-errors.js +99 -0
  40. package/build/domain-errors.js.map +1 -0
  41. package/build/embeddings.d.ts +2 -1
  42. package/build/embeddings.d.ts.map +1 -1
  43. package/build/embeddings.js +39 -9
  44. package/build/embeddings.js.map +1 -1
  45. package/build/error-utils.d.ts +33 -0
  46. package/build/error-utils.d.ts.map +1 -0
  47. package/build/error-utils.js +65 -0
  48. package/build/error-utils.js.map +1 -0
  49. package/build/git-constants.d.ts +2 -0
  50. package/build/git-constants.d.ts.map +1 -0
  51. package/build/git-constants.js +2 -0
  52. package/build/git-constants.js.map +1 -0
  53. package/build/git.d.ts +27 -18
  54. package/build/git.d.ts.map +1 -1
  55. package/build/git.js +45 -24
  56. package/build/git.js.map +1 -1
  57. package/build/helpers/embed.d.ts +13 -0
  58. package/build/helpers/embed.d.ts.map +1 -0
  59. package/build/helpers/embed.js +68 -0
  60. package/build/helpers/embed.js.map +1 -0
  61. package/build/helpers/git-commit.d.ts +43 -0
  62. package/build/helpers/git-commit.d.ts.map +1 -0
  63. package/build/helpers/git-commit.js +129 -0
  64. package/build/helpers/git-commit.js.map +1 -0
  65. package/build/helpers/index.d.ts +19 -0
  66. package/build/helpers/index.d.ts.map +1 -0
  67. package/build/helpers/index.js +83 -0
  68. package/build/helpers/index.js.map +1 -0
  69. package/build/helpers/persistence.d.ts +34 -0
  70. package/build/helpers/persistence.d.ts.map +1 -0
  71. package/build/helpers/persistence.js +177 -0
  72. package/build/helpers/persistence.js.map +1 -0
  73. package/build/helpers/project.d.ts +21 -0
  74. package/build/helpers/project.d.ts.map +1 -0
  75. package/build/helpers/project.js +75 -0
  76. package/build/helpers/project.js.map +1 -0
  77. package/build/helpers/vault.d.ts +50 -0
  78. package/build/helpers/vault.d.ts.map +1 -0
  79. package/build/helpers/vault.js +196 -0
  80. package/build/helpers/vault.js.map +1 -0
  81. package/build/index.js +12 -5467
  82. package/build/index.js.map +1 -1
  83. package/build/lexical.d.ts +1 -1
  84. package/build/lexical.d.ts.map +1 -1
  85. package/build/lexical.js +2 -3
  86. package/build/lexical.js.map +1 -1
  87. package/build/markdown-ast.d.ts.map +1 -1
  88. package/build/markdown-ast.js +4 -2
  89. package/build/markdown-ast.js.map +1 -1
  90. package/build/migration.d.ts.map +1 -1
  91. package/build/migration.js +12 -8
  92. package/build/migration.js.map +1 -1
  93. package/build/project-introspection.d.ts +4 -4
  94. package/build/project-introspection.d.ts.map +1 -1
  95. package/build/project-introspection.js +71 -27
  96. package/build/project-introspection.js.map +1 -1
  97. package/build/project-memory-policy.d.ts.map +1 -1
  98. package/build/project-memory-policy.js +38 -3
  99. package/build/project-memory-policy.js.map +1 -1
  100. package/build/project.d.ts +2 -1
  101. package/build/project.d.ts.map +1 -1
  102. package/build/project.js +29 -41
  103. package/build/project.js.map +1 -1
  104. package/build/projections.d.ts.map +1 -1
  105. package/build/projections.js +3 -2
  106. package/build/projections.js.map +1 -1
  107. package/build/prompts.d.ts +3 -0
  108. package/build/prompts.d.ts.map +1 -0
  109. package/build/prompts.js +138 -0
  110. package/build/prompts.js.map +1 -0
  111. package/build/provenance.d.ts +9 -3
  112. package/build/provenance.d.ts.map +1 -1
  113. package/build/provenance.js +46 -15
  114. package/build/provenance.js.map +1 -1
  115. package/build/recall.d.ts +2 -1
  116. package/build/recall.d.ts.map +1 -1
  117. package/build/recall.js +30 -14
  118. package/build/recall.js.map +1 -1
  119. package/build/relationships.d.ts +2 -2
  120. package/build/relationships.d.ts.map +1 -1
  121. package/build/relationships.js +39 -43
  122. package/build/relationships.js.map +1 -1
  123. package/build/semantic-patch.d.ts.map +1 -1
  124. package/build/semantic-patch.js +16 -9
  125. package/build/semantic-patch.js.map +1 -1
  126. package/build/server-context.d.ts +18 -0
  127. package/build/server-context.d.ts.map +1 -0
  128. package/build/server-context.js +2 -0
  129. package/build/server-context.js.map +1 -0
  130. package/build/startup.d.ts +5 -0
  131. package/build/startup.d.ts.map +1 -0
  132. package/build/startup.js +37 -0
  133. package/build/startup.js.map +1 -0
  134. package/build/storage.d.ts +17 -15
  135. package/build/storage.d.ts.map +1 -1
  136. package/build/storage.js +67 -93
  137. package/build/storage.js.map +1 -1
  138. package/build/structured-content.d.ts +115 -74
  139. package/build/structured-content.d.ts.map +1 -1
  140. package/build/structured-content.js +41 -17
  141. package/build/structured-content.js.map +1 -1
  142. package/build/temporal-interpretation.d.ts +2 -1
  143. package/build/temporal-interpretation.d.ts.map +1 -1
  144. package/build/temporal-interpretation.js +15 -8
  145. package/build/temporal-interpretation.js.map +1 -1
  146. package/build/tools/consolidate-helpers.d.ts +55 -0
  147. package/build/tools/consolidate-helpers.d.ts.map +1 -0
  148. package/build/tools/consolidate-helpers.js +815 -0
  149. package/build/tools/consolidate-helpers.js.map +1 -0
  150. package/build/tools/consolidate.d.ts +4 -0
  151. package/build/tools/consolidate.d.ts.map +1 -0
  152. package/build/tools/consolidate.js +127 -0
  153. package/build/tools/consolidate.js.map +1 -0
  154. package/build/tools/detect-project.d.ts +6 -0
  155. package/build/tools/detect-project.d.ts.map +1 -0
  156. package/build/tools/detect-project.js +79 -0
  157. package/build/tools/detect-project.js.map +1 -0
  158. package/build/tools/discover-tags.d.ts +4 -0
  159. package/build/tools/discover-tags.d.ts.map +1 -0
  160. package/build/tools/discover-tags.js +236 -0
  161. package/build/tools/discover-tags.js.map +1 -0
  162. package/build/tools/forget.d.ts +4 -0
  163. package/build/tools/forget.d.ts.map +1 -0
  164. package/build/tools/forget.js +123 -0
  165. package/build/tools/forget.js.map +1 -0
  166. package/build/tools/get-project-identity.d.ts +4 -0
  167. package/build/tools/get-project-identity.d.ts.map +1 -0
  168. package/build/tools/get-project-identity.js +59 -0
  169. package/build/tools/get-project-identity.js.map +1 -0
  170. package/build/tools/get.d.ts +4 -0
  171. package/build/tools/get.d.ts.map +1 -0
  172. package/build/tools/get.js +115 -0
  173. package/build/tools/get.js.map +1 -0
  174. package/build/tools/index.d.ts +4 -0
  175. package/build/tools/index.d.ts.map +1 -0
  176. package/build/tools/index.js +47 -0
  177. package/build/tools/index.js.map +1 -0
  178. package/build/tools/list.d.ts +4 -0
  179. package/build/tools/list.d.ts.map +1 -0
  180. package/build/tools/list.js +95 -0
  181. package/build/tools/list.js.map +1 -0
  182. package/build/tools/memory-graph.d.ts +4 -0
  183. package/build/tools/memory-graph.d.ts.map +1 -0
  184. package/build/tools/memory-graph.js +84 -0
  185. package/build/tools/memory-graph.js.map +1 -0
  186. package/build/tools/migration.d.ts +5 -0
  187. package/build/tools/migration.d.ts.map +1 -0
  188. package/build/tools/migration.js +158 -0
  189. package/build/tools/migration.js.map +1 -0
  190. package/build/tools/move-memory.d.ts +4 -0
  191. package/build/tools/move-memory.d.ts.map +1 -0
  192. package/build/tools/move-memory.js +170 -0
  193. package/build/tools/move-memory.js.map +1 -0
  194. package/build/tools/policy.d.ts +5 -0
  195. package/build/tools/policy.d.ts.map +1 -0
  196. package/build/tools/policy.js +195 -0
  197. package/build/tools/policy.js.map +1 -0
  198. package/build/tools/project-memory-summary.d.ts +4 -0
  199. package/build/tools/project-memory-summary.d.ts.map +1 -0
  200. package/build/tools/project-memory-summary.js +477 -0
  201. package/build/tools/project-memory-summary.js.map +1 -0
  202. package/build/tools/recall-helpers.d.ts +40 -0
  203. package/build/tools/recall-helpers.d.ts.map +1 -0
  204. package/build/tools/recall-helpers.js +217 -0
  205. package/build/tools/recall-helpers.js.map +1 -0
  206. package/build/tools/recall.d.ts +4 -0
  207. package/build/tools/recall.d.ts.map +1 -0
  208. package/build/tools/recall.js +413 -0
  209. package/build/tools/recall.js.map +1 -0
  210. package/build/tools/recent-memories.d.ts +4 -0
  211. package/build/tools/recent-memories.d.ts.map +1 -0
  212. package/build/tools/recent-memories.js +79 -0
  213. package/build/tools/recent-memories.js.map +1 -0
  214. package/build/tools/relate.d.ts +4 -0
  215. package/build/tools/relate.d.ts.map +1 -0
  216. package/build/tools/relate.js +180 -0
  217. package/build/tools/relate.js.map +1 -0
  218. package/build/tools/remember.d.ts +4 -0
  219. package/build/tools/remember.d.ts.map +1 -0
  220. package/build/tools/remember.js +219 -0
  221. package/build/tools/remember.js.map +1 -0
  222. package/build/tools/set-project-identity.d.ts +4 -0
  223. package/build/tools/set-project-identity.d.ts.map +1 -0
  224. package/build/tools/set-project-identity.js +113 -0
  225. package/build/tools/set-project-identity.js.map +1 -0
  226. package/build/tools/sync.d.ts +4 -0
  227. package/build/tools/sync.d.ts.map +1 -0
  228. package/build/tools/sync.js +127 -0
  229. package/build/tools/sync.js.map +1 -0
  230. package/build/tools/unrelate.d.ts +4 -0
  231. package/build/tools/unrelate.d.ts.map +1 -0
  232. package/build/tools/unrelate.js +179 -0
  233. package/build/tools/unrelate.js.map +1 -0
  234. package/build/tools/update.d.ts +4 -0
  235. package/build/tools/update.d.ts.map +1 -0
  236. package/build/tools/update.js +364 -0
  237. package/build/tools/update.js.map +1 -0
  238. package/build/tools/where-is-memory.d.ts +4 -0
  239. package/build/tools/where-is-memory.d.ts.map +1 -0
  240. package/build/tools/where-is-memory.js +61 -0
  241. package/build/tools/where-is-memory.js.map +1 -0
  242. package/build/validation.d.ts +24 -0
  243. package/build/validation.d.ts.map +1 -0
  244. package/build/validation.js +62 -0
  245. package/build/validation.js.map +1 -0
  246. package/build/vault.d.ts.map +1 -1
  247. package/build/vault.js +38 -47
  248. package/build/vault.js.map +1 -1
  249. package/package.json +5 -2
  250. package/skills/mnemonic-rpi-workflow/SKILL.md +48 -17
@@ -0,0 +1,123 @@
1
+ import { z } from "zod";
2
+ import { NoteIdSchema, ForgetResultSchema, } from "../structured-content.js";
3
+ import { projectParam, resolveProject, noteProjectRef, ensureBranchSynced, } from "../helpers/project.js";
4
+ import { memoryId } from "../brands.js";
5
+ import { formatCommitBody, shouldBlockProtectedBranchCommit, wouldRelationshipCleanupTouchProjectVault, } from "../helpers/git-commit.js";
6
+ import { buildMutationRetryContract, formatRetrySummary, pushAfterMutation, } from "../helpers/persistence.js";
7
+ import { removeRelationshipsToNoteIds, addVaultChange, storageLabel, } from "../helpers/vault.js";
8
+ import { invalidateActiveProjectCache } from "../cache.js";
9
+ export function registerForgetTool(server, ctx) {
10
+ server.registerTool("forget", {
11
+ title: "Forget",
12
+ description: "Delete an existing memory by id and clean up dangling relationships.\n\n" +
13
+ "Use this when:\n" +
14
+ "- A memory should be removed entirely\n" +
15
+ "- A note is obsolete and should not remain searchable\n\n" +
16
+ "Do not use this when:\n" +
17
+ "- The note should stay but move to another vault; use `move_memory`\n" +
18
+ "- The note should be replaced or merged; use `consolidate`\n\n" +
19
+ "Returns:\n" +
20
+ "- Deleted memory id/title and relationship cleanup details\n\n" +
21
+ "Side effects: deletes note files, cleans relationship references, git commits, and may push.\n\n" +
22
+ "Typical next step:\n" +
23
+ "- Use `recall` or `list` to confirm the remaining memory set is clean.",
24
+ annotations: {
25
+ readOnlyHint: false,
26
+ destructiveHint: true,
27
+ idempotentHint: true,
28
+ openWorldHint: false,
29
+ },
30
+ inputSchema: z.object({
31
+ id: NoteIdSchema.describe("Exact memory id. Use an id returned by `recall`, `list`, `recent_memories`, or `where_is`."),
32
+ cwd: projectParam,
33
+ allowProtectedBranch: z
34
+ .boolean()
35
+ .optional()
36
+ .describe("One-time override for protected branch checks. " +
37
+ "When true, forget can commit on a protected branch without changing project policy."),
38
+ }),
39
+ outputSchema: ForgetResultSchema,
40
+ }, async ({ id, cwd, allowProtectedBranch = false }) => {
41
+ await ensureBranchSynced(ctx, cwd);
42
+ const found = await ctx.vaultManager.findNote(id, cwd);
43
+ if (!found) {
44
+ return { content: [{ type: "text", text: `No memory found with id '${id}'` }], isError: true };
45
+ }
46
+ const { note, vault: noteVault } = found;
47
+ const touchesProjectVault = noteVault.isProject || await wouldRelationshipCleanupTouchProjectVault(ctx, [id]);
48
+ if (touchesProjectVault) {
49
+ const resolvedProject = await resolveProject(ctx, cwd);
50
+ const projectLabel = resolvedProject
51
+ ? `${resolvedProject.name} (${resolvedProject.id})`
52
+ : `${note.projectName ?? "project"} (${note.project ?? "unknown"})`;
53
+ const policy = note.project ? await ctx.configStore.getProjectPolicy(note.project) : undefined;
54
+ const protectedBranchCheck = await shouldBlockProtectedBranchCommit({
55
+ ctx,
56
+ cwd,
57
+ writeScope: "project",
58
+ automaticCommit: true,
59
+ projectLabel,
60
+ policy,
61
+ allowProtectedBranch,
62
+ toolName: "forget",
63
+ });
64
+ if (protectedBranchCheck.blocked) {
65
+ return {
66
+ content: [{ type: "text", text: protectedBranchCheck.message ?? "Protected branch policy blocked this commit." }],
67
+ isError: true,
68
+ };
69
+ }
70
+ }
71
+ await noteVault.storage.deleteNote(memoryId(id));
72
+ // Clean up dangling references grouped by vault so we make one commit per vault
73
+ const vaultChanges = await removeRelationshipsToNoteIds(ctx, [id]);
74
+ // Always include the deleted note's path (git add on a deleted file stages the removal)
75
+ addVaultChange(vaultChanges, noteVault, ctx.vaultManager.noteRelPath(noteVault, id));
76
+ let retry;
77
+ for (const [v, files] of vaultChanges) {
78
+ const isPrimaryVault = v === noteVault;
79
+ const summary = isPrimaryVault ? `Deleted note and cleaned up ${files.length - 1} reference(s)` : "Cleaned up dangling reference";
80
+ const commitBody = formatCommitBody({
81
+ summary,
82
+ noteId: id,
83
+ noteTitle: note.title,
84
+ projectName: note.projectName,
85
+ });
86
+ const commitMessage = `forget: ${note.title}`;
87
+ const commitStatus = await v.git.commitWithStatus(commitMessage, files, commitBody);
88
+ if (!retry) {
89
+ retry = buildMutationRetryContract({
90
+ commit: commitStatus,
91
+ commitMessage,
92
+ commitBody,
93
+ files,
94
+ cwd,
95
+ vault: v,
96
+ mutationApplied: true,
97
+ });
98
+ }
99
+ if (commitStatus.status === "committed") {
100
+ await pushAfterMutation(ctx, v);
101
+ }
102
+ }
103
+ const structuredContent = {
104
+ action: "forgotten",
105
+ id,
106
+ title: note.title,
107
+ project: noteProjectRef(note),
108
+ relationshipsCleaned: vaultChanges.size > 0 ? Array.from(vaultChanges.values()).reduce((sum, files) => sum + files.length - 1, 0) : 0,
109
+ vaultsModified: Array.from(vaultChanges.keys()).map(v => storageLabel(v)),
110
+ retry,
111
+ };
112
+ const retrySummary = formatRetrySummary(retry);
113
+ invalidateActiveProjectCache();
114
+ return {
115
+ content: [{
116
+ type: "text",
117
+ text: `Forgotten '${id}' (${note.title})${retrySummary ? `\n${retrySummary}` : ""}`,
118
+ }],
119
+ structuredContent,
120
+ };
121
+ });
122
+ }
123
+ //# sourceMappingURL=forget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forget.js","sourceRoot":"","sources":["../../src/tools/forget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../server-context.js";
3
+ export declare function registerGetProjectIdentityTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=get-project-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-project-identity.d.ts","sourceRoot":"","sources":["../../src/tools/get-project-identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA2D1F"}
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ import { resolveProjectIdentityForCwd as resolveProjectIdentityForCwdFromModule } from "../helpers/project.js";
3
+ import { projectNotFoundResponse } from "../helpers/vault.js";
4
+ import { formatProjectIdentityText } from "./detect-project.js";
5
+ import { ProjectIdentityResultSchema } from "../structured-content.js";
6
+ export function registerGetProjectIdentityTool(server, ctx) {
7
+ server.registerTool("get_project_identity", {
8
+ title: "Get Project Identity",
9
+ description: "Show the effective project identity for a working directory, including any configured remote override.\n\n" +
10
+ "Use this when:\n" +
11
+ "- You need to verify whether project identity comes from `origin`, `upstream`, or an override\n" +
12
+ "- You are debugging project scoping issues\n\n" +
13
+ "Do not use this when:\n" +
14
+ "- You only need the project id/name to continue; use `detect_project` instead\n\n" +
15
+ "Returns:\n" +
16
+ "- Effective project identity, default identity, and any configured override\n\n" +
17
+ "Read-only.\n\n" +
18
+ "Typical next step:\n" +
19
+ "- Use `set_project_identity` only if the wrong remote is defining identity.",
20
+ annotations: {
21
+ readOnlyHint: true,
22
+ destructiveHint: false,
23
+ idempotentHint: true,
24
+ openWorldHint: false,
25
+ },
26
+ inputSchema: z.object({
27
+ cwd: z.string().describe("Absolute project working directory. Pass this whenever the task is project-related so routing, search boosting, policy, and vault selection work correctly."),
28
+ }),
29
+ outputSchema: ProjectIdentityResultSchema,
30
+ }, async ({ cwd }) => {
31
+ const identity = await resolveProjectIdentityForCwdFromModule(ctx, cwd);
32
+ if (!identity) {
33
+ return projectNotFoundResponse(cwd);
34
+ }
35
+ const structuredContent = {
36
+ action: "project_identity_shown",
37
+ project: {
38
+ id: identity.project.id,
39
+ name: identity.project.name,
40
+ source: identity.project.source,
41
+ remoteName: identity.project.remoteName,
42
+ },
43
+ defaultProject: identity.defaultProject ? {
44
+ id: identity.defaultProject.id,
45
+ name: identity.defaultProject.name,
46
+ remoteName: identity.defaultProject.remoteName,
47
+ } : undefined,
48
+ identityOverride: identity.identityOverride,
49
+ };
50
+ return {
51
+ content: [{
52
+ type: "text",
53
+ text: formatProjectIdentityText(identity),
54
+ }],
55
+ structuredContent,
56
+ };
57
+ });
58
+ }
59
+ //# sourceMappingURL=get-project-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-project-identity.js","sourceRoot":"","sources":["../../src/tools/get-project-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,4BAA4B,IAAI,sCAAsC,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAA8B,MAAM,0BAA0B,CAAC;AAEnG,MAAM,UAAU,8BAA8B,CAAC,MAAiB,EAAE,GAAkB;IAClF,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,4GAA4G;YAC5G,kBAAkB;YAClB,iGAAiG;YACjG,gDAAgD;YAChD,yBAAyB;YACzB,mFAAmF;YACnF,YAAY;YACZ,iFAAiF;YACjF,gBAAgB;YAChB,sBAAsB;YACtB,6EAA6E;QAC/E,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6JAA6J,CAAC;SACxL,CAAC;QACF,YAAY,EAAE,2BAA2B;KAC1C,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QAChB,MAAM,QAAQ,GAAG,MAAM,sCAAsC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,iBAAiB,GAA0B;YAC/C,MAAM,EAAE,wBAAwB;YAChC,OAAO,EAAE;gBACP,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE;gBACvB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI;gBAC3B,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;gBAC/B,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU;aACxC;YACD,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;gBACxC,EAAE,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE;gBAC9B,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI;gBAClC,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU;aAC/C,CAAC,CAAC,CAAC,SAAS;YACb,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;SAC5C,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,CAAC,QAAQ,CAAC;iBAC1C,CAAC;YACF,iBAAiB;SAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../server-context.js";
3
+ export declare function registerGetTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwB1D,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAyH3E"}
@@ -0,0 +1,115 @@
1
+ import { z } from "zod";
2
+ import { performance } from "perf_hooks";
3
+ import { GetResultSchema, NoteIdSchema, } from "../structured-content.js";
4
+ import { ensureBranchSynced, resolveProject, noteProjectRef, projectParam, } from "../helpers/project.js";
5
+ import { storageLabel } from "../helpers/vault.js";
6
+ import { formatRelationshipPreview } from "../helpers/index.js";
7
+ import { getSessionCachedNote, setSessionCachedNote, recordSessionNoteAccess, } from "../cache.js";
8
+ import { getRelationshipPreview } from "../relationships.js";
9
+ export function registerGetTool(server, ctx) {
10
+ server.registerTool("get", {
11
+ title: "Get Memory",
12
+ description: "Use after `recall`, `list`, or `recent_memories` when you need the full note content.\n\n" +
13
+ "Fetch one or more memories by exact id.\n\n" +
14
+ "Use this when:\n" +
15
+ "- You already know the memory id and need the full note content\n" +
16
+ "- A previous tool returned ids that you now want to inspect exactly\n\n" +
17
+ "Do not use this when:\n" +
18
+ "- You are still searching by topic; use `recall`\n" +
19
+ "- You want to browse many notes; use `list`\n\n" +
20
+ "Returns:\n" +
21
+ "- Full note content and metadata for the requested ids, including storage label\n" +
22
+ "- Bounded 1-hop relationship previews when `includeRelationships` is true (max 3 shown)\n\n" +
23
+ "Read-only.\n\n" +
24
+ "Typical next step:\n" +
25
+ "- Use `update`, `forget`, `move_memory`, or `relate` after inspection.",
26
+ annotations: {
27
+ readOnlyHint: true,
28
+ destructiveHint: false,
29
+ idempotentHint: true,
30
+ openWorldHint: false,
31
+ },
32
+ inputSchema: z.object({
33
+ ids: z.array(NoteIdSchema).min(1).describe("One or more memory ids to fetch"),
34
+ cwd: projectParam,
35
+ includeRelationships: z.boolean().optional().default(false).describe("Include bounded direct relationship previews (1-hop expansion, max 3 shown)"),
36
+ }),
37
+ outputSchema: GetResultSchema,
38
+ }, async ({ ids, cwd, includeRelationships }) => {
39
+ const t0Get = performance.now();
40
+ await ensureBranchSynced(ctx, cwd);
41
+ const project = await resolveProject(ctx, cwd);
42
+ const found = [];
43
+ const notFound = [];
44
+ for (const id of ids) {
45
+ // Check session cache before hitting storage
46
+ let result = null;
47
+ if (project) {
48
+ for (const vault of ctx.vaultManager.allKnownVaults()) {
49
+ const cached = getSessionCachedNote(project.id, vault.storage.vaultPath, id);
50
+ if (cached !== undefined) {
51
+ result = { note: cached, vault };
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ if (!result) {
57
+ result = await ctx.vaultManager.findNote(id, cwd);
58
+ }
59
+ if (!result) {
60
+ notFound.push(id);
61
+ continue;
62
+ }
63
+ const { note, vault } = result;
64
+ let relationships;
65
+ if (includeRelationships) {
66
+ relationships = await getRelationshipPreview(note, ctx.vaultManager.allKnownVaults(), { activeProjectId: project?.id, limit: 3 });
67
+ }
68
+ found.push({
69
+ id: note.id,
70
+ title: note.title,
71
+ content: note.content,
72
+ project: noteProjectRef(note),
73
+ tags: note.tags,
74
+ lifecycle: note.lifecycle,
75
+ role: note.role,
76
+ alwaysLoad: note.alwaysLoad,
77
+ relatedTo: note.relatedTo,
78
+ createdAt: note.createdAt,
79
+ updatedAt: note.updatedAt,
80
+ vault: storageLabel(vault),
81
+ relationships,
82
+ });
83
+ if (project) {
84
+ setSessionCachedNote(project.id, vault.storage.vaultPath, note);
85
+ recordSessionNoteAccess(project.id, vault.storage.vaultPath, note.id, "get");
86
+ }
87
+ }
88
+ const lines = [];
89
+ for (const note of found) {
90
+ lines.push(`## ${note.title} (${note.id})`);
91
+ lines.push(`project: ${note.project?.name ?? "global"} | stored: ${note.vault} | lifecycle: ${note.lifecycle}${note.role ? ` | role: ${note.role}` : ""}`);
92
+ if (note.tags.length > 0)
93
+ lines.push(`tags: ${note.tags.join(", ")}`);
94
+ lines.push("");
95
+ lines.push(note.content);
96
+ if (note.relationships) {
97
+ lines.push("");
98
+ lines.push(formatRelationshipPreview(note.relationships));
99
+ }
100
+ lines.push("");
101
+ }
102
+ if (notFound.length > 0) {
103
+ lines.push(`Not found: ${notFound.join(", ")}`);
104
+ }
105
+ const structuredContent = {
106
+ action: "got",
107
+ count: found.length,
108
+ notes: found,
109
+ notFound,
110
+ };
111
+ console.error(`[get:timing] ${(performance.now() - t0Get).toFixed(1)}ms`);
112
+ return { content: [{ type: "text", text: lines.join("\n").trim() }], structuredContent };
113
+ });
114
+ }
115
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAKzC,OAAO,EACL,eAAe,EACf,YAAY,GAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,GAAkB;IACnE,MAAM,CAAC,YAAY,CACjB,KAAK,EACL;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,2FAA2F;YAC3F,6CAA6C;YAC7C,kBAAkB;YAClB,mEAAmE;YACnE,yEAAyE;YACzE,yBAAyB;YACzB,oDAAoD;YACpD,iDAAiD;YACjD,YAAY;YACZ,mFAAmF;YACnF,6FAA6F;YAC7F,gBAAgB;YAChB,sBAAsB;YACtB,wEAAwE;QAC1E,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YAC7E,GAAG,EAAE,YAAY;YACjB,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,6EAA6E,CAAC;SACpJ,CAAC;QACF,YAAY,EAAE,eAAe;KAC9B,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEnC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,6CAA6C;YAC7C,IAAI,MAAM,GAAwC,IAAI,CAAC;YACvD,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC;oBACtD,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oBAC7E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;wBACzB,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;wBACjC,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YAE/B,IAAI,aAA8C,CAAC;YACnD,IAAI,oBAAoB,EAAE,CAAC;gBACzB,aAAa,GAAG,MAAM,sBAAsB,CAC1C,IAAI,EACJ,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,EACjC,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAC3C,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;gBAC1B,aAAa;aACd,CAAC,CAAC;YAEH,IAAI,OAAO,EAAE,CAAC;gBACZ,oBAAoB,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAChE,uBAAuB,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,cAAc,IAAI,CAAC,KAAK,iBAAiB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3J,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,iBAAiB,GAAc;YACnC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,KAAK,EAAE,KAAK;YACZ,QAAQ;SACT,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC3F,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../server-context.js";
3
+ export declare function registerAllTools(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwB1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAwB5E"}
@@ -0,0 +1,47 @@
1
+ import { registerDetectProjectTool } from "./detect-project.js";
2
+ import { registerGetProjectIdentityTool } from "./get-project-identity.js";
3
+ import { registerSetProjectIdentityTool } from "./set-project-identity.js";
4
+ import { registerListMigrationsTool, registerExecuteMigrationTool } from "./migration.js";
5
+ import { registerSetProjectMemoryPolicyTool, registerGetProjectMemoryPolicyTool } from "./policy.js";
6
+ import { registerRememberTool } from "./remember.js";
7
+ import { registerRecallTool } from "./recall.js";
8
+ import { registerUpdateTool } from "./update.js";
9
+ import { registerForgetTool } from "./forget.js";
10
+ import { registerGetTool } from "./get.js";
11
+ import { registerWhereIsMemoryTool } from "./where-is-memory.js";
12
+ import { registerListTool } from "./list.js";
13
+ import { registerDiscoverTagsTool } from "./discover-tags.js";
14
+ import { registerRecentMemoriesTool } from "./recent-memories.js";
15
+ import { registerMemoryGraphTool } from "./memory-graph.js";
16
+ import { registerProjectMemorySummaryTool } from "./project-memory-summary.js";
17
+ import { registerSyncTool } from "./sync.js";
18
+ import { registerMoveMemoryTool } from "./move-memory.js";
19
+ import { registerRelateTool } from "./relate.js";
20
+ import { registerUnrelateTool } from "./unrelate.js";
21
+ import { registerConsolidateTool } from "./consolidate.js";
22
+ export function registerAllTools(server, ctx) {
23
+ registerDetectProjectTool(server, ctx);
24
+ registerGetProjectIdentityTool(server, ctx);
25
+ registerSetProjectIdentityTool(server, ctx);
26
+ registerListMigrationsTool(server, ctx);
27
+ registerExecuteMigrationTool(server, ctx);
28
+ registerSetProjectMemoryPolicyTool(server, ctx);
29
+ registerGetProjectMemoryPolicyTool(server, ctx);
30
+ registerRememberTool(server, ctx);
31
+ registerRecallTool(server, ctx);
32
+ registerUpdateTool(server, ctx);
33
+ registerForgetTool(server, ctx);
34
+ registerGetTool(server, ctx);
35
+ registerWhereIsMemoryTool(server, ctx);
36
+ registerListTool(server, ctx);
37
+ registerDiscoverTagsTool(server, ctx);
38
+ registerRecentMemoriesTool(server, ctx);
39
+ registerMemoryGraphTool(server, ctx);
40
+ registerProjectMemorySummaryTool(server, ctx);
41
+ registerSyncTool(server, ctx);
42
+ registerMoveMemoryTool(server, ctx);
43
+ registerRelateTool(server, ctx);
44
+ registerUnrelateTool(server, ctx);
45
+ registerConsolidateTool(server, ctx);
46
+ }
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,kCAAkC,EAAE,kCAAkC,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,GAAkB;IACpE,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,8BAA8B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,8BAA8B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,4BAA4B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,kCAAkC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,kCAAkC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,gCAAgC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9C,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../server-context.js";
3
+ export declare function registerListTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAoH5E"}
@@ -0,0 +1,95 @@
1
+ import { z } from "zod";
2
+ import { ListResultSchema } from "../structured-content.js";
3
+ import { projectParam, ensureBranchSynced, noteProjectRef } from "../helpers/project.js";
4
+ import { collectVisibleNotes, formatListEntry, storageLabel } from "../helpers/vault.js";
5
+ export function registerListTool(server, ctx) {
6
+ server.registerTool("list", {
7
+ title: "List Memories",
8
+ description: "List stored memories with filtering by scope, storage label, and tags.\n\n" +
9
+ "Use this when:\n" +
10
+ "- You want to browse what exists for a project or globally\n" +
11
+ "- You want a deterministic filtered list rather than a semantic search\n" +
12
+ "- You are checking inventory before creating, updating, or consolidating notes\n\n" +
13
+ "Do not use this when:\n" +
14
+ "- You want topic-based semantic search; use `recall`\n" +
15
+ "- You already know the exact id; use `get`\n\n" +
16
+ "Returns:\n" +
17
+ "- Matching memories with ids, titles, scope/storage context, and metadata\n\n" +
18
+ "Read-only.\n\n" +
19
+ "Typical next step:\n" +
20
+ "- Use `get` for exact inspection or `update` / `consolidate` for cleanup.",
21
+ annotations: {
22
+ readOnlyHint: true,
23
+ destructiveHint: false,
24
+ idempotentHint: true,
25
+ openWorldHint: false,
26
+ },
27
+ inputSchema: z.object({
28
+ cwd: projectParam,
29
+ scope: z
30
+ .enum(["project", "global", "all"])
31
+ .optional()
32
+ .default("all")
33
+ .describe("'project' = only this project's memories (project-scoped storage); " +
34
+ "'global' = only unscoped memories (main/global storage); " +
35
+ "'all' = everything visible from this context (default)"),
36
+ storedIn: z
37
+ .enum(["project-vault", "main-vault", "any"])
38
+ .optional()
39
+ .default("any")
40
+ .describe("Storage-label filter. Use `main-vault` for main/global storage. " +
41
+ "Use `project-vault` as the broad filter for any project vault, including sub-vaults. " +
42
+ "Results may still return a more specific label such as `sub-vault:.mnemonic-lib`."),
43
+ tags: z.array(z.string()).optional().describe("Filter to notes matching all of these tags."),
44
+ includeRelations: z.boolean().optional().default(false).describe("Include related memory ids and relationship types"),
45
+ includePreview: z.boolean().optional().default(false).describe("Include a short content preview for each note"),
46
+ includeStorage: z.boolean().optional().default(false).describe("Show which vault each note is stored in"),
47
+ includeUpdated: z.boolean().optional().default(false).describe("Include last-updated timestamp for each note"),
48
+ }),
49
+ outputSchema: ListResultSchema,
50
+ }, async ({ cwd, scope, storedIn, tags, includeRelations, includePreview, includeStorage, includeUpdated }) => {
51
+ await ensureBranchSynced(ctx, cwd);
52
+ const { project, entries } = await collectVisibleNotes(ctx, cwd, scope, tags, storedIn);
53
+ if (entries.length === 0) {
54
+ const structuredContent = { action: "listed", count: 0, scope: scope || "all", storedIn: storedIn || "any", project: project ? { id: project.id, name: project.name } : undefined, notes: [] };
55
+ return { content: [{ type: "text", text: "No memories found." }], structuredContent };
56
+ }
57
+ const lines = entries.map((entry) => formatListEntry(entry, {
58
+ includeRelations,
59
+ includePreview,
60
+ includeStorage,
61
+ includeUpdated,
62
+ }));
63
+ const header = project && scope !== "global"
64
+ ? `${entries.length} memories (project: ${project.name}, scope: ${scope}, storedIn: ${storedIn}):`
65
+ : `${entries.length} memories (scope: ${scope}, storedIn: ${storedIn}):`;
66
+ const textContent = `${header}\n\n${lines.join("\n")}`;
67
+ const structuredNotes = entries.map(({ note, vault }) => ({
68
+ id: note.id,
69
+ title: note.title,
70
+ project: noteProjectRef(note),
71
+ tags: note.tags,
72
+ lifecycle: note.lifecycle,
73
+ role: note.role,
74
+ vault: storageLabel(vault),
75
+ updatedAt: note.updatedAt,
76
+ hasRelated: note.relatedTo && note.relatedTo.length > 0,
77
+ }));
78
+ const structuredContent = {
79
+ action: "listed",
80
+ count: entries.length,
81
+ scope: scope || "all",
82
+ storedIn: storedIn || "any",
83
+ project: project ? { id: project.id, name: project.name } : undefined,
84
+ notes: structuredNotes,
85
+ options: {
86
+ includeRelations,
87
+ includePreview,
88
+ includeStorage,
89
+ includeUpdated,
90
+ },
91
+ };
92
+ return { content: [{ type: "text", text: textContent }], structuredContent };
93
+ });
94
+ }
95
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../server-context.js";
3
+ export declare function registerMemoryGraphTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=memory-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-graph.d.ts","sourceRoot":"","sources":["../../src/tools/memory-graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAe1D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA2FnF"}
@@ -0,0 +1,84 @@
1
+ import { z } from "zod";
2
+ import { MemoryGraphResultSchema, } from "../structured-content.js";
3
+ import { projectParam, toProjectRef, ensureBranchSynced, } from "../helpers/project.js";
4
+ import { collectVisibleNotes, } from "../helpers/vault.js";
5
+ export function registerMemoryGraphTool(server, ctx) {
6
+ server.registerTool("memory_graph", {
7
+ title: "Memory Graph",
8
+ description: "Show memory nodes and their relationships as a graph-oriented view.\n\n" +
9
+ "Use this when:\n" +
10
+ "- You want to inspect how notes connect across a topic or project\n" +
11
+ "- You are evaluating whether relationships are too sparse or too dense\n\n" +
12
+ "Do not use this when:\n" +
13
+ "- You only need one note; use `get`\n" +
14
+ "- You only need ranked topic matches; use `recall`\n\n" +
15
+ "Returns:\n" +
16
+ "- Memory nodes and relationship edges for the requested slice\n\n" +
17
+ "Read-only.\n\n" +
18
+ "Typical next step:\n" +
19
+ "- Use `get`, `relate`, `unrelate`, or `consolidate` based on what the graph reveals.",
20
+ annotations: {
21
+ readOnlyHint: true,
22
+ destructiveHint: false,
23
+ idempotentHint: true,
24
+ openWorldHint: false,
25
+ },
26
+ inputSchema: z.object({
27
+ cwd: projectParam,
28
+ scope: z.enum(["project", "global", "all"]).optional().default("all"),
29
+ storedIn: z.enum(["project-vault", "main-vault", "any"]).optional().default("any"),
30
+ limit: z.number().int().min(1).max(50).optional().default(25),
31
+ }),
32
+ outputSchema: MemoryGraphResultSchema,
33
+ }, async ({ cwd, scope, storedIn, limit }) => {
34
+ await ensureBranchSynced(ctx, cwd);
35
+ const { project, entries } = await collectVisibleNotes(ctx, cwd, scope, undefined, storedIn);
36
+ if (entries.length === 0) {
37
+ const structuredContent = { action: "graph_shown", project: toProjectRef(project), nodes: [], limit, truncated: false };
38
+ return { content: [{ type: "text", text: "No memories found." }], structuredContent };
39
+ }
40
+ const visibleIds = new Set(entries.map((entry) => entry.note.id));
41
+ const lines = entries
42
+ .filter((entry) => (entry.note.relatedTo?.length ?? 0) > 0)
43
+ .slice(0, limit)
44
+ .map((entry) => {
45
+ const edges = (entry.note.relatedTo ?? [])
46
+ .filter((rel) => visibleIds.has(rel.id))
47
+ .map((rel) => `${rel.id} (${rel.type})`);
48
+ return edges.length > 0 ? `- ${entry.note.id} -> ${edges.join(", ")}` : null;
49
+ })
50
+ .filter(Boolean);
51
+ if (lines.length === 0) {
52
+ const structuredContent = { action: "graph_shown", project: toProjectRef(project), nodes: [], limit, truncated: false };
53
+ return { content: [{ type: "text", text: "No relationships found for that scope." }], structuredContent };
54
+ }
55
+ const header = project && scope !== "global"
56
+ ? `Memory graph for ${project.name}:`
57
+ : "Memory graph:";
58
+ const textContent = `${header}\n\n${lines.join("\n")}`;
59
+ // Build structured graph
60
+ const structuredNodes = entries
61
+ .filter((entry) => (entry.note.relatedTo?.length ?? 0) > 0)
62
+ .slice(0, limit)
63
+ .map((entry) => {
64
+ const edges = (entry.note.relatedTo ?? [])
65
+ .filter((rel) => visibleIds.has(rel.id))
66
+ .map((rel) => ({ toId: rel.id, type: rel.type }));
67
+ return {
68
+ id: entry.note.id,
69
+ title: entry.note.title,
70
+ edges: edges.length > 0 ? edges : [],
71
+ };
72
+ })
73
+ .filter((node) => node.edges.length > 0);
74
+ const structuredContent = {
75
+ action: "graph_shown",
76
+ project: toProjectRef(project),
77
+ nodes: structuredNodes,
78
+ limit,
79
+ truncated: structuredNodes.length < entries.filter(e => (e.note.relatedTo?.length ?? 0) > 0).length,
80
+ };
81
+ return { content: [{ type: "text", text: textContent }], structuredContent };
82
+ });
83
+ }
84
+ //# sourceMappingURL=memory-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-graph.js","sourceRoot":"","sources":["../../src/tools/memory-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,uBAAuB,GAExB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,GAAkB;IAC3E,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,yEAAyE;YACzE,kBAAkB;YAClB,qEAAqE;YACrE,4EAA4E;YAC5E,yBAAyB;YACzB,uCAAuC;YACvC,wDAAwD;YACxD,YAAY;YACZ,mEAAmE;YACnE,gBAAgB;YAChB,sBAAsB;YACtB,sFAAsF;QACxF,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;YACrE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;YAClF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;SAC9D,CAAC;QACF,YAAY,EAAE,uBAAuB;KACtC,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QACxC,MAAM,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEnC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,iBAAiB,GAAsB,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC3I,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC;QACxF,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,OAAO;aAClB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;aAC1D,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;iBACvC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACvC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,iBAAiB,GAAsB,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC3I,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wCAAwC,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC;QAC5G,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,KAAK,QAAQ;YAC1C,CAAC,CAAC,oBAAoB,OAAO,CAAC,IAAI,GAAG;YACrC,CAAC,CAAC,eAAe,CAAC;QAEpB,MAAM,WAAW,GAAG,GAAG,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAEvD,yBAAyB;QACzB,MAAM,eAAe,GAAG,OAAO;aAC5B,MAAM,CAAC,CAAC,KAAgB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;aACrE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACf,GAAG,CAAC,CAAC,KAAgB,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;iBACvC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACvC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO;gBACL,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;gBACjB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;gBACvB,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;aACrC,CAAC;QACJ,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,IAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE7D,MAAM,iBAAiB,GAAsB;YAC3C,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;YAC9B,KAAK,EAAE,eAAe;YACtB,KAAK;YACL,SAAS,EAAE,eAAe,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;SACpG,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/E,CAAC,CACF,CAAC;AACJ,CAAC"}