@ccjr1120/memory-one 0.1.11 → 0.1.13

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.
Files changed (52) hide show
  1. package/README.md +23 -15
  2. package/dist/agent/providers.js +113 -0
  3. package/dist/agent/providers.js.map +1 -0
  4. package/dist/agent/run.js +98 -0
  5. package/dist/agent/run.js.map +1 -0
  6. package/dist/agent/types.js +2 -0
  7. package/dist/agent/types.js.map +1 -0
  8. package/dist/api/client.js +26 -0
  9. package/dist/api/client.js.map +1 -0
  10. package/dist/app.js +36 -0
  11. package/dist/app.js.map +1 -0
  12. package/dist/integrations/codex.js +143 -0
  13. package/dist/integrations/codex.js.map +1 -0
  14. package/dist/lib/copy.js +203 -0
  15. package/dist/lib/copy.js.map +1 -0
  16. package/dist/lib/format.js +11 -0
  17. package/dist/lib/format.js.map +1 -0
  18. package/dist/lib/kinds.js +5 -0
  19. package/dist/lib/kinds.js.map +1 -0
  20. package/dist/lib/views.js +31 -0
  21. package/dist/lib/views.js.map +1 -0
  22. package/dist/mcp/context-cache.js +14 -0
  23. package/dist/mcp/context-cache.js.map +1 -0
  24. package/dist/mcp/server.js +80 -0
  25. package/dist/mcp/server.js.map +1 -0
  26. package/dist/routes/agent.js +268 -0
  27. package/dist/routes/agent.js.map +1 -0
  28. package/dist/routes/data.js +18 -0
  29. package/dist/routes/data.js.map +1 -0
  30. package/dist/routes/integrations.js +22 -0
  31. package/dist/routes/integrations.js.map +1 -0
  32. package/dist/routes/mcp.js +22 -0
  33. package/dist/routes/mcp.js.map +1 -0
  34. package/dist/routes/memories.js +46 -0
  35. package/dist/routes/memories.js.map +1 -0
  36. package/dist/routes/settings.js +36 -0
  37. package/dist/routes/settings.js.map +1 -0
  38. package/dist/routes/system.js +25 -0
  39. package/dist/routes/system.js.map +1 -0
  40. package/dist/server.js +2 -762
  41. package/dist/server.js.map +1 -1
  42. package/dist/storage.js +224 -7
  43. package/dist/storage.js.map +1 -1
  44. package/dist/types.js +2 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +4 -6
  47. package/public/assets/{highlighted-body-KPVGNVTW-BQat7IMJ.js → highlighted-body-KPVGNVTW-jxw5D7vG.js} +1 -1
  48. package/public/assets/index-C3mrwXZF.css +1 -0
  49. package/public/assets/index-DWgbu5Rx.js +190 -0
  50. package/public/index.html +2 -2
  51. package/public/assets/index-Corxd8nB.css +0 -1
  52. package/public/assets/index-NA-JxEig.js +0 -190
package/README.md CHANGED
@@ -78,7 +78,7 @@ Codex 增强用于告诉 Codex 主动使用 Memory One,而不只是连接 MCP
78
78
 
79
79
  启用后,Codex 会被要求:
80
80
 
81
- - 每项任务开始前调用一次 `memory_get_context`。
81
+ - 每项新任务开始前调用一次 `memory-get-context`;如果当前任务对话中已有其结果,不要重复调用,后续按需使用 `memory-search`。
82
82
  - 在 Git 项目中使用仓库根目录的绝对路径作为 `scope`。
83
83
  - 将用户表达的长期偏好、决定、纠正和项目约定及时写入或更新到 Memory One。
84
84
 
