@kenkaiiii/gg-editor 0.7.0 → 0.7.1

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 (446) hide show
  1. package/dist/cli.js +64 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/core/audio-mix.d.ts.map +1 -1
  4. package/dist/core/audio-mix.js +8 -1
  5. package/dist/core/audio-mix.js.map +1 -1
  6. package/dist/core/audio-mix.test.js +1 -1
  7. package/dist/core/audio-mix.test.js.map +1 -1
  8. package/dist/core/auth/api-keys.d.ts +1 -1
  9. package/dist/core/auth/api-keys.d.ts.map +1 -1
  10. package/dist/core/auth/api-keys.js +2 -1
  11. package/dist/core/auth/api-keys.js.map +1 -1
  12. package/dist/core/auth/login.d.ts.map +1 -1
  13. package/dist/core/auth/login.js.map +1 -1
  14. package/dist/core/beats.d.ts +59 -0
  15. package/dist/core/beats.d.ts.map +1 -0
  16. package/dist/core/beats.js +122 -0
  17. package/dist/core/beats.js.map +1 -0
  18. package/dist/core/beats.test.d.ts +2 -0
  19. package/dist/core/beats.test.d.ts.map +1 -0
  20. package/dist/core/beats.test.js +86 -0
  21. package/dist/core/beats.test.js.map +1 -0
  22. package/dist/core/brand-kit.d.ts +80 -0
  23. package/dist/core/brand-kit.d.ts.map +1 -0
  24. package/dist/core/brand-kit.js +96 -0
  25. package/dist/core/brand-kit.js.map +1 -0
  26. package/dist/core/brand-kit.test.d.ts +2 -0
  27. package/dist/core/brand-kit.test.d.ts.map +1 -0
  28. package/dist/core/brand-kit.test.js +76 -0
  29. package/dist/core/brand-kit.test.js.map +1 -0
  30. package/dist/core/bundled-sfx.d.ts +64 -0
  31. package/dist/core/bundled-sfx.d.ts.map +1 -0
  32. package/dist/core/bundled-sfx.js +218 -0
  33. package/dist/core/bundled-sfx.js.map +1 -0
  34. package/dist/core/bundled-sfx.test.d.ts +2 -0
  35. package/dist/core/bundled-sfx.test.d.ts.map +1 -0
  36. package/dist/core/bundled-sfx.test.js +81 -0
  37. package/dist/core/bundled-sfx.test.js.map +1 -0
  38. package/dist/core/child-abort.d.ts +57 -0
  39. package/dist/core/child-abort.d.ts.map +1 -0
  40. package/dist/core/child-abort.js +95 -0
  41. package/dist/core/child-abort.js.map +1 -0
  42. package/dist/core/child-abort.test.d.ts +2 -0
  43. package/dist/core/child-abort.test.d.ts.map +1 -0
  44. package/dist/core/child-abort.test.js +88 -0
  45. package/dist/core/child-abort.test.js.map +1 -0
  46. package/dist/core/clip-scoring.d.ts +44 -0
  47. package/dist/core/clip-scoring.d.ts.map +1 -0
  48. package/dist/core/clip-scoring.js +165 -0
  49. package/dist/core/clip-scoring.js.map +1 -0
  50. package/dist/core/clip-scoring.test.d.ts +2 -0
  51. package/dist/core/clip-scoring.test.d.ts.map +1 -0
  52. package/dist/core/clip-scoring.test.js +113 -0
  53. package/dist/core/clip-scoring.test.js.map +1 -0
  54. package/dist/core/emoji-captions.d.ts +45 -0
  55. package/dist/core/emoji-captions.d.ts.map +1 -0
  56. package/dist/core/emoji-captions.js +121 -0
  57. package/dist/core/emoji-captions.js.map +1 -0
  58. package/dist/core/face-reframe.d.ts +91 -0
  59. package/dist/core/face-reframe.d.ts.map +1 -0
  60. package/dist/core/face-reframe.js +141 -0
  61. package/dist/core/face-reframe.js.map +1 -0
  62. package/dist/core/face-reframe.test.d.ts +2 -0
  63. package/dist/core/face-reframe.test.d.ts.map +1 -0
  64. package/dist/core/face-reframe.test.js +171 -0
  65. package/dist/core/face-reframe.test.js.map +1 -0
  66. package/dist/core/filler-words.d.ts +57 -9
  67. package/dist/core/filler-words.d.ts.map +1 -1
  68. package/dist/core/filler-words.js +61 -9
  69. package/dist/core/filler-words.js.map +1 -1
  70. package/dist/core/filler-words.test.js +91 -17
  71. package/dist/core/filler-words.test.js.map +1 -1
  72. package/dist/core/hook-rewrite.d.ts +48 -0
  73. package/dist/core/hook-rewrite.d.ts.map +1 -0
  74. package/dist/core/hook-rewrite.js +151 -0
  75. package/dist/core/hook-rewrite.js.map +1 -0
  76. package/dist/core/hook-rewrite.test.d.ts +2 -0
  77. package/dist/core/hook-rewrite.test.d.ts.map +1 -0
  78. package/dist/core/hook-rewrite.test.js +58 -0
  79. package/dist/core/hook-rewrite.test.js.map +1 -0
  80. package/dist/core/hosts/lazy.d.ts.map +1 -1
  81. package/dist/core/hosts/lazy.js +2 -0
  82. package/dist/core/hosts/lazy.js.map +1 -1
  83. package/dist/core/hosts/premiere/adapter.d.ts +1 -0
  84. package/dist/core/hosts/premiere/adapter.d.ts.map +1 -1
  85. package/dist/core/hosts/premiere/adapter.js.map +1 -1
  86. package/dist/core/hosts/premiere/bridge-source.d.ts.map +1 -1
  87. package/dist/core/hosts/premiere/bridge-source.js +6 -3
  88. package/dist/core/hosts/premiere/bridge-source.js.map +1 -1
  89. package/dist/core/hosts/resolve/adapter.d.ts +1 -0
  90. package/dist/core/hosts/resolve/adapter.d.ts.map +1 -1
  91. package/dist/core/hosts/resolve/adapter.js.map +1 -1
  92. package/dist/core/hosts/resolve/bridge-source.d.ts.map +1 -1
  93. package/dist/core/hosts/resolve/bridge-source.js +31 -4
  94. package/dist/core/hosts/resolve/bridge-source.js.map +1 -1
  95. package/dist/core/hosts/resolve/bridge.d.ts +2 -19
  96. package/dist/core/hosts/resolve/bridge.d.ts.map +1 -1
  97. package/dist/core/hosts/resolve/bridge.js +70 -41
  98. package/dist/core/hosts/resolve/bridge.js.map +1 -1
  99. package/dist/core/hosts/resolve/bridge.test.js +130 -0
  100. package/dist/core/hosts/resolve/bridge.test.js.map +1 -1
  101. package/dist/core/hosts/types.d.ts +6 -0
  102. package/dist/core/hosts/types.d.ts.map +1 -1
  103. package/dist/core/hosts/types.js.map +1 -1
  104. package/dist/core/logger.d.ts +32 -0
  105. package/dist/core/logger.d.ts.map +1 -0
  106. package/dist/core/logger.js +188 -0
  107. package/dist/core/logger.js.map +1 -0
  108. package/dist/core/loop-match.d.ts +57 -0
  109. package/dist/core/loop-match.d.ts.map +1 -0
  110. package/dist/core/loop-match.js +91 -0
  111. package/dist/core/loop-match.js.map +1 -0
  112. package/dist/core/media/ffmpeg.d.ts.map +1 -1
  113. package/dist/core/media/ffmpeg.js +14 -3
  114. package/dist/core/media/ffmpeg.js.map +1 -1
  115. package/dist/core/multi-format.d.ts +67 -0
  116. package/dist/core/multi-format.d.ts.map +1 -0
  117. package/dist/core/multi-format.js +127 -0
  118. package/dist/core/multi-format.js.map +1 -0
  119. package/dist/core/multi-format.test.d.ts +2 -0
  120. package/dist/core/multi-format.test.d.ts.map +1 -0
  121. package/dist/core/multi-format.test.js +151 -0
  122. package/dist/core/multi-format.test.js.map +1 -0
  123. package/dist/core/python/beats.py +61 -0
  124. package/dist/core/python/face_reframe.py +163 -0
  125. package/dist/core/python/sidecar-path.d.ts +13 -0
  126. package/dist/core/python/sidecar-path.d.ts.map +1 -0
  127. package/dist/core/python/sidecar-path.js +24 -0
  128. package/dist/core/python/sidecar-path.js.map +1 -0
  129. package/dist/core/python.d.ts +57 -0
  130. package/dist/core/python.d.ts.map +1 -0
  131. package/dist/core/python.js +107 -0
  132. package/dist/core/python.js.map +1 -0
  133. package/dist/core/python.test.d.ts +2 -0
  134. package/dist/core/python.test.d.ts.map +1 -0
  135. package/dist/core/python.test.js +129 -0
  136. package/dist/core/python.test.js.map +1 -0
  137. package/dist/core/retention-structure.d.ts +81 -0
  138. package/dist/core/retention-structure.d.ts.map +1 -0
  139. package/dist/core/retention-structure.js +206 -0
  140. package/dist/core/retention-structure.js.map +1 -0
  141. package/dist/core/retention-structure.test.d.ts +2 -0
  142. package/dist/core/retention-structure.test.d.ts.map +1 -0
  143. package/dist/core/retention-structure.test.js +88 -0
  144. package/dist/core/retention-structure.test.js.map +1 -0
  145. package/dist/core/review.d.ts +17 -0
  146. package/dist/core/review.d.ts.map +1 -1
  147. package/dist/core/review.js +20 -24
  148. package/dist/core/review.js.map +1 -1
  149. package/dist/core/safe-paths.d.ts +11 -0
  150. package/dist/core/safe-paths.d.ts.map +1 -1
  151. package/dist/core/safe-paths.js +26 -10
  152. package/dist/core/safe-paths.js.map +1 -1
  153. package/dist/core/safe-paths.test.js +16 -0
  154. package/dist/core/safe-paths.test.js.map +1 -1
  155. package/dist/core/skills-loader.d.ts +48 -2
  156. package/dist/core/skills-loader.d.ts.map +1 -1
  157. package/dist/core/skills-loader.js +97 -19
  158. package/dist/core/skills-loader.js.map +1 -1
  159. package/dist/core/skills-loader.test.js +63 -1
  160. package/dist/core/skills-loader.test.js.map +1 -1
  161. package/dist/core/srt.d.ts +42 -7
  162. package/dist/core/srt.d.ts.map +1 -1
  163. package/dist/core/srt.js +101 -32
  164. package/dist/core/srt.js.map +1 -1
  165. package/dist/core/srt.test.js +54 -1
  166. package/dist/core/srt.test.js.map +1 -1
  167. package/dist/core/thumbnail-compose.d.ts +58 -0
  168. package/dist/core/thumbnail-compose.d.ts.map +1 -0
  169. package/dist/core/thumbnail-compose.js +101 -0
  170. package/dist/core/thumbnail-compose.js.map +1 -0
  171. package/dist/core/thumbnail-promise.d.ts +46 -0
  172. package/dist/core/thumbnail-promise.d.ts.map +1 -0
  173. package/dist/core/thumbnail-promise.js +133 -0
  174. package/dist/core/thumbnail-promise.js.map +1 -0
  175. package/dist/core/thumbnail-promise.test.d.ts +2 -0
  176. package/dist/core/thumbnail-promise.test.d.ts.map +1 -0
  177. package/dist/core/thumbnail-promise.test.js +52 -0
  178. package/dist/core/thumbnail-promise.test.js.map +1 -0
  179. package/dist/core/viral-moments.d.ts +70 -0
  180. package/dist/core/viral-moments.d.ts.map +1 -0
  181. package/dist/core/viral-moments.js +192 -0
  182. package/dist/core/viral-moments.js.map +1 -0
  183. package/dist/core/viral-moments.test.d.ts +2 -0
  184. package/dist/core/viral-moments.test.d.ts.map +1 -0
  185. package/dist/core/viral-moments.test.js +153 -0
  186. package/dist/core/viral-moments.test.js.map +1 -0
  187. package/dist/core/whisper.d.ts +16 -0
  188. package/dist/core/whisper.d.ts.map +1 -1
  189. package/dist/core/whisper.js +72 -5
  190. package/dist/core/whisper.js.map +1 -1
  191. package/dist/core/whisper.test.js +111 -1
  192. package/dist/core/whisper.test.js.map +1 -1
  193. package/dist/core/youtube-metadata.d.ts +44 -0
  194. package/dist/core/youtube-metadata.d.ts.map +1 -0
  195. package/dist/core/youtube-metadata.js +168 -0
  196. package/dist/core/youtube-metadata.js.map +1 -0
  197. package/dist/core/youtube-metadata.test.d.ts +2 -0
  198. package/dist/core/youtube-metadata.test.d.ts.map +1 -0
  199. package/dist/core/youtube-metadata.test.js +132 -0
  200. package/dist/core/youtube-metadata.test.js.map +1 -0
  201. package/dist/prompt-commands.d.ts +24 -0
  202. package/dist/prompt-commands.d.ts.map +1 -0
  203. package/dist/prompt-commands.js +243 -0
  204. package/dist/prompt-commands.js.map +1 -0
  205. package/dist/prompt-commands.test.d.ts +2 -0
  206. package/dist/prompt-commands.test.d.ts.map +1 -0
  207. package/dist/prompt-commands.test.js +46 -0
  208. package/dist/prompt-commands.test.js.map +1 -0
  209. package/dist/skills.d.ts +6 -6
  210. package/dist/skills.d.ts.map +1 -1
  211. package/dist/skills.js +1426 -445
  212. package/dist/skills.js.map +1 -1
  213. package/dist/system-prompt.d.ts.map +1 -1
  214. package/dist/system-prompt.js +108 -0
  215. package/dist/system-prompt.js.map +1 -1
  216. package/dist/tools/add-fades.d.ts.map +1 -1
  217. package/dist/tools/add-fades.js +2 -1
  218. package/dist/tools/add-fades.js.map +1 -1
  219. package/dist/tools/add-sfx-at-cuts.d.ts.map +1 -1
  220. package/dist/tools/add-sfx-at-cuts.js +36 -11
  221. package/dist/tools/add-sfx-at-cuts.js.map +1 -1
  222. package/dist/tools/add-sfx-to-timeline.d.ts +34 -0
  223. package/dist/tools/add-sfx-to-timeline.d.ts.map +1 -0
  224. package/dist/tools/add-sfx-to-timeline.js +169 -0
  225. package/dist/tools/add-sfx-to-timeline.js.map +1 -0
  226. package/dist/tools/add-sfx-to-timeline.test.d.ts +2 -0
  227. package/dist/tools/add-sfx-to-timeline.test.d.ts.map +1 -0
  228. package/dist/tools/add-sfx-to-timeline.test.js +181 -0
  229. package/dist/tools/add-sfx-to-timeline.test.js.map +1 -0
  230. package/dist/tools/audit-first-frame.d.ts +36 -0
  231. package/dist/tools/audit-first-frame.d.ts.map +1 -0
  232. package/dist/tools/audit-first-frame.js +181 -0
  233. package/dist/tools/audit-first-frame.js.map +1 -0
  234. package/dist/tools/audit-retention-structure.d.ts +20 -0
  235. package/dist/tools/audit-retention-structure.d.ts.map +1 -0
  236. package/dist/tools/audit-retention-structure.js +95 -0
  237. package/dist/tools/audit-retention-structure.js.map +1 -0
  238. package/dist/tools/audit-retention-structure.test.d.ts +2 -0
  239. package/dist/tools/audit-retention-structure.test.d.ts.map +1 -0
  240. package/dist/tools/audit-retention-structure.test.js +93 -0
  241. package/dist/tools/audit-retention-structure.test.js.map +1 -0
  242. package/dist/tools/bleep-words.d.ts +59 -0
  243. package/dist/tools/bleep-words.d.ts.map +1 -0
  244. package/dist/tools/bleep-words.js +211 -0
  245. package/dist/tools/bleep-words.js.map +1 -0
  246. package/dist/tools/bleep-words.test.d.ts +2 -0
  247. package/dist/tools/bleep-words.test.d.ts.map +1 -0
  248. package/dist/tools/bleep-words.test.js +96 -0
  249. package/dist/tools/bleep-words.test.js.map +1 -0
  250. package/dist/tools/burn-subtitles.d.ts.map +1 -1
  251. package/dist/tools/burn-subtitles.js +10 -5
  252. package/dist/tools/burn-subtitles.js.map +1 -1
  253. package/dist/tools/clean-audio.d.ts.map +1 -1
  254. package/dist/tools/clean-audio.js +2 -1
  255. package/dist/tools/clean-audio.js.map +1 -1
  256. package/dist/tools/cluster-takes.js +2 -1
  257. package/dist/tools/cluster-takes.js.map +1 -1
  258. package/dist/tools/compose-thumbnail-variants.d.ts +70 -0
  259. package/dist/tools/compose-thumbnail-variants.d.ts.map +1 -0
  260. package/dist/tools/compose-thumbnail-variants.js +274 -0
  261. package/dist/tools/compose-thumbnail-variants.js.map +1 -0
  262. package/dist/tools/compose-thumbnail.d.ts +6 -13
  263. package/dist/tools/compose-thumbnail.d.ts.map +1 -1
  264. package/dist/tools/compose-thumbnail.js +44 -81
  265. package/dist/tools/compose-thumbnail.js.map +1 -1
  266. package/dist/tools/concat-videos.d.ts.map +1 -1
  267. package/dist/tools/concat-videos.js +12 -5
  268. package/dist/tools/concat-videos.js.map +1 -1
  269. package/dist/tools/concat-videos.test.d.ts +2 -0
  270. package/dist/tools/concat-videos.test.d.ts.map +1 -0
  271. package/dist/tools/concat-videos.test.js +103 -0
  272. package/dist/tools/concat-videos.test.js.map +1 -0
  273. package/dist/tools/crossfade-videos.d.ts.map +1 -1
  274. package/dist/tools/crossfade-videos.js +2 -1
  275. package/dist/tools/crossfade-videos.js.map +1 -1
  276. package/dist/tools/cut-filler-words.d.ts.map +1 -1
  277. package/dist/tools/cut-filler-words.js +24 -8
  278. package/dist/tools/cut-filler-words.js.map +1 -1
  279. package/dist/tools/detect-speaker-changes.js +2 -1
  280. package/dist/tools/detect-speaker-changes.js.map +1 -1
  281. package/dist/tools/extract-audio.d.ts.map +1 -1
  282. package/dist/tools/extract-audio.js +13 -7
  283. package/dist/tools/extract-audio.js.map +1 -1
  284. package/dist/tools/face-reframe.d.ts +30 -0
  285. package/dist/tools/face-reframe.d.ts.map +1 -0
  286. package/dist/tools/face-reframe.js +143 -0
  287. package/dist/tools/face-reframe.js.map +1 -0
  288. package/dist/tools/face-reframe.test.d.ts +2 -0
  289. package/dist/tools/face-reframe.test.d.ts.map +1 -0
  290. package/dist/tools/face-reframe.test.js +139 -0
  291. package/dist/tools/face-reframe.test.js.map +1 -0
  292. package/dist/tools/find-viral-moments.d.ts +23 -0
  293. package/dist/tools/find-viral-moments.d.ts.map +1 -0
  294. package/dist/tools/find-viral-moments.js +176 -0
  295. package/dist/tools/find-viral-moments.js.map +1 -0
  296. package/dist/tools/find-viral-moments.test.d.ts +2 -0
  297. package/dist/tools/find-viral-moments.test.d.ts.map +1 -0
  298. package/dist/tools/find-viral-moments.test.js +144 -0
  299. package/dist/tools/find-viral-moments.test.js.map +1 -0
  300. package/dist/tools/generate-gif.d.ts.map +1 -1
  301. package/dist/tools/generate-gif.js +47 -40
  302. package/dist/tools/generate-gif.js.map +1 -1
  303. package/dist/tools/generate-gif.test.d.ts +2 -0
  304. package/dist/tools/generate-gif.test.d.ts.map +1 -0
  305. package/dist/tools/generate-gif.test.js +115 -0
  306. package/dist/tools/generate-gif.test.js.map +1 -0
  307. package/dist/tools/generate-outro.d.ts +18 -0
  308. package/dist/tools/generate-outro.d.ts.map +1 -0
  309. package/dist/tools/generate-outro.js +175 -0
  310. package/dist/tools/generate-outro.js.map +1 -0
  311. package/dist/tools/generate-youtube-metadata.d.ts +23 -0
  312. package/dist/tools/generate-youtube-metadata.d.ts.map +1 -0
  313. package/dist/tools/generate-youtube-metadata.js +103 -0
  314. package/dist/tools/generate-youtube-metadata.js.map +1 -0
  315. package/dist/tools/generate-youtube-metadata.test.d.ts +2 -0
  316. package/dist/tools/generate-youtube-metadata.test.d.ts.map +1 -0
  317. package/dist/tools/generate-youtube-metadata.test.js +118 -0
  318. package/dist/tools/generate-youtube-metadata.test.js.map +1 -0
  319. package/dist/tools/index.d.ts +14 -0
  320. package/dist/tools/index.d.ts.map +1 -1
  321. package/dist/tools/index.js +130 -1
  322. package/dist/tools/index.js.map +1 -1
  323. package/dist/tools/index.test.js +27 -1
  324. package/dist/tools/index.test.js.map +1 -1
  325. package/dist/tools/ken-burns.d.ts.map +1 -1
  326. package/dist/tools/ken-burns.js +2 -1
  327. package/dist/tools/ken-burns.js.map +1 -1
  328. package/dist/tools/loop-match-short.d.ts +22 -0
  329. package/dist/tools/loop-match-short.d.ts.map +1 -0
  330. package/dist/tools/loop-match-short.js +107 -0
  331. package/dist/tools/loop-match-short.js.map +1 -0
  332. package/dist/tools/mix-audio.d.ts.map +1 -1
  333. package/dist/tools/mix-audio.js +2 -1
  334. package/dist/tools/mix-audio.js.map +1 -1
  335. package/dist/tools/normalize-loudness.d.ts.map +1 -1
  336. package/dist/tools/normalize-loudness.js +2 -1
  337. package/dist/tools/normalize-loudness.js.map +1 -1
  338. package/dist/tools/path-traversal.test.d.ts +15 -0
  339. package/dist/tools/path-traversal.test.d.ts.map +1 -0
  340. package/dist/tools/path-traversal.test.js +223 -0
  341. package/dist/tools/path-traversal.test.js.map +1 -0
  342. package/dist/tools/pick-best-takes.js +2 -1
  343. package/dist/tools/pick-best-takes.js.map +1 -1
  344. package/dist/tools/punch-in.d.ts.map +1 -1
  345. package/dist/tools/punch-in.js +2 -1
  346. package/dist/tools/punch-in.js.map +1 -1
  347. package/dist/tools/read-transcript.js +2 -1
  348. package/dist/tools/read-transcript.js.map +1 -1
  349. package/dist/tools/render-multi-format.d.ts +35 -0
  350. package/dist/tools/render-multi-format.d.ts.map +1 -0
  351. package/dist/tools/render-multi-format.js +206 -0
  352. package/dist/tools/render-multi-format.js.map +1 -0
  353. package/dist/tools/render-multi-format.test.d.ts +2 -0
  354. package/dist/tools/render-multi-format.test.d.ts.map +1 -0
  355. package/dist/tools/render-multi-format.test.js +312 -0
  356. package/dist/tools/render-multi-format.test.js.map +1 -0
  357. package/dist/tools/render.d.ts.map +1 -1
  358. package/dist/tools/render.js +2 -2
  359. package/dist/tools/render.js.map +1 -1
  360. package/dist/tools/rewrite-hook.d.ts +32 -0
  361. package/dist/tools/rewrite-hook.d.ts.map +1 -0
  362. package/dist/tools/rewrite-hook.js +65 -0
  363. package/dist/tools/rewrite-hook.js.map +1 -0
  364. package/dist/tools/score-clip.d.ts +30 -0
  365. package/dist/tools/score-clip.d.ts.map +1 -0
  366. package/dist/tools/score-clip.js +109 -0
  367. package/dist/tools/score-clip.js.map +1 -0
  368. package/dist/tools/score-clip.test.d.ts +2 -0
  369. package/dist/tools/score-clip.test.d.ts.map +1 -0
  370. package/dist/tools/score-clip.test.js +110 -0
  371. package/dist/tools/score-clip.test.js.map +1 -0
  372. package/dist/tools/search-tools.d.ts +34 -0
  373. package/dist/tools/search-tools.d.ts.map +1 -0
  374. package/dist/tools/search-tools.js +86 -0
  375. package/dist/tools/search-tools.js.map +1 -0
  376. package/dist/tools/search-tools.test.d.ts +2 -0
  377. package/dist/tools/search-tools.test.d.ts.map +1 -0
  378. package/dist/tools/search-tools.test.js +60 -0
  379. package/dist/tools/search-tools.test.js.map +1 -0
  380. package/dist/tools/snap-cuts-to-beats.d.ts +18 -0
  381. package/dist/tools/snap-cuts-to-beats.d.ts.map +1 -0
  382. package/dist/tools/snap-cuts-to-beats.js +110 -0
  383. package/dist/tools/snap-cuts-to-beats.js.map +1 -0
  384. package/dist/tools/snap-cuts-to-beats.test.d.ts +2 -0
  385. package/dist/tools/snap-cuts-to-beats.test.d.ts.map +1 -0
  386. package/dist/tools/snap-cuts-to-beats.test.js +99 -0
  387. package/dist/tools/snap-cuts-to-beats.test.js.map +1 -0
  388. package/dist/tools/speed-ramp.d.ts.map +1 -1
  389. package/dist/tools/speed-ramp.js +2 -1
  390. package/dist/tools/speed-ramp.js.map +1 -1
  391. package/dist/tools/stabilize-video.d.ts.map +1 -1
  392. package/dist/tools/stabilize-video.js +2 -1
  393. package/dist/tools/stabilize-video.js.map +1 -1
  394. package/dist/tools/suggest-broll.d.ts +34 -0
  395. package/dist/tools/suggest-broll.d.ts.map +1 -0
  396. package/dist/tools/suggest-broll.js +367 -0
  397. package/dist/tools/suggest-broll.js.map +1 -0
  398. package/dist/tools/suggest-broll.test.d.ts +2 -0
  399. package/dist/tools/suggest-broll.test.d.ts.map +1 -0
  400. package/dist/tools/suggest-broll.test.js +217 -0
  401. package/dist/tools/suggest-broll.test.js.map +1 -0
  402. package/dist/tools/text-based-cut.d.ts +33 -0
  403. package/dist/tools/text-based-cut.d.ts.map +1 -0
  404. package/dist/tools/text-based-cut.js +172 -0
  405. package/dist/tools/text-based-cut.js.map +1 -0
  406. package/dist/tools/text-based-cut.test.d.ts +2 -0
  407. package/dist/tools/text-based-cut.test.d.ts.map +1 -0
  408. package/dist/tools/text-based-cut.test.js +32 -0
  409. package/dist/tools/text-based-cut.test.js.map +1 -0
  410. package/dist/tools/transcribe.d.ts +1 -1
  411. package/dist/tools/transition-videos.d.ts +1 -1
  412. package/dist/tools/transition-videos.d.ts.map +1 -1
  413. package/dist/tools/transition-videos.js +2 -1
  414. package/dist/tools/transition-videos.js.map +1 -1
  415. package/dist/tools/trim-dead-air.d.ts +59 -0
  416. package/dist/tools/trim-dead-air.d.ts.map +1 -0
  417. package/dist/tools/trim-dead-air.js +215 -0
  418. package/dist/tools/trim-dead-air.js.map +1 -0
  419. package/dist/tools/trim-dead-air.test.d.ts +2 -0
  420. package/dist/tools/trim-dead-air.test.d.ts.map +1 -0
  421. package/dist/tools/trim-dead-air.test.js +75 -0
  422. package/dist/tools/trim-dead-air.test.js.map +1 -0
  423. package/dist/tools/verify-thumbnail-promise.d.ts +33 -0
  424. package/dist/tools/verify-thumbnail-promise.d.ts.map +1 -0
  425. package/dist/tools/verify-thumbnail-promise.js +112 -0
  426. package/dist/tools/verify-thumbnail-promise.js.map +1 -0
  427. package/dist/tools/verify-thumbnail-promise.test.d.ts +2 -0
  428. package/dist/tools/verify-thumbnail-promise.test.d.ts.map +1 -0
  429. package/dist/tools/verify-thumbnail-promise.test.js +38 -0
  430. package/dist/tools/verify-thumbnail-promise.test.js.map +1 -0
  431. package/dist/tools/write-keyword-captions.d.ts +7 -0
  432. package/dist/tools/write-keyword-captions.d.ts.map +1 -1
  433. package/dist/tools/write-keyword-captions.js +35 -4
  434. package/dist/tools/write-keyword-captions.js.map +1 -1
  435. package/dist/ui/App.d.ts.map +1 -1
  436. package/dist/ui/App.js +75 -11
  437. package/dist/ui/App.js.map +1 -1
  438. package/dist/ui/tool-formatters.d.ts +30 -0
  439. package/dist/ui/tool-formatters.d.ts.map +1 -0
  440. package/dist/ui/tool-formatters.js +461 -0
  441. package/dist/ui/tool-formatters.js.map +1 -0
  442. package/dist/ui/tool-formatters.test.d.ts +2 -0
  443. package/dist/ui/tool-formatters.test.d.ts.map +1 -0
  444. package/dist/ui/tool-formatters.test.js +143 -0
  445. package/dist/ui/tool-formatters.test.js.map +1 -0
  446. package/package.json +10 -9
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ import type { AgentTool } from "@kenkaiiii/gg-agent";
3
+ /**
4
+ * text_based_cut — Descript's flagship feature, generalised. Given an
5
+ * arbitrary list of (startSec, endSec) cut ranges, emit an EDL of KEEP
6
+ * ranges using the same frame-aligned, padding-aware math as
7
+ * cut_filler_words. The agent typically populates `cuts` after one of:
8
+ *
9
+ * - The user marked sentences in the transcript they want removed.
10
+ * - An LLM diffed an "edited" transcript against the original and
11
+ * produced a delete-list.
12
+ * - A previous tool (e.g. cluster_takes) flagged ranges to drop.
13
+ *
14
+ * Distinct from cut_filler_words because the cut list is opinion-free
15
+ * here — the caller decides what to remove. Distinct from write_edl
16
+ * because this tool computes the *inverse* (keep ranges) for you.
17
+ */
18
+ declare const TextBasedCutParams: z.ZodObject<{
19
+ sourceVideo: z.ZodString;
20
+ cuts: z.ZodArray<z.ZodObject<{
21
+ startSec: z.ZodNumber;
22
+ endSec: z.ZodNumber;
23
+ reason: z.ZodOptional<z.ZodString>;
24
+ }, z.core.$strip>>;
25
+ edlOutput: z.ZodOptional<z.ZodString>;
26
+ reel: z.ZodOptional<z.ZodString>;
27
+ frameRate: z.ZodOptional<z.ZodNumber>;
28
+ paddingMs: z.ZodOptional<z.ZodNumber>;
29
+ dryRun: z.ZodOptional<z.ZodBoolean>;
30
+ }, z.core.$strip>;
31
+ export declare function createTextBasedCutTool(cwd: string): AgentTool<typeof TextBasedCutParams>;
32
+ export {};
33
+ //# sourceMappingURL=text-based-cut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-based-cut.d.ts","sourceRoot":"","sources":["../../src/tools/text-based-cut.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAWrD;;;;;;;;;;;;;;GAcG;AAEH,QAAA,MAAM,kBAAkB;;;;;;;;;;;;iBAwCtB,CAAC;AAEH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,kBAAkB,CAAC,CAyHxF"}
@@ -0,0 +1,172 @@
1
+ import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { basename, dirname, extname, join, resolve as resolvePath } from "node:path";
4
+ import { z } from "zod";
5
+ import { buildEdl } from "../core/edl.js";
6
+ import { keepRangesFromFillers, keepRangesToFrameRanges, } from "../core/filler-words.js";
7
+ import { compact, err } from "../core/format.js";
8
+ import { probeMedia } from "../core/media/ffmpeg.js";
9
+ import { safeOutputPath } from "../core/safe-paths.js";
10
+ /**
11
+ * text_based_cut — Descript's flagship feature, generalised. Given an
12
+ * arbitrary list of (startSec, endSec) cut ranges, emit an EDL of KEEP
13
+ * ranges using the same frame-aligned, padding-aware math as
14
+ * cut_filler_words. The agent typically populates `cuts` after one of:
15
+ *
16
+ * - The user marked sentences in the transcript they want removed.
17
+ * - An LLM diffed an "edited" transcript against the original and
18
+ * produced a delete-list.
19
+ * - A previous tool (e.g. cluster_takes) flagged ranges to drop.
20
+ *
21
+ * Distinct from cut_filler_words because the cut list is opinion-free
22
+ * here — the caller decides what to remove. Distinct from write_edl
23
+ * because this tool computes the *inverse* (keep ranges) for you.
24
+ */
25
+ const TextBasedCutParams = z.object({
26
+ sourceVideo: z.string().describe("The source media. Frame rate auto-detected via probe."),
27
+ cuts: z
28
+ .array(z.object({
29
+ startSec: z.number().min(0),
30
+ endSec: z.number().min(0),
31
+ reason: z.string().optional().describe("Optional human-readable reason for this cut."),
32
+ }))
33
+ .min(1)
34
+ .describe("Ranges to REMOVE. The tool emits the inverse (keep ranges) as an EDL. For multi-segment " +
35
+ "removals, pass them all in one call; ranges may overlap (they're merged)."),
36
+ edlOutput: z.string().optional().describe("Where to write the EDL. Default: a tempfile."),
37
+ reel: z
38
+ .string()
39
+ .optional()
40
+ .describe("EDL reel name. Default = source basename without extension (truncated to 8 chars)."),
41
+ frameRate: z
42
+ .number()
43
+ .positive()
44
+ .optional()
45
+ .describe("Override frame rate. Auto-detected from probe if omitted; 30 if probe fails."),
46
+ paddingMs: z
47
+ .number()
48
+ .min(0)
49
+ .optional()
50
+ .describe("Optional padding extending each KEEP range outward, so cuts don't clip word edges. " +
51
+ "Default 20ms."),
52
+ dryRun: z
53
+ .boolean()
54
+ .optional()
55
+ .describe("If true (default), return the EDL path + stats without importing. The agent should " +
56
+ "preview the diff before calling import_edl."),
57
+ });
58
+ export function createTextBasedCutTool(cwd) {
59
+ return {
60
+ name: "text_based_cut",
61
+ description: "Cut arbitrary ranges from a source via EDL. Pass `cuts: [{startSec, endSec}]` and the " +
62
+ "tool emits the INVERSE (keep ranges) as an EDL ready for import_edl. The general-purpose " +
63
+ "version of cut_filler_words — same frame-aligned math, but the caller picks what to drop. " +
64
+ "Use this for transcript-driven 'delete this paragraph' edits (Descript-style text-based " +
65
+ "editing) and for any LLM-derived removal list.",
66
+ parameters: TextBasedCutParams,
67
+ async execute(args) {
68
+ try {
69
+ const sourceAbs = resolvePath(cwd, args.sourceVideo);
70
+ const probe = probeMedia(sourceAbs);
71
+ const totalSec = probe?.durationSec;
72
+ if (!totalSec || totalSec <= 0) {
73
+ return err(`probe failed for ${sourceAbs}`, "verify the source file exists and is readable");
74
+ }
75
+ const fps = args.frameRate ?? probe?.frameRate ?? 30;
76
+ const padSec = (args.paddingMs ?? 20) / 1000;
77
+ // Validate / clamp cut ranges, then translate them into the
78
+ // FillerRange shape that keepRangesFromFillers expects (it only
79
+ // reads startSec / endSec — the word-index fields are unused).
80
+ const validatedCuts = [];
81
+ for (const c of args.cuts) {
82
+ if (c.endSec <= c.startSec) {
83
+ return err(`invalid cut: endSec (${c.endSec}) must be > startSec (${c.startSec})`, "fix the cut list");
84
+ }
85
+ if (c.startSec >= totalSec)
86
+ continue; // out of range — silently skip
87
+ validatedCuts.push({
88
+ startSec: Math.max(0, c.startSec),
89
+ endSec: Math.min(totalSec, c.endSec),
90
+ reason: c.reason,
91
+ });
92
+ }
93
+ if (validatedCuts.length === 0) {
94
+ return err("no valid cuts in range", "verify cut times are within the source duration");
95
+ }
96
+ // Sort + merge overlapping cuts so the keep computation is clean.
97
+ validatedCuts.sort((a, b) => a.startSec - b.startSec);
98
+ const merged = [];
99
+ for (const c of validatedCuts) {
100
+ const prev = merged[merged.length - 1];
101
+ if (prev && c.startSec <= prev.endSec) {
102
+ prev.endSec = Math.max(prev.endSec, c.endSec);
103
+ if (c.reason && prev.reason && !prev.reason.includes(c.reason)) {
104
+ prev.reason = `${prev.reason}; ${c.reason}`;
105
+ }
106
+ }
107
+ else {
108
+ merged.push({ ...c });
109
+ }
110
+ }
111
+ const fillers = merged.map((c) => ({
112
+ startSec: c.startSec,
113
+ endSec: c.endSec,
114
+ text: c.reason ?? "cut",
115
+ startWordIndex: 0,
116
+ endWordIndex: 0,
117
+ }));
118
+ // Negative padSec collapses keep ranges; a positive value extends
119
+ // them. keepRangesFromFillers does inward padding by virtue of the
120
+ // way it carves keeps; we widen by relaxing both endpoints.
121
+ const keeps = keepRangesFromFillers(fillers, totalSec, 0).map((k) => ({
122
+ startSec: Math.max(0, k.startSec - padSec),
123
+ endSec: Math.min(totalSec, k.endSec + padSec),
124
+ }));
125
+ const frameKeeps = keepRangesToFrameRanges(keeps, fps);
126
+ if (frameKeeps.length === 0) {
127
+ return err("no keep ranges produced — the cut list covers the entire source");
128
+ }
129
+ const reelName = args.reel ??
130
+ basename(sourceAbs, extname(sourceAbs))
131
+ .replace(/[^A-Za-z0-9_]/g, "_")
132
+ .slice(0, 8);
133
+ const edl = buildEdl({
134
+ title: `${basename(sourceAbs)} (text-based cut)`,
135
+ frameRate: fps,
136
+ events: frameKeeps.map((k) => ({
137
+ reel: reelName,
138
+ track: "B",
139
+ sourceInFrame: k.startFrame,
140
+ sourceOutFrame: k.endFrame,
141
+ clipName: basename(sourceAbs),
142
+ })),
143
+ });
144
+ const outAbs = args.edlOutput
145
+ ? safeOutputPath(cwd, args.edlOutput)
146
+ : join(mkdtempSync(join(tmpdir(), "gg-textcut-")), "cuts.edl");
147
+ if (args.edlOutput)
148
+ mkdirSync(dirname(outAbs), { recursive: true });
149
+ writeFileSync(outAbs, edl, "utf8");
150
+ const removedSec = +merged.reduce((s, c) => s + (c.endSec - c.startSec), 0).toFixed(3);
151
+ return compact({
152
+ path: outAbs,
153
+ dryRun: args.dryRun ?? true,
154
+ fps,
155
+ totalSec,
156
+ cuts: merged.length,
157
+ keeps: keeps.length,
158
+ removedSec,
159
+ sample: merged.slice(0, 10).map((c) => ({
160
+ startSec: +c.startSec.toFixed(2),
161
+ endSec: +c.endSec.toFixed(2),
162
+ reason: c.reason,
163
+ })),
164
+ });
165
+ }
166
+ catch (e) {
167
+ return err(e.message);
168
+ }
169
+ },
170
+ };
171
+ }
172
+ //# sourceMappingURL=text-based-cut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-based-cut.js","sourceRoot":"","sources":["../../src/tools/text-based-cut.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=text-based-cut.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-based-cut.test.d.ts","sourceRoot":"","sources":["../../src/tools/text-based-cut.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { describe, expect, it } from "vitest";
2
+ // We test the keep-range computation indirectly via the keepRangesFromFillers
3
+ // helper that text_based_cut wraps. The tool's own validation/merge logic is
4
+ // covered here by exercising the public interface.
5
+ import { keepRangesFromFillers, keepRangesToFrameRanges } from "../core/filler-words.js";
6
+ describe("text_based_cut keep-range math (via keepRangesFromFillers)", () => {
7
+ it("emits two keeps when one cut is in the middle", () => {
8
+ const cuts = [{ startSec: 5, endSec: 10, text: "x", startWordIndex: 0, endWordIndex: 0 }];
9
+ const keeps = keepRangesFromFillers(cuts, 30, 0);
10
+ expect(keeps).toEqual([
11
+ { startSec: 0, endSec: 5 },
12
+ { startSec: 10, endSec: 30 },
13
+ ]);
14
+ });
15
+ it("emits one keep when cuts are at the start", () => {
16
+ const cuts = [{ startSec: 0, endSec: 5, text: "head", startWordIndex: 0, endWordIndex: 0 }];
17
+ const keeps = keepRangesFromFillers(cuts, 30, 0);
18
+ expect(keeps).toEqual([{ startSec: 5, endSec: 30 }]);
19
+ });
20
+ it("frame-aligns with OUTWARD rounding to preserve speech in partial frames", () => {
21
+ const keeps = [{ startSec: 1.05, endSec: 2.95 }];
22
+ // 30 fps: floor(31.5)=31, ceil(88.5)=89 — expands keep by one frame on
23
+ // each end. Was inward (32, 88), which lost ~33 ms per junction.
24
+ expect(keepRangesToFrameRanges(keeps, 30)).toEqual([{ startFrame: 31, endFrame: 89 }]);
25
+ });
26
+ it("returns empty when cuts cover the entire source", () => {
27
+ const cuts = [{ startSec: 0, endSec: 30, text: "all", startWordIndex: 0, endWordIndex: 0 }];
28
+ const keeps = keepRangesFromFillers(cuts, 30, 0);
29
+ expect(keeps).toEqual([]);
30
+ });
31
+ });
32
+ //# sourceMappingURL=text-based-cut.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-based-cut.test.js","sourceRoot":"","sources":["../../src/tools/text-based-cut.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,8EAA8E;AAC9E,6EAA6E;AAC7E,mDAAmD;AACnD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEzF,QAAQ,CAAC,4DAA4D,EAAE,GAAG,EAAE;IAC1E,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACpB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;YAC1B,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,uEAAuE;QACvE,iEAAiE;QACjE,MAAM,CAAC,uBAAuB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -5,8 +5,8 @@ declare const TranscribeParams: z.ZodObject<{
5
5
  output: z.ZodString;
