weflow-cli 1.5.0 → 1.6.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 (332) hide show
  1. package/ARCHITECTURE.md +105 -0
  2. package/CHANGELOG.md +121 -0
  3. package/CONTRIBUTING.md +45 -0
  4. package/LICENSE +21 -21
  5. package/OPERATIONS.md +272 -0
  6. package/README.en.md +281 -0
  7. package/README.md +334 -149
  8. package/SECURITY.md +47 -0
  9. package/bin/weflow-cli.ts +4050 -581
  10. package/dist/bin/weflow-cli.js +4310 -588
  11. package/dist/bin/weflow-cli.js.map +1 -1
  12. package/dist/mcp-server/index.js +178 -236
  13. package/dist/mcp-server/index.js.map +1 -1
  14. package/dist/src/core/dbPathService.d.ts +15 -1
  15. package/dist/src/core/dbPathService.d.ts.map +1 -1
  16. package/dist/src/core/dbPathService.js +177 -19
  17. package/dist/src/core/dbPathService.js.map +1 -1
  18. package/dist/src/core/keyService.d.ts +8 -0
  19. package/dist/src/core/keyService.d.ts.map +1 -1
  20. package/dist/src/core/keyService.js +127 -22
  21. package/dist/src/core/keyService.js.map +1 -1
  22. package/dist/src/core/ntCore.d.ts +59 -1
  23. package/dist/src/core/ntCore.d.ts.map +1 -1
  24. package/dist/src/core/ntCore.js +201 -65
  25. package/dist/src/core/ntCore.js.map +1 -1
  26. package/dist/src/core/sqlcipherCore.d.ts.map +1 -1
  27. package/dist/src/core/sqlcipherCore.js +18 -1
  28. package/dist/src/core/sqlcipherCore.js.map +1 -1
  29. package/dist/src/core/wcdbCore.d.ts.map +1 -1
  30. package/dist/src/core/wcdbCore.js +3 -6
  31. package/dist/src/core/wcdbCore.js.map +1 -1
  32. package/dist/src/services/assistantDaemon.d.ts +19 -0
  33. package/dist/src/services/assistantDaemon.d.ts.map +1 -0
  34. package/dist/src/services/assistantDaemon.js +117 -0
  35. package/dist/src/services/assistantDaemon.js.map +1 -0
  36. package/dist/src/services/assistantMemory.d.ts +36 -0
  37. package/dist/src/services/assistantMemory.d.ts.map +1 -0
  38. package/dist/src/services/assistantMemory.js +182 -0
  39. package/dist/src/services/assistantMemory.js.map +1 -0
  40. package/dist/src/services/assistantPrivacy.d.ts +25 -0
  41. package/dist/src/services/assistantPrivacy.d.ts.map +1 -0
  42. package/dist/src/services/assistantPrivacy.js +77 -0
  43. package/dist/src/services/assistantPrivacy.js.map +1 -0
  44. package/dist/src/services/assistantRouting.d.ts +18 -0
  45. package/dist/src/services/assistantRouting.d.ts.map +1 -0
  46. package/dist/src/services/assistantRouting.js +68 -0
  47. package/dist/src/services/assistantRouting.js.map +1 -0
  48. package/dist/src/services/assistantService.d.ts +37 -0
  49. package/dist/src/services/assistantService.d.ts.map +1 -0
  50. package/dist/src/services/assistantService.js +284 -0
  51. package/dist/src/services/assistantService.js.map +1 -0
  52. package/dist/src/services/assistantTools.d.ts +24 -0
  53. package/dist/src/services/assistantTools.d.ts.map +1 -0
  54. package/dist/src/services/assistantTools.js +582 -0
  55. package/dist/src/services/assistantTools.js.map +1 -0
  56. package/dist/src/services/chatService.d.ts +44 -0
  57. package/dist/src/services/chatService.d.ts.map +1 -1
  58. package/dist/src/services/chatService.js +105 -4
  59. package/dist/src/services/chatService.js.map +1 -1
  60. package/dist/src/services/configService.d.ts +55 -0
  61. package/dist/src/services/configService.d.ts.map +1 -1
  62. package/dist/src/services/configService.js +147 -6
  63. package/dist/src/services/configService.js.map +1 -1
  64. package/dist/src/services/evidenceService.d.ts +30 -0
  65. package/dist/src/services/evidenceService.d.ts.map +1 -0
  66. package/dist/src/services/evidenceService.js +98 -0
  67. package/dist/src/services/evidenceService.js.map +1 -0
  68. package/dist/src/services/exportService.d.ts +13 -20
  69. package/dist/src/services/exportService.d.ts.map +1 -1
  70. package/dist/src/services/exportService.js +113 -47
  71. package/dist/src/services/exportService.js.map +1 -1
  72. package/dist/src/services/initKeyService.d.ts +19 -0
  73. package/dist/src/services/initKeyService.d.ts.map +1 -0
  74. package/dist/src/services/initKeyService.js +80 -0
  75. package/dist/src/services/initKeyService.js.map +1 -0
  76. package/dist/src/services/messageContract.d.ts +23 -0
  77. package/dist/src/services/messageContract.d.ts.map +1 -0
  78. package/dist/src/services/messageContract.js +49 -0
  79. package/dist/src/services/messageContract.js.map +1 -0
  80. package/dist/src/services/messageQuery.d.ts +7 -0
  81. package/dist/src/services/messageQuery.d.ts.map +1 -0
  82. package/dist/src/services/messageQuery.js +30 -0
  83. package/dist/src/services/messageQuery.js.map +1 -0
  84. package/dist/src/services/wechat-formatter.js +14 -14
  85. package/dist/src/services/wechatMessageService.d.ts.map +1 -1
  86. package/dist/src/services/wechatMessageService.js +31 -3
  87. package/dist/src/services/wechatMessageService.js.map +1 -1
  88. package/dist/src/services/whitelistService.d.ts +52 -4
  89. package/dist/src/services/whitelistService.d.ts.map +1 -1
  90. package/dist/src/services/whitelistService.js +183 -17
  91. package/dist/src/services/whitelistService.js.map +1 -1
  92. package/dist/src/types.d.ts +20 -0
  93. package/dist/src/types.d.ts.map +1 -1
  94. package/dist/src/utils/dateRange.d.ts +15 -0
  95. package/dist/src/utils/dateRange.d.ts.map +1 -0
  96. package/dist/src/utils/dateRange.js +48 -0
  97. package/dist/src/utils/dateRange.js.map +1 -0
  98. package/dist/src/utils/mcpSecurity.d.ts +5 -0
  99. package/dist/src/utils/mcpSecurity.d.ts.map +1 -0
  100. package/dist/src/utils/mcpSecurity.js +39 -0
  101. package/dist/src/utils/mcpSecurity.js.map +1 -0
  102. package/dist/src/utils/packageRoot.d.ts +2 -0
  103. package/dist/src/utils/packageRoot.d.ts.map +1 -0
  104. package/dist/src/utils/packageRoot.js +16 -0
  105. package/dist/src/utils/packageRoot.js.map +1 -0
  106. package/dist/src/utils/python.d.ts +2 -0
  107. package/dist/src/utils/python.d.ts.map +1 -0
  108. package/dist/src/utils/python.js +72 -0
  109. package/dist/src/utils/python.js.map +1 -0
  110. package/dist/src/utils/pythonProcessEnv.d.ts +3 -0
  111. package/dist/src/utils/pythonProcessEnv.d.ts.map +1 -0
  112. package/dist/src/utils/pythonProcessEnv.js +46 -0
  113. package/dist/src/utils/pythonProcessEnv.js.map +1 -0
  114. package/dist/src/utils/talkerUtils.d.ts +4 -1
  115. package/dist/src/utils/talkerUtils.d.ts.map +1 -1
  116. package/dist/src/utils/talkerUtils.js +9 -9
  117. package/dist/src/utils/talkerUtils.js.map +1 -1
  118. package/dist/src/utils/wechatEmoji.d.ts +5 -0
  119. package/dist/src/utils/wechatEmoji.d.ts.map +1 -0
  120. package/dist/src/utils/wechatEmoji.js +35 -0
  121. package/dist/src/utils/wechatEmoji.js.map +1 -0
  122. package/docs/AI_INTERFACE.md +189 -0
  123. package/docs/BRANCHES.md +87 -0
  124. package/docs/DATA_CONTRACT.md +74 -0
  125. package/docs/DECISIONS.md +270 -0
  126. package/docs/DEEPSEEK_V4_FLASH/346/226/275/345/267/245/346/226/207/346/241/243.md +234 -0
  127. package/docs/EVIDENCE_GUIDE.md +96 -0
  128. package/docs/MCP.md +95 -0
  129. package/docs/PARTNERS.md +41 -0
  130. package/docs/PROJECT_STATE.md +96 -0
  131. package/docs/RELEASING.md +124 -0
  132. package/docs/ROADMAP.md +191 -0
  133. package/docs/SETUP.md +103 -0
  134. package/docs/images/weflow-architecture-gpt-image-2.png +0 -0
  135. package/docs/images/weflow-architecture.png +0 -0
  136. package/docs/images/weflow-architecture.svg +65 -0
  137. package/mcp-server/index.ts +169 -269
  138. package/package.json +81 -72
  139. package/requirements-3x.txt +4 -0
  140. package/requirements-voice.txt +15 -0
  141. package/requirements.txt +9 -0
  142. package/resources/js/marked.min.js +69 -0
  143. package/resources/wechat-emoji/666.png +0 -0
  144. package/resources/wechat-emoji/Awesome.png +0 -0
  145. package/resources/wechat-emoji/Concerned.png +0 -0
  146. package/resources/wechat-emoji/Cry.png +0 -0
  147. package/resources/wechat-emoji/Emm.png +0 -0
  148. package/resources/wechat-emoji/Facepalm.png +0 -0
  149. package/resources/wechat-emoji/Grin.png +0 -0
  150. package/resources/wechat-emoji/OK.png +0 -0
  151. package/resources/wechat-emoji/Respect.png +0 -0
  152. package/resources/wechat-emoji/Sick.png +0 -0
  153. package/resources/wechat-emoji/Sleep.png +0 -0
  154. package/resources/wechat-emoji/Smile.png +0 -0
  155. package/resources/wechat-emoji//344/272/262/344/272/262.png +0 -0
  156. package/resources/wechat-emoji//344/276/277/344/276/277.png +0 -0
  157. package/resources/wechat-emoji//345/201/267/347/254/221.png +0 -0
  158. package/resources/wechat-emoji//345/202/262/346/205/242.png +0 -0
  159. package/resources/wechat-emoji//345/206/215/350/247/201.png +0 -0
  160. package/resources/wechat-emoji//345/207/213/350/260/242.png +0 -0
  161. package/resources/wechat-emoji//345/212/240/346/262/271.png +0 -0
  162. package/resources/wechat-emoji//345/213/276/345/274/225.png +0 -0
  163. package/resources/wechat-emoji//345/217/221/345/221/206.png +0 -0
  164. package/resources/wechat-emoji//345/217/221/346/200/222.png +0 -0
  165. package/resources/wechat-emoji//345/217/221/346/212/226.png +0 -0
  166. package/resources/wechat-emoji//345/217/257/346/200/234.png +0 -0
  167. package/resources/wechat-emoji//345/217/263/345/223/274/345/223/274.png +0 -0
  168. package/resources/wechat-emoji//345/217/271/346/260/224.png +0 -0
  169. package/resources/wechat-emoji//345/220/203/347/223/234.png +0 -0
  170. package/resources/wechat-emoji//345/220/210/345/215/201.png +0 -0
  171. package/resources/wechat-emoji//345/220/220.png +0 -0
  172. package/resources/wechat-emoji//345/221/262/347/211/231.png +0 -0
  173. package/resources/wechat-emoji//345/222/222/351/252/202.png +0 -0
  174. package/resources/wechat-emoji//345/222/226/345/225/241.png +0 -0
  175. package/resources/wechat-emoji//345/223/207.png +0 -0
  176. package/resources/wechat-emoji//345/225/244/351/205/222.png +0 -0
  177. package/resources/wechat-emoji//345/230/230.png +0 -0
  178. package/resources/wechat-emoji//345/230/264/345/224/207.png +0 -0
  179. package/resources/wechat-emoji//345/230/277/345/223/210.png +0 -0
  180. package/resources/wechat-emoji//345/233/247.png +0 -0
  181. package/resources/wechat-emoji//345/233/260.png +0 -0
  182. package/resources/wechat-emoji//345/235/217/347/254/221.png +0 -0
  183. package/resources/wechat-emoji//345/244/247/345/223/255.png +0 -0
  184. package/resources/wechat-emoji//345/244/251/345/225/212.png +0 -0
  185. package/resources/wechat-emoji//345/244/252/351/230/263.png +0 -0
  186. package/resources/wechat-emoji//345/244/261/346/234/233.png +0 -0
  187. package/resources/wechat-emoji//345/245/270/347/254/221.png +0 -0
  188. package/resources/wechat-emoji//345/245/275/347/232/204.png +0 -0
  189. package/resources/wechat-emoji//345/247/224/345/261/210.png +0 -0
  190. package/resources/wechat-emoji//345/256/263/347/276/236.png +0 -0
  191. package/resources/wechat-emoji//345/260/264/345/260/254.png +0 -0
  192. package/resources/wechat-emoji//345/272/206/347/245/235.png +0 -0
  193. package/resources/wechat-emoji//345/274/261.png +0 -0
  194. package/resources/wechat-emoji//345/274/272.png +0 -0
  195. package/resources/wechat-emoji//345/276/227/346/204/217.png +0 -0
  196. package/resources/wechat-emoji//345/276/256/347/254/221.png +0 -0
  197. package/resources/wechat-emoji//345/277/203/347/242/216.png +0 -0
  198. package/resources/wechat-emoji//345/277/253/345/223/255/344/272/206.png +0 -0
  199. package/resources/wechat-emoji//346/201/220/346/203/247.png +0 -0
  200. package/resources/wechat-emoji//346/202/240/351/227/262.png +0 -0
  201. package/resources/wechat-emoji//346/203/212/346/201/220.png +0 -0
  202. package/resources/wechat-emoji//346/203/212/350/256/266.png +0 -0
  203. package/resources/wechat-emoji//346/204/211/345/277/253.png +0 -0
  204. package/resources/wechat-emoji//346/206/250/347/254/221.png +0 -0
  205. package/resources/wechat-emoji//346/211/223/350/204/270.png +0 -0
  206. package/resources/wechat-emoji//346/212/223/347/213/202.png +0 -0
  207. package/resources/wechat-emoji//346/212/240/351/274/273.png +0 -0
  208. package/resources/wechat-emoji//346/212/261/346/213/263.png +0 -0
  209. package/resources/wechat-emoji//346/213/245/346/212/261.png +0 -0
  210. package/resources/wechat-emoji//346/213/263/345/244/264.png +0 -0
  211. package/resources/wechat-emoji//346/215/202/350/204/270.png +0 -0
  212. package/resources/wechat-emoji//346/217/241/346/211/213.png +0 -0
  213. package/resources/wechat-emoji//346/222/207/345/230/264.png +0 -0
  214. package/resources/wechat-emoji//346/223/246/346/261/227.png +0 -0
  215. package/resources/wechat-emoji//346/225/262/346/211/223.png +0 -0
  216. package/resources/wechat-emoji//346/227/240/350/257/255.png +0 -0
  217. package/resources/wechat-emoji//346/227/272/346/237/264.png +0 -0
  218. package/resources/wechat-emoji//346/231/225.png +0 -0
  219. package/resources/wechat-emoji//346/234/210/344/272/256.png +0 -0
  220. package/resources/wechat-emoji//346/234/272/346/231/272.png +0 -0
  221. package/resources/wechat-emoji//346/261/227.png +0 -0
  222. package/resources/wechat-emoji//346/265/201/346/263/252.png +0 -0
  223. package/resources/wechat-emoji//347/202/270/345/274/271.png +0 -0
  224. package/resources/wechat-emoji//347/203/237/350/212/261.png +0 -0
  225. package/resources/wechat-emoji//347/210/206/347/253/271.png +0 -0
  226. package/resources/wechat-emoji//347/210/261/345/277/203.png +0 -0
  227. package/resources/wechat-emoji//347/214/252/345/244/264.png +0 -0
  228. package/resources/wechat-emoji//347/216/253/347/221/260.png +0 -0
  229. package/resources/wechat-emoji//347/224/237/347/227/205.png +0 -0
  230. package/resources/wechat-emoji//347/226/221/351/227/256.png +0 -0
  231. package/resources/wechat-emoji//347/231/274.png +0 -0
  232. package/resources/wechat-emoji//347/231/275/347/234/274.png +0 -0
  233. package/resources/wechat-emoji//347/232/261/347/234/211.png +0 -0
  234. package/resources/wechat-emoji//347/235/241.png +0 -0
  235. package/resources/wechat-emoji//347/240/264/346/266/225/344/270/272/347/254/221.png +0 -0
  236. package/resources/wechat-emoji//347/244/274/347/211/251.png +0 -0
  237. package/resources/wechat-emoji//347/244/276/344/274/232/347/244/276/344/274/232.png +0 -0
  238. package/resources/wechat-emoji//347/246/217.png +0 -0
  239. package/resources/wechat-emoji//347/254/221/350/204/270.png +0 -0
  240. package/resources/wechat-emoji//347/272/242/345/214/205.png +0 -0
  241. package/resources/wechat-emoji//347/277/273/347/231/275/347/234/274.png +0 -0
  242. package/resources/wechat-emoji//350/200/266.png +0 -0
  243. package/resources/wechat-emoji//350/203/234/345/210/251.png +0 -0
  244. package/resources/wechat-emoji//350/204/270/347/272/242.png +0 -0
  245. package/resources/wechat-emoji//350/211/262.png +0 -0
  246. package/resources/wechat-emoji//350/213/246/346/266/251.png +0 -0
  247. package/resources/wechat-emoji//350/217/234/345/210/200.png +0 -0
  248. package/resources/wechat-emoji//350/233/213/347/263/225.png +0 -0
  249. package/resources/wechat-emoji//350/241/260.png +0 -0
  250. package/resources/wechat-emoji//350/243/202/345/274/200.png +0 -0
  251. package/resources/wechat-emoji//350/256/251/346/210/221/347/234/213/347/234/213.png +0 -0
  252. package/resources/wechat-emoji//350/260/203/347/232/256.png +0 -0
  253. package/resources/wechat-emoji//350/267/263/350/267/263.png +0 -0
  254. package/resources/wechat-emoji//350/275/254/345/234/210.png +0 -0
  255. package/resources/wechat-emoji//351/204/231/350/247/206.png +0 -0
  256. package/resources/wechat-emoji//351/227/255/345/230/264.png +0 -0
  257. package/resources/wechat-emoji//351/230/264/351/231/251.png +0 -0
  258. package/resources/wechat-emoji//351/232/276/350/277/207.png +0 -0
  259. package/resources/wechat-emoji//351/252/267/351/253/205.png +0 -0
  260. package/resources/wechat-emoji//351/274/223/346/216/214.png +0 -0
  261. package/scripts/_batch_link_sources.py +73 -73
  262. package/scripts/_utils.py +29 -0
  263. package/scripts/annual_report.py +796 -796
  264. package/scripts/auto_tag.py +128 -128
  265. package/scripts/biz_daily.py +210 -53
  266. package/scripts/chat_report.py +10 -0
  267. package/scripts/chat_stats.py +702 -702
  268. package/scripts/classify_daily.py +17 -11
  269. package/scripts/create_reading_notes.py +370 -370
  270. package/scripts/daily_stats.py +132 -0
  271. package/scripts/enrich_backlinks.py +163 -163
  272. package/scripts/export_chat_html.py +1704 -107
  273. package/scripts/extract_todos.py +445 -404
  274. package/scripts/fav_server.py +119 -12
  275. package/scripts/fix_topics.py +111 -111
  276. package/scripts/generate_ai_report.py +1 -1
  277. package/scripts/generate_html.py +597 -277
  278. package/scripts/inspection_records.py +354 -0
  279. package/scripts/mcp_bridge.py +398 -398
  280. package/scripts/nt_decrypt.py +702 -48
  281. package/scripts/pipeline.py +27 -19
  282. package/scripts/promote_all.py +312 -310
  283. package/scripts/promote_ideas.py +299 -297
  284. package/scripts/rag_chat.py +194 -191
  285. package/scripts/semantic_search.py +435 -431
  286. package/scripts/sync_fav.py +201 -146
  287. package/scripts/sync_weread.py +192 -192
  288. package/scripts/vault_rag.py +140 -139
  289. package/scripts/vault_search.py +141 -141
  290. package/scripts/wechat_emoji.py +132 -0
  291. package/scripts/wechat_emoticon.py +433 -0
  292. package/scripts/wechat_image.py +258 -0
  293. package/scripts/wechat_voice.py +327 -0
  294. package/src/core/dbPathService.ts +163 -18
  295. package/src/core/keyService.ts +137 -25
  296. package/src/core/ntCore.ts +215 -62
  297. package/src/core/sqlcipherCore.ts +17 -1
  298. package/src/core/wcdbCore.ts +3 -7
  299. package/src/services/assistantDaemon.ts +111 -0
  300. package/src/services/assistantMemory.ts +193 -0
  301. package/src/services/assistantPrivacy.ts +87 -0
  302. package/src/services/assistantRouting.ts +92 -0
  303. package/src/services/assistantService.ts +295 -0
  304. package/src/services/assistantTools.ts +549 -0
  305. package/src/services/chatService.ts +133 -4
  306. package/src/services/configService.ts +194 -6
  307. package/src/services/evidenceService.ts +129 -0
  308. package/src/services/exportService.ts +113 -48
  309. package/src/services/initKeyService.ts +83 -0
  310. package/src/services/messageContract.ts +77 -0
  311. package/src/services/messageQuery.ts +38 -0
  312. package/src/services/wechat-formatter.ts +348 -348
  313. package/src/services/wechatMessageService.ts +25 -3
  314. package/src/services/wereadService.ts +308 -308
  315. package/src/services/whitelistService.ts +209 -22
  316. package/src/types.ts +20 -0
  317. package/src/utils/dateRange.ts +58 -0
  318. package/src/utils/mcpSecurity.ts +39 -0
  319. package/src/utils/packageRoot.ts +14 -0
  320. package/src/utils/python.ts +73 -0
  321. package/src/utils/pythonProcessEnv.ts +45 -0
  322. package/src/utils/talkerUtils.ts +14 -2
  323. package/dist/src/utils/errors.d.ts +0 -25
  324. package/dist/src/utils/errors.d.ts.map +0 -1
  325. package/dist/src/utils/errors.js +0 -43
  326. package/dist/src/utils/errors.js.map +0 -1
  327. package/dist/src/utils/pythonRunner.d.ts +0 -27
  328. package/dist/src/utils/pythonRunner.d.ts.map +0 -1
  329. package/dist/src/utils/pythonRunner.js +0 -62
  330. package/dist/src/utils/pythonRunner.js.map +0 -1
  331. package/src/utils/errors.ts +0 -42
  332. package/src/utils/pythonRunner.ts +0 -81
