memkin 0.4.0 → 0.4.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.
Files changed (129) hide show
  1. package/README.en.md +108 -836
  2. package/README.md +108 -836
  3. package/README.zh-CN.md +80 -44
  4. package/dist/cli-stores.d.ts +12 -0
  5. package/dist/cli-stores.d.ts.map +1 -1
  6. package/dist/cli-stores.js +15 -1
  7. package/dist/cli-stores.js.map +1 -1
  8. package/dist/cli.js +94 -6
  9. package/dist/cli.js.map +1 -1
  10. package/dist/collectors/agent/claude-code.d.ts.map +1 -1
  11. package/dist/collectors/agent/claude-code.js +10 -29
  12. package/dist/collectors/agent/claude-code.js.map +1 -1
  13. package/dist/collectors/agent/codex.d.ts.map +1 -1
  14. package/dist/collectors/agent/codex.js +24 -10
  15. package/dist/collectors/agent/codex.js.map +1 -1
  16. package/dist/collectors/agent/collector.d.ts +38 -0
  17. package/dist/collectors/agent/collector.d.ts.map +1 -1
  18. package/dist/collectors/agent/collector.js +91 -20
  19. package/dist/collectors/agent/collector.js.map +1 -1
  20. package/dist/collectors/agent/hermes.d.ts.map +1 -1
  21. package/dist/collectors/agent/hermes.js +5 -1
  22. package/dist/collectors/agent/hermes.js.map +1 -1
  23. package/dist/collectors/feishu/sources/calendar.d.ts.map +1 -1
  24. package/dist/collectors/feishu/sources/calendar.js +18 -7
  25. package/dist/collectors/feishu/sources/calendar.js.map +1 -1
  26. package/dist/consolidator/consolidator.d.ts +9 -1
  27. package/dist/consolidator/consolidator.d.ts.map +1 -1
  28. package/dist/consolidator/consolidator.js +7 -0
  29. package/dist/consolidator/consolidator.js.map +1 -1
  30. package/dist/consolidator/entity-merge.d.ts +33 -0
  31. package/dist/consolidator/entity-merge.d.ts.map +1 -0
  32. package/dist/consolidator/entity-merge.js +148 -0
  33. package/dist/consolidator/entity-merge.js.map +1 -0
  34. package/dist/core/agent-session-scanner.d.ts +23 -0
  35. package/dist/core/agent-session-scanner.d.ts.map +1 -0
  36. package/dist/core/agent-session-scanner.js +69 -0
  37. package/dist/core/agent-session-scanner.js.map +1 -0
  38. package/dist/core/canonicalize.d.ts +8 -0
  39. package/dist/core/canonicalize.d.ts.map +1 -1
  40. package/dist/core/canonicalize.js +12 -2
  41. package/dist/core/canonicalize.js.map +1 -1
  42. package/dist/core/config.d.ts +6 -0
  43. package/dist/core/config.d.ts.map +1 -1
  44. package/dist/core/config.js.map +1 -1
  45. package/dist/core/identity-resolver.d.ts +53 -3
  46. package/dist/core/identity-resolver.d.ts.map +1 -1
  47. package/dist/core/identity-resolver.js +112 -17
  48. package/dist/core/identity-resolver.js.map +1 -1
  49. package/dist/core/person-identity.d.ts +38 -3
  50. package/dist/core/person-identity.d.ts.map +1 -1
  51. package/dist/core/person-identity.js +58 -29
  52. package/dist/core/person-identity.js.map +1 -1
  53. package/dist/core/pipeline-factory.d.ts.map +1 -1
  54. package/dist/core/pipeline-factory.js +2 -1
  55. package/dist/core/pipeline-factory.js.map +1 -1
  56. package/dist/core/pipeline.js +3 -3
  57. package/dist/core/pipeline.js.map +1 -1
  58. package/dist/daemon/autostart/daemon-state.d.ts +32 -0
  59. package/dist/daemon/autostart/daemon-state.d.ts.map +1 -1
  60. package/dist/daemon/autostart/daemon-state.js +27 -1
  61. package/dist/daemon/autostart/daemon-state.js.map +1 -1
  62. package/dist/daemon/scheduler.d.ts +10 -0
  63. package/dist/daemon/scheduler.d.ts.map +1 -1
  64. package/dist/daemon/scheduler.js +20 -1
  65. package/dist/daemon/scheduler.js.map +1 -1
  66. package/dist/demo/seed.d.ts +32 -0
  67. package/dist/demo/seed.d.ts.map +1 -0
  68. package/dist/demo/seed.js +185 -0
  69. package/dist/demo/seed.js.map +1 -0
  70. package/dist/embedded-assets.generated.d.ts.map +1 -1
  71. package/dist/embedded-assets.generated.js +2 -2
  72. package/dist/embedded-assets.generated.js.map +1 -1
  73. package/dist/eval/golden.d.ts +107 -0
  74. package/dist/eval/golden.d.ts.map +1 -0
  75. package/dist/eval/golden.js +74 -0
  76. package/dist/eval/golden.js.map +1 -0
  77. package/dist/eval/judge.d.ts +82 -0
  78. package/dist/eval/judge.d.ts.map +1 -0
  79. package/dist/eval/judge.js +130 -0
  80. package/dist/eval/judge.js.map +1 -0
  81. package/dist/eval/manifest.d.ts +107 -0
  82. package/dist/eval/manifest.d.ts.map +1 -0
  83. package/dist/eval/manifest.js +84 -0
  84. package/dist/eval/manifest.js.map +1 -0
  85. package/dist/eval/metrics.d.ts +87 -0
  86. package/dist/eval/metrics.d.ts.map +1 -0
  87. package/dist/eval/metrics.js +97 -0
  88. package/dist/eval/metrics.js.map +1 -0
  89. package/dist/extractors/noise-filter.d.ts +7 -3
  90. package/dist/extractors/noise-filter.d.ts.map +1 -1
  91. package/dist/extractors/noise-filter.js +16 -3
  92. package/dist/extractors/noise-filter.js.map +1 -1
  93. package/dist/extractors/signal-extractor.d.ts.map +1 -1
  94. package/dist/extractors/signal-extractor.js +13 -2
  95. package/dist/extractors/signal-extractor.js.map +1 -1
  96. package/dist/lifecycle/legacy-migration.d.ts +6 -2
  97. package/dist/lifecycle/legacy-migration.d.ts.map +1 -1
  98. package/dist/lifecycle/legacy-migration.js +69 -4
  99. package/dist/lifecycle/legacy-migration.js.map +1 -1
  100. package/dist/server/api.d.ts.map +1 -1
  101. package/dist/server/api.js +18 -7
  102. package/dist/server/api.js.map +1 -1
  103. package/dist/server/backfill-routes.d.ts.map +1 -1
  104. package/dist/server/backfill-routes.js +2 -1
  105. package/dist/server/backfill-routes.js.map +1 -1
  106. package/dist/server/mcp.d.ts +4 -4
  107. package/dist/store/agent-sessions.d.ts +59 -0
  108. package/dist/store/agent-sessions.d.ts.map +1 -0
  109. package/dist/store/agent-sessions.js +119 -0
  110. package/dist/store/agent-sessions.js.map +1 -0
  111. package/dist/store/database.d.ts +20 -1
  112. package/dist/store/database.d.ts.map +1 -1
  113. package/dist/store/database.js +44 -6
  114. package/dist/store/database.js.map +1 -1
  115. package/dist/store/embedding.d.ts +20 -2
  116. package/dist/store/embedding.d.ts.map +1 -1
  117. package/dist/store/embedding.js +20 -5
  118. package/dist/store/embedding.js.map +1 -1
  119. package/dist/store/entity-suggestions.d.ts +62 -0
  120. package/dist/store/entity-suggestions.d.ts.map +1 -0
  121. package/dist/store/entity-suggestions.js +80 -0
  122. package/dist/store/entity-suggestions.js.map +1 -0
  123. package/dist/store/migrations/index.d.ts.map +1 -1
  124. package/dist/store/migrations/index.js +91 -0
  125. package/dist/store/migrations/index.js.map +1 -1
  126. package/dist/store/pages.d.ts.map +1 -1
  127. package/dist/store/pages.js +12 -3
  128. package/dist/store/pages.js.map +1 -1
  129. package/package.json +1 -1