6
6
  backend: z.ZodOptional<z.ZodEnum<{
7
7
  whisperx: "whisperx";
8
- local: "local";
9
8
  api: "api";
9
+ local: "local";
10
10
  auto: "auto";
11
11
  }>>;
12
12
  modelPath: z.ZodOptional<z.ZodString>;
@@ -5,10 +5,10 @@ declare const TransitionVideosParams: z.ZodObject<{
5
5
  inputB: z.ZodString;
6
6
  output: z.ZodString;
7
7
  preset: z.ZodEnum<{
8
+ crossfade: "crossfade";
8
9
  dissolve: "dissolve";
9
10
  pixelize: "pixelize";
10
11
  radial: "radial";
11
- crossfade: "crossfade";
12
12
  "dip-to-black": "dip-to-black";
13
13
  "dip-to-white": "dip-to-white";
14
14
  "smash-cut": "smash-cut";
@@ -1 +1 @@
1
- {"version":3,"file":"transition-videos.d.ts","sourceRoot":"","sources":["../../src/tools/transition-videos.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AA4DrD,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;iBAiB1B,CAAC;AAEH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,sBAAsB,CAAC,CA6DhG"}
1
+ {"version":3,"file":"transition-videos.d.ts","sourceRoot":"","sources":["../../src/tools/transition-videos.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AA6DrD,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;iBAiB1B,CAAC;AAEH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,sBAAsB,CAAC,CA6DhG"}
@@ -3,6 +3,7 @@ import { dirname, resolve as resolvePath } from "node:path";
3
3
  import { z } from "zod";
4
4
  import { compact, err } from "../core/format.js";
5
5
  import { checkFfmpeg, probeMedia, runFfmpeg } from "../core/media/ffmpeg.js";
6
+ import { safeOutputPath } from "../core/safe-paths.js";
6
7
  /**
7
8
  * Transition presets that wrap ffmpeg's `xfade` filter with content-creator
8
9
  * friendly names + sensible default durations. Two new presets vs the
@@ -78,7 +79,7 @@ export function createTransitionVideosTool(cwd) {
78
79
  try {
79
80
  const aAbs = resolvePath(cwd, inputA);
80
81
  const bAbs = resolvePath(cwd, inputB);
81
- const outAbs = resolvePath(cwd, output);
82
+ const outAbs = safeOutputPath(cwd, output);
82
83
  if (aAbs === outAbs || bAbs === outAbs) {
83
84
  return err("output collides with an input");
84
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transition-videos.js","sourceRoot":"","sources":["../../src/tools/transition-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE7E;;;;;;;;;GASG;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC;IAC1B,WAAW;IACX,cAAc;IACd,cAAc;IACd,WAAW;IACX,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,WAAW;IACX,YAAY;IACZ,aAAa;IACb,cAAc;IACd,SAAS;IACT,UAAU;IACV,UAAU;IACV,QAAQ;CACT,CAAC,CAAC;AAOH,MAAM,OAAO,GAAqD;IAChE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE;IACrD,cAAc,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAC/D,cAAc,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAC/D,0EAA0E;IAC1E,wCAAwC;IACxC,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE;IACxD,WAAW,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE;IAC5D,YAAY,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE;IAC9D,YAAY,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAC7D,aAAa,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAC/D,WAAW,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAC3D,YAAY,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAC7D,aAAa,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAC/D,cAAc,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,EAAE;IACjE,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,EAAE;IACvD,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,EAAE;IACxD,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,EAAE;IACxD,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,EAAE;CACrD,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,YAAY,CAAC,QAAQ,CAC3B,qEAAqE;QACnE,qEAAqE;QACrE,yDAAyD,CAC5D;IACD,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CACP,wEAAwE;QACtE,yBAAyB,CAC5B;CACJ,CAAC,CAAC;AAEH,MAAM,UAAU,0BAA0B,CAAC,GAAW;IACpD,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,kFAAkF;YAClF,8EAA8E;YAC9E,iFAAiF;QACnF,UAAU,EAAE,sBAAsB;QAClC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG;YAChE,IAAI,CAAC,WAAW,EAAE;gBAAE,OAAO,GAAG,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;YACvE,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACtC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACxC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;oBACvC,OAAO,GAAG,CAAC,+BAA+B,CAAC,CAAC;gBAC9C,CAAC;gBACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM;oBAAE,OAAO,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;gBACpD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM,GAAG,GAAG,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC;gBACnD,IAAI,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC9B,OAAO,GAAG,CACR,gBAAgB,GAAG,4BAA4B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAC/E,2CAA2C,CAC5C,CAAC;gBACJ,CAAC;gBACD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACtD,MAAM,MAAM,GACV,8BAA8B,IAAI,CAAC,KAAK,aAAa,GAAG,WAAW,MAAM,MAAM;oBAC/E,0BAA0B,GAAG,KAAK,CAAC;gBACrC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChD,MAAM,IAAI,GAAG;oBACX,IAAI;oBACJ,IAAI;oBACJ,IAAI;oBACJ,IAAI;oBACJ,iBAAiB;oBACjB,MAAM;oBACN,MAAM;oBACN,KAAK;oBACL,MAAM;oBACN,KAAK;oBACL,MAAM;oBACN,SAAS;oBACT,MAAM;oBACN,IAAI;oBACJ,MAAM;oBACN,KAAK;oBACL,MAAM;oBACN,MAAM;oBACN,MAAM;iBACP,CAAC;gBACF,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBACxD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;oBAAE,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"transition-videos.js","sourceRoot":"","sources":["../../src/tools/transition-videos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ import type { AgentTool } from "@kenkaiiii/gg-agent";
3
+ /**
4
+ * trim_dead_air — single-call wrapper that detects head/tail (or all) silence
5
+ * via `silencedetect` and produces a trimmed mp4. The agent normally chains
6
+ * `detect_silence` + `write_edl` + `import_edl` for full silence cleanup;
7
+ * this tool collapses the most-common case (chop the dead air at the start
8
+ * and end of a recording) into one call.
9
+ *
10
+ * Modes:
11
+ * - "head-tail" (default): trim only leading and trailing silence
12
+ * - "all": cut every silence run >= minSilenceSec, re-encode the keeps
13
+ * concatenated. Same end-state as the EDL pipeline but produces a flat
14
+ * file the user can drop into any NLE.
15
+ */
16
+ declare const TrimDeadAirParams: z.ZodObject<{
17
+ input: z.ZodString;
18
+ output: z.ZodString;
19
+ mode: z.ZodOptional<z.ZodEnum<{
20
+ all: "all";
21
+ "head-tail": "head-tail";
22
+ }>>;
23
+ minSilenceSec: z.ZodOptional<z.ZodNumber>;
24
+ thresholdDb: z.ZodOptional<z.ZodNumber>;
25
+ paddingSec: z.ZodOptional<z.ZodNumber>;
26
+ videoCodec: z.ZodOptional<z.ZodString>;
27
+ crf: z.ZodOptional<z.ZodNumber>;
28
+ audioBitrate: z.ZodOptional<z.ZodString>;
29
+ }, z.core.$strip>;
30
+ export declare function createTrimDeadAirTool(cwd: string): AgentTool<typeof TrimDeadAirParams>;
31
+ /**
32
+ * Compute keep ranges from detected silences.
33
+ *
34
+ * mode='head-tail': only the leading silence (if any starts at ~0) and the
35
+ * trailing silence (if any ends at totalSec) are removed; everything in
36
+ * between is one big keep range.
37
+ * mode='all': inverse of all detected silences — every gap between silences
38
+ * becomes a keep range.
39
+ *
40
+ * Padding extends each keep outward; clamped to [0, totalSec] and to its
41
+ * neighbours so adjacent keeps never overlap.
42
+ */
43
+ export declare function computeKeeps(silences: Array<{
44
+ startSec: number;
45
+ endSec: number;
46
+ }>, totalSec: number, mode: "head-tail" | "all", paddingSec: number): Array<{
47
+ startSec: number;
48
+ endSec: number;
49
+ }>;
50
+ /**
51
+ * Build an ffmpeg filter_complex that trims to N keep ranges and concats
52
+ * them into a single video+audio output labelled [v][a].
53
+ */
54
+ export declare function buildTrimConcatFilter(keeps: Array<{
55
+ startSec: number;
56
+ endSec: number;
57
+ }>): string;
58
+ export {};
59
+ //# sourceMappingURL=trim-dead-air.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim-dead-air.d.ts","sourceRoot":"","sources":["../../src/tools/trim-dead-air.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAMrD;;;;;;;;;;;;GAYG;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;iBAiCrB,CAAC;AAEH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,iBAAiB,CAAC,CAgGtF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EACrD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,GAAG,KAAK,EACzB,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA2C7C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAqBhG"}
@@ -0,0 +1,215 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { dirname, resolve as resolvePath } from "node:path";
3
+ import { z } from "zod";
4
+ import { compact, err } from "../core/format.js";
5
+ import { checkFfmpeg, probeMedia, runFfmpeg } from "../core/media/ffmpeg.js";
6
+ import { safeOutputPath } from "../core/safe-paths.js";
7
+ import { parseSilenceDetect } from "../core/silence.js";
8
+ /**
9
+ * trim_dead_air — single-call wrapper that detects head/tail (or all) silence
10
+ * via `silencedetect` and produces a trimmed mp4. The agent normally chains
11
+ * `detect_silence` + `write_edl` + `import_edl` for full silence cleanup;
12
+ * this tool collapses the most-common case (chop the dead air at the start
13
+ * and end of a recording) into one call.
14
+ *
15
+ * Modes:
16
+ * - "head-tail" (default): trim only leading and trailing silence
17
+ * - "all": cut every silence run >= minSilenceSec, re-encode the keeps
18
+ * concatenated. Same end-state as the EDL pipeline but produces a flat
19
+ * file the user can drop into any NLE.
20
+ */
21
+ const TrimDeadAirParams = z.object({
22
+ input: z.string().describe("Source audio/video file (relative resolves to cwd)."),
23
+ output: z.string().describe("Output file path. Re-encoded; sets sensible H.264/AAC defaults."),
24
+ mode: z
25
+ .enum(["head-tail", "all"])
26
+ .optional()
27
+ .describe("head-tail (default) trims only leading and trailing silence — the universal 'before " +
28
+ "I started talking' / 'after I finished' cleanup. all removes every silence run >= " +
29
+ "minSilenceSec via concat-keep ranges (same end-state as detect_silence → write_edl → " +
30
+ "import_edl, but produces a flat file)."),
31
+ minSilenceSec: z
32
+ .number()
33
+ .min(0.1)
34
+ .optional()
35
+ .describe("Min silence duration to count. Default 0.5s."),
36
+ thresholdDb: z
37
+ .number()
38
+ .max(0)
39
+ .optional()
40
+ .describe("Silence threshold in dB. Default -30. Lower (e.g. -40) = stricter, only true silence " +
41
+ "counts; higher (-20) catches mumble."),
42
+ paddingSec: z
43
+ .number()
44
+ .min(0)
45
+ .optional()
46
+ .describe("Pad each kept segment outward by this much. Default 0.05 (50ms)."),
47
+ videoCodec: z.string().optional().describe("ffmpeg video codec. Default libx264."),
48
+ crf: z.number().int().min(0).max(51).optional().describe("x264 CRF. Default 20."),
49
+ audioBitrate: z.string().optional().describe("Audio bitrate. Default '192k'."),
50
+ });
51
+ export function createTrimDeadAirTool(cwd) {
52
+ return {
53
+ name: "trim_dead_air",
54
+ description: "Trim silence from a recording in one call. mode='head-tail' (default) chops only the " +
55
+ "leading/trailing dead air — the universal 'recording started early' fix. mode='all' " +
56
+ "removes every silence run >= minSilenceSec and concats the keeps into a flat file. For " +
57
+ "fine-grained per-cut control, use detect_silence → write_edl → import_edl instead. " +
58
+ "Returns {path, removedSec, kept}.",
59
+ parameters: TrimDeadAirParams,
60
+ async execute(args, ctx) {
61
+ if (!checkFfmpeg())
62
+ return err("ffmpeg not on PATH", "install ffmpeg");
63
+ try {
64
+ const inAbs = resolvePath(cwd, args.input);
65
+ const outAbs = safeOutputPath(cwd, args.output);
66
+ const probe = probeMedia(inAbs);
67
+ if (!probe)
68
+ return err(`probe failed for ${inAbs}`, "verify file exists and is readable");
69
+ const totalSec = probe.durationSec;
70
+ const mode = args.mode ?? "head-tail";
71
+ const minSil = args.minSilenceSec ?? 0.5;
72
+ const threshDb = args.thresholdDb ?? -30;
73
+ const padSec = args.paddingSec ?? 0.05;
74
+ // Run silencedetect on the input.
75
+ const detect = await runFfmpeg(["-i", inAbs, "-af", `silencedetect=noise=${threshDb}dB:d=${minSil}`, "-f", "null", "-"], { signal: ctx.signal });
76
+ // silencedetect writes to stderr; non-zero exit on a normal run is unusual but tolerated.
77
+ const ranges = parseSilenceDetect(detect.stderr, totalSec);
78
+ // Compute keep ranges per mode.
79
+ const keeps = computeKeeps(ranges, totalSec, mode, padSec);
80
+ if (keeps.length === 0) {
81
+ return err("no audible content remains after trim", "loosen thresholdDb (e.g. -40) or shorten minSilenceSec");
82
+ }
83
+ const removedSec = +(totalSec - keeps.reduce((a, k) => a + (k.endSec - k.startSec), 0)).toFixed(3);
84
+ mkdirSync(dirname(outAbs), { recursive: true });
85
+ // Build trim+concat filter graph. For head-tail with one keep range, this is
86
+ // a single trim. For 'all' with N keeps it's N trim/atrim pairs concatted.
87
+ const videoCodec = args.videoCodec ?? "libx264";
88
+ const crf = args.crf ?? 20;
89
+ const audioBitrate = args.audioBitrate ?? "192k";
90
+ const filter = buildTrimConcatFilter(keeps);
91
+ const ffArgs = [
92
+ "-i",
93
+ inAbs,
94
+ "-filter_complex",
95
+ filter,
96
+ "-map",
97
+ "[v]",
98
+ "-map",
99
+ "[a]",
100
+ "-c:v",
101
+ videoCodec,
102
+ "-crf",
103
+ String(crf),
104
+ "-c:a",
105
+ "aac",
106
+ "-b:a",
107
+ audioBitrate,
108
+ outAbs,
109
+ ];
110
+ const r = await runFfmpeg(ffArgs, { signal: ctx.signal });
111
+ if (r.code !== 0) {
112
+ return err(`ffmpeg exited ${r.code}`, "check that the input has both video and audio streams");
113
+ }
114
+ return compact({
115
+ ok: true,
116
+ path: outAbs,
117
+ mode,
118
+ totalSec,
119
+ removedSec,
120
+ kept: keeps.length,
121
+ keeps: keeps.map((k) => ({
122
+ startSec: +k.startSec.toFixed(3),
123
+ endSec: +k.endSec.toFixed(3),
124
+ })),
125
+ });
126
+ }
127
+ catch (e) {
128
+ return err(e.message);
129
+ }
130
+ },
131
+ };
132
+ }
133
+ /**
134
+ * Compute keep ranges from detected silences.
135
+ *
136
+ * mode='head-tail': only the leading silence (if any starts at ~0) and the
137
+ * trailing silence (if any ends at totalSec) are removed; everything in
138
+ * between is one big keep range.
139
+ * mode='all': inverse of all detected silences — every gap between silences
140
+ * becomes a keep range.
141
+ *
142
+ * Padding extends each keep outward; clamped to [0, totalSec] and to its
143
+ * neighbours so adjacent keeps never overlap.
144
+ */
145
+ export function computeKeeps(silences, totalSec, mode, paddingSec) {
146
+ if (totalSec <= 0)
147
+ return [];
148
+ const sorted = [...silences].sort((a, b) => a.startSec - b.startSec);
149
+ if (mode === "head-tail") {
150
+ let start = 0;
151
+ let end = totalSec;
152
+ const head = sorted[0];
153
+ if (head && head.startSec <= 0.05)
154
+ start = head.endSec;
155
+ const tail = sorted[sorted.length - 1];
156
+ if (tail && tail.endSec >= totalSec - 0.05)
157
+ end = tail.startSec;
158
+ start = Math.max(0, start - paddingSec);
159
+ end = Math.min(totalSec, end + paddingSec);
160
+ if (end <= start)
161
+ return [];
162
+ return [{ startSec: start, endSec: end }];
163
+ }
164
+ // mode === "all"
165
+ const keeps = [];
166
+ let cursor = 0;
167
+ for (const s of sorted) {
168
+ if (s.startSec > cursor) {
169
+ const start = Math.max(0, cursor - paddingSec);
170
+ const end = Math.min(totalSec, s.startSec + paddingSec);
171
+ if (end > start)
172
+ keeps.push({ startSec: start, endSec: end });
173
+ }
174
+ cursor = Math.max(cursor, s.endSec);
175
+ }
176
+ if (cursor < totalSec) {
177
+ const start = Math.max(0, cursor - paddingSec);
178
+ keeps.push({ startSec: start, endSec: totalSec });
179
+ }
180
+ // Stitch overlaps caused by padding.
181
+ const merged = [];
182
+ for (const k of keeps) {
183
+ const prev = merged[merged.length - 1];
184
+ if (prev && k.startSec <= prev.endSec) {
185
+ prev.endSec = Math.max(prev.endSec, k.endSec);
186
+ }
187
+ else {
188
+ merged.push({ ...k });
189
+ }
190
+ }
191
+ return merged;
192
+ }
193
+ /**
194
+ * Build an ffmpeg filter_complex that trims to N keep ranges and concats
195
+ * them into a single video+audio output labelled [v][a].
196
+ */
197
+ export function buildTrimConcatFilter(keeps) {
198
+ if (keeps.length === 0)
199
+ throw new Error("buildTrimConcatFilter: at least one keep range required");
200
+ if (keeps.length === 1) {
201
+ const k = keeps[0];
202
+ return (`[0:v]trim=start=${k.startSec}:end=${k.endSec},setpts=PTS-STARTPTS[v];` +
203
+ `[0:a]atrim=start=${k.startSec}:end=${k.endSec},asetpts=PTS-STARTPTS[a]`);
204
+ }
205
+ const segs = [];
206
+ const labels = [];
207
+ keeps.forEach((k, i) => {
208
+ segs.push(`[0:v]trim=start=${k.startSec}:end=${k.endSec},setpts=PTS-STARTPTS[v${i}];` +
209
+ `[0:a]atrim=start=${k.startSec}:end=${k.endSec},asetpts=PTS-STARTPTS[a${i}]`);
210
+ labels.push(`[v${i}][a${i}]`);
211
+ });
212
+ segs.push(`${labels.join("")}concat=n=${keeps.length}:v=1:a=1[v][a]`);
213
+ return segs.join(";");
214
+ }
215
+ //# sourceMappingURL=trim-dead-air.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim-dead-air.js","sourceRoot":"","sources":["../../src/tools/trim-dead-air.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trim-dead-air.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim-dead-air.test.d.ts","sourceRoot":"","sources":["../../src/tools/trim-dead-air.test.ts"],"names":[],"mappings":""}