@kenkaiiii/gg-editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (815) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +453 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +173 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/ass.d.ts +75 -0
  8. package/dist/core/ass.d.ts.map +1 -0
  9. package/dist/core/ass.js +128 -0
  10. package/dist/core/ass.js.map +1 -0
  11. package/dist/core/ass.test.d.ts +2 -0
  12. package/dist/core/ass.test.d.ts.map +1 -0
  13. package/dist/core/ass.test.js +112 -0
  14. package/dist/core/ass.test.js.map +1 -0
  15. package/dist/core/audio-cleanup.d.ts +16 -0
  16. package/dist/core/audio-cleanup.d.ts.map +1 -0
  17. package/dist/core/audio-cleanup.js +79 -0
  18. package/dist/core/audio-cleanup.js.map +1 -0
  19. package/dist/core/audio-cleanup.test.d.ts +2 -0
  20. package/dist/core/audio-cleanup.test.d.ts.map +1 -0
  21. package/dist/core/audio-cleanup.test.js +41 -0
  22. package/dist/core/audio-cleanup.test.js.map +1 -0
  23. package/dist/core/audio-mix.d.ts +89 -0
  24. package/dist/core/audio-mix.d.ts.map +1 -0
  25. package/dist/core/audio-mix.js +156 -0
  26. package/dist/core/audio-mix.js.map +1 -0
  27. package/dist/core/audio-mix.test.d.ts +2 -0
  28. package/dist/core/audio-mix.test.d.ts.map +1 -0
  29. package/dist/core/audio-mix.test.js +91 -0
  30. package/dist/core/audio-mix.test.js.map +1 -0
  31. package/dist/core/auth/anthropic.d.ts +4 -0
  32. package/dist/core/auth/anthropic.d.ts.map +1 -0
  33. package/dist/core/auth/anthropic.js +78 -0
  34. package/dist/core/auth/anthropic.js.map +1 -0
  35. package/dist/core/auth/index.d.ts +7 -0
  36. package/dist/core/auth/index.d.ts.map +1 -0
  37. package/dist/core/auth/index.js +6 -0
  38. package/dist/core/auth/index.js.map +1 -0
  39. package/dist/core/auth/login.d.ts +13 -0
  40. package/dist/core/auth/login.d.ts.map +1 -0
  41. package/dist/core/auth/login.js +188 -0
  42. package/dist/core/auth/login.js.map +1 -0
  43. package/dist/core/auth/openai.d.ts +4 -0
  44. package/dist/core/auth/openai.d.ts.map +1 -0
  45. package/dist/core/auth/openai.js +170 -0
  46. package/dist/core/auth/openai.js.map +1 -0
  47. package/dist/core/auth/pkce.d.ts +5 -0
  48. package/dist/core/auth/pkce.d.ts.map +1 -0
  49. package/dist/core/auth/pkce.js +17 -0
  50. package/dist/core/auth/pkce.js.map +1 -0
  51. package/dist/core/auth/storage.d.ts +29 -0
  52. package/dist/core/auth/storage.d.ts.map +1 -0
  53. package/dist/core/auth/storage.js +127 -0
  54. package/dist/core/auth/storage.js.map +1 -0
  55. package/dist/core/auth/types.d.ts +22 -0
  56. package/dist/core/auth/types.d.ts.map +1 -0
  57. package/dist/core/auth/types.js +12 -0
  58. package/dist/core/auth/types.js.map +1 -0
  59. package/dist/core/clustering.d.ts +52 -0
  60. package/dist/core/clustering.d.ts.map +1 -0
  61. package/dist/core/clustering.js +163 -0
  62. package/dist/core/clustering.js.map +1 -0
  63. package/dist/core/clustering.test.d.ts +2 -0
  64. package/dist/core/clustering.test.d.ts.map +1 -0
  65. package/dist/core/clustering.test.js +112 -0
  66. package/dist/core/clustering.test.js.map +1 -0
  67. package/dist/core/color-match.d.ts +19 -0
  68. package/dist/core/color-match.d.ts.map +1 -0
  69. package/dist/core/color-match.js +118 -0
  70. package/dist/core/color-match.js.map +1 -0
  71. package/dist/core/color-match.test.d.ts +2 -0
  72. package/dist/core/color-match.test.d.ts.map +1 -0
  73. package/dist/core/color-match.test.js +40 -0
  74. package/dist/core/color-match.test.js.map +1 -0
  75. package/dist/core/ducking.d.ts +37 -0
  76. package/dist/core/ducking.d.ts.map +1 -0
  77. package/dist/core/ducking.js +71 -0
  78. package/dist/core/ducking.js.map +1 -0
  79. package/dist/core/ducking.test.d.ts +2 -0
  80. package/dist/core/ducking.test.d.ts.map +1 -0
  81. package/dist/core/ducking.test.js +38 -0
  82. package/dist/core/ducking.test.js.map +1 -0
  83. package/dist/core/edl-roundtrip.test.d.ts +2 -0
  84. package/dist/core/edl-roundtrip.test.d.ts.map +1 -0
  85. package/dist/core/edl-roundtrip.test.js +171 -0
  86. package/dist/core/edl-roundtrip.test.js.map +1 -0
  87. package/dist/core/edl.d.ts +41 -0
  88. package/dist/core/edl.d.ts.map +1 -0
  89. package/dist/core/edl.js +56 -0
  90. package/dist/core/edl.js.map +1 -0
  91. package/dist/core/edl.test.d.ts +2 -0
  92. package/dist/core/edl.test.d.ts.map +1 -0
  93. package/dist/core/edl.test.js +62 -0
  94. package/dist/core/edl.test.js.map +1 -0
  95. package/dist/core/envelope-sync.d.ts +52 -0
  96. package/dist/core/envelope-sync.d.ts.map +1 -0
  97. package/dist/core/envelope-sync.js +169 -0
  98. package/dist/core/envelope-sync.js.map +1 -0
  99. package/dist/core/envelope-sync.test.d.ts +2 -0
  100. package/dist/core/envelope-sync.test.d.ts.map +1 -0
  101. package/dist/core/envelope-sync.test.js +70 -0
  102. package/dist/core/envelope-sync.test.js.map +1 -0
  103. package/dist/core/fcpxml-roundtrip.test.d.ts +2 -0
  104. package/dist/core/fcpxml-roundtrip.test.d.ts.map +1 -0
  105. package/dist/core/fcpxml-roundtrip.test.js +251 -0
  106. package/dist/core/fcpxml-roundtrip.test.js.map +1 -0
  107. package/dist/core/fcpxml.d.ts +172 -0
  108. package/dist/core/fcpxml.d.ts.map +1 -0
  109. package/dist/core/fcpxml.js +406 -0
  110. package/dist/core/fcpxml.js.map +1 -0
  111. package/dist/core/fcpxml.test.d.ts +2 -0
  112. package/dist/core/fcpxml.test.d.ts.map +1 -0
  113. package/dist/core/fcpxml.test.js +360 -0
  114. package/dist/core/fcpxml.test.js.map +1 -0
  115. package/dist/core/filler-words.d.ts +107 -0
  116. package/dist/core/filler-words.d.ts.map +1 -0
  117. package/dist/core/filler-words.js +221 -0
  118. package/dist/core/filler-words.js.map +1 -0
  119. package/dist/core/filler-words.test.d.ts +2 -0
  120. package/dist/core/filler-words.test.d.ts.map +1 -0
  121. package/dist/core/filler-words.test.js +177 -0
  122. package/dist/core/filler-words.test.js.map +1 -0
  123. package/dist/core/format.d.ts +36 -0
  124. package/dist/core/format.d.ts.map +1 -0
  125. package/dist/core/format.js +57 -0
  126. package/dist/core/format.js.map +1 -0
  127. package/dist/core/format.test.d.ts +2 -0
  128. package/dist/core/format.test.d.ts.map +1 -0
  129. package/dist/core/format.test.js +81 -0
  130. package/dist/core/format.test.js.map +1 -0
  131. package/dist/core/frames.d.ts +35 -0
  132. package/dist/core/frames.d.ts.map +1 -0
  133. package/dist/core/frames.js +64 -0
  134. package/dist/core/frames.js.map +1 -0
  135. package/dist/core/hook-analysis.d.ts +90 -0
  136. package/dist/core/hook-analysis.d.ts.map +1 -0
  137. package/dist/core/hook-analysis.js +222 -0
  138. package/dist/core/hook-analysis.js.map +1 -0
  139. package/dist/core/hook-analysis.test.d.ts +2 -0
  140. package/dist/core/hook-analysis.test.d.ts.map +1 -0
  141. package/dist/core/hook-analysis.test.js +130 -0
  142. package/dist/core/hook-analysis.test.js.map +1 -0
  143. package/dist/core/hosts/detect.d.ts +17 -0
  144. package/dist/core/hosts/detect.d.ts.map +1 -0
  145. package/dist/core/hosts/detect.js +64 -0
  146. package/dist/core/hosts/detect.js.map +1 -0
  147. package/dist/core/hosts/detect.test.d.ts +2 -0
  148. package/dist/core/hosts/detect.test.d.ts.map +1 -0
  149. package/dist/core/hosts/detect.test.js +17 -0
  150. package/dist/core/hosts/detect.test.js.map +1 -0
  151. package/dist/core/hosts/index.d.ts +13 -0
  152. package/dist/core/hosts/index.d.ts.map +1 -0
  153. package/dist/core/hosts/index.js +30 -0
  154. package/dist/core/hosts/index.js.map +1 -0
  155. package/dist/core/hosts/lazy.d.ts +53 -0
  156. package/dist/core/hosts/lazy.d.ts.map +1 -0
  157. package/dist/core/hosts/lazy.js +125 -0
  158. package/dist/core/hosts/lazy.js.map +1 -0
  159. package/dist/core/hosts/lazy.test.d.ts +2 -0
  160. package/dist/core/hosts/lazy.test.d.ts.map +1 -0
  161. package/dist/core/hosts/lazy.test.js +117 -0
  162. package/dist/core/hosts/lazy.test.js.map +1 -0
  163. package/dist/core/hosts/none/adapter.d.ts +74 -0
  164. package/dist/core/hosts/none/adapter.d.ts.map +1 -0
  165. package/dist/core/hosts/none/adapter.js +99 -0
  166. package/dist/core/hosts/none/adapter.js.map +1 -0
  167. package/dist/core/hosts/premiere/adapter.d.ts +87 -0
  168. package/dist/core/hosts/premiere/adapter.d.ts.map +1 -0
  169. package/dist/core/hosts/premiere/adapter.js +218 -0
  170. package/dist/core/hosts/premiere/adapter.js.map +1 -0
  171. package/dist/core/hosts/premiere/bridge-source.d.ts +26 -0
  172. package/dist/core/hosts/premiere/bridge-source.d.ts.map +1 -0
  173. package/dist/core/hosts/premiere/bridge-source.js +326 -0
  174. package/dist/core/hosts/premiere/bridge-source.js.map +1 -0
  175. package/dist/core/hosts/premiere/bridge-source.test.d.ts +2 -0
  176. package/dist/core/hosts/premiere/bridge-source.test.d.ts.map +1 -0
  177. package/dist/core/hosts/premiere/bridge-source.test.js +36 -0
  178. package/dist/core/hosts/premiere/bridge-source.test.js.map +1 -0
  179. package/dist/core/hosts/premiere/bridge.d.ts +38 -0
  180. package/dist/core/hosts/premiere/bridge.d.ts.map +1 -0
  181. package/dist/core/hosts/premiere/bridge.js +238 -0
  182. package/dist/core/hosts/premiere/bridge.js.map +1 -0
  183. package/dist/core/hosts/premiere/http-bridge.d.ts +47 -0
  184. package/dist/core/hosts/premiere/http-bridge.d.ts.map +1 -0
  185. package/dist/core/hosts/premiere/http-bridge.js +82 -0
  186. package/dist/core/hosts/premiere/http-bridge.js.map +1 -0
  187. package/dist/core/hosts/premiere/http-bridge.test.d.ts +2 -0
  188. package/dist/core/hosts/premiere/http-bridge.test.d.ts.map +1 -0
  189. package/dist/core/hosts/premiere/http-bridge.test.js +113 -0
  190. package/dist/core/hosts/premiere/http-bridge.test.js.map +1 -0
  191. package/dist/core/hosts/premiere/ws-bridge.d.ts +91 -0
  192. package/dist/core/hosts/premiere/ws-bridge.d.ts.map +1 -0
  193. package/dist/core/hosts/premiere/ws-bridge.js +303 -0
  194. package/dist/core/hosts/premiere/ws-bridge.js.map +1 -0
  195. package/dist/core/hosts/premiere/ws-bridge.test.d.ts +2 -0
  196. package/dist/core/hosts/premiere/ws-bridge.test.d.ts.map +1 -0
  197. package/dist/core/hosts/premiere/ws-bridge.test.js +146 -0
  198. package/dist/core/hosts/premiere/ws-bridge.test.js.map +1 -0
  199. package/dist/core/hosts/resolve/adapter.d.ts +99 -0
  200. package/dist/core/hosts/resolve/adapter.d.ts.map +1 -0
  201. package/dist/core/hosts/resolve/adapter.js +187 -0
  202. package/dist/core/hosts/resolve/adapter.js.map +1 -0
  203. package/dist/core/hosts/resolve/bridge-source.d.ts +17 -0
  204. package/dist/core/hosts/resolve/bridge-source.d.ts.map +1 -0
  205. package/dist/core/hosts/resolve/bridge-source.js +660 -0
  206. package/dist/core/hosts/resolve/bridge-source.js.map +1 -0
  207. package/dist/core/hosts/resolve/bridge.d.ts +51 -0
  208. package/dist/core/hosts/resolve/bridge.d.ts.map +1 -0
  209. package/dist/core/hosts/resolve/bridge.integration.test.d.ts +2 -0
  210. package/dist/core/hosts/resolve/bridge.integration.test.d.ts.map +1 -0
  211. package/dist/core/hosts/resolve/bridge.integration.test.js +472 -0
  212. package/dist/core/hosts/resolve/bridge.integration.test.js.map +1 -0
  213. package/dist/core/hosts/resolve/bridge.js +270 -0
  214. package/dist/core/hosts/resolve/bridge.js.map +1 -0
  215. package/dist/core/hosts/resolve/bridge.test.d.ts +2 -0
  216. package/dist/core/hosts/resolve/bridge.test.d.ts.map +1 -0
  217. package/dist/core/hosts/resolve/bridge.test.js +50 -0
  218. package/dist/core/hosts/resolve/bridge.test.js.map +1 -0
  219. package/dist/core/hosts/types.d.ts +167 -0
  220. package/dist/core/hosts/types.d.ts.map +1 -0
  221. package/dist/core/hosts/types.js +27 -0
  222. package/dist/core/hosts/types.js.map +1 -0
  223. package/dist/core/keyframes.d.ts +35 -0
  224. package/dist/core/keyframes.d.ts.map +1 -0
  225. package/dist/core/keyframes.js +90 -0
  226. package/dist/core/keyframes.js.map +1 -0
  227. package/dist/core/keyframes.test.d.ts +2 -0
  228. package/dist/core/keyframes.test.d.ts.map +1 -0
  229. package/dist/core/keyframes.test.js +73 -0
  230. package/dist/core/keyframes.test.js.map +1 -0
  231. package/dist/core/keyword-captions.d.ts +75 -0
  232. package/dist/core/keyword-captions.d.ts.map +1 -0
  233. package/dist/core/keyword-captions.js +285 -0
  234. package/dist/core/keyword-captions.js.map +1 -0
  235. package/dist/core/keyword-captions.test.d.ts +2 -0
  236. package/dist/core/keyword-captions.test.d.ts.map +1 -0
  237. package/dist/core/keyword-captions.test.js +90 -0
  238. package/dist/core/keyword-captions.test.js.map +1 -0
  239. package/dist/core/loudness.d.ts +52 -0
  240. package/dist/core/loudness.d.ts.map +1 -0
  241. package/dist/core/loudness.js +120 -0
  242. package/dist/core/loudness.js.map +1 -0
  243. package/dist/core/loudness.test.d.ts +2 -0
  244. package/dist/core/loudness.test.d.ts.map +1 -0
  245. package/dist/core/loudness.test.js +34 -0
  246. package/dist/core/loudness.test.js.map +1 -0
  247. package/dist/core/marker-colors.d.ts +39 -0
  248. package/dist/core/marker-colors.d.ts.map +1 -0
  249. package/dist/core/marker-colors.js +83 -0
  250. package/dist/core/marker-colors.js.map +1 -0
  251. package/dist/core/marker-colors.test.d.ts +2 -0
  252. package/dist/core/marker-colors.test.d.ts.map +1 -0
  253. package/dist/core/marker-colors.test.js +116 -0
  254. package/dist/core/marker-colors.test.js.map +1 -0
  255. package/dist/core/media/ffmpeg.d.ts +27 -0
  256. package/dist/core/media/ffmpeg.d.ts.map +1 -0
  257. package/dist/core/media/ffmpeg.js +53 -0
  258. package/dist/core/media/ffmpeg.js.map +1 -0
  259. package/dist/core/multicam.d.ts +40 -0
  260. package/dist/core/multicam.d.ts.map +1 -0
  261. package/dist/core/multicam.js +77 -0
  262. package/dist/core/multicam.js.map +1 -0
  263. package/dist/core/multicam.test.d.ts +2 -0
  264. package/dist/core/multicam.test.d.ts.map +1 -0
  265. package/dist/core/multicam.test.js +56 -0
  266. package/dist/core/multicam.test.js.map +1 -0
  267. package/dist/core/punch-in.d.ts +72 -0
  268. package/dist/core/punch-in.d.ts.map +1 -0
  269. package/dist/core/punch-in.js +133 -0
  270. package/dist/core/punch-in.js.map +1 -0
  271. package/dist/core/punch-in.test.d.ts +2 -0
  272. package/dist/core/punch-in.test.d.ts.map +1 -0
  273. package/dist/core/punch-in.test.js +118 -0
  274. package/dist/core/punch-in.test.js.map +1 -0
  275. package/dist/core/reformat.d.ts +26 -0
  276. package/dist/core/reformat.d.ts.map +1 -0
  277. package/dist/core/reformat.js +31 -0
  278. package/dist/core/reformat.js.map +1 -0
  279. package/dist/core/reformat.test.d.ts +2 -0
  280. package/dist/core/reformat.test.d.ts.map +1 -0
  281. package/dist/core/reformat.test.js +29 -0
  282. package/dist/core/reformat.test.js.map +1 -0
  283. package/dist/core/reorder.d.ts +42 -0
  284. package/dist/core/reorder.d.ts.map +1 -0
  285. package/dist/core/reorder.js +80 -0
  286. package/dist/core/reorder.js.map +1 -0
  287. package/dist/core/reorder.test.d.ts +2 -0
  288. package/dist/core/reorder.test.d.ts.map +1 -0
  289. package/dist/core/reorder.test.js +88 -0
  290. package/dist/core/reorder.test.js.map +1 -0
  291. package/dist/core/review.d.ts +38 -0
  292. package/dist/core/review.d.ts.map +1 -0
  293. package/dist/core/review.js +128 -0
  294. package/dist/core/review.js.map +1 -0
  295. package/dist/core/review.test.d.ts +2 -0
  296. package/dist/core/review.test.d.ts.map +1 -0
  297. package/dist/core/review.test.js +76 -0
  298. package/dist/core/review.test.js.map +1 -0
  299. package/dist/core/sessions.d.ts +40 -0
  300. package/dist/core/sessions.d.ts.map +1 -0
  301. package/dist/core/sessions.js +61 -0
  302. package/dist/core/sessions.js.map +1 -0
  303. package/dist/core/sfx-on-cuts.d.ts +60 -0
  304. package/dist/core/sfx-on-cuts.d.ts.map +1 -0
  305. package/dist/core/sfx-on-cuts.js +90 -0
  306. package/dist/core/sfx-on-cuts.js.map +1 -0
  307. package/dist/core/sfx-on-cuts.test.d.ts +2 -0
  308. package/dist/core/sfx-on-cuts.test.d.ts.map +1 -0
  309. package/dist/core/sfx-on-cuts.test.js +53 -0
  310. package/dist/core/sfx-on-cuts.test.js.map +1 -0
  311. package/dist/core/silence.d.ts +41 -0
  312. package/dist/core/silence.d.ts.map +1 -0
  313. package/dist/core/silence.js +104 -0
  314. package/dist/core/silence.js.map +1 -0
  315. package/dist/core/silence.test.d.ts +2 -0
  316. package/dist/core/silence.test.d.ts.map +1 -0
  317. package/dist/core/silence.test.js +143 -0
  318. package/dist/core/silence.test.js.map +1 -0
  319. package/dist/core/skills-loader.d.ts +34 -0
  320. package/dist/core/skills-loader.d.ts.map +1 -0
  321. package/dist/core/skills-loader.js +80 -0
  322. package/dist/core/skills-loader.js.map +1 -0
  323. package/dist/core/skills-loader.test.d.ts +2 -0
  324. package/dist/core/skills-loader.test.d.ts.map +1 -0
  325. package/dist/core/skills-loader.test.js +68 -0
  326. package/dist/core/skills-loader.test.js.map +1 -0
  327. package/dist/core/skin-grade.d.ts +62 -0
  328. package/dist/core/skin-grade.d.ts.map +1 -0
  329. package/dist/core/skin-grade.js +270 -0
  330. package/dist/core/skin-grade.js.map +1 -0
  331. package/dist/core/skin-grade.test.d.ts +2 -0
  332. package/dist/core/skin-grade.test.d.ts.map +1 -0
  333. package/dist/core/skin-grade.test.js +182 -0
  334. package/dist/core/skin-grade.test.js.map +1 -0
  335. package/dist/core/speaker-changes.d.ts +30 -0
  336. package/dist/core/speaker-changes.d.ts.map +1 -0
  337. package/dist/core/speaker-changes.js +19 -0
  338. package/dist/core/speaker-changes.js.map +1 -0
  339. package/dist/core/speaker-changes.test.d.ts +2 -0
  340. package/dist/core/speaker-changes.test.d.ts.map +1 -0
  341. package/dist/core/speaker-changes.test.js +46 -0
  342. package/dist/core/speaker-changes.test.js.map +1 -0
  343. package/dist/core/speed-ramp.d.ts +60 -0
  344. package/dist/core/speed-ramp.d.ts.map +1 -0
  345. package/dist/core/speed-ramp.js +113 -0
  346. package/dist/core/speed-ramp.js.map +1 -0
  347. package/dist/core/speed-ramp.test.d.ts +2 -0
  348. package/dist/core/speed-ramp.test.d.ts.map +1 -0
  349. package/dist/core/speed-ramp.test.js +74 -0
  350. package/dist/core/speed-ramp.test.js.map +1 -0
  351. package/dist/core/srt.d.ts +56 -0
  352. package/dist/core/srt.d.ts.map +1 -0
  353. package/dist/core/srt.js +90 -0
  354. package/dist/core/srt.js.map +1 -0
  355. package/dist/core/srt.test.d.ts +2 -0
  356. package/dist/core/srt.test.d.ts.map +1 -0
  357. package/dist/core/srt.test.js +107 -0
  358. package/dist/core/srt.test.js.map +1 -0
  359. package/dist/core/stabilize.d.ts +15 -0
  360. package/dist/core/stabilize.d.ts.map +1 -0
  361. package/dist/core/stabilize.js +69 -0
  362. package/dist/core/stabilize.js.map +1 -0
  363. package/dist/core/styles-loader.d.ts +33 -0
  364. package/dist/core/styles-loader.d.ts.map +1 -0
  365. package/dist/core/styles-loader.js +67 -0
  366. package/dist/core/styles-loader.js.map +1 -0
  367. package/dist/core/styles-loader.test.d.ts +2 -0
  368. package/dist/core/styles-loader.test.d.ts.map +1 -0
  369. package/dist/core/styles-loader.test.js +72 -0
  370. package/dist/core/styles-loader.test.js.map +1 -0
  371. package/dist/core/text-overlay.d.ts +76 -0
  372. package/dist/core/text-overlay.d.ts.map +1 -0
  373. package/dist/core/text-overlay.js +233 -0
  374. package/dist/core/text-overlay.js.map +1 -0
  375. package/dist/core/text-overlay.test.d.ts +2 -0
  376. package/dist/core/text-overlay.test.d.ts.map +1 -0
  377. package/dist/core/text-overlay.test.js +103 -0
  378. package/dist/core/text-overlay.test.js.map +1 -0
  379. package/dist/core/vision.d.ts +53 -0
  380. package/dist/core/vision.d.ts.map +1 -0
  381. package/dist/core/vision.js +150 -0
  382. package/dist/core/vision.js.map +1 -0
  383. package/dist/core/vision.test.d.ts +2 -0
  384. package/dist/core/vision.test.d.ts.map +1 -0
  385. package/dist/core/vision.test.js +76 -0
  386. package/dist/core/vision.test.js.map +1 -0
  387. package/dist/core/whisper.d.ts +188 -0
  388. package/dist/core/whisper.d.ts.map +1 -0
  389. package/dist/core/whisper.js +380 -0
  390. package/dist/core/whisper.js.map +1 -0
  391. package/dist/core/whisper.test.d.ts +2 -0
  392. package/dist/core/whisper.test.d.ts.map +1 -0
  393. package/dist/core/whisper.test.js +262 -0
  394. package/dist/core/whisper.test.js.map +1 -0
  395. package/dist/director/delegate-tool.d.ts +22 -0
  396. package/dist/director/delegate-tool.d.ts.map +1 -0
  397. package/dist/director/delegate-tool.js +62 -0
  398. package/dist/director/delegate-tool.js.map +1 -0
  399. package/dist/director/delegate-tool.test.d.ts +2 -0
  400. package/dist/director/delegate-tool.test.d.ts.map +1 -0
  401. package/dist/director/delegate-tool.test.js +38 -0
  402. package/dist/director/delegate-tool.test.js.map +1 -0
  403. package/dist/director/director-prompt.d.ts +7 -0
  404. package/dist/director/director-prompt.d.ts.map +1 -0
  405. package/dist/director/director-prompt.js +52 -0
  406. package/dist/director/director-prompt.js.map +1 -0
  407. package/dist/director/director.d.ts +16 -0
  408. package/dist/director/director.d.ts.map +1 -0
  409. package/dist/director/director.js +28 -0
  410. package/dist/director/director.js.map +1 -0
  411. package/dist/director/executor.d.ts +19 -0
  412. package/dist/director/executor.d.ts.map +1 -0
  413. package/dist/director/executor.js +93 -0
  414. package/dist/director/executor.js.map +1 -0
  415. package/dist/director/index.d.ts +6 -0
  416. package/dist/director/index.d.ts.map +1 -0
  417. package/dist/director/index.js +5 -0
  418. package/dist/director/index.js.map +1 -0
  419. package/dist/director/types.d.ts +38 -0
  420. package/dist/director/types.d.ts.map +1 -0
  421. package/dist/director/types.js +2 -0
  422. package/dist/director/types.js.map +1 -0
  423. package/dist/index.d.ts +14 -0
  424. package/dist/index.d.ts.map +1 -0
  425. package/dist/index.js +12 -0
  426. package/dist/index.js.map +1 -0
  427. package/dist/skills.d.ts +18 -0
  428. package/dist/skills.d.ts.map +1 -0
  429. package/dist/skills.js +674 -0
  430. package/dist/skills.js.map +1 -0
  431. package/dist/system-prompt.d.ts +35 -0
  432. package/dist/system-prompt.d.ts.map +1 -0
  433. package/dist/system-prompt.js +478 -0
  434. package/dist/system-prompt.js.map +1 -0
  435. package/dist/system-prompt.test.d.ts +2 -0
  436. package/dist/system-prompt.test.d.ts.map +1 -0
  437. package/dist/system-prompt.test.js +87 -0
  438. package/dist/system-prompt.test.js.map +1 -0
  439. package/dist/tools/add-fades.d.ts +13 -0
  440. package/dist/tools/add-fades.d.ts.map +1 -0
  441. package/dist/tools/add-fades.js +88 -0
  442. package/dist/tools/add-fades.js.map +1 -0
  443. package/dist/tools/add-marker.d.ts +31 -0
  444. package/dist/tools/add-marker.d.ts.map +1 -0
  445. package/dist/tools/add-marker.js +56 -0
  446. package/dist/tools/add-marker.js.map +1 -0
  447. package/dist/tools/add-sfx-at-cuts.d.ts +24 -0
  448. package/dist/tools/add-sfx-at-cuts.d.ts.map +1 -0
  449. package/dist/tools/add-sfx-at-cuts.js +120 -0
  450. package/dist/tools/add-sfx-at-cuts.js.map +1 -0
  451. package/dist/tools/add-track.d.ts +13 -0
  452. package/dist/tools/add-track.d.ts.map +1 -0
  453. package/dist/tools/add-track.js +26 -0
  454. package/dist/tools/add-track.js.map +1 -0
  455. package/dist/tools/analyze-hook.d.ts +28 -0
  456. package/dist/tools/analyze-hook.d.ts.map +1 -0
  457. package/dist/tools/analyze-hook.js +126 -0
  458. package/dist/tools/analyze-hook.js.map +1 -0
  459. package/dist/tools/append-clip.d.ts +10 -0
  460. package/dist/tools/append-clip.d.ts.map +1 -0
  461. package/dist/tools/append-clip.js +27 -0
  462. package/dist/tools/append-clip.js.map +1 -0
  463. package/dist/tools/apply-lut.d.ts +11 -0
  464. package/dist/tools/apply-lut.d.ts.map +1 -0
  465. package/dist/tools/apply-lut.js +33 -0
  466. package/dist/tools/apply-lut.js.map +1 -0
  467. package/dist/tools/burn-subtitles.d.ts +28 -0
  468. package/dist/tools/burn-subtitles.d.ts.map +1 -0
  469. package/dist/tools/burn-subtitles.js +87 -0
  470. package/dist/tools/burn-subtitles.js.map +1 -0
  471. package/dist/tools/clean-audio.d.ts +18 -0
  472. package/dist/tools/clean-audio.d.ts.map +1 -0
  473. package/dist/tools/clean-audio.js +54 -0
  474. package/dist/tools/clean-audio.js.map +1 -0
  475. package/dist/tools/clone-timeline.d.ts +9 -0
  476. package/dist/tools/clone-timeline.d.ts.map +1 -0
  477. package/dist/tools/clone-timeline.js +28 -0
  478. package/dist/tools/clone-timeline.js.map +1 -0
  479. package/dist/tools/cluster-takes.d.ts +11 -0
  480. package/dist/tools/cluster-takes.d.ts.map +1 -0
  481. package/dist/tools/cluster-takes.js +71 -0
  482. package/dist/tools/cluster-takes.js.map +1 -0
  483. package/dist/tools/color-match.d.ts +16 -0
  484. package/dist/tools/color-match.d.ts.map +1 -0
  485. package/dist/tools/color-match.js +55 -0
  486. package/dist/tools/color-match.js.map +1 -0
  487. package/dist/tools/compose-layered.d.ts +47 -0
  488. package/dist/tools/compose-layered.d.ts.map +1 -0
  489. package/dist/tools/compose-layered.js +103 -0
  490. package/dist/tools/compose-layered.js.map +1 -0
  491. package/dist/tools/compose-thumbnail.d.ts +35 -0
  492. package/dist/tools/compose-thumbnail.d.ts.map +1 -0
  493. package/dist/tools/compose-thumbnail.js +130 -0
  494. package/dist/tools/compose-thumbnail.js.map +1 -0
  495. package/dist/tools/concat-videos.d.ts +18 -0
  496. package/dist/tools/concat-videos.d.ts.map +1 -0
  497. package/dist/tools/concat-videos.js +79 -0
  498. package/dist/tools/concat-videos.js.map +1 -0
  499. package/dist/tools/copy-grade.d.ts +10 -0
  500. package/dist/tools/copy-grade.d.ts.map +1 -0
  501. package/dist/tools/copy-grade.js +29 -0
  502. package/dist/tools/copy-grade.js.map +1 -0
  503. package/dist/tools/create-timeline.d.ts +12 -0
  504. package/dist/tools/create-timeline.d.ts.map +1 -0
  505. package/dist/tools/create-timeline.js +35 -0
  506. package/dist/tools/create-timeline.js.map +1 -0
  507. package/dist/tools/crossfade-videos.d.ts +49 -0
  508. package/dist/tools/crossfade-videos.d.ts.map +1 -0
  509. package/dist/tools/crossfade-videos.js +121 -0
  510. package/dist/tools/crossfade-videos.js.map +1 -0
  511. package/dist/tools/cut-at.d.ts +10 -0
  512. package/dist/tools/cut-at.d.ts.map +1 -0
  513. package/dist/tools/cut-at.js +24 -0
  514. package/dist/tools/cut-at.js.map +1 -0
  515. package/dist/tools/cut-filler-words.d.ts +27 -0
  516. package/dist/tools/cut-filler-words.d.ts.map +1 -0
  517. package/dist/tools/cut-filler-words.js +165 -0
  518. package/dist/tools/cut-filler-words.js.map +1 -0
  519. package/dist/tools/detect-silence.d.ts +13 -0
  520. package/dist/tools/detect-silence.d.ts.map +1 -0
  521. package/dist/tools/detect-silence.js +98 -0
  522. package/dist/tools/detect-silence.js.map +1 -0
  523. package/dist/tools/detect-speaker-changes.d.ts +9 -0
  524. package/dist/tools/detect-speaker-changes.d.ts.map +1 -0
  525. package/dist/tools/detect-speaker-changes.js +42 -0
  526. package/dist/tools/detect-speaker-changes.js.map +1 -0
  527. package/dist/tools/dry-run.d.ts +23 -0
  528. package/dist/tools/dry-run.d.ts.map +1 -0
  529. package/dist/tools/dry-run.js +66 -0
  530. package/dist/tools/dry-run.js.map +1 -0
  531. package/dist/tools/dry-run.test.d.ts +2 -0
  532. package/dist/tools/dry-run.test.d.ts.map +1 -0
  533. package/dist/tools/dry-run.test.js +66 -0
  534. package/dist/tools/dry-run.test.js.map +1 -0
  535. package/dist/tools/duck-audio.d.ts +16 -0
  536. package/dist/tools/duck-audio.d.ts.map +1 -0
  537. package/dist/tools/duck-audio.js +73 -0
  538. package/dist/tools/duck-audio.js.map +1 -0
  539. package/dist/tools/extract-audio.d.ts +10 -0
  540. package/dist/tools/extract-audio.d.ts.map +1 -0
  541. package/dist/tools/extract-audio.js +30 -0
  542. package/dist/tools/extract-audio.js.map +1 -0
  543. package/dist/tools/extract-frame.d.ts +12 -0
  544. package/dist/tools/extract-frame.d.ts.map +1 -0
  545. package/dist/tools/extract-frame.js +63 -0
  546. package/dist/tools/extract-frame.js.map +1 -0
  547. package/dist/tools/generate-gif.d.ts +13 -0
  548. package/dist/tools/generate-gif.d.ts.map +1 -0
  549. package/dist/tools/generate-gif.js +94 -0
  550. package/dist/tools/generate-gif.js.map +1 -0
  551. package/dist/tools/get-markers.d.ts +13 -0
  552. package/dist/tools/get-markers.d.ts.map +1 -0
  553. package/dist/tools/get-markers.js +71 -0
  554. package/dist/tools/get-markers.js.map +1 -0
  555. package/dist/tools/get-timeline.d.ts +9 -0
  556. package/dist/tools/get-timeline.d.ts.map +1 -0
  557. package/dist/tools/get-timeline.js +43 -0
  558. package/dist/tools/get-timeline.js.map +1 -0
  559. package/dist/tools/grade-skin-tones.d.ts +31 -0
  560. package/dist/tools/grade-skin-tones.d.ts.map +1 -0
  561. package/dist/tools/grade-skin-tones.js +92 -0
  562. package/dist/tools/grade-skin-tones.js.map +1 -0
  563. package/dist/tools/host-info.d.ts +7 -0
  564. package/dist/tools/host-info.d.ts.map +1 -0
  565. package/dist/tools/host-info.js +33 -0
  566. package/dist/tools/host-info.js.map +1 -0
  567. package/dist/tools/host-tools.test.d.ts +2 -0
  568. package/dist/tools/host-tools.test.d.ts.map +1 -0
  569. package/dist/tools/host-tools.test.js +83 -0
  570. package/dist/tools/host-tools.test.js.map +1 -0
  571. package/dist/tools/import-edl.d.ts +9 -0
  572. package/dist/tools/import-edl.d.ts.map +1 -0
  573. package/dist/tools/import-edl.js +25 -0
  574. package/dist/tools/import-edl.js.map +1 -0
  575. package/dist/tools/import-subtitles.d.ts +9 -0
  576. package/dist/tools/import-subtitles.d.ts.map +1 -0
  577. package/dist/tools/import-subtitles.js +31 -0
  578. package/dist/tools/import-subtitles.js.map +1 -0
  579. package/dist/tools/import-to-media-pool.d.ts +10 -0
  580. package/dist/tools/import-to-media-pool.d.ts.map +1 -0
  581. package/dist/tools/import-to-media-pool.js +27 -0
  582. package/dist/tools/import-to-media-pool.js.map +1 -0
  583. package/dist/tools/index.d.ts +94 -0
  584. package/dist/tools/index.d.ts.map +1 -0
  585. package/dist/tools/index.js +242 -0
  586. package/dist/tools/index.js.map +1 -0
  587. package/dist/tools/index.test.d.ts +2 -0
  588. package/dist/tools/index.test.d.ts.map +1 -0
  589. package/dist/tools/index.test.js +128 -0
  590. package/dist/tools/index.test.js.map +1 -0
  591. package/dist/tools/insert-broll.d.ts +13 -0
  592. package/dist/tools/insert-broll.d.ts.map +1 -0
  593. package/dist/tools/insert-broll.js +56 -0
  594. package/dist/tools/insert-broll.js.map +1 -0
  595. package/dist/tools/ken-burns.d.ts +26 -0
  596. package/dist/tools/ken-burns.d.ts.map +1 -0
  597. package/dist/tools/ken-burns.js +125 -0
  598. package/dist/tools/ken-burns.js.map +1 -0
  599. package/dist/tools/list-render-presets.d.ts +7 -0
  600. package/dist/tools/list-render-presets.d.ts.map +1 -0
  601. package/dist/tools/list-render-presets.js +30 -0
  602. package/dist/tools/list-render-presets.js.map +1 -0
  603. package/dist/tools/match-clip-color.d.ts +29 -0
  604. package/dist/tools/match-clip-color.d.ts.map +1 -0
  605. package/dist/tools/match-clip-color.js +99 -0
  606. package/dist/tools/match-clip-color.js.map +1 -0
  607. package/dist/tools/measure-loudness.d.ts +8 -0
  608. package/dist/tools/measure-loudness.d.ts.map +1 -0
  609. package/dist/tools/measure-loudness.js +40 -0
  610. package/dist/tools/measure-loudness.js.map +1 -0
  611. package/dist/tools/mix-audio.d.ts +46 -0
  612. package/dist/tools/mix-audio.d.ts.map +1 -0
  613. package/dist/tools/mix-audio.js +101 -0
  614. package/dist/tools/mix-audio.js.map +1 -0
  615. package/dist/tools/multicam-sync.d.ts +14 -0
  616. package/dist/tools/multicam-sync.d.ts.map +1 -0
  617. package/dist/tools/multicam-sync.js +75 -0
  618. package/dist/tools/multicam-sync.js.map +1 -0
  619. package/dist/tools/new-tools.test.d.ts +2 -0
  620. package/dist/tools/new-tools.test.d.ts.map +1 -0
  621. package/dist/tools/new-tools.test.js +511 -0
  622. package/dist/tools/new-tools.test.js.map +1 -0
  623. package/dist/tools/normalize-loudness.d.ts +21 -0
  624. package/dist/tools/normalize-loudness.d.ts.map +1 -0
  625. package/dist/tools/normalize-loudness.js +94 -0
  626. package/dist/tools/normalize-loudness.js.map +1 -0
  627. package/dist/tools/open-page.d.ts +17 -0
  628. package/dist/tools/open-page.d.ts.map +1 -0
  629. package/dist/tools/open-page.js +27 -0
  630. package/dist/tools/open-page.js.map +1 -0
  631. package/dist/tools/overlay-watermark.d.ts +28 -0
  632. package/dist/tools/overlay-watermark.d.ts.map +1 -0
  633. package/dist/tools/overlay-watermark.js +98 -0
  634. package/dist/tools/overlay-watermark.js.map +1 -0
  635. package/dist/tools/pick-best-takes.d.ts +20 -0
  636. package/dist/tools/pick-best-takes.d.ts.map +1 -0
  637. package/dist/tools/pick-best-takes.js +147 -0
  638. package/dist/tools/pick-best-takes.js.map +1 -0
  639. package/dist/tools/post-tools.test.d.ts +2 -0
  640. package/dist/tools/post-tools.test.d.ts.map +1 -0
  641. package/dist/tools/post-tools.test.js +83 -0
  642. package/dist/tools/post-tools.test.js.map +1 -0
  643. package/dist/tools/pre-render-check.d.ts +23 -0
  644. package/dist/tools/pre-render-check.d.ts.map +1 -0
  645. package/dist/tools/pre-render-check.js +134 -0
  646. package/dist/tools/pre-render-check.js.map +1 -0
  647. package/dist/tools/probe-media.d.ts +8 -0
  648. package/dist/tools/probe-media.d.ts.map +1 -0
  649. package/dist/tools/probe-media.js +32 -0
  650. package/dist/tools/probe-media.js.map +1 -0
  651. package/dist/tools/punch-in.d.ts +30 -0
  652. package/dist/tools/punch-in.d.ts.map +1 -0
  653. package/dist/tools/punch-in.js +130 -0
  654. package/dist/tools/punch-in.js.map +1 -0
  655. package/dist/tools/read-skill.d.ts +9 -0
  656. package/dist/tools/read-skill.d.ts.map +1 -0
  657. package/dist/tools/read-skill.js +24 -0
  658. package/dist/tools/read-skill.js.map +1 -0
  659. package/dist/tools/read-transcript.d.ts +14 -0
  660. package/dist/tools/read-transcript.d.ts.map +1 -0
  661. package/dist/tools/read-transcript.js +85 -0
  662. package/dist/tools/read-transcript.js.map +1 -0
  663. package/dist/tools/read-transcript.test.d.ts +2 -0
  664. package/dist/tools/read-transcript.test.d.ts.map +1 -0
  665. package/dist/tools/read-transcript.test.js +136 -0
  666. package/dist/tools/read-transcript.test.js.map +1 -0
  667. package/dist/tools/reformat-timeline.d.ts +25 -0
  668. package/dist/tools/reformat-timeline.d.ts.map +1 -0
  669. package/dist/tools/reformat-timeline.js +60 -0
  670. package/dist/tools/reformat-timeline.js.map +1 -0
  671. package/dist/tools/render.d.ts +10 -0
  672. package/dist/tools/render.d.ts.map +1 -0
  673. package/dist/tools/render.js +26 -0
  674. package/dist/tools/render.js.map +1 -0
  675. package/dist/tools/reorder-timeline.d.ts +12 -0
  676. package/dist/tools/reorder-timeline.d.ts.map +1 -0
  677. package/dist/tools/reorder-timeline.js +65 -0
  678. package/dist/tools/reorder-timeline.js.map +1 -0
  679. package/dist/tools/replace-clip.d.ts +10 -0
  680. package/dist/tools/replace-clip.d.ts.map +1 -0
  681. package/dist/tools/replace-clip.js +28 -0
  682. package/dist/tools/replace-clip.js.map +1 -0
  683. package/dist/tools/review-edit.d.ts +23 -0
  684. package/dist/tools/review-edit.d.ts.map +1 -0
  685. package/dist/tools/review-edit.js +47 -0
  686. package/dist/tools/review-edit.js.map +1 -0
  687. package/dist/tools/ripple-delete.d.ts +11 -0
  688. package/dist/tools/ripple-delete.d.ts.map +1 -0
  689. package/dist/tools/ripple-delete.js +27 -0
  690. package/dist/tools/ripple-delete.js.map +1 -0
  691. package/dist/tools/save-project.d.ts +7 -0
  692. package/dist/tools/save-project.d.ts.map +1 -0
  693. package/dist/tools/save-project.js +22 -0
  694. package/dist/tools/save-project.js.map +1 -0
  695. package/dist/tools/score-shot.d.ts +18 -0
  696. package/dist/tools/score-shot.d.ts.map +1 -0
  697. package/dist/tools/score-shot.js +127 -0
  698. package/dist/tools/score-shot.js.map +1 -0
  699. package/dist/tools/set-clip-speed.d.ts +10 -0
  700. package/dist/tools/set-clip-speed.d.ts.map +1 -0
  701. package/dist/tools/set-clip-speed.js +28 -0
  702. package/dist/tools/set-clip-speed.js.map +1 -0
  703. package/dist/tools/set-clip-volume.d.ts +10 -0
  704. package/dist/tools/set-clip-volume.d.ts.map +1 -0
  705. package/dist/tools/set-clip-volume.js +33 -0
  706. package/dist/tools/set-clip-volume.js.map +1 -0
  707. package/dist/tools/set-primary-correction.d.ts +14 -0
  708. package/dist/tools/set-primary-correction.d.ts.map +1 -0
  709. package/dist/tools/set-primary-correction.js +45 -0
  710. package/dist/tools/set-primary-correction.js.map +1 -0
  711. package/dist/tools/smart-reframe.d.ts +22 -0
  712. package/dist/tools/smart-reframe.d.ts.map +1 -0
  713. package/dist/tools/smart-reframe.js +39 -0
  714. package/dist/tools/smart-reframe.js.map +1 -0
  715. package/dist/tools/speed-ramp.d.ts +14 -0
  716. package/dist/tools/speed-ramp.d.ts.map +1 -0
  717. package/dist/tools/speed-ramp.js +71 -0
  718. package/dist/tools/speed-ramp.js.map +1 -0
  719. package/dist/tools/stabilize-video.d.ts +12 -0
  720. package/dist/tools/stabilize-video.d.ts.map +1 -0
  721. package/dist/tools/stabilize-video.js +63 -0
  722. package/dist/tools/stabilize-video.js.map +1 -0
  723. package/dist/tools/transcribe.d.ts +29 -0
  724. package/dist/tools/transcribe.d.ts.map +1 -0
  725. package/dist/tools/transcribe.js +116 -0
  726. package/dist/tools/transcribe.js.map +1 -0
  727. package/dist/tools/transition-videos.d.ts +29 -0
  728. package/dist/tools/transition-videos.d.ts.map +1 -0
  729. package/dist/tools/transition-videos.js +129 -0
  730. package/dist/tools/transition-videos.js.map +1 -0
  731. package/dist/tools/write-ass.d.ts +34 -0
  732. package/dist/tools/write-ass.d.ts.map +1 -0
  733. package/dist/tools/write-ass.js +101 -0
  734. package/dist/tools/write-ass.js.map +1 -0
  735. package/dist/tools/write-edl.d.ts +24 -0
  736. package/dist/tools/write-edl.d.ts.map +1 -0
  737. package/dist/tools/write-edl.js +59 -0
  738. package/dist/tools/write-edl.js.map +1 -0
  739. package/dist/tools/write-fcpxml.d.ts +20 -0
  740. package/dist/tools/write-fcpxml.d.ts.map +1 -0
  741. package/dist/tools/write-fcpxml.js +52 -0
  742. package/dist/tools/write-fcpxml.js.map +1 -0
  743. package/dist/tools/write-keyword-captions.d.ts +36 -0
  744. package/dist/tools/write-keyword-captions.d.ts.map +1 -0
  745. package/dist/tools/write-keyword-captions.js +183 -0
  746. package/dist/tools/write-keyword-captions.js.map +1 -0
  747. package/dist/tools/write-lower-third.d.ts +34 -0
  748. package/dist/tools/write-lower-third.d.ts.map +1 -0
  749. package/dist/tools/write-lower-third.js +52 -0
  750. package/dist/tools/write-lower-third.js.map +1 -0
  751. package/dist/tools/write-srt.d.ts +20 -0
  752. package/dist/tools/write-srt.d.ts.map +1 -0
  753. package/dist/tools/write-srt.js +72 -0
  754. package/dist/tools/write-srt.js.map +1 -0
  755. package/dist/tools/write-title-card.d.ts +25 -0
  756. package/dist/tools/write-title-card.d.ts.map +1 -0
  757. package/dist/tools/write-title-card.js +57 -0
  758. package/dist/tools/write-title-card.js.map +1 -0
  759. package/dist/types.d.ts +83 -0
  760. package/dist/types.d.ts.map +1 -0
  761. package/dist/types.js +3 -0
  762. package/dist/types.js.map +1 -0
  763. package/dist/ui/App.d.ts +44 -0
  764. package/dist/ui/App.d.ts.map +1 -0
  765. package/dist/ui/App.js +454 -0
  766. package/dist/ui/App.js.map +1 -0
  767. package/dist/ui/components/Banner.d.ts +13 -0
  768. package/dist/ui/components/Banner.d.ts.map +1 -0
  769. package/dist/ui/components/Banner.js +59 -0
  770. package/dist/ui/components/Banner.js.map +1 -0
  771. package/dist/ui/components/Footer.d.ts +19 -0
  772. package/dist/ui/components/Footer.d.ts.map +1 -0
  773. package/dist/ui/components/Footer.js +20 -0
  774. package/dist/ui/components/Footer.js.map +1 -0
  775. package/dist/ui/components/Header.d.ts +16 -0
  776. package/dist/ui/components/Header.d.ts.map +1 -0
  777. package/dist/ui/components/Header.js +12 -0
  778. package/dist/ui/components/Header.js.map +1 -0
  779. package/dist/ui/components/InputBox.d.ts +21 -0
  780. package/dist/ui/components/InputBox.d.ts.map +1 -0
  781. package/dist/ui/components/InputBox.js +81 -0
  782. package/dist/ui/components/InputBox.js.map +1 -0
  783. package/dist/ui/components/Message.d.ts +14 -0
  784. package/dist/ui/components/Message.d.ts.map +1 -0
  785. package/dist/ui/components/Message.js +24 -0
  786. package/dist/ui/components/Message.js.map +1 -0
  787. package/dist/ui/components/SlashMenu.d.ts +19 -0
  788. package/dist/ui/components/SlashMenu.d.ts.map +1 -0
  789. package/dist/ui/components/SlashMenu.js +33 -0
  790. package/dist/ui/components/SlashMenu.js.map +1 -0
  791. package/dist/ui/components/SlashMenu.test.d.ts +2 -0
  792. package/dist/ui/components/SlashMenu.test.d.ts.map +1 -0
  793. package/dist/ui/components/SlashMenu.test.js +23 -0
  794. package/dist/ui/components/SlashMenu.test.js.map +1 -0
  795. package/dist/ui/components/Spinner.d.ts +6 -0
  796. package/dist/ui/components/Spinner.d.ts.map +1 -0
  797. package/dist/ui/components/Spinner.js +16 -0
  798. package/dist/ui/components/Spinner.js.map +1 -0
  799. package/dist/ui/components/ToolCallLine.d.ts +16 -0
  800. package/dist/ui/components/ToolCallLine.d.ts.map +1 -0
  801. package/dist/ui/components/ToolCallLine.js +35 -0
  802. package/dist/ui/components/ToolCallLine.js.map +1 -0
  803. package/dist/ui/render.d.ts +9 -0
  804. package/dist/ui/render.d.ts.map +1 -0
  805. package/dist/ui/render.js +56 -0
  806. package/dist/ui/render.js.map +1 -0
  807. package/dist/ui/spinner-frames.d.ts +3 -0
  808. package/dist/ui/spinner-frames.d.ts.map +1 -0
  809. package/dist/ui/spinner-frames.js +16 -0
  810. package/dist/ui/spinner-frames.js.map +1 -0
  811. package/dist/ui/theme.d.ts +27 -0
  812. package/dist/ui/theme.d.ts.map +1 -0
  813. package/dist/ui/theme.js +26 -0
  814. package/dist/ui/theme.js.map +1 -0
  815. package/package.json +50 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 KenKai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,453 @@
