@kenkaiiii/gg-editor 0.6.7 → 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 (455) 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/index.d.ts +18 -5
  13. package/dist/core/auth/index.d.ts.map +1 -1
  14. package/dist/core/auth/index.js +16 -4
  15. package/dist/core/auth/index.js.map +1 -1
  16. package/dist/core/auth/login.d.ts.map +1 -1
  17. package/dist/core/auth/login.js +4 -31
  18. package/dist/core/auth/login.js.map +1 -1
  19. package/dist/core/beats.d.ts +59 -0
  20. package/dist/core/beats.d.ts.map +1 -0
  21. package/dist/core/beats.js +122 -0
  22. package/dist/core/beats.js.map +1 -0
  23. package/dist/core/beats.test.d.ts +2 -0
  24. package/dist/core/beats.test.d.ts.map +1 -0
  25. package/dist/core/beats.test.js +86 -0
  26. package/dist/core/beats.test.js.map +1 -0
  27. package/dist/core/brand-kit.d.ts +80 -0
  28. package/dist/core/brand-kit.d.ts.map +1 -0
  29. package/dist/core/brand-kit.js +96 -0
  30. package/dist/core/brand-kit.js.map +1 -0
  31. package/dist/core/brand-kit.test.d.ts +2 -0
  32. package/dist/core/brand-kit.test.d.ts.map +1 -0
  33. package/dist/core/brand-kit.test.js +76 -0
  34. package/dist/core/brand-kit.test.js.map +1 -0
  35. package/dist/core/bundled-sfx.d.ts +64 -0
  36. package/dist/core/bundled-sfx.d.ts.map +1 -0
  37. package/dist/core/bundled-sfx.js +218 -0
  38. package/dist/core/bundled-sfx.js.map +1 -0
  39. package/dist/core/bundled-sfx.test.d.ts +2 -0
  40. package/dist/core/bundled-sfx.test.d.ts.map +1 -0
  41. package/dist/core/bundled-sfx.test.js +81 -0
  42. package/dist/core/bundled-sfx.test.js.map +1 -0
  43. package/dist/core/child-abort.d.ts +57 -0
  44. package/dist/core/child-abort.d.ts.map +1 -0
  45. package/dist/core/child-abort.js +95 -0
  46. package/dist/core/child-abort.js.map +1 -0
  47. package/dist/core/child-abort.test.d.ts +2 -0
  48. package/dist/core/child-abort.test.d.ts.map +1 -0
  49. package/dist/core/child-abort.test.js +88 -0
  50. package/dist/core/child-abort.test.js.map +1 -0
  51. package/dist/core/clip-scoring.d.ts +44 -0
  52. package/dist/core/clip-scoring.d.ts.map +1 -0
  53. package/dist/core/clip-scoring.js +165 -0
  54. package/dist/core/clip-scoring.js.map +1 -0
  55. package/dist/core/clip-scoring.test.d.ts +2 -0
  56. package/dist/core/clip-scoring.test.d.ts.map +1 -0
  57. package/dist/core/clip-scoring.test.js +113 -0
  58. package/dist/core/clip-scoring.test.js.map +1 -0
  59. package/dist/core/emoji-captions.d.ts +45 -0
  60. package/dist/core/emoji-captions.d.ts.map +1 -0
  61. package/dist/core/emoji-captions.js +121 -0
  62. package/dist/core/emoji-captions.js.map +1 -0
  63. package/dist/core/face-reframe.d.ts +91 -0
  64. package/dist/core/face-reframe.d.ts.map +1 -0
  65. package/dist/core/face-reframe.js +141 -0
  66. package/dist/core/face-reframe.js.map +1 -0
  67. package/dist/core/face-reframe.test.d.ts +2 -0
  68. package/dist/core/face-reframe.test.d.ts.map +1 -0
  69. package/dist/core/face-reframe.test.js +171 -0
  70. package/dist/core/face-reframe.test.js.map +1 -0
  71. package/dist/core/filler-words.d.ts +57 -9
  72. package/dist/core/filler-words.d.ts.map +1 -1
  73. package/dist/core/filler-words.js +61 -9
  74. package/dist/core/filler-words.js.map +1 -1
  75. package/dist/core/filler-words.test.js +91 -17
  76. package/dist/core/filler-words.test.js.map +1 -1
  77. package/dist/core/hook-rewrite.d.ts +48 -0
  78. package/dist/core/hook-rewrite.d.ts.map +1 -0
  79. package/dist/core/hook-rewrite.js +151 -0
  80. package/dist/core/hook-rewrite.js.map +1 -0
  81. package/dist/core/hook-rewrite.test.d.ts +2 -0
  82. package/dist/core/hook-rewrite.test.d.ts.map +1 -0
  83. package/dist/core/hook-rewrite.test.js +58 -0
  84. package/dist/core/hook-rewrite.test.js.map +1 -0
  85. package/dist/core/hosts/lazy.d.ts.map +1 -1
  86. package/dist/core/hosts/lazy.js +2 -0
  87. package/dist/core/hosts/lazy.js.map +1 -1
  88. package/dist/core/hosts/premiere/adapter.d.ts +1 -0
  89. package/dist/core/hosts/premiere/adapter.d.ts.map +1 -1
  90. package/dist/core/hosts/premiere/adapter.js.map +1 -1
  91. package/dist/core/hosts/premiere/bridge-source.d.ts.map +1 -1
  92. package/dist/core/hosts/premiere/bridge-source.js +6 -3
  93. package/dist/core/hosts/premiere/bridge-source.js.map +1 -1
  94. package/dist/core/hosts/resolve/adapter.d.ts +1 -0
  95. package/dist/core/hosts/resolve/adapter.d.ts.map +1 -1
  96. package/dist/core/hosts/resolve/adapter.js.map +1 -1
  97. package/dist/core/hosts/resolve/bridge-source.d.ts.map +1 -1
  98. package/dist/core/hosts/resolve/bridge-source.js +31 -4
  99. package/dist/core/hosts/resolve/bridge-source.js.map +1 -1
  100. package/dist/core/hosts/resolve/bridge.d.ts +2 -19
  101. package/dist/core/hosts/resolve/bridge.d.ts.map +1 -1
  102. package/dist/core/hosts/resolve/bridge.js +70 -41
  103. package/dist/core/hosts/resolve/bridge.js.map +1 -1
  104. package/dist/core/hosts/resolve/bridge.test.js +130 -0
  105. package/dist/core/hosts/resolve/bridge.test.js.map +1 -1
  106. package/dist/core/hosts/types.d.ts +6 -0
  107. package/dist/core/hosts/types.d.ts.map +1 -1
  108. package/dist/core/hosts/types.js.map +1 -1
  109. package/dist/core/logger.d.ts +32 -0
  110. package/dist/core/logger.d.ts.map +1 -0
  111. package/dist/core/logger.js +188 -0
  112. package/dist/core/logger.js.map +1 -0
  113. package/dist/core/loop-match.d.ts +57 -0
  114. package/dist/core/loop-match.d.ts.map +1 -0
  115. package/dist/core/loop-match.js +91 -0
  116. package/dist/core/loop-match.js.map +1 -0
  117. package/dist/core/media/ffmpeg.d.ts.map +1 -1
  118. package/dist/core/media/ffmpeg.js +14 -3
  119. package/dist/core/media/ffmpeg.js.map +1 -1
  120. package/dist/core/multi-format.d.ts +67 -0
  121. package/dist/core/multi-format.d.ts.map +1 -0
  122. package/dist/core/multi-format.js +127 -0
  123. package/dist/core/multi-format.js.map +1 -0
  124. package/dist/core/multi-format.test.d.ts +2 -0
  125. package/dist/core/multi-format.test.d.ts.map +1 -0
  126. package/dist/core/multi-format.test.js +151 -0
  127. package/dist/core/multi-format.test.js.map +1 -0
  128. package/dist/core/python/beats.py +61 -0
  129. package/dist/core/python/face_reframe.py +163 -0
  130. package/dist/core/python/sidecar-path.d.ts +13 -0
  131. package/dist/core/python/sidecar-path.d.ts.map +1 -0
  132. package/dist/core/python/sidecar-path.js +24 -0
  133. package/dist/core/python/sidecar-path.js.map +1 -0
  134. package/dist/core/python.d.ts +57 -0
  135. package/dist/core/python.d.ts.map +1 -0
  136. package/dist/core/python.js +107 -0
  137. package/dist/core/python.js.map +1 -0
  138. package/dist/core/python.test.d.ts +2 -0
  139. package/dist/core/python.test.d.ts.map +1 -0
  140. package/dist/core/python.test.js +129 -0
  141. package/dist/core/python.test.js.map +1 -0
  142. package/dist/core/retention-structure.d.ts +81 -0
  143. package/dist/core/retention-structure.d.ts.map +1 -0
  144. package/dist/core/retention-structure.js +206 -0
  145. package/dist/core/retention-structure.js.map +1 -0
  146. package/dist/core/retention-structure.test.d.ts +2 -0
  147. package/dist/core/retention-structure.test.d.ts.map +1 -0
  148. package/dist/core/retention-structure.test.js +88 -0
  149. package/dist/core/retention-structure.test.js.map +1 -0
  150. package/dist/core/review.d.ts +17 -0
  151. package/dist/core/review.d.ts.map +1 -1
  152. package/dist/core/review.js +20 -24
  153. package/dist/core/review.js.map +1 -1
  154. package/dist/core/safe-paths.d.ts +11 -0
  155. package/dist/core/safe-paths.d.ts.map +1 -1
  156. package/dist/core/safe-paths.js +26 -10
  157. package/dist/core/safe-paths.js.map +1 -1
  158. package/dist/core/safe-paths.test.js +16 -0
  159. package/dist/core/safe-paths.test.js.map +1 -1
  160. package/dist/core/skills-loader.d.ts +48 -2
  161. package/dist/core/skills-loader.d.ts.map +1 -1
  162. package/dist/core/skills-loader.js +97 -19
  163. package/dist/core/skills-loader.js.map +1 -1
  164. package/dist/core/skills-loader.test.js +63 -1
  165. package/dist/core/skills-loader.test.js.map +1 -1
  166. package/dist/core/srt.d.ts +42 -7
  167. package/dist/core/srt.d.ts.map +1 -1
  168. package/dist/core/srt.js +101 -32
  169. package/dist/core/srt.js.map +1 -1
  170. package/dist/core/srt.test.js +54 -1
  171. package/dist/core/srt.test.js.map +1 -1
  172. package/dist/core/thumbnail-compose.d.ts +58 -0
  173. package/dist/core/thumbnail-compose.d.ts.map +1 -0
  174. package/dist/core/thumbnail-compose.js +101 -0
  175. package/dist/core/thumbnail-compose.js.map +1 -0
  176. package/dist/core/thumbnail-promise.d.ts +46 -0
  177. package/dist/core/thumbnail-promise.d.ts.map +1 -0
  178. package/dist/core/thumbnail-promise.js +133 -0
  179. package/dist/core/thumbnail-promise.js.map +1 -0
  180. package/dist/core/thumbnail-promise.test.d.ts +2 -0
  181. package/dist/core/thumbnail-promise.test.d.ts.map +1 -0
  182. package/dist/core/thumbnail-promise.test.js +52 -0
  183. package/dist/core/thumbnail-promise.test.js.map +1 -0
  184. package/dist/core/viral-moments.d.ts +70 -0
  185. package/dist/core/viral-moments.d.ts.map +1 -0
  186. package/dist/core/viral-moments.js +192 -0
  187. package/dist/core/viral-moments.js.map +1 -0
  188. package/dist/core/viral-moments.test.d.ts +2 -0
  189. package/dist/core/viral-moments.test.d.ts.map +1 -0
  190. package/dist/core/viral-moments.test.js +153 -0
  191. package/dist/core/viral-moments.test.js.map +1 -0
  192. package/dist/core/whisper.d.ts +16 -0
  193. package/dist/core/whisper.d.ts.map +1 -1
  194. package/dist/core/whisper.js +72 -5
  195. package/dist/core/whisper.js.map +1 -1
  196. package/dist/core/whisper.test.js +111 -1
  197. package/dist/core/whisper.test.js.map +1 -1
  198. package/dist/core/youtube-metadata.d.ts +44 -0
  199. package/dist/core/youtube-metadata.d.ts.map +1 -0
  200. package/dist/core/youtube-metadata.js +168 -0
  201. package/dist/core/youtube-metadata.js.map +1 -0
  202. package/dist/core/youtube-metadata.test.d.ts +2 -0
  203. package/dist/core/youtube-metadata.test.d.ts.map +1 -0
  204. package/dist/core/youtube-metadata.test.js +132 -0
  205. package/dist/core/youtube-metadata.test.js.map +1 -0
  206. package/dist/index.d.ts +1 -1
  207. package/dist/index.d.ts.map +1 -1
  208. package/dist/index.js +3 -2
  209. package/dist/index.js.map +1 -1
  210. package/dist/prompt-commands.d.ts +24 -0
  211. package/dist/prompt-commands.d.ts.map +1 -0
  212. package/dist/prompt-commands.js +243 -0
  213. package/dist/prompt-commands.js.map +1 -0
  214. package/dist/prompt-commands.test.d.ts +2 -0
  215. package/dist/prompt-commands.test.d.ts.map +1 -0
  216. package/dist/prompt-commands.test.js +46 -0
  217. package/dist/prompt-commands.test.js.map +1 -0
  218. package/dist/skills.d.ts +6 -6
  219. package/dist/skills.d.ts.map +1 -1
  220. package/dist/skills.js +1426 -445
  221. package/dist/skills.js.map +1 -1
  222. package/dist/system-prompt.d.ts.map +1 -1
  223. package/dist/system-prompt.js +108 -0
  224. package/dist/system-prompt.js.map +1 -1
  225. package/dist/tools/add-fades.d.ts.map +1 -1
  226. package/dist/tools/add-fades.js +2 -1
  227. package/dist/tools/add-fades.js.map +1 -1
  228. package/dist/tools/add-sfx-at-cuts.d.ts.map +1 -1
  229. package/dist/tools/add-sfx-at-cuts.js +36 -11
  230. package/dist/tools/add-sfx-at-cuts.js.map +1 -1
  231. package/dist/tools/add-sfx-to-timeline.d.ts +34 -0
  232. package/dist/tools/add-sfx-to-timeline.d.ts.map +1 -0
  233. package/dist/tools/add-sfx-to-timeline.js +169 -0
  234. package/dist/tools/add-sfx-to-timeline.js.map +1 -0
  235. package/dist/tools/add-sfx-to-timeline.test.d.ts +2 -0
  236. package/dist/tools/add-sfx-to-timeline.test.d.ts.map +1 -0
  237. package/dist/tools/add-sfx-to-timeline.test.js +181 -0
  238. package/dist/tools/add-sfx-to-timeline.test.js.map +1 -0
  239. package/dist/tools/audit-first-frame.d.ts +36 -0
  240. package/dist/tools/audit-first-frame.d.ts.map +1 -0
  241. package/dist/tools/audit-first-frame.js +181 -0
  242. package/dist/tools/audit-first-frame.js.map +1 -0
  243. package/dist/tools/audit-retention-structure.d.ts +20 -0
  244. package/dist/tools/audit-retention-structure.d.ts.map +1 -0
  245. package/dist/tools/audit-retention-structure.js +95 -0
  246. package/dist/tools/audit-retention-structure.js.map +1 -0
  247. package/dist/tools/audit-retention-structure.test.d.ts +2 -0
  248. package/dist/tools/audit-retention-structure.test.d.ts.map +1 -0
  249. package/dist/tools/audit-retention-structure.test.js +93 -0
  250. package/dist/tools/audit-retention-structure.test.js.map +1 -0
  251. package/dist/tools/bleep-words.d.ts +59 -0
  252. package/dist/tools/bleep-words.d.ts.map +1 -0
  253. package/dist/tools/bleep-words.js +211 -0
  254. package/dist/tools/bleep-words.js.map +1 -0
  255. package/dist/tools/bleep-words.test.d.ts +2 -0
  256. package/dist/tools/bleep-words.test.d.ts.map +1 -0
  257. package/dist/tools/bleep-words.test.js +96 -0
  258. package/dist/tools/bleep-words.test.js.map +1 -0
  259. package/dist/tools/burn-subtitles.d.ts.map +1 -1
  260. package/dist/tools/burn-subtitles.js +10 -5
  261. package/dist/tools/burn-subtitles.js.map +1 -1
  262. package/dist/tools/clean-audio.d.ts.map +1 -1
  263. package/dist/tools/clean-audio.js +2 -1
  264. package/dist/tools/clean-audio.js.map +1 -1
  265. package/dist/tools/cluster-takes.js +2 -1
  266. package/dist/tools/cluster-takes.js.map +1 -1
  267. package/dist/tools/compose-thumbnail-variants.d.ts +70 -0
  268. package/dist/tools/compose-thumbnail-variants.d.ts.map +1 -0
  269. package/dist/tools/compose-thumbnail-variants.js +274 -0
  270. package/dist/tools/compose-thumbnail-variants.js.map +1 -0
  271. package/dist/tools/compose-thumbnail.d.ts +6 -13
  272. package/dist/tools/compose-thumbnail.d.ts.map +1 -1
  273. package/dist/tools/compose-thumbnail.js +44 -81
  274. package/dist/tools/compose-thumbnail.js.map +1 -1
  275. package/dist/tools/concat-videos.d.ts.map +1 -1
  276. package/dist/tools/concat-videos.js +12 -5
  277. package/dist/tools/concat-videos.js.map +1 -1
  278. package/dist/tools/concat-videos.test.d.ts +2 -0
  279. package/dist/tools/concat-videos.test.d.ts.map +1 -0
  280. package/dist/tools/concat-videos.test.js +103 -0
  281. package/dist/tools/concat-videos.test.js.map +1 -0
  282. package/dist/tools/crossfade-videos.d.ts.map +1 -1
  283. package/dist/tools/crossfade-videos.js +2 -1
  284. package/dist/tools/crossfade-videos.js.map +1 -1
  285. package/dist/tools/cut-filler-words.d.ts.map +1 -1
  286. package/dist/tools/cut-filler-words.js +24 -8
  287. package/dist/tools/cut-filler-words.js.map +1 -1
  288. package/dist/tools/detect-speaker-changes.js +2 -1
  289. package/dist/tools/detect-speaker-changes.js.map +1 -1
  290. package/dist/tools/extract-audio.d.ts.map +1 -1
  291. package/dist/tools/extract-audio.js +13 -7
  292. package/dist/tools/extract-audio.js.map +1 -1
  293. package/dist/tools/face-reframe.d.ts +30 -0
  294. package/dist/tools/face-reframe.d.ts.map +1 -0
  295. package/dist/tools/face-reframe.js +143 -0
  296. package/dist/tools/face-reframe.js.map +1 -0
  297. package/dist/tools/face-reframe.test.d.ts +2 -0
  298. package/dist/tools/face-reframe.test.d.ts.map +1 -0
  299. package/dist/tools/face-reframe.test.js +139 -0
  300. package/dist/tools/face-reframe.test.js.map +1 -0
  301. package/dist/tools/find-viral-moments.d.ts +23 -0
  302. package/dist/tools/find-viral-moments.d.ts.map +1 -0
  303. package/dist/tools/find-viral-moments.js +176 -0
  304. package/dist/tools/find-viral-moments.js.map +1 -0
  305. package/dist/tools/find-viral-moments.test.d.ts +2 -0
  306. package/dist/tools/find-viral-moments.test.d.ts.map +1 -0
  307. package/dist/tools/find-viral-moments.test.js +144 -0
  308. package/dist/tools/find-viral-moments.test.js.map +1 -0
  309. package/dist/tools/generate-gif.d.ts.map +1 -1
  310. package/dist/tools/generate-gif.js +47 -40
  311. package/dist/tools/generate-gif.js.map +1 -1
  312. package/dist/tools/generate-gif.test.d.ts +2 -0
  313. package/dist/tools/generate-gif.test.d.ts.map +1 -0
  314. package/dist/tools/generate-gif.test.js +115 -0
  315. package/dist/tools/generate-gif.test.js.map +1 -0
  316. package/dist/tools/generate-outro.d.ts +18 -0
  317. package/dist/tools/generate-outro.d.ts.map +1 -0
  318. package/dist/tools/generate-outro.js +175 -0
  319. package/dist/tools/generate-outro.js.map +1 -0
  320. package/dist/tools/generate-youtube-metadata.d.ts +23 -0
  321. package/dist/tools/generate-youtube-metadata.d.ts.map +1 -0
  322. package/dist/tools/generate-youtube-metadata.js +103 -0
  323. package/dist/tools/generate-youtube-metadata.js.map +1 -0
  324. package/dist/tools/generate-youtube-metadata.test.d.ts +2 -0
  325. package/dist/tools/generate-youtube-metadata.test.d.ts.map +1 -0
  326. package/dist/tools/generate-youtube-metadata.test.js +118 -0
  327. package/dist/tools/generate-youtube-metadata.test.js.map +1 -0
  328. package/dist/tools/index.d.ts +14 -0
  329. package/dist/tools/index.d.ts.map +1 -1
  330. package/dist/tools/index.js +130 -1
  331. package/dist/tools/index.js.map +1 -1
  332. package/dist/tools/index.test.js +27 -1
  333. package/dist/tools/index.test.js.map +1 -1
  334. package/dist/tools/ken-burns.d.ts.map +1 -1
  335. package/dist/tools/ken-burns.js +2 -1
  336. package/dist/tools/ken-burns.js.map +1 -1
  337. package/dist/tools/loop-match-short.d.ts +22 -0
  338. package/dist/tools/loop-match-short.d.ts.map +1 -0
  339. package/dist/tools/loop-match-short.js +107 -0
  340. package/dist/tools/loop-match-short.js.map +1 -0
  341. package/dist/tools/mix-audio.d.ts.map +1 -1
  342. package/dist/tools/mix-audio.js +2 -1
  343. package/dist/tools/mix-audio.js.map +1 -1
  344. package/dist/tools/normalize-loudness.d.ts.map +1 -1
  345. package/dist/tools/normalize-loudness.js +2 -1
  346. package/dist/tools/normalize-loudness.js.map +1 -1
  347. package/dist/tools/path-traversal.test.d.ts +15 -0
  348. package/dist/tools/path-traversal.test.d.ts.map +1 -0
  349. package/dist/tools/path-traversal.test.js +223 -0
  350. package/dist/tools/path-traversal.test.js.map +1 -0
  351. package/dist/tools/pick-best-takes.js +2 -1
  352. package/dist/tools/pick-best-takes.js.map +1 -1
  353. package/dist/tools/punch-in.d.ts.map +1 -1
  354. package/dist/tools/punch-in.js +2 -1
  355. package/dist/tools/punch-in.js.map +1 -1
  356. package/dist/tools/read-transcript.js +2 -1
  357. package/dist/tools/read-transcript.js.map +1 -1
  358. package/dist/tools/render-multi-format.d.ts +35 -0
  359. package/dist/tools/render-multi-format.d.ts.map +1 -0
  360. package/dist/tools/render-multi-format.js +206 -0
  361. package/dist/tools/render-multi-format.js.map +1 -0
  362. package/dist/tools/render-multi-format.test.d.ts +2 -0
  363. package/dist/tools/render-multi-format.test.d.ts.map +1 -0
  364. package/dist/tools/render-multi-format.test.js +312 -0
  365. package/dist/tools/render-multi-format.test.js.map +1 -0
  366. package/dist/tools/render.d.ts.map +1 -1
  367. package/dist/tools/render.js +2 -2
  368. package/dist/tools/render.js.map +1 -1
  369. package/dist/tools/rewrite-hook.d.ts +32 -0
  370. package/dist/tools/rewrite-hook.d.ts.map +1 -0
  371. package/dist/tools/rewrite-hook.js +65 -0
  372. package/dist/tools/rewrite-hook.js.map +1 -0
  373. package/dist/tools/score-clip.d.ts +30 -0
  374. package/dist/tools/score-clip.d.ts.map +1 -0
  375. package/dist/tools/score-clip.js +109 -0
  376. package/dist/tools/score-clip.js.map +1 -0
  377. package/dist/tools/score-clip.test.d.ts +2 -0
  378. package/dist/tools/score-clip.test.d.ts.map +1 -0
  379. package/dist/tools/score-clip.test.js +110 -0
  380. package/dist/tools/score-clip.test.js.map +1 -0
  381. package/dist/tools/search-tools.d.ts +34 -0
  382. package/dist/tools/search-tools.d.ts.map +1 -0
  383. package/dist/tools/search-tools.js +86 -0
  384. package/dist/tools/search-tools.js.map +1 -0
  385. package/dist/tools/search-tools.test.d.ts +2 -0
  386. package/dist/tools/search-tools.test.d.ts.map +1 -0
  387. package/dist/tools/search-tools.test.js +60 -0
  388. package/dist/tools/search-tools.test.js.map +1 -0
  389. package/dist/tools/snap-cuts-to-beats.d.ts +18 -0
  390. package/dist/tools/snap-cuts-to-beats.d.ts.map +1 -0
  391. package/dist/tools/snap-cuts-to-beats.js +110 -0
  392. package/dist/tools/snap-cuts-to-beats.js.map +1 -0
  393. package/dist/tools/snap-cuts-to-beats.test.d.ts +2 -0
  394. package/dist/tools/snap-cuts-to-beats.test.d.ts.map +1 -0
  395. package/dist/tools/snap-cuts-to-beats.test.js +99 -0
  396. package/dist/tools/snap-cuts-to-beats.test.js.map +1 -0
  397. package/dist/tools/speed-ramp.d.ts.map +1 -1
  398. package/dist/tools/speed-ramp.js +2 -1
  399. package/dist/tools/speed-ramp.js.map +1 -1
  400. package/dist/tools/stabilize-video.d.ts.map +1 -1
  401. package/dist/tools/stabilize-video.js +2 -1
  402. package/dist/tools/stabilize-video.js.map +1 -1
  403. package/dist/tools/suggest-broll.d.ts +34 -0
  404. package/dist/tools/suggest-broll.d.ts.map +1 -0
  405. package/dist/tools/suggest-broll.js +367 -0
  406. package/dist/tools/suggest-broll.js.map +1 -0
  407. package/dist/tools/suggest-broll.test.d.ts +2 -0
  408. package/dist/tools/suggest-broll.test.d.ts.map +1 -0
  409. package/dist/tools/suggest-broll.test.js +217 -0
  410. package/dist/tools/suggest-broll.test.js.map +1 -0
  411. package/dist/tools/text-based-cut.d.ts +33 -0
  412. package/dist/tools/text-based-cut.d.ts.map +1 -0
  413. package/dist/tools/text-based-cut.js +172 -0
  414. package/dist/tools/text-based-cut.js.map +1 -0
  415. package/dist/tools/text-based-cut.test.d.ts +2 -0
  416. package/dist/tools/text-based-cut.test.d.ts.map +1 -0
  417. package/dist/tools/text-based-cut.test.js +32 -0
  418. package/dist/tools/text-based-cut.test.js.map +1 -0
  419. package/dist/tools/transcribe.d.ts +1 -1
  420. package/dist/tools/transition-videos.d.ts +1 -1
  421. package/dist/tools/transition-videos.d.ts.map +1 -1
  422. package/dist/tools/transition-videos.js +2 -1
  423. package/dist/tools/transition-videos.js.map +1 -1
  424. package/dist/tools/trim-dead-air.d.ts +59 -0
  425. package/dist/tools/trim-dead-air.d.ts.map +1 -0
  426. package/dist/tools/trim-dead-air.js +215 -0
  427. package/dist/tools/trim-dead-air.js.map +1 -0
  428. package/dist/tools/trim-dead-air.test.d.ts +2 -0
  429. package/dist/tools/trim-dead-air.test.d.ts.map +1 -0
  430. package/dist/tools/trim-dead-air.test.js +75 -0
  431. package/dist/tools/trim-dead-air.test.js.map +1 -0
  432. package/dist/tools/verify-thumbnail-promise.d.ts +33 -0
  433. package/dist/tools/verify-thumbnail-promise.d.ts.map +1 -0
  434. package/dist/tools/verify-thumbnail-promise.js +112 -0
  435. package/dist/tools/verify-thumbnail-promise.js.map +1 -0
  436. package/dist/tools/verify-thumbnail-promise.test.d.ts +2 -0
  437. package/dist/tools/verify-thumbnail-promise.test.d.ts.map +1 -0
  438. package/dist/tools/verify-thumbnail-promise.test.js +38 -0
  439. package/dist/tools/verify-thumbnail-promise.test.js.map +1 -0
  440. package/dist/tools/write-keyword-captions.d.ts +7 -0
  441. package/dist/tools/write-keyword-captions.d.ts.map +1 -1
  442. package/dist/tools/write-keyword-captions.js +35 -4
  443. package/dist/tools/write-keyword-captions.js.map +1 -1
  444. package/dist/ui/App.d.ts.map +1 -1
  445. package/dist/ui/App.js +75 -11
  446. package/dist/ui/App.js.map +1 -1
  447. package/dist/ui/tool-formatters.d.ts +30 -0
  448. package/dist/ui/tool-formatters.d.ts.map +1 -0
  449. package/dist/ui/tool-formatters.js +461 -0
  450. package/dist/ui/tool-formatters.js.map +1 -0
  451. package/dist/ui/tool-formatters.test.d.ts +2 -0
  452. package/dist/ui/tool-formatters.test.d.ts.map +1 -0
  453. package/dist/ui/tool-formatters.test.js +143 -0
  454. package/dist/ui/tool-formatters.test.js.map +1 -0
  455. package/package.json +10 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beats.js","sourceRoot":"","sources":["../../src/core/beats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=beats.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beats.test.d.ts","sourceRoot":"","sources":["../../src/core/beats.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { snapCuts } from "./beats.js";
