@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
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public vocabulary shared by the pipeline, the artifact writer, and the tools.
|
|
3
|
+
* Everything here is plain data: no cordis, no DSH imports, so the core can be
|
|
4
|
+
* unit-tested without a host.
|
|
5
|
+
*/
|
|
6
|
+
/** One planned chapter; `sourceRange` is inclusive on both ends. */
|
|
7
|
+
export interface OutlineChapter {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
summary: string;
|
|
11
|
+
sourceRange: [number, number];
|
|
12
|
+
estimatedChars: number;
|
|
13
|
+
crossRefs?: string[];
|
|
14
|
+
note?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Result of the outline stage. */
|
|
17
|
+
export interface Outline {
|
|
18
|
+
title: string;
|
|
19
|
+
chapters: OutlineChapter[];
|
|
20
|
+
}
|
|
21
|
+
/** Per-chapter lifecycle. `failed` is terminal until a rerun is requested. */
|
|
22
|
+
export type ChapterStatus = 'queued' | 'adapted' | 'marked' | 'audited' | 'synthesized' | 'timed' | 'done' | 'failed';
|
|
23
|
+
/** Audio facts recorded for one chapter. */
|
|
24
|
+
export interface ChapterAudio {
|
|
25
|
+
path: string;
|
|
26
|
+
bytes: number;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
timingQuality: 'exact' | 'estimated';
|
|
29
|
+
format: 'mp3' | 'wav';
|
|
30
|
+
}
|
|
31
|
+
/** Subtitle facts recorded for one chapter. */
|
|
32
|
+
export interface ChapterSubtitles {
|
|
33
|
+
path: string;
|
|
34
|
+
units: number;
|
|
35
|
+
timingQuality: 'exact' | 'estimated';
|
|
36
|
+
}
|
|
37
|
+
/** One chapter as persisted in `state.json`. */
|
|
38
|
+
export interface ChapterRecord {
|
|
39
|
+
id: string;
|
|
40
|
+
order: number;
|
|
41
|
+
title: string;
|
|
42
|
+
chars: number;
|
|
43
|
+
sourceRange: [number, number];
|
|
44
|
+
status: ChapterStatus;
|
|
45
|
+
script?: {
|
|
46
|
+
path: string;
|
|
47
|
+
hash: string;
|
|
48
|
+
};
|
|
49
|
+
audio?: ChapterAudio;
|
|
50
|
+
subtitles?: ChapterSubtitles;
|
|
51
|
+
error?: {
|
|
52
|
+
code: string;
|
|
53
|
+
message: string;
|
|
54
|
+
retryable: boolean;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** What the host could do at the time this project ran. */
|
|
58
|
+
export interface Capability {
|
|
59
|
+
llm: boolean;
|
|
60
|
+
network: boolean;
|
|
61
|
+
wordBoundaries: boolean;
|
|
62
|
+
timingQuality: 'exact' | 'estimated' | 'none';
|
|
63
|
+
}
|
|
64
|
+
/** Engine identity recorded in the manifest. */
|
|
65
|
+
export interface EngineInfo {
|
|
66
|
+
name: 'edge-js' | 'edge-py' | 'sapi' | 'speechSynthesis';
|
|
67
|
+
version?: string;
|
|
68
|
+
voice: string;
|
|
69
|
+
rate: string;
|
|
70
|
+
viaProxy?: boolean;
|
|
71
|
+
}
|
|
72
|
+
/** The consumed artifact contract. */
|
|
73
|
+
export interface Manifest {
|
|
74
|
+
schemaVersion: 1;
|
|
75
|
+
projectId: string;
|
|
76
|
+
createdAt: string;
|
|
77
|
+
updatedAt?: string;
|
|
78
|
+
title?: string;
|
|
79
|
+
capability: Capability;
|
|
80
|
+
engine: EngineInfo;
|
|
81
|
+
promptVersion: string;
|
|
82
|
+
source: {
|
|
83
|
+
path: string;
|
|
84
|
+
hash: string;
|
|
85
|
+
chars: number;
|
|
86
|
+
kind?: 'md' | 'txt' | 'pdf' | 'docx' | 'html';
|
|
87
|
+
};
|
|
88
|
+
chapters: ManifestChapter[];
|
|
89
|
+
totals: {
|
|
90
|
+
chapters: number;
|
|
91
|
+
chars: number;
|
|
92
|
+
audioMs: number;
|
|
93
|
+
bytes: number;
|
|
94
|
+
};
|
|
95
|
+
warnings: string[];
|
|
96
|
+
}
|
|
97
|
+
/** Chapter shape inside the manifest. */
|
|
98
|
+
export interface ManifestChapter {
|
|
99
|
+
id: string;
|
|
100
|
+
order: number;
|
|
101
|
+
title: string;
|
|
102
|
+
chars: number;
|
|
103
|
+
sourceRange: [number, number];
|
|
104
|
+
status: ChapterStatus;
|
|
105
|
+
audio?: ChapterAudio;
|
|
106
|
+
subtitles?: ChapterSubtitles;
|
|
107
|
+
script?: {
|
|
108
|
+
path: string;
|
|
109
|
+
hash: string;
|
|
110
|
+
};
|
|
111
|
+
error?: {
|
|
112
|
+
code: string;
|
|
113
|
+
message: string;
|
|
114
|
+
retryable: boolean;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** Word-level timing, when an engine provides it. */
|
|
118
|
+
export interface WordTiming {
|
|
119
|
+
text: string;
|
|
120
|
+
offsetMs: number;
|
|
121
|
+
durationMs: number;
|
|
122
|
+
}
|
|
123
|
+
/** What a synthesizer returns. `durationMs` is mandatory so timing never guesses. */
|
|
124
|
+
export interface SynthResult {
|
|
125
|
+
filePath: string;
|
|
126
|
+
bytes: number;
|
|
127
|
+
durationMs: number;
|
|
128
|
+
timingQuality: 'exact' | 'estimated';
|
|
129
|
+
format: 'mp3' | 'wav';
|
|
130
|
+
/** Engine that actually produced the file, as reported by `ctx.tts`. */
|
|
131
|
+
engine?: string;
|
|
132
|
+
words?: WordTiming[];
|
|
133
|
+
browserUrl?: string;
|
|
134
|
+
}
|
|
135
|
+
/** Narrow port the pipeline talks to; `ctx.tts` implements it. */
|
|
136
|
+
export interface Synthesizer {
|
|
137
|
+
synthesize(request: {
|
|
138
|
+
text: string;
|
|
139
|
+
voice: string;
|
|
140
|
+
rate: string;
|
|
141
|
+
signal?: AbortSignal;
|
|
142
|
+
}): Promise<SynthResult>;
|
|
143
|
+
}
|
|
144
|
+
/** Prompt version must change whenever a prompt changes (see PROMPTS.md). */
|
|
145
|
+
export declare const PROMPT_VERSION = "p1.3";
|
|
146
|
+
/** Bump when `manifest.json`'s shape changes. */
|
|
147
|
+
export declare const SCHEMA_VERSION = 1;
|
|
148
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public vocabulary shared by the pipeline, the artifact writer, and the tools.
|
|
3
|
+
* Everything here is plain data: no cordis, no DSH imports, so the core can be
|
|
4
|
+
* unit-tested without a host.
|
|
5
|
+
*/
|
|
6
|
+
/** Prompt version must change whenever a prompt changes (see PROMPTS.md). */
|
|
7
|
+
export const PROMPT_VERSION = 'p1.3';
|
|
8
|
+
/** Bump when `manifest.json`'s shape changes. */
|
|
9
|
+
export const SCHEMA_VERSION = 1;
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyIH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAA;AAEpC,iDAAiD;AACjD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAA"}
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Full sha256 hex digest, prefixed so manifests are self-describing. */
|
|
2
|
+
export declare function sha256(input: string | Uint8Array): string;
|
|
3
|
+
/** Prefixed digest used in manifests (`sha256:<64 hex>`). */
|
|
4
|
+
export declare function sha256Tag(input: string | Uint8Array): string;
|
|
5
|
+
/** Short, filesystem-safe identity for project directories. */
|
|
6
|
+
export declare function shortId(input: string): string;
|
|
7
|
+
/** Read JSON, treating a missing or malformed file as absent. */
|
|
8
|
+
export declare function readJson<T>(path: string): Promise<T | undefined>;
|
|
9
|
+
/** Write JSON via a temp sibling and rename, so readers never see a partial file. */
|
|
10
|
+
export declare function writeJsonAtomic(path: string, value: unknown): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Split normalized prose into paragraphs on blank lines, dropping empty ones.
|
|
13
|
+
* Paragraph indices are the currency of `sourceRange`, so this must be stable.
|
|
14
|
+
*/
|
|
15
|
+
export declare function splitParagraphs(text: string): string[];
|
|
16
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAQA,yEAAyE;AACzE,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAEzD;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAE5D;AAED,+DAA+D;AAC/D,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,iEAAiE;AACjE,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAOtE;AAED,qFAAqF;AACrF,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKtD"}
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small pure helpers: hashing for cache identity, and JSON reads/writes that
|
|
3
|
+
* never leave a half-written `state.json` behind a crash.
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
7
|
+
import { dirname } from 'node:path';
|
|
8
|
+
/** Full sha256 hex digest, prefixed so manifests are self-describing. */
|
|
9
|
+
export function sha256(input) {
|
|
10
|
+
return createHash('sha256').update(input).digest('hex');
|
|
11
|
+
}
|
|
12
|
+
/** Prefixed digest used in manifests (`sha256:<64 hex>`). */
|
|
13
|
+
export function sha256Tag(input) {
|
|
14
|
+
return `sha256:${sha256(input)}`;
|
|
15
|
+
}
|
|
16
|
+
/** Short, filesystem-safe identity for project directories. */
|
|
17
|
+
export function shortId(input) {
|
|
18
|
+
return sha256(input).slice(0, 12);
|
|
19
|
+
}
|
|
20
|
+
/** Read JSON, treating a missing or malformed file as absent. */
|
|
21
|
+
export async function readJson(path) {
|
|
22
|
+
try {
|
|
23
|
+
const raw = await readFile(path, 'utf8');
|
|
24
|
+
return JSON.parse(raw);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Write JSON via a temp sibling and rename, so readers never see a partial file. */
|
|
31
|
+
export async function writeJsonAtomic(path, value) {
|
|
32
|
+
await mkdir(dirname(path), { recursive: true });
|
|
33
|
+
const temp = `${path}.tmp-${process.pid}-${Date.now()}`;
|
|
34
|
+
await writeFile(temp, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
|
|
35
|
+
await rename(temp, path);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Split normalized prose into paragraphs on blank lines, dropping empty ones.
|
|
39
|
+
* Paragraph indices are the currency of `sourceRange`, so this must be stable.
|
|
40
|
+
*/
|
|
41
|
+
export function splitParagraphs(text) {
|
|
42
|
+
return text
|
|
43
|
+
.split(/\n{2,}/)
|
|
44
|
+
.map((paragraph) => paragraph.trim())
|
|
45
|
+
.filter((paragraph) => paragraph.length > 0);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,yEAAyE;AACzE,MAAM,UAAU,MAAM,CAAC,KAA0B;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACzD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,KAA0B;IAClD,OAAO,UAAU,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AAClC,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACnC,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,KAAc;IAChE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IACvD,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACpE,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI;SACR,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;SACpC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAChD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hand-written validators. The pipeline must never write a manifest that the
|
|
3
|
+
* published schema would reject, and a model-produced outline must fail loudly
|
|
4
|
+
* with a JSON path (so the repair prompt can point at the exact field).
|
|
5
|
+
*/
|
|
6
|
+
/** Validation failure carrying the offending JSON pointer. */
|
|
7
|
+
export declare class ValidationError extends Error {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
constructor(path: string, message: string);
|
|
10
|
+
}
|
|
11
|
+
/** Validate an outline as produced by the planning stage. */
|
|
12
|
+
export declare function validateOutline(value: unknown): import('./types.ts').Outline;
|
|
13
|
+
/** Validate a manifest before it is written to disk. */
|
|
14
|
+
export declare function validateManifest(value: unknown): import('./types.ts').Manifest;
|
|
15
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8DAA8D;AAC9D,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBAET,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AA8CD,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,YAAY,EAAE,OAAO,CA+B5E;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,YAAY,EAAE,QAAQ,CAsF9E"}
|
package/dist/validate.js
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hand-written validators. The pipeline must never write a manifest that the
|
|
3
|
+
* published schema would reject, and a model-produced outline must fail loudly
|
|
4
|
+
* with a JSON path (so the repair prompt can point at the exact field).
|
|
5
|
+
*/
|
|
6
|
+
/** Validation failure carrying the offending JSON pointer. */
|
|
7
|
+
export class ValidationError extends Error {
|
|
8
|
+
path;
|
|
9
|
+
constructor(path, message) {
|
|
10
|
+
super(`${path}: ${message}`);
|
|
11
|
+
this.name = 'ValidationError';
|
|
12
|
+
this.path = path;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function fail(path, message) {
|
|
16
|
+
throw new ValidationError(path, message);
|
|
17
|
+
}
|
|
18
|
+
function object(path, value) {
|
|
19
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
20
|
+
fail(path, 'must be an object');
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
function string(path, value, min, max) {
|
|
25
|
+
if (typeof value !== 'string')
|
|
26
|
+
fail(path, 'must be a string');
|
|
27
|
+
if (value.length < min)
|
|
28
|
+
fail(path, `must be at least ${min} characters`);
|
|
29
|
+
if (value.length > max)
|
|
30
|
+
fail(path, `must be at most ${max} characters`);
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
function integer(path, value, min) {
|
|
34
|
+
if (typeof value !== 'number' || !Number.isInteger(value))
|
|
35
|
+
fail(path, 'must be an integer');
|
|
36
|
+
if (value < min)
|
|
37
|
+
fail(path, `must be >= ${min}`);
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function boolean(path, value) {
|
|
41
|
+
if (typeof value !== 'boolean')
|
|
42
|
+
fail(path, 'must be a boolean');
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function range(path, value) {
|
|
46
|
+
if (!Array.isArray(value) || value.length !== 2)
|
|
47
|
+
fail(path, 'must be a two-element array');
|
|
48
|
+
const start = integer(`${path}/0`, value[0], 0);
|
|
49
|
+
const end = integer(`${path}/1`, value[1], 0);
|
|
50
|
+
if (end < start)
|
|
51
|
+
fail(path, 'end must be >= start');
|
|
52
|
+
return [start, end];
|
|
53
|
+
}
|
|
54
|
+
function oneOf(path, value, allowed) {
|
|
55
|
+
if (typeof value !== 'string' || !allowed.includes(value)) {
|
|
56
|
+
fail(path, `must be one of ${allowed.join(' | ')}`);
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
/** Validate an outline as produced by the planning stage. */
|
|
61
|
+
export function validateOutline(value) {
|
|
62
|
+
const root = object('', value);
|
|
63
|
+
const title = string('/title', root.title, 1, 60);
|
|
64
|
+
if (!Array.isArray(root.chapters))
|
|
65
|
+
fail('/chapters', 'must be an array');
|
|
66
|
+
if (root.chapters.length < 1)
|
|
67
|
+
fail('/chapters', 'must not be empty');
|
|
68
|
+
if (root.chapters.length > 40)
|
|
69
|
+
fail('/chapters', 'must contain at most 40 chapters');
|
|
70
|
+
const chapters = root.chapters.map((raw, index) => {
|
|
71
|
+
const path = `/chapters/${index}`;
|
|
72
|
+
const chapter = object(path, raw);
|
|
73
|
+
const id = string(`${path}/id`, chapter.id, 4, 10);
|
|
74
|
+
if (!/^ch-[0-9]{2,3}$/.test(id))
|
|
75
|
+
fail(`${path}/id`, 'must match ch-01');
|
|
76
|
+
const crossRefs = chapter.crossRefs;
|
|
77
|
+
if (crossRefs !== undefined) {
|
|
78
|
+
if (!Array.isArray(crossRefs))
|
|
79
|
+
fail(`${path}/crossRefs`, 'must be an array');
|
|
80
|
+
for (const [i, ref] of crossRefs.entries())
|
|
81
|
+
string(`${path}/crossRefs/${i}`, ref, 0, 40);
|
|
82
|
+
}
|
|
83
|
+
const note = chapter.note;
|
|
84
|
+
if (note !== undefined)
|
|
85
|
+
string(`${path}/note`, note, 0, 120);
|
|
86
|
+
return {
|
|
87
|
+
id,
|
|
88
|
+
title: string(`${path}/title`, chapter.title, 1, 14),
|
|
89
|
+
summary: string(`${path}/summary`, chapter.summary, 0, 80),
|
|
90
|
+
sourceRange: range(`${path}/sourceRange`, chapter.sourceRange),
|
|
91
|
+
estimatedChars: integer(`${path}/estimatedChars`, chapter.estimatedChars, 1),
|
|
92
|
+
crossRefs: crossRefs ?? [],
|
|
93
|
+
note: note ?? '',
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
return { title, chapters };
|
|
97
|
+
}
|
|
98
|
+
/** Validate a manifest before it is written to disk. */
|
|
99
|
+
export function validateManifest(value) {
|
|
100
|
+
const root = object('', value);
|
|
101
|
+
if (root.schemaVersion !== 1)
|
|
102
|
+
fail('/schemaVersion', 'must be 1');
|
|
103
|
+
const projectId = string('/projectId', root.projectId, 8, 24);
|
|
104
|
+
if (!/^[0-9a-f]+$/.test(projectId))
|
|
105
|
+
fail('/projectId', 'must be lowercase hex');
|
|
106
|
+
string('/createdAt', root.createdAt, 10, 40);
|
|
107
|
+
const promptVersion = string('/promptVersion', root.promptVersion, 3, 12);
|
|
108
|
+
if (!/^p[0-9]+\.[0-9]+$/.test(promptVersion))
|
|
109
|
+
fail('/promptVersion', 'must match p1.3');
|
|
110
|
+
const capability = object('/capability', root.capability);
|
|
111
|
+
boolean('/capability/llm', capability.llm);
|
|
112
|
+
boolean('/capability/network', capability.network);
|
|
113
|
+
boolean('/capability/wordBoundaries', capability.wordBoundaries);
|
|
114
|
+
oneOf('/capability/timingQuality', capability.timingQuality, ['exact', 'estimated', 'none']);
|
|
115
|
+
const engine = object('/engine', root.engine);
|
|
116
|
+
oneOf('/engine/name', engine.name, ['edge-js', 'edge-py', 'sapi', 'speechSynthesis']);
|
|
117
|
+
string('/engine/voice', engine.voice, 1, 80);
|
|
118
|
+
const rate = string('/engine/rate', engine.rate, 2, 8);
|
|
119
|
+
if (!/^[+-][0-9]{1,3}%$/.test(rate))
|
|
120
|
+
fail('/engine/rate', 'must match +0%');
|
|
121
|
+
const source = object('/source', root.source);
|
|
122
|
+
string('/source/path', source.path, 1, 400);
|
|
123
|
+
const hash = string('/source/hash', source.hash, 71, 71);
|
|
124
|
+
if (!/^sha256:[0-9a-f]{64}$/.test(hash))
|
|
125
|
+
fail('/source/hash', 'must be sha256:<64 hex>');
|
|
126
|
+
integer('/source/chars', source.chars, 1);
|
|
127
|
+
if (!Array.isArray(root.chapters) || root.chapters.length === 0) {
|
|
128
|
+
fail('/chapters', 'must be a non-empty array');
|
|
129
|
+
}
|
|
130
|
+
for (const [index, raw] of root.chapters.entries()) {
|
|
131
|
+
const path = `/chapters/${index}`;
|
|
132
|
+
const chapter = object(path, raw);
|
|
133
|
+
const chapterId = string(`${path}/id`, chapter.id, 4, 10);
|
|
134
|
+
if (!/^ch-[0-9]{2,3}$/.test(chapterId))
|
|
135
|
+
fail(`${path}/id`, 'must match ch-01');
|
|
136
|
+
integer(`${path}/order`, chapter.order, 1);
|
|
137
|
+
string(`${path}/title`, chapter.title, 1, 40);
|
|
138
|
+
integer(`${path}/chars`, chapter.chars, 1);
|
|
139
|
+
oneOf(`${path}/status`, chapter.status, [
|
|
140
|
+
'queued',
|
|
141
|
+
'adapted',
|
|
142
|
+
'marked',
|
|
143
|
+
'audited',
|
|
144
|
+
'synthesized',
|
|
145
|
+
'timed',
|
|
146
|
+
'done',
|
|
147
|
+
'failed',
|
|
148
|
+
]);
|
|
149
|
+
if (chapter.audio !== undefined) {
|
|
150
|
+
const audio = object(`${path}/audio`, chapter.audio);
|
|
151
|
+
string(`${path}/audio/path`, audio.path, 1, 400);
|
|
152
|
+
integer(`${path}/audio/bytes`, audio.bytes, 1);
|
|
153
|
+
integer(`${path}/audio/durationMs`, audio.durationMs, 1);
|
|
154
|
+
oneOf(`${path}/audio/timingQuality`, audio.timingQuality, ['exact', 'estimated']);
|
|
155
|
+
if (audio.format !== undefined) {
|
|
156
|
+
oneOf(`${path}/audio/format`, audio.format, ['mp3', 'wav']);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (chapter.subtitles !== undefined) {
|
|
160
|
+
const subtitles = object(`${path}/subtitles`, chapter.subtitles);
|
|
161
|
+
string(`${path}/subtitles/path`, subtitles.path, 1, 400);
|
|
162
|
+
integer(`${path}/subtitles/units`, subtitles.units, 0);
|
|
163
|
+
if (subtitles.timingQuality !== undefined) {
|
|
164
|
+
oneOf(`${path}/subtitles/timingQuality`, subtitles.timingQuality, ['exact', 'estimated']);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (chapter.error !== undefined) {
|
|
168
|
+
const error = object(`${path}/error`, chapter.error);
|
|
169
|
+
string(`${path}/error/code`, error.code, 1, 60);
|
|
170
|
+
string(`${path}/error/message`, error.message, 1, 400);
|
|
171
|
+
boolean(`${path}/error/retryable`, error.retryable);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const totals = object('/totals', root.totals);
|
|
175
|
+
integer('/totals/chapters', totals.chapters, 0);
|
|
176
|
+
integer('/totals/chars', totals.chars, 0);
|
|
177
|
+
integer('/totals/audioMs', totals.audioMs, 0);
|
|
178
|
+
integer('/totals/bytes', totals.bytes, 0);
|
|
179
|
+
if (!Array.isArray(root.warnings))
|
|
180
|
+
fail('/warnings', 'must be an array');
|
|
181
|
+
for (const [index, warning] of root.warnings.entries()) {
|
|
182
|
+
string(`/warnings/${index}`, warning, 0, 200);
|
|
183
|
+
}
|
|
184
|
+
return value;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,eAAO,MAAM,OAAO,UAAU,CAAA"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,86 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leiboss/dsh-voiceover",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Long-form voiceover pipeline for DeepSeek Harness: chapter planning, spoken-script adaptation, subtitles, manifest, and resumable jobs. Turns a document into a publishable audio set.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "leiboss",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/leiboss/dsh-tts.git",
|
|
10
|
+
"directory": "packages/voiceover"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/leiboss/dsh-tts/tree/main/packages/voiceover#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/leiboss/dsh-tts/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"dsh-plugin",
|
|
18
|
+
"dsh",
|
|
19
|
+
"audiobook",
|
|
20
|
+
"voiceover",
|
|
21
|
+
"subtitle",
|
|
22
|
+
"srt",
|
|
23
|
+
"text-to-speech",
|
|
24
|
+
"tts",
|
|
25
|
+
"long-form"
|
|
26
|
+
],
|
|
27
|
+
"type": "module",
|
|
28
|
+
"bin": {
|
|
29
|
+
"dsh-voiceover": "./dist/serve-entry.js"
|
|
30
|
+
},
|
|
31
|
+
"main": "./dist/index.js",
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"exports": {
|
|
34
|
+
".": "./dist/index.js",
|
|
35
|
+
"./client": "./dist/client.js",
|
|
36
|
+
"./schemas/*": "./schemas/*",
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"dsh": {
|
|
40
|
+
"bundle": {
|
|
41
|
+
"patch": "./cordis.patch.yml"
|
|
42
|
+
},
|
|
43
|
+
"client": {
|
|
44
|
+
"platform": "web",
|
|
45
|
+
"inject": [
|
|
46
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
47
|
+
"@deepseek-ai/dsh-client-ui-tool",
|
|
48
|
+
"@deepseek-ai/dsh-client-ui-slots"
|
|
49
|
+
],
|
|
50
|
+
"immediately": true
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"files": [
|
|
54
|
+
"dist",
|
|
55
|
+
"client",
|
|
56
|
+
"cordis.patch.yml",
|
|
57
|
+
"schemas",
|
|
58
|
+
"README.md"
|
|
59
|
+
],
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=22.18",
|
|
62
|
+
"dsh": ">=0.2.2-rc.1"
|
|
63
|
+
},
|
|
64
|
+
"scripts": {
|
|
65
|
+
"build": "tsc -p tsconfig.json && node scripts/build-client.mjs",
|
|
66
|
+
"pretest": "node ../../scripts/check-node.mjs",
|
|
67
|
+
"test": "node --test \"test/**/*.test.ts\"",
|
|
68
|
+
"prepublishOnly": "node ../../scripts/check-node.mjs && npm run build && npm test"
|
|
69
|
+
},
|
|
70
|
+
"publishConfig": {
|
|
71
|
+
"access": "public"
|
|
72
|
+
},
|
|
73
|
+
"peerDependencies": {
|
|
74
|
+
"@deepseek-ai/cordis": ">=4.1.0 <5",
|
|
75
|
+
"@deepseek-ai/dsh-llm": ">=0.0.1-rc.1 <1",
|
|
76
|
+
"@deepseek-ai/dsh-tools": ">=0.0.1-rc.1 <1"
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"@deepseek-ai/schemastery": "^3.18.1-rc.1",
|
|
80
|
+
"@leiboss/dsh-tts": "^0.3.0"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@types/node": "^24.0.0",
|
|
84
|
+
"typescript": "^5.9.0"
|
|
85
|
+
}
|
|
6
86
|
}
|