@leiboss/dsh-voiceover 0.0.0-stage → 0.3.0
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/LICENSE +21 -0
- package/README.md +187 -2
- package/client/client.js +985 -0
- package/cordis.patch.yml +13 -0
- package/dist/api.d.ts +52 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +301 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts +40 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +303 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.js +985 -0
- package/dist/http-types.d.ts +26 -0
- package/dist/http-types.d.ts.map +1 -0
- package/dist/http-types.js +2 -0
- package/dist/http-types.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +410 -0
- package/dist/index.js.map +1 -0
- package/dist/llm.d.ts +60 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +113 -0
- package/dist/llm.js.map +1 -0
- package/dist/operations.d.ts +41 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +77 -0
- package/dist/operations.js.map +1 -0
- package/dist/panel.d.ts +42 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +212 -0
- package/dist/panel.js.map +1 -0
- package/dist/pipeline.d.ts +141 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +519 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/prompts.d.ts +58 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +169 -0
- package/dist/prompts.js.map +1 -0
- package/dist/serve-entry.d.ts +3 -0
- package/dist/serve-entry.d.ts.map +1 -0
- package/dist/serve-entry.js +11 -0
- package/dist/serve-entry.js.map +1 -0
- package/dist/snapshot.d.ts +48 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +82 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/subtitle.d.ts +49 -0
- package/dist/subtitle.d.ts.map +1 -0
- package/dist/subtitle.js +163 -0
- package/dist/subtitle.js.map +1 -0
- package/dist/types.d.ts +148 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +16 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +47 -0
- package/dist/util.js.map +1 -0
- package/dist/validate.d.ts +15 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +186 -0
- package/dist/validate.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +83 -3
- package/schemas/manifest.schema.json +132 -0
- package/schemas/outline.schema.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/pipeline.js
ADDED
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pipeline: plan chapters, adapt each one for listening, audit it, and
|
|
3
|
+
* synthesize audio + subtitles. Every stage persists before it finishes, so a
|
|
4
|
+
* crash resumes at the last completed chapter instead of restarting the book.
|
|
5
|
+
*
|
|
6
|
+
* Dependency inversion on purpose: `Completer` and `Synthesizer` are ports. That
|
|
7
|
+
* keeps the whole core testable without a host, a network, or an audio engine.
|
|
8
|
+
*/
|
|
9
|
+
import { copyFile, mkdir, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { callJson, LlmError } from "./llm.js";
|
|
12
|
+
import { adaptPrompt, auditPrompt, chunkPrompt, coverageErrors, outlinePrompt, subtitlePrompt } from "./prompts.js";
|
|
13
|
+
import { alignUnits, formatSrt, splitUnitsFallback } from "./subtitle.js";
|
|
14
|
+
import { PROMPT_VERSION, } from "./types.js";
|
|
15
|
+
import { readJson, sha256, sha256Tag, shortId, splitParagraphs, writeJsonAtomic } from "./util.js";
|
|
16
|
+
import { validateManifest, validateOutline, ValidationError } from "./validate.js";
|
|
17
|
+
/** Target characters per planned chapter when no model is available. */
|
|
18
|
+
const FALLBACK_CHAPTER_CHARS = 1400;
|
|
19
|
+
/**
|
|
20
|
+
* Canonical text used for identity and planning.
|
|
21
|
+
*
|
|
22
|
+
* Every caller (plugin tool, daemon, rerun) must key projects by this string,
|
|
23
|
+
* not by the raw input: the persisted source file differs from the original by
|
|
24
|
+
* a trailing newline, and identity must survive that round trip.
|
|
25
|
+
*/
|
|
26
|
+
export function normalizeSource(text) {
|
|
27
|
+
return splitParagraphs(stripMarkup(text)).join('\n\n');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Remove Markdown syntax that must never be spoken.
|
|
31
|
+
*
|
|
32
|
+
* Without a model the pipeline reads the source as written, so `#`, `**` and
|
|
33
|
+
* link targets would otherwise be announced literally. The model path benefits
|
|
34
|
+
* too: it sees prose instead of punctuation noise.
|
|
35
|
+
*/
|
|
36
|
+
function stripMarkup(text) {
|
|
37
|
+
return text
|
|
38
|
+
.replace(/```[\s\S]*?```/g, '')
|
|
39
|
+
.replace(/!\[[^\]]*\]\([^)]*\)/g, '')
|
|
40
|
+
.replace(/\[([^\]]+)\]\([^)]*\)/g, '$1')
|
|
41
|
+
.replace(/^\s{0,3}#{1,6}\s+/gm, '')
|
|
42
|
+
.replace(/^\s{0,3}>\s?/gm, '')
|
|
43
|
+
.replace(/^\s*[-*+]\s+/gm, '')
|
|
44
|
+
.replace(/^\s*\|.*\|\s*$/gm, '')
|
|
45
|
+
.replace(/\*\*([^*]+)\*\*/g, '$1')
|
|
46
|
+
.replace(/(^|[^*])\*([^*]+)\*/g, '$1$2')
|
|
47
|
+
.replace(/`([^`]+)`/g, '$1');
|
|
48
|
+
}
|
|
49
|
+
/** Compute the resume key for one chapter. */
|
|
50
|
+
export function chapterInputHash(text, style) {
|
|
51
|
+
return sha256(`${text}\u0000style=${style}\u0000prompt=${PROMPT_VERSION}`);
|
|
52
|
+
}
|
|
53
|
+
/** Compute the project identity from everything that changes its output. */
|
|
54
|
+
export function projectKey(input) {
|
|
55
|
+
return shortId(`${sha256(input.text)}|${input.voice}|${input.rate}|${input.style}|${PROMPT_VERSION}`);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Deterministic outline when no model is available: pack paragraphs into
|
|
59
|
+
* chapters of roughly {@link FALLBACK_CHAPTER_CHARS} characters.
|
|
60
|
+
*/
|
|
61
|
+
export function fallbackOutline(input) {
|
|
62
|
+
const chapters = [];
|
|
63
|
+
let start = 0;
|
|
64
|
+
let chars = 0;
|
|
65
|
+
const flush = (end) => {
|
|
66
|
+
const index = chapters.length + 1;
|
|
67
|
+
chapters.push({
|
|
68
|
+
id: `ch-${String(index).padStart(2, '0')}`,
|
|
69
|
+
title: `第${index}部分`,
|
|
70
|
+
summary: '',
|
|
71
|
+
sourceRange: [start, Math.max(start, end)],
|
|
72
|
+
estimatedChars: Math.max(1, chars),
|
|
73
|
+
crossRefs: [],
|
|
74
|
+
note: '未使用模型,按段落等分',
|
|
75
|
+
});
|
|
76
|
+
start = end + 1;
|
|
77
|
+
chars = 0;
|
|
78
|
+
};
|
|
79
|
+
for (const [index, paragraph] of input.paragraphs.entries()) {
|
|
80
|
+
chars += paragraph.length;
|
|
81
|
+
const last = index === input.paragraphs.length - 1;
|
|
82
|
+
if (chars >= (input.chapterChars ?? FALLBACK_CHAPTER_CHARS) || last)
|
|
83
|
+
flush(index);
|
|
84
|
+
}
|
|
85
|
+
if (chapters.length === 0) {
|
|
86
|
+
chapters.push({ id: 'ch-01', title: '全文', summary: '', sourceRange: [0, 0], estimatedChars: 1, crossRefs: [], note: '' });
|
|
87
|
+
}
|
|
88
|
+
return { title: input.title, chapters };
|
|
89
|
+
}
|
|
90
|
+
/** Describe one block of paragraphs for stage P0a. */
|
|
91
|
+
function blockText(paragraphs, from, to) {
|
|
92
|
+
const lines = [];
|
|
93
|
+
for (let i = from; i <= to; i += 1) {
|
|
94
|
+
lines.push(`###P${i}### ${paragraphs[i] ?? ''}`);
|
|
95
|
+
}
|
|
96
|
+
return lines.join('\n');
|
|
97
|
+
}
|
|
98
|
+
/** Plan chapters with the model, verifying coverage and falling back on failure. */
|
|
99
|
+
export async function planOutline(deps, input) {
|
|
100
|
+
const warnings = [];
|
|
101
|
+
const paragraphs = input.paragraphs;
|
|
102
|
+
const totalChars = paragraphs.reduce((sum, paragraph) => sum + paragraph.length, 0);
|
|
103
|
+
const budget = Math.max(2000, Math.min(8000, input.maxBlocks ?? 6000));
|
|
104
|
+
if (deps.completer === undefined) {
|
|
105
|
+
warnings.push('capability.llm=false: chapters were split by length, no spoken-script adaptation ran');
|
|
106
|
+
return { outline: fallbackOutline({ title: input.title, paragraphs, ...(input.chapterChars === undefined ? {} : { chapterChars: input.chapterChars }) }), warnings };
|
|
107
|
+
}
|
|
108
|
+
// P0a: one block at a time, so the model never sees the whole document.
|
|
109
|
+
const blocks = [];
|
|
110
|
+
let from = 0;
|
|
111
|
+
let blockIndex = 0;
|
|
112
|
+
while (from < paragraphs.length) {
|
|
113
|
+
let to = from;
|
|
114
|
+
let chars = 0;
|
|
115
|
+
while (to < paragraphs.length - 1 && chars + (paragraphs[to]?.length ?? 0) < budget) {
|
|
116
|
+
chars += paragraphs[to]?.length ?? 0;
|
|
117
|
+
to += 1;
|
|
118
|
+
}
|
|
119
|
+
blockIndex += 1;
|
|
120
|
+
const prompt = chunkPrompt({
|
|
121
|
+
docTitle: input.title,
|
|
122
|
+
blockId: `block-${String(blockIndex).padStart(3, '0')}`,
|
|
123
|
+
blockIndex,
|
|
124
|
+
blockTotal: 0,
|
|
125
|
+
startParagraph: from,
|
|
126
|
+
blockText: blockText(paragraphs, from, to),
|
|
127
|
+
});
|
|
128
|
+
try {
|
|
129
|
+
const parsed = await callJson(deps.completer, prompt, (value) => {
|
|
130
|
+
const record = value;
|
|
131
|
+
if (typeof record.summary !== 'string')
|
|
132
|
+
throw new ValidationError('/summary', 'must be a string');
|
|
133
|
+
const candidates = Array.isArray(record.chapterCandidates) ? record.chapterCandidates : [];
|
|
134
|
+
return { summary: record.summary, chapterCandidates: candidates, crossRefs: record.crossRefs ?? [] };
|
|
135
|
+
}, { temperature: 0.2, signal: undefined });
|
|
136
|
+
blocks.push({ startParagraph: from, endParagraph: to, ...parsed });
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
warnings.push(`outline block ${blockIndex} failed (${String(error)}); the block was dropped from planning`);
|
|
140
|
+
}
|
|
141
|
+
from = to + 1;
|
|
142
|
+
}
|
|
143
|
+
// P0b: merge into one coverage-complete outline.
|
|
144
|
+
const merge = outlinePrompt({ docTitle: input.title, paragraphTotal: paragraphs.length, charTotal: totalChars, blocks });
|
|
145
|
+
try {
|
|
146
|
+
const outline = await callJson(deps.completer, merge, validateOutline, { temperature: 0.3 });
|
|
147
|
+
const errors = coverageErrors(outline, paragraphs.length);
|
|
148
|
+
if (errors.length === 0)
|
|
149
|
+
return { outline, warnings };
|
|
150
|
+
warnings.push(`model outline was not contiguous (${errors[0] ?? 'unknown'}); fell back to length-based chapters`);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
warnings.push(`outline merge failed (${String(error)}); fell back to length-based chapters`);
|
|
154
|
+
}
|
|
155
|
+
return { outline: fallbackOutline({ title: input.title, paragraphs, ...(input.chapterChars === undefined ? {} : { chapterChars: input.chapterChars }) }), warnings };
|
|
156
|
+
}
|
|
157
|
+
/** Run stage P1 (and one repair round when the audit rejects the result). */
|
|
158
|
+
export async function adaptChapter(deps, input) {
|
|
159
|
+
if (deps.completer === undefined) {
|
|
160
|
+
return { script: input.text, changes: [], risks: [{ kind: 'other', text: '未使用模型:保留了原文书面语' }] };
|
|
161
|
+
}
|
|
162
|
+
const base = adaptPrompt({
|
|
163
|
+
docTitle: input.docTitle,
|
|
164
|
+
chapterNo: input.chapterNo,
|
|
165
|
+
chapterTotal: input.chapterTotal,
|
|
166
|
+
chapterTitle: input.chapter.title,
|
|
167
|
+
prevSummary: input.prevSummary,
|
|
168
|
+
nextSummary: input.nextSummary,
|
|
169
|
+
style: input.style,
|
|
170
|
+
text: input.text,
|
|
171
|
+
});
|
|
172
|
+
const user = input.issues === undefined || input.issues.length === 0
|
|
173
|
+
? base.user
|
|
174
|
+
: `${base.user}\n\n## 上一次质检提出的问题(必须修正,且不许引入新问题)\n${input.issues
|
|
175
|
+
.map((issue) => `- ${issue}`)
|
|
176
|
+
.join('\n')}`;
|
|
177
|
+
return callJson(deps.completer, { system: base.system, user }, (value) => {
|
|
178
|
+
const record = value;
|
|
179
|
+
if (typeof record.script !== 'string' || record.script.trim().length === 0) {
|
|
180
|
+
throw new ValidationError('/script', 'must be a non-empty string');
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
script: record.script,
|
|
184
|
+
changes: Array.isArray(record.changes) ? record.changes : [],
|
|
185
|
+
risks: Array.isArray(record.risks) ? record.risks : [],
|
|
186
|
+
};
|
|
187
|
+
}, { temperature: 0.35, signal: undefined });
|
|
188
|
+
}
|
|
189
|
+
/** Run stage P4. Returns the blocking issues (high severity only). */
|
|
190
|
+
export async function auditChapter(deps, input) {
|
|
191
|
+
if (deps.completer === undefined)
|
|
192
|
+
return [];
|
|
193
|
+
try {
|
|
194
|
+
const parsed = await callJson(deps.completer, auditPrompt({ source: input.source, script: input.script }), (value) => {
|
|
195
|
+
const record = value;
|
|
196
|
+
const issues = Array.isArray(record.issues) ? record.issues : [];
|
|
197
|
+
return issues
|
|
198
|
+
.map((raw) => {
|
|
199
|
+
const issue = raw;
|
|
200
|
+
const severity = issue.severity === 'high' || issue.severity === 'medium' || issue.severity === 'low' ? issue.severity : 'low';
|
|
201
|
+
return {
|
|
202
|
+
severity,
|
|
203
|
+
kind: typeof issue.kind === 'string' ? issue.kind : 'other',
|
|
204
|
+
fix: typeof issue.fix === 'string' ? issue.fix : '',
|
|
205
|
+
};
|
|
206
|
+
})
|
|
207
|
+
.filter((issue) => issue.fix.length > 0);
|
|
208
|
+
}, { temperature: 0, signal: undefined });
|
|
209
|
+
return parsed.filter((issue) => issue.severity === 'high');
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
deps.log?.('audit-failed', { error: String(error) });
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/** Resolve subtitle units: model segmentation when possible, rules otherwise. */
|
|
217
|
+
async function subtitleUnits(deps, script) {
|
|
218
|
+
if (deps.completer !== undefined) {
|
|
219
|
+
try {
|
|
220
|
+
const units = await callJson(deps.completer, subtitlePrompt(script), (value) => {
|
|
221
|
+
const record = value;
|
|
222
|
+
if (!Array.isArray(record.units))
|
|
223
|
+
throw new ValidationError('/units', 'must be an array');
|
|
224
|
+
const parsed = record.units.map((raw, index) => {
|
|
225
|
+
const unit = raw;
|
|
226
|
+
if (typeof unit.text !== 'string' || unit.text.trim().length === 0) {
|
|
227
|
+
throw new ValidationError(`/units/${index}/text`, 'must be a non-empty string');
|
|
228
|
+
}
|
|
229
|
+
return { text: unit.text.trim() };
|
|
230
|
+
});
|
|
231
|
+
if (parsed.length === 0)
|
|
232
|
+
throw new ValidationError('/units', 'must not be empty');
|
|
233
|
+
return parsed;
|
|
234
|
+
}, { temperature: 0, signal: undefined });
|
|
235
|
+
return { units, fromModel: true };
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
deps.log?.('subtitle-segment-failed', { error: String(error) });
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return { units: splitUnitsFallback(script), fromModel: false };
|
|
242
|
+
}
|
|
243
|
+
/** Filesystem layout of one project. */
|
|
244
|
+
function projectPaths(projectDir) {
|
|
245
|
+
return {
|
|
246
|
+
state: join(projectDir, 'state', 'state.json'),
|
|
247
|
+
manifest: join(projectDir, 'manifest.json'),
|
|
248
|
+
script: (id) => join(projectDir, 'script', `${id}.md`),
|
|
249
|
+
audio: (id, ext) => join(projectDir, 'audio', `${id}.${ext}`),
|
|
250
|
+
subtitles: (id, estimated) => join(projectDir, 'audio', estimated ? `${id}.est.srt` : `${id}.srt`),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/** Load prior state for resume. Returns undefined when it is unusable. */
|
|
254
|
+
async function loadState(path, projectId) {
|
|
255
|
+
const state = await readJson(path);
|
|
256
|
+
if (state === undefined)
|
|
257
|
+
return undefined;
|
|
258
|
+
if (state.projectId !== projectId)
|
|
259
|
+
return undefined;
|
|
260
|
+
if (state.promptVersion !== PROMPT_VERSION)
|
|
261
|
+
return undefined;
|
|
262
|
+
return state;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Run (or resume) one project. Chapter failures are recorded, not thrown: a
|
|
266
|
+
* partial delivery with an honest manifest beats losing the whole job.
|
|
267
|
+
*/
|
|
268
|
+
export async function runProject(deps, options) {
|
|
269
|
+
const now = deps.now ?? (() => new Date());
|
|
270
|
+
const paragraphs = splitParagraphs(normalizeSource(options.text));
|
|
271
|
+
if (paragraphs.length === 0)
|
|
272
|
+
throw new Error('The source text is empty after normalization.');
|
|
273
|
+
const paths = (dir) => projectPaths(dir);
|
|
274
|
+
// Identity is computed from the normalized text, not the raw input: a rerun
|
|
275
|
+
// reads the persisted source file (which ends with a newline) and must still
|
|
276
|
+
// land on the same project key.
|
|
277
|
+
const normalizedText = paragraphs.join('\n\n');
|
|
278
|
+
const projectId = projectKey({ text: normalizedText, voice: options.voice, rate: options.rate, style: options.style });
|
|
279
|
+
const projectDir = join(options.outputDir, projectId);
|
|
280
|
+
await mkdir(join(projectDir, 'audio'), { recursive: true });
|
|
281
|
+
await mkdir(join(projectDir, 'script'), { recursive: true });
|
|
282
|
+
await mkdir(join(projectDir, 'state'), { recursive: true });
|
|
283
|
+
await mkdir(join(projectDir, 'source'), { recursive: true });
|
|
284
|
+
await writeFile(join(projectDir, 'source', 'normalized.md'), `${paragraphs.join('\n\n')}\n`, 'utf8');
|
|
285
|
+
const existing = await loadState(paths(projectDir).state, projectId);
|
|
286
|
+
const capability = {
|
|
287
|
+
llm: deps.completer !== undefined,
|
|
288
|
+
network: options.network,
|
|
289
|
+
wordBoundaries: false,
|
|
290
|
+
timingQuality: existing?.capability.timingQuality ?? 'estimated',
|
|
291
|
+
};
|
|
292
|
+
const engine = { name: options.network ? 'edge-py' : 'sapi', voice: options.voice, rate: options.rate };
|
|
293
|
+
let outline;
|
|
294
|
+
let warnings = existing?.warnings ?? [];
|
|
295
|
+
if (existing !== undefined && options.rerun !== 'source') {
|
|
296
|
+
outline = validateOutline(existing.outline);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
const planned = await planOutline(deps, {
|
|
300
|
+
title: options.title,
|
|
301
|
+
paragraphs,
|
|
302
|
+
...(options.maxBlocks === undefined ? {} : { maxBlocks: options.maxBlocks }),
|
|
303
|
+
...(options.chapterChars === undefined ? {} : { chapterChars: options.chapterChars }),
|
|
304
|
+
});
|
|
305
|
+
outline = planned.outline;
|
|
306
|
+
warnings = [...warnings, ...planned.warnings];
|
|
307
|
+
}
|
|
308
|
+
const state = {
|
|
309
|
+
projectId,
|
|
310
|
+
sourceHash: sha256(normalizedText),
|
|
311
|
+
promptVersion: PROMPT_VERSION,
|
|
312
|
+
engine,
|
|
313
|
+
capability,
|
|
314
|
+
style: existing?.style ?? options.style,
|
|
315
|
+
outline,
|
|
316
|
+
chapters: existing?.chapters ?? [],
|
|
317
|
+
inputHashes: existing?.inputHashes ?? {},
|
|
318
|
+
warnings,
|
|
319
|
+
createdAt: existing?.createdAt ?? now().toISOString(),
|
|
320
|
+
};
|
|
321
|
+
// Persist the plan before the first chapter runs, so the conversation panel
|
|
322
|
+
// can show progress instead of a missing-state 404 during chapter one.
|
|
323
|
+
await writeJsonAtomic(paths(projectDir).state, state);
|
|
324
|
+
const chaptersById = new Map(outline.chapters.map((chapter) => [chapter.id, chapter]));
|
|
325
|
+
const ordered = [...outline.chapters].sort((a, b) => a.sourceRange[0] - b.sourceRange[0]);
|
|
326
|
+
const skipped = [];
|
|
327
|
+
// A typo in a chapter id must fail loudly, not silently re-run nothing.
|
|
328
|
+
if (options.only !== undefined) {
|
|
329
|
+
const known = new Set(ordered.map((chapter) => chapter.id));
|
|
330
|
+
const unknown = options.only.filter((id) => !known.has(id));
|
|
331
|
+
if (unknown.length > 0)
|
|
332
|
+
throw new Error(`Unknown chapter(s): ${unknown.join(', ')}`);
|
|
333
|
+
}
|
|
334
|
+
for (const [index, chapter] of ordered.entries()) {
|
|
335
|
+
// Not targeted: leave its recorded state and artifacts exactly as they are.
|
|
336
|
+
if (options.only !== undefined && !options.only.includes(chapter.id))
|
|
337
|
+
continue;
|
|
338
|
+
const previous = state.chapters.find((record) => record.id === chapter.id);
|
|
339
|
+
const chapterText = paragraphs.slice(chapter.sourceRange[0], chapter.sourceRange[1] + 1).join('\n\n');
|
|
340
|
+
const inputHash = chapterInputHash(chapterText, options.style);
|
|
341
|
+
const unchanged = state.inputHashes[chapter.id] === inputHash;
|
|
342
|
+
const finished = previous?.status === 'done';
|
|
343
|
+
if (unchanged && finished && options.rerun === undefined) {
|
|
344
|
+
skipped.push(chapter.id);
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
if (options.rerun === 'synth' && previous?.status === 'done') {
|
|
348
|
+
// keep the script, redo audio only
|
|
349
|
+
skipped.push(chapter.id);
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
const record = {
|
|
353
|
+
id: chapter.id,
|
|
354
|
+
order: index + 1,
|
|
355
|
+
title: chapter.title,
|
|
356
|
+
chars: chapterText.length,
|
|
357
|
+
sourceRange: chapter.sourceRange,
|
|
358
|
+
status: 'queued',
|
|
359
|
+
};
|
|
360
|
+
const upsert = (next) => {
|
|
361
|
+
const at = state.chapters.findIndex((entry) => entry.id === next.id);
|
|
362
|
+
if (at >= 0)
|
|
363
|
+
state.chapters[at] = next;
|
|
364
|
+
else
|
|
365
|
+
state.chapters.push(next);
|
|
366
|
+
};
|
|
367
|
+
try {
|
|
368
|
+
upsert({ ...record, status: 'adapted' });
|
|
369
|
+
const prevSummary = index > 0 ? (ordered[index - 1]?.summary ?? '') : '';
|
|
370
|
+
const nextSummary = ordered[index + 1]?.summary ?? '';
|
|
371
|
+
const adapted = await adaptChapter(deps, {
|
|
372
|
+
docTitle: options.title,
|
|
373
|
+
chapter,
|
|
374
|
+
chapterNo: index + 1,
|
|
375
|
+
chapterTotal: ordered.length,
|
|
376
|
+
text: chapterText,
|
|
377
|
+
style: options.style,
|
|
378
|
+
prevSummary,
|
|
379
|
+
nextSummary,
|
|
380
|
+
});
|
|
381
|
+
// P4 only where it pays: long chapters, retried chapters, and a sample.
|
|
382
|
+
const sample = options.auditSample ?? 2;
|
|
383
|
+
const shouldAudit = chapterText.length > 3000 || index < sample;
|
|
384
|
+
let script = adapted.script;
|
|
385
|
+
if (shouldAudit && deps.completer !== undefined) {
|
|
386
|
+
const issues = await auditChapter(deps, { source: chapterText, script });
|
|
387
|
+
upsert({ ...record, status: 'audited' });
|
|
388
|
+
if (issues.length > 0) {
|
|
389
|
+
const repaired = await adaptChapter(deps, {
|
|
390
|
+
docTitle: options.title,
|
|
391
|
+
chapter,
|
|
392
|
+
chapterNo: index + 1,
|
|
393
|
+
chapterTotal: ordered.length,
|
|
394
|
+
text: chapterText,
|
|
395
|
+
style: options.style,
|
|
396
|
+
prevSummary,
|
|
397
|
+
nextSummary,
|
|
398
|
+
issues: issues.map((issue) => `${issue.kind}: ${issue.fix}`),
|
|
399
|
+
});
|
|
400
|
+
script = repaired.script;
|
|
401
|
+
state.warnings.push(`${chapter.id}: ${issues.length} high-severity issue(s) sent back for one repair round`);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
const scriptPath = paths(projectDir).script(chapter.id);
|
|
405
|
+
await writeFile(scriptPath, `${script}\n`, 'utf8');
|
|
406
|
+
const synthesized = await deps.synth.synthesize({ text: script, voice: options.voice, rate: options.rate, signal: options.signal });
|
|
407
|
+
// Record the engine that actually ran, not the one we expected.
|
|
408
|
+
if (synthesized.engine !== undefined) {
|
|
409
|
+
const reported = synthesized.engine;
|
|
410
|
+
const known = reported === 'sapi' || reported === 'edge-js' || reported === 'edge-py' ? reported : 'edge-py';
|
|
411
|
+
state.engine = { ...state.engine, name: known };
|
|
412
|
+
}
|
|
413
|
+
const audioPath = paths(projectDir).audio(chapter.id, synthesized.format);
|
|
414
|
+
await copyFile(synthesized.filePath, audioPath);
|
|
415
|
+
upsert({
|
|
416
|
+
...record,
|
|
417
|
+
status: 'synthesized',
|
|
418
|
+
script: { path: `script/${chapter.id}.md`, hash: sha256(script) },
|
|
419
|
+
audio: {
|
|
420
|
+
path: `audio/${chapter.id}.${synthesized.format}`,
|
|
421
|
+
bytes: synthesized.bytes,
|
|
422
|
+
durationMs: synthesized.durationMs,
|
|
423
|
+
timingQuality: synthesized.timingQuality,
|
|
424
|
+
format: synthesized.format,
|
|
425
|
+
},
|
|
426
|
+
});
|
|
427
|
+
const segmented = await subtitleUnits(deps, script);
|
|
428
|
+
const aligned = alignUnits(segmented.units, synthesized.durationMs, synthesized.words);
|
|
429
|
+
const subtitlePath = paths(projectDir).subtitles(chapter.id, aligned.quality === 'estimated');
|
|
430
|
+
await writeFile(subtitlePath, formatSrt(aligned.units), 'utf8');
|
|
431
|
+
upsert({
|
|
432
|
+
...record,
|
|
433
|
+
status: 'done',
|
|
434
|
+
script: { path: `script/${chapter.id}.md`, hash: sha256(script) },
|
|
435
|
+
audio: {
|
|
436
|
+
path: `audio/${chapter.id}.${synthesized.format}`,
|
|
437
|
+
bytes: synthesized.bytes,
|
|
438
|
+
durationMs: synthesized.durationMs,
|
|
439
|
+
timingQuality: synthesized.timingQuality,
|
|
440
|
+
format: synthesized.format,
|
|
441
|
+
},
|
|
442
|
+
subtitles: {
|
|
443
|
+
path: `audio/${aligned.quality === 'estimated' ? `${chapter.id}.est.srt` : `${chapter.id}.srt`}`,
|
|
444
|
+
units: aligned.units.length,
|
|
445
|
+
timingQuality: aligned.quality,
|
|
446
|
+
},
|
|
447
|
+
});
|
|
448
|
+
state.inputHashes[chapter.id] = inputHash;
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
// Keep the engine's own code: mapping every synthesis failure to
|
|
452
|
+
// CHAPTER_FAILED hides the one thing the user can act on (throttling vs
|
|
453
|
+
// sandbox denial vs a broken endpoint).
|
|
454
|
+
const engineCode = typeof error.code === 'string' ? error.code : undefined;
|
|
455
|
+
const code = error instanceof LlmError
|
|
456
|
+
? error.code
|
|
457
|
+
: error instanceof ValidationError
|
|
458
|
+
? 'VALIDATION_FAILED'
|
|
459
|
+
: (engineCode ?? 'CHAPTER_FAILED');
|
|
460
|
+
const retryable = error instanceof LlmError ? error.retryable : false;
|
|
461
|
+
upsert({
|
|
462
|
+
...record,
|
|
463
|
+
status: 'failed',
|
|
464
|
+
error: { code, message: error instanceof Error ? error.message.slice(0, 300) : String(error), retryable },
|
|
465
|
+
});
|
|
466
|
+
state.warnings.push(`${chapter.id}: failed with ${code}`);
|
|
467
|
+
}
|
|
468
|
+
await writeJsonAtomic(paths(projectDir).state, state);
|
|
469
|
+
}
|
|
470
|
+
const manifest = buildManifest({ state, outline: chaptersById, title: options.title, now });
|
|
471
|
+
validateManifest(manifest);
|
|
472
|
+
await writeJsonAtomic(paths(projectDir).manifest, manifest);
|
|
473
|
+
await writeJsonAtomic(paths(projectDir).state, state);
|
|
474
|
+
return { projectId, projectDir, manifest, state, skipped };
|
|
475
|
+
}
|
|
476
|
+
/** Assemble the manifest from persisted chapter records. */
|
|
477
|
+
export function buildManifest(input) {
|
|
478
|
+
const { state, title, now } = input;
|
|
479
|
+
const chapters = [...state.chapters].sort((a, b) => a.order - b.order);
|
|
480
|
+
const done = chapters.filter((chapter) => chapter.status === 'done');
|
|
481
|
+
return {
|
|
482
|
+
schemaVersion: 1,
|
|
483
|
+
projectId: state.projectId,
|
|
484
|
+
createdAt: state.createdAt,
|
|
485
|
+
updatedAt: now().toISOString(),
|
|
486
|
+
title,
|
|
487
|
+
capability: {
|
|
488
|
+
...state.capability,
|
|
489
|
+
timingQuality: done.length === 0
|
|
490
|
+
? 'none'
|
|
491
|
+
: done.every((chapter) => chapter.audio?.timingQuality === 'exact')
|
|
492
|
+
? 'exact'
|
|
493
|
+
: 'estimated',
|
|
494
|
+
},
|
|
495
|
+
engine: state.engine,
|
|
496
|
+
promptVersion: state.promptVersion,
|
|
497
|
+
source: { path: 'source/normalized.md', hash: sha256Tag(state.sourceHash), chars: chapters.reduce((sum, chapter) => sum + chapter.chars, 0) },
|
|
498
|
+
chapters: chapters.map((chapter) => ({
|
|
499
|
+
id: chapter.id,
|
|
500
|
+
order: chapter.order,
|
|
501
|
+
title: chapter.title,
|
|
502
|
+
chars: chapter.chars,
|
|
503
|
+
sourceRange: chapter.sourceRange,
|
|
504
|
+
status: chapter.status,
|
|
505
|
+
...(chapter.audio === undefined ? {} : { audio: chapter.audio }),
|
|
506
|
+
...(chapter.subtitles === undefined ? {} : { subtitles: chapter.subtitles }),
|
|
507
|
+
...(chapter.script === undefined ? {} : { script: chapter.script }),
|
|
508
|
+
...(chapter.error === undefined ? {} : { error: chapter.error }),
|
|
509
|
+
})),
|
|
510
|
+
totals: {
|
|
511
|
+
chapters: done.length,
|
|
512
|
+
chars: done.reduce((sum, chapter) => sum + chapter.chars, 0),
|
|
513
|
+
audioMs: done.reduce((sum, chapter) => sum + (chapter.audio?.durationMs ?? 0), 0),
|
|
514
|
+
bytes: done.reduce((sum, chapter) => sum + (chapter.audio?.bytes ?? 0), 0),
|
|
515
|
+
},
|
|
516
|
+
warnings: state.warnings,
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt builders. One function per stage, each returning the exact strings the
|
|
3
|
+
* model receives. The text is versioned by `PROMPT_VERSION` in `types.ts`:
|
|
4
|
+
* bumping it invalidates the outline/script cache on purpose.
|
|
5
|
+
*
|
|
6
|
+
* Rules that matter and are easy to lose in a refactor:
|
|
7
|
+
* - every prompt demands JSON only (no fences, no prose);
|
|
8
|
+
* - the model never sees the whole book at once (block -> outline -> chapter);
|
|
9
|
+
* - neighboring summaries are injected so cross-chapter references survive.
|
|
10
|
+
*/
|
|
11
|
+
import type { Outline } from './types.ts';
|
|
12
|
+
/** One prompt pair. */
|
|
13
|
+
export interface Prompt {
|
|
14
|
+
system: string;
|
|
15
|
+
user: string;
|
|
16
|
+
}
|
|
17
|
+
/** Stage P0a: find chapter boundaries inside one text block. */
|
|
18
|
+
export declare function chunkPrompt(input: {
|
|
19
|
+
docTitle: string;
|
|
20
|
+
blockId: string;
|
|
21
|
+
blockIndex: number;
|
|
22
|
+
blockTotal: number;
|
|
23
|
+
startParagraph: number;
|
|
24
|
+
blockText: string;
|
|
25
|
+
}): Prompt;
|
|
26
|
+
/** Stage P0b: merge block results into one coverage-complete outline. */
|
|
27
|
+
export declare function outlinePrompt(input: {
|
|
28
|
+
docTitle: string;
|
|
29
|
+
paragraphTotal: number;
|
|
30
|
+
charTotal: number;
|
|
31
|
+
blocks: unknown;
|
|
32
|
+
}): Prompt;
|
|
33
|
+
/** Stage P1: turn written prose into a spoken script without changing facts. */
|
|
34
|
+
export declare function adaptPrompt(input: {
|
|
35
|
+
docTitle: string;
|
|
36
|
+
chapterNo: number;
|
|
37
|
+
chapterTotal: number;
|
|
38
|
+
chapterTitle: string;
|
|
39
|
+
prevSummary: string;
|
|
40
|
+
nextSummary: string;
|
|
41
|
+
style: string;
|
|
42
|
+
text: string;
|
|
43
|
+
}): Prompt;
|
|
44
|
+
/** Stage P3: split the script into subtitle units (timing is computed later). */
|
|
45
|
+
export declare function subtitlePrompt(script: string): Prompt;
|
|
46
|
+
/** Stage P4: audit information fidelity, not style. */
|
|
47
|
+
export declare function auditPrompt(input: {
|
|
48
|
+
source: string;
|
|
49
|
+
script: string;
|
|
50
|
+
}): Prompt;
|
|
51
|
+
/** Stage P6: repair a structurally invalid JSON response without rewriting it. */
|
|
52
|
+
export declare function repairPrompt(input: {
|
|
53
|
+
error: string;
|
|
54
|
+
previous: string;
|
|
55
|
+
}): Prompt;
|
|
56
|
+
/** Coverage assertion used after planning; exported so tests can reuse it. */
|
|
57
|
+
export declare function coverageErrors(outline: Outline, paragraphTotal: number): string[];
|
|
58
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAA;AAEzD,uBAAuB;AACvB,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAKD,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,MAAM,CAuBT;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;CAChB,GAAG,MAAM,CAsBT;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,MAAM,CAyBT;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAsB7E;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAc/E;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBjF"}
|