@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/dist/index.js +25191 -24167
- package/package.json +4 -4
- package/plugins/generations/content-gen/dist/index.js +9 -9
- package/plugins/generations/core-facts-gen/dist/index.js +12 -12
- package/plugins/generations/daily-article-gen/dist/index.js +14 -20
- package/plugins/generations/daily-article-gen/src/index.ts +7 -11
- package/plugins/generations/dailynews-gen/dist/index.js +22 -21
- package/plugins/generations/dailynews-gen/src/script-builder.ts +25 -26
- package/plugins/generations/episode-plan-gen/dist/index.js +12 -12
- package/plugins/generations/gemini-tts/dist/index.js +9 -9
- package/plugins/generations/image-gen/dist/index.js +26 -11
- package/plugins/generations/image-gen/presets/formats/xhs-card.yaml +16 -14
- package/plugins/generations/image-gen/presets/styles/xhs-knowledge.yaml +2 -2
- package/plugins/generations/image-gen/src/compose/card.ts +17 -2
- package/plugins/generations/news-report-gen/dist/index.js +12 -12
- package/plugins/generations/voice-gen/dist/index.js +9 -9
- package/plugins/ingestions/aihot-ingest/dist/index.js +12 -12
- package/plugins/ingestions/horizon-ingest/dist/index.js +12 -12
- package/plugins/ingestions/karakeep-local/dist/index.js +13 -13
- package/plugins/ingestions/last30days-ingest/dist/index.js +12 -12
- package/plugins/ingestions/web-search/dist/index.js +10 -10
- package/plugins/kk/decisions/extract/ai-news.yaml +6 -0
- package/plugins/kk/decisions/kk-items.yaml +69 -3
- package/plugins/kk/plugin.json +1 -1
- package/plugins/kk/scripts/daily-stages.ts +539 -49
- package/plugins/kk/scripts/daily-voice-style.zh.md +15 -10
- package/plugins/kk/scripts/kk-workflow-stages.ts +6 -3
- package/plugins/kk/skills/content-safety/SKILL.md +1 -1
- package/plugins/kk/skills/content-safety/references/platforms/apple-podcasts.md +2 -2
- package/plugins/kk/workflows/kk-collect.yaml +7 -9
- package/plugins/kk/workflows/kk-daily-ai-voice2.yaml +163 -44
- package/plugins/kk/workflows/kk-daily-safety.yaml +8 -11
- package/plugins/publishings/emdash-pub/dist/index.js +9 -9
- package/plugins/publishings/infoq-pub/dist/index.js +22 -22
- package/plugins/publishings/juejin-pub/dist/index.js +22 -22
- package/plugins/publishings/medium-pub/dist/index.js +9 -9
- package/plugins/publishings/podcast-pub/dist/index.js +9 -9
- package/plugins/publishings/qiita-pub/dist/index.js +9 -9
- package/plugins/publishings/substack-pub/dist/index.js +22 -22
- package/plugins/publishings/surfdash-pub/dist/index.js +9 -9
- package/plugins/publishings/wechatmp-pub/dist/index.js +22 -22
- package/plugins/publishings/x-pub/dist/index.js +22 -22
- package/plugins/publishings/xhs-pub/dist/index.js +76 -27
- package/plugins/publishings/xhs-pub/src/flow.ts +9 -3
- package/plugins/publishings/xhs-pub/src/index.ts +111 -5
- 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.
|
|
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.
|
|
50
|
-
"@gobing-ai/ts-runtime": "^0.5.
|
|
51
|
-
"@gobing-ai/ts-utils": "^0.5.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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 ? `\
|
|
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
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
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
|
|
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
|
-
?
|
|
122
|
-
: '
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 ? "
|
|
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\
|
|
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${
|
|
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
|
|
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 ${
|
|
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 ?
|
|
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}\
|
|
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}\
|
|
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
|
|
327
|
+
const title = options?.title || (isZh ? '每日AI乱炖(暂无更新)' : '每日AI乱炖 (No Updates)');
|
|
319
328
|
const segments: VoiceScriptSegment[] = isZh
|
|
320
329
|
? [
|
|
321
330
|
{
|
|
322
|
-
//
|
|
323
|
-
//
|
|
324
|
-
text: `大家好,今天是${dateStr}
|
|
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: `感谢您的收听,我是${
|
|
338
|
+
text: `感谢您的收听,我是${hostName},我们下期节目再见。`,
|
|
330
339
|
gap_ms: 200,
|
|
331
340
|
emotion: 'warm',
|
|
332
341
|
},
|
|
333
342
|
]
|
|
334
343
|
: [
|
|
335
344
|
{
|
|
336
|
-
text: `Hello
|
|
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 ${
|
|
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 ?
|
|
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
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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
|
-
//
|
|
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}
|
|
460
|
-
:
|
|
461
|
-
: `That wraps up this episode of AI
|
|
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),
|