@@ -88,17 +88,20 @@ Memory One 只会替换 `~/.codex/AGENTS.md` 中由自己管理的 `memory-one:c
88
88
 
89
89
  完成 MCP 配置后:
90
90
 
91
- 1. 在工作台右上角单击 **新建记忆**。
92
- 2. 保存一条希望 Agent 长期遵守的偏好或项目约定。
93
- 3. Agent 中开始一个新任务,确认它调用了 `memory_get_context`。
91
+ 1. 打开工作台右下角的 **记忆管家**。
92
+ 2. 用自然语言让它保存一条希望 Agent 长期遵守的偏好或项目约定。
93
+ 3. 在你的 Agent 中开始一个新任务,确认它调用了 `memory-get-context`。
94
94
  4. 回到 **MCP 服务** 页面查看调用统计,或在 **全部记忆** 中检查新增和召回的记忆。
95
95
 
96
96
  ## 主要能力
97
97
 
98
98
  - **长期保存经验**:记录偏好、事实、项目决策、工作流程和纠正意见。
99
- - **任务前自动召回**:通过 `memory_get_context` Agent 开始工作前读取相关经验。
99
+ - **任务前自动召回**:每个新任务的首次消息通过 `memory-get-context` 读取固定上下文,同一任务后续通过 `memory-search` 按需检索其他记忆。
100
100
  - **区分项目与通用记忆**:使用可选的 `scope` 对记忆分类,同时支持项目记忆与全局记忆联合召回。
101
- - **可视化管理**:搜索、筛选、新建、编辑和删除记忆,并查看召回次数与置信度。
101
+ - **重复与替代保护**:完全重复不会再次写入;相似内容会作为候选返回,替代旧经验需要显式指定。
102
+ - **可视化管理**:搜索、筛选和查看记忆,通过记忆管家创建、编辑或删除记忆,并可查看召回次数与置信度。
103
+ - **召回可诊断**:查看单条记忆和全局最近召回的来源、查询和时间。
104
+ - **安全备份**:从设置页导出 JSON,或按需合并/替换恢复。
102
105
  - **本地存储**:默认仅监听本机地址,数据保存在本地 SQLite 数据库中。
103
106
  - **调用可观察**:查看 MCP 调用次数、成功率、平均耗时和各工具使用情况。
104
107
 
@@ -122,17 +125,17 @@ MCP 服务与 Codex 配置:
122
125
  2. 填写模型服务的 Base URL。
123
126
  3. 选择请求格式并选择或填写模型。
124
127
  4. 非本地模型服务需要填写 API Key。
125
- 5. 按需设置默认 Scope,以及是否在每轮对话前自动读取上下文。
128
+ 5. 按需设置默认 Scope,以及是否在每个新任务的首次消息前自动读取上下文。
126
129
  6. 保存配置后开始对话。
127
130
 
128
- 模型配置保存在本机 SQLite 数据库中;记忆操作仍通过 Memory One 的 MCP 工具完成。
131
+ 模型配置保存在本机 SQLite 数据库中;记忆操作仍通过 Memory One 的 MCP 工具完成。内置 Agent 只有在用户明确要求记住、保存、修改或删除时才会写入记忆,未明确要求时会先询问确认。
129
132
 
130
133
  ## MCP 工具
131
134
 
132
135
  | 工具 | 用途 |
133
136
  | --- | --- |
134
- | `memory_get_context` | 在任务开始时检索相关经验 |
135
- | `memory_search` | 按关键词搜索记忆,可选 `scope` |
137
+ | `memory-get-context` | 在新任务开始时读取固定上下文 |
138
+ | `memory-search` | 按关键词按需搜索记忆,可选 `scope` |
136
139
  | `memory_store` | 保存偏好、事实、决策、流程或纠正意见 |
137
140
  | `memory_get` | 按 ID 读取单条完整记忆 |
138
141
  | `memory_list` | 列出记忆,可选 `scope` |
@@ -148,7 +151,7 @@ MCP 服务与 Codex 配置:
148
151
  - **通用记忆**:省略 `scope`。
149
152
  - **其他分类**:也可以使用 `work`、`personal` 等自定义值。
150
153
 
151
- `memory_get_context` 传入项目 `scope` 时,会联合召回该项目和全局记忆;省略 `scope` 时,只召回全局记忆。`memory_search` 省略 `scope` 时,可以跨分类搜索。
154
+ `memory-get-context` 传入项目 `scope` 时,会优先返回该项目和全局范围内标记为 `metadata.always_include=true` 的固定记忆;省略 `scope` 时,只返回全局固定记忆。后续需要具体历史信息时使用 `memory-search`;省略 `scope` 时可以跨分类搜索。
152
155
 
153
156
  ## CLI 命令
154
157
 
@@ -176,13 +179,18 @@ memoryone update # 更新到最新版本
176
179
  - PID:`~/.local/share/memory-one/memory-one.pid`
177
180
  - 日志:`~/.local/share/memory-one/memory-one.log`
178
181
 
179
- 备份记忆时,建议先执行:
182
+ 推荐使用 Web 界面备份:进入 **设置 → 数据备份**,选择 **导出 JSON**。恢复时可以选择:
183
+
184
+ - **合并导入**:跳过完全重复的记忆,保留当前数据。
185
+ - **替换导入**:确认后删除当前记忆,并使用备份中的记忆和安全配置替代。
186
+
187
+ 如需完整数据库级备份,建议先执行:
180
188
 
181
189
  ```bash
