@s_s/mnemo 1.1.2 → 1.3.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/README.md +27 -4
- package/build/core/config.d.ts +40 -0
- package/build/core/config.js +101 -0
- package/build/core/config.js.map +1 -1
- package/build/core/embedding.d.ts +1 -0
- package/build/core/embedding.js +9 -3
- package/build/core/embedding.js.map +1 -1
- package/build/core/notes.d.ts +2 -2
- package/build/core/notes.js +19 -9
- package/build/core/notes.js.map +1 -1
- package/build/index.js +0 -0
- package/build/prompts/templates.js +23 -4
- package/build/prompts/templates.js.map +1 -1
- package/build/tools/compress.js +5 -3
- package/build/tools/compress.js.map +1 -1
- package/build/tools/get.js +2 -0
- package/build/tools/get.js.map +1 -1
- package/build/tools/save.js +17 -6
- package/build/tools/save.js.map +1 -1
- package/build/tools/search.js +16 -4
- package/build/tools/search.js.map +1 -1
- package/build/tools/setup.js +66 -7
- package/build/tools/setup.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -101,7 +101,7 @@ mcporter config add mnemo --command mnemo --scope home
|
|
|
101
101
|
|
|
102
102
|
### Initialize
|
|
103
103
|
|
|
104
|
-
Once connected, call the `memory_setup` tool to inject memory management instructions into your agent's config file:
|
|
104
|
+
Once connected, call the `memory_setup` tool to inject memory management instructions into your agent's config file and initialize storage:
|
|
105
105
|
|
|
106
106
|
```
|
|
107
107
|
> Use the memory_setup tool to initialize Mnemo
|
|
@@ -109,6 +109,15 @@ Once connected, call the `memory_setup` tool to inject memory management instruc
|
|
|
109
109
|
|
|
110
110
|
This writes a prompt block into your agent's config (e.g., `AGENTS.md` for OpenCode, `CLAUDE.md` for Claude Code) that teaches the agent when and how to use Mnemo's tools.
|
|
111
111
|
|
|
112
|
+
By default, `memory_setup()` initializes **global** memory shared across projects. If you want project-isolated memory, call `memory_setup` with `scope: "project"`.
|
|
113
|
+
|
|
114
|
+
### Storage scopes
|
|
115
|
+
|
|
116
|
+
- `global` (default) — shared memory across projects; prompt is written to the user-level agent config
|
|
117
|
+
- `project` — isolated memory for the current project; prompt is written to the project config and Mnemo creates a local `.mnemo/` directory
|
|
118
|
+
|
|
119
|
+
You can also pass `project_root` when using `scope: "project"` to explicitly choose the project root.
|
|
120
|
+
|
|
112
121
|
## Usage Examples
|
|
113
122
|
|
|
114
123
|
> **Important:** You don't call Mnemo tools directly. You chat with your AI agent in natural language, and the agent decides when to call Mnemo tools behind the scenes. After running `memory_setup`, the agent already knows when and how to use them.
|
|
@@ -177,7 +186,7 @@ Mnemo provides 7 MCP tools:
|
|
|
177
186
|
|
|
178
187
|
| Tool | Description |
|
|
179
188
|
| ----------------------- | ------------------------------------------------------------------- |
|
|
180
|
-
| `memory_setup` | Initialize Mnemo — inject usage instructions
|
|
189
|
+
| `memory_setup` | Initialize Mnemo — inject usage instructions and set up storage |
|
|
181
190
|
| `memory_save` | Save a memory note with optional tags and source |
|
|
182
191
|
| `memory_search` | Hybrid search across memories; returns summaries (supports filters) |
|
|
183
192
|
| `memory_get` | Retrieve full content of specific notes by ID |
|
|
@@ -189,19 +198,33 @@ Mnemo provides 7 MCP tools:
|
|
|
189
198
|
|
|
190
199
|
### Storage
|
|
191
200
|
|
|
192
|
-
Memory notes are stored as Markdown files with YAML frontmatter
|
|
201
|
+
Memory notes are stored as Markdown files with YAML frontmatter.
|
|
202
|
+
|
|
203
|
+
Global mode:
|
|
193
204
|
|
|
194
205
|
```
|
|
195
206
|
~/Library/Application Support/mnemo/ # macOS
|
|
196
207
|
~/.local/share/mnemo/ # Linux
|
|
197
208
|
%APPDATA%/mnemo/ # Windows
|
|
209
|
+
├── config.json # Global storage marker
|
|
198
210
|
├── notes/ # Markdown files
|
|
199
211
|
│ ├── 20260305-172200-a3f1.md
|
|
200
212
|
│ └── 20260305-183015-b7c2.md
|
|
201
213
|
└── index/ # Vector index (vectra)
|
|
202
214
|
```
|
|
203
215
|
|
|
204
|
-
|
|
216
|
+
Project mode:
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
<projectRoot>/.mnemo/
|
|
220
|
+
├── config.json # Project storage marker
|
|
221
|
+
├── notes/ # Markdown files
|
|
222
|
+
└── index/ # Vector index (vectra)
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Override the global data directory with `MNEMO_DATA_DIR` environment variable.
|
|
226
|
+
|
|
227
|
+
Important: Mnemo must be initialized with `memory_setup` before other memory tools are used. Storage resolution follows: project marker first, global marker second, otherwise the tool reports that Mnemo is not initialized.
|
|
205
228
|
|
|
206
229
|
### Hybrid Search
|
|
207
230
|
|
package/build/core/config.d.ts
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export declare const AGENT_TYPES: readonly ["opencode", "claude-code", "openclaw", "codex"];
|
|
5
5
|
export type AgentType = (typeof AGENT_TYPES)[number];
|
|
6
|
+
export type StorageScope = 'global' | 'project';
|
|
7
|
+
/**
|
|
8
|
+
* Memory type categories for the minimal constraint mechanism.
|
|
9
|
+
* Each memory should be classified into one of these types before saving.
|
|
10
|
+
*/
|
|
11
|
+
export declare const MEMORY_TYPES: readonly ["preference", "profile", "goal", "continuity", "fact", "decision", "rule", "experience"];
|
|
12
|
+
export type MemoryType = (typeof MEMORY_TYPES)[number];
|
|
13
|
+
export interface StorageContext {
|
|
14
|
+
scope: StorageScope;
|
|
15
|
+
dataDir: string;
|
|
16
|
+
notesDir: string;
|
|
17
|
+
indexDir: string;
|
|
18
|
+
configPath: string;
|
|
19
|
+
}
|
|
6
20
|
/**
|
|
7
21
|
* Get platform-appropriate data directory for Mnemo.
|
|
8
22
|
*
|
|
@@ -14,6 +28,18 @@ export type AgentType = (typeof AGENT_TYPES)[number];
|
|
|
14
28
|
* Can be overridden via MNEMO_DATA_DIR env var.
|
|
15
29
|
*/
|
|
16
30
|
export declare function getDataDir(): string;
|
|
31
|
+
/**
|
|
32
|
+
* Get the global storage config path
|
|
33
|
+
*/
|
|
34
|
+
export declare function getGlobalConfigPath(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Get the project storage root directory
|
|
37
|
+
*/
|
|
38
|
+
export declare function getProjectDataDir(projectRoot: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Get the project storage config path
|
|
41
|
+
*/
|
|
42
|
+
export declare function getProjectConfigPath(projectRoot: string): string;
|
|
17
43
|
/**
|
|
18
44
|
* Get the notes directory
|
|
19
45
|
*/
|
|
@@ -22,6 +48,19 @@ export declare function getNotesDir(): string;
|
|
|
22
48
|
* Get the vector index directory
|
|
23
49
|
*/
|
|
24
50
|
export declare function getIndexDir(): string;
|
|
51
|
+
/**
|
|
52
|
+
* Write the storage initialization marker.
|
|
53
|
+
*/
|
|
54
|
+
export declare function writeStorageConfig(scope: StorageScope, projectRoot?: string): Promise<string>;
|
|
55
|
+
/**
|
|
56
|
+
* Find the nearest project storage config by walking up from cwd.
|
|
57
|
+
*/
|
|
58
|
+
export declare function findProjectConfig(startDir: string): Promise<string | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the active storage context for the current working directory.
|
|
61
|
+
* Project storage has priority over global storage.
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolveStorageContext(cwd?: string): Promise<StorageContext>;
|
|
25
64
|
/**
|
|
26
65
|
* Ensure a directory exists
|
|
27
66
|
*/
|
|
@@ -35,6 +74,7 @@ export interface NoteMeta {
|
|
|
35
74
|
updated: string;
|
|
36
75
|
tags: string[];
|
|
37
76
|
source: string;
|
|
77
|
+
type?: MemoryType;
|
|
38
78
|
}
|
|
39
79
|
/**
|
|
40
80
|
* Memory note (metadata + content)
|
package/build/core/config.js
CHANGED
|
@@ -5,6 +5,20 @@ import fs from 'node:fs/promises';
|
|
|
5
5
|
* Supported agent tool types
|
|
6
6
|
*/
|
|
7
7
|
export const AGENT_TYPES = ['opencode', 'claude-code', 'openclaw', 'codex'];
|
|
8
|
+
/**
|
|
9
|
+
* Memory type categories for the minimal constraint mechanism.
|
|
10
|
+
* Each memory should be classified into one of these types before saving.
|
|
11
|
+
*/
|
|
12
|
+
export const MEMORY_TYPES = [
|
|
13
|
+
'preference',
|
|
14
|
+
'profile',
|
|
15
|
+
'goal',
|
|
16
|
+
'continuity',
|
|
17
|
+
'fact',
|
|
18
|
+
'decision',
|
|
19
|
+
'rule',
|
|
20
|
+
'experience',
|
|
21
|
+
];
|
|
8
22
|
/**
|
|
9
23
|
* Get platform-appropriate data directory for Mnemo.
|
|
10
24
|
*
|
|
@@ -31,6 +45,24 @@ export function getDataDir() {
|
|
|
31
45
|
return path.join(process.env.XDG_DATA_HOME || path.join(home, '.local', 'share'), 'mnemo');
|
|
32
46
|
}
|
|
33
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the global storage config path
|
|
50
|
+
*/
|
|
51
|
+
export function getGlobalConfigPath() {
|
|
52
|
+
return path.join(getDataDir(), 'config.json');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the project storage root directory
|
|
56
|
+
*/
|
|
57
|
+
export function getProjectDataDir(projectRoot) {
|
|
58
|
+
return path.join(projectRoot, '.mnemo');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the project storage config path
|
|
62
|
+
*/
|
|
63
|
+
export function getProjectConfigPath(projectRoot) {
|
|
64
|
+
return path.join(getProjectDataDir(projectRoot), 'config.json');
|
|
65
|
+
}
|
|
34
66
|
/**
|
|
35
67
|
* Get the notes directory
|
|
36
68
|
*/
|
|
@@ -43,6 +75,75 @@ export function getNotesDir() {
|
|
|
43
75
|
export function getIndexDir() {
|
|
44
76
|
return path.join(getDataDir(), 'index');
|
|
45
77
|
}
|
|
78
|
+
async function pathExists(targetPath) {
|
|
79
|
+
try {
|
|
80
|
+
await fs.access(targetPath);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Write the storage initialization marker.
|
|
89
|
+
*/
|
|
90
|
+
export async function writeStorageConfig(scope, projectRoot) {
|
|
91
|
+
const configPath = scope === 'project' ? getProjectConfigPath(projectRoot || process.cwd()) : getGlobalConfigPath();
|
|
92
|
+
const config = {
|
|
93
|
+
version: 1,
|
|
94
|
+
scope,
|
|
95
|
+
createdAt: new Date().toISOString(),
|
|
96
|
+
};
|
|
97
|
+
await ensureDir(path.dirname(configPath));
|
|
98
|
+
await fs.writeFile(configPath, JSON.stringify(config, null, 4) + '\n', 'utf-8');
|
|
99
|
+
return configPath;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Find the nearest project storage config by walking up from cwd.
|
|
103
|
+
*/
|
|
104
|
+
export async function findProjectConfig(startDir) {
|
|
105
|
+
let current = path.resolve(startDir);
|
|
106
|
+
while (true) {
|
|
107
|
+
const configPath = getProjectConfigPath(current);
|
|
108
|
+
if (await pathExists(configPath)) {
|
|
109
|
+
return configPath;
|
|
110
|
+
}
|
|
111
|
+
const parent = path.dirname(current);
|
|
112
|
+
if (parent === current) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
current = parent;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Resolve the active storage context for the current working directory.
|
|
120
|
+
* Project storage has priority over global storage.
|
|
121
|
+
*/
|
|
122
|
+
export async function resolveStorageContext(cwd = process.cwd()) {
|
|
123
|
+
const projectConfigPath = await findProjectConfig(cwd);
|
|
124
|
+
if (projectConfigPath) {
|
|
125
|
+
const dataDir = path.dirname(projectConfigPath);
|
|
126
|
+
return {
|
|
127
|
+
scope: 'project',
|
|
128
|
+
dataDir,
|
|
129
|
+
notesDir: path.join(dataDir, 'notes'),
|
|
130
|
+
indexDir: path.join(dataDir, 'index'),
|
|
131
|
+
configPath: projectConfigPath,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const globalConfigPath = getGlobalConfigPath();
|
|
135
|
+
if (await pathExists(globalConfigPath)) {
|
|
136
|
+
const dataDir = getDataDir();
|
|
137
|
+
return {
|
|
138
|
+
scope: 'global',
|
|
139
|
+
dataDir,
|
|
140
|
+
notesDir: path.join(dataDir, 'notes'),
|
|
141
|
+
indexDir: path.join(dataDir, 'index'),
|
|
142
|
+
configPath: globalConfigPath,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
throw new Error('Mnemo is not initialized in the current environment. Run memory_setup first.');
|
|
146
|
+
}
|
|
46
147
|
/**
|
|
47
148
|
* Ensure a directory exists
|
|
48
149
|
*/
|
package/build/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,CAAU,CAAC;AAMrF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,YAAY;IACZ,SAAS;IACT,MAAM;IACN,YAAY;IACZ,MAAM;IACN,UAAU;IACV,MAAM;IACN,YAAY;CACN,CAAC;AAkBX;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU;IACtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE1B,QAAQ,QAAQ,EAAE,CAAC;QACf,KAAK,QAAQ;YACT,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;QACtE,KAAK,OAAO;YACR,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5F;YACI,mDAAmD;YACnD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACnG,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,UAAkB;IACxC,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAmB,EAAE,WAAoB;IAC9E,MAAM,UAAU,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC;IAEpH,MAAM,MAAM,GAAsB;QAC9B,OAAO,EAAE,CAAC;QACV,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;IAEF,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAEhF,OAAO,UAAU,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACpD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErC,OAAO,IAAI,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,UAAU,CAAC;QACtB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACnE,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,iBAAiB,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAChD,OAAO;YACH,KAAK,EAAE,SAAS;YAChB,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;YACrC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;YACrC,UAAU,EAAE,iBAAiB;SAChC,CAAC;IACN,CAAC;IAED,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;IAC/C,IAAI,MAAM,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,OAAO;YACH,KAAK,EAAE,QAAQ;YACf,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;YACrC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;YACrC,UAAU,EAAE,gBAAgB;SAC/B,CAAC;IACN,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;AACpG,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACvC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAsBD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,0DAA0D;IAC1D,QAAQ,EAAE,EAAE;IACZ,qEAAqE;IACrE,YAAY,EAAE,OAAO;CACf,CAAC"}
|
package/build/core/embedding.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { LocalIndex } from 'vectra';
|
|
2
|
-
import {
|
|
2
|
+
import { ensureDir, resolveStorageContext } from './config.js';
|
|
3
3
|
import { readAllNotes } from './notes.js';
|
|
4
4
|
let embedder = null;
|
|
5
5
|
let embedderLoading = null;
|
|
6
|
-
|
|
6
|
+
const indexInstances = new Map();
|
|
7
7
|
/**
|
|
8
8
|
* Load the embedding model.
|
|
9
9
|
* Uses all-MiniLM-L6-v2 (384 dims, ~33MB, good quality/speed tradeoff).
|
|
@@ -50,8 +50,9 @@ export async function embed(text) {
|
|
|
50
50
|
* Get or create the vector index
|
|
51
51
|
*/
|
|
52
52
|
async function getIndex() {
|
|
53
|
+
const { indexDir } = await resolveStorageContext();
|
|
54
|
+
let indexInstance = indexInstances.get(indexDir) || null;
|
|
53
55
|
if (!indexInstance) {
|
|
54
|
-
const indexDir = getIndexDir();
|
|
55
56
|
await ensureDir(indexDir);
|
|
56
57
|
indexInstance = new LocalIndex(indexDir);
|
|
57
58
|
if (!(await indexInstance.isIndexCreated())) {
|
|
@@ -61,6 +62,7 @@ async function getIndex() {
|
|
|
61
62
|
});
|
|
62
63
|
console.error('Mnemo: vector index created');
|
|
63
64
|
}
|
|
65
|
+
indexInstances.set(indexDir, indexInstance);
|
|
64
66
|
}
|
|
65
67
|
return indexInstance;
|
|
66
68
|
}
|
|
@@ -79,6 +81,7 @@ export async function indexNote(note) {
|
|
|
79
81
|
tags: note.meta.tags.join(','),
|
|
80
82
|
source: note.meta.source,
|
|
81
83
|
created: note.meta.created,
|
|
84
|
+
type: note.meta.type || '',
|
|
82
85
|
},
|
|
83
86
|
});
|
|
84
87
|
}
|
|
@@ -156,6 +159,7 @@ function mergeResults(vectorResults, keywordResults, vectorWeight = 0.7, textWei
|
|
|
156
159
|
tags: kr.note.meta.tags.join(','),
|
|
157
160
|
source: kr.note.meta.source,
|
|
158
161
|
created: kr.note.meta.created,
|
|
162
|
+
type: kr.note.meta.type || '',
|
|
159
163
|
});
|
|
160
164
|
}
|
|
161
165
|
}
|
|
@@ -182,6 +186,7 @@ export async function searchNotes(query, topK = 5, sourceFilter) {
|
|
|
182
186
|
tags: r.item.metadata.tags,
|
|
183
187
|
source: r.item.metadata.source,
|
|
184
188
|
created: r.item.metadata.created,
|
|
189
|
+
type: r.item.metadata.type || '',
|
|
185
190
|
}));
|
|
186
191
|
}
|
|
187
192
|
// Keyword search
|
|
@@ -200,6 +205,7 @@ export async function searchNotes(query, topK = 5, sourceFilter) {
|
|
|
200
205
|
tags: kr.note.meta.tags.join(','),
|
|
201
206
|
source: kr.note.meta.source,
|
|
202
207
|
created: kr.note.meta.created,
|
|
208
|
+
type: kr.note.meta.type || '',
|
|
203
209
|
}));
|
|
204
210
|
}
|
|
205
211
|
const merged = mergeResults(vectorResults, keywordResults);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"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"}
|
package/build/core/notes.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Note } from './config.js';
|
|
1
|
+
import { type Note, type MemoryType } from './config.js';
|
|
2
2
|
/**
|
|
3
3
|
* Parse a note markdown file into Note object
|
|
4
4
|
*/
|
|
@@ -10,7 +10,7 @@ export declare function serializeNote(note: Note): string;
|
|
|
10
10
|
/**
|
|
11
11
|
* Save a new note to disk and return it
|
|
12
12
|
*/
|
|
13
|
-
export declare function saveNote(content: string, tags?: string[], source?: string): Promise<Note>;
|
|
13
|
+
export declare function saveNote(content: string, tags?: string[], source?: string, type?: MemoryType): Promise<Note>;
|
|
14
14
|
/**
|
|
15
15
|
* Read a single note by ID
|
|
16
16
|
*/
|
package/build/core/notes.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import crypto from 'node:crypto';
|
|
4
|
-
import {
|
|
4
|
+
import { ensureDir, resolveStorageContext, MEMORY_TYPES } from './config.js';
|
|
5
5
|
/**
|
|
6
6
|
* Generate a timestamp-based unique ID.
|
|
7
7
|
* Format: YYYYMMDD-HHmmss-xxxx (4-char random suffix to avoid same-second collisions)
|
|
@@ -50,6 +50,11 @@ export function parseNote(raw) {
|
|
|
50
50
|
case 'source':
|
|
51
51
|
meta.source = value;
|
|
52
52
|
break;
|
|
53
|
+
case 'type':
|
|
54
|
+
if (MEMORY_TYPES.includes(value)) {
|
|
55
|
+
meta.type = value;
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
53
58
|
case 'tags':
|
|
54
59
|
meta.tags = value
|
|
55
60
|
.replace(/^\[/, '')
|
|
@@ -69,6 +74,7 @@ export function parseNote(raw) {
|
|
|
69
74
|
updated: meta.updated || now(),
|
|
70
75
|
tags: meta.tags || [],
|
|
71
76
|
source: meta.source || 'unknown',
|
|
77
|
+
...(meta.type ? { type: meta.type } : {}),
|
|
72
78
|
},
|
|
73
79
|
content,
|
|
74
80
|
};
|
|
@@ -84,17 +90,18 @@ export function serializeNote(note) {
|
|
|
84
90
|
`updated: ${note.meta.updated}`,
|
|
85
91
|
`tags: [${note.meta.tags.join(', ')}]`,
|
|
86
92
|
`source: ${note.meta.source}`,
|
|
87
|
-
'---',
|
|
88
|
-
'',
|
|
89
|
-
note.content,
|
|
90
93
|
];
|
|
94
|
+
if (note.meta.type) {
|
|
95
|
+
lines.push(`type: ${note.meta.type}`);
|
|
96
|
+
}
|
|
97
|
+
lines.push('---', '', note.content);
|
|
91
98
|
return lines.join('\n') + '\n';
|
|
92
99
|
}
|
|
93
100
|
/**
|
|
94
101
|
* Save a new note to disk and return it
|
|
95
102
|
*/
|
|
96
|
-
export async function saveNote(content, tags = [], source = 'unknown') {
|
|
97
|
-
const notesDir =
|
|
103
|
+
export async function saveNote(content, tags = [], source = 'unknown', type) {
|
|
104
|
+
const { notesDir } = await resolveStorageContext();
|
|
98
105
|
await ensureDir(notesDir);
|
|
99
106
|
const id = generateId();
|
|
100
107
|
const timestamp = now();
|
|
@@ -105,6 +112,7 @@ export async function saveNote(content, tags = [], source = 'unknown') {
|
|
|
105
112
|
updated: timestamp,
|
|
106
113
|
tags,
|
|
107
114
|
source,
|
|
115
|
+
...(type ? { type } : {}),
|
|
108
116
|
},
|
|
109
117
|
content,
|
|
110
118
|
};
|
|
@@ -116,7 +124,8 @@ export async function saveNote(content, tags = [], source = 'unknown') {
|
|
|
116
124
|
* Read a single note by ID
|
|
117
125
|
*/
|
|
118
126
|
export async function readNote(id) {
|
|
119
|
-
const
|
|
127
|
+
const { notesDir } = await resolveStorageContext();
|
|
128
|
+
const filePath = path.join(notesDir, `${id}.md`);
|
|
120
129
|
try {
|
|
121
130
|
const raw = await fs.readFile(filePath, 'utf-8');
|
|
122
131
|
return parseNote(raw);
|
|
@@ -129,7 +138,7 @@ export async function readNote(id) {
|
|
|
129
138
|
* Read all notes from disk
|
|
130
139
|
*/
|
|
131
140
|
export async function readAllNotes() {
|
|
132
|
-
const notesDir =
|
|
141
|
+
const { notesDir } = await resolveStorageContext();
|
|
133
142
|
try {
|
|
134
143
|
await ensureDir(notesDir);
|
|
135
144
|
const files = await fs.readdir(notesDir);
|
|
@@ -153,7 +162,8 @@ export async function readAllNotes() {
|
|
|
153
162
|
* Delete a note by ID
|
|
154
163
|
*/
|
|
155
164
|
export async function deleteNote(id) {
|
|
156
|
-
const
|
|
165
|
+
const { notesDir } = await resolveStorageContext();
|
|
166
|
+
const filePath = path.join(notesDir, `${id}.md`);
|
|
157
167
|
try {
|
|
158
168
|
await fs.unlink(filePath);
|
|
159
169
|
return true;
|
package/build/core/notes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notes.js","sourceRoot":"","sources":["../../src/core/notes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"notes.js","sourceRoot":"","sources":["../../src/core/notes.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
File without changes
|
|
@@ -6,14 +6,27 @@ const BASE_MEMORY_PROMPT = `
|
|
|
6
6
|
|
|
7
7
|
You have access to a persistent memory system (Mnemo). Use it to retain important information across conversations.
|
|
8
8
|
|
|
9
|
+
Mnemo is not a full transcript archive. It is a system for preserving high-value long-term context across conversations.
|
|
10
|
+
|
|
9
11
|
### When to save memory (memory_save):
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
12
|
+
- Save only high-value long-term context, not temporary details or full conversation logs
|
|
13
|
+
- Save when the user expresses a stable preference, working style, boundary, or requirement → type: preference
|
|
14
|
+
- Save when a decision is clearly made and will affect future work → type: decision
|
|
15
|
+
- Save when a long-term goal or direction is clarified → type: goal
|
|
16
|
+
- Save when an important continuity thread is opened that must be resumed later → type: continuity
|
|
17
|
+
- Save when a reusable rule or workflow convention is established → type: rule
|
|
18
|
+
- Save stable background information about the user, project, or topic → type: profile or fact
|
|
19
|
+
- Save a validated high-value experience only when it is likely to matter again across future conversations → type: experience
|
|
20
|
+
|
|
21
|
+
### When to initialize memory (memory_setup):
|
|
22
|
+
- When Mnemo has not been initialized yet and a memory tool reports that setup is required
|
|
23
|
+
- When the user asks to enable, configure, or set up Mnemo memory management
|
|
24
|
+
- Default to global scope for shared cross-project memory
|
|
25
|
+
- Use project scope only when the user explicitly wants isolated per-project memory
|
|
14
26
|
|
|
15
27
|
### When to search memory (memory_search):
|
|
16
28
|
- At the START of each conversation, search for relevant context based on the user's first message
|
|
29
|
+
- Search before doing major work on an ongoing topic, project, or long-running discussion
|
|
17
30
|
- When the user references past discussions or decisions
|
|
18
31
|
- When you need background context for a task
|
|
19
32
|
- When the user asks "do you remember..." or similar
|
|
@@ -29,10 +42,16 @@ You have access to a persistent memory system (Mnemo). Use it to retain importan
|
|
|
29
42
|
- When explicitly asked to organize or clean up memories
|
|
30
43
|
- Periodically during long conversations
|
|
31
44
|
- After context compaction or context window reset — when resuming from a compacted context, check if memories need consolidation before continuing work
|
|
45
|
+
- When a continuity thread has turned into a clear decision, rule, or fact and older notes should be consolidated
|
|
32
46
|
- Workflow: call memory_compress to get all notes → distill them into fewer, concise notes → call memory_compress_apply with the distilled notes and old IDs to atomically save new + delete old
|
|
33
47
|
|
|
34
48
|
### Guidelines:
|
|
49
|
+
- Prefer this order: memory_search -> do the work -> memory_save -> memory_compress when needed
|
|
50
|
+
- Before saving, verify the information meets at least 2 of these 3 criteria: (1) useful across future sessions, (2) affects future work or decisions, (3) would require re-alignment if forgotten
|
|
51
|
+
- Before saving new content, check if a similar memory already exists. Prefer updating or replacing existing memories over creating duplicates.
|
|
52
|
+
- **Always specify a type when saving.** Determine the type first (preference, profile, goal, continuity, fact, decision, rule, or experience), then call memory_save with the type parameter. Saving without a type defeats the purpose of organized long-term memory.
|
|
35
53
|
- Save memories in concise, distilled form - capture the essence, not raw conversation
|
|
54
|
+
- Do not save routine task state, ordinary command output, or one-off debugging noise
|
|
36
55
|
- Use descriptive tags to categorize memories
|
|
37
56
|
- Always include relevant project/topic context in the memory content
|
|
38
57
|
- Do not save trivial or temporary information
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/prompts/templates.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,kBAAkB,GAAG
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/prompts/templates.ts"],"names":[],"mappings":"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"}
|
package/build/tools/compress.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { readAllNotes, saveNote, deleteNotes, getNoteStats } from '../core/notes.js';
|
|
3
3
|
import { indexNote, removeMultipleFromIndex } from '../core/embedding.js';
|
|
4
|
+
import { MEMORY_TYPES } from '../core/config.js';
|
|
4
5
|
/**
|
|
5
6
|
* Register the memory_compress tool
|
|
6
7
|
*/
|
|
7
8
|
export function registerCompressTool(server) {
|
|
8
9
|
server.registerTool('memory_compress', {
|
|
9
10
|
title: 'Compress Memory',
|
|
10
|
-
description: 'Consolidate and compress existing
|
|
11
|
+
description: 'Consolidate and compress existing long-term memories. This tool reads current notes, asks you to distill them into fewer and clearer memories, and helps keep the knowledge base focused on durable high-value context instead of fragmented history.',
|
|
11
12
|
inputSchema: {
|
|
12
13
|
strategy: z
|
|
13
14
|
.enum(['review', 'auto_tag'])
|
|
@@ -75,7 +76,7 @@ export function registerCompressTool(server) {
|
|
|
75
76
|
}
|
|
76
77
|
// Strategy: review - return all notes for LLM to distill
|
|
77
78
|
const notesText = targetNotes
|
|
78
|
-
.map((n) => `[ID: ${n.meta.id}] [Tags: ${n.meta.tags.join(', ')}] [Created: ${n.meta.created}]\n${n.content}`)
|
|
79
|
+
.map((n) => `[ID: ${n.meta.id}]${n.meta.type ? ` [Type: ${n.meta.type}]` : ''} [Tags: ${n.meta.tags.join(', ')}] [Created: ${n.meta.created}]\n${n.content}`)
|
|
79
80
|
.join('\n\n---\n\n');
|
|
80
81
|
const noteIds = targetNotes.map((n) => n.meta.id);
|
|
81
82
|
return {
|
|
@@ -142,6 +143,7 @@ export function registerCompressTool(server) {
|
|
|
142
143
|
.array(z.object({
|
|
143
144
|
content: z.string().describe('The distilled note content'),
|
|
144
145
|
tags: z.array(z.string()).optional().describe('Tags for this note'),
|
|
146
|
+
type: z.enum(MEMORY_TYPES).optional().describe('Memory type classification for this note'),
|
|
145
147
|
}))
|
|
146
148
|
.describe('Array of distilled notes to save'),
|
|
147
149
|
old_ids: z
|
|
@@ -154,7 +156,7 @@ export function registerCompressTool(server) {
|
|
|
154
156
|
// Step 1: Save all new notes
|
|
155
157
|
const savedNotes = [];
|
|
156
158
|
for (const n of notes) {
|
|
157
|
-
const saved = await saveNote(n.content, n.tags || [], source || 'unknown');
|
|
159
|
+
const saved = await saveNote(n.content, n.tags || [], source || 'unknown', n.type);
|
|
158
160
|
savedNotes.push(saved);
|
|
159
161
|
}
|
|
160
162
|
// Step 2: Index new notes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compress.js","sourceRoot":"","sources":["../../src/tools/compress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"compress.js","sourceRoot":"","sources":["../../src/tools/compress.ts"],"names":[],"mappings":"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"}
|
package/build/tools/get.js
CHANGED
|
@@ -23,6 +23,7 @@ export function registerGetTool(server) {
|
|
|
23
23
|
tags: note.meta.tags,
|
|
24
24
|
source: note.meta.source,
|
|
25
25
|
created: note.meta.created,
|
|
26
|
+
type: note.meta.type,
|
|
26
27
|
});
|
|
27
28
|
}
|
|
28
29
|
else {
|
|
@@ -42,6 +43,7 @@ export function registerGetTool(server) {
|
|
|
42
43
|
const output = results
|
|
43
44
|
.map((r, i) => `### Memory ${i + 1}\n` +
|
|
44
45
|
`- **ID:** ${r.id}\n` +
|
|
46
|
+
(r.type ? `- **Type:** ${r.type}\n` : '') +
|
|
45
47
|
`- **Tags:** [${r.tags.join(', ')}]\n` +
|
|
46
48
|
`- **Source:** ${r.source}\n` +
|
|
47
49
|
`- **Created:** ${r.created}\n\n` +
|
package/build/tools/get.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC7C,MAAM,CAAC,YAAY,CACf,YAAY,EACZ;QACI,KAAK,EAAE,YAAY;QACnB,WAAW,EACP,oJAAoJ;QACxJ,WAAW,EAAE;YACT,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC;SACzG;KACJ,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QACd,IAAI,CAAC;YACD,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"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"}
|
package/build/tools/save.js
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { saveNote, getNoteStats } from '../core/notes.js';
|
|
3
3
|
import { indexNote } from '../core/embedding.js';
|
|
4
|
-
import { COMPRESS_THRESHOLDS } from '../core/config.js';
|
|
4
|
+
import { COMPRESS_THRESHOLDS, MEMORY_TYPES } from '../core/config.js';
|
|
5
5
|
/**
|
|
6
6
|
* Register the memory_save tool
|
|
7
7
|
*/
|
|
8
8
|
export function registerSaveTool(server) {
|
|
9
9
|
server.registerTool('memory_save', {
|
|
10
10
|
title: 'Save Memory',
|
|
11
|
-
description: 'Save a piece of
|
|
11
|
+
description: 'Save a piece of high-value long-term context as a persistent memory note. Use this for stable preferences, important decisions, long-term goals, reusable rules, or continuity that should matter across future conversations. Content should be distilled and concise, not raw conversation.',
|
|
12
12
|
inputSchema: {
|
|
13
13
|
content: z
|
|
14
14
|
.string()
|
|
15
|
-
.describe('The
|
|
15
|
+
.describe('The long-term context to save. It should capture the durable essence of what should still matter in future conversations.'),
|
|
16
|
+
type: z
|
|
17
|
+
.enum(MEMORY_TYPES)
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Memory type classification. Helps organize and retrieve memories. Options: preference (user preferences/habits), profile (stable background info), goal (long-term directions), continuity (unresolved threads to resume), fact (stable objective info), decision (confirmed choices), rule (reusable conventions), experience (validated reusable lessons).'),
|
|
16
20
|
tags: z
|
|
17
21
|
.array(z.string())
|
|
18
22
|
.optional()
|
|
@@ -22,10 +26,10 @@ export function registerSaveTool(server) {
|
|
|
22
26
|
.optional()
|
|
23
27
|
.describe("Source identifier, e.g., 'opencode', 'claude-code'. Defaults to 'unknown'."),
|
|
24
28
|
},
|
|
25
|
-
}, async ({ content, tags, source }) => {
|
|
29
|
+
}, async ({ content, type, tags, source }) => {
|
|
26
30
|
try {
|
|
27
31
|
// Save the note to disk first (fast, reliable)
|
|
28
|
-
const note = await saveNote(content, tags || [], source || 'unknown');
|
|
32
|
+
const note = await saveNote(content, tags || [], source || 'unknown', type);
|
|
29
33
|
// Try to index for semantic search (may be slow on first call)
|
|
30
34
|
let indexWarning = '';
|
|
31
35
|
try {
|
|
@@ -36,17 +40,24 @@ export function registerSaveTool(server) {
|
|
|
36
40
|
indexWarning = `\n\nWarning: Memory saved to disk but semantic indexing failed (${reason}). The note will be available via memory_search after the embedding model finishes loading.`;
|
|
37
41
|
console.error('Mnemo: indexing failed for note', note.meta.id, reason);
|
|
38
42
|
}
|
|
43
|
+
// Soft hint if type was not specified
|
|
44
|
+
let typeHint = '';
|
|
45
|
+
if (!type) {
|
|
46
|
+
typeHint =
|
|
47
|
+
'\n\nHint: Consider specifying a memory type (preference, profile, goal, continuity, fact, decision, rule, experience) for better organization and retrieval.';
|
|
48
|
+
}
|
|
39
49
|
// Check if compression might be needed (program-level guardrail)
|
|
40
50
|
const stats = await getNoteStats();
|
|
41
51
|
let compressHint = '';
|
|
42
52
|
if (stats.count > COMPRESS_THRESHOLDS.maxNotes || stats.totalSize > COMPRESS_THRESHOLDS.maxTotalSize) {
|
|
43
53
|
compressHint = `\n\nNote: Memory storage is growing large (${stats.count} notes, ${Math.round(stats.totalSize / 1000)}KB). Consider running memory_compress to consolidate and distill older memories.`;
|
|
44
54
|
}
|
|
55
|
+
const typeLine = note.meta.type ? `\nType: ${note.meta.type}` : '';
|
|
45
56
|
return {
|
|
46
57
|
content: [
|
|
47
58
|
{
|
|
48
59
|
type: 'text',
|
|
49
|
-
text: `Memory saved successfully.\n\nID: ${note.meta.id}\nTags: [${note.meta.tags.join(', ')}]${indexWarning}${compressHint}`,
|
|
60
|
+
text: `Memory saved successfully.\n\nID: ${note.meta.id}${typeLine}\nTags: [${note.meta.tags.join(', ')}]${indexWarning}${typeHint}${compressHint}`,
|
|
50
61
|
},
|
|
51
62
|
],
|
|
52
63
|
};
|
package/build/tools/save.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/tools/save.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAoB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/tools/save.ts"],"names":[],"mappings":"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"}
|
package/build/tools/search.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { searchNotes } from '../core/embedding.js';
|
|
3
|
+
import { MEMORY_TYPES } from '../core/config.js';
|
|
3
4
|
/**
|
|
4
5
|
* Extract a summary from note content: first line, or first ~200 chars.
|
|
5
6
|
*/
|
|
@@ -15,7 +16,7 @@ export function extractSummary(content, maxLen = 200) {
|
|
|
15
16
|
export function registerSearchTool(server) {
|
|
16
17
|
server.registerTool('memory_search', {
|
|
17
18
|
title: 'Search Memory',
|
|
18
|
-
description: 'Search through persistent
|
|
19
|
+
description: 'Search through persistent high-value long-term context using semantic similarity. Returns summaries of matching memories so you can recover relevant background before continuing work.',
|
|
19
20
|
inputSchema: {
|
|
20
21
|
query: z
|
|
21
22
|
.string()
|
|
@@ -36,11 +37,16 @@ export function registerSearchTool(server) {
|
|
|
36
37
|
.array(z.string())
|
|
37
38
|
.optional()
|
|
38
39
|
.describe('Filter results to only include notes that have ALL of the specified tags. E.g., ["architecture", "decision"]'),
|
|
40
|
+
type_filter: z
|
|
41
|
+
.enum(MEMORY_TYPES)
|
|
42
|
+
.optional()
|
|
43
|
+
.describe('Filter results to only include notes of a specific memory type. E.g., "decision", "rule", "continuity".'),
|
|
39
44
|
},
|
|
40
|
-
}, async ({ query, top_k, source_filter, tag_filter }) => {
|
|
45
|
+
}, async ({ query, top_k, source_filter, tag_filter, type_filter }) => {
|
|
41
46
|
try {
|
|
42
|
-
// When tag_filter is used, fetch more results to compensate for post-filtering
|
|
43
|
-
const
|
|
47
|
+
// When tag_filter or type_filter is used, fetch more results to compensate for post-filtering
|
|
48
|
+
const hasPostFilter = (tag_filter && tag_filter.length > 0) || type_filter;
|
|
49
|
+
const fetchK = hasPostFilter ? (top_k || 5) * 3 : top_k || 5;
|
|
44
50
|
let results = await searchNotes(query, fetchK, source_filter);
|
|
45
51
|
// Post-filter by tags if specified
|
|
46
52
|
if (tag_filter && tag_filter.length > 0) {
|
|
@@ -50,6 +56,11 @@ export function registerSearchTool(server) {
|
|
|
50
56
|
});
|
|
51
57
|
results = results.slice(0, top_k || 5);
|
|
52
58
|
}
|
|
59
|
+
// Post-filter by type if specified
|
|
60
|
+
if (type_filter) {
|
|
61
|
+
results = results.filter((r) => r.type === type_filter);
|
|
62
|
+
results = results.slice(0, top_k || 5);
|
|
63
|
+
}
|
|
53
64
|
if (results.length === 0) {
|
|
54
65
|
return {
|
|
55
66
|
content: [
|
|
@@ -64,6 +75,7 @@ export function registerSearchTool(server) {
|
|
|
64
75
|
const output = results
|
|
65
76
|
.map((r, i) => `### Memory ${i + 1} (relevance: ${(r.score * 100).toFixed(1)}%)\n` +
|
|
66
77
|
`- **ID:** ${r.id}\n` +
|
|
78
|
+
(r.type ? `- **Type:** ${r.type}\n` : '') +
|
|
67
79
|
`- **Tags:** [${r.tags}]\n` +
|
|
68
80
|
`- **Source:** ${r.source}\n` +
|
|
69
81
|
`- **Created:** ${r.created}\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAoB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
package/build/tools/setup.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { execFile } from 'node:child_process';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
3
6
|
import { z } from 'zod';
|
|
4
|
-
import { AGENT_TYPES } from '../core/config.js';
|
|
7
|
+
import { AGENT_TYPES, writeStorageConfig } from '../core/config.js';
|
|
5
8
|
import { getAgentConfig, injectPrompt, hasPromptInjected } from '../prompts/templates.js';
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
const PROJECT_ROOT_MARKERS = ['.git', 'package.json', 'pyproject.toml', 'Cargo.toml', 'go.mod'];
|
|
6
11
|
/**
|
|
7
12
|
* Detect which agent tool is being used by checking config file existence
|
|
8
13
|
*/
|
|
@@ -40,6 +45,53 @@ async function detectAgentType(cwd) {
|
|
|
40
45
|
}
|
|
41
46
|
return null;
|
|
42
47
|
}
|
|
48
|
+
async function pathExists(targetPath) {
|
|
49
|
+
try {
|
|
50
|
+
await fs.access(targetPath);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function detectGitRoot(cwd) {
|
|
58
|
+
try {
|
|
59
|
+
const { stdout } = await execFileAsync('git', ['rev-parse', '--show-toplevel'], { cwd });
|
|
60
|
+
return stdout.trim() || null;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function findProjectRootFromMarkers(startDir) {
|
|
67
|
+
let current = path.resolve(startDir);
|
|
68
|
+
while (true) {
|
|
69
|
+
for (const marker of PROJECT_ROOT_MARKERS) {
|
|
70
|
+
if (await pathExists(path.join(current, marker))) {
|
|
71
|
+
return current;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const parent = path.dirname(current);
|
|
75
|
+
if (parent === current) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
current = parent;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function resolveProjectRoot(cwd, explicitProjectRoot) {
|
|
82
|
+
if (explicitProjectRoot) {
|
|
83
|
+
return path.resolve(explicitProjectRoot);
|
|
84
|
+
}
|
|
85
|
+
const gitRoot = await detectGitRoot(cwd);
|
|
86
|
+
if (gitRoot) {
|
|
87
|
+
return gitRoot;
|
|
88
|
+
}
|
|
89
|
+
const markerRoot = await findProjectRootFromMarkers(cwd);
|
|
90
|
+
if (markerRoot) {
|
|
91
|
+
return markerRoot;
|
|
92
|
+
}
|
|
93
|
+
return path.resolve(cwd);
|
|
94
|
+
}
|
|
43
95
|
/**
|
|
44
96
|
* Register the memory_setup tool
|
|
45
97
|
*/
|
|
@@ -54,10 +106,14 @@ export function registerSetupTool(server) {
|
|
|
54
106
|
.describe('Agent tool type. If not specified, will try to auto-detect. Valid values: opencode, claude-code, openclaw, codex'),
|
|
55
107
|
scope: z
|
|
56
108
|
.enum(['project', 'global'])
|
|
57
|
-
.default('
|
|
58
|
-
.describe("
|
|
109
|
+
.default('global')
|
|
110
|
+
.describe("Initialization scope. 'global' writes user-level config and uses shared global storage; 'project' writes project config and enables project-isolated storage."),
|
|
111
|
+
project_root: z
|
|
112
|
+
.string()
|
|
113
|
+
.optional()
|
|
114
|
+
.describe('Explicit project root path. Used only when scope is project; overrides auto-detection.'),
|
|
59
115
|
},
|
|
60
|
-
}, async ({ agent_type, scope }) => {
|
|
116
|
+
}, async ({ agent_type, scope, project_root }) => {
|
|
61
117
|
const cwd = process.cwd();
|
|
62
118
|
const home = os.homedir();
|
|
63
119
|
// Determine agent type
|
|
@@ -78,7 +134,10 @@ export function registerSetupTool(server) {
|
|
|
78
134
|
agentType = detected;
|
|
79
135
|
}
|
|
80
136
|
const config = getAgentConfig(agentType);
|
|
81
|
-
const
|
|
137
|
+
const projectRoot = scope === 'project' ? await resolveProjectRoot(cwd, project_root) : null;
|
|
138
|
+
const targetPath = scope === 'global' ? config.globalPath(home) : config.projectPath(projectRoot);
|
|
139
|
+
const storageConfigPath = await writeStorageConfig(scope, projectRoot || undefined);
|
|
140
|
+
const storagePath = scope === 'global' ? path.dirname(storageConfigPath) : path.join(projectRoot, '.mnemo');
|
|
82
141
|
// Read existing content or start fresh
|
|
83
142
|
let existingContent = '';
|
|
84
143
|
try {
|
|
@@ -96,7 +155,7 @@ export function registerSetupTool(server) {
|
|
|
96
155
|
content: [
|
|
97
156
|
{
|
|
98
157
|
type: 'text',
|
|
99
|
-
text: `Mnemo memory instructions updated
|
|
158
|
+
text: `Mnemo memory instructions updated successfully.\n\nAgent type: ${agentType}\nPrompt scope: ${scope}\nPrompt file: ${targetPath}\nStorage scope: ${scope}\nStorage path: ${storagePath}`,
|
|
100
159
|
},
|
|
101
160
|
],
|
|
102
161
|
};
|
|
@@ -111,7 +170,7 @@ export function registerSetupTool(server) {
|
|
|
111
170
|
content: [
|
|
112
171
|
{
|
|
113
172
|
type: 'text',
|
|
114
|
-
text: `Mnemo memory management initialized successfully.\n\nAgent type: ${agentType}\
|
|
173
|
+
text: `Mnemo memory management initialized successfully.\n\nAgent type: ${agentType}\nPrompt scope: ${scope}\nPrompt file: ${targetPath}\nStorage scope: ${scope}\nStorage path: ${storagePath}\n\nMnemo is now ready to use.`,
|
|
115
174
|
},
|
|
116
175
|
],
|
|
117
176
|
};
|
package/build/tools/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/tools/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/tools/setup.ts"],"names":[],"mappings":"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"}
|