package/README.zh-CN.md CHANGED
@@ -1,9 +1,11 @@
1
1
  <p align="center">
2
- <h1 align="center">Memkin</h1>
3
- <p align="center"><em>人是一切社会关系的总和。</em></p>
4
- <p align="center"><strong>一个面向个人工作场景的、本地优先的记忆系统 —— 把你的私聊、群聊、邮件、文档、会议,沉淀成本地私有的个人记忆,让你的 AI Agent 最懂你。</strong></p>
2
+ <img src="docs/assets/memkin-cover.png" alt="Memkin — 让你的 AI,最懂你" width="100%">
5
3
  </p>
6
4
 
5
+ <h1 align="center">让你的 AI,最懂你。</h1>
6
+
7
+ <p align="center"><strong>你的 AI Agent 每天都在失忆。Memkin 把你的飞书聊天、会议、邮件和 AI 编程会话,沉淀成本地私有的记忆图谱——让任何 Agent 通过 MCP 秒懂你。</strong></p>
8
+
7
9
  <p align="center">
8
10
  简体中文 | <a href="README.en.md">English</a>
9
11
  </p>
@@ -13,21 +15,60 @@
13
15
  <a href="https://www.npmjs.com/package/memkin"><img alt="npm" src="https://img.shields.io/npm/v/memkin?color=cb3837&logo=npm"></a>
14
16
  <img alt="Runtime: Bun" src="https://img.shields.io/badge/runtime-Bun-black">
15
17
  <img alt="Language: TypeScript" src="https://img.shields.io/badge/lang-TypeScript-3178c6">
16
- <img alt="Tests: 1000+" src="https://img.shields.io/badge/tests-1000%2B-success">
18
+ <img alt="Tests: 1700+" src="https://img.shields.io/badge/tests-1700%2B-success">
17
19
  </p>
18
20
 
19
21
  <p align="center">
20
- <img src="docs/assets/web-ui-graph.jpeg" alt="Memkin 知识图谱 —— 实体、决策、任务、知识在你的工作中相互连接" width="850">
22
+ <img src="docs/assets/demo.gif" alt="在 Claude Code 里向 Memkin 提问:上周和 Alice 聊了什么?—— 得到带 [n] 引用的回答" width="850">
21
23
  <br>
22
- <em>把你的工作变成一张活的知识图谱 —— 人、决策、任务、知识,全部连起来。</em>
24
+ <em>在 Claude Code 里问一句,Memkin 通过 MCP 给出带引用、可溯源的回答。</em>
23
25
  </p>
24
26
 
