@ccjr1120/memory-one 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,342 @@
1
+ import Database from "better-sqlite3";
2
+ import { mkdirSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ import { createHash, randomBytes, randomUUID } from "node:crypto";
5
+ const now = () => new Date().toISOString();
6
+ export class MemoryStore {
7
+ db;
8
+ constructor(path = process.env.MEMORY_DB_PATH ?? "data/memory.db") {
9
+ mkdirSync(dirname(path), { recursive: true });
10
+ this.db = new Database(path);
11
+ this.db.pragma("journal_mode = WAL");
12
+ this.db.pragma("busy_timeout = 5000");
13
+ this.db.exec(`
14
+ CREATE TABLE IF NOT EXISTS memories (
15
+ id TEXT PRIMARY KEY,
16
+ content TEXT NOT NULL,
17
+ kind TEXT NOT NULL DEFAULT 'fact',
18
+ scope TEXT NOT NULL DEFAULT 'user',
19
+ project TEXT,
20
+ session_id TEXT,
21
+ source TEXT,
22
+ occurred_at TEXT,
23
+ confidence REAL NOT NULL DEFAULT 1.0,
24
+ importance REAL NOT NULL DEFAULT 0.5,
25
+ metadata_json TEXT NOT NULL DEFAULT '{}',
26
+ embedding BLOB,
27
+ created_at TEXT NOT NULL,
28
+ updated_at TEXT NOT NULL,
29
+ deleted_at TEXT,
30
+ recall_count INTEGER NOT NULL DEFAULT 0,
31
+ last_recalled_at TEXT
32
+ );
33
+ CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope, project);
34
+ CREATE INDEX IF NOT EXISTS idx_memories_session ON memories(session_id);
35
+ CREATE INDEX IF NOT EXISTS idx_memories_occurred ON memories(occurred_at);
36
+ CREATE TABLE IF NOT EXISTS mcp_tool_calls (
37
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
38
+ tool_name TEXT NOT NULL,
39
+ success INTEGER NOT NULL,
40
+ duration_ms REAL NOT NULL,
41
+ called_at TEXT NOT NULL
42
+ );
43
+ CREATE INDEX IF NOT EXISTS idx_mcp_tool_calls_tool ON mcp_tool_calls(tool_name);
44
+ CREATE INDEX IF NOT EXISTS idx_mcp_tool_calls_called_at ON mcp_tool_calls(called_at);
45
+ CREATE TABLE IF NOT EXISTS mcp_keys (
46
+ id TEXT PRIMARY KEY,
47
+ name TEXT NOT NULL,
48
+ prefix TEXT NOT NULL,
49
+ key_hash TEXT NOT NULL UNIQUE,
50
+ allowed_tools_json TEXT NOT NULL DEFAULT '[]',
51
+ is_default INTEGER NOT NULL DEFAULT 0,
52
+ created_at TEXT NOT NULL,
53
+ last_used_at TEXT,
54
+ revoked_at TEXT
55
+ );
56
+ CREATE TABLE IF NOT EXISTS agent_config (
57
+ id INTEGER PRIMARY KEY CHECK (id = 1),
58
+ name TEXT NOT NULL DEFAULT '记忆管家',
59
+ scope TEXT NOT NULL DEFAULT '',
60
+ provider TEXT NOT NULL DEFAULT '',
61
+ model TEXT NOT NULL DEFAULT '',
62
+ base_url TEXT NOT NULL DEFAULT '',
63
+ api_key TEXT NOT NULL DEFAULT '',
64
+ auto_context INTEGER NOT NULL DEFAULT 1,
65
+ updated_at TEXT
66
+ );
67
+ CREATE TABLE IF NOT EXISTS agent_messages (
68
+ id TEXT PRIMARY KEY,
69
+ role TEXT NOT NULL CHECK (role IN ('user', 'assistant')),
70
+ content TEXT NOT NULL DEFAULT '',
71
+ tool_calls_json TEXT NOT NULL DEFAULT '[]',
72
+ created_at TEXT NOT NULL,
73
+ updated_at TEXT NOT NULL
74
+ );
75
+ CREATE INDEX IF NOT EXISTS idx_agent_messages_created ON agent_messages(created_at);
76
+ CREATE TABLE IF NOT EXISTS mcp_config (
77
+ id INTEGER PRIMARY KEY CHECK (id = 1),
78
+ use_bearer_key INTEGER NOT NULL DEFAULT 1,
79
+ updated_at TEXT
80
+ );
81
+ CREATE INDEX IF NOT EXISTS idx_mcp_keys_active ON mcp_keys(revoked_at);
82
+ CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
83
+ content, kind, scope, project, source, content='memories', content_rowid='rowid'
84
+ );
85
+ CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
86
+ INSERT INTO memories_fts(rowid, content, kind, scope, project, source)
87
+ VALUES (new.rowid, new.content, new.kind, new.scope, new.project, new.source);
88
+ END;
89
+ CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
90
+ INSERT INTO memories_fts(memories_fts, rowid, content, kind, scope, project, source)
91
+ VALUES ('delete', old.rowid, old.content, old.kind, old.scope, old.project, old.source);
92
+ END;
93
+ CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
94
+ INSERT INTO memories_fts(memories_fts, rowid, content, kind, scope, project, source)
95
+ VALUES ('delete', old.rowid, old.content, old.kind, old.scope, old.project, old.source);
96
+ INSERT INTO memories_fts(rowid, content, kind, scope, project, source)
97
+ VALUES (new.rowid, new.content, new.kind, new.scope, new.project, new.source);
98
+ END;
99
+ `);
100
+ const columns = this.db.prepare("PRAGMA table_info(memories)").all();
101
+ if (!columns.some((column) => column.name === "recall_count"))
102
+ this.db.exec("ALTER TABLE memories ADD COLUMN recall_count INTEGER NOT NULL DEFAULT 0");
103
+ if (!columns.some((column) => column.name === "last_recalled_at"))
104
+ this.db.exec("ALTER TABLE memories ADD COLUMN last_recalled_at TEXT");
105
+ const keyColumns = this.db.prepare("PRAGMA table_info(mcp_keys)").all();
106
+ if (!keyColumns.some((column) => column.name === "is_default"))
107
+ this.db.exec("ALTER TABLE mcp_keys ADD COLUMN is_default INTEGER NOT NULL DEFAULT 0");
108
+ if (!keyColumns.some((column) => column.name === "secret"))
109
+ this.db.exec("ALTER TABLE mcp_keys ADD COLUMN secret TEXT");
110
+ this.rebuildFtsIfNeeded();
111
+ }
112
+ listAgentMessages(limit = 200) {
113
+ return this.db.prepare("SELECT id, role, content, tool_calls_json, created_at, updated_at FROM agent_messages ORDER BY created_at ASC LIMIT ?").all(Math.min(Math.max(limit, 1), 1000)).map((row) => ({
114
+ id: String(row.id), role: row.role, content: String(row.content ?? ""), toolCalls: JSON.parse(String(row.tool_calls_json ?? "[]")), created_at: String(row.created_at), updated_at: String(row.updated_at),
115
+ }));
116
+ }
117
+ saveAgentMessage(message) {
118
+ const timestamp = now();
119
+ this.db.prepare(`INSERT INTO agent_messages (id, role, content, tool_calls_json, created_at, updated_at) VALUES (@id, @role, @content, @tool_calls_json, @created_at, @updated_at)
120
+ ON CONFLICT(id) DO UPDATE SET content = excluded.content, tool_calls_json = excluded.tool_calls_json, updated_at = excluded.updated_at`).run({ id: message.id, role: message.role, content: message.content, tool_calls_json: JSON.stringify(message.toolCalls ?? []), created_at: timestamp, updated_at: timestamp });
121
+ return this.listAgentMessages(1000).find((item) => item.id === message.id);
122
+ }
123
+ rebuildFtsIfNeeded() {
124
+ const count = this.db.prepare("SELECT count(*) AS count FROM memories_fts").get();
125
+ const memories = this.db.prepare("SELECT count(*) AS count FROM memories").get();
126
+ if (count.count !== memories.count)
127
+ this.db.exec("INSERT INTO memories_fts(memories_fts) VALUES ('rebuild')");
128
+ }
129
+ decode(row) {
130
+ const { metadata_json, ...rest } = row;
131
+ return { ...rest, metadata: JSON.parse(String(metadata_json ?? "{}")) };
132
+ }
133
+ create(input) {
134
+ const id = input.id ?? randomUUID();
135
+ const timestamp = now();
136
+ this.db.prepare(`INSERT INTO memories
137
+ (id, content, kind, scope, project, session_id, source, occurred_at, confidence, importance, metadata_json, created_at, updated_at)
138
+ VALUES (@id, @content, @kind, @scope, @project, @session_id, @source, @occurred_at, @confidence, @importance, @metadata_json, @created_at, @updated_at)`)
139
+ .run({
140
+ id, content: input.content, kind: input.kind ?? "fact", scope: input.scope ?? "user",
141
+ project: input.project ?? null, session_id: input.session_id ?? null, source: input.source ?? null,
142
+ occurred_at: input.occurred_at ?? null, confidence: input.confidence ?? 1.0, importance: input.importance ?? 0.5,
143
+ metadata_json: JSON.stringify(input.metadata ?? {}), created_at: timestamp, updated_at: timestamp,
144
+ });
145
+ return this.get(id);
146
+ }
147
+ get(id) {
148
+ const row = this.db.prepare("SELECT * FROM memories WHERE id = ? AND deleted_at IS NULL").get(id);
149
+ return row ? this.decode(row) : null;
150
+ }
151
+ list(scope = "user", project = null, limit = 50) {
152
+ const rows = project
153
+ ? this.db.prepare("SELECT * FROM memories WHERE scope = ? AND project = ? AND deleted_at IS NULL ORDER BY COALESCE(occurred_at, created_at) DESC LIMIT ?").all(scope, project, Math.min(Math.max(limit, 1), 200))
154
+ : this.db.prepare("SELECT * FROM memories WHERE scope = ? AND deleted_at IS NULL ORDER BY COALESCE(occurred_at, created_at) DESC LIMIT ?").all(scope, Math.min(Math.max(limit, 1), 200));
155
+ return rows.map((row) => this.decode(row));
156
+ }
157
+ search(query, scope = "user", project = null, limit = 20) {
158
+ const max = Math.min(Math.max(limit, 1), 100);
159
+ let rows = [];
160
+ try {
161
+ rows = (project
162
+ ? this.db.prepare("SELECT m.*, bm25(memories_fts) AS score FROM memories_fts JOIN memories m ON m.rowid = memories_fts.rowid WHERE memories_fts MATCH ? AND m.scope = ? AND m.project = ? AND m.deleted_at IS NULL ORDER BY score LIMIT ?").all(query, scope, project, max)
163
+ : this.db.prepare("SELECT m.*, bm25(memories_fts) AS score FROM memories_fts JOIN memories m ON m.rowid = memories_fts.rowid WHERE memories_fts MATCH ? AND m.scope = ? AND m.deleted_at IS NULL ORDER BY score LIMIT ?").all(query, scope, max));
164
+ }
165
+ catch {
166
+ // FTS5 treats punctuation as query syntax; use the substring path for invalid expressions.
167
+ rows = [];
168
+ }
169
+ if (!rows.length) {
170
+ rows = project
171
+ ? this.db.prepare("SELECT * FROM memories WHERE content LIKE ? AND scope = ? AND project = ? AND deleted_at IS NULL ORDER BY COALESCE(occurred_at, created_at) DESC LIMIT ?").all(`%${query}%`, scope, project, max)
172
+ : this.db.prepare("SELECT * FROM memories WHERE content LIKE ? AND scope = ? AND deleted_at IS NULL ORDER BY COALESCE(occurred_at, created_at) DESC LIMIT ?").all(`%${query}%`, scope, max);
173
+ }
174
+ return rows.map((row) => this.decode(row));
175
+ }
176
+ context(query, scope = "user", project = null, limit = 10) {
177
+ const max = Math.min(Math.max(limit, 1), 100);
178
+ const projectFilter = project ? "(m.project = @project OR m.project IS NULL)" : "m.project IS NULL";
179
+ const params = { query, scope, project, limit: max };
180
+ let rows = [];
181
+ if (query) {
182
+ try {
183
+ rows = this.db.prepare(`SELECT m.*, bm25(memories_fts) AS score
184
+ FROM memories_fts JOIN memories m ON m.rowid = memories_fts.rowid
185
+ WHERE memories_fts MATCH @query AND m.scope = @scope AND ${projectFilter} AND m.deleted_at IS NULL
186
+ ORDER BY CASE WHEN m.project = @project THEN 0 ELSE 1 END, score LIMIT @limit`).all(params);
187
+ }
188
+ catch {
189
+ rows = [];
190
+ }
191
+ if (!rows.length) {
192
+ rows = this.db.prepare(`SELECT m.* FROM memories m
193
+ WHERE m.content LIKE @pattern AND m.scope = @scope AND ${projectFilter} AND m.deleted_at IS NULL
194
+ ORDER BY CASE WHEN m.project = @project THEN 0 ELSE 1 END, COALESCE(m.occurred_at, m.created_at) DESC LIMIT @limit`)
195
+ .all({ ...params, pattern: `%${query}%` });
196
+ }
197
+ }
198
+ else {
199
+ rows = this.db.prepare(`SELECT m.* FROM memories m
200
+ WHERE m.scope = @scope AND ${projectFilter} AND m.deleted_at IS NULL
201
+ ORDER BY CASE WHEN m.project = @project THEN 0 ELSE 1 END, COALESCE(m.occurred_at, m.created_at) DESC LIMIT @limit`).all(params);
202
+ }
203
+ return rows.map((row) => this.decode(row));
204
+ }
205
+ recordRecalls(memories) {
206
+ if (!memories.length)
207
+ return memories;
208
+ const timestamp = now();
209
+ const update = this.db.prepare("UPDATE memories SET recall_count = recall_count + 1, last_recalled_at = ? WHERE id = ? AND deleted_at IS NULL");
210
+ const ids = [...new Set(memories.map((memory) => memory.id))];
211
+ this.db.transaction(() => { for (const id of ids)
212
+ update.run(timestamp, id); })();
213
+ return memories.map((memory) => ({ ...memory, recall_count: (memory.recall_count ?? 0) + 1, last_recalled_at: timestamp }));
214
+ }
215
+ mostRecalled(scope = "user", project = null, limit = 5) {
216
+ const max = Math.min(Math.max(limit, 1), 50);
217
+ const rows = project
218
+ ? this.db.prepare("SELECT * FROM memories WHERE scope = ? AND project = ? AND deleted_at IS NULL ORDER BY recall_count DESC, last_recalled_at DESC, created_at DESC LIMIT ?").all(scope, project, max)
219
+ : this.db.prepare("SELECT * FROM memories WHERE scope = ? AND deleted_at IS NULL ORDER BY recall_count DESC, last_recalled_at DESC, created_at DESC LIMIT ?").all(scope, max);
220
+ return rows.map((row) => this.decode(row));
221
+ }
222
+ update(id, patch) {
223
+ const allowed = ["content", "kind", "scope", "project", "session_id", "source", "occurred_at", "confidence", "importance"];
224
+ const values = {};
225
+ for (const key of allowed)
226
+ if (key in patch)
227
+ values[key] = patch[key];
228
+ if ("metadata" in patch)
229
+ values.metadata_json = JSON.stringify(patch.metadata ?? {});
230
+ const entries = Object.entries(values);
231
+ if (!entries.length)
232
+ return this.get(id);
233
+ values.updated_at = now();
234
+ this.db.prepare(`UPDATE memories SET ${Object.keys(values).map((key) => `${key} = @${key}`).join(", ")} WHERE id = @id AND deleted_at IS NULL`).run({ ...values, id });
235
+ return this.get(id);
236
+ }
237
+ delete(id) {
238
+ const result = this.db.prepare("UPDATE memories SET deleted_at = ?, updated_at = ? WHERE id = ? AND deleted_at IS NULL").run(now(), now(), id);
239
+ return result.changes > 0;
240
+ }
241
+ recordToolCall(toolName, success, durationMs) {
242
+ this.db.prepare("INSERT INTO mcp_tool_calls (tool_name, success, duration_ms, called_at) VALUES (?, ?, ?, ?)")
243
+ .run(toolName, success ? 1 : 0, durationMs, now());
244
+ }
245
+ getToolStats() {
246
+ const totals = this.db.prepare(`SELECT
247
+ count(*) AS total_calls,
248
+ coalesce(sum(success), 0) AS successful_calls,
249
+ count(*) - coalesce(sum(success), 0) AS failed_calls,
250
+ coalesce(round(avg(duration_ms), 2), 0) AS average_duration_ms,
251
+ max(called_at) AS last_called_at
252
+ FROM mcp_tool_calls`).get();
253
+ const tools = this.db.prepare(`SELECT
254
+ tool_name,
255
+ count(*) AS calls,
256
+ coalesce(sum(success), 0) AS successful_calls,
257
+ count(*) - coalesce(sum(success), 0) AS failed_calls,
258
+ coalesce(round(avg(duration_ms), 2), 0) AS average_duration_ms,
259
+ max(called_at) AS last_called_at
260
+ FROM mcp_tool_calls
261
+ GROUP BY tool_name
262
+ ORDER BY calls DESC, tool_name ASC`).all();
263
+ return { ...totals, tools };
264
+ }
265
+ createMcpKey(name, allowedTools, isDefault = false) {
266
+ const id = randomUUID();
267
+ const secret = `mo_${randomBytes(24).toString("base64url")}`;
268
+ const timestamp = now();
269
+ this.db.prepare("INSERT INTO mcp_keys (id, name, prefix, key_hash, secret, allowed_tools_json, is_default, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")
270
+ .run(id, name, secret.slice(0, 11), createHash("sha256").update(secret).digest("hex"), secret, JSON.stringify(allowedTools), isDefault ? 1 : 0, timestamp);
271
+ return { key: secret, keyRecord: this.getMcpKey(id) };
272
+ }
273
+ getMcpKey(id) {
274
+ const row = this.db.prepare("SELECT id, name, prefix, secret, allowed_tools_json, is_default, created_at, last_used_at, revoked_at FROM mcp_keys WHERE id = ?").get(id);
275
+ if (!row)
276
+ return null;
277
+ const { allowed_tools_json, is_default, ...rest } = row;
278
+ return { ...rest, is_default: Boolean(is_default), allowed_tools: JSON.parse(String(allowed_tools_json ?? "[]")) };
279
+ }
280
+ listMcpKeys() {
281
+ return this.db.prepare("SELECT id, name, prefix, secret, allowed_tools_json, is_default, created_at, last_used_at, revoked_at FROM mcp_keys WHERE revoked_at IS NULL ORDER BY created_at DESC").all().map((row) => { const { allowed_tools_json, is_default, ...rest } = row; return { ...rest, is_default: Boolean(is_default), allowed_tools: JSON.parse(String(allowed_tools_json ?? "[]")) }; });
282
+ }
283
+ updateMcpKey(id, patch) {
284
+ const values = {};
285
+ if (patch.name !== undefined)
286
+ values.name = patch.name;
287
+ if (patch.allowed_tools !== undefined)
288
+ values.allowed_tools_json = JSON.stringify(patch.allowed_tools);
289
+ if (!Object.keys(values).length)
290
+ return this.getMcpKey(id);
291
+ this.db.prepare(`UPDATE mcp_keys SET ${Object.keys(values).map((key) => `${key} = @${key}`).join(", ")} WHERE id = @id AND revoked_at IS NULL`).run({ ...values, id });
292
+ return this.getMcpKey(id);
293
+ }
294
+ revokeMcpKey(id) {
295
+ return this.db.prepare("DELETE FROM mcp_keys WHERE id = ?").run(id).changes > 0;
296
+ }
297
+ verifyMcpKey(secret) {
298
+ const hash = createHash("sha256").update(secret).digest("hex");
299
+ const row = this.db.prepare("SELECT id, name, prefix, allowed_tools_json, is_default, created_at, last_used_at, revoked_at FROM mcp_keys WHERE key_hash = ? AND revoked_at IS NULL").get(hash);
300
+ if (!row)
301
+ return null;
302
+ this.db.prepare("UPDATE mcp_keys SET last_used_at = ? WHERE id = ?").run(now(), row.id);
303
+ const { allowed_tools_json, is_default, ...rest } = row;
304
+ return { ...rest, is_default: Boolean(is_default), allowed_tools: JSON.parse(String(allowed_tools_json ?? "[]")) };
305
+ }
306
+ getAgentConfig() {
307
+ const row = this.db.prepare("SELECT name, scope, provider, model, base_url, api_key, auto_context, updated_at FROM agent_config WHERE id = 1").get();
308
+ if (!row)
309
+ return { name: "记忆管家", scope: "", provider: "", model: "", base_url: "", api_key: "", auto_context: true, updated_at: null };
310
+ return { ...row, auto_context: Boolean(row.auto_context) };
311
+ }
312
+ getMcpConfig() {
313
+ const row = this.db.prepare("SELECT use_bearer_key, updated_at FROM mcp_config WHERE id = 1").get();
314
+ return { use_bearer_key: row ? Boolean(row.use_bearer_key) : true, updated_at: row ? String(row.updated_at ?? "") || null : null };
315
+ }
316
+ saveMcpConfig(useBearerKey) {
317
+ const updatedAt = now();
318
+ this.db.prepare(`INSERT INTO mcp_config (id, use_bearer_key, updated_at) VALUES (1, @use_bearer_key, @updated_at)
319
+ ON CONFLICT(id) DO UPDATE SET use_bearer_key = excluded.use_bearer_key, updated_at = excluded.updated_at`).run({ use_bearer_key: useBearerKey ? 1 : 0, updated_at: updatedAt });
320
+ return this.getMcpConfig();
321
+ }
322
+ saveAgentConfig(input) {
323
+ const current = this.getAgentConfig();
324
+ const next = {
325
+ name: input.name?.trim() || current.name,
326
+ scope: input.scope?.trim() ?? current.scope,
327
+ provider: input.provider?.trim() || current.provider,
328
+ model: input.model?.trim() ?? current.model,
329
+ base_url: input.base_url?.trim() ?? current.base_url,
330
+ api_key: input.api_key?.trim() ?? current.api_key,
331
+ auto_context: input.auto_context ?? current.auto_context,
332
+ updated_at: now(),
333
+ };
334
+ this.db.prepare(`INSERT INTO agent_config (id, name, scope, provider, model, base_url, api_key, auto_context, updated_at)
335
+ VALUES (1, @name, @scope, @provider, @model, @base_url, @api_key, @auto_context, @updated_at)
336
+ ON CONFLICT(id) DO UPDATE SET name = excluded.name, scope = excluded.scope, provider = excluded.provider,
337
+ model = excluded.model, base_url = excluded.base_url, api_key = excluded.api_key,
338
+ auto_context = excluded.auto_context, updated_at = excluded.updated_at`).run({ ...next, auto_context: next.auto_context ? 1 : 0 });
339
+ return this.getAgentConfig();
340
+ }
341
+ }
342
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@ccjr1120/memory-one",
3
+ "version": "0.1.1",
4
+ "description": "A local HTTP MCP service for personal agent memory",
5
+ "type": "module",
6
+ "bin": {
7
+ "memory-one": "bin/memory-one.mjs"
8
+ },
9
+ "files": [
10
+ "bin",
11
+ "dist/server.js",
12
+ "dist/server.js.map",
13
+ "dist/storage.js",
14
+ "dist/storage.js.map",
15
+ "public",
16
+ "README.md"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/ccjr1120/memory-one.git"
21
+ },
22
+ "homepage": "https://github.com/ccjr1120/memory-one#readme",
23
+ "bugs": "https://github.com/ccjr1120/memory-one/issues",
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "engines": {
28
+ "node": ">=20"
29
+ },
30
+ "scripts": {
31
+ "dev": "node scripts/dev.mjs",
32
+ "dev:web": "vite",
33
+ "dev:server": "tsx src/server.ts",
34
+ "screenshots": "node scripts/capture-screens.mjs",
35
+ "install:local": "bash scripts/install-local.sh",
36
+ "build:web": "vite build",
37
+ "build:server": "tsc -p tsconfig.json",
38
+ "build": "npm run build:web && npm run build:server",
39
+ "test": "tsx --test src/*.test.ts",
40
+ "v": "node scripts/bump-version.mjs",
41
+ "prepublishOnly": "npm test && npm run build",
42
+ "start": "node dist/server.js"
43
+ },
44
+ "dependencies": {
45
+ "@fastify/static": "^8.3.0",
46
+ "@modelcontextprotocol/sdk": "^1.30.0",
47
+ "@radix-ui/react-select": "^2.3.7",
48
+ "@tanstack/react-router": "^1.170.32",
49
+ "better-sqlite3": "^12.4.1",
50
+ "fastify": "^5.6.0",
51
+ "lucide-react": "^0.468.0",
52
+ "react": "^19.2.8",
53
+ "react-dom": "^19.2.8",
54
+ "streamdown": "^2.6.0",
55
+ "zod": "^4.5.4"
56
+ },
57
+ "devDependencies": {
58
+ "@inquirer/prompts": "^8.7.2",
59
+ "@types/better-sqlite3": "^7.6.13",
60
+ "@types/node": "^24.4.0",
61
+ "@types/react": "^19.2.18",
62
+ "@types/react-dom": "^19.2.5",
63
+ "@vitejs/plugin-react": "^5.2.0",
64
+ "semver": "^7.8.5",
65
+ "tsx": "^4.20.5",
66
+ "typescript": "^5.9.3",
67
+ "vite": "^7.3.6"
68
+ }
69
+ }
@@ -0,0 +1 @@
1
+ import{r,S as d,E as p,j as E,c as f}from"./index-CkQQQDOY.js";var j=({code:i,language:e,maxHeight:o,raw:a,className:u,startLine:m,lineNumbers:n,...h})=>{let{shikiTheme:l}=r.useContext(d),t=p(),[c,s]=r.useState(a);return r.useEffect(()=>{if(!t){s(a);return}let g=t.highlight({code:i,language:e,themes:l},x=>{s(x)});g&&s(g)},[i,e,l,t,a]),E.jsx(f,{className:u,language:e,lineNumbers:n,maxHeight:o,result:c,startLine:m,...h})};export{j as HighlightedCodeBlockBody};