@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,477 @@
1
+ import { z } from "zod";
2
+ import { performance } from "perf_hooks";
3
+ import { memoryId } from "../brands.js";
4
+ import { cosineSimilarity } from "../embeddings.js";
5
+ import { getNoteProvenance, computeConfidence } from "../provenance.js";
6
+ import { getRelationshipPreview } from "../relationships.js";
7
+ import { formatRelationshipPreview } from "../helpers/index.js";
8
+ import { resolveProject, ensureBranchSynced } from "../helpers/project.js";
9
+ import { formatProjectPolicyLine, projectNotFoundResponse, collectVisibleNotes, } from "../helpers/vault.js";
10
+ import { classifyThemeWithGraduation, computeThemesWithGraduation, summarizePreview, titleCaseTheme, daysSinceUpdate, withinThemeScore, anchorScore, computeConnectionDiversity, workingStateScore, extractNextAction, } from "../project-introspection.js";
11
+ import { getEffectiveMetadata } from "../role-suggestions.js";
12
+ import { ProjectSummaryResultSchema, } from "../structured-content.js";
13
+ export function registerProjectMemorySummaryTool(server, ctx) {
14
+ server.registerTool("project_memory_summary", {
15
+ title: "Project Memory Summary",
16
+ description: "Generate a high-level summary of what is already known for a project.\n\n" +
17
+ "Use this when:\n" +
18
+ "- You want fast orientation before starting work\n" +
19
+ "- You need a synthesized overview instead of raw note listings\n\n" +
20
+ "Do not use this when:\n" +
21
+ "- You need exact note contents; use `get`\n" +
22
+ "- You need direct semantic matches for a query; use `recall`\n\n" +
23
+ "Returns:\n" +
24
+ "- A synthesized project-level summary based on stored memories\n" +
25
+ "- Bounded 1-hop relationship previews on orientation entry points (primaryEntry and suggestedNext)\n\n" +
26
+ "- Optional compact working-state recovery hints when relevant temporary notes exist\n\n" +
27
+ "Read-only.\n\n" +
28
+ "Typical next step:\n" +
29
+ "- Use `recall` or `list` to drill down into specific areas.",
30
+ annotations: {
31
+ readOnlyHint: true,
32
+ destructiveHint: false,
33
+ idempotentHint: true,
34
+ openWorldHint: false,
35
+ },
36
+ inputSchema: z.object({
37
+ 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."),
38
+ maxPerTheme: z.number().int().min(1).max(5).optional().default(3),
39
+ recentLimit: z.number().int().min(1).max(10).optional().default(5),
40
+ anchorLimit: z.number().int().min(1).max(10).optional().default(5),
41
+ includeRelatedGlobal: z.boolean().optional().default(false),
42
+ relatedGlobalLimit: z.number().int().min(1).max(5).optional().default(3),
43
+ }),
44
+ outputSchema: ProjectSummaryResultSchema,
45
+ }, async ({ cwd, maxPerTheme, recentLimit, anchorLimit, includeRelatedGlobal, relatedGlobalLimit }) => {
46
+ const t0Summary = performance.now();
47
+ await ensureBranchSynced(ctx, cwd);
48
+ // Pre-resolve project so we can pass its id to collectVisibleNotes for session caching
49
+ const preProject = await resolveProject(ctx, cwd);
50
+ const { project, entries } = await collectVisibleNotes(ctx, cwd, "all", undefined, "any", preProject?.id);
51
+ if (!project) {
52
+ return projectNotFoundResponse(cwd);
53
+ }
54
+ // Separate project-scoped notes (for themes/anchors) from global notes
55
+ const projectEntries = entries.filter(e => e.note.project === project.id || e.vault.isProject);
56
+ // Empty-project case: no project-scoped notes exist
57
+ if (projectEntries.length === 0) {
58
+ const structuredContent = {
59
+ action: "project_summary_shown",
60
+ project: { id: project.id, name: project.name },
61
+ notes: { total: 0, projectVault: 0, mainVault: 0, privateProject: 0 },
62
+ themes: {},
63
+ recent: [],
64
+ anchors: [],
65
+ orientation: {
66
+ primaryEntry: { id: "", title: "No notes", rationale: "Empty project vault" },
67
+ suggestedNext: [],
68
+ },
69
+ };
70
+ return { content: [{ type: "text", text: `No memories found for project ${project.name}.` }], structuredContent };
71
+ }
72
+ const policyLine = await formatProjectPolicyLine(ctx, project.id);
73
+ const projectNoteIds = new Set(projectEntries.map(e => e.note.id));
74
+ // Compute promoted themes from keywords (graduation system)
75
+ const graduationResult = computeThemesWithGraduation(projectEntries.map(e => e.note));
76
+ const promotedThemes = new Set(graduationResult.promotedThemes);
77
+ const themeCache = graduationResult.themeAssignments;
78
+ const inboundReferences = new Map();
79
+ const linkedByPermanentNotes = new Map();
80
+ for (const entry of projectEntries) {
81
+ for (const rel of entry.note.relatedTo ?? []) {
82
+ if (!projectNoteIds.has(rel.id)) {
83
+ continue;
84
+ }
85
+ inboundReferences.set(rel.id, (inboundReferences.get(rel.id) ?? 0) + 1);
86
+ if (entry.note.lifecycle === "permanent") {
87
+ linkedByPermanentNotes.set(rel.id, (linkedByPermanentNotes.get(rel.id) ?? 0) + 1);
88
+ }
89
+ }
90
+ }
91
+ const effectiveMetadataById = new Map(projectEntries.map((entry) => {
92
+ const inbound = inboundReferences.get(entry.note.id) ?? 0;
93
+ const visibleOutbound = (entry.note.relatedTo ?? []).filter((rel) => projectNoteIds.has(rel.id)).length;
94
+ const metadata = getEffectiveMetadata(entry.note, {
95
+ inboundReferences: inbound,
96
+ linkedByPermanentNotes: linkedByPermanentNotes.get(entry.note.id) ?? 0,
97
+ anchorCandidate: entry.note.lifecycle === "permanent" && (visibleOutbound > 0 || inbound > 0),
98
+ });
99
+ return [entry.note.id, {
100
+ metadata,
101
+ inbound,
102
+ visibleOutbound,
103
+ }];
104
+ }));
105
+ // Categorize by theme with graduation (project-scoped only)
106
+ const themed = new Map();
107
+ for (const entry of projectEntries) {
108
+ const theme = classifyThemeWithGraduation(entry.note, promotedThemes);
109
+ const bucket = themed.get(theme) ?? [];
110
+ bucket.push(entry);
111
+ themed.set(theme, bucket);
112
+ }
113
+ // Theme order: fixed themes first, then promoted themes alphabetically, then "other"
114
+ const fixedThemes = ["overview", "decisions", "tooling", "bugs", "architecture", "quality"];
115
+ const dynamicThemes = graduationResult.promotedThemes.filter(t => !fixedThemes.includes(t));
116
+ const themeOrder = [...fixedThemes, ...dynamicThemes.sort(), "other"];
117
+ // Collapse thin dynamic-theme buckets (< 2 notes) into "other" to reduce noise.
118
+ // Fixed themes are kept even when small; only keyword-graduated themes are collapsed.
119
+ const fixedThemeSet = new Set(fixedThemes);
120
+ for (const [theme, bucket] of Array.from(themed.entries())) {
121
+ if (!fixedThemeSet.has(theme) && theme !== "other" && bucket.length < 2) {
122
+ const otherBucket = themed.get("other") ?? [];
123
+ otherBucket.push(...bucket);
124
+ themed.set("other", otherBucket);
125
+ themed.delete(theme);
126
+ }
127
+ }
128
+ // Calculate notes distribution (project-scoped only)
129
+ const projectVaultCount = projectEntries.filter(e => e.vault.isProject).length;
130
+ const mainVaultProjectEntries = projectEntries.filter(e => !e.vault.isProject);
131
+ const mainVaultCount = mainVaultProjectEntries.length;
132
+ const totalProjectNotes = projectEntries.length;
133
+ // Build output sections
134
+ const sections = [];
135
+ sections.push(`Project summary: **${project.name}**`);
136
+ sections.push(`- id: \`${project.id}\``);
137
+ sections.push(`- ${policyLine.replace(/^Policy:\s*/, "policy: ")}`);
138
+ sections.push(`- memories: ${totalProjectNotes} (project-vault: ${projectVaultCount}, main-vault: ${mainVaultCount})`);
139
+ if (mainVaultProjectEntries.length > 0) {
140
+ sections.push(`- private project memories: ${mainVaultProjectEntries.length}`);
141
+ }
142
+ const themes = {};
143
+ for (const theme of themeOrder) {
144
+ const bucket = themed.get(theme);
145
+ if (!bucket || bucket.length === 0)
146
+ continue;
147
+ // Sort by within-theme score
148
+ const sorted = [...bucket].sort((a, b) => withinThemeScore(b.note, effectiveMetadataById.get(b.note.id)?.metadata) - withinThemeScore(a.note, effectiveMetadataById.get(a.note.id)?.metadata));
149
+ const top = sorted.slice(0, maxPerTheme);
150
+ sections.push(`\n${titleCaseTheme(theme)}:`);
151
+ sections.push(...top.map(e => `- ${e.note.title} (\`${e.note.id}\`)`));
152
+ themes[theme] = {
153
+ count: bucket.length,
154
+ examples: top.map(e => ({
155
+ id: e.note.id,
156
+ title: e.note.title,
157
+ updatedAt: e.note.updatedAt,
158
+ })),
159
+ };
160
+ }
161
+ // Recent notes (project-scoped only)
162
+ const recent = [...projectEntries]
163
+ .sort((a, b) => b.note.updatedAt.localeCompare(a.note.updatedAt))
164
+ .slice(0, recentLimit);
165
+ sections.push(`\nRecent activity (start here):`);
166
+ sections.push(...recent.map(e => `- ${e.note.updatedAt} — ${e.note.title}`));
167
+ const temporaryEntries = projectEntries
168
+ .filter((entry) => entry.note.lifecycle === "temporary")
169
+ .map((entry) => {
170
+ const metadata = effectiveMetadataById.get(entry.note.id)?.metadata;
171
+ const score = workingStateScore(entry.note, metadata);
172
+ const nextAction = extractNextAction(entry.note);
173
+ const relatedCount = entry.note.relatedTo?.length ?? 0;
174
+ const days = daysSinceUpdate(entry.note.updatedAt);
175
+ const rationaleParts = [`updated ${days < 1 ? "today" : `${Math.round(days)}d ago`}`];
176
+ if (relatedCount > 0)
177
+ rationaleParts.push(`${relatedCount} linked note${relatedCount === 1 ? "" : "s"}`);
178
+ if (nextAction)
179
+ rationaleParts.push("explicit next action");
180
+ if (metadata?.role === "plan" || metadata?.role === "context")
181
+ rationaleParts.push(`${metadata.role} note`);
182
+ return {
183
+ entry,
184
+ score,
185
+ rationale: rationaleParts.join(", "),
186
+ preview: summarizePreview(entry.note.content, 120),
187
+ nextAction,
188
+ };
189
+ })
190
+ .filter((candidate) => candidate.score > -Infinity)
191
+ .sort((a, b) => b.score - a.score || b.entry.note.updatedAt.localeCompare(a.entry.note.updatedAt))
192
+ .slice(0, 3);
193
+ const workingState = temporaryEntries.length > 0
194
+ ? {
195
+ summary: temporaryEntries.length === 1
196
+ ? `1 temporary note may help resume active work.`
197
+ : `${temporaryEntries.length} temporary notes may help resume active work.`,
198
+ recoveryHint: "Orient with project_memory_summary first, then inspect these temporary notes if you need to continue in-progress work.",
199
+ notes: temporaryEntries.map(({ entry, rationale, preview, nextAction }) => ({
200
+ id: entry.note.id,
201
+ title: entry.note.title,
202
+ updatedAt: entry.note.updatedAt,
203
+ rationale,
204
+ preview,
205
+ nextAction,
206
+ })),
207
+ }
208
+ : undefined;
209
+ // Anchor notes with diversity constraint (project-scoped only)
210
+ const scoredAnchorCandidates = projectEntries
211
+ .map(e => {
212
+ const baselineContext = effectiveMetadataById.get(e.note.id);
213
+ const metadata = baselineContext?.metadata;
214
+ return {
215
+ entry: e,
216
+ metadata,
217
+ score: anchorScore(e.note, themeCache, metadata),
218
+ theme: themeCache.get(e.note.id) ?? "other",
219
+ alwaysLoad: metadata?.alwaysLoad === true,
220
+ explicitOrientationRole: metadata?.roleSource === "explicit" &&
221
+ (metadata.role === "summary" || metadata.role === "decision"),
222
+ hasVisibleGraphParticipation: (baselineContext?.visibleOutbound ?? 0) > 0 || (baselineContext?.inbound ?? 0) > 0,
223
+ };
224
+ })
225
+ .filter(candidate => candidate.score > -Infinity)
226
+ .filter(candidate => candidate.alwaysLoad || candidate.explicitOrientationRole || candidate.hasVisibleGraphParticipation)
227
+ .sort((a, b) => b.score - a.score || a.entry.note.title.localeCompare(b.entry.note.title));
228
+ // Enforce max 2 per theme for scored anchors
229
+ const anchorThemeCounts = new Map();
230
+ const anchors = [];
231
+ const anchorIds = new Set();
232
+ // Add scored anchors with theme diversity constraint
233
+ for (const candidate of scoredAnchorCandidates) {
234
+ if (anchors.length >= 10)
235
+ break;
236
+ const theme = candidate.theme;
237
+ const themeCount = anchorThemeCounts.get(theme) ?? 0;
238
+ if (themeCount >= 2)
239
+ continue;
240
+ anchors.push({
241
+ id: candidate.entry.note.id,
242
+ title: candidate.entry.note.title,
243
+ centrality: candidate.entry.note.relatedTo?.length ?? 0,
244
+ connectionDiversity: computeConnectionDiversity(candidate.entry.note, themeCache),
245
+ updatedAt: candidate.entry.note.updatedAt,
246
+ });
247
+ anchorIds.add(candidate.entry.note.id);
248
+ anchorThemeCounts.set(theme, themeCount + 1);
249
+ }
250
+ if (anchors.length > 0) {
251
+ sections.push(`\nAnchors:`);
252
+ sections.push(...anchors.slice(0, 5).map(a => `- ${a.title} (\`${a.id}\`) — centrality: ${a.centrality}, diversity: ${a.connectionDiversity}`));
253
+ }
254
+ // Compute orientation after anchors are computed (for text output)
255
+ let relatedGlobal;
256
+ if (includeRelatedGlobal) {
257
+ const anchorEmbeddings = await Promise.all(anchors.slice(0, 5).map(async (a) => {
258
+ for (const vault of ctx.vaultManager.allKnownVaults()) {
259
+ const emb = await vault.storage.readEmbedding(memoryId(a.id));
260
+ if (emb)
261
+ return { id: a.id, embedding: emb.embedding };
262
+ }
263
+ return null;
264
+ }));
265
+ const validAnchors = anchorEmbeddings.filter((e) => e !== null);
266
+ if (validAnchors.length > 0) {
267
+ // Get global notes (not project-scoped)
268
+ const globalEntries = entries.filter(e => !e.note.project);
269
+ const globalCandidates = [];
270
+ for (const entry of globalEntries) {
271
+ const emb = await entry.vault.storage.readEmbedding(entry.note.id);
272
+ if (!emb)
273
+ continue;
274
+ // Find max similarity to any anchor
275
+ let maxSim = 0;
276
+ for (const anchor of validAnchors) {
277
+ const sim = cosineSimilarity(anchor.embedding, emb.embedding);
278
+ if (sim > maxSim)
279
+ maxSim = sim;
280
+ }
281
+ if (maxSim > 0.4) {
282
+ const projection = await entry.vault.storage.readProjection(entry.note.id);
283
+ const preview = projection?.summary
284
+ ? projection.summary.slice(0, 100)
285
+ : summarizePreview(entry.note.content, 100);
286
+ globalCandidates.push({
287
+ id: entry.note.id,
288
+ title: entry.note.title,
289
+ similarity: maxSim,
290
+ preview,
291
+ });
292
+ }
293
+ }
294
+ globalCandidates.sort((a, b) => b.similarity - a.similarity);
295
+ if (globalCandidates.length > 0) {
296
+ relatedGlobal = {
297
+ notes: globalCandidates.slice(0, relatedGlobalLimit),
298
+ computedAt: new Date().toISOString(),
299
+ };
300
+ sections.push(`\nRelated Global:`);
301
+ sections.push(...relatedGlobal.notes.map(n => `- ${n.title} (\`${n.id}\`) — similarity: ${n.similarity.toFixed(2)}`));
302
+ }
303
+ }
304
+ }
305
+ // Compute orientation layer for actionable guidance
306
+ const primaryAnchor = anchors[0];
307
+ // Build noteId -> vault lookup for provenance enrichment
308
+ const noteVaultMap = new Map();
309
+ for (const entry of projectEntries) {
310
+ noteVaultMap.set(entry.note.id, entry.vault);
311
+ }
312
+ // Helper to enrich an anchor with provenance and confidence
313
+ const enrichOrientationNote = async (anchor) => {
314
+ const vault = noteVaultMap.get(anchor.id);
315
+ if (!vault)
316
+ return {};
317
+ const filePath = `${vault.notesRelDir}/${anchor.id}.md`;
318
+ const provenance = await getNoteProvenance(vault.git, filePath);
319
+ const confidence = computeConfidence("permanent", anchor.updatedAt, anchor.centrality);
320
+ return { provenance, confidence };
321
+ };
322
+ // Helper to enrich an anchor with relationships (1-hop expansion)
323
+ const enrichOrientationNoteWithRelationships = async (anchor) => {
324
+ const vault = noteVaultMap.get(anchor.id);
325
+ if (!vault)
326
+ return {};
327
+ const note = await vault.storage.readNote(memoryId(anchor.id));
328
+ if (!note)
329
+ return {};
330
+ const relationships = await getRelationshipPreview(note, ctx.vaultManager.allKnownVaults(), { activeProjectId: project.id, limit: 3 });
331
+ return { relationships };
332
+ };
333
+ const primaryEnriched = primaryAnchor ? await enrichOrientationNote(primaryAnchor) : {};
334
+ const primaryRelationships = primaryAnchor ? await enrichOrientationNoteWithRelationships(primaryAnchor) : {};
335
+ // Select theme-diverse suggestedNext: avoid repeating the primary anchor's theme.
336
+ // Backfills without constraint if not enough theme-distinct candidates exist.
337
+ const primaryTheme = primaryAnchor ? (themeCache.get(primaryAnchor.id) ?? "other") : "other";
338
+ const usedSuggestedThemes = new Set([primaryTheme]);
339
+ const suggestedCandidates = [];
340
+ for (const anchor of anchors.slice(1)) {
341
+ if (suggestedCandidates.length >= 3)
342
+ break;
343
+ const anchorTheme = themeCache.get(anchor.id) ?? "other";
344
+ if (!usedSuggestedThemes.has(anchorTheme)) {
345
+ suggestedCandidates.push(anchor);
346
+ usedSuggestedThemes.add(anchorTheme);
347
+ }
348
+ }
349
+ for (const anchor of anchors.slice(1)) {
350
+ if (suggestedCandidates.length >= 3)
351
+ break;
352
+ if (!suggestedCandidates.includes(anchor)) {
353
+ suggestedCandidates.push(anchor);
354
+ }
355
+ }
356
+ const suggestedEnriched = await Promise.all(suggestedCandidates.map(enrichOrientationNote));
357
+ const suggestedRelationships = await Promise.all(suggestedCandidates.map(enrichOrientationNoteWithRelationships));
358
+ const recentPermanent = recent.find((entry) => entry.note.lifecycle === "permanent");
359
+ const fallbackEntry = recentPermanent ?? recent[0];
360
+ const permanentOverrideUsed = Boolean(recentPermanent && recent[0] && recentPermanent.note.id !== recent[0].note.id);
361
+ // Enrich fallback primaryEntry when no anchors exist
362
+ let fallbackEnriched = {};
363
+ let fallbackRelationships = {};
364
+ if (!primaryAnchor && fallbackEntry) {
365
+ const fallbackNote = fallbackEntry.note;
366
+ const vault = noteVaultMap.get(fallbackNote.id);
367
+ if (vault) {
368
+ const filePath = `${vault.notesRelDir}/${fallbackNote.id}.md`;
369
+ const provenance = await getNoteProvenance(vault.git, filePath);
370
+ const confidence = computeConfidence(fallbackNote.lifecycle, fallbackNote.updatedAt, 0);
371
+ fallbackEnriched = { provenance, confidence };
372
+ }
373
+ const preview = await getRelationshipPreview(fallbackNote, ctx.vaultManager.allKnownVaults(), { activeProjectId: project.id, limit: 3 });
374
+ if (preview)
375
+ fallbackRelationships = { relationships: preview };
376
+ }
377
+ const orientation = {
378
+ primaryEntry: primaryAnchor
379
+ ? {
380
+ id: primaryAnchor.id,
381
+ title: primaryAnchor.title,
382
+ rationale: `Centrality ${primaryAnchor.centrality}, connects ${primaryAnchor.connectionDiversity} themes`,
383
+ ...primaryEnriched,
384
+ ...primaryRelationships,
385
+ }
386
+ : {
387
+ id: fallbackEntry?.note.id ?? projectEntries[0]?.note.id ?? "",
388
+ title: fallbackEntry?.note.title ?? projectEntries[0]?.note.title ?? "No notes",
389
+ rationale: permanentOverrideUsed
390
+ ? "Most recent permanent note — no high-centrality anchors found"
391
+ : fallbackEntry
392
+ ? "Most recent note — no high-centrality anchors found"
393
+ : "Only note available",
394
+ ...fallbackEnriched,
395
+ ...fallbackRelationships,
396
+ },
397
+ suggestedNext: suggestedCandidates.map((a, i) => ({
398
+ id: a.id,
399
+ title: a.title,
400
+ rationale: `Centrality ${a.centrality}, connects ${a.connectionDiversity} themes`,
401
+ ...suggestedEnriched[i],
402
+ ...suggestedRelationships[i],
403
+ })),
404
+ };
405
+ // Warning for taxonomy dilution
406
+ const otherBucket = themed.get("other");
407
+ const otherCount = otherBucket?.length ?? 0;
408
+ const otherRatio = projectEntries.length > 0 ? otherCount / projectEntries.length : 0;
409
+ if (otherRatio > 0.3) {
410
+ orientation.warnings = [
411
+ `${Math.round(otherRatio * 100)}% of notes in "other" bucket — consider improving thematic classification`,
412
+ ];
413
+ }
414
+ // Orientation text output
415
+ sections.push(`\nOrientation:`);
416
+ sections.push(`Start with: ${orientation.primaryEntry.title} (\`${orientation.primaryEntry.id}\`)`);
417
+ sections.push(` Rationale: ${orientation.primaryEntry.rationale}`);
418
+ if (orientation.primaryEntry.confidence) {
419
+ sections.push(` Confidence: ${orientation.primaryEntry.confidence}`);
420
+ }
421
+ if (orientation.primaryEntry.relationships) {
422
+ sections.push(` ${formatRelationshipPreview(orientation.primaryEntry.relationships)}`);
423
+ }
424
+ if (orientation.suggestedNext.length > 0) {
425
+ sections.push(`Then check:`);
426
+ for (const next of orientation.suggestedNext) {
427
+ sections.push(` - ${next.title} (\`${next.id}\`) — ${next.rationale}${next.confidence ? ` [${next.confidence}]` : ""}`);
428
+ if (next.relationships) {
429
+ sections.push(` ${formatRelationshipPreview(next.relationships)}`);
430
+ }
431
+ }
432
+ }
433
+ if (orientation.warnings && orientation.warnings.length > 0) {
434
+ sections.push(`Warnings:`);
435
+ for (const w of orientation.warnings) {
436
+ sections.push(` - ${w}`);
437
+ }
438
+ }
439
+ if (workingState) {
440
+ sections.push(`\nWorking state:`);
441
+ sections.push(workingState.summary);
442
+ sections.push(`Recovery hint: ${workingState.recoveryHint}`);
443
+ for (const note of workingState.notes) {
444
+ sections.push(`- ${note.title} (\`${note.id}\`) — ${note.rationale}`);
445
+ sections.push(` Preview: ${note.preview}`);
446
+ if (note.nextAction) {
447
+ sections.push(` Next action: ${note.nextAction}`);
448
+ }
449
+ }
450
+ }
451
+ // Related global notes (optional, anchor-based similarity)
452
+ const structuredContent = {
453
+ action: "project_summary_shown",
454
+ project: { id: project.id, name: project.name },
455
+ notes: {
456
+ total: totalProjectNotes,
457
+ projectVault: projectVaultCount,
458
+ mainVault: mainVaultCount,
459
+ privateProject: mainVaultProjectEntries.length,
460
+ },
461
+ themes,
462
+ recent: recent.map(e => ({
463
+ id: e.note.id,
464
+ title: e.note.title,
465
+ updatedAt: e.note.updatedAt,
466
+ theme: classifyThemeWithGraduation(e.note, promotedThemes),
467
+ })),
468
+ anchors,
469
+ orientation,
470
+ workingState,
471
+ relatedGlobal,
472
+ };
473
+ console.error(`[summary:timing] ${(performance.now() - t0Summary).toFixed(1)}ms`);
474
+ return { content: [{ type: "text", text: sections.join("\n") }], structuredContent };
475
+ });
476
+ }
477
+ //# sourceMappingURL=project-memory-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-memory-summary.js","sourceRoot":"","sources":["../../src/tools/project-memory-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Note, NoteLifecycle } from "../storage.js";
2
+ import type { Vault } from "../vault.js";
3
+ import { type ScoredRecallCandidate, type TemporalQueryHint } from "../recall.js";
4
+ import type { RecallDiversity, RecallRetrievalCoverage } from "../structured-content.js";
5
+ export declare function buildRecallCandidateContext(note: Note): {
6
+ metadata: import("../role-suggestions.js").EffectiveNoteMetadata;
7
+ metadataBoost: number;
8
+ lifecycle: NoteLifecycle;
9
+ relatedCount: number;
10
+ connectionDiversity: number;
11
+ structureScore: number;
12
+ };
13
+ export declare const PROJECT_SCOPE_BOOST = 0.03;
14
+ export declare function collectLexicalRescueCandidates(vaults: Vault[], query: string, temporalQueryHint: TemporalQueryHint | undefined, project: {
15
+ id: string;
16
+ name: string;
17
+ } | undefined, scope: "project" | "global" | "all", tags: string[] | undefined, lifecycle: NoteLifecycle | undefined, existingIds: ScoredRecallCandidate[]): Promise<ScoredRecallCandidate[]>;
18
+ export type DiscoverTagStat = {
19
+ count: number;
20
+ examples: string[];
21
+ lifecycles: Set<NoteLifecycle>;
22
+ contextMatches: number;
23
+ exactCandidateMatch: boolean;
24
+ };
25
+ export declare function tokenizeTagDiscoveryText(value: string): string[];
26
+ export declare function countTokenOverlap(tokens: Set<string>, other: Iterable<string>): number;
27
+ export declare function escapeRegex(value: string): string;
28
+ export declare function hasExactTagContextMatch(tag: string, values: Array<string | undefined>): boolean;
29
+ export declare function identifyHighPriorityAnchors(vaults: Vault[], projectId: string): Promise<{
30
+ anchorIds: Set<string>;
31
+ anchorLookup: Map<string, string>;
32
+ }>;
33
+ export declare function computeRecallDiversity(results: Array<{
34
+ id: string;
35
+ tags: string[];
36
+ lifecycle: NoteLifecycle;
37
+ role?: string;
38
+ }>): Promise<RecallDiversity | undefined>;
39
+ export declare function computeRecallRetrievalCoverage(resultIds: string[], anchorIds: Set<string>, anchorLookup: Map<string, string>, maxMissing?: number): Promise<RecallRetrievalCoverage | undefined>;
40
+ //# sourceMappingURL=recall-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall-helpers.d.ts","sourceRoot":"","sources":["../../src/tools/recall-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAA8B,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAA2F,MAAM,cAAc,CAAC;AAKvM,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAIzF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,IAAI;;;;;;;EAkBrD;AAID,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,EAChD,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACjD,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,KAAK,EACnC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,EAC1B,SAAS,EAAE,aAAa,GAAG,SAAS,EACpC,WAAW,EAAE,qBAAqB,EAAE,GACnC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA6HlC;AAID,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKhE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAQtF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAI/F;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAiCxE;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,aAAa,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACtF,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAwBtC;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,UAAU,SAAI,GACb,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAqB9C"}