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.
- package/ARCHITECTURE.md +62 -26
- package/CHANGELOG.md +1290 -0
- package/OPERATIONS.md +144 -11
- package/README.en.md +20 -4
- package/README.md +30 -5
- package/bin/weflow-cli-electron.cjs +2 -0
- package/bin/weflow-cli.ts +996 -118
- package/dist/bin/weflow-cli.js +1038 -146
- package/dist/bin/weflow-cli.js.map +1 -1
- package/dist/mcp-server/http.d.ts +14 -0
- package/dist/mcp-server/http.d.ts.map +1 -0
- package/dist/mcp-server/http.js +84 -0
- package/dist/mcp-server/http.js.map +1 -0
- package/dist/mcp-server/httpConfig.d.ts +50 -0
- package/dist/mcp-server/httpConfig.d.ts.map +1 -0
- package/dist/mcp-server/httpConfig.js +104 -0
- package/dist/mcp-server/httpConfig.js.map +1 -0
- package/dist/mcp-server/index.d.ts +13 -1
- package/dist/mcp-server/index.d.ts.map +1 -1
- package/dist/mcp-server/index.js +58 -374
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/src/core/dbPathService.d.ts +12 -0
- package/dist/src/core/dbPathService.d.ts.map +1 -1
- package/dist/src/core/dbPathService.js +20 -3
- package/dist/src/core/dbPathService.js.map +1 -1
- package/dist/src/panel/server.d.ts.map +1 -1
- package/dist/src/panel/server.js +61 -1
- package/dist/src/panel/server.js.map +1 -1
- package/dist/src/services/assistantEval.d.ts +69 -0
- package/dist/src/services/assistantEval.d.ts.map +1 -1
- package/dist/src/services/assistantEval.js +270 -8
- package/dist/src/services/assistantEval.js.map +1 -1
- package/dist/src/services/assistantScenes.d.ts +81 -0
- package/dist/src/services/assistantScenes.d.ts.map +1 -0
- package/dist/src/services/assistantScenes.js +322 -0
- package/dist/src/services/assistantScenes.js.map +1 -0
- package/dist/src/services/assistantService.d.ts +33 -4
- package/dist/src/services/assistantService.d.ts.map +1 -1
- package/dist/src/services/assistantService.js +102 -6
- package/dist/src/services/assistantService.js.map +1 -1
- package/dist/src/services/assistantSkills.d.ts +94 -0
- package/dist/src/services/assistantSkills.d.ts.map +1 -0
- package/dist/src/services/assistantSkills.js +330 -0
- package/dist/src/services/assistantSkills.js.map +1 -0
- package/dist/src/services/assistantTools.d.ts +34 -1
- package/dist/src/services/assistantTools.d.ts.map +1 -1
- package/dist/src/services/assistantTools.js +931 -88
- package/dist/src/services/assistantTools.js.map +1 -1
- package/dist/src/services/assistantTrace.d.ts +4 -0
- package/dist/src/services/assistantTrace.d.ts.map +1 -1
- package/dist/src/services/assistantTrace.js +9 -0
- package/dist/src/services/assistantTrace.js.map +1 -1
- package/dist/src/services/configService.d.ts +9 -0
- package/dist/src/services/configService.d.ts.map +1 -1
- package/dist/src/services/configService.js +5 -2
- package/dist/src/services/configService.js.map +1 -1
- package/dist/src/services/messageQuery.d.ts +18 -0
- package/dist/src/services/messageQuery.d.ts.map +1 -1
- package/dist/src/services/messageQuery.js +29 -0
- package/dist/src/services/messageQuery.js.map +1 -1
- package/dist/src/services/outboundSend.d.ts +53 -0
- package/dist/src/services/outboundSend.d.ts.map +1 -0
- package/dist/src/services/outboundSend.js +90 -0
- package/dist/src/services/outboundSend.js.map +1 -0
- package/dist/src/services/pythonBridge.d.ts.map +1 -1
- package/dist/src/services/pythonBridge.js +1 -0
- package/dist/src/services/pythonBridge.js.map +1 -1
- package/dist/src/services/wechatClient.d.ts +125 -0
- package/dist/src/services/wechatClient.d.ts.map +1 -0
- package/dist/src/services/wechatClient.js +344 -0
- package/dist/src/services/wechatClient.js.map +1 -0
- package/dist/src/services/wechatMedia.d.ts +44 -0
- package/dist/src/services/wechatMedia.d.ts.map +1 -0
- package/dist/src/services/wechatMedia.js +155 -0
- package/dist/src/services/wechatMedia.js.map +1 -0
- package/dist/src/services/wechatMessageService.d.ts +11 -0
- package/dist/src/services/wechatMessageService.d.ts.map +1 -1
- package/dist/src/services/wechatMessageService.js +55 -11
- package/dist/src/services/wechatMessageService.js.map +1 -1
- package/dist/src/types.d.ts +4 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/python.js +2 -2
- package/dist/src/utils/python.js.map +1 -1
- package/docs/BRANCHES.md +37 -0
- package/docs/CONTACT_DB_SCHEMA.md +1085 -0
- package/docs/DECISIONS.md +1624 -0
- package/docs/EXTENDING.md +98 -10
- package/docs/FUNCTIONAL-IMPROVEMENT-SPEC.md +6 -0
- package/docs/HEALTH-CHECK.md +12 -7
- package/docs/JEV/345/272/224/347/224/250/346/226/275/345/267/245/346/226/207/346/241/243.md +2 -2
- package/docs/MCP.md +58 -4
- package/docs/PROJECT_STATE.md +180 -11
- package/docs/RELEASING.md +115 -1
- package/docs/images/weflow-architecture-gpt-image-2.png +0 -0
- package/logo.png +0 -0
- package/mcp-server/http.ts +108 -0
- package/mcp-server/httpConfig.ts +126 -0
- package/mcp-server/index.ts +359 -681
- package/package.json +5 -3
- package/resources/js/graph3d/NOTICE.txt +35 -0
- package/resources/js/graph3d/d3-binarytree.min.js +2 -0
- package/resources/js/graph3d/d3-dispatch.min.js +2 -0
- package/resources/js/graph3d/d3-force-3d.min.js +2 -0
- package/resources/js/graph3d/d3-octree.min.js +2 -0
- package/resources/js/graph3d/d3-quadtree.min.js +2 -0
- package/resources/js/graph3d/d3-timer.min.js +2 -0
- package/resources/js/graph3d/layout.mjs +63 -0
- package/resources/js/graph3d/three.min.js +6 -0
- package/resources/js/graph3d/viewer2d.js +448 -0
- package/resources/panel/ball-position.cjs +48 -2
- package/resources/panel/index.html +18 -4
- package/resources/panel/main.cjs +137 -5
- package/resources/panel/mascot-base.png +0 -0
- package/resources/panel/mascot-blink-1.png +0 -0
- package/resources/panel/mascot-blink-2.png +0 -0
- package/resources/panel/mascot-iris.png +0 -0
- package/resources/panel/mascot-lift-down-1.png +0 -0
- package/resources/panel/mascot-lift-down-2.png +0 -0
- package/resources/panel/mascot-lift-down-3.png +0 -0
- package/resources/panel/mascot-lift-down-4.png +0 -0
- package/resources/panel/mascot-lift-down-5.png +0 -0
- package/resources/panel/mascot-lift-down-6.png +0 -0
- package/resources/panel/mascot-lift-up-1.png +0 -0
- package/resources/panel/mascot-lift-up-2.png +0 -0
- package/resources/panel/mascot-lift-up-3.png +0 -0
- package/resources/panel/mascot-lift-up-4.png +0 -0
- package/resources/panel/mascot-lift-up-5.png +0 -0
- package/resources/panel/mascot-lift-up-6.png +0 -0
- package/resources/panel/mascot-peek.png +0 -0
- package/resources/panel/mascot-tickle-1.png +0 -0
- package/resources/panel/mascot-tickle-2.png +0 -0
- package/resources/panel/mascot-tickle-3.png +0 -0
- package/resources/panel/mascot-tickle-4.png +0 -0
- package/resources/panel/panel.css +205 -59
- package/resources/panel/preload.cjs +26 -0
- package/resources/panel/renderer.js +646 -17
- package/scripts/_utils.py +1203 -931
- package/scripts/backfill_articles.py +202 -21
- package/scripts/biz_daily.py +26 -34
- package/scripts/bonds.py +331 -0
- package/scripts/chat_notes.py +561 -470
- package/scripts/chat_stats.py +8 -7
- package/scripts/check_readme_commands.py +426 -0
- package/scripts/compile_wiki.py +187 -59
- package/scripts/contact_schema.py +339 -0
- package/scripts/data/wechat_emoji.json +225 -0
- package/scripts/export_chat_html.py +3 -1
- package/scripts/fav_notes.py +4 -1
- package/scripts/graph_2d.py +151 -0
- package/scripts/graph_3d.py +646 -0
- package/scripts/health_check.py +163 -26
- package/scripts/mcp_bridge.py +6 -7
- package/scripts/nt_decrypt.py +3 -3
- package/scripts/panel_frames.py +683 -0
- package/scripts/pipeline.py +21 -10
- package/scripts/quality_eval.py +5 -0
- package/scripts/rag_chat.py +33 -16
- package/scripts/reply_debt.py +26 -6
- package/scripts/semantic_search.py +130 -22
- package/scripts/vault_rag.py +42 -16
- package/scripts/vault_search.py +44 -8
- package/scripts/wechat_emoticon.py +6 -0
- package/scripts/wechat_voice.py +9 -0
- package/scripts/wiki_lint.py +124 -24
- package/src/core/dbPathService.ts +22 -4
- package/src/panel/server.ts +58 -1
- package/src/services/assistantEval.ts +323 -12
- package/src/services/assistantScenes.ts +342 -0
- package/src/services/assistantService.ts +107 -6
- package/src/services/assistantSkills.ts +364 -0
- package/src/services/assistantTools.ts +2452 -1640
- package/src/services/assistantTrace.ts +9 -0
- package/src/services/configService.ts +415 -403
- package/src/services/messageQuery.ts +29 -0
- package/src/services/outboundSend.ts +126 -0
- package/src/services/pythonBridge.ts +1 -0
- package/src/services/wechatClient.ts +380 -0
- package/src/services/wechatMedia.ts +166 -0
- package/src/services/wechatMessageService.ts +62 -11
- package/src/types.ts +4 -0
- package/src/utils/python.ts +2 -2
- package/dist/src/utils/wechatEmoji.d.ts +0 -5
- package/dist/src/utils/wechatEmoji.d.ts.map +0 -1
- package/dist/src/utils/wechatEmoji.js +0 -35
- 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;
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAsBrD,MAAM,kBAAkB,GAAG,MAAM,CAAA;AAEjC,SAAS,UAAU,CAAC,UAAkB,EAAE,IAAc,EAClC,OAA4E;IAC9F,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE;YAC7D,kDAAkD;YAClD,GAAG,EAAE,sBAAsB,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;YAC9C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAA;QACF,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,KAAK,CAAC,IAAI,EAAE,CAAA;YACZ,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,OAAO,CAAC,SAAS,KAAK,CAAC,CAAC,CAAA;QACnD,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;QAErB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;QAC1E,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;QAC1E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,CAAC,KAAK,CAAC,CAAA;QACf,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QACF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;;YAC1D,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;IACxB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,IAAI,MAAM,GAAiB,UAAU,CAAA;AAErC,oCAAoC;AACpC,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,MAAM,GAAG,IAAI,IAAI,UAAU,CAAA;AAC7B,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;AACnE,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACtE,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QACpE,IAAI,CAAC;YAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EAAE,IAAc,EAC9B,UAAgF,EAAE;IAElF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAA;IACzD,IAAI,GAAc,CAAA;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACrG,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;IAC5E,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACxC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAEvG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IACtE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IACpE,CAAC;IACD,MAAM,IAAI,GAAQ,MAAM,CAAC,IAAI,CAAA;IAC7B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QACpF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IAC7F,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAS,EAAE,CAAA;AACtC,CAAC"}
|
|
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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"}
|