@danielmarbach/mnemonic-mcp 0.27.1 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/build/auto-relate.d.ts.map +1 -1
- package/build/auto-relate.js +11 -5
- package/build/auto-relate.js.map +1 -1
- package/build/brands.d.ts +38 -0
- package/build/brands.d.ts.map +1 -0
- package/build/brands.js +51 -0
- package/build/brands.js.map +1 -0
- package/build/cache.d.ts.map +1 -1
- package/build/cache.js +2 -4
- package/build/cache.js.map +1 -1
- package/build/cli/import-claude-memory.d.ts +4 -0
- package/build/cli/import-claude-memory.d.ts.map +1 -0
- package/build/cli/import-claude-memory.js +144 -0
- package/build/cli/import-claude-memory.js.map +1 -0
- package/build/cli/migrate.d.ts +2 -0
- package/build/cli/migrate.d.ts.map +1 -0
- package/build/cli/migrate.js +104 -0
- package/build/cli/migrate.js.map +1 -0
- package/build/config.d.ts +2 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +41 -14
- package/build/config.js.map +1 -1
- package/build/consolidate.d.ts +2 -1
- package/build/consolidate.d.ts.map +1 -1
- package/build/consolidate.js +3 -6
- package/build/consolidate.js.map +1 -1
- package/build/context.d.ts +5 -0
- package/build/context.d.ts.map +1 -0
- package/build/context.js +41 -0
- package/build/context.js.map +1 -0
- package/build/date-utils.d.ts +3 -0
- package/build/date-utils.d.ts.map +1 -0
- package/build/date-utils.js +10 -0
- package/build/date-utils.js.map +1 -0
- package/build/embeddings.d.ts +2 -1
- package/build/embeddings.d.ts.map +1 -1
- package/build/embeddings.js +24 -2
- package/build/embeddings.js.map +1 -1
- package/build/error-utils.d.ts +3 -0
- package/build/error-utils.d.ts.map +1 -0
- package/build/error-utils.js +9 -0
- package/build/error-utils.js.map +1 -0
- package/build/git-constants.d.ts +2 -0
- package/build/git-constants.d.ts.map +1 -0
- package/build/git-constants.js +2 -0
- package/build/git-constants.js.map +1 -0
- package/build/git.d.ts +27 -18
- package/build/git.d.ts.map +1 -1
- package/build/git.js +39 -22
- package/build/git.js.map +1 -1
- package/build/helpers/embed.d.ts +13 -0
- package/build/helpers/embed.d.ts.map +1 -0
- package/build/helpers/embed.js +70 -0
- package/build/helpers/embed.js.map +1 -0
- package/build/helpers/git-commit.d.ts +43 -0
- package/build/helpers/git-commit.d.ts.map +1 -0
- package/build/helpers/git-commit.js +129 -0
- package/build/helpers/git-commit.js.map +1 -0
- package/build/helpers/index.d.ts +19 -0
- package/build/helpers/index.d.ts.map +1 -0
- package/build/helpers/index.js +83 -0
- package/build/helpers/index.js.map +1 -0
- package/build/helpers/persistence.d.ts +34 -0
- package/build/helpers/persistence.d.ts.map +1 -0
- package/build/helpers/persistence.js +176 -0
- package/build/helpers/persistence.js.map +1 -0
- package/build/helpers/project.d.ts +21 -0
- package/build/helpers/project.d.ts.map +1 -0
- package/build/helpers/project.js +75 -0
- package/build/helpers/project.js.map +1 -0
- package/build/helpers/vault.d.ts +50 -0
- package/build/helpers/vault.d.ts.map +1 -0
- package/build/helpers/vault.js +196 -0
- package/build/helpers/vault.js.map +1 -0
- package/build/index.js +12 -5425
- package/build/index.js.map +1 -1
- package/build/lexical.d.ts +1 -1
- package/build/lexical.d.ts.map +1 -1
- package/build/lexical.js +2 -3
- package/build/lexical.js.map +1 -1
- package/build/markdown-ast.d.ts.map +1 -1
- package/build/markdown-ast.js +4 -2
- package/build/markdown-ast.js.map +1 -1
- package/build/migration.d.ts.map +1 -1
- package/build/migration.js +6 -5
- package/build/migration.js.map +1 -1
- package/build/project-introspection.d.ts +4 -4
- package/build/project-introspection.d.ts.map +1 -1
- package/build/project-introspection.js +68 -26
- package/build/project-introspection.js.map +1 -1
- package/build/project-memory-policy.d.ts.map +1 -1
- package/build/project-memory-policy.js +38 -3
- package/build/project-memory-policy.js.map +1 -1
- package/build/project.d.ts +2 -1
- package/build/project.d.ts.map +1 -1
- package/build/project.js +5 -4
- package/build/project.js.map +1 -1
- package/build/projections.d.ts.map +1 -1
- package/build/projections.js +2 -1
- package/build/projections.js.map +1 -1
- package/build/prompts.d.ts +3 -0
- package/build/prompts.d.ts.map +1 -0
- package/build/prompts.js +138 -0
- package/build/prompts.js.map +1 -0
- package/build/provenance.d.ts +1 -1
- package/build/provenance.d.ts.map +1 -1
- package/build/provenance.js +8 -11
- package/build/provenance.js.map +1 -1
- package/build/recall.d.ts +2 -1
- package/build/recall.d.ts.map +1 -1
- package/build/recall.js +29 -14
- package/build/recall.js.map +1 -1
- package/build/relationships.d.ts +2 -2
- package/build/relationships.d.ts.map +1 -1
- package/build/relationships.js +34 -38
- package/build/relationships.js.map +1 -1
- package/build/semantic-patch.d.ts.map +1 -1
- package/build/semantic-patch.js +10 -4
- package/build/semantic-patch.js.map +1 -1
- package/build/server-context.d.ts +18 -0
- package/build/server-context.d.ts.map +1 -0
- package/build/server-context.js +2 -0
- package/build/server-context.js.map +1 -0
- package/build/startup.d.ts +5 -0
- package/build/startup.d.ts.map +1 -0
- package/build/startup.js +37 -0
- package/build/startup.js.map +1 -0
- package/build/storage.d.ts +17 -15
- package/build/storage.d.ts.map +1 -1
- package/build/storage.js +32 -40
- package/build/storage.js.map +1 -1
- package/build/structured-content.d.ts +94 -74
- package/build/structured-content.d.ts.map +1 -1
- package/build/structured-content.js +30 -17
- package/build/structured-content.js.map +1 -1
- package/build/temporal-interpretation.d.ts +2 -1
- package/build/temporal-interpretation.d.ts.map +1 -1
- package/build/temporal-interpretation.js +13 -7
- package/build/temporal-interpretation.js.map +1 -1
- package/build/tools/consolidate-helpers.d.ts +55 -0
- package/build/tools/consolidate-helpers.d.ts.map +1 -0
- package/build/tools/consolidate-helpers.js +815 -0
- package/build/tools/consolidate-helpers.js.map +1 -0
- package/build/tools/consolidate.d.ts +4 -0
- package/build/tools/consolidate.d.ts.map +1 -0
- package/build/tools/consolidate.js +127 -0
- package/build/tools/consolidate.js.map +1 -0
- package/build/tools/detect-project.d.ts +6 -0
- package/build/tools/detect-project.d.ts.map +1 -0
- package/build/tools/detect-project.js +79 -0
- package/build/tools/detect-project.js.map +1 -0
- package/build/tools/discover-tags.d.ts +4 -0
- package/build/tools/discover-tags.d.ts.map +1 -0
- package/build/tools/discover-tags.js +236 -0
- package/build/tools/discover-tags.js.map +1 -0
- package/build/tools/forget.d.ts +4 -0
- package/build/tools/forget.d.ts.map +1 -0
- package/build/tools/forget.js +123 -0
- package/build/tools/forget.js.map +1 -0
- package/build/tools/get-project-identity.d.ts +4 -0
- package/build/tools/get-project-identity.d.ts.map +1 -0
- package/build/tools/get-project-identity.js +59 -0
- package/build/tools/get-project-identity.js.map +1 -0
- package/build/tools/get.d.ts +4 -0
- package/build/tools/get.d.ts.map +1 -0
- package/build/tools/get.js +115 -0
- package/build/tools/get.js.map +1 -0
- package/build/tools/index.d.ts +4 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +47 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/list.d.ts +4 -0
- package/build/tools/list.d.ts.map +1 -0
- package/build/tools/list.js +95 -0
- package/build/tools/list.js.map +1 -0
- package/build/tools/memory-graph.d.ts +4 -0
- package/build/tools/memory-graph.d.ts.map +1 -0
- package/build/tools/memory-graph.js +84 -0
- package/build/tools/memory-graph.js.map +1 -0
- package/build/tools/migration.d.ts +5 -0
- package/build/tools/migration.d.ts.map +1 -0
- package/build/tools/migration.js +157 -0
- package/build/tools/migration.js.map +1 -0
- package/build/tools/move-memory.d.ts +4 -0
- package/build/tools/move-memory.d.ts.map +1 -0
- package/build/tools/move-memory.js +170 -0
- package/build/tools/move-memory.js.map +1 -0
- package/build/tools/policy.d.ts +5 -0
- package/build/tools/policy.d.ts.map +1 -0
- package/build/tools/policy.js +195 -0
- package/build/tools/policy.js.map +1 -0
- package/build/tools/project-memory-summary.d.ts +4 -0
- package/build/tools/project-memory-summary.d.ts.map +1 -0
- package/build/tools/project-memory-summary.js +477 -0
- package/build/tools/project-memory-summary.js.map +1 -0
- package/build/tools/recall-helpers.d.ts +28 -0
- package/build/tools/recall-helpers.d.ts.map +1 -0
- package/build/tools/recall-helpers.js +137 -0
- package/build/tools/recall-helpers.js.map +1 -0
- package/build/tools/recall.d.ts +4 -0
- package/build/tools/recall.d.ts.map +1 -0
- package/build/tools/recall.js +343 -0
- package/build/tools/recall.js.map +1 -0
- package/build/tools/recent-memories.d.ts +4 -0
- package/build/tools/recent-memories.d.ts.map +1 -0
- package/build/tools/recent-memories.js +79 -0
- package/build/tools/recent-memories.js.map +1 -0
- package/build/tools/relate.d.ts +4 -0
- package/build/tools/relate.d.ts.map +1 -0
- package/build/tools/relate.js +180 -0
- package/build/tools/relate.js.map +1 -0
- package/build/tools/remember.d.ts +4 -0
- package/build/tools/remember.d.ts.map +1 -0
- package/build/tools/remember.js +219 -0
- package/build/tools/remember.js.map +1 -0
- package/build/tools/set-project-identity.d.ts +4 -0
- package/build/tools/set-project-identity.d.ts.map +1 -0
- package/build/tools/set-project-identity.js +113 -0
- package/build/tools/set-project-identity.js.map +1 -0
- package/build/tools/sync.d.ts +4 -0
- package/build/tools/sync.d.ts.map +1 -0
- package/build/tools/sync.js +127 -0
- package/build/tools/sync.js.map +1 -0
- package/build/tools/unrelate.d.ts +4 -0
- package/build/tools/unrelate.d.ts.map +1 -0
- package/build/tools/unrelate.js +179 -0
- package/build/tools/unrelate.js.map +1 -0
- package/build/tools/update.d.ts +4 -0
- package/build/tools/update.d.ts.map +1 -0
- package/build/tools/update.js +365 -0
- package/build/tools/update.js.map +1 -0
- package/build/tools/where-is-memory.d.ts +4 -0
- package/build/tools/where-is-memory.d.ts.map +1 -0
- package/build/tools/where-is-memory.js +61 -0
- package/build/tools/where-is-memory.js.map +1 -0
- package/build/validation.d.ts +24 -0
- package/build/validation.d.ts.map +1 -0
- package/build/validation.js +62 -0
- package/build/validation.js.map +1 -0
- package/build/vault.d.ts.map +1 -1
- package/build/vault.js +11 -5
- package/build/vault.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ensureBranchSynced, resolveProject, noteProjectRef, projectParam, } from "../helpers/project.js";
|
|
3
|
+
import { formatCommitBody, shouldBlockProtectedBranchCommit, } from "../helpers/git-commit.js";
|
|
4
|
+
import { buildPersistenceStatus, buildMutationRetryContract, formatPersistenceSummary, pushAfterMutation, } from "../helpers/persistence.js";
|
|
5
|
+
import { embedTextForNote } from "../helpers/embed.js";
|
|
6
|
+
import { memoryId, isoDateString } from "../brands.js";
|
|
7
|
+
import { cleanMarkdown, MarkdownLintError } from "../markdown.js";
|
|
8
|
+
import { getErrorMessage } from "../error-utils.js";
|
|
9
|
+
import { embed, embedModel } from "../embeddings.js";
|
|
10
|
+
import { applySemanticPatches } from "../semantic-patch.js";
|
|
11
|
+
import { hasActualChanges, computeFieldsModified } from "../update-detect-changes.js";
|
|
12
|
+
import { suggestAutoRelationships } from "../auto-relate.js";
|
|
13
|
+
import { invalidateActiveProjectCache, getRecentSessionNoteAccesses, getSessionCachedNote, getRecentSessionAccessNote, } from "../cache.js";
|
|
14
|
+
import { NOTE_LIFECYCLES, NOTE_ROLES } from "../storage.js";
|
|
15
|
+
import { UpdateResultSchema, NoteIdSchema, } from "../structured-content.js";
|
|
16
|
+
export function registerUpdateTool(server, ctx) {
|
|
17
|
+
server.registerTool("update", {
|
|
18
|
+
title: "Update Memory",
|
|
19
|
+
description: "Use after `recall` + `get` when an existing memory should be refined instead of creating a duplicate.\n\n" +
|
|
20
|
+
"Modify an existing memory by id.\n\n" +
|
|
21
|
+
"Use this when:\n" +
|
|
22
|
+
"- A stored memory is stale, incomplete, or wrong\n" +
|
|
23
|
+
"- You recalled something useful and want to refine the same note instead of creating a duplicate\n\n" +
|
|
24
|
+
"Do not use this when:\n" +
|
|
25
|
+
"- No note exists yet; use `remember`\n" +
|
|
26
|
+
"- Several notes need to be merged or retired together; use `consolidate`\n\n" +
|
|
27
|
+
"Returns:\n" +
|
|
28
|
+
"- The updated memory id, changed fields, and persistence status\n\n" +
|
|
29
|
+
"Side effects: rewrites the note, refreshes embeddings, git commits, and may push.\n\n" +
|
|
30
|
+
"Typical next step:\n" +
|
|
31
|
+
"- Use `relate` or `consolidate` if the update changes how this note connects to others.\n\n" +
|
|
32
|
+
"Use `semanticPatch` for targeted edits (more token-efficient). Use `content` only for complete rewrites.",
|
|
33
|
+
annotations: {
|
|
34
|
+
readOnlyHint: false,
|
|
35
|
+
destructiveHint: false,
|
|
36
|
+
idempotentHint: false,
|
|
37
|
+
openWorldHint: true,
|
|
38
|
+
},
|
|
39
|
+
inputSchema: z.object({
|
|
40
|
+
id: NoteIdSchema.describe("Exact memory id. Use an id returned by `recall`, `list`, `recent_memories`, or `where_is`."),
|
|
41
|
+
semanticPatch: z
|
|
42
|
+
.preprocess((val) => {
|
|
43
|
+
if (typeof val === "string") {
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(val);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return val;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return val;
|
|
52
|
+
}, z.array(z.object({
|
|
53
|
+
selector: z.object({
|
|
54
|
+
heading: z.string().optional(),
|
|
55
|
+
headingStartsWith: z.string().optional(),
|
|
56
|
+
nthChild: z.number().int().optional(),
|
|
57
|
+
lastChild: z.literal(true).optional(),
|
|
58
|
+
}).refine((sel) => {
|
|
59
|
+
const keys = [sel.heading, sel.headingStartsWith, sel.nthChild, sel.lastChild].filter((v) => v !== undefined);
|
|
60
|
+
return keys.length === 1;
|
|
61
|
+
}, { message: "Selector must have exactly one of: heading, headingStartsWith, nthChild, lastChild" }),
|
|
62
|
+
operation: z.discriminatedUnion("op", [
|
|
63
|
+
z.object({ op: z.literal("appendChild"), value: z.string() }),
|
|
64
|
+
z.object({ op: z.literal("prependChild"), value: z.string() }),
|
|
65
|
+
z.object({ op: z.literal("replace"), value: z.string() }),
|
|
66
|
+
z.object({ op: z.literal("replaceChildren"), value: z.string() }),
|
|
67
|
+
z.object({ op: z.literal("insertAfter"), value: z.string() }),
|
|
68
|
+
z.object({ op: z.literal("insertBefore"), value: z.string() }),
|
|
69
|
+
z.object({ op: z.literal("remove") }),
|
|
70
|
+
]),
|
|
71
|
+
})))
|
|
72
|
+
.optional()
|
|
73
|
+
.describe("Targeted edits to note sections. Array of {selector, operation} objects. Mutually exclusive with content. " +
|
|
74
|
+
"If this fails, fix the issue in your patch values and retry — do NOT fall back to full content rewrite.\n\n" +
|
|
75
|
+
"selector: exactly one of { heading: \"exact heading text\" } | { headingStartsWith: \"prefix\" } | { lastChild: true } | { nthChild: 0-based-index }\n" +
|
|
76
|
+
"operation: { op: \"appendChild\", value: \"content\" } | { op: \"prependChild\", value: \"content\" } | { op: \"replace\", value: \"new content\" } | { op: \"replaceChildren\", value: \"new children\" } | { op: \"insertAfter\", value: \"content\" } | { op: \"insertBefore\", value: \"content\" } | { op: \"remove\" }\n\n" +
|
|
77
|
+
"Example — add a paragraph under ## Findings, replace body under ## Recommendation, remove ## Old Section:\n" +
|
|
78
|
+
"[\n" +
|
|
79
|
+
" { \"selector\": { \"heading\": \"Findings\" }, \"operation\": { \"op\": \"insertAfter\", \"value\": \"A new paragraph.\" } },\n" +
|
|
80
|
+
" { \"selector\": { \"heading\": \"Recommendation\" }, \"operation\": { \"op\": \"replace\", \"value\": \"## Recommendation\\n\\nUpdated recommendation.\" } },\n" +
|
|
81
|
+
" { \"selector\": { \"heading\": \"Old Section\" }, \"operation\": { \"op\": \"remove\" } }\n" +
|
|
82
|
+
"]\n\n" +
|
|
83
|
+
"IMPORTANT: `appendChild`, `prependChild`, and `replaceChildren` do NOT work with `heading` selectors (headings only contain inline text, not block content). To add or replace content under a heading, use `insertAfter`. To replace a heading entirely, use `replace`."),
|
|
84
|
+
content: z.string().max(100000, "Content must be at most 100,000 characters").optional().describe("Full note body replacement. Use only for complete rewrites or when the note is small. Mutually exclusive with semanticPatch. Content must pass markdown lint. Auto-fixable issues are fixed automatically. Common unfixable issues: fenced code blocks need a language tag (e.g. use ```text not bare ```), and broken links are rejected. If lint fails, fix the specific issues and retry — do NOT fall back to semanticPatch for this."),
|
|
85
|
+
title: z.string().max(500, "Title must be at most 500 characters").optional().describe("Specific, retrieval-friendly title. Prefer the concrete topic or decision, not a vague label."),
|
|
86
|
+
tags: z.array(z.string()).optional().describe("Optional tags for later filtering. Use a small number of stable, meaningful tags."),
|
|
87
|
+
lifecycle: z
|
|
88
|
+
.enum(NOTE_LIFECYCLES)
|
|
89
|
+
.optional()
|
|
90
|
+
.describe("Change lifecycle. Preserve the existing value unless you're intentionally switching it."),
|
|
91
|
+
role: z
|
|
92
|
+
.enum(NOTE_ROLES)
|
|
93
|
+
.optional()
|
|
94
|
+
.describe("Change role. Preserve the existing value unless you're intentionally switching it."),
|
|
95
|
+
summary: z.string().optional().describe("Git commit summary only. Imperative mood, concise, and focused on why the change matters."),
|
|
96
|
+
alwaysLoad: z
|
|
97
|
+
.boolean()
|
|
98
|
+
.optional()
|
|
99
|
+
.describe("When true, this note loads automatically at session start and receives priority in recall and relationship expansion. " +
|
|
100
|
+
"Use for session anchors and critical context that should always be available."),
|
|
101
|
+
cwd: projectParam,
|
|
102
|
+
allowProtectedBranch: z
|
|
103
|
+
.boolean()
|
|
104
|
+
.optional()
|
|
105
|
+
.describe("One-time override for protected branch checks. " +
|
|
106
|
+
"When true, update can commit on a protected branch without changing project policy."),
|
|
107
|
+
}),
|
|
108
|
+
outputSchema: UpdateResultSchema,
|
|
109
|
+
}, async ({ id, content, semanticPatch, title, tags, lifecycle, role, summary, alwaysLoad, cwd, allowProtectedBranch = false }) => {
|
|
110
|
+
await ensureBranchSynced(ctx, cwd);
|
|
111
|
+
const noteId = memoryId(id);
|
|
112
|
+
const found = await ctx.vaultManager.findNote(id, cwd);
|
|
113
|
+
if (!found) {
|
|
114
|
+
return { content: [{ type: "text", text: `No memory found with id '${id}'` }], isError: true };
|
|
115
|
+
}
|
|
116
|
+
// Validate: content and semanticPatch are mutually exclusive
|
|
117
|
+
const hasContent = content !== undefined;
|
|
118
|
+
const hasSemanticPatch = semanticPatch !== undefined && semanticPatch.length > 0;
|
|
119
|
+
if (hasContent && hasSemanticPatch) {
|
|
120
|
+
return { content: [{ type: "text", text: "Exactly one of content or semanticPatch must be provided, not both." }], isError: true };
|
|
121
|
+
}
|
|
122
|
+
const { note, vault } = found;
|
|
123
|
+
if (vault.isProject) {
|
|
124
|
+
const resolvedProject = await resolveProject(ctx, cwd);
|
|
125
|
+
const projectLabel = resolvedProject
|
|
126
|
+
? `${resolvedProject.name} (${resolvedProject.id})`
|
|
127
|
+
: `${note.projectName ?? "project"} (${note.project ?? "unknown"})`;
|
|
128
|
+
const policy = note.project ? await ctx.configStore.getProjectPolicy(note.project) : undefined;
|
|
129
|
+
const protectedBranchCheck = await shouldBlockProtectedBranchCommit({
|
|
130
|
+
ctx,
|
|
131
|
+
cwd,
|
|
132
|
+
writeScope: "project",
|
|
133
|
+
automaticCommit: true,
|
|
134
|
+
projectLabel,
|
|
135
|
+
policy,
|
|
136
|
+
allowProtectedBranch,
|
|
137
|
+
toolName: "update",
|
|
138
|
+
});
|
|
139
|
+
if (protectedBranchCheck.blocked) {
|
|
140
|
+
return {
|
|
141
|
+
content: [{ type: "text", text: protectedBranchCheck.message ?? "Protected branch policy blocked this commit." }],
|
|
142
|
+
isError: true,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const now = isoDateString(new Date().toISOString());
|
|
147
|
+
let patchedContent;
|
|
148
|
+
let lintWarnings;
|
|
149
|
+
if (semanticPatch && semanticPatch.length > 0) {
|
|
150
|
+
try {
|
|
151
|
+
const result = await applySemanticPatches(note.content, semanticPatch);
|
|
152
|
+
patchedContent = result.content;
|
|
153
|
+
lintWarnings = result.lintWarnings;
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
if (err instanceof MarkdownLintError) {
|
|
157
|
+
const message = `Semantic patch produced content with markdown lint issues. Fix the lint issues in your patch values and retry — do NOT fall back to full content rewrite.\n\n${err.message}`;
|
|
158
|
+
return { content: [{ type: "text", text: message }], isError: true };
|
|
159
|
+
}
|
|
160
|
+
const message = getErrorMessage(err);
|
|
161
|
+
return { content: [{ type: "text", text: `Semantic patch failed: ${message}` }], isError: true };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
let cleanedContent;
|
|
165
|
+
if (content !== undefined) {
|
|
166
|
+
try {
|
|
167
|
+
cleanedContent = await cleanMarkdown(content);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
if (err instanceof MarkdownLintError) {
|
|
171
|
+
const message = `Markdown lint issues prevented the update. Fix the specific lint errors in your content and retry — do NOT fall back to semanticPatch for this.\n\n${err.message}`;
|
|
172
|
+
return {
|
|
173
|
+
content: [{ type: "text", text: message }],
|
|
174
|
+
structuredContent: { action: "lint_error", tool: "update", issues: err.issues },
|
|
175
|
+
isError: true,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
throw err;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const resolvedTitle = title ?? note.title;
|
|
182
|
+
const resolvedContent = patchedContent ?? cleanedContent ?? note.content;
|
|
183
|
+
const resolvedTags = tags ?? note.tags;
|
|
184
|
+
const resolvedLifecycle = lifecycle ?? note.lifecycle;
|
|
185
|
+
const resolvedRole = role !== undefined ? role : (note.role ? note.role : undefined);
|
|
186
|
+
const resolvedAlwaysLoad = alwaysLoad !== undefined ? alwaysLoad : note.alwaysLoad;
|
|
187
|
+
let relatedToChanged = false;
|
|
188
|
+
let resolvedRelatedTo = note.relatedTo;
|
|
189
|
+
if (note.project) {
|
|
190
|
+
const accessCandidates = getRecentSessionNoteAccesses(note.project)
|
|
191
|
+
.map((entry) => {
|
|
192
|
+
const cachedNote = getSessionCachedNote(note.project, entry.vaultPath, entry.noteId)
|
|
193
|
+
?? getRecentSessionAccessNote(note.project, entry.vaultPath, entry.noteId);
|
|
194
|
+
return cachedNote
|
|
195
|
+
? { note: cachedNote, accessedAt: entry.accessedAt, accessKind: entry.accessKind, score: entry.score }
|
|
196
|
+
: null;
|
|
197
|
+
})
|
|
198
|
+
.filter((entry) => entry !== null);
|
|
199
|
+
const autoRelationships = suggestAutoRelationships({
|
|
200
|
+
...note,
|
|
201
|
+
title: resolvedTitle,
|
|
202
|
+
content: resolvedContent,
|
|
203
|
+
tags: resolvedTags,
|
|
204
|
+
lifecycle: resolvedLifecycle,
|
|
205
|
+
alwaysLoad: resolvedAlwaysLoad,
|
|
206
|
+
}, accessCandidates);
|
|
207
|
+
if (autoRelationships.length > 0) {
|
|
208
|
+
const existing = [...(note.relatedTo ?? [])];
|
|
209
|
+
for (const relationship of autoRelationships) {
|
|
210
|
+
if (!existing.some((rel) => rel.id === relationship.id && rel.type === relationship.type)) {
|
|
211
|
+
existing.push(relationship);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
resolvedRelatedTo = existing;
|
|
215
|
+
relatedToChanged = true;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const changes = computeFieldsModified({
|
|
219
|
+
patchedContent,
|
|
220
|
+
originalContent: note.content,
|
|
221
|
+
contentExplicitlyProvided: content !== undefined,
|
|
222
|
+
semanticPatchProvided: semanticPatch !== undefined && semanticPatch.length > 0,
|
|
223
|
+
newTitle: resolvedTitle,
|
|
224
|
+
originalTitle: note.title,
|
|
225
|
+
titleExplicitlyProvided: title !== undefined,
|
|
226
|
+
newLifecycle: resolvedLifecycle,
|
|
227
|
+
originalLifecycle: note.lifecycle,
|
|
228
|
+
lifecycleExplicitlyProvided: lifecycle !== undefined,
|
|
229
|
+
newRole: resolvedRole,
|
|
230
|
+
originalRole: note.role,
|
|
231
|
+
roleExplicitlySet: role !== undefined,
|
|
232
|
+
newTags: resolvedTags,
|
|
233
|
+
originalTags: note.tags,
|
|
234
|
+
tagsExplicitlyProvided: tags !== undefined,
|
|
235
|
+
newAlwaysLoad: resolvedAlwaysLoad,
|
|
236
|
+
originalAlwaysLoad: note.alwaysLoad,
|
|
237
|
+
alwaysLoadExplicitlyProvided: alwaysLoad !== undefined,
|
|
238
|
+
relatedToChanged,
|
|
239
|
+
});
|
|
240
|
+
const hasChanges = hasActualChanges({
|
|
241
|
+
content: cleanedContent,
|
|
242
|
+
originalContent: note.content,
|
|
243
|
+
title,
|
|
244
|
+
originalTitle: note.title,
|
|
245
|
+
tags,
|
|
246
|
+
originalTags: note.tags,
|
|
247
|
+
lifecycle,
|
|
248
|
+
originalLifecycle: note.lifecycle,
|
|
249
|
+
role,
|
|
250
|
+
originalRole: note.role,
|
|
251
|
+
roleExplicitlySet: role !== undefined,
|
|
252
|
+
alwaysLoad,
|
|
253
|
+
originalAlwaysLoad: note.alwaysLoad,
|
|
254
|
+
semanticPatchApplied: semanticPatch !== undefined && semanticPatch.length > 0,
|
|
255
|
+
relatedToChanged,
|
|
256
|
+
});
|
|
257
|
+
if (!hasChanges) {
|
|
258
|
+
const noOpPersistence = {
|
|
259
|
+
notePath: vault.storage.notePath(memoryId(id)),
|
|
260
|
+
embeddingPath: vault.storage.embeddingPath(memoryId(id)),
|
|
261
|
+
embedding: { status: "skipped", model: embedModel, reason: "no-changes" },
|
|
262
|
+
git: {
|
|
263
|
+
commit: "skipped",
|
|
264
|
+
push: "skipped",
|
|
265
|
+
commitReason: "no-changes",
|
|
266
|
+
pushReason: "no-changes",
|
|
267
|
+
},
|
|
268
|
+
durability: "local-only",
|
|
269
|
+
};
|
|
270
|
+
return {
|
|
271
|
+
content: [{ type: "text", text: `No changes to memory '${id}'` }],
|
|
272
|
+
structuredContent: {
|
|
273
|
+
action: "updated",
|
|
274
|
+
id,
|
|
275
|
+
title: note.title,
|
|
276
|
+
fieldsModified: [],
|
|
277
|
+
timestamp: note.updatedAt,
|
|
278
|
+
project: noteProjectRef(note),
|
|
279
|
+
lifecycle: note.lifecycle,
|
|
280
|
+
role: note.role,
|
|
281
|
+
persistence: noOpPersistence,
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
const updated = {
|
|
286
|
+
...note,
|
|
287
|
+
title: resolvedTitle,
|
|
288
|
+
content: resolvedContent,
|
|
289
|
+
tags: resolvedTags,
|
|
290
|
+
lifecycle: resolvedLifecycle,
|
|
291
|
+
...(role !== undefined ? { role: resolvedRole } : (note.role ? { role: note.role } : {})),
|
|
292
|
+
alwaysLoad: resolvedAlwaysLoad,
|
|
293
|
+
updatedAt: now,
|
|
294
|
+
relatedTo: resolvedRelatedTo,
|
|
295
|
+
};
|
|
296
|
+
await vault.storage.writeNote(updated);
|
|
297
|
+
const shouldReembed = patchedContent !== undefined || cleanedContent !== undefined;
|
|
298
|
+
let embeddingStatus = { status: "skipped", reason: shouldReembed ? undefined : "metadata-only" };
|
|
299
|
+
if (shouldReembed) {
|
|
300
|
+
try {
|
|
301
|
+
const text = await embedTextForNote(vault.storage, updated);
|
|
302
|
+
const vector = await embed(text);
|
|
303
|
+
await vault.storage.writeEmbedding({ id: noteId, model: embedModel, embedding: vector, updatedAt: now });
|
|
304
|
+
embeddingStatus = { status: "written" };
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
embeddingStatus = { status: "skipped", reason: getErrorMessage(err) };
|
|
308
|
+
console.error(`[embedding] Re-embed failed for '${id}': ${err}`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
const changeDesc = changes.length > 0 ? `Updated ${changes.join(", ")}` : "No changes";
|
|
312
|
+
const commitSummary = summary ?? changeDesc;
|
|
313
|
+
const commitBody = formatCommitBody({
|
|
314
|
+
summary: commitSummary,
|
|
315
|
+
noteId: id,
|
|
316
|
+
noteTitle: updated.title,
|
|
317
|
+
projectName: updated.projectName,
|
|
318
|
+
tags: updated.tags,
|
|
319
|
+
});
|
|
320
|
+
const commitMessage = `update: ${updated.title}`;
|
|
321
|
+
const commitFiles = [ctx.vaultManager.noteRelPath(vault, id)];
|
|
322
|
+
const commitStatus = await vault.git.commitWithStatus(commitMessage, commitFiles, commitBody);
|
|
323
|
+
const pushStatus = commitStatus.status === "committed"
|
|
324
|
+
? await pushAfterMutation(ctx, vault)
|
|
325
|
+
: { status: "skipped", reason: "commit-failed" };
|
|
326
|
+
const retry = buildMutationRetryContract({
|
|
327
|
+
commit: commitStatus,
|
|
328
|
+
commitMessage,
|
|
329
|
+
commitBody,
|
|
330
|
+
files: commitFiles,
|
|
331
|
+
cwd,
|
|
332
|
+
vault,
|
|
333
|
+
mutationApplied: true,
|
|
334
|
+
});
|
|
335
|
+
const persistence = buildPersistenceStatus({
|
|
336
|
+
storage: vault.storage,
|
|
337
|
+
id,
|
|
338
|
+
embedding: embeddingStatus,
|
|
339
|
+
commit: commitStatus,
|
|
340
|
+
push: pushStatus,
|
|
341
|
+
commitMessage,
|
|
342
|
+
commitBody,
|
|
343
|
+
retry,
|
|
344
|
+
});
|
|
345
|
+
const structuredContent = {
|
|
346
|
+
action: "updated",
|
|
347
|
+
id,
|
|
348
|
+
title: updated.title,
|
|
349
|
+
fieldsModified: changes,
|
|
350
|
+
timestamp: now,
|
|
351
|
+
project: noteProjectRef(updated),
|
|
352
|
+
lifecycle: updated.lifecycle,
|
|
353
|
+
role: updated.role,
|
|
354
|
+
lintWarnings: lintWarnings && lintWarnings.length > 0 ? lintWarnings : undefined,
|
|
355
|
+
persistence,
|
|
356
|
+
};
|
|
357
|
+
invalidateActiveProjectCache();
|
|
358
|
+
const fieldText = changes.length > 0 ? `\nfields modified: ${changes.join(", ")}` : "";
|
|
359
|
+
const warningsText = lintWarnings && lintWarnings.length > 0
|
|
360
|
+
? `\nmarkdown lint warnings (not auto-fixable):\n- ${lintWarnings.join("\n- ")}`
|
|
361
|
+
: "";
|
|
362
|
+
return { content: [{ type: "text", text: `Updated memory '${id}'${fieldText}${warningsText}\n${formatPersistenceSummary(persistence)}` }], structuredContent };
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/tools/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ServerContext } from "../server-context.js";
|
|
3
|
+
export declare function registerWhereIsMemoryTool(server: McpServer, ctx: ServerContext): void;
|
|
4
|
+
//# sourceMappingURL=where-is-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where-is-memory.d.ts","sourceRoot":"","sources":["../../src/tools/where-is-memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAgErF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ensureBranchSynced, noteProjectRef, projectParam } from "../helpers/project.js";
|
|
3
|
+
import { storageLabel } from "../helpers/vault.js";
|
|
4
|
+
import { WhereIsResultSchema, NoteIdSchema } from "../structured-content.js";
|
|
5
|
+
export function registerWhereIsMemoryTool(server, ctx) {
|
|
6
|
+
server.registerTool("where_is_memory", {
|
|
7
|
+
title: "Where Is Memory",
|
|
8
|
+
description: "Locate which storage label and project association a memory currently has.\n\n" +
|
|
9
|
+
"Use this when:\n" +
|
|
10
|
+
"- You know the id and want to see where the memory lives\n" +
|
|
11
|
+
"- You are deciding whether a note should be moved between project storage locations\n\n" +
|
|
12
|
+
"Do not use this when:\n" +
|
|
13
|
+
"- You need the full note content; use `get`\n" +
|
|
14
|
+
"- You want to search for a note by topic; use `recall`\n\n" +
|
|
15
|
+
"Returns:\n" +
|
|
16
|
+
"- Title, project association, storage label, updated time, and relationship count\n\n" +
|
|
17
|
+
"Read-only.\n\n" +
|
|
18
|
+
"Typical next step:\n" +
|
|
19
|
+
"- Use `move_memory` if the storage location is wrong, or `get` for full inspection.",
|
|
20
|
+
annotations: {
|
|
21
|
+
readOnlyHint: true,
|
|
22
|
+
destructiveHint: false,
|
|
23
|
+
idempotentHint: true,
|
|
24
|
+
openWorldHint: false,
|
|
25
|
+
},
|
|
26
|
+
inputSchema: z.object({
|
|
27
|
+
id: NoteIdSchema.describe("Exact memory id. Use an id returned by `recall`, `list`, `recent_memories`, or `where_is`."),
|
|
28
|
+
cwd: projectParam,
|
|
29
|
+
}),
|
|
30
|
+
outputSchema: WhereIsResultSchema,
|
|
31
|
+
}, async ({ id, cwd }) => {
|
|
32
|
+
await ensureBranchSynced(ctx, cwd);
|
|
33
|
+
const found = await ctx.vaultManager.findNote(id, cwd);
|
|
34
|
+
if (!found) {
|
|
35
|
+
return { content: [{ type: "text", text: `No memory found with id '${id}'` }], isError: true };
|
|
36
|
+
}
|
|
37
|
+
const { note, vault } = found;
|
|
38
|
+
const vaultLabel = storageLabel(vault);
|
|
39
|
+
const projectDisplay = note.projectName && note.project
|
|
40
|
+
? `${note.projectName} (${note.project})`
|
|
41
|
+
: note.projectName ?? note.project ?? "global";
|
|
42
|
+
const relatedCount = note.relatedTo?.length ?? 0;
|
|
43
|
+
const structuredContent = {
|
|
44
|
+
action: "located",
|
|
45
|
+
id: note.id,
|
|
46
|
+
title: note.title,
|
|
47
|
+
project: noteProjectRef(note),
|
|
48
|
+
vault: vaultLabel,
|
|
49
|
+
updatedAt: note.updatedAt,
|
|
50
|
+
relatedCount,
|
|
51
|
+
};
|
|
52
|
+
return {
|
|
53
|
+
content: [{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: `'${note.title}' (${id})\nproject: ${projectDisplay} | stored: ${vaultLabel} | updated: ${note.updatedAt} | related: ${relatedCount}`,
|
|
56
|
+
}],
|
|
57
|
+
structuredContent,
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=where-is-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where-is-memory.js","sourceRoot":"","sources":["../../src/tools/where-is-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAsB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEjG,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,GAAkB;IAC7E,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,gFAAgF;YAChF,kBAAkB;YAClB,4DAA4D;YAC5D,yFAAyF;YACzF,yBAAyB;YACzB,+CAA+C;YAC/C,4DAA4D;YAC5D,YAAY;YACZ,uFAAuF;YACvF,gBAAgB;YAChB,sBAAsB;YACtB,qFAAqF;QACvF,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,EAAE,EAAE,YAAY,CAAC,QAAQ,CAAC,4FAA4F,CAAC;YACvH,GAAG,EAAE,YAAY;SAClB,CAAC;QACF,YAAY,EAAE,mBAAmB;KAClC,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QACpB,MAAM,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEnC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjG,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QAC9B,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO;YACrD,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,OAAO,GAAG;YACzC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC;QAEjD,MAAM,iBAAiB,GAAkB;YACvC,MAAM,EAAE,SAAS;YACjB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;YAC7B,KAAK,EAAE,UAAU;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY;SACb,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,MAAM,EAAE,eAAe,cAAc,cAAc,UAAU,eAAe,IAAI,CAAC,SAAS,eAAe,YAAY,EAAE;iBAC5I,CAAC;YACF,iBAAiB;SAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Relationship } from "./storage.js";
|
|
3
|
+
import type { NoteProjection } from "./structured-content.js";
|
|
4
|
+
export declare const EmbeddingRecordSchema: z.ZodObject<{
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
model: z.ZodString;
|
|
7
|
+
embedding: z.ZodArray<z.ZodNumber>;
|
|
8
|
+
updatedAt: z.ZodString;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export declare const NoteProjectionSchema: z.ZodObject<{
|
|
11
|
+
noteId: z.ZodString;
|
|
12
|
+
title: z.ZodString;
|
|
13
|
+
summary: z.ZodString;
|
|
14
|
+
headings: z.ZodArray<z.ZodString>;
|
|
15
|
+
tags: z.ZodArray<z.ZodString>;
|
|
16
|
+
lifecycle: z.ZodOptional<z.ZodString>;
|
|
17
|
+
updatedAt: z.ZodOptional<z.ZodString>;
|
|
18
|
+
projectionText: z.ZodString;
|
|
19
|
+
generatedAt: z.ZodString;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
export declare function validateRelatedTo(value: unknown): Relationship[] | undefined;
|
|
22
|
+
export declare function validateEmbeddingRecord(raw: unknown): import("./storage.js").EmbeddingRecord | null;
|
|
23
|
+
export declare function validateNoteProjection(raw: unknown): NoteProjection | null;
|
|
24
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,eAAO,MAAM,qBAAqB;;;;;iBAKhC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;iBAU/B,CAAC;AAOH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE,GAAG,SAAS,CAa5E;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,cAAc,EAAE,eAAe,GAAG,IAAI,CAYnG;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAO1E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { memoryId, embeddingModelId, isoDateString } from "./brands.js";
|
|
3
|
+
export const EmbeddingRecordSchema = z.object({
|
|
4
|
+
id: z.string(),
|
|
5
|
+
model: z.string(),
|
|
6
|
+
embedding: z.array(z.number()),
|
|
7
|
+
updatedAt: z.string(),
|
|
8
|
+
});
|
|
9
|
+
export const NoteProjectionSchema = z.object({
|
|
10
|
+
noteId: z.string(),
|
|
11
|
+
title: z.string(),
|
|
12
|
+
summary: z.string(),
|
|
13
|
+
headings: z.array(z.string()),
|
|
14
|
+
tags: z.array(z.string()),
|
|
15
|
+
lifecycle: z.string().optional(),
|
|
16
|
+
updatedAt: z.string().optional(),
|
|
17
|
+
projectionText: z.string(),
|
|
18
|
+
generatedAt: z.string(),
|
|
19
|
+
});
|
|
20
|
+
const RelationshipSchema = z.object({
|
|
21
|
+
id: z.string(),
|
|
22
|
+
type: z.enum(["related-to", "explains", "example-of", "supersedes", "derives-from", "follows"]),
|
|
23
|
+
});
|
|
24
|
+
export function validateRelatedTo(value) {
|
|
25
|
+
if (value === undefined || value === null)
|
|
26
|
+
return undefined;
|
|
27
|
+
if (!Array.isArray(value))
|
|
28
|
+
return undefined;
|
|
29
|
+
const validated = [];
|
|
30
|
+
for (const item of value) {
|
|
31
|
+
const result = RelationshipSchema.safeParse(item);
|
|
32
|
+
if (result.success) {
|
|
33
|
+
validated.push({ id: memoryId(result.data.id), type: result.data.type });
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.error(`[validation] Skipping invalid relationship entry: ${JSON.stringify(result.error.issues)}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return validated.length > 0 ? validated : undefined;
|
|
40
|
+
}
|
|
41
|
+
export function validateEmbeddingRecord(raw) {
|
|
42
|
+
const result = EmbeddingRecordSchema.safeParse(raw);
|
|
43
|
+
if (result.success) {
|
|
44
|
+
return {
|
|
45
|
+
id: memoryId(result.data.id),
|
|
46
|
+
model: embeddingModelId(result.data.model),
|
|
47
|
+
embedding: result.data.embedding,
|
|
48
|
+
updatedAt: isoDateString(result.data.updatedAt),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
console.error(`[validation] Embedding record validation failed: ${JSON.stringify(result.error.issues)}`);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
export function validateNoteProjection(raw) {
|
|
55
|
+
const result = NoteProjectionSchema.safeParse(raw);
|
|
56
|
+
if (result.success) {
|
|
57
|
+
return result.data;
|
|
58
|
+
}
|
|
59
|
+
console.error(`[validation] Note projection validation failed: ${JSON.stringify(result.error.issues)}`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
package/build/vault.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAID,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,oBAAoB,CAA4B;IACxD;;;OAGG;IACH,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,yDAAyD;IACzD,OAAO,CAAC,WAAW,CAAM;gBAEb,aAAa,EAAE,MAAM;IAK3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B;;;;;OAKG;IACG,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMjE;;;;OAIG;IACG,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMjE;;;;OAIG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAa9E;;;OAGG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG,IAAI,CAAC;IAStF,mGAAmG;IACnG,cAAc,IAAI,KAAK,EAAE;IAQzB;;;;OAIG;IACG,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAqBjD,uEAAuE;IACvE,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAIjD;;;OAGG;IACG,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAc7E,OAAO,CAAC,UAAU;IAIlB;;;;OAIG;YACW,oBAAoB;CAqDnC;AAqED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAavE"}
|
package/build/vault.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import fs from "fs/promises";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { simpleGit } from "simple-git";
|
|
4
|
+
import { debugLog, getErrorMessage } from "./error-utils.js";
|
|
4
5
|
import { Storage } from "./storage.js";
|
|
6
|
+
import { memoryId } from "./brands.js";
|
|
5
7
|
import { GitOps } from "./git.js";
|
|
6
8
|
// ── VaultManager ─────────────────────────────────────────────────────────────
|
|
7
9
|
export class VaultManager {
|
|
@@ -72,8 +74,9 @@ export class VaultManager {
|
|
|
72
74
|
* then falling back through all other known vaults and finally the main vault.
|
|
73
75
|
*/
|
|
74
76
|
async findNote(id, cwd) {
|
|
77
|
+
const memoryIdArg = memoryId(id);
|
|
75
78
|
for (const vault of await this.searchOrder(cwd)) {
|
|
76
|
-
const note = await vault.storage.readNote(
|
|
79
|
+
const note = await vault.storage.readNote(memoryIdArg);
|
|
77
80
|
if (note)
|
|
78
81
|
return { note, vault };
|
|
79
82
|
}
|
|
@@ -204,7 +207,8 @@ async function discoverSubmoduleVaultFolders(gitRoot) {
|
|
|
204
207
|
.map(e => e.name)
|
|
205
208
|
.sort();
|
|
206
209
|
}
|
|
207
|
-
catch {
|
|
210
|
+
catch (err) {
|
|
211
|
+
debugLog("vault:discover-submodules", `failed: ${getErrorMessage(err)}`);
|
|
208
212
|
return [];
|
|
209
213
|
}
|
|
210
214
|
}
|
|
@@ -229,11 +233,12 @@ async function findGitRoot(cwd, visited = new Set()) {
|
|
|
229
233
|
}
|
|
230
234
|
}
|
|
231
235
|
catch {
|
|
232
|
-
|
|
236
|
+
debugLog("vault:find-git-root", "not inside a submodule or flag unsupported, using current root");
|
|
233
237
|
}
|
|
234
238
|
return trimmedRoot;
|
|
235
239
|
}
|
|
236
|
-
catch {
|
|
240
|
+
catch (err) {
|
|
241
|
+
debugLog("vault:find-git-root", `failed: ${getErrorMessage(err)}`);
|
|
237
242
|
return null;
|
|
238
243
|
}
|
|
239
244
|
}
|
|
@@ -243,7 +248,8 @@ export async function ensureGitignore(ignorePath) {
|
|
|
243
248
|
try {
|
|
244
249
|
existing = await fs.readFile(ignorePath, "utf-8");
|
|
245
250
|
}
|
|
246
|
-
catch {
|
|
251
|
+
catch (err) {
|
|
252
|
+
debugLog("vault:ensure-gitignore", `no existing gitignore: ${getErrorMessage(err)}`);
|
|
247
253
|
existing = "";
|
|
248
254
|
}
|
|
249
255
|
const missing = requiredLines.filter(line => !existing.includes(line));
|