vidpipe 1.2.2 → 1.2.3
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/dist/index.d.ts +2 -2
- package/dist/index.js +4766 -123
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/dist/agents/BaseAgent.d.ts +0 -52
- package/dist/agents/BaseAgent.d.ts.map +0 -1
- package/dist/agents/BaseAgent.js +0 -102
- package/dist/agents/BaseAgent.js.map +0 -1
- package/dist/agents/BlogAgent.d.ts +0 -3
- package/dist/agents/BlogAgent.d.ts.map +0 -1
- package/dist/agents/BlogAgent.js +0 -163
- package/dist/agents/BlogAgent.js.map +0 -1
- package/dist/agents/ChapterAgent.d.ts +0 -11
- package/dist/agents/ChapterAgent.d.ts.map +0 -1
- package/dist/agents/ChapterAgent.js +0 -191
- package/dist/agents/ChapterAgent.js.map +0 -1
- package/dist/agents/MediumVideoAgent.d.ts +0 -3
- package/dist/agents/MediumVideoAgent.d.ts.map +0 -1
- package/dist/agents/MediumVideoAgent.js +0 -219
- package/dist/agents/MediumVideoAgent.js.map +0 -1
- package/dist/agents/ShortsAgent.d.ts +0 -3
- package/dist/agents/ShortsAgent.d.ts.map +0 -1
- package/dist/agents/ShortsAgent.js +0 -243
- package/dist/agents/ShortsAgent.js.map +0 -1
- package/dist/agents/SilenceRemovalAgent.d.ts +0 -9
- package/dist/agents/SilenceRemovalAgent.d.ts.map +0 -1
- package/dist/agents/SilenceRemovalAgent.js +0 -209
- package/dist/agents/SilenceRemovalAgent.js.map +0 -1
- package/dist/agents/SocialMediaAgent.d.ts +0 -4
- package/dist/agents/SocialMediaAgent.d.ts.map +0 -1
- package/dist/agents/SocialMediaAgent.js +0 -248
- package/dist/agents/SocialMediaAgent.js.map +0 -1
- package/dist/agents/SummaryAgent.d.ts +0 -11
- package/dist/agents/SummaryAgent.d.ts.map +0 -1
- package/dist/agents/SummaryAgent.js +0 -333
- package/dist/agents/SummaryAgent.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -4
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -230
- package/dist/commands/doctor.js.map +0 -1
- package/dist/config/brand.d.ts +0 -29
- package/dist/config/brand.d.ts.map +0 -1
- package/dist/config/brand.js +0 -83
- package/dist/config/brand.js.map +0 -1
- package/dist/config/environment.d.ts +0 -39
- package/dist/config/environment.d.ts.map +0 -1
- package/dist/config/environment.js +0 -47
- package/dist/config/environment.js.map +0 -1
- package/dist/config/ffmpegResolver.d.ts +0 -3
- package/dist/config/ffmpegResolver.d.ts.map +0 -1
- package/dist/config/ffmpegResolver.js +0 -37
- package/dist/config/ffmpegResolver.js.map +0 -1
- package/dist/config/logger.d.ts +0 -5
- package/dist/config/logger.d.ts.map +0 -1
- package/dist/config/logger.js +0 -13
- package/dist/config/logger.js.map +0 -1
- package/dist/config/pricing.d.ts +0 -34
- package/dist/config/pricing.d.ts.map +0 -1
- package/dist/config/pricing.js +0 -71
- package/dist/config/pricing.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/pipeline.d.ts +0 -57
- package/dist/pipeline.d.ts.map +0 -1
- package/dist/pipeline.js +0 -324
- package/dist/pipeline.js.map +0 -1
- package/dist/providers/ClaudeProvider.d.ts +0 -14
- package/dist/providers/ClaudeProvider.d.ts.map +0 -1
- package/dist/providers/ClaudeProvider.js +0 -182
- package/dist/providers/ClaudeProvider.js.map +0 -1
- package/dist/providers/CopilotProvider.d.ts +0 -17
- package/dist/providers/CopilotProvider.d.ts.map +0 -1
- package/dist/providers/CopilotProvider.js +0 -149
- package/dist/providers/CopilotProvider.js.map +0 -1
- package/dist/providers/OpenAIProvider.d.ts +0 -14
- package/dist/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/providers/OpenAIProvider.js +0 -175
- package/dist/providers/OpenAIProvider.js.map +0 -1
- package/dist/providers/index.d.ts +0 -18
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -61
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/types.d.ts +0 -112
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -8
- package/dist/providers/types.js.map +0 -1
- package/dist/services/captionGeneration.d.ts +0 -7
- package/dist/services/captionGeneration.d.ts.map +0 -1
- package/dist/services/captionGeneration.js +0 -29
- package/dist/services/captionGeneration.js.map +0 -1
- package/dist/services/costTracker.d.ts +0 -63
- package/dist/services/costTracker.d.ts.map +0 -1
- package/dist/services/costTracker.js +0 -137
- package/dist/services/costTracker.js.map +0 -1
- package/dist/services/fileWatcher.d.ts +0 -19
- package/dist/services/fileWatcher.d.ts.map +0 -1
- package/dist/services/fileWatcher.js +0 -120
- package/dist/services/fileWatcher.js.map +0 -1
- package/dist/services/gitOperations.d.ts +0 -3
- package/dist/services/gitOperations.d.ts.map +0 -1
- package/dist/services/gitOperations.js +0 -43
- package/dist/services/gitOperations.js.map +0 -1
- package/dist/services/socialPosting.d.ts +0 -38
- package/dist/services/socialPosting.d.ts.map +0 -1
- package/dist/services/socialPosting.js +0 -102
- package/dist/services/socialPosting.js.map +0 -1
- package/dist/services/transcription.d.ts +0 -3
- package/dist/services/transcription.d.ts.map +0 -1
- package/dist/services/transcription.js +0 -100
- package/dist/services/transcription.js.map +0 -1
- package/dist/services/videoIngestion.d.ts +0 -3
- package/dist/services/videoIngestion.d.ts.map +0 -1
- package/dist/services/videoIngestion.js +0 -104
- package/dist/services/videoIngestion.js.map +0 -1
- package/dist/tools/captions/captionGenerator.d.ts +0 -84
- package/dist/tools/captions/captionGenerator.d.ts.map +0 -1
- package/dist/tools/captions/captionGenerator.js +0 -390
- package/dist/tools/captions/captionGenerator.js.map +0 -1
- package/dist/tools/ffmpeg/aspectRatio.d.ts +0 -101
- package/dist/tools/ffmpeg/aspectRatio.d.ts.map +0 -1
- package/dist/tools/ffmpeg/aspectRatio.js +0 -339
- package/dist/tools/ffmpeg/aspectRatio.js.map +0 -1
- package/dist/tools/ffmpeg/audioExtraction.d.ts +0 -16
- package/dist/tools/ffmpeg/audioExtraction.d.ts.map +0 -1
- package/dist/tools/ffmpeg/audioExtraction.js +0 -87
- package/dist/tools/ffmpeg/audioExtraction.js.map +0 -1
- package/dist/tools/ffmpeg/captionBurning.d.ts +0 -8
- package/dist/tools/ffmpeg/captionBurning.d.ts.map +0 -1
- package/dist/tools/ffmpeg/captionBurning.js +0 -72
- package/dist/tools/ffmpeg/captionBurning.js.map +0 -1
- package/dist/tools/ffmpeg/clipExtraction.d.ts +0 -38
- package/dist/tools/ffmpeg/clipExtraction.d.ts.map +0 -1
- package/dist/tools/ffmpeg/clipExtraction.js +0 -215
- package/dist/tools/ffmpeg/clipExtraction.js.map +0 -1
- package/dist/tools/ffmpeg/faceDetection.d.ts +0 -127
- package/dist/tools/ffmpeg/faceDetection.d.ts.map +0 -1
- package/dist/tools/ffmpeg/faceDetection.js +0 -501
- package/dist/tools/ffmpeg/faceDetection.js.map +0 -1
- package/dist/tools/ffmpeg/frameCapture.d.ts +0 -10
- package/dist/tools/ffmpeg/frameCapture.d.ts.map +0 -1
- package/dist/tools/ffmpeg/frameCapture.js +0 -49
- package/dist/tools/ffmpeg/frameCapture.js.map +0 -1
- package/dist/tools/ffmpeg/silenceDetection.d.ts +0 -10
- package/dist/tools/ffmpeg/silenceDetection.d.ts.map +0 -1
- package/dist/tools/ffmpeg/silenceDetection.js +0 -56
- package/dist/tools/ffmpeg/silenceDetection.js.map +0 -1
- package/dist/tools/ffmpeg/singlePassEdit.d.ts +0 -25
- package/dist/tools/ffmpeg/singlePassEdit.d.ts.map +0 -1
- package/dist/tools/ffmpeg/singlePassEdit.js +0 -124
- package/dist/tools/ffmpeg/singlePassEdit.js.map +0 -1
- package/dist/tools/search/exaClient.d.ts +0 -8
- package/dist/tools/search/exaClient.d.ts.map +0 -1
- package/dist/tools/search/exaClient.js +0 -38
- package/dist/tools/search/exaClient.js.map +0 -1
- package/dist/tools/whisper/whisperClient.d.ts +0 -3
- package/dist/tools/whisper/whisperClient.d.ts.map +0 -1
- package/dist/tools/whisper/whisperClient.js +0 -77
- package/dist/tools/whisper/whisperClient.js.map +0 -1
- package/dist/types/index.d.ts +0 -305
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -44
- package/dist/types/index.js.map +0 -1
package/dist/pipeline.js
DELETED
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import { promises as fs } from 'fs';
|
|
3
|
-
import logger from './config/logger';
|
|
4
|
-
import { getConfig } from './config/environment';
|
|
5
|
-
import { ingestVideo } from './services/videoIngestion';
|
|
6
|
-
import { transcribeVideo } from './services/transcription';
|
|
7
|
-
import { generateCaptions } from './services/captionGeneration';
|
|
8
|
-
import { generateSummary } from './agents/SummaryAgent';
|
|
9
|
-
import { generateShorts } from './agents/ShortsAgent';
|
|
10
|
-
import { generateMediumClips } from './agents/MediumVideoAgent';
|
|
11
|
-
import { generateSocialPosts, generateShortPosts } from './agents/SocialMediaAgent';
|
|
12
|
-
import { generateBlogPost } from './agents/BlogAgent';
|
|
13
|
-
import { generateChapters } from './agents/ChapterAgent';
|
|
14
|
-
import { commitAndPush } from './services/gitOperations';
|
|
15
|
-
import { removeDeadSilence } from './agents/SilenceRemovalAgent';
|
|
16
|
-
import { burnCaptions } from './tools/ffmpeg/captionBurning';
|
|
17
|
-
import { singlePassEditAndCaption } from './tools/ffmpeg/singlePassEdit';
|
|
18
|
-
import { costTracker } from './services/costTracker.js';
|
|
19
|
-
import { PipelineStage as Stage } from './types';
|
|
20
|
-
/**
|
|
21
|
-
* Execute a single pipeline stage with error isolation and timing.
|
|
22
|
-
*
|
|
23
|
-
* ### Stage contract
|
|
24
|
-
* - Each stage is wrapped in a try/catch so a failure **does not abort** the
|
|
25
|
-
* pipeline. Subsequent stages proceed with whatever data is available.
|
|
26
|
-
* - Returns `undefined` on failure (callers must null-check before using the result).
|
|
27
|
-
* - Records success/failure, error message, and wall-clock duration in `stageResults`
|
|
28
|
-
* for the pipeline summary.
|
|
29
|
-
*
|
|
30
|
-
* This design lets the pipeline produce partial results — e.g. if shorts
|
|
31
|
-
* generation fails, the summary and social posts can still be generated
|
|
32
|
-
* from the transcript.
|
|
33
|
-
*
|
|
34
|
-
* @param stageName - Enum value identifying the stage (used in logs and results)
|
|
35
|
-
* @param fn - Async function that performs the stage's work
|
|
36
|
-
* @param stageResults - Mutable array that accumulates per-stage outcome records
|
|
37
|
-
* @returns The stage result on success, or `undefined` on failure
|
|
38
|
-
*/
|
|
39
|
-
export async function runStage(stageName, fn, stageResults) {
|
|
40
|
-
costTracker.setStage(stageName);
|
|
41
|
-
const start = Date.now();
|
|
42
|
-
try {
|
|
43
|
-
const result = await fn();
|
|
44
|
-
const duration = Date.now() - start;
|
|
45
|
-
stageResults.push({ stage: stageName, success: true, duration });
|
|
46
|
-
logger.info(`Stage ${stageName} completed in ${duration}ms`);
|
|
47
|
-
return result;
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
const duration = Date.now() - start;
|
|
51
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
52
|
-
stageResults.push({ stage: stageName, success: false, error: message, duration });
|
|
53
|
-
logger.error(`Stage ${stageName} failed after ${duration}ms: ${message}`);
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Adjust transcript timestamps to account for removed silence segments.
|
|
59
|
-
* Shifts all timestamps by subtracting the cumulative removed duration before each point.
|
|
60
|
-
*/
|
|
61
|
-
export function adjustTranscript(transcript, removals) {
|
|
62
|
-
const sorted = [...removals].sort((a, b) => a.start - b.start);
|
|
63
|
-
function adjustTime(t) {
|
|
64
|
-
let offset = 0;
|
|
65
|
-
for (const r of sorted) {
|
|
66
|
-
if (t <= r.start)
|
|
67
|
-
break;
|
|
68
|
-
if (t >= r.end) {
|
|
69
|
-
offset += r.end - r.start;
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
// timestamp is inside a removed region — snap to removal start
|
|
73
|
-
offset += t - r.start;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return t - offset;
|
|
77
|
-
}
|
|
78
|
-
return {
|
|
79
|
-
...transcript,
|
|
80
|
-
duration: adjustTime(transcript.duration),
|
|
81
|
-
segments: transcript.segments
|
|
82
|
-
.filter(seg => !sorted.some(r => seg.start >= r.start && seg.end <= r.end))
|
|
83
|
-
.map(seg => ({
|
|
84
|
-
...seg,
|
|
85
|
-
start: adjustTime(seg.start),
|
|
86
|
-
end: adjustTime(seg.end),
|
|
87
|
-
})),
|
|
88
|
-
words: transcript.words
|
|
89
|
-
.filter(w => !sorted.some(r => w.start >= r.start && w.end <= r.end))
|
|
90
|
-
.map(w => ({
|
|
91
|
-
...w,
|
|
92
|
-
start: adjustTime(w.start),
|
|
93
|
-
end: adjustTime(w.end),
|
|
94
|
-
})),
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Run the full video processing pipeline.
|
|
99
|
-
*
|
|
100
|
-
* ### Stage ordering and data flow
|
|
101
|
-
* 1. **Ingest** — extracts metadata (slug, duration, paths). Required; aborts if failed.
|
|
102
|
-
* 2. **Transcribe** — Whisper transcription with word-level timestamps.
|
|
103
|
-
* 3. **Silence removal** — trims dead air from the video and adjusts the transcript
|
|
104
|
-
* timestamps accordingly. Produces an `adjustedTranscript` for captions.
|
|
105
|
-
* 4. **Captions** — generates SRT/VTT/ASS files from the (adjusted) transcript.
|
|
106
|
-
* 5. **Caption burn** — renders captions into the video using FFmpeg. Prefers a
|
|
107
|
-
* single-pass approach (silence removal + captions in one encode) when possible.
|
|
108
|
-
* 6. **Shorts** — AI-selected short clips. Uses the **original** transcript because
|
|
109
|
-
* clips are cut from the original (unedited) video.
|
|
110
|
-
* 7. **Medium clips** — longer AI-selected clips (same original-transcript reasoning).
|
|
111
|
-
* 8. **Chapters** — topic-boundary detection for YouTube chapters.
|
|
112
|
-
* 9. **Summary** — README generation (runs after shorts/chapters so it can reference them).
|
|
113
|
-
* 10–12. **Social posts** — platform-specific posts for the full video and each clip.
|
|
114
|
-
* 13. **Blog** — long-form blog post from transcript + summary.
|
|
115
|
-
* 14. **Git push** — commits all generated assets and pushes.
|
|
116
|
-
*
|
|
117
|
-
* ### Why failures don't abort
|
|
118
|
-
* Each stage runs through {@link runStage} which catches errors. This means a
|
|
119
|
-
* transcription failure still lets git-push run (committing whatever was produced),
|
|
120
|
-
* and a shorts failure doesn't block summary generation.
|
|
121
|
-
*/
|
|
122
|
-
export async function processVideo(videoPath) {
|
|
123
|
-
const pipelineStart = Date.now();
|
|
124
|
-
const stageResults = [];
|
|
125
|
-
const cfg = getConfig();
|
|
126
|
-
costTracker.reset();
|
|
127
|
-
logger.info(`Pipeline starting for: ${videoPath}`);
|
|
128
|
-
// 1. Ingestion — required for all subsequent stages
|
|
129
|
-
const video = await runStage(Stage.Ingestion, () => ingestVideo(videoPath), stageResults);
|
|
130
|
-
if (!video) {
|
|
131
|
-
const totalDuration = Date.now() - pipelineStart;
|
|
132
|
-
logger.error('Ingestion failed — cannot proceed without video metadata');
|
|
133
|
-
return { video: { originalPath: videoPath, repoPath: '', videoDir: '', slug: '', filename: '', duration: 0, size: 0, createdAt: new Date() }, transcript: undefined, editedVideoPath: undefined, captions: undefined, captionedVideoPath: undefined, summary: undefined, shorts: [], mediumClips: [], socialPosts: [], blogPost: undefined, stageResults, totalDuration };
|
|
134
|
-
}
|
|
135
|
-
// 2. Transcription
|
|
136
|
-
let transcript;
|
|
137
|
-
transcript = await runStage(Stage.Transcription, () => transcribeVideo(video), stageResults);
|
|
138
|
-
// 3. Silence Removal (context-aware)
|
|
139
|
-
let editedVideoPath;
|
|
140
|
-
let adjustedTranscript;
|
|
141
|
-
let silenceRemovals = [];
|
|
142
|
-
let silenceKeepSegments;
|
|
143
|
-
if (transcript && !cfg.SKIP_SILENCE_REMOVAL) {
|
|
144
|
-
const result = await runStage(Stage.SilenceRemoval, () => removeDeadSilence(video, transcript), stageResults);
|
|
145
|
-
if (result && result.wasEdited) {
|
|
146
|
-
editedVideoPath = result.editedPath;
|
|
147
|
-
silenceRemovals = result.removals;
|
|
148
|
-
silenceKeepSegments = result.keepSegments;
|
|
149
|
-
adjustedTranscript = adjustTranscript(transcript, silenceRemovals);
|
|
150
|
-
// Validate: check that adjusted transcript duration is close to edited video duration
|
|
151
|
-
const totalRemoved = silenceRemovals.reduce((sum, r) => sum + (r.end - r.start), 0);
|
|
152
|
-
const expectedDuration = transcript.duration - totalRemoved;
|
|
153
|
-
const adjustedDuration = adjustedTranscript.duration;
|
|
154
|
-
const drift = Math.abs(expectedDuration - adjustedDuration);
|
|
155
|
-
logger.info(`[Pipeline] Silence removal: original=${transcript.duration.toFixed(1)}s, removed=${totalRemoved.toFixed(1)}s, expected=${expectedDuration.toFixed(1)}s, adjusted=${adjustedDuration.toFixed(1)}s, drift=${drift.toFixed(1)}s`);
|
|
156
|
-
await fs.writeFile(path.join(video.videoDir, 'transcript-edited.json'), JSON.stringify(adjustedTranscript, null, 2));
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
// Use adjusted transcript for captions (if silence was removed), original otherwise
|
|
160
|
-
const captionTranscript = adjustedTranscript ?? transcript;
|
|
161
|
-
// 4. Captions (fast, no AI needed) — generate from the right transcript
|
|
162
|
-
let captions;
|
|
163
|
-
if (captionTranscript && !cfg.SKIP_CAPTIONS) {
|
|
164
|
-
captions = await runStage(Stage.Captions, () => generateCaptions(video, captionTranscript), stageResults);
|
|
165
|
-
}
|
|
166
|
-
// 5. Caption Burn — use single-pass (silence removal + captions) when possible
|
|
167
|
-
let captionedVideoPath;
|
|
168
|
-
if (captions && !cfg.SKIP_CAPTIONS) {
|
|
169
|
-
const assFile = captions.find((p) => p.endsWith('.ass'));
|
|
170
|
-
if (assFile && silenceKeepSegments) {
|
|
171
|
-
// Single-pass: re-do silence removal + burn captions from ORIGINAL video in one encode
|
|
172
|
-
// This guarantees frame-accurate cuts with perfectly aligned captions
|
|
173
|
-
const captionedOutput = path.join(video.videoDir, `${video.slug}-captioned.mp4`);
|
|
174
|
-
captionedVideoPath = await runStage(Stage.CaptionBurn, () => singlePassEditAndCaption(video.repoPath, silenceKeepSegments, assFile, captionedOutput), stageResults);
|
|
175
|
-
}
|
|
176
|
-
else if (assFile) {
|
|
177
|
-
// No silence removal — just burn captions into original video
|
|
178
|
-
const videoToBurn = editedVideoPath ?? video.repoPath;
|
|
179
|
-
const captionedOutput = path.join(video.videoDir, `${video.slug}-captioned.mp4`);
|
|
180
|
-
captionedVideoPath = await runStage(Stage.CaptionBurn, () => burnCaptions(videoToBurn, assFile, captionedOutput), stageResults);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
// 6. Shorts — use ORIGINAL transcript (shorts reference original video timestamps)
|
|
184
|
-
let shorts = [];
|
|
185
|
-
if (transcript && !cfg.SKIP_SHORTS) {
|
|
186
|
-
const result = await runStage(Stage.Shorts, () => generateShorts(video, transcript), stageResults);
|
|
187
|
-
if (result)
|
|
188
|
-
shorts = result;
|
|
189
|
-
}
|
|
190
|
-
// 7. Medium Clips — use ORIGINAL transcript (medium clips reference original video timestamps)
|
|
191
|
-
let mediumClips = [];
|
|
192
|
-
if (transcript && !cfg.SKIP_MEDIUM_CLIPS) {
|
|
193
|
-
const result = await runStage(Stage.MediumClips, () => generateMediumClips(video, transcript), stageResults);
|
|
194
|
-
if (result)
|
|
195
|
-
mediumClips = result;
|
|
196
|
-
}
|
|
197
|
-
// 8. Chapters — analyse transcript for topic boundaries
|
|
198
|
-
let chapters;
|
|
199
|
-
if (transcript) {
|
|
200
|
-
chapters = await runStage(Stage.Chapters, () => generateChapters(video, transcript), stageResults);
|
|
201
|
-
}
|
|
202
|
-
// 9. Summary (after shorts, medium clips, and chapters so the README can reference them)
|
|
203
|
-
let summary;
|
|
204
|
-
if (transcript) {
|
|
205
|
-
summary = await runStage(Stage.Summary, () => generateSummary(video, transcript, shorts, chapters), stageResults);
|
|
206
|
-
}
|
|
207
|
-
// 10. Social Media
|
|
208
|
-
let socialPosts = [];
|
|
209
|
-
if (transcript && summary && !cfg.SKIP_SOCIAL) {
|
|
210
|
-
const result = await runStage(Stage.SocialMedia, () => generateSocialPosts(video, transcript, summary, path.join(video.videoDir, 'social-posts')), stageResults);
|
|
211
|
-
if (result)
|
|
212
|
-
socialPosts = result;
|
|
213
|
-
}
|
|
214
|
-
// 11. Short Posts — generate social posts per short clip
|
|
215
|
-
if (transcript && shorts.length > 0 && !cfg.SKIP_SOCIAL) {
|
|
216
|
-
await runStage(Stage.ShortPosts, async () => {
|
|
217
|
-
for (const short of shorts) {
|
|
218
|
-
const posts = await generateShortPosts(video, short, transcript);
|
|
219
|
-
socialPosts.push(...posts);
|
|
220
|
-
}
|
|
221
|
-
}, stageResults);
|
|
222
|
-
}
|
|
223
|
-
// 12. Medium Clip Posts — generate social posts per medium clip
|
|
224
|
-
if (transcript && mediumClips.length > 0 && !cfg.SKIP_SOCIAL) {
|
|
225
|
-
await runStage(Stage.MediumClipPosts, async () => {
|
|
226
|
-
for (const clip of mediumClips) {
|
|
227
|
-
const asShortClip = {
|
|
228
|
-
id: clip.id,
|
|
229
|
-
title: clip.title,
|
|
230
|
-
slug: clip.slug,
|
|
231
|
-
segments: clip.segments,
|
|
232
|
-
totalDuration: clip.totalDuration,
|
|
233
|
-
outputPath: clip.outputPath,
|
|
234
|
-
captionedPath: clip.captionedPath,
|
|
235
|
-
description: clip.description,
|
|
236
|
-
tags: clip.tags,
|
|
237
|
-
};
|
|
238
|
-
const posts = await generateShortPosts(video, asShortClip, transcript);
|
|
239
|
-
// Move posts to medium-clips/{slug}/posts/
|
|
240
|
-
const clipsDir = path.join(path.dirname(video.repoPath), 'medium-clips');
|
|
241
|
-
const postsDir = path.join(clipsDir, clip.slug, 'posts');
|
|
242
|
-
await fs.mkdir(postsDir, { recursive: true });
|
|
243
|
-
for (const post of posts) {
|
|
244
|
-
const destPath = path.join(postsDir, path.basename(post.outputPath));
|
|
245
|
-
await fs.copyFile(post.outputPath, destPath);
|
|
246
|
-
await fs.unlink(post.outputPath).catch(() => { });
|
|
247
|
-
post.outputPath = destPath;
|
|
248
|
-
}
|
|
249
|
-
socialPosts.push(...posts);
|
|
250
|
-
}
|
|
251
|
-
}, stageResults);
|
|
252
|
-
}
|
|
253
|
-
// 13. Blog Post
|
|
254
|
-
let blogPost;
|
|
255
|
-
if (transcript && summary) {
|
|
256
|
-
blogPost = await runStage(Stage.Blog, () => generateBlogPost(video, transcript, summary), stageResults);
|
|
257
|
-
}
|
|
258
|
-
// 14. Git
|
|
259
|
-
if (!cfg.SKIP_GIT) {
|
|
260
|
-
await runStage(Stage.GitPush, () => commitAndPush(video.slug), stageResults);
|
|
261
|
-
}
|
|
262
|
-
const totalDuration = Date.now() - pipelineStart;
|
|
263
|
-
// Cost tracking report
|
|
264
|
-
const report = costTracker.getReport();
|
|
265
|
-
if (report.records.length > 0) {
|
|
266
|
-
logger.info(costTracker.formatReport());
|
|
267
|
-
const costMd = generateCostMarkdown(report);
|
|
268
|
-
const costPath = path.join(video.videoDir, 'cost-report.md');
|
|
269
|
-
await fs.writeFile(costPath, costMd, 'utf-8');
|
|
270
|
-
logger.info(`Cost report saved: ${costPath}`);
|
|
271
|
-
}
|
|
272
|
-
logger.info(`Pipeline completed in ${totalDuration}ms`);
|
|
273
|
-
return {
|
|
274
|
-
video,
|
|
275
|
-
transcript,
|
|
276
|
-
editedVideoPath,
|
|
277
|
-
captions,
|
|
278
|
-
captionedVideoPath,
|
|
279
|
-
summary,
|
|
280
|
-
chapters,
|
|
281
|
-
shorts,
|
|
282
|
-
mediumClips,
|
|
283
|
-
socialPosts,
|
|
284
|
-
blogPost,
|
|
285
|
-
stageResults,
|
|
286
|
-
totalDuration,
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
function generateCostMarkdown(report) {
|
|
290
|
-
let md = '# Pipeline Cost Report\n\n';
|
|
291
|
-
md += `| Metric | Value |\n|--------|-------|\n`;
|
|
292
|
-
md += `| Total Cost | $${report.totalCostUSD.toFixed(4)} USD |\n`;
|
|
293
|
-
if (report.totalPRUs > 0)
|
|
294
|
-
md += `| Total PRUs | ${report.totalPRUs} |\n`;
|
|
295
|
-
md += `| Input Tokens | ${report.totalTokens.input.toLocaleString()} |\n`;
|
|
296
|
-
md += `| Output Tokens | ${report.totalTokens.output.toLocaleString()} |\n`;
|
|
297
|
-
md += `| LLM Calls | ${report.records.length} |\n\n`;
|
|
298
|
-
if (Object.keys(report.byAgent).length > 0) {
|
|
299
|
-
md += '## By Agent\n\n| Agent | Cost | PRUs | Calls |\n|-------|------|------|-------|\n';
|
|
300
|
-
for (const [agent, data] of Object.entries(report.byAgent)) {
|
|
301
|
-
md += `| ${agent} | $${data.costUSD.toFixed(4)} | ${data.prus} | ${data.calls} |\n`;
|
|
302
|
-
}
|
|
303
|
-
md += '\n';
|
|
304
|
-
}
|
|
305
|
-
if (Object.keys(report.byModel).length > 1) {
|
|
306
|
-
md += '## By Model\n\n| Model | Cost | PRUs | Calls |\n|-------|------|------|-------|\n';
|
|
307
|
-
for (const [model, data] of Object.entries(report.byModel)) {
|
|
308
|
-
md += `| ${model} | $${data.costUSD.toFixed(4)} | ${data.prus} | ${data.calls} |\n`;
|
|
309
|
-
}
|
|
310
|
-
md += '\n';
|
|
311
|
-
}
|
|
312
|
-
return md;
|
|
313
|
-
}
|
|
314
|
-
export async function processVideoSafe(videoPath) {
|
|
315
|
-
try {
|
|
316
|
-
return await processVideo(videoPath);
|
|
317
|
-
}
|
|
318
|
-
catch (err) {
|
|
319
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
320
|
-
logger.error(`Pipeline failed with uncaught error: ${message}`);
|
|
321
|
-
return null;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
//# sourceMappingURL=pipeline.js.map
|
package/dist/pipeline.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude (Anthropic) LLM Provider
|
|
3
|
-
*
|
|
4
|
-
* Wraps the Anthropic Messages API behind the LLMProvider interface.
|
|
5
|
-
* Uses direct @anthropic-ai/sdk for tool-calling with our own agent loop.
|
|
6
|
-
*/
|
|
7
|
-
import type { LLMProvider, LLMSession, SessionConfig } from './types.js';
|
|
8
|
-
export declare class ClaudeProvider implements LLMProvider {
|
|
9
|
-
readonly name: "claude";
|
|
10
|
-
isAvailable(): boolean;
|
|
11
|
-
getDefaultModel(): string;
|
|
12
|
-
createSession(config: SessionConfig): Promise<LLMSession>;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=ClaudeProvider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ClaudeProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EAEV,aAAa,EAKd,MAAM,YAAY,CAAA;AA8LnB,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IAEjC,WAAW,IAAI,OAAO;IAItB,eAAe,IAAI,MAAM;IAInB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;CAIhE"}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude (Anthropic) LLM Provider
|
|
3
|
-
*
|
|
4
|
-
* Wraps the Anthropic Messages API behind the LLMProvider interface.
|
|
5
|
-
* Uses direct @anthropic-ai/sdk for tool-calling with our own agent loop.
|
|
6
|
-
*/
|
|
7
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
8
|
-
import { calculateTokenCost } from '../config/pricing.js';
|
|
9
|
-
import logger from '../config/logger.js';
|
|
10
|
-
const DEFAULT_MODEL = 'claude-opus-4.6';
|
|
11
|
-
const DEFAULT_MAX_TOKENS = 8192;
|
|
12
|
-
const MAX_TOOL_ROUNDS = 50;
|
|
13
|
-
/** Convert our ToolWithHandler[] to Anthropic tool format */
|
|
14
|
-
function toAnthropicTools(tools) {
|
|
15
|
-
return tools.map((t) => ({
|
|
16
|
-
name: t.name,
|
|
17
|
-
description: t.description,
|
|
18
|
-
input_schema: t.parameters,
|
|
19
|
-
}));
|
|
20
|
-
}
|
|
21
|
-
/** Extract text content from Anthropic response content blocks */
|
|
22
|
-
function extractText(content) {
|
|
23
|
-
return content
|
|
24
|
-
.filter((b) => b.type === 'text')
|
|
25
|
-
.map((b) => b.text)
|
|
26
|
-
.join('');
|
|
27
|
-
}
|
|
28
|
-
/** Extract tool_use blocks from Anthropic response */
|
|
29
|
-
function extractToolUse(content) {
|
|
30
|
-
return content.filter((b) => b.type === 'tool_use');
|
|
31
|
-
}
|
|
32
|
-
class ClaudeSession {
|
|
33
|
-
client;
|
|
34
|
-
systemPrompt;
|
|
35
|
-
tools;
|
|
36
|
-
anthropicTools;
|
|
37
|
-
messages = [];
|
|
38
|
-
model;
|
|
39
|
-
maxTokens;
|
|
40
|
-
handlers = new Map();
|
|
41
|
-
timeoutMs;
|
|
42
|
-
constructor(client, config) {
|
|
43
|
-
this.client = client;
|
|
44
|
-
this.systemPrompt = config.systemPrompt;
|
|
45
|
-
this.tools = config.tools;
|
|
46
|
-
this.anthropicTools = toAnthropicTools(config.tools);
|
|
47
|
-
this.model = config.model ?? DEFAULT_MODEL;
|
|
48
|
-
this.maxTokens = DEFAULT_MAX_TOKENS;
|
|
49
|
-
this.timeoutMs = config.timeoutMs;
|
|
50
|
-
}
|
|
51
|
-
on(event, handler) {
|
|
52
|
-
const list = this.handlers.get(event) ?? [];
|
|
53
|
-
list.push(handler);
|
|
54
|
-
this.handlers.set(event, list);
|
|
55
|
-
}
|
|
56
|
-
emit(type, data) {
|
|
57
|
-
for (const handler of this.handlers.get(type) ?? []) {
|
|
58
|
-
handler({ type, data });
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
async sendAndWait(message) {
|
|
62
|
-
this.messages.push({ role: 'user', content: message });
|
|
63
|
-
let cumulativeUsage = {
|
|
64
|
-
inputTokens: 0,
|
|
65
|
-
outputTokens: 0,
|
|
66
|
-
totalTokens: 0,
|
|
67
|
-
};
|
|
68
|
-
const startMs = Date.now();
|
|
69
|
-
// Agent loop: keep calling until no more tool_use
|
|
70
|
-
let toolRound = 0;
|
|
71
|
-
while (true) {
|
|
72
|
-
if (++toolRound > MAX_TOOL_ROUNDS) {
|
|
73
|
-
logger.warn(`Claude agent exceeded ${MAX_TOOL_ROUNDS} tool rounds — aborting to prevent runaway`);
|
|
74
|
-
throw new Error(`Max tool rounds (${MAX_TOOL_ROUNDS}) exceeded — possible infinite loop`);
|
|
75
|
-
}
|
|
76
|
-
const controller = new AbortController();
|
|
77
|
-
const timeoutId = this.timeoutMs
|
|
78
|
-
? setTimeout(() => controller.abort(), this.timeoutMs)
|
|
79
|
-
: undefined;
|
|
80
|
-
let response;
|
|
81
|
-
try {
|
|
82
|
-
response = await this.client.messages.create({
|
|
83
|
-
model: this.model,
|
|
84
|
-
max_tokens: this.maxTokens,
|
|
85
|
-
system: this.systemPrompt,
|
|
86
|
-
messages: this.messages,
|
|
87
|
-
...(this.anthropicTools.length > 0 ? { tools: this.anthropicTools } : {}),
|
|
88
|
-
}, { signal: controller.signal });
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
if (timeoutId)
|
|
92
|
-
clearTimeout(timeoutId);
|
|
93
|
-
}
|
|
94
|
-
// Accumulate usage
|
|
95
|
-
cumulativeUsage.inputTokens += response.usage.input_tokens;
|
|
96
|
-
cumulativeUsage.outputTokens += response.usage.output_tokens;
|
|
97
|
-
cumulativeUsage.totalTokens =
|
|
98
|
-
cumulativeUsage.inputTokens + cumulativeUsage.outputTokens;
|
|
99
|
-
if (response.usage.cache_read_input_tokens) {
|
|
100
|
-
cumulativeUsage.cacheReadTokens =
|
|
101
|
-
(cumulativeUsage.cacheReadTokens ?? 0) + response.usage.cache_read_input_tokens;
|
|
102
|
-
}
|
|
103
|
-
if (response.usage.cache_creation_input_tokens) {
|
|
104
|
-
cumulativeUsage.cacheWriteTokens =
|
|
105
|
-
(cumulativeUsage.cacheWriteTokens ?? 0) + response.usage.cache_creation_input_tokens;
|
|
106
|
-
}
|
|
107
|
-
this.emit('usage', cumulativeUsage);
|
|
108
|
-
// Add assistant response to history
|
|
109
|
-
this.messages.push({ role: 'assistant', content: response.content });
|
|
110
|
-
const toolUseBlocks = extractToolUse(response.content);
|
|
111
|
-
if (toolUseBlocks.length === 0 || response.stop_reason === 'end_turn') {
|
|
112
|
-
// No tool calls — return final text
|
|
113
|
-
const text = extractText(response.content);
|
|
114
|
-
const cost = calculateTokenCost(this.model, cumulativeUsage.inputTokens, cumulativeUsage.outputTokens);
|
|
115
|
-
return {
|
|
116
|
-
content: text,
|
|
117
|
-
toolCalls: [],
|
|
118
|
-
usage: cumulativeUsage,
|
|
119
|
-
cost: cost > 0
|
|
120
|
-
? { amount: cost, unit: 'usd', model: this.model }
|
|
121
|
-
: undefined,
|
|
122
|
-
durationMs: Date.now() - startMs,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
// Execute tool calls and build result messages
|
|
126
|
-
const toolResults = [];
|
|
127
|
-
for (const block of toolUseBlocks) {
|
|
128
|
-
const tool = this.tools.find((t) => t.name === block.name);
|
|
129
|
-
if (!tool) {
|
|
130
|
-
logger.warn(`Claude requested unknown tool: ${block.name}`);
|
|
131
|
-
toolResults.push({
|
|
132
|
-
type: 'tool_result',
|
|
133
|
-
tool_use_id: block.id,
|
|
134
|
-
content: JSON.stringify({ error: `Unknown tool: ${block.name}` }),
|
|
135
|
-
});
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
this.emit('tool_start', { name: block.name, arguments: block.input });
|
|
139
|
-
try {
|
|
140
|
-
const result = await tool.handler(block.input);
|
|
141
|
-
toolResults.push({
|
|
142
|
-
type: 'tool_result',
|
|
143
|
-
tool_use_id: block.id,
|
|
144
|
-
content: JSON.stringify(result),
|
|
145
|
-
});
|
|
146
|
-
this.emit('tool_end', { name: block.name, result });
|
|
147
|
-
}
|
|
148
|
-
catch (err) {
|
|
149
|
-
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
150
|
-
logger.error(`Tool ${block.name} failed: ${errorMsg}`);
|
|
151
|
-
toolResults.push({
|
|
152
|
-
type: 'tool_result',
|
|
153
|
-
tool_use_id: block.id,
|
|
154
|
-
content: JSON.stringify({ error: errorMsg }),
|
|
155
|
-
is_error: true,
|
|
156
|
-
});
|
|
157
|
-
this.emit('error', { name: block.name, error: errorMsg });
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
// Add tool results as a user message and loop
|
|
161
|
-
this.messages.push({ role: 'user', content: toolResults });
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
async close() {
|
|
165
|
-
this.messages = [];
|
|
166
|
-
this.handlers.clear();
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
export class ClaudeProvider {
|
|
170
|
-
name = 'claude';
|
|
171
|
-
isAvailable() {
|
|
172
|
-
return !!process.env.ANTHROPIC_API_KEY;
|
|
173
|
-
}
|
|
174
|
-
getDefaultModel() {
|
|
175
|
-
return DEFAULT_MODEL;
|
|
176
|
-
}
|
|
177
|
-
async createSession(config) {
|
|
178
|
-
const client = new Anthropic();
|
|
179
|
-
return new ClaudeSession(client, config);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
//# sourceMappingURL=ClaudeProvider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeProvider.js","sourceRoot":"","sources":["../../src/providers/ClaudeProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CopilotProvider — wraps @github/copilot-sdk behind the LLMProvider interface.
|
|
3
|
-
*
|
|
4
|
-
* Extracts the Copilot-specific logic from BaseAgent into a reusable provider
|
|
5
|
-
* that can be swapped with OpenAI or Claude providers via the abstraction layer.
|
|
6
|
-
*/
|
|
7
|
-
import type { LLMProvider, LLMSession, SessionConfig } from './types';
|
|
8
|
-
export declare class CopilotProvider implements LLMProvider {
|
|
9
|
-
readonly name: "copilot";
|
|
10
|
-
private client;
|
|
11
|
-
isAvailable(): boolean;
|
|
12
|
-
getDefaultModel(): string;
|
|
13
|
-
createSession(config: SessionConfig): Promise<LLMSession>;
|
|
14
|
-
/** Tear down the underlying Copilot client. */
|
|
15
|
-
close(): Promise<void>;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=CopilotProvider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CopilotProvider.d.ts","sourceRoot":"","sources":["../../src/providers/CopilotProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EAEV,aAAa,EAOd,MAAM,SAAS,CAAA;AAKhB,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAS;IAClC,OAAO,CAAC,MAAM,CAA6B;IAE3C,WAAW,IAAI,OAAO;IAKtB,eAAe,IAAI,MAAM;IAInB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAsB/D,+CAA+C;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
|