weflow-cli 1.10.0 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,11 +5,54 @@ export interface ExportResult {
5
5
  count?: number;
6
6
  error?: string;
7
7
  }
8
+ /**
9
+ * md 导出落盘的媒体清单:`<output>/<talker>_assets/manifest.json`(`local_id:create_time` → 条目)。
10
+ *
11
+ * 这是"其余格式也能带图/带文件"的那一半:**md 导出抽取媒体,json/txt/excel 消费同一份清单** —— 匹配
12
+ * 逻辑(缓存缩略图、资源 md5、原图那档、`msg/file` 里的文档本体)只存在于 Python 那条路上,在这里重写
13
+ * 一遍必然与它漂移。读不到就返回空表:那说明还没跑过 md/`--media` 导出,行为与从前一致。
14
+ */
15
+ export interface MediaRecord {
16
+ /** 相对输出目录的路径;`kind: 'file'` 时指向 `files/` 下的文档。 */
17
+ path: string;
18
+ kind: 'image' | 'file';
19
+ /** 文档的原始文件名(图片没有)。 */
20
+ name?: string;
21
+ }
22
+ /**
23
+ * 从清单里取这条消息的媒体条目。
24
+ *
25
+ * 键是 `local_id:create_time`:**local_id 会在分片之间重复**(同一会话的表可能存在于多个分片,
26
+ * 各片自己编号),只按 local_id 查会让 json/txt/excel 引用到别的消息的图。两条消息硬要同 id 同秒
27
+ * 才算撞上,那个概率可以忽略;回退查裸 local_id 是为了兼容更早写出的清单。
28
+ */
29
+ export declare function mediaFor(manifest: Record<string, MediaRecord>, message: {
30
+ localId?: unknown;
31
+ createTime?: unknown;
32
+ }): MediaRecord | undefined;
33
+ export declare function readMediaManifest(outputDir: string, talker: string): Record<string, MediaRecord>;
8
34
  export declare class ExportService {
9
35
  exportJson(talker: string, outputDir: string, limit?: number, from?: number, to?: number, contract?: ExportContract): Promise<ExportResult>;
10
36
  exportTxt(talker: string, outputDir: string, limit?: number, from?: number, to?: number): Promise<ExportResult>;
11
37
  exportHtml(talker: string, outputDir: string, limit?: number, date?: string, from?: number, to?: number, quiet?: boolean, options?: {
12
38
  fullImages?: boolean;
39
+ format?: 'html' | 'md';
40
+ assetsOnly?: boolean;
41
+ }): Promise<ExportResult>;
42
+ /**
43
+ * 只抽媒体(图片与文档落盘 + 清单),不产出正文 —— `export … json|txt|excel --media` 先跑这一步。
44
+ * 与 markdown 导出共用同一条 Python 通路与同一个资产目录,所以清单只有一份。
45
+ *
46
+ * `limit`/`date` 必须跟着调用方走:抽取原本固定按"整个会话"跑,而消费它的 json/txt/excel 是按
47
+ * `--limit` 切片的 —— `--limit 200` 于是把整段历史的媒体都抽出来(文档还要拷成文件),
48
+ * 实测 67 份里只有 33 份落在导出的 200 条里。
49
+ */
50
+ extractMedia(talker: string, outputDir: string, quiet?: boolean, options?: {
51
+ fullImages?: boolean;
52
+ }, limit?: number, date?: string): Promise<ExportResult>;
53
+ /** markdown + 图片落盘到 `<output>/<talker>_assets/`(同一条 Python 通路,换个输出形态)。 */
54
+ exportMarkdown(talker: string, outputDir: string, limit?: number, date?: string, from?: number, to?: number, quiet?: boolean, options?: {
55
+ fullImages?: boolean;
13
56
  }): Promise<ExportResult>;
14
57
  private exportHtmlBasic;
15
58
  exportExcel(talker: string, outputDir: string, limit?: number, from?: number, to?: number): Promise<ExportResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"exportService.d.ts","sourceRoot":"","sources":["../../../src/services/exportService.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,WAAW,CAAA;AAChD,MAAM,WAAW,YAAY;IAAG,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAOjG,qBAAa,aAAa;IAClB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAsB,GAAG,OAAO,CAAC,YAAY,CAAC;IAuB7I,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAuB1G,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,SAAK,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,UAAQ,EAAE,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,YAAY,CAAC;YAgIrK,eAAe;IAavB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA8ClH,OAAO,CAAC,SAAS;IA8CjB,OAAO,CAAC,oBAAoB;IAsD5B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,eAAe;CAOxB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAA"}
1
+ {"version":3,"file":"exportService.d.ts","sourceRoot":"","sources":["../../../src/services/exportService.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,WAAW,CAAA;AAChD,MAAM,WAAW,YAAY;IAAG,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAIjG;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,WAAW,GAAG,SAAS,CAG7I;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAsBhG;AAWD,qBAAa,aAAa;IAClB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAsB,GAAG,OAAO,CAAC,YAAY,CAAC;IAoC7I,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA4B1G,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,SAAK,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,UAAQ,EAAE,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAoJjO;;;;;;;OAOG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,UAAQ,EAAE,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,EAAE,KAAK,SAAI,EAAE,IAAI,SAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IAKzJ,0EAA0E;IACpE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,SAAK,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,UAAQ,EAAE,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,YAAY,CAAC;YAIzK,eAAe;IAavB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkDlH,OAAO,CAAC,SAAS;IA8CjB,OAAO,CAAC,oBAAoB;IAsD5B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,eAAe;CAOxB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { join, dirname } from 'path';
2
- import { existsSync, mkdirSync, writeFileSync } from 'fs';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
3
3
  import { execFile } from 'child_process';
4
4
  import { promisify } from 'util';
5
5
  import { chatService } from './chatService.js';
@@ -10,9 +10,53 @@ import { createWeFlowEnvelope } from './messageContract.js';
10
10
  import { parseLocalDateOrIso } from '../utils/dateRange.js';
11
11
  import { resolvePackageRoot } from '../utils/packageRoot.js';
12
12
  const execFileAsync = promisify(execFile);
13
+ /**
14
+ * 从清单里取这条消息的媒体条目。
15
+ *
16
+ * 键是 `local_id:create_time`:**local_id 会在分片之间重复**(同一会话的表可能存在于多个分片,
17
+ * 各片自己编号),只按 local_id 查会让 json/txt/excel 引用到别的消息的图。两条消息硬要同 id 同秒
18
+ * 才算撞上,那个概率可以忽略;回退查裸 local_id 是为了兼容更早写出的清单。
19
+ */
20
+ export function mediaFor(manifest, message) {
21
+ const id = String(message.localId);
22
+ return manifest[`${id}:${message.createTime}`] ?? manifest[id];
23
+ }
24
+ export function readMediaManifest(outputDir, talker) {
25
+ try {
26
+ const file = join(outputDir, `${talker}_assets`, 'manifest.json');
27
+ if (!existsSync(file))
28
+ return {};
29
+ const data = JSON.parse(readFileSync(file, 'utf8'));
30
+ const map = data && data.messages;
31
+ if (!map || typeof map !== 'object')
32
+ return {};
33
+ // v1 的值是裸字符串(只有图片),v2 起是带 `kind` 的对象。升级不该让磁盘上已有的清单失效 ——
34
+ // 用户不会因为升了个版本就重跑一次导出。
35
+ const normalized = {};
36
+ for (const [key, value] of Object.entries(map)) {
37
+ if (typeof value === 'string') {
38
+ normalized[key] = { path: value, kind: 'image' };
39
+ }
40
+ else if (value && typeof value === 'object' && typeof value.path === 'string') {
41
+ const record = value;
42
+ normalized[key] = { ...record, kind: record.kind === 'file' ? 'file' : 'image' };
43
+ }
44
+ }
45
+ return normalized;
46
+ }
47
+ catch {
48
+ return {};
49
+ }
50
+ }
13
51
  function getPackageRoot() {
14
52
  return resolvePackageRoot(import.meta.url);
15
53
  }
54
+ /** txt/excel 共用的文字标签:文档要带上原名,光一个相对路径看不出那是什么东西。 */
55
+ function mediaLabel(record) {
56
+ if (!record)
57
+ return '';
58
+ return record.kind === 'file' ? `${record.name || record.path} (${record.path})` : record.path;
59
+ }
16
60
  export class ExportService {
17
61
  async exportJson(talker, outputDir, limit = 0, from, to, contract = 'raw') {
18
62
  try {
@@ -22,13 +66,27 @@ export class ExportService {
22
66
  }
23
67
  const dir = this.ensureOutputDir(outputDir);
24
68
  const filePath = join(dir, `${talker}_messages.json`);
69
+ // 有清单就带上媒体相对路径(清单由 markdown 导出产生,见 readMediaManifest)
70
+ const mediaMap = readMediaManifest(dir, talker);
71
+ const withMedia = Object.keys(mediaMap).length
72
+ ? messages.map(m => {
73
+ const media = mediaFor(mediaMap, m);
74
+ // `media` 保持"相对路径字符串"这个老形状(已有消费方按字符串读);`mediaKind`/`mediaName`
75
+ // 是新增的 —— 不带这两项,读 JSON 的人只能靠扩展名猜这是图片还是文档,而导出明明知道。
76
+ if (!media)
77
+ return m;
78
+ return media.kind === 'file'
79
+ ? { ...m, media: media.path, mediaKind: media.kind, mediaName: media.name }
80
+ : { ...m, media: media.path, mediaKind: media.kind };
81
+ })
82
+ : messages;
25
83
  const payload = contract === 'weflow-v1'
26
- ? createWeFlowEnvelope(messages, new Date().toISOString(), {
84
+ ? createWeFlowEnvelope(withMedia, new Date().toISOString(), {
27
85
  requestedFrom: from,
28
86
  requestedTo: to,
29
87
  requestedLimit: limit,
30
88
  })
31
- : messages;
89
+ : withMedia;
32
90
  writeFileSync(filePath, JSON.stringify(payload, null, 2), 'utf8');
33
91
  return { success: true, path: filePath, count: messages.length };
34
92
  }
@@ -42,10 +100,15 @@ export class ExportService {
42
100
  if (messages.length === 0) {
43
101
  return { success: false, error: '未找到消息' };
44
102
  }
103
+ const mediaMap = readMediaManifest(this.ensureOutputDir(outputDir), talker);
45
104
  const lines = messages.map(m => {
46
105
  const time = new Date(m.createTime * 1000).toLocaleString('zh-CN');
47
106
  const sender = m.isSend ? '我' : (m.senderUsername || talker);
48
- const content = m.parsedContent || m.rawContent || '';
107
+ // 有清单就把 `[图片]` / `[文件] 名字` 换成能直接打开的引用,没有就保持原样
108
+ const media = mediaFor(mediaMap, m);
109
+ const content = media
110
+ ? (media.kind === 'file' ? `[文件: ${mediaLabel(media)}]` : `[图片: ${media.path}]`)
111
+ : (m.parsedContent || m.rawContent || '');
49
112
  return `[${time}] ${sender}: ${content}`;
50
113
  });
51
114
  const dir = this.ensureOutputDir(outputDir);
@@ -58,6 +121,11 @@ export class ExportService {
58
121
  }
59
122
  }
60
123
  async exportHtml(talker, outputDir, limit = 0, date = '', from, to, quiet = false, options = {}) {
124
+ const format = options.format ?? 'html';
125
+ if (format === 'md' && (from !== undefined || to !== undefined)) {
126
+ // 不静默降级成「导出全部」:范围是调用方明确要的,做不到就说出来。
127
+ return { success: false, error: 'markdown 导出暂不支持 --from/--to:请用 --date,或整段导出' };
128
+ }
61
129
  try {
62
130
  if (from !== undefined || to !== undefined) {
63
131
  return this.exportHtmlBasic(talker, outputDir, limit, from, to);
@@ -73,6 +141,9 @@ export class ExportService {
73
141
  // dormant and exports stop at the first shard's last message.
74
142
  const passphrase = configService.get('favPassphrase') || cfg.decryptKey || '';
75
143
  if (!db || !key || !salt) {
144
+ if (format === 'md') {
145
+ return { success: false, error: 'markdown 导出需要已配置的数据库与密钥(这条路没有简版回退)' };
146
+ }
76
147
  // Fallback: basic HTML
77
148
  let fallbackFrom = from;
78
149
  let fallbackTo = to;
@@ -101,11 +172,18 @@ export class ExportService {
101
172
  }
102
173
  }
103
174
  catch { }
104
- const args = [
105
- script,
175
+ const args = [script];
176
+ if (format === 'md') {
177
+ // 图片落盘 + 清单。资产目录按 **talker** 命名,好让 json/txt/excel 导出能确定性找到它
178
+ // (它们的文件前缀是 talker,而 md 文件名用的是显示名,不显式指定就对不上)。
179
+ args.push('--format', 'md', '--assets-dir', join(outputDir || './output', `${talker}_assets`));
180
+ if (options.assetsOnly)
181
+ args.push('--assets-only');
182
+ }
183
+ else {
106
184
  // Paginate: a whole year of chat in one file makes the browser crawl.
107
- '--per-page', '100',
108
- ];
185
+ args.push('--per-page', '100');
186
+ }
109
187
  const ownWxid = String(cfg.wxid || '').trim();
110
188
  const exportCacheDir = cacheDir && existsSync(cacheDir) ? cacheDir : undefined;
111
189
  const exportAccountDir = accountDir && existsSync(accountDir) ? accountDir : undefined;
@@ -179,10 +257,33 @@ export class ExportService {
179
257
  if (date) {
180
258
  return { success: false, error: `指定日期导出失败: ${failure}` };
181
259
  }
182
- // Fallback to basic HTML
260
+ if (format === 'md') {
261
+ // markdown 没有「简版」:回退成 HTML 会让调用方以为拿到了 .md。失败就是失败。
262
+ return { success: false, error: failure };
263
+ }
264
+ // Fallback to basic HTML:**这条回退不带内嵌图片**,调用方得知道 ——
265
+ // 2026-10-13 实测:Python 因一个 AttributeError 退出后,这里静默回退,
266
+ // 而 CLI 照样打印「✓ 导出成功」,人只会以为导出正常。
267
+ if (!quiet)
268
+ console.error(' ⚠ 已回退到简版 HTML(不含内嵌图片)');
183
269
  return this.exportHtmlBasic(talker, outputDir, limit, from, to);
184
270
  }
185
271
  }
272
+ /**
273
+ * 只抽媒体(图片与文档落盘 + 清单),不产出正文 —— `export … json|txt|excel --media` 先跑这一步。
274
+ * 与 markdown 导出共用同一条 Python 通路与同一个资产目录,所以清单只有一份。
275
+ *
276
+ * `limit`/`date` 必须跟着调用方走:抽取原本固定按"整个会话"跑,而消费它的 json/txt/excel 是按
277
+ * `--limit` 切片的 —— `--limit 200` 于是把整段历史的媒体都抽出来(文档还要拷成文件),
278
+ * 实测 67 份里只有 33 份落在导出的 200 条里。
279
+ */
280
+ async extractMedia(talker, outputDir, quiet = false, options = {}, limit = 0, date = '') {
281
+ return this.exportHtml(talker, outputDir, limit, date, undefined, undefined, quiet, { ...options, format: 'md', assetsOnly: true });
282
+ }
283
+ /** markdown + 图片落盘到 `<output>/<talker>_assets/`(同一条 Python 通路,换个输出形态)。 */
284
+ async exportMarkdown(talker, outputDir, limit = 0, date = '', from, to, quiet = false, options = {}) {
285
+ return this.exportHtml(talker, outputDir, limit, date, from, to, quiet, { ...options, format: 'md' });
286
+ }
186
287
  async exportHtmlBasic(talker, outputDir, limit = 0, from, to) {
187
288
  const messages = await chatService.getMessagesInRange(talker, limit, from, to);
188
289
  if (messages.length === 0) {
@@ -213,15 +314,19 @@ export class ExportService {
213
314
  { header: '发送者', key: 'sender', width: 15 },
214
315
  { header: '类型', key: 'type', width: 10 },
215
316
  { header: '内容', key: 'content', width: 80 },
216
- { header: '消息ID', key: 'msgId', width: 15 }
317
+ { header: '消息ID', key: 'msgId', width: 15 },
318
+ // 有清单时填相对路径(清单由 markdown 导出产生)
319
+ { header: '媒体', key: 'media', width: 40 }
217
320
  ];
321
+ const mediaMap = readMediaManifest(this.ensureOutputDir(outputDir), talker);
218
322
  for (const m of messages) {
219
323
  sheet.addRow({
220
324
  time: new Date(m.createTime * 1000).toLocaleString('zh-CN'),
221
325
  sender: m.isSend ? '我' : (m.senderUsername || talker),
222
326
  type: this.getMessageTypeName(m.localType),
223
327
  content: m.parsedContent || m.rawContent || '',
224
- msgId: m.localId
328
+ msgId: m.localId,
329
+ media: mediaLabel(mediaFor(mediaMap, m))
225
330
  });
226
331
  }
227
332
  const dir = this.ensureOutputDir(outputDir);
@@ -1 +1 @@
1
- {"version":3,"file":"exportService.js","sourceRoot":"","sources":["../../../src/services/exportService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exportService.js","sourceRoot":"","sources":["../../../src/services/exportService.ts"],"names":[],"mappings":"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"}
@@ -330,6 +330,27 @@ AI 调用前应生成不含正文的预览,说明数据范围、是否联网
330
330
  就发 `{success:false, code:'INVALID_ARGUMENT', error:'<commander 那句>'}`。**代价**是 `--help` / `--version`
331
331
  也走同一条出口,而全库的 `--help` 调用面很宽(含 `scripts/check_readme_commands.py` 那 277+ 条文档命令),
332
332
  所以要先有一条覆盖 `--help`/`--version` 的判据再动 —— 否则把帮助信息弄坏的后果比这点收益大得多。
333
+ 9. ~~**markdown 导出(连图一起)**~~ **已做(2026-10-13)**:`export … md` 走 Python 那条路
334
+ (`--format md`),图片落盘到 `<输出>/<会话>_assets/`、正文用相对路径引用,并写一份 `manifest.json`;
335
+ 同目录里再导出 `json`/`txt`/`excel` 会自动带上同样的路径(`media` 字段 / `[图片: …]` / 「媒体」列)。
336
+ 实现上**没有**在 TS 里重写匹配逻辑 —— 那样两份实现必然漂移。
337
+ 落地时踩到两件值得记住的事:清单原本按 `local_id` 做键,而**它在分片之间会重复**(1,914 条里 763 条
338
+ 撞上 522 个条目 ⇒ 非 md 格式会引用到别人的图),改成 `local_id:create_time` 后四种格式一致在 556;
339
+ 以及 **Python 失败时 TS 回退成简版 HTML、CLI 仍打印「✓ 导出成功」**(失败伪装成成功)—— md 现在没有
340
+ 静默回退,HTML 的回退会往 stderr 说明它丢了图片。
341
+ 10. ~~**导出文件本体(`.pdf`/`.docx`/`.xlsx`…)**~~ **已做(2026-10-13)**:`md` 与 `json|txt|excel --media`
342
+ 会把文档本体**按原名与扩展名**拷进 `<输出>/<会话>_assets/files/`,md 正文按原名链接到 `files/` 下,
343
+ 其余格式经同一份清单带上(`mediaKind`/`mediaName`、`[文件: …]`、「媒体」列)。
344
+ "消息 → 文件"的链路实测清楚了,与图片那套**不同**:文件消息(appmsg `type=6`)只有名字/md5/大小,
345
+ 本体在账号目录 `msg/file/YYYY-MM/` 下且**与 talker 无关**(按月分目录、目录里没有会话痕迹),
346
+ 所以索引是**只 stat 的** `(归一化名, 字节数)`,多候选才用 md5 消歧(磁盘名常带微信加的 `(1)`)。
347
+ 本机实测 1,855 条文件消息,1,489 条唯一命中 + 154 条 md5 认下 = **88.6%**,212 条本地没有
348
+ (未下载/已清理)—— 不猜,计数照实报。
349
+ 两处坑:`<refermsg>`(引用原文)嵌在 `<appmsg>` **内部**,满文档搜首个同名标签会把引用里的
350
+ `<type>6</type>` 当成这条消息的文件(首次测量 7,083 条"像文件"里绝大多数是引用)⇒ 改为只取
351
+ `<appmsg>` 的**直接子元素**;以及"新拷贝数"被当成"导出数"(第二次跑打印「0 document(s)」而 67 份
352
+ 就在磁盘上)⇒ 拆成 `exported` 与 `written`。
353
+ 仍然**不做**的:HTML 不嵌文件本体(单文件可分享的用法下,内嵌几 MB 的 PDF 没有意义),语音/视频仍只有标签。
333
354
 
334
355
  首轮完成后,再根据实际失败记录决定是否进入阅读状态、AI 执行层和助手收发队列,避免在数据边界尚未稳定时继续扩大功能面。
335
356
 
@@ -127,7 +127,7 @@ few weeks. Each row is an index entry - the measurements and the reasoning live
127
127
 
128
128
  | Not verified | Why not here | What closing it would take |
129
129
  | --- | --- | --- |
130
- | The **semantic (vector) search path** (D-105) | The index has never existed on this machine, and building one needs `dashscopeApiKey` **and** spends embedding credit - so the per-line mask is pinned against a hand-made index, and the real-data checks used the keyword fallback (which is the path this machine actually takes). | One `search-index --yes`, then the same scoped checks re-run against the real index. |
130
+ | The **semantic (vector) search path** (D-105) | **Partly closed on 2026-10-13**: the index now exists (built with a 7-day chat / 3-article window - 749 records, inside DashScope's free quota) and the vector path has been exercised for real, per line (`indexCounts` 383 + 366 = 749). Still open: the **default 90/30 window** was never built (it exceeds the free quota; measured cost ≈ ¥1.3-2.2), and the **rerank layer cannot run on this machine** - it calls Typesafe (`api.typesafe.ai`) and answers `HTTP 451: Typesafe is not available in your region`, so the default path here is the un-reranked one. | Two things, both cheap but not done here: (a) decide whether the degraded search should stay byte-identical to a successful un-reranked one - `rerank` returns only the list, so nothing in the JSON says it failed; (b) build the 90/30 window if the small one proves useful. |
131
131
  | `update\update.data`'s **internal format** (D-107) | The report reverse-engineered the loader but not this file, and the file does not exist here. When it does exist the loaded build may not be the one the command line names, so `check` **states that** instead of guessing. | A machine where the file exists. |
132
132
  | The **version token ↔ dotted version** mapping (D-107) | The **low 16 bits are decoded** (2026-10-11): byte 3 is the fourth component, byte 2 is the third `+ 0x10` - both known pairs agree. The high 16 bits are `F254` on both, and both versions are `4.1.x`, so major/minor cannot be separated with two samples (n=2: "both fit", not "solved"). | More (build, token) pairs, or the encoder. `update\download` and `update\patch` are empty on this machine, and the client's `log/*.xlog` (53 files, 373 MB) is **not plain text**: grep for the token there returns 0 matches, which is a **false negative** rather than evidence, and single-byte-XOR zlib/zstd does not unlock it either. The falsifiable prediction to test: `4.1.15.11 → 0xF2541F0B`. |
133
133
  | The MMKV stores under `%APPDATA%\Tencent\xwechat\radium\mmkv\` (D-101) | Their format holds (crc32 precondition passes; one is empty), but the only key we can construct does not open them, and the `config/` root key is random and was never captured. | **Deliberately not attempted**: the remaining route is injecting into the client process, which this repo does not do (D-101). |
@@ -164,6 +164,8 @@ Documentation was synchronized with the current source baseline on 2026-09-19. C
164
164
 
165
165
  - Issue #7 remains open pending reporter verification. HTML emoji export preserves the emoji label and matches resource records only by nonzero server-message identity; local IDs are not unique across shards or conversations. WeChat 4.x V2 image containers are decoded with an account-specific media key derived from local `kvcomm` data and verified against a real cached V2 header. Remote emoticons use AES-CBC with the message key as both key and IV. Entity-escaped emoji XML is normalized before extracting MD5 and media URLs; failed encrypted downloads fall back across available thumbnail/CDN fields. Signature-only default `[打脸]` messages use the bundled official Facepalm asset when no message-specific resource is available. Forwarded app cards remain structured links with available covers, and Bilibili share pages can resolve covers through their BV metadata endpoint when no `og:image` is present. Forty-two synthetic Python regression tests (`export_chat_media_test.py`, `export_chat_media_report_test.py`) cover these paths; run `python -m unittest discover -s test -p '*_test.py' -v`. CI also runs these tests. This does not establish compatibility with every real WeChat media format.
166
166
 
167
+ - **Media leaves the export as files now, images and documents alike, and the matching happens once.** `export … md` writes images to `<output>/<talker>_assets/` and references them relatively; `export … json|txt|excel --media` runs the same Python extraction and then writes the requested format against the same `manifest.json`. The switch existed because a reporter asked whether the non-HTML formats omitted images *and documents* - images had just been fixed, documents had not, and **no format exported a document body** (the HTML page showed `[文件] <name>`). Documents are file-message appmsg `type=6`: the row carries only name/md5/size, and the body sits in the account directory's `msg/file/YYYY-MM/` **with no per-conversation directory**, so the index is a stat-only `(normalized name, byte size)` lookup and md5 disambiguates only when a name is ambiguous (WeChat appends its own `(1)`). Measured on this machine: 1,855 file messages, 1,489 unique matches + 154 md5-resolved = **88.6%**, and the remaining 212 have no local body at all (never downloaded, or cleaned up) - those stay as `[文件] name` labels and are *counted*, not guessed (D-014). Bodies are copied under their original names and extensions; the manifest is `weflow-media-manifest/v2` (values carry `kind`) and v1 files still read. Two traps are worth keeping: `<refermsg>` sits **inside** `<appmsg>`, so searching the XML for the first matching tag reported 7,083 "files" that were nearly all quoted text (the parser now reads `<appmsg>`'s direct children only); and a count of newly copied files was reported as the number of documents exported, so a second run into the same directory printed "0 document(s)" with 67 documents on disk. **HTML deliberately embeds no document bodies** (a multi-MB PDF as base64 in a page nobody can open), and voice/video still have labels only.
168
+
167
169
  - WeChat platform behavior, database formats, account restrictions, and terms can change without notice. Local operation is not a legal, account-safety, or platform-compatibility guarantee.
168
170
  - **The daily is no longer all-or-nothing.** It fetches every article before writing anything and the bodies lived only in memory, so any interruption threw the whole day away - a 400-article day is over an hour of fetching, and the 2026-09-22 run stopped at 105/403 with nothing written. Bodies are now cached under `output/.cache/fetch/` keyed by URL, so a re-run fetches only the missing ones (measured: a resumed batch of 3 goes from 64 s to 2.0 s, and cache hits take **no** throttle sleep because they send no request - the throttle exists to spare the upstream, and this is the same direction). Only successes are cached, so a failure is retried next time rather than remembered. `--no-fetch-cache` forces a refetch. **The lesson that made this urgent**: a long single-shot run is a gamble, and `cmd | tee log` reports the wrapper's exit code, not the program's - the 105/403 failure looked like `exit 0`.
169
171
  - Where a many-source day spends its time is now measured rather than assumed, and two of the three biggest items have been fixed. A 190-article day **was** ~3 h 10 m: fetching bodies ~130 min, the deliberate 8-12 s inter-article throttle ~32 min, image downloads ~18 min (47 image links per three articles, 0.37 s and 135 KB each, sequential), and the serial summary loop ~9 min (measured 2.27/2.92/2.45 s per article, plus 0.3 s each). It is now ~1 h 5 m: fetching ~33 min (gzip, below), throttle ~32 min, images ~3 min (6-way concurrent), summaries ~2 min (6-way concurrent). Classification was never a factor - already concurrent. **The throttle is now the largest single item, and it is the one thing left that is deliberate** ("reduce upstream pressure"); the other two costs were implementation choices, not policy. Both new concurrency settings are 6 (`IMAGE_WORKERS`, `SUMMARY_WORKERS`), matching `JEV_WORKERS`.
package/docs/RELEASING.md CHANGED
@@ -21,6 +21,19 @@ npm 包与 GitHub 分开发布,中间隔多久都不奇怪——`1.5.0` 与主
21
21
  已备好但**从未发布**的版本号可以并进下一个:`1.5.1` 准备过却没发,
22
22
  它的修复就直接并进了 `1.6.0`。
23
23
 
24
+ **改 `package.json` 的版本号时必须同时改 `package-lock.json`**(lockfileVersion 3 里有两个地方:
25
+ 顶层的 `version` 与 `packages[""].version`)。**2026-10-13 发 1.11.0 时就是这么红了一次**:包已经发出去、
26
+ tag 也打了,`release-consistency` 才报「版本号与锁文件必须一致」—— 我本地只跑了 build/test/文档命令检查,
27
+ 而这三样都不看锁文件。发布物本身没问题(`files` 白名单里没有锁文件),但 master 的 CI 红了。
28
+
29
+ ```powershell
30
+ node -p "require('./package.json').version" # 两个必须相等
31
+ node -p "require('./package-lock.json').version"
32
+ ```
33
+
34
+ 顺手验一下锁文件没跑偏(只写锁、不动 `node_modules`):
35
+ `npm install --package-lock-only --dry-run` —— 报 `up to date` 即可,那也正是 `npm ci` 会不会炸的判据。
36
+
24
37
  ## 2. 整理 CHANGELOG
25
38
 
26
39
  - 把 `## Unreleased` 改名为 `## <新版本号>`
@@ -216,6 +229,39 @@ npm view weflow-cli version --registry=https://registry.npmjs.org # 用官方
216
229
  ⚠️ 其中 **`logo.png` 与 `scripts/data/wechat_emoji.json` 两个文件当时确实没进包** —— 那正是
217
230
  1.10.0 修掉的缺口(同一件事,两条独立的路都指到它)。
218
231
  **结论:1.8.0 那个"发出去的文档再也回不来"没有在 1.9.0 重演** ✅
232
+ - **1.10.0 的出处核过了(2026-10-12,发布当天,三种证据)**:
233
+ 1. registry 上 `weflow-cli@1.10.0` 的 `dist.shasum` = `bb7604fe063d330360d00f89c19069367c509d7a`,与本机
234
+ `npm pack --dry-run` 报的是**同一个值** ⇒ 发出去的就是我构建的那一份;
235
+ 2. 从 registry 装进一个**空目录**(`npm install --no-save weflow-cli@1.10.0`),用**装好的那份**跑
236
+ `cli.cjs --version` 得到 `1.10.0`、`--help` 正常(4128 字节、含 `Commands:`);同时确认 1.9.0 缺的
237
+ 那两个文件这次都在(`logo.png`、`scripts/data/wechat_emoji.json`),而开发用探针
238
+ `scripts/json_surface_probe.mjs` **不在**包里(`.mjs` 不进包是有意的,见 `test/pack-contents.test.ts`);
239
+ 3. 两个源都是 1.10.0:官方源与 `registry.npmmirror.com`(`curl -X PUT …/syncs` 受理后约 **4 分钟**生效)。
240
+ 另外**发布日志 0 条告警** —— 下面说的那两条装饰性 normalize 告警确实随 `package.json` 规范化一起消失了。
241
+ **tag 打在被发布的那个提交上**:`v1.10.0` → `9baa752`(发布时 HEAD 就是它;随后只有这一个文档提交
242
+ 3cf5605,它不在包里那一份 tarball 的对应关系里 —— 写下来是因为 1.8.0 那次正是"事后不知道 tag 对应哪个
243
+ 提交")。GitHub Release `v1.10.0` 同样指向它,正文由 `## 1.10.0` 段机械切出(92,213 字符,未触及
244
+ 125,000 上限 ⇒ 未截断),List 上已是 **Latest**。
245
+ - **1.11.0 的出处核过了(2026-10-13,发布当天,四种证据)**:
246
+ 1. 本地 `npm pack` 的 shasum = `21db27cbb151987331c7993c625eb4626c23f58a`,与**两个源**上
247
+ `weflow-cli@1.11.0` 的 `dist.shasum` **三者相同** ⇒ 发出去的就是我构建的那一份,且镜像同步的是同一份;
248
+ 2. 从 registry(不是本地 tarball)装进一个**空目录**,用**装好的那份**跑 `cli.cjs --version` 得到 `1.11.0`、
249
+ `--help` 72 行含 `Commands:`;1.9.0 缺过的 `logo.png` 与 `scripts/data/wechat_emoji.json` 都在,
250
+ 开发用探针 `.mjs` 不在包里(有意,见 `test/pack-contents.test.ts`);
251
+ 3. **本次真正改动的那个脚本逐字节核过**:装好的那份 `scripts/export_chat_html.py` 的 sha256
252
+ = `73117B7A35347D68FE239D660C9A0531E231BA8CA7A0A31F8DA0C07D5D54C041`,与仓库里那份**相同**
253
+ ⇒ 用户拿到的是这一版脚本,不是旧的。这是比"文件在不在"更强的一层:**在,而且是我这次写的那份**;
254
+ 4. 两个源都是 1.11.0:官方源与 `registry.npmmirror.com`(`curl -X PUT …/syncs` 受理后,发布后约 1 分钟
255
+ 查 shasum 仍取不到、20 分钟内再查时两源都已生效 —— 这次的窗口比 1.10.0 那次(约 4 分钟)长,
256
+ 但**没有逐点采样**,所以只记"两次查询的区间",不写一个假的分钟数)。
257
+ **发布日志 0 条告警**;**tag 打在被发布的那个提交上**:`v1.11.0` → `bd82316`(`821479b` 是功能提交,
258
+ `bd82316` 只改了 `package.json` 版本号与 CHANGELOG 段名)。GitHub Release `v1.11.0` 指向 `bd82316`,
259
+ 正文由 `## 1.11.0` 段机械切出(9,689 字符、7 条 bullet、未触及 125,000 上限 ⇒ 未截断),
260
+ 建完在 List 上已是 **Latest**(把 1.10.0 挤下去是预期行为)。
261
+ ⚠️ **这次发布本身有一次 CI 失败,记在这里免得事后只看到"一切正常"**:`chore: 1.11.0` 那次提交的
262
+ `release-consistency` 报「版本号与锁文件必须一致」—— 我改了 `package.json` 忘了 `package-lock.json`,
263
+ 连红三次(含紧随其后的文档提交)。**发布物不受影响**(白名单里没有锁文件、shasum 与装出来的那份都验过),
264
+ 但 master 的 CI 是红的;修在 `f9e55c8`,之后两次推送都是 success。清单第 1 步已补上这条检查。
219
265
 
220
266
 
221
267
  ## 发布后
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "weflow-cli",
3
- "version": "1.10.0",
3
+ "version": "1.11.1",
4
4
  "description": "让 AI 读懂你的微信 — 公众号日报·聊天导出·知识库搜索·MCP Server",
5
5
  "type": "module",
6
6
  "bin": {