demofly 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/commands/auth/login.js +1 -1
  2. package/dist/commands/auth/login.js.map +1 -1
  3. package/dist/commands/demos/delete.d.ts +3 -0
  4. package/dist/commands/demos/delete.d.ts.map +1 -0
  5. package/dist/commands/demos/delete.js +41 -0
  6. package/dist/commands/demos/delete.js.map +1 -0
  7. package/dist/commands/demos/get.d.ts +3 -0
  8. package/dist/commands/demos/get.d.ts.map +1 -0
  9. package/dist/commands/demos/get.js +30 -0
  10. package/dist/commands/demos/get.js.map +1 -0
  11. package/dist/commands/demos/index.d.ts +3 -0
  12. package/dist/commands/demos/index.d.ts.map +1 -0
  13. package/dist/commands/demos/index.js +17 -0
  14. package/dist/commands/demos/index.js.map +1 -0
  15. package/dist/commands/demos/list.d.ts +3 -0
  16. package/dist/commands/demos/list.d.ts.map +1 -0
  17. package/dist/commands/demos/list.js +117 -0
  18. package/dist/commands/demos/list.js.map +1 -0
  19. package/dist/commands/demos/open.d.ts +3 -0
  20. package/dist/commands/demos/open.d.ts.map +1 -0
  21. package/dist/commands/demos/open.js +45 -0
  22. package/dist/commands/demos/open.js.map +1 -0
  23. package/dist/commands/demos/update.d.ts +3 -0
  24. package/dist/commands/demos/update.d.ts.map +1 -0
  25. package/dist/commands/demos/update.js +31 -0
  26. package/dist/commands/demos/update.js.map +1 -0
  27. package/dist/commands/generate.d.ts +6 -0
  28. package/dist/commands/generate.d.ts.map +1 -1
  29. package/dist/commands/generate.js +73 -17
  30. package/dist/commands/generate.js.map +1 -1
  31. package/dist/commands/push.d.ts.map +1 -1
  32. package/dist/commands/push.js +12 -9
  33. package/dist/commands/push.js.map +1 -1
  34. package/dist/commands/render.d.ts +11 -0
  35. package/dist/commands/render.d.ts.map +1 -0
  36. package/dist/commands/render.js +161 -0
  37. package/dist/commands/render.js.map +1 -0
  38. package/dist/index.js +10 -3
  39. package/dist/index.js.map +1 -1
  40. package/dist/lib/api-client.d.ts +2 -1
  41. package/dist/lib/api-client.d.ts.map +1 -1
  42. package/dist/lib/api-client.js +22 -10
  43. package/dist/lib/api-client.js.map +1 -1
  44. package/dist/lib/audio-stitching.d.ts +64 -0
  45. package/dist/lib/audio-stitching.d.ts.map +1 -0
  46. package/dist/lib/audio-stitching.js +260 -0
  47. package/dist/lib/audio-stitching.js.map +1 -0
  48. package/dist/lib/credentials.d.ts.map +1 -1
  49. package/dist/lib/credentials.js +2 -0
  50. package/dist/lib/credentials.js.map +1 -1
  51. package/dist/lib/demo-scanner.d.ts +17 -0
  52. package/dist/lib/demo-scanner.d.ts.map +1 -0
  53. package/dist/lib/demo-scanner.js +70 -0
  54. package/dist/lib/demo-scanner.js.map +1 -0
  55. package/dist/lib/enhancement-client.d.ts +17 -0
  56. package/dist/lib/enhancement-client.d.ts.map +1 -0
  57. package/dist/lib/enhancement-client.js +129 -0
  58. package/dist/lib/enhancement-client.js.map +1 -0
  59. package/dist/lib/hybrid-rendering.d.ts +52 -0
  60. package/dist/lib/hybrid-rendering.d.ts.map +1 -0
  61. package/dist/lib/hybrid-rendering.js +161 -0
  62. package/dist/lib/hybrid-rendering.js.map +1 -0
  63. package/dist/lib/logger.d.ts +7 -0
  64. package/dist/lib/logger.d.ts.map +1 -0
  65. package/dist/lib/logger.js +19 -0
  66. package/dist/lib/logger.js.map +1 -0
  67. package/dist/lib/tts.d.ts +12 -0
  68. package/dist/lib/tts.d.ts.map +1 -1
  69. package/dist/lib/tts.js +64 -28
  70. package/dist/lib/tts.js.map +1 -1
  71. package/package.json +1 -1
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Audio Stitching Pipeline
3
+ *
4
+ * Precisely reassemble enhanced audio clips at original timestamps,
5
+ * maintaining perfect synchronization with video timeline.
6
+ */
7
+ import { existsSync, writeFileSync } from "node:fs";
8
+ import { resolve } from "node:path";
9
+ import { spawn } from "node:child_process";
10
+ /**
11
+ * Download enhanced audio files from cloud service
12
+ */
13
+ async function downloadEnhancedAudio(segments, audioDir) {
14
+ const downloadedPaths = new Map();
15
+ for (const segment of segments) {
16
+ if (segment.audioUrl && segment.status === "success") {
17
+ const enhancedPath = resolve(audioDir, `enhanced_${segment.id}.mp3`);
18
+ try {
19
+ console.log(`⬇️ Downloading ${segment.id}...`);
20
+ // Download enhanced audio file
21
+ const response = await fetch(segment.audioUrl);
22
+ if (!response.ok) {
23
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
24
+ }
25
+ const audioData = await response.arrayBuffer();
26
+ writeFileSync(enhancedPath, Buffer.from(audioData));
27
+ downloadedPaths.set(segment.id, enhancedPath);
28
+ console.log(` ✅ Downloaded ${segment.id} (${audioData.byteLength} bytes)`);
29
+ }
30
+ catch (error) {
31
+ console.error(` ❌ Failed to download ${segment.id}:`, error);
32
+ }
33
+ }
34
+ }
35
+ return downloadedPaths;
36
+ }
37
+ /**
38
+ * Generate FFmpeg filter complex for precise audio assembly
39
+ */
40
+ function generateFFmpegFilter(timeline, downloadedPaths, audioDir, options) {
41
+ const inputFiles = [];
42
+ const filters = [];
43
+ const qualityThreshold = options.qualityThreshold ?? 0.7;
44
+ let inputIndex = 0;
45
+ const segmentInputs = new Map();
46
+ // Add input files and create segment filters
47
+ for (const segment of timeline.segments) {
48
+ let audioPath;
49
+ let useEnhanced = false;
50
+ // Decide whether to use enhanced or original audio
51
+ if (downloadedPaths.has(segment.id) &&
52
+ segment.status === "success" &&
53
+ segment.qualityScore >= qualityThreshold) {
54
+ audioPath = downloadedPaths.get(segment.id);
55
+ useEnhanced = true;
56
+ }
57
+ else {
58
+ // Fallback to original audio
59
+ audioPath = resolve(audioDir, `${segment.id}.wav`);
60
+ if (!existsSync(audioPath)) {
61
+ // Try alternate naming patterns
62
+ const altPath = resolve(audioDir, `${segment.id.split('_')[0]}.wav`);
63
+ if (existsSync(altPath)) {
64
+ audioPath = altPath;
65
+ }
66
+ else {
67
+ console.warn(`⚠️ Original audio not found for ${segment.id}, skipping`);
68
+ continue;
69
+ }
70
+ }
71
+ }
72
+ inputFiles.push(audioPath);
73
+ segmentInputs.set(segment.id, inputIndex);
74
+ // Apply time stretching if enhanced duration differs significantly from target
75
+ const targetDuration = segment.endTime - segment.startTime;
76
+ const actualDuration = useEnhanced ? segment.enhancedDuration : segment.originalDuration;
77
+ const driftMs = Math.abs((actualDuration - targetDuration) * 1000);
78
+ if (driftMs > timeline.assemblyInstructions.toleranceMs) {
79
+ // Time-stretch to match original timing
80
+ const stretchRatio = targetDuration / actualDuration;
81
+ filters.push(`[${inputIndex}:0]atempo=${stretchRatio.toFixed(6)}[seg${inputIndex}]`);
82
+ }
83
+ else {
84
+ filters.push(`[${inputIndex}:0]anull[seg${inputIndex}]`);
85
+ }
86
+ inputIndex++;
87
+ }
88
+ // Generate silence for gaps
89
+ const silenceFilters = [];
90
+ for (let i = 0; i < timeline.silenceRegions.length; i++) {
91
+ const silence = timeline.silenceRegions[i];
92
+ const durationS = silence.endTime - silence.startTime;
93
+ silenceFilters.push(`aevalsrc=0:d=${durationS.toFixed(3)}[silence${i}]`);
94
+ }
95
+ // Combine all segments with precise timing
96
+ const mixInputs = [];
97
+ const delayFilters = [];
98
+ let segIndex = 0;
99
+ for (const segment of timeline.segments) {
100
+ if (segmentInputs.has(segment.id)) {
101
+ const delayMs = Math.round(segment.startTime * 1000);
102
+ delayFilters.push(`[seg${segmentInputs.get(segment.id)}]adelay=${delayMs}[delayed${segIndex}]`);
103
+ mixInputs.push(`[delayed${segIndex}]`);
104
+ segIndex++;
105
+ }
106
+ }
107
+ // Add silence regions with delays
108
+ timeline.silenceRegions.forEach((silence, i) => {
109
+ const delayMs = Math.round(silence.startTime * 1000);
110
+ delayFilters.push(`[silence${i}]adelay=${delayMs}[delayedsilence${i}]`);
111
+ mixInputs.push(`[delayedsilence${i}]`);
112
+ });
113
+ // Final mix
114
+ const mixFilter = `${mixInputs.join('')}amix=inputs=${mixInputs.length}:duration=longest[out]`;
115
+ const allFilters = [
116
+ ...silenceFilters,
117
+ ...filters,
118
+ ...delayFilters,
119
+ mixFilter
120
+ ];
121
+ return {
122
+ filterComplex: allFilters.join(';'),
123
+ inputFiles
124
+ };
125
+ }
126
+ /**
127
+ * Execute FFmpeg command to stitch audio timeline
128
+ */
129
+ async function executeFFmpeg(filterComplex, inputFiles, outputPath, options) {
130
+ return new Promise((resolve) => {
131
+ const args = [
132
+ ...inputFiles.flatMap(file => ['-i', file]),
133
+ '-filter_complex', filterComplex,
134
+ '-map', '[out]',
135
+ '-ar', String(options.sampleRate || 44100),
136
+ '-ac', String(options.channels || 2),
137
+ '-y', // Overwrite output
138
+ outputPath
139
+ ];
140
+ console.log(`🔧 Running: ffmpeg ${args.join(' ')}`);
141
+ const ffmpeg = spawn('ffmpeg', args);
142
+ let stderr = '';
143
+ let duration = 0;
144
+ ffmpeg.stderr.on('data', (data) => {
145
+ const chunk = data.toString();
146
+ stderr += chunk;
147
+ // Extract duration from FFmpeg output
148
+ const durationMatch = chunk.match(/Duration: (\d+):(\d+):(\d+\.\d+)/);
149
+ if (durationMatch) {
150
+ const [, hours, minutes, seconds] = durationMatch;
151
+ duration = parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseFloat(seconds);
152
+ }
153
+ });
154
+ ffmpeg.on('close', (code) => {
155
+ if (code === 0) {
156
+ console.log(`✅ Audio stitching completed: ${outputPath}`);
157
+ resolve({ success: true, duration });
158
+ }
159
+ else {
160
+ console.error(`❌ FFmpeg failed with code ${code}`);
161
+ resolve({ success: false, duration: 0, error: stderr });
162
+ }
163
+ });
164
+ ffmpeg.on('error', (error) => {
165
+ console.error(`❌ Failed to spawn FFmpeg:`, error);
166
+ resolve({ success: false, duration: 0, error: error.message });
167
+ });
168
+ });
169
+ }
170
+ /**
171
+ * Calculate sync accuracy and quality metrics
172
+ */
173
+ function calculateMetrics(timeline, downloadedPaths) {
174
+ const segmentsUsed = {
175
+ enhanced: 0,
176
+ original: 0,
177
+ failed: 0
178
+ };
179
+ let totalQuality = 0;
180
+ let maxDriftMs = 0;
181
+ let totalArtifacts = 0;
182
+ for (const segment of timeline.segments) {
183
+ if (downloadedPaths.has(segment.id) && segment.status === "success") {
184
+ segmentsUsed.enhanced++;
185
+ totalQuality += segment.qualityScore;
186
+ const driftMs = Math.abs((segment.enhancedDuration - segment.originalDuration) * 1000);
187
+ maxDriftMs = Math.max(maxDriftMs, driftMs);
188
+ }
189
+ else if (segment.status === "fallback") {
190
+ segmentsUsed.original++;
191
+ totalQuality += 0.7; // Assume original has decent quality
192
+ }
193
+ else {
194
+ segmentsUsed.failed++;
195
+ }
196
+ }
197
+ const totalSegments = segmentsUsed.enhanced + segmentsUsed.original + segmentsUsed.failed;
198
+ const avgQualityScore = totalSegments > 0 ? totalQuality / totalSegments : 0;
199
+ return {
200
+ segmentsUsed,
201
+ qualityMetrics: {
202
+ avgQualityScore,
203
+ maxDriftMs,
204
+ totalArtifacts
205
+ }
206
+ };
207
+ }
208
+ /**
209
+ * Main audio stitching function
210
+ */
211
+ export async function stitchEnhancedAudio(timeline, audioDir, options) {
212
+ console.log(`🧵 Starting audio stitching for job ${timeline.jobId}`);
213
+ console.log(`📊 ${timeline.segments.length} segments, ${timeline.totalDuration.toFixed(1)}s total`);
214
+ const errors = [];
215
+ try {
216
+ // Download enhanced audio files
217
+ const downloadedPaths = await downloadEnhancedAudio(timeline.segments, audioDir);
218
+ console.log(`📦 Downloaded ${downloadedPaths.size}/${timeline.segments.length} enhanced segments`);
219
+ // Generate FFmpeg filter for precise assembly
220
+ const { filterComplex, inputFiles } = generateFFmpegFilter(timeline, downloadedPaths, audioDir, options);
221
+ if (inputFiles.length === 0) {
222
+ throw new Error("No audio files available for stitching");
223
+ }
224
+ console.log(`🎛️ Using ${inputFiles.length} audio inputs`);
225
+ // Execute audio stitching
226
+ const stitchResult = await executeFFmpeg(filterComplex, inputFiles, options.outputPath, options);
227
+ if (!stitchResult.success) {
228
+ throw new Error(stitchResult.error || "FFmpeg execution failed");
229
+ }
230
+ // Calculate metrics
231
+ const metrics = calculateMetrics(timeline, downloadedPaths);
232
+ const syncAccuracy = 1.0 - (metrics.qualityMetrics.maxDriftMs / 1000); // Convert to 0-1 scale
233
+ console.log(`📈 Quality: ${metrics.qualityMetrics.avgQualityScore.toFixed(2)}, Sync: ${(syncAccuracy * 100).toFixed(1)}%`);
234
+ console.log(`🎵 Enhanced: ${metrics.segmentsUsed.enhanced}, Original: ${metrics.segmentsUsed.original}, Failed: ${metrics.segmentsUsed.failed}`);
235
+ return {
236
+ success: true,
237
+ outputPath: options.outputPath,
238
+ finalDuration: stitchResult.duration,
239
+ segmentsUsed: metrics.segmentsUsed,
240
+ syncAccuracy: Math.max(0, syncAccuracy),
241
+ qualityMetrics: metrics.qualityMetrics,
242
+ errors
243
+ };
244
+ }
245
+ catch (error) {
246
+ const errorMsg = error instanceof Error ? error.message : String(error);
247
+ console.error(`❌ Audio stitching failed:`, errorMsg);
248
+ errors.push(errorMsg);
249
+ return {
250
+ success: false,
251
+ outputPath: options.outputPath,
252
+ finalDuration: 0,
253
+ segmentsUsed: { enhanced: 0, original: 0, failed: timeline.segments.length },
254
+ syncAccuracy: 0,
255
+ qualityMetrics: { avgQualityScore: 0, maxDriftMs: 0, totalArtifacts: 0 },
256
+ errors
257
+ };
258
+ }
259
+ }
260
+ //# sourceMappingURL=audio-stitching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-stitching.js","sourceRoot":"","sources":["../../src/lib/audio-stitching.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAqFA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQvD;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK7D"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAqFA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUvD;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK7D"}
@@ -71,6 +71,8 @@ function deleteFile() {
71
71
  }
