weflow-cli 1.8.2 → 1.10.0

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 (185) hide show
  1. package/ARCHITECTURE.md +62 -26
  2. package/CHANGELOG.md +1290 -0
  3. package/OPERATIONS.md +144 -11
  4. package/README.en.md +20 -4
  5. package/README.md +30 -5
  6. package/bin/weflow-cli-electron.cjs +2 -0
  7. package/bin/weflow-cli.ts +996 -118
  8. package/dist/bin/weflow-cli.js +1038 -146
  9. package/dist/bin/weflow-cli.js.map +1 -1
  10. package/dist/mcp-server/http.d.ts +14 -0
  11. package/dist/mcp-server/http.d.ts.map +1 -0
  12. package/dist/mcp-server/http.js +84 -0
  13. package/dist/mcp-server/http.js.map +1 -0
  14. package/dist/mcp-server/httpConfig.d.ts +50 -0
  15. package/dist/mcp-server/httpConfig.d.ts.map +1 -0
  16. package/dist/mcp-server/httpConfig.js +104 -0
  17. package/dist/mcp-server/httpConfig.js.map +1 -0
  18. package/dist/mcp-server/index.d.ts +13 -1
  19. package/dist/mcp-server/index.d.ts.map +1 -1
  20. package/dist/mcp-server/index.js +58 -374
  21. package/dist/mcp-server/index.js.map +1 -1
  22. package/dist/src/core/dbPathService.d.ts +12 -0
  23. package/dist/src/core/dbPathService.d.ts.map +1 -1
  24. package/dist/src/core/dbPathService.js +20 -3
  25. package/dist/src/core/dbPathService.js.map +1 -1
  26. package/dist/src/panel/server.d.ts.map +1 -1
  27. package/dist/src/panel/server.js +61 -1
  28. package/dist/src/panel/server.js.map +1 -1
  29. package/dist/src/services/assistantEval.d.ts +69 -0
  30. package/dist/src/services/assistantEval.d.ts.map +1 -1
  31. package/dist/src/services/assistantEval.js +270 -8
  32. package/dist/src/services/assistantEval.js.map +1 -1
  33. package/dist/src/services/assistantScenes.d.ts +81 -0
  34. package/dist/src/services/assistantScenes.d.ts.map +1 -0
  35. package/dist/src/services/assistantScenes.js +322 -0
  36. package/dist/src/services/assistantScenes.js.map +1 -0
  37. package/dist/src/services/assistantService.d.ts +33 -4
  38. package/dist/src/services/assistantService.d.ts.map +1 -1
  39. package/dist/src/services/assistantService.js +102 -6
  40. package/dist/src/services/assistantService.js.map +1 -1
  41. package/dist/src/services/assistantSkills.d.ts +94 -0
  42. package/dist/src/services/assistantSkills.d.ts.map +1 -0
  43. package/dist/src/services/assistantSkills.js +330 -0
  44. package/dist/src/services/assistantSkills.js.map +1 -0
  45. package/dist/src/services/assistantTools.d.ts +34 -1
  46. package/dist/src/services/assistantTools.d.ts.map +1 -1
  47. package/dist/src/services/assistantTools.js +931 -88
  48. package/dist/src/services/assistantTools.js.map +1 -1
  49. package/dist/src/services/assistantTrace.d.ts +4 -0
  50. package/dist/src/services/assistantTrace.d.ts.map +1 -1
  51. package/dist/src/services/assistantTrace.js +9 -0
  52. package/dist/src/services/assistantTrace.js.map +1 -1
  53. package/dist/src/services/configService.d.ts +9 -0
  54. package/dist/src/services/configService.d.ts.map +1 -1
  55. package/dist/src/services/configService.js +5 -2
  56. package/dist/src/services/configService.js.map +1 -1
  57. package/dist/src/services/messageQuery.d.ts +18 -0
  58. package/dist/src/services/messageQuery.d.ts.map +1 -1
  59. package/dist/src/services/messageQuery.js +29 -0
  60. package/dist/src/services/messageQuery.js.map +1 -1
  61. package/dist/src/services/outboundSend.d.ts +53 -0
  62. package/dist/src/services/outboundSend.d.ts.map +1 -0
  63. package/dist/src/services/outboundSend.js +90 -0
  64. package/dist/src/services/outboundSend.js.map +1 -0
  65. package/dist/src/services/pythonBridge.d.ts.map +1 -1
  66. package/dist/src/services/pythonBridge.js +1 -0
  67. package/dist/src/services/pythonBridge.js.map +1 -1
  68. package/dist/src/services/wechatClient.d.ts +125 -0
  69. package/dist/src/services/wechatClient.d.ts.map +1 -0
  70. package/dist/src/services/wechatClient.js +344 -0
  71. package/dist/src/services/wechatClient.js.map +1 -0
  72. package/dist/src/services/wechatMedia.d.ts +44 -0
  73. package/dist/src/services/wechatMedia.d.ts.map +1 -0
  74. package/dist/src/services/wechatMedia.js +155 -0
  75. package/dist/src/services/wechatMedia.js.map +1 -0
  76. package/dist/src/services/wechatMessageService.d.ts +11 -0
  77. package/dist/src/services/wechatMessageService.d.ts.map +1 -1
  78. package/dist/src/services/wechatMessageService.js +55 -11
  79. package/dist/src/services/wechatMessageService.js.map +1 -1
  80. package/dist/src/types.d.ts +4 -0
  81. package/dist/src/types.d.ts.map +1 -1
  82. package/dist/src/utils/python.js +2 -2
  83. package/dist/src/utils/python.js.map +1 -1
  84. package/docs/BRANCHES.md +37 -0
  85. package/docs/CONTACT_DB_SCHEMA.md +1085 -0
  86. package/docs/DECISIONS.md +1624 -0
  87. package/docs/EXTENDING.md +98 -10
  88. package/docs/FUNCTIONAL-IMPROVEMENT-SPEC.md +6 -0
  89. package/docs/HEALTH-CHECK.md +12 -7
  90. package/docs/JEV/345/272/224/347/224/250/346/226/275/345/267/245/346/226/207/346/241/243.md +2 -2
  91. package/docs/MCP.md +58 -4
  92. package/docs/PROJECT_STATE.md +180 -11
  93. package/docs/RELEASING.md +115 -1
  94. package/docs/images/weflow-architecture-gpt-image-2.png +0 -0
  95. package/logo.png +0 -0
  96. package/mcp-server/http.ts +108 -0
  97. package/mcp-server/httpConfig.ts +126 -0
  98. package/mcp-server/index.ts +359 -681
  99. package/package.json +5 -3
  100. package/resources/js/graph3d/NOTICE.txt +35 -0
  101. package/resources/js/graph3d/d3-binarytree.min.js +2 -0
  102. package/resources/js/graph3d/d3-dispatch.min.js +2 -0
  103. package/resources/js/graph3d/d3-force-3d.min.js +2 -0
  104. package/resources/js/graph3d/d3-octree.min.js +2 -0
  105. package/resources/js/graph3d/d3-quadtree.min.js +2 -0
  106. package/resources/js/graph3d/d3-timer.min.js +2 -0
  107. package/resources/js/graph3d/layout.mjs +63 -0
  108. package/resources/js/graph3d/three.min.js +6 -0
  109. package/resources/js/graph3d/viewer2d.js +448 -0
  110. package/resources/panel/ball-position.cjs +48 -2
  111. package/resources/panel/index.html +18 -4
  112. package/resources/panel/main.cjs +137 -5
  113. package/resources/panel/mascot-base.png +0 -0
  114. package/resources/panel/mascot-blink-1.png +0 -0
  115. package/resources/panel/mascot-blink-2.png +0 -0
  116. package/resources/panel/mascot-iris.png +0 -0
  117. package/resources/panel/mascot-lift-down-1.png +0 -0
  118. package/resources/panel/mascot-lift-down-2.png +0 -0
  119. package/resources/panel/mascot-lift-down-3.png +0 -0
  120. package/resources/panel/mascot-lift-down-4.png +0 -0
  121. package/resources/panel/mascot-lift-down-5.png +0 -0
  122. package/resources/panel/mascot-lift-down-6.png +0 -0
  123. package/resources/panel/mascot-lift-up-1.png +0 -0
  124. package/resources/panel/mascot-lift-up-2.png +0 -0
  125. package/resources/panel/mascot-lift-up-3.png +0 -0
  126. package/resources/panel/mascot-lift-up-4.png +0 -0
  127. package/resources/panel/mascot-lift-up-5.png +0 -0
  128. package/resources/panel/mascot-lift-up-6.png +0 -0
  129. package/resources/panel/mascot-peek.png +0 -0
  130. package/resources/panel/mascot-tickle-1.png +0 -0
  131. package/resources/panel/mascot-tickle-2.png +0 -0
  132. package/resources/panel/mascot-tickle-3.png +0 -0
  133. package/resources/panel/mascot-tickle-4.png +0 -0
  134. package/resources/panel/panel.css +205 -59
  135. package/resources/panel/preload.cjs +26 -0
  136. package/resources/panel/renderer.js +646 -17
  137. package/scripts/_utils.py +1203 -931
  138. package/scripts/backfill_articles.py +202 -21
  139. package/scripts/biz_daily.py +26 -34
  140. package/scripts/bonds.py +331 -0
  141. package/scripts/chat_notes.py +561 -470
  142. package/scripts/chat_stats.py +8 -7
  143. package/scripts/check_readme_commands.py +426 -0
  144. package/scripts/compile_wiki.py +187 -59
  145. package/scripts/contact_schema.py +339 -0
  146. package/scripts/data/wechat_emoji.json +225 -0
  147. package/scripts/export_chat_html.py +3 -1
  148. package/scripts/fav_notes.py +4 -1
  149. package/scripts/graph_2d.py +151 -0
  150. package/scripts/graph_3d.py +646 -0
  151. package/scripts/health_check.py +163 -26
  152. package/scripts/mcp_bridge.py +6 -7
  153. package/scripts/nt_decrypt.py +3 -3
  154. package/scripts/panel_frames.py +683 -0
  155. package/scripts/pipeline.py +21 -10
  156. package/scripts/quality_eval.py +5 -0
  157. package/scripts/rag_chat.py +33 -16
  158. package/scripts/reply_debt.py +26 -6
  159. package/scripts/semantic_search.py +130 -22
  160. package/scripts/vault_rag.py +42 -16
  161. package/scripts/vault_search.py +44 -8
  162. package/scripts/wechat_emoticon.py +6 -0
  163. package/scripts/wechat_voice.py +9 -0
  164. package/scripts/wiki_lint.py +124 -24
  165. package/src/core/dbPathService.ts +22 -4
  166. package/src/panel/server.ts +58 -1
  167. package/src/services/assistantEval.ts +323 -12
  168. package/src/services/assistantScenes.ts +342 -0
  169. package/src/services/assistantService.ts +107 -6
  170. package/src/services/assistantSkills.ts +364 -0
  171. package/src/services/assistantTools.ts +2452 -1640
  172. package/src/services/assistantTrace.ts +9 -0
  173. package/src/services/configService.ts +415 -403
  174. package/src/services/messageQuery.ts +29 -0
  175. package/src/services/outboundSend.ts +126 -0
  176. package/src/services/pythonBridge.ts +1 -0
  177. package/src/services/wechatClient.ts +380 -0
  178. package/src/services/wechatMedia.ts +166 -0
  179. package/src/services/wechatMessageService.ts +62 -11
  180. package/src/types.ts +4 -0
  181. package/src/utils/python.ts +2 -2
  182. package/dist/src/utils/wechatEmoji.d.ts +0 -5
  183. package/dist/src/utils/wechatEmoji.d.ts.map +0 -1
  184. package/dist/src/utils/wechatEmoji.js +0 -35
  185. package/dist/src/utils/wechatEmoji.js.map +0 -1
