weflow-cli 1.5.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/LICENSE +21 -0
- package/README.md +149 -0
- package/bin/weflow-cli-electron.cjs +59 -0
- package/bin/weflow-cli.ts +2311 -0
- package/cli.cjs +3 -0
- package/dist/bin/weflow-cli.d.ts +3 -0
- package/dist/bin/weflow-cli.d.ts.map +1 -0
- package/dist/bin/weflow-cli.js +2270 -0
- package/dist/bin/weflow-cli.js.map +1 -0
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +690 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/src/core/dbPathService.d.ts +40 -0
- package/dist/src/core/dbPathService.d.ts.map +1 -0
- package/dist/src/core/dbPathService.js +324 -0
- package/dist/src/core/dbPathService.js.map +1 -0
- package/dist/src/core/keyService.d.ts +59 -0
- package/dist/src/core/keyService.d.ts.map +1 -0
- package/dist/src/core/keyService.js +368 -0
- package/dist/src/core/keyService.js.map +1 -0
- package/dist/src/core/ntCore.d.ts +62 -0
- package/dist/src/core/ntCore.d.ts.map +1 -0
- package/dist/src/core/ntCore.js +191 -0
- package/dist/src/core/ntCore.js.map +1 -0
- package/dist/src/core/sqlcipherCore.d.ts +119 -0
- package/dist/src/core/sqlcipherCore.d.ts.map +1 -0
- package/dist/src/core/sqlcipherCore.js +693 -0
- package/dist/src/core/sqlcipherCore.js.map +1 -0
- package/dist/src/core/wcdbCore.d.ts +738 -0
- package/dist/src/core/wcdbCore.d.ts.map +1 -0
- package/dist/src/core/wcdbCore.js +4545 -0
- package/dist/src/core/wcdbCore.js.map +1 -0
- package/dist/src/core/wechatClient.d.ts +23 -0
- package/dist/src/core/wechatClient.d.ts.map +1 -0
- package/dist/src/core/wechatClient.js +166 -0
- package/dist/src/core/wechatClient.js.map +1 -0
- package/dist/src/services/chatService.d.ts +25 -0
- package/dist/src/services/chatService.d.ts.map +1 -0
- package/dist/src/services/chatService.js +291 -0
- package/dist/src/services/chatService.js.map +1 -0
- package/dist/src/services/configService.d.ts +43 -0
- package/dist/src/services/configService.d.ts.map +1 -0
- package/dist/src/services/configService.js +156 -0
- package/dist/src/services/configService.js.map +1 -0
- package/dist/src/services/exportService.d.ts +30 -0
- package/dist/src/services/exportService.d.ts.map +1 -0
- package/dist/src/services/exportService.js +273 -0
- package/dist/src/services/exportService.js.map +1 -0
- package/dist/src/services/wechat-formatter.d.ts +69 -0
- package/dist/src/services/wechat-formatter.d.ts.map +1 -0
- package/dist/src/services/wechat-formatter.js +248 -0
- package/dist/src/services/wechat-formatter.js.map +1 -0
- package/dist/src/services/wechatMessageService.d.ts +28 -0
- package/dist/src/services/wechatMessageService.d.ts.map +1 -0
- package/dist/src/services/wechatMessageService.js +341 -0
- package/dist/src/services/wechatMessageService.js.map +1 -0
- package/dist/src/services/wereadService.d.ts +206 -0
- package/dist/src/services/wereadService.d.ts.map +1 -0
- package/dist/src/services/wereadService.js +145 -0
- package/dist/src/services/wereadService.js.map +1 -0
- package/dist/src/services/whitelistService.d.ts +20 -0
- package/dist/src/services/whitelistService.d.ts.map +1 -0
- package/dist/src/services/whitelistService.js +60 -0
- package/dist/src/services/whitelistService.js.map +1 -0
- package/dist/src/types.d.ts +140 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/errors.d.ts +25 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +43 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/pathUtils.d.ts +5 -0
- package/dist/src/utils/pathUtils.d.ts.map +1 -0
- package/dist/src/utils/pathUtils.js +16 -0
- package/dist/src/utils/pathUtils.js.map +1 -0
- package/dist/src/utils/pythonRunner.d.ts +27 -0
- package/dist/src/utils/pythonRunner.d.ts.map +1 -0
- package/dist/src/utils/pythonRunner.js +62 -0
- package/dist/src/utils/pythonRunner.js.map +1 -0
- package/dist/src/utils/talkerUtils.d.ts +14 -0
- package/dist/src/utils/talkerUtils.d.ts.map +1 -0
- package/dist/src/utils/talkerUtils.js +73 -0
- package/dist/src/utils/talkerUtils.js.map +1 -0
- package/mcp-server/index.ts +757 -0
- package/package.json +72 -0
- package/resources/key/win32/x64/wx_key.dll +0 -0
- package/resources/wcdb/win32/x64/SDL2.dll +0 -0
- package/resources/wcdb/win32/x64/WCDB.dll +0 -0
- package/resources/wcdb/win32/x64/msvcp140.dll +0 -0
- package/resources/wcdb/win32/x64/msvcp140_1.dll +0 -0
- package/resources/wcdb/win32/x64/vcruntime140.dll +0 -0
- package/resources/wcdb/win32/x64/vcruntime140_1.dll +0 -0
- package/resources/wcdb/win32/x64/wcdb_api.dll +0 -0
- package/scripts/_batch_link_sources.py +73 -0
- package/scripts/_utils.py +531 -0
- package/scripts/annual_report.py +796 -0
- package/scripts/auto_tag.py +128 -0
- package/scripts/biz_daily.py +896 -0
- package/scripts/chat_report.py +397 -0
- package/scripts/chat_stats.py +702 -0
- package/scripts/classify_daily.py +411 -0
- package/scripts/compile_wiki.py +258 -0
- package/scripts/create_reading_notes.py +370 -0
- package/scripts/enrich_backlinks.py +163 -0
- package/scripts/export_chat_html.py +766 -0
- package/scripts/extract_3x_key.py +86 -0
- package/scripts/extract_todos.py +404 -0
- package/scripts/fav_server.py +392 -0
- package/scripts/fix_topics.py +111 -0
- package/scripts/generate_ai_report.py +367 -0
- package/scripts/generate_html.py +1372 -0
- package/scripts/generate_review.py +170 -0
- package/scripts/mcp_bridge.py +398 -0
- package/scripts/nt_decrypt.py +562 -0
- package/scripts/pipeline.py +145 -0
- package/scripts/promote_all.py +310 -0
- package/scripts/promote_ideas.py +297 -0
- package/scripts/rag_chat.py +191 -0
- package/scripts/scan_decrypt_4x.py +329 -0
- package/scripts/semantic_search.py +431 -0
- package/scripts/sync_fav.py +146 -0
- package/scripts/sync_weread.py +192 -0
- package/scripts/vault_rag.py +139 -0
- package/scripts/vault_search.py +141 -0
- package/src/core/dbPathService.ts +348 -0
- package/src/core/keyService.ts +409 -0
- package/src/core/ntCore.ts +224 -0
- package/src/core/sqlcipherCore.ts +764 -0
- package/src/core/wcdbCore.ts +4568 -0
- package/src/core/wechatClient.ts +204 -0
- package/src/lz4.d.ts +10 -0
- package/src/services/chatService.ts +296 -0
- package/src/services/configService.ts +197 -0
- package/src/services/exportService.ts +305 -0
- package/src/services/wechat-formatter.ts +348 -0
- package/src/services/wechatMessageService.ts +383 -0
- package/src/services/wereadService.ts +308 -0
- package/src/services/whitelistService.ts +72 -0
- package/src/types.ts +141 -0
- package/src/utils/errors.ts +42 -0
- package/src/utils/pathUtils.ts +16 -0
- package/src/utils/pythonRunner.ts +81 -0
- package/src/utils/talkerUtils.ts +84 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 微信读书 Agent API Gateway 封装
|
|
3
|
+
*
|
|
4
|
+
* 接口文档: ~/.claude/skills/weread-skills/
|
|
5
|
+
* Gateway: https://i.weread.qq.com/api/agent/gateway
|
|
6
|
+
*/
|
|
7
|
+
import https from 'node:https';
|
|
8
|
+
const GATEWAY = 'https://i.weread.qq.com/api/agent/gateway';
|
|
9
|
+
const SKILL_VERSION = '1.0.3';
|
|
10
|
+
// weread.qq.com 服务端不支持 TLS 1.3,需要强制使用 TLS 1.2
|
|
11
|
+
const httpsAgent = new https.Agent({ maxVersion: 'TLSv1.2' });
|
|
12
|
+
export class WereadService {
|
|
13
|
+
apiKey;
|
|
14
|
+
constructor(apiKey) {
|
|
15
|
+
this.apiKey = apiKey || process.env.WEREAD_API_KEY || '';
|
|
16
|
+
}
|
|
17
|
+
async call(apiName, params = {}) {
|
|
18
|
+
if (!this.apiKey) {
|
|
19
|
+
return { ok: false, error: '未设置 WEREAD_API_KEY,请设置环境变量或在 CLI 中配置' };
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const body = JSON.stringify({ api_name: apiName, skill_version: SKILL_VERSION, ...params });
|
|
23
|
+
const json = await new Promise((resolve, reject) => {
|
|
24
|
+
const url = new URL(GATEWAY);
|
|
25
|
+
const req = https.request({
|
|
26
|
+
hostname: url.hostname,
|
|
27
|
+
path: url.pathname,
|
|
28
|
+
method: 'POST',
|
|
29
|
+
agent: httpsAgent,
|
|
30
|
+
headers: {
|
|
31
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
32
|
+
'Content-Type': 'application/json',
|
|
33
|
+
'Content-Length': Buffer.byteLength(body),
|
|
34
|
+
},
|
|
35
|
+
}, (res) => {
|
|
36
|
+
let data = '';
|
|
37
|
+
res.on('data', (chunk) => data += chunk.toString());
|
|
38
|
+
res.on('end', () => {
|
|
39
|
+
try {
|
|
40
|
+
resolve(JSON.parse(data));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
reject(new Error(`Invalid JSON response: ${data.slice(0, 200)}`));
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
req.on('error', reject);
|
|
48
|
+
req.write(body);
|
|
49
|
+
req.end();
|
|
50
|
+
});
|
|
51
|
+
if (json.errcode && json.errcode !== 0) {
|
|
52
|
+
return { ok: false, error: `API 错误: ${json.errmsg || json.errcode}` };
|
|
53
|
+
}
|
|
54
|
+
return { ok: true, data: json };
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
return { ok: false, error: `请求失败: ${e.message}` };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** 书架同步 */
|
|
61
|
+
async shelf() {
|
|
62
|
+
return this.call('/shelf/sync');
|
|
63
|
+
}
|
|
64
|
+
/** 阅读统计: mode = weekly | monthly | annually | overall */
|
|
65
|
+
async readData(mode = 'monthly', baseTime) {
|
|
66
|
+
const params = { mode };
|
|
67
|
+
if (baseTime !== undefined)
|
|
68
|
+
params.baseTime = baseTime;
|
|
69
|
+
return this.call('/readdata/detail', params);
|
|
70
|
+
}
|
|
71
|
+
/** 笔记列表: 获取用户的笔记本列表 */
|
|
72
|
+
async notebooks(count = 100, lastSort) {
|
|
73
|
+
const params = { count };
|
|
74
|
+
if (lastSort !== undefined)
|
|
75
|
+
params.lastSort = lastSort;
|
|
76
|
+
return this.call('/user/notebooks', params);
|
|
77
|
+
}
|
|
78
|
+
/** 某本书的划线 */
|
|
79
|
+
async bookmarks(bookId, count = 50) {
|
|
80
|
+
return this.call('/book/bookmarklist', { bookId, count });
|
|
81
|
+
}
|
|
82
|
+
/** 某本书的热门划线 */
|
|
83
|
+
async bestBookmarks(bookId, count = 20) {
|
|
84
|
+
return this.call('/book/bestbookmarks', { bookId, count });
|
|
85
|
+
}
|
|
86
|
+
/** 搜索书籍 */
|
|
87
|
+
async search(keyword, count = 10, scope = 'all') {
|
|
88
|
+
return this.call('/store/search', { keyword, count, scope });
|
|
89
|
+
}
|
|
90
|
+
/** 书籍详情 */
|
|
91
|
+
async bookInfo(bookId) {
|
|
92
|
+
return this.call('/book/info', { bookId });
|
|
93
|
+
}
|
|
94
|
+
/** 章节目录 */
|
|
95
|
+
async chapterInfo(bookId) {
|
|
96
|
+
return this.call('/book/chapterinfo', { bookId });
|
|
97
|
+
}
|
|
98
|
+
/** 阅读进度 */
|
|
99
|
+
async getProgress(bookId) {
|
|
100
|
+
return this.call('/book/getprogress', { bookId });
|
|
101
|
+
}
|
|
102
|
+
/** 书评 */
|
|
103
|
+
async reviews(bookId, count = 20, sort = 'hot') {
|
|
104
|
+
return this.call('/book/readreviews', { bookId, count, sort });
|
|
105
|
+
}
|
|
106
|
+
/** 个性化推荐 */
|
|
107
|
+
async recommend(count = 10) {
|
|
108
|
+
return this.call('/book/recommend', { count });
|
|
109
|
+
}
|
|
110
|
+
/** 相似推荐 */
|
|
111
|
+
async similar(bookId, count = 5) {
|
|
112
|
+
return this.call('/book/recommend', { bookId, count, type: 'similar' });
|
|
113
|
+
}
|
|
114
|
+
/** 个人中心(聚合多个接口) */
|
|
115
|
+
async profile() {
|
|
116
|
+
const [shelfRes, readRes] = await Promise.all([
|
|
117
|
+
this.shelf(),
|
|
118
|
+
this.readData('overall'),
|
|
119
|
+
]);
|
|
120
|
+
if (!shelfRes.ok)
|
|
121
|
+
return { ok: false, error: shelfRes.error };
|
|
122
|
+
if (!readRes.ok)
|
|
123
|
+
return { ok: false, error: readRes.error };
|
|
124
|
+
const shelf = shelfRes.data;
|
|
125
|
+
const read = readRes.data;
|
|
126
|
+
return {
|
|
127
|
+
ok: true,
|
|
128
|
+
data: {
|
|
129
|
+
vid: '',
|
|
130
|
+
name: '',
|
|
131
|
+
avatar: '',
|
|
132
|
+
gender: 0,
|
|
133
|
+
totalReadTime: read.totalReadTime || 0,
|
|
134
|
+
totalReadDays: read.readDays || 0,
|
|
135
|
+
totalBooks: shelf.books?.length || 0,
|
|
136
|
+
totalFinished: shelf.books?.filter(b => b.finishReading === 1).length || 0,
|
|
137
|
+
totalNotes: 0,
|
|
138
|
+
totalHighlights: 0,
|
|
139
|
+
totalReviews: 0,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export const wereadService = new WereadService();
|
|
145
|
+
//# sourceMappingURL=wereadService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wereadService.js","sourceRoot":"","sources":["../../../src/services/wereadService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface WhitelistEntry {
|
|
2
|
+
wxid: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class WhitelistService {
|
|
6
|
+
getList(): string[];
|
|
7
|
+
isAllowed(wxid: string): boolean;
|
|
8
|
+
/** 直接添加 wxid(不解析昵称),用于 CLI 确认后的最终写入 */
|
|
9
|
+
addDirect(wxid: string): void;
|
|
10
|
+
add(target: string): Promise<{
|
|
11
|
+
success: boolean;
|
|
12
|
+
error?: string;
|
|
13
|
+
wxid?: string;
|
|
14
|
+
}>;
|
|
15
|
+
remove(wxid: string): boolean;
|
|
16
|
+
clear(): void;
|
|
17
|
+
reload(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare const whitelistService: WhitelistService;
|
|
20
|
+
//# sourceMappingURL=whitelistService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitelistService.d.ts","sourceRoot":"","sources":["../../../src/services/whitelistService.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,IAAI,MAAM,EAAE;IAInB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,uCAAuC;IACvC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQvB,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBvF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAS7B,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;CAGf;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 白名单服务 — 控制消息收发权限,仅白名单内 wxid 可收发消息。
|
|
3
|
+
*/
|
|
4
|
+
import { configService } from './configService.js';
|
|
5
|
+
import { resolveTalker } from '../utils/talkerUtils.js';
|
|
6
|
+
export class WhitelistService {
|
|
7
|
+
getList() {
|
|
8
|
+
return configService.getWhitelist();
|
|
9
|
+
}
|
|
10
|
+
isAllowed(wxid) {
|
|
11
|
+
return configService.getWhitelist().includes(wxid);
|
|
12
|
+
}
|
|
13
|
+
/** 直接添加 wxid(不解析昵称),用于 CLI 确认后的最终写入 */
|
|
14
|
+
addDirect(wxid) {
|
|
15
|
+
const list = configService.getWhitelist();
|
|
16
|
+
if (!list.includes(wxid)) {
|
|
17
|
+
list.push(wxid);
|
|
18
|
+
configService.setWhitelist(list);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async add(target) {
|
|
22
|
+
let wxid;
|
|
23
|
+
// 已知格式直接使用,否则通过 resolveTalker 解析
|
|
24
|
+
if (target.startsWith('wxid_') || target.includes('@chatroom') || target.includes('@openim')) {
|
|
25
|
+
wxid = target;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
try {
|
|
29
|
+
wxid = await resolveTalker(target);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
return { success: false, error: `无法解析 "${target}": ${e.message}` };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const list = configService.getWhitelist();
|
|
36
|
+
if (list.includes(wxid)) {
|
|
37
|
+
return { success: false, error: `"${wxid}" 已在白名单中` };
|
|
38
|
+
}
|
|
39
|
+
list.push(wxid);
|
|
40
|
+
configService.setWhitelist(list);
|
|
41
|
+
return { success: true, wxid };
|
|
42
|
+
}
|
|
43
|
+
remove(wxid) {
|
|
44
|
+
const list = configService.getWhitelist();
|
|
45
|
+
const idx = list.indexOf(wxid);
|
|
46
|
+
if (idx < 0)
|
|
47
|
+
return false;
|
|
48
|
+
list.splice(idx, 1);
|
|
49
|
+
configService.setWhitelist(list);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
clear() {
|
|
53
|
+
configService.setWhitelist([]);
|
|
54
|
+
}
|
|
55
|
+
reload() {
|
|
56
|
+
// configService 每次 getWhitelist 都从内存读取,无需主动 reload
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export const whitelistService = new WhitelistService();
|
|
60
|
+
//# sourceMappingURL=whitelistService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitelistService.js","sourceRoot":"","sources":["../../../src/services/whitelistService.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAOvD,MAAM,OAAO,gBAAgB;IAC3B,OAAO;QACL,OAAO,aAAa,CAAC,YAAY,EAAE,CAAA;IACrC,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,aAAa,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,uCAAuC;IACvC,SAAS,CAAC,IAAY;QACpB,MAAM,IAAI,GAAG,aAAa,CAAC,YAAY,EAAE,CAAA;QACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACf,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc;QACtB,IAAI,IAAY,CAAA;QAEhB,iCAAiC;QACjC,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7F,IAAI,GAAG,MAAM,CAAA;QACf,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;YACpC,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAA;YACpE,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,aAAa,CAAC,YAAY,EAAE,CAAA;QACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;QACtD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACf,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAChC,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,MAAM,IAAI,GAAG,aAAa,CAAC,YAAY,EAAE,CAAA;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACnB,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC;IAED,MAAM;QACJ,mDAAmD;IACrD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export interface WxidInfo {
|
|
2
|
+
wxid: string;
|
|
3
|
+
modifiedTime: number;
|
|
4
|
+
nickname?: string;
|
|
5
|
+
avatarUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ChatSession {
|
|
8
|
+
username: string;
|
|
9
|
+
type: number;
|
|
10
|
+
unreadCount: number;
|
|
11
|
+
summary: string;
|
|
12
|
+
sortTimestamp: number;
|
|
13
|
+
lastTimestamp: number;
|
|
14
|
+
displayName?: string;
|
|
15
|
+
avatarUrl?: string;
|
|
16
|
+
lastMsgType?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface Message {
|
|
19
|
+
localId: number;
|
|
20
|
+
serverId: string;
|
|
21
|
+
localType: number;
|
|
22
|
+
createTime: number;
|
|
23
|
+
isSend: number | null;
|
|
24
|
+
senderUsername: string | null;
|
|
25
|
+
content: string;
|
|
26
|
+
rawContent: string;
|
|
27
|
+
parsedContent: string;
|
|
28
|
+
mediaType?: string;
|
|
29
|
+
mediaFileName?: string;
|
|
30
|
+
/** Type=3 图片: 缩略图 base64 数据 */
|
|
31
|
+
imageBase64?: string;
|
|
32
|
+
/** Type=3 图片: 图片文件名 (UUID.png) */
|
|
33
|
+
imageFileName?: string;
|
|
34
|
+
/** Type=49 AppMsg: 标题 */
|
|
35
|
+
appTitle?: string;
|
|
36
|
+
/** Type=49 AppMsg: 描述 */
|
|
37
|
+
appDescription?: string;
|
|
38
|
+
/** Type=49 AppMsg: URL */
|
|
39
|
+
appUrl?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface Contact {
|
|
42
|
+
username: string;
|
|
43
|
+
displayName: string;
|
|
44
|
+
remark?: string;
|
|
45
|
+
nickname?: string;
|
|
46
|
+
alias?: string;
|
|
47
|
+
avatarUrl?: string;
|
|
48
|
+
type?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface WechatOCConfig {
|
|
51
|
+
baseUrl?: string;
|
|
52
|
+
cdnBaseUrl?: string;
|
|
53
|
+
botType?: string;
|
|
54
|
+
token?: string;
|
|
55
|
+
accountId?: string;
|
|
56
|
+
syncBuf?: string;
|
|
57
|
+
contextTokens?: Record<string, string>;
|
|
58
|
+
longPollTimeoutMs?: number;
|
|
59
|
+
apiTimeoutMs?: number;
|
|
60
|
+
typingKeepaliveIntervalS?: number;
|
|
61
|
+
typingTicketTtlS?: number;
|
|
62
|
+
}
|
|
63
|
+
export interface WechatLoginSession {
|
|
64
|
+
sessionKey: string;
|
|
65
|
+
qrcode: string;
|
|
66
|
+
qrcodeImgContent: string;
|
|
67
|
+
startedAt: number;
|
|
68
|
+
status: 'wait' | 'confirmed' | 'expired' | 'scanned';
|
|
69
|
+
botToken?: string;
|
|
70
|
+
accountId?: string;
|
|
71
|
+
baseUrl?: string;
|
|
72
|
+
userId?: string;
|
|
73
|
+
error?: string;
|
|
74
|
+
}
|
|
75
|
+
export interface WechatInboundMessage {
|
|
76
|
+
messageId: string;
|
|
77
|
+
fromUserId: string;
|
|
78
|
+
senderNickname: string;
|
|
79
|
+
timestamp: number;
|
|
80
|
+
timestampMs: number;
|
|
81
|
+
components: WechatMessageComponent[];
|
|
82
|
+
messageStr: string;
|
|
83
|
+
messageKind: 'text' | 'image' | 'voice' | 'file' | 'video' | 'unknown';
|
|
84
|
+
rawMessage: Record<string, any>;
|
|
85
|
+
isReply: boolean;
|
|
86
|
+
quotedText?: string;
|
|
87
|
+
}
|
|
88
|
+
export type WechatMessageComponent = {
|
|
89
|
+
type: 'plain';
|
|
90
|
+
text: string;
|
|
91
|
+
} | {
|
|
92
|
+
type: 'image';
|
|
93
|
+
filePath: string;
|
|
94
|
+
} | {
|
|
95
|
+
type: 'record';
|
|
96
|
+
filePath: string;
|
|
97
|
+
} | {
|
|
98
|
+
type: 'file';
|
|
99
|
+
name: string;
|
|
100
|
+
filePath: string;
|
|
101
|
+
} | {
|
|
102
|
+
type: 'video';
|
|
103
|
+
filePath: string;
|
|
104
|
+
};
|
|
105
|
+
export interface ExportOptions {
|
|
106
|
+
talker: string;
|
|
107
|
+
format: 'json' | 'html' | 'txt' | 'excel';
|
|
108
|
+
output: string;
|
|
109
|
+
limit?: number;
|
|
110
|
+
start?: string;
|
|
111
|
+
end?: string;
|
|
112
|
+
}
|
|
113
|
+
export interface DbKeyResult {
|
|
114
|
+
success: boolean;
|
|
115
|
+
key?: string;
|
|
116
|
+
error?: string;
|
|
117
|
+
logs?: string[];
|
|
118
|
+
}
|
|
119
|
+
export type DataVersion = '3.x' | '4.x';
|
|
120
|
+
export interface ConfigData {
|
|
121
|
+
dbPath?: string;
|
|
122
|
+
wxid?: string;
|
|
123
|
+
decryptKey?: string;
|
|
124
|
+
decryptKey3x?: string;
|
|
125
|
+
dataVersion?: DataVersion;
|
|
126
|
+
dbPath3x?: string;
|
|
127
|
+
/** NT 格式: 主消息数据库路径 (message_0.db) */
|
|
128
|
+
ntDbPath?: string;
|
|
129
|
+
/** NT 格式: 64位十六进制密钥 */
|
|
130
|
+
ntKey?: string;
|
|
131
|
+
/** NT 格式: 32位十六进制盐值 */
|
|
132
|
+
ntSalt?: string;
|
|
133
|
+
/** NT 格式: 联系人数据库路径 (contact.db) */
|
|
134
|
+
contactDbPath?: string;
|
|
135
|
+
/** NT 格式: contact.db 64位十六进制密钥 */
|
|
136
|
+
contactKey?: string;
|
|
137
|
+
/** NT 格式: contact.db 32位十六进制盐值 */
|
|
138
|
+
contactSalt?: string;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WeflowError - weflow-cli 统一错误类
|
|
3
|
+
*
|
|
4
|
+
* 提供结构化的错误信息,包含:
|
|
5
|
+
* - message: 人类可读的错误描述
|
|
6
|
+
* - code: 错误代码(用于程序化判断)
|
|
7
|
+
* - exitCode: 进程退出码
|
|
8
|
+
*/
|
|
9
|
+
export declare class WeflowError extends Error {
|
|
10
|
+
code: string;
|
|
11
|
+
exitCode: number;
|
|
12
|
+
constructor(message: string, code?: string, exitCode?: number);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 统一错误处理函数。
|
|
16
|
+
*
|
|
17
|
+
* 根据错误类型输出对应的错误信息并以合适的退出码退出进程:
|
|
18
|
+
* - WeflowError: 使用其自带的 exitCode
|
|
19
|
+
* - 普通 Error: 视为未预期错误,退出码 1
|
|
20
|
+
* - 其他: 视为未知错误,退出码 1
|
|
21
|
+
*
|
|
22
|
+
* @param e 捕获到的错误对象
|
|
23
|
+
*/
|
|
24
|
+
export declare function handleError(e: unknown): void;
|
|
25
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,WAAY,SAAQ,KAAK;IAG3B,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,MAAM;gBAFvB,OAAO,EAAE,MAAM,EACR,IAAI,GAAE,MAAkB,EACxB,QAAQ,GAAE,MAAU;CAK9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAW5C"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WeflowError - weflow-cli 统一错误类
|
|
3
|
+
*
|
|
4
|
+
* 提供结构化的错误信息,包含:
|
|
5
|
+
* - message: 人类可读的错误描述
|
|
6
|
+
* - code: 错误代码(用于程序化判断)
|
|
7
|
+
* - exitCode: 进程退出码
|
|
8
|
+
*/
|
|
9
|
+
export class WeflowError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
exitCode;
|
|
12
|
+
constructor(message, code = 'UNKNOWN', exitCode = 1) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.exitCode = exitCode;
|
|
16
|
+
this.name = 'WeflowError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 统一错误处理函数。
|
|
21
|
+
*
|
|
22
|
+
* 根据错误类型输出对应的错误信息并以合适的退出码退出进程:
|
|
23
|
+
* - WeflowError: 使用其自带的 exitCode
|
|
24
|
+
* - 普通 Error: 视为未预期错误,退出码 1
|
|
25
|
+
* - 其他: 视为未知错误,退出码 1
|
|
26
|
+
*
|
|
27
|
+
* @param e 捕获到的错误对象
|
|
28
|
+
*/
|
|
29
|
+
export function handleError(e) {
|
|
30
|
+
if (e instanceof WeflowError) {
|
|
31
|
+
console.error(`[weflow-cli] ${e.message}`);
|
|
32
|
+
process.exit(e.exitCode);
|
|
33
|
+
}
|
|
34
|
+
else if (e instanceof Error) {
|
|
35
|
+
console.error(`[weflow-cli] 未预期的错误: ${e.message}`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.error('[weflow-cli] 未知错误');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAG3B;IACA;IAHT,YACE,OAAe,EACR,OAAe,SAAS,EACxB,WAAmB,CAAC;QAE3B,KAAK,CAAC,OAAO,CAAC,CAAA;QAHP,SAAI,GAAJ,IAAI,CAAoB;QACxB,aAAQ,GAAR,QAAQ,CAAY;QAG3B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;IAC3B,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/pathUtils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUxD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
/**
|
|
3
|
+
* Expand "~" prefix to current user's home directory.
|
|
4
|
+
*/
|
|
5
|
+
export function expandHomePath(inputPath) {
|
|
6
|
+
const raw = String(inputPath || '').trim();
|
|
7
|
+
if (!raw)
|
|
8
|
+
return raw;
|
|
9
|
+
if (raw === '~')
|
|
10
|
+
return homedir();
|
|
11
|
+
if (/^~[\\/]/.test(raw)) {
|
|
12
|
+
return `${homedir()}${raw.slice(1)}`;
|
|
13
|
+
}
|
|
14
|
+
return raw;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=pathUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathUtils.js","sourceRoot":"","sources":["../../../src/utils/pathUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAA;IAEpB,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAA;IACjC,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACtC,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface PythonScriptResult {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
exitCode: number;
|
|
5
|
+
}
|
|
6
|
+
export interface PythonScriptError extends Error {
|
|
7
|
+
script: string;
|
|
8
|
+
stderr: string;
|
|
9
|
+
exitCode: number;
|
|
10
|
+
}
|
|
11
|
+
/** 获取项目根目录 */
|
|
12
|
+
export declare function getProjectRoot(): string;
|
|
13
|
+
/**
|
|
14
|
+
* 运行 Python 脚本,统一封装路径解析、参数序列化、错误处理。
|
|
15
|
+
*
|
|
16
|
+
* @param scriptName 脚本文件名(如 'biz_daily.py'),相对于 scripts/ 目录
|
|
17
|
+
* @param args 命令行参数数组
|
|
18
|
+
* @param options 可选配置
|
|
19
|
+
* @returns 脚本执行结果
|
|
20
|
+
* @throws PythonScriptError 当脚本执行失败时
|
|
21
|
+
*/
|
|
22
|
+
export declare function runPythonScript(scriptName: string, args?: string[], options?: {
|
|
23
|
+
cwd?: string;
|
|
24
|
+
timeout?: number;
|
|
25
|
+
env?: Record<string, string>;
|
|
26
|
+
}): Promise<PythonScriptResult>;
|
|
27
|
+
//# sourceMappingURL=pythonRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pythonRunner.d.ts","sourceRoot":"","sources":["../../../src/utils/pythonRunner.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAkB,SAAQ,KAAK;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,cAAc;AACd,wBAAgB,cAAc,IAAI,MAAM,CAcvC;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC7E,OAAO,CAAC,kBAAkB,CAAC,CAwB7B"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pythonRunner - 统一的 Python 脚本调用工具
|
|
3
|
+
*
|
|
4
|
+
* 消除 bin/weflow-cli.ts 中重复出现的 execFile 调用模式,
|
|
5
|
+
* 统一封装路径解析、参数序列化、错误处理。
|
|
6
|
+
*/
|
|
7
|
+
import { execFile } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import { dirname, join } from 'path';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
const execFileAsync = promisify(execFile);
|
|
13
|
+
/** 获取项目根目录 */
|
|
14
|
+
export function getProjectRoot() {
|
|
15
|
+
// 兼容 ESM 和 CJS
|
|
16
|
+
const possibleDirname = typeof __dirname !== 'undefined'
|
|
17
|
+
? __dirname
|
|
18
|
+
: dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
// 从 src/utils/ 或 bin/ 向上找到 package.json 所在目录
|
|
20
|
+
let dir = possibleDirname;
|
|
21
|
+
for (let i = 0; i < 5; i++) {
|
|
22
|
+
try {
|
|
23
|
+
if (existsSync(join(dir, 'package.json')))
|
|
24
|
+
return dir;
|
|
25
|
+
}
|
|
26
|
+
catch { }
|
|
27
|
+
dir = dirname(dir);
|
|
28
|
+
}
|
|
29
|
+
return possibleDirname;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 运行 Python 脚本,统一封装路径解析、参数序列化、错误处理。
|
|
33
|
+
*
|
|
34
|
+
* @param scriptName 脚本文件名(如 'biz_daily.py'),相对于 scripts/ 目录
|
|
35
|
+
* @param args 命令行参数数组
|
|
36
|
+
* @param options 可选配置
|
|
37
|
+
* @returns 脚本执行结果
|
|
38
|
+
* @throws PythonScriptError 当脚本执行失败时
|
|
39
|
+
*/
|
|
40
|
+
export async function runPythonScript(scriptName, args = [], options = {}) {
|
|
41
|
+
const projectRoot = getProjectRoot();
|
|
42
|
+
const scriptPath = join(projectRoot, 'scripts', scriptName);
|
|
43
|
+
const cwd = options.cwd || projectRoot;
|
|
44
|
+
try {
|
|
45
|
+
const { stdout, stderr } = await execFileAsync('python', [scriptPath, ...args], {
|
|
46
|
+
cwd,
|
|
47
|
+
timeout: options.timeout || 300000, // 默认 5 分钟
|
|
48
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
49
|
+
env: { ...process.env, ...options.env },
|
|
50
|
+
});
|
|
51
|
+
return { stdout, stderr, exitCode: 0 };
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
const error = Object.assign(new Error(`Python 脚本 ${scriptName} 执行失败: ${e.message}`), {
|
|
55
|
+
script: scriptName,
|
|
56
|
+
stderr: e.stderr || '',
|
|
57
|
+
exitCode: e.code || 1,
|
|
58
|
+
});
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=pythonRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pythonRunner.js","sourceRoot":"","sources":["../../../src/utils/pythonRunner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAE/B,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAczC,cAAc;AACd,MAAM,UAAU,cAAc;IAC5B,eAAe;IACf,MAAM,eAAe,GAAG,OAAO,SAAS,KAAK,WAAW;QACtD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3C,6CAA6C;IAC7C,IAAI,GAAG,GAAG,eAAe,CAAA;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAA;QACvD,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,eAAe,CAAA;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,OAAiB,EAAE,EACnB,UAA4E,EAAE;IAE9E,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,WAAW,CAAA;IAEtC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE;YAC9E,GAAG;YACH,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM,EAAE,UAAU;YAC9C,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;YACpC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxC,CAAC,CAAA;QACF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IACxC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,KAAK,GAAsB,MAAM,CAAC,MAAM,CAC5C,IAAI,KAAK,CAAC,aAAa,UAAU,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,EACvD;YACE,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;YACtB,QAAQ,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;SACtB,CACF,CAAA;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将用户输入解析为 talker (wxid)。
|
|
3
|
+
*
|
|
4
|
+
* 支持: wxid_xxx / 群聊ID / 昵称 / 备注名 / 序号 [N] / 纯数字
|
|
5
|
+
*
|
|
6
|
+
* @throws {Error} 当输入无法解析到任何会话时
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveTalker(input: string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* 批量为 wxid 列表查找 displayName。
|
|
11
|
+
* 调用 chatService.listSessions 获取带昵称的会话列表。
|
|
12
|
+
*/
|
|
13
|
+
export declare function lookupDisplayNames(wxids: string[]): Promise<Map<string, string>>;
|
|
14
|
+
//# sourceMappingURL=talkerUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"talkerUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/talkerUtils.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDlE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAYtF"}
|