@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 @@
|
|
|
1
|
+
{"version":3,"file":"relate.d.ts","sourceRoot":"","sources":["../../src/tools/relate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAqB1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA8L9E"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { RELATIONSHIP_TYPES } from "../storage.js";
|
|
4
|
+
import { RelateResultSchema, } from "../structured-content.js";
|
|
5
|
+
import { projectParam, ensureBranchSynced, } from "../helpers/project.js";
|
|
6
|
+
import { memoryId, isoDateString } from "../brands.js";
|
|
7
|
+
import { formatCommitBody } from "../helpers/git-commit.js";
|
|
8
|
+
import { buildMutationRetryContract, formatRetrySummary, pushAfterMutation, } from "../helpers/persistence.js";
|
|
9
|
+
import { invalidateActiveProjectCache } from "../cache.js";
|
|
10
|
+
export function registerRelateTool(server, ctx) {
|
|
11
|
+
server.registerTool("relate", {
|
|
12
|
+
title: "Relate Memories",
|
|
13
|
+
description: "Use after you have identified the exact memories to connect.\n\n" +
|
|
14
|
+
"Create a typed bidirectional relationship between two memories.\n\n" +
|
|
15
|
+
"Use this when:\n" +
|
|
16
|
+
"- A newly stored or updated note meaningfully connects to another note\n" +
|
|
17
|
+
"- One note explains, exemplifies, supersedes, or closely relates to another\n\n" +
|
|
18
|
+
"Do not use this when:\n" +
|
|
19
|
+
"- The connection is weak or speculative\n" +
|
|
20
|
+
"- You need to remove a relationship rather than add one\n\n" +
|
|
21
|
+
"Returns:\n" +
|
|
22
|
+
"- Both memory ids and the created relationship type\n\n" +
|
|
23
|
+
"Side effects: modifies both notes, git commits per affected vault, and may push.\n\n" +
|
|
24
|
+
"Typical next step:\n" +
|
|
25
|
+
"- Use `get` on both notes to verify the relationship context reads well.",
|
|
26
|
+
annotations: {
|
|
27
|
+
readOnlyHint: false,
|
|
28
|
+
destructiveHint: false,
|
|
29
|
+
idempotentHint: true,
|
|
30
|
+
openWorldHint: false,
|
|
31
|
+
},
|
|
32
|
+
inputSchema: z.object({
|
|
33
|
+
fromId: z.string().describe("Source memory id"),
|
|
34
|
+
toId: z.string().describe("Target memory id"),
|
|
35
|
+
type: z.enum(RELATIONSHIP_TYPES).default("related-to").describe("Relationship type: 'related-to' (same topic), 'explains' (clarifies why), 'example-of' (instance of pattern), 'supersedes' (replaces), 'derives-from' (derived artifact), 'follows' (sequence order)"),
|
|
36
|
+
bidirectional: z.boolean().optional().default(true).describe("Add relationship in both directions (default: true)"),
|
|
37
|
+
cwd: projectParam,
|
|
38
|
+
}),
|
|
39
|
+
outputSchema: RelateResultSchema,
|
|
40
|
+
}, async ({ fromId, toId, type, bidirectional, cwd }) => {
|
|
41
|
+
await ensureBranchSynced(ctx, cwd);
|
|
42
|
+
const [foundFrom, foundTo] = await Promise.all([
|
|
43
|
+
ctx.vaultManager.findNote(fromId, cwd),
|
|
44
|
+
ctx.vaultManager.findNote(toId, cwd),
|
|
45
|
+
]);
|
|
46
|
+
if (!foundFrom)
|
|
47
|
+
return { content: [{ type: "text", text: `No memory found with id '${fromId}'` }], isError: true };
|
|
48
|
+
if (!foundTo)
|
|
49
|
+
return { content: [{ type: "text", text: `No memory found with id '${toId}'` }], isError: true };
|
|
50
|
+
const { note: fromNote, vault: fromVault } = foundFrom;
|
|
51
|
+
const { note: toNote, vault: toVault } = foundTo;
|
|
52
|
+
const now = isoDateString(new Date().toISOString());
|
|
53
|
+
// Group changes by vault so notes in the same vault share one commit
|
|
54
|
+
const vaultChanges = new Map();
|
|
55
|
+
const fromRels = fromNote.relatedTo ?? [];
|
|
56
|
+
const fromRelExists = fromRels.some((r) => r.id === toId);
|
|
57
|
+
if (!fromRelExists) {
|
|
58
|
+
await fromVault.storage.writeNote({ ...fromNote, relatedTo: [...fromRels, { id: memoryId(toId), type }], updatedAt: now });
|
|
59
|
+
const files = vaultChanges.get(fromVault) ?? [];
|
|
60
|
+
files.push(ctx.vaultManager.noteRelPath(fromVault, fromId));
|
|
61
|
+
vaultChanges.set(fromVault, files);
|
|
62
|
+
}
|
|
63
|
+
const toRels = toNote.relatedTo ?? [];
|
|
64
|
+
const toRelExists = toRels.some((r) => r.id === fromId);
|
|
65
|
+
if (bidirectional && !toRelExists) {
|
|
66
|
+
await toVault.storage.writeNote({ ...toNote, relatedTo: [...toRels, { id: memoryId(fromId), type }], updatedAt: now });
|
|
67
|
+
const files = vaultChanges.get(toVault) ?? [];
|
|
68
|
+
files.push(ctx.vaultManager.noteRelPath(toVault, toId));
|
|
69
|
+
vaultChanges.set(toVault, files);
|
|
70
|
+
}
|
|
71
|
+
// Check for uncommitted changes from a previous failed attempt
|
|
72
|
+
if (vaultChanges.size === 0) {
|
|
73
|
+
// If relationships exist in note content, check git status for pending changes
|
|
74
|
+
const allVaults = new Set([fromVault, ...(bidirectional && toVault !== fromVault ? [toVault] : [])]);
|
|
75
|
+
for (const vault of allVaults) {
|
|
76
|
+
const noteIds = vault === fromVault
|
|
77
|
+
? (bidirectional && vault === toVault ? [fromId, toId] : [fromId])
|
|
78
|
+
: [toId];
|
|
79
|
+
const pendingFiles = await ctx.vaultManager.getPendingNoteFiles(vault, noteIds);
|
|
80
|
+
if (pendingFiles.length > 0) {
|
|
81
|
+
// Commit the pending changes from previous failed attempt
|
|
82
|
+
const commitBody = formatCommitBody({
|
|
83
|
+
noteId: fromId,
|
|
84
|
+
noteTitle: fromNote.title,
|
|
85
|
+
projectName: fromNote.projectName,
|
|
86
|
+
relationship: { fromId, toId, type },
|
|
87
|
+
});
|
|
88
|
+
const commitMessage = `relate: ${fromNote.title} ↔ ${toNote.title}`;
|
|
89
|
+
const commitStatus = await vault.git.commitWithStatus(commitMessage, pendingFiles, commitBody);
|
|
90
|
+
if (commitStatus.status === "committed") {
|
|
91
|
+
await pushAfterMutation(ctx, vault);
|
|
92
|
+
}
|
|
93
|
+
const retry = buildMutationRetryContract({
|
|
94
|
+
commit: commitStatus,
|
|
95
|
+
commitMessage,
|
|
96
|
+
commitBody,
|
|
97
|
+
files: pendingFiles,
|
|
98
|
+
cwd,
|
|
99
|
+
vault,
|
|
100
|
+
mutationApplied: true,
|
|
101
|
+
preferredRecovery: "rerun-tool-call-serial",
|
|
102
|
+
});
|
|
103
|
+
const structuredContent = {
|
|
104
|
+
action: "related",
|
|
105
|
+
fromId,
|
|
106
|
+
toId,
|
|
107
|
+
type,
|
|
108
|
+
bidirectional,
|
|
109
|
+
notesModified: pendingFiles.map((f) => path.basename(f, '.md')),
|
|
110
|
+
retry,
|
|
111
|
+
};
|
|
112
|
+
const retrySummary = formatRetrySummary(retry);
|
|
113
|
+
return {
|
|
114
|
+
content: [{
|
|
115
|
+
type: "text",
|
|
116
|
+
text: `Reconciled pending commit for relationship \`${fromId}\` ${bidirectional ? "↔" : "→"} \`${toId}\` (${type})${retrySummary ? `\n${retrySummary}` : ""}`,
|
|
117
|
+
}],
|
|
118
|
+
structuredContent,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { content: [{ type: "text", text: `Relationship already exists between '${fromId}' and '${toId}'` }], isError: true };
|
|
123
|
+
}
|
|
124
|
+
const modifiedNoteIds = [];
|
|
125
|
+
let retry;
|
|
126
|
+
for (const [vault, files] of vaultChanges) {
|
|
127
|
+
const isFromVault = vault === fromVault;
|
|
128
|
+
const thisNote = isFromVault ? fromNote : toNote;
|
|
129
|
+
const otherNote = isFromVault ? toNote : fromNote;
|
|
130
|
+
const commitBody = formatCommitBody({
|
|
131
|
+
noteId: thisNote.id,
|
|
132
|
+
noteTitle: thisNote.title,
|
|
133
|
+
projectName: thisNote.projectName,
|
|
134
|
+
relationship: {
|
|
135
|
+
fromId: thisNote.id,
|
|
136
|
+
toId: otherNote.id,
|
|
137
|
+
type,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
const commitMessage = `relate: ${fromNote.title} ↔ ${toNote.title}`;
|
|
141
|
+
const commitStatus = await vault.git.commitWithStatus(commitMessage, files, commitBody);
|
|
142
|
+
if (!retry) {
|
|
143
|
+
retry = buildMutationRetryContract({
|
|
144
|
+
commit: commitStatus,
|
|
145
|
+
commitMessage,
|
|
146
|
+
commitBody,
|
|
147
|
+
files,
|
|
148
|
+
cwd,
|
|
149
|
+
vault,
|
|
150
|
+
mutationApplied: true,
|
|
151
|
+
preferredRecovery: "rerun-tool-call-serial",
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (commitStatus.status === "committed") {
|
|
155
|
+
await pushAfterMutation(ctx, vault);
|
|
156
|
+
}
|
|
157
|
+
modifiedNoteIds.push(...files.map(f => path.basename(f, '.md')));
|
|
158
|
+
}
|
|
159
|
+
const dirStr = bidirectional ? "↔" : "→";
|
|
160
|
+
const structuredContent = {
|
|
161
|
+
action: "related",
|
|
162
|
+
fromId,
|
|
163
|
+
toId,
|
|
164
|
+
type,
|
|
165
|
+
bidirectional,
|
|
166
|
+
notesModified: modifiedNoteIds,
|
|
167
|
+
retry,
|
|
168
|
+
};
|
|
169
|
+
const retrySummary = formatRetrySummary(retry);
|
|
170
|
+
invalidateActiveProjectCache();
|
|
171
|
+
return {
|
|
172
|
+
content: [{
|
|
173
|
+
type: "text",
|
|
174
|
+
text: `Linked \`${fromId}\` ${dirStr} \`${toId}\` (${type})${retrySummary ? `\n${retrySummary}` : ""}`,
|
|
175
|
+
}],
|
|
176
|
+
structuredContent,
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=relate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relate.js","sourceRoot":"","sources":["../../src/tools/relate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remember.d.ts","sourceRoot":"","sources":["../../src/tools/remember.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAqC1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA2OhF"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { NOTE_LIFECYCLES, NOTE_ROLES } from "../storage.js";
|
|
3
|
+
import { isoDateString } from "../brands.js";
|
|
4
|
+
import { getErrorMessage } from "../error-utils.js";
|
|
5
|
+
import { embed, embedModel } from "../embeddings.js";
|
|
6
|
+
import { invalidateActiveProjectCache, getRecentSessionNoteAccesses, getSessionCachedNote, getRecentSessionAccessNote, } from "../cache.js";
|
|
7
|
+
import { suggestAutoRelationships } from "../auto-relate.js";
|
|
8
|
+
import { MarkdownLintError, cleanMarkdown } from "../markdown.js";
|
|
9
|
+
import { resolveWriteScope, WRITE_SCOPES } from "../project-memory-policy.js";
|
|
10
|
+
import { resolveProject, resolveWriteVault, ensureBranchSynced, describeProject, } from "../helpers/project.js";
|
|
11
|
+
import { extractSummary, formatCommitBody, formatAskForWriteScope, shouldBlockProtectedBranchCommit, } from "../helpers/git-commit.js";
|
|
12
|
+
import { embedTextForNote } from "../helpers/embed.js";
|
|
13
|
+
import { buildPersistenceStatus, formatPersistenceSummary, buildMutationRetryContract, pushAfterMutation, } from "../helpers/persistence.js";
|
|
14
|
+
import { storageLabel, ROLE_LIFECYCLE_DEFAULTS } from "../helpers/vault.js";
|
|
15
|
+
import { makeId } from "../helpers/index.js";
|
|
16
|
+
import { RememberResultSchema } from "../structured-content.js";
|
|
17
|
+
export function registerRememberTool(server, ctx) {
|
|
18
|
+
server.registerTool("remember", {
|
|
19
|
+
title: "Remember",
|
|
20
|
+
description: "REQUIRES: Call `recall` or `list` first to check whether this memory already exists.\n\n" +
|
|
21
|
+
"Create a new memory as a markdown note with embeddings for future recall.\n\n" +
|
|
22
|
+
"Use this when:\n" +
|
|
23
|
+
"- A decision, preference, bug fix, or durable context should survive beyond this session\n" +
|
|
24
|
+
"- No existing note already covers the topic\n\n" +
|
|
25
|
+
"Do not use this when:\n" +
|
|
26
|
+
"- A memory may already exist; use `recall` first to check\n" +
|
|
27
|
+
"- You need to change an existing memory; use `update`\n" +
|
|
28
|
+
"- Several overlapping notes should be merged; use `consolidate`\n\n" +
|
|
29
|
+
"Returns:\n" +
|
|
30
|
+
"- The created memory id, scope, vault label, lifecycle, and persistence status\n\n" +
|
|
31
|
+
"Side effects: writes a note, writes embeddings, git commits, and may push.\n\n" +
|
|
32
|
+
"Typical next step:\n" +
|
|
33
|
+
"- Use `relate` if this new memory connects to something recalled earlier.",
|
|
34
|
+
annotations: {
|
|
35
|
+
readOnlyHint: false,
|
|
36
|
+
destructiveHint: false,
|
|
37
|
+
idempotentHint: false,
|
|
38
|
+
openWorldHint: true,
|
|
39
|
+
},
|
|
40
|
+
inputSchema: z.object({
|
|
41
|
+
title: z.string().max(500, "Title must be at most 500 characters").describe("Specific, retrieval-friendly title. Prefer the concrete topic or decision, not a vague label."),
|
|
42
|
+
content: z.string().max(100000, "Content must be at most 100,000 characters").describe("Markdown note body. Put the key fact, decision, or outcome in the opening lines, then supporting detail. Embeddings weight early content more heavily. " +
|
|
43
|
+
"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. " +
|
|
44
|
+
"If lint fails, fix the specific issues listed in the error and retry the same call."),
|
|
45
|
+
tags: z.array(z.string()).optional().default([]).describe("Optional tags for later filtering. Use a small number of stable, meaningful tags."),
|
|
46
|
+
lifecycle: z
|
|
47
|
+
.enum(NOTE_LIFECYCLES)
|
|
48
|
+
.optional()
|
|
49
|
+
.describe("Memory lifetime. Use `temporary` for short-lived working context such as active investigations or transient status. " +
|
|
50
|
+
"Use `permanent` for durable knowledge such as decisions, fixes, patterns, and preferences. " +
|
|
51
|
+
"When omitted, defaults based on role: research/plan/review → temporary, decision/summary/reference → permanent."),
|
|
52
|
+
role: z
|
|
53
|
+
.enum(NOTE_ROLES)
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("Optional prioritization hint for the note. Inferred automatically when omitted. " +
|
|
56
|
+
"Set explicitly for workflow artifacts like research or review notes."),
|
|
57
|
+
summary: z.string().optional().describe("Git commit summary only. Imperative mood, concise, and focused on why the change matters."),
|
|
58
|
+
alwaysLoad: z
|
|
59
|
+
.boolean()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("When true, this note loads automatically at session start and receives priority in recall and relationship expansion. " +
|
|
62
|
+
"Use for session anchors and critical context that should always be available."),
|
|
63
|
+
cwd: z
|
|
64
|
+
.string()
|
|
65
|
+
.optional()
|
|
66
|
+
.describe("Absolute project working directory. Pass this whenever the task is related to a repository so routing, search boosting, policy lookup, and vault selection work correctly."),
|
|
67
|
+
scope: z
|
|
68
|
+
.enum(WRITE_SCOPES)
|
|
69
|
+
.optional()
|
|
70
|
+
.describe("Where to store: 'project' writes to the shared project vault visible to all contributors; " +
|
|
71
|
+
"'global' writes to the private main vault visible only on this machine. " +
|
|
72
|
+
"When omitted, uses the project's saved policy or defaults to 'project'."),
|
|
73
|
+
allowProtectedBranch: z
|
|
74
|
+
.boolean()
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("One-time override for protected branch checks. " +
|
|
77
|
+
"When true, remember can commit on a protected branch without changing project policy."),
|
|
78
|
+
checkedForExisting: z
|
|
79
|
+
.boolean()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe("Optional agent hint indicating that `recall` or `list` was already used to check for an existing memory on this topic."),
|
|
82
|
+
}),
|
|
83
|
+
outputSchema: RememberResultSchema,
|
|
84
|
+
}, async ({ title, content, tags, lifecycle, role, summary, alwaysLoad, cwd, scope, allowProtectedBranch = false }) => {
|
|
85
|
+
await ensureBranchSynced(ctx, cwd);
|
|
86
|
+
const project = await resolveProject(ctx, cwd);
|
|
87
|
+
let cleanedContent;
|
|
88
|
+
try {
|
|
89
|
+
cleanedContent = await cleanMarkdown(content);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (err instanceof MarkdownLintError) {
|
|
93
|
+
const message = `Markdown lint issues prevented this note from being stored. Fix the specific lint errors listed below in your content and retry the remember call — the note was NOT stored.\n\n${err.message}`;
|
|
94
|
+
return {
|
|
95
|
+
content: [{ type: "text", text: message }],
|
|
96
|
+
structuredContent: { action: "lint_error", tool: "remember", issues: err.issues },
|
|
97
|
+
isError: true,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
const policy = project ? await ctx.configStore.getProjectPolicy(project.id) : undefined;
|
|
103
|
+
const policyScope = policy?.defaultScope;
|
|
104
|
+
const projectVaultExists = cwd ? Boolean(await ctx.vaultManager.getProjectVaultIfExists(cwd)) : true;
|
|
105
|
+
const writeScope = resolveWriteScope(scope, policyScope, Boolean(project), projectVaultExists);
|
|
106
|
+
if (writeScope === "ask") {
|
|
107
|
+
const unadopted = !projectVaultExists && !policyScope;
|
|
108
|
+
return { content: [{ type: "text", text: formatAskForWriteScope(project, unadopted) }], isError: true };
|
|
109
|
+
}
|
|
110
|
+
const protectedBranchCheck = await shouldBlockProtectedBranchCommit({
|
|
111
|
+
cwd,
|
|
112
|
+
writeScope,
|
|
113
|
+
automaticCommit: true,
|
|
114
|
+
projectLabel: project ? `${project.name} (${project.id})` : "this context",
|
|
115
|
+
policy,
|
|
116
|
+
allowProtectedBranch,
|
|
117
|
+
toolName: "remember",
|
|
118
|
+
ctx,
|
|
119
|
+
});
|
|
120
|
+
if (protectedBranchCheck.blocked) {
|
|
121
|
+
return { content: [{ type: "text", text: protectedBranchCheck.message ?? "Protected branch policy blocked this commit." }], isError: true };
|
|
122
|
+
}
|
|
123
|
+
const vault = await resolveWriteVault(ctx, cwd, writeScope);
|
|
124
|
+
const id = makeId(title);
|
|
125
|
+
const now = isoDateString(new Date().toISOString());
|
|
126
|
+
const note = {
|
|
127
|
+
id, title, content: cleanedContent, tags,
|
|
128
|
+
lifecycle: lifecycle ?? (role ? ROLE_LIFECYCLE_DEFAULTS[role] : undefined) ?? "permanent",
|
|
129
|
+
...(role ? { role } : {}),
|
|
130
|
+
alwaysLoad: alwaysLoad ?? false,
|
|
131
|
+
project: project?.id,
|
|
132
|
+
projectName: project?.name,
|
|
133
|
+
createdAt: now,
|
|
134
|
+
updatedAt: now,
|
|
135
|
+
memoryVersion: 1,
|
|
136
|
+
};
|
|
137
|
+
if (project) {
|
|
138
|
+
const accessCandidates = getRecentSessionNoteAccesses(project.id)
|
|
139
|
+
.map((entry) => {
|
|
140
|
+
const cachedNote = getSessionCachedNote(project.id, entry.vaultPath, entry.noteId)
|
|
141
|
+
?? getRecentSessionAccessNote(project.id, entry.vaultPath, entry.noteId);
|
|
142
|
+
return cachedNote
|
|
143
|
+
? { note: cachedNote, accessedAt: entry.accessedAt, accessKind: entry.accessKind, score: entry.score }
|
|
144
|
+
: null;
|
|
145
|
+
})
|
|
146
|
+
.filter((entry) => entry !== null);
|
|
147
|
+
const autoRelationships = suggestAutoRelationships(note, accessCandidates);
|
|
148
|
+
if (autoRelationships.length > 0) {
|
|
149
|
+
note.relatedTo = autoRelationships;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
await vault.storage.writeNote(note);
|
|
153
|
+
let embeddingStatus = { status: "written" };
|
|
154
|
+
try {
|
|
155
|
+
const text = await embedTextForNote(vault.storage, note);
|
|
156
|
+
const vector = await embed(text);
|
|
157
|
+
await vault.storage.writeEmbedding({ id, model: embedModel, embedding: vector, updatedAt: now });
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
embeddingStatus = { status: "skipped", reason: getErrorMessage(err) };
|
|
161
|
+
console.error(`[embedding] Skipped for '${id}': ${err}`);
|
|
162
|
+
}
|
|
163
|
+
const projectScope = describeProject(project);
|
|
164
|
+
const commitSummary = summary ?? extractSummary(cleanedContent);
|
|
165
|
+
const commitBody = formatCommitBody({
|
|
166
|
+
summary: commitSummary,
|
|
167
|
+
noteId: id,
|
|
168
|
+
noteTitle: title,
|
|
169
|
+
projectName: project?.name,
|
|
170
|
+
scope: writeScope,
|
|
171
|
+
tags: tags,
|
|
172
|
+
});
|
|
173
|
+
const commitMessage = `remember: ${title}`;
|
|
174
|
+
const commitFiles = [ctx.vaultManager.noteRelPath(vault, id)];
|
|
175
|
+
const commitStatus = await vault.git.commitWithStatus(commitMessage, commitFiles, commitBody);
|
|
176
|
+
const pushStatus = commitStatus.status === "committed"
|
|
177
|
+
? await pushAfterMutation(ctx, vault)
|
|
178
|
+
: { status: "skipped", reason: "commit-failed" };
|
|
179
|
+
const retry = buildMutationRetryContract({
|
|
180
|
+
commit: commitStatus,
|
|
181
|
+
commitMessage,
|
|
182
|
+
commitBody,
|
|
183
|
+
files: commitFiles,
|
|
184
|
+
cwd,
|
|
185
|
+
vault,
|
|
186
|
+
mutationApplied: true,
|
|
187
|
+
});
|
|
188
|
+
const persistence = buildPersistenceStatus({
|
|
189
|
+
storage: vault.storage,
|
|
190
|
+
id,
|
|
191
|
+
embedding: embeddingStatus,
|
|
192
|
+
commit: commitStatus,
|
|
193
|
+
push: pushStatus,
|
|
194
|
+
commitMessage,
|
|
195
|
+
commitBody,
|
|
196
|
+
retry,
|
|
197
|
+
});
|
|
198
|
+
const vaultLabel = vault.isProject ? " [project vault]" : " [main vault]";
|
|
199
|
+
const textContent = `Remembered as \`${id}\` [${projectScope}, stored=${writeScope}]${vaultLabel}\n${formatPersistenceSummary(persistence)}`;
|
|
200
|
+
const structuredContent = {
|
|
201
|
+
action: "remembered",
|
|
202
|
+
id,
|
|
203
|
+
title,
|
|
204
|
+
project: project ? { id: project.id, name: project.name } : undefined,
|
|
205
|
+
scope: writeScope,
|
|
206
|
+
vault: storageLabel(vault),
|
|
207
|
+
tags: tags || [],
|
|
208
|
+
lifecycle: note.lifecycle,
|
|
209
|
+
timestamp: now,
|
|
210
|
+
persistence,
|
|
211
|
+
};
|
|
212
|
+
invalidateActiveProjectCache();
|
|
213
|
+
return {
|
|
214
|
+
content: [{ type: "text", text: textContent }],
|
|
215
|
+
structuredContent,
|
|
216
|
+
};
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=remember.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remember.js","sourceRoot":"","sources":["../../src/tools/remember.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 registerSetProjectIdentityTool(server: McpServer, ctx: ServerContext): void;
|
|
4
|
+
//# sourceMappingURL=set-project-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-project-identity.d.ts","sourceRoot":"","sources":["../../src/tools/set-project-identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAO1D,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAwH1F"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveProjectIdentity } from "../project.js";
|
|
3
|
+
import { projectNotFoundResponse } from "../helpers/vault.js";
|
|
4
|
+
import { formatCommitBody } from "../helpers/git-commit.js";
|
|
5
|
+
import { pushAfterMutation as pushAfterMutationFromModule, buildMutationRetryContract, formatRetrySummary } from "../helpers/persistence.js";
|
|
6
|
+
import { RemoteNameSchema, ProjectIdentityResultSchema } from "../structured-content.js";
|
|
7
|
+
export function registerSetProjectIdentityTool(server, ctx) {
|
|
8
|
+
server.registerTool("set_project_identity", {
|
|
9
|
+
title: "Set Project Identity",
|
|
10
|
+
description: "Override which git remote defines project identity for a repo.\n\n" +
|
|
11
|
+
"Use this when:\n" +
|
|
12
|
+
"- A fork should associate memory with the upstream project rather than the fork remote\n" +
|
|
13
|
+
"- Project detection is resolving to the wrong canonical repo\n\n" +
|
|
14
|
+
"Do not use this when:\n" +
|
|
15
|
+
"- The default remote already identifies the correct project\n\n" +
|
|
16
|
+
"Returns:\n" +
|
|
17
|
+
"- The new effective project identity after applying the override\n\n" +
|
|
18
|
+
"Side effects: writes config, git commits, and may push.\n\n" +
|
|
19
|
+
"Typical next step:\n" +
|
|
20
|
+
"- Re-run `detect_project` or `get_project_identity` to verify the result.",
|
|
21
|
+
annotations: {
|
|
22
|
+
readOnlyHint: false,
|
|
23
|
+
destructiveHint: false,
|
|
24
|
+
idempotentHint: true,
|
|
25
|
+
openWorldHint: false,
|
|
26
|
+
},
|
|
27
|
+
inputSchema: z.object({
|
|
28
|
+
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."),
|
|
29
|
+
remoteName: RemoteNameSchema.describe("Git remote name to use as the canonical project identity, such as `upstream`")
|
|
30
|
+
}),
|
|
31
|
+
outputSchema: ProjectIdentityResultSchema,
|
|
32
|
+
}, async ({ cwd, remoteName }) => {
|
|
33
|
+
const defaultIdentity = await resolveProjectIdentity(cwd);
|
|
34
|
+
if (!defaultIdentity) {
|
|
35
|
+
return projectNotFoundResponse(cwd);
|
|
36
|
+
}
|
|
37
|
+
const defaultProject = defaultIdentity.project;
|
|
38
|
+
if (defaultProject.source !== "git-remote") {
|
|
39
|
+
return {
|
|
40
|
+
content: [{
|
|
41
|
+
type: "text",
|
|
42
|
+
text: `Project identity override requires a git remote. Current source: ${defaultProject.source}`,
|
|
43
|
+
}],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const now = new Date().toISOString();
|
|
47
|
+
const candidateIdentity = await resolveProjectIdentity(cwd, {
|
|
48
|
+
getProjectIdentityOverride: async () => ({ remoteName, updatedAt: now }),
|
|
49
|
+
});
|
|
50
|
+
if (!candidateIdentity || !candidateIdentity.identityOverrideApplied) {
|
|
51
|
+
return {
|
|
52
|
+
content: [{
|
|
53
|
+
type: "text",
|
|
54
|
+
text: `Could not resolve git remote '${remoteName}' for ${defaultProject.name}.`,
|
|
55
|
+
}],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
await ctx.configStore.setProjectIdentityOverride(defaultProject.id, { remoteName, updatedAt: now });
|
|
59
|
+
const commitBody = formatCommitBody({
|
|
60
|
+
summary: `Use ${remoteName} as canonical project identity`,
|
|
61
|
+
projectName: defaultProject.name,
|
|
62
|
+
description: `Default identity: ${defaultProject.id}\n` +
|
|
63
|
+
`Resolved identity: ${candidateIdentity.project.id}\n` +
|
|
64
|
+
`Remote: ${remoteName}`,
|
|
65
|
+
});
|
|
66
|
+
const commitMessage = `identity: ${defaultProject.name} use remote ${remoteName}`;
|
|
67
|
+
const commitFiles = ["config.json"];
|
|
68
|
+
const commitStatus = await ctx.vaultManager.main.git.commitWithStatus(commitMessage, commitFiles, commitBody);
|
|
69
|
+
const pushStatus = commitStatus.status === "committed"
|
|
70
|
+
? await pushAfterMutationFromModule(ctx, ctx.vaultManager.main)
|
|
71
|
+
: { status: "skipped", reason: "commit-failed" };
|
|
72
|
+
const retry = buildMutationRetryContract({
|
|
73
|
+
commit: commitStatus,
|
|
74
|
+
commitMessage,
|
|
75
|
+
commitBody,
|
|
76
|
+
files: commitFiles,
|
|
77
|
+
cwd,
|
|
78
|
+
vault: ctx.vaultManager.main,
|
|
79
|
+
mutationApplied: true,
|
|
80
|
+
});
|
|
81
|
+
const structuredContent = {
|
|
82
|
+
action: "project_identity_set",
|
|
83
|
+
project: {
|
|
84
|
+
id: candidateIdentity.project.id,
|
|
85
|
+
name: candidateIdentity.project.name,
|
|
86
|
+
source: candidateIdentity.project.source,
|
|
87
|
+
remoteName: candidateIdentity.project.remoteName,
|
|
88
|
+
},
|
|
89
|
+
defaultProject: {
|
|
90
|
+
id: defaultProject.id,
|
|
91
|
+
name: defaultProject.name,
|
|
92
|
+
remoteName: defaultProject.remoteName,
|
|
93
|
+
},
|
|
94
|
+
identityOverride: {
|
|
95
|
+
remoteName,
|
|
96
|
+
updatedAt: now,
|
|
97
|
+
},
|
|
98
|
+
retry,
|
|
99
|
+
};
|
|
100
|
+
return {
|
|
101
|
+
content: [{
|
|
102
|
+
type: "text",
|
|
103
|
+
text: `Project identity override set for ${defaultProject.name}: ` +
|
|
104
|
+
`default=\`${defaultProject.id}\`, effective=\`${candidateIdentity.project.id}\`, remote=${remoteName}` +
|
|
105
|
+
`${commitStatus.status === "failed"
|
|
106
|
+
? `\n${formatRetrySummary(retry) ?? `Commit failed. Push status: ${pushStatus.status}.`}`
|
|
107
|
+
: ""}`,
|
|
108
|
+
}],
|
|
109
|
+
structuredContent,
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=set-project-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-project-identity.js","sourceRoot":"","sources":["../../src/tools/set-project-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/tools/sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA8C1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAgG5E"}
|