@danielmarbach/mnemonic-mcp 0.27.2 → 0.28.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 (244) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/build/auto-relate.d.ts.map +1 -1
  3. package/build/auto-relate.js +11 -5
  4. package/build/auto-relate.js.map +1 -1
  5. package/build/brands.d.ts +38 -0
  6. package/build/brands.d.ts.map +1 -0
  7. package/build/brands.js +51 -0
  8. package/build/brands.js.map +1 -0
  9. package/build/cache.d.ts.map +1 -1
  10. package/build/cache.js +2 -4
  11. package/build/cache.js.map +1 -1
  12. package/build/cli/import-claude-memory.d.ts +4 -0
  13. package/build/cli/import-claude-memory.d.ts.map +1 -0
  14. package/build/cli/import-claude-memory.js +144 -0
  15. package/build/cli/import-claude-memory.js.map +1 -0
  16. package/build/cli/migrate.d.ts +2 -0
  17. package/build/cli/migrate.d.ts.map +1 -0
  18. package/build/cli/migrate.js +104 -0
  19. package/build/cli/migrate.js.map +1 -0
  20. package/build/config.d.ts +2 -0
  21. package/build/config.d.ts.map +1 -1
  22. package/build/config.js +41 -14
  23. package/build/config.js.map +1 -1
  24. package/build/consolidate.d.ts +2 -1
  25. package/build/consolidate.d.ts.map +1 -1
  26. package/build/consolidate.js +3 -6
  27. package/build/consolidate.js.map +1 -1
  28. package/build/context.d.ts +5 -0
  29. package/build/context.d.ts.map +1 -0
  30. package/build/context.js +41 -0
  31. package/build/context.js.map +1 -0
  32. package/build/date-utils.d.ts +3 -0
  33. package/build/date-utils.d.ts.map +1 -0
  34. package/build/date-utils.js +10 -0
  35. package/build/date-utils.js.map +1 -0
  36. package/build/embeddings.d.ts +2 -1
  37. package/build/embeddings.d.ts.map +1 -1
  38. package/build/embeddings.js +24 -2
  39. package/build/embeddings.js.map +1 -1
  40. package/build/error-utils.d.ts +3 -0
  41. package/build/error-utils.d.ts.map +1 -0
  42. package/build/error-utils.js +9 -0
  43. package/build/error-utils.js.map +1 -0
  44. package/build/git-constants.d.ts +2 -0
  45. package/build/git-constants.d.ts.map +1 -0
  46. package/build/git-constants.js +2 -0
  47. package/build/git-constants.js.map +1 -0
  48. package/build/git.d.ts +27 -18
  49. package/build/git.d.ts.map +1 -1
  50. package/build/git.js +39 -22
  51. package/build/git.js.map +1 -1
  52. package/build/helpers/embed.d.ts +13 -0
  53. package/build/helpers/embed.d.ts.map +1 -0
  54. package/build/helpers/embed.js +70 -0
  55. package/build/helpers/embed.js.map +1 -0
  56. package/build/helpers/git-commit.d.ts +43 -0
  57. package/build/helpers/git-commit.d.ts.map +1 -0
  58. package/build/helpers/git-commit.js +129 -0
  59. package/build/helpers/git-commit.js.map +1 -0
  60. package/build/helpers/index.d.ts +19 -0
  61. package/build/helpers/index.d.ts.map +1 -0
  62. package/build/helpers/index.js +83 -0
  63. package/build/helpers/index.js.map +1 -0
  64. package/build/helpers/persistence.d.ts +34 -0
  65. package/build/helpers/persistence.d.ts.map +1 -0
  66. package/build/helpers/persistence.js +176 -0
  67. package/build/helpers/persistence.js.map +1 -0
  68. package/build/helpers/project.d.ts +21 -0
  69. package/build/helpers/project.d.ts.map +1 -0
  70. package/build/helpers/project.js +75 -0
  71. package/build/helpers/project.js.map +1 -0
  72. package/build/helpers/vault.d.ts +50 -0
  73. package/build/helpers/vault.d.ts.map +1 -0
  74. package/build/helpers/vault.js +196 -0
  75. package/build/helpers/vault.js.map +1 -0
  76. package/build/index.js +12 -5467
  77. package/build/index.js.map +1 -1
  78. package/build/lexical.d.ts +1 -1
  79. package/build/lexical.d.ts.map +1 -1
  80. package/build/lexical.js +2 -3
  81. package/build/lexical.js.map +1 -1
  82. package/build/markdown-ast.d.ts.map +1 -1
  83. package/build/markdown-ast.js +4 -2
  84. package/build/markdown-ast.js.map +1 -1
  85. package/build/migration.d.ts.map +1 -1
  86. package/build/migration.js +6 -5
  87. package/build/migration.js.map +1 -1
  88. package/build/project-introspection.d.ts +4 -4
  89. package/build/project-introspection.d.ts.map +1 -1
  90. package/build/project-introspection.js +68 -26
  91. package/build/project-introspection.js.map +1 -1
  92. package/build/project-memory-policy.d.ts.map +1 -1
  93. package/build/project-memory-policy.js +38 -3
  94. package/build/project-memory-policy.js.map +1 -1
  95. package/build/project.d.ts +2 -1
  96. package/build/project.d.ts.map +1 -1
  97. package/build/project.js +5 -4
  98. package/build/project.js.map +1 -1
  99. package/build/projections.d.ts.map +1 -1
  100. package/build/projections.js +2 -1
  101. package/build/projections.js.map +1 -1
  102. package/build/prompts.d.ts +3 -0
  103. package/build/prompts.d.ts.map +1 -0
  104. package/build/prompts.js +138 -0
  105. package/build/prompts.js.map +1 -0
  106. package/build/provenance.d.ts +1 -1
  107. package/build/provenance.d.ts.map +1 -1
  108. package/build/provenance.js +8 -11
  109. package/build/provenance.js.map +1 -1
  110. package/build/recall.d.ts +2 -1
  111. package/build/recall.d.ts.map +1 -1
  112. package/build/recall.js +29 -14
  113. package/build/recall.js.map +1 -1
  114. package/build/relationships.d.ts +2 -2
  115. package/build/relationships.d.ts.map +1 -1
  116. package/build/relationships.js +34 -38
  117. package/build/relationships.js.map +1 -1
  118. package/build/semantic-patch.d.ts.map +1 -1
  119. package/build/semantic-patch.js +10 -4
  120. package/build/semantic-patch.js.map +1 -1
  121. package/build/server-context.d.ts +18 -0
  122. package/build/server-context.d.ts.map +1 -0
  123. package/build/server-context.js +2 -0
  124. package/build/server-context.js.map +1 -0
  125. package/build/startup.d.ts +5 -0
  126. package/build/startup.d.ts.map +1 -0
  127. package/build/startup.js +37 -0
  128. package/build/startup.js.map +1 -0
  129. package/build/storage.d.ts +17 -15
  130. package/build/storage.d.ts.map +1 -1
  131. package/build/storage.js +32 -40
  132. package/build/storage.js.map +1 -1
  133. package/build/structured-content.d.ts +81 -74
  134. package/build/structured-content.d.ts.map +1 -1
  135. package/build/structured-content.js +25 -17
  136. package/build/structured-content.js.map +1 -1
  137. package/build/temporal-interpretation.d.ts +2 -1
  138. package/build/temporal-interpretation.d.ts.map +1 -1
  139. package/build/temporal-interpretation.js +13 -7
  140. package/build/temporal-interpretation.js.map +1 -1
  141. package/build/tools/consolidate-helpers.d.ts +55 -0
  142. package/build/tools/consolidate-helpers.d.ts.map +1 -0
  143. package/build/tools/consolidate-helpers.js +815 -0
  144. package/build/tools/consolidate-helpers.js.map +1 -0
  145. package/build/tools/consolidate.d.ts +4 -0
  146. package/build/tools/consolidate.d.ts.map +1 -0
  147. package/build/tools/consolidate.js +127 -0
  148. package/build/tools/consolidate.js.map +1 -0
  149. package/build/tools/detect-project.d.ts +6 -0
  150. package/build/tools/detect-project.d.ts.map +1 -0
  151. package/build/tools/detect-project.js +79 -0
  152. package/build/tools/detect-project.js.map +1 -0
  153. package/build/tools/discover-tags.d.ts +4 -0
  154. package/build/tools/discover-tags.d.ts.map +1 -0
  155. package/build/tools/discover-tags.js +236 -0
  156. package/build/tools/discover-tags.js.map +1 -0
  157. package/build/tools/forget.d.ts +4 -0
  158. package/build/tools/forget.d.ts.map +1 -0
  159. package/build/tools/forget.js +123 -0
  160. package/build/tools/forget.js.map +1 -0
  161. package/build/tools/get-project-identity.d.ts +4 -0
  162. package/build/tools/get-project-identity.d.ts.map +1 -0
  163. package/build/tools/get-project-identity.js +59 -0
  164. package/build/tools/get-project-identity.js.map +1 -0
  165. package/build/tools/get.d.ts +4 -0
  166. package/build/tools/get.d.ts.map +1 -0
  167. package/build/tools/get.js +115 -0
  168. package/build/tools/get.js.map +1 -0
  169. package/build/tools/index.d.ts +4 -0
  170. package/build/tools/index.d.ts.map +1 -0
  171. package/build/tools/index.js +47 -0
  172. package/build/tools/index.js.map +1 -0
  173. package/build/tools/list.d.ts +4 -0
  174. package/build/tools/list.d.ts.map +1 -0
  175. package/build/tools/list.js +95 -0
  176. package/build/tools/list.js.map +1 -0
  177. package/build/tools/memory-graph.d.ts +4 -0
  178. package/build/tools/memory-graph.d.ts.map +1 -0
  179. package/build/tools/memory-graph.js +84 -0
  180. package/build/tools/memory-graph.js.map +1 -0
  181. package/build/tools/migration.d.ts +5 -0
  182. package/build/tools/migration.d.ts.map +1 -0
  183. package/build/tools/migration.js +157 -0
  184. package/build/tools/migration.js.map +1 -0
  185. package/build/tools/move-memory.d.ts +4 -0
  186. package/build/tools/move-memory.d.ts.map +1 -0
  187. package/build/tools/move-memory.js +170 -0
  188. package/build/tools/move-memory.js.map +1 -0
  189. package/build/tools/policy.d.ts +5 -0
  190. package/build/tools/policy.d.ts.map +1 -0
  191. package/build/tools/policy.js +195 -0
  192. package/build/tools/policy.js.map +1 -0
  193. package/build/tools/project-memory-summary.d.ts +4 -0
  194. package/build/tools/project-memory-summary.d.ts.map +1 -0
  195. package/build/tools/project-memory-summary.js +477 -0
  196. package/build/tools/project-memory-summary.js.map +1 -0
  197. package/build/tools/recall-helpers.d.ts +28 -0
  198. package/build/tools/recall-helpers.d.ts.map +1 -0
  199. package/build/tools/recall-helpers.js +137 -0
  200. package/build/tools/recall-helpers.js.map +1 -0
  201. package/build/tools/recall.d.ts +4 -0
  202. package/build/tools/recall.d.ts.map +1 -0
  203. package/build/tools/recall.js +343 -0
  204. package/build/tools/recall.js.map +1 -0
  205. package/build/tools/recent-memories.d.ts +4 -0
  206. package/build/tools/recent-memories.d.ts.map +1 -0
  207. package/build/tools/recent-memories.js +79 -0
  208. package/build/tools/recent-memories.js.map +1 -0
  209. package/build/tools/relate.d.ts +4 -0
  210. package/build/tools/relate.d.ts.map +1 -0
  211. package/build/tools/relate.js +180 -0
  212. package/build/tools/relate.js.map +1 -0
  213. package/build/tools/remember.d.ts +4 -0
  214. package/build/tools/remember.d.ts.map +1 -0
  215. package/build/tools/remember.js +219 -0
  216. package/build/tools/remember.js.map +1 -0
  217. package/build/tools/set-project-identity.d.ts +4 -0
  218. package/build/tools/set-project-identity.d.ts.map +1 -0
  219. package/build/tools/set-project-identity.js +113 -0
  220. package/build/tools/set-project-identity.js.map +1 -0
  221. package/build/tools/sync.d.ts +4 -0
  222. package/build/tools/sync.d.ts.map +1 -0
  223. package/build/tools/sync.js +127 -0
  224. package/build/tools/sync.js.map +1 -0
  225. package/build/tools/unrelate.d.ts +4 -0
  226. package/build/tools/unrelate.d.ts.map +1 -0
  227. package/build/tools/unrelate.js +179 -0
  228. package/build/tools/unrelate.js.map +1 -0
  229. package/build/tools/update.d.ts +4 -0
  230. package/build/tools/update.d.ts.map +1 -0
  231. package/build/tools/update.js +365 -0
  232. package/build/tools/update.js.map +1 -0
  233. package/build/tools/where-is-memory.d.ts +4 -0
  234. package/build/tools/where-is-memory.d.ts.map +1 -0
  235. package/build/tools/where-is-memory.js +61 -0
  236. package/build/tools/where-is-memory.js.map +1 -0
  237. package/build/validation.d.ts +24 -0
  238. package/build/validation.d.ts.map +1 -0
  239. package/build/validation.js +62 -0
  240. package/build/validation.js.map +1 -0
  241. package/build/vault.d.ts.map +1 -1
  242. package/build/vault.js +11 -5
  243. package/build/vault.js.map +1 -1
  244. package/package.json +2 -1