25
- <!-- TODO(demo): 在此处替换为一段 8~12 秒的演示 GIF —— 在 Claude Code 里向 Memkin 提问,
26
- Agent 通过 MCP 召回一条飞书会议决策 + 关联任务。脚本见 docs(hero demo)。
27
- 研究表明,"展示产品真正在工作"的 GIF 是 README 转化率最高的单一要素。 -->
28
-
29
27
  ---
30
28
 
29
+ ## ⚡ 30 秒上手
30
+
31
+ ```bash
32
+ npx memkin start
33
+ ```
34
+
35
+ 一条命令,全部搞定:没有配置时自动打开浏览器 setup 向导,配置完成后立即启动服务并打开 Web UI;已有配置则直接起服务。裸跑 `npx memkin` 等效。
36
+
37
+ > 前置条件:[Node.js](https://nodejs.org) >= 18。npm 包名与命令名均为 `memkin`。
38
+
39
+ ## 三大支柱
40
+
41
+ **🕸️ 人是一切社会关系的总和**
42
+ 记忆不是一堆向量分块。信号被锚定到实体(人、项目、工具)并以有向图相互链接——你得到的是有上下文的答案:谁、为什么、和什么相关。
43
+
44
+ **🔒 数据不出你的机器**
45
+ PGLite 嵌入式数据库本地存储一切,可选 Ollama 本地向量嵌入,零云依赖。双轨隐私脱敏(可逆 / 不可逆)在写入前清洗敏感信息。
46
+
47
+ **🤖 Agent 既读又写**
48
+ 以 **15 个高意图 MCP 工具**为核心(`query` / `recall` / `synthesize` / `prep_for_person` / `daily_report`……),任何 Agent 都能查询你的历史、也把新的决策与发现写回来。Agent 用得越多,记忆越懂你。
49
+
50
+ ## 只用 Claude Code / Codex?
51
+
52
+ 不用飞书也能完整用起来——把你的 AI 编程会话变成跨会话、跨项目的持久记忆:
53
+
54
+ ```bash
55
+ # 1. 初始化并启动(setup 向导里只启用 claude-code / codex 数据源即可)
56
+ npx memkin start
57
+
58
+ # 2. 把历史会话提取成记忆
59
+ npx memkin extract --source claude-code
60
+ npx memkin extract --source codex
61
+
62
+ # 3. 一键接入你的 Agent(自动写 MCP 配置 + 记忆指令)
63
+ npx memkin install --agent claude-code
64
+ npx memkin install --agent codex
65
+
66
+ # 4.(可选)Claude Code 自动召回 hooks:开新会话自动注入近期决策 / 待办
67
+ npx memkin hooks install
68
+ ```
69
+
70
+ 装完重开客户端,问一句 *"这个项目上周决定了什么?"* —— Agent 直接从你的本地记忆作答,不用你再解释一遍。
71
+
31
72
  ## 痛点
32
73
 
33
74
  你的工作记忆有两个家,而你的 AI Agent 一个都够不着。
@@ -68,16 +109,11 @@ Memkin 是一个**面向中国职场、本地优先的个人记忆系统**。中
68
109
  >
69
110
  > Memkin 自动把这三件事串起来 —— 跨平台、跨时间 —— 并在你需要时把完整脉络交给 Agent。
70
111
 
71
- ## 三大支柱
72
-
73
- **🔒 本地优先,绝对私密**
74
- 数据永远不离开你的机器。PGLite 嵌入式数据库存储一切,可选 Ollama 本地向量嵌入,无任何云依赖。双轨隐私脱敏(可逆 / 不可逆)在写入前清洗敏感信息。
75
-
76
- **🕸️ 实体知识图谱,而非一堆向量分块**
77
- 信号被锚定到实体(人、项目、工具)并以有向图相互链接。你得到的是有上下文的答案 —— 谁、为什么、和什么相关 —— 而不是孤立的相似文本片段。
78
-
79
- **🤖 MCP 原生 + 飞书采集**
80
- **29 个内置 MCP 工具**让任何 Agent 既查询又写回你的记忆。飞书全量采集(7 个源)把你真实的工作 —— 需求、方案、团队决策 —— 变成一等数据源,这是纯 RAG 和笔记工具都做不到的。
112
+ <p align="center">
113
+ <img src="docs/assets/web-ui-graph.jpeg" alt="Memkin 知识图谱 —— 实体、决策、任务、知识在你的工作中相互连接" width="850">
114
+ <br>
115
+ <em>把你的工作变成一张活的知识图谱 —— 人、决策、任务、知识,全部连起来。</em>
116
+ </p>
81
117
 
82
118
  ## 核心特性
83
119
 
@@ -85,16 +121,16 @@ Memkin 是一个**面向中国职场、本地优先的个人记忆系统**。中
85
121
  你的工作在飞书里。Memkin 覆盖 **7 个源** —— 私信、群聊、邮件、日历、文档、任务、消息搜索 —— 把你的工作关系网变成结构化记忆。文档采集会生成可升级的"摘要卡片"(DocSource v2)。
86
122
 
87
123
  **🤖 让 Agent 懂你(MCP)**
88
- 把 Memkin 作为任何 MCP Agent 的记忆层 —— Claude Code、Cursor、Claude Desktop、Windsurf。**29 个内置工具**让 Agent 查询历史、读取实体页面、写回新知识。Agent 既是记忆的生产者,也是消费者。
124
+ 把 Memkin 作为任何 MCP Agent 的记忆层 —— Claude Code、Cursor、Claude Desktop、Windsurf。以 **15 个高意图工具**为核心的 MCP 工具集,让 Agent 查询历史、读取实体画像、写回新知识。Agent 既是记忆的生产者,也是消费者。
89
125
 
90
126
  **🧠 AI 驱动信号提取**
91
- LLM 驱动的 Pipeline 从原始对话中提取 7 类结构化信号:实体、时间线、决策、任务、发现、知识、关系。
127
+ LLM 驱动的 Pipeline 从原始对话中提取 7 类核心结构化信号:实体、时间线、决策、任务、发现、知识、关系(另有 Preference / Reference 等衍生信号类型)。
92
128
 
93
129
  **🔍 混合语义搜索**
94
130
  全文搜索(tsvector,支持中文)+ 向量检索(pgvector),通过 RRF(Reciprocal Rank Fusion)融合排序。支持自然语言提问。
95
131
 
96
- **♻️ 记忆巩固(Dream Cycle)**
97
- 后台巩固任务自动做分层轮转(hot → warm → cold)、死链修复、偏好推断 —— 让记忆随时间自我整理。
132
+ **♻️ 记忆巩固(Memory Consolidation)**
133
+ 后台巩固任务自动做分层轮转(hot → warm → cold)、死链修复、偏好推断 —— 让记忆随时间自我整理(CLI:`memkin consolidate`)。
98
134
 
99
135
  **⏰ 常驻 Daemon + 定时采集**
100
136
  内置守护进程按计划自动采集各数据源,带运行历史与告警,让记忆持续保持新鲜。
@@ -164,14 +200,14 @@ LLM 驱动的 Pipeline 从原始对话中提取 7 类结构化信号:实体、
164
200
  - ✅ 重命名规范 slug(修正错误规范化)
165
201
 
166
202
  ### ♻️ 记忆生命周期 & 常驻服务
167
- - ✅ 记忆巩固(dream cycle):hot → warm → cold 分层轮转
203
+ - ✅ 记忆巩固(Memory Consolidation):hot → warm → cold 分层轮转
168
204
  - ✅ 死链修复
169
205
  - ✅ 偏好推断(从历史中归纳 preference)
170
206
  - ✅ 常驻 Daemon:按源定时采集、调度、运行历史、告警
171
207
 
172
208
  ### 🔗 同步与互通
173
209
  - ✅ Obsidian 双向同步(导出 vault / 导入回库)
174
- - ✅ MCP stdio 服务器(29 个工具)
210
+ - ✅ MCP 服务器(stdio + Streamable HTTP):默认 15 个高意图工具 + 会话 / 实体 / 身份工具,含 legacy 共 36 个
175
211
  - ✅ REST API(Hono,覆盖页面 / 搜索 / 图谱 / 标签 / 时间线 / 嵌入 / 提取 / 溯源 / 事件流)
176
212
 
177
213
  ### 🖥️ Web UI(React + Vite)
@@ -221,7 +257,7 @@ Memkin 是标准 MCP stdio 服务器,可接入任何 MCP 客户端:
221
257
  |---|:---:|:---:|:---:|:---:|:---:|
222
258
  | 本地优先 & 私密 | ✅ | 视情况 | 视情况 | ✅ | ✅ |
223
259
  | 开源 | ✅ | 不一定 | 部分 | 部分 | ✅ |
224
- | 飞书工作采集(私信/群聊/邮件/会议/文档/任务) | ✅ | ❌ | 手动 | ❌ | ❌ |
260
+ | 飞书工作采集(私信/群聊/邮件/日历/文档/任务) | ✅ | ❌ | 手动 | ❌ | ❌ |
225
261
  | 把 AI Agent 会话作为数据源 | ✅ | ❌ | ❌ | ✅ | ✅ |
226
262
  | Agent 原生:通过 MCP 既读**又**写 | ✅ | ❌ | ❌ | ✅ | 部分 |
227
263
  | 实体 + 关系知识图谱 | ✅ | ❌ | 手动 | ✅ | 部分 |
@@ -262,7 +298,7 @@ npx memkin
262
298
  > auth_token: <你的令牌> # 或 export MEMKIN_AUTH_TOKEN=<你的令牌>
263
299
  > ```
264
300
 
265
- ### 30 秒上手(手动配置)
301
+ ### 手动配置(可选)
266
302
 
267
303
  ```bash
268
304
  # 只想先生成配置、不立即起服务 —— 启动交互式配置中心
@@ -544,7 +580,7 @@ flowchart TB
544
580
  end
545
581
  subgraph L5["⑤ 接口与消费层"]
546
582
  cli["CLI"]
547
- mcp["MCP(29 工具)"]
583
+ mcp["MCP(15 高意图工具)"]
548
584
  rest["REST API"]
549
585
  web["Web UI(只读)"]
550
586
  obs["Obsidian 双向同步"]
@@ -554,7 +590,7 @@ flowchart TB
554
590
 
555
591
  subgraph X["横切关注点"]
556
592
  id["🧬 人物身份<br/>跨平台同一人归并"]
557
- cons["♻️ 记忆巩固 Dream Cycle<br/>分层轮转 · 死链修复 · 偏好推断"]
593
+ cons["♻️ 记忆巩固 Memory Consolidation<br/>分层轮转 · 死链修复 · 偏好推断"]
558
594
  sched["⏰ 调度 / AutoFetch<br/>定时采集 · 运行历史 · 告警"]
559
595
  end
560
596
 
@@ -576,12 +612,12 @@ flowchart TB
576
612
  | **② 采集层** | 飞书(私聊 / 群聊 / 邮件 / 日历 / 任务 / 消息搜索 / 云文档)、AI Agent 会话(Claude Code / Codex / Hermes);增量采集(per-source cursor + 内容去重)、历史回溯 Backfill。**规划中**:钉钉、企业微信、本地文档 |
577
613
  | **③ 信号提取 Pipeline** | 分块 → 噪声过滤(L1 规则 + L2 LLM)→ 信号抽取(OpenAI / Anthropic)→ 实体抽取 → 打分 → 隐私脱敏;产出 7 类信号,经输出适配器(store / file / gbrain / stdout)落库 |
578
614
  | **④ 记忆存储层** | PGLite(进程内嵌入式 PostgreSQL)+ pgvector;Page / Chunk / Tag / Timeline / Graph 存储;混合检索(tsvector 全文 + 向量 + RRF) |
579
- | **⑤ 接口与消费层** | CLI、MCP Server(29 工具,Agent 读 / 写 / 维护)、REST API(Hono)、Web UI(检索 / 查看 / 图谱 / 时间线,**当前只读**)、Obsidian 双向同步 |
615
+ | **⑤ 接口与消费层** | CLI、MCP Server(默认 15 个高意图工具,Agent 读 / 写 / 维护)、REST API(Hono)、Web UI(检索 / 查看 / 图谱 / 时间线,**当前只读**)、Obsidian 双向同步 |
580
616
 
581
617
  **横切关注点(贯穿多层,而非独立流水线层):**
582
618
 
583
619
  - **🧬 人物身份** — 贯穿「采集 ↔ 存储」:跨平台(飞书 open_id、邮箱、昵称)识别并归并同一个人,别名绑定、规范化。这是「社会关系总和」的地基。
584
- - **♻️ 记忆巩固(Dream Cycle)** — 后台旁路作用于存储层:hot → warm → cold 分层轮转、死链修复、偏好推断,让记忆自我整理。
620
+ - **♻️ 记忆巩固(Memory Consolidation)** — 后台旁路作用于存储层:hot → warm → cold 分层轮转、死链修复、偏好推断,让记忆自我整理。
585
621
  - **⏰ 调度 / AutoFetch** — 后台驱动采集层:定时自动采集、运行历史、告警。*(当前运行于 `serve` 进程内;独立 daemon 服务化 + 开机自启见路线图。)*
586
622
 
587
623
  > 运行平台:macOS / Linux / Windows(默认内嵌 PGLite,开箱即用)· 一键安装(npm / npx)· 本地优先、自托管、零云依赖。自管理本地 Postgres 引擎(更快,可选)目前仅支持 macOS(arm64/x64)。
@@ -598,6 +634,8 @@ flowchart TB
598
634
  | **知识** | 可复用的事实性知识 | "PGLite 通过 WASM 在进程内运行完整 Postgres" |
599
635
  | **关系** | 实体间的依赖、引用、协作 | `project/memkin --[depends_on]--> tool/pglite` |
600
636
 
637
+ > 以上为 7 类核心信号;此外还有 **Preference**(偏好推断产出)与 **Reference**(引用沉淀)等衍生信号类型。
638
+
601
639
  ### 存储层
602
640
 
603
641
  | 组件 | 说明 |
@@ -612,20 +650,18 @@ flowchart TB
612
650
 
613
651
  ## MCP 工具
614
652
 
615
- Memkin 的 MCP 服务器暴露 **29 个工具**,覆盖检索、合成、页面 CRUD、图谱、标签、时间线、身份管理与飞书文档采集。高层工具优先:
653
+ Memkin 的 MCP 服务器**默认暴露 15 个高意图工具**为主力,外加会话上下文、实体画像与人物身份等辅助工具;12 个低层 legacy 工具默认隐藏(`memkin.yaml` 里设 `mcp.expose_legacy_tools: true` 开启),全量共 **36 个**。高意图工具优先:
616
654
 
617
655
  | 类别 | 工具 |
618
656
  |------|------|
619
- | **检索(高层)** | `query`、`get_session_context`、`get_entity_profile`、`list_signals_by_entity` |
620
- | **合成** | `synthesize`、`recall`(带 `[n]` 引用的成段答案 + gap 分析)、`prep_for_person`(人物沟通画像 → 目标条件化的沟通策略,被动推断·零问卷·本地优先·伦理护栏)、`daily_report`(跨渠道 7 段日报)、`troubleshoot`(沿 playbook 排查链一次性排查) |
621
- | **搜索** | `search` |
622
- | **页面 / 内容** | `get_page`、`put_page`、`list_pages`、`get_chunks` |
623
- | **图谱** | `add_link`、`remove_link`、`get_links`、`get_backlinks`、`traverse_graph` |
624
- | **标签** | `add_tag`、`remove_tag`、`get_tags` |
625
- | **时间线** | `add_timeline_entry`、`get_timeline` |
657
+ | **检索(高意图)** | `query`、`search`、`get_page_context`、`timeline_feed`、`explore_graph` |
658
+ | **合成(高意图)** | `synthesize`、`recall`(带 `[n]` 引用的成段答案 + gap 分析)、`prep_for_person`(人物沟通画像 → 目标条件化的沟通策略,被动推断·零问卷·本地优先·伦理护栏)、`daily_report`(跨渠道 7 段日报)、`troubleshoot`(沿 playbook 排查链一次性排查) |
659
+ | **写入(高意图)** | `put_page`、`add_timeline_entry`、`manage_links`、`manage_tags` |
660
+ | **健康(高意图)** | `get_health` |
661
+ | **会话 / 实体** | `get_session_context`、`get_entity_profile`、`list_signals_by_entity` |
626
662
  | **身份(人物)** | `link_person_alias`、`list_person_handles`、`remove_person_alias`、`merge_persons`、`recanonicalize_person` |
627
663
  | **飞书文档** | `ingest_feishu_doc` |
628
- | **健康** | `get_health` |
664
+ | **legacy(默认隐藏)** | `get_page`、`list_pages`、`get_chunks`、`add_link`、`remove_link`、`get_links`、`get_backlinks`、`traverse_graph`、`add_tag`、`remove_tag`、`get_tags`、`get_timeline` |
629
665
 
630
666
  ## CLI 命令
631
667
 
@@ -739,7 +775,7 @@ server:
739
775
  - [x] EmbeddingService(OpenAI / Ollama)
740
776
  - [x] StoreAdapter — Pipeline 直接写入 PGLite
741
777
  - [x] Hono REST API
742
- - [x] MCP 服务器(29 个 stdio 工具)
778
+ - [x] MCP 服务器(stdio,高意图工具集)
743
779
  - [x] CLI serve、search、embed 命令
744
780
 
745
781
  ### Phase 3 — Web UI(已完成)
@@ -752,7 +788,7 @@ server:
752
788
 
753
789
  ### Phase 4 — 巩固与常驻服务(已完成)
754
790
 
755
- - [x] 记忆巩固(dream cycle):分层轮转、死链修复、偏好推断
791
+ - [x] 记忆巩固(Memory Consolidation):分层轮转、死链修复、偏好推断
756
792
  - [x] 常驻 Daemon + 定时采集(调度、运行历史、告警)
757
793
  - [x] 人物身份管理(别名、合并、重命名)
758
794
  - [x] 飞书文档摘要卡片(DocSource v2)
@@ -800,7 +836,7 @@ server:
800
836
  | Web UI | React + Vite |
801
837
  | MCP | @modelcontextprotocol/sdk |
802
838
  | Linter | Biome |
803
- | 测试 | Vitest(1000+ 测试) |
839
+ | 测试 | Vitest(1700+ 测试) |
804
840
 
805
841
  ## 开发
806
842
 
@@ -1,5 +1,6 @@
1
1
  import type { Config, LoadedConfig } from "./core/config.js";
2
2
  import { PersonIdentityStore } from "./core/person-identity.js";
3
+ import { AgentSessionStore } from "./store/agent-sessions.js";
3
4
  import { ChunkStore } from "./store/chunks.js";
4
5
  import { Database } from "./store/database.js";
5
6
  import { EmbeddingService } from "./store/embedding.js";
@@ -49,6 +50,7 @@ export interface Stores {
49
50
  tags: TagStore;
50
51
  timeline: TimelineStore;
51
52
  embedding: EmbeddingService;
53
+ agentSessions: AgentSessionStore;
52
54
  supervisor?: ManagedSupervisor;
53
55
  }
54
56
  export declare function createStores(config: LoadedConfig, deps?: CreateStoresDeps): Promise<Stores>;
@@ -58,4 +60,14 @@ export interface IdentityStores {
58
60
  supervisor?: ManagedSupervisor;
59
61
  }
60
62
  export declare function openIdentityStore(config: LoadedConfig, deps?: CreateStoresDeps): Promise<IdentityStores>;
63
+ export interface SessionLedgerStores {
64
+ db: Database;
65
+ agentSessions: AgentSessionStore;
66
+ supervisor?: ManagedSupervisor;
67
+ }
68
+ /**
69
+ * Open just the agent session ledger — no EmbeddingService/SearchEngine, so
70
+ * `memkin sessions ls/inspect` works without embedding credentials configured.
71
+ */
72
+ export declare function openSessionLedger(config: LoadedConfig, deps?: CreateStoresDeps): Promise<SessionLedgerStores>;
61
73
  //# sourceMappingURL=cli-stores.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-stores.d.ts","sourceRoot":"","sources":["../src/cli-stores.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAK3E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,YAAY,EAAE,iBAAiB,EAAE,CAAC;AASlC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAClC,SAAS,CAAC,EAAE,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,KACV,OAAO,CAAC;QAAE,UAAU,EAAE,iBAAiB,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,QAAQ,CAAC;IACb,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAgC1B;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM;;yBASvC,OAAO,wCAAwC,EAAE,YAAY,KAC9D,MAAM;EAQd;AAgBD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAMD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,QAAQ,CAAC;IACb,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,cAAc,CAAC,CAQzB"}
1
+ {"version":3,"file":"cli-stores.d.ts","sourceRoot":"","sources":["../src/cli-stores.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAK3E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,YAAY,EAAE,iBAAiB,EAAE,CAAC;AASlC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAClC,SAAS,CAAC,EAAE,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,KACV,OAAO,CAAC;QAAE,UAAU,EAAE,iBAAiB,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,QAAQ,CAAC;IACb,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAgC1B;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM;;yBASvC,OAAO,wCAAwC,EAAE,YAAY,KAC9D,MAAM;EAQd;AAgBD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,EAAE,iBAAiB,CAAC;IACjC,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAMD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,QAAQ,CAAC;IACb,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,cAAc,CAAC,CAQzB;AAMD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,QAAQ,CAAC;IACb,aAAa,EAAE,iBAAiB,CAAC;IACjC,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAG9B"}
@@ -3,6 +3,7 @@ import { homedir } from "node:os";
3
3
  import { isAbsolute, resolve } from "node:path";
4
4
  import { PersonIdentityStore } from "./core/person-identity.js";
5
5
  import { nodeRunner } from "./daemon/autostart/runner.js";
6
+ import { AgentSessionStore } from "./store/agent-sessions.js";
6
7
  import { ChunkStore } from "./store/chunks.js";
7
8
  import { Database } from "./store/database.js";
8
9
  import { EmbeddingService } from "./store/embedding.js";
@@ -102,7 +103,11 @@ export async function createStores(config, deps = {}) {
102
103
  dimensions: config.embedding.dimensions,
103
104
  apiKey: config.embedding.api_key ?? process.env.OPENAI_API_KEY,
104
105
  baseUrl: config.embedding.base_url,
105
- });
106
+ },
107
+ // Defer the embedding-fingerprint gate to first actual embedding use, so
108
+ // read-only commands (search --mode fts, export) can open a mismatched
109
+ // database without being blocked and without embedding credentials.
110
+ { beforeFirstUse: () => db.assertEmbeddingConsistent() });
106
111
  const search = new SearchEngine(db.executor, {
107
112
  embedText: (q) => embedding.embedText(q),
108
113
  search: {
@@ -119,6 +124,7 @@ export async function createStores(config, deps = {}) {
119
124
  tags: new TagStore(db.executor),
120
125
  timeline: new TimelineStore(db.executor),
121
126
  embedding,
127
+ agentSessions: new AgentSessionStore(db.executor),
122
128
  supervisor,
123
129
  };
124
130
  }
@@ -127,4 +133,12 @@ export async function openIdentityStore(config, deps = {}) {
127
133
  const identity = new PersonIdentityStore(db.executor, { pages: new PageStore(db.executor) }, { behavior: new PersonBehaviorStore(db.executor) });
128
134
  return { db, identity, supervisor };
129
135
  }
136
+ /**
137
+ * Open just the agent session ledger — no EmbeddingService/SearchEngine, so
138
+ * `memkin sessions ls/inspect` works without embedding credentials configured.
139
+ */
140
+ export async function openSessionLedger(config, deps = {}) {
141
+ const { db, supervisor } = await resolveDb(config, deps);
142
+ return { db, agentSessions: new AgentSessionStore(db.executor), supervisor };
143
+ }
130
144
  //# sourceMappingURL=cli-stores.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-stores.js","sourceRoot":"","sources":["../src/cli-stores.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-stores.js","sourceRoot":"","sources":["../src/cli-stores.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import { fileURLToPath } from "node:url";
6
6
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
7
  import { Command } from "commander";
8
8
  import { planStartup, shouldOpenBrowserOnServe } from "./cli-helpers.js";
9
- import { createStores, openIdentityStore } from "./cli-stores.js";
9
+ import { createStores, openIdentityStore, openSessionLedger } from "./cli-stores.js";
10
10
  import { normalizeDocsConfig } from "./collectors/feishu/docs/config.js";
11
11
  import { FullCardBuilder } from "./collectors/feishu/docs/full-builder.js";
12
12
  import { runDocSource } from "./collectors/feishu/docs/run.js";
@@ -23,7 +23,7 @@ import { PersonIdentityStore } from "./core/person-identity.js";
23
23
  import { runPipeline } from "./core/pipeline.js";
24
24
  import { buildPipelineConfig } from "./core/pipeline-factory.js";
25
25
  import { ensureStateDir, statePath } from "./core/state.js";
26
- import { rawYamlHash, readDaemonState, servingSubsetHash, } from "./daemon/autostart/daemon-state.js";
26
+ import { rawYamlHash, readDaemonState, recoverServeConfigPath, servingSubsetHash, } from "./daemon/autostart/daemon-state.js";
27
27
  import { disableAutostart, statusAutostart } from "./daemon/autostart/index.js";
28
28
  import { nodeRunner } from "./daemon/autostart/runner.js";
29
29
  import { ReloadManager } from "./daemon/reload-manager.js";
@@ -47,6 +47,7 @@ import { assertLoopbackOrThrow, resolveMcpHttpRuntime } from "./server/mcp-http-
47
47
  import { openBrowser } from "./server/open-browser.js";
48
48
  import { startServer } from "./server/runtime.js";
49
49
  import { resolveServeSecurity } from "./server/server-security.js";
50
+ import { EntityMergeSuggestionStore } from "./store/entity-suggestions.js";
50
51
  import { managedPaths, readManagedState } from "./store/managed/pg-paths.js";
51
52
  import { startRecoveryLoop } from "./store/managed/recovery-loop.js";
52
53
  import { stopManagedFromState } from "./store/managed/stop-from-state.js";
@@ -546,15 +547,100 @@ sourcesCmd
546
547
  process.exit(1);
547
548
  }
548
549
  });
