@gobing-ai/knowledge-kit 0.0.13 → 0.0.14
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 +20 -0
- package/package.json +1 -1
- package/plugins/generations/content-gen/dist/index.js +20 -0
- package/plugins/generations/core-facts-gen/dist/index.js +20 -0
- package/plugins/generations/daily-article-gen/dist/index.js +29 -1
- package/plugins/generations/daily-article-gen/src/index.ts +13 -1
- package/plugins/generations/dailynews-gen/dist/index.js +20 -0
- package/plugins/generations/episode-plan-gen/dist/index.js +24 -0
- package/plugins/generations/episode-plan-gen/src/index.ts +11 -0
- package/plugins/generations/image-gen/dist/index.js +2296 -53
- package/plugins/generations/image-gen/src/providers/agnes.ts +110 -0
- package/plugins/generations/image-gen/src/providers/azure.ts +153 -0
- package/plugins/generations/image-gen/src/providers/codex-cli.ts +170 -0
- package/plugins/generations/image-gen/src/providers/dashscope.ts +485 -0
- package/plugins/generations/image-gen/src/providers/google.ts +268 -0
- package/plugins/generations/image-gen/src/providers/huggingface.ts +59 -0
- package/plugins/generations/image-gen/src/providers/jimeng.ts +259 -0
- package/plugins/generations/image-gen/src/providers/minimax.ts +171 -0
- package/plugins/generations/image-gen/src/providers/openai.ts +319 -0
- package/plugins/generations/image-gen/src/providers/openrouter.ts +257 -0
- package/plugins/generations/image-gen/src/providers/refs.ts +24 -0
- package/plugins/generations/image-gen/src/providers/replicate.ts +279 -0
- package/plugins/generations/image-gen/src/providers/seedream.ts +1 -1
- package/plugins/generations/image-gen/src/providers/types.ts +52 -51
- package/plugins/generations/image-gen/src/providers/zai.ts +237 -0
- package/plugins/generations/news-report-gen/dist/index.js +22193 -0
- package/plugins/generations/news-report-gen/package.json +17 -0
- package/plugins/generations/news-report-gen/plugin.json +7 -0
- package/plugins/generations/news-report-gen/src/index.ts +308 -0
- package/plugins/generations/news-report-gen/tsconfig.json +4 -0
- package/plugins/generations/omni-voice-gen/Makefile +14 -0
- package/plugins/generations/omni-voice-gen/README.md +112 -0
- package/plugins/generations/omni-voice-gen/bin/omni-voice-gen +2 -0
- package/plugins/generations/omni-voice-gen/dist/omni-voice-gen-prr8skpb. +2 -0
- package/plugins/generations/omni-voice-gen/dist/omni-voice-gen.js +6 -0
- package/plugins/generations/omni-voice-gen/plugin.json +6 -0
- package/plugins/generations/omni-voice-gen/profiles.json +12 -0
- package/plugins/generations/omni-voice-gen/pyproject.toml +25 -0
- package/plugins/generations/omni-voice-gen/scripts/coverage_gate.py +74 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/__init__.py +1 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/__main__.py +39 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/audio.py +190 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/backend.py +150 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/contract.py +76 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/mp3.py +60 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/pipeline.py +289 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/profiles.py +100 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/qc.py +234 -0
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/voicescript.py +352 -0
- package/plugins/generations/omni-voice-gen/uv.lock +3510 -0
- package/plugins/generations/voice-gen/dist/index.js +30 -2
- package/plugins/generations/voice-gen/src/index.ts +16 -1
- package/plugins/generations/voice-gen/src/voicebox-client.ts +3 -1
- package/plugins/ingestions/aihot-ingest/dist/index.js +20 -0
- package/plugins/ingestions/horizon-ingest/dist/index.js +20 -0
- package/plugins/ingestions/last30days-ingest/dist/index.js +20 -0
- package/plugins/ingestions/web-search/dist/index.js +20 -0
- package/plugins/kk/commands/image-extract.md +40 -0
- package/plugins/kk/commands/image-generate.md +18 -1
- package/plugins/kk/plugin.json +1 -1
- package/plugins/kk/skills/image-authoring/SKILL.md +10 -3
- package/plugins/kk/skills/image-authoring/references/format-drafting.md +57 -0
- package/plugins/kk/skills/image-authoring/references/style-extraction.md +14 -9
- package/plugins/kk/workflows/kk-daily-ai-voice.yaml +130 -30
- package/plugins/publishings/emdash-pub/dist/index.js +20 -0
- package/plugins/publishings/podcast-pub/dist/index.js +57 -3
- package/plugins/publishings/podcast-pub/src/index.ts +18 -2
- package/plugins/publishings/podcast-pub/src/show-notes.ts +56 -9
- package/plugins/publishings/qiita-pub/dist/index.js +20 -0
- package/plugins/publishings/surfdash-pub/dist/index.js +96 -6
- package/plugins/publishings/surfdash-pub/src/index.ts +109 -9
- package/plugins/publishings/zenn-pub/dist/index.js +20 -0
- package/plugins/sp/scripts/batch-preflight.mjs +346 -0
- package/plugins/sp/scripts/batch-preflight.ts +459 -0
- package/plugins/sp/scripts/daily-summary/daily-summary.mjs +615 -0
- package/plugins/sp/scripts/daily-summary/daily-summary.ts +846 -0
- package/plugins/sp/scripts/daily-summary/logger.ts +28 -0
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +223 -0
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +367 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +132 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.ts +169 -0
- package/plugins/sp/scripts/feature-dev-precheck.mjs +171 -0
- package/plugins/sp/scripts/feature-dev-precheck.ts +238 -0
- package/plugins/sp/scripts/feature-sync-bounded.mjs +285 -0
- package/plugins/sp/scripts/feature-sync-bounded.ts +478 -0
- package/plugins/sp/scripts/history-anatomy-cache.mjs +902 -0
- package/plugins/sp/scripts/history-anatomy-cache.ts +1028 -0
- package/plugins/sp/scripts/idea-handoff.mjs +22 -0
- package/plugins/sp/scripts/idea-handoff.ts +44 -0
- package/plugins/sp/scripts/inline-pipeline-parity-check.ts +185 -0
- package/plugins/sp/scripts/inline-run-setup.ts +198 -0
- package/plugins/sp/scripts/pr-reviewing.mjs +769 -0
- package/plugins/sp/scripts/pr-reviewing.ts +925 -0
- package/plugins/sp/scripts/quality-gate.mjs +179 -0
- package/plugins/sp/scripts/quality-gate.ts +217 -0
- package/plugins/sp/scripts/script-contract-check.ts +319 -0
- package/plugins/sp/scripts/stage-registry-adapter.ts +1533 -0
- package/plugins/sp/scripts/surface-drift-inventory.ts +929 -0
- package/plugins/sp/scripts/task-evidence-precheck.ts +181 -0
- package/plugins/sp/scripts/task-size-precheck.ts +175 -0
- package/plugins/sp/scripts/transition-shim-check.ts +238 -0
- package/plugins/sp/scripts/validate-commands.ts +689 -0
- package/plugins/sp/scripts/validate-flag-contracts.ts +878 -0
- package/plugins/sp/scripts/verify-answer-lint.ts +530 -0
- package/plugins/sp/scripts/workflow-step-profile.mjs +316 -0
- package/plugins/sp/scripts/workflow-step-profile.ts +456 -0
- package/plugins/sp/scripts/wrapup-steps.mjs +373 -0
- package/plugins/sp/scripts/wrapup-steps.ts +466 -0
package/dist/index.js
CHANGED
|
@@ -26054,6 +26054,26 @@ var ResultSchema = exports_external.object({
|
|
|
26054
26054
|
metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
26055
26055
|
});
|
|
26056
26056
|
var DocListSchema = exports_external.array(DocSchema);
|
|
26057
|
+
var omniVoiceGenContentSchema = ContentSchema.extend({
|
|
26058
|
+
format: exports_external.literal("audio"),
|
|
26059
|
+
metadata: exports_external.looseObject({
|
|
26060
|
+
generator: exports_external.literal("kk:omni-voice-gen"),
|
|
26061
|
+
audioPath: exports_external.string(),
|
|
26062
|
+
duration: exports_external.number(),
|
|
26063
|
+
segments: exports_external.array(exports_external.looseObject({
|
|
26064
|
+
generationId: exports_external.string(),
|
|
26065
|
+
profile: exports_external.string(),
|
|
26066
|
+
speaker: exports_external.string().optional(),
|
|
26067
|
+
emotion: exports_external.string().optional(),
|
|
26068
|
+
duration: exports_external.number(),
|
|
26069
|
+
verifyRetries: exports_external.number(),
|
|
26070
|
+
transcription: exports_external.string().optional(),
|
|
26071
|
+
loudnessDip: exports_external.boolean().optional()
|
|
26072
|
+
})),
|
|
26073
|
+
mp3Path: exports_external.string().optional(),
|
|
26074
|
+
qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
26075
|
+
})
|
|
26076
|
+
});
|
|
26057
26077
|
|
|
26058
26078
|
// ../../packages/kk-core/src/kinds.ts
|
|
26059
26079
|
var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
|
package/package.json
CHANGED
|
@@ -21847,6 +21847,26 @@ var ResultSchema = exports_external.object({
|
|
|
21847
21847
|
metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21848
21848
|
});
|
|
21849
21849
|
var DocListSchema = exports_external.array(DocSchema);
|
|
21850
|
+
var omniVoiceGenContentSchema = ContentSchema.extend({
|
|
21851
|
+
format: exports_external.literal("audio"),
|
|
21852
|
+
metadata: exports_external.looseObject({
|
|
21853
|
+
generator: exports_external.literal("kk:omni-voice-gen"),
|
|
21854
|
+
audioPath: exports_external.string(),
|
|
21855
|
+
duration: exports_external.number(),
|
|
21856
|
+
segments: exports_external.array(exports_external.looseObject({
|
|
21857
|
+
generationId: exports_external.string(),
|
|
21858
|
+
profile: exports_external.string(),
|
|
21859
|
+
speaker: exports_external.string().optional(),
|
|
21860
|
+
emotion: exports_external.string().optional(),
|
|
21861
|
+
duration: exports_external.number(),
|
|
21862
|
+
verifyRetries: exports_external.number(),
|
|
21863
|
+
transcription: exports_external.string().optional(),
|
|
21864
|
+
loudnessDip: exports_external.boolean().optional()
|
|
21865
|
+
})),
|
|
21866
|
+
mp3Path: exports_external.string().optional(),
|
|
21867
|
+
qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21868
|
+
})
|
|
21869
|
+
});
|
|
21850
21870
|
|
|
21851
21871
|
// ../../packages/kk-core/src/kinds.ts
|
|
21852
21872
|
var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
|
|
@@ -21848,6 +21848,26 @@ var ResultSchema = exports_external.object({
|
|
|
21848
21848
|
metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21849
21849
|
});
|
|
21850
21850
|
var DocListSchema = exports_external.array(DocSchema);
|
|
21851
|
+
var omniVoiceGenContentSchema = ContentSchema.extend({
|
|
21852
|
+
format: exports_external.literal("audio"),
|
|
21853
|
+
metadata: exports_external.looseObject({
|
|
21854
|
+
generator: exports_external.literal("kk:omni-voice-gen"),
|
|
21855
|
+
audioPath: exports_external.string(),
|
|
21856
|
+
duration: exports_external.number(),
|
|
21857
|
+
segments: exports_external.array(exports_external.looseObject({
|
|
21858
|
+
generationId: exports_external.string(),
|
|
21859
|
+
profile: exports_external.string(),
|
|
21860
|
+
speaker: exports_external.string().optional(),
|
|
21861
|
+
emotion: exports_external.string().optional(),
|
|
21862
|
+
duration: exports_external.number(),
|
|
21863
|
+
verifyRetries: exports_external.number(),
|
|
21864
|
+
transcription: exports_external.string().optional(),
|
|
21865
|
+
loudnessDip: exports_external.boolean().optional()
|
|
21866
|
+
})),
|
|
21867
|
+
mp3Path: exports_external.string().optional(),
|
|
21868
|
+
qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21869
|
+
})
|
|
21870
|
+
});
|
|
21851
21871
|
|
|
21852
21872
|
// ../../packages/kk-core/src/kinds.ts
|
|
21853
21873
|
var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
|
|
@@ -21848,6 +21848,26 @@ var ResultSchema = exports_external.object({
|
|
|
21848
21848
|
metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21849
21849
|
});
|
|
21850
21850
|
var DocListSchema = exports_external.array(DocSchema);
|
|
21851
|
+
var omniVoiceGenContentSchema = ContentSchema.extend({
|
|
21852
|
+
format: exports_external.literal("audio"),
|
|
21853
|
+
metadata: exports_external.looseObject({
|
|
21854
|
+
generator: exports_external.literal("kk:omni-voice-gen"),
|
|
21855
|
+
audioPath: exports_external.string(),
|
|
21856
|
+
duration: exports_external.number(),
|
|
21857
|
+
segments: exports_external.array(exports_external.looseObject({
|
|
21858
|
+
generationId: exports_external.string(),
|
|
21859
|
+
profile: exports_external.string(),
|
|
21860
|
+
speaker: exports_external.string().optional(),
|
|
21861
|
+
emotion: exports_external.string().optional(),
|
|
21862
|
+
duration: exports_external.number(),
|
|
21863
|
+
verifyRetries: exports_external.number(),
|
|
21864
|
+
transcription: exports_external.string().optional(),
|
|
21865
|
+
loudnessDip: exports_external.boolean().optional()
|
|
21866
|
+
})),
|
|
21867
|
+
mp3Path: exports_external.string().optional(),
|
|
21868
|
+
qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21869
|
+
})
|
|
21870
|
+
});
|
|
21851
21871
|
|
|
21852
21872
|
// ../../packages/kk-core/src/kinds.ts
|
|
21853
21873
|
var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
|
|
@@ -21970,13 +21990,21 @@ function renderDailyArticle(docs, date6) {
|
|
|
21970
21990
|
${items}
|
|
21971
21991
|
`;
|
|
21972
21992
|
}
|
|
21993
|
+
var AI_NEWS_TAG = "ai-news";
|
|
21994
|
+
function tagsFor(docs) {
|
|
21995
|
+
const existing = docs.flatMap((d) => {
|
|
21996
|
+
const meta3 = d.metadata;
|
|
21997
|
+
return Array.isArray(meta3?.tags) ? meta3.tags.filter((t) => typeof t === "string") : [];
|
|
21998
|
+
});
|
|
21999
|
+
return [AI_NEWS_TAG, ...existing.filter((t) => t !== AI_NEWS_TAG)];
|
|
22000
|
+
}
|
|
21973
22001
|
function docsToContent(docs, date6) {
|
|
21974
22002
|
return ContentSchema.parse({
|
|
21975
22003
|
title: `\u6BCF\u65E5 AI \u8D44\u8BAF \u2014 ${date6}`,
|
|
21976
22004
|
body: renderDailyArticle(docs, date6),
|
|
21977
22005
|
format: "markdown",
|
|
21978
22006
|
references: docs.filter((d) => d.sourceUri).map((d) => ({ url: d.sourceUri, title: d.title, cite: d.id })),
|
|
21979
|
-
metadata: { generator: "kk:daily-article", date: date6, doc_count: docs.length }
|
|
22007
|
+
metadata: { generator: "kk:daily-article", date: date6, doc_count: docs.length, tags: tagsFor(docs) }
|
|
21980
22008
|
});
|
|
21981
22009
|
}
|
|
21982
22010
|
async function processGeneratorIO(inputPath, outputPath) {
|
|
@@ -42,6 +42,18 @@ export function renderDailyArticle(docs: Doc[], date: string): string {
|
|
|
42
42
|
return `# 每日 AI 资讯 — ${date}\n\n本期共 ${docs.length} 条新闻,均附可点击来源链接。\n\n${items}\n`;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/** Single-source daily tag: stamped on every Content this generator emits (task 0119). */
|
|
46
|
+
const AI_NEWS_TAG = 'ai-news';
|
|
47
|
+
|
|
48
|
+
/** Merge existing item tags (deduped) with the mandatory `ai-news` tag, first position. */
|
|
49
|
+
function tagsFor(docs: Doc[]): string[] {
|
|
50
|
+
const existing = docs.flatMap((d) => {
|
|
51
|
+
const meta = d.metadata as Record<string, unknown> | undefined;
|
|
52
|
+
return Array.isArray(meta?.tags) ? meta.tags.filter((t): t is string => typeof t === 'string') : [];
|
|
53
|
+
});
|
|
54
|
+
return [AI_NEWS_TAG, ...existing.filter((t) => t !== AI_NEWS_TAG)];
|
|
55
|
+
}
|
|
56
|
+
|
|
45
57
|
/** Build the article Content from a merged Doc[]. */
|
|
46
58
|
export function docsToContent(docs: Doc[], date: string): Content {
|
|
47
59
|
return ContentSchema.parse({
|
|
@@ -49,7 +61,7 @@ export function docsToContent(docs: Doc[], date: string): Content {
|
|
|
49
61
|
body: renderDailyArticle(docs, date),
|
|
50
62
|
format: 'markdown',
|
|
51
63
|
references: docs.filter((d) => d.sourceUri).map((d) => ({ url: d.sourceUri, title: d.title, cite: d.id })),
|
|
52
|
-
metadata: { generator: 'kk:daily-article', date, doc_count: docs.length },
|
|
64
|
+
metadata: { generator: 'kk:daily-article', date, doc_count: docs.length, tags: tagsFor(docs) },
|
|
53
65
|
});
|
|
54
66
|
}
|
|
55
67
|
|
|
@@ -21848,6 +21848,26 @@ var ResultSchema = exports_external.object({
|
|
|
21848
21848
|
metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21849
21849
|
});
|
|
21850
21850
|
var DocListSchema = exports_external.array(DocSchema);
|
|
21851
|
+
var omniVoiceGenContentSchema = ContentSchema.extend({
|
|
21852
|
+
format: exports_external.literal("audio"),
|
|
21853
|
+
metadata: exports_external.looseObject({
|
|
21854
|
+
generator: exports_external.literal("kk:omni-voice-gen"),
|
|
21855
|
+
audioPath: exports_external.string(),
|
|
21856
|
+
duration: exports_external.number(),
|
|
21857
|
+
segments: exports_external.array(exports_external.looseObject({
|
|
21858
|
+
generationId: exports_external.string(),
|
|
21859
|
+
profile: exports_external.string(),
|
|
21860
|
+
speaker: exports_external.string().optional(),
|
|
21861
|
+
emotion: exports_external.string().optional(),
|
|
21862
|
+
duration: exports_external.number(),
|
|
21863
|
+
verifyRetries: exports_external.number(),
|
|
21864
|
+
transcription: exports_external.string().optional(),
|
|
21865
|
+
loudnessDip: exports_external.boolean().optional()
|
|
21866
|
+
})),
|
|
21867
|
+
mp3Path: exports_external.string().optional(),
|
|
21868
|
+
qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21869
|
+
})
|
|
21870
|
+
});
|
|
21851
21871
|
|
|
21852
21872
|
// ../../packages/kk-core/src/kinds.ts
|
|
21853
21873
|
var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
|
|
@@ -21848,6 +21848,26 @@ var ResultSchema = exports_external.object({
|
|
|
21848
21848
|
metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21849
21849
|
});
|
|
21850
21850
|
var DocListSchema = exports_external.array(DocSchema);
|
|
21851
|
+
var omniVoiceGenContentSchema = ContentSchema.extend({
|
|
21852
|
+
format: exports_external.literal("audio"),
|
|
21853
|
+
metadata: exports_external.looseObject({
|
|
21854
|
+
generator: exports_external.literal("kk:omni-voice-gen"),
|
|
21855
|
+
audioPath: exports_external.string(),
|
|
21856
|
+
duration: exports_external.number(),
|
|
21857
|
+
segments: exports_external.array(exports_external.looseObject({
|
|
21858
|
+
generationId: exports_external.string(),
|
|
21859
|
+
profile: exports_external.string(),
|
|
21860
|
+
speaker: exports_external.string().optional(),
|
|
21861
|
+
emotion: exports_external.string().optional(),
|
|
21862
|
+
duration: exports_external.number(),
|
|
21863
|
+
verifyRetries: exports_external.number(),
|
|
21864
|
+
transcription: exports_external.string().optional(),
|
|
21865
|
+
loudnessDip: exports_external.boolean().optional()
|
|
21866
|
+
})),
|
|
21867
|
+
mp3Path: exports_external.string().optional(),
|
|
21868
|
+
qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
|
21869
|
+
})
|
|
21870
|
+
});
|
|
21851
21871
|
|
|
21852
21872
|
// ../../packages/kk-core/src/kinds.ts
|
|
21853
21873
|
var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
|
|
@@ -22256,11 +22276,15 @@ function planEpisode(docs, options) {
|
|
|
22256
22276
|
return selected.map((r) => {
|
|
22257
22277
|
const meta3 = asRecord(r.doc.metadata);
|
|
22258
22278
|
const ascii = asciiRatio(r.doc.title ?? "");
|
|
22279
|
+
const brief = (r.doc.body ?? "").trim().split(/(?<=[\u3002\uFF01\uFF1F])\s*/).slice(0, 2).join("");
|
|
22280
|
+
const published = docTimestamp(r.doc);
|
|
22259
22281
|
return {
|
|
22260
22282
|
...r.doc,
|
|
22261
22283
|
metadata: {
|
|
22262
22284
|
...meta3,
|
|
22263
22285
|
planScore: r.score,
|
|
22286
|
+
...brief.length > 0 ? { brief } : {},
|
|
22287
|
+
...published !== null ? { publishAt: new Date(published).toISOString() } : {},
|
|
22264
22288
|
...ascii > 0.5 ? { needsTranslation: true } : {},
|
|
22265
22289
|
...r.mergedFrom.length > 0 ? { mergedFrom: r.mergedFrom } : {}
|
|
22266
22290
|
}
|
|
@@ -442,11 +442,22 @@ export function planEpisode(docs: Doc[], options: PlanOptions): Doc[] {
|
|
|
442
442
|
return selected.map((r) => {
|
|
443
443
|
const meta = asRecord(r.doc.metadata);
|
|
444
444
|
const ascii = asciiRatio(r.doc.title ?? '');
|
|
445
|
+
// Task 0118: 1–2-sentence briefing (first two 。!?-terminated sentences of the
|
|
446
|
+
// cleaned body) + best-effort publish timestamp ride the plan metadata so the
|
|
447
|
+
// podcast show-notes brief/timeline render stays deterministic, no LLM.
|
|
448
|
+
const brief = (r.doc.body ?? '')
|
|
449
|
+
.trim()
|
|
450
|
+
.split(/(?<=[。!?])\s*/)
|
|
451
|
+
.slice(0, 2)
|
|
452
|
+
.join('');
|
|
453
|
+
const published = docTimestamp(r.doc);
|
|
445
454
|
return {
|
|
446
455
|
...r.doc,
|
|
447
456
|
metadata: {
|
|
448
457
|
...meta,
|
|
449
458
|
planScore: r.score,
|
|
459
|
+
...(brief.length > 0 ? { brief } : {}),
|
|
460
|
+
...(published !== null ? { publishAt: new Date(published).toISOString() } : {}),
|
|
450
461
|
...(ascii > 0.5 ? { needsTranslation: true } : {}),
|
|
451
462
|
...(r.mergedFrom.length > 0 ? { mergedFrom: r.mergedFrom } : {}),
|
|
452
463
|
},
|