package/ARCHITECTURE.md CHANGED
@@ -4,41 +4,53 @@
4
4
 
5
5
  ## 定位
6
6
 
7
- WeFlow CLI 是一个本地优先的命令行工具和 stdio MCP Server,面向用户本人有权访问的微信本地数据,提供查询、导出、公众号阅读、知识整理和可选 AI 助手能力。
7
+ WeFlow CLI 是一个本地优先的命令行工具、MCP Server(**stdio 与回环 HTTP 两种传输**)和一个常驻的**本机助手面板**,面向用户本人有权访问的微信本地数据,提供查询、导出、公众号阅读、知识整理、概念图谱和可选 AI 助手能力。
8
8
 
9
9
  ## 分层结构
10
10
 
11
11
  ```text
12
- MCP 客户端 / 终端用户
13
- |
14
- v
15
- CLI 入口 bin/weflow-cli.ts ---- mcp-server/index.ts
16
- |
17
- v
18
- 业务服务层
12
+ MCP 客户端 / 终端用户 / 本机面板(悬浮球,只读客户端)
13
+ | | |
14
+ v v v 两条入口连的是同一个大脑
15
+ CLI 入口 bin/weflow-cli.ts mcp-server/index.ts 助手守护进程
16
+ | | 127.0.0.1:8766(token + 一次性配对码)
17
+ +------------+ |
18
+ v |
19
+ 业务服务层 src/services/ <---------------+
19
20
  chat / contact / export / evidence / favorites / sns
20
21
  daily / vault / weread / assistant / config / privacy
21
- |
22
- +--> Node 原生层:路径发现、配置、数据库适配、消息通道
23
- +--> Python 工作流:NT 数据、公众号日报、HTML 阅读器、知识管道
24
- |
25
- v
22
+ assistantTools.ts ==== **助手与 MCP 共用同一张工具表**
23
+ |
24
+ +----------+---------------------------+
25
+ | |
26
+ v v
27
+ Node 原生层 src/core/ Python 工作流 scripts/
28
+ 路径发现、配置、数据库适配、消息通道 NT 数据、日报、知识卡、概念页、图谱页
29
+ |
30
+ v
26
31
  本地数据与明确选择的外部服务
27
- 微信本地数据库、缓存、日报输出、Vault
32
+ 微信本地数据库、缓存、日报输出、Vault、概念图谱页面
28
33
  公众号网页、微信读书、用户配置的 AI 端点、官方 Bot 通道
29
34
  ```