72
72
  }
73
73
  export async function getToken() {
74
+ if (process.env.DF_DEV_AUTH_BYPASS === "true")
75
+ return "dev-bypass";
74
76
  const envToken = process.env[ENV_VAR];
75
77
  if (envToken)
76
78
  return envToken;
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Demo Scanner
3
+ *
4
+ * Scans the local demofly/ directory to detect demos and their phases.
5
+ */
6
+ export type DemoPhase = "initialized" | "proposed" | "scripted" | "ready" | "recorded" | "narrated";
7
+ export interface LocalDemo {
8
+ name: string;
9
+ phase: DemoPhase;
10
+ durationMs?: number;
11
+ }
12
+ /**
13
+ * Scan the demofly/ directory for local demos.
14
+ * Returns an array of demos sorted alphabetically by name.
15
+ */
16
+ export declare function scanLocalDemos(cwd: string): LocalDemo[];
17
+ //# sourceMappingURL=demo-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-scanner.d.ts","sourceRoot":"","sources":["../../src/lib/demo-scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,MAAM,SAAS,GACjB,aAAa,GACb,UAAU,GACV,UAAU,GACV,OAAO,GACP,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAmBvD"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Demo Scanner
3
+ *
4
+ * Scans the local demofly/ directory to detect demos and their phases.
5
+ */
6
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ function detectPhase(demoDir) {
9
+ // Check highest priority first
10
+ if (existsSync(join(demoDir, "transcript.md")))
11
+ return "narrated";
12
+ const recordingsDir = join(demoDir, "recordings");
13
+ if (existsSync(recordingsDir)) {
14
+ try {
15
+ const entries = readdirSync(recordingsDir);
16
+ const hasVideo = entries.some((f) => /\.(webm|mp4|mov)$/i.test(f));
17
+ if (hasVideo)
18
+ return "recorded";
19
+ }
20
+ catch {
21
+ // ignore read errors
22
+ }
23
+ }
24
+ if (existsSync(join(demoDir, "demo.spec.ts")))
25
+ return "ready";
26
+ if (existsSync(join(demoDir, "script.md")))
27
+ return "scripted";
28
+ if (existsSync(join(demoDir, "proposal.md")))
29
+ return "proposed";
30
+ return "initialized";
31
+ }
32
+ function readDuration(demoDir) {
33
+ const timingPath = join(demoDir, "recordings", "timing.json");
34
+ if (!existsSync(timingPath))
35
+ return undefined;
36
+ try {
37
+ const raw = readFileSync(timingPath, "utf-8");
38
+ const data = JSON.parse(raw);
39
+ if (typeof data.totalDuration === "number") {
40
+ return data.totalDuration;
41
+ }
42
+ }
43
+ catch {
44
+ // ignore parse errors
45
+ }
46
+ return undefined;
47
+ }
48
+ /**
49
+ * Scan the demofly/ directory for local demos.
50
+ * Returns an array of demos sorted alphabetically by name.
51
+ */
52
+ export function scanLocalDemos(cwd) {
53
+ const demoflyDir = join(cwd, "demofly");
54
+ if (!existsSync(demoflyDir))
55
+ return [];
56
+ const entries = readdirSync(demoflyDir, { withFileTypes: true });
57
+ const demos = [];
58
+ for (const entry of entries) {
59
+ if (!entry.isDirectory())
60
+ continue;
61
+ const demoDir = join(demoflyDir, entry.name);
62
+ demos.push({
63
+ name: entry.name,
64
+ phase: detectPhase(demoDir),
65
+ durationMs: readDuration(demoDir),
66
+ });
67
+ }
68
+ return demos.sort((a, b) => a.name.localeCompare(b.name));
69
+ }
70
+ //# sourceMappingURL=demo-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-scanner.js","sourceRoot":"","sources":["../../src/lib/demo-scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgBjC,SAAS,WAAW,CAAC,OAAe;IAClC,+BAA+B;IAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IAElE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,IAAI,QAAQ;gBAAE,OAAO,UAAU,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9D,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IAC9D,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IAEhE,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+B,CAAC;QAC3D,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC;YAC3B,UAAU,EAAE,YAAY,CAAC,OAAO,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Enhancement Client
3
+ *
4
+ * Shared SSE consumer and polling fallback for cloud TTS enhancement progress.
5
+ * Used by both `render` and `generate --cloud` commands.
6
+ */
7
+ import type { ApiClient } from "./api-client.js";
8
+ import type { EnhancedTimeline } from "./audio-stitching.js";
9
+ export interface SSEJobResult {
10
+ status: "completed" | "partial" | "failed";
11
+ enhancedCount: number;
12
+ fallbackCount: number;
13
+ failedCount: number;
14
+ }
15
+ export declare function consumeEnhancementSSE(apiClient: ApiClient, jobId: string, totalSegments: number): Promise<SSEJobResult>;
16
+ export declare function pollEnhancementStatus(apiClient: ApiClient, jobId: string, onProgress?: (progress: number, status: string) => void): Promise<EnhancedTimeline>;
17
+ //# sourceMappingURL=enhancement-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancement-client.d.ts","sourceRoot":"","sources":["../../src/lib/enhancement-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,YAAY,CAAC,CA8FvB;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GACtD,OAAO,CAAC,gBAAgB,CAAC,CAmD3B"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Enhancement Client
3
+ *
4
+ * Shared SSE consumer and polling fallback for cloud TTS enhancement progress.
5
+ * Used by both `render` and `generate --cloud` commands.
6
+ */
7
+ export async function consumeEnhancementSSE(apiClient, jobId, totalSegments) {
8
+ const maxRetries = 3;
9
+ let lastEventId;
10
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
11
+ try {
12
+ const headers = {
13
+ Accept: "text/event-stream",
14
+ };
15
+ if (lastEventId) {
16
+ headers["Last-Event-ID"] = lastEventId;
17
+ }
18
+ const response = await apiClient.fetch(`/hybrid-rendering/events/${jobId}`, { headers });
19
+ if (!response.ok) {
20
+ throw new Error(`SSE connection failed: ${response.statusText}`);
21
+ }
22
+ const reader = response.body.getReader();
23
+ const decoder = new TextDecoder();
24
+ let buffer = "";
25
+ while (true) {
26
+ const { done, value } = await reader.read();
27
+ if (done)
28
+ break;
29
+ buffer += decoder.decode(value, { stream: true });
30
+ // Parse SSE frames (split on double newline)
31
+ const frames = buffer.split("\n\n");
32
+ buffer = frames.pop(); // Keep incomplete frame in buffer
33
+ for (const frame of frames) {
34
+ if (!frame.trim())
35
+ continue;
36
+ let eventType = "message";
37
+ let eventData = "";
38
+ let eventId;
39
+ for (const line of frame.split("\n")) {
40
+ if (line.startsWith("event: ")) {
41
+ eventType = line.slice(7);
42
+ }
43
+ else if (line.startsWith("data: ")) {
44
+ eventData = line.slice(6);
45
+ }
46
+ else if (line.startsWith("id: ")) {
47
+ eventId = line.slice(4);
48
+ }
49
+ }
50
+ if (eventId) {
51
+ lastEventId = eventId;
52
+ }
53
+ const data = eventData ? JSON.parse(eventData) : {};
54
+ switch (eventType) {
55
+ case "segment.started":
56
+ console.log(` [${data.index + 1}/${totalSegments}] Enhancing: "${data.text}"${data.attempt > 1 ? ` (attempt ${data.attempt})` : ""}`);
57
+ break;
58
+ case "segment.completed":
59
+ console.log(` [${data.index + 1}/${totalSegments}] Done — quality: ${(data.qualityScore * 100).toFixed(0)}%, drift: ${(data.durationDrift * 1000).toFixed(0)}ms`);
60
+ break;
61
+ case "segment.failed":
62
+ if (data.willRetry) {
63
+ console.log(` [${data.index + 1}/${totalSegments}] Failed, retrying: ${data.error}`);
64
+ }
65
+ else {
66
+ console.log(` [${data.index + 1}/${totalSegments}] Using original audio: ${data.error}`);
67
+ }
68
+ break;
69
+ case "progress":
70
+ console.log(` Progress: ${data.completed}/${data.total} segments (${(data.progress * 100).toFixed(0)}%)`);
71
+ break;
72
+ case "job.completed":
73
+ console.log(`Enhancement ${data.status}: ${data.enhancedCount} enhanced, ${data.fallbackCount} fallback, ${data.failedCount} failed`);
74
+ return data;
75
+ }
76
+ }
77
+ }
78
+ // Stream ended without job.completed — server closed connection, retry
79
+ console.log(`SSE stream ended unexpectedly, reconnecting (attempt ${attempt + 2}/${maxRetries})...`);
80
+ }
81
+ catch (error) {
82
+ if (attempt < maxRetries - 1) {
83
+ console.log(`SSE connection error, reconnecting (attempt ${attempt + 2}/${maxRetries})...`);
84
+ await new Promise(r => setTimeout(r, 1000 * (attempt + 1)));
85
+ }
86
+ else {
87
+ throw error;
88
+ }
89
+ }
90
+ }
91
+ throw new Error("SSE connection failed after maximum retries");
92
+ }
93
+ export async function pollEnhancementStatus(apiClient, jobId, onProgress) {
94
+ const maxWaitMs = 10 * 60 * 1000; // 10 minutes
95
+ const pollIntervalMs = 2000; // 2 seconds
96
+ const startTime = Date.now();
97
+ while (Date.now() - startTime < maxWaitMs) {
98
+ try {
99
+ const response = await apiClient.fetch(`/hybrid-rendering/status/${jobId}`);
100
+ const status = (await response.json());
101
+ if (!response.ok) {
102
+ throw new Error(`API error: ${status.error || response.statusText}`);
103
+ }
104
+ console.log(`Enhancement progress: ${(status.progress * 100).toFixed(1)}% (${status.status})`);
105
+ if (onProgress) {
106
+ onProgress(status.progress, status.status);
107
+ }
108
+ if (status.status === "completed" || status.status === "partial") {
109
+ const timelineResponse = await apiClient.fetch(`/hybrid-rendering/timeline/${jobId}`);
110
+ const timeline = (await timelineResponse.json());
111
+ if (!timelineResponse.ok) {
112
+ throw new Error(`Failed to get timeline: ${timelineResponse.statusText}`);
113
+ }
114
+ console.log(`Enhancement completed: ${status.enhancedSegments.length} segments enhanced`);
115
+ return timeline;
116
+ }
117
+ if (status.status === "failed") {
118
+ throw new Error(`Enhancement failed: ${status.qualityMetrics?.avgQualityScore || 'Unknown error'}`);
119
+ }
120
+ await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
121
+ }
122
+ catch (error) {
123
+ console.error(`Error polling enhancement status:`, error);
124
+ throw error;
125
+ }
126
+ }
127
+ throw new Error(`Enhancement timeout after ${maxWaitMs / 1000}s`);
128
+ }
129
+ //# sourceMappingURL=enhancement-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancement-client.js","sourceRoot":"","sources":["../../src/lib/enhancement-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Hybrid Rendering Pipeline - CLI Side
3
+ *
4
+ * Handles local audio generation with timing metadata extraction,
5
+ * then optionally sends to cloud for enhancement while preserving sync.
6
+ */
7
+ import { type TtsOptions } from "./tts.js";
8
+ /** Enhanced timing metadata for hybrid rendering */
9
+ export interface AudioTimingMetadata {
10
+ version: "1.0";
11
+ totalDuration: number;
12
+ segments: AudioSegment[];
13
+ silenceRegions: SilenceRegion[];
14
+ }
15
+ export interface AudioSegment {
16
+ id: string;
17
+ startTime: number;
18
+ endTime: number;
19
+ text: string;
20
+ type: "speech" | "silence";
21
+ naturalBoundaries: {
22
+ sentenceStart: boolean;
23
+ sentenceEnd: boolean;
24
+ pauseAfter: number;
25
+ };
26
+ audioPath?: string;
27
+ duration?: number;
28
+ }
29
+ export interface SilenceRegion {
30
+ startTime: number;
31
+ endTime: number;
32
+ type: "natural_pause" | "scene_transition" | "breathing";
33
+ }
34
+ /** Segment speech text at natural boundaries */
35
+ export declare function segmentSpeech(text: string): Array<{
36
+ text: string;
37
+ boundaryInfo: any;
38
+ }>;
39
+ /** Generate local audio with enhanced timing metadata */
40
+ export declare function generateLocalRender(transcriptPath: string, timingPath: string, projectDir: string, options?: TtsOptions): AudioTimingMetadata;
41
+ /** Prepare upload payload for cloud enhancement */
42
+ export interface CloudEnhancementPayload {
43
+ projectId: string;
44
+ metadata: AudioTimingMetadata;
45
+ preferences: {
46
+ voice?: string;
47
+ speed?: number;
48
+ enhancementLevel?: "standard" | "premium";
49
+ };
50
+ }
51
+ export declare function prepareCloudEnhancement(projectId: string, metadata: AudioTimingMetadata, options?: TtsOptions): CloudEnhancementPayload;
52
+ //# sourceMappingURL=hybrid-rendering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-rendering.d.ts","sourceRoot":"","sources":["../../src/lib/hybrid-rendering.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3E,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,iBAAiB,EAAE;QACjB,aAAa,EAAE,OAAO,CAAC;QACvB,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,eAAe,GAAG,kBAAkB,GAAG,WAAW,CAAC;CAC1D;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,GAAG,CAAA;CAAE,CAAC,CAqEtF;AAED,yDAAyD;AACzD,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,UAAe,GACvB,mBAAmB,CAyFrB;AAED,mDAAmD;AACnD,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,WAAW,EAAE;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,gBAAgB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;KAC3C,CAAC;CACH;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,GAAE,UAAe,GACvB,uBAAuB,CAUzB"}