@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,129 @@
1
+ import { getCurrentGitBranch } from "../project.js";
2
+ import { isProtectedBranch, resolveProtectedBranchBehavior, resolveProtectedBranchPatterns } from "../project-memory-policy.js";
3
+ export function extractSummary(content, maxLength = 100) {
4
+ const normalized = content.replace(/\s+/g, " ").trim();
5
+ const sentenceMatch = normalized.match(/^[^.!?]+[.!?]/);
6
+ if (sentenceMatch) {
7
+ const sentence = sentenceMatch[0].trim();
8
+ if (sentence.length <= maxLength) {
9
+ return sentence;
10
+ }
11
+ }
12
+ if (normalized.length <= maxLength) {
13
+ return normalized;
14
+ }
15
+ return normalized.slice(0, maxLength - 3) + "...";
16
+ }
17
+ export function formatCommitBody(options) {
18
+ const lines = [];
19
+ if (options.summary) {
20
+ lines.push(options.summary);
21
+ lines.push("");
22
+ }
23
+ if (options.noteId && options.noteTitle) {
24
+ lines.push(`- Note: ${options.noteId} (${options.noteTitle})`);
25
+ }
26
+ if (options.noteIds && options.noteIds.length > 0) {
27
+ if (options.noteIds.length === 1 && !options.noteId) {
28
+ lines.push(`- Note: ${options.noteIds[0]}`);
29
+ }
30
+ else if (options.noteIds.length > 1) {
31
+ lines.push(`- Notes: ${options.noteIds.length} notes affected`);
32
+ options.noteIds.forEach((id) => lines.push(` - ${id}`));
33
+ }
34
+ }
35
+ if (options.count && !options.noteIds) {
36
+ lines.push(`- Count: ${options.count} items`);
37
+ }
38
+ if (options.projectName) {
39
+ lines.push(`- Project: ${options.projectName}`);
40
+ }
41
+ if (options.scope) {
42
+ lines.push(`- Scope: ${options.scope}`);
43
+ }
44
+ if (options.tags && options.tags.length > 0) {
45
+ lines.push(`- Tags: ${options.tags.join(", ")}`);
46
+ }
47
+ if (options.relationship) {
48
+ lines.push(`- Relationship: ${options.relationship.fromId} ${options.relationship.type} ${options.relationship.toId}`);
49
+ }
50
+ if (options.mode) {
51
+ lines.push(`- Mode: ${options.mode}`);
52
+ }
53
+ if (options.description) {
54
+ lines.push("");
55
+ lines.push(options.description);
56
+ }
57
+ return lines.join("\n");
58
+ }
59
+ export function formatAskForWriteScope(project, unadopted = false) {
60
+ const projectLabel = project ? `${project.name} (${project.id})` : "this context";
61
+ const header = unadopted
62
+ ? `No memory policy set for ${projectLabel} and this project hasn't adopted mnemonic yet.`
63
+ : `Project memory policy for ${projectLabel} is set to always ask.`;
64
+ return [
65
+ header,
66
+ "Choose where to store this memory and call `remember` again with one of:",
67
+ "- `scope: \"project\"` — create `.mnemonic/` in this repo and store there (adopts mnemonic)",
68
+ "- `scope: \"global\"` — private main vault with project association",
69
+ "",
70
+ "To avoid being asked again: call `set_project_memory_policy` with your preferred scope.",
71
+ ].join("\n");
72
+ }
73
+ export function formatAskForProtectedBranch(projectLabel, branch, patterns, toolName) {
74
+ return [
75
+ `Protected branch check for ${projectLabel}: current branch \`${branch}\` matches ${patterns.join(", ")}.`,
76
+ "Choose how to proceed:",
77
+ `- One-time override: call \`${toolName}\` again with \`allowProtectedBranch: true\``,
78
+ "- Persist policy: call `set_project_memory_policy` with `protectedBranchBehavior: \"block\"`",
79
+ "- Persist policy: call `set_project_memory_policy` with `protectedBranchBehavior: \"allow\"`",
80
+ "",
81
+ "Optional: set `protectedBranchPatterns` to customize which branches are protected.",
82
+ ].join("\n");
83
+ }
84
+ export function formatProtectedBranchBlocked(projectLabel, branch, patterns, toolName) {
85
+ return [
86
+ `Auto-commit blocked for ${projectLabel}: current branch \`${branch}\` matches protected patterns ${patterns.join(", ")}.`,
87
+ "Policy is set to `protectedBranchBehavior: \"block\"`.",
88
+ `To proceed once, call \`${toolName}\` again with \`allowProtectedBranch: true\`.`,
89
+ "To change the default, call `set_project_memory_policy` with `protectedBranchBehavior: \"allow\"`.",
90
+ ].join("\n");
91
+ }
92
+ export async function shouldBlockProtectedBranchCommit(options) {
93
+ const { cwd, writeScope, automaticCommit, projectLabel, policy, allowProtectedBranch, toolName } = options;
94
+ if (!cwd || writeScope !== "project" || !automaticCommit) {
95
+ return { blocked: false };
96
+ }
97
+ const branch = await getCurrentGitBranch(cwd);
98
+ if (!branch) {
99
+ return { blocked: false };
100
+ }
101
+ const patterns = resolveProtectedBranchPatterns(policy);
102
+ if (!isProtectedBranch(branch, patterns) || allowProtectedBranch) {
103
+ return { blocked: false };
104
+ }
105
+ const behavior = resolveProtectedBranchBehavior(policy);
106
+ if (behavior === "allow") {
107
+ return { blocked: false };
108
+ }
109
+ const message = behavior === "block"
110
+ ? formatProtectedBranchBlocked(projectLabel, branch, patterns, toolName)
111
+ : formatAskForProtectedBranch(projectLabel, branch, patterns, toolName);
112
+ return { blocked: true, message };
113
+ }
114
+ export async function wouldRelationshipCleanupTouchProjectVault(ctx, noteIds) {
115
+ const noteIdSet = new Set(noteIds);
116
+ for (const vault of ctx.vaultManager.allKnownVaults()) {
117
+ if (!vault.isProject) {
118
+ continue;
119
+ }
120
+ const notes = await vault.storage.listNotes();
121
+ for (const note of notes) {
122
+ if ((note.relatedTo ?? []).some((rel) => noteIdSet.has(rel.id))) {
123
+ return true;
124
+ }
125
+ }
126
+ }
127
+ return false;
128
+ }
129
+ //# sourceMappingURL=git-commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-commit.js","sourceRoot":"","sources":["../../src/helpers/git-commit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Note, NoteLifecycle, NoteRole } from "../storage.js";
2
+ import type { MemoryId } from "../brands.js";
3
+ import type { RelationshipPreview, RetrievalEvidence } from "../structured-content.js";
4
+ export declare function slugify(text: string): string;
5
+ export declare function makeId(title: string): MemoryId;
6
+ export declare function describeLifecycle(lifecycle: NoteLifecycle): string;
7
+ export declare function formatNote(note: Note, score?: number, showRawRelated?: boolean): string;
8
+ export declare function formatTemporalHistory(history: Array<{
9
+ commitHash: string;
10
+ timestamp: string;
11
+ message: string;
12
+ summary?: string;
13
+ changeDescription?: string;
14
+ }>): string;
15
+ export declare function formatRelationshipPreview(preview: RelationshipPreview): string;
16
+ export declare function toRecallFreshness(updatedAt: string): "today" | "thisWeek" | "thisMonth" | "older";
17
+ export declare function toRecallRankBand(semanticRank?: number): "top3" | "top10" | "lower";
18
+ export declare function formatRetrievalEvidenceHint(evidence: RetrievalEvidence, role?: NoteRole): string;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEvF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAI9C;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,CAElE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,cAAc,UAAO,GAAG,MAAM,CAapF;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC,GACD,MAAM,CAYR;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAQ9E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAgBjG;AAED,wBAAgB,gBAAgB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAIlF;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAMhG"}
@@ -0,0 +1,83 @@
1
+ import { randomUUID } from "crypto";
2
+ import { memoryId } from "../brands.js";
3
+ export function slugify(text) {
4
+ return text
5
+ .toLowerCase()
6
+ .replace(/[^a-z0-9]+/g, "-")
7
+ .replace(/^-+|-+$/g, "")
8
+ .slice(0, 60);
9
+ }
10
+ export function makeId(title) {
11
+ const slug = slugify(title);
12
+ const suffix = randomUUID().split("-")[0];
13
+ return memoryId(slug ? `${slug}-${suffix}` : suffix);
14
+ }
15
+ export function describeLifecycle(lifecycle) {
16
+ return `lifecycle: ${lifecycle}`;
17
+ }
18
+ export function formatNote(note, score, showRawRelated = true) {
19
+ const scoreStr = score !== undefined ? ` | similarity: ${score.toFixed(3)}` : "";
20
+ const projectStr = note.project ? ` | project: ${note.projectName ?? note.project}` : " | global";
21
+ const roleStr = note.role ? ` | **role: ${note.role}**` : "";
22
+ const relStr = showRawRelated && note.relatedTo && note.relatedTo.length > 0
23
+ ? `\n**related:** ${note.relatedTo.map((r) => `\`${r.id}\` (${r.type})`).join(", ")}`
24
+ : "";
25
+ return (`## ${note.title}\n` +
26
+ `**id:** \`${note.id}\`${projectStr}${scoreStr}\n` +
27
+ `**tags:** ${note.tags.join(", ") || "none"} | **${describeLifecycle(note.lifecycle)}**${roleStr} | **updated:** ${note.updatedAt}${relStr}\n\n` +
28
+ note.content);
29
+ }
30
+ export function formatTemporalHistory(history) {
31
+ if (history.length === 0) {
32
+ return "**history:** no git history found";
33
+ }
34
+ const lines = ["**history:**"];
35
+ for (const entry of history) {
36
+ const summary = entry.summary ? ` — ${entry.summary}` : "";
37
+ const changeDesc = entry.changeDescription ? ` (${entry.changeDescription})` : "";
38
+ lines.push(`- \`${entry.commitHash.slice(0, 7)}\` ${entry.timestamp} — ${entry.message}${summary}${changeDesc}`);
39
+ }
40
+ return lines.join("\n");
41
+ }
42
+ export function formatRelationshipPreview(preview) {
43
+ const shown = preview.shown
44
+ .map(r => `${r.title} (\`${r.id}\`) [${r.relationType ?? "related-to"}]`)
45
+ .join(", ");
46
+ const more = preview.truncated
47
+ ? ` [+${preview.totalDirectRelations - preview.shown.length} more]`
48
+ : "";
49
+ return `**related (${preview.totalDirectRelations}):** ${shown}${more}`;
50
+ }
51
+ export function toRecallFreshness(updatedAt) {
52
+ const updated = new Date(updatedAt);
53
+ if (Number.isNaN(updated.getTime())) {
54
+ return "older";
55
+ }
56
+ const DAY_MS = 1000 * 60 * 60 * 24;
57
+ const FRESHNESS_TODAY_DAYS = 1;
58
+ const FRESHNESS_THIS_WEEK_DAYS = 7;
59
+ const FRESHNESS_THIS_MONTH_DAYS = 31;
60
+ const ageDays = Math.max(0, (Date.now() - updated.getTime()) / DAY_MS);
61
+ if (ageDays <= FRESHNESS_TODAY_DAYS)
62
+ return "today";
63
+ if (ageDays <= FRESHNESS_THIS_WEEK_DAYS)
64
+ return "thisWeek";
65
+ if (ageDays <= FRESHNESS_THIS_MONTH_DAYS)
66
+ return "thisMonth";
67
+ return "older";
68
+ }
69
+ export function toRecallRankBand(semanticRank) {
70
+ if (semanticRank !== undefined && semanticRank <= 3)
71
+ return "top3";
72
+ if (semanticRank !== undefined && semanticRank <= 10)
73
+ return "top10";
74
+ return "lower";
75
+ }
76
+ export function formatRetrievalEvidenceHint(evidence, role) {
77
+ const rolePart = role ?? "untyped";
78
+ const supersedesPart = evidence.superseded
79
+ ? ` | supersedes ${evidence.supersededCount ?? 1} note${(evidence.supersededCount ?? 1) === 1 ? "" : "s"}`
80
+ : "";
81
+ return `${evidence.rankBand} | channels: ${evidence.channels.join(", ")} | ${evidence.projectRelevant ? "project-relevant" : "cross-project"}\n${rolePart}, ${evidence.freshness}${supersedesPart}`;
82
+ }
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { CommitResult, PushResult } from "../git.js";
2
+ import type { MutationPushMode } from "../config.js";
3
+ import type { PersistenceStatus, MutationRetryContract } from "../structured-content.js";
4
+ import type { Vault } from "../vault.js";
5
+ import type { ServerContext } from "../server-context.js";
6
+ export declare function resolveDurability(commit: CommitResult, push: PushResult): PersistenceStatus["durability"];
7
+ export declare function buildPersistenceStatus(args: {
8
+ storage: import("../storage.js").Storage;
9
+ id: string;
10
+ embedding: {
11
+ status: "written" | "skipped";
12
+ reason?: string;
13
+ };
14
+ commit: CommitResult;
15
+ push: PushResult;
16
+ commitMessage?: string;
17
+ commitBody?: string;
18
+ retry?: MutationRetryContract;
19
+ }): PersistenceStatus;
20
+ export declare function buildMutationRetryContract(args: {
21
+ commit: CommitResult;
22
+ commitMessage: string;
23
+ commitBody?: string;
24
+ files: string[];
25
+ cwd?: string;
26
+ vault: Vault;
27
+ mutationApplied: boolean;
28
+ preferredRecovery?: "manual-exact-git-recovery" | "rerun-tool-call-serial" | "no-manual-recovery";
29
+ }): MutationRetryContract | undefined;
30
+ export declare function formatRetrySummary(retry?: MutationRetryContract): string | undefined;
31
+ export declare function formatPersistenceSummary(persistence: PersistenceStatus): string;
32
+ export declare function getMutationPushMode(ctx: ServerContext): Promise<MutationPushMode>;
33
+ export declare function pushAfterMutation(ctx: ServerContext, vault: Vault): Promise<PushResult>;
34
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/helpers/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAUzG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE,OAAO,eAAe,EAAE,OAAO,CAAC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE;QAAE,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B,GAAG,iBAAiB,CAuBpB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,2BAA2B,GAAG,wBAAwB,GAAG,oBAAoB,CAAC;CACnG,GAAG,qBAAqB,GAAG,SAAS,CA+CpC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAqDpF;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,iBAAiB,GAAG,MAAM,CA4B/E;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAGvF;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAiB7F"}
@@ -0,0 +1,177 @@
1
+ import { embedModel } from "../embeddings.js";
2
+ import { memoryId } from "../brands.js";
3
+ import { storageLabel } from "./vault.js";
4
+ import { UnknownRecoveryKindError, UnknownMutationPushModeError } from "../domain-errors.js";
5
+ export function resolveDurability(commit, push) {
6
+ if (push.status === "pushed") {
7
+ return "pushed";
8
+ }
9
+ if (commit.status === "committed") {
10
+ return "committed";
11
+ }
12
+ return "local-only";
13
+ }
14
+ export function buildPersistenceStatus(args) {
15
+ return {
16
+ notePath: args.storage.notePath(memoryId(args.id)),
17
+ embeddingPath: args.storage.embeddingPath(memoryId(args.id)),
18
+ embedding: {
19
+ status: args.embedding.status,
20
+ model: embedModel,
21
+ reason: args.embedding.reason,
22
+ },
23
+ git: {
24
+ commit: args.commit.status,
25
+ push: args.push.status,
26
+ commitOperation: args.commit.status === "failed" ? args.commit.operation : undefined,
27
+ commitMessage: args.commitMessage,
28
+ commitBody: args.commitBody,
29
+ commitReason: args.commit.status === "failed" ? args.commit.reason : args.commit.status === "skipped" ? args.commit.reason : undefined,
30
+ commitError: args.commit.status === "failed" ? args.commit.error : undefined,
31
+ pushReason: args.push.status === "skipped" ? args.push.reason : undefined,
32
+ pushError: args.push.status === "failed" ? args.push.error : undefined,
33
+ },
34
+ retry: args.retry,
35
+ durability: resolveDurability(args.commit, args.push),
36
+ };
37
+ }
38
+ export function buildMutationRetryContract(args) {
39
+ if (args.commit.status !== "failed") {
40
+ return undefined;
41
+ }
42
+ const recoveryKind = args.preferredRecovery ?? (args.mutationApplied
43
+ ? "manual-exact-git-recovery"
44
+ : "no-manual-recovery");
45
+ const recoveryReason = recoveryKind === "rerun-tool-call-serial"
46
+ ? "Tool-level reconciliation exists for this mutation; rerun the same tool call serially for the affected vault."
47
+ : recoveryKind === "manual-exact-git-recovery"
48
+ ? "Mutation is already persisted on disk; manual git recovery is allowed only with the exact attemptedCommit values."
49
+ : "Mutation was not applied deterministically; manual git recovery is not authorized.";
50
+ return {
51
+ recovery: {
52
+ kind: recoveryKind,
53
+ allowed: recoveryKind !== "no-manual-recovery",
54
+ reason: recoveryReason,
55
+ },
56
+ attemptedCommit: {
57
+ subject: args.commitMessage,
58
+ body: args.commitBody,
59
+ files: args.files,
60
+ cwd: args.cwd,
61
+ vault: storageLabel(args.vault),
62
+ error: args.commit.error ?? "Unknown git commit failure",
63
+ operation: args.commit.operation,
64
+ },
65
+ mutationApplied: args.mutationApplied,
66
+ retrySafe: args.mutationApplied,
67
+ rationale: args.mutationApplied
68
+ ? "Mutation is already persisted on disk; commit can be retried deterministically."
69
+ : "Mutation was not applied; retry may require re-running the operation.",
70
+ instructions: {
71
+ sourceOfTruth: recoveryKind === "manual-exact-git-recovery" ? "attemptedCommit" : "tool-response",
72
+ useExactSubject: recoveryKind === "manual-exact-git-recovery",
73
+ useExactBody: recoveryKind === "manual-exact-git-recovery",
74
+ useExactFiles: recoveryKind === "manual-exact-git-recovery",
75
+ forbidInferenceFromHistory: true,
76
+ forbidInferenceFromTitleOrSummary: true,
77
+ forbidParallelSameVaultRetries: true,
78
+ preferToolReconciliation: recoveryKind === "rerun-tool-call-serial",
79
+ rerunSameToolCallSerially: recoveryKind === "rerun-tool-call-serial",
80
+ },
81
+ };
82
+ }
83
+ export function formatRetrySummary(retry) {
84
+ if (!retry) {
85
+ return undefined;
86
+ }
87
+ const opLabel = retry.attemptedCommit.operation === "add" ? "add" : "commit";
88
+ const error = retry.attemptedCommit.error;
89
+ const lines = [];
90
+ switch (retry.recovery.kind) {
91
+ case "rerun-tool-call-serial":
92
+ lines.push("Recovery: rerun same tool call serially");
93
+ lines.push(retry.recovery.reason);
94
+ lines.push("Rerun the same mnemonic tool call one time for the affected vault.");
95
+ lines.push("Do not replay same-vault mutations in parallel.");
96
+ lines.push("Manual git recovery is not authorized for this failure.");
97
+ lines.push("Git failure:");
98
+ lines.push(`${opLabel}: ${error}`);
99
+ break;
100
+ case "manual-exact-git-recovery":
101
+ lines.push("Recovery: manual exact git recovery allowed");
102
+ lines.push(retry.recovery.reason);
103
+ lines.push("Use only the exact values below. Do not infer from git history, note title, summary, or repo state.");
104
+ lines.push("");
105
+ lines.push("Commit subject:");
106
+ lines.push(retry.attemptedCommit.subject);
107
+ if (retry.attemptedCommit.body) {
108
+ lines.push("");
109
+ lines.push("Commit body:");
110
+ lines.push(retry.attemptedCommit.body);
111
+ }
112
+ lines.push("");
113
+ lines.push("Files:");
114
+ for (const file of retry.attemptedCommit.files) {
115
+ lines.push(`- ${file}`);
116
+ }
117
+ lines.push("");
118
+ lines.push("Git failure:");
119
+ lines.push(`${opLabel}: ${error}`);
120
+ break;
121
+ case "no-manual-recovery":
122
+ lines.push("Recovery: no manual recovery authorized");
123
+ lines.push(retry.recovery.reason);
124
+ lines.push("Git failure:");
125
+ lines.push(`${opLabel}: ${error}`);
126
+ break;
127
+ default: {
128
+ const _exhaustive = retry.recovery.kind;
129
+ throw new UnknownRecoveryKindError(_exhaustive);
130
+ }
131
+ }
132
+ return lines.join("\n");
133
+ }
134
+ export function formatPersistenceSummary(persistence) {
135
+ const parts = [
136
+ `Persistence: embedding ${persistence.embedding.status}`,
137
+ `git ${persistence.durability}`,
138
+ ];
139
+ const lines = [parts.join(" | ")];
140
+ if (persistence.embedding.reason) {
141
+ lines[0] += ` | embedding reason=${persistence.embedding.reason}`;
142
+ }
143
+ const retrySummary = formatRetrySummary(persistence.retry);
144
+ if (!retrySummary && persistence.git.commit === "failed" && persistence.git.commitError) {
145
+ const opLabel = persistence.git.commitOperation === "add" ? "add" : "commit";
146
+ lines.push(`Git ${opLabel} error: ${persistence.git.commitError}`);
147
+ }
148
+ if (persistence.git.push === "failed" && persistence.git.pushError) {
149
+ lines.push(`Git push error: ${persistence.git.pushError}`);
150
+ }
151
+ if (retrySummary) {
152
+ lines.push(retrySummary);
153
+ }
154
+ return lines.join("\n");
155
+ }
156
+ export async function getMutationPushMode(ctx) {
157
+ const latestConfig = await ctx.configStore.load();
158
+ return latestConfig.mutationPushMode;
159
+ }
160
+ export async function pushAfterMutation(ctx, vault) {
161
+ const mutationPushMode = await getMutationPushMode(ctx);
162
+ switch (mutationPushMode) {
163
+ case "all":
164
+ return vault.git.pushWithStatus();
165
+ case "main-only":
166
+ return vault.isProject
167
+ ? { status: "skipped", reason: "auto-push-disabled" }
168
+ : vault.git.pushWithStatus();
169
+ case "none":
170
+ return { status: "skipped", reason: "auto-push-disabled" };
171
+ default: {
172
+ const _exhaustive = mutationPushMode;
173
+ throw new UnknownMutationPushModeError(_exhaustive);
174
+ }
175
+ }
176
+ }
177
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/helpers/persistence.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAE7F,MAAM,UAAU,iBAAiB,CAAC,MAAoB,EAAE,IAAgB;IACtE,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAStC;IACC,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5D,SAAS,EAAE;YACT,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;YAC7B,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;SAC9B;QACD,GAAG,EAAE;YACH,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;YACtB,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACpF,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACtI,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC5E,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACzE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACvE;QACD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAS1C;IACC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,eAAe;QAClE,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAE1B,MAAM,cAAc,GAAG,YAAY,KAAK,wBAAwB;QAC9D,CAAC,CAAC,+GAA+G;QACjH,CAAC,CAAC,YAAY,KAAK,2BAA2B;YAC5C,CAAC,CAAC,mHAAmH;YACrH,CAAC,CAAC,oFAAoF,CAAC;IAE3F,OAAO;QACL,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,YAAY,KAAK,oBAAoB;YAC9C,MAAM,EAAE,cAAc;SACvB;QACD,eAAe,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,aAAa;YAC3B,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YAC/B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,4BAA4B;YACxD,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;SACjC;QACD,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,SAAS,EAAE,IAAI,CAAC,eAAe;QAC/B,SAAS,EAAE,IAAI,CAAC,eAAe;YAC7B,CAAC,CAAC,iFAAiF;YACnF,CAAC,CAAC,uEAAuE;QAC3E,YAAY,EAAE;YACZ,aAAa,EAAE,YAAY,KAAK,2BAA2B,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe;YACjG,eAAe,EAAE,YAAY,KAAK,2BAA2B;YAC7D,YAAY,EAAE,YAAY,KAAK,2BAA2B;YAC1D,aAAa,EAAE,YAAY,KAAK,2BAA2B;YAC3D,0BAA0B,EAAE,IAAI;YAChC,iCAAiC,EAAE,IAAI;YACvC,8BAA8B,EAAE,IAAI;YACpC,wBAAwB,EAAE,YAAY,KAAK,wBAAwB;YACnE,yBAAyB,EAAE,YAAY,KAAK,wBAAwB;SACrE;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAA6B;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,QAAQ,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,wBAAwB;YAC3B,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;YACjF,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,2BAA2B;YAC9B,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;YAClH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC1B,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,oBAAoB;YACvB,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;YACnC,MAAM;QACR,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC/C,MAAM,IAAI,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,WAA8B;IACrE,MAAM,KAAK,GAAG;QACZ,0BAA0B,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE;QACxD,OAAO,WAAW,CAAC,UAAU,EAAE;KAChC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAElC,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACjC,KAAK,CAAC,CAAC,CAAC,IAAI,uBAAuB,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE3D,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACxF,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7E,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,WAAW,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,mBAAmB,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAkB;IAC1D,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAClD,OAAO,YAAY,CAAC,gBAAgB,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAkB,EAAE,KAAY;IACtE,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAExD,QAAQ,gBAAgB,EAAE,CAAC;QACzB,KAAK,KAAK;YACR,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QACpC,KAAK,WAAW;YACd,OAAO,KAAK,CAAC,SAAS;gBACpB,CAAC,CAAC,EAAE,MAAM,EAAE,SAAkB,EAAE,MAAM,EAAE,oBAA6B,EAAE;gBACvE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,EAAE,MAAM,EAAE,SAAkB,EAAE,MAAM,EAAE,oBAA6B,EAAE,CAAC;QAC/E,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,gBAAgB,CAAC;YAC5C,MAAM,IAAI,4BAA4B,CAAC,WAAW,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ import { type ProjectIdentityResolution } from "../project.js";
3
+ import type { ServerContext } from "../server-context.js";
4
+ import type { ProjectRef } from "../structured-content.js";
5
+ import type { Vault } from "../vault.js";
6
+ import type { WriteScope } from "../project-memory-policy.js";
7
+ export declare const projectParam: z.ZodOptional<z.ZodString>;
8
+ export declare function resolveProject(ctx: ServerContext, cwd?: string): Promise<import("../project.js").ProjectInfo | null | undefined>;
9
+ export declare function toProjectRef(project?: {
10
+ id: string;
11
+ name: string;
12
+ } | null): ProjectRef | undefined;
13
+ export declare function noteProjectRef(note: {
14
+ project?: string;
15
+ projectName?: string;
16
+ }): ProjectRef | undefined;
17
+ export declare function resolveProjectIdentityForCwd(ctx: ServerContext, cwd?: string): Promise<ProjectIdentityResolution | undefined>;
18
+ export declare function resolveWriteVault(ctx: ServerContext, cwd: string | undefined, scope: WriteScope): Promise<Vault>;
19
+ export declare function describeProject(project: Awaited<ReturnType<typeof resolveProject>>): string;
20
+ export declare function ensureBranchSynced(ctx: ServerContext, cwd?: string): Promise<boolean>;
21
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/helpers/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAyC,KAAK,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAK9D,eAAO,MAAM,YAAY,4BAKtB,CAAC;AAEJ,wBAAsB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,mEAKpE;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,CAElG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,GAAG,SAAS,CASvG;AAED,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAMnI;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAQtH;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,GAAG,MAAM,CAE3F;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA8B3F"}
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import { detectProject, resolveProjectIdentity } from "../project.js";
3
+ import { invalidateActiveProjectCache } from "../cache.js";
4
+ import { checkBranchChange } from "../branch-tracker.js";
5
+ import { backfillEmbeddingsAfterSync } from "./embed.js";
6
+ export const projectParam = z
7
+ .string()
8
+ .optional()
9
+ .describe("Absolute project working directory. Pass this whenever the task is project-related so routing, search boosting, policy, and vault selection work correctly.");
10
+ export async function resolveProject(ctx, cwd) {
11
+ if (!cwd)
12
+ return undefined;
13
+ return detectProject(cwd, {
14
+ getProjectIdentityOverride: async (projectId) => ctx.configStore.getProjectIdentityOverride(projectId),
15
+ });
16
+ }
17
+ export function toProjectRef(project) {
18
+ return project ? { id: project.id, name: project.name } : undefined;
19
+ }
20
+ export function noteProjectRef(note) {
21
+ if (!note.project || !note.projectName) {
22
+ return undefined;
23
+ }
24
+ return {
25
+ id: note.project,
26
+ name: note.projectName,
27
+ };
28
+ }
29
+ export async function resolveProjectIdentityForCwd(ctx, cwd) {
30
+ if (!cwd)
31
+ return undefined;
32
+ const identity = await resolveProjectIdentity(cwd, {
33
+ getProjectIdentityOverride: async (projectId) => ctx.configStore.getProjectIdentityOverride(projectId),
34
+ });
35
+ return identity ?? undefined;
36
+ }
37
+ export async function resolveWriteVault(ctx, cwd, scope) {
38
+ if (scope === "project") {
39
+ return cwd
40
+ ? (await ctx.vaultManager.getOrCreateProjectVault(cwd)) ?? ctx.vaultManager.main
41
+ : ctx.vaultManager.main;
42
+ }
43
+ return ctx.vaultManager.main;
44
+ }
45
+ export function describeProject(project) {
46
+ return project ? `project '${project.name}' (${project.id})` : "global";
47
+ }
48
+ export async function ensureBranchSynced(ctx, cwd) {
49
+ if (!cwd)
50
+ return false;
51
+ const previousBranch = await checkBranchChange(cwd);
52
+ if (!previousBranch)
53
+ return false;
54
+ console.error(`[branch] Detected branch change from '${previousBranch}' — auto-syncing`);
55
+ const projectVault = await ctx.vaultManager.getProjectVaultIfExists(cwd);
56
+ await Promise.all([
57
+ ctx.vaultManager.main.git.sync().then(async (result) => {
58
+ console.error(`[branch] Main vault sync: ${JSON.stringify(result)}`);
59
+ const backfill = await backfillEmbeddingsAfterSync(ctx, ctx.vaultManager.main.storage, "main vault", [], true);
60
+ console.error(`[branch] Main vault embedded ${backfill.embedded} notes`);
61
+ return result;
62
+ }),
63
+ projectVault
64
+ ? projectVault.git.sync().then(async (result) => {
65
+ console.error(`[branch] Project vault sync: ${JSON.stringify(result)}`);
66
+ const backfill = await backfillEmbeddingsAfterSync(ctx, projectVault.storage, "project vault", [], true);
67
+ console.error(`[branch] Project vault embedded ${backfill.embedded} notes`);
68
+ return result;
69
+ })
70
+ : Promise.resolve(undefined),
71
+ ]);
72
+ invalidateActiveProjectCache();
73
+ return true;
74
+ }
75
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/helpers/project.ts"],"names":[],"mappings":"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"}