@danielmarbach/mnemonic-mcp 0.14.0 → 0.16.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.
@@ -0,0 +1,46 @@
1
+ import type { Note } from "./storage.js";
2
+ import type { Storage } from "./storage.js";
3
+ import type { NoteProjection } from "./structured-content.js";
4
+ /**
5
+ * Extract a summary from a note using a three-step fallback:
6
+ * 1. First non-empty paragraph after title/frontmatter
7
+ * 2. First bullet list block converted to plain text
8
+ * 3. First 200 chars of plain text body
9
+ */
10
+ export declare function extractProjectionSummary(note: Note): string;
11
+ /**
12
+ * Extract headings (# ## ###) from markdown content.
13
+ * Returns plain text, in order, deduplicated, max 8 headings.
14
+ */
15
+ export declare function extractHeadings(markdown: string): string[];
16
+ /**
17
+ * Build the projection text string used for embeddings.
18
+ * Max 1200 chars; truncates headings section if needed.
19
+ */
20
+ export declare function buildProjectionText(projection: Pick<NoteProjection, "title" | "lifecycle" | "tags" | "summary" | "headings">): string;
21
+ /**
22
+ * Build a full NoteProjection from a Note.
23
+ */
24
+ export declare function buildProjection(note: Note): NoteProjection;
25
+ /**
26
+ * A projection is stale when:
27
+ * - projection is missing → stale (caller handles null case)
28
+ * - projection.updatedAt missing → stale
29
+ * - projection.updatedAt !== note.updatedAt → stale
30
+ */
31
+ export declare function isProjectionStale(note: Note, projection: NoteProjection): boolean;
32
+ /**
33
+ * Read a stored projection, or null if not found.
34
+ */
35
+ export declare function getProjection(storage: Storage, noteId: string): Promise<NoteProjection | null>;
36
+ /**
37
+ * Build (or return cached) projection for a note.
38
+ * Always returns a valid projection; builds on demand if missing or stale.
39
+ * Saves the fresh projection to storage.
40
+ */
41
+ export declare function getOrBuildProjection(storage: Storage, note: Note): Promise<NoteProjection>;
42
+ /**
43
+ * Save a projection to storage.
44
+ */
45
+ export declare function saveProjection(storage: Storage, projection: NoteProjection): Promise<void>;
46
+ //# sourceMappingURL=projections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projections.d.ts","sourceRoot":"","sources":["../src/projections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQ9D;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAgD3D;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAe1D;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,MAAM,CAwBrI;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,cAAc,CAuB1D;AAID;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,GAAG,OAAO,CAGjF;AAID;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAEpG;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,CAUhG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhG"}
@@ -0,0 +1,202 @@
1
+ const MAX_SUMMARY_LENGTH = 280;
2
+ const MAX_HEADINGS = 8;
3
+ const MAX_PROJECTION_TEXT_LENGTH = 1200;
4
+ // ── Summary extraction ────────────────────────────────────────────────────────
5
+ /**
6
+ * Extract a summary from a note using a three-step fallback:
7
+ * 1. First non-empty paragraph after title/frontmatter
8
+ * 2. First bullet list block converted to plain text
9
+ * 3. First 200 chars of plain text body
10
+ */
11
+ export function extractProjectionSummary(note) {
12
+ const body = note.content.trim();
13
+ if (!body)
14
+ return "";
15
+ // Strip leading heading lines (# Title, ## Title, etc.) from the body
16
+ const lines = body.split("\n");
17
+ let start = 0;
18
+ while (start < lines.length && /^#{1,6}\s/.test(lines[start].trim())) {
19
+ start++;
20
+ }
21
+ const bodyWithoutLeadingHeading = lines.slice(start).join("\n").trim();
22
+ // Step 1: first non-empty paragraph (text block separated by blank lines)
23
+ const paragraphs = bodyWithoutLeadingHeading.split(/\n\s*\n/);
24
+ for (const para of paragraphs) {
25
+ const trimmed = para.trim();
26
+ if (!trimmed)
27
+ continue;
28
+ // Skip headings, code blocks, and list-only blocks
29
+ if (/^#{1,6}\s/.test(trimmed))
30
+ continue;
31
+ if (trimmed.startsWith("```"))
32
+ continue;
33
+ // If it's purely a list block, skip to step 2
34
+ const paraLines = trimmed.split("\n");
35
+ const isListBlock = paraLines.every(l => /^\s*[-*+]|\s*\d+\.\s/.test(l.trim()) || l.trim() === "");
36
+ if (!isListBlock) {
37
+ const plain = stripMarkdownInline(trimmed);
38
+ return truncate(collapseWhitespace(plain), MAX_SUMMARY_LENGTH);
39
+ }
40
+ }
41
+ // Step 2: first bullet list block converted to plain text
42
+ for (const para of paragraphs) {
43
+ const trimmed = para.trim();
44
+ if (!trimmed)
45
+ continue;
46
+ const paraLines = trimmed.split("\n");
47
+ const isListBlock = paraLines.some(l => /^\s*[-*+]|\s*\d+\.\s/.test(l.trim()));
48
+ if (isListBlock) {
49
+ const plain = paraLines
50
+ .map(l => l.replace(/^\s*[-*+]\s*/, "").replace(/^\s*\d+\.\s*/, "").trim())
51
+ .filter(Boolean)
52
+ .join("; ");
53
+ return truncate(collapseWhitespace(stripMarkdownInline(plain)), MAX_SUMMARY_LENGTH);
54
+ }
55
+ }
56
+ // Step 3: first 200 chars of plain text body
57
+ const plain = stripMarkdownInline(bodyWithoutLeadingHeading);
58
+ const collapsed = collapseWhitespace(plain);
59
+ return truncate(collapsed, Math.min(200, MAX_SUMMARY_LENGTH));
60
+ }
61
+ // ── Heading extraction ────────────────────────────────────────────────────────
62
+ /**
63
+ * Extract headings (# ## ###) from markdown content.
64
+ * Returns plain text, in order, deduplicated, max 8 headings.
65
+ */
66
+ export function extractHeadings(markdown) {
67
+ const seen = new Set();
68
+ const headings = [];
69
+ for (const line of markdown.split("\n")) {
70
+ const match = /^(#{1,3})\s+(.+)/.exec(line.trim());
71
+ if (!match)
72
+ continue;
73
+ const text = stripMarkdownInline(match[2]).trim();
74
+ if (!text || seen.has(text))
75
+ continue;
76
+ seen.add(text);
77
+ headings.push(text);
78
+ if (headings.length >= MAX_HEADINGS)
79
+ break;
80
+ }
81
+ return headings;
82
+ }
83
+ // ── Projection text ───────────────────────────────────────────────────────────
84
+ /**
85
+ * Build the projection text string used for embeddings.
86
+ * Max 1200 chars; truncates headings section if needed.
87
+ */
88
+ export function buildProjectionText(projection) {
89
+ const parts = [
90
+ `Title: ${projection.title}`,
91
+ projection.lifecycle ? `Lifecycle: ${projection.lifecycle}` : "",
92
+ projection.tags.length > 0 ? `Tags: ${projection.tags.join(", ")}` : "",
93
+ projection.summary ? `Summary: ${projection.summary}` : "",
94
+ projection.headings.length > 0 ? `Headings: ${projection.headings.join(" | ")}` : "",
95
+ ].filter(Boolean);
96
+ const text = parts.join("\n");
97
+ if (text.length <= MAX_PROJECTION_TEXT_LENGTH) {
98
+ return text;
99
+ }
100
+ // Truncate headings if needed to stay within limit
101
+ const withoutHeadings = parts.slice(0, -1).join("\n");
102
+ if (withoutHeadings.length >= MAX_PROJECTION_TEXT_LENGTH) {
103
+ return withoutHeadings.slice(0, MAX_PROJECTION_TEXT_LENGTH);
104
+ }
105
+ const headingsPrefix = "Headings: ";
106
+ const available = MAX_PROJECTION_TEXT_LENGTH - withoutHeadings.length - 1; // -1 for \n
107
+ const truncatedHeadings = headingsPrefix + projection.headings.join(" | ").slice(0, available - headingsPrefix.length);
108
+ return `${withoutHeadings}\n${truncatedHeadings}`;
109
+ }
110
+ // ── Projection model ──────────────────────────────────────────────────────────
111
+ /**
112
+ * Build a full NoteProjection from a Note.
113
+ */
114
+ export function buildProjection(note) {
115
+ const summary = extractProjectionSummary(note);
116
+ const headings = extractHeadings(note.content);
117
+ const partial = {
118
+ title: note.title,
119
+ lifecycle: note.lifecycle,
120
+ tags: note.tags,
121
+ summary,
122
+ headings,
123
+ };
124
+ const projectionText = buildProjectionText(partial);
125
+ return {
126
+ noteId: note.id,
127
+ title: note.title,
128
+ summary,
129
+ headings,
130
+ tags: note.tags,
131
+ lifecycle: note.lifecycle,
132
+ updatedAt: note.updatedAt,
133
+ projectionText,
134
+ generatedAt: new Date().toISOString(),
135
+ };
136
+ }
137
+ // ── Staleness detection ───────────────────────────────────────────────────────
138
+ /**
139
+ * A projection is stale when:
140
+ * - projection is missing → stale (caller handles null case)
141
+ * - projection.updatedAt missing → stale
142
+ * - projection.updatedAt !== note.updatedAt → stale
143
+ */
144
+ export function isProjectionStale(note, projection) {
145
+ if (!projection.updatedAt)
146
+ return true;
147
+ return projection.updatedAt !== note.updatedAt;
148
+ }
149
+ // ── Storage helpers ───────────────────────────────────────────────────────────
150
+ /**
151
+ * Read a stored projection, or null if not found.
152
+ */
153
+ export async function getProjection(storage, noteId) {
154
+ return storage.readProjection(noteId);
155
+ }
156
+ /**
157
+ * Build (or return cached) projection for a note.
158
+ * Always returns a valid projection; builds on demand if missing or stale.
159
+ * Saves the fresh projection to storage.
160
+ */
161
+ export async function getOrBuildProjection(storage, note) {
162
+ const existing = await storage.readProjection(note.id);
163
+ if (existing && !isProjectionStale(note, existing)) {
164
+ return existing;
165
+ }
166
+ const fresh = buildProjection(note);
167
+ await storage.writeProjection(fresh).catch(() => {
168
+ // Best-effort save; never block the caller
169
+ });
170
+ return fresh;
171
+ }
172
+ /**
173
+ * Save a projection to storage.
174
+ */
175
+ export async function saveProjection(storage, projection) {
176
+ return storage.writeProjection(projection);
177
+ }
178
+ // ── Private helpers ───────────────────────────────────────────────────────────
179
+ function collapseWhitespace(text) {
180
+ return text.replace(/\s+/g, " ").trim();
181
+ }
182
+ function truncate(text, maxLength) {
183
+ if (text.length <= maxLength)
184
+ return text;
185
+ return text.slice(0, maxLength);
186
+ }
187
+ /**
188
+ * Strip common inline markdown: bold, italic, code spans, links, images.
189
+ */
190
+ function stripMarkdownInline(text) {
191
+ return text
192
+ .replace(/!\[([^\]]*)\]\([^)]*\)/g, "$1") // images
193
+ .replace(/\[([^\]]*)\]\([^)]*\)/g, "$1") // links
194
+ .replace(/`([^`]+)`/g, "$1") // inline code
195
+ .replace(/\*\*([^*]+)\*\*/g, "$1") // bold **
196
+ .replace(/__([^_]+)__/g, "$1") // bold __
197
+ .replace(/\*([^*]+)\*/g, "$1") // italic *
198
+ .replace(/_([^_]+)_/g, "$1") // italic _
199
+ .replace(/~~([^~]+)~~/g, "$1") // strikethrough
200
+ .trim();
201
+ }
202
+ //# sourceMappingURL=projections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projections.js","sourceRoot":"","sources":["../src/projections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { Note, Relationship } from "./storage.js";
2
+ import type { Vault } from "./vault.js";
3
+ import type { RelationshipPreview } from "./structured-content.js";
4
+ export interface RelationshipExpansionOptions {
5
+ /** Active project ID for same-project boosting */
6
+ activeProjectId?: string;
7
+ /** Maximum related notes to show (default: 3, hard max: 5) */
8
+ limit?: number;
9
+ /** Whether to include global notes (default: true if directly related) */
10
+ includeGlobal?: boolean;
11
+ }
12
+ interface ScoredRelatedNote {
13
+ note: Note;
14
+ vault: Vault;
15
+ relationType: Relationship["type"];
16
+ score: number;
17
+ }
18
+ /**
19
+ * Check if note is tagged as anchor.
20
+ */
21
+ export declare function isAnchor(note: Note): boolean;
22
+ /**
23
+ * Check if note was recently updated.
24
+ */
25
+ export declare function isRecentlyUpdated(note: Note): boolean;
26
+ /**
27
+ * Compute deterministic score for a related note.
28
+ * Higher score = higher priority for display.
29
+ */
30
+ export declare function scoreRelatedNote(note: Note, activeProjectId?: string): number;
31
+ /**
32
+ * Get all direct related notes for a given note.
33
+ * Returns note + vault pairs for directly related notes only (1-hop).
34
+ */
35
+ export declare function getDirectRelatedNotes(note: Note, allVaults: Vault[], activeProjectId?: string): Promise<ScoredRelatedNote[]>;
36
+ /**
37
+ * Build bounded relationship preview for a note.
38
+ * Returns undefined if no direct relations exist.
39
+ */
40
+ export declare function buildRelationshipPreview(scoredRelated: ScoredRelatedNote[], options: RelationshipExpansionOptions): RelationshipPreview | undefined;
41
+ /**
42
+ * Main entry point: get bounded relationship preview for a note.
43
+ * Returns undefined if no relations exist or expansion fails.
44
+ */
45
+ export declare function getRelationshipPreview(note: Note, allVaults: Vault[], options: RelationshipExpansionOptions): Promise<RelationshipPreview | undefined>;
46
+ export {};
47
+ //# sourceMappingURL=relationships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAavF,MAAM,WAAW,4BAA4B;IAC3C,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAID,UAAU,iBAAiB;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAsBD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAG5C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAKrD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CA2BR;AAID;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,KAAK,EAAE,EAClB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAiC9B;AAyBD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,iBAAiB,EAAE,EAClC,OAAO,EAAE,4BAA4B,GACpC,mBAAmB,GAAG,SAAS,CAcjC;AAID;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,KAAK,EAAE,EAClB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAQ1C"}
@@ -0,0 +1,153 @@
1
+ import { classifyTheme } from "./project-introspection.js";
2
+ const RECENTLY_CHANGED_DAYS = 5;
3
+ const HIGH_CONFIDENCE_CENTRALITY = 5;
4
+ const HIGH_CONFIDENCE_DAYS = 30;
5
+ const MEDIUM_CONFIDENCE_DAYS = 90;
6
+ const DEFAULT_RELATIONSHIP_LIMIT = 3;
7
+ const HARD_MAX_RELATIONSHIP_LIMIT = 5;
8
+ /**
9
+ * Compute confidence for a related note (same logic as provenance.ts).
10
+ */
11
+ function computeRelatedNoteConfidence(note) {
12
+ const now = new Date();
13
+ const updatedDate = new Date(note.updatedAt);
14
+ const daysSinceUpdate = Math.floor((now.getTime() - updatedDate.getTime()) / (1000 * 60 * 60 * 24));
15
+ const centrality = note.relatedTo?.length ?? 0;
16
+ if (note.lifecycle === "permanent" && centrality >= HIGH_CONFIDENCE_CENTRALITY && daysSinceUpdate < HIGH_CONFIDENCE_DAYS) {
17
+ return "high";
18
+ }
19
+ if (daysSinceUpdate < MEDIUM_CONFIDENCE_DAYS) {
20
+ return "medium";
21
+ }
22
+ return "low";
23
+ }
24
+ /**
25
+ * Check if note is tagged as anchor.
26
+ */
27
+ export function isAnchor(note) {
28
+ return note.lifecycle === "permanent" &&
29
+ note.tags.some(t => t.toLowerCase() === "anchor" || t.toLowerCase() === "alwaysload");
30
+ }
31
+ /**
32
+ * Check if note was recently updated.
33
+ */
34
+ export function isRecentlyUpdated(note) {
35
+ const now = new Date();
36
+ const updatedDate = new Date(note.updatedAt);
37
+ const daysSinceUpdate = Math.floor((now.getTime() - updatedDate.getTime()) / (1000 * 60 * 60 * 24));
38
+ return daysSinceUpdate < RECENTLY_CHANGED_DAYS;
39
+ }
40
+ /**
41
+ * Compute deterministic score for a related note.
42
+ * Higher score = higher priority for display.
43
+ */
44
+ export function scoreRelatedNote(note, activeProjectId) {
45
+ let score = 0;
46
+ // Same project: strong boost (100 points)
47
+ if (activeProjectId && note.project === activeProjectId) {
48
+ score += 100;
49
+ }
50
+ // Anchor: medium boost (50 points)
51
+ if (isAnchor(note)) {
52
+ score += 50;
53
+ }
54
+ // Recently updated: small boost (20 points)
55
+ if (isRecentlyUpdated(note)) {
56
+ score += 20;
57
+ }
58
+ // High confidence: small boost (10 points)
59
+ const confidence = computeRelatedNoteConfidence(note);
60
+ if (confidence === "high") {
61
+ score += 10;
62
+ }
63
+ else if (confidence === "medium") {
64
+ score += 5;
65
+ }
66
+ return score;
67
+ }
68
+ // ── Collection ───────────────────────────────────────────────────────────────
69
+ /**
70
+ * Get all direct related notes for a given note.
71
+ * Returns note + vault pairs for directly related notes only (1-hop).
72
+ */
73
+ export async function getDirectRelatedNotes(note, allVaults, activeProjectId) {
74
+ const relatedIds = note.relatedTo?.map(r => r.id) ?? [];
75
+ if (relatedIds.length === 0) {
76
+ return [];
77
+ }
78
+ const scored = [];
79
+ for (const vault of allVaults) {
80
+ for (const relatedId of relatedIds) {
81
+ const relatedNote = await vault.storage.readNote(relatedId);
82
+ if (!relatedNote)
83
+ continue;
84
+ const relationship = note.relatedTo.find(r => r.id === relatedId);
85
+ if (!relationship)
86
+ continue;
87
+ const score = scoreRelatedNote(relatedNote, activeProjectId);
88
+ scored.push({
89
+ note: relatedNote,
90
+ vault,
91
+ relationType: relationship.type,
92
+ score,
93
+ });
94
+ }
95
+ }
96
+ // Sort by score descending, then by title for determinism
97
+ scored.sort((a, b) => {
98
+ if (b.score !== a.score)
99
+ return b.score - a.score;
100
+ return a.note.title.localeCompare(b.note.title);
101
+ });
102
+ return scored;
103
+ }
104
+ // ── Preview Construction ─────────────────────────────────────────────────────
105
+ /**
106
+ * Build a compact related note preview.
107
+ */
108
+ function buildRelatedNotePreview(scored, activeProjectId) {
109
+ const { note, relationType } = scored;
110
+ const theme = classifyTheme(note);
111
+ return {
112
+ id: note.id,
113
+ title: note.title,
114
+ projectId: note.project,
115
+ theme: theme !== "other" ? theme : undefined,
116
+ relationType,
117
+ updatedAt: note.updatedAt,
118
+ confidence: computeRelatedNoteConfidence(note),
119
+ };
120
+ }
121
+ /**
122
+ * Build bounded relationship preview for a note.
123
+ * Returns undefined if no direct relations exist.
124
+ */
125
+ export function buildRelationshipPreview(scoredRelated, options) {
126
+ if (scoredRelated.length === 0) {
127
+ return undefined;
128
+ }
129
+ const limit = Math.min(options.limit ?? DEFAULT_RELATIONSHIP_LIMIT, HARD_MAX_RELATIONSHIP_LIMIT);
130
+ const shown = scoredRelated.slice(0, limit).map(s => buildRelatedNotePreview(s, options.activeProjectId));
131
+ const truncated = scoredRelated.length > limit;
132
+ return {
133
+ totalDirectRelations: scoredRelated.length,
134
+ shown,
135
+ truncated,
136
+ };
137
+ }
138
+ // ── Public API ───────────────────────────────────────────────────────────────
139
+ /**
140
+ * Main entry point: get bounded relationship preview for a note.
141
+ * Returns undefined if no relations exist or expansion fails.
142
+ */
143
+ export async function getRelationshipPreview(note, allVaults, options) {
144
+ try {
145
+ const scored = await getDirectRelatedNotes(note, allVaults, options.activeProjectId);
146
+ return buildRelationshipPreview(scored, options);
147
+ }
148
+ catch {
149
+ // Fail-soft: omit preview on error
150
+ return undefined;
151
+ }
152
+ }
153
+ //# sourceMappingURL=relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships.js","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { NoteProjection } from "./structured-content.js";
1
2
  export type RelationshipType = "related-to" | "explains" | "example-of" | "supersedes";
2
3
  export type NoteLifecycle = "temporary" | "permanent";
3
4
  export declare const NOTE_LIFECYCLES: readonly ["temporary", "permanent"];
@@ -31,6 +32,7 @@ export declare class Storage {
31
32
  readonly vaultPath: string;
32
33
  readonly notesDir: string;
33
34
  readonly embeddingsDir: string;
35
+ readonly projectionsDir: string;
34
36
  private stagedNotesDir?;
35
37
  private stagedDeletedNoteIds;
36
38
  /**
@@ -54,8 +56,11 @@ export declare class Storage {
54
56
  writeEmbedding(record: EmbeddingRecord): Promise<void>;
55
57
  readEmbedding(id: string): Promise<EmbeddingRecord | null>;
56
58
  listEmbeddings(): Promise<EmbeddingRecord[]>;
59
+ writeProjection(projection: NoteProjection): Promise<void>;
60
+ readProjection(id: string): Promise<NoteProjection | null>;
57
61
  notePath(id: string): string;
58
62
  embeddingPath(id: string): string;
63
+ projectionPath(id: string): string;
59
64
  private stagedNotePath;
60
65
  private listNoteIds;
61
66
  private clearAtomicNotesWrite;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC;AACvF,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;AACtD,eAAO,MAAM,eAAe,qCAAyE,CAAC;AAEtG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,aAAa,CAAC;IACzB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,OAAO;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,oBAAoB,CAAqB;IAEjD;;;;;OAKG;gBACS,SAAS,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,MAAM;IAUvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BvC,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzC,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAuB1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBxC,SAAS,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAqBtE,OAAO,CAAC,aAAa;IAuBf,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAS1D,cAAc,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAgBlD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAI5B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAIjC,OAAO,CAAC,cAAc;YAMR,WAAW;YAkCX,qBAAqB;IAUnC,OAAO,CAAC,SAAS;CAoBlB"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC;AACvF,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;AACtD,eAAO,MAAM,eAAe,qCAAyE,CAAC;AAEtG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,aAAa,CAAC;IACzB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,OAAO;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,oBAAoB,CAAqB;IAEjD;;;;;OAKG;gBACS,SAAS,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,MAAM;IAYvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BvC,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzC,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAuB1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBxC,SAAS,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAqBtE,OAAO,CAAC,aAAa;IAuBf,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAS1D,cAAc,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAgB5C,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1D,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAWhE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAI5B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAIjC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAIlC,OAAO,CAAC,cAAc;YAMR,WAAW;YAkCX,qBAAqB;IAUnC,OAAO,CAAC,SAAS;CAoBlB"}
package/build/storage.js CHANGED
@@ -7,6 +7,7 @@ export class Storage {
7
7
  vaultPath;
8
8
  notesDir;
9
9
  embeddingsDir;
10
+ projectionsDir;
10
11
  stagedNotesDir;
11
12
  stagedDeletedNoteIds = new Set();
12
13
  /**
@@ -23,10 +24,13 @@ export class Storage {
23
24
  this.embeddingsDir = embeddingsDirOverride
24
25
  ? path.resolve(embeddingsDirOverride)
25
26
  : path.join(this.vaultPath, "embeddings");
27
+ // Projections are local-only derived artifacts, colocated with embeddings.
28
+ this.projectionsDir = path.join(this.vaultPath, "projections");
26
29
  }
27
30
  async init() {
28
31
  await fs.mkdir(this.notesDir, { recursive: true });
29
32
  await fs.mkdir(this.embeddingsDir, { recursive: true });
33
+ await fs.mkdir(this.projectionsDir, { recursive: true });
30
34
  }
31
35
  // ── Notes ──────────────────────────────────────────────────────────────────
32
36
  async beginAtomicNotesWrite() {
@@ -115,6 +119,10 @@ export class Storage {
115
119
  await fs.unlink(this.embeddingPath(id));
116
120
  }
117
121
  catch { /* ok */ }
122
+ try {
123
+ await fs.unlink(this.projectionPath(id));
124
+ }
125
+ catch { /* ok */ }
118
126
  return true;
119
127
  }
120
128
  catch {
@@ -190,6 +198,20 @@ export class Storage {
190
198
  const records = await Promise.all(ids.map((id) => this.readEmbedding(id)));
191
199
  return records.filter((record) => record !== null);
192
200
  }
201
+ // ── Projections ────────────────────────────────────────────────────────────
202
+ async writeProjection(projection) {
203
+ await fs.mkdir(this.projectionsDir, { recursive: true });
204
+ await fs.writeFile(this.projectionPath(projection.noteId), JSON.stringify(projection, null, 2), "utf-8");
205
+ }
206
+ async readProjection(id) {
207
+ try {
208
+ const raw = await fs.readFile(this.projectionPath(id), "utf-8");
209
+ return JSON.parse(raw);
210
+ }
211
+ catch {
212
+ return null;
213
+ }
214
+ }
193
215
  // ── Helpers ────────────────────────────────────────────────────────────────
194
216
  notePath(id) {
195
217
  return path.join(this.notesDir, `${id}.md`);
@@ -197,6 +219,9 @@ export class Storage {
197
219
  embeddingPath(id) {
198
220
  return path.join(this.embeddingsDir, `${id}.json`);
199
221
  }
222
+ projectionPath(id) {
223
+ return path.join(this.projectionsDir, `${id}.json`);
224
+ }
200
225
  stagedNotePath(id) {
201
226
  return this.stagedNotesDir
202
227
  ? path.join(this.stagedNotesDir, `${id}.md`)
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}