@gobing-ai/knowledge-kit 0.0.33 → 0.0.34

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 (47) 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 +14 -20
  7. package/plugins/generations/daily-article-gen/src/index.ts +7 -11
  8. package/plugins/generations/dailynews-gen/dist/index.js +22 -21
  9. package/plugins/generations/dailynews-gen/src/script-builder.ts +25 -26
  10. package/plugins/generations/episode-plan-gen/dist/index.js +12 -12
  11. package/plugins/generations/gemini-tts/dist/index.js +9 -9
  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/voice-gen/dist/index.js +9 -9
  18. package/plugins/ingestions/aihot-ingest/dist/index.js +12 -12
  19. package/plugins/ingestions/horizon-ingest/dist/index.js +12 -12
  20. package/plugins/ingestions/karakeep-local/dist/index.js +13 -13
  21. package/plugins/ingestions/last30days-ingest/dist/index.js +12 -12
  22. package/plugins/ingestions/web-search/dist/index.js +10 -10
  23. package/plugins/kk/decisions/extract/ai-news.yaml +6 -0
  24. package/plugins/kk/decisions/kk-items.yaml +69 -3
  25. package/plugins/kk/plugin.json +1 -1
  26. package/plugins/kk/scripts/daily-stages.ts +539 -49
  27. package/plugins/kk/scripts/daily-voice-style.zh.md +15 -10
  28. package/plugins/kk/scripts/kk-workflow-stages.ts +6 -3
  29. package/plugins/kk/skills/content-safety/SKILL.md +1 -1
  30. package/plugins/kk/skills/content-safety/references/platforms/apple-podcasts.md +2 -2
  31. package/plugins/kk/workflows/kk-collect.yaml +7 -9
  32. package/plugins/kk/workflows/kk-daily-ai-voice2.yaml +163 -44
  33. package/plugins/kk/workflows/kk-daily-safety.yaml +8 -11
  34. package/plugins/publishings/emdash-pub/dist/index.js +9 -9
  35. package/plugins/publishings/infoq-pub/dist/index.js +22 -22
  36. package/plugins/publishings/juejin-pub/dist/index.js +22 -22
  37. package/plugins/publishings/medium-pub/dist/index.js +9 -9
  38. package/plugins/publishings/podcast-pub/dist/index.js +9 -9
  39. package/plugins/publishings/qiita-pub/dist/index.js +9 -9
  40. package/plugins/publishings/substack-pub/dist/index.js +22 -22
  41. package/plugins/publishings/surfdash-pub/dist/index.js +9 -9
  42. package/plugins/publishings/wechatmp-pub/dist/index.js +22 -22
  43. package/plugins/publishings/x-pub/dist/index.js +22 -22
  44. package/plugins/publishings/xhs-pub/dist/index.js +76 -27
  45. package/plugins/publishings/xhs-pub/src/flow.ts +9 -3
  46. package/plugins/publishings/xhs-pub/src/index.ts +111 -5
  47. package/plugins/publishings/zenn-pub/dist/index.js +9 -9
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.34",
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}
@@ -22086,12 +22086,6 @@ function docsToContent(docs, date6, bodyOverride) {
22086
22086
  ${stripped}
22087
22087
  `;
22088
22088
  }
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
22089
  return ContentSchema.parse({
22096
22090
  title,
22097
22091
  body,
@@ -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
 
@@ -166,9 +165,6 @@ export function docsToContent(docs: Doc[], date: string, bodyOverride?: string):
166
165
  const stripped = stripScaffold(bodyOverride.trim()).trim().replace(new RegExp(LEADING_H1_RE), '');
167
166
  body = `# ${title}\n\n${stripped}\n`;
168
167
  }
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`;
172
168
  return ContentSchema.parse({
173
169
  title,
174
170
  body,
@@ -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,32 @@ 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 showName = "\u54B8\u8BDD\u54B8\u8BF4\u4E4B\u6BCF\u65E5AI\u4E71\u7096";
22120
+ let hostName = options?.speakers?.host?.name || voiceProfile.replace(/[-_]?(news|voice|bot|profile)$/i, "") || voiceProfile;
22121
+ if (hostName.length > 0) {
22122
+ hostName = hostName.charAt(0).toUpperCase() + hostName.slice(1);
22123
+ }
22119
22124
  if (docs.length === 0) {
22120
- const title2 = options?.title || (isZh ? "AI \u4E71\u7096\uFF08\u6682\u65E0\u66F4\u65B0\uFF09" : "AI \u4E71\u7096 (No Updates)");
22125
+ const title2 = options?.title || (isZh ? "\u6BCF\u65E5AI\u4E71\u7096\uFF08\u6682\u65E0\u66F4\u65B0\uFF09" : "\u6BCF\u65E5AI\u4E71\u7096 (No Updates)");
22121
22126
  const segments2 = isZh ? [
22122
22127
  {
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`,
22128
+ 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
22129
  gap_ms: 400,
