weflow-cli 1.7.0 → 1.8.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 (194) hide show
  1. package/ARCHITECTURE.md +3 -2
  2. package/CHANGELOG.md +1949 -1
  3. package/OPERATIONS.md +774 -1
  4. package/README.en.md +93 -7
  5. package/README.md +31 -6
  6. package/bin/weflow-cli.ts +934 -27
  7. package/dist/bin/weflow-cli.js +952 -27
  8. package/dist/bin/weflow-cli.js.map +1 -1
  9. package/dist/mcp-server/index.js +39 -13
  10. package/dist/mcp-server/index.js.map +1 -1
  11. package/dist/src/core/appMsgFormat.d.ts +37 -0
  12. package/dist/src/core/appMsgFormat.d.ts.map +1 -0
  13. package/dist/src/core/appMsgFormat.js +106 -0
  14. package/dist/src/core/appMsgFormat.js.map +1 -0
  15. package/dist/src/core/ntCore.d.ts +19 -2
  16. package/dist/src/core/ntCore.d.ts.map +1 -1
  17. package/dist/src/core/ntCore.js +11 -1
  18. package/dist/src/core/ntCore.js.map +1 -1
  19. package/dist/src/core/sqlcipherCore.d.ts +0 -12
  20. package/dist/src/core/sqlcipherCore.d.ts.map +1 -1
  21. package/dist/src/core/sqlcipherCore.js +5 -64
  22. package/dist/src/core/sqlcipherCore.js.map +1 -1
  23. package/dist/src/core/wcdbCore.d.ts +1 -1
  24. package/dist/src/core/wcdbCore.d.ts.map +1 -1
  25. package/dist/src/core/wcdbCore.js +5 -1
  26. package/dist/src/core/wcdbCore.js.map +1 -1
  27. package/dist/src/panel/client.d.ts +25 -0
  28. package/dist/src/panel/client.d.ts.map +1 -0
  29. package/dist/src/panel/client.js +34 -0
  30. package/dist/src/panel/client.js.map +1 -0
  31. package/dist/src/panel/endpoint.d.ts +45 -0
  32. package/dist/src/panel/endpoint.d.ts.map +1 -0
  33. package/dist/src/panel/endpoint.js +132 -0
  34. package/dist/src/panel/endpoint.js.map +1 -0
  35. package/dist/src/panel/launch.d.ts +50 -0
  36. package/dist/src/panel/launch.d.ts.map +1 -0
  37. package/dist/src/panel/launch.js +74 -0
  38. package/dist/src/panel/launch.js.map +1 -0
  39. package/dist/src/panel/server.d.ts +23 -0
  40. package/dist/src/panel/server.d.ts.map +1 -0
  41. package/dist/src/panel/server.js +413 -0
  42. package/dist/src/panel/server.js.map +1 -0
  43. package/dist/src/panel/userId.d.ts +37 -0
  44. package/dist/src/panel/userId.d.ts.map +1 -0
  45. package/dist/src/panel/userId.js +56 -0
  46. package/dist/src/panel/userId.js.map +1 -0
  47. package/dist/src/services/assistantDaemon.d.ts +20 -3
  48. package/dist/src/services/assistantDaemon.d.ts.map +1 -1
  49. package/dist/src/services/assistantDaemon.js +46 -9
  50. package/dist/src/services/assistantDaemon.js.map +1 -1
  51. package/dist/src/services/assistantEval.d.ts +141 -0
  52. package/dist/src/services/assistantEval.d.ts.map +1 -0
  53. package/dist/src/services/assistantEval.js +497 -0
  54. package/dist/src/services/assistantEval.js.map +1 -0
  55. package/dist/src/services/assistantMemory.d.ts +106 -4
  56. package/dist/src/services/assistantMemory.d.ts.map +1 -1
  57. package/dist/src/services/assistantMemory.js +396 -61
  58. package/dist/src/services/assistantMemory.js.map +1 -1
  59. package/dist/src/services/assistantPrivacy.d.ts +15 -2
  60. package/dist/src/services/assistantPrivacy.d.ts.map +1 -1
  61. package/dist/src/services/assistantPrivacy.js +18 -4
  62. package/dist/src/services/assistantPrivacy.js.map +1 -1
  63. package/dist/src/services/assistantRouter.d.ts +41 -0
  64. package/dist/src/services/assistantRouter.d.ts.map +1 -0
  65. package/dist/src/services/assistantRouter.js +151 -0
  66. package/dist/src/services/assistantRouter.js.map +1 -0
  67. package/dist/src/services/assistantService.d.ts +209 -3
  68. package/dist/src/services/assistantService.d.ts.map +1 -1
  69. package/dist/src/services/assistantService.js +590 -75
  70. package/dist/src/services/assistantService.js.map +1 -1
  71. package/dist/src/services/assistantTools.d.ts +205 -1
  72. package/dist/src/services/assistantTools.d.ts.map +1 -1
  73. package/dist/src/services/assistantTools.js +1089 -58
  74. package/dist/src/services/assistantTools.js.map +1 -1
  75. package/dist/src/services/assistantTrace.d.ts +47 -0
  76. package/dist/src/services/assistantTrace.d.ts.map +1 -0
  77. package/dist/src/services/assistantTrace.js +150 -0
  78. package/dist/src/services/assistantTrace.js.map +1 -0
  79. package/dist/src/services/chatService.d.ts +1 -1
  80. package/dist/src/services/chatService.d.ts.map +1 -1
  81. package/dist/src/services/chatService.js +5 -2
  82. package/dist/src/services/chatService.js.map +1 -1
  83. package/dist/src/services/configService.d.ts +9 -0
  84. package/dist/src/services/configService.d.ts.map +1 -1
  85. package/dist/src/services/configService.js +15 -8
  86. package/dist/src/services/configService.js.map +1 -1
  87. package/dist/src/services/pythonBridge.d.ts +41 -0
  88. package/dist/src/services/pythonBridge.d.ts.map +1 -0
  89. package/dist/src/services/pythonBridge.js +119 -0
  90. package/dist/src/services/pythonBridge.js.map +1 -0
  91. package/dist/src/services/syncService.d.ts +8 -2
  92. package/dist/src/services/syncService.d.ts.map +1 -1
  93. package/dist/src/services/syncService.js +26 -7
  94. package/dist/src/services/syncService.js.map +1 -1
  95. package/dist/src/services/wechatMessageService.d.ts +25 -0
  96. package/dist/src/services/wechatMessageService.d.ts.map +1 -1
  97. package/dist/src/services/wechatMessageService.js +69 -7
  98. package/dist/src/services/wechatMessageService.js.map +1 -1
  99. package/dist/src/utils/atomicWrite.d.ts +4 -0
  100. package/dist/src/utils/atomicWrite.d.ts.map +1 -0
  101. package/dist/src/utils/atomicWrite.js +60 -0
  102. package/dist/src/utils/atomicWrite.js.map +1 -0
  103. package/dist/src/utils/dateRange.d.ts +15 -0
  104. package/dist/src/utils/dateRange.d.ts.map +1 -1
  105. package/dist/src/utils/dateRange.js +47 -0
  106. package/dist/src/utils/dateRange.js.map +1 -1
  107. package/dist/src/utils/text.d.ts +18 -0
  108. package/dist/src/utils/text.d.ts.map +1 -0
  109. package/dist/src/utils/text.js +20 -0
  110. package/dist/src/utils/text.js.map +1 -0
  111. package/docs/AI_INTERFACE.md +2 -0
  112. package/docs/DECISIONS.md +1424 -0
  113. package/docs/EXTENDING.md +187 -0
  114. package/docs/JEV/345/272/224/347/224/250/346/226/275/345/267/245/346/226/207/346/241/243.md +310 -0
  115. package/docs/MCP.md +23 -4
  116. package/docs/PROJECT_STATE.md +299 -98
  117. package/docs/SETUP.md +22 -0
  118. package/docs/SYNC_CONTRACT.md +31 -3
  119. package/mcp-server/index.ts +681 -657
  120. package/package.json +84 -83
  121. package/resources/panel/ball-position.cjs +153 -0
  122. package/resources/panel/index.html +46 -0
  123. package/resources/panel/main.cjs +447 -0
  124. package/resources/panel/mascot-focus.png +0 -0
  125. package/resources/panel/mascot-happy.png +0 -0
  126. package/resources/panel/mascot-sorry.png +0 -0
  127. package/resources/panel/mascot-tired.png +0 -0
  128. package/resources/panel/mascot.png +0 -0
  129. package/resources/panel/package.json +7 -0
  130. package/resources/panel/panel.css +407 -0
  131. package/resources/panel/preload.cjs +72 -0
  132. package/resources/panel/quick-menu.cjs +197 -0
  133. package/resources/panel/renderer.js +441 -0
  134. package/resources/panel/tray-menu.cjs +40 -0
  135. package/resources/panel/tray.png +0 -0
  136. package/scripts/_utils.py +403 -54
  137. package/scripts/annual_report.py +4 -2
  138. package/scripts/article_notes.py +423 -0
  139. package/scripts/backfill_articles.py +438 -0
  140. package/scripts/biz_daily.py +590 -105
  141. package/scripts/chat_notes.py +470 -0
  142. package/scripts/classify_daily.py +10 -18
  143. package/scripts/compile_wiki.py +1059 -46
  144. package/scripts/create_reading_notes.py +199 -14
  145. package/scripts/decide.py +253 -0
  146. package/scripts/draft_reply.py +671 -0
  147. package/scripts/export_chat_html.py +35 -33
  148. package/scripts/extract_todos.py +31 -5
  149. package/scripts/fav_notes.py +318 -0
  150. package/scripts/fix_topics.py +2 -1
  151. package/scripts/generate_ai_report.py +214 -9
  152. package/scripts/generate_html.py +18 -3
  153. package/scripts/generate_review.py +2 -2
  154. package/scripts/jev_client.py +294 -0
  155. package/scripts/jev_probe.py +440 -0
  156. package/scripts/nt_common.py +82 -0
  157. package/scripts/nt_decrypt.py +1755 -1460
  158. package/scripts/pipeline.py +27 -2
  159. package/scripts/promote_ideas.py +19 -4
  160. package/scripts/quality_eval.py +707 -0
  161. package/scripts/rag_chat.py +4 -4
  162. package/scripts/read_image.py +187 -0
  163. package/scripts/reply_debt.py +488 -0
  164. package/scripts/route_cards.py +453 -0
  165. package/scripts/semantic_search.py +208 -49
  166. package/scripts/user_notes.py +315 -0
  167. package/scripts/vault_rag.py +13 -7
  168. package/scripts/vault_search.py +21 -4
  169. package/scripts/wiki_lint.py +397 -0
  170. package/src/core/appMsgFormat.ts +117 -0
  171. package/src/core/ntCore.ts +27 -2
  172. package/src/core/sqlcipherCore.ts +5 -61
  173. package/src/core/wcdbCore.ts +6 -2
  174. package/src/panel/client.ts +49 -0
  175. package/src/panel/endpoint.ts +144 -0
  176. package/src/panel/launch.ts +101 -0
  177. package/src/panel/server.ts +424 -0
  178. package/src/panel/userId.ts +72 -0
  179. package/src/services/assistantDaemon.ts +57 -9
  180. package/src/services/assistantEval.ts +611 -0
  181. package/src/services/assistantMemory.ts +413 -57
  182. package/src/services/assistantPrivacy.ts +18 -4
  183. package/src/services/assistantRouter.ts +191 -0
  184. package/src/services/assistantService.ts +671 -74
  185. package/src/services/assistantTools.ts +1118 -57
  186. package/src/services/assistantTrace.ts +175 -0
  187. package/src/services/chatService.ts +6 -2
  188. package/src/services/configService.ts +403 -385
  189. package/src/services/pythonBridge.ts +139 -0
  190. package/src/services/syncService.ts +37 -9
  191. package/src/services/wechatMessageService.ts +73 -7
  192. package/src/utils/atomicWrite.ts +56 -0
  193. package/src/utils/dateRange.ts +46 -0
  194. package/src/utils/text.ts +20 -0