35
+ ```text
36
+ 回环端口(都只绑 127.0.0.1):
37
+ 8765 日报阅读器 无 token
38
+ 8766 面板 / 助手 每个请求都要 token(含 GET /api/status)
39
+ 8790 MCP HTTP 强制 Bearer,含 DNS-rebinding 防护
40
+ ```
30
41
 
31
42
  ## 代码边界
32
43
 
33
44
  | 目录 | 职责 |
34
45
  | --- | --- |
35
- | `bin/` | Commander 命令定义、参数校验和交互式菜单。 |
46
+ | `bin/` | Commander 命令定义、参数校验和交互式菜单(113 处 `.command(`,含子命令)。 |
36
47
  | `src/core/` | 数据目录发现、数据库连接、密钥配置适配和客户端底层集成。 |
37
- | `src/services/` | 聊天、导出、证据包、日报、助手、白名单和隐私策略。 |
38
- | `scripts/` | Python 数据读取、公众号抓取、日报、HTML、搜索和报告脚本。 |
39
- | `mcp-server/` | 通过 stdio 暴露受控工具,不监听网络端口。 |
40
- | `test/` | Node 和 Python 回归测试,优先使用合成数据。 |
41
- | `resources/` | 随包发布的只读资源,例如默认表情素材。 |
48
+ | `src/services/` | 聊天、导出、证据包、日报、助手、白名单和隐私策略。`assistantTools.ts` 是助手与 MCP **共用**的工具表(31 个工具)。 |
49
+ | `src/panel/` | 本机面板的入口:回环 HTTP 服务(`127.0.0.1:8766`,每进程一个随机 token,写 `~/.weflow-cli/assistant_endpoint.json`)、Electron/Edge 启动决策、CLI 侧客户端。 |
50
+ | `scripts/` | 59 个 Python 工作流(约 2.8 万行):NT 数据读取与解密、知识卡(文章 / 聊天 / 收藏 / 自写笔记)、概念页编译与体检、日报与报告、搜索与 RAG、图谱页面、判断层与评测。 |
51
+ | `mcp-server/` | 用**两种传输**暴露受控工具:stdio(默认)与 Streamable HTTP(`--http`,回环 `127.0.0.1:8790`,强制 Bearer token,含 DNS-rebinding 防护)。两种传输的工具表相同。 |
52
+ | `test/` | Node 和 Python 回归测试(118 个文件:80 TS / 38 Python),优先使用合成数据。 |
53
+ | `resources/` | 随包发布的只读资源:Electron 面板应用与吉祥物素材、`wcdb` / `wx_key` 原生 DLL、`js/graph3d`(2D/3D 图谱页面用的库,版本与许可记在同目录 `NOTICE.txt`)。 |
42
54
 