@@ -0,0 +1,137 @@
1
+ import { getEffectiveMetadata } from "../role-suggestions.js";
2
+ import { computeRecallMetadataBoost, shouldApplyTemporalFiltering, computeTemporalRecencyBoost, isWithinTemporalFilterWindow } from "../recall.js";
3
+ import { getOrBuildProjection } from "../projections.js";
4
+ import { getSessionCachedProjectionTokens, setSessionCachedProjectionTokens } from "../cache.js";
5
+ import { tokenize, prepareTfIdfCorpusFromTokenizedDocuments, rankDocumentsByTfIdf, LEXICAL_RESCUE_CANDIDATE_LIMIT, LEXICAL_RESCUE_THRESHOLD, LEXICAL_RESCUE_RESULT_LIMIT } from "../lexical.js";
6
+ // ── Recall candidate context ──────────────────────────────────────────────────
7
+ export function buildRecallCandidateContext(note) {
8
+ const metadata = getEffectiveMetadata(note);
9
+ const relatedCount = note.relatedTo?.length ?? 0;
10
+ return {
11
+ metadata,
12
+ metadataBoost: computeRecallMetadataBoost(metadata),
13
+ lifecycle: note.lifecycle,
14
+ relatedCount,
15
+ connectionDiversity: new Set((note.relatedTo ?? []).map((rel) => rel.type)).size,
16
+ structureScore: Math.min(0.04, [
17
+ note.content.includes("## ") ? 0.02 : 0,
18
+ note.content.includes("- ") || note.content.includes("1. ") ? 0.01 : 0,
19
+ note.content.length >= 400 ? 0.01 : 0,
20
+ ].reduce((sum, value) => sum + value, 0)),
21
+ };
22
+ }
23
+ // ── Lexical rescue ────────────────────────────────────────────────────────────
24
+ export const PROJECT_SCOPE_BOOST = 0.03;
25
+ export async function collectLexicalRescueCandidates(vaults, query, temporalQueryHint, project, scope, tags, lifecycle, existingIds) {
26
+ const projectId = project?.id;
27
+ const applyTemporalFilter = shouldApplyTemporalFiltering(temporalQueryHint);
28
+ const temporalFilterWindowDays = applyTemporalFilter ? temporalQueryHint?.filterWindowDays : undefined;
29
+ const existingIdSet = new Set(existingIds.map((c) => c.id));
30
+ const rescuePool = [];
31
+ for (const vault of vaults) {
32
+ const notes = await vault.storage.listNotes().catch(() => []);
33
+ for (const note of notes) {
34
+ if (existingIdSet.has(note.id))
35
+ continue;
36
+ if (tags && tags.length > 0) {
37
+ const noteTags = new Set(note.tags);
38
+ if (!tags.every((t) => noteTags.has(t)))
39
+ continue;
40
+ }
41
+ if (lifecycle && note.lifecycle !== lifecycle)
42
+ continue;
43
+ const isProjectNote = note.project !== undefined;
44
+ const isCurrentProject = project && note.project === project.id;
45
+ if (scope === "project" && !isCurrentProject)
46
+ continue;
47
+ if (scope === "global" && isProjectNote)
48
+ continue;
49
+ if (applyTemporalFilter
50
+ && temporalFilterWindowDays !== undefined
51
+ && !isWithinTemporalFilterWindow(note.updatedAt, temporalFilterWindowDays)) {
52
+ continue;
53
+ }
54
+ const projection = await getOrBuildProjection(vault.storage, note).catch(() => undefined);
55
+ if (!projection)
56
+ continue;
57
+ rescuePool.push({
58
+ id: note.id,
59
+ vault,
60
+ isCurrentProject: Boolean(isCurrentProject),
61
+ updatedAt: note.updatedAt,
62
+ projectionText: projection.projectionText,
63
+ projectionTokens: projectId
64
+ ? getSessionCachedProjectionTokens(projectId, vault.storage.vaultPath, note.id, projection.projectionText) ?? tokenize(projection.projectionText)
65
+ : tokenize(projection.projectionText),
66
+ context: buildRecallCandidateContext(note),
67
+ });
68
+ if (projectId) {
69
+ setSessionCachedProjectionTokens(projectId, vault.storage.vaultPath, note.id, projection.projectionText, rescuePool[rescuePool.length - 1].projectionTokens);
70
+ }
71
+ }
72
+ }
73
+ const rescueDocuments = rescuePool.map((candidate) => ({
74
+ id: candidate.id,
75
+ text: candidate.projectionText,
76
+ }));
77
+ const preparedRescueCorpus = prepareTfIdfCorpusFromTokenizedDocuments(rescuePool.map((candidate) => ({
78
+ id: candidate.id,
79
+ text: candidate.projectionText,
80
+ tokens: candidate.projectionTokens,
81
+ })));
82
+ const rankedRescueIds = new Map(rankDocumentsByTfIdf(query, rescueDocuments, LEXICAL_RESCUE_CANDIDATE_LIMIT, preparedRescueCorpus).map((candidate) => [candidate.id, candidate.score]));
83
+ const candidates = [];
84
+ for (const candidate of rescuePool) {
85
+ const tfIdfScore = rankedRescueIds.get(candidate.id);
86
+ if (tfIdfScore === undefined || tfIdfScore <= 0)
87
+ continue;
88
+ const lexicalScore = tfIdfScore;
89
+ if (lexicalScore < LEXICAL_RESCUE_THRESHOLD)
90
+ continue;
91
+ const temporalBoost = temporalQueryHint
92
+ ? computeTemporalRecencyBoost(candidate.updatedAt, temporalQueryHint)
93
+ : 0;
94
+ const boost = (candidate.isCurrentProject ? PROJECT_SCOPE_BOOST : 0) + candidate.context.metadataBoost + temporalBoost;
95
+ candidates.push({
96
+ id: candidate.id,
97
+ score: lexicalScore,
98
+ semanticScoreForPromotion: 0,
99
+ boosted: boost,
100
+ vault: candidate.vault,
101
+ isCurrentProject: candidate.isCurrentProject,
102
+ lexicalScore,
103
+ lifecycle: candidate.context.lifecycle,
104
+ relatedCount: candidate.context.relatedCount,
105
+ connectionDiversity: candidate.context.connectionDiversity,
106
+ structureScore: candidate.context.structureScore,
107
+ metadata: candidate.context.metadata,
108
+ });
109
+ }
110
+ return candidates
111
+ .sort((a, b) => (b.lexicalScore ?? 0) - (a.lexicalScore ?? 0))
112
+ .slice(0, LEXICAL_RESCUE_RESULT_LIMIT);
113
+ }
114
+ export function tokenizeTagDiscoveryText(value) {
115
+ return value
116
+ .toLowerCase()
117
+ .split(/[^a-z0-9]+/)
118
+ .filter(Boolean);
119
+ }
120
+ export function countTokenOverlap(tokens, other) {
121
+ let matches = 0;
122
+ for (const token of other) {
123
+ if (tokens.has(token)) {
124
+ matches++;
125
+ }
126
+ }
127
+ return matches;
128
+ }
129
+ export function escapeRegex(value) {
130
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
131
+ }
132
+ export function hasExactTagContextMatch(tag, values) {
133
+ const normalizedTag = tag.toLowerCase();
134
+ const pattern = new RegExp(`(^|[^a-z0-9_-])${escapeRegex(normalizedTag)}([^a-z0-9_-]|$)`);
135
+ return values.some(value => value ? pattern.test(value.toLowerCase()) : false);
136
+ }
137
+ //# sourceMappingURL=recall-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall-helpers.js","sourceRoot":"","sources":["../../src/tools/recall-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAsD,4BAA4B,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AACvM,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gCAAgC,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAE,wCAAwC,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAEhM,iFAAiF;AAEjF,MAAM,UAAU,2BAA2B,CAAC,IAAU;IACpD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC;IACjD,OAAO;QACL,QAAQ;QACR,aAAa,EAAE,0BAA0B,CAAC,QAAQ,CAAC;QACnD,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY;QACZ,mBAAmB,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAChF,cAAc,EAAE,IAAI,CAAC,GAAG,CACtB,IAAI,EACJ;YACE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACtC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CACzC;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAe,EACf,KAAa,EACb,iBAAgD,EAChD,OAAiD,EACjD,KAAmC,EACnC,IAA0B,EAC1B,SAAoC,EACpC,WAAoC;IAEpC,MAAM,SAAS,GAAG,OAAO,EAAE,EAAE,CAAC;IAC9B,MAAM,mBAAmB,GAAG,4BAA4B,CAAC,iBAAiB,CAAC,CAAC;IAC5E,MAAM,wBAAwB,GAAG,mBAAmB,CAAC,CAAC,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IACvG,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,UAAU,GAQX,EAAE,CAAC;IAER,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,SAAS;YAEzC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAAE,SAAS;YACpD,CAAC;YAED,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;gBAAE,SAAS;YAExD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;YACjD,MAAM,gBAAgB,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;YAEhE,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,gBAAgB;gBAAE,SAAS;YACvD,IAAI,KAAK,KAAK,QAAQ,IAAI,aAAa;gBAAE,SAAS;YAClD,IACE,mBAAmB;mBAChB,wBAAwB,KAAK,SAAS;mBACtC,CAAC,4BAA4B,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,EAC1E,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1F,IAAI,CAAC,UAAU;gBAAE,SAAS;YAE1B,UAAU,CAAC,IAAI,CAAC;gBACd,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK;gBACL,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,CAAC;gBAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,gBAAgB,EAAE,SAAS;oBACzB,CAAC,CAAC,gCAAgC,CAChC,SAAS,EACT,KAAK,CAAC,OAAO,CAAC,SAAS,EACvB,IAAI,CAAC,EAAE,EACP,UAAU,CAAC,cAAc,CAC1B,IAAI,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC;oBACxC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC;gBACvC,OAAO,EAAE,2BAA2B,CAAC,IAAI,CAAC;aAC3C,CAAC,CAAC;YAEH,IAAI,SAAS,EAAE,CAAC;gBACd,gCAAgC,CAC9B,SAAS,EACT,KAAK,CAAC,OAAO,CAAC,SAAS,EACvB,IAAI,CAAC,EAAE,EACP,UAAU,CAAC,cAAc,EACzB,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,gBAAgB,CACpD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACrD,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,SAAS,CAAC,cAAc;KAC/B,CAAC,CAAC,CAAC;IAEJ,MAAM,oBAAoB,GAAG,wCAAwC,CACnE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC7B,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,SAAS,CAAC,cAAc;QAC9B,MAAM,EAAE,SAAS,CAAC,gBAAgB;KACnC,CAAC,CAAC,CACJ,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,oBAAoB,CAClB,KAAK,EACL,eAAe,EACf,8BAA8B,EAC9B,oBAAoB,CACrB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CACtD,CAAC;IAEF,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACrD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,IAAI,CAAC;YAAE,SAAS;QAE1D,MAAM,YAAY,GAAG,UAAU,CAAC;QAChC,IAAI,YAAY,GAAG,wBAAwB;YAAE,SAAS;QAEtD,MAAM,aAAa,GAAG,iBAAiB;YACrC,CAAC,CAAC,2BAA2B,CAAC,SAAS,CAAC,SAAS,EAAE,iBAAiB,CAAC;YACrE,CAAC,CAAC,CAAC,CAAC;QACN,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QACvH,UAAU,CAAC,IAAI,CAAC;YACd,EAAE,EAAE,SAAS,CAAC,EAAE;YAChB,KAAK,EAAE,YAAY;YACnB,yBAAyB,EAAE,CAAC;YAC5B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;YAC5C,YAAY;YACZ,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS;YACtC,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,YAAY;YAC5C,mBAAmB,EAAE,SAAS,CAAC,OAAO,CAAC,mBAAmB;YAC1D,cAAc,EAAE,SAAS,CAAC,OAAO,CAAC,cAAc;YAChD,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ;SACrC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU;SACd,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;SAC7D,KAAK,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;AAC3C,CAAC;AAYD,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,KAAK;SACT,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAmB,EAAE,KAAuB;IAC5E,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,MAAiC;IACpF,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,kBAAkB,WAAW,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC1F,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACjF,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 registerRecallTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/tools/recall.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgE1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA+a9E"}
@@ -0,0 +1,343 @@
1
+ import { z } from "zod";
2
+ import { performance } from "perf_hooks";
3
+ import { memoryId } from "../brands.js";
4
+ import { RecallResultSchema, } from "../structured-content.js";
5
+ import { embed, cosineSimilarity } from "../embeddings.js";
6
+ import { detectTemporalQueryHint, shouldApplyTemporalFiltering, isWithinTemporalFilterWindow, computeTemporalRecencyBoost, computeHybridScore, selectRecallResults, selectWorkflowResults, applyLexicalReranking, enrichRescueCandidateScores, resolveDiscoveredVaults, applyCanonicalExplanationPromotion, applyGraphSpreadingActivation, assignDenseRanks, } from "../recall.js";
7
+ import { shouldTriggerLexicalRescue } from "../lexical.js";
8
+ import { getOrBuildVaultEmbeddings, setSessionCachedProjection, getSessionCachedProjection, recordSessionNoteAccess, setSessionCachedNote, getSessionCachedNote, } from "../cache.js";
9
+ import { getOrBuildProjection } from "../projections.js";
10
+ import { embedMissingNotes } from "../helpers/embed.js";
11
+ import { ensureBranchSynced, resolveProject, noteProjectRef, projectParam, } from "../helpers/project.js";
12
+ import { storageLabel } from "../helpers/vault.js";
13
+ import { formatNote, formatTemporalHistory, formatRelationshipPreview, toRecallFreshness, toRecallRankBand, formatRetrievalEvidenceHint, } from "../helpers/index.js";
14
+ import { getNoteProvenance, buildTemporalHistoryEntry, computeConfidence, } from "../provenance.js";
15
+ import { enrichTemporalHistory } from "../temporal-interpretation.js";
16
+ import { getRelationshipPreview } from "../relationships.js";
17
+ import { collectLexicalRescueCandidates, buildRecallCandidateContext } from "./recall-helpers.js";
18
+ export function registerRecallTool(server, ctx) {
19
+ server.registerTool("recall", {
20
+ title: "Recall",
21
+ description: "Semantic search over stored memories using embeddings.\n\n" +
22
+ "Supports opt-in temporal mode (`mode: \"temporal\"`) to enrich top semantic matches with compact git-backed history.\n\n" +
23
+ "Supports workflow mode (`mode: \"workflow\"`) to prioritize RPIR-style chain reconstruction while retaining compatibility with legacy relationships.\n\n" +
24
+ "Use this when:\n" +
25
+ "- You know the topic but not the exact memory id\n" +
26
+ "- You are starting a session and want relevant prior context\n" +
27
+ "- You want to check whether a memory already exists before creating another one\n" +
28
+ "- You explicitly want to inspect how a note evolved over time\n\n" +
29
+ "Do not use this when:\n" +
30
+ "- You already know the exact id; use `get`\n" +
31
+ "- You just want to browse by tags or scope; use `list`\n\n" +
32
+ "Returns:\n" +
33
+ "- Ranked memory matches with scores, vault label, tags, lifecycle, and updated time\n" +
34
+ "- Bounded 1-hop relationship previews automatically attached to top results\n" +
35
+ "- In temporal mode, optional compact history entries for top matches\n" +
36
+ "- Optional retrieval evidence via `evidence: \"compact\"` for why a result ranked\n\n" +
37
+ "Read-only.\n\n" +
38
+ "Typical next step:\n" +
39
+ "- Use `get`, `update`, `relate`, or `consolidate` based on the results.",
40
+ annotations: {
41
+ readOnlyHint: true,
42
+ destructiveHint: false,
43
+ idempotentHint: true,
44
+ openWorldHint: true,
45
+ },
46
+ inputSchema: z.object({
47
+ query: z.string().describe("Natural-language search query describing the topic, decision, bug, preference, or context you want to find."),
48
+ cwd: projectParam,
49
+ limit: z.number().int().min(1).max(20).optional().default(ctx.defaultRecallLimit),
50
+ minSimilarity: z.number().min(0).max(1).optional().default(ctx.defaultMinSimilarity),
51
+ mode: z.enum(["default", "temporal", "workflow"]).optional().default("default").describe("Use `temporal` for compact git-backed history, or `workflow` for RPIR-oriented chain reconstruction."),
52
+ verbose: z.boolean().optional().default(false).describe("Only meaningful with `mode: \"temporal\"`. Adds richer stats-based history context without returning raw diffs."),
53
+ evidence: z.enum(["compact"]).optional().describe("Optional retrieval rationale. Omit for default output; use `compact` for bounded rank and lineage signals."),
54
+ tags: z.array(z.string()).optional().describe("Filter results to notes with all of these tags."),
55
+ scope: z
56
+ .enum(["project", "global", "all"])
57
+ .optional()
58
+ .default("all")
59
+ .describe("'project' = only this project's memories (project-scoped storage), " +
60
+ "'global' = only unscoped memories (main/global storage), " +
61
+ "'all' = both, with project notes boosted (default)"),
62
+ lifecycle: z.enum(["temporary", "permanent"]).optional().describe("Filter results by lifecycle. Useful for recovering working-state with `lifecycle: temporary` after `project_memory_summary` orientation."),
63
+ }),
64
+ outputSchema: RecallResultSchema,
65
+ }, async ({ query, cwd, limit, minSimilarity, mode, verbose, evidence, tags, scope, lifecycle }) => {
66
+ const t0Recall = performance.now();
67
+ await ensureBranchSynced(ctx, cwd);
68
+ const project = await resolveProject(ctx, cwd);
69
+ const queryVec = await embed(query);
70
+ const vaults = await ctx.vaultManager.searchOrder(cwd);
71
+ const noteCache = new Map();
72
+ const noteCacheKey = (vault, id) => `${vault.storage.vaultPath}::${id}`;
73
+ const readCachedNote = async (vault, id) => {
74
+ // Check session cache first (populated when getOrBuildVaultEmbeddings was called)
75
+ if (project) {
76
+ const sessionNote = getSessionCachedNote(project.id, vault.storage.vaultPath, id);
77
+ if (sessionNote !== undefined)
78
+ return sessionNote;
79
+ }
80
+ const key = noteCacheKey(vault, id);
81
+ const cached = noteCache.get(key);
82
+ if (cached) {
83
+ return cached;
84
+ }
85
+ const note = await vault.storage.readNote(memoryId(id));
86
+ if (note) {
87
+ noteCache.set(key, note);
88
+ }
89
+ return note;
90
+ };
91
+ await Promise.allSettled(vaults.map((vault) => embedMissingNotes(ctx, vault.storage).catch(() => { })));
92
+ const scored = [];
93
+ const temporalQueryHint = detectTemporalQueryHint(query);
94
+ const applyTemporalFilter = shouldApplyTemporalFiltering(temporalQueryHint);
95
+ const temporalFilterWindowDays = applyTemporalFilter ? temporalQueryHint?.filterWindowDays : undefined;
96
+ for (const vault of vaults) {
97
+ const embeddings = project
98
+ ? (await getOrBuildVaultEmbeddings(project.id, vault)) ?? await vault.storage.listEmbeddings()
99
+ : await vault.storage.listEmbeddings();
100
+ for (const rec of embeddings) {
101
+ const rawScore = cosineSimilarity(queryVec, rec.embedding);
102
+ if (rawScore < minSimilarity)
103
+ continue;
104
+ const note = await readCachedNote(vault, rec.id);
105
+ if (!note)
106
+ continue;
107
+ if (tags && tags.length > 0) {
108
+ const noteTags = new Set(note.tags);
109
+ if (!tags.every((t) => noteTags.has(t)))
110
+ continue;
111
+ }
112
+ if (lifecycle && note.lifecycle !== lifecycle) {
113
+ continue;
114
+ }
115
+ const isProjectNote = note.project !== undefined;
116
+ const isCurrentProject = project && note.project === project.id;
117
+ if (scope === "project") {
118
+ if (!isCurrentProject)
119
+ continue;
120
+ }
121
+ else if (scope === "global") {
122
+ if (isProjectNote)
123
+ continue;
124
+ }
125
+ if (applyTemporalFilter
126
+ && temporalFilterWindowDays !== undefined
127
+ && !isWithinTemporalFilterWindow(note.updatedAt, temporalFilterWindowDays)) {
128
+ continue;
129
+ }
130
+ const context = buildRecallCandidateContext(note);
131
+ const temporalBoost = temporalQueryHint
132
+ ? computeTemporalRecencyBoost(note.updatedAt, temporalQueryHint)
133
+ : 0;
134
+ const boost = (isCurrentProject ? ctx.projectScopeBoost : 0) + context.metadataBoost + temporalBoost;
135
+ scored.push({
136
+ id: rec.id,
137
+ score: rawScore,
138
+ semanticScoreForPromotion: rawScore,
139
+ boosted: rawScore + boost,
140
+ vault,
141
+ isCurrentProject: Boolean(isCurrentProject),
142
+ lifecycle: context.lifecycle,
143
+ relatedCount: context.relatedCount,
144
+ connectionDiversity: context.connectionDiversity,
145
+ structureScore: context.structureScore,
146
+ metadata: context.metadata,
147
+ });
148
+ }
149
+ }
150
+ const projectionTexts = new Map();
151
+ const noteRelationships = new Map();
152
+ for (const candidate of scored) {
153
+ const note = await readCachedNote(candidate.vault, candidate.id).catch(() => null);
154
+ if (!note) {
155
+ continue;
156
+ }
157
+ if (note.relatedTo && note.relatedTo.length > 0) {
158
+ noteRelationships.set(candidate.id, note.relatedTo.map((r) => ({ id: r.id, type: r.type })));
159
+ }
160
+ const projection = await getOrBuildProjection(candidate.vault.storage, note).catch(() => undefined);
161
+ if (!projection) {
162
+ continue;
163
+ }
164
+ projectionTexts.set(candidate.id, projection.projectionText);
165
+ if (project) {
166
+ setSessionCachedProjection(project.id, candidate.id, projection);
167
+ }
168
+ }
169
+ // Apply lexical reranking over semantic candidates (fail-soft)
170
+ const getProjectionText = (id) => {
171
+ const inlineProjection = projectionTexts.get(id);
172
+ if (inlineProjection) {
173
+ return inlineProjection;
174
+ }
175
+ if (project) {
176
+ const cached = getSessionCachedProjection(project.id, id);
177
+ if (cached)
178
+ return cached.projectionText;
179
+ }
180
+ return undefined;
181
+ };
182
+ const strongestSemanticScore = scored.reduce((max, candidate) => max === undefined ? candidate.score : Math.max(max, candidate.score), undefined);
183
+ const reranked = applyLexicalReranking(scored, query, getProjectionText);
184
+ const semanticCandidateIds = new Set(reranked.map((candidate) => candidate.id));
185
+ // Apply graph spreading activation: traverse related notes and boost their scores
186
+ const preSpreadIds = new Set(reranked.map((c) => c.id));
187
+ const getNoteRelationships = (id) => {
188
+ return noteRelationships.get(id);
189
+ };
190
+ const withGraphSpread = applyGraphSpreadingActivation(reranked, getNoteRelationships);
191
+ const graphDiscoveredIds = new Set(withGraphSpread.filter((candidate) => !semanticCandidateIds.has(candidate.id)).map((candidate) => candidate.id));
192
+ // Resolve correct vault for graph-discovered candidates that inherited their
193
+ // entry point's vault instead of their own.
194
+ await resolveDiscoveredVaults(withGraphSpread, preSpreadIds, async (id) => {
195
+ for (const v of vaults) {
196
+ const note = await v.storage.readNote(memoryId(id)).catch(() => null);
197
+ if (note) {
198
+ const isCurrentProject = project ? note.project === project.id : false;
199
+ return { vault: v, isCurrentProject };
200
+ }
201
+ }
202
+ return undefined;
203
+ });
204
+ // Re-assign semanticRank after graph spreading since scores are now modified
205
+ // and graph-discovered candidates have no semanticRank.
206
+ const sortedByScore = [...withGraphSpread].sort((a, b) => b.score - a.score || b.boosted - a.boosted);
207
+ assignDenseRanks(sortedByScore, (candidate) => candidate.score, (candidate, rank) => {
208
+ candidate.semanticRank = rank;
209
+ });
210
+ let promoted = applyCanonicalExplanationPromotion(withGraphSpread);
211
+ let rescueCandidateIds = new Set();
212
+ // Lexical rescue: when semantic results are weak, scan projections for additional candidates.
213
+ // Skip rescue when the caller set a strict minSimilarity above the default,
214
+ // because rescue candidates lack genuine semantic backing.
215
+ const rescueAllowed = minSimilarity <= ctx.defaultMinSimilarity;
216
+ if (rescueAllowed && shouldTriggerLexicalRescue(strongestSemanticScore, scored.length)) {
217
+ const rescueCandidates = await collectLexicalRescueCandidates(vaults, query, temporalQueryHint, project ?? undefined, scope, tags, lifecycle, promoted);
218
+ promoted.push(...rescueCandidates);
219
+ rescueCandidateIds = new Set(rescueCandidates.map((candidate) => candidate.id));
220
+ enrichRescueCandidateScores(promoted, query, getProjectionText);
221
+ promoted = applyCanonicalExplanationPromotion(promoted);
222
+ }
223
+ const top = mode === "workflow"
224
+ ? selectWorkflowResults(promoted, limit, scope)
225
+ : selectRecallResults(promoted, limit, scope);
226
+ if (top.length === 0) {
227
+ const structuredContent = { action: "recalled", query, scope: scope || "all", results: [] };
228
+ return { content: [{ type: "text", text: "No memories found matching that query." }], structuredContent };
229
+ }
230
+ const header = project
231
+ ? `Recall results for project **${project.name}** (scope: ${scope}):`
232
+ : `Recall results (global):`;
233
+ const sections = [];
234
+ const structuredResults = [];
235
+ // Determine how many top results get relationship expansion
236
+ // Top 1 by default, top 3 if result count is small
237
+ const recallRelationshipLimit = top.length <= 3 ? 3 : 1;
238
+ for (const [index, { id, score, vault, boosted, semanticRank, lexicalRank, canonicalExplanationScore, metadata, isCurrentProject }] of top.entries()) {
239
+ const note = await readCachedNote(vault, id);
240
+ if (note) {
241
+ const centrality = note.relatedTo?.length ?? 0;
242
+ const filePath = `${vault.notesRelDir}/${id}.md`;
243
+ const provenance = await getNoteProvenance(vault.git, filePath);
244
+ const confidence = computeConfidence(note.lifecycle, note.updatedAt, centrality);
245
+ let history;
246
+ let historySummary;
247
+ if (mode === "temporal") {
248
+ if (index < ctx.temporalHistoryNoteLimit) {
249
+ const commits = await vault.git.getFileHistory(filePath, ctx.temporalHistoryCommitLimit);
250
+ const rawHistory = await Promise.all(commits.map(async (commit) => {
251
+ const stats = await vault.git.getCommitStats(filePath, commit.hash);
252
+ return buildTemporalHistoryEntry(commit, stats, verbose);
253
+ }));
254
+ const enriched = enrichTemporalHistory(rawHistory);
255
+ history = verbose
256
+ ? enriched.interpretedHistory
257
+ : enriched.interpretedHistory.map(entry => ({ ...entry, stats: undefined }));
258
+ historySummary = enriched.historySummary;
259
+ }
260
+ }
261
+ // Add relationship preview for top N results (fail-soft)
262
+ let relationships;
263
+ if (index < recallRelationshipLimit) {
264
+ relationships = await getRelationshipPreview(note, ctx.vaultManager.allKnownVaults(), { activeProjectId: project?.id, limit: 3 });
265
+ }
266
+ const formattedHistory = mode === "temporal" && history !== undefined
267
+ ? `\n\n${formatTemporalHistory(history)}`
268
+ : "";
269
+ const formattedRelationships = relationships !== undefined
270
+ ? `\n\n${formatRelationshipPreview(relationships)}`
271
+ : "";
272
+ const provenanceLine = provenance || confidence
273
+ ? `\n**confidence:** ${confidence ?? "medium"}${provenance?.recentlyChanged ? " | **recently changed**" : ""}`
274
+ : "";
275
+ const supersededRelations = (note.relatedTo ?? []).filter((rel) => rel.type === "supersedes");
276
+ const retrievalEvidence = evidence === "compact"
277
+ ? {
278
+ channels: [
279
+ semanticRank !== undefined ? "semantic" : undefined,
280
+ lexicalRank !== undefined ? "lexical" : undefined,
281
+ graphDiscoveredIds.has(id) ? "graph" : undefined,
282
+ rescueCandidateIds.has(id) ? "rescue" : undefined,
283
+ canonicalExplanationScore !== undefined && canonicalExplanationScore > 0 ? "canonical" : undefined,
284
+ temporalQueryHint ? "temporal-boost" : undefined,
285
+ ].filter((value) => value !== undefined),
286
+ rankBand: toRecallRankBand(semanticRank),
287
+ projectRelevant: isCurrentProject,
288
+ freshness: toRecallFreshness(note.updatedAt),
289
+ superseded: supersededRelations.length > 0,
290
+ supersededBy: supersededRelations.length > 0 ? supersededRelations[0]?.id : undefined,
291
+ supersededCount: supersededRelations.length > 0 ? supersededRelations.length : undefined,
292
+ }
293
+ : undefined;
294
+ const evidenceLine = retrievalEvidence
295
+ ? `\n${formatRetrievalEvidenceHint(retrievalEvidence, metadata?.role)}`
296
+ : "";
297
+ // Suppress raw related IDs when enriched preview is shown to avoid duplication
298
+ sections.push(`${formatNote(note, score, relationships === undefined)}${provenanceLine}${evidenceLine}${formattedHistory}${formattedRelationships}`);
299
+ structuredResults.push({
300
+ id,
301
+ title: note.title,
302
+ score,
303
+ boosted,
304
+ project: noteProjectRef(note),
305
+ vault: storageLabel(vault),
306
+ tags: note.tags,
307
+ lifecycle: note.lifecycle,
308
+ role: note.role,
309
+ updatedAt: note.updatedAt,
310
+ provenance,
311
+ confidence,
312
+ history,
313
+ historySummary,
314
+ relationships,
315
+ retrievalEvidence,
316
+ });
317
+ if (project) {
318
+ setSessionCachedNote(project.id, vault.storage.vaultPath, note);
319
+ recordSessionNoteAccess(project.id, vault.storage.vaultPath, id, "recall", computeHybridScore({
320
+ id,
321
+ score,
322
+ boosted,
323
+ vault,
324
+ isCurrentProject: note.project === project.id,
325
+ }));
326
+ }
327
+ }
328
+ }
329
+ const textContent = `${header}\n\n${sections.join("\n\n---\n\n")}`;
330
+ const structuredContent = {
331
+ action: "recalled",
332
+ query,
333
+ scope: scope || "all",
334
+ results: structuredResults,
335
+ };
336
+ console.error(`[recall:timing] ${(performance.now() - t0Recall).toFixed(1)}ms`);
337
+ return {
338
+ content: [{ type: "text", text: textContent }],
339
+ structuredContent,
340
+ };
341
+ });
342
+ }
343
+ //# sourceMappingURL=recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/tools/recall.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 registerRecentMemoriesTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=recent-memories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent-memories.d.ts","sourceRoot":"","sources":["../../src/tools/recent-memories.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAc1D,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAqFtF"}
@@ -0,0 +1,79 @@
1
+ import { z } from "zod";
2
+ import { RecentResultSchema } from "../structured-content.js";
3
+ import { projectParam, toProjectRef, noteProjectRef, ensureBranchSynced, } from "../helpers/project.js";
4
+ import { collectVisibleNotes, formatListEntry, storageLabel, } from "../helpers/vault.js";
5
+ export function registerRecentMemoriesTool(server, ctx) {
6
+ server.registerTool("recent_memories", {
7
+ title: "Recent Memories",
8
+ description: "Show the most recently updated memories.\n\n" +
9
+ "Use this when:\n" +
10
+ "- You want to see what changed most recently\n" +
11
+ "- You are resuming work and want a quick chronological view\n\n" +
12
+ "Do not use this when:\n" +
13
+ "- You need topic-based search; use `recall`\n" +
14
+ "- You need a tag/scope inventory; use `list`\n\n" +
15
+ "Returns:\n" +
16
+ "- Recently updated memories with ids, timestamps, storage labels, and basic metadata\n\n" +
17
+ "Read-only.\n\n" +
18
+ "Typical next step:\n" +
19
+ "- Use `get` for exact inspection or `update` to continue refining a recent note.",
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(20).optional().default(5),
31
+ includePreview: z.boolean().optional().default(true),
32
+ includeStorage: z.boolean().optional().default(true),
33
+ lifecycle: z.enum(["temporary", "permanent"]).optional().describe("Filter results by lifecycle. Useful for recovering working-state with `lifecycle: temporary` after `project_memory_summary` orientation."),
34
+ }),
35
+ outputSchema: RecentResultSchema,
36
+ }, async ({ cwd, scope, storedIn, limit, includePreview, includeStorage, lifecycle }) => {
37
+ await ensureBranchSynced(ctx, cwd);
38
+ const { project, entries } = await collectVisibleNotes(ctx, cwd, scope, undefined, storedIn);
39
+ let filteredEntries = entries;
40
+ if (lifecycle) {
41
+ filteredEntries = entries.filter(({ note }) => note.lifecycle === lifecycle);
42
+ }
43
+ const recent = [...filteredEntries]
44
+ .sort((a, b) => b.note.updatedAt.localeCompare(a.note.updatedAt))
45
+ .slice(0, limit);
46
+ if (recent.length === 0) {
47
+ const structuredContent = { action: "recent_shown", project: toProjectRef(project), count: 0, limit: limit || 5, notes: [] };
48
+ return { content: [{ type: "text", text: "No memories found." }], structuredContent };
49
+ }
50
+ const header = project && scope !== "global"
51
+ ? `Recent memories for ${project.name}:`
52
+ : "Recent memories:";
53
+ const lines = recent.map((entry) => formatListEntry(entry, {
54
+ includePreview,
55
+ includeStorage,
56
+ includeUpdated: true,
57
+ }));
58
+ const textContent = `${header}\n\n${lines.join("\n")}`;
59
+ const structuredNotes = recent.map(({ note, vault }) => ({
60
+ id: note.id,
61
+ title: note.title,
62
+ project: noteProjectRef(note),
63
+ tags: note.tags,
64
+ lifecycle: note.lifecycle,
65
+ vault: storageLabel(vault),
66
+ updatedAt: note.updatedAt,
67
+ preview: includePreview && note.content ? note.content.substring(0, 100) + (note.content.length > 100 ? "..." : "") : undefined,
68
+ }));
69
+ const structuredContent = {
70
+ action: "recent_shown",
71
+ project: toProjectRef(project),
72
+ count: recent.length,
73
+ limit: limit || 5,
74
+ notes: structuredNotes,
75
+ };
76
+ return { content: [{ type: "text", text: textContent }], structuredContent };
77
+ });
78
+ }
79
+ //# sourceMappingURL=recent-memories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent-memories.js","sourceRoot":"","sources":["../../src/tools/recent-memories.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 registerRelateTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=relate.d.ts.map