@danielmarbach/mnemonic-mcp 0.27.2 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -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 -5467
- 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 +81 -74
- package/build/structured-content.d.ts.map +1 -1
- package/build/structured-content.js +25 -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,123 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { NoteIdSchema, ForgetResultSchema, } from "../structured-content.js";
|
|
3
|
+
import { projectParam, resolveProject, noteProjectRef, ensureBranchSynced, } from "../helpers/project.js";
|
|
4
|
+
import { memoryId } from "../brands.js";
|
|
5
|
+
import { formatCommitBody, shouldBlockProtectedBranchCommit, wouldRelationshipCleanupTouchProjectVault, } from "../helpers/git-commit.js";
|
|
6
|
+
import { buildMutationRetryContract, formatRetrySummary, pushAfterMutation, } from "../helpers/persistence.js";
|
|
7
|
+
import { removeRelationshipsToNoteIds, addVaultChange, storageLabel, } from "../helpers/vault.js";
|
|
8
|
+
import { invalidateActiveProjectCache } from "../cache.js";
|
|
9
|
+
export function registerForgetTool(server, ctx) {
|
|
10
|
+
server.registerTool("forget", {
|
|
11
|
+
title: "Forget",
|
|
12
|
+
description: "Delete an existing memory by id and clean up dangling relationships.\n\n" +
|
|
13
|
+
"Use this when:\n" +
|
|
14
|
+
"- A memory should be removed entirely\n" +
|
|
15
|
+
"- A note is obsolete and should not remain searchable\n\n" +
|
|
16
|
+
"Do not use this when:\n" +
|
|
17
|
+
"- The note should stay but move to another vault; use `move_memory`\n" +
|
|
18
|
+
"- The note should be replaced or merged; use `consolidate`\n\n" +
|
|
19
|
+
"Returns:\n" +
|
|
20
|
+
"- Deleted memory id/title and relationship cleanup details\n\n" +
|
|
21
|
+
"Side effects: deletes note files, cleans relationship references, git commits, and may push.\n\n" +
|
|
22
|
+
"Typical next step:\n" +
|
|
23
|
+
"- Use `recall` or `list` to confirm the remaining memory set is clean.",
|
|
24
|
+
annotations: {
|
|
25
|
+
readOnlyHint: false,
|
|
26
|
+
destructiveHint: true,
|
|
27
|
+
idempotentHint: true,
|
|
28
|
+
openWorldHint: false,
|
|
29
|
+
},
|
|
30
|
+
inputSchema: z.object({
|
|
31
|
+
id: NoteIdSchema.describe("Exact memory id. Use an id returned by `recall`, `list`, `recent_memories`, or `where_is`."),
|
|
32
|
+
cwd: projectParam,
|
|
33
|
+
allowProtectedBranch: z
|
|
34
|
+
.boolean()
|
|
35
|
+
.optional()
|
|
36
|
+
.describe("One-time override for protected branch checks. " +
|
|
37
|
+
"When true, forget can commit on a protected branch without changing project policy."),
|
|
38
|
+
}),
|
|
39
|
+
outputSchema: ForgetResultSchema,
|
|
40
|
+
}, async ({ id, cwd, allowProtectedBranch = false }) => {
|
|
41
|
+
await ensureBranchSynced(ctx, cwd);
|
|
42
|
+
const found = await ctx.vaultManager.findNote(id, cwd);
|
|
43
|
+
if (!found) {
|
|
44
|
+
return { content: [{ type: "text", text: `No memory found with id '${id}'` }], isError: true };
|
|
45
|
+
}
|
|
46
|
+
const { note, vault: noteVault } = found;
|
|
47
|
+
const touchesProjectVault = noteVault.isProject || await wouldRelationshipCleanupTouchProjectVault(ctx, [id]);
|
|
48
|
+
if (touchesProjectVault) {
|
|
49
|
+
const resolvedProject = await resolveProject(ctx, cwd);
|
|
50
|
+
const projectLabel = resolvedProject
|
|
51
|
+
? `${resolvedProject.name} (${resolvedProject.id})`
|
|
52
|
+
: `${note.projectName ?? "project"} (${note.project ?? "unknown"})`;
|
|
53
|
+
const policy = note.project ? await ctx.configStore.getProjectPolicy(note.project) : undefined;
|
|
54
|
+
const protectedBranchCheck = await shouldBlockProtectedBranchCommit({
|
|
55
|
+
ctx,
|
|
56
|
+
cwd,
|
|
57
|
+
writeScope: "project",
|
|
58
|
+
automaticCommit: true,
|
|
59
|
+
projectLabel,
|
|
60
|
+
policy,
|
|
61
|
+
allowProtectedBranch,
|
|
62
|
+
toolName: "forget",
|
|
63
|
+
});
|
|
64
|
+
if (protectedBranchCheck.blocked) {
|
|
65
|
+
return {
|
|
66
|
+
content: [{ type: "text", text: protectedBranchCheck.message ?? "Protected branch policy blocked this commit." }],
|
|
67
|
+
isError: true,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
await noteVault.storage.deleteNote(memoryId(id));
|
|
72
|
+
// Clean up dangling references grouped by vault so we make one commit per vault
|
|
73
|
+
const vaultChanges = await removeRelationshipsToNoteIds(ctx, [id]);
|
|
74
|
+
// Always include the deleted note's path (git add on a deleted file stages the removal)
|
|
75
|
+
addVaultChange(vaultChanges, noteVault, ctx.vaultManager.noteRelPath(noteVault, id));
|
|
76
|
+
let retry;
|
|
77
|
+
for (const [v, files] of vaultChanges) {
|
|
78
|
+
const isPrimaryVault = v === noteVault;
|
|
79
|
+
const summary = isPrimaryVault ? `Deleted note and cleaned up ${files.length - 1} reference(s)` : "Cleaned up dangling reference";
|
|
80
|
+
const commitBody = formatCommitBody({
|
|
81
|
+
summary,
|
|
82
|
+
noteId: id,
|
|
83
|
+
noteTitle: note.title,
|
|
84
|
+
projectName: note.projectName,
|
|
85
|
+
});
|
|
86
|
+
const commitMessage = `forget: ${note.title}`;
|
|
87
|
+
const commitStatus = await v.git.commitWithStatus(commitMessage, files, commitBody);
|
|
88
|
+
if (!retry) {
|
|
89
|
+
retry = buildMutationRetryContract({
|
|
90
|
+
commit: commitStatus,
|
|
91
|
+
commitMessage,
|
|
92
|
+
commitBody,
|
|
93
|
+
files,
|
|
94
|
+
cwd,
|
|
95
|
+
vault: v,
|
|
96
|
+
mutationApplied: true,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (commitStatus.status === "committed") {
|
|
100
|
+
await pushAfterMutation(ctx, v);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const structuredContent = {
|
|
104
|
+
action: "forgotten",
|
|
105
|
+
id,
|
|
106
|
+
title: note.title,
|
|
107
|
+
project: noteProjectRef(note),
|
|
108
|
+
relationshipsCleaned: vaultChanges.size > 0 ? Array.from(vaultChanges.values()).reduce((sum, files) => sum + files.length - 1, 0) : 0,
|
|
109
|
+
vaultsModified: Array.from(vaultChanges.keys()).map(v => storageLabel(v)),
|
|
110
|
+
retry,
|
|
111
|
+
};
|
|
112
|
+
const retrySummary = formatRetrySummary(retry);
|
|
113
|
+
invalidateActiveProjectCache();
|
|
114
|
+
return {
|
|
115
|
+
content: [{
|
|
116
|
+
type: "text",
|
|
117
|
+
text: `Forgotten '${id}' (${note.title})${retrySummary ? `\n${retrySummary}` : ""}`,
|
|
118
|
+
}],
|
|
119
|
+
structuredContent,
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=forget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forget.js","sourceRoot":"","sources":["../../src/tools/forget.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 registerGetProjectIdentityTool(server: McpServer, ctx: ServerContext): void;
|
|
4
|
+
//# sourceMappingURL=get-project-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-project-identity.d.ts","sourceRoot":"","sources":["../../src/tools/get-project-identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA2D1F"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveProjectIdentityForCwd as resolveProjectIdentityForCwdFromModule } from "../helpers/project.js";
|
|
3
|
+
import { projectNotFoundResponse } from "../helpers/vault.js";
|
|
4
|
+
import { formatProjectIdentityText } from "./detect-project.js";
|
|
5
|
+
import { ProjectIdentityResultSchema } from "../structured-content.js";
|
|
6
|
+
export function registerGetProjectIdentityTool(server, ctx) {
|
|
7
|
+
server.registerTool("get_project_identity", {
|
|
8
|
+
title: "Get Project Identity",
|
|
9
|
+
description: "Show the effective project identity for a working directory, including any configured remote override.\n\n" +
|
|
10
|
+
"Use this when:\n" +
|
|
11
|
+
"- You need to verify whether project identity comes from `origin`, `upstream`, or an override\n" +
|
|
12
|
+
"- You are debugging project scoping issues\n\n" +
|
|
13
|
+
"Do not use this when:\n" +
|
|
14
|
+
"- You only need the project id/name to continue; use `detect_project` instead\n\n" +
|
|
15
|
+
"Returns:\n" +
|
|
16
|
+
"- Effective project identity, default identity, and any configured override\n\n" +
|
|
17
|
+
"Read-only.\n\n" +
|
|
18
|
+
"Typical next step:\n" +
|
|
19
|
+
"- Use `set_project_identity` only if the wrong remote is defining identity.",
|
|
20
|
+
annotations: {
|
|
21
|
+
readOnlyHint: true,
|
|
22
|
+
destructiveHint: false,
|
|
23
|
+
idempotentHint: true,
|
|
24
|
+
openWorldHint: false,
|
|
25
|
+
},
|
|
26
|
+
inputSchema: z.object({
|
|
27
|
+
cwd: z.string().describe("Absolute project working directory. Pass this whenever the task is project-related so routing, search boosting, policy, and vault selection work correctly."),
|
|
28
|
+
}),
|
|
29
|
+
outputSchema: ProjectIdentityResultSchema,
|
|
30
|
+
}, async ({ cwd }) => {
|
|
31
|
+
const identity = await resolveProjectIdentityForCwdFromModule(ctx, cwd);
|
|
32
|
+
if (!identity) {
|
|
33
|
+
return projectNotFoundResponse(cwd);
|
|
34
|
+
}
|
|
35
|
+
const structuredContent = {
|
|
36
|
+
action: "project_identity_shown",
|
|
37
|
+
project: {
|
|
38
|
+
id: identity.project.id,
|
|
39
|
+
name: identity.project.name,
|
|
40
|
+
source: identity.project.source,
|
|
41
|
+
remoteName: identity.project.remoteName,
|
|
42
|
+
},
|
|
43
|
+
defaultProject: identity.defaultProject ? {
|
|
44
|
+
id: identity.defaultProject.id,
|
|
45
|
+
name: identity.defaultProject.name,
|
|
46
|
+
remoteName: identity.defaultProject.remoteName,
|
|
47
|
+
} : undefined,
|
|
48
|
+
identityOverride: identity.identityOverride,
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
content: [{
|
|
52
|
+
type: "text",
|
|
53
|
+
text: formatProjectIdentityText(identity),
|
|
54
|
+
}],
|
|
55
|
+
structuredContent,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=get-project-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-project-identity.js","sourceRoot":"","sources":["../../src/tools/get-project-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,4BAA4B,IAAI,sCAAsC,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAA8B,MAAM,0BAA0B,CAAC;AAEnG,MAAM,UAAU,8BAA8B,CAAC,MAAiB,EAAE,GAAkB;IAClF,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,4GAA4G;YAC5G,kBAAkB;YAClB,iGAAiG;YACjG,gDAAgD;YAChD,yBAAyB;YACzB,mFAAmF;YACnF,YAAY;YACZ,iFAAiF;YACjF,gBAAgB;YAChB,sBAAsB;YACtB,6EAA6E;QAC/E,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,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6JAA6J,CAAC;SACxL,CAAC;QACF,YAAY,EAAE,2BAA2B;KAC1C,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QAChB,MAAM,QAAQ,GAAG,MAAM,sCAAsC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,iBAAiB,GAA0B;YAC/C,MAAM,EAAE,wBAAwB;YAChC,OAAO,EAAE;gBACP,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE;gBACvB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI;gBAC3B,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;gBAC/B,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU;aACxC;YACD,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;gBACxC,EAAE,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE;gBAC9B,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI;gBAClC,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU;aAC/C,CAAC,CAAC,CAAC,SAAS;YACb,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;SAC5C,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,CAAC,QAAQ,CAAC;iBAC1C,CAAC;YACF,iBAAiB;SAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwB1D,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAyH3E"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { performance } from "perf_hooks";
|
|
3
|
+
import { GetResultSchema, NoteIdSchema, } from "../structured-content.js";
|
|
4
|
+
import { ensureBranchSynced, resolveProject, noteProjectRef, projectParam, } from "../helpers/project.js";
|
|
5
|
+
import { storageLabel } from "../helpers/vault.js";
|
|
6
|
+
import { formatRelationshipPreview } from "../helpers/index.js";
|
|
7
|
+
import { getSessionCachedNote, setSessionCachedNote, recordSessionNoteAccess, } from "../cache.js";
|
|
8
|
+
import { getRelationshipPreview } from "../relationships.js";
|
|
9
|
+
export function registerGetTool(server, ctx) {
|
|
10
|
+
server.registerTool("get", {
|
|
11
|
+
title: "Get Memory",
|
|
12
|
+
description: "Use after `recall`, `list`, or `recent_memories` when you need the full note content.\n\n" +
|
|
13
|
+
"Fetch one or more memories by exact id.\n\n" +
|
|
14
|
+
"Use this when:\n" +
|
|
15
|
+
"- You already know the memory id and need the full note content\n" +
|
|
16
|
+
"- A previous tool returned ids that you now want to inspect exactly\n\n" +
|
|
17
|
+
"Do not use this when:\n" +
|
|
18
|
+
"- You are still searching by topic; use `recall`\n" +
|
|
19
|
+
"- You want to browse many notes; use `list`\n\n" +
|
|
20
|
+
"Returns:\n" +
|
|
21
|
+
"- Full note content and metadata for the requested ids, including storage label\n" +
|
|
22
|
+
"- Bounded 1-hop relationship previews when `includeRelationships` is true (max 3 shown)\n\n" +
|
|
23
|
+
"Read-only.\n\n" +
|
|
24
|
+
"Typical next step:\n" +
|
|
25
|
+
"- Use `update`, `forget`, `move_memory`, or `relate` after inspection.",
|
|
26
|
+
annotations: {
|
|
27
|
+
readOnlyHint: true,
|
|
28
|
+
destructiveHint: false,
|
|
29
|
+
idempotentHint: true,
|
|
30
|
+
openWorldHint: false,
|
|
31
|
+
},
|
|
32
|
+
inputSchema: z.object({
|
|
33
|
+
ids: z.array(NoteIdSchema).min(1).describe("One or more memory ids to fetch"),
|
|
34
|
+
cwd: projectParam,
|
|
35
|
+
includeRelationships: z.boolean().optional().default(false).describe("Include bounded direct relationship previews (1-hop expansion, max 3 shown)"),
|
|
36
|
+
}),
|
|
37
|
+
outputSchema: GetResultSchema,
|
|
38
|
+
}, async ({ ids, cwd, includeRelationships }) => {
|
|
39
|
+
const t0Get = performance.now();
|
|
40
|
+
await ensureBranchSynced(ctx, cwd);
|
|
41
|
+
const project = await resolveProject(ctx, cwd);
|
|
42
|
+
const found = [];
|
|
43
|
+
const notFound = [];
|
|
44
|
+
for (const id of ids) {
|
|
45
|
+
// Check session cache before hitting storage
|
|
46
|
+
let result = null;
|
|
47
|
+
if (project) {
|
|
48
|
+
for (const vault of ctx.vaultManager.allKnownVaults()) {
|
|
49
|
+
const cached = getSessionCachedNote(project.id, vault.storage.vaultPath, id);
|
|
50
|
+
if (cached !== undefined) {
|
|
51
|
+
result = { note: cached, vault };
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!result) {
|
|
57
|
+
result = await ctx.vaultManager.findNote(id, cwd);
|
|
58
|
+
}
|
|
59
|
+
if (!result) {
|
|
60
|
+
notFound.push(id);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const { note, vault } = result;
|
|
64
|
+
let relationships;
|
|
65
|
+
if (includeRelationships) {
|
|
66
|
+
relationships = await getRelationshipPreview(note, ctx.vaultManager.allKnownVaults(), { activeProjectId: project?.id, limit: 3 });
|
|
67
|
+
}
|
|
68
|
+
found.push({
|
|
69
|
+
id: note.id,
|
|
70
|
+
title: note.title,
|
|
71
|
+
content: note.content,
|
|
72
|
+
project: noteProjectRef(note),
|
|
73
|
+
tags: note.tags,
|
|
74
|
+
lifecycle: note.lifecycle,
|
|
75
|
+
role: note.role,
|
|
76
|
+
alwaysLoad: note.alwaysLoad,
|
|
77
|
+
relatedTo: note.relatedTo,
|
|
78
|
+
createdAt: note.createdAt,
|
|
79
|
+
updatedAt: note.updatedAt,
|
|
80
|
+
vault: storageLabel(vault),
|
|
81
|
+
relationships,
|
|
82
|
+
});
|
|
83
|
+
if (project) {
|
|
84
|
+
setSessionCachedNote(project.id, vault.storage.vaultPath, note);
|
|
85
|
+
recordSessionNoteAccess(project.id, vault.storage.vaultPath, note.id, "get");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const lines = [];
|
|
89
|
+
for (const note of found) {
|
|
90
|
+
lines.push(`## ${note.title} (${note.id})`);
|
|
91
|
+
lines.push(`project: ${note.project?.name ?? "global"} | stored: ${note.vault} | lifecycle: ${note.lifecycle}${note.role ? ` | role: ${note.role}` : ""}`);
|
|
92
|
+
if (note.tags.length > 0)
|
|
93
|
+
lines.push(`tags: ${note.tags.join(", ")}`);
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push(note.content);
|
|
96
|
+
if (note.relationships) {
|
|
97
|
+
lines.push("");
|
|
98
|
+
lines.push(formatRelationshipPreview(note.relationships));
|
|
99
|
+
}
|
|
100
|
+
lines.push("");
|
|
101
|
+
}
|
|
102
|
+
if (notFound.length > 0) {
|
|
103
|
+
lines.push(`Not found: ${notFound.join(", ")}`);
|
|
104
|
+
}
|
|
105
|
+
const structuredContent = {
|
|
106
|
+
action: "got",
|
|
107
|
+
count: found.length,
|
|
108
|
+
notes: found,
|
|
109
|
+
notFound,
|
|
110
|
+
};
|
|
111
|
+
console.error(`[get:timing] ${(performance.now() - t0Get).toFixed(1)}ms`);
|
|
112
|
+
return { content: [{ type: "text", text: lines.join("\n").trim() }], structuredContent };
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwB1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAwB5E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { registerDetectProjectTool } from "./detect-project.js";
|
|
2
|
+
import { registerGetProjectIdentityTool } from "./get-project-identity.js";
|
|
3
|
+
import { registerSetProjectIdentityTool } from "./set-project-identity.js";
|
|
4
|
+
import { registerListMigrationsTool, registerExecuteMigrationTool } from "./migration.js";
|
|
5
|
+
import { registerSetProjectMemoryPolicyTool, registerGetProjectMemoryPolicyTool } from "./policy.js";
|
|
6
|
+
import { registerRememberTool } from "./remember.js";
|
|
7
|
+
import { registerRecallTool } from "./recall.js";
|
|
8
|
+
import { registerUpdateTool } from "./update.js";
|
|
9
|
+
import { registerForgetTool } from "./forget.js";
|
|
10
|
+
import { registerGetTool } from "./get.js";
|
|
11
|
+
import { registerWhereIsMemoryTool } from "./where-is-memory.js";
|
|
12
|
+
import { registerListTool } from "./list.js";
|
|
13
|
+
import { registerDiscoverTagsTool } from "./discover-tags.js";
|
|
14
|
+
import { registerRecentMemoriesTool } from "./recent-memories.js";
|
|
15
|
+
import { registerMemoryGraphTool } from "./memory-graph.js";
|
|
16
|
+
import { registerProjectMemorySummaryTool } from "./project-memory-summary.js";
|
|
17
|
+
import { registerSyncTool } from "./sync.js";
|
|
18
|
+
import { registerMoveMemoryTool } from "./move-memory.js";
|
|
19
|
+
import { registerRelateTool } from "./relate.js";
|
|
20
|
+
import { registerUnrelateTool } from "./unrelate.js";
|
|
21
|
+
import { registerConsolidateTool } from "./consolidate.js";
|
|
22
|
+
export function registerAllTools(server, ctx) {
|
|
23
|
+
registerDetectProjectTool(server, ctx);
|
|
24
|
+
registerGetProjectIdentityTool(server, ctx);
|
|
25
|
+
registerSetProjectIdentityTool(server, ctx);
|
|
26
|
+
registerListMigrationsTool(server, ctx);
|
|
27
|
+
registerExecuteMigrationTool(server, ctx);
|
|
28
|
+
registerSetProjectMemoryPolicyTool(server, ctx);
|
|
29
|
+
registerGetProjectMemoryPolicyTool(server, ctx);
|
|
30
|
+
registerRememberTool(server, ctx);
|
|
31
|
+
registerRecallTool(server, ctx);
|
|
32
|
+
registerUpdateTool(server, ctx);
|
|
33
|
+
registerForgetTool(server, ctx);
|
|
34
|
+
registerGetTool(server, ctx);
|
|
35
|
+
registerWhereIsMemoryTool(server, ctx);
|
|
36
|
+
registerListTool(server, ctx);
|
|
37
|
+
registerDiscoverTagsTool(server, ctx);
|
|
38
|
+
registerRecentMemoriesTool(server, ctx);
|
|
39
|
+
registerMemoryGraphTool(server, ctx);
|
|
40
|
+
registerProjectMemorySummaryTool(server, ctx);
|
|
41
|
+
registerSyncTool(server, ctx);
|
|
42
|
+
registerMoveMemoryTool(server, ctx);
|
|
43
|
+
registerRelateTool(server, ctx);
|
|
44
|
+
registerUnrelateTool(server, ctx);
|
|
45
|
+
registerConsolidateTool(server, ctx);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,kCAAkC,EAAE,kCAAkC,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,GAAkB;IACpE,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,8BAA8B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,8BAA8B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,4BAA4B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,kCAAkC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,kCAAkC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,gCAAgC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9C,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAoH5E"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ListResultSchema } from "../structured-content.js";
|
|
3
|
+
import { projectParam, ensureBranchSynced, noteProjectRef } from "../helpers/project.js";
|
|
4
|
+
import { collectVisibleNotes, formatListEntry, storageLabel } from "../helpers/vault.js";
|
|
5
|
+
export function registerListTool(server, ctx) {
|
|
6
|
+
server.registerTool("list", {
|
|
7
|
+
title: "List Memories",
|
|
8
|
+
description: "List stored memories with filtering by scope, storage label, and tags.\n\n" +
|
|
9
|
+
"Use this when:\n" +
|
|
10
|
+
"- You want to browse what exists for a project or globally\n" +
|
|
11
|
+
"- You want a deterministic filtered list rather than a semantic search\n" +
|
|
12
|
+
"- You are checking inventory before creating, updating, or consolidating notes\n\n" +
|
|
13
|
+
"Do not use this when:\n" +
|
|
14
|
+
"- You want topic-based semantic search; use `recall`\n" +
|
|
15
|
+
"- You already know the exact id; use `get`\n\n" +
|
|
16
|
+
"Returns:\n" +
|
|
17
|
+
"- Matching memories with ids, titles, scope/storage context, and metadata\n\n" +
|
|
18
|
+
"Read-only.\n\n" +
|
|
19
|
+
"Typical next step:\n" +
|
|
20
|
+
"- Use `get` for exact inspection or `update` / `consolidate` for cleanup.",
|
|
21
|
+
annotations: {
|
|
22
|
+
readOnlyHint: true,
|
|
23
|
+
destructiveHint: false,
|
|
24
|
+
idempotentHint: true,
|
|
25
|
+
openWorldHint: false,
|
|
26
|
+
},
|
|
27
|
+
inputSchema: z.object({
|
|
28
|
+
cwd: projectParam,
|
|
29
|
+
scope: z
|
|
30
|
+
.enum(["project", "global", "all"])
|
|
31
|
+
.optional()
|
|
32
|
+
.default("all")
|
|
33
|
+
.describe("'project' = only this project's memories (project-scoped storage); " +
|
|
34
|
+
"'global' = only unscoped memories (main/global storage); " +
|
|
35
|
+
"'all' = everything visible from this context (default)"),
|
|
36
|
+
storedIn: z
|
|
37
|
+
.enum(["project-vault", "main-vault", "any"])
|
|
38
|
+
.optional()
|
|
39
|
+
.default("any")
|
|
40
|
+
.describe("Storage-label filter. Use `main-vault` for main/global storage. " +
|
|
41
|
+
"Use `project-vault` as the broad filter for any project vault, including sub-vaults. " +
|
|
42
|
+
"Results may still return a more specific label such as `sub-vault:.mnemonic-lib`."),
|
|
43
|
+
tags: z.array(z.string()).optional().describe("Filter to notes matching all of these tags."),
|
|
44
|
+
includeRelations: z.boolean().optional().default(false).describe("Include related memory ids and relationship types"),
|
|
45
|
+
includePreview: z.boolean().optional().default(false).describe("Include a short content preview for each note"),
|
|
46
|
+
includeStorage: z.boolean().optional().default(false).describe("Show which vault each note is stored in"),
|
|
47
|
+
includeUpdated: z.boolean().optional().default(false).describe("Include last-updated timestamp for each note"),
|
|
48
|
+
}),
|
|
49
|
+
outputSchema: ListResultSchema,
|
|
50
|
+
}, async ({ cwd, scope, storedIn, tags, includeRelations, includePreview, includeStorage, includeUpdated }) => {
|
|
51
|
+
await ensureBranchSynced(ctx, cwd);
|
|
52
|
+
const { project, entries } = await collectVisibleNotes(ctx, cwd, scope, tags, storedIn);
|
|
53
|
+
if (entries.length === 0) {
|
|
54
|
+
const structuredContent = { action: "listed", count: 0, scope: scope || "all", storedIn: storedIn || "any", project: project ? { id: project.id, name: project.name } : undefined, notes: [] };
|
|
55
|
+
return { content: [{ type: "text", text: "No memories found." }], structuredContent };
|
|
56
|
+
}
|
|
57
|
+
const lines = entries.map((entry) => formatListEntry(entry, {
|
|
58
|
+
includeRelations,
|
|
59
|
+
includePreview,
|
|
60
|
+
includeStorage,
|
|
61
|
+
includeUpdated,
|
|
62
|
+
}));
|
|
63
|
+
const header = project && scope !== "global"
|
|
64
|
+
? `${entries.length} memories (project: ${project.name}, scope: ${scope}, storedIn: ${storedIn}):`
|
|
65
|
+
: `${entries.length} memories (scope: ${scope}, storedIn: ${storedIn}):`;
|
|
66
|
+
const textContent = `${header}\n\n${lines.join("\n")}`;
|
|
67
|
+
const structuredNotes = entries.map(({ note, vault }) => ({
|
|
68
|
+
id: note.id,
|
|
69
|
+
title: note.title,
|
|
70
|
+
project: noteProjectRef(note),
|
|
71
|
+
tags: note.tags,
|
|
72
|
+
lifecycle: note.lifecycle,
|
|
73
|
+
role: note.role,
|
|
74
|
+
vault: storageLabel(vault),
|
|
75
|
+
updatedAt: note.updatedAt,
|
|
76
|
+
hasRelated: note.relatedTo && note.relatedTo.length > 0,
|
|
77
|
+
}));
|
|
78
|
+
const structuredContent = {
|
|
79
|
+
action: "listed",
|
|
80
|
+
count: entries.length,
|
|
81
|
+
scope: scope || "all",
|
|
82
|
+
storedIn: storedIn || "any",
|
|
83
|
+
project: project ? { id: project.id, name: project.name } : undefined,
|
|
84
|
+
notes: structuredNotes,
|
|
85
|
+
options: {
|
|
86
|
+
includeRelations,
|
|
87
|
+
includePreview,
|
|
88
|
+
includeStorage,
|
|
89
|
+
includeUpdated,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
return { content: [{ type: "text", text: textContent }], structuredContent };
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.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 registerMemoryGraphTool(server: McpServer, ctx: ServerContext): void;
|
|
4
|
+
//# sourceMappingURL=memory-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-graph.d.ts","sourceRoot":"","sources":["../../src/tools/memory-graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAe1D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA2FnF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { MemoryGraphResultSchema, } from "../structured-content.js";
|
|
3
|
+
import { projectParam, toProjectRef, ensureBranchSynced, } from "../helpers/project.js";
|
|
4
|
+
import { collectVisibleNotes, } from "../helpers/vault.js";
|
|
5
|
+
export function registerMemoryGraphTool(server, ctx) {
|
|
6
|
+
server.registerTool("memory_graph", {
|
|
7
|
+
title: "Memory Graph",
|
|
8
|
+
description: "Show memory nodes and their relationships as a graph-oriented view.\n\n" +
|
|
9
|
+
"Use this when:\n" +
|
|
10
|
+
"- You want to inspect how notes connect across a topic or project\n" +
|
|
11
|
+
"- You are evaluating whether relationships are too sparse or too dense\n\n" +
|
|
12
|
+
"Do not use this when:\n" +
|
|
13
|
+
"- You only need one note; use `get`\n" +
|
|
14
|
+
"- You only need ranked topic matches; use `recall`\n\n" +
|
|
15
|
+
"Returns:\n" +
|
|
16
|
+
"- Memory nodes and relationship edges for the requested slice\n\n" +
|
|
17
|
+
"Read-only.\n\n" +
|
|
18
|
+
"Typical next step:\n" +
|
|
19
|
+
"- Use `get`, `relate`, `unrelate`, or `consolidate` based on what the graph reveals.",
|
|
20
|
+
annotations: {
|
|
21
|
+
readOnlyHint: true,
|
|
22
|
+
destructiveHint: false,
|
|
23
|
+
idempotentHint: true,
|
|
24
|
+
openWorldHint: false,
|
|
25
|
+
},
|
|
26
|
+
inputSchema: z.object({
|
|
27
|
+
cwd: projectParam,
|
|
28
|
+
scope: z.enum(["project", "global", "all"]).optional().default("all"),
|
|
29
|
+
storedIn: z.enum(["project-vault", "main-vault", "any"]).optional().default("any"),
|
|
30
|
+
limit: z.number().int().min(1).max(50).optional().default(25),
|
|
31
|
+
}),
|
|
32
|
+
outputSchema: MemoryGraphResultSchema,
|
|
33
|
+
}, async ({ cwd, scope, storedIn, limit }) => {
|
|
34
|
+
await ensureBranchSynced(ctx, cwd);
|
|
35
|
+
const { project, entries } = await collectVisibleNotes(ctx, cwd, scope, undefined, storedIn);
|
|
36
|
+
if (entries.length === 0) {
|
|
37
|
+
const structuredContent = { action: "graph_shown", project: toProjectRef(project), nodes: [], limit, truncated: false };
|
|
38
|
+
return { content: [{ type: "text", text: "No memories found." }], structuredContent };
|
|
39
|
+
}
|
|
40
|
+
const visibleIds = new Set(entries.map((entry) => entry.note.id));
|
|
41
|
+
const lines = entries
|
|
42
|
+
.filter((entry) => (entry.note.relatedTo?.length ?? 0) > 0)
|
|
43
|
+
.slice(0, limit)
|
|
44
|
+
.map((entry) => {
|
|
45
|
+
const edges = (entry.note.relatedTo ?? [])
|
|
46
|
+
.filter((rel) => visibleIds.has(rel.id))
|
|
47
|
+
.map((rel) => `${rel.id} (${rel.type})`);
|
|
48
|
+
return edges.length > 0 ? `- ${entry.note.id} -> ${edges.join(", ")}` : null;
|
|
49
|
+
})
|
|
50
|
+
.filter(Boolean);
|
|
51
|
+
if (lines.length === 0) {
|
|
52
|
+
const structuredContent = { action: "graph_shown", project: toProjectRef(project), nodes: [], limit, truncated: false };
|
|
53
|
+
return { content: [{ type: "text", text: "No relationships found for that scope." }], structuredContent };
|
|
54
|
+
}
|
|
55
|
+
const header = project && scope !== "global"
|
|
56
|
+
? `Memory graph for ${project.name}:`
|
|
57
|
+
: "Memory graph:";
|
|
58
|
+
const textContent = `${header}\n\n${lines.join("\n")}`;
|
|
59
|
+
// Build structured graph
|
|
60
|
+
const structuredNodes = entries
|
|
61
|
+
.filter((entry) => (entry.note.relatedTo?.length ?? 0) > 0)
|
|
62
|
+
.slice(0, limit)
|
|
63
|
+
.map((entry) => {
|
|
64
|
+
const edges = (entry.note.relatedTo ?? [])
|
|
65
|
+
.filter((rel) => visibleIds.has(rel.id))
|
|
66
|
+
.map((rel) => ({ toId: rel.id, type: rel.type }));
|
|
67
|
+
return {
|
|
68
|
+
id: entry.note.id,
|
|
69
|
+
title: entry.note.title,
|
|
70
|
+
edges: edges.length > 0 ? edges : [],
|
|
71
|
+
};
|
|
72
|
+
})
|
|
73
|
+
.filter((node) => node.edges.length > 0);
|
|
74
|
+
const structuredContent = {
|
|
75
|
+
action: "graph_shown",
|
|
76
|
+
project: toProjectRef(project),
|
|
77
|
+
nodes: structuredNodes,
|
|
78
|
+
limit,
|
|
79
|
+
truncated: structuredNodes.length < entries.filter(e => (e.note.relatedTo?.length ?? 0) > 0).length,
|
|
80
|
+
};
|
|
81
|
+
return { content: [{ type: "text", text: textContent }], structuredContent };
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=memory-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-graph.js","sourceRoot":"","sources":["../../src/tools/memory-graph.ts"],"names":[],"mappings":"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"}
|