550
+ /**
551
+ * Sessions subcommand group — inspect the agent_sessions processing ledger (PR-0).
552
+ * `retry` / `purge` are interface placeholders wired for later PRs (PR-2+).
553
+ */
554
+ const sessionsCmd = program.command("sessions").description("Inspect the agent session ledger");
555
+ sessionsCmd
556
+ .command("ls")
557
+ .description("List agent session revisions from the ledger")
558
+ .option("-c, --config <path>", "Path to config file")
559
+ .option("-s, --source <id>", "Filter by source instance (claude-code/codex/hermes)")
560
+ .option("--state <state>", "Filter by state (discovered/distilled/applying/done/retrying/dead_letter)")
561
+ .action(async (options) => {
562
+ const config = loadConfig(options.config);
563
+ const stores = await openSessionLedger(config);
564
+ try {
565
+ const rows = await stores.agentSessions.listSessions({
566
+ sourceInstance: options.source,
567
+ state: options.state,
568
+ });
569
+ if (rows.length === 0) {
570
+ console.log("No agent sessions recorded yet.");
571
+ return;
572
+ }
573
+ console.log("id source session rev state retry discovered");
574
+ for (const r of rows) {
575
+ const sid = r.sessionId.length > 30 ? `${r.sessionId.slice(0, 29)}…` : r.sessionId.padEnd(30);
576
+ console.log(`${String(r.id).padEnd(5)} ${r.sourceInstance.padEnd(13)} ${sid} ${r.contentHash.slice(0, 8)} ${r.state.padEnd(11)} ${String(r.retryCount).padEnd(5)} ${r.discoveredAt}`);
577
+ }
578
+ }
579
+ finally {
580
+ await stores.db.close();
581
+ }
582
+ });
583
+ sessionsCmd
584
+ .command("inspect <id>")
585
+ .description("Show a single session revision with all ledger fields")
586
+ .option("-c, --config <path>", "Path to config file")
587
+ .action(async (id, options) => {
588
+ const config = loadConfig(options.config);
589
+ const stores = await openSessionLedger(config);
590
+ try {
591
+ const rev = await stores.agentSessions.getRevision(Number(id));
592
+ if (!rev) {
593
+ console.error(`No agent session revision with id ${id}`);
594
+ process.exitCode = 1;
595
+ return;
596
+ }
597
+ console.log(JSON.stringify(rev, null, 2));
598
+ }
599
+ finally {
600
+ await stores.db.close();
601
+ }
602
+ });
603
+ sessionsCmd
604
+ .command("retry <id>")
605
+ .description("Re-queue a session revision for distillation (PR-2+)")
606
+ .action((id) => {
607
+ console.log(`sessions retry ${id}: not yet implemented (arrives with PR-2 distiller)`);
608
+ });
609
+ sessionsCmd
610
+ .command("purge <id>")
611
+ .description("Purge a dead-lettered session revision (PR-2+)")
612
+ .action((id) => {
613
+ console.log(`sessions purge ${id}: not yet implemented (arrives with PR-2 distiller)`);
614
+ });
549
615
  async function runServe(options) {
550
616
  {
617
+ let serveConfigOverride = options.config;
551
618
  const serveConfigPath = options.config ?? resolve(process.cwd(), "memkin.yaml");
552
619
  if (!existsSync(serveConfigPath)) {
553
- console.error("No configuration file found.\n" +
554
- "Run `memkin start` for one-step setup + launch, or `memkin init --web` to configure first.");
555
- process.exit(1);
620
+ // F1 self-heal: a daemon relaunch can carry a stale --config frozen into
621
+ // the plist/unit argv (memoark memkin rename), and daemon.json may hold
622
+ // the same stale path. Recover via daemon.json (daemon-launched only) or
623
+ // normal discovery, and write the fix back to daemon.json when it was
624
+ // stale. All output on stderr — `serve --mcp` owns stdout for JSON-RPC.
625
+ const recovered = recoverServeConfigPath({
626
+ requestedPath: serveConfigPath,
627
+ stateDir: join(homedir(), ".memkin"),
628
+ trustDaemonState: Boolean(options.daemonInstanceId),
629
+ discover: () => resolveConfigPath(),
630
+ });
631
+ if (!recovered) {
632
+ console.error("No configuration file found.\n" +
633
+ "Run `memkin start` for one-step setup + launch, or `memkin init --web` to configure first.");
634
+ process.exit(1);
635
+ }
636
+ console.error(`[serve] Config file ${serveConfigPath} not found — using ${recovered.configPath} ` +
637
+ `(${recovered.source === "daemon-state" ? "from daemon.json" : "discovered"}).`);
638
+ if (recovered.healedDaemonState) {
639
+ console.error(`[serve] Updated daemon.json config_path → ${recovered.configPath}`);
640
+ }
641
+ serveConfigOverride = recovered.configPath;
556
642
  }
557
- const config = loadConfig(options.config);
643
+ const config = loadConfig(serveConfigOverride);
558
644
  // Anchor the .memkin state dir to the config's project root, not process.cwd().
559
645
  // A Finder-launched sidecar has cwd=/, so the default would try to mkdir /.memkin
560
646
  // (EROFS on macOS). projectRoot = dirname(configPath), so it lives beside the config.
@@ -1092,6 +1178,7 @@ program
1092
1178
  graph: stores.graph,
1093
1179
  tags: stores.tags,
1094
1180
  timeline: stores.timeline,
1181
+ entitySuggestions: new EntityMergeSuggestionStore(stores.db.executor),
1095
1182
  }, llmProvider, {
1096
1183
  profile: config.profile,
1097
1184
  profileStores: {
@@ -1118,6 +1205,7 @@ program
1118
1205
  console.log(` dead links checked: ${result.deadLinksChecked}`);
1119
1206
  console.log(` preferences inferred: ${result.preferencesInferred}`);
1120
1207
  console.log(` profiles synthesized: ${result.profilesSynthesized}`);
1208
+ console.log(` entity merge suggestions: ${result.entityMergeSuggestions}`);
1121
1209
  await stores.db.close();
1122
1210
  }
1123
1211
  catch (error) {