22125
22130
  emotion: "calm"
22126
22131
  },
22127
22132
  {
22128
- text: `\u611F\u8C22\u60A8\u7684\u6536\u542C\uFF0C\u6211\u662F${voiceProfile}\uFF0C\u6211\u4EEC\u4E0B\u671F\u8282\u76EE\u518D\u89C1\u3002`,
22133
+ text: `\u611F\u8C22\u60A8\u7684\u6536\u542C\uFF0C\u6211\u662F${hostName}\uFF0C\u6211\u4EEC\u4E0B\u671F\u8282\u76EE\u518D\u89C1\u3002`,
22129
22134
  gap_ms: 200,
22130
22135
  emotion: "warm"
22131
22136
  }
22132
22137
  ] : [
22133
22138
  {
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.`,
22139
+ 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
22140
  gap_ms: 400,
22136
22141
  emotion: "calm"
22137
22142
  },
22138
22143
  {
22139
- text: `Thank you for listening. This is ${voiceProfile}, and have a great day.`,
22144
+ text: `Thank you for listening. This is ${hostName}, and have a great day.`,
22140
22145
  gap_ms: 200,
22141
22146
  emotion: "warm"
22142
22147
  }
@@ -22152,17 +22157,13 @@ function buildNewsVoiceScript(docs, options) {
22152
22157
  segments: segments2
22153
22158
  });
22154
22159
  }
22155
- const title = options?.title || (isZh ? `AI \u4E71\u7096\uFF08\u5171${docs.length}\u6761\uFF09` : `AI \u4E71\u7096 (${docs.length} stories)`);
22160
+ const title = options?.title || (isZh ? `\u6BCF\u65E5AI\u4E71\u7096\uFF08\u5171${docs.length}\u6761\uFF09` : `\u6BCF\u65E5AI\u4E71\u7096 (${docs.length} stories)`);
22156
22161
  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
22162
  const scriptPlan = isZh ? options?.scriptPlan : undefined;
22162
22163
  const planItems = new Map((scriptPlan?.items ?? []).map((item) => [item.id, item]));
22163
22164
  const countText = isZh ? `${formatChineseCount(docs.length)}\u6761` : `${docs.length}`;
22164
22165
  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.`;
22166
+ 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
22167
  segments.push({
22167
22168
  text: normalizeBroadcastText(introText, isZh),
22168
22169
  gap_ms: 700,
@@ -22197,7 +22198,7 @@ function buildNewsVoiceScript(docs, options) {
22197
22198
  });
22198
22199
  }
22199
22200
  });
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!`;
22201
+ 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
22202
  segments.push({
22202
22203
  text: normalizeBroadcastText(outroText, isZh),
22203
22204
  gap_ms: 300,
@@ -313,32 +313,41 @@ export function buildNewsVoiceScript(docs: Doc[], options?: ScriptBuilderOptions
313
313
  const defaultEffectPreset = options?.effectPreset;
314
314
  const broadcastDate = options?.date ?? new Date();
315
315
  const dateStr = formatBroadcastDate(broadcastDate, language);
316
+ // Column of 咸话咸说. The show is not the speaker; the host is.
317
+ const showName = '咸话咸说之每日AI乱炖';
318
+ let hostName =
319
+ (options?.speakers?.host?.name as string) ||
320
+ voiceProfile.replace(/[-_]?(news|voice|bot|profile)$/i, '') ||
321
+ voiceProfile;
322
+ if (hostName.length > 0) {
323
+ hostName = hostName.charAt(0).toUpperCase() + hostName.slice(1);
324
+ }
316
325
 
317
326
  if (docs.length === 0) {
318
- const title = options?.title || (isZh ? 'AI 乱炖(暂无更新)' : 'AI 乱炖 (No Updates)');
327
+ const title = options?.title || (isZh ? '每日AI乱炖(暂无更新)' : '每日AI乱炖 (No Updates)');
319
328
  const segments: VoiceScriptSegment[] = isZh
320
329
  ? [
321
330
  {
322
- // Task 0189 R1/R4: honest no-content episode — the copy names the show
323
- // (咸话咸说) and the column (AI 乱炖), and never claims a news digest happened.
324
- text: `大家好,今天是${dateStr}。欢迎收听「咸话咸说」的「AI 乱炖」栏目,我是${voiceProfile}。今天没有足够扎实的可聊内容。`,
331
+ // Honest no-content episode: names the show and the host, and never claims
332
+ // a news digest happened.
333
+ text: `大家好,今天是${dateStr}。这里是由${hostName}为你带来的${showName}。今天没有足够扎实的可聊内容。`,
325
334
  gap_ms: 400,
326
335
  emotion: 'calm',
327
336
  },
328
337
  {
329
- text: `感谢您的收听,我是${voiceProfile},我们下期节目再见。`,
338
+ text: `感谢您的收听,我是${hostName},我们下期节目再见。`,
330
339
  gap_ms: 200,
331
340
  emotion: 'warm',
332
341
  },
333
342
  ]
334
343
  : [
335
344
  {
336
- text: `Hello and welcome. Today is ${dateStr}. This is ${voiceProfile} with AI 乱炖, our chat about AI tools, papers, and hands-on practice. There is nothing solid enough to share today.`,
345
+ 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.`,
337
346
  gap_ms: 400,
