@gobing-ai/knowledge-kit 0.0.33 → 0.0.35

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 (69) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/dist/index.js +25191 -24167
  3. package/package.json +4 -4
  4. package/plugins/generations/content-gen/dist/index.js +9 -9
  5. package/plugins/generations/core-facts-gen/dist/index.js +12 -12
  6. package/plugins/generations/daily-article-gen/dist/index.js +31 -23
  7. package/plugins/generations/daily-article-gen/src/index.ts +39 -14
  8. package/plugins/generations/dailynews-gen/dist/index.js +23 -21
  9. package/plugins/generations/dailynews-gen/src/script-builder.ts +30 -26
  10. package/plugins/generations/episode-plan-gen/dist/index.js +12 -12
  11. package/plugins/generations/gemini-tts/dist/index.js +13 -12
  12. package/plugins/generations/image-gen/dist/index.js +26 -11
  13. package/plugins/generations/image-gen/presets/formats/xhs-card.yaml +16 -14
  14. package/plugins/generations/image-gen/presets/styles/xhs-knowledge.yaml +2 -2
  15. package/plugins/generations/image-gen/src/compose/card.ts +17 -2
  16. package/plugins/generations/news-report-gen/dist/index.js +12 -12
  17. package/plugins/generations/omni-voice-gen/plugin.json +1 -1
  18. package/plugins/generations/voice-gen/dist/index.js +13 -12
  19. package/plugins/generations/voice-gen/src/index.ts +9 -3
  20. package/plugins/ingestions/aihot-ingest/dist/index.js +12 -12
  21. package/plugins/ingestions/horizon-ingest/dist/index.js +12 -12
  22. package/plugins/ingestions/karakeep-local/dist/index.js +13 -13
  23. package/plugins/ingestions/last30days-ingest/dist/index.js +12 -12
  24. package/plugins/ingestions/web-search/dist/index.js +10 -10
  25. package/plugins/kk/decisions/extract/ai-news.yaml +6 -0
  26. package/plugins/kk/decisions/kk-items.yaml +69 -3
  27. package/plugins/kk/plugin.json +1 -1
  28. package/plugins/kk/scripts/daily-stages.ts +834 -87
  29. package/plugins/kk/scripts/daily-voice-style.zh.md +15 -10
  30. package/plugins/kk/scripts/kk-workflow-stages.ts +46 -3
  31. package/plugins/kk/skills/content-safety/SKILL.md +1 -1
  32. package/plugins/kk/skills/content-safety/references/platforms/apple-podcasts.md +2 -2
  33. package/plugins/kk/skills/content-safety/references/platforms/wechatmp.md +2 -2
  34. package/plugins/kk/skills/content-safety/references/platforms/xiaoyuzhou.md +4 -2
  35. package/plugins/kk/workflows/kk-collect.yaml +7 -9
  36. package/plugins/kk/workflows/kk-daily-ai-voice.yaml +32 -7
  37. package/plugins/kk/workflows/kk-daily-ai-voice2.yaml +169 -47
  38. package/plugins/kk/workflows/kk-daily-safety.yaml +9 -12
  39. package/plugins/publishings/emdash-pub/dist/index.js +9 -9
  40. package/plugins/publishings/infoq-pub/dist/index.js +22 -22
  41. package/plugins/publishings/infoq-pub/dist/profile-check.js +30336 -0
  42. package/plugins/publishings/infoq-pub/plugin.json +1 -1
  43. package/plugins/publishings/juejin-pub/dist/index.js +22 -22
  44. package/plugins/publishings/juejin-pub/dist/profile-check.js +30322 -0
  45. package/plugins/publishings/juejin-pub/plugin.json +1 -1
  46. package/plugins/publishings/medium-pub/dist/index.js +9 -9
  47. package/plugins/publishings/podcast-pub/dist/index.js +9 -9
  48. package/plugins/publishings/qiita-pub/dist/index.js +9 -9
  49. package/plugins/publishings/substack-pub/dist/index.js +22 -22
  50. package/plugins/publishings/substack-pub/dist/profile-check.js +30392 -0
  51. package/plugins/publishings/substack-pub/plugin.json +1 -1
  52. package/plugins/publishings/surfdash-pub/dist/index.js +9 -9
  53. package/plugins/publishings/wechatmp-pub/dist/index.js +329 -154
  54. package/plugins/publishings/wechatmp-pub/dist/profile-check.js +30271 -0
  55. package/plugins/publishings/wechatmp-pub/plugin.json +1 -1
  56. package/plugins/publishings/wechatmp-pub/src/enrich.ts +106 -145
  57. package/plugins/publishings/wechatmp-pub/src/flow.ts +283 -42
  58. package/plugins/publishings/wechatmp-pub/src/page.ts +20 -0
  59. package/plugins/publishings/x-pub/dist/index.js +22 -22
  60. package/plugins/publishings/x-pub/dist/profile-check.js +30328 -0
  61. package/plugins/publishings/x-pub/plugin.json +1 -1
  62. package/plugins/publishings/xhs-pub/dist/index.js +76 -27
  63. package/plugins/publishings/xhs-pub/dist/profile-check.js +30538 -0
  64. package/plugins/publishings/xhs-pub/plugin.json +1 -1
  65. package/plugins/publishings/xhs-pub/src/flow.ts +9 -3
  66. package/plugins/publishings/xhs-pub/src/index.ts +111 -5
  67. package/plugins/publishings/zenn-pub/dist/index.js +9 -9
  68. package/plugins/generations/omni-voice-gen/dist/omni-voice-gen-prr8skpb. +0 -2
  69. package/plugins/generations/omni-voice-gen/dist/omni-voice-gen.js +0 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/knowledge-kit",