182
190
  memoryone stop
183
191
  ```
184
192
 
185
- 然后复制 `memory.db` 文件。恢复时,在服务停止状态下用备份文件替换原数据库,再重新启动服务。
193
+ 然后复制 `memory.db` 文件。恢复时,在服务停止状态下用备份文件替换原数据库,再重新启动服务。升级到 schema v2 时,服务会在数据库目录的 `backups/` 中自动创建迁移前备份。
186
194
 
187
195
  ## 更新与卸载
188
196
 
@@ -216,7 +224,7 @@ npm uninstall --global @ccjr1120/memory-one
216
224
  确认以下事项:
217
225
 
218
226
  1. Agent 已配置 Memory One MCP 地址。
219
- 2. 如果开启了 Bearer Key 认证,确认客户端已填写有效 Key,且 Key 已授权 `memory_get_context`。
227
+ 2. 如果开启了 Bearer Key 认证,确认客户端已填写有效 Key,且 Key 已授权 `memory-get-context`。
220
228
  3. 使用 Codex 时,确认已在 Codex 卡片中启用 **全局任务前置记忆**。
221
229
  4. 启用后已经重启 Agent 或开启新会话。
222
230
 
@@ -226,4 +234,4 @@ npm uninstall --global @ccjr1120/memory-one
226
234
 
227
235
  ### 如何确认 MCP 已连接
228
236
 
229
- 在 Agent 中调用一次 `memory_get_context`,然后打开工作台的 **MCP 服务** 页面查看调用统计。也可以让 Agent 保存一条测试记忆,再到 **全部记忆** 中搜索确认。
237
+ 在 Agent 中调用一次 `memory-get-context`,然后打开工作台的 **MCP 服务** 页面查看调用统计。也可以让 Agent 保存一条测试记忆,再到 **全部记忆** 中搜索确认。
@@ -0,0 +1,113 @@
1
+ export async function readSse(response, onEvent) {
2
+ if (!response.body)
3
+ throw new Error("provider_empty_stream");
4
+ const reader = response.body.getReader();
5
+ const decoder = new TextDecoder();
6
+ let buffer = "";
7
+ while (true) {
8
+ const { value, done } = await reader.read();
9
+ buffer += decoder.decode(value ?? new Uint8Array(), { stream: !done });
10
+ const chunks = buffer.split(/\r?\n\r?\n/);
11
+ buffer = chunks.pop() ?? "";
12
+ for (const chunk of chunks) {
13
+ const lines = chunk.split(/\r?\n/);
14
+ const event = lines.find((line) => line.startsWith("event:"))?.slice(6).trim() ?? "message";
15
+ const data = lines.filter((line) => line.startsWith("data:")).map((line) => line.slice(5).trim()).join("\n");
16
+ if (data && await onEvent({ event, data }) === false) {
17
+ await reader.cancel().catch(() => undefined);
18
+ return;
19
+ }
20
+ }
21
+ if (done)
22
+ break;
23
+ }
24
+ }
25
+ export function normalizeTools(tools) {
26
+ return tools.map((tool) => ({ type: "function", function: { name: tool.name, description: tool.description ?? "", parameters: tool.inputSchema } }));
27
+ }
28
+ export async function openAiRound(config, messages, tools, emit) {
29
+ const base = (config.base_url?.trim() || "").replace(/\/$/, "");
30
+ 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 }) });
31
+ if (!response.ok)
32
+ throw new Error(`provider_http_${response.status}: ${await response.text()}`);
33
+ let content = "";
34
+ const calls = new Map();
35
+ await readSse(response, ({ data }) => {
36
+ if (data === "[DONE]")
37
+ return false;
38
+ const chunk = JSON.parse(data);
39
+ const delta = chunk.choices?.[0]?.delta;
40
+ if (delta?.content) {
41
+ content += delta.content;
42
+ emit({ type: "delta", text: delta.content });
43
+ }
44
+ for (const call of delta?.tool_calls ?? []) {
45
+ const existing = calls.get(call.index) ?? { id: call.id ?? "", name: call.function?.name ?? "", arguments: "" };
46
+ existing.id ||= call.id ?? "";
47
+ existing.name ||= call.function?.name ?? "";
48
+ existing.arguments += call.function?.arguments ?? "";
49
+ calls.set(call.index, existing);
50
+ }
51
+ });
52
+ return { content, toolCalls: [...calls.values()] };
53
+ }
54
+ function responsesInput(messages) {
55
+ return messages.filter((message) => message.role !== "system").flatMap((message) => {
56
+ if (message.role === "tool")
57
+ return [{ type: "function_call_output", call_id: message.tool_call_id, output: message.content }];
58
+ if (message.role === "assistant" && Array.isArray(message.tool_calls)) {
59
+ return message.tool_calls.map((call) => ({ type: "function_call", call_id: call.id, name: call.function.name, arguments: call.function.arguments }));
60
+ }
61
+ return [{ role: message.role, content: message.content }];
62
+ });
63
+ }
64
+ export async function openAiResponsesRound(config, messages, tools, emit) {
65
+ const base = (config.base_url?.trim() || "").replace(/\/$/, "");
66
+ const system = messages.find((message) => message.role === "system")?.content;
67
+ 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 }) });
68
+ if (!response.ok)
69
+ throw new Error(`provider_http_${response.status}: ${await response.text()}`);
70
+ const payload = await response.json();
71
+ let content = "";
72
+ const toolCalls = [];
73
+ for (const item of payload.output ?? []) {
74
+ if (item.type === "message")
75
+ for (const part of item.content ?? [])
76
+ if (part.type === "output_text" && part.text)
77
+ content += part.text;
78
+ if (item.type === "function_call")
79
+ toolCalls.push({ id: item.call_id || item.id, name: item.name, arguments: item.arguments || "{}" });
80
+ }
81
+ if (content)
82
+ emit({ type: "delta", text: content });
83
+ return { content, toolCalls };
84
+ }
85
+ export async function anthropicRound(config, messages, tools, emit) {
86
+ const base = (config.base_url?.trim() || "").replace(/\/$/, "");
87
+ const system = messages.find((message) => message.role === "system")?.content;
88
+ 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 }) });
89
+ if (!response.ok)
90
+ throw new Error(`provider_http_${response.status}: ${await response.text()}`);
91
+ let content = "";
92
+ const calls = [];
93
+ let current = null;
94
+ await readSse(response, ({ event, data }) => {
95
+ if (event === "message_stop")
96
+ return false;
97
+ const item = JSON.parse(data);
98
+ if (event === "content_block_start" && item.content_block?.type === "tool_use") {
99
+ current = { id: item.content_block.id, name: item.content_block.name, arguments: "" };
100
+ calls.push(current);
101
+ }
102
+ if (event === "content_block_delta") {
103
+ if (item.delta?.type === "text_delta") {
104
+ content += item.delta.text;
105
+ emit({ type: "delta", text: item.delta.text });
106
+ }
107
+ if (item.delta?.type === "input_json_delta" && current)
108
+ current.arguments += item.delta.partial_json;
109
+ }
110
+ });
111
+ return { content, toolCalls: calls };
112
+ }
113
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/agent/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { CallToolResultSchema } from "@modelcontextprotocol/sdk/types.js";
2
+ import { anthropicRound, normalizeTools, openAiResponsesRound, openAiRound } from "./providers.js";
3
+ const agentSystemPrompt = "你是 Memory One 的记忆管家,首要职责是结合已读取的相关记忆直接回答用户的问题。你可以主动搜索和读取记忆来提高回答准确性,但不得因为普通对话、提问、纠正回答、顺带提到的偏好或项目细节而新增、更新或删除记忆。只有当用户明确要求‘记住/保存’某项内容、明确要求修改某条记忆,或明确要求‘忘记/删除’某条记忆时,才调用 memory_store、memory_update 或 memory_delete。执行更新或删除前先确认目标唯一,不要编造记忆。回复使用中文,简洁但可以使用 Markdown。";
4
+ const toolLabels = { "memory-get-context": "读取固定上下文", "memory-search": "搜索记忆", memory_get: "读取记忆", memory_list: "列出记忆", memory_store: "保存记忆", memory_update: "更新记忆", memory_delete: "删除记忆", memory_feedback: "记录反馈" };
5
+ const isMemoryOverviewRequest = (message) => /(?:有哪些|所有记忆|全部记忆|列出(?:全部)?|查看(?:全部)?|浏览全部|总结(?:下)?(?:我的)?记忆|总结我的特点|概括我的特点|我的画像|我的偏好和特点|我的记忆(?:有什么)?特点|记忆特点)/.test(message);
6
+ const parseMcpText = (value, fallback) => {
7
+ const content = value.content;
8
+ const text = content?.filter((item) => item.type === "text").map((item) => item.text ?? "").join("\n");
9
+ if (!text)
10
+ return fallback;
11
+ try {
12
+ return JSON.parse(text);
13
+ }
14
+ catch {
15
+ return text;
16
+ }
17
+ };
18
+ export async function runAgent(request, emit, connectMemoryMcp) {
19
+ const provider = (request.provider || "").toLowerCase();
20
+ if (!request.message?.trim()) {
21
+ emit({ type: "delta", text: "告诉我你想查找、保存、修改、删除,还是总结哪些记忆?" });
22
+ emit({ type: "done", toolCalls: [] });
23
+ return;
24
+ }
25
+ if (!["openai", "openai-compatible", "anthropic", "local"].includes(provider))
26
+ throw new Error("unsupported_provider");
27
+ if (!request.base_url?.trim())
28
+ throw new Error("missing_base_url");
29
+ if (provider !== "local" && !request.api_key)
30
+ throw new Error("missing_api_key");
31
+ const { client, transport } = await connectMemoryMcp();
32
+ const toolResult = await client.listTools();
33
+ const tools = normalizeTools(toolResult.tools);
34
+ const toolCalls = [];
35
+ const history = (request.history ?? []).slice(-12).filter((message) => message.content).map((message) => ({ role: message.role, content: message.content }));
36
+ const messages = [{ role: "system", content: `${agentSystemPrompt}${request.scope ? ` 默认 Scope:${request.scope}` : ""}${request.auto_context === false ? " 不需要自动读取上下文。" : " 每个新任务开始时先调用 memory-get-context;后续如需具体历史信息,使用 memory-search。"}` }, ...history];
37
+ if (!history.some((message) => message.role === "user" && message.content === request.message))
38
+ messages.push({ role: "user", content: request.message });
39
+ try {
40
+ if (request.auto_context !== false) {
41
+ const overviewRequest = isMemoryOverviewRequest(request.message);
42
+ const context = await client.callTool({ name: "memory-get-context", arguments: { scope: request.scope || null, limit: overviewRequest ? 50 : 10 } }, CallToolResultSchema);
43
+ const contextText = JSON.stringify(parseMcpText(context, {}));
44
+ const parsed = parseMcpText(context, {});
45
+ toolCalls.push({ name: "memory-get-context", label: toolLabels["memory-get-context"], count: Array.isArray(parsed) ? parsed.length : parsed?.memories?.length });
46
+ emit({ type: "tool", tool: toolCalls.at(-1) });
47
+ messages[0] = { role: "system", content: `${messages[0].content}\n\n已自动读取 memory-get-context,结果如下。请基于这些固定上下文回答;如需查找具体历史信息,请调用 memory-search,不要重复调用 memory-get-context:\n${contextText}` };
48
+ if (overviewRequest) {
49
+ const listed = await client.callTool({ name: "memory_list", arguments: { scope: request.scope || null, limit: 100 } }, CallToolResultSchema);
50
+ const listedText = JSON.stringify(parseMcpText(listed, []));
51
+ const listedParsed = parseMcpText(listed, []);
52
+ const listCall = { name: "memory_list", label: toolLabels.memory_list, count: Array.isArray(listedParsed) ? listedParsed.length : undefined };
53
+ toolCalls.push(listCall);
54
+ emit({ type: "tool", tool: listCall });
55
+ messages[0] = { role: "system", content: `${messages[0].content}\n\n这是针对“有哪些记忆/总结特点”问题通过 MCP memory_list 获取的完整记忆列表。请直接基于它回答,不要声称没有上下文:\n${listedText}` };
56
+ }
57
+ }
58
+ for (let round = 0; round < 6; round += 1) {
59
+ const result = provider === "anthropic" ? await anthropicRound(request, messages, tools, emit) : provider === "openai" ? await openAiResponsesRound(request, messages, tools, emit) : await openAiRound(request, messages, tools, emit);
60
+ if (!result.toolCalls.length) {
61
+ emit({ type: "done", toolCalls });
62
+ return;
63
+ }
64
+ if (provider === "anthropic")
65
+ 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 || "{}") }))] });
66
+ else
67
+ 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 } })) });
68
+ for (const call of result.toolCalls) {
69
+ const args = JSON.parse(call.arguments || "{}");
70
+ if (request.scope && ["memory-get-context", "memory-search", "memory_list", "memory_store"].includes(call.name) && args.scope == null)
71
+ args.scope = request.scope;
72
+ if (request.scope && call.name === "memory_update" && args.patch && typeof args.patch === "object" && args.patch.scope == null)
73
+ args.patch = { ...args.patch, scope: request.scope };
74
+ const output = await client.callTool({ name: call.name, arguments: args }, CallToolResultSchema);
75
+ const text = output.content?.filter((item) => item.type === "text").map((item) => item.text ?? "").join("\n") || JSON.stringify(output);
76
+ if (provider === "anthropic")
77
+ messages.push({ role: "user", content: [{ type: "tool_result", tool_use_id: call.id, content: text }] });
78
+ else
79
+ messages.push({ role: "tool", tool_call_id: call.id, content: text });
80
+ const count = (() => { try {
81
+ const parsed = JSON.parse(text);
82
+ return Array.isArray(parsed) ? parsed.length : parsed?.memories?.length ?? undefined;
83
+ }
84
+ catch {
85
+ return undefined;
86
+ } })();
87
+ const latest = { name: call.name, label: toolLabels[call.name] ?? call.name, ...(count === undefined ? {} : { count }) };
88
+ toolCalls.push(latest);
89
+ emit({ type: "tool", tool: latest });
90
+ }
91
+ }
92
+ throw new Error("agent_tool_loop_limit");
93
+ }
94
+ finally {
95
+ await transport.close().catch(() => undefined);
96
+ }
97
+ }
98
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/agent/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ export async function exportBackup() {
2
+ const response = await fetch("/api/data/export");
3
+ if (!response.ok)
4
+ throw new Error("export_failed");
5
+ return response.blob();
6
+ }
7
+ export async function importBackup(data, mode) {
8
+ const response = await fetch("/api/data/import", {
9
+ method: "POST",
10
+ headers: { "content-type": "application/json" },
11
+ body: JSON.stringify({ data, mode }),
12
+ });
13
+ const result = await response.json();
14
+ if (!response.ok)
15
+ throw new Error("import_failed");
16
+ return result;
17
+ }
18
+ export function downloadBackup(blob, date = new Date()) {
19
+ const url = URL.createObjectURL(blob);
20
+ const link = document.createElement("a");
21
+ link.href = url;
22
+ link.download = `memory-one-backup-${date.toISOString().slice(0, 10)}.json`;
23
+ link.click();
24
+ URL.revokeObjectURL(url);
25
+ }
26
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAa,EAAE,IAAyB;IACzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;KACrC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAsB,CAAC;IACzD,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAU,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAChB,IAAI,CAAC,QAAQ,GAAG,qBAAqB,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;IAC5E,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"}
package/dist/app.js ADDED
@@ -0,0 +1,36 @@
1
+ import Fastify from "fastify";
2
+ import { randomUUID } from "node:crypto";
3
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
4
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
5
+ import { MemoryStore } from "./storage.js";
6
+ import { ContextCache } from "./mcp/context-cache.js";
7
+ import { createCodexIntegrationService } from "./integrations/codex.js";
8
+ import { registerMemoryRoutes } from "./routes/memories.js";
9
+ import { registerDataRoutes } from "./routes/data.js";
10
+ import { registerSettingsRoutes } from "./routes/settings.js";
11
+ import { registerIntegrationRoutes } from "./routes/integrations.js";
12
+ import { registerAgentRoutes } from "./routes/agent.js";
13
+ import { registerMcpRoutes } from "./routes/mcp.js";
14
+ import { packageVersion, registerSystemRoutes } from "./routes/system.js";
15
+ export function createApp(options = {}) {
16
+ const store = new MemoryStore(options.dbPath ?? process.env.MEMORY_DB_PATH ?? "data/memory.db");
17
+ const internalMcpToken = randomUUID();
18
+ const contextCache = new ContextCache();
19
+ const app = Fastify({ logger: true });
20
+ const connectMemoryMcp = async () => {
21
+ const client = new Client({ name: "memory-one-agent", version: "0.1.0" });
22
+ const transport = new StreamableHTTPClientTransport(new URL(`http://127.0.0.1:${process.env.MEMORY_PORT ?? 8765}/mcp`), { requestInit: { headers: { "x-memory-one-internal": internalMcpToken } } });
23
+ await client.connect(transport);
24
+ return { client, transport };
25
+ };
26
+ const codex = createCodexIntegrationService(store);
27
+ registerSystemRoutes(app, packageVersion);
28
+ registerMemoryRoutes(app, store);
29
+ registerDataRoutes(app, store);
30
+ registerSettingsRoutes(app, store);
31
+ registerIntegrationRoutes(app, codex);
32
+ registerAgentRoutes(app, store, connectMemoryMcp);
33
+ registerMcpRoutes(app, store, internalMcpToken, contextCache);
34
+ return { app, store };
35
+ }
36
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1E,MAAM,UAAU,SAAS,CAAC,UAA+B,EAAE;IACzD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,gBAAgB,CAAC,CAAC;IAChG,MAAM,gBAAgB,GAAG,UAAU,EAAE,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAClC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,oBAAoB,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC;QACrM,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAC;IAEnD,oBAAoB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,sBAAsB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,yBAAyB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,gBAAuB,CAAC,CAAC;IACzD,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC9D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,143 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ const codexAgentsPath = join(process.env.CODEX_HOME ?? join(homedir(), ".codex"), "AGENTS.md");
5
+ const codexConfigPath = join(process.env.CODEX_HOME ?? join(homedir(), ".codex"), "config.toml");
6
+ const codexGuidanceStart = "<!-- memory-one:codex:start -->";
7
+ const codexGuidanceEnd = "<!-- memory-one:codex:end -->";
8
+ const codexGuidance = `${codexGuidanceStart}
9
+ ## Memory One
10
+
11
+ Before starting any new user task, call the Memory One MCP tool \`memory-get-context\` once to retrieve persistent context.
12
+
13
+ - 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.
14
+ - Apply the returned persistent preferences and project conventions before planning, answering, editing files, or calling task-specific tools.
15
+ - If a \`memory-get-context\` result already exists in the current task conversation, do not call it again; use \`memory-search\` when a specific historical preference, decision, fact, or project convention is needed.
16
+ - Only save a memory when the user explicitly asks to remember or save it; if a durable preference, decision, project convention, personal fact, or correction seems worth keeping but the user did not ask, ask for confirmation instead. Use \`memory_update\` only after the user explicitly asks to change an existing memory. Do not save clearly transient, one-off details.
17
+ - Before storing, prefer updating or superseding a similar memory instead of creating a near-duplicate.
18
+ - Do not skip retrieval merely because the task appears self-contained.
19
+ ${codexGuidanceEnd}`;
20
+ async function readCodexAgents() {
21
+ try {
22
+ return await readFile(codexAgentsPath, "utf8");
23
+ }
24
+ catch (error) {
25
+ if (error.code === "ENOENT")
26
+ return "";
27
+ throw error;
28
+ }
29
+ }
30
+ function removeManagedCodexGuidance(content) {
31
+ const start = content.indexOf(codexGuidanceStart);
32
+ const end = content.indexOf(codexGuidanceEnd, start + codexGuidanceStart.length);
33
+ if (start < 0 || end < 0)
34
+ return content;
35
+ const before = content.slice(0, start).trimEnd();
36
+ const after = content.slice(end + codexGuidanceEnd.length).trimStart();
37
+ return [before, after].filter(Boolean).join("\n\n");
38
+ }
39
+ async function readCodexConfig() {
40
+ try {
41
+ return await readFile(codexConfigPath, "utf8");
42
+ }
43
+ catch (error) {
44
+ if (error.code === "ENOENT")
45
+ return "";
46
+ throw error;
47
+ }
48
+ }
49
+ function isMemoryOneCodexSection(name) {
50
+ const normalized = name.replace(/"memory-one"/g, "memory-one");
51
+ return normalized === "mcp_servers.memory-one" || normalized.startsWith("mcp_servers.memory-one.");
52
+ }
53
+ function getMemoryOneCodexSections(content) {
54
+ const sections = [];
55
+ let current = null;
56
+ for (const line of content.split("\n")) {
57
+ const section = line.match(/^\s*\[([^\]]+)]\s*(?:#.*)?$/);
58
+ if (section) {
59
+ if (current)
60
+ sections.push(current.join("\n"));
61
+ current = isMemoryOneCodexSection(section[1].trim()) ? [line] : null;
62
+ }
63
+ else if (current)
64
+ current.push(line);
65
+ }
66
+ if (current)
67
+ sections.push(current.join("\n"));
68
+ return sections.join("\n");
69
+ }
70
+ function removeMemoryOneCodexSections(content) {
71
+ const lines = [];
72
+ let removing = false;
73
+ for (const line of content.split("\n")) {
74
+ const section = line.match(/^\s*\[([^\]]+)]\s*(?:#.*)?$/);
75
+ if (section)
76
+ removing = isMemoryOneCodexSection(section[1].trim());
77
+ if (!removing)
78
+ lines.push(line);
79
+ }
80
+ return lines.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd();
81
+ }
82
+ function readTomlString(source, key) {
83
+ const match = source.match(new RegExp(`(?:^|[,{]\\s*)${key}\\s*=\\s*("(?:[^"\\\\]|\\\\.)*"|'[^']*')`, "im"));
84
+ if (!match)
85
+ return null;
86
+ if (match[1].startsWith("'"))
87
+ return match[1].slice(1, -1);
88
+ try {
89
+ return JSON.parse(match[1]);
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ export function createCodexIntegrationService(store) {
96
+ const getCodexIntegration = async () => {
97
+ const content = await readCodexAgents();
98
+ const start = content.indexOf(codexGuidanceStart);
99
+ const end = content.indexOf(codexGuidanceEnd, start + codexGuidanceStart.length);
100
+ const installed = start >= 0 && end >= 0;
101
+ const managed = installed ? content.slice(start, end + codexGuidanceEnd.length) : "";
102
+ return { path: codexAgentsPath, status: installed ? managed === codexGuidance ? "configured" : "update_available" : "not_configured" };
103
+ };
104
+ const installCodexIntegration = async () => {
105
+ const content = await readCodexAgents();
106
+ const preserved = removeManagedCodexGuidance(content);
107
+ await mkdir(dirname(codexAgentsPath), { recursive: true });
108
+ await writeFile(codexAgentsPath, `${preserved ? `${preserved}\n\n` : ""}${codexGuidance}\n`, "utf8");
109
+ return getCodexIntegration();
110
+ };
111
+ const getCodexMcpIntegration = async (expectedEndpoint) => {
112
+ const content = await readCodexConfig();
113
+ const sections = getMemoryOneCodexSections(content);
114
+ const endpoint = readTomlString(sections, "url");
115
+ const authorization = readTomlString(sections, "Authorization");
116
+ const key = authorization?.match(/^Bearer\s+(.+)$/i)?.[1]?.trim();
117
+ const keyRecord = key ? store.verifyMcpKey(key) : null;
118
+ const authRequired = store.getMcpConfig().use_bearer_key;
119
+ const configured = endpoint === expectedEndpoint && (authRequired ? Boolean(keyRecord) : !authorization);
120
+ return {
121
+ path: codexConfigPath,
122
+ detected: Boolean(content),
123
+ endpoint,
124
+ auth_required: authRequired,
125
+ configured_key_id: keyRecord?.id ?? null,
126
+ status: configured ? "configured" : sections ? "update_available" : "not_configured",
127
+ };
128
+ };
129
+ const installCodexMcpIntegration = async (endpoint, keyId) => {
130
+ const authRequired = store.getMcpConfig().use_bearer_key;
131
+ const key = authRequired && keyId ? store.getMcpKey(keyId) : null;
132
+ if (authRequired && (!key?.secret || key.revoked_at))
133
+ throw new Error("mcp_key_not_found");
134
+ const content = await readCodexConfig();
135
+ const preserved = removeMemoryOneCodexSections(content);
136
+ const section = `[mcp_servers.memory-one]\nurl = ${JSON.stringify(endpoint)}${authRequired ? `\nhttp_headers = { Authorization = ${JSON.stringify(`Bearer ${key.secret}`)} }` : ""}`;
137
+ await mkdir(dirname(codexConfigPath), { recursive: true });
138
+ await writeFile(codexConfigPath, `${preserved ? `${preserved}\n\n` : ""}${section}\n`, "utf8");
139
+ return getCodexMcpIntegration(endpoint);
140
+ };
141
+ return { getCodexIntegration, installCodexIntegration, getCodexMcpIntegration, installCodexMcpIntegration };
142
+ }
143
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/integrations/codex.ts"],"names":[],"mappings":"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"}