vidpipe 1.0.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.
Files changed (213) hide show
  1. package/README.md +243 -0
  2. package/assets/fonts/Montserrat-Bold.ttf +0 -0
  3. package/assets/fonts/Montserrat-Regular.ttf +0 -0
  4. package/assets/fonts/OFL.txt +93 -0
  5. package/dist/__tests__/agents.test.d.ts +2 -0
  6. package/dist/__tests__/agents.test.d.ts.map +1 -0
  7. package/dist/__tests__/agents.test.js +434 -0
  8. package/dist/__tests__/agents.test.js.map +1 -0
  9. package/dist/__tests__/aspectRatio.test.d.ts +2 -0
  10. package/dist/__tests__/aspectRatio.test.d.ts.map +1 -0
  11. package/dist/__tests__/aspectRatio.test.js +406 -0
  12. package/dist/__tests__/aspectRatio.test.js.map +1 -0
  13. package/dist/__tests__/captionGenerator.test.d.ts +2 -0
  14. package/dist/__tests__/captionGenerator.test.d.ts.map +1 -0
  15. package/dist/__tests__/captionGenerator.test.js +435 -0
  16. package/dist/__tests__/captionGenerator.test.js.map +1 -0
  17. package/dist/__tests__/config.test.d.ts +2 -0
  18. package/dist/__tests__/config.test.d.ts.map +1 -0
  19. package/dist/__tests__/config.test.js +81 -0
  20. package/dist/__tests__/config.test.js.map +1 -0
  21. package/dist/__tests__/faceDetection.test.d.ts +2 -0
  22. package/dist/__tests__/faceDetection.test.d.ts.map +1 -0
  23. package/dist/__tests__/faceDetection.test.js +372 -0
  24. package/dist/__tests__/faceDetection.test.js.map +1 -0
  25. package/dist/__tests__/ffmpegTools.test.d.ts +2 -0
  26. package/dist/__tests__/ffmpegTools.test.d.ts.map +1 -0
  27. package/dist/__tests__/ffmpegTools.test.js +464 -0
  28. package/dist/__tests__/ffmpegTools.test.js.map +1 -0
  29. package/dist/__tests__/integration/captionBurn.test.d.ts +2 -0
  30. package/dist/__tests__/integration/captionBurn.test.d.ts.map +1 -0
  31. package/dist/__tests__/integration/captionBurn.test.js +103 -0
  32. package/dist/__tests__/integration/captionBurn.test.js.map +1 -0
  33. package/dist/__tests__/integration/clipComposite.test.d.ts +2 -0
  34. package/dist/__tests__/integration/clipComposite.test.d.ts.map +1 -0
  35. package/dist/__tests__/integration/clipComposite.test.js +56 -0
  36. package/dist/__tests__/integration/clipComposite.test.js.map +1 -0
  37. package/dist/__tests__/integration/faceDetection.test.d.ts +2 -0
  38. package/dist/__tests__/integration/faceDetection.test.d.ts.map +1 -0
  39. package/dist/__tests__/integration/faceDetection.test.js +85 -0
  40. package/dist/__tests__/integration/faceDetection.test.js.map +1 -0
  41. package/dist/__tests__/integration/ffmpegPipeline.test.d.ts +2 -0
  42. package/dist/__tests__/integration/ffmpegPipeline.test.d.ts.map +1 -0
  43. package/dist/__tests__/integration/ffmpegPipeline.test.js +88 -0
  44. package/dist/__tests__/integration/ffmpegPipeline.test.js.map +1 -0
  45. package/dist/__tests__/integration/fixture.d.ts +19 -0
  46. package/dist/__tests__/integration/fixture.d.ts.map +1 -0
  47. package/dist/__tests__/integration/fixture.js +112 -0
  48. package/dist/__tests__/integration/fixture.js.map +1 -0
  49. package/dist/__tests__/integration/fixture.test.d.ts +2 -0
  50. package/dist/__tests__/integration/fixture.test.d.ts.map +1 -0
  51. package/dist/__tests__/integration/fixture.test.js +27 -0
  52. package/dist/__tests__/integration/fixture.test.js.map +1 -0
  53. package/dist/__tests__/integration/realCaptions.test.d.ts +2 -0
  54. package/dist/__tests__/integration/realCaptions.test.d.ts.map +1 -0
  55. package/dist/__tests__/integration/realCaptions.test.js +226 -0
  56. package/dist/__tests__/integration/realCaptions.test.js.map +1 -0
  57. package/dist/__tests__/integration/realPipeline.test.d.ts +2 -0
  58. package/dist/__tests__/integration/realPipeline.test.d.ts.map +1 -0
  59. package/dist/__tests__/integration/realPipeline.test.js +210 -0
  60. package/dist/__tests__/integration/realPipeline.test.js.map +1 -0
  61. package/dist/__tests__/integration/silenceRemoval.test.d.ts +2 -0
  62. package/dist/__tests__/integration/silenceRemoval.test.d.ts.map +1 -0
  63. package/dist/__tests__/integration/silenceRemoval.test.js +93 -0
  64. package/dist/__tests__/integration/silenceRemoval.test.js.map +1 -0
  65. package/dist/__tests__/pipeline.test.d.ts +2 -0
  66. package/dist/__tests__/pipeline.test.d.ts.map +1 -0
  67. package/dist/__tests__/pipeline.test.js +434 -0
  68. package/dist/__tests__/pipeline.test.js.map +1 -0
  69. package/dist/__tests__/services.test.d.ts +2 -0
  70. package/dist/__tests__/services.test.d.ts.map +1 -0
  71. package/dist/__tests__/services.test.js +655 -0
  72. package/dist/__tests__/services.test.js.map +1 -0
  73. package/dist/__tests__/silenceRemoval.test.d.ts +2 -0
  74. package/dist/__tests__/silenceRemoval.test.d.ts.map +1 -0
  75. package/dist/__tests__/silenceRemoval.test.js +266 -0
  76. package/dist/__tests__/silenceRemoval.test.js.map +1 -0
  77. package/dist/__tests__/singlePassEdit.test.d.ts +2 -0
  78. package/dist/__tests__/singlePassEdit.test.d.ts.map +1 -0
  79. package/dist/__tests__/singlePassEdit.test.js +321 -0
  80. package/dist/__tests__/singlePassEdit.test.js.map +1 -0
  81. package/dist/__tests__/smoke.test.d.ts +2 -0
  82. package/dist/__tests__/smoke.test.d.ts.map +1 -0
  83. package/dist/__tests__/smoke.test.js +8 -0
  84. package/dist/__tests__/smoke.test.js.map +1 -0
  85. package/dist/__tests__/utilities.test.d.ts +2 -0
  86. package/dist/__tests__/utilities.test.d.ts.map +1 -0
  87. package/dist/__tests__/utilities.test.js +268 -0
  88. package/dist/__tests__/utilities.test.js.map +1 -0
  89. package/dist/agents/BaseAgent.d.ts +52 -0
  90. package/dist/agents/BaseAgent.d.ts.map +1 -0
  91. package/dist/agents/BaseAgent.js +108 -0
  92. package/dist/agents/BaseAgent.js.map +1 -0
  93. package/dist/agents/BlogAgent.d.ts +3 -0
  94. package/dist/agents/BlogAgent.d.ts.map +1 -0
  95. package/dist/agents/BlogAgent.js +163 -0
  96. package/dist/agents/BlogAgent.js.map +1 -0
  97. package/dist/agents/ChapterAgent.d.ts +11 -0
  98. package/dist/agents/ChapterAgent.d.ts.map +1 -0
  99. package/dist/agents/ChapterAgent.js +191 -0
  100. package/dist/agents/ChapterAgent.js.map +1 -0
  101. package/dist/agents/MediumVideoAgent.d.ts +3 -0
  102. package/dist/agents/MediumVideoAgent.d.ts.map +1 -0
  103. package/dist/agents/MediumVideoAgent.js +219 -0
  104. package/dist/agents/MediumVideoAgent.js.map +1 -0
  105. package/dist/agents/ShortsAgent.d.ts +3 -0
  106. package/dist/agents/ShortsAgent.d.ts.map +1 -0
  107. package/dist/agents/ShortsAgent.js +243 -0
  108. package/dist/agents/ShortsAgent.js.map +1 -0
  109. package/dist/agents/SilenceRemovalAgent.d.ts +9 -0
  110. package/dist/agents/SilenceRemovalAgent.d.ts.map +1 -0
  111. package/dist/agents/SilenceRemovalAgent.js +208 -0
  112. package/dist/agents/SilenceRemovalAgent.js.map +1 -0
  113. package/dist/agents/SocialMediaAgent.d.ts +4 -0
  114. package/dist/agents/SocialMediaAgent.d.ts.map +1 -0
  115. package/dist/agents/SocialMediaAgent.js +248 -0
  116. package/dist/agents/SocialMediaAgent.js.map +1 -0
  117. package/dist/agents/SummaryAgent.d.ts +11 -0
  118. package/dist/agents/SummaryAgent.d.ts.map +1 -0
  119. package/dist/agents/SummaryAgent.js +333 -0
  120. package/dist/agents/SummaryAgent.js.map +1 -0
  121. package/dist/config/brand.d.ts +29 -0
  122. package/dist/config/brand.d.ts.map +1 -0
  123. package/dist/config/brand.js +83 -0
  124. package/dist/config/brand.js.map +1 -0
  125. package/dist/config/environment.d.ts +36 -0
  126. package/dist/config/environment.d.ts.map +1 -0
  127. package/dist/config/environment.js +44 -0
  128. package/dist/config/environment.js.map +1 -0
  129. package/dist/config/logger.d.ts +5 -0
  130. package/dist/config/logger.d.ts.map +1 -0
  131. package/dist/config/logger.js +13 -0
  132. package/dist/config/logger.js.map +1 -0
  133. package/dist/index.d.ts +2 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +135 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/pipeline.d.ts +57 -0
  138. package/dist/pipeline.d.ts.map +1 -0
  139. package/dist/pipeline.js +287 -0
  140. package/dist/pipeline.js.map +1 -0
  141. package/dist/services/captionGeneration.d.ts +7 -0
  142. package/dist/services/captionGeneration.d.ts.map +1 -0
  143. package/dist/services/captionGeneration.js +29 -0
  144. package/dist/services/captionGeneration.js.map +1 -0
  145. package/dist/services/fileWatcher.d.ts +19 -0
  146. package/dist/services/fileWatcher.d.ts.map +1 -0
  147. package/dist/services/fileWatcher.js +120 -0
  148. package/dist/services/fileWatcher.js.map +1 -0
  149. package/dist/services/gitOperations.d.ts +3 -0
  150. package/dist/services/gitOperations.d.ts.map +1 -0
  151. package/dist/services/gitOperations.js +43 -0
  152. package/dist/services/gitOperations.js.map +1 -0
  153. package/dist/services/socialPosting.d.ts +38 -0
  154. package/dist/services/socialPosting.d.ts.map +1 -0
  155. package/dist/services/socialPosting.js +102 -0
  156. package/dist/services/socialPosting.js.map +1 -0
  157. package/dist/services/transcription.d.ts +3 -0
  158. package/dist/services/transcription.d.ts.map +1 -0
  159. package/dist/services/transcription.js +100 -0
  160. package/dist/services/transcription.js.map +1 -0
  161. package/dist/services/videoIngestion.d.ts +3 -0
  162. package/dist/services/videoIngestion.d.ts.map +1 -0
  163. package/dist/services/videoIngestion.js +103 -0
  164. package/dist/services/videoIngestion.js.map +1 -0
  165. package/dist/tools/captions/captionGenerator.d.ts +84 -0
  166. package/dist/tools/captions/captionGenerator.d.ts.map +1 -0
  167. package/dist/tools/captions/captionGenerator.js +390 -0
  168. package/dist/tools/captions/captionGenerator.js.map +1 -0
  169. package/dist/tools/ffmpeg/aspectRatio.d.ts +101 -0
  170. package/dist/tools/ffmpeg/aspectRatio.d.ts.map +1 -0
  171. package/dist/tools/ffmpeg/aspectRatio.js +338 -0
  172. package/dist/tools/ffmpeg/aspectRatio.js.map +1 -0
  173. package/dist/tools/ffmpeg/audioExtraction.d.ts +16 -0
  174. package/dist/tools/ffmpeg/audioExtraction.d.ts.map +1 -0
  175. package/dist/tools/ffmpeg/audioExtraction.js +86 -0
  176. package/dist/tools/ffmpeg/audioExtraction.js.map +1 -0
  177. package/dist/tools/ffmpeg/captionBurning.d.ts +8 -0
  178. package/dist/tools/ffmpeg/captionBurning.d.ts.map +1 -0
  179. package/dist/tools/ffmpeg/captionBurning.js +71 -0
  180. package/dist/tools/ffmpeg/captionBurning.js.map +1 -0
  181. package/dist/tools/ffmpeg/clipExtraction.d.ts +23 -0
  182. package/dist/tools/ffmpeg/clipExtraction.d.ts.map +1 -0
  183. package/dist/tools/ffmpeg/clipExtraction.js +178 -0
  184. package/dist/tools/ffmpeg/clipExtraction.js.map +1 -0
  185. package/dist/tools/ffmpeg/faceDetection.d.ts +127 -0
  186. package/dist/tools/ffmpeg/faceDetection.d.ts.map +1 -0
  187. package/dist/tools/ffmpeg/faceDetection.js +500 -0
  188. package/dist/tools/ffmpeg/faceDetection.js.map +1 -0
  189. package/dist/tools/ffmpeg/frameCapture.d.ts +10 -0
  190. package/dist/tools/ffmpeg/frameCapture.d.ts.map +1 -0
  191. package/dist/tools/ffmpeg/frameCapture.js +48 -0
  192. package/dist/tools/ffmpeg/frameCapture.js.map +1 -0
  193. package/dist/tools/ffmpeg/silenceDetection.d.ts +10 -0
  194. package/dist/tools/ffmpeg/silenceDetection.d.ts.map +1 -0
  195. package/dist/tools/ffmpeg/silenceDetection.js +55 -0
  196. package/dist/tools/ffmpeg/silenceDetection.js.map +1 -0
  197. package/dist/tools/ffmpeg/singlePassEdit.d.ts +25 -0
  198. package/dist/tools/ffmpeg/singlePassEdit.d.ts.map +1 -0
  199. package/dist/tools/ffmpeg/singlePassEdit.js +123 -0
  200. package/dist/tools/ffmpeg/singlePassEdit.js.map +1 -0
  201. package/dist/tools/search/exaClient.d.ts +8 -0
  202. package/dist/tools/search/exaClient.d.ts.map +1 -0
  203. package/dist/tools/search/exaClient.js +38 -0
  204. package/dist/tools/search/exaClient.js.map +1 -0
  205. package/dist/tools/whisper/whisperClient.d.ts +3 -0
  206. package/dist/tools/whisper/whisperClient.d.ts.map +1 -0
  207. package/dist/tools/whisper/whisperClient.js +77 -0
  208. package/dist/tools/whisper/whisperClient.js.map +1 -0
  209. package/dist/types/index.d.ts +305 -0
  210. package/dist/types/index.d.ts.map +1 -0
  211. package/dist/types/index.js +44 -0
  212. package/dist/types/index.js.map +1 -0
  213. package/package.json +63 -0
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Type definitions for video-auto-note-taker CLI pipeline.
3
+ *
4
+ * Domain types covering transcription, video metadata, short-clip planning,
5
+ * social-media post generation, and end-to-end pipeline orchestration.
6
+ *
7
+ * ### Timestamp convention
8
+ * All `start` and `end` fields are in **seconds from the beginning of the video**
9
+ * (floating-point, e.g. 12.345). This matches Whisper's output format and
10
+ * FFmpeg's `-ss` / `-to` parameters.
11
+ */
12
+ /** Social-media platforms supported for post generation. */
13
+ export declare enum Platform {
14
+ TikTok = "tiktok",
15
+ YouTube = "youtube",
16
+ Instagram = "instagram",
17
+ LinkedIn = "linkedin",
18
+ X = "x"
19
+ }
20
+ /**
21
+ * A single word with precise start/end timestamps from Whisper.
22
+ *
23
+ * Word-level timestamps are the foundation of the karaoke caption system —
24
+ * each word knows exactly when it's spoken, enabling per-word highlighting.
25
+ * Whisper produces these via its `--word_timestamps` flag.
26
+ *
27
+ * @property word - The spoken word (may include leading/trailing whitespace)
28
+ * @property start - When this word begins, in seconds from video start
29
+ * @property end - When this word ends, in seconds from video start
30
+ */
31
+ export interface Word {
32
+ word: string;
33
+ start: number;
34
+ end: number;
35
+ }
36
+ /**
37
+ * A sentence/phrase-level segment from Whisper transcription.
38
+ *
39
+ * Segments are Whisper's natural grouping of words into sentences or clauses.
40
+ * They're used for SRT/VTT subtitle generation (one cue per segment) and for
41
+ * silence removal (segments that fall entirely within a removed region are dropped).
42
+ *
43
+ * @property id - Sequential segment index (0-based)
44
+ * @property text - Full text of the segment
45
+ * @property start - Segment start time in seconds
46
+ * @property end - Segment end time in seconds
47
+ * @property words - The individual words with their own timestamps
48
+ */
49
+ export interface Segment {
50
+ id: number;
51
+ text: string;
52
+ start: number;
53
+ end: number;
54
+ words: Word[];
55
+ }
56
+ /**
57
+ * Complete transcript result from Whisper.
58
+ *
59
+ * Contains both segment-level and word-level data. The top-level `words` array
60
+ * is a flat list of all words across all segments — this is the primary input
61
+ * for the ASS caption generator's karaoke highlighting.
62
+ *
63
+ * @property text - Full transcript as a single string
64
+ * @property segments - Sentence/phrase-level segments
65
+ * @property words - Flat array of all words with timestamps (used by ASS captions)
66
+ * @property language - Detected language code (e.g. "en")
67
+ * @property duration - Total video duration in seconds
68
+ */
69
+ export interface Transcript {
70
+ text: string;
71
+ segments: Segment[];
72
+ words: Word[];
73
+ language: string;
74
+ duration: number;
75
+ }
76
+ /**
77
+ * Metadata for a video file after ingestion into the repo structure.
78
+ *
79
+ * @property originalPath - Where the file was picked up from (e.g. recordings/ folder)
80
+ * @property repoPath - Canonical path within the repo's asset directory
81
+ * @property videoDir - Directory containing all generated assets for this video
82
+ * @property slug - URL/filesystem-safe name derived from the filename (e.g. "my-video-2024-01-15")
83
+ * @property filename - Original filename with extension
84
+ * @property duration - Video duration in seconds (from ffprobe)
85
+ * @property size - File size in bytes
86
+ * @property createdAt - File creation timestamp
87
+ */
88
+ export interface VideoFile {
89
+ originalPath: string;
90
+ repoPath: string;
91
+ videoDir: string;
92
+ slug: string;
93
+ filename: string;
94
+ duration: number;
95
+ size: number;
96
+ createdAt: Date;
97
+ }
98
+ export type AspectRatio = '16:9' | '9:16' | '1:1' | '4:5';
99
+ export type VideoPlatform = 'tiktok' | 'youtube-shorts' | 'instagram-reels' | 'instagram-feed' | 'linkedin' | 'youtube' | 'twitter';
100
+ /**
101
+ * Caption rendering style.
102
+ * - `'shorts'` — large centered pop captions for short-form clips (landscape 16:9)
103
+ * - `'medium'` — smaller bottom-positioned captions for longer content
104
+ * - `'portrait'` — Opus Clips style for 9:16 vertical video (green highlight,
105
+ * scale-pop animation, larger fonts for small-screen viewing)
106
+ */
107
+ export type CaptionStyle = 'shorts' | 'medium' | 'portrait';
108
+ export interface ShortClipVariant {
109
+ path: string;
110
+ aspectRatio: AspectRatio;
111
+ platform: VideoPlatform;
112
+ width: number;
113
+ height: number;
114
+ }
115
+ /**
116
+ * A single time range within a short clip.
117
+ *
118
+ * Short clips can be **composite** — made of multiple non-contiguous segments
119
+ * from the original video, concatenated together. Each segment describes one
120
+ * contiguous range.
121
+ *
122
+ * @property start - Start time in the original video (seconds)
123
+ * @property end - End time in the original video (seconds)
124
+ * @property description - Human-readable description of what happens in this segment
125
+ */
126
+ export interface ShortSegment {
127
+ start: number;
128
+ end: number;
129
+ description: string;
130
+ }
131
+ /**
132
+ * A planned short clip (15–60s) extracted from the full video.
133
+ *
134
+ * May be a single contiguous segment or a **composite** of multiple segments
135
+ * concatenated together (e.g. an intro + punchline from different parts of
136
+ * the video). The `segments` array defines the source time ranges; `totalDuration`
137
+ * is the sum of all segment durations.
138
+ *
139
+ * @property id - Unique identifier (e.g. "short-1")
140
+ * @property title - Human-readable title for the clip
141
+ * @property slug - Filesystem-safe slug (e.g. "typescript-tip-generics")
142
+ * @property segments - One or more time ranges from the original video
143
+ * @property totalDuration - Sum of all segment durations in seconds
144
+ * @property outputPath - Path to the extracted video file
145
+ * @property captionedPath - Path to the captioned version (if generated)
146
+ * @property description - Short description for social media
147
+ * @property tags - Hashtags / topic tags
148
+ * @property variants - Platform-specific aspect-ratio variants (portrait, square, etc.)
149
+ */
150
+ export interface ShortClip {
151
+ id: string;
152
+ title: string;
153
+ slug: string;
154
+ segments: ShortSegment[];
155
+ totalDuration: number;
156
+ outputPath: string;
157
+ captionedPath?: string;
158
+ description: string;
159
+ tags: string[];
160
+ variants?: ShortClipVariant[];
161
+ }
162
+ /** A planned medium clip segment */
163
+ export interface MediumSegment {
164
+ start: number;
165
+ end: number;
166
+ description: string;
167
+ }
168
+ export interface MediumClip {
169
+ id: string;
170
+ title: string;
171
+ slug: string;
172
+ segments: MediumSegment[];
173
+ totalDuration: number;
174
+ outputPath: string;
175
+ captionedPath?: string;
176
+ description: string;
177
+ tags: string[];
178
+ hook: string;
179
+ topic: string;
180
+ }
181
+ export interface SocialPost {
182
+ platform: Platform;
183
+ content: string;
184
+ hashtags: string[];
185
+ links: string[];
186
+ characterCount: number;
187
+ outputPath: string;
188
+ }
189
+ /**
190
+ * A chapter marker for YouTube's chapters feature.
191
+ *
192
+ * @property timestamp - Start time in seconds (YouTube shows these as clickable markers)
193
+ * @property title - Short chapter title (shown in the progress bar)
194
+ * @property description - Longer description for the README/summary
195
+ */
196
+ export interface Chapter {
197
+ timestamp: number;
198
+ title: string;
199
+ description: string;
200
+ }
201
+ export interface VideoSnapshot {
202
+ timestamp: number;
203
+ description: string;
204
+ outputPath: string;
205
+ }
206
+ export interface VideoSummary {
207
+ title: string;
208
+ overview: string;
209
+ keyTopics: string[];
210
+ snapshots: VideoSnapshot[];
211
+ markdownPath: string;
212
+ }
213
+ export declare enum PipelineStage {
214
+ Ingestion = "ingestion",
215
+ Transcription = "transcription",
216
+ SilenceRemoval = "silence-removal",
217
+ Chapters = "chapters",
218
+ Captions = "captions",
219
+ CaptionBurn = "caption-burn",
220
+ Summary = "summary",
221
+ Shorts = "shorts",
222
+ MediumClips = "medium-clips",
223
+ SocialMedia = "social-media",
224
+ ShortPosts = "short-posts",
225
+ MediumClipPosts = "medium-clip-posts",
226
+ Blog = "blog",
227
+ GitPush = "git-push"
228
+ }
229
+ /**
230
+ * Per-stage outcome record for pipeline observability.
231
+ *
232
+ * @property stage - Which pipeline stage this result is for
233
+ * @property success - Whether the stage completed without throwing
234
+ * @property error - Error message if the stage failed
235
+ * @property duration - Wall-clock time in milliseconds
236
+ */
237
+ export interface StageResult {
238
+ stage: PipelineStage;
239
+ success: boolean;
240
+ error?: string;
241
+ duration: number;
242
+ }
243
+ /**
244
+ * Complete output of a pipeline run.
245
+ *
246
+ * Fields are optional because stages can fail independently — a failed
247
+ * transcription means no summary, but the video metadata is still available.
248
+ *
249
+ * @property totalDuration - Total pipeline wall-clock time in milliseconds
250
+ */
251
+ export interface PipelineResult {
252
+ video: VideoFile;
253
+ transcript?: Transcript;
254
+ editedVideoPath?: string;
255
+ captions?: string[];
256
+ captionedVideoPath?: string;
257
+ summary?: VideoSummary;
258
+ chapters?: Chapter[];
259
+ shorts: ShortClip[];
260
+ mediumClips: MediumClip[];
261
+ socialPosts: SocialPost[];
262
+ blogPost?: string;
263
+ stageResults: StageResult[];
264
+ totalDuration: number;
265
+ }
266
+ /**
267
+ * Result of the silence removal stage.
268
+ *
269
+ * @property editedPath - Path to the video with silence regions cut out
270
+ * @property removals - Time ranges that were removed (in original video time).
271
+ * Used by {@link adjustTranscript} to shift transcript timestamps.
272
+ * @property keepSegments - Inverse of removals — the time ranges that were kept.
273
+ * Used by the single-pass caption burn to re-create the edit from the original.
274
+ * @property wasEdited - False if no silence was found and the video is unchanged
275
+ */
276
+ export interface SilenceRemovalResult {
277
+ editedPath: string;
278
+ removals: {
279
+ start: number;
280
+ end: number;
281
+ }[];
282
+ keepSegments: {
283
+ start: number;
284
+ end: number;
285
+ }[];
286
+ wasEdited: boolean;
287
+ }
288
+ /**
289
+ * Standard result wrapper for all Copilot SDK agent calls.
290
+ *
291
+ * @property success - Whether the agent completed its task
292
+ * @property data - The parsed result (type varies by agent)
293
+ * @property error - Error message if the agent failed
294
+ * @property usage - Token counts for cost tracking
295
+ */
296
+ export interface AgentResult<T = unknown> {
297
+ success: boolean;
298
+ data?: T;
299
+ error?: string;
300
+ usage?: {
301
+ promptTokens: number;
302
+ completionTokens: number;
303
+ };
304
+ }
305
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Type definitions for video-auto-note-taker CLI pipeline.
3
+ *
4
+ * Domain types covering transcription, video metadata, short-clip planning,
5
+ * social-media post generation, and end-to-end pipeline orchestration.
6
+ *
7
+ * ### Timestamp convention
8
+ * All `start` and `end` fields are in **seconds from the beginning of the video**
9
+ * (floating-point, e.g. 12.345). This matches Whisper's output format and
10
+ * FFmpeg's `-ss` / `-to` parameters.
11
+ */
12
+ // ============================================================================
13
+ // PLATFORM
14
+ // ============================================================================
15
+ /** Social-media platforms supported for post generation. */
16
+ export var Platform;
17
+ (function (Platform) {
18
+ Platform["TikTok"] = "tiktok";
19
+ Platform["YouTube"] = "youtube";
20
+ Platform["Instagram"] = "instagram";
21
+ Platform["LinkedIn"] = "linkedin";
22
+ Platform["X"] = "x";
23
+ })(Platform || (Platform = {}));
24
+ // ============================================================================
25
+ // PIPELINE
26
+ // ============================================================================
27
+ export var PipelineStage;
28
+ (function (PipelineStage) {
29
+ PipelineStage["Ingestion"] = "ingestion";
30
+ PipelineStage["Transcription"] = "transcription";
31
+ PipelineStage["SilenceRemoval"] = "silence-removal";
32
+ PipelineStage["Chapters"] = "chapters";
33
+ PipelineStage["Captions"] = "captions";
34
+ PipelineStage["CaptionBurn"] = "caption-burn";
35
+ PipelineStage["Summary"] = "summary";
36
+ PipelineStage["Shorts"] = "shorts";
37
+ PipelineStage["MediumClips"] = "medium-clips";
38
+ PipelineStage["SocialMedia"] = "social-media";
39
+ PipelineStage["ShortPosts"] = "short-posts";
40
+ PipelineStage["MediumClipPosts"] = "medium-clip-posts";
41
+ PipelineStage["Blog"] = "blog";
42
+ PipelineStage["GitPush"] = "git-push";
43
+ })(PipelineStage || (PipelineStage = {}));
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,4DAA4D;AAC5D,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,6BAAiB,CAAA;IACjB,+BAAmB,CAAA;IACnB,mCAAuB,CAAA;IACvB,iCAAqB,CAAA;IACrB,mBAAO,CAAA;AACT,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AA8PD,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,MAAM,CAAN,IAAY,aAeX;AAfD,WAAY,aAAa;IACvB,wCAAuB,CAAA;IACvB,gDAA+B,CAAA;IAC/B,mDAAkC,CAAA;IAClC,sCAAqB,CAAA;IACrB,sCAAqB,CAAA;IACrB,6CAA4B,CAAA;IAC5B,oCAAmB,CAAA;IACnB,kCAAiB,CAAA;IACjB,6CAA4B,CAAA;IAC5B,6CAA4B,CAAA;IAC5B,2CAA0B,CAAA;IAC1B,sDAAqC,CAAA;IACrC,8BAAa,CAAA;IACb,qCAAoB,CAAA;AACtB,CAAC,EAfW,aAAa,KAAb,aAAa,QAexB"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "vidpipe",
3
+ "version": "1.0.0",
4
+ "description": "AI-powered pipeline that watches for video recordings and generates transcripts, summaries, short clips, and social media posts",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "vidpipe": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "assets/",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "start": "tsx src/index.ts",
18
+ "build": "tsc && node -e \"const fs=require('fs');const f='dist/index.js';const c=fs.readFileSync(f,'utf8');if(!c.startsWith('#!')){fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c)}\"",
19
+ "dev": "tsx watch src/index.ts",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "test:coverage": "vitest run --coverage",
23
+ "test:integration": "vitest run --testPathPattern=integration",
24
+ "test:unit": "vitest run --testPathPattern='__tests__/(?!integration)'"
25
+ },
26
+ "keywords": [
27
+ "video",
28
+ "transcription",
29
+ "ai",
30
+ "notes",
31
+ "copilot"
32
+ ],
33
+ "author": "htekdev",
34
+ "license": "ISC",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/htekdev/vidpipe.git"
38
+ },
39
+ "type": "module",
40
+ "dependencies": {
41
+ "@github/copilot-sdk": "^0.1.23",
42
+ "chokidar": "^5.0.0",
43
+ "commander": "^14.0.3",
44
+ "dotenv": "^17.2.4",
45
+ "exa-js": "^2.3.0",
46
+ "fluent-ffmpeg": "^2.1.3",
47
+ "openai": "^6.18.0",
48
+ "sharp": "^0.34.5",
49
+ "slugify": "^1.6.6",
50
+ "typescript": "^5.9.3",
51
+ "uuid": "^13.0.0",
52
+ "winston": "^3.19.0"
53
+ },
54
+ "devDependencies": {
55
+ "@types/fluent-ffmpeg": "^2.1.28",
56
+ "@types/node": "^25.2.1",
57
+ "@types/sharp": "^0.31.1",
58
+ "@types/uuid": "^10.0.0",
59
+ "@vitest/coverage-v8": "^4.0.18",
60
+ "tsx": "^4.21.0",
61
+ "vitest": "^4.0.18"
62
+ }
63
+ }