@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
@@ -0,0 +1,76 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { clampScore, clampWhy, parseScoreResponse } from "./vision.js";
3
+ describe("parseScoreResponse", () => {
4
+ it("parses a clean JSON array", () => {
5
+ const out = parseScoreResponse('[{"score":9,"why":"sharp eyes"},{"score":3,"why":"blurry"}]', 2);
6
+ expect(out).toEqual([
7
+ { score: 9, why: "sharp eyes" },
8
+ { score: 3, why: "blurry" },
9
+ ]);
10
+ });
11
+ it("unwraps an object containing the array", () => {
12
+ const out = parseScoreResponse('{"shots":[{"score":7,"why":"ok"}]}', 1);
13
+ expect(out).toEqual([{ score: 7, why: "ok" }]);
14
+ });
15
+ it("recovers from prose-wrapped JSON", () => {
16
+ const content = 'Sure! Here are the scores: [{"score":8,"why":"good"}] hope this helps';
17
+ const out = parseScoreResponse(content, 1);
18
+ expect(out).toEqual([{ score: 8, why: "good" }]);
19
+ });
20
+ it("pads missing entries to expected length", () => {
21
+ const out = parseScoreResponse('[{"score":5,"why":"x"}]', 3);
22
+ expect(out).toHaveLength(3);
23
+ expect(out[0]).toEqual({ score: 5, why: "x" });
24
+ expect(out[1]).toEqual({});
25
+ expect(out[2]).toEqual({});
26
+ });
27
+ it("truncates extra entries to expected length", () => {
28
+ const out = parseScoreResponse('[{"score":1,"why":"a"},{"score":2,"why":"b"},{"score":3,"why":"c"}]', 2);
29
+ expect(out).toHaveLength(2);
30
+ });
31
+ it("returns empty objects on invalid input", () => {
32
+ const out = parseScoreResponse("not json at all", 2);
33
+ expect(out).toEqual([{}, {}]);
34
+ });
35
+ });
36
+ describe("clampScore", () => {
37
+ it("keeps scores already in [0, 10]", () => {
38
+ expect(clampScore(0)).toBe(0);
39
+ expect(clampScore(7.4)).toBe(7.4);
40
+ expect(clampScore(10)).toBe(10);
41
+ });
42
+ it("clamps out-of-range scores", () => {
43
+ expect(clampScore(-3)).toBe(0);
44
+ expect(clampScore(99)).toBe(10);
45
+ });
46
+ it("rounds to one decimal place", () => {
47
+ expect(clampScore(7.456)).toBe(7.5);
48
+ expect(clampScore(7.44)).toBe(7.4);
49
+ });
50
+ it("coerces string-numbers (LLMs sometimes wrap numbers in strings)", () => {
51
+ expect(clampScore("8")).toBe(8);
52
+ expect(clampScore("8.7")).toBe(8.7);
53
+ });
54
+ it("defaults non-finite values to 0", () => {
55
+ expect(clampScore(NaN)).toBe(0);
56
+ expect(clampScore(undefined)).toBe(0);
57
+ expect(clampScore(null)).toBe(0);
58
+ expect(clampScore("not a number")).toBe(0);
59
+ });
60
+ });
61
+ describe("clampWhy", () => {
62
+ it("passes short strings unchanged", () => {
63
+ expect(clampWhy("sharp eyes, well-lit")).toBe("sharp eyes, well-lit");
64
+ });
65
+ it("truncates at 80 chars (no ellipsis — caller's choice)", () => {
66
+ const long = "x".repeat(100);
67
+ expect(clampWhy(long)).toHaveLength(80);
68
+ });
69
+ it("collapses non-strings to empty", () => {
70
+ expect(clampWhy(42)).toBe("");
71
+ expect(clampWhy(undefined)).toBe("");
72
+ expect(clampWhy(null)).toBe("");
73
+ expect(clampWhy({ note: "x" })).toBe("");
74
+ });
75
+ });
76
+ //# sourceMappingURL=vision.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision.test.js","sourceRoot":"","sources":["../../src/core/vision.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Whisper transcription backends. Tries local whisper.cpp first (free, fast,
3
+ * private), falls back to the OpenAI API if the binary isn't installed.
4
+ *
5
+ * Both backends normalize to the same shape:
6
+ * { language, duration, segments: [{ start, end, text }] }
7
+ *
8
+ * Word-level timestamps are optional. When `wordTimestamps: true`:
9
+ * - whisper.cpp uses `--max-len 1` to force one-word segments + `-ml 1`
10
+ * - OpenAI verbose_json with `timestamp_granularities[]=word` returns words
11
+ * Both populate `words?: TranscriptWord[]` per segment when supported. When
12
+ * unsupported (older whisper.cpp build) the field is omitted; agents check.
13
+ */
14
+ export interface TranscriptWord {
15
+ start: number;
16
+ end: number;
17
+ text: string;
18
+ }
19
+ export interface TranscriptSegment {
20
+ start: number;
21
+ end: number;
22
+ text: string;
23
+ /** Word-level timing if requested + available. */
24
+ words?: TranscriptWord[];
25
+ /**
26
+ * Speaker label, when present. Populated only when the transcript was
27
+ * produced by a tool that does diarization (whisperx, AssemblyAI, manual).
28
+ * gg-editor's bundled `transcribe` does not produce speaker labels.
29
+ */
30
+ speaker?: string;
31
+ }
32
+ export interface Transcript {
33
+ language: string;
34
+ durationSec: number;
35
+ segments: TranscriptSegment[];
36
+ }
37
+ /**
38
+ * OpenAI transcription model identifiers — see
39
+ * https://platform.openai.com/docs/api-reference/audio/createTranscription.
40
+ *
41
+ * - `whisper-1` Legacy Whisper V2. Only model with `verbose_json` +
42
+ * word/segment timestamp_granularities. Best when you
43
+ * need word-level timing (caption burn-in).
44
+ * - `gpt-4o-transcribe` GPT-4o speech model (~$0.006/min). Higher accuracy.
45
+ * JSON-only response — text + duration only, NO segments.
46
+ * - `gpt-4o-mini-transcribe` Cheaper sibling (~$0.003/min). JSON-only.
47
+ * - `gpt-4o-transcribe-diarize` Built-in speaker diarization. Returns segments with
48
+ * `speaker` labels via `diarized_json`. Replaces the
49
+ * whisperx + HF_TOKEN + pyannote chain. Requires
50
+ * `chunking_strategy: "auto"` for inputs > 30s.
51
+ */
52
+ export type OpenAITranscriptionModel = "whisper-1" | "gpt-4o-transcribe" | "gpt-4o-mini-transcribe" | "gpt-4o-transcribe-diarize";
53
+ export interface TranscribeOptions {
54
+ /** Force a backend; otherwise auto-pick (whisperx if diarize=true, else local first, then api). */
55
+ backend?: "local" | "api" | "whisperx";
56
+ /** Local whisper.cpp model file. Required if backend=local. */
57
+ modelPath?: string;
58
+ /** OpenAI API key (env OPENAI_API_KEY otherwise). */
59
+ apiKey?: string;
60
+ /**
61
+ * OpenAI model id. Default `whisper-1` because it's the only model that
62
+ * returns word/segment timestamps — required by burn_subtitles and the
63
+ * caption pipeline. Pick `gpt-4o-transcribe-diarize` for built-in speaker
64
+ * labels (no whisperx install needed).
65
+ */
66
+ apiModel?: OpenAITranscriptionModel;
67
+ /** ISO-639-1 language code; whisper auto-detects when omitted. */
68
+ language?: string;
69
+ /** Request word-level timestamps. Required for word-by-word burned captions. */
70
+ wordTimestamps?: boolean;
71
+ /**
72
+ * Run speaker diarization. Two paths exist:
73
+ * 1. Set `apiModel: "gpt-4o-transcribe-diarize"` — server-side diarization,
74
+ * no extra dependencies. Recommended.
75
+ * 2. Set `backend: "whisperx"` (or omit and let auto-detect kick in) —
76
+ * local whisperx + pyannote, requires `whisperx` on PATH and HF_TOKEN.
77
+ * The `diarize: true` flag alone routes to whisperx for backwards compat.
78
+ */
79
+ diarize?: boolean;
80
+ /** HF token override (otherwise reads HF_TOKEN env). Used by whisperx --hf_token. */
81
+ hfToken?: string;
82
+ /** whisperx model size. Default "base". */
83
+ whisperxModel?: string;
84
+ /**
85
+ * Server-side audio chunking for the OpenAI gpt-4o-transcribe family. Set to
86
+ * `"auto"` to have the server normalize loudness, run VAD, and chunk the file
87
+ * (up to 1500s for transcribe, 1400s for transcribe-diarize, both within the
88
+ * 25 MB upload cap). Required for `gpt-4o-transcribe-diarize` on inputs > 30s
89
+ * — auto-enabled in that case if you don't set it.
90
+ */
91
+ chunkingStrategy?: "auto";
92
+ /** Abort signal. */
93
+ signal?: AbortSignal;
94
+ }
95
+ export declare function detectLocalWhisper(): {
96
+ cmd: string;
97
+ argsPrefix: string[];
98
+ } | undefined;
99
+ /**
100
+ * Detect whisperx (the diarization-capable wrapper around whisper). It prints
101
+ * its name in --help; we accept either way it might be exposed.
102
+ */
103
+ export declare function detectWhisperx(): boolean;
104
+ export declare function detectApiKey(override?: string): string | undefined;
105
+ export declare function transcribe(inputPath: string, opts?: TranscribeOptions): Promise<Transcript>;
106
+ /**
107
+ * whisper.cpp with -ml=1 emits ONE entry per token. We regroup adjacent tokens
108
+ * back into sentence-ish segments (split at sentence punctuation) and attach
109
+ * the original tokens as the `words` array.
110
+ */
111
+ export declare function regroupTokensIntoSegments(tokens: Array<{
112
+ offsets: {
113
+ from: number;
114
+ to: number;
115
+ };
116
+ text: string;
117
+ }>): TranscriptSegment[];
118
+ export interface WhisperxJson {
119
+ language?: string;
120
+ segments?: Array<{
121
+ start: number;
122
+ end: number;
123
+ text: string;
124
+ speaker?: string;
125
+ words?: Array<{
126
+ start: number;
127
+ end: number;
128
+ word: string;
129
+ speaker?: string;
130
+ }>;
131
+ }>;
132
+ }
133
+ /**
134
+ * Pure-data conversion: whisperx JSON shape → our Transcript shape.
135
+ * Exposed for unit tests; production code reads the file from disk first.
136
+ */
137
+ export declare function whisperxJsonToTranscript(parsed: WhisperxJson, fallbackLanguage?: string): Transcript;
138
+ /**
139
+ * Per-model request shape. The OpenAI transcription API rejects mismatched
140
+ * combinations (e.g. response_format=verbose_json on gpt-4o-transcribe), so we
141
+ * route per model. Pure function — exported for unit tests.
142
+ */
143
+ export interface OpenAIRequestPlan {
144
+ /** What to put in the `response_format` form field. */
145
+ responseFormat: "verbose_json" | "json" | "diarized_json";
146
+ /** True if the model+request supports word-level + segment-level timing. */
147
+ emitsTimestamps: boolean;
148
+ /** True if the response will include speaker labels. */
149
+ emitsSpeakers: boolean;
150
+ /**
151
+ * Effective chunking_strategy to send (or undefined to omit). Auto-enables
152
+ * "auto" for diarize when the caller didn't explicitly set one.
153
+ */
154
+ chunkingStrategy: "auto" | undefined;
155
+ }
156
+ export declare function planOpenAIRequest(model: OpenAITranscriptionModel, opts: Pick<TranscribeOptions, "wordTimestamps" | "chunkingStrategy">): OpenAIRequestPlan;
157
+ /**
158
+ * Response shape covering all three OpenAI variants we route. Optional fields
159
+ * are present on different models:
160
+ * - whisper-1 verbose_json: text, language, duration, segments[], words[]
161
+ * - gpt-4o-(mini-)transcribe json: text, language?, duration?
162
+ * - gpt-4o-transcribe-diarize diarized_json: text, segments[{speaker,start,end,text}]
163
+ */
164
+ interface OpenAITranscriptionResponse {
165
+ text?: string;
166
+ language?: string;
167
+ duration?: number;
168
+ segments?: Array<{
169
+ start: number;
170
+ end: number;
171
+ text: string;
172
+ /** Only on diarized_json. */
173
+ speaker?: string;
174
+ }>;
175
+ /** verbose_json + timestamp_granularities=word. */
176
+ words?: Array<{
177
+ start: number;
178
+ end: number;
179
+ word: string;
180
+ }>;
181
+ }
182
+ /**
183
+ * Pure-data conversion: OpenAI transcription response → our Transcript shape.
184
+ * Exported for unit tests; production code calls this after fetch.
185
+ */
186
+ export declare function openAIResponseToTranscript(data: OpenAITranscriptionResponse, plan: OpenAIRequestPlan, opts: Pick<TranscribeOptions, "language" | "wordTimestamps">): Transcript;
187
+ export {};
188
+ //# sourceMappingURL=whisper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whisper.d.ts","sourceRoot":"","sources":["../../src/core/whisper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,380 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import { createReadStream, mkdtempSync, readdirSync, readFileSync, statSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { basename, join } from "node:path";
5
+ // ── Backend detection ───────────────────────────────────────
6
+ export function detectLocalWhisper() {
7
+ // whisper.cpp ships under several names depending on build:
8
+ // - whisper-cli (modern)
9
+ // - main (legacy whisper.cpp build artifact)
10
+ // - whisper (some distros)
11
+ for (const cmd of ["whisper-cli", "whisper", "main"]) {
12
+ const r = spawnSync(cmd, ["--help"], { encoding: "utf8" });
13
+ if (r.status === 0 && (r.stdout + r.stderr).toLowerCase().includes("whisper")) {
14
+ return { cmd, argsPrefix: [] };
15
+ }
16
+ }
17
+ return undefined;
18
+ }
19
+ /**
20
+ * Detect whisperx (the diarization-capable wrapper around whisper). It prints
21
+ * its name in --help; we accept either way it might be exposed.
22
+ */
23
+ export function detectWhisperx() {
24
+ const r = spawnSync("whisperx", ["--help"], { encoding: "utf8" });
25
+ return r.status === 0;
26
+ }
27
+ export function detectApiKey(override) {
28
+ return override ?? process.env.OPENAI_API_KEY;
29
+ }
30
+ // ── Public dispatcher ───────────────────────────────────────
31
+ export async function transcribe(inputPath, opts = {}) {
32
+ const wantLocal = opts.backend === "local";
33
+ const wantApi = opts.backend === "api";
34
+ const wantWhisperx = opts.backend === "whisperx" || opts.diarize === true;
35
+ // Diarize via OpenAI (gpt-4o-transcribe-diarize) takes precedence over
36
+ // whisperx when explicitly requested by model id — no install needed.
37
+ const wantDiarizeApi = opts.apiModel === "gpt-4o-transcribe-diarize";
38
+ if (wantDiarizeApi) {
39
+ const apiKey = detectApiKey(opts.apiKey);
40
+ if (!apiKey) {
41
+ throw new Error("gpt-4o-transcribe-diarize requires OPENAI_API_KEY. Either set it, " +
42
+ "or set backend: 'whisperx' to diarize locally.");
43
+ }
44
+ return transcribeOpenAI(inputPath, apiKey, opts);
45
+ }
46
+ if (wantWhisperx) {
47
+ if (!detectWhisperx()) {
48
+ throw new Error("whisperx not on PATH. Install: pip install whisperx. " +
49
+ "Diarization also requires HF_TOKEN (free account at huggingface.co). " +
50
+ "Or set apiModel: 'gpt-4o-transcribe-diarize' for server-side diarization.");
51
+ }
52
+ return transcribeWhisperx(inputPath, opts);
53
+ }
54
+ if (!wantApi) {
55
+ const local = detectLocalWhisper();
56
+ if (local && opts.modelPath) {
57
+ return transcribeLocal(inputPath, local.cmd, opts);
58
+ }
59
+ if (wantLocal) {
60
+ throw new Error("whisper.cpp not found or modelPath not set. " +
61
+ "Install whisper.cpp and pass modelPath to ggml-*.bin.");
62
+ }
63
+ }
64
+ const apiKey = detectApiKey(opts.apiKey);
65
+ if (!apiKey) {
66
+ throw new Error("No transcription backend available. " +
67
+ "Either install whisper.cpp + pass modelPath, or set OPENAI_API_KEY.");
68
+ }
69
+ return transcribeOpenAI(inputPath, apiKey, opts);
70
+ }
71
+ // ── Local: whisper.cpp ──────────────────────────────────────
72
+ function transcribeLocal(inputPath, cmd, opts) {
73
+ return new Promise((resolve, reject) => {
74
+ if (!opts.modelPath) {
75
+ reject(new Error("modelPath required for local whisper backend"));
76
+ return;
77
+ }
78
+ const args = [
79
+ "-m",
80
+ opts.modelPath,
81
+ "-f",
82
+ inputPath,
83
+ "-oj", // output JSON
84
+ "-of",
85
+ "/dev/stdout", // some builds ignore -of stdout; we re-derive from stderr if needed
86
+ "-pp", // print progress
87
+ "-nt", // no timestamps in printed text
88
+ ];
89
+ if (opts.language)
90
+ args.push("-l", opts.language);
91
+ if (opts.wordTimestamps) {
92
+ // whisper.cpp emits per-token timestamps in the JSON when -ml=1 forces
93
+ // single-token segments. We post-process to lift them onto words.
94
+ args.push("-ml", "1");
95
+ }
96
+ const child = spawn(cmd, args, { stdio: ["ignore", "pipe", "pipe"] });
97
+ let stdout = "";
98
+ let stderr = "";
99
+ child.stdout.on("data", (d) => (stdout += d.toString()));
100
+ child.stderr.on("data", (d) => (stderr += d.toString()));
101
+ opts.signal?.addEventListener("abort", () => child.kill("SIGTERM"));
102
+ child.on("error", reject);
103
+ child.on("close", (code) => {
104
+ if (code !== 0) {
105
+ reject(new Error(`whisper.cpp exited ${code}: ${stderr.slice(-500)}`));
106
+ return;
107
+ }
108
+ try {
109
+ // whisper.cpp -oj writes a JSON file alongside the input by default;
110
+ // when -of /dev/stdout is honoured, JSON is in stdout. Try both.
111
+ const json = stdout.trim().startsWith("{") ? stdout : (extractJsonBlock(stdout) ?? stderr);
112
+ const parsed = JSON.parse(json);
113
+ const tokens = parsed.transcription ?? [];
114
+ const segments = opts.wordTimestamps
115
+ ? regroupTokensIntoSegments(tokens)
116
+ : tokens.map((t) => ({
117
+ start: t.offsets.from / 1000,
118
+ end: t.offsets.to / 1000,
119
+ text: t.text.trim(),
120
+ }));
121
+ resolve({
122
+ language: parsed.result?.language ?? opts.language ?? "unknown",
123
+ durationSec: tokens[tokens.length - 1]?.offsets.to
124
+ ? tokens[tokens.length - 1].offsets.to / 1000
125
+ : 0,
126
+ segments,
127
+ });
128
+ }
129
+ catch (e) {
130
+ reject(new Error(`failed to parse whisper.cpp JSON: ${e.message}`));
131
+ }
132
+ });
133
+ });
134
+ }
135
+ function extractJsonBlock(s) {
136
+ const open = s.indexOf("{");
137
+ const close = s.lastIndexOf("}");
138
+ if (open >= 0 && close > open)
139
+ return s.slice(open, close + 1);
140
+ return undefined;
141
+ }
142
+ /**
143
+ * whisper.cpp with -ml=1 emits ONE entry per token. We regroup adjacent tokens
144
+ * back into sentence-ish segments (split at sentence punctuation) and attach
145
+ * the original tokens as the `words` array.
146
+ */
147
+ export function regroupTokensIntoSegments(tokens) {
148
+ if (tokens.length === 0)
149
+ return [];
150
+ const segments = [];
151
+ let current = [];
152
+ const flush = () => {
153
+ if (current.length === 0)
154
+ return;
155
+ segments.push({
156
+ start: current[0].start,
157
+ end: current[current.length - 1].end,
158
+ text: current
159
+ .map((w) => w.text)
160
+ .join(" ")
161
+ .replace(/\s+([.,!?;:])/g, "$1")
162
+ .trim(),
163
+ words: current,
164
+ });
165
+ current = [];
166
+ };
167
+ for (const t of tokens) {
168
+ const txt = t.text.trim();
169
+ if (!txt)
170
+ continue;
171
+ current.push({ start: t.offsets.from / 1000, end: t.offsets.to / 1000, text: txt });
172
+ if (/[.!?]$/.test(txt))
173
+ flush();
174
+ }
175
+ flush();
176
+ return segments;
177
+ }
178
+ /**
179
+ * Pure-data conversion: whisperx JSON shape → our Transcript shape.
180
+ * Exposed for unit tests; production code reads the file from disk first.
181
+ */
182
+ export function whisperxJsonToTranscript(parsed, fallbackLanguage = "unknown") {
183
+ const segments = (parsed.segments ?? []).map((s) => ({
184
+ start: s.start,
185
+ end: s.end,
186
+ text: s.text.trim(),
187
+ ...(s.speaker ? { speaker: s.speaker } : {}),
188
+ ...(s.words && s.words.length > 0
189
+ ? {
190
+ words: s.words
191
+ .filter((w) => Number.isFinite(w.start) && Number.isFinite(w.end))
192
+ .map((w) => ({
193
+ start: w.start,
194
+ end: w.end,
195
+ text: w.word.trim(),
196
+ })),
197
+ }
198
+ : {}),
199
+ }));
200
+ return {
201
+ language: parsed.language ?? fallbackLanguage,
202
+ durationSec: segments.at(-1)?.end ?? 0,
203
+ segments,
204
+ };
205
+ }
206
+ function transcribeWhisperx(inputPath, opts) {
207
+ return new Promise((resolve, reject) => {
208
+ const outDir = mkdtempSync(join(tmpdir(), "gg-editor-whisperx-"));
209
+ const args = [
210
+ inputPath,
211
+ "--model",
212
+ opts.whisperxModel ?? "base",
213
+ "--output_format",
214
+ "json",
215
+ "--output_dir",
216
+ outDir,
217
+ ];
218
+ if (opts.diarize)
219
+ args.push("--diarize");
220
+ if (opts.language)
221
+ args.push("--language", opts.language);
222
+ const hfToken = opts.hfToken ?? process.env.HF_TOKEN;
223
+ if (opts.diarize) {
224
+ if (!hfToken) {
225
+ reject(new Error("HF_TOKEN required for diarization. Get one free at huggingface.co/settings/tokens " +
226
+ "and accept the pyannote/speaker-diarization-3.1 license."));
227
+ return;
228
+ }
229
+ args.push("--hf_token", hfToken);
230
+ }
231
+ const child = spawn("whisperx", args, { stdio: ["ignore", "pipe", "pipe"] });
232
+ let stderr = "";
233
+ child.stderr.on("data", (d) => (stderr += d.toString()));
234
+ opts.signal?.addEventListener("abort", () => child.kill("SIGTERM"));
235
+ child.on("error", reject);
236
+ child.on("close", (code) => {
237
+ if (code !== 0) {
238
+ reject(new Error(`whisperx exited ${code}: ${stderr.slice(-500)}`));
239
+ return;
240
+ }
241
+ try {
242
+ // whisperx writes <basename>.json into outDir.
243
+ const files = readdirSync(outDir).filter((f) => f.endsWith(".json"));
244
+ if (files.length === 0) {
245
+ reject(new Error("whisperx produced no JSON output"));
246
+ return;
247
+ }
248
+ const parsed = JSON.parse(readFileSync(join(outDir, files[0]), "utf8"));
249
+ resolve(whisperxJsonToTranscript(parsed, opts.language ?? "unknown"));
250
+ }
251
+ catch (e) {
252
+ reject(new Error(`failed to parse whisperx JSON: ${e.message}`));
253
+ }
254
+ });
255
+ });
256
+ }
257
+ export function planOpenAIRequest(model, opts) {
258
+ switch (model) {
259
+ case "whisper-1":
260
+ // The only model that supports verbose_json + timestamp_granularities.
261
+ return {
262
+ responseFormat: "verbose_json",
263
+ emitsTimestamps: true,
264
+ emitsSpeakers: false,
265
+ chunkingStrategy: opts.chunkingStrategy,
266
+ };
267
+ case "gpt-4o-transcribe":
268
+ case "gpt-4o-mini-transcribe":
269
+ // GPT-4o transcribe family: JSON-only, no segments, no word timestamps.
270
+ // Higher accuracy than whisper-1 but you lose timing — picks like
271
+ // burn_subtitles still want whisper-1.
272
+ return {
273
+ responseFormat: "json",
274
+ emitsTimestamps: false,
275
+ emitsSpeakers: false,
276
+ chunkingStrategy: opts.chunkingStrategy,
277
+ };
278
+ case "gpt-4o-transcribe-diarize":
279
+ // diarized_json is required to receive speaker segments. Server requires
280
+ // chunking_strategy for inputs > 30s — we always send "auto" unless the
281
+ // caller explicitly set a different strategy.
282
+ return {
283
+ responseFormat: "diarized_json",
284
+ emitsTimestamps: true,
285
+ emitsSpeakers: true,
286
+ chunkingStrategy: opts.chunkingStrategy ?? "auto",
287
+ };
288
+ }
289
+ }
290
+ async function transcribeOpenAI(inputPath, apiKey, opts) {
291
+ const stat = statSync(inputPath);
292
+ if (stat.size > 25 * 1024 * 1024) {
293
+ throw new Error(`OpenAI transcription has a 25MB upload cap (got ${(stat.size / 1024 / 1024).toFixed(1)}MB). ` +
294
+ "Compress to mono 16kHz WAV via extract_audio (a 25-min interview fits comfortably). " +
295
+ "chunking_strategy splits long audio server-side but doesn't bypass the upload cap.");
296
+ }
297
+ const model = opts.apiModel ?? "whisper-1";
298
+ const plan = planOpenAIRequest(model, opts);
299
+ // Use native FormData/Blob — Node 20+ has them as globals. Cleaner than
300
+ // hand-rolling multipart, and the openai SDK does the same internally.
301
+ const fileBuf = await streamToBuffer(createReadStream(inputPath));
302
+ const form = new FormData();
303
+ form.append("model", model);
304
+ form.append("response_format", plan.responseFormat);
305
+ if (plan.responseFormat === "verbose_json" && opts.wordTimestamps) {
306
+ form.append("timestamp_granularities[]", "word");
307
+ form.append("timestamp_granularities[]", "segment");
308
+ }
309
+ if (plan.chunkingStrategy) {
310
+ form.append("chunking_strategy", plan.chunkingStrategy);
311
+ }
312
+ if (opts.language && model !== "gpt-4o-transcribe-diarize") {
313
+ // diarize model rejects language; the others accept it.
314
+ form.append("language", opts.language);
315
+ }
316
+ form.append("file", new Blob([new Uint8Array(fileBuf)], { type: "application/octet-stream" }), basename(inputPath));
317
+ const res = await fetch("https://api.openai.com/v1/audio/transcriptions", {
318
+ method: "POST",
319
+ headers: { Authorization: `Bearer ${apiKey}` },
320
+ body: form,
321
+ signal: opts.signal,
322
+ });
323
+ if (!res.ok) {
324
+ const errText = await res.text().catch(() => "");
325
+ throw new Error(`OpenAI transcription HTTP ${res.status} (model=${model}): ${errText.slice(0, 300)}`);
326
+ }
327
+ const data = (await res.json());
328
+ return openAIResponseToTranscript(data, plan, opts);
329
+ }
330
+ /**
331
+ * Pure-data conversion: OpenAI transcription response → our Transcript shape.
332
+ * Exported for unit tests; production code calls this after fetch.
333
+ */
334
+ export function openAIResponseToTranscript(data, plan, opts) {
335
+ // gpt-4o-(mini-)transcribe returns `text` only. Synthesise a single segment
336
+ // covering the whole clip so downstream tools (read_transcript, write_srt)
337
+ // still see *something* useful.
338
+ if (!plan.emitsTimestamps) {
339
+ const text = (data.text ?? "").trim();
340
+ return {
341
+ language: data.language ?? opts.language ?? "unknown",
342
+ durationSec: data.duration ?? 0,
343
+ segments: text ? [{ start: 0, end: data.duration ?? 0, text }] : [],
344
+ };
345
+ }
346
+ const segments = (data.segments ?? []).map((s) => ({
347
+ start: s.start,
348
+ end: s.end,
349
+ text: s.text.trim(),
350
+ ...(plan.emitsSpeakers && s.speaker ? { speaker: s.speaker } : {}),
351
+ }));
352
+ if (opts.wordTimestamps && data.words && segments.length > 0) {
353
+ // Distribute words into the segment whose [start,end] contains the word's
354
+ // midpoint. Linear walk; both arrays are already in order.
355
+ let segIdx = 0;
356
+ for (const w of data.words) {
357
+ const mid = (w.start + w.end) / 2;
358
+ while (segIdx < segments.length - 1 && mid > segments[segIdx].end)
359
+ segIdx += 1;
360
+ const seg = segments[segIdx];
361
+ if (!seg.words)
362
+ seg.words = [];
363
+ seg.words.push({ start: w.start, end: w.end, text: w.word });
364
+ }
365
+ }
366
+ return {
367
+ language: data.language ?? opts.language ?? "unknown",
368
+ durationSec: data.duration ?? segments.at(-1)?.end ?? 0,
369
+ segments,
370
+ };
371
+ }
372
+ function streamToBuffer(stream) {
373
+ return new Promise((resolve, reject) => {
374
+ const chunks = [];
375
+ stream.on("data", (c) => chunks.push(c));
376
+ stream.on("end", () => resolve(Buffer.concat(chunks)));
377
+ stream.on("error", reject);
378
+ });
379
+ }
380
+ //# sourceMappingURL=whisper.js.map