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
@@ -3,6 +3,24 @@ export interface MessageTimeRange {
3
3
  from?: number;
4
4
  to?: number;
5
5
  }
6
+ /**
7
+ * 这三种形状的输入会被 `resolveTalker` **原样返回**(见 `src/utils/talkerUtils.ts`),
8
+ * 于是拼错的 ID 会一路走到「取不到消息」,和「这条会话在窗口内确实没有消息」长得一模一样。
9
+ * 只看形状,不碰 IO —— 判定所需的名单由调用方传进来。
10
+ */
11
+ export declare function looksLikeTalkerId(input: string): boolean;
12
+ /**
13
+ * 空结果时补的一句话:**只在"看起来是 ID、但会话与联系人都没有它"时**才给。
14
+ * 返回空串表示没什么可补的 —— 名字形状的输入本来就由 `resolveTalker` 报错,认识的 ID
15
+ * 取不到消息是正常结果。
16
+ *
17
+ * 这里**不改退出码、也不改 `success`**:既有契约里「没有消息」不是错误(脚本与 MCP 依赖它,
18
+ * 见 `docs/HEALTH-CHECK.md` 的那一行),所以只把歧义说出来,不动语义。
19
+ */
20
+ export declare function emptyMessagesNote(input: string, known: {
21
+ sessionUsernames: Iterable<string>;
22
+ contactUsernames: Iterable<string>;
23
+ }): string;
6
24
  export declare function collectMessagesInRange(fetchPage: (limit: number, offset: number) => Promise<Message[]>, limit: number, range: MessageTimeRange, pageSize?: number): Promise<Message[]>;
7
25
  /** Why the paging loop stopped. The first two are expected; the last two are not. */
8
26
  export type StopReason =
