@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.
package/dist/server.js ADDED
@@ -0,0 +1,460 @@
1
+ import Fastify from "fastify";
2
+ import fastifyStatic from "@fastify/static";
3
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
4
+ import { readFileSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { dirname, join } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { randomUUID } from "node:crypto";
9
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
11
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
12
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
13
+ import { CallToolResultSchema } from "@modelcontextprotocol/sdk/types.js";
14
+ import { z } from "zod";
15
+ import { MemoryStore } from "./storage.js";
16
+ const store = new MemoryStore();
17
+ const internalMcpToken = randomUUID();
18
+ let agentTurnQueue = Promise.resolve();
19
+ const json = (value) => ({ content: [{ type: "text", text: JSON.stringify(value) }] });
20
+ const storageScope = "user";
21
+ const exposeMemory = (memory) => { if (!memory || typeof memory !== "object" || "error" in memory)
22
+ return memory; const { project, ...rest } = memory; return { ...rest, scope: project ?? "global" }; };
23
+ const exposeMemories = (memories) => memories.map(exposeMemory);
24
+ const toStorageInput = (input) => { const { scope, ...rest } = input; return { ...rest, scope: storageScope, project: typeof scope === "string" && scope !== "global" ? scope : null }; };
25
+ const toStoragePatch = (patch) => { const { scope, ...rest } = patch; return "scope" in patch ? { ...rest, project: typeof scope === "string" && scope !== "global" ? scope : null } : rest; };
26
+ const agentSystemPrompt = "你是 Memory One 的记忆管家。你通过 MCP 工具管理用户的长期记忆,支持记忆的搜索、读取、保存、更新、删除和反馈。请先理解用户意图,涉及记忆事实时优先调用工具,不要编造记忆。每轮都检查用户是否表达了纠正、偏好、决定、项目约定、个人事实或其他未来有用的信息:有则在最终回复前主动调用 memory_store;如果是在修正已有记忆,先读取并调用 memory_update。只有明显临时、一次性的内容才不保存。删除前必须确认目标唯一;回复使用中文,简洁但可以使用 Markdown。";
27
+ const toolLabels = { memory_get_context: "读取相关上下文", memory_search: "搜索记忆", memory_get: "读取记忆", memory_list: "列出记忆", memory_store: "保存记忆", memory_update: "更新记忆", memory_delete: "删除记忆", memory_feedback: "记录反馈" };
28
+ const isMemoryOverviewRequest = (message) => /(?:有哪些|所有记忆|全部记忆|列出(?:全部)?|查看(?:全部)?|浏览全部|总结(?:下)?(?:我的)?记忆|总结我的特点|概括我的特点|我的画像|我的偏好和特点|我的记忆(?:有什么)?特点|记忆特点)/.test(message);
29
+ function sseEvent(type, payload) { return `event: ${type}\ndata: ${JSON.stringify(payload)}\n\n`; }
30
+ async function readSse(response, onEvent) {
31
+ if (!response.body)
32
+ throw new Error("provider_empty_stream");
33
+ const reader = response.body.getReader();
34
+ const decoder = new TextDecoder();
35
+ let buffer = "";
36
+ while (true) {
37
+ const { value, done } = await reader.read();
38
+ buffer += decoder.decode(value ?? new Uint8Array(), { stream: !done });
39
+ const chunks = buffer.split(/\r?\n\r?\n/);
40
+ buffer = chunks.pop() ?? "";
41
+ for (const chunk of chunks) {
42
+ const lines = chunk.split(/\r?\n/);
43
+ const event = lines.find((line) => line.startsWith("event:"))?.slice(6).trim() ?? "message";
44
+ const data = lines.filter((line) => line.startsWith("data:")).map((line) => line.slice(5).trim()).join("\n");
45
+ if (data)
46
+ await onEvent({ event, data });
47
+ }
48
+ if (done)
49
+ break;
50
+ }
51
+ }
52
+ async function connectMemoryMcp() {
53
+ const client = new Client({ name: "memory-one-agent", version: "0.1.0" });
54
+ const transport = new StreamableHTTPClientTransport(new URL(`http://127.0.0.1:${process.env.MEMORY_PORT ?? 8765}/mcp`), { requestInit: { headers: { "x-memory-one-internal": internalMcpToken } } });
55
+ await client.connect(transport);
56
+ return { client, transport };
57
+ }
58
+ function normalizeTools(tools) {
59
+ return tools.map((tool) => ({ type: "function", function: { name: tool.name, description: tool.description ?? "", parameters: tool.inputSchema } }));
60
+ }
61
+ async function openAiRound(config, messages, tools, emit) {
62
+ const base = (config.base_url?.trim() || "").replace(/\/$/, "");
63
+ const response = await fetch(`${base}/chat/completions`, { method: "POST", headers: { "content-type": "application/json", ...(config.api_key ? { authorization: `Bearer ${config.api_key}` } : {}) }, body: JSON.stringify({ model: config.model || "", messages, tools, stream: true }) });
64
+ if (!response.ok)
65
+ throw new Error(`provider_http_${response.status}: ${await response.text()}`);
66
+ let content = "";
67
+ const calls = new Map();
68
+ await readSse(response, ({ data }) => {
69
+ if (data === "[DONE]")
70
+ return;
71
+ const chunk = JSON.parse(data);
72
+ const delta = chunk.choices?.[0]?.delta;
73
+ if (delta?.content) {
74
+ content += delta.content;
75
+ emit({ type: "delta", text: delta.content });
76
+ }
77
+ for (const call of delta?.tool_calls ?? []) {
78
+ const existing = calls.get(call.index) ?? { id: call.id ?? "", name: call.function?.name ?? "", arguments: "" };
79
+ existing.id ||= call.id ?? "";
80
+ existing.name ||= call.function?.name ?? "";
81
+ existing.arguments += call.function?.arguments ?? "";
82
+ calls.set(call.index, existing);
83
+ }
84
+ });
85
+ return { content, toolCalls: [...calls.values()] };
86
+ }
87
+ function responsesInput(messages) {
88
+ return messages.filter((message) => message.role !== "system").flatMap((message) => {
89
+ if (message.role === "tool")
90
+ return [{ type: "function_call_output", call_id: message.tool_call_id, output: message.content }];
91
+ if (message.role === "assistant" && Array.isArray(message.tool_calls)) {
92
+ return message.tool_calls.map((call) => ({ type: "function_call", call_id: call.id, name: call.function.name, arguments: call.function.arguments }));
93
+ }
94
+ return [{ role: message.role, content: message.content }];
95
+ });
96
+ }
97
+ async function openAiResponsesRound(config, messages, tools, emit) {
98
+ const base = (config.base_url?.trim() || "").replace(/\/$/, "");
99
+ const system = messages.find((message) => message.role === "system")?.content;
100
+ const response = await fetch(`${base}/responses`, { method: "POST", headers: { "content-type": "application/json", ...(config.api_key ? { authorization: `Bearer ${config.api_key}` } : {}) }, body: JSON.stringify({ model: config.model || "", instructions: system, input: responsesInput(messages), tools: tools.map((tool) => ({ type: "function", name: tool.function.name, description: tool.function.description, parameters: tool.function.parameters })), stream: false }) });
101
+ if (!response.ok)
102
+ throw new Error(`provider_http_${response.status}: ${await response.text()}`);
103
+ const payload = await response.json();
104
+ let content = "";
105
+ const toolCalls = [];
106
+ for (const item of payload.output ?? []) {
107
+ if (item.type === "message") {
108
+ for (const part of item.content ?? [])
109
+ if (part.type === "output_text" && part.text)
110
+ content += part.text;
111
+ }
112
+ if (item.type === "function_call")
113
+ toolCalls.push({ id: item.call_id || item.id, name: item.name, arguments: item.arguments || "{}" });
114
+ }
115
+ if (content)
116
+ emit({ type: "delta", text: content });
117
+ return { content, toolCalls };
118
+ }
119
+ async function anthropicRound(config, messages, tools, emit) {
120
+ const base = (config.base_url?.trim() || "").replace(/\/$/, "");
121
+ const system = messages.find((message) => message.role === "system")?.content;
122
+ const response = await fetch(`${base}/messages`, { method: "POST", headers: { "content-type": "application/json", "anthropic-version": "2023-06-01", ...(config.api_key ? { "x-api-key": config.api_key } : {}) }, body: JSON.stringify({ model: config.model || "claude-3-5-sonnet-latest", max_tokens: 4096, system, messages: messages.filter((message) => message.role !== "system"), tools: tools.map((tool) => ({ name: tool.function.name, description: tool.function.description, input_schema: tool.function.parameters })), stream: true }) });
123
+ if (!response.ok)
124
+ throw new Error(`provider_http_${response.status}: ${await response.text()}`);
125
+ let content = "";
126
+ const calls = [];
127
+ let current = null;
128
+ await readSse(response, ({ event, data }) => {
129
+ const item = JSON.parse(data);
130
+ if (event === "content_block_start" && item.content_block?.type === "tool_use") {
131
+ current = { id: item.content_block.id, name: item.content_block.name, arguments: "" };
132
+ calls.push(current);
133
+ }
134
+ if (event === "content_block_delta") {
135
+ if (item.delta?.type === "text_delta") {
136
+ content += item.delta.text;
137
+ emit({ type: "delta", text: item.delta.text });
138
+ }
139
+ if (item.delta?.type === "input_json_delta" && current)
140
+ current.arguments += item.delta.partial_json;
141
+ }
142
+ });
143
+ return { content, toolCalls: calls };
144
+ }
145
+ async function runAgent(request, emit) {
146
+ const provider = (request.provider || "").toLowerCase();
147
+ if (!request.message?.trim()) {
148
+ emit({ type: "delta", text: "告诉我你想查找、保存、修改、删除,还是总结哪些记忆?" });
149
+ emit({ type: "done", toolCalls: [] });
150
+ return;
151
+ }
152
+ if (!["openai", "openai-compatible", "anthropic", "local"].includes(provider))
153
+ throw new Error("unsupported_provider");
154
+ if (!request.base_url?.trim())
155
+ throw new Error("missing_base_url");
156
+ if (provider !== "local" && !request.api_key)
157
+ throw new Error("missing_api_key");
158
+ const { client, transport } = await connectMemoryMcp();
159
+ const toolResult = await client.listTools();
160
+ const tools = normalizeTools(toolResult.tools);
161
+ const toolCalls = [];
162
+ const history = (request.history ?? []).slice(-12).filter((message) => message.content).map((message) => ({ role: message.role, content: message.content }));
163
+ const messages = [{ role: "system", content: `${agentSystemPrompt}${request.scope ? ` 默认 Scope:${request.scope}` : ""}${request.auto_context === false ? " 不需要自动读取上下文。" : " 每轮任务开始时先调用 memory_get_context。"}` }, ...history];
164
+ if (!history.some((message) => message.role === "user" && message.content === request.message))
165
+ messages.push({ role: "user", content: request.message });
166
+ try {
167
+ if (request.auto_context !== false) {
168
+ const overviewRequest = isMemoryOverviewRequest(request.message);
169
+ const context = await client.callTool({ name: "memory_get_context", arguments: { query: overviewRequest ? null : request.message, scope: request.scope || null, limit: overviewRequest ? 50 : 10 } }, CallToolResultSchema);
170
+ const contextText = context.content?.filter((item) => item.type === "text").map((item) => item.text ?? "").join("\n") || "{}";
171
+ const parsed = (() => { try {
172
+ return JSON.parse(contextText);
173
+ }
174
+ catch {
175
+ return contextText;
176
+ } })();
177
+ toolCalls.push({ name: "memory_get_context", label: toolLabels.memory_get_context, count: Array.isArray(parsed) ? parsed.length : parsed?.memories?.length });
178
+ emit({ type: "tool", tool: toolCalls.at(-1) });
179
+ messages[0] = { role: "system", content: `${messages[0].content}\n\n已自动读取 memory_get_context,结果如下。请基于这些结果回答,除非需要更精确检索,否则不要重复调用该工具:\n${contextText}` };
180
+ if (overviewRequest) {
181
+ const listed = await client.callTool({ name: "memory_list", arguments: { scope: request.scope || null, limit: 100 } }, CallToolResultSchema);
182
+ const listedText = listed.content?.filter((item) => item.type === "text").map((item) => item.text ?? "").join("\n") || "[]";
183
+ const listedParsed = (() => { try {
184
+ return JSON.parse(listedText);
185
+ }
186
+ catch {
187
+ return [];
188
+ } })();
189
+ const listCall = { name: "memory_list", label: toolLabels.memory_list, count: Array.isArray(listedParsed) ? listedParsed.length : undefined };
190
+ toolCalls.push(listCall);
191
+ emit({ type: "tool", tool: listCall });
192
+ messages[0] = { role: "system", content: `${messages[0].content}\n\n这是针对“有哪些记忆/总结特点”问题通过 MCP memory_list 获取的完整记忆列表。请直接基于它回答,不要声称没有上下文:\n${listedText}` };
193
+ }
194
+ }
195
+ for (let round = 0; round < 6; round += 1) {
196
+ const result = provider === "anthropic" ? await anthropicRound(request, messages, tools, emit) : provider === "openai" ? await openAiResponsesRound(request, messages, tools, emit) : await openAiRound(request, messages, tools, emit);
197
+ if (!result.toolCalls.length) {
198
+ emit({ type: "done", toolCalls });
199
+ return;
200
+ }
201
+ if (provider === "anthropic")
202
+ messages.push({ role: "assistant", content: [...(result.content ? [{ type: "text", text: result.content }] : []), ...result.toolCalls.map((call) => ({ type: "tool_use", id: call.id, name: call.name, input: JSON.parse(call.arguments || "{}") }))] });
203
+ else
204
+ messages.push({ role: "assistant", content: result.content || null, tool_calls: result.toolCalls.map((call) => ({ id: call.id, type: "function", function: { name: call.name, arguments: call.arguments } })) });
205
+ for (const call of result.toolCalls) {
206
+ const args = JSON.parse(call.arguments || "{}");
207
+ if (request.scope && ["memory_get_context", "memory_search", "memory_list", "memory_store"].includes(call.name) && args.scope == null)
208
+ args.scope = request.scope;
209
+ if (request.scope && call.name === "memory_update" && args.patch && typeof args.patch === "object" && args.patch.scope == null)
210
+ args.patch = { ...args.patch, scope: request.scope };
211
+ const output = await client.callTool({ name: call.name, arguments: args }, CallToolResultSchema);
212
+ const outputContent = output.content;
213
+ const text = outputContent?.filter((item) => item.type === "text").map((item) => item.text ?? "").join("\n") || JSON.stringify(output);
214
+ if (provider === "anthropic")
215
+ messages.push({ role: "user", content: [{ type: "tool_result", tool_use_id: call.id, content: text }] });
216
+ else
217
+ messages.push({ role: "tool", tool_call_id: call.id, content: text });
218
+ const count = (() => { try {
219
+ const parsed = JSON.parse(text);
220
+ return Array.isArray(parsed) ? parsed.length : parsed?.memories?.length ?? undefined;
221
+ }
222
+ catch {
223
+ return undefined;
224
+ } })();
225
+ const latest = { name: call.name, label: toolLabels[call.name] ?? call.name, ...(count === undefined ? {} : { count }) };
226
+ toolCalls.push(latest);
227
+ emit({ type: "tool", tool: latest });
228
+ }
229
+ }
230
+ throw new Error("agent_tool_loop_limit");
231
+ }
232
+ finally {
233
+ await transport.close().catch(() => undefined);
234
+ }
235
+ }
236
+ const codexAgentsPath = join(process.env.CODEX_HOME ?? join(homedir(), ".codex"), "AGENTS.md");
237
+ const codexGuidanceStart = "<!-- memory-one:codex:start -->";
238
+ const codexGuidanceEnd = "<!-- memory-one:codex:end -->";
239
+ const codexGuidance = `${codexGuidanceStart}
240
+ ## Memory One
241
+
242
+ Before starting any user task, call the Memory One MCP tool \`memory_get_context\` once to retrieve relevant prior experience.
243
+
244
+ - Use a concise summary of the current task as the query.
245
+ - When working in a project, resolve the Git repository root and pass its absolute directory path as \`scope\`. Use the same scope when storing project-specific memory; omit \`scope\` for general preferences and knowledge.
246
+ - Apply relevant preferences, decisions, corrections, and lessons before planning, answering, editing files, or calling task-specific tools.
247
+ - After the user expresses a correction, preference, decision, project convention, personal fact, or other durable information, proactively save it with \`memory_store\` (or update the matching memory with \`memory_update\`) before finishing the task. Do not save clearly transient, one-off details.
248
+ - Do not skip retrieval merely because the task appears self-contained.
249
+ ${codexGuidanceEnd}`;
250
+ async function readCodexAgents() {
251
+ try {
252
+ return await readFile(codexAgentsPath, "utf8");
253
+ }
254
+ catch (error) {
255
+ if (error.code === "ENOENT")
256
+ return "";
257
+ throw error;
258
+ }
259
+ }
260
+ function removeManagedCodexGuidance(content) {
261
+ const start = content.indexOf(codexGuidanceStart);
262
+ const end = content.indexOf(codexGuidanceEnd, start + codexGuidanceStart.length);
263
+ if (start < 0 || end < 0)
264
+ return content;
265
+ const before = content.slice(0, start).trimEnd();
266
+ const after = content.slice(end + codexGuidanceEnd.length).trimStart();
267
+ return [before, after].filter(Boolean).join("\n\n");
268
+ }
269
+ async function getCodexIntegration() {
270
+ const content = await readCodexAgents();
271
+ const start = content.indexOf(codexGuidanceStart);
272
+ const end = content.indexOf(codexGuidanceEnd, start + codexGuidanceStart.length);
273
+ const installed = start >= 0 && end >= 0;
274
+ const managed = installed ? content.slice(start, end + codexGuidanceEnd.length) : "";
275
+ return { path: codexAgentsPath, status: installed ? managed === codexGuidance ? "configured" : "update_available" : "not_configured" };
276
+ }
277
+ async function installCodexIntegration() {
278
+ const content = await readCodexAgents();
279
+ const preserved = removeManagedCodexGuidance(content);
280
+ await mkdir(dirname(codexAgentsPath), { recursive: true });
281
+ await writeFile(codexAgentsPath, `${preserved ? `${preserved}\n\n` : ""}${codexGuidance}\n`, "utf8");
282
+ return getCodexIntegration();
283
+ }
284
+ async function trackToolCall(toolName, action) {
285
+ const startedAt = performance.now();
286
+ try {
287
+ const result = await action();
288
+ store.recordToolCall(toolName, true, Math.round((performance.now() - startedAt) * 100) / 100);
289
+ return result;
290
+ }
291
+ catch (error) {
292
+ store.recordToolCall(toolName, false, Math.round((performance.now() - startedAt) * 100) / 100);
293
+ throw error;
294
+ }
295
+ }
296
+ const mcpToolNames = ["memory_store", "memory_search", "memory_get_context", "memory_get", "memory_list", "memory_update", "memory_delete", "memory_feedback"];
297
+ function createMcpServer(allowedTools) {
298
+ const mcp = new McpServer({ name: "memory-one", version: "0.1.0" }, {
299
+ instructions: "Memory One provides durable experience for every task. At the start of each user task, call memory_get_context before planning, answering, editing, or using task-specific tools. Query with a concise summary of the current task and apply relevant retrieved memories. After the user expresses a correction, preference, decision, project convention, personal fact, or other durable information, proactively save it with memory_store before finishing the task; use memory_update when correcting an existing memory. Do not save clearly transient, one-off details. Use memory_search for focused follow-up retrieval. Use memory_feedback after retrieved memories prove useful or unhelpful. Only use memory_delete when the user explicitly asks to forget a specific memory. Scope is optional."
300
+ });
301
+ const registerTool = (name, description, schema, handler) => {
302
+ if (!allowedTools || allowedTools.has(name))
303
+ mcp.tool(name, description, schema, handler);
304
+ };
305
+ registerTool("memory_store", "Use proactively when the user states a durable preference, decision, project convention, personal fact, or correction that can help in future tasks. Store it immediately instead of waiting for a separate request. Do not store transient chatter or one-off task details. Scope is an optional category such as a project directory, work area, or session.", {
306
+ content: z.string(), kind: z.string().default("fact"), scope: z.string().nullable().optional(),
307
+ session_id: z.string().nullable().optional(), source: z.string().nullable().optional(), occurred_at: z.string().nullable().optional(),
308
+ confidence: z.number().default(1), importance: z.number().default(0.5), metadata: z.record(z.string(), z.unknown()).nullable().optional(),
309
+ }, async (input) => trackToolCall("memory_store", () => json(exposeMemory(store.create(toStorageInput(input))))));
310
+ registerTool("memory_search", "Use before answering when prior user preferences, past decisions, project conventions, or earlier facts may matter. Prefer searching over guessing, including when the answer seems obvious. Search with concise terms and use scope as an optional category filter.", { query: z.string(), scope: z.string().nullable().optional(), limit: z.number().int().default(20) }, async ({ query, scope, limit }) => trackToolCall("memory_search", () => json(exposeMemories(store.recordRecalls(store.search(query, storageScope, scope && scope !== "global" ? scope : null, limit))))));
311
+ registerTool("memory_get_context", "Universal pre-task context retrieval. Call once at the beginning of every user task, before planning, answering, editing, or invoking task-specific tools. When working in a Git repository, pass the repository root's absolute directory path as scope. Project context includes memories from that directory and global memories; omitting scope retrieves global memories only.", { query: z.string().nullable().optional(), scope: z.string().nullable().optional(), limit: z.number().int().default(10) }, async ({ query, scope, limit }) => trackToolCall("memory_get_context", () => { const category = scope && scope !== "global" ? scope : null; const memories = store.context(query?.trim() || null, storageScope, category, limit); return json({ scope: scope ?? "global", strategy: category ? "project_plus_global" : "global", memories: exposeMemories(store.recordRecalls(memories)) }); }));
312
+ registerTool("memory_get", "Use after memory_search or memory_get_context returns a memory ID and you need the complete record before relying on or updating it.", { memory_id: z.string() }, async ({ memory_id }) => trackToolCall("memory_get", () => { const memory = store.get(memory_id); return json(exposeMemory(memory ? store.recordRecalls([memory])[0] : { error: "memory_not_found" })); }));
313
+ registerTool("memory_list", "Use when reviewing recent memories, auditing what has been saved, or preparing context without a specific search query. Scope is an optional category filter.", { scope: z.string().nullable().optional(), limit: z.number().int().default(50) }, async ({ scope, limit }) => trackToolCall("memory_list", () => json(exposeMemories(store.list(storageScope, scope && scope !== "global" ? scope : null, limit)))));
314
+ registerTool("memory_update", "Use when the user corrects, refines, or supersedes a stored memory. Fetch the record first when needed, then update only the changed fields. Scope is an optional category.", { memory_id: z.string(), patch: z.record(z.string(), z.unknown()) }, async ({ memory_id, patch }) => trackToolCall("memory_update", () => json(exposeMemory(store.update(memory_id, toStoragePatch(patch)) ?? { error: "memory_not_found" }))));
315
+ registerTool("memory_delete", "Use only when the user explicitly asks to forget or delete a specific memory. This is a soft delete.", { memory_id: z.string() }, async ({ memory_id }) => trackToolCall("memory_delete", () => json({ deleted: store.delete(memory_id) })));
316
+ registerTool("memory_feedback", "Use after applying a retrieved memory or when the user indicates that a memory was useful or not useful. Record that relevance signal so future retrieval can improve.", { memory_id: z.string(), useful: z.boolean() }, async ({ memory_id, useful }) => {
317
+ return trackToolCall("memory_feedback", () => {
318
+ const item = store.get(memory_id);
319
+ if (!item)
320
+ return json({ error: "memory_not_found" });
321
+ return json(exposeMemory(store.update(memory_id, { importance: Math.max(0, Math.min(1, item.importance + (useful ? 0.05 : -0.05))) })));
322
+ });
323
+ });
324
+ return mcp;
325
+ }
326
+ const app = Fastify({ logger: true });
327
+ const publicDir = join(fileURLToPath(new URL(".", import.meta.url)), "../public");
328
+ const packageJsonPath = join(fileURLToPath(new URL(".", import.meta.url)), "../package.json");
329
+ const packageVersion = JSON.parse(readFileSync(packageJsonPath, "utf8")).version;
330
+ app.register(fastifyStatic, { root: publicDir, prefix: "/" });
331
+ for (const frontendRoute of ["/", "/timeline", "/archive", "/preferences", "/scopes", "/tags", "/settings", "/mcp-service"]) {
332
+ app.get(frontendRoute, async (_, reply) => reply.sendFile("index.html"));
333
+ }
334
+ app.get("/api/memories", async (request) => { const q = request.query; return store.list(q.scope ?? "user", q.project ?? null, Number(q.limit ?? 50)); });
335
+ app.get("/api/version", async () => {
336
+ try {
337
+ const response = await fetch("https://registry.npmjs.org/@ccjr1120%2Fmemory-one/latest", { signal: AbortSignal.timeout(2000), headers: { accept: "application/json" } });
338
+ if (!response.ok)
339
+ return { current: packageVersion, latest: null, updateAvailable: false };
340
+ const latest = String((await response.json()).version ?? "");
341
+ return { current: packageVersion, latest: latest || null, updateAvailable: Boolean(latest && latest !== packageVersion) };
342
+ }
343
+ catch {
344
+ return { current: packageVersion, latest: null, updateAvailable: false };
345
+ }
346
+ });
347
+ app.get("/api/search", async (request) => { const q = request.query; return store.recordRecalls(store.search(q.query, q.scope ?? "user", q.project ?? null, Number(q.limit ?? 20))); });
348
+ app.get("/api/memories/most-recalled", async (request) => { const q = request.query; return store.mostRecalled(q.scope ?? "user", q.project ?? null, Number(q.limit ?? 5)); });
349
+ app.get("/api/mcp/stats", async () => store.getToolStats());
350
+ app.get("/api/mcp/config", async () => store.getMcpConfig());
351
+ app.put("/api/mcp/config", async (request) => store.saveMcpConfig(Boolean(request.body?.use_bearer_key)));
352
+ app.get("/api/mcp/keys", async () => store.listMcpKeys());
353
+ app.post("/api/mcp/keys", async (request, reply) => {
354
+ const body = request.body ?? {};
355
+ const name = body.name?.trim() || "未命名 Key";
356
+ const allowedTools = [...new Set((body.allowed_tools ?? []).filter((tool) => mcpToolNames.includes(tool)))];
357
+ const created = store.createMcpKey(name, allowedTools);
358
+ return reply.code(201).send({ key: created.key, key_record: created.keyRecord });
359
+ });
360
+ app.patch("/api/mcp/keys/:id", async (request, reply) => {
361
+ const { id } = request.params;
362
+ const body = request.body ?? {};
363
+ const patch = {
364
+ ...(body.name === undefined ? {} : { name: body.name.trim() || "未命名 Key" }),
365
+ ...(body.allowed_tools === undefined ? {} : { allowed_tools: [...new Set(body.allowed_tools.filter((tool) => mcpToolNames.includes(tool)))] }),
366
+ };
367
+ const key = store.updateMcpKey(id, patch);
368
+ return key ? key : reply.code(404).send({ detail: "mcp_key_not_found" });
369
+ });
370
+ app.delete("/api/mcp/keys/:id", async (request, reply) => {
371
+ const { id } = request.params;
372
+ return { revoked: store.revokeMcpKey(id) };
373
+ });
374
+ /* Agent API removed. */
375
+ /*
376
+ app.post("/api/agent/models", async (request, reply) => {
377
+ const body = (request.body as { provider?: string; base_url?: string | null; api_key?: string | null } | undefined) ?? {};
378
+ const provider = (body.provider || "").toLowerCase();
379
+ if (!["openai", "openai-compatible", "anthropic", "local"].includes(provider)) return reply.code(422).send({ detail: "unsupported_provider" });
380
+ const base = (body.base_url?.trim() || "").replace(/\/$/, "");
381
+ if (!base) return reply.code(422).send({ detail: "base_url_required" });
382
+ const headers: Record<string, string> = { accept: "application/json" };
383
+ if (provider === "anthropic") {
384
+ headers["anthropic-version"] = "2023-06-01";
385
+ if (body.api_key?.trim()) headers["x-api-key"] = body.api_key.trim();
386
+ } else if (body.api_key?.trim()) {
387
+ headers.authorization = `Bearer ${body.api_key.trim()}`;
388
+ }
389
+ try {
390
+ const response = await fetch(`${base}/models`, { headers });
391
+ const text = await response.text();
392
+ let payload: any = null;
393
+ try { payload = text ? JSON.parse(text) : null; } catch { payload = null; }
394
+ if (!response.ok) return reply.code(response.status >= 400 && response.status < 600 ? response.status : 502).send({ detail: payload?.error?.message || payload?.message || text || "model_list_failed" });
395
+ const entries: unknown[] = Array.isArray(payload?.data) ? payload.data : Array.isArray(payload) ? payload : [];
396
+ const models = [...new Set(entries.map((item: unknown) => typeof item === "string" ? item : (item as { id?: unknown })?.id).filter((item): item is string => typeof item === "string" && item.trim().length > 0))];
397
+ return { models };
398
+ } catch (error) {
399
+ request.log.error(error);
400
+ return reply.code(502).send({ detail: "model_list_unreachable" });
401
+ }
402
+ });
403
+ */
404
+ /*
405
+ app.post("/api/agent/stream", async (request, reply) => {
406
+ const body = ((request.body as AgentChatRequest | undefined) ?? {});
407
+ const userMessageId = body.user_message_id;
408
+ const assistantMessageId = body.assistant_message_id;
409
+ if (userMessageId && body.message) store.saveAgentMessage({ id: userMessageId, role: "user", content: body.message });
410
+ if (assistantMessageId) store.saveAgentMessage({ id: assistantMessageId, role: "assistant", content: "", toolCalls: [] });
411
+ let assistantContent = "";
412
+ let assistantTools: AgentToolCall[] = [];
413
+ reply.hijack();
414
+ reply.raw.writeHead(200, { "content-type": "text/event-stream; charset=utf-8", "cache-control": "no-cache, no-transform", connection: "keep-alive", "x-accel-buffering": "no" });
415
+ const turn = agentTurnQueue.then(async () => {
416
+ const allMessages = store.listAgentMessages(1000).filter((item) => item.content);
417
+ const currentIndex = userMessageId ? allMessages.findIndex((item) => item.id === userMessageId) : allMessages.length - 1;
418
+ const storedHistory = allMessages.slice(0, Math.max(0, currentIndex)).map((item) => ({ role: item.role, content: item.content })).slice(-12);
419
+ await runAgent({ ...body, history: storedHistory }, (event) => {
420
+ if (event.type === "delta") assistantContent += event.text;
421
+ if (event.type === "tool") assistantTools = [...assistantTools, event.tool];
422
+ if (event.type === "done") assistantTools = event.toolCalls;
423
+ if (assistantMessageId) store.saveAgentMessage({ id: assistantMessageId, role: "assistant", content: assistantContent, toolCalls: assistantTools });
424
+ if (!reply.raw.destroyed) reply.raw.write(sseEvent(event.type, event.type === "delta" ? { text: event.text } : event.type === "tool" ? event.tool : { toolCalls: event.toolCalls }));
425
+ });
426
+ });
427
+ agentTurnQueue = turn.catch(() => undefined);
428
+ try {
429
+ await turn;
430
+ } catch (error) {
431
+ request.log.error(error);
432
+ reply.raw.write(sseEvent("error", { detail: error instanceof Error ? error.message : "agent_request_failed" }));
433
+ } finally { reply.raw.end(); }
434
+ });
435
+ */
436
+ app.get("/api/integrations/codex", async () => getCodexIntegration());
437
+ app.post("/api/integrations/codex/install", async () => installCodexIntegration());
438
+ app.get("/api/memories/:id", async (request, reply) => { const { id } = request.params; const item = store.get(id); return item ? item : reply.code(404).send({ detail: "memory_not_found" }); });
439
+ app.post("/api/memories", async (request, reply) => { const payload = request.body; if (!payload?.content)
440
+ return reply.code(422).send({ detail: "content_required" }); return store.create(payload); });
441
+ app.patch("/api/memories/:id", async (request, reply) => { const { id } = request.params; const item = store.update(id, request.body); return item ? item : reply.code(404).send({ detail: "memory_not_found" }); });
442
+ app.delete("/api/memories/:id", async (request) => { const { id } = request.params; return { deleted: store.delete(id) }; });
443
+ app.all("/mcp", async (request, reply) => reply.redirect("/mcp/", 307));
444
+ app.all("/mcp/", async (request, reply) => {
445
+ const internal = request.headers["x-memory-one-internal"] === internalMcpToken;
446
+ const authorization = request.headers.authorization;
447
+ const secret = authorization?.match(/^Bearer\s+(.+)$/i)?.[1]?.trim();
448
+ const key = secret ? store.verifyMcpKey(secret) : null;
449
+ if (!internal && (!secret || !key))
450
+ return reply.code(401).header("www-authenticate", "Bearer").send({ error: secret ? "invalid_mcp_key" : "mcp_key_required" });
451
+ const allowedTools = key && key.allowed_tools.length ? new Set(key.allowed_tools) : undefined;
452
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
453
+ const mcp = createMcpServer(allowedTools);
454
+ await mcp.connect(transport);
455
+ await transport.handleRequest(request.raw, reply.raw, request.body);
456
+ reply.hijack();
457
+ });
458
+ const port = Number(process.env.MEMORY_PORT ?? 8765);
459
+ app.listen({ host: "127.0.0.1", port }).then(() => console.log(`Memory One listening on http://127.0.0.1:${port}`));
460
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}