package/docs/SETUP.md CHANGED
@@ -81,6 +81,26 @@ weflow-cli daily-server --date YYYY-MM-DD --open
81
81
  weflow-cli config set dailyAiEnabled false
82
82
  ```
83
83
 
84
+ 文章的主题与相关度默认可以交给 TypeSafe 的 Jev 决策模型判断(返回概率而不是一段要解析的文字)。这一步可选:**不配就沿用原来的 LLM 解析路径,行为不变。**
85
+
86
+ ```powershell
87
+ weflow-cli config set typesafeApiKey "..." # 机器绑定加密保存,和 deepseekApiKey 一样
88
+ weflow-cli config set typesafeApiKey "" # 清空即回到 LLM 解析路径
89
+ ```
90
+
91
+ 不想在日报里看到某一类(如新闻/投资/学术):
92
+
93
+ ```powershell
94
+ weflow-cli config set dailyExcludeTopics "新闻,投资,学术" # 留空即不排除
95
+ ```
96
+
97
+ **这是展示层开关,不是抓取层的**:正文照常抓取归档,只是不展示,改主意不用重抓。
98
+ 为什么不干脆不抓:拉之前可用的信息(来源+标题+摘要)判类型实测只有 60% 一致率,
99
+ 而排除不可逆。详见 OPERATIONS.md 的「不想看某一类:排除主题」。
100
+ ```
101
+
102
+ 配了它之后,文章标题与正文会同时发给 DeepSeek 和 `api.typesafe.ai` 两处(出网范围见下节)。
103
+
84
104
  日报输出和阅读器均为本地文件/回环服务。阅读器默认地址是 `http://127.0.0.1:8765/`,不要把端口暴露到局域网或公网。