@@ -0,0 +1,30 @@
1
+ import type { Message } from '../types.js';
2
+ import { type PrivacyMode } from './assistantPrivacy.js';
3
+ export interface EvidenceManifest {
4
+ schemaVersion: '1.0';
5
+ generatedAt: string;
6
+ source: 'local-wechat';
7
+ authorization: 'user-authorized-local-data';
8
+ talker: string;
9
+ caseNote: string;
10
+ messageCount: number;
11
+ firstMessageAt: string | null;
12
+ lastMessageAt: string | null;
13
+ messageIds: number[];
14
+ messagesSha256: string;
15
+ notice: string;
16
+ }
17
+ export interface EvidencePackageResult {
18
+ path: string;
19
+ manifest: EvidenceManifest;
20
+ }
21
+ export interface EvidenceReviewInput {
22
+ transcript: string;
23
+ redactions: number;
24
+ localInference: boolean;
25
+ }
26
+ export declare function buildEvidenceManifest(talker: string, messages: Message[], caseNote?: string, generatedAt?: string): EvidenceManifest;
27
+ export declare function writeEvidencePackage(outputRoot: string, talker: string, messages: Message[], caseNote?: string): EvidencePackageResult;
28
+ export declare const evidenceLegalNotice = "\u672C\u5305\u7528\u4E8E\u672C\u5730\u8BC1\u636E\u6574\u7406\uFF0C\u4E0D\u4EE3\u8868\u4EFB\u4F55\u6CD5\u9662\u6216\u673A\u6784\u5FC5\u7136\u91C7\u4FE1\uFF1B\u8BF7\u4FDD\u7559\u539F\u8BBE\u5907\u548C\u539F\u59CB\u6570\u636E\uFF0C\u5E76\u6839\u636E\u6848\u4EF6\u60C5\u51B5\u54A8\u8BE2\u4E13\u4E1A\u5F8B\u5E08\u3002";
29
+ export declare function buildEvidenceReviewInput(talker: string, messages: Message[], mode: PrivacyMode, localInference: boolean): EvidenceReviewInput;
30
+ //# sourceMappingURL=evidenceService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidenceService.d.ts","sourceRoot":"","sources":["../../../src/services/evidenceService.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,KAAK,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,cAAc,CAAA;IACtB,aAAa,EAAE,4BAA4B,CAAA;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,OAAO,CAAA;CACxB;AAkBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,SAAK,EAAE,WAAW,SAA2B,GAAG,gBAAgB,CAiBlJ;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,SAAK,GAAG,qBAAqB,CA6BlI;AAED,eAAO,MAAM,mBAAmB,6TAAe,CAAA;AAE/C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,GAAG,mBAAmB,CA4B7I"}
@@ -0,0 +1,98 @@
1
+ import { createHash } from 'crypto';
2
+ import { mkdirSync, writeFileSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { redactText } from './assistantPrivacy.js';
5
+ const LEGAL_NOTICE = '本包用于本地证据整理,不代表任何法院或机构必然采信;请保留原设备和原始数据,并根据案件情况咨询专业律师。';
6
+ function sha256(value) {
7
+ return createHash('sha256').update(value, 'utf8').digest('hex');
8
+ }
9
+ function isoTime(timestamp) {
10
+ if (!timestamp || !Number.isFinite(timestamp))
11
+ return null;
12
+ return new Date(timestamp * 1000).toISOString();
13
+ }
14
+ function safePackageName(talker) {
15
+ const name = talker.replace(/[^a-zA-Z0-9._-]+/g, '_').replace(/^\.+/, '');
16
+ return (name || 'conversation').slice(0, 80);
17
+ }
18
+ export function buildEvidenceManifest(talker, messages, caseNote = '', generatedAt = new Date().toISOString()) {
19
+ const serialized = JSON.stringify(messages, null, 2);
20
+ const timestamps = messages.map(message => message.createTime).filter(Number.isFinite);
21
+ return {
22
+ schemaVersion: '1.0',
23
+ generatedAt,
24
+ source: 'local-wechat',
25
+ authorization: 'user-authorized-local-data',
26
+ talker,
27
+ caseNote: caseNote.trim().slice(0, 500),
28
+ messageCount: messages.length,
29
+ firstMessageAt: timestamps.length ? isoTime(Math.min(...timestamps)) : null,
30
+ lastMessageAt: timestamps.length ? isoTime(Math.max(...timestamps)) : null,
31
+ messageIds: messages.map(message => message.localId).filter(Number.isFinite),
32
+ messagesSha256: sha256(serialized),
33
+ notice: LEGAL_NOTICE,
34
+ };
35
+ }
36
+ export function writeEvidencePackage(outputRoot, talker, messages, caseNote = '') {
37
+ const packagePath = join(outputRoot, `${safePackageName(talker)}-${Date.now()}`);
38
+ mkdirSync(packagePath, { recursive: true });
39
+ const messagesText = JSON.stringify(messages, null, 2);
40
+ const manifest = buildEvidenceManifest(talker, messages, caseNote);
41
+ writeFileSync(join(packagePath, 'messages.json'), messagesText, { encoding: 'utf8', flag: 'wx' });
42
+ writeFileSync(join(packagePath, 'manifest.json'), JSON.stringify(manifest, null, 2), { encoding: 'utf8', flag: 'wx' });
43
+ writeFileSync(join(packagePath, 'README.md'), [
44
+ '# 本地聊天证据整理包',
45
+ '',
46
+ `- 消息数量:${manifest.messageCount}`,
47
+ `- 生成时间:${manifest.generatedAt}`,
48
+ `- 原始消息 SHA-256:\`${manifest.messagesSha256}\``,
49
+ '',
50
+ '## 使用边界',
51
+ '',
52
+ LEGAL_NOTICE,
53
+ '',
54
+ '请勿修改 `messages.json`。如需脱敏、摘要或分析,请复制后处理,并保留处理前后的文件哈希和操作记录。',
55
+ '',
56
+ '## 建议补充',
57
+ '',
58
+ '- 保留原设备、原始数据库和官方导出记录。',
59
+ '- 记录导出人、导出时间、工具版本和数据范围。',
60
+ '- 保存完整上下文,不要只截取对自己有利的片段。',
61
+ '- 将本包交给律师或有权处理案件的机构复核。',
62
+ '',
63
+ ].join('\n'), { encoding: 'utf8', flag: 'wx' });
64
+ return { path: packagePath, manifest };
65
+ }
66
+ export const evidenceLegalNotice = LEGAL_NOTICE;
67
+ export function buildEvidenceReviewInput(talker, messages, mode, localInference) {
68
+ let redactions = 0;
69
+ const safeMetadata = (value, fallback) => {
70
+ if (localInference)
71
+ return value || fallback;
72
+ if (mode === 'strict')
73
+ return fallback;
74
+ const result = redactText(value || fallback, mode, false);
75
+ redactions += result.redactions;
76
+ return result.safe;
77
+ };
78
+ const safeTalker = safeMetadata(talker, '[会话已按严格隐私模式屏蔽]');
79
+ const lines = messages.map(message => {
80
+ const rawBody = message.content || message.parsedContent || message.rawContent || '';
81
+ const body = mode === 'strict' && !localInference
82
+ ? `[聊天正文已按严格隐私模式屏蔽,共${rawBody.length}字]`
83
+ : (() => {
84
+ const result = redactText(rawBody, mode, localInference);
85
+ redactions += result.redactions;
86
+ return result.safe;
87
+ })();
88
+ const time = isoTime(message.createTime) || '时间未知';
89
+ const sender = safeMetadata(message.senderUsername || '', '[发送方已按严格隐私模式屏蔽]');
90
+ return `[消息ID:${message.localId}] [${time}] [发送方:${sender}] ${body}`;
91
+ });
92
+ return {
93
+ transcript: `会话:${safeTalker}\n消息数:${messages.length}\n\n${lines.join('\n')}`,
94
+ redactions,
95
+ localInference,
96
+ };
97
+ }
98
+ //# sourceMappingURL=evidenceService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidenceService.js","sourceRoot":"","sources":["../../../src/services/evidenceService.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,18 @@
1
+ export type ExportContract = 'raw' | 'weflow-v1';
2
+ export interface ExportResult {
3
+ success: boolean;
4
+ path?: string;
5
+ count?: number;
6
+ error?: string;
7
+ }
1
8
  export declare class ExportService {
2
- exportJson(talker: string, outputDir: string, limit?: number): Promise<{
3
- success: boolean;
4
- path?: string;
5
- error?: string;
6
- }>;
7
- exportTxt(talker: string, outputDir: string, limit?: number): Promise<{
8
- success: boolean;
9
- path?: string;
10
- error?: string;
11
- }>;
12
- exportHtml(talker: string, outputDir: string, limit?: number): Promise<{
13
- success: boolean;
14
- path?: string;
15
- error?: string;
16
- }>;
9
+ exportJson(talker: string, outputDir: string, limit?: number, from?: number, to?: number, contract?: ExportContract): Promise<ExportResult>;
10
+ exportTxt(talker: string, outputDir: string, limit?: number, from?: number, to?: number): Promise<ExportResult>;
11
+ exportHtml(talker: string, outputDir: string, limit?: number, date?: string, from?: number, to?: number, quiet?: boolean, options?: {
12
+ fullImages?: boolean;
13
+ }): Promise<ExportResult>;
17
14
  private exportHtmlBasic;
18
- exportExcel(talker: string, outputDir: string, limit?: number): Promise<{
19
- success: boolean;
20
- path?: string;
21
- error?: string;
22
- }>;
15
+ exportExcel(talker: string, outputDir: string, limit?: number, from?: number, to?: number): Promise<ExportResult>;
23
16
  private buildHtml;
24
17
  private renderMessageContent;
25
18
  private escapeHtml;
@@ -1 +1 @@
1
- {"version":3,"file":"exportService.d.ts","sourceRoot":"","sources":["../../../src/services/exportService.ts"],"names":[],"mappings":"AAaA,qBAAa,aAAa;IAClB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBtH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAuBrH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;YA0E9G,eAAe;IAavB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsC7H,OAAO,CAAC,SAAS;IA8CjB,OAAO,CAAC,oBAAoB;IAsD5B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,eAAe;CAOxB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAA"}
1
+ {"version":3,"file":"exportService.d.ts","sourceRoot":"","sources":["../../../src/services/exportService.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,WAAW,CAAA;AAChD,MAAM,WAAW,YAAY;IAAG,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAOjG,qBAAa,aAAa;IAClB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAsB,GAAG,OAAO,CAAC,YAAY,CAAC;IAuB7I,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAuB1G,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,SAAK,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,UAAQ,EAAE,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,YAAY,CAAC;YA4HrK,eAAe;IAavB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAsClH,OAAO,CAAC,SAAS;IA8CjB,OAAO,CAAC,oBAAoB;IAsD5B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,eAAe;CAOxB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAA"}
@@ -2,31 +2,43 @@ import { join, dirname } from 'path';
2
2
  import { existsSync, mkdirSync, writeFileSync } from 'fs';
3
3
  import { execFile } from 'child_process';
4
4
  import { promisify } from 'util';
5
- import { fileURLToPath } from 'url';
6
5
  import { chatService } from './chatService.js';
7
6
  import { configService } from './configService.js';
7
+ import { getPythonCommand } from '../utils/python.js';
8
+ import { createPythonProcessEnv, safeSubprocessError } from '../utils/pythonProcessEnv.js';
9
+ import { createWeFlowEnvelope } from './messageContract.js';
10
+ import { parseLocalDateOrIso } from '../utils/dateRange.js';
11
+ import { resolvePackageRoot } from '../utils/packageRoot.js';
8
12
  const execFileAsync = promisify(execFile);
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = dirname(__filename);
13
+ function getPackageRoot() {
14
+ return resolvePackageRoot(import.meta.url);
15
+ }
11
16
  export class ExportService {
12
- async exportJson(talker, outputDir, limit = 0) {
17
+ async exportJson(talker, outputDir, limit = 0, from, to, contract = 'raw') {
13
18
  try {
14
- const messages = await chatService.getMessages(talker, limit);
19
+ const messages = await chatService.getMessagesInRange(talker, limit, from, to);
15
20
  if (messages.length === 0) {
16
21
  return { success: false, error: '未找到消息' };
17
22
  }
18
23
  const dir = this.ensureOutputDir(outputDir);
19
24
  const filePath = join(dir, `${talker}_messages.json`);
20
- writeFileSync(filePath, JSON.stringify(messages, null, 2), 'utf8');
21
- return { success: true, path: filePath };
25
+ const payload = contract === 'weflow-v1'
26
+ ? createWeFlowEnvelope(messages, new Date().toISOString(), {
27
+ requestedFrom: from,
28
+ requestedTo: to,
29
+ requestedLimit: limit,
30
+ })
31
+ : messages;
32
+ writeFileSync(filePath, JSON.stringify(payload, null, 2), 'utf8');
33
+ return { success: true, path: filePath, count: messages.length };
22
34
  }
23
- catch (e) {
24
- return { success: false, error: String(e) };
35
+ catch {
36
+ return { success: false, error: 'JSON 导出失败' };
25
37
  }
26
38
  }
27
- async exportTxt(talker, outputDir, limit = 0) {
39
+ async exportTxt(talker, outputDir, limit = 0, from, to) {
28
40
  try {
29
- const messages = await chatService.getMessages(talker, limit);
41
+ const messages = await chatService.getMessagesInRange(talker, limit, from, to);
30
42
  if (messages.length === 0) {
31
43
  return { success: false, error: '未找到消息' };
32
44
  }
@@ -39,29 +51,45 @@ export class ExportService {
39
51
  const dir = this.ensureOutputDir(outputDir);
40
52
  const filePath = join(dir, `${talker}_messages.txt`);
41
53
  writeFileSync(filePath, lines.join('\n'), 'utf8');
42
- return { success: true, path: filePath };
54
+ return { success: true, path: filePath, count: messages.length };
43
55
  }
44
- catch (e) {
45
- return { success: false, error: String(e) };
56
+ catch {
57
+ return { success: false, error: '文本导出失败' };
46
58
  }
47
59
  }
48
- async exportHtml(talker, outputDir, limit = 0) {
60
+ async exportHtml(talker, outputDir, limit = 0, date = '', from, to, quiet = false, options = {}) {
49
61
  try {
62
+ if (from !== undefined || to !== undefined) {
63
+ return this.exportHtmlBasic(talker, outputDir, limit, from, to);
64
+ }
50
65
  // Use Python export_chat_html.py for rich HTML with images
51
66
  const cfg = configService.getAll();
52
67
  const db = cfg.ntDbPath;
53
68
  const key = cfg.ntKey;
54
69
  const salt = cfg.ntSalt;
70
+ // Derives each message shard's key (WeChat 4.1.12.26+). favPassphrase is
71
+ // the dedicated field, but decryptKey holds the same value and is what
72
+ // `init` writes - without this fallback the shard merge silently stays
73
+ // dormant and exports stop at the first shard's last message.
74
+ const passphrase = configService.get('favPassphrase') || cfg.decryptKey || '';
55
75
  if (!db || !key || !salt) {
56
76
  // Fallback: basic HTML
57
- return this.exportHtmlBasic(talker, outputDir, limit);
77
+ let fallbackFrom = from;
78
+ let fallbackTo = to;
79
+ if (date && fallbackFrom === undefined && fallbackTo === undefined) {
80
+ fallbackFrom = parseLocalDateOrIso(date);
81
+ fallbackTo = parseLocalDateOrIso(date, true);
82
+ }
83
+ return this.exportHtmlBasic(talker, outputDir, limit, fallbackFrom, fallbackTo);
58
84
  }
59
85
  // Resolve Python script path (dist/src/services → package root)
60
- const pkgRoot = join(__dirname, '..', '..', '..');
61
- const script = join(pkgRoot, 'scripts', 'export_chat_html.py');
86
+ const script = join(getPackageRoot(), 'scripts', 'export_chat_html.py');
62
87
  // Cache dir for image thumbnails
63
- const cacheDir = cfg.contactDbPath
64
- ? join(dirname(dirname(cfg.contactDbPath)), 'cache')
88
+ const cacheDir = cfg.ntDbPath
89
+ ? join(dirname(dirname(dirname(cfg.ntDbPath))), 'cache')
90
+ : '';
91
+ const accountDir = cfg.ntDbPath
92
+ ? dirname(dirname(dirname(cfg.ntDbPath)))
65
93
  : '';
66
94
  // Resolve display name for filename (prefer remark/nickname over wxid)
67
95
  let displayName = '';
@@ -75,32 +103,65 @@ export class ExportService {
75
103
  catch { }
76
104
  const args = [
77
105
  script,
78
- '--db', db,
79
- '--key', key,
80
- '--salt', salt,
81
- '--talker', talker,
82
- '--out', outputDir || `./output`,
83
- '--single',
84
- '--parts', '1',
106
+ // Paginate: a whole year of chat in one file makes the browser crawl.
107
+ '--per-page', '100',
85
108
  ];
86
- if (displayName) {
87
- args.push('--name', displayName);
88
- }
89
- if (cacheDir && existsSync(cacheDir)) {
90
- args.push('--cache-dir', cacheDir);
91
- }
92
- console.log(` Exporting HTML via Python...`);
93
- const { stdout } = await execFileAsync('python', args, {
94
- timeout: 300_000,
109
+ const ownWxid = String(cfg.wxid || '').trim();
110
+ const exportCacheDir = cacheDir && existsSync(cacheDir) ? cacheDir : undefined;
111
+ const exportAccountDir = accountDir && existsSync(accountDir) ? accountDir : undefined;
112
+ if (!quiet)
113
+ console.log(` Exporting HTML via Python...`);
114
+ const { stdout } = await execFileAsync(getPythonCommand(), args, {
115
+ // Headroom for the opt-in --full-images path, which resizes hundreds
116
+ // of multi-MB originals and can take several minutes.
117
+ timeout: 900_000,
95
118
  maxBuffer: 50 * 1024 * 1024,
119
+ env: createPythonProcessEnv({
120
+ WEFLOW_DB_PATH: db,
121
+ WEFLOW_NT_KEY: key,
122
+ WEFLOW_NT_SALT: salt,
123
+ WEFLOW_TALKER: talker,
124
+ WEFLOW_OWN_WXID: ownWxid || undefined,
125
+ WEFLOW_NT_PASSPHRASE: passphrase || undefined,
126
+ WEFLOW_EXPORT_NAME: displayName || undefined,
127
+ WEFLOW_EXPORT_OUTPUT: outputDir || './output',
128
+ WEFLOW_EXPORT_CACHE_DIR: exportCacheDir,
129
+ WEFLOW_EXPORT_ACCOUNT_DIR: exportAccountDir,
130
+ // Lets custom stickers be decrypted from WeChat's local cache.
131
+ WEFLOW_EMOTICON_SEED: String(cfg.emoticonSeed || '') || undefined,
132
+ // Group rows identify their sender only by wxid; the contact
133
+ // database is what turns that into a name.
134
+ WEFLOW_CONTACT_DB_PATH: cfg.contactDbPath || undefined,
135
+ WEFLOW_CONTACT_KEY: cfg.contactKey || undefined,
136
+ WEFLOW_CONTACT_SALT: cfg.contactSalt || undefined,
137
+ // Off by default: originals are 5-24MB each and downscaling a few
138
+ // hundred of them costs minutes in PIL.
139
+ WEFLOW_FULL_IMAGES: options.fullImages ? '1' : undefined,
140
+ WEFLOW_EXPORT_DATE: date || undefined,
141
+ }),
96
142
  });
143
+ // Surface Python's progress and diagnostics. Only the trailing JSON
144
+ // summary is machine-read; everything else used to be discarded, so a
145
+ // multi-minute export showed nothing between "Exporting..." and the
146
+ // result - and the sticker seed hint never reached the user at all.
147
+ if (!quiet) {
148
+ for (const raw of stdout.split('\n')) {
149
+ const line = raw.trim();
150
+ if (!line || line.startsWith('{') || line.startsWith('Total messages:'))
151
+ continue;
152
+ if (/^Fetched \d+\/\d+/.test(line))
153
+ continue;
154
+ console.log(` ${line}`);
155
+ }
156
+ }
97
157
  // Parse JSON result from Python output
98
158
  const lines = stdout.split('\n').filter((l) => l.trim());
99
159
  for (let i = lines.length - 1; i >= 0; i--) {
100
160
  try {
101
161
  const result = JSON.parse(lines[i]);
102
162
  if (result.success && result.files?.length > 0) {
103
- return { success: true, path: result.files[0] };
163
+ const total = Number(result.total);
164
+ return { success: true, path: result.files[0], count: Number.isFinite(total) ? total : undefined };
104
165
  }
105
166
  }
106
167
  catch { }
@@ -108,13 +169,18 @@ export class ExportService {
108
169
  return { success: false, error: 'Python export succeeded but no output found' };
109
170
  }
110
171
  catch (e) {
111
- console.error(` Python export failed: ${e.message}`);
172
+ const failure = safeSubprocessError(e, 'Python export failed');
173
+ if (!quiet)
174
+ console.error(` ${failure}`);
175
+ if (date) {
176
+ return { success: false, error: `指定日期导出失败: ${failure}` };
177
+ }
112
178
  // Fallback to basic HTML
113
- return this.exportHtmlBasic(talker, outputDir, limit);
179
+ return this.exportHtmlBasic(talker, outputDir, limit, from, to);
114
180
  }
115
181
  }
116
- async exportHtmlBasic(talker, outputDir, limit = 0) {
117
- const messages = await chatService.getMessages(talker, limit);
182
+ async exportHtmlBasic(talker, outputDir, limit = 0, from, to) {
183
+ const messages = await chatService.getMessagesInRange(talker, limit, from, to);
118
184
  if (messages.length === 0) {
119
185
  return { success: false, error: '未找到消息' };
120
186
  }
@@ -122,12 +188,12 @@ export class ExportService {
122
188
  const dir = this.ensureOutputDir(outputDir);
123
189
  const filePath = join(dir, `${talker}_messages.html`);
124
190
  writeFileSync(filePath, html, 'utf8');
125
- return { success: true, path: filePath };
191
+ return { success: true, path: filePath, count: messages.length };
126
192
  }
127
- async exportExcel(talker, outputDir, limit = 0) {
193
+ async exportExcel(talker, outputDir, limit = 0, from, to) {
128
194
  try {
129
195
  const ExcelJS = await import('exceljs');
130
- const messages = await chatService.getMessages(talker, limit);
196
+ const messages = await chatService.getMessagesInRange(talker, limit, from, to);
131
197
  if (messages.length === 0) {
132
198
  return { success: false, error: '未找到消息' };
133
199
  }
@@ -152,10 +218,10 @@ export class ExportService {
152
218
  const dir = this.ensureOutputDir(outputDir);
153
219
  const filePath = join(dir, `${talker}_messages.xlsx`);
154
220
  await workbook.xlsx.writeFile(filePath);
155
- return { success: true, path: filePath };
221
+ return { success: true, path: filePath, count: messages.length };
156
222
  }
157
- catch (e) {
158
- return { success: false, error: String(e) };
223
+ catch {
224
+ return { success: false, error: 'Excel 导出失败' };
159
225
  }
160
226
  }
161
227
  buildHtml(talker, messages) {
@@ -1 +1 @@
1
- {"version":3,"file":"exportService.js","sourceRoot":"","sources":["../../../src/services/exportService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exportService.js","sourceRoot":"","sources":["../../../src/services/exportService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface NtDbEntry {
2
+ path: string;
3
+ name: string;
4
+ salt: string;
5
+ size: number;
6
+ wxid: string;
7
+ }
8
+ type Log = (line: string) => void;
9
+ /** 从已配置的 NT 主库路径推导 favorite.db 路径 */
10
+ export declare function detectFavDbPath(): string | null;
11
+ /**
12
+ * 派生各 NT 库密钥并验证写入配置 (4.1.12+ 派生模式)。
13
+ * @returns message_0.db 是否成功配置 (聊天主路径可用)
14
+ */
15
+ export declare function applyDerivedNtKeys(passphrase: string, databases: NtDbEntry[], log?: Log): Promise<boolean>;
16
+ /** 启用收藏功能: 验证 passphrase 能派生打开 favorite.db 后写入配置 */
17
+ export declare function enableFavorites(passphrase: string, databases: NtDbEntry[], log?: Log): Promise<void>;
18
+ export {};
19
+ //# sourceMappingURL=initKeyService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initKeyService.d.ts","sourceRoot":"","sources":["../../../src/services/initKeyService.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;AAEjC,qCAAqC;AACrC,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAQ/C;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,GAAE,GAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA4B1H;AAED,oDAAoD;AACpD,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,GAAE,GAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAapH"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * init 密钥派生服务 — 较新微信版本(实测 4.1.12.55)密钥体系适配。
3
+ *
4
+ * 新版微信进程内存中不再出现 x'<key><salt>' 文本, 内存扫描匹配不到任何密钥;
5
+ * 但 DLL hook 仍能拿到全库 passphrase, 各库密钥改为本地派生:
6
+ * raw_key = PBKDF2-HMAC-SHA512(passphrase, 库文件前16字节盐, 256000轮, 32字节)
7
+ * 派生后逐库用 sqlcipher 真实打开验证, 通过才写入配置。
8
+ */
9
+ import chalk from 'chalk';
10
+ import { existsSync } from 'fs';
11
+ import { NtCore } from '../core/ntCore.js';
12
+ import { configService } from './configService.js';
13
+ /** 从已配置的 NT 主库路径推导 favorite.db 路径 */
14
+ export function detectFavDbPath() {
15
+ const ntDbPath = configService.get('ntDbPath');
16
+ if (!ntDbPath)
17
+ return null;
18
+ const parts = ntDbPath.replace(/\\/g, '/').split('/');
19
+ const idx = parts.lastIndexOf('db_storage');
20
+ if (idx < 0)
21
+ return null;
22
+ const favPath = [...parts.slice(0, idx), 'db_storage', 'favorite', 'favorite.db'].join('/');
23
+ return existsSync(favPath) ? favPath : null;
24
+ }
25
+ /**
26
+ * 派生各 NT 库密钥并验证写入配置 (4.1.12+ 派生模式)。
27
+ * @returns message_0.db 是否成功配置 (聊天主路径可用)
28
+ */
29
+ export async function applyDerivedNtKeys(passphrase, databases, log = () => { }) {
30
+ const targets = [
31
+ { name: 'message/message_0.db', pathKey: 'ntDbPath', keyKey: 'ntKey', saltKey: 'ntSalt', label: '聊天主库' },
32
+ { name: 'contact/contact.db', pathKey: 'contactDbPath', keyKey: 'contactKey', saltKey: 'contactSalt', label: '联系人库' },
33
+ { name: 'sns/sns.db', pathKey: 'snsDbPath', keyKey: 'snsKey', saltKey: 'snsSalt', label: '朋友圈库' },
34
+ ];
35
+ let messageSaved = false;
36
+ let anySaved = false;
37
+ for (const t of targets) {
38
+ const db = databases.find((d) => d.name === t.name);
39
+ if (!db)
40
+ continue;
41
+ const derivedKey = NtCore.deriveRawKey(passphrase, db.salt);
42
+ const verify = await NtCore.verifyDbKey(db.path, derivedKey, db.salt);
43
+ if (verify.success || verify.cannotVerify) {
44
+ // cannotVerify = Python/sqlcipher3 环境问题而非密钥错误: 公式确定性派生, 值仍写入
45
+ configService.set(t.pathKey, db.path);
46
+ configService.set(t.keyKey, derivedKey);
47
+ configService.set(t.saltKey, db.salt);
48
+ const note = verify.success ? '派生密钥已验证' : `已写入但未能验证 (${verify.error})`;
49
+ log(chalk.green(` ✓ ${t.label}: ${db.name} (${(db.size / 1024 / 1024).toFixed(1)}MB, ${note})`));
50
+ if (t.name === 'message/message_0.db')
51
+ messageSaved = true;
52
+ anySaved = true;
53
+ }
54
+ else {
55
+ log(chalk.red(` ✗ ${t.label}: 派生密钥验证失败 (${verify.error || '密钥不匹配'})`));
56
+ }
57
+ }
58
+ if (anySaved)
59
+ await enableFavorites(passphrase, databases, log);
60
+ return messageSaved;
61
+ }
62
+ /** 启用收藏功能: 验证 passphrase 能派生打开 favorite.db 后写入配置 */
63
+ export async function enableFavorites(passphrase, databases, log = () => { }) {
64
+ if (configService.get('favPassphrase'))
65
+ return;
66
+ const favDb = databases.find((d) => d.name === 'favorite/favorite.db');
67
+ const favPath = favDb?.path || detectFavDbPath();
68
+ if (!favPath)
69
+ return;
70
+ if (favDb) {
71
+ const derived = NtCore.deriveRawKey(passphrase, favDb.salt);
72
+ const v = await NtCore.verifyDbKey(favPath, derived, favDb.salt);
73
+ if (!v.success && !v.cannotVerify)
74
+ return;
75
+ }
76
+ configService.set('favDbPath', favPath);
77
+ configService.set('favPassphrase', passphrase);
78
+ log(chalk.green(' ✓ 收藏功能已启用 (favorite.db passphrase 已配置)'));
79
+ }
80
+ //# sourceMappingURL=initKeyService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initKeyService.js","sourceRoot":"","sources":["../../../src/services/initKeyService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Message } from '../types.js';
2
+ export type WeFlowMessageType = 'text' | 'image' | 'voice' | 'card' | 'video' | 'emoji' | 'location' | 'link' | 'call' | 'system' | 'quote' | 'other';
3
+ export interface WeFlowMessageEnvelope {
4
+ schema: 'weflow-message/v1';
5
+ source: 'weflow-cli';
6
+ generatedAt: string;
7
+ coverage?: WeFlowMessageCoverage;
8
+ messages: Array<Message & {
9
+ messageType: WeFlowMessageType;
10
+ }>;
11
+ }
12
+ export interface WeFlowMessageCoverage {
13
+ requestedFrom?: number;
14
+ requestedTo?: number;
15
+ requestedLimit: number;
16
+ returned: number;
17
+ mayHaveMore: boolean;
18
+ oldestCreateTime?: number;
19
+ newestCreateTime?: number;
20
+ }
21
+ export declare function toWeFlowMessages(messages: Message[]): WeFlowMessageEnvelope['messages'];
22
+ export declare function createWeFlowEnvelope(messages: Message[], generatedAt?: string, coverage?: Omit<WeFlowMessageCoverage, 'returned' | 'oldestCreateTime' | 'newestCreateTime' | 'mayHaveMore'>): WeFlowMessageEnvelope;
23
+ //# sourceMappingURL=messageContract.d.ts.map