@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,29 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { REFORMAT_PRESETS, reformatSpec } from "./reformat.js";
3
+ describe("reformatSpec", () => {
4
+ it("returns 1080x1920 for 9:16", () => {
5
+ const s = reformatSpec("9:16");
6
+ expect(s.width).toBe(1080);
7
+ expect(s.height).toBe(1920);
8
+ });
9
+ it("returns square 1080x1080 for 1:1", () => {
10
+ expect(reformatSpec("1:1")).toMatchObject({ width: 1080, height: 1080 });
11
+ });
12
+ it("returns 1080x1350 for 4:5 portrait", () => {
13
+ expect(reformatSpec("4:5")).toMatchObject({ width: 1080, height: 1350 });
14
+ });
15
+ it("returns 1920x1080 for 16:9", () => {
16
+ expect(reformatSpec("16:9")).toMatchObject({ width: 1920, height: 1080 });
17
+ });
18
+ it("returns 1440x1080 for 4:3", () => {
19
+ expect(reformatSpec("4:3")).toMatchObject({ width: 1440, height: 1080 });
20
+ });
21
+ it("throws on unknown preset", () => {
22
+ // @ts-expect-error invalid preset for testing
23
+ expect(() => reformatSpec("bogus")).toThrow(/unknown reformat preset/);
24
+ });
25
+ it("exposes a stable preset list", () => {
26
+ expect(REFORMAT_PRESETS).toEqual(["9:16", "1:1", "4:5", "16:9", "4:3"]);
27
+ });
28
+ });
29
+ //# sourceMappingURL=reformat.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reformat.test.js","sourceRoot":"","sources":["../../src/core/reformat.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE/D,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,8CAA8C;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Timeline reordering — turn a current TimelineState + an agent-supplied
3
+ * permutation into a list of FCPXML events that the host can re-import.
4
+ *
5
+ * Why this exists: neither Resolve nor Premiere expose a scriptable "move
6
+ * clip from index N to index M" call. The portable workaround is to rebuild
7
+ * the timeline as FCPXML and import it. This module is the pure, testable
8
+ * core of that workaround.
9
+ *
10
+ * Ordering rules:
11
+ * - Only video clips are reorderable (audio rides along with each video
12
+ * clip's underlying asset). Audio-only timelines are out of scope here.
13
+ * - `newOrder` is a list of clip IDs in the desired new order. Clips not
14
+ * listed keep their original relative order and stack at the end.
15
+ * - Throws if newOrder references a clipId that doesn't exist on the
16
+ * current timeline (typo guard — silently dropping is worse).
17
+ */
18
+ import type { TimelineState } from "../types.js";
19
+ import type { FcpxmlEvent } from "./fcpxml.js";
20
+ export interface ReorderInput {
21
+ /** Current timeline state from host.getTimeline(). */
22
+ current: TimelineState;
23
+ /**
24
+ * Desired new order, as a list of clipIds. IDs not present here keep their
25
+ * original relative order and append at the end.
26
+ */
27
+ newOrder: string[];
28
+ /**
29
+ * Map from clipId to absolute source media path. Required because
30
+ * TimelineState's ClipInfo has an OPTIONAL sourcePath — when the host
31
+ * adapter can't resolve it (e.g. CEP fallback), the agent supplies it.
32
+ * If a ClipInfo already has sourcePath, the map entry is optional.
33
+ */
34
+ sourcePathByClipId?: Record<string, string>;
35
+ }
36
+ /**
37
+ * Build the FcpxmlEvent[] list for the reordered timeline. Each event maps
38
+ * to one video clip in the new order. Sequential record offsets are computed
39
+ * by the FCPXML emitter (we don't pre-compute them here — that's its job).
40
+ */
41
+ export declare function reorderToEvents(input: ReorderInput): FcpxmlEvent[];
42
+ //# sourceMappingURL=reorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder.d.ts","sourceRoot":"","sources":["../../src/core/reorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,OAAO,EAAE,aAAa,CAAC;IACvB;;;OAGG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,EAAE,CA6DlE"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Timeline reordering — turn a current TimelineState + an agent-supplied
3
+ * permutation into a list of FCPXML events that the host can re-import.
4
+ *
5
+ * Why this exists: neither Resolve nor Premiere expose a scriptable "move
6
+ * clip from index N to index M" call. The portable workaround is to rebuild
7
+ * the timeline as FCPXML and import it. This module is the pure, testable
8
+ * core of that workaround.
9
+ *
10
+ * Ordering rules:
11
+ * - Only video clips are reorderable (audio rides along with each video
12
+ * clip's underlying asset). Audio-only timelines are out of scope here.
13
+ * - `newOrder` is a list of clip IDs in the desired new order. Clips not
14
+ * listed keep their original relative order and stack at the end.
15
+ * - Throws if newOrder references a clipId that doesn't exist on the
16
+ * current timeline (typo guard — silently dropping is worse).
17
+ */
18
+ /**
19
+ * Build the FcpxmlEvent[] list for the reordered timeline. Each event maps
20
+ * to one video clip in the new order. Sequential record offsets are computed
21
+ * by the FCPXML emitter (we don't pre-compute them here — that's its job).
22
+ */
23
+ export function reorderToEvents(input) {
24
+ const { current, newOrder, sourcePathByClipId = {} } = input;
25
+ // Filter to video-track clips only; audio-only timelines aren't supported
26
+ // by this rebuild path. Order by track then start so the input is stable.
27
+ const videoClips = current.clips
28
+ .filter((c) => c.trackKind === "video")
29
+ .sort((a, b) => a.track - b.track || a.startFrame - b.startFrame);
30
+ const byId = new Map();
31
+ for (const c of videoClips)
32
+ byId.set(c.id, c);
33
+ // Validate newOrder
34
+ for (const id of newOrder) {
35
+ if (!byId.has(id)) {
36
+ throw new Error(`reorder: clipId not found on current timeline: ${id}`);
37
+ }
38
+ }
39
+ const seen = new Set();
40
+ const ordered = [];
41
+ // First the explicitly-listed IDs, in the supplied order.
42
+ for (const id of newOrder) {
43
+ if (seen.has(id))
44
+ continue;
45
+ seen.add(id);
46
+ ordered.push(byId.get(id));
47
+ }
48
+ // Then anything not mentioned, preserving its original position relative
49
+ // to other unmentioned clips.
50
+ for (const c of videoClips) {
51
+ if (!seen.has(c.id)) {
52
+ seen.add(c.id);
53
+ ordered.push(c);
54
+ }
55
+ }
56
+ // Map each clip to an FcpxmlEvent. The reel = the source path so multiple
57
+ // clips from the same source share an asset in the emitted FCPXML.
58
+ return ordered.map((c, i) => {
59
+ const sourcePath = sourcePathByClipId[c.id] ?? c.sourcePath;
60
+ if (!sourcePath) {
61
+ throw new Error(`reorder: missing sourcePath for clip ${c.id}; pass sourcePathByClipId or ensure host returns it`);
62
+ }
63
+ const dur = c.endFrame - c.startFrame;
64
+ if (dur <= 0) {
65
+ throw new Error(`reorder: clip ${c.id} has non-positive duration`);
66
+ }
67
+ return {
68
+ reel: sourcePath,
69
+ sourcePath,
70
+ // Record-time start/end on the OLD timeline. We treat the original
71
+ // record start as the source-in for the rebuilt timeline so the clip
72
+ // body stays identical; offset on the spine is recomputed by the
73
+ // FCPXML emitter.
74
+ sourceInFrame: c.startFrame,
75
+ sourceOutFrame: c.endFrame,
76
+ clipName: c.name || `clip ${i + 1}`,
77
+ };
78
+ });
79
+ }
80
+ //# sourceMappingURL=reorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder.js","sourceRoot":"","sources":["../../src/core/reorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAsBH;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAmB;IACjD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;IAE7D,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC;SACtC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAEpE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAE9C,oBAAoB;IACpB,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,kDAAkD,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,0DAA0D;IAC1D,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC;IAC9B,CAAC;IACD,yEAAyE;IACzE,8BAA8B;IAC9B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,mEAAmE;IACnE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,UAAU,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;QAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,wCAAwC,CAAC,CAAC,EAAE,qDAAqD,CAClG,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC;QACtC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;QACrE,CAAC;QACD,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,UAAU;YACV,mEAAmE;YACnE,qEAAqE;YACrE,iEAAiE;YACjE,kBAAkB;YAClB,aAAa,EAAE,CAAC,CAAC,UAAU;YAC3B,cAAc,EAAE,CAAC,CAAC,QAAQ;YAC1B,QAAQ,EAAE,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reorder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder.test.d.ts","sourceRoot":"","sources":["../../src/core/reorder.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { reorderToEvents } from "./reorder.js";
3
+ function makeTimeline() {
4
+ return {
5
+ name: "test",
6
+ frameRate: 30,
7
+ durationFrames: 300,
8
+ clips: [
9
+ {
10
+ id: "c1",
11
+ track: 1,
12
+ trackKind: "video",
13
+ startFrame: 0,
14
+ endFrame: 60,
15
+ name: "first",
16
+ sourcePath: "/a.mov",
17
+ },
18
+ {
19
+ id: "c2",
20
+ track: 1,
21
+ trackKind: "video",
22
+ startFrame: 60,
23
+ endFrame: 120,
24
+ name: "second",
25
+ sourcePath: "/b.mov",
26
+ },
27
+ {
28
+ id: "c3",
29
+ track: 1,
30
+ trackKind: "video",
31
+ startFrame: 120,
32
+ endFrame: 180,
33
+ name: "third",
34
+ sourcePath: "/c.mov",
35
+ },
36
+ ],
37
+ markers: [],
38
+ };
39
+ }
40
+ describe("reorderToEvents", () => {
41
+ it("identity reorder preserves original sequence", () => {
42
+ const t = makeTimeline();
43
+ const events = reorderToEvents({ current: t, newOrder: ["c1", "c2", "c3"] });
44
+ expect(events.map((e) => e.clipName)).toEqual(["first", "second", "third"]);
45
+ });
46
+ it("full reverse reorder", () => {
47
+ const t = makeTimeline();
48
+ const events = reorderToEvents({ current: t, newOrder: ["c3", "c2", "c1"] });
49
+ expect(events.map((e) => e.clipName)).toEqual(["third", "second", "first"]);
50
+ });
51
+ it("partial reorder appends missing clips at the end in original order", () => {
52
+ const t = makeTimeline();
53
+ const events = reorderToEvents({ current: t, newOrder: ["c2"] });
54
+ // c2 first, then c1 + c3 in their original order.
55
+ expect(events.map((e) => e.clipName)).toEqual(["second", "first", "third"]);
56
+ });
57
+ it("throws when newOrder references unknown clipId", () => {
58
+ const t = makeTimeline();
59
+ expect(() => reorderToEvents({ current: t, newOrder: ["c1", "no-such"] })).toThrow(/not found/);
60
+ });
61
+ it("ignores audio-track clips entirely", () => {
62
+ const t = makeTimeline();
63
+ t.clips.push({
64
+ id: "audioOnly",
65
+ track: 1,
66
+ trackKind: "audio",
67
+ startFrame: 0,
68
+ endFrame: 100,
69
+ name: "voice",
70
+ sourcePath: "/voice.wav",
71
+ });
72
+ const events = reorderToEvents({ current: t, newOrder: ["c1", "c2", "c3"] });
73
+ expect(events).toHaveLength(3);
74
+ expect(events.find((e) => e.reel === "/voice.wav")).toBeUndefined();
75
+ });
76
+ it("uses sourcePathByClipId override when ClipInfo lacks sourcePath", () => {
77
+ const t = makeTimeline();
78
+ t.clips[0].sourcePath = undefined;
79
+ const events = reorderToEvents({
80
+ current: t,
81
+ newOrder: ["c1"],
82
+ sourcePathByClipId: { c1: "/override.mov" },
83
+ });
84
+ expect(events[0].reel).toBe("/override.mov");
85
+ expect(events[0].sourcePath).toBe("/override.mov");
86
+ });
87
+ });
88
+ //# sourceMappingURL=reorder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder.test.js","sourceRoot":"","sources":["../../src/core/reorder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { Usage } from "@kenkaiiii/gg-ai";
2
+ import type { VideoHost } from "./hosts/types.js";
3
+ export interface ReviewFlag {
4
+ severity: "ok" | "warn" | "block";
5
+ note: string;
6
+ }
7
+ export interface ReviewOptions {
8
+ /** What the edit is FOR. The reviewer measures against this. */
9
+ intent: string;
10
+ /** Optional aspects to focus on. */
11
+ focus?: Array<"pacing" | "takes" | "audio" | "captions" | "hook" | "color">;
12
+ host: VideoHost;
13
+ cwd: string;
14
+ config: {
15
+ provider: "anthropic" | "openai" | "glm" | "moonshot";
16
+ model: string;
17
+ apiKey: string;
18
+ maxTurns?: number;
19
+ };
20
+ signal?: AbortSignal;
21
+ }
22
+ export interface ReviewResult {
23
+ critique: string;
24
+ flags: ReviewFlag[];
25
+ turns: number;
26
+ usage: Usage;
27
+ }
28
+ export declare function runReview(opts: ReviewOptions): Promise<ReviewResult>;
29
+ /**
30
+ * Parse the trailing ```json {...} ``` block out of the final assistant message.
31
+ * The text BEFORE the JSON block becomes the critique. On parse failure, the
32
+ * whole message is returned as critique with empty flags.
33
+ */
34
+ export declare function parseReviewMessage(text: string): {
35
+ critique: string;
36
+ flags: ReviewFlag[];
37
+ };
38
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/core/review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAyBlD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAC5E,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE;QACN,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;QACtD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;CACd;AA6BD,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAmD1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CA2B1F"}
@@ -0,0 +1,128 @@
1
+ import { Agent } from "@kenkaiiii/gg-agent";
2
+ import { createEditorTools } from "../tools/index.js";
3
+ /**
4
+ * Self-critique pass over the timeline + transcripts.
5
+ *
6
+ * Runs a fresh Agent with a READ-ONLY subset of editor tools and a critique
7
+ * prompt. The reviewer inspects the current state against the user's stated
8
+ * intent and returns a one-paragraph critique + a structured flags array.
9
+ *
10
+ * Token cost: a sub-agent over many turns can burn context; we cap at
11
+ * maxTurns=10 by default.
12
+ */
13
+ /** Tools the reviewer is allowed to call. Strictly read-only. */
14
+ const READ_ONLY_TOOL_NAMES = new Set([
15
+ "host_info",
16
+ "get_timeline",
17
+ "get_markers",
18
+ "read_transcript",
19
+ "score_shot",
20
+ "probe_media",
21
+ "read_skill",
22
+ ]);
23
+ const REVIEW_SYSTEM = `You are the GG Editor REVIEWER — a read-only critic of an edit-in-progress.
24
+
25
+ Your job: read the timeline + relevant transcripts/media, measure them against the stated INTENT, and write a tight critique.
26
+
27
+ You have READ-ONLY tools (host_info, get_timeline, get_markers, read_transcript, score_shot, probe_media, read_skill). You CANNOT mutate the timeline or write files. Don't try.
28
+
29
+ Process:
30
+ 1. Call host_info, get_timeline, get_markers to read state.
31
+ 2. If there's a transcript, read targeted windows (NEVER full dumps).
32
+ 3. Optionally score a few shots.
33
+ 4. Form an opinion. Be concrete: timestamps, clip ids, specific issues.
34
+
35
+ OUTPUT FORMAT — your final assistant message must end with this EXACT structure:
36
+
37
+ <one paragraph of critique, ≤200 words, plain prose>
38
+
39
+ \`\`\`json
40
+ {"flags":[{"severity":"ok|warn|block","note":"..."}, ...]}
41
+ \`\`\`
42
+
43
+ severity:
44
+ - ok: nothing wrong; affirmation of a good editorial choice
45
+ - warn: needs attention but not blocking (filler still present, caption typo)
46
+ - block: ship-stopper (wrong take kept, missing captions on long-form, hook missing)
47
+
48
+ Be direct. Don't praise the work just to be nice. If it's good, say "ok". If it's not, say what's wrong.`;
49
+ export async function runReview(opts) {
50
+ const { intent, focus, host, cwd, config, signal } = opts;
51
+ // Build the read-only tool subset by name-allowlist filter.
52
+ const allTools = createEditorTools({ host, cwd });
53
+ const tools = allTools.filter((t) => READ_ONLY_TOOL_NAMES.has(t.name));
54
+ const userPrompt = [
55
+ `INTENT: ${intent}`,
56
+ focus && focus.length > 0 ? `FOCUS: ${focus.join(", ")}` : null,
57
+ "",
58
+ "Inspect the current edit and produce a one-paragraph critique followed by the flags JSON block as instructed.",
59
+ ]
60
+ .filter(Boolean)
61
+ .join("\n");
62
+ const agent = new Agent({
63
+ provider: config.provider,
64
+ model: config.model,
65
+ system: REVIEW_SYSTEM,
66
+ tools,
67
+ apiKey: config.apiKey,
68
+ maxTurns: config.maxTurns ?? 10,
69
+ signal,
70
+ });
71
+ let bufText = "";
72
+ let lastAssistantText = "";
73
+ let turns = 0;
74
+ const usage = { inputTokens: 0, outputTokens: 0 };
75
+ for await (const ev of agent.prompt(userPrompt)) {
76
+ switch (ev.type) {
77
+ case "text_delta":
78
+ bufText += ev.text;
79
+ break;
80
+ case "turn_end":
81
+ turns += 1;
82
+ if (bufText.trim().length > 0)
83
+ lastAssistantText = bufText;
84
+ bufText = "";
85
+ usage.inputTokens = (usage.inputTokens ?? 0) + (ev.usage.inputTokens ?? 0);
86
+ usage.outputTokens = (usage.outputTokens ?? 0) + (ev.usage.outputTokens ?? 0);
87
+ break;
88
+ case "agent_done":
89
+ if (bufText.trim().length > 0)
90
+ lastAssistantText = bufText;
91
+ break;
92
+ }
93
+ }
94
+ const parsed = parseReviewMessage(lastAssistantText);
95
+ return { ...parsed, turns, usage };
96
+ }
97
+ /**
98
+ * Parse the trailing ```json {...} ``` block out of the final assistant message.
99
+ * The text BEFORE the JSON block becomes the critique. On parse failure, the
100
+ * whole message is returned as critique with empty flags.
101
+ */
102
+ export function parseReviewMessage(text) {
103
+ const trimmed = text.trim();
104
+ // Match trailing ```json ... ``` block (allow trailing whitespace after fence).
105
+ const fenceRe = /```json\s*([\s\S]*?)\s*```\s*$/;
106
+ const m = fenceRe.exec(trimmed);
107
+ if (!m) {
108
+ return { critique: trimmed, flags: [] };
109
+ }
110
+ try {
111
+ const parsed = JSON.parse(m[1]);
112
+ const flags = Array.isArray(parsed.flags)
113
+ ? parsed.flags
114
+ .filter((f) => typeof f === "object" &&
115
+ f !== null &&
116
+ typeof f.severity === "string" &&
117
+ typeof f.note === "string")
118
+ .filter((f) => f.severity === "ok" || f.severity === "warn" || f.severity === "block")
119
+ .map((f) => ({ severity: f.severity, note: f.note }))
120
+ : [];
121
+ const critique = trimmed.slice(0, m.index).trim();
122
+ return { critique, flags };
123
+ }
124
+ catch {
125
+ return { critique: trimmed, flags: [] };
126
+ }
127
+ }
128
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/core/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=review.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.test.d.ts","sourceRoot":"","sources":["../../src/core/review.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseReviewMessage } from "./review.js";
3
+ describe("parseReviewMessage", () => {
4
+ it("extracts critique and flags from a well-formed message", () => {
5
+ const text = `The edit keeps too many filler words around 02:13–02:30 and the hook lacks energy.
6
+
7
+ \`\`\`json
8
+ {"flags":[{"severity":"warn","note":"filler at 02:13"},{"severity":"block","note":"missing captions"}]}
9
+ \`\`\``;
10
+ const r = parseReviewMessage(text);
11
+ expect(r.critique).toContain("filler words");
12
+ expect(r.critique).not.toContain("```");
13
+ expect(r.flags).toHaveLength(2);
14
+ expect(r.flags[0]).toEqual({ severity: "warn", note: "filler at 02:13" });
15
+ expect(r.flags[1]).toEqual({ severity: "block", note: "missing captions" });
16
+ });
17
+ it("returns whole message as critique with empty flags on no JSON block", () => {
18
+ const text = "Looks fine to me.";
19
+ const r = parseReviewMessage(text);
20
+ expect(r.critique).toBe("Looks fine to me.");
21
+ expect(r.flags).toEqual([]);
22
+ });
23
+ it("falls back gracefully on malformed JSON", () => {
24
+ const text = "Bad block follows.\n\n```json\n{not valid\n```";
25
+ const r = parseReviewMessage(text);
26
+ expect(r.critique).toContain("Bad block follows");
27
+ expect(r.flags).toEqual([]);
28
+ });
29
+ it("drops flags with unknown severity", () => {
30
+ const text = `Ok.
31
+
32
+ \`\`\`json
33
+ {"flags":[{"severity":"warn","note":"a"},{"severity":"nope","note":"b"}]}
34
+ \`\`\``;
35
+ const r = parseReviewMessage(text);
36
+ expect(r.flags).toEqual([{ severity: "warn", note: "a" }]);
37
+ });
38
+ it("tolerates trailing whitespace after the JSON fence", () => {
39
+ // LLMs sometimes append a blank line after the closing fence.
40
+ const text = [
41
+ "Looks tight.",
42
+ "",
43
+ "```json",
44
+ '{"flags":[{"severity":"ok","note":"good pacing"}]}',
45
+ "```",
46
+ " ",
47
+ "",
48
+ ].join("\n");
49
+ const r = parseReviewMessage(text);
50
+ expect(r.flags).toEqual([{ severity: "ok", note: "good pacing" }]);
51
+ });
52
+ it("drops flags missing required fields", () => {
53
+ const text = [
54
+ "x",
55
+ "",
56
+ "```json",
57
+ '{"flags":[{"severity":"warn"},{"note":"orphan note"},{"severity":"warn","note":"keep"}]}',
58
+ "```",
59
+ ].join("\n");
60
+ const r = parseReviewMessage(text);
61
+ expect(r.flags).toEqual([{ severity: "warn", note: "keep" }]);
62
+ });
63
+ it("handles empty flags array", () => {
64
+ const text = ["All clear.", "", "```json", '{"flags":[]}', "```"].join("\n");
65
+ const r = parseReviewMessage(text);
66
+ expect(r.flags).toEqual([]);
67
+ expect(r.critique).toBe("All clear.");
68
+ });
69
+ it("handles missing flags key entirely", () => {
70
+ // Some models emit { } without the flags key.
71
+ const text = `summary\n\n\`\`\`json\n{}\n\`\`\``;
72
+ const r = parseReviewMessage(text);
73
+ expect(r.flags).toEqual([]);
74
+ });
75
+ });
76
+ //# sourceMappingURL=review.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.test.js","sourceRoot":"","sources":["../../src/core/review.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Message } from "@kenkaiiii/gg-ai";
2
+ /**
3
+ * Minimal session persistence for `ggeditor continue`.
4
+ *
5
+ * Each TUI run writes its rolling message buffer to ~/.gg/editor/last.json
6
+ * after every turn. `ggeditor continue` reads this file and hydrates a new
7
+ * Agent with the prior messages.
8
+ *
9
+ * No multi-session support yet — just "the most recent conversation". Pairs
10
+ * with the `priorMessages` option added to gg-agent.
11
+ */
12
+ export declare const SESSIONS_DIR: string;
13
+ export declare const LAST_SESSION_FILE: string;
14
+ export interface PersistedSession {
15
+ /** Format version for future compatibility. */
16
+ v: 1;
17
+ /** ISO timestamp of the last update. */
18
+ updatedAt: string;
19
+ /** Provider used for this session. */
20
+ provider: string;
21
+ /** Model used for this session. */
22
+ model: string;
23
+ /** Working directory at start. */
24
+ cwd: string;
25
+ /** Host name in use ("resolve" / "premiere" / "none"). */
26
+ host: string;
27
+ /** Full message buffer EXCLUDING the system prompt. */
28
+ messages: Message[];
29
+ }
30
+ export declare function saveSession(snapshot: Omit<PersistedSession, "v" | "updatedAt">): Promise<void>;
31
+ export declare function loadLastSession(): Promise<PersistedSession | null>;
32
+ export declare function hasLastSession(): Promise<boolean>;
33
+ /**
34
+ * Drop the system message from a saved messages array. Saved sessions
35
+ * intentionally exclude the system prompt (which gets rebuilt fresh per run
36
+ * to reflect current host caps), but if a future format change includes it,
37
+ * we strip it defensively.
38
+ */
39
+ export declare function stripSystem(messages: Message[]): Message[];
40
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/core/sessions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;;;;;;;;GASG;AAEH,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,iBAAiB,QAAuC,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,CAAC,EAAE,CAAC,CAAC;IACL,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,GAAG,WAAW,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAUxE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAE1D"}
@@ -0,0 +1,61 @@
1
+ import { existsSync } from "node:fs";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ /**
6
+ * Minimal session persistence for `ggeditor continue`.
7
+ *
8
+ * Each TUI run writes its rolling message buffer to ~/.gg/editor/last.json
9
+ * after every turn. `ggeditor continue` reads this file and hydrates a new
10
+ * Agent with the prior messages.
11
+ *
12
+ * No multi-session support yet — just "the most recent conversation". Pairs
13
+ * with the `priorMessages` option added to gg-agent.
14
+ */
15
+ export const SESSIONS_DIR = path.join(os.homedir(), ".gg", "editor");
16
+ export const LAST_SESSION_FILE = path.join(SESSIONS_DIR, "last.json");
17
+ export async function saveSession(snapshot) {
18
+ await fs.mkdir(SESSIONS_DIR, { recursive: true });
19
+ const payload = {
20
+ v: 1,
21
+ updatedAt: new Date().toISOString(),
22
+ ...snapshot,
23
+ };
24
+ // Atomic write so an interrupted save doesn't leave a half-file.
25
+ const tmp = `${LAST_SESSION_FILE}.${process.pid}.tmp`;
26
+ try {
27
+ await fs.writeFile(tmp, JSON.stringify(payload, null, 2), "utf8");
28
+ await fs.rename(tmp, LAST_SESSION_FILE);
29
+ }
30
+ catch (e) {
31
+ await fs.unlink(tmp).catch(() => { });
32
+ throw e;
33
+ }
34
+ }
35
+ export async function loadLastSession() {
36
+ if (!existsSync(LAST_SESSION_FILE))
37
+ return null;
38
+ const raw = await fs.readFile(LAST_SESSION_FILE, "utf8");
39
+ try {
40
+ const parsed = JSON.parse(raw);
41
+ if (parsed.v !== 1)
42
+ return null;
43
+ return parsed;
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ export async function hasLastSession() {
50
+ return existsSync(LAST_SESSION_FILE);
51
+ }
52
+ /**
53
+ * Drop the system message from a saved messages array. Saved sessions
54
+ * intentionally exclude the system prompt (which gets rebuilt fresh per run
55
+ * to reflect current host caps), but if a future format change includes it,
56
+ * we strip it defensively.
57
+ */
58
+ export function stripSystem(messages) {
59
+ return messages.filter((m) => m.role !== "system");
60
+ }
61
+ //# sourceMappingURL=sessions.js.map