43
55
  ## 主要数据流
44
56
 
@@ -73,32 +85,56 @@ CLI 入口 bin/weflow-cli.ts ---- mcp-server/index.ts
73
85
 
74
86
  ```text
75
87
  日报 / 收藏 / 微信读书笔记 / 聊天卡 / 你自己的笔记
76
- -> Vault(Sources/ 原始素材 + 001_Daily + 002_Literature 阅读笔记)
77
- -> 两个概念页目录:Wiki/Concepts(文章线)、Chat/Concepts(聊天线)
88
+ -> output/*-notes(卡片,四条来源各自产出,形状相同)
89
+ -> Vault:**只有显式加 --with-vault / --with-wiki 才写**
90
+ Sources/ 原始素材 + 001_Daily + 002_Literature 阅读笔记
91
+ -> 两个概念页目录,**两条线各自的命名空间**(同名可以各有一张页;图谱主键是 `线:名字`):
92
+ Wiki/Concepts(文章线)、Chat/Concepts(聊天线)
78
93
  -> 本地搜索或可选 AI RAG
94
+ -> 概念图谱页面:wiki graph(自包含 2D/3D HTML,坐标缓存 output/.graph3d-cache/)
79
95
  -> review、report、annual-report、todos 等报告
80
96
  ```
81
97
 