3
- "version": "0.0.33",
3
+ "version": "0.0.35",
4
4
  "description": "An ingest → create → publish content pipeline CLI (Bun).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -46,9 +46,9 @@
46
46
  "typecheck": "tsc --noEmit"
47
47
  },
48
48
  "dependencies": {
49
- "@gobing-ai/ts-infra": "^0.5.18",
50
- "@gobing-ai/ts-runtime": "^0.5.18",
51
- "@gobing-ai/ts-utils": "^0.5.18",
49
+ "@gobing-ai/ts-infra": "^0.5.21",
50
+ "@gobing-ai/ts-runtime": "^0.5.21",
51
+ "@gobing-ai/ts-utils": "^0.5.21",
52
52
  "commander": "15.0.0"
53
53
  },
54
54
  "devDependencies": {
@@ -14642,7 +14642,7 @@ var init_zod = __esm(() => {
14642
14642
  init_external();
14643
14643
  });
14644
14644
 
14645
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/errors.js
14645
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/errors.js
14646
14646
  var ErrorCode;
14647
14647
  var init_errors3 = __esm(() => {
14648
14648
  ErrorCode = {
@@ -14653,7 +14653,7 @@ var init_errors3 = __esm(() => {
14653
14653
  };
14654
14654
  });
14655
14655
 
14656
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/api-response.js
14656
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/api-response.js
14657
14657
  var API_ERROR_CODES, ERROR_CODE_TO_HTTP, CLIENT_SAFE_CODES;
14658
14658
  var init_api_response = __esm(() => {
14659
14659
  init_errors3();
@@ -14676,13 +14676,13 @@ var init_api_response = __esm(() => {
14676
14676
  CLIENT_SAFE_CODES = new Set([ErrorCode.NotFound, ErrorCode.Validation, ErrorCode.Conflict]);
14677
14677
  });
14678
14678
 
14679
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/cursor.js
14679
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/cursor.js
14680
14680
  var init_cursor = () => {};
14681
14681
 
14682
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/event-severity.js
14682
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/event-severity.js
14683
14683
  var init_event_severity = () => {};
14684
14684
 
14685
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/output.js
14685
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/output.js
14686
14686
  function processStream(name) {
14687
14687
  const proc = globalThis.process;
14688
14688
  const stream = proc?.[name];
@@ -14700,7 +14700,7 @@ function echoError(message, target = defaultStderrTarget ?? processStream("stder
14700
14700
  }
14701
14701
  var defaultStderrTarget;
14702
14702
 
14703
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/index.js
14703
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/index.js
14704
14704
  var init_dist = __esm(() => {
14705
14705
  init_api_response();
14706
14706
  init_cursor();
@@ -21698,7 +21698,7 @@ var init_dist2 = __esm(() => {
21698
21698
  $visitAsync = visit.visitAsync;
21699
21699
  });
21700
21700
 
21701
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/config.js
21701
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/config.js
21702
21702
  var configSchema;
21703
21703
  var init_config = __esm(() => {
21704
21704
  init_dist2();
@@ -21722,7 +21722,7 @@ var init_config = __esm(() => {
21722
21722
  });
21723
21723
  });
21724
21724
 
21725
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21725
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21726
21726
  import { appendFileSync, cpSync, createReadStream, createWriteStream, existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "fs";
21727
21727
  import { dirname, resolve as resolvePath } from "path";
21728
21728
  function createNodeFileSystem(root, paths) {
@@ -21900,7 +21900,7 @@ var PluginManifestSchema = exports_external.looseObject({
21900
21900
  description: exports_external.string().optional(),
21901
21901
  operations: exports_external.record(exports_external.string(), PluginOperationSchema).optional()
21902
21902
  });
21903
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/index.js
21903
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/index.js
21904
21904
  init_file_system_node();
21905
21905
  init_config();
21906
21906
 
@@ -14642,7 +14642,7 @@ var init_zod = __esm(() => {
14642
14642
  init_external();
14643
14643
  });
14644
14644
 
14645
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/errors.js
14645
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/errors.js
14646
14646
  var ErrorCode;
14647
14647
  var init_errors3 = __esm(() => {
14648
14648
  ErrorCode = {
@@ -14653,7 +14653,7 @@ var init_errors3 = __esm(() => {
14653
14653
  };
14654
14654
  });
14655
14655
 
14656
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/api-response.js
14656
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/api-response.js
14657
14657
  var API_ERROR_CODES, ERROR_CODE_TO_HTTP, CLIENT_SAFE_CODES;
14658
14658
  var init_api_response = __esm(() => {
14659
14659
  init_errors3();
@@ -14676,13 +14676,13 @@ var init_api_response = __esm(() => {
14676
14676
  CLIENT_SAFE_CODES = new Set([ErrorCode.NotFound, ErrorCode.Validation, ErrorCode.Conflict]);
14677
14677
  });
14678
14678
 
14679
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/cursor.js
14679
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/cursor.js
14680
14680
  var init_cursor = () => {};
14681
14681
 
14682
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/event-severity.js
14682
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/event-severity.js
14683
14683
  var init_event_severity = () => {};
14684
14684
 
14685
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/output.js
14685
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/output.js
14686
14686
  function processStream(name) {
14687
14687
  const proc = globalThis.process;
14688
14688
  const stream = proc?.[name];
@@ -14700,7 +14700,7 @@ function echoError(message, target = defaultStderrTarget ?? processStream("stder
14700
14700
  }
14701
14701
  var defaultStderrTarget;
14702
14702
 
14703
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/index.js
14703
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/index.js
14704
14704
  var init_dist = __esm(() => {
14705
14705
  init_api_response();
14706
14706
  init_cursor();
@@ -21698,7 +21698,7 @@ var init_dist2 = __esm(() => {
21698
21698
  $visitAsync = visit.visitAsync;
21699
21699
  });
21700
21700
 
21701
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/config.js
21701
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/config.js
21702
21702
  var configSchema;
21703
21703
  var init_config = __esm(() => {
21704
21704
  init_dist2();
@@ -21722,7 +21722,7 @@ var init_config = __esm(() => {
21722
21722
  });
21723
21723
  });
21724
21724
 
21725
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21725
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21726
21726
  import { appendFileSync, cpSync, createReadStream, createWriteStream, existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "fs";
21727
21727
  import { dirname, resolve as resolvePath } from "path";
21728
21728
  function createNodeFileSystem(root, paths) {
@@ -21901,14 +21901,14 @@ var PluginManifestSchema = exports_external.looseObject({
21901
21901
  description: exports_external.string().optional(),
21902
21902
  operations: exports_external.record(exports_external.string(), PluginOperationSchema).optional()
21903
21903
  });
21904
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/index.js
21904
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/index.js
21905
21905
  init_file_system_node();
21906
21906
  init_config();
21907
21907
 
21908
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/fs.js
21908
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/fs.js
21909
21909
  init_file_system_node();
21910
21910
 
21911
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/path.js
21911
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/path.js
21912
21912
  function normalizeSeparators(path) {
21913
21913
  return path.replaceAll("\\", "/");
21914
21914
  }
@@ -21942,7 +21942,7 @@ function dirnamePath(path) {
21942
21942
  return normalized.slice(0, index);
21943
21943
  }
21944
21944
 
21945
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/fs.js
21945
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/fs.js
21946
21946
  async function ensureDirForFile(path, fs = createNodeFileSystem()) {
21947
21947
  await fs.ensureDir(dirnamePath(path));
21948
21948
  }
@@ -14642,7 +14642,7 @@ var init_zod = __esm(() => {
14642
14642
  init_external();
14643
14643
  });
14644
14644
 
14645
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/errors.js
14645
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/errors.js
14646
14646
  var ErrorCode;
14647
14647
  var init_errors3 = __esm(() => {
14648
14648
  ErrorCode = {
@@ -14653,7 +14653,7 @@ var init_errors3 = __esm(() => {
14653
14653
  };
14654
14654
  });
14655
14655
 
14656
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/api-response.js
14656
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/api-response.js
14657
14657
  var API_ERROR_CODES, ERROR_CODE_TO_HTTP, CLIENT_SAFE_CODES;
14658
14658
  var init_api_response = __esm(() => {
14659
14659
  init_errors3();
@@ -14676,13 +14676,13 @@ var init_api_response = __esm(() => {
14676
14676
  CLIENT_SAFE_CODES = new Set([ErrorCode.NotFound, ErrorCode.Validation, ErrorCode.Conflict]);
14677
14677
  });
14678
14678
 
14679
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/cursor.js
14679
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/cursor.js
14680
14680
  var init_cursor = () => {};
14681
14681
 
14682
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/event-severity.js
14682
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/event-severity.js
14683
14683
  var init_event_severity = () => {};
14684
14684
 
14685
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/output.js
14685
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/output.js
14686
14686
  function processStream(name) {
14687
14687
  const proc = globalThis.process;
14688
14688
  const stream = proc?.[name];
@@ -14700,7 +14700,7 @@ function echoError(message, target = defaultStderrTarget ?? processStream("stder
14700
14700
  }
14701
14701
  var defaultStderrTarget;
14702
14702
 
14703
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/index.js
14703
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/index.js
14704
14704
  var init_dist = __esm(() => {
14705
14705
  init_api_response();
14706
14706
  init_cursor();
@@ -21698,7 +21698,7 @@ var init_dist2 = __esm(() => {
21698
21698
  $visitAsync = visit.visitAsync;
21699
21699
  });
21700
21700
 
21701
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/config.js
21701
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/config.js
21702
21702
  var configSchema;
21703
21703
  var init_config = __esm(() => {
21704
21704
  init_dist2();
@@ -21722,7 +21722,7 @@ var init_config = __esm(() => {
21722
21722
  });
21723
21723
  });
21724
21724
 
21725
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21725
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21726
21726
  import { appendFileSync, cpSync, createReadStream, createWriteStream, existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "fs";
21727
21727
  import { dirname, resolve as resolvePath } from "path";
21728
21728
  function createNodeFileSystem(root, paths) {
@@ -21901,14 +21901,14 @@ var PluginManifestSchema = exports_external.looseObject({
21901
21901
  description: exports_external.string().optional(),
21902
21902
  operations: exports_external.record(exports_external.string(), PluginOperationSchema).optional()
21903
21903
  });
21904
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/index.js
21904
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/index.js
21905
21905
  init_file_system_node();
21906
21906
  init_config();
21907
21907
 
21908
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/fs.js
21908
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/fs.js
21909
21909
  init_file_system_node();
21910
21910
 
21911
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/path.js
21911
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/path.js
21912
21912
  function normalizeSeparators(path) {
21913
21913
  return path.replaceAll("\\", "/");
21914
21914
  }
@@ -21942,7 +21942,7 @@ function dirnamePath(path) {
21942
21942
  return normalized.slice(0, index);
21943
21943
  }
21944
21944
 
21945
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/fs.js
21945
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/fs.js
21946
21946
  async function ensureDirForFile(path, fs = createNodeFileSystem()) {
21947
21947
  await fs.ensureDir(dirnamePath(path));
21948
21948
  }
@@ -22037,13 +22037,13 @@ ${metaLine ? `${metaLine}
22037
22037
  ` : ""}${stripScaffold(doc2.body ?? "").trim()}`;
22038
22038
  }
22039
22039
  function episodeTitle(date6) {
22040
- return `AI \u4E71\u7096 \xB7 ${date6}`;
22040
+ return `\u6BCF\u65E5AI\u4E71\u7096 \xB7 ${date6}`;
22041
22041
  }
22042
22042
  function renderDailyArticle(docs, date6) {
22043
22043
  const items = docs.map(renderDoc).join(`
22044
22044
 
22045
22045
  `);
22046
- const intro = docs.length > 0 ? `\u300CAI \u4E71\u7096\u300D\u662F\u300C\u54B8\u8BDD\u54B8\u8BF4\u300D\u7684 AI \u6280\u672F\u5206\u4EAB\u680F\u76EE\uFF1A\u5DE5\u5177\u3001\u8BBA\u6587\u4E0E\u5B9E\u8DF5\u968F\u804A\u3002\u672C\u671F\u5171 ${docs.length} \u6761\u5185\u5BB9\uFF0C\u5747\u9644\u53EF\u70B9\u51FB\u6765\u6E90\u94FE\u63A5\u3002` : "\u300CAI \u4E71\u7096\u300D\u662F\u300C\u54B8\u8BDD\u54B8\u8BF4\u300D\u7684 AI \u6280\u672F\u5206\u4EAB\u680F\u76EE\uFF1A\u5DE5\u5177\u3001\u8BBA\u6587\u4E0E\u5B9E\u8DF5\u968F\u804A\u3002\u672C\u671F\u6CA1\u6709\u8DB3\u591F\u624E\u5B9E\u7684\u53EF\u804A\u5185\u5BB9\u3002";
22046
+ const intro = docs.length > 0 ? `\u8FD9\u91CC\u662F\u7531Robin\u4E3A\u4F60\u5E26\u6765\u7684\u54B8\u8BDD\u54B8\u8BF4\u4E4B\u6BCF\u65E5AI\u4E71\u7096\u3002\u672C\u671F\u5171 ${docs.length} \u6761\u5185\u5BB9\uFF0C\u5747\u9644\u53EF\u70B9\u51FB\u6765\u6E90\u94FE\u63A5\u3002` : "\u8FD9\u91CC\u662F\u7531Robin\u4E3A\u4F60\u5E26\u6765\u7684\u54B8\u8BDD\u54B8\u8BF4\u4E4B\u6BCF\u65E5AI\u4E71\u7096\u3002\u672C\u671F\u6CA1\u6709\u8DB3\u591F\u624E\u5B9E\u7684\u53EF\u804A\u5185\u5BB9\u3002";
22047
22047
  return `# ${episodeTitle(date6)}
22048
22048
 
22049
22049
  ${intro}
@@ -22062,6 +22062,10 @@ function tagsFor(docs) {
22062
22062
  var LEADING_H1_RE = /^#(?!#)\s*[^\n]+\n+/.source;
22063
22063
  var NOTE_EXCLUDED_RE = /\u672A\u5199\u5165[\uFF1A:](.*)/g;
22064
22064
  var HEX_ID_RE = /(?:[a-zA-Z0-9_-]+:)?[0-9a-f]{16,64}/g;
22065
+ var BOUNDARY_NOTE_RE = /^>[^\n]*(?:\u9009\u9898\u8FB9\u754C|\u672A\u5199\u5165)[^\n]*\n?/gm;
22066
+ function stripBoundaryNote(body) {
22067
+ return body.replace(BOUNDARY_NOTE_RE, "");
22068
+ }
22065
22069
  function excludedIdsFromNote(body) {
22066
22070
  const ids = new Set;
22067
22071
  if (!body)
@@ -22080,24 +22084,27 @@ function docsToContent(docs, date6, bodyOverride) {
22080
22084
  const title = episodeTitle(date6);
22081
22085
  let body = renderDailyArticle(docs, date6);
22082
22086
  if (bodyOverride) {
22083
- const stripped = stripScaffold(bodyOverride.trim()).trim().replace(new RegExp(LEADING_H1_RE), "");
22087
+ const cleaned = stripBoundaryNote(stripScaffold(bodyOverride.trim()).trim().replace(new RegExp(LEADING_H1_RE), "")).trim();
22084
22088
  body = `# ${title}
22085
22089
 
22086
- ${stripped}
22090
+ ${cleaned}
22087
22091
  `;
22092
+ } else {
22093
+ body = stripBoundaryNote(body);
22088
22094
  }
22089
- body = `${body.trimEnd()}
22090
-
22091
- ---
22092
-
22093
- *\u6587\u5B57\u7531 AI \u8F85\u52A9\u6574\u7406\uFF0C\u97F3\u9891\u4E3A AI \u5408\u6210\u914D\u97F3\u3002*
22094
- `;
22095
+ const excludedIds = [...excludedIdsFromNote(bodyOverride)];
22095
22096
  return ContentSchema.parse({
22096
22097
  title,
22097
22098
  body,
22098
22099
  format: "markdown",
22099
22100
  references: docs.filter((d) => d.sourceUri).map((d) => ({ url: d.sourceUri, title: d.title, cite: d.id })),
22100
- metadata: { generator: "kk:daily-article", date: date6, doc_count: docs.length, tags: tagsFor(docs) }
22101
+ metadata: {
22102
+ generator: "kk:daily-article",
22103
+ date: date6,
22104
+ doc_count: docs.length,
22105
+ tags: tagsFor(docs),
22106
+ ...excludedIds.length > 0 ? { excludedIds } : {}
22107
+ }
22101
22108
  });
22102
22109
  }
22103
22110
  async function processGeneratorIO(inputPath, outputPath) {
@@ -22146,6 +22153,7 @@ if (import.meta.main) {
22146
22153
  }
22147
22154
  export {
22148
22155
  stripScaffold,
22156
+ stripBoundaryNote,
22149
22157
  renderDailyArticle,
22150
22158
  processGeneratorIO,
22151
22159
  main2 as main,
@@ -103,14 +103,13 @@ function renderDoc(doc: Doc, index: number): string {
103
103
  }
104
104
 
105
105
  /**
106
- * Episode title for the 「AI 乱炖」 column: fixed `AI 乱炖 · YYYY-MM-DD` (2026-10-02 operator
107
- * simplification, superseding the 0189 R1/R4 `AI 乱炖|<lead item> · date` pattern). The date
108
- * alone identifies the episode; the day's stories live in the show notes, cards and post body.
109
- * Pure function so the agent-written and template article paths, ID3, RSS and show notes all
110
- * derive one identical title.
106
+ * Episode title for the 「每日AI乱炖」 column of 「咸话咸说」: fixed `每日AI乱炖 · YYYY-MM-DD`
107
+ * (2026-10-08 operator rename, keeping the 2026-10-02 date-only pattern). The date identifies
108
+ * the episode; the day's stories live in the show notes, cards and post body. Pure function so
109
+ * the agent-written and template article paths, ID3, RSS and show notes all derive one title.
111
110
  */
112
111
  export function episodeTitle(date: string): string {
113
- return `AI 乱炖 · ${date}`;
112
+ return `每日AI乱炖 · ${date}`;
114
113
  }
115
114
 
116
115
  /** Render the article markdown for a merged Doc[] (pure — exported for tests). */
@@ -118,8 +117,8 @@ export function renderDailyArticle(docs: Doc[], date: string): string {
118
117
  const items = docs.map(renderDoc).join('\n\n');
119
118
  const intro =
120
119
  docs.length > 0
121
- ? `「AI 乱炖」是「咸话咸说」的 AI 技术分享栏目:工具、论文与实践随聊。本期共 ${docs.length} 条内容,均附可点击来源链接。`
122
- : '「AI 乱炖」是「咸话咸说」的 AI 技术分享栏目:工具、论文与实践随聊。本期没有足够扎实的可聊内容。';
120
+ ? `这里是由Robin为你带来的咸话咸说之每日AI乱炖。本期共 ${docs.length} 条内容,均附可点击来源链接。`
121
+ : '这里是由Robin为你带来的咸话咸说之每日AI乱炖。本期没有足够扎实的可聊内容。';
123
122
  return `# ${episodeTitle(date)}\n\n${intro}\n\n${items}\n`;
124
123
  }
125
124
 
@@ -142,6 +141,20 @@ const LEADING_H1_RE = /^#(?!#)\s*[^\n]+\n+/.source;
142
141
  const NOTE_EXCLUDED_RE = /未写入[::](.*)/g;
143
142
  const HEX_ID_RE = /(?:[a-zA-Z0-9_-]+:)?[0-9a-f]{16,64}/g;
144
143
 
144
+ /**
145
+ * The 选题边界 note is pipeline bookkeeping: it names dropped doc ids and the rule that dropped them.
146
+ * It is the machine-readable exclusion signal (`excludedIdsFromNote`), so it stays in the agent's body
147
+ * file — but it must never reach a published body, where it printed an internal doc id and pipeline
148
+ * vocabulary to readers (operator report 2026-10-10). Matches only blockquote lines, which the article
149
+ * body reserves for exactly this note, so ordinary prose is untouched.
150
+ */
151
+ const BOUNDARY_NOTE_RE = /^>[^\n]*(?:选题边界|未写入)[^\n]*\n?/gm;
152
+
153
+ /** Strip the internal boundary note from a body destined for a customer-visible surface. */
154
+ export function stripBoundaryNote(body: string): string {
155
+ return body.replace(BOUNDARY_NOTE_RE, '');
156
+ }
157
+
145
158
  /** Parse the boundary-note ids out of an article body so references/metadata never cite excluded docs (judge finding 2026-10-02). */
146
159
  export function excludedIdsFromNote(body: string | undefined): Set<string> {
147
160
  const ids = new Set<string>();
@@ -163,18 +176,30 @@ export function docsToContent(docs: Doc[], date: string, bodyOverride?: string):
163
176
  if (bodyOverride) {
164
177
  // The canonical episode title is computed from the lead item; a leading H1 the agent may
165
178
  // still have written is replaced (not duplicated) so body and metadata agree on every path.
166
- const stripped = stripScaffold(bodyOverride.trim()).trim().replace(new RegExp(LEADING_H1_RE), '');
167
- body = `# ${title}\n\n${stripped}\n`;
179
+ // The boundary note is stripped here, not dropped upstream: the agent's body file keeps it as
180
+ // the exclusion signal, this Content is what readers see.
181
+ const cleaned = stripBoundaryNote(
182
+ stripScaffold(bodyOverride.trim()).trim().replace(new RegExp(LEADING_H1_RE), ''),
183
+ ).trim();
184
+ body = `# ${title}\n\n${cleaned}\n`;
185
+ } else {
186
+ body = stripBoundaryNote(body);
168
187
  }
169
- // Task 0189 R1: the AI-production note rides on every article path (mechanical and agent
170
- // prose). Podcast show notes are rendered separately by podcast-pub and do not inherit it.
171
- body = `${body.trimEnd()}\n\n---\n\n*文字由 AI 辅助整理,音频为 AI 合成配音。*\n`;
188
+ // The ids the note named become metadata, so consumers that must filter excluded docs (show-notes
189
+ // plan copies) read a field instead of re-parsing a note that no longer exists.
190
+ const excludedIds = [...excludedIdsFromNote(bodyOverride)];
172
191
  return ContentSchema.parse({
173
192
  title,
174
193
  body,
175
194
  format: 'markdown',
176
195
  references: docs.filter((d) => d.sourceUri).map((d) => ({ url: d.sourceUri, title: d.title, cite: d.id })),
177
- metadata: { generator: 'kk:daily-article', date, doc_count: docs.length, tags: tagsFor(docs) },
196
+ metadata: {
197
+ generator: 'kk:daily-article',
198
+ date,
199
+ doc_count: docs.length,
200
+ tags: tagsFor(docs),
201
+ ...(excludedIds.length > 0 ? { excludedIds } : {}),
202
+ },
178
203
  });
179
204
  }
180
205
 
@@ -14642,7 +14642,7 @@ var init_zod = __esm(() => {
14642
14642
  init_external();
14643
14643
  });
14644
14644
 
14645
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/errors.js
14645
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/errors.js
14646
14646
  var ErrorCode;
14647
14647
  var init_errors3 = __esm(() => {
14648
14648
  ErrorCode = {
@@ -14653,7 +14653,7 @@ var init_errors3 = __esm(() => {
14653
14653
  };
14654
14654
  });
14655
14655
 
14656
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/api-response.js
14656
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/api-response.js
14657
14657
  var API_ERROR_CODES, ERROR_CODE_TO_HTTP, CLIENT_SAFE_CODES;
14658
14658
  var init_api_response = __esm(() => {
14659
14659
  init_errors3();
@@ -14676,13 +14676,13 @@ var init_api_response = __esm(() => {
14676
14676
  CLIENT_SAFE_CODES = new Set([ErrorCode.NotFound, ErrorCode.Validation, ErrorCode.Conflict]);
14677
14677
  });
14678
14678
 
14679
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/cursor.js
14679
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/cursor.js
14680
14680
  var init_cursor = () => {};
14681
14681
 
14682
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/event-severity.js
14682
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/event-severity.js
14683
14683
  var init_event_severity = () => {};
14684
14684
 
14685
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/output.js
14685
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/output.js
14686
14686
  function processStream(name) {
14687
14687
  const proc = globalThis.process;
14688
14688
  const stream = proc?.[name];
@@ -14700,7 +14700,7 @@ function echoError(message, target = defaultStderrTarget ?? processStream("stder
14700
14700
  }
14701
14701
  var defaultStderrTarget;
14702
14702
 
14703
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.18/node_modules/@gobing-ai/ts-utils/dist/index.js
14703
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.5.21/node_modules/@gobing-ai/ts-utils/dist/index.js
14704
14704
  var init_dist = __esm(() => {
14705
14705
  init_api_response();
14706
14706
  init_cursor();
@@ -21698,7 +21698,7 @@ var init_dist2 = __esm(() => {
21698
21698
  $visitAsync = visit.visitAsync;
21699
21699
  });
21700
21700
 
21701
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/config.js
21701
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/config.js
21702
21702
  var configSchema;
21703
21703
  var init_config = __esm(() => {
21704
21704
  init_dist2();
@@ -21722,7 +21722,7 @@ var init_config = __esm(() => {
21722
21722
  });
21723
21723
  });
21724
21724
 
21725
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21725
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21726
21726
  import { appendFileSync, cpSync, createReadStream, createWriteStream, existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "fs";
21727
21727
  import { dirname, resolve as resolvePath } from "path";
21728
21728
  function createNodeFileSystem(root, paths) {
@@ -21901,7 +21901,7 @@ var PluginManifestSchema = exports_external.looseObject({
21901
21901
  description: exports_external.string().optional(),
21902
21902
  operations: exports_external.record(exports_external.string(), PluginOperationSchema).optional()
21903
21903
  });
21904
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.18+ea28d47622d670ff/node_modules/@gobing-ai/ts-runtime/dist/index.js
21904
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.5.21+44edd5c4d6372504/node_modules/@gobing-ai/ts-runtime/dist/index.js
21905
21905
  init_file_system_node();
21906
21906
  init_config();
21907
21907
 
@@ -22116,27 +22116,33 @@ function buildNewsVoiceScript(docs, options) {
22116
22116
  const defaultEffectPreset = options?.effectPreset;
22117
22117
  const broadcastDate = options?.date ?? new Date;
22118
22118
  const dateStr = formatBroadcastDate(broadcastDate, language);
22119
+ const episodeDate = `${broadcastDate.getFullYear()}-${String(broadcastDate.getMonth() + 1).padStart(2, "0")}-${String(broadcastDate.getDate()).padStart(2, "0")}`;
22120
+ const showName = "\u54B8\u8BDD\u54B8\u8BF4\u4E4B\u6BCF\u65E5AI\u4E71\u7096";
22121
+ let hostName = options?.speakers?.host?.name || voiceProfile.replace(/[-_]?(news|voice|bot|profile)$/i, "") || voiceProfile;
22122
+ if (hostName.length > 0) {
22123
+ hostName = hostName.charAt(0).toUpperCase() + hostName.slice(1);
22124
+ }
22119
22125
  if (docs.length === 0) {
22120
- const title2 = options?.title || (isZh ? "AI \u4E71\u7096\uFF08\u6682\u65E0\u66F4\u65B0\uFF09" : "AI \u4E71\u7096 (No Updates)");
22126
+ const title2 = options?.title || (isZh ? "\u6BCF\u65E5AI\u4E71\u7096\uFF08\u6682\u65E0\u66F4\u65B0\uFF09" : "\u6BCF\u65E5AI\u4E71\u7096 (No Updates)");
22121
22127
  const segments2 = isZh ? [
22122
22128
  {
22123
- text: `\u5927\u5BB6\u597D\uFF0C\u4ECA\u5929\u662F${dateStr}\u3002\u6B22\u8FCE\u6536\u542C\u300C\u54B8\u8BDD\u54B8\u8BF4\u300D\u7684\u300CAI \u4E71\u7096\u300D\u680F\u76EE\uFF0C\u6211\u662F${voiceProfile}\u3002\u4ECA\u5929\u6CA1\u6709\u8DB3\u591F\u624E\u5B9E\u7684\u53EF\u804A\u5185\u5BB9\u3002`,
22129
+ text: `\u5927\u5BB6\u597D\uFF0C\u4ECA\u5929\u662F${dateStr}\u3002\u8FD9\u91CC\u662F\u7531${hostName}\u4E3A\u4F60\u5E26\u6765\u7684${showName}\u3002\u4ECA\u5929\u6CA1\u6709\u8DB3\u591F\u624E\u5B9E\u7684\u53EF\u804A\u5185\u5BB9\u3002`,
22124
22130
  gap_ms: 400,
22125
22131
  emotion: "calm"
22126
22132
  },
22127
22133
  {
22128
- text: `\u611F\u8C22\u60A8\u7684\u6536\u542C\uFF0C\u6211\u662F${voiceProfile}\uFF0C\u6211\u4EEC\u4E0B\u671F\u8282\u76EE\u518D\u89C1\u3002`,
22134
+ text: `\u611F\u8C22\u60A8\u7684\u6536\u542C\uFF0C\u6211\u662F${hostName}\uFF0C\u6211\u4EEC\u4E0B\u671F\u8282\u76EE\u518D\u89C1\u3002`,
22129
22135
  gap_ms: 200,
22130
22136
  emotion: "warm"
22131
22137
  }
22132
22138
  ] : [
22133
22139
  {
22134
- text: `Hello and welcome. Today is ${dateStr}. This is ${voiceProfile} with AI \u4E71\u7096, our chat about AI tools, papers, and hands-on practice. There is nothing solid enough to share today.`,
22140
+ text: `Hello. Today is ${dateStr}. This is ${hostName}, bringing you ${showName}, our chat about AI tools, papers, and hands-on practice. There is nothing solid enough to share today.`,
22135
22141
  gap_ms: 400,
22136
22142
  emotion: "calm"
22137
22143
  },
22138
22144
  {
22139
- text: `Thank you for listening. This is ${voiceProfile}, and have a great day.`,
22145
+ text: `Thank you for listening. This is ${hostName}, and have a great day.`,
22140
22146
  gap_ms: 200,
22141
22147
  emotion: "warm"
22142
22148
  }
@@ -22152,17 +22158,13 @@ function buildNewsVoiceScript(docs, options) {
22152
22158
  segments: segments2
22153
22159
  });
22154
22160
  }
22155
- const title = options?.title || (isZh ? `AI \u4E71\u7096\uFF08\u5171${docs.length}\u6761\uFF09` : `AI \u4E71\u7096 (${docs.length} stories)`);
22161
+ const title = options?.title || `\u6BCF\u65E5AI\u4E71\u7096 \xB7 ${episodeDate}`;
22156
22162
  const segments = [];
22157
- let hostName = options?.speakers?.host?.name || voiceProfile.replace(/[-_]?(news|voice|bot|profile)$/i, "") || voiceProfile;
22158
- if (hostName.length > 0) {
22159
- hostName = hostName.charAt(0).toUpperCase() + hostName.slice(1);
22160
- }
22161
22163
  const scriptPlan = isZh ? options?.scriptPlan : undefined;
22162
22164
  const planItems = new Map((scriptPlan?.items ?? []).map((item) => [item.id, item]));
22163
22165
  const countText = isZh ? `${formatChineseCount(docs.length)}\u6761` : `${docs.length}`;
22164
22166
  const titlesSummary = docs.slice(0, 3).map((d) => (d.title ?? "").trim()).filter(Boolean).join("\u3001");
22165
- const introText = isZh ? scriptPlan ? `\u5927\u5BB6\u597D\uFF0C\u4ECA\u5929\u662F${dateStr}\uFF0C\u6B22\u8FCE\u6536\u542C\u300C\u54B8\u8BDD\u54B8\u8BF4\u300D\u7684\u300CAI \u4E71\u7096\u300D\u680F\u76EE\uFF0C\u6211\u662F${hostName}\u3002${scriptPlan.intro}` : `\u5927\u5BB6\u597D\uFF0C\u4ECA\u5929\u662F${dateStr}\uFF0C\u6B22\u8FCE\u6536\u542C\u300C\u54B8\u8BDD\u54B8\u8BF4\u300D\u7684\u300CAI \u4E71\u7096\u300D\u680F\u76EE\uFF0C\u6211\u662F${hostName}\u3002\u4ECA\u5929\u6211\u4ECE AI \u5DE5\u5177\u3001\u8BBA\u6587\u548C\u5B9E\u8DF5\u4E2D\u6574\u7406\u4E86${countText}\u503C\u5F97\u804A\u7684\u5185\u5BB9${titlesSummary ? `\uFF0C\u5305\u62EC${titlesSummary}` : ""}\uFF0C\u54B1\u4EEC\u4E00\u6761\u6761\u6765\u804A\u3002` : `Hello and welcome. Today is ${dateStr}. This is ${hostName} with AI \u4E71\u7096, where we talk about AI tools, papers, and hands-on practice. In today's episode, we have ${countText} stories. Let's dive straight in.`;
22167
+ const introText = isZh ? scriptPlan ? `\u5927\u5BB6\u597D\uFF0C\u4ECA\u5929\u662F${dateStr}\u3002\u8FD9\u91CC\u662F\u7531${hostName}\u4E3A\u4F60\u5E26\u6765\u7684${showName}\u3002${scriptPlan.intro}` : `\u5927\u5BB6\u597D\uFF0C\u4ECA\u5929\u662F${dateStr}\u3002\u8FD9\u91CC\u662F\u7531${hostName}\u4E3A\u4F60\u5E26\u6765\u7684${showName}\u3002\u4ECA\u5929\u6211\u4ECE AI \u5DE5\u5177\u3001\u8BBA\u6587\u548C\u5B9E\u8DF5\u4E2D\u6574\u7406\u4E86${countText}\u503C\u5F97\u804A\u7684\u5185\u5BB9${titlesSummary ? `\uFF0C\u5305\u62EC${titlesSummary}` : ""}\uFF0C\u54B1\u4EEC\u4E00\u6761\u6761\u6765\u804A\u3002` : `Hello. Today is ${dateStr}. This is ${hostName}, bringing you ${showName}, where we talk about AI tools, papers, and hands-on practice. In today's episode, we have ${countText} stories. Let's dive straight in.`;
22166
22168
  segments.push({
22167
22169
  text: normalizeBroadcastText(introText, isZh),
22168
22170
  gap_ms: 700,
@@ -22197,7 +22199,7 @@ function buildNewsVoiceScript(docs, options) {
22197
22199
  });
22198
22200
  }
22199
22201
  });
22200
- const outroText = isZh ? scriptPlan ? `${scriptPlan.outro}\u672C\u671F\u97F3\u9891\u4E3A AI \u5408\u6210\u914D\u97F3\u3002\u611F\u8C22\u60A8\u7684\u6536\u542C\uFF0C\u6211\u662F${hostName}\uFF0C\u795D\u60A8\u62E5\u6709\u5145\u5B9E\u9AD8\u6548\u7684\u4E00\u5929\uFF0C\u6211\u4EEC\u4E0B\u671F\u8282\u76EE\u4E0D\u89C1\u4E0D\u6563\uFF01` : `\u597D\u4E86\uFF0C\u672C\u671FAI\u4E71\u7096\u5C31\u804A\u5230\u8FD9\u91CC\u3002\u5E0C\u671B\u4ECA\u5929\u8FD9\u4E9B\u5DE5\u5177\u3001\u8BBA\u6587\u548C\u5B9E\u8DF5\u7684\u7ECF\u9A8C\u5BF9\u60A8\u6709\u542F\u53D1\u3002\u672C\u671F\u97F3\u9891\u4E3A AI \u5408\u6210\u914D\u97F3\u3002\u611F\u8C22\u60A8\u7684\u6536\u542C\uFF0C\u6211\u662F${hostName}\uFF0C\u795D\u60A8\u62E5\u6709\u5145\u5B9E\u9AD8\u6548\u7684\u4E00\u5929\uFF0C\u6211\u4EEC\u4E0B\u671F\u8282\u76EE\u4E0D\u89C1\u4E0D\u6563\uFF01` : `That wraps up this episode of AI \u4E71\u7096. I hope today's takeaways were useful. The audio in this episode is AI-synthesized. Thank you for listening. This is ${hostName}, wishing you a productive and wonderful day. Until next time!`;
22202
+ const outroText = isZh ? scriptPlan ? `${scriptPlan.outro}\u611F\u8C22\u60A8\u7684\u6536\u542C\uFF0C\u6211\u662F${hostName}\uFF0C\u795D\u60A8\u62E5\u6709\u5145\u5B9E\u9AD8\u6548\u7684\u4E00\u5929\uFF0C\u6211\u4EEC\u4E0B\u671F\u8282\u76EE\u4E0D\u89C1\u4E0D\u6563\uFF01` : `\u597D\u4E86\uFF0C\u672C\u671F\u6BCF\u65E5AI\u4E71\u7096\u5C31\u804A\u5230\u8FD9\u91CC\u3002\u5E0C\u671B\u4ECA\u5929\u8FD9\u4E9B\u5DE5\u5177\u3001\u8BBA\u6587\u548C\u5B9E\u8DF5\u7684\u7ECF\u9A8C\u5BF9\u60A8\u6709\u542F\u53D1\u3002\u611F\u8C22\u60A8\u7684\u6536\u542C\uFF0C\u6211\u662F${hostName}\uFF0C\u795D\u60A8\u62E5\u6709\u5145\u5B9E\u9AD8\u6548\u7684\u4E00\u5929\uFF0C\u6211\u4EEC\u4E0B\u671F\u8282\u76EE\u4E0D\u89C1\u4E0D\u6563\uFF01` : `That wraps up this episode of \u6BCF\u65E5AI\u4E71\u7096. I hope today's takeaways were useful. Thank you for listening. This is ${hostName}, wishing you a productive and wonderful day. Until next time!`;
22201
22203
  segments.push({
22202
22204
  text: normalizeBroadcastText(outroText, isZh),
22203
22205
  gap_ms: 300,