338
347
  emotion: 'calm',
339
348
  },
340
349
  {
341
- text: `Thank you for listening. This is ${voiceProfile}, and have a great day.`,
350
+ text: `Thank you for listening. This is ${hostName}, and have a great day.`,
342
351
  gap_ms: 200,
343
352
  emotion: 'warm',
344
353
  },
@@ -356,17 +365,9 @@ export function buildNewsVoiceScript(docs: Doc[], options?: ScriptBuilderOptions
356
365
  });
357
366
  }
358
367
 
359
- const title = options?.title || (isZh ? `AI 乱炖(共${docs.length}条)` : `AI 乱炖 (${docs.length} stories)`);
368
+ const title = options?.title || (isZh ? `每日AI乱炖(共${docs.length}条)` : `每日AI乱炖 (${docs.length} stories)`);
360
369
  const segments: VoiceScriptSegment[] = [];
361
370
 
362
- let hostName =
363
- (options?.speakers?.host?.name as string) ||
364
- voiceProfile.replace(/[-_]?(news|voice|bot|profile)$/i, '') ||
365
- voiceProfile;
366
- if (hostName.length > 0) {
367
- hostName = hostName.charAt(0).toUpperCase() + hostName.slice(1);
368
- }
369
-
370
371
  // F613: the plan owns the words on the zh path; en keeps templates (design: substitution is