98
+ **默认不写 Obsidian 库**:Obsidian 自己的关系图谱是活的,库文件一变它就重建,所以"内容一更新图谱就重建"其实是库被重写了。于是 `daily` 只有拿到 `--with-vault`(拷贝当天内容)或 `--with-wiki`(再编概念页)时才动 Vault,由用户自己说什么时候重建。
99
+
82
100
  Vault promotion 默认不调用 AI;只有显式使用 `--with-ai` 并提供凭据时才生成 AI 内容。
83
101
 
84
102
  ### 助手与 MCP
85
103
 
86
104
  ```text
87
- MCP stdio 或官方 Bot 通道
105
+ MCP(stdio 或回环 HTTP) / 本机面板 / 官方 Bot 通道
88
106
  -> 白名单与隐私策略
89
- -> 受控工具调用
107
+ -> 受控工具调用(助手与 MCP 共用 assistantTools.ts 那张表)
90
108
  -> 本地数据查询 / 可选云端模型
91
109
  -> 脱敏后的回复或工具结果
92
110
  ```
93
111
 
94
- MCP 客户端本身是可信调用方,配置前必须审查其权限和工作目录。默认 MCP 工具面只读,不提供发布、发送、记忆写入、待办修改、配置变更或删除。助手默认拒绝所有来信;`send` 仅用于已建立的官方 Bot 通道会话,不等于操控个人微信账号,也不能向普通个人联系人或群聊发消息。
112
+ MCP 客户端本身是可信调用方,配置前必须审查其权限和工作目录。**MCP 的工具面由助手的工具表派生**(少掉 `save_memory`、`look_at_image`、`set_todo_status` 三个),所以它**不是纯只读**:写入类调用要显式 `confirm`,读取类里有几个会出网(抓正文、公开文章搜索、语义检索、起草)。**发送消息、发布文章、改配置这三件事在两侧都没有工具**——`weflow-cli capabilities --json` 的 `safety.mcpDefaultReadOnly` 是这条边界的机器可读版本。助手默认拒绝所有来信;`send` 仅用于已建立的官方 Bot 通道会话,不等于操控个人微信账号,也不能向普通个人联系人或群聊发消息。
113
+
114
+ ### 本机面板与助手守护进程
115
+
116
+ ```text
117
+ weflow-cli assistant start
118
+ -> 分离进程 weflow-cli assistant run --yes
119
+ -> AssistantService.start()
120
+ -> 可选:微信 Bot 通道长轮询(没有 token 就退化成纯本地)
121
+ -> startPanelServer() 绑 127.0.0.1:8766,随机 token
122
+ 写 ~/.weflow-cli/assistant_endpoint.json
123
+ weflow-cli panel
124
+ -> 读 endpoint 文件(没起守护进程就先起)
125
+ -> 起 Electron(resources/panel/,**不带任何参数,凭证不进 argv**)
126
+ 或 Edge/Chrome --app + 一次性配对码换 HttpOnly cookie
127
+ -> 窗口里的 renderer.js 走同一个端口;窗口本身**只读不写**
128
+ ```
129
+
130
+ 面板与微信内问的是**同一个大脑**:同一份记忆、同一条每日配额。所以它是客户端而不是第二个后端——两个入口不会各写一份记忆。配对码只用来换 cookie,token 由服务端生成、写在只有本机用户可读的 endpoint 文件里。
95
131
 
96
132
  ## 支持与限制
97
133
 
98
134
  - 当前重点验证 Windows 微信 4.x;Linux 可使用相应 NT 数据路径;macOS 不提供自动初始化,需用户自行提供合法的本地访问凭据。
99
135
  - 数据库格式、微信版本、官方通道和账号策略可能变化;本地运行不保证兼容性、账号安全或法律结果。
100
136
  - 图片和表情导出会尽力使用本地缓存、媒体资源记录和消息提供的 URL。没有可靠身份或原始资源时不会猜测其他图片,而是显示占位信息。
101
- - 阅读器只绑定回环地址,默认不是局域网服务。
137
+ - 三个本地 HTTP 入口都只绑回环地址,默认不是局域网服务:阅读器 8765(无 token)、面板 8766(每请求 token)、MCP HTTP 8790(Bearer)。要从别的机器连,走 SSH 隧道或自己的反向代理。
102
138
  - 云端 AI、文章抓取、微信读书和发布草稿都可能产生网络请求;本地推理可避免对应的正文出网,但仍应审查客户端和模型配置。
103
139
 
104
140
  ## 维护规则