1
+ # @kenkaiiii/gg-editor
2
+
3
+ <p align="center">
4
+ <strong>The video editing agent. Drives DaVinci Resolve and Premiere Pro through a single laser-focused tool surface.</strong>
5
+ </p>
6
+
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/@kenkaiiii/gg-editor"><img src="https://img.shields.io/npm/v/@kenkaiiii/gg-editor?style=for-the-badge" alt="npm version"></a>
9
+ <a href="../../LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="MIT License"></a>
10
+ <a href="https://youtube.com/@kenkaidoesai"><img src="https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white" alt="YouTube"></a>
11
+ <a href="https://skool.com/kenkai"><img src="https://img.shields.io/badge/Skool-Community-7C3AED?style=for-the-badge" alt="Skool"></a>
12
+ </p>
13
+
14
+ Built on the [GG Framework](../../README.md). Same agent loop ([`@kenkaiiii/gg-agent`](../gg-agent/README.md)) as ggcoder, completely different tool surface — no `bash`, no `read/write/edit`, no general-purpose coder behaviour. Just video.
15
+
16
+ ---
17
+
18
+ ## Install
19
+
20
+ ```bash
21
+ npm i -g @kenkaiiii/gg-editor
22
+ ggeditor login # if you don't already use ggcoder
23
+ ggeditor
24
+ ```
25
+
26
+ Auth lives in `~/.gg/auth.json` — the **same file ggcoder uses**. If you've already logged into ggcoder, ggeditor uses those credentials automatically. No env vars, no API key flags.
27
+
28
+ It auto-detects whether you have DaVinci Resolve or Premiere Pro open. If neither, it runs in file-only mode (ffmpeg + transcribe + score). All three modes use the same tools and the same agent.
29
+
30
+ ---
31
+
32
+ ## The "AI editor" problem
33
+
34
+ Every "AI video editor" SaaS does the same thing: paste a transcript, watch it produce something generic in a foreign timeline you can't trust. You re-edit it anyway.
35
+
36
+ The actual problem isn't AI editing. It's **AI editing inside the tool you already use**.
37
+
38
+ GG Editor doesn't replace Resolve or Premiere. It drives them. The agent reads your timeline, makes decisions, leaves markers explaining each cut, and hands the project back to you for finishing. Every editorial decision is auditable — the markers ARE the explanation.
39
+
40
+ ---
41
+
42
+ ## What it can actually do
43
+
44
+ ```bash
45
+ ggeditor "cut all silences from podcast.mp4"
46
+ ```
47
+
48
+ Real workflow that runs autonomously:
49
+ 1. Probes the file (`probe_media`)
50
+ 2. Detects silence ranges via ffmpeg (`detect_silence`)
51
+ 3. Writes a CMX 3600 EDL of the keep-ranges (`write_edl`)
52
+ 4. Imports the EDL into Resolve/Premiere (`import_edl`)
53
+ 5. Adds a marker explaining the cleanup (`add_marker`)
54
+
55
+ Total LLM context cost for a 1-hour podcast cleanup: **~600 tokens**. Total wall time: as fast as ffmpeg can read the audio plus one timeline import.
56
+
57
+ ```bash
58
+ ggeditor "from this 2-hour interview, keep only the strongest takes about authentication"
59
+ ```
60
+
61
+ Goes deeper:
62
+ 1. Extracts audio (`extract_audio`)
63
+ 2. Transcribes (`transcribe`) — full transcript saved to disk, summary in context
64
+ 3. Clusters re-takes (`cluster_takes`) — finds where the speaker said the same thing 2-3 times
65
+ 4. Reads only relevant transcript slices (`read_transcript` with filters)
66
+ 5. For borderline takes, scores frames at midpoints (`score_shot`) using a vision model
67
+ 6. Writes EDL with winners + non-clustered keepers
68
+ 7. Imports + adds markers ("kept: 3rd take, clearest delivery", "cut: tangent on tooling")
69
+
70
+ The full transcript stays on disk. The agent only ever pulls slices it actually needs. **A 2-hour transcript that would be ~80K tokens to dump inline becomes ~3K tokens of intelligently-queried context.**
71
+
72
+ ---
73
+
74
+ ## How it works
75
+
76
+ ```
77
+ ┌─────────────────────────────────────────────────────────┐
78
+ │ ggeditor (Ink TUI) │
79
+ │ │ │
80
+ │ ├─ Auto-detect: Resolve / Premiere / none │
81
+ │ │ │
82
+ │ ├─ VideoHost adapter (one interface, three impls) │
83
+ │ │ │ │
84
+ │ │ ├─ Resolve Python sidecar bridge │
85
+ │ │ ├─ Premiere osascript + ExtendScript │
86
+ │ │ └─ None File-only (ffmpeg/whisper) │
87
+ │ │ │
88
+ │ └─ Agent loop (gg-agent) │
89
+ │ │ │
90
+ │ └─ 59 video-only tools │
91
+ │ ├─ Timeline: host_info, get_timeline,│
92
+ │ │ get_markers, cut_at, │
93
+ │ │ ripple_delete, │
94
+ │ │ add_marker, append_clip,│
95
+ │ │ set_clip_speed, │
96
+ │ │ replace_clip, │
97
+ │ │ insert_broll │
98
+ │ ├─ Project: create_timeline, │
99
+ │ │ import_to_media_pool, │
100
+ │ │ open_page (Resolve) │
101
+ │ ├─ Bulk: write_edl, write_fcpxml,│
102
+ │ │ import_edl, │
103
+ │ │ reformat_timeline, │
104
+ │ │ render, │
105
+ │ │ list_render_presets, │
106
+ │ │ smart_reframe (Resolve) │
107
+ │ ├─ Captions: write_srt (sentence + │
108
+ │ │ word-level), │
109
+ │ │ import_subtitles │
110
+ │ ├─ Color: apply_lut, │
111
+ │ │ set_primary_correction, │
112
+ │ │ copy_grade, │
113
+ │ │ color_match (Resolve) │
114
+ │ ├─ Audio: measure_loudness, │
115
+ │ │ normalize_loudness, │
116
+ │ │ clean_audio │
117
+ │ ├─ File: probe_media, extract_ │
118
+ │ │ audio, extract_frame, │
119
+ │ │ detect_silence, │
120
+ │ │ transcribe, read_ │
121
+ │ │ transcript, cluster_ │
122
+ │ │ takes, score_shot, │
123
+ │ │ pick_best_takes, │
124
+ │ │ multicam_sync │
125
+ │ ├─ Review: review_edit │
126
+ │ └─ Skills: read_skill │
127
+ └─────────────────────────────────────────────────────────┘
128
+ ```
129
+
130
+ The agent only sees the `VideoHost` interface. Each adapter reports its capabilities (`canMoveClips`, `canScriptColor`, `canScriptAudio`, `canTriggerAI`, `preferredImportFormat`) and the agent adapts its strategy automatically.
131
+
132
+ When a host can't do something via the live API (Resolve has no scriptable razor, for example), the adapter throws `HostUnsupportedError` and the agent falls back to the bulk path: `write_edl` → `import_edl`. This is the canonical workaround for every per-clip mutation either NLE rejects.
133
+
134
+ ---
135
+
136
+ ## Tool output is for LLMs, not humans
137
+
138
+ This is the design rule that keeps the whole thing fast:
139
+
140
+ | Concern | What we do |
141
+ |---|---|
142
+ | **Successful void op** | returns `"ok"` — 1 token |
143
+ | **Successful state op** | compact JSON, no labels: `{"id":"x","start":0,"end":600}` |
144
+ | **Errors** | one line: `error: <cause>; fix: <next-step>` |
145
+ | **Long lists** | summarized: `{total, omitted, head[], tail[]}` |
146
+ | **Big payloads (transcript)** | written to disk; tool returns summary + path |
147
+
148
+ Token economics for a 50-tool-call edit session: **~3K tokens of tool output**, vs the ~30K-50K typical of "AI video editor" wrappers that dump prose. Means the agent stays sharp for hundreds of decisions in one window.
149
+
150
+ ---
151
+
152
+ ## Setup notes
153
+
154
+ ### Required
155
+ - **Node 18+** and **ffmpeg/ffprobe** on PATH
156
+
157
+ ### For Resolve
158
+ - **DaVinci Resolve Studio** (free version doesn't expose the API externally)
159
+ - **Python 3** on PATH (`python3` / `python` / `py -3` — auto-detected)
160
+ - Resolve must be running with a project + timeline open
161
+ - **Preferences → System → General → External scripting using → Local**
162
+
163
+ ### For Premiere (macOS)
164
+ - **Adobe Premiere Pro** running with an active sequence
165
+ - That's it — uses the built-in `osascript` + ExtendScript
166
+
167
+ ### For Premiere (Windows or macOS)
168
+ - Install the companion panel package: `npm i -g @kenkaiiii/gg-editor-premiere-panel && gg-editor-premiere-panel install`
169
+ - Restart Premiere; open `Window → Extensions → GG Editor`
170
+ - The bridge auto-probes the panel — once it's running, gg-editor uses HTTP transport (faster than osascript)
171
+ - macOS without the panel still works via the built-in osascript fallback
172
+
173
+ ### For transcription
174
+ - **Local** (recommended, free, private): install [whisper.cpp](https://github.com/ggerganov/whisper.cpp), download a `ggml-*.bin` model, pass `modelPath` to the `transcribe` tool
175
+ - **API**: set `OPENAI_API_KEY` — auto-detected fallback
176
+
177
+ ### For vision shot scoring
178
+ - **OpenAI API key** — `score_shot` uses GPT-4o-mini by default (~$0.15 per 1M input tokens)
179
+
180
+ ---
181
+
182
+ ## What it's for (and what it isn't)
183
+
184
+ GG Editor is built around two video-content workflows:
185
+
186
+ - **Long-form** — podcasts, interviews, vlogs, courses, talking-head. The work is silence cuts, take selection, filler removal, chapter markers, captions.
187
+ - **Short-form** — TikTok / Reels / Shorts. The work is finding the moment, reformatting to 9:16, hooking the first 2 seconds, burning captions, rendering.
188
+
189
+ The agent ships with three bundled **skills** (recipes) for these, fetched on demand via `read_skill`: `long-form-content-edit`, `short-form-content-edit`, and `chapter-markers`.
190
+
191
+ ### Persistent style presets
192
+
193
+ For things that should apply to *every* response (your editing voice, default formats, naming conventions): drop a markdown file in either:
194
+ - `<cwd>/.gg/editor-styles/<name>.md` — project-scoped (checked into the repo)
195
+ - `~/.gg/editor-styles/<name>.md` — user-scoped (your personal default)
196
+
197
+ Unlike skills (which are read on-demand), styles fold directly into the system prompt as an "Active style presets" section. Project overrides user (opposite of skills) — the reasoning: a project's checked-in style is the one the team agreed on; a user's home preset defers to project conventions.
198
+
199
+ ### Custom skills
200
+
201
+ Drop your own recipes as `.md` files in either:
202
+ - `<cwd>/.gg/editor-skills/<name>.md` — project-scoped
203
+ - `~/.gg/editor-skills/<name>.md` — user-scoped
204
+
205
+ They get listed in the system prompt with the bundled ones (tagged `(project)` / `(user)`) and load via `read_skill(name="<filename-without-md>")`. The first non-heading line of each file is used as the description. User skills override project; project overrides bundled (silent override — the badge in the prompt makes it explicit).
206
+
207
+ Not in scope: generative video, motion graphics, VFX, animation, complex compositing. If you ask for those, the agent will say so and propose what we CAN do.
208
+
209
+ ---
210
+
211
+ ## Tool catalog
212
+
213
+ | Tool | Tier | What it does |
214
+ |---|---|---|
215
+ | `host_info` | API | Capabilities snapshot. Call first. |
216
+ | `get_timeline` | API | Timeline state, head/tail summarized for long lists |
217
+ | `get_markers` | API | Read existing markers — prior decisions / session resume |
218
+ | `cut_at` | API | Razor (Premiere only — falls back to EDL on Resolve) |
219
+ | `ripple_delete` | API | Delete + close gap (EDL fallback on both NLEs) |
220
+ | `add_marker` | API | Drop a marker with a note (your audit trail) |
221
+ | `append_clip` | API | Most reliable mutation; works on both NLEs |
222
+ | `set_clip_speed` | API | Retime (slow-mo / speed-up). FCPXML rebuild fallback |
223
+ | `create_timeline` | API | New empty timeline / sequence with name + fps + resolution |
224
+ | `import_to_media_pool` | API | Bring files into project bins without appending |
225
+ | `open_page` | API | Switch Resolve workspace (media/edit/color/deliver/...) — Resolve only |
226
+ | `write_edl` | Bulk | CMX 3600 EDL writer — lowest-common-denominator |
227
+ | `write_fcpxml` | Bulk | FCPXML 1.10 — preserves clip names + rational time (preferred for Premiere) |
228
+ | `import_edl` | Bulk | Bulk-import EDL/FCPXML/AAF |
229
+ | `reformat_timeline` | Bulk | Generate 9:16 / 1:1 / 4:5 / 16:9 / 4:3 FCPXML preset for short-form reformat |
230
+ | `render` | API | Resolve only; Premiere uses File → Export manually |
231
+ | `write_srt` | File | SubRip caption writer (1-indexed, `HH:MM:SS,mmm`) |
232
+ | `import_subtitles` | API | Attach SRT to active timeline (Resolve auto; Premiere drag-onto-track) |
233
+ | `clone_timeline` | API | Duplicate the active timeline (safety net before destructive ops) |
234
+ | `save_project` | API | Save the host project (Resolve `pm.SaveProject()`, Premiere `app.project.save()`) |
235
+ | `apply_lut` | API | Apply a .cube/.dat LUT to a clip's grading node (Resolve only) |
236
+ | `set_primary_correction` | API | Slope/offset/power/saturation CDL on a node (Resolve only) |
237
+ | `copy_grade` | API | Copy grade from one clip to many (Resolve only — Color page must be open) |
238
+ | `color_match` | File | Vision-derived CDL: compare reference/target frames → emit slope/offset/power/sat |
239
+ | `replace_clip` | API | Swap a clip's media reference without changing in/out or grade |
240
+ | `insert_broll` | API | Place a cutaway on a higher track at a specific frame, A-roll undisturbed |
241
+ | `smart_reframe` | API | Trigger Resolve Studio's Smart Reframe AI on a clip (Studio only) |
242
+ | `list_render_presets` | API | List the host's render presets (call BEFORE render) |
243
+ | `measure_loudness` | File | EBU R128 read: integrated LUFS, true peak, LRA |
244
+ | `normalize_loudness` | File | Two-pass loudnorm: hits platform target (-14/-16/-23 LUFS) |
245
+ | `clean_audio` | File | Audio cleanup: denoise / denoise-strong / rnnoise / dehum / deess |
246
+ | `duck_audio` | File | Sidechain compress music under voice (podcast / YouTube ducking) |
247
+ | `stabilize_video` | File | Two-pass vidstab stabilization (handheld / gimbal-less footage) |
248
+ | `burn_subtitles` | File | Hardcode .srt/.ass into a video (final-delivery captions) |
249
+ | `concat_videos` | File | Stitch videos end-to-end (lossless concat or re-encode) |
250
+ | `add_fades` | File | Fade-in / fade-out on video + audio |
251
+ | `crossfade_videos` | File | xfade transition between two videos (16 styles) |
252
+ | `generate_gif` | File | Two-pass palettegen GIF for social previews |
253
+ | `overlay_watermark` | File | PNG watermark with corner positioning, opacity, scale |
254
+ | `compose_thumbnail` | File | Frame extract + drawtext headline = YouTube/TikTok thumbnail |
255
+ | `add_track` | API | Append video / audio / subtitle track on the active timeline (Resolve) |
256
+ | `set_clip_volume` | API | Per-clip audio gain in dB (Resolve) |
257
+ | `pre_render_check` | API | Composite QA: empty timeline, PAUSE markers, loudness, captions |
258
+ | `write_ass` | File | Advanced SubStation Alpha subtitle file (font/color/position for burned-in vertical captions) |
259
+ | `extract_frame` | File | Pull a single frame as JPEG/PNG (thumbnails, hero stills) |
260
+ | `probe_media` | File | ffprobe wrapper — duration, fps, codecs |
261
+ | `extract_audio` | File | mono 16kHz WAV via ffmpeg |
262
+ | `detect_silence` | File | ffmpeg `silencedetect`, returns frame-aligned KEEP ranges |
263
+ | `transcribe` | File | whisper.cpp local + OpenAI API fallback |
264
+ | `read_transcript` | File | Query saved transcript by time range or substring |
265
+ | `cluster_takes` | File | Token-similarity grouping of re-takes |
266
+ | `score_shot` | File | Vision model rates frames 0-10 |
267
+ | `pick_best_takes` | File | Composite: cluster + score + winner per cluster (`last`, `first`, or `vision` strategy) |
268
+ | `multicam_sync` | File | Two methods: transient (clap) or envelope (cross-correlation for dialogue) |
269
+ | `detect_speaker_changes` | File | Silence-gap heuristic boundary candidates (v1; not real diarization) |
270
+ | `review_edit` | Review | Spawns a read-only critique agent; returns critique + flags (registered when auth available) |
271
+ | `read_skill` | Skill | Fetch a skill (bundled + project + user recipes) |
272
+
273
+ ---
274
+
275
+ ## Capability matrix
276
+
277
+ | Capability | Resolve | Premiere | None (ffmpeg) |
278
+ |---|---|---|---|
279
+ | `canMoveClips` | ✗ | ✓ | ✗ |
280
+ | `canScriptColor` | ✓ | ✗ | ✗ |
281
+ | `canScriptAudio` | ✗ | partial | ✗ |
282
+ | `canTriggerAI` | partial (Magic Mask) | ✗ | ✗ |
283
+ | Preferred import | EDL | XML/FCPXML | EDL |
284
+
285
+ The genuine gaps are documented honestly in [ROADMAP.md](./ROADMAP.md). Resolve's Fairlight is closed; Premiere's QE DOM is unstable; Magic Mask config can't be triggered from a script. We don't pretend otherwise — we surface clear errors with EDL workarounds.
286
+
287
+ ---
288
+
289
+ ## Workflows
290
+
291
+ ### Silence cut
292
+
293
+ ```
294
+ ggeditor "cut all silences from /path/to/podcast.mp4"
295
+ ```
296
+
297
+ The agent will: probe → detect_silence → write_edl → import_edl → add_marker.
298
+
299
+ ### Take selection (the "extra mile")
300
+
301
+ ```
302
+ ggeditor "from /path/to/interview.mp4, find every place I retook a line and pick the best version"
303
+ ```
304
+
305
+ The agent will: extract_audio → transcribe → cluster_takes → for each cluster, score_shot at midpoints → pick winners → write_edl → import_edl → add_marker per decision.
306
+
307
+ ### Hero frame finder
308
+
309
+ ```
310
+ ggeditor "find me the 5 best frames in /path/to/video.mp4 for thumbnails"
311
+ ```
312
+
313
+ The agent will: probe → score_shot at coarse interval → refine on top region → return timestamps + scores.
314
+
315
+ ### Filter markers
316
+
317
+ ```
318
+ ggeditor "show me only the red 'PAUSE' markers between 02:00 and 04:00"
319
+ ```
320
+
321
+ `get_markers(color="red", contains="PAUSE", startFrame=..., endFrame=...)` — filters server-side so the agent doesn't load every marker into context.
322
+
323
+ ### Real speaker diarization
324
+
325
+ ```
326
+ ggeditor "transcribe interview.mp4 with speaker labels"
327
+ ```
328
+
329
+ With [whisperx](https://github.com/m-bain/whisperx) installed (`pip install whisperx`) and an `HF_TOKEN` env var (free Hugging Face account, accept the pyannote license), `transcribe(diarize=true)` produces real speaker labels. `read_transcript(speaker="SPEAKER_00")` filters by them. Without whisperx, `detect_speaker_changes` provides a silence-gap fallback (clearly-marked candidates, not assignments).
330
+
331
+ ### Music ducking
332
+
333
+ ```
334
+ ggeditor "mix podcast.wav with intro_music.mp3 ducked under the voice"
335
+ ```
336
+
337
+ `duck_audio` runs ffmpeg sidechaincompress (defaults tuned for spoken voice). Standard podcast/YouTube technique.
338
+
339
+ ### Captions (long-form or short-form)
340
+
341
+ ```
342
+ ggeditor "caption this podcast and attach the SRT to the timeline"
343
+ ```
344
+
345
+ Long-form: probe → extract_audio → transcribe → write_srt(cues=...) → import_subtitles. Sidecar SRT.
346
+
347
+ Short-form / TikTok-style burned captions: `transcribe(wordTimestamps=true)` → `read_transcript(includeWords=true)` → `write_srt(words=[...], groupSize=2, gapSec=0.2)` → import_subtitles. One word (or pair) per cue, popping as the speaker says it.
348
+
349
+ Styled burned captions (font / color / outline / position): use `write_ass` instead of `write_srt`. ffmpeg hardcodes them: `ffmpeg -i in.mp4 -vf subtitles=cap.ass -c:a copy out.mp4`.
350
+
351
+ ### Loudness normalization (every long-form deliverable)
352
+
353
+ ```
354
+ ggeditor "normalize this podcast for Spotify"
355
+ ```
356
+
357
+ The agent will: measure_loudness → (optionally) clean_audio → normalize_loudness(platform=spotify). Two-pass loudnorm hits -14 LUFS / -1 dBTP exactly. Skip this and Spotify / YouTube / Apple Podcasts will compress your audio in their own way — you lose dynamic range you didn't choose to give up.
358
+
359
+ ### Chapter markers from a transcript
360
+
361
+ ```
362
+ ggeditor "add YouTube chapters to this 45-min interview"
363
+ ```
364
+
365
+ The agent reads the `chapter-markers` skill and: transcribes → reads transcript in 90s windows looking for topic shifts → places purple markers → emits a YouTube-formatted description block. 5–15 chapters, first at 00:00, ≥30s apart.
366
+
367
+ ### B-roll over filler
368
+
369
+ ```
370
+ ggeditor "cover up the worst three 'um's with cutaways from broll/"
371
+ ```
372
+
373
+ The agent finds the moments with `read_transcript(contains="um", includeWords=true)`, picks the worst 3, and `insert_broll`s them on V2 over the main A-roll.
374
+
375
+ ### Hero thumbnail (with text)
376
+
377
+ ```
378
+ ggeditor "find the best frame in this podcast and make a thumbnail with the headline 'Why most edits fail'"
379
+ ```
380
+
381
+ score_shot at coarse intervals → pick top → compose_thumbnail at that timestamp with the headline. White text + black outline at the bottom by default — readable at thumbnail scale.
382
+
383
+ ### File-only deliverable from a directory of clips
384
+
385
+ ```
386
+ ggeditor "stitch intro.mp4 + main.mp4 + outro.mp4, normalize for YouTube, burn captions.srt, fade in/out 1s, output final.mp4"
387
+ ```
388
+
389
+ concat_videos → normalize_loudness → burn_subtitles → add_fades. Pure ffmpeg pipeline, no NLE needed.
390
+
391
+ ### Reformat for shorts (9:16 / 1:1 / 4:5)
392
+
393
+ ```
394
+ ggeditor "make a 9:16 vertical version of this 5-minute talk"
395
+ ```
396
+
397
+ The agent will: probe → reformat_timeline (9:16 FCPXML) → import_edl → (Resolve) open_page("color") → add_marker prompting Smart Reframe / Auto Reframe per clip → captions. Default short-form aspect is 9:16; ask for 1:1 or 4:5 explicitly.
398
+
399
+ ### Rough cut from a script
400
+
401
+ ```
402
+ ggeditor "build a rough cut from script.txt using these 8 source files"
403
+ ```
404
+
405
+ The agent will: probe each source → transcribe → fuzzy-match each script line against transcripts → create_timeline → import_to_media_pool → write_edl → import_edl → add_marker per segment with the script line.
406
+
407
+ ### File-only batch (no NLE)
408
+
409
+ ```
410
+ ggeditor "transcribe these 12 mp4s in this folder and emit one EDL per file with silences removed"
411
+ ```
412
+
413
+ ---
414
+
415
+ ## Subcommands
416
+
417
+ ```
418
+ ggeditor login Authenticate (OAuth for Anthropic / OpenAI; API key for GLM / Moonshot)
419
+ ggeditor login --provider <p> Skip the picker and login to a specific provider
420
+ ggeditor logout [provider] Clear stored credentials (one provider or all)
421
+ ggeditor auth Show stored credentials + expiry
422
+ ```
423
+
424
+ ## Slash commands (in TUI)
425
+
426
+ | Command | What it does |
427
+ |---|---|
428
+ | `/quit` `/exit` `/q` | Exit cleanly (kills bridges) |
429
+ | `/clear` | Clear visible history (doesn't reset agent context) |
430
+ | `/help` `/?` | Show available commands |
431
+
432
+ ---
433
+
434
+ ## Status
435
+
436
+ **v0.1 — alpha.** Functional end-to-end on macOS with Resolve and Premiere. Resolve is verified via integration tests against a fake `DaVinciResolveScript` module (the wire protocol is identical to the real one). Premiere bridge has parser tests; live runs need a real Premiere installation.
437
+
438
+ Cross-platform: macOS ✓, Linux ✓ (Resolve only — Premiere has no Linux build), Windows ✓ for Resolve / deferred for Premiere (CEP panel needed).
439
+
440
+ See [ROADMAP.md](./ROADMAP.md) for everything that's done, partial, stubbed, or planned. The roadmap doesn't lie — Resolve API limits, Premiere Windows path, vision cost rules, all tracked honestly.
441
+
442
+ ---
443
+
444
+ ## Community
445
+
446
+ - [YouTube @kenkaidoesai](https://youtube.com/@kenkaidoesai) — tutorials and demos
447
+ - [Skool community](https://skool.com/kenkai) — come hang out
448
+
449
+ ---
450
+
451
+ ## License
452
+
453
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env node
2
+ import chalk from "chalk";
3
+ import { getDefaultModel } from "@kenkaiiii/ggcoder/models";
4
+ import { AuthStorage, NotLoggedInError, runLogin, runLogout, runStatus, } from "./core/auth/index.js";
5
+ import { discoverSkills } from "./core/skills-loader.js";
6
+ import { discoverStyles } from "./core/styles-loader.js";
7
+ import { SKILLS } from "./skills.js";
8
+ import { createLazyHost } from "./core/hosts/lazy.js";
9
+ import { hasLastSession, loadLastSession } from "./core/sessions.js";
10
+ import { buildEditorStaticBody, buildEditorSystemPrompt } from "./system-prompt.js";
11
+ import { createEditorTools } from "./tools/index.js";
12
+ import { renderEditorTui } from "./ui/render.js";
13
+ /** Auto-pick order — same priority ggcoder uses for default-provider selection. */
14
+ const PROVIDER_ORDER = [
15
+ "anthropic",
16
+ "openai",
17
+ "glm",
18
+ "moonshot",
19
+ "xiaomi",
20
+ "minimax",
21
+ "deepseek",
22
+ "openrouter",
23
+ ];
24
+ function parseProviderArg(arg) {
25
+ if (!arg)
26
+ return undefined;
27
+ return PROVIDER_ORDER.includes(arg) ? arg : undefined;
28
+ }
29
+ function fail(msg) {
30
+ process.stderr.write(chalk.red(`error: ${msg}\n`));
31
+ process.exit(1);
32
+ }
33
+ function printHelp() {
34
+ process.stdout.write(`ggeditor — video editor agent for DaVinci Resolve and Premiere Pro
35
+
36
+ USAGE
37
+ ggeditor Launch the editor (auto-detects open NLE)
38
+ ggeditor continue Resume the most recent session
39
+ ggeditor login Authenticate
40
+ ggeditor logout Clear credentials
41
+ ggeditor auth Show stored credentials
42
+
43
+ Auth lives in ~/.gg/auth.json — the SAME file ggcoder uses, so logging into
44
+ either CLI works for both.
45
+ `);
46
+ }
47
+ async function pickProvider(auth) {
48
+ for (const p of PROVIDER_ORDER) {
49
+ if (await auth.hasCredentials(p))
50
+ return p;
51
+ }
52
+ return undefined;
53
+ }
54
+ async function main() {
55
+ const args = process.argv.slice(2);
56
+ const sub = args[0];
57
+ if (sub === "-h" || sub === "--help") {
58
+ printHelp();
59
+ return;
60
+ }
61
+ if (sub === "login") {
62
+ await runLogin();
63
+ return;
64
+ }
65
+ if (sub === "logout") {
66
+ await runLogout(parseProviderArg(args[1]));
67
+ return;
68
+ }
69
+ if (sub === "auth" || sub === "status") {
70
+ await runStatus();
71
+ return;
72
+ }
73
+ const isContinue = sub === "continue";
74
+ if (sub && !isContinue) {
75
+ fail(`unknown command: ${sub}\nrun: ggeditor --help`);
76
+ }
77
+ // ── Bare `ggeditor` (or `ggeditor continue`) — interactive TUI ────────
78
+ if (!process.stdin.isTTY) {
79
+ fail("ggeditor requires an interactive terminal");
80
+ }
81
+ const auth = new AuthStorage();
82
+ await auth.load();
83
+ const provider = await pickProvider(auth);
84
+ if (!provider) {
85
+ process.stderr.write(chalk.red("Not logged in.\n") +
86
+ chalk.dim("Run: ggeditor login\n\n") +
87
+ chalk.dim("(Auth is shared with ggcoder via ~/.gg/auth.json — log in once, both CLIs work.)\n"));
88
+ process.exit(1);
89
+ }
90
+ let token;
91
+ try {
92
+ token = await auth.resolveToken(provider);
93
+ }
94
+ catch (e) {
95
+ if (e instanceof NotLoggedInError) {
96
+ process.stderr.write(chalk.red(`${e.message}\n`));
97
+ process.exit(1);
98
+ }
99
+ fail(`auth refresh failed: ${e.message}`);
100
+ }
101
+ const accountId = (await auth.getCredentials(provider))?.accountId;
102
+ // Resume support — if `continue`, load prior messages.
103
+ let priorMessages = [];
104
+ if (isContinue) {
105
+ if (!(await hasLastSession())) {
106
+ process.stderr.write(chalk.yellow("No previous session to continue.\n") +
107
+ chalk.dim("Run `ggeditor` to start a new one.\n"));
108
+ process.exit(1);
109
+ }
110
+ const last = await loadLastSession();
111
+ if (last)
112
+ priorMessages = last.messages;
113
+ }
114
+ // Pick the right model for this provider via ggcoder's registry.
115
+ const model = getDefaultModel(provider).id;
116
+ // All providers the user has logged into — used by /model selector.
117
+ // Same set ggcoder supports.
118
+ const allProviders = await auth.listProviders();
119
+ const loggedInProviders = allProviders.filter((p) => PROVIDER_ORDER.includes(p));
120
+ // Lazy host: re-detects on every tool call (cached for 2s) so opening
121
+ // Resolve / Premiere mid-session is picked up without restarting.
122
+ const host = createLazyHost();
123
+ const caps = await host.capabilities();
124
+ const cwd = process.cwd();
125
+ const skills = discoverSkills({ cwd, bundled: Object.values(SKILLS) });
126
+ const styles = discoverStyles({ cwd });
127
+ // Static body is host-independent and cached for the session. The host
128
+ // block is spliced in at startup and re-spliced by App.tsx whenever the
129
+ // user opens / closes their NLE.
130
+ const staticPromptBody = buildEditorStaticBody(cwd, { skills, styles });
131
+ const system = await buildEditorSystemPrompt(host, cwd, { skills, styles });
132
+ const reviewConfig = provider === "anthropic" ||
133
+ provider === "openai" ||
134
+ provider === "glm" ||
135
+ provider === "moonshot"
136
+ ? { provider, model, apiKey: token, maxTurns: 10 }
137
+ : undefined;
138
+ const tools = createEditorTools({ host, cwd, reviewConfig, skills });
139
+ const cleanup = () => {
140
+ host.shutdown();
141
+ };
142
+ process.on("SIGINT", () => {
143
+ cleanup();
144
+ process.exit(130);
145
+ });
146
+ process.on("exit", cleanup);
147
+ await renderEditorTui({
148
+ provider: provider,
149
+ model,
150
+ apiKey: token,
151
+ accountId,
152
+ tools,
153
+ systemPrompt: system,
154
+ staticPromptBody,
155
+ host,
156
+ priorMessages,
157
+ loggedInProviders,
158
+ hostName: host.name,
159
+ hostDisplayName: host.displayName,
160
+ hostAvailable: caps.isAvailable,
161
+ hostReason: caps.unavailableReason,
162
+ cwd,
163
+ version: "0.1.0",
164
+ persistSessions: true,
165
+ onShutdown: cleanup,
166
+ });
167
+ cleanup();
168
+ }
169
+ main().catch((e) => {
170
+ process.stderr.write(chalk.red(`\nFatal: ${e.message}\n`));
171
+ process.exit(1);
172
+ });
173
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}