3
+ describe("snapCuts", () => {
4
+ it("returns empty results for empty cut list", () => {
5
+ const r = snapCuts([], [1, 2, 3], 0.25);
6
+ expect(r.snapped).toEqual([]);
7
+ expect(r.unchanged).toEqual([]);
8
+ });
9
+ it("returns every cut in unchanged when beats list is empty", () => {
10
+ const r = snapCuts([1.0, 2.0], [], 0.25);
11
+ expect(r.snapped).toEqual([]);
12
+ expect(r.unchanged).toEqual([{ atSec: 1.0 }, { atSec: 2.0 }]);
13
+ });
14
+ it("snaps a cut to the nearest beat within tolerance", () => {
15
+ // Beats at 1.0, 2.0, 3.0; cut at 2.07s with tol 0.25 → snaps to 2.0.
16
+ const r = snapCuts([2.07], [1.0, 2.0, 3.0], 0.25);
17
+ expect(r.snapped).toHaveLength(1);
18
+ expect(r.unchanged).toEqual([]);
19
+ expect(r.snapped[0]).toEqual({
20
+ originalSec: 2.07,
21
+ snappedSec: 2.0,
22
+ beatIdx: 1,
23
+ deltaSec: expect.closeTo(-0.07, 5),
24
+ });
25
+ });
26
+ it("leaves a cut unchanged when the closest beat is outside tolerance", () => {
27
+ // Beats at 0, 1; cut at 0.5 → equidistant, but 0.5 > tol of 0.1.
28
+ const r = snapCuts([0.5], [0.0, 1.0], 0.1);
29
+ expect(r.snapped).toEqual([]);
30
+ expect(r.unchanged).toHaveLength(1);
31
+ expect(r.unchanged[0].atSec).toBe(0.5);
32
+ expect(r.unchanged[0].nearestBeatDeltaSec).toBeCloseTo(0.5, 5);
33
+ });
34
+ it("picks the LEFT beat on a perfect tie (earlier beat wins)", () => {
35
+ // Cut at 1.5 between beats at 1.0 and 2.0 — both 0.5 away.
36
+ const r = snapCuts([1.5], [1.0, 2.0], 1.0);
37
+ expect(r.snapped).toHaveLength(1);
38
+ expect(r.snapped[0].snappedSec).toBe(1.0);
39
+ expect(r.snapped[0].beatIdx).toBe(0);
40
+ });
41
+ it("snaps each cut independently and preserves input order", () => {
42
+ const cuts = [3.05, 1.04, 2.5];
43
+ const beats = [1.0, 2.0, 3.0, 4.0];
44
+ const r = snapCuts(cuts, beats, 0.1);
45
+ // 3.05 → 3.0 (delta -0.05)
46
+ // 1.04 → 1.0 (delta -0.04)
47
+ // 2.5 → ties left at 2.0 BUT |0.5| > 0.1 tol → unchanged.
48
+ expect(r.snapped.map((s) => s.originalSec)).toEqual([3.05, 1.04]);
49
+ expect(r.unchanged.map((u) => u.atSec)).toEqual([2.5]);
50
+ });
51
+ it("clamps negative tolerance to 0 (no snap occurs)", () => {
52
+ const r = snapCuts([1.0001], [1.0], -0.5);
53
+ // Tolerance was negative → clamped to 0; cut isn't EXACTLY on the beat,
54
+ // so it falls into unchanged.
55
+ expect(r.snapped).toEqual([]);
56
+ expect(r.unchanged).toHaveLength(1);
57
+ });
58
+ it("handles cuts before the first beat and after the last beat", () => {
59
+ const beats = [5.0, 6.0, 7.0];
60
+ const r = snapCuts([4.95, 7.05, 100], beats, 0.1);
61
+ // 4.95 → 5.0, 7.05 → 7.0, 100 → unchanged (closest delta 93)
62
+ expect(r.snapped.map((s) => s.snappedSec)).toEqual([5.0, 7.0]);
63
+ expect(r.unchanged).toHaveLength(1);
64
+ expect(r.unchanged[0].atSec).toBe(100);
65
+ expect(r.unchanged[0].nearestBeatDeltaSec).toBeCloseTo(93, 1);
66
+ });
67
+ it("sorts beat input defensively", () => {
68
+ // Caller passes beats out of order; we still find the right neighbour.
69
+ const r = snapCuts([2.04], [3.0, 1.0, 2.0], 0.1);
70
+ expect(r.snapped[0].snappedSec).toBe(2.0);
71
+ expect(r.snapped[0].beatIdx).toBe(1); // index in the SORTED list
72
+ });
73
+ it("treats non-finite cuts as unchanged", () => {
74
+ const r = snapCuts([NaN, 1.0], [1.0, 2.0], 0.1);
75
+ expect(r.snapped).toHaveLength(1);
76
+ expect(r.snapped[0].originalSec).toBe(1.0);
77
+ expect(r.unchanged).toHaveLength(1);
78
+ expect(Number.isNaN(r.unchanged[0].atSec)).toBe(true);
79
+ });
80
+ it("zero tolerance only snaps exact-match cuts", () => {
81
+ const r = snapCuts([1.0, 1.001], [1.0, 2.0], 0);
82
+ expect(r.snapped.map((s) => s.originalSec)).toEqual([1.0]);
83
+ expect(r.unchanged.map((u) => u.atSec)).toEqual([1.001]);
84
+ });
85
+ });
86
+ //# sourceMappingURL=beats.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beats.test.js","sourceRoot":"","sources":["../../src/core/beats.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Brand-kit loader.
3
+ *
4
+ * A "brand kit" is a small JSON file at `<cwd>/.gg/brand.json` that holds the
5
+ * channel-level constants every render-time tool wants: logo, intro/outro/
6
+ * watermark video paths, default fonts, colour palette, channel name, CTA
7
+ * text. The loader is opt-in — if the file isn't present, every consumer
8
+ * falls back to its existing defaults.
9
+ *
10
+ * Why JSON, not YAML: zero new deps; brand kits are short enough that the
11
+ * JSON line noise doesn't hurt readability.
12
+ *
13
+ * Why separate from styles (`<cwd>/.gg/editor-styles/*.md`): styles modulate
14
+ * the LLM's behaviour (its writing voice, tone, defaults). The brand kit
15
+ * modulates raw render output (which logo to overlay, which font to draw
16
+ * with). They serve different layers and we keep them separate so a user
17
+ * can change one without touching the other.
18
+ */
19
+ export interface BrandKitFonts {
20
+ /** Display font for headlines / titles. */
21
+ heading?: string;
22
+ /** Body font for captions / lower-thirds. */
23
+ body?: string;
24
+ }
25
+ export interface BrandKitColors {
26
+ /** Hex (RRGGBB, no leading #). */
27
+ primary?: string;
28
+ secondary?: string;
29
+ accent?: string;
30
+ }
31
+ export interface BrandKit {
32
+ /** Channel display name; surfaced in outros, lower-thirds, end-screens. */
33
+ channelName?: string;
34
+ /** Path (relative to cwd) to a logo PNG with alpha — used by overlay_watermark and generate_outro. */
35
+ logo?: string;
36
+ /** Default watermark path (logo, but a more polished pre-positioned variant if you have one). */
37
+ watermark?: string;
38
+ /** Pre-rendered intro video. concat_videos uses this. */
39
+ intro?: string;
40
+ /** Pre-rendered outro video. concat_videos / generate_outro use this. */
41
+ outro?: string;
42
+ /** Per-font-role family (or path to .ttf for ffmpeg drawtext). */
43
+ fonts?: BrandKitFonts;
44
+ /** Brand palette (hex without leading #). */
45
+ colors?: BrandKitColors;
46
+ /** Default CTA text — used by generate_outro and overlay banners. */
47
+ ctaText?: string;
48
+ /** Default subscribe handle / URL surfaced in description templates. */
49
+ subscribeUrl?: string;
50
+ }
51
+ /** Path of the brand-kit file relative to cwd. Stable so docs can quote it. */
52
+ export declare const BRAND_KIT_PATH = ".gg/brand.json";
53
+ /**
54
+ * Load `<cwd>/.gg/brand.json` if present. Returns `null` when the file is
55
+ * missing OR malformed — callers should treat absence as "no brand kit
56
+ * configured" and fall back to their normal defaults. Malformed JSON also
57
+ * returns null (we don't want a syntax slip in a config file to break a
58
+ * render); the agent surfaces the issue separately via `validateBrandKit`.
59
+ */
60
+ export declare function loadBrandKit(cwd: string): BrandKit | null;
61
+ export interface BrandKitValidation {
62
+ ok: boolean;
63
+ /** Empty when ok=true. */
64
+ errors: string[];
65
+ /** Warnings don't block; they surface "you set logo but the file doesn't exist" cases. */
66
+ warnings: string[];
67
+ }
68
+ /**
69
+ * Validate a brand kit. Returns structured findings the agent can surface.
70
+ * Doesn't throw — caller decides whether to gate.
71
+ *
72
+ * Strict checks (errors):
73
+ * - any path field that isn't a string
74
+ * - any color that isn't 6-hex chars
75
+ *
76
+ * Soft checks (warnings):
77
+ * - referenced files that don't exist on disk
78
+ */
79
+ export declare function validateBrandKit(kit: BrandKit, cwd: string, fileExists?: (absPath: string) => boolean): BrandKitValidation;
80
+ //# sourceMappingURL=brand-kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-kit.d.ts","sourceRoot":"","sources":["../../src/core/brand-kit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sGAAsG;IACtG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,+EAA+E;AAC/E,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAezD;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,0BAA0B;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACxC,kBAAkB,CAsCpB"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Brand-kit loader.
3
+ *
4
+ * A "brand kit" is a small JSON file at `<cwd>/.gg/brand.json` that holds the
5
+ * channel-level constants every render-time tool wants: logo, intro/outro/
6
+ * watermark video paths, default fonts, colour palette, channel name, CTA
7
+ * text. The loader is opt-in — if the file isn't present, every consumer
8
+ * falls back to its existing defaults.
9
+ *
10
+ * Why JSON, not YAML: zero new deps; brand kits are short enough that the
11
+ * JSON line noise doesn't hurt readability.
12
+ *
13
+ * Why separate from styles (`<cwd>/.gg/editor-styles/*.md`): styles modulate
14
+ * the LLM's behaviour (its writing voice, tone, defaults). The brand kit
15
+ * modulates raw render output (which logo to overlay, which font to draw
16
+ * with). They serve different layers and we keep them separate so a user
17
+ * can change one without touching the other.
18
+ */
19
+ import { existsSync, readFileSync } from "node:fs";
20
+ import { resolve as resolvePath } from "node:path";
21
+ /** Path of the brand-kit file relative to cwd. Stable so docs can quote it. */
22
+ export const BRAND_KIT_PATH = ".gg/brand.json";
23
+ /**
24
+ * Load `<cwd>/.gg/brand.json` if present. Returns `null` when the file is
25
+ * missing OR malformed — callers should treat absence as "no brand kit
26
+ * configured" and fall back to their normal defaults. Malformed JSON also
27
+ * returns null (we don't want a syntax slip in a config file to break a
28
+ * render); the agent surfaces the issue separately via `validateBrandKit`.
29
+ */
30
+ export function loadBrandKit(cwd) {
31
+ const path = resolvePath(cwd, BRAND_KIT_PATH);
32
+ let raw;
33
+ try {
34
+ raw = readFileSync(path, "utf8");
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ try {
40
+ const parsed = JSON.parse(raw);
41
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
42
+ return null;
43
+ return parsed;
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ /**
50
+ * Validate a brand kit. Returns structured findings the agent can surface.
51
+ * Doesn't throw — caller decides whether to gate.
52
+ *
53
+ * Strict checks (errors):
54
+ * - any path field that isn't a string
55
+ * - any color that isn't 6-hex chars
56
+ *
57
+ * Soft checks (warnings):
58
+ * - referenced files that don't exist on disk
59
+ */
60
+ export function validateBrandKit(kit, cwd, fileExists) {
61
+ const errors = [];
62
+ const warnings = [];
63
+ const exists = fileExists ?? ((p) => existsSync(p));
64
+ const pathFields = ["logo", "watermark", "intro", "outro"];
65
+ for (const f of pathFields) {
66
+ const v = kit[f];
67
+ if (v === undefined)
68
+ continue;
69
+ if (typeof v !== "string" || v.trim().length === 0) {
70
+ errors.push(`${f}: must be a non-empty string`);
71
+ continue;
72
+ }
73
+ const abs = resolvePath(cwd, v);
74
+ if (!exists(abs))
75
+ warnings.push(`${f}: file not found at ${abs}`);
76
+ }
77
+ if (kit.colors) {
78
+ for (const [k, v] of Object.entries(kit.colors)) {
79
+ if (v !== undefined && !/^[0-9a-fA-F]{6}$/.test(v)) {
80
+ errors.push(`colors.${k}: '${v}' is not 6-char hex (RRGGBB, no #)`);
81
+ }
82
+ }
83
+ }
84
+ if (kit.fonts) {
85
+ for (const [k, v] of Object.entries(kit.fonts)) {
86
+ if (v !== undefined && typeof v !== "string") {
87
+ errors.push(`fonts.${k}: must be a string (font name or path to .ttf)`);
88
+ }
89
+ }
90
+ }
91
+ if (kit.channelName !== undefined && typeof kit.channelName !== "string") {
92
+ errors.push("channelName: must be a string");
93
+ }
94
+ return { ok: errors.length === 0, errors, warnings };
95
+ }
96
+ //# sourceMappingURL=brand-kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-kit.js","sourceRoot":"","sources":["../../src/core/brand-kit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=brand-kit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-kit.test.d.ts","sourceRoot":"","sources":["../../src/core/brand-kit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { mkdtempSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { BRAND_KIT_PATH, loadBrandKit, validateBrandKit } from "./brand-kit.js";
6
+ function makeCwd(brand) {
7
+ const cwd = mkdtempSync(join(tmpdir(), "gg-brandkit-test-"));
8
+ if (brand !== undefined) {
9
+ mkdirSync(join(cwd, ".gg"), { recursive: true });
10
+ writeFileSync(join(cwd, BRAND_KIT_PATH), brand, "utf8");
11
+ }
12
+ return cwd;
13
+ }
14
+ describe("loadBrandKit", () => {
15
+ it("returns null when no brand.json exists", () => {
16
+ const cwd = makeCwd();
17
+ expect(loadBrandKit(cwd)).toBeNull();
18
+ });
19
+ it("returns null on malformed JSON (no throw)", () => {
20
+ const cwd = makeCwd("{ not valid json");
21
+ expect(loadBrandKit(cwd)).toBeNull();
22
+ });
23
+ it("returns null on non-object root (array, primitive)", () => {
24
+ expect(loadBrandKit(makeCwd('["a", "b"]'))).toBeNull();
25
+ expect(loadBrandKit(makeCwd('"string"'))).toBeNull();
26
+ expect(loadBrandKit(makeCwd("42"))).toBeNull();
27
+ });
28
+ it("parses a valid brand kit", () => {
29
+ const cwd = makeCwd(JSON.stringify({
30
+ channelName: "Ken Kai",
31
+ logo: "assets/logo.png",
32
+ fonts: { heading: "Bebas Neue", body: "Inter" },
33
+ colors: { primary: "FF6B35", secondary: "004E89" },
34
+ ctaText: "Subscribe for more",
35
+ }));
36
+ const kit = loadBrandKit(cwd);
37
+ expect(kit?.channelName).toBe("Ken Kai");
38
+ expect(kit?.fonts?.heading).toBe("Bebas Neue");
39
+ expect(kit?.colors?.primary).toBe("FF6B35");
40
+ });
41
+ });
42
+ describe("validateBrandKit", () => {
43
+ const noExist = () => false;
44
+ it("ok=true on empty kit", () => {
45
+ const v = validateBrandKit({}, "/tmp", noExist);
46
+ expect(v.ok).toBe(true);
47
+ expect(v.errors).toEqual([]);
48
+ });
49
+ it("rejects malformed colors", () => {
50
+ const kit = { colors: { primary: "#FF6B35", secondary: "no" } };
51
+ const v = validateBrandKit(kit, "/tmp", noExist);
52
+ expect(v.ok).toBe(false);
53
+ expect(v.errors.find((e) => e.includes("colors.primary"))).toBeTruthy();
54
+ expect(v.errors.find((e) => e.includes("colors.secondary"))).toBeTruthy();
55
+ });
56
+ it("rejects empty path strings", () => {
57
+ const v = validateBrandKit({ logo: "" }, "/tmp", noExist);
58
+ expect(v.ok).toBe(false);
59
+ expect(v.errors.find((e) => e.includes("logo"))).toBeTruthy();
60
+ });
61
+ it("warns on missing referenced files", () => {
62
+ const v = validateBrandKit({ logo: "missing.png" }, "/tmp", noExist);
63
+ expect(v.ok).toBe(true);
64
+ expect(v.warnings.find((w) => w.includes("logo"))).toBeTruthy();
65
+ });
66
+ it("no warning when fileExists returns true", () => {
67
+ const v = validateBrandKit({ logo: "logo.png" }, "/tmp", () => true);
68
+ expect(v.ok).toBe(true);
69
+ expect(v.warnings).toEqual([]);
70
+ });
71
+ it("accepts six-char hex colors (no leading #)", () => {
72
+ const v = validateBrandKit({ colors: { primary: "FFFFFF", accent: "00aaff" } }, "/tmp", noExist);
73
+ expect(v.ok).toBe(true);
74
+ });
75
+ });
76
+ //# sourceMappingURL=brand-kit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-kit.test.js","sourceRoot":"","sources":["../../src/core/brand-kit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Bundled sound-effect library.
3
+ *
4
+ * gg-editor's `add_sfx_at_cuts` needs a WAV/MP3 file per hit. Without this
5
+ * module the agent had to either ask the user to supply one or invent a path
6
+ * — both broke the canonical retention pipeline. Now the agent calls
7
+ * `add_sfx_at_cuts(sfx="whoosh", …)` with a bundled name and the resolver
8
+ * either returns a cached WAV or synthesises one via ffmpeg into
9
+ * `~/.gg/sfx-cache/<name>.wav` (~50 ms one-time per name; cached forever).
10
+ *
11
+ * Why synthesised, not shipped: no third-party files = no IP risk + no npm
12
+ * weight. Every recipe is a pure ffmpeg-lavfi expression so the output is
13
+ * deterministic and reproducible. Quality is "creator-vlog acceptable" —
14
+ * not Skywalker Sound, but indistinguishable from typical CapCut presets in
15
+ * a sub-1-second cut.
16
+ *
17
+ * Design rules for recipes:
18
+ * - Stereo (`-ac 2`) — every consumer mixes into stereo audio.
19
+ * - 200–500 ms long. Anything longer fights the next cut.
20
+ * - Peak ≤ -3 dBFS (the recipes all keep amplitude ≤ 0.7) so
21
+ * `add_sfx_at_cuts`'s default -8 dB gain leaves headroom for voice.
22
+ * - Linear fade in (≥5 ms) + fade out — no clicks at the envelope edges.
23
+ */
24
+ export interface SfxRecipe {
25
+ /** One-line creator description shown in the system prompt + tool description. */
26
+ description: string;
27
+ /**
28
+ * ffmpeg args producing the WAV. The cached output path is appended at
29
+ * synthesis time; recipes should NOT include it themselves.
30
+ */
31
+ args: string[];
32
+ }
33
+ /**
34
+ * The bundled set. Keep this list short and creator-relevant —
35
+ * 8–10 names covers the entire short-form vocabulary.
36
+ */
37
+ export declare const BUNDLED_SFX: Record<string, SfxRecipe>;
38
+ /** Names of every bundled SFX (sorted for stable display). */
39
+ export declare function listBundledSfxNames(): string[];
40
+ /** A short markdown-style list of bundled SFX for tool descriptions / system prompts. */
41
+ export declare function bundledSfxDescriptionList(): string;
42
+ /** Cache dir for synthesised WAVs. Stable across sessions, gitignored by convention. */
43
+ export declare function getSfxCacheDir(): string;
44
+ /**
45
+ * Resolve an SFX argument:
46
+ *
47
+ * - Bundled name (e.g. `"whoosh"`) → cache hit at `~/.gg/sfx-cache/whoosh.wav`,
48
+ * synthesising via ffmpeg on first request.
49
+ * - File-like string (contains `/`, `\`, `.`, `~`) → resolve against `cwd`
50
+ * and return as-is. The caller still has to verify the file exists.
51
+ *
52
+ * Throws when the name is neither bundled nor file-like.
53
+ */
54
+ export declare function resolveSfx(nameOrPath: string, cwd: string, signal?: AbortSignal): Promise<{
55
+ path: string;
56
+ bundled: boolean;
57
+ name?: string;
58
+ }>;
59
+ /**
60
+ * Ensure a bundled SFX is present on disk, synthesising it via ffmpeg if not.
61
+ * Returns the absolute cache path.
62
+ */
63
+ export declare function ensureBundledSfx(name: string, signal?: AbortSignal): Promise<string>;
64
+ //# sourceMappingURL=bundled-sfx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-sfx.d.ts","sourceRoot":"","sources":["../../src/core/bundled-sfx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH,MAAM,WAAW,SAAS;IACxB,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA4HjD,CAAC;AAEF,8DAA8D;AAC9D,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAED,yFAAyF;AACzF,wBAAgB,yBAAyB,IAAI,MAAM,CAIlD;AAED,wFAAwF;AACxF,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB5D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB1F"}