@@ -1 +1 @@
1
- {"version":3,"file":"messageQuery.d.ts","sourceRoot":"","sources":["../../../src/services/messageQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,EAChE,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,EACvB,QAAQ,SAAM,GACb,OAAO,CAAC,OAAO,EAAE,CAAC,CAyBpB;AAED,qFAAqF;AACrF,MAAM,MAAM,UAAU;AACpB,0CAA0C;AACxC,OAAO;AACT,uDAAuD;GACrD,WAAW;AACb,oCAAoC;GAClC,OAAO;AACT,6EAA6E;GAC3E,YAAY,CAAA;AAEhB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,UAAU,CAAA;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB;;;;;;;;;OASG;IACH,cAAc,EAAE,OAAO,CAAA;CACxB;AAED;;;;;;GAMG;AACH,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,EAChE,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,EACvB,QAAQ,SAAM,GACb,OAAO,CAAC,yBAAyB,CAAC,CAsDpC"}
1
+ {"version":3,"file":"messageQuery.d.ts","sourceRoot":"","sources":["../../../src/services/messageQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;IAAE,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;CAAE,GAChF,MAAM,CAMR;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,EAChE,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,EACvB,QAAQ,SAAM,GACb,OAAO,CAAC,OAAO,EAAE,CAAC,CAyBpB;AAED,qFAAqF;AACrF,MAAM,MAAM,UAAU;AACpB,0CAA0C;AACxC,OAAO;AACT,uDAAuD;GACrD,WAAW;AACb,oCAAoC;GAClC,OAAO;AACT,6EAA6E;GAC3E,YAAY,CAAA;AAEhB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,UAAU,CAAA;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB;;;;;;;;;OASG;IACH,cAAc,EAAE,OAAO,CAAA;CACxB;AAED;;;;;;GAMG;AACH,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,EAChE,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,EACvB,QAAQ,SAAM,GACb,OAAO,CAAC,yBAAyB,CAAC,CAsDpC"}
@@ -1,3 +1,32 @@
1
+ /**
2
+ * 这三种形状的输入会被 `resolveTalker` **原样返回**(见 `src/utils/talkerUtils.ts`),
3
+ * 于是拼错的 ID 会一路走到「取不到消息」,和「这条会话在窗口内确实没有消息」长得一模一样。
4
+ * 只看形状,不碰 IO —— 判定所需的名单由调用方传进来。
5
+ */
6
+ export function looksLikeTalkerId(input) {
7
+ const value = String(input || '');
8
+ return value.startsWith('wxid_') || value.includes('@chatroom') || value.includes('@openim');
9
+ }
10
+ /**
11
+ * 空结果时补的一句话:**只在"看起来是 ID、但会话与联系人都没有它"时**才给。
12
+ * 返回空串表示没什么可补的 —— 名字形状的输入本来就由 `resolveTalker` 报错,认识的 ID
13
+ * 取不到消息是正常结果。
14
+ *
15
+ * 这里**不改退出码、也不改 `success`**:既有契约里「没有消息」不是错误(脚本与 MCP 依赖它,
16
+ * 见 `docs/HEALTH-CHECK.md` 的那一行),所以只把歧义说出来,不动语义。
17
+ */
18
+ export function emptyMessagesNote(input, known) {
19
+ if (!looksLikeTalkerId(input))
20
+ return '';
21
+ for (const id of known.sessionUsernames)
22
+ if (id === input)
23
+ return '';
24
+ for (const id of known.contactUsernames)
25
+ if (id === input)
26
+ return '';
27
+ return `这个 ID 既不在会话里、也不在联系人里:${input}` +
28
+ ' —— 先确认有没有拼错(weflow-cli sessions / weflow-cli contacts)';
29
+ }
1
30
  export async function collectMessagesInRange(fetchPage, limit, range, pageSize = 500) {
2
31
  const result = [];
3
32
  let offset = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"messageQuery.js","sourceRoot":"","sources":["../../../src/services/messageQuery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messageQuery.js","sourceRoot":"","sources":["../../../src/services/messageQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export type OutboundKind = 'text' | 'image' | 'file';
2
+ export interface OutboundAttempt {
3
+ wxid: string;
4
+ displayName: string;
5
+ kind: OutboundKind;
6
+ /** 审计与预览里那一行(文本截断后的样子,或 `[image] 文件名 (字节)`) */
7
+ preview: string;
8
+ /** 纯文本内容(kind 为 text 时用;媒体走 mediaPath) */
9
+ text?: string;
10
+ mediaPath?: string;
11
+ }
12
+ export interface OutboundPolicy {
13
+ windowMs: number;
14
+ max: number;
15
+ }
16
+ export type OutboundRefusalCode = 'INVALID_RATE_LIMIT' | 'TARGET_BLOCKED' | 'TARGET_NOT_ALLOWED' | 'RATE_LIMITED';
17
+ export interface OutboundRefusal {
18
+ code: OutboundRefusalCode;
19
+ error: string;
20
+ /** 限速时带上窗口与计数,好让调用方原样报出来 */
21
+ rateLimit?: {
22
+ count: number;
23
+ max: number;
24
+ windowMs: number;
25
+ };
26
+ }
27
+ /** 速率参数合法性。`send` 与 `draft --send` 用的是同一条规则。 */
28
+ export declare function parseOutboundPolicy(windowMs: number, max: number): OutboundPolicy | OutboundRefusal;
29
+ export interface OutboundRate {
30
+ count: number;
31
+ max: number;
32
+ windowMs: number;
33
+ }
34
+ export type OutboundDecision = {
35
+ ok: true;
36
+ rate: OutboundRate;
37
+ } | {
38
+ ok: false;
39
+ refusal: OutboundRefusal;
40
+ };
41
+ /**
42
+ * 发送前的三道闸。拒绝时**先写审计**再返回原因("每次尝试都留痕"是策略的一部分,不只是成功的那些)。
43
+ *
44
+ * 放行时把**当时的速率计数**一起带回去 —— 调用方要拿它写进预览(原来那一条命令里
45
+ * 是先 `checkRateLimit` 再复用同一个对象)。少一次重复查询,也免得两处看到的数不一样。
46
+ */
47
+ export declare function authorizeOutbound(attempt: OutboundAttempt, policy: OutboundPolicy): OutboundDecision;
48
+ /** 真的发出去,并按结果写审计。返回 `{success, error}`(不抛)。 */
49
+ export declare function performOutbound(attempt: OutboundAttempt): Promise<{
50
+ success: boolean;
51
+ error?: string;
52
+ }>;
53
+ //# sourceMappingURL=outboundSend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outboundSend.d.ts","sourceRoot":"","sources":["../../../src/services/outboundSend.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAEpD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,YAAY,CAAA;IAClB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,mBAAmB,GAC3B,oBAAoB,GACpB,gBAAgB,GAChB,oBAAoB,GACpB,cAAc,CAAA;AAElB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,4BAA4B;IAC5B,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAC7D;AAUD,gDAAgD;AAChD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,CAMnG;AAED,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC9E,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAChC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAA;AAE3C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,GAAG,gBAAgB,CAgBpG;AAED,+CAA+C;AAC/C,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6B7G"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * 出站发送的**那一份策略**:黑名单 → 白名单 → 限速,以及"每次尝试都写审计"。
3
+ *
4
+ * 为什么抽成一份:这条链是一条**安全策略**,而 2026-10-01 起有了第二条发送路
5
+ * (`draft --pick N --send`,见 D-063)。两份写同一件事迟早分叉,而这里分叉的后果具体是
6
+ * "有一条路绕过了白名单" —— 悄悄多出一个能发给任何人的入口。
7
+ *
8
+ * **它不面向模型。** 助手与 MCP 的工具表里没有任何发送工具(`docs/EXTENDING.md`:
9
+ * *sending is structurally unreachable from a model-driven path*)。这个模块只被**人在命令行上
10
+ * 显式驱动**的命令调用,而且第二条路还要求先点名"发第几条"。
11
+ *
12
+ * 一条实测出来的硬约束写在错误信息里:发送需要**对方的 context_token**,也就是对方得先给你
13
+ * 发过消息。没有它,"主动发给任何人"这条路本来就不通。
14
+ */
15
+ import { configService } from './configService.js';
16
+ import { whitelistService } from './whitelistService.js';
17
+ import { WechatMessageService } from './wechatMessageService.js';
18
+ function auditRefusal(attempt, error) {
19
+ whitelistService.auditSend({
20
+ timestamp: Date.now(), action: 'send', targetWxid: attempt.wxid,
21
+ targetName: attempt.displayName, kind: attempt.kind, success: false,
22
+ preview: attempt.preview, error,
23
+ });
24
+ }
25
+ /** 速率参数合法性。`send` 与 `draft --send` 用的是同一条规则。 */
26
+ export function parseOutboundPolicy(windowMs, max) {
27
+ if (!Number.isInteger(windowMs) || windowMs < 1000 || windowMs > 3_600_000
28
+ || !Number.isInteger(max) || max < 1 || max > 100) {
29
+ return { code: 'INVALID_RATE_LIMIT', error: 'rate-window 必须为 1000-3600000,rate-max 必须为 1-100' };
30
+ }
31
+ return { windowMs, max };
32
+ }
33
+ /**
34
+ * 发送前的三道闸。拒绝时**先写审计**再返回原因("每次尝试都留痕"是策略的一部分,不只是成功的那些)。
35
+ *
36
+ * 放行时把**当时的速率计数**一起带回去 —— 调用方要拿它写进预览(原来那一条命令里
37
+ * 是先 `checkRateLimit` 再复用同一个对象)。少一次重复查询,也免得两处看到的数不一样。
38
+ */
39
+ export function authorizeOutbound(attempt, policy) {
40
+ if (whitelistService.isBlocked(attempt.wxid)) {
41
+ auditRefusal(attempt, 'blocked by blacklist');
42
+ return { ok: false, refusal: { code: 'TARGET_BLOCKED', error: '目标在黑名单中' } };
43
+ }
44
+ if (!whitelistService.isAllowed(attempt.wxid)) {
45
+ // **白名单是这一层真正的边界**:不在名单上的人,任何一条命令行都发不出去。
46
+ // 这一条**不写审计** —— 与黑名单那条不一样,原实现就是如此,保持一致。
47
+ return { ok: false, refusal: { code: 'TARGET_NOT_ALLOWED', error: '目标不在白名单中' } };
48
+ }
49
+ const rate = whitelistService.checkRateLimit(policy.windowMs, policy.max);
50
+ if (!rate.allowed) {
51
+ auditRefusal(attempt, `rate limited (${rate.count}/${rate.max})`);
52
+ return { ok: false, refusal: { code: 'RATE_LIMITED', error: '触发发送速率限制', rateLimit: rate } };
53
+ }
54
+ return { ok: true, rate };
55
+ }
56
+ /** 真的发出去,并按结果写审计。返回 `{success, error}`(不抛)。 */
57
+ export async function performOutbound(attempt) {
58
+ const token = configService.get('wechatOcToken');
59
+ const service = new WechatMessageService({ token });
60
+ let success = false;
61
+ let error;
62
+ try {
63
+ if (attempt.kind === 'image' && attempt.mediaPath) {
64
+ success = await service.sendImage(attempt.wxid, attempt.mediaPath);
65
+ }
66
+ else if (attempt.kind === 'file' && attempt.mediaPath) {
67
+ success = await service.sendFile(attempt.wxid, attempt.mediaPath);
68
+ }
69
+ else {
70
+ success = await service.sendText(attempt.wxid, attempt.text ?? '');
71
+ }
72
+ }
73
+ catch {
74
+ error = '消息通道调用失败';
75
+ }
76
+ if (!success && !error) {
77
+ // 最像的原因就是缺 context_token —— 说清楚,别让人以为是"发失败"这种含糊的锅
78
+ const hasToken = !!(configService.getContextTokens()[attempt.wxid]);
79
+ error = hasToken
80
+ ? '发送失败 (接口返回错误, 可能 token 过期)'
81
+ : '缺少 context_token — 需先收到对方一条消息 (或运行 weflow-cli listen 等待对方消息)';
82
+ }
83
+ whitelistService.auditSend({
84
+ timestamp: Date.now(), action: 'send', targetWxid: attempt.wxid,
85
+ targetName: attempt.displayName, kind: attempt.kind, success,
86
+ preview: attempt.preview, error: success ? undefined : error,
87
+ });
88
+ return { success, error };
89
+ }
90
+ //# sourceMappingURL=outboundSend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outboundSend.js","sourceRoot":"","sources":["../../../src/services/outboundSend.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pythonBridge.d.ts","sourceRoot":"","sources":["../../../src/services/pythonBridge.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,yBAAyB;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,qCAAqC;AACrC,MAAM,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAClC,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;AAE/H,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AA2CD,oCAAoC;AACpC,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAE/D;AAED,6CAA6C;AAC7C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAA;CAAE,CAWzE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,GAAG,EACzC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAC9B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GACjF,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAuBxB"}
1
+ {"version":3,"file":"pythonBridge.d.ts","sourceRoot":"","sources":["../../../src/services/pythonBridge.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,yBAAyB;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,qCAAqC;AACrC,MAAM,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAClC,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;AAE/H,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AA4CD,oCAAoC;AACpC,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAE/D;AAED,6CAA6C;AAC7C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAA;CAAE,CAWzE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,GAAG,EACzC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAC9B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GACjF,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAuBxB"}
@@ -22,6 +22,7 @@ const DEFAULT_TIMEOUT_MS = 30_000;
22
22
  function realRunner(scriptPath, args, options) {
23
23
  return new Promise((resolve, reject) => {
24
24
  const child = spawn(getPythonCommand(), [scriptPath, ...args], {
25
+ windowsHide: true,
25
26
  // 用户输入走**环境变量**而不是 argv:这是仓库写进测试的隐私纪律(进程列表里看不到正文)
26
27
  env: createPythonProcessEnv(options.env ?? {}),
27
28
  stdio: ['pipe', 'pipe', 'pipe'],
@@ -1 +1 @@
1
- {"version":3,"file":"pythonBridge.js","sourceRoot":"","sources":["../../../src/services/pythonBridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pythonBridge.js","sourceRoot":"","sources":["../../../src/services/pythonBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ /** 一个 `Weixin.exe` 进程的画像(只留判版本要用的两个字段)。 */
2
+ export interface WechatClientProcess {
3
+ pid: number;
4
+ exe: string;
5
+ /** 命令行里的 `--user-lib-dir`;进程没带就是 null(**逆向报告实测**:`--type=xplayer` 那个不带)。 */
6
+ loadedDir: string | null;
7
+ /** 命令行里的 `--wechat-files-path`:客户端自己说数据目录在哪(小程序那组进程会带)。 */
8
+ dataDir: string | null;
9
+ /** 命令行里的 `--client_version`:客户端自己的版本 token(十进制,如 `0xF2541F0D`)。 */
10
+ versionToken: string | null;
11
+ }
12
+ /** 版本的判据与结论 —— 只跟"哪个进程加载了哪个目录"有关,读不到**别的来源**。 */
13
+ export interface WechatVersionFacts {
14
+ /** 本机有没有在跑的 `Weixin.exe`(没跑 ⇒ 版本未知,不是"没问题")。 */
15
+ running: boolean;
16
+ /** 去重后的实际加载目录,按出现顺序。 */
17
+ loadedDirs: string[];
18
+ /** 版本号 = 加载目录的名字;**恰好一个**目录时才给,否则 null。 */
19
+ version: string | null;
20
+ /** `version` 为 null 时说清为什么。 */
21
+ note: string;
22
+ /** 安装根下**不能用的**版本目录(没有 `Weixin.dll`)。 */
23
+ unusableVersionDirs: Array<{
24
+ dir: string;
25
+ files: number;
26
+ }>;
27
+ }
28
+ export interface WechatClientFacts extends WechatVersionFacts {
29
+ /** 客户端自报的构建 token(`--client_version`,如 `0xF2541F0D`)—— 与目录名并列的**第二个来源**。 */
30
+ versionTokens: string[];
31
+ /** 进程命令行里的 `--wechat-files-path`:**客户端自己说**数据目录在哪。 */
32
+ dataDirs: string[];
33
+ /** `update\update.data` 在不在(在 ⇒ 加载路径可能不由命令行决定;见 `caveats`)。 */
34
+ updateData: {
35
+ path: string;
36
+ present: boolean;
37
+ };
38
+ /** 客户端崩溃记录:只报条数与最近时间,**不读内容**。 */
39
+ crashRecords: {
40
+ dir: string;
41
+ reports: number;
42
+ records: number;
43
+ newest: string | null;
44
+ };
45
+ /** 读这个版本时**必须一起说出去**的不确定(目前只有一条:`update.data` 在场)。 */
46
+ caveats: string[];
47
+ }
48
+ export declare function parseProcessRows(raw: string): WechatClientProcess[];
49
+ /**
50
+ * 从一条命令行里取 `--user-lib-dir` 的值。**两种写法都认**(`=` 与空格、带引号与不带),
51
+ * 取不到返回 null。
52
+ *
53
+ * 注意这个参数**不在 `Weixin.exe` 的字符串表里**(**逆向报告实测**:0 命中)—— 它是被加载的 DLL
54
+ * 自己解析的。也就是说:只有**进程**能告诉我们它,二进制里搜不到。
55
+ */
56
+ export declare function userLibDir(commandLine: string): string | null;
57
+ /**
58
+ * 从命令行里取 `--wechat-files-path`:**客户端自己说数据目录在哪**。
59
+ *
60
+ * 用处在排查:它和配置里的数据目录不一致时,说明两边指向的不是同一份库(本机数据目录
61
+ * 还有 D 盘软链,同一份库两条路径)。只报出来,**不拿它去改配置**。
62
+ */
63
+ export declare function wechatFilesPath(commandLine: string): string | null;
64
+ /**
65
+ * 命令行里的 `--client_version`:客户端**自己的版本 token**(十进制)。
66
+ *
67
+ * 为什么要报它:它是"哪个构建"的**另一个独立来源** —— 版本目录名(`4.1.15.13`)是装载位置,
68
+ * 而这个是客户端自报的构建标识,两者来自不同的地方。顺带:实测本机这个值 `4065599245`
69
+ * 正是 `0xF2541F0D`,也就是那份逆向报告从三处(反编译 / 插件 manifest / UA)定下来的版本号。
70
+ *
71
+ * ⚠️ **不给"版本号"**:token 与三段式版本号之间的编码规则**没人解出来**(报告只确认"旧版
72
+ * `0xF2541D0C` → 新版 `0xF2541F0D`,高 16 位两版都是 `F254`")。所以它只作为**并列的第二来源**
73
+ * 报出去,不拿它去推版本号。
74
+ */
75
+ export declare function clientVersionToken(commandLine: string): string | null;
76
+ /** 客户端崩溃记录:只数文件、只取最近时间,**不读任何内容**。 */
77
+ export declare function crashSummary(root: string): WechatClientFacts['crashRecords'];
78
+ /** 两条路径是不是同一个位置。**按真身比**:本机数据目录有 D 盘软链,同一份库有两条路径。 */
79
+ export declare function samePath(a: string, b: string): boolean;
80
+ /** `%APPDATA%\Tencent\xwechat` —— 崩溃记录与 `update.data` 都在这棵树下。 */
81
+ export declare function xwechatRoot(appData?: string | undefined): string | null;
82
+ /**
83
+ * `update.data` 在场时**必须一起说出去**的那句话。
84
+ *
85
+ * 报告把这条明确留成未解:"若该文件存在,exe 侧第一次 `LoadLibraryExW` 就会用它,
86
+ * 根本不会看命令行 —— 两条路谁优先【未知】"。所以这个函数的存在意义是:
87
+ * 别让新报出去的那个版本在那种机器上**悄悄变成错的**。
88
+ */
89
+ export declare function updateDataCaveats(present: boolean): string[];
90
+ /** 一个版本目录能不能用:**有没有 `Weixin.dll`**(启动器加载的就是它)。 */
91
+ export declare function versionDirFiles(dir: string): string[] | null;
92
+ /** 把一堆目录名分成"能用的版本目录 / 不能用的 / 与版本无关的"。纯函数,便于测。 */
93
+ export declare function classifyVersionDirs(entries: Array<{
94
+ name: string;
95
+ files: string[];
96
+ }>): {
97
+ usable: string[];
98
+ unusable: Array<{
99
+ dir: string;
100
+ files: number;
101
+ }>;
102
+ };
103
+ /** 安装根(`D:\WeiXin`)→ 它的版本目录分类。读不出来就当空(不猜)。 */
104
+ export declare function versionDirsUnder(installRoot: string): ReturnType<typeof classifyVersionDirs>;
105
+ export declare function summarize(processes: WechatClientProcess[], unusable: Array<{
106
+ dir: string;
107
+ files: number;
108
+ }>): WechatVersionFacts;
109
+ /** 默认的执行器:`Get-CimInstance`。测试里换掉它,别真去问系统。 */
110
+ export type PowershellRunner = (command: string) => Promise<string>;
111
+ /**
112
+ * **只要那一句话**:客户端自报的数据目录。
113
+ *
114
+ * 给 `init` 的数据目录发现用(`DbPathService.autoDetect({ hintedRoots })`)—— 它是唯一
115
+ * **来自客户端自己**的来源,别的都是按目录名猜的。找不到就返回空数组(调用方走老路),
116
+ * **不抛**:这只是个线索,不该让初始化失败。
117
+ */
118
+ export declare function reportedDataDirs(run?: PowershellRunner): Promise<string[]>;
119
+ /**
120
+ * 汇总:进程画像 + 每个安装根下"不能用的版本目录"。
121
+ *
122
+ * 非 Windows 直接返回"平台不支持"(`Get-CimInstance` 是 Windows 的),**不是**返回"没问题"。
123
+ */
124
+ export declare function detectWechatClient(run?: PowershellRunner): Promise<WechatClientFacts>;
125
+ //# sourceMappingURL=wechatClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wechatClient.d.ts","sourceRoot":"","sources":["../../../src/services/wechatClient.ts"],"names":[],"mappings":"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"}