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.
- package/README.en.md +108 -836
- package/README.md +108 -836
- package/README.zh-CN.md +80 -44
- package/dist/cli-stores.d.ts +12 -0
- package/dist/cli-stores.d.ts.map +1 -1
- package/dist/cli-stores.js +15 -1
- package/dist/cli-stores.js.map +1 -1
- package/dist/cli.js +94 -6
- package/dist/cli.js.map +1 -1
- package/dist/collectors/agent/claude-code.d.ts.map +1 -1
- package/dist/collectors/agent/claude-code.js +10 -29
- package/dist/collectors/agent/claude-code.js.map +1 -1
- package/dist/collectors/agent/codex.d.ts.map +1 -1
- package/dist/collectors/agent/codex.js +24 -10
- package/dist/collectors/agent/codex.js.map +1 -1
- package/dist/collectors/agent/collector.d.ts +38 -0
- package/dist/collectors/agent/collector.d.ts.map +1 -1
- package/dist/collectors/agent/collector.js +91 -20
- package/dist/collectors/agent/collector.js.map +1 -1
- package/dist/collectors/agent/hermes.d.ts.map +1 -1
- package/dist/collectors/agent/hermes.js +5 -1
- package/dist/collectors/agent/hermes.js.map +1 -1
- package/dist/collectors/feishu/sources/calendar.d.ts.map +1 -1
- package/dist/collectors/feishu/sources/calendar.js +18 -7
- package/dist/collectors/feishu/sources/calendar.js.map +1 -1
- package/dist/consolidator/consolidator.d.ts +9 -1
- package/dist/consolidator/consolidator.d.ts.map +1 -1
- package/dist/consolidator/consolidator.js +7 -0
- package/dist/consolidator/consolidator.js.map +1 -1
- package/dist/consolidator/entity-merge.d.ts +33 -0
- package/dist/consolidator/entity-merge.d.ts.map +1 -0
- package/dist/consolidator/entity-merge.js +148 -0
- package/dist/consolidator/entity-merge.js.map +1 -0
- package/dist/core/agent-session-scanner.d.ts +23 -0
- package/dist/core/agent-session-scanner.d.ts.map +1 -0
- package/dist/core/agent-session-scanner.js +69 -0
- package/dist/core/agent-session-scanner.js.map +1 -0
- package/dist/core/canonicalize.d.ts +8 -0
- package/dist/core/canonicalize.d.ts.map +1 -1
- package/dist/core/canonicalize.js +12 -2
- package/dist/core/canonicalize.js.map +1 -1
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/identity-resolver.d.ts +53 -3
- package/dist/core/identity-resolver.d.ts.map +1 -1
- package/dist/core/identity-resolver.js +112 -17
- package/dist/core/identity-resolver.js.map +1 -1
- package/dist/core/person-identity.d.ts +38 -3
- package/dist/core/person-identity.d.ts.map +1 -1
- package/dist/core/person-identity.js +58 -29
- package/dist/core/person-identity.js.map +1 -1
- package/dist/core/pipeline-factory.d.ts.map +1 -1
- package/dist/core/pipeline-factory.js +2 -1
- package/dist/core/pipeline-factory.js.map +1 -1
- package/dist/core/pipeline.js +3 -3
- package/dist/core/pipeline.js.map +1 -1
- package/dist/daemon/autostart/daemon-state.d.ts +32 -0
- package/dist/daemon/autostart/daemon-state.d.ts.map +1 -1
- package/dist/daemon/autostart/daemon-state.js +27 -1
- package/dist/daemon/autostart/daemon-state.js.map +1 -1
- package/dist/daemon/scheduler.d.ts +10 -0
- package/dist/daemon/scheduler.d.ts.map +1 -1
- package/dist/daemon/scheduler.js +20 -1
- package/dist/daemon/scheduler.js.map +1 -1
- package/dist/demo/seed.d.ts +32 -0
- package/dist/demo/seed.d.ts.map +1 -0
- package/dist/demo/seed.js +185 -0
- package/dist/demo/seed.js.map +1 -0
- package/dist/embedded-assets.generated.d.ts.map +1 -1
- package/dist/embedded-assets.generated.js +2 -2
- package/dist/embedded-assets.generated.js.map +1 -1
- package/dist/eval/golden.d.ts +107 -0
- package/dist/eval/golden.d.ts.map +1 -0
- package/dist/eval/golden.js +74 -0
- package/dist/eval/golden.js.map +1 -0
- package/dist/eval/judge.d.ts +82 -0
- package/dist/eval/judge.d.ts.map +1 -0
- package/dist/eval/judge.js +130 -0
- package/dist/eval/judge.js.map +1 -0
- package/dist/eval/manifest.d.ts +107 -0
- package/dist/eval/manifest.d.ts.map +1 -0
- package/dist/eval/manifest.js +84 -0
- package/dist/eval/manifest.js.map +1 -0
- package/dist/eval/metrics.d.ts +87 -0
- package/dist/eval/metrics.d.ts.map +1 -0
- package/dist/eval/metrics.js +97 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/extractors/noise-filter.d.ts +7 -3
- package/dist/extractors/noise-filter.d.ts.map +1 -1
- package/dist/extractors/noise-filter.js +16 -3
- package/dist/extractors/noise-filter.js.map +1 -1
- package/dist/extractors/signal-extractor.d.ts.map +1 -1
- package/dist/extractors/signal-extractor.js +13 -2
- package/dist/extractors/signal-extractor.js.map +1 -1
- package/dist/lifecycle/legacy-migration.d.ts +6 -2
- package/dist/lifecycle/legacy-migration.d.ts.map +1 -1
- package/dist/lifecycle/legacy-migration.js +69 -4
- package/dist/lifecycle/legacy-migration.js.map +1 -1
- package/dist/server/api.d.ts.map +1 -1
- package/dist/server/api.js +18 -7
- package/dist/server/api.js.map +1 -1
- package/dist/server/backfill-routes.d.ts.map +1 -1
- package/dist/server/backfill-routes.js +2 -1
- package/dist/server/backfill-routes.js.map +1 -1
- package/dist/server/mcp.d.ts +4 -4
- package/dist/store/agent-sessions.d.ts +59 -0
- package/dist/store/agent-sessions.d.ts.map +1 -0
- package/dist/store/agent-sessions.js +119 -0
- package/dist/store/agent-sessions.js.map +1 -0
- package/dist/store/database.d.ts +20 -1
- package/dist/store/database.d.ts.map +1 -1
- package/dist/store/database.js +44 -6
- package/dist/store/database.js.map +1 -1
- package/dist/store/embedding.d.ts +20 -2
- package/dist/store/embedding.d.ts.map +1 -1
- package/dist/store/embedding.js +20 -5
- package/dist/store/embedding.js.map +1 -1
- package/dist/store/entity-suggestions.d.ts +62 -0
- package/dist/store/entity-suggestions.d.ts.map +1 -0
- package/dist/store/entity-suggestions.js +80 -0
- package/dist/store/entity-suggestions.js.map +1 -0
- package/dist/store/migrations/index.d.ts.map +1 -1
- package/dist/store/migrations/index.js +91 -0
- package/dist/store/migrations/index.js.map +1 -1
- package/dist/store/pages.d.ts.map +1 -1
- package/dist/store/pages.js +12 -3
- package/dist/store/pages.js.map +1 -1
- package/package.json +1 -1
package/README.zh-CN.md
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<
|
|
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:
|
|
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/
|
|
22
|
+
<img src="docs/assets/demo.gif" alt="在 Claude Code 里向 Memkin 提问:上周和 Alice 聊了什么?—— 得到带 [n] 引用的回答" width="850">
|
|
21
23
|
<br>
|
|
22
|
-
<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
|
-
|
|
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
|
|
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
|
-
**♻️ 记忆巩固(
|
|
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
|
-
- ✅ 记忆巩固(
|
|
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
|
|
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
|
-
###
|
|
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(
|
|
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["♻️ 记忆巩固
|
|
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(
|
|
615
|
+
| **⑤ 接口与消费层** | CLI、MCP Server(默认 15 个高意图工具,Agent 读 / 写 / 维护)、REST API(Hono)、Web UI(检索 / 查看 / 图谱 / 时间线,**当前只读**)、Obsidian 双向同步 |
|
|
580
616
|
|
|
581
617
|
**横切关注点(贯穿多层,而非独立流水线层):**
|
|
582
618
|
|
|
583
619
|
- **🧬 人物身份** — 贯穿「采集 ↔ 存储」:跨平台(飞书 open_id、邮箱、昵称)识别并归并同一个人,别名绑定、规范化。这是「社会关系总和」的地基。
|
|
584
|
-
- **♻️ 记忆巩固(
|
|
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
|
|
653
|
+
Memkin 的 MCP 服务器**默认暴露 15 个高意图工具**为主力,外加会话上下文、实体画像与人物身份等辅助工具;12 个低层 legacy 工具默认隐藏(`memkin.yaml` 里设 `mcp.expose_legacy_tools: true` 开启),全量共 **36 个**。高意图工具优先:
|
|
616
654
|
|
|
617
655
|
| 类别 | 工具 |
|
|
618
656
|
|------|------|
|
|
619
|
-
|
|
|
620
|
-
|
|
|
621
|
-
|
|
|
622
|
-
|
|
|
623
|
-
|
|
|
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
|
-
|
|
|
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 服务器(
|
|
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] 记忆巩固(
|
|
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(
|
|
839
|
+
| 测试 | Vitest(1700+ 测试) |
|
|
804
840
|
|
|
805
841
|
## 开发
|
|
806
842
|
|
package/dist/cli-stores.d.ts
CHANGED
|
@@ -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
|
package/dist/cli-stores.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/cli-stores.js
CHANGED
|
@@ -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
|
package/dist/cli-stores.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-stores.js","sourceRoot":"","sources":["../src/cli-stores.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,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;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKpD,SAAS,aAAa,CAAC,GAAW,EAAE,WAAmB;IACrD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IAClC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,OAAO,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAeD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAoB,EACpB,OAAyB,EAAE;IAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;IAErD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,QAAQ,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC;IAE1C,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QACrF,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;IAC5B,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,IAAI,gBAAgB,CAAC;IAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACpE,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,YAAY,GAAW;QAC3B,GAAG,MAAM;QACT,KAAK,EAAE;YACL,GAAG,MAAM,CAAC,KAAK;YACf,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,OAAO;SAClB;KACF,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,EAAE,EAAE,EAAE,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO;QACL,QAAQ,EAAE,uBAAuB,CAAC;YAChC,IAAI;YACJ,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW;SAC/C,CAAC;QACF,cAAc,EAAE,CACd,EAAiE,EACjE,CAAS,EACT,EAAE,CACF,kBAAkB,CAAC;YACjB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;YAClC,MAAM,EAAE,UAAU;SACnB,CAAC;KACL,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,IAAa;IAEb,OAAO,gBAAgB,CAAC,MAAM,EAAE,IAA8C,CAAC,CAAC;AAClF,CAAC;
|
|
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
|
-
|
|
554
|
-
|
|
555
|
-
|
|
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(
|
|
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) {
|