85
105
 
86
106
  ## 配置与隐私
@@ -89,6 +109,8 @@ weflow-cli config set dailyAiEnabled false
89
109
 
90
110
  以下内容禁止提交:数据库、导出聊天、日报正文、`.env`、MCP 配置中的密钥、账号标识、完整日志和真实截图。MCP 客户端配置前确认其工作目录和权限;云端 AI 只处理明确选择的内容,敏感聊天优先用本地模型。
91
111
 
112
+ 日报出网的对象有两个:生成摘要的 LLM(DeepSeek 或你配置的 OpenAI 兼容端点),以及配置了 `typesafeApiKey` 之后判断文章主题与相关度的 TypeSafe Jev(`api.typesafe.ai`)。两者都会看到文章标题与正文。不需要任何出网时用 `weflow-cli daily --no-ai`。
113
+
92
114
  ## 最小验收
93
115
 
94
116
  ```powershell
@@ -46,7 +46,7 @@
46
46
  "scanned": 4, "opened": 4, "failed": 0,
47
47
  "items": [
48
48
  { "name": "message_0.db", "opened": true, "hasTalkerTable": true,
49
- "rowsForTalker": 8123, "reason": null }
49
+ "rowsForTalker": 8123, "reason": null, "missingColumns": [] }
50
50
  ]
51
51
  },
52
52
  "coverage": "complete",
@@ -70,17 +70,45 @@
70
70
 
71
71
  | 值 | 含义 |
72
72
  | --- | --- |
73
- | `complete` | 扫到的分片全部打开、打开的全读成功,且 `mayHaveMore` 为 false |
73
+ | `complete` | 扫到的分片全部打开、打开的全读成功(无 `reason`,允许有 `missingColumns`),且 `mayHaveMore` 为 false |
74
74
  | `unverified` | 有分片**打不开**,但打开的都读成功。已读部分是可信的,未打开的分片是否含本会话消息**无法判断** |
75
- | `partial` | 某个**已打开**的分片读失败,或 `mayHaveMore` 为 true,或分页在到达窗口起点前就短页结束 |
75
+ | `partial` | 某个**已打开**的分片带 `reason`,或 `mayHaveMore` 为 true,或分页在到达窗口起点前就短页结束 |
76
76
 
77
77
  `unverified` 不是失败:`connect_message_shards` 一直把打不开的分片当作可跳过的(这是有意设计),
78
78
  CLI 无法知道那个分片里有没有本会话的消息。如实标成 `unverified` + `warnings` 比直接失败更有用,
79
79
  也让自动化不至于卡死。
80
80
 
81
+ `partial` 的判据是**已打开的分片带 reason**,而不是某个特定的 reason 值。除 `READ_FAILED`(读到一半
82
+ 出错)外还有两种同样意味着"这个分片的这段范围没读到"的情况:
83
+
84
+ | `reason` | 含义 |
85
+ | --- | --- |
86
+ | `READ_FAILED` | 已打开,读的过程中出错 |
87
+ | `SCHEMA_MISMATCH` | 已打开,但表里**没有一个**读者认得的列,这些行无法变成消息 |
88
+ | `WINDOW_UNAVAILABLE` | 已打开,但表里没有 `create_time`,请求的时间窗无法表达。**宁可拒绝也不近似**——不筛就返回会让调用方把没读的范围记成已覆盖 |
89
+
90
+ 把三者都算 `partial` 是必须的:它们描述的都是"这些行没读",而这正是 `coverage` 要回答的问题。
91
+
92
+ **`missingColumns` 是另一回事,不算 partial。** 它的行**读回来了**,只是少了字段(如缺 `server_id`),
93
+ 所以 `coverage` 仍是 `complete`,另发一条 `shard-columns-missing:<分片>:<列+列>` 警告。
94
+ 把两者混为一谈,会让这类数据库上的每次同步永远报 `partial`,`lastSuccessfulRun` 永远不推进。
95
+ 列名是 schema 不是内容,写进状态文件不违反脱敏约束。
96
+
81
97
  `partial` 则**必须失败**(`code: 'SYNC_PARTIAL'`,退出码 1):状态文件照写(方案 §5.2 要求
82
98
  部分完成不得删除已生成的可用结果),但 `lastSuccessfulRun` 不推进。
83
99
 
100
+ ### 时间窗下推:是优化,不是正确性来源
101
+
102
+ `sync` 会把窗口下界作为**提示**传给后端(NT 走 `nt_decrypt.py messages --from`),SQL 侧因此不必
103
+ 把整段会话取回来再丢弃。但**窗口的真正执行者是 `syncService` 自己**:它在读回之后再按
104
+ `createTime >= from` 过滤一遍。这样划分的原因是**非 NT 后端没有范围下推**,若把正确性寄托在下推上,
105
+ 这些后端上的同步会静默地整段读、却报告成"按窗口读了"。
106
+
107
+ **实测(2026-09-20,本机真实数据,925 条 4 分片)**:下推带来的收益**观测不到**——
108
+ 无窗口 519 ms / `--from=最新` 514 ms,两者在噪声内。这个耗时的绝大部分是进程启动 + 每个分片的
109
+ PBKDF2(256000 轮),跟搬多少行无关。所以下推的意义是**渐近的**(会话越大越有用),
110
+ 不是当前就能测到的时间节省;这也意味着**不要**拿它当性能优化写进发布说明。
111
+
84
112
  ### 身份
85
113
 
86
114
  按方案 §4.2,`serverId` 非零时优先;**`localId` 绝不单独作为全局身份**(D-014 同此约束)。