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.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/bin/weflow-cli-electron.cjs +59 -0
  4. package/bin/weflow-cli.ts +2311 -0
  5. package/cli.cjs +3 -0
  6. package/dist/bin/weflow-cli.d.ts +3 -0
  7. package/dist/bin/weflow-cli.d.ts.map +1 -0
  8. package/dist/bin/weflow-cli.js +2270 -0
  9. package/dist/bin/weflow-cli.js.map +1 -0
  10. package/dist/mcp-server/index.d.ts +3 -0
  11. package/dist/mcp-server/index.d.ts.map +1 -0
  12. package/dist/mcp-server/index.js +690 -0
  13. package/dist/mcp-server/index.js.map +1 -0
  14. package/dist/src/core/dbPathService.d.ts +40 -0
  15. package/dist/src/core/dbPathService.d.ts.map +1 -0
  16. package/dist/src/core/dbPathService.js +324 -0
  17. package/dist/src/core/dbPathService.js.map +1 -0
  18. package/dist/src/core/keyService.d.ts +59 -0
  19. package/dist/src/core/keyService.d.ts.map +1 -0
  20. package/dist/src/core/keyService.js +368 -0
  21. package/dist/src/core/keyService.js.map +1 -0
  22. package/dist/src/core/ntCore.d.ts +62 -0
  23. package/dist/src/core/ntCore.d.ts.map +1 -0
  24. package/dist/src/core/ntCore.js +191 -0
  25. package/dist/src/core/ntCore.js.map +1 -0
  26. package/dist/src/core/sqlcipherCore.d.ts +119 -0
  27. package/dist/src/core/sqlcipherCore.d.ts.map +1 -0
  28. package/dist/src/core/sqlcipherCore.js +693 -0
  29. package/dist/src/core/sqlcipherCore.js.map +1 -0
  30. package/dist/src/core/wcdbCore.d.ts +738 -0
  31. package/dist/src/core/wcdbCore.d.ts.map +1 -0
  32. package/dist/src/core/wcdbCore.js +4545 -0
  33. package/dist/src/core/wcdbCore.js.map +1 -0
  34. package/dist/src/core/wechatClient.d.ts +23 -0
  35. package/dist/src/core/wechatClient.d.ts.map +1 -0
  36. package/dist/src/core/wechatClient.js +166 -0
  37. package/dist/src/core/wechatClient.js.map +1 -0
  38. package/dist/src/services/chatService.d.ts +25 -0
  39. package/dist/src/services/chatService.d.ts.map +1 -0
  40. package/dist/src/services/chatService.js +291 -0
  41. package/dist/src/services/chatService.js.map +1 -0
  42. package/dist/src/services/configService.d.ts +43 -0
  43. package/dist/src/services/configService.d.ts.map +1 -0
  44. package/dist/src/services/configService.js +156 -0
  45. package/dist/src/services/configService.js.map +1 -0
  46. package/dist/src/services/exportService.d.ts +30 -0
  47. package/dist/src/services/exportService.d.ts.map +1 -0
  48. package/dist/src/services/exportService.js +273 -0
  49. package/dist/src/services/exportService.js.map +1 -0
  50. package/dist/src/services/wechat-formatter.d.ts +69 -0
  51. package/dist/src/services/wechat-formatter.d.ts.map +1 -0
  52. package/dist/src/services/wechat-formatter.js +248 -0
  53. package/dist/src/services/wechat-formatter.js.map +1 -0
  54. package/dist/src/services/wechatMessageService.d.ts +28 -0
  55. package/dist/src/services/wechatMessageService.d.ts.map +1 -0
  56. package/dist/src/services/wechatMessageService.js +341 -0
  57. package/dist/src/services/wechatMessageService.js.map +1 -0
  58. package/dist/src/services/wereadService.d.ts +206 -0
  59. package/dist/src/services/wereadService.d.ts.map +1 -0
  60. package/dist/src/services/wereadService.js +145 -0
  61. package/dist/src/services/wereadService.js.map +1 -0
  62. package/dist/src/services/whitelistService.d.ts +20 -0
  63. package/dist/src/services/whitelistService.d.ts.map +1 -0
  64. package/dist/src/services/whitelistService.js +60 -0
  65. package/dist/src/services/whitelistService.js.map +1 -0
  66. package/dist/src/types.d.ts +140 -0
  67. package/dist/src/types.d.ts.map +1 -0
  68. package/dist/src/types.js +2 -0
  69. package/dist/src/types.js.map +1 -0
  70. package/dist/src/utils/errors.d.ts +25 -0
  71. package/dist/src/utils/errors.d.ts.map +1 -0
  72. package/dist/src/utils/errors.js +43 -0
  73. package/dist/src/utils/errors.js.map +1 -0
  74. package/dist/src/utils/pathUtils.d.ts +5 -0
  75. package/dist/src/utils/pathUtils.d.ts.map +1 -0
  76. package/dist/src/utils/pathUtils.js +16 -0
  77. package/dist/src/utils/pathUtils.js.map +1 -0
  78. package/dist/src/utils/pythonRunner.d.ts +27 -0
  79. package/dist/src/utils/pythonRunner.d.ts.map +1 -0
  80. package/dist/src/utils/pythonRunner.js +62 -0
  81. package/dist/src/utils/pythonRunner.js.map +1 -0
  82. package/dist/src/utils/talkerUtils.d.ts +14 -0
  83. package/dist/src/utils/talkerUtils.d.ts.map +1 -0
  84. package/dist/src/utils/talkerUtils.js +73 -0
  85. package/dist/src/utils/talkerUtils.js.map +1 -0
  86. package/mcp-server/index.ts +757 -0
  87. package/package.json +72 -0
  88. package/resources/key/win32/x64/wx_key.dll +0 -0
  89. package/resources/wcdb/win32/x64/SDL2.dll +0 -0
  90. package/resources/wcdb/win32/x64/WCDB.dll +0 -0
  91. package/resources/wcdb/win32/x64/msvcp140.dll +0 -0
  92. package/resources/wcdb/win32/x64/msvcp140_1.dll +0 -0
  93. package/resources/wcdb/win32/x64/vcruntime140.dll +0 -0
  94. package/resources/wcdb/win32/x64/vcruntime140_1.dll +0 -0
  95. package/resources/wcdb/win32/x64/wcdb_api.dll +0 -0
  96. package/scripts/_batch_link_sources.py +73 -0
  97. package/scripts/_utils.py +531 -0
  98. package/scripts/annual_report.py +796 -0
  99. package/scripts/auto_tag.py +128 -0
  100. package/scripts/biz_daily.py +896 -0
  101. package/scripts/chat_report.py +397 -0
  102. package/scripts/chat_stats.py +702 -0
  103. package/scripts/classify_daily.py +411 -0
  104. package/scripts/compile_wiki.py +258 -0
  105. package/scripts/create_reading_notes.py +370 -0
  106. package/scripts/enrich_backlinks.py +163 -0
  107. package/scripts/export_chat_html.py +766 -0
  108. package/scripts/extract_3x_key.py +86 -0
  109. package/scripts/extract_todos.py +404 -0
  110. package/scripts/fav_server.py +392 -0
  111. package/scripts/fix_topics.py +111 -0
  112. package/scripts/generate_ai_report.py +367 -0
  113. package/scripts/generate_html.py +1372 -0
  114. package/scripts/generate_review.py +170 -0
  115. package/scripts/mcp_bridge.py +398 -0
  116. package/scripts/nt_decrypt.py +562 -0
  117. package/scripts/pipeline.py +145 -0
  118. package/scripts/promote_all.py +310 -0
  119. package/scripts/promote_ideas.py +297 -0
  120. package/scripts/rag_chat.py +191 -0
  121. package/scripts/scan_decrypt_4x.py +329 -0
  122. package/scripts/semantic_search.py +431 -0
  123. package/scripts/sync_fav.py +146 -0
  124. package/scripts/sync_weread.py +192 -0
  125. package/scripts/vault_rag.py +139 -0
  126. package/scripts/vault_search.py +141 -0
  127. package/src/core/dbPathService.ts +348 -0
  128. package/src/core/keyService.ts +409 -0
  129. package/src/core/ntCore.ts +224 -0
  130. package/src/core/sqlcipherCore.ts +764 -0
  131. package/src/core/wcdbCore.ts +4568 -0
  132. package/src/core/wechatClient.ts +204 -0
  133. package/src/lz4.d.ts +10 -0
  134. package/src/services/chatService.ts +296 -0
  135. package/src/services/configService.ts +197 -0
  136. package/src/services/exportService.ts +305 -0
  137. package/src/services/wechat-formatter.ts +348 -0
  138. package/src/services/wechatMessageService.ts +383 -0
  139. package/src/services/wereadService.ts +308 -0
  140. package/src/services/whitelistService.ts +72 -0
  141. package/src/types.ts +141 -0
  142. package/src/utils/errors.ts +42 -0
  143. package/src/utils/pathUtils.ts +16 -0
  144. package/src/utils/pythonRunner.ts +81 -0
  145. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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,5 @@
1
+ /**
2
+ * Expand "~" prefix to current user's home directory.
3
+ */
4
+ export declare function expandHomePath(inputPath: string): string;
5
+ //# sourceMappingURL=pathUtils.d.ts.map
@@ -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"}