371
372
  // zh-only). Items are matched to docs by id and doc order wins; plan item order is ignored.
372
373
  const scriptPlan = isZh ? options?.scriptPlan : undefined;
@@ -384,10 +385,9 @@ export function buildNewsVoiceScript(docs: Doc[], options?: ScriptBuilderOptions
384
385
  ? scriptPlan
385
386
  ? // F613: fixed greeting stays builder-owned; the plan only fills the slot between
386
387
  // greeting and first story (the template tail 从「今天科技圈有几条…正题。」 is replaced).
387
- // Task 0189 R1: the greeting names the show (咸话咸说) and the column (AI 乱炖).
388
- `大家好,今天是${dateStr},欢迎收听「咸话咸说」的「AI 乱炖」栏目,我是${hostName}。${scriptPlan.intro}`
389
- : `大家好,今天是${dateStr},欢迎收听「咸话咸说」的「AI 乱炖」栏目,我是${hostName}。今天我从 AI 工具、论文和实践中整理了${countText}值得聊的内容${titlesSummary ? `,包括${titlesSummary}` : ''},咱们一条条来聊。`
390
- : `Hello and welcome. Today is ${dateStr}. This is ${hostName} with AI 乱炖, where we talk about AI tools, papers, and hands-on practice. In today's episode, we have ${countText} stories. Let's dive straight in.`;
388
+ `大家好,今天是${dateStr}。这里是由${hostName}为你带来的${showName}。${scriptPlan.intro}`
389
+ : `大家好,今天是${dateStr}。这里是由${hostName}为你带来的${showName}。今天我从 AI 工具、论文和实践中整理了${countText}值得聊的内容${titlesSummary ? `,包括${titlesSummary}` : ''},咱们一条条来聊。`
390
+ : `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.`;
391
391
 
392
392
  segments.push({
393
393
  text: normalizeBroadcastText(introText, isZh),
@@ -451,14 +451,13 @@ export function buildNewsVoiceScript(docs: Doc[], options?: ScriptBuilderOptions
451
451
  });
452
452
 
453
453
  // 3. Outro segment: Warm, conversational wrap-up. F613: the plan outro replaces the template
454
- // wrap-up head; the fixed sign-off stays builder-owned.
455
- // Task 0189 R1: the AI-voice disclosure is part of the builder-owned sign-off (not the plan),
456
- // so it is spoken in every episode — Apple Podcasts guideline 1.11 requires it in the content.
454
+ // wrap-up head; the fixed sign-off stays builder-owned. The column settings already state
455
+ // how the episode is produced, so the sign-off does not repeat an AI-production closer.
457
456
  const outroText = isZh
458
457
  ? scriptPlan
459
- ? `${scriptPlan.outro}本期音频为 AI 合成配音。感谢您的收听,我是${hostName},祝您拥有充实高效的一天,我们下期节目不见不散!`
460
- : `好了,本期AI乱炖就聊到这里。希望今天这些工具、论文和实践的经验对您有启发。本期音频为 AI 合成配音。感谢您的收听,我是${hostName},祝您拥有充实高效的一天,我们下期节目不见不散!`
461
- : `That wraps up this episode of AI 乱炖. 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!`;
458
+ ? `${scriptPlan.outro}感谢您的收听,我是${hostName},祝您拥有充实高效的一天,我们下期节目不见不散!`
459
+ : `好了,本期每日AI乱炖就聊到这里。希望今天这些工具、论文和实践的经验对您有启发。感谢您的收听,我是${hostName},祝您拥有充实高效的一天,我们下期节目不见不散!`
460
+ : `That wraps up this episode of 每日AI乱炖. I hope today's takeaways were useful. Thank you for listening. This is ${hostName}, wishing you a productive and wonderful day. Until next time!`;
462
461
 
463
462
  segments.push({
464
463
  text: normalizeBroadcastText(outroText, isZh),