@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.
- package/LICENSE +21 -0
- package/README.md +453 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +173 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/ass.d.ts +75 -0
- package/dist/core/ass.d.ts.map +1 -0
- package/dist/core/ass.js +128 -0
- package/dist/core/ass.js.map +1 -0
- package/dist/core/ass.test.d.ts +2 -0
- package/dist/core/ass.test.d.ts.map +1 -0
- package/dist/core/ass.test.js +112 -0
- package/dist/core/ass.test.js.map +1 -0
- package/dist/core/audio-cleanup.d.ts +16 -0
- package/dist/core/audio-cleanup.d.ts.map +1 -0
- package/dist/core/audio-cleanup.js +79 -0
- package/dist/core/audio-cleanup.js.map +1 -0
- package/dist/core/audio-cleanup.test.d.ts +2 -0
- package/dist/core/audio-cleanup.test.d.ts.map +1 -0
- package/dist/core/audio-cleanup.test.js +41 -0
- package/dist/core/audio-cleanup.test.js.map +1 -0
- package/dist/core/audio-mix.d.ts +89 -0
- package/dist/core/audio-mix.d.ts.map +1 -0
- package/dist/core/audio-mix.js +156 -0
- package/dist/core/audio-mix.js.map +1 -0
- package/dist/core/audio-mix.test.d.ts +2 -0
- package/dist/core/audio-mix.test.d.ts.map +1 -0
- package/dist/core/audio-mix.test.js +91 -0
- package/dist/core/audio-mix.test.js.map +1 -0
- package/dist/core/auth/anthropic.d.ts +4 -0
- package/dist/core/auth/anthropic.d.ts.map +1 -0
- package/dist/core/auth/anthropic.js +78 -0
- package/dist/core/auth/anthropic.js.map +1 -0
- package/dist/core/auth/index.d.ts +7 -0
- package/dist/core/auth/index.d.ts.map +1 -0
- package/dist/core/auth/index.js +6 -0
- package/dist/core/auth/index.js.map +1 -0
- package/dist/core/auth/login.d.ts +13 -0
- package/dist/core/auth/login.d.ts.map +1 -0
- package/dist/core/auth/login.js +188 -0
- package/dist/core/auth/login.js.map +1 -0
- package/dist/core/auth/openai.d.ts +4 -0
- package/dist/core/auth/openai.d.ts.map +1 -0
- package/dist/core/auth/openai.js +170 -0
- package/dist/core/auth/openai.js.map +1 -0
- package/dist/core/auth/pkce.d.ts +5 -0
- package/dist/core/auth/pkce.d.ts.map +1 -0
- package/dist/core/auth/pkce.js +17 -0
- package/dist/core/auth/pkce.js.map +1 -0
- package/dist/core/auth/storage.d.ts +29 -0
- package/dist/core/auth/storage.d.ts.map +1 -0
- package/dist/core/auth/storage.js +127 -0
- package/dist/core/auth/storage.js.map +1 -0
- package/dist/core/auth/types.d.ts +22 -0
- package/dist/core/auth/types.d.ts.map +1 -0
- package/dist/core/auth/types.js +12 -0
- package/dist/core/auth/types.js.map +1 -0
- package/dist/core/clustering.d.ts +52 -0
- package/dist/core/clustering.d.ts.map +1 -0
- package/dist/core/clustering.js +163 -0
- package/dist/core/clustering.js.map +1 -0
- package/dist/core/clustering.test.d.ts +2 -0
- package/dist/core/clustering.test.d.ts.map +1 -0
- package/dist/core/clustering.test.js +112 -0
- package/dist/core/clustering.test.js.map +1 -0
- package/dist/core/color-match.d.ts +19 -0
- package/dist/core/color-match.d.ts.map +1 -0
- package/dist/core/color-match.js +118 -0
- package/dist/core/color-match.js.map +1 -0
- package/dist/core/color-match.test.d.ts +2 -0
- package/dist/core/color-match.test.d.ts.map +1 -0
- package/dist/core/color-match.test.js +40 -0
- package/dist/core/color-match.test.js.map +1 -0
- package/dist/core/ducking.d.ts +37 -0
- package/dist/core/ducking.d.ts.map +1 -0
- package/dist/core/ducking.js +71 -0
- package/dist/core/ducking.js.map +1 -0
- package/dist/core/ducking.test.d.ts +2 -0
- package/dist/core/ducking.test.d.ts.map +1 -0
- package/dist/core/ducking.test.js +38 -0
- package/dist/core/ducking.test.js.map +1 -0
- package/dist/core/edl-roundtrip.test.d.ts +2 -0
- package/dist/core/edl-roundtrip.test.d.ts.map +1 -0
- package/dist/core/edl-roundtrip.test.js +171 -0
- package/dist/core/edl-roundtrip.test.js.map +1 -0
- package/dist/core/edl.d.ts +41 -0
- package/dist/core/edl.d.ts.map +1 -0
- package/dist/core/edl.js +56 -0
- package/dist/core/edl.js.map +1 -0
- package/dist/core/edl.test.d.ts +2 -0
- package/dist/core/edl.test.d.ts.map +1 -0
- package/dist/core/edl.test.js +62 -0
- package/dist/core/edl.test.js.map +1 -0
- package/dist/core/envelope-sync.d.ts +52 -0
- package/dist/core/envelope-sync.d.ts.map +1 -0
- package/dist/core/envelope-sync.js +169 -0
- package/dist/core/envelope-sync.js.map +1 -0
- package/dist/core/envelope-sync.test.d.ts +2 -0
- package/dist/core/envelope-sync.test.d.ts.map +1 -0
- package/dist/core/envelope-sync.test.js +70 -0
- package/dist/core/envelope-sync.test.js.map +1 -0
- package/dist/core/fcpxml-roundtrip.test.d.ts +2 -0
- package/dist/core/fcpxml-roundtrip.test.d.ts.map +1 -0
- package/dist/core/fcpxml-roundtrip.test.js +251 -0
- package/dist/core/fcpxml-roundtrip.test.js.map +1 -0
- package/dist/core/fcpxml.d.ts +172 -0
- package/dist/core/fcpxml.d.ts.map +1 -0
- package/dist/core/fcpxml.js +406 -0
- package/dist/core/fcpxml.js.map +1 -0
- package/dist/core/fcpxml.test.d.ts +2 -0
- package/dist/core/fcpxml.test.d.ts.map +1 -0
- package/dist/core/fcpxml.test.js +360 -0
- package/dist/core/fcpxml.test.js.map +1 -0
- package/dist/core/filler-words.d.ts +107 -0
- package/dist/core/filler-words.d.ts.map +1 -0
- package/dist/core/filler-words.js +221 -0
- package/dist/core/filler-words.js.map +1 -0
- package/dist/core/filler-words.test.d.ts +2 -0
- package/dist/core/filler-words.test.d.ts.map +1 -0
- package/dist/core/filler-words.test.js +177 -0
- package/dist/core/filler-words.test.js.map +1 -0
- package/dist/core/format.d.ts +36 -0
- package/dist/core/format.d.ts.map +1 -0
- package/dist/core/format.js +57 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/format.test.d.ts +2 -0
- package/dist/core/format.test.d.ts.map +1 -0
- package/dist/core/format.test.js +81 -0
- package/dist/core/format.test.js.map +1 -0
- package/dist/core/frames.d.ts +35 -0
- package/dist/core/frames.d.ts.map +1 -0
- package/dist/core/frames.js +64 -0
- package/dist/core/frames.js.map +1 -0
- package/dist/core/hook-analysis.d.ts +90 -0
- package/dist/core/hook-analysis.d.ts.map +1 -0
- package/dist/core/hook-analysis.js +222 -0
- package/dist/core/hook-analysis.js.map +1 -0
- package/dist/core/hook-analysis.test.d.ts +2 -0
- package/dist/core/hook-analysis.test.d.ts.map +1 -0
- package/dist/core/hook-analysis.test.js +130 -0
- package/dist/core/hook-analysis.test.js.map +1 -0
- package/dist/core/hosts/detect.d.ts +17 -0
- package/dist/core/hosts/detect.d.ts.map +1 -0
- package/dist/core/hosts/detect.js +64 -0
- package/dist/core/hosts/detect.js.map +1 -0
- package/dist/core/hosts/detect.test.d.ts +2 -0
- package/dist/core/hosts/detect.test.d.ts.map +1 -0
- package/dist/core/hosts/detect.test.js +17 -0
- package/dist/core/hosts/detect.test.js.map +1 -0
- package/dist/core/hosts/index.d.ts +13 -0
- package/dist/core/hosts/index.d.ts.map +1 -0
- package/dist/core/hosts/index.js +30 -0
- package/dist/core/hosts/index.js.map +1 -0
- package/dist/core/hosts/lazy.d.ts +53 -0
- package/dist/core/hosts/lazy.d.ts.map +1 -0
- package/dist/core/hosts/lazy.js +125 -0
- package/dist/core/hosts/lazy.js.map +1 -0
- package/dist/core/hosts/lazy.test.d.ts +2 -0
- package/dist/core/hosts/lazy.test.d.ts.map +1 -0
- package/dist/core/hosts/lazy.test.js +117 -0
- package/dist/core/hosts/lazy.test.js.map +1 -0
- package/dist/core/hosts/none/adapter.d.ts +74 -0
- package/dist/core/hosts/none/adapter.d.ts.map +1 -0
- package/dist/core/hosts/none/adapter.js +99 -0
- package/dist/core/hosts/none/adapter.js.map +1 -0
- package/dist/core/hosts/premiere/adapter.d.ts +87 -0
- package/dist/core/hosts/premiere/adapter.d.ts.map +1 -0
- package/dist/core/hosts/premiere/adapter.js +218 -0
- package/dist/core/hosts/premiere/adapter.js.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.d.ts +26 -0
- package/dist/core/hosts/premiere/bridge-source.d.ts.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.js +326 -0
- package/dist/core/hosts/premiere/bridge-source.js.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.test.d.ts +2 -0
- package/dist/core/hosts/premiere/bridge-source.test.d.ts.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.test.js +36 -0
- package/dist/core/hosts/premiere/bridge-source.test.js.map +1 -0
- package/dist/core/hosts/premiere/bridge.d.ts +38 -0
- package/dist/core/hosts/premiere/bridge.d.ts.map +1 -0
- package/dist/core/hosts/premiere/bridge.js +238 -0
- package/dist/core/hosts/premiere/bridge.js.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.d.ts +47 -0
- package/dist/core/hosts/premiere/http-bridge.d.ts.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.js +82 -0
- package/dist/core/hosts/premiere/http-bridge.js.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.test.d.ts +2 -0
- package/dist/core/hosts/premiere/http-bridge.test.d.ts.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.test.js +113 -0
- package/dist/core/hosts/premiere/http-bridge.test.js.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.d.ts +91 -0
- package/dist/core/hosts/premiere/ws-bridge.d.ts.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.js +303 -0
- package/dist/core/hosts/premiere/ws-bridge.js.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.test.d.ts +2 -0
- package/dist/core/hosts/premiere/ws-bridge.test.d.ts.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.test.js +146 -0
- package/dist/core/hosts/premiere/ws-bridge.test.js.map +1 -0
- package/dist/core/hosts/resolve/adapter.d.ts +99 -0
- package/dist/core/hosts/resolve/adapter.d.ts.map +1 -0
- package/dist/core/hosts/resolve/adapter.js +187 -0
- package/dist/core/hosts/resolve/adapter.js.map +1 -0
- package/dist/core/hosts/resolve/bridge-source.d.ts +17 -0
- package/dist/core/hosts/resolve/bridge-source.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge-source.js +660 -0
- package/dist/core/hosts/resolve/bridge-source.js.map +1 -0
- package/dist/core/hosts/resolve/bridge.d.ts +51 -0
- package/dist/core/hosts/resolve/bridge.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge.integration.test.d.ts +2 -0
- package/dist/core/hosts/resolve/bridge.integration.test.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge.integration.test.js +472 -0
- package/dist/core/hosts/resolve/bridge.integration.test.js.map +1 -0
- package/dist/core/hosts/resolve/bridge.js +270 -0
- package/dist/core/hosts/resolve/bridge.js.map +1 -0
- package/dist/core/hosts/resolve/bridge.test.d.ts +2 -0
- package/dist/core/hosts/resolve/bridge.test.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge.test.js +50 -0
- package/dist/core/hosts/resolve/bridge.test.js.map +1 -0
- package/dist/core/hosts/types.d.ts +167 -0
- package/dist/core/hosts/types.d.ts.map +1 -0
- package/dist/core/hosts/types.js +27 -0
- package/dist/core/hosts/types.js.map +1 -0
- package/dist/core/keyframes.d.ts +35 -0
- package/dist/core/keyframes.d.ts.map +1 -0
- package/dist/core/keyframes.js +90 -0
- package/dist/core/keyframes.js.map +1 -0
- package/dist/core/keyframes.test.d.ts +2 -0
- package/dist/core/keyframes.test.d.ts.map +1 -0
- package/dist/core/keyframes.test.js +73 -0
- package/dist/core/keyframes.test.js.map +1 -0
- package/dist/core/keyword-captions.d.ts +75 -0
- package/dist/core/keyword-captions.d.ts.map +1 -0
- package/dist/core/keyword-captions.js +285 -0
- package/dist/core/keyword-captions.js.map +1 -0
- package/dist/core/keyword-captions.test.d.ts +2 -0
- package/dist/core/keyword-captions.test.d.ts.map +1 -0
- package/dist/core/keyword-captions.test.js +90 -0
- package/dist/core/keyword-captions.test.js.map +1 -0
- package/dist/core/loudness.d.ts +52 -0
- package/dist/core/loudness.d.ts.map +1 -0
- package/dist/core/loudness.js +120 -0
- package/dist/core/loudness.js.map +1 -0
- package/dist/core/loudness.test.d.ts +2 -0
- package/dist/core/loudness.test.d.ts.map +1 -0
- package/dist/core/loudness.test.js +34 -0
- package/dist/core/loudness.test.js.map +1 -0
- package/dist/core/marker-colors.d.ts +39 -0
- package/dist/core/marker-colors.d.ts.map +1 -0
- package/dist/core/marker-colors.js +83 -0
- package/dist/core/marker-colors.js.map +1 -0
- package/dist/core/marker-colors.test.d.ts +2 -0
- package/dist/core/marker-colors.test.d.ts.map +1 -0
- package/dist/core/marker-colors.test.js +116 -0
- package/dist/core/marker-colors.test.js.map +1 -0
- package/dist/core/media/ffmpeg.d.ts +27 -0
- package/dist/core/media/ffmpeg.d.ts.map +1 -0
- package/dist/core/media/ffmpeg.js +53 -0
- package/dist/core/media/ffmpeg.js.map +1 -0
- package/dist/core/multicam.d.ts +40 -0
- package/dist/core/multicam.d.ts.map +1 -0
- package/dist/core/multicam.js +77 -0
- package/dist/core/multicam.js.map +1 -0
- package/dist/core/multicam.test.d.ts +2 -0
- package/dist/core/multicam.test.d.ts.map +1 -0
- package/dist/core/multicam.test.js +56 -0
- package/dist/core/multicam.test.js.map +1 -0
- package/dist/core/punch-in.d.ts +72 -0
- package/dist/core/punch-in.d.ts.map +1 -0
- package/dist/core/punch-in.js +133 -0
- package/dist/core/punch-in.js.map +1 -0
- package/dist/core/punch-in.test.d.ts +2 -0
- package/dist/core/punch-in.test.d.ts.map +1 -0
- package/dist/core/punch-in.test.js +118 -0
- package/dist/core/punch-in.test.js.map +1 -0
- package/dist/core/reformat.d.ts +26 -0
- package/dist/core/reformat.d.ts.map +1 -0
- package/dist/core/reformat.js +31 -0
- package/dist/core/reformat.js.map +1 -0
- package/dist/core/reformat.test.d.ts +2 -0
- package/dist/core/reformat.test.d.ts.map +1 -0
- package/dist/core/reformat.test.js +29 -0
- package/dist/core/reformat.test.js.map +1 -0
- package/dist/core/reorder.d.ts +42 -0
- package/dist/core/reorder.d.ts.map +1 -0
- package/dist/core/reorder.js +80 -0
- package/dist/core/reorder.js.map +1 -0
- package/dist/core/reorder.test.d.ts +2 -0
- package/dist/core/reorder.test.d.ts.map +1 -0
- package/dist/core/reorder.test.js +88 -0
- package/dist/core/reorder.test.js.map +1 -0
- package/dist/core/review.d.ts +38 -0
- package/dist/core/review.d.ts.map +1 -0
- package/dist/core/review.js +128 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/review.test.d.ts +2 -0
- package/dist/core/review.test.d.ts.map +1 -0
- package/dist/core/review.test.js +76 -0
- package/dist/core/review.test.js.map +1 -0
- package/dist/core/sessions.d.ts +40 -0
- package/dist/core/sessions.d.ts.map +1 -0
- package/dist/core/sessions.js +61 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/sfx-on-cuts.d.ts +60 -0
- package/dist/core/sfx-on-cuts.d.ts.map +1 -0
- package/dist/core/sfx-on-cuts.js +90 -0
- package/dist/core/sfx-on-cuts.js.map +1 -0
- package/dist/core/sfx-on-cuts.test.d.ts +2 -0
- package/dist/core/sfx-on-cuts.test.d.ts.map +1 -0
- package/dist/core/sfx-on-cuts.test.js +53 -0
- package/dist/core/sfx-on-cuts.test.js.map +1 -0
- package/dist/core/silence.d.ts +41 -0
- package/dist/core/silence.d.ts.map +1 -0
- package/dist/core/silence.js +104 -0
- package/dist/core/silence.js.map +1 -0
- package/dist/core/silence.test.d.ts +2 -0
- package/dist/core/silence.test.d.ts.map +1 -0
- package/dist/core/silence.test.js +143 -0
- package/dist/core/silence.test.js.map +1 -0
- package/dist/core/skills-loader.d.ts +34 -0
- package/dist/core/skills-loader.d.ts.map +1 -0
- package/dist/core/skills-loader.js +80 -0
- package/dist/core/skills-loader.js.map +1 -0
- package/dist/core/skills-loader.test.d.ts +2 -0
- package/dist/core/skills-loader.test.d.ts.map +1 -0
- package/dist/core/skills-loader.test.js +68 -0
- package/dist/core/skills-loader.test.js.map +1 -0
- package/dist/core/skin-grade.d.ts +62 -0
- package/dist/core/skin-grade.d.ts.map +1 -0
- package/dist/core/skin-grade.js +270 -0
- package/dist/core/skin-grade.js.map +1 -0
- package/dist/core/skin-grade.test.d.ts +2 -0
- package/dist/core/skin-grade.test.d.ts.map +1 -0
- package/dist/core/skin-grade.test.js +182 -0
- package/dist/core/skin-grade.test.js.map +1 -0
- package/dist/core/speaker-changes.d.ts +30 -0
- package/dist/core/speaker-changes.d.ts.map +1 -0
- package/dist/core/speaker-changes.js +19 -0
- package/dist/core/speaker-changes.js.map +1 -0
- package/dist/core/speaker-changes.test.d.ts +2 -0
- package/dist/core/speaker-changes.test.d.ts.map +1 -0
- package/dist/core/speaker-changes.test.js +46 -0
- package/dist/core/speaker-changes.test.js.map +1 -0
- package/dist/core/speed-ramp.d.ts +60 -0
- package/dist/core/speed-ramp.d.ts.map +1 -0
- package/dist/core/speed-ramp.js +113 -0
- package/dist/core/speed-ramp.js.map +1 -0
- package/dist/core/speed-ramp.test.d.ts +2 -0
- package/dist/core/speed-ramp.test.d.ts.map +1 -0
- package/dist/core/speed-ramp.test.js +74 -0
- package/dist/core/speed-ramp.test.js.map +1 -0
- package/dist/core/srt.d.ts +56 -0
- package/dist/core/srt.d.ts.map +1 -0
- package/dist/core/srt.js +90 -0
- package/dist/core/srt.js.map +1 -0
- package/dist/core/srt.test.d.ts +2 -0
- package/dist/core/srt.test.d.ts.map +1 -0
- package/dist/core/srt.test.js +107 -0
- package/dist/core/srt.test.js.map +1 -0
- package/dist/core/stabilize.d.ts +15 -0
- package/dist/core/stabilize.d.ts.map +1 -0
- package/dist/core/stabilize.js +69 -0
- package/dist/core/stabilize.js.map +1 -0
- package/dist/core/styles-loader.d.ts +33 -0
- package/dist/core/styles-loader.d.ts.map +1 -0
- package/dist/core/styles-loader.js +67 -0
- package/dist/core/styles-loader.js.map +1 -0
- package/dist/core/styles-loader.test.d.ts +2 -0
- package/dist/core/styles-loader.test.d.ts.map +1 -0
- package/dist/core/styles-loader.test.js +72 -0
- package/dist/core/styles-loader.test.js.map +1 -0
- package/dist/core/text-overlay.d.ts +76 -0
- package/dist/core/text-overlay.d.ts.map +1 -0
- package/dist/core/text-overlay.js +233 -0
- package/dist/core/text-overlay.js.map +1 -0
- package/dist/core/text-overlay.test.d.ts +2 -0
- package/dist/core/text-overlay.test.d.ts.map +1 -0
- package/dist/core/text-overlay.test.js +103 -0
- package/dist/core/text-overlay.test.js.map +1 -0
- package/dist/core/vision.d.ts +53 -0
- package/dist/core/vision.d.ts.map +1 -0
- package/dist/core/vision.js +150 -0
- package/dist/core/vision.js.map +1 -0
- package/dist/core/vision.test.d.ts +2 -0
- package/dist/core/vision.test.d.ts.map +1 -0
- package/dist/core/vision.test.js +76 -0
- package/dist/core/vision.test.js.map +1 -0
- package/dist/core/whisper.d.ts +188 -0
- package/dist/core/whisper.d.ts.map +1 -0
- package/dist/core/whisper.js +380 -0
- package/dist/core/whisper.js.map +1 -0
- package/dist/core/whisper.test.d.ts +2 -0
- package/dist/core/whisper.test.d.ts.map +1 -0
- package/dist/core/whisper.test.js +262 -0
- package/dist/core/whisper.test.js.map +1 -0
- package/dist/director/delegate-tool.d.ts +22 -0
- package/dist/director/delegate-tool.d.ts.map +1 -0
- package/dist/director/delegate-tool.js +62 -0
- package/dist/director/delegate-tool.js.map +1 -0
- package/dist/director/delegate-tool.test.d.ts +2 -0
- package/dist/director/delegate-tool.test.d.ts.map +1 -0
- package/dist/director/delegate-tool.test.js +38 -0
- package/dist/director/delegate-tool.test.js.map +1 -0
- package/dist/director/director-prompt.d.ts +7 -0
- package/dist/director/director-prompt.d.ts.map +1 -0
- package/dist/director/director-prompt.js +52 -0
- package/dist/director/director-prompt.js.map +1 -0
- package/dist/director/director.d.ts +16 -0
- package/dist/director/director.d.ts.map +1 -0
- package/dist/director/director.js +28 -0
- package/dist/director/director.js.map +1 -0
- package/dist/director/executor.d.ts +19 -0
- package/dist/director/executor.d.ts.map +1 -0
- package/dist/director/executor.js +93 -0
- package/dist/director/executor.js.map +1 -0
- package/dist/director/index.d.ts +6 -0
- package/dist/director/index.d.ts.map +1 -0
- package/dist/director/index.js +5 -0
- package/dist/director/index.js.map +1 -0
- package/dist/director/types.d.ts +38 -0
- package/dist/director/types.d.ts.map +1 -0
- package/dist/director/types.js +2 -0
- package/dist/director/types.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/skills.d.ts +18 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +674 -0
- package/dist/skills.js.map +1 -0
- package/dist/system-prompt.d.ts +35 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +478 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/system-prompt.test.d.ts +2 -0
- package/dist/system-prompt.test.d.ts.map +1 -0
- package/dist/system-prompt.test.js +87 -0
- package/dist/system-prompt.test.js.map +1 -0
- package/dist/tools/add-fades.d.ts +13 -0
- package/dist/tools/add-fades.d.ts.map +1 -0
- package/dist/tools/add-fades.js +88 -0
- package/dist/tools/add-fades.js.map +1 -0
- package/dist/tools/add-marker.d.ts +31 -0
- package/dist/tools/add-marker.d.ts.map +1 -0
- package/dist/tools/add-marker.js +56 -0
- package/dist/tools/add-marker.js.map +1 -0
- package/dist/tools/add-sfx-at-cuts.d.ts +24 -0
- package/dist/tools/add-sfx-at-cuts.d.ts.map +1 -0
- package/dist/tools/add-sfx-at-cuts.js +120 -0
- package/dist/tools/add-sfx-at-cuts.js.map +1 -0
- package/dist/tools/add-track.d.ts +13 -0
- package/dist/tools/add-track.d.ts.map +1 -0
- package/dist/tools/add-track.js +26 -0
- package/dist/tools/add-track.js.map +1 -0
- package/dist/tools/analyze-hook.d.ts +28 -0
- package/dist/tools/analyze-hook.d.ts.map +1 -0
- package/dist/tools/analyze-hook.js +126 -0
- package/dist/tools/analyze-hook.js.map +1 -0
- package/dist/tools/append-clip.d.ts +10 -0
- package/dist/tools/append-clip.d.ts.map +1 -0
- package/dist/tools/append-clip.js +27 -0
- package/dist/tools/append-clip.js.map +1 -0
- package/dist/tools/apply-lut.d.ts +11 -0
- package/dist/tools/apply-lut.d.ts.map +1 -0
- package/dist/tools/apply-lut.js +33 -0
- package/dist/tools/apply-lut.js.map +1 -0
- package/dist/tools/burn-subtitles.d.ts +28 -0
- package/dist/tools/burn-subtitles.d.ts.map +1 -0
- package/dist/tools/burn-subtitles.js +87 -0
- package/dist/tools/burn-subtitles.js.map +1 -0
- package/dist/tools/clean-audio.d.ts +18 -0
- package/dist/tools/clean-audio.d.ts.map +1 -0
- package/dist/tools/clean-audio.js +54 -0
- package/dist/tools/clean-audio.js.map +1 -0
- package/dist/tools/clone-timeline.d.ts +9 -0
- package/dist/tools/clone-timeline.d.ts.map +1 -0
- package/dist/tools/clone-timeline.js +28 -0
- package/dist/tools/clone-timeline.js.map +1 -0
- package/dist/tools/cluster-takes.d.ts +11 -0
- package/dist/tools/cluster-takes.d.ts.map +1 -0
- package/dist/tools/cluster-takes.js +71 -0
- package/dist/tools/cluster-takes.js.map +1 -0
- package/dist/tools/color-match.d.ts +16 -0
- package/dist/tools/color-match.d.ts.map +1 -0
- package/dist/tools/color-match.js +55 -0
- package/dist/tools/color-match.js.map +1 -0
- package/dist/tools/compose-layered.d.ts +47 -0
- package/dist/tools/compose-layered.d.ts.map +1 -0
- package/dist/tools/compose-layered.js +103 -0
- package/dist/tools/compose-layered.js.map +1 -0
- package/dist/tools/compose-thumbnail.d.ts +35 -0
- package/dist/tools/compose-thumbnail.d.ts.map +1 -0
- package/dist/tools/compose-thumbnail.js +130 -0
- package/dist/tools/compose-thumbnail.js.map +1 -0
- package/dist/tools/concat-videos.d.ts +18 -0
- package/dist/tools/concat-videos.d.ts.map +1 -0
- package/dist/tools/concat-videos.js +79 -0
- package/dist/tools/concat-videos.js.map +1 -0
- package/dist/tools/copy-grade.d.ts +10 -0
- package/dist/tools/copy-grade.d.ts.map +1 -0
- package/dist/tools/copy-grade.js +29 -0
- package/dist/tools/copy-grade.js.map +1 -0
- package/dist/tools/create-timeline.d.ts +12 -0
- package/dist/tools/create-timeline.d.ts.map +1 -0
- package/dist/tools/create-timeline.js +35 -0
- package/dist/tools/create-timeline.js.map +1 -0
- package/dist/tools/crossfade-videos.d.ts +49 -0
- package/dist/tools/crossfade-videos.d.ts.map +1 -0
- package/dist/tools/crossfade-videos.js +121 -0
- package/dist/tools/crossfade-videos.js.map +1 -0
- package/dist/tools/cut-at.d.ts +10 -0
- package/dist/tools/cut-at.d.ts.map +1 -0
- package/dist/tools/cut-at.js +24 -0
- package/dist/tools/cut-at.js.map +1 -0
- package/dist/tools/cut-filler-words.d.ts +27 -0
- package/dist/tools/cut-filler-words.d.ts.map +1 -0
- package/dist/tools/cut-filler-words.js +165 -0
- package/dist/tools/cut-filler-words.js.map +1 -0
- package/dist/tools/detect-silence.d.ts +13 -0
- package/dist/tools/detect-silence.d.ts.map +1 -0
- package/dist/tools/detect-silence.js +98 -0
- package/dist/tools/detect-silence.js.map +1 -0
- package/dist/tools/detect-speaker-changes.d.ts +9 -0
- package/dist/tools/detect-speaker-changes.d.ts.map +1 -0
- package/dist/tools/detect-speaker-changes.js +42 -0
- package/dist/tools/detect-speaker-changes.js.map +1 -0
- package/dist/tools/dry-run.d.ts +23 -0
- package/dist/tools/dry-run.d.ts.map +1 -0
- package/dist/tools/dry-run.js +66 -0
- package/dist/tools/dry-run.js.map +1 -0
- package/dist/tools/dry-run.test.d.ts +2 -0
- package/dist/tools/dry-run.test.d.ts.map +1 -0
- package/dist/tools/dry-run.test.js +66 -0
- package/dist/tools/dry-run.test.js.map +1 -0
- package/dist/tools/duck-audio.d.ts +16 -0
- package/dist/tools/duck-audio.d.ts.map +1 -0
- package/dist/tools/duck-audio.js +73 -0
- package/dist/tools/duck-audio.js.map +1 -0
- package/dist/tools/extract-audio.d.ts +10 -0
- package/dist/tools/extract-audio.d.ts.map +1 -0
- package/dist/tools/extract-audio.js +30 -0
- package/dist/tools/extract-audio.js.map +1 -0
- package/dist/tools/extract-frame.d.ts +12 -0
- package/dist/tools/extract-frame.d.ts.map +1 -0
- package/dist/tools/extract-frame.js +63 -0
- package/dist/tools/extract-frame.js.map +1 -0
- package/dist/tools/generate-gif.d.ts +13 -0
- package/dist/tools/generate-gif.d.ts.map +1 -0
- package/dist/tools/generate-gif.js +94 -0
- package/dist/tools/generate-gif.js.map +1 -0
- package/dist/tools/get-markers.d.ts +13 -0
- package/dist/tools/get-markers.d.ts.map +1 -0
- package/dist/tools/get-markers.js +71 -0
- package/dist/tools/get-markers.js.map +1 -0
- package/dist/tools/get-timeline.d.ts +9 -0
- package/dist/tools/get-timeline.d.ts.map +1 -0
- package/dist/tools/get-timeline.js +43 -0
- package/dist/tools/get-timeline.js.map +1 -0
- package/dist/tools/grade-skin-tones.d.ts +31 -0
- package/dist/tools/grade-skin-tones.d.ts.map +1 -0
- package/dist/tools/grade-skin-tones.js +92 -0
- package/dist/tools/grade-skin-tones.js.map +1 -0
- package/dist/tools/host-info.d.ts +7 -0
- package/dist/tools/host-info.d.ts.map +1 -0
- package/dist/tools/host-info.js +33 -0
- package/dist/tools/host-info.js.map +1 -0
- package/dist/tools/host-tools.test.d.ts +2 -0
- package/dist/tools/host-tools.test.d.ts.map +1 -0
- package/dist/tools/host-tools.test.js +83 -0
- package/dist/tools/host-tools.test.js.map +1 -0
- package/dist/tools/import-edl.d.ts +9 -0
- package/dist/tools/import-edl.d.ts.map +1 -0
- package/dist/tools/import-edl.js +25 -0
- package/dist/tools/import-edl.js.map +1 -0
- package/dist/tools/import-subtitles.d.ts +9 -0
- package/dist/tools/import-subtitles.d.ts.map +1 -0
- package/dist/tools/import-subtitles.js +31 -0
- package/dist/tools/import-subtitles.js.map +1 -0
- package/dist/tools/import-to-media-pool.d.ts +10 -0
- package/dist/tools/import-to-media-pool.d.ts.map +1 -0
- package/dist/tools/import-to-media-pool.js +27 -0
- package/dist/tools/import-to-media-pool.js.map +1 -0
- package/dist/tools/index.d.ts +94 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +242 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/index.test.d.ts +2 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +128 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/insert-broll.d.ts +13 -0
- package/dist/tools/insert-broll.d.ts.map +1 -0
- package/dist/tools/insert-broll.js +56 -0
- package/dist/tools/insert-broll.js.map +1 -0
- package/dist/tools/ken-burns.d.ts +26 -0
- package/dist/tools/ken-burns.d.ts.map +1 -0
- package/dist/tools/ken-burns.js +125 -0
- package/dist/tools/ken-burns.js.map +1 -0
- package/dist/tools/list-render-presets.d.ts +7 -0
- package/dist/tools/list-render-presets.d.ts.map +1 -0
- package/dist/tools/list-render-presets.js +30 -0
- package/dist/tools/list-render-presets.js.map +1 -0
- package/dist/tools/match-clip-color.d.ts +29 -0
- package/dist/tools/match-clip-color.d.ts.map +1 -0
- package/dist/tools/match-clip-color.js +99 -0
- package/dist/tools/match-clip-color.js.map +1 -0
- package/dist/tools/measure-loudness.d.ts +8 -0
- package/dist/tools/measure-loudness.d.ts.map +1 -0
- package/dist/tools/measure-loudness.js +40 -0
- package/dist/tools/measure-loudness.js.map +1 -0
- package/dist/tools/mix-audio.d.ts +46 -0
- package/dist/tools/mix-audio.d.ts.map +1 -0
- package/dist/tools/mix-audio.js +101 -0
- package/dist/tools/mix-audio.js.map +1 -0
- package/dist/tools/multicam-sync.d.ts +14 -0
- package/dist/tools/multicam-sync.d.ts.map +1 -0
- package/dist/tools/multicam-sync.js +75 -0
- package/dist/tools/multicam-sync.js.map +1 -0
- package/dist/tools/new-tools.test.d.ts +2 -0
- package/dist/tools/new-tools.test.d.ts.map +1 -0
- package/dist/tools/new-tools.test.js +511 -0
- package/dist/tools/new-tools.test.js.map +1 -0
- package/dist/tools/normalize-loudness.d.ts +21 -0
- package/dist/tools/normalize-loudness.d.ts.map +1 -0
- package/dist/tools/normalize-loudness.js +94 -0
- package/dist/tools/normalize-loudness.js.map +1 -0
- package/dist/tools/open-page.d.ts +17 -0
- package/dist/tools/open-page.d.ts.map +1 -0
- package/dist/tools/open-page.js +27 -0
- package/dist/tools/open-page.js.map +1 -0
- package/dist/tools/overlay-watermark.d.ts +28 -0
- package/dist/tools/overlay-watermark.d.ts.map +1 -0
- package/dist/tools/overlay-watermark.js +98 -0
- package/dist/tools/overlay-watermark.js.map +1 -0
- package/dist/tools/pick-best-takes.d.ts +20 -0
- package/dist/tools/pick-best-takes.d.ts.map +1 -0
- package/dist/tools/pick-best-takes.js +147 -0
- package/dist/tools/pick-best-takes.js.map +1 -0
- package/dist/tools/post-tools.test.d.ts +2 -0
- package/dist/tools/post-tools.test.d.ts.map +1 -0
- package/dist/tools/post-tools.test.js +83 -0
- package/dist/tools/post-tools.test.js.map +1 -0
- package/dist/tools/pre-render-check.d.ts +23 -0
- package/dist/tools/pre-render-check.d.ts.map +1 -0
- package/dist/tools/pre-render-check.js +134 -0
- package/dist/tools/pre-render-check.js.map +1 -0
- package/dist/tools/probe-media.d.ts +8 -0
- package/dist/tools/probe-media.d.ts.map +1 -0
- package/dist/tools/probe-media.js +32 -0
- package/dist/tools/probe-media.js.map +1 -0
- package/dist/tools/punch-in.d.ts +30 -0
- package/dist/tools/punch-in.d.ts.map +1 -0
- package/dist/tools/punch-in.js +130 -0
- package/dist/tools/punch-in.js.map +1 -0
- package/dist/tools/read-skill.d.ts +9 -0
- package/dist/tools/read-skill.d.ts.map +1 -0
- package/dist/tools/read-skill.js +24 -0
- package/dist/tools/read-skill.js.map +1 -0
- package/dist/tools/read-transcript.d.ts +14 -0
- package/dist/tools/read-transcript.d.ts.map +1 -0
- package/dist/tools/read-transcript.js +85 -0
- package/dist/tools/read-transcript.js.map +1 -0
- package/dist/tools/read-transcript.test.d.ts +2 -0
- package/dist/tools/read-transcript.test.d.ts.map +1 -0
- package/dist/tools/read-transcript.test.js +136 -0
- package/dist/tools/read-transcript.test.js.map +1 -0
- package/dist/tools/reformat-timeline.d.ts +25 -0
- package/dist/tools/reformat-timeline.d.ts.map +1 -0
- package/dist/tools/reformat-timeline.js +60 -0
- package/dist/tools/reformat-timeline.js.map +1 -0
- package/dist/tools/render.d.ts +10 -0
- package/dist/tools/render.d.ts.map +1 -0
- package/dist/tools/render.js +26 -0
- package/dist/tools/render.js.map +1 -0
- package/dist/tools/reorder-timeline.d.ts +12 -0
- package/dist/tools/reorder-timeline.d.ts.map +1 -0
- package/dist/tools/reorder-timeline.js +65 -0
- package/dist/tools/reorder-timeline.js.map +1 -0
- package/dist/tools/replace-clip.d.ts +10 -0
- package/dist/tools/replace-clip.d.ts.map +1 -0
- package/dist/tools/replace-clip.js +28 -0
- package/dist/tools/replace-clip.js.map +1 -0
- package/dist/tools/review-edit.d.ts +23 -0
- package/dist/tools/review-edit.d.ts.map +1 -0
- package/dist/tools/review-edit.js +47 -0
- package/dist/tools/review-edit.js.map +1 -0
- package/dist/tools/ripple-delete.d.ts +11 -0
- package/dist/tools/ripple-delete.d.ts.map +1 -0
- package/dist/tools/ripple-delete.js +27 -0
- package/dist/tools/ripple-delete.js.map +1 -0
- package/dist/tools/save-project.d.ts +7 -0
- package/dist/tools/save-project.d.ts.map +1 -0
- package/dist/tools/save-project.js +22 -0
- package/dist/tools/save-project.js.map +1 -0
- package/dist/tools/score-shot.d.ts +18 -0
- package/dist/tools/score-shot.d.ts.map +1 -0
- package/dist/tools/score-shot.js +127 -0
- package/dist/tools/score-shot.js.map +1 -0
- package/dist/tools/set-clip-speed.d.ts +10 -0
- package/dist/tools/set-clip-speed.d.ts.map +1 -0
- package/dist/tools/set-clip-speed.js +28 -0
- package/dist/tools/set-clip-speed.js.map +1 -0
- package/dist/tools/set-clip-volume.d.ts +10 -0
- package/dist/tools/set-clip-volume.d.ts.map +1 -0
- package/dist/tools/set-clip-volume.js +33 -0
- package/dist/tools/set-clip-volume.js.map +1 -0
- package/dist/tools/set-primary-correction.d.ts +14 -0
- package/dist/tools/set-primary-correction.d.ts.map +1 -0
- package/dist/tools/set-primary-correction.js +45 -0
- package/dist/tools/set-primary-correction.js.map +1 -0
- package/dist/tools/smart-reframe.d.ts +22 -0
- package/dist/tools/smart-reframe.d.ts.map +1 -0
- package/dist/tools/smart-reframe.js +39 -0
- package/dist/tools/smart-reframe.js.map +1 -0
- package/dist/tools/speed-ramp.d.ts +14 -0
- package/dist/tools/speed-ramp.d.ts.map +1 -0
- package/dist/tools/speed-ramp.js +71 -0
- package/dist/tools/speed-ramp.js.map +1 -0
- package/dist/tools/stabilize-video.d.ts +12 -0
- package/dist/tools/stabilize-video.d.ts.map +1 -0
- package/dist/tools/stabilize-video.js +63 -0
- package/dist/tools/stabilize-video.js.map +1 -0
- package/dist/tools/transcribe.d.ts +29 -0
- package/dist/tools/transcribe.d.ts.map +1 -0
- package/dist/tools/transcribe.js +116 -0
- package/dist/tools/transcribe.js.map +1 -0
- package/dist/tools/transition-videos.d.ts +29 -0
- package/dist/tools/transition-videos.d.ts.map +1 -0
- package/dist/tools/transition-videos.js +129 -0
- package/dist/tools/transition-videos.js.map +1 -0
- package/dist/tools/write-ass.d.ts +34 -0
- package/dist/tools/write-ass.d.ts.map +1 -0
- package/dist/tools/write-ass.js +101 -0
- package/dist/tools/write-ass.js.map +1 -0
- package/dist/tools/write-edl.d.ts +24 -0
- package/dist/tools/write-edl.d.ts.map +1 -0
- package/dist/tools/write-edl.js +59 -0
- package/dist/tools/write-edl.js.map +1 -0
- package/dist/tools/write-fcpxml.d.ts +20 -0
- package/dist/tools/write-fcpxml.d.ts.map +1 -0
- package/dist/tools/write-fcpxml.js +52 -0
- package/dist/tools/write-fcpxml.js.map +1 -0
- package/dist/tools/write-keyword-captions.d.ts +36 -0
- package/dist/tools/write-keyword-captions.d.ts.map +1 -0
- package/dist/tools/write-keyword-captions.js +183 -0
- package/dist/tools/write-keyword-captions.js.map +1 -0
- package/dist/tools/write-lower-third.d.ts +34 -0
- package/dist/tools/write-lower-third.d.ts.map +1 -0
- package/dist/tools/write-lower-third.js +52 -0
- package/dist/tools/write-lower-third.js.map +1 -0
- package/dist/tools/write-srt.d.ts +20 -0
- package/dist/tools/write-srt.d.ts.map +1 -0
- package/dist/tools/write-srt.js +72 -0
- package/dist/tools/write-srt.js.map +1 -0
- package/dist/tools/write-title-card.d.ts +25 -0
- package/dist/tools/write-title-card.d.ts.map +1 -0
- package/dist/tools/write-title-card.js +57 -0
- package/dist/tools/write-title-card.js.map +1 -0
- package/dist/types.d.ts +83 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/App.d.ts +44 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +454 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/Banner.d.ts +13 -0
- package/dist/ui/components/Banner.d.ts.map +1 -0
- package/dist/ui/components/Banner.js +59 -0
- package/dist/ui/components/Banner.js.map +1 -0
- package/dist/ui/components/Footer.d.ts +19 -0
- package/dist/ui/components/Footer.d.ts.map +1 -0
- package/dist/ui/components/Footer.js +20 -0
- package/dist/ui/components/Footer.js.map +1 -0
- package/dist/ui/components/Header.d.ts +16 -0
- package/dist/ui/components/Header.d.ts.map +1 -0
- package/dist/ui/components/Header.js +12 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/InputBox.d.ts +21 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -0
- package/dist/ui/components/InputBox.js +81 -0
- package/dist/ui/components/InputBox.js.map +1 -0
- package/dist/ui/components/Message.d.ts +14 -0
- package/dist/ui/components/Message.d.ts.map +1 -0
- package/dist/ui/components/Message.js +24 -0
- package/dist/ui/components/Message.js.map +1 -0
- package/dist/ui/components/SlashMenu.d.ts +19 -0
- package/dist/ui/components/SlashMenu.d.ts.map +1 -0
- package/dist/ui/components/SlashMenu.js +33 -0
- package/dist/ui/components/SlashMenu.js.map +1 -0
- package/dist/ui/components/SlashMenu.test.d.ts +2 -0
- package/dist/ui/components/SlashMenu.test.d.ts.map +1 -0
- package/dist/ui/components/SlashMenu.test.js +23 -0
- package/dist/ui/components/SlashMenu.test.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +6 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +16 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/ToolCallLine.d.ts +16 -0
- package/dist/ui/components/ToolCallLine.d.ts.map +1 -0
- package/dist/ui/components/ToolCallLine.js +35 -0
- package/dist/ui/components/ToolCallLine.js.map +1 -0
- package/dist/ui/render.d.ts +9 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +56 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/spinner-frames.d.ts +3 -0
- package/dist/ui/spinner-frames.d.ts.map +1 -0
- package/dist/ui/spinner-frames.js +16 -0
- package/dist/ui/spinner-frames.js.map +1 -0
- package/dist/ui/theme.d.ts +27 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +26 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { VideoHost } from "./core/hosts/types.js";
|
|
2
|
+
import { type SkillSource } from "./core/skills-loader.js";
|
|
3
|
+
import { type StyleSource } from "./core/styles-loader.js";
|
|
4
|
+
export interface StaticPromptOptions {
|
|
5
|
+
skills?: SkillSource[];
|
|
6
|
+
styles?: StyleSource[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Build ONLY the host-status block. ~150 bytes. Cheap (one
|
|
10
|
+
* `host.capabilities()` call). Call this whenever the live host changes.
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildEditorHostBlock(host: VideoHost): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Build ONLY the host-independent body. Cacheable for the session — the
|
|
15
|
+
* inputs (cwd, skills, styles) don't change while ggeditor is running.
|
|
16
|
+
*
|
|
17
|
+
* Contains a single `{HOST_BLOCK}` token that the caller replaces with the
|
|
18
|
+
* output of `buildEditorHostBlock(host)`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildEditorStaticBody(cwd: string, options?: StaticPromptOptions): string;
|
|
21
|
+
/**
|
|
22
|
+
* Backward-compatible one-shot builder. Useful for the first render at
|
|
23
|
+
* startup (cli.ts) or in tests where dynamic refresh isn't needed.
|
|
24
|
+
*
|
|
25
|
+
* The TUI should prefer the two-layer API: cache `buildEditorStaticBody`
|
|
26
|
+
* once, call `buildEditorHostBlock` on host change, splice them together.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildEditorSystemPrompt(host: VideoHost, cwd: string, options?: StaticPromptOptions): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Replace the `{HOST_BLOCK}` sentinel in a cached static body with a fresh
|
|
31
|
+
* host block. Throws if the sentinel is missing — that means the static
|
|
32
|
+
* template is malformed.
|
|
33
|
+
*/
|
|
34
|
+
export declare function spliceHostBlock(staticBody: string, hostBlock: string): string;
|
|
35
|
+
//# sourceMappingURL=system-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA6B9F,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3E;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAiZ5F;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAO7E"}
|
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
import { discoverSkills } from "./core/skills-loader.js";
|
|
2
|
+
import { discoverStyles, renderStylesBlock } from "./core/styles-loader.js";
|
|
3
|
+
import { SKILLS } from "./skills.js";
|
|
4
|
+
/**
|
|
5
|
+
* The system prompt has two layers:
|
|
6
|
+
*
|
|
7
|
+
* - Static body (this file's `renderStaticBody`) — depends only on cwd +
|
|
8
|
+
* bundled / project / user skills + styles. Built ONCE per session and
|
|
9
|
+
* cached. Tens of KB of workflow recipes, capability matrix, skill
|
|
10
|
+
* index — none of it changes when the user opens or closes their NLE.
|
|
11
|
+
*
|
|
12
|
+
* - Host block (`buildEditorHostBlock`) — the small `# Host` section
|
|
13
|
+
* that names the live host, its reachability, and current caps. ~150
|
|
14
|
+
* bytes. Rebuilt on demand whenever the lazy host detects a change.
|
|
15
|
+
*
|
|
16
|
+
* `buildEditorSystemPrompt` wires both together for backward compatibility
|
|
17
|
+
* (callers that just want a single string at startup). The TUI uses the
|
|
18
|
+
* two-layer API directly: cache the static body, splice in a fresh host
|
|
19
|
+
* block whenever the lazy host's identity flips, and patch
|
|
20
|
+
* messagesRef.current[0] in place.
|
|
21
|
+
*
|
|
22
|
+
* The `{HOST_BLOCK}` token in the static template is a sentinel — it must
|
|
23
|
+
* appear exactly once and is replaced verbatim. We don't use template-
|
|
24
|
+
* literal substitution because the static body is meant to be cached as
|
|
25
|
+
* a plain string, not a thunk.
|
|
26
|
+
*/
|
|
27
|
+
const HOST_BLOCK_TOKEN = "{HOST_BLOCK}";
|
|
28
|
+
/**
|
|
29
|
+
* Build ONLY the host-status block. ~150 bytes. Cheap (one
|
|
30
|
+
* `host.capabilities()` call). Call this whenever the live host changes.
|
|
31
|
+
*/
|
|
32
|
+
export async function buildEditorHostBlock(host) {
|
|
33
|
+
const c = await host.capabilities();
|
|
34
|
+
const why = c.unavailableReason ? ` why="${c.unavailableReason}"` : "";
|
|
35
|
+
return `# Host
|
|
36
|
+
|
|
37
|
+
host=${host.name} ok=${c.isAvailable}${why}
|
|
38
|
+
caps: move=${c.canMoveClips} color=${c.canScriptColor} audio=${c.canScriptAudio} ai=${c.canTriggerAI} import=${c.preferredImportFormat}
|
|
39
|
+
|
|
40
|
+
Host identity is dynamic. The user can open / close their NLE mid-session
|
|
41
|
+
and the next tool call will see the new state. If \`host=none\` here but
|
|
42
|
+
the user says they have Resolve open, call host_info — the live adapter
|
|
43
|
+
re-detects on every tool call.`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build ONLY the host-independent body. Cacheable for the session — the
|
|
47
|
+
* inputs (cwd, skills, styles) don't change while ggeditor is running.
|
|
48
|
+
*
|
|
49
|
+
* Contains a single `{HOST_BLOCK}` token that the caller replaces with the
|
|
50
|
+
* output of `buildEditorHostBlock(host)`.
|
|
51
|
+
*/
|
|
52
|
+
export function buildEditorStaticBody(cwd, options = {}) {
|
|
53
|
+
const skills = options.skills ?? discoverSkills({ cwd, bundled: Object.values(SKILLS) });
|
|
54
|
+
const styles = options.styles ?? discoverStyles({ cwd });
|
|
55
|
+
const stylesBlock = renderStylesBlock(styles);
|
|
56
|
+
const skillLines = skills
|
|
57
|
+
.map((s) => {
|
|
58
|
+
const tag = s.origin === "project" ? " _(project)_" : s.origin === "user" ? " _(user)_" : "";
|
|
59
|
+
return `- **${s.name}**${tag} — ${s.description}`;
|
|
60
|
+
})
|
|
61
|
+
.join("\n");
|
|
62
|
+
return `You are GG Editor — a video editing agent for content creators.
|
|
63
|
+
|
|
64
|
+
# Mental model
|
|
65
|
+
|
|
66
|
+
ggeditor is for **long-form** and **short-form** video content.
|
|
67
|
+
|
|
68
|
+
- **Long-form** (podcasts, interviews, vlogs, courses, talking-head): the work is silence cuts, take selection, filler removal, chapter markers, captions.
|
|
69
|
+
- **Short-form** (TikTok / Reels / Shorts): the work is finding the moment, reformatting to 9:16, burning captions, hooking the first 2 seconds.
|
|
70
|
+
|
|
71
|
+
NOT in scope: generative video, motion graphics, VFX, animation, complex compositing. If the user asks for those, say so and propose what we CAN do.
|
|
72
|
+
|
|
73
|
+
${HOST_BLOCK_TOKEN}
|
|
74
|
+
|
|
75
|
+
cwd=${cwd}
|
|
76
|
+
|
|
77
|
+
# Tool tiers (prefer earlier)
|
|
78
|
+
|
|
79
|
+
1. Live API — host_info, get_timeline, get_markers, add_marker, append_clip, cut_at, ripple_delete, set_clip_speed, create_timeline, import_to_media_pool, import_subtitles, open_page (Resolve), render
|
|
80
|
+
2. Bulk import — write_edl / write_fcpxml / reformat_timeline / reorder_timeline / compose_layered + import_edl (use when API can't do per-clip ops, e.g. Resolve has no scriptable razor or scriptable clip-move)
|
|
81
|
+
3. File-only — probe_media, extract_audio, detect_silence, transcribe, read_transcript, cluster_takes, score_shot, write_srt, write_lower_third, write_title_card, mix_audio, speed_ramp, ken_burns, transition_videos (no NLE needed)
|
|
82
|
+
|
|
83
|
+
# Capability matrix — what's host-scriptable vs file-only
|
|
84
|
+
|
|
85
|
+
| Feature | Resolve API | Premiere API | File-only path |
|
|
86
|
+
|---|---|---|---|
|
|
87
|
+
| Reorder clips | NO (no MoveItem) | NO (no scriptable move) | reorder_timeline → import_edl |
|
|
88
|
+
| Multi-track / lanes | partial (insert_broll) | partial (insert_broll) | compose_layered → import_edl |
|
|
89
|
+
| Keyframes (opacity / pos / scale / volume) | NO | NO | write_fcpxml with keyframes → import_edl |
|
|
90
|
+
| Title cards / lower-thirds | NO scriptable | NO scriptable | write_lower_third / write_title_card → burn_subtitles |
|
|
91
|
+
| Audio EQ / comp / gate | NO (Fairlight closed) | NO (Fairlight closed) | mix_audio |
|
|
92
|
+
| Speed ramps | NO (constant only) | NO (constant only) | speed_ramp |
|
|
93
|
+
| Ken-Burns zoom on stills | NO | NO | ken_burns |
|
|
94
|
+
| Transitions (xfade) | NO scriptable | NO scriptable | crossfade_videos / transition_videos |
|
|
95
|
+
| Skin-tone match across clips | partial (CDL via match_clip_color) | NO | grade_skin_tones |
|
|
96
|
+
| Filler-word removal | NO | NO | cut_filler_words |
|
|
97
|
+
| Punch-in zoom on cuts | NO | NO | punch_in |
|
|
98
|
+
| Keyword-highlighted captions | NO | NO | write_keyword_captions |
|
|
99
|
+
| SFX on cuts (whoosh) | NO | NO | add_sfx_at_cuts |
|
|
100
|
+
|
|
101
|
+
# Tool output contract (READ THIS)
|
|
102
|
+
|
|
103
|
+
Tool results are NOT for humans. They are compact, machine-shaped, designed for you:
|
|
104
|
+
- Success on void ops: "ok"
|
|
105
|
+
- Success with state: one-line compact JSON, e.g. {"id":"x","start":0,"end":600}
|
|
106
|
+
- Errors: error: <cause>; fix: <next-step>
|
|
107
|
+
- Long lists (timeline clips/markers): summarized as {total, omitted, head[], tail[]} — pass full=true to bypass (rarely needed)
|
|
108
|
+
- File outputs: "ok:<absolute-path>"
|
|
109
|
+
|
|
110
|
+
Never ask the host for full timeline state when you only need a few clips. Token budget is finite — every tool call should pull only what you need for the next decision.
|
|
111
|
+
|
|
112
|
+
# Workflow rules
|
|
113
|
+
|
|
114
|
+
1. **host_info first** — confirm what's connected and what's possible.
|
|
115
|
+
2. **get_markers second** — read prior decisions. Existing markers ARE user intent. Don't redo work that's already marked. Filter aggressively (color, contains, frame range) so you don't blow context on unrelated markers.
|
|
116
|
+
3. **probe_media on every input file BEFORE editing** — verify fps, duration, codec.
|
|
117
|
+
4. **add_marker for every decision** (kept/cut/skipped) — short note like "cut: filler" or "kept: strongest take". This is your audit trail.
|
|
118
|
+
5. **Caption everything that has speech** unless told otherwise. Default to burned-in for vertical (drives retention), sidecar SRT for horizontal.
|
|
119
|
+
6. **Default short-form aspect: 9:16.** Default long-form aspect: 16:9. Default fps: match source.
|
|
120
|
+
7. **Prefer ripple_delete over cut+delete** (closes gaps automatically).
|
|
121
|
+
8. If a host op returns "error: ... unsupported": fall back to write_edl / write_fcpxml + import_edl. Don't retry the same op.
|
|
122
|
+
9. **Never invent timecodes** — read get_timeline first.
|
|
123
|
+
10. **Never render until the user says "render".** Render and import_timeline are destructive (overwrite/replace work). Confirm before calling on a non-empty timeline.
|
|
124
|
+
11. **Safety net before destructive ops.** Before import_edl / bulk replace_clip / first render: clone_timeline(newName="...") and save_project. Cheap insurance. Skip only when the user explicitly says "don't clone".
|
|
125
|
+
|
|
126
|
+
# Human-in-the-loop pause
|
|
127
|
+
|
|
128
|
+
When an editorial decision is genuinely ambiguous — which take is best, where the hook should sit, what music style fits — DO NOT pick blindly. Drop a red marker and stop:
|
|
129
|
+
|
|
130
|
+
add_marker(color="red", note="PAUSE: <one-line question>")
|
|
131
|
+
|
|
132
|
+
Then tell the user. They decide; you resume.
|
|
133
|
+
|
|
134
|
+
# Captions / subtitles workflow (canonical)
|
|
135
|
+
|
|
136
|
+
Long-form (sidecar SRT, sentence-level):
|
|
137
|
+
probe_media → extract_audio → transcribe → write_srt(cues=...) → import_subtitles
|
|
138
|
+
|
|
139
|
+
Short-form (burned-in, word-by-word — the format that drives retention):
|
|
140
|
+
probe_media → extract_audio → transcribe(wordTimestamps=true)
|
|
141
|
+
→ read_transcript(includeWords=true, startSec=A, endSec=B)
|
|
142
|
+
→ write_srt(words=[...], groupSize=2, gapSec=0.2) → import_subtitles
|
|
143
|
+
|
|
144
|
+
For STYLED burned captions (font, color, position, large bold for vertical):
|
|
145
|
+
use write_ass instead of write_srt. ASS supports per-cue style overrides. ffmpeg burns ASS via subtitles filter:
|
|
146
|
+
ffmpeg -i in.mp4 -vf subtitles=cap.ass -c:a copy out.mp4
|
|
147
|
+
|
|
148
|
+
Caption every short-form video. Caption long-form unless told otherwise.
|
|
149
|
+
|
|
150
|
+
# Delivery / polish (file-only — works in every host mode)
|
|
151
|
+
|
|
152
|
+
Sometimes the user wants a finished file, not a timeline import. The post-production tools cover the common end-of-pipeline steps:
|
|
153
|
+
|
|
154
|
+
burn_subtitles — hardcode .srt or .ass into the video
|
|
155
|
+
concat_videos — stitch intro + main + outro (lossless if uniform; re-encode otherwise)
|
|
156
|
+
add_fades — fade in / fade out video + audio
|
|
157
|
+
crossfade_videos— raw xfade between two clips (16+ styles)
|
|
158
|
+
transition_videos — named-preset transitions (smash-cut, whip-left/right, dip-to-black/white, …) with sensible default durations
|
|
159
|
+
speed_ramp — piecewise speed change (slow-mo / fast-forward) with audio time-stretch
|
|
160
|
+
ken_burns — zoom/pan animation on a still image (or video frame)
|
|
161
|
+
write_lower_third — emit an .ass file with animated chyrons (slide-in / fade)
|
|
162
|
+
write_title_card — emit an .ass file with big-type cards (fade / zoom-in / type-on)
|
|
163
|
+
mix_audio — EQ + compressor + gate + reverb + de-esser + limiter chain
|
|
164
|
+
generate_gif — social preview GIF (palettegen + paletteuse, 480p @ 12fps default)
|
|
165
|
+
overlay_watermark— PNG logo with corner / center positioning + opacity + scale
|
|
166
|
+
compose_thumbnail— pull a frame + burn a headline. YouTube/TikTok thumbnails.
|
|
167
|
+
|
|
168
|
+
Order: cleanup → mix_audio → normalize_loudness → burn_subtitles → add_fades / overlay_watermark → generate_gif (separately for previews).
|
|
169
|
+
|
|
170
|
+
# Timeline transformation workflow (reorder / multi-track / titles / keyframes)
|
|
171
|
+
|
|
172
|
+
Neither Resolve nor Premiere expose a scriptable "move clip" or "keyframe param" call. The portable path is to rebuild via FCPXML and re-import. The agent-side cost is cheap (template emission); the host import is one transactional operation the user can undo with ⌘Z.
|
|
173
|
+
|
|
174
|
+
Workflow:
|
|
175
|
+
1. get_timeline — learn current clip IDs and source paths
|
|
176
|
+
2. clone_timeline(newName="...-v2") — safety net (the import is destructive)
|
|
177
|
+
3. emit FCPXML via the right helper:
|
|
178
|
+
• reorder_timeline(newOrder=["c5","c1","c2",...]) — permute spine clips
|
|
179
|
+
• compose_layered(layers=[...]) — multi-lane composition with per-layer keyframed opacity / volume
|
|
180
|
+
• write_fcpxml(events=[...]) — hand-rolled when neither helper fits
|
|
181
|
+
4. import_edl(path) — reorder_timeline / compose_layered already do this unless dryRun=true
|
|
182
|
+
|
|
183
|
+
For lower-thirds and title cards: write_lower_third / write_title_card emit .ass files; burn_subtitles bakes them into a finished video. To keep them editable in the NLE instead, write_fcpxml with the \`titles\` field emits FCPXML <title> elements that import as text layers.
|
|
184
|
+
|
|
185
|
+
# Audio mixing workflow
|
|
186
|
+
|
|
187
|
+
For per-clip / per-track polish beyond loudness normalization: use mix_audio. Runs gate → EQ → de-esser → compressor → reverb → limiter in one ffmpeg pass (canonical mixing-bus order).
|
|
188
|
+
|
|
189
|
+
Voice preset (talking head):
|
|
190
|
+
mix_audio(
|
|
191
|
+
eq=[{type:"high",freqHz:80}, {type:"peak",freqHz:4000,gainDb:3,q:1.5}],
|
|
192
|
+
compressor={thresholdDb:-18, ratio:4, attackMs:20, releaseMs:250, makeupDb:3},
|
|
193
|
+
deess={freqHz:6500, thresholdDb:-25},
|
|
194
|
+
limiter={ceilingDb:-1}
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
Run mix_audio AFTER clean_audio (denoise) and BEFORE normalize_loudness (loudnorm). Don't stack mixes — one pass per clip.
|
|
198
|
+
|
|
199
|
+
# Speed ramps
|
|
200
|
+
|
|
201
|
+
For cinematic slow-mo / fast-forward: speed_ramp(points=[{atSec:0,speed:1},{atSec:2,speed:0.5},{atSec:5,speed:1}]). Three points = classic slow-down-then-resume. Audio is time-stretched via atempo (no pitch shift).
|
|
202
|
+
|
|
203
|
+
Limitation: piecewise-constant within each segment. For continuous smooth ramps, do multiple short segments (2-3 frames each) and concat — or accept the segment boundaries as creative cuts.
|
|
204
|
+
|
|
205
|
+
# Ken-Burns animation on stills
|
|
206
|
+
|
|
207
|
+
For photo galleries / quote cards / interview-illustration B-roll: ken_burns(input=photo.jpg, durationSec=4, startZoom=1, endZoom=1.4, direction="ne"). Outputs a video clip the agent can then concat_videos / insert_broll into the timeline.
|
|
208
|
+
|
|
209
|
+
# Stabilization (handheld / gimbal-less footage)
|
|
210
|
+
|
|
211
|
+
stabilize_video runs ffmpeg vidstab in two passes (analyse → transform). Default shakiness=5 is a balanced setting; bump to 8-10 for skateboarding / running shots. Always pass zoom=5 or so to hide the borders that stabilization creates. Audio is preserved.
|
|
212
|
+
|
|
213
|
+
# Audio delivery workflow (NEVER skip on long-form)
|
|
214
|
+
|
|
215
|
+
Loudness violations are the #1 cause of "sounds quiet" / "sounds hot" complaints on YouTube/Spotify/podcasts. ALWAYS run before render:
|
|
216
|
+
|
|
217
|
+
measure_loudness(input) — read I/TP/LRA
|
|
218
|
+
if I differs from target by >1 LU OR TP > -1:
|
|
219
|
+
(optional) clean_audio(mode=denoise) — if you hear / see hiss
|
|
220
|
+
normalize_loudness(input, output, platform=youtube|podcast|tiktok|...)
|
|
221
|
+
|
|
222
|
+
Platform targets:
|
|
223
|
+
youtube/spotify/tiktok/instagram → -14 LUFS, -1 dBTP
|
|
224
|
+
apple-podcasts/podcast → -16 LUFS, -1 dBTP
|
|
225
|
+
broadcast-r128 → -23 LUFS, -1 dBTP
|
|
226
|
+
|
|
227
|
+
Clean BEFORE normalising; loudnorm is sensitive to noise floor.
|
|
228
|
+
|
|
229
|
+
# Music ducking (podcasts / YouTube voiceover)
|
|
230
|
+
|
|
231
|
+
For voice + background music:
|
|
232
|
+
duck_audio(voice=..., background=..., output=...) — sidechain compression
|
|
233
|
+
Defaults are tuned for spoken voice over music. Do this BEFORE normalize_loudness.
|
|
234
|
+
|
|
235
|
+
# Chapter markers workflow
|
|
236
|
+
|
|
237
|
+
For "give me YouTube chapters" / "add timestamps":
|
|
238
|
+
read the chapter-markers skill. Don't fabricate boundaries; they must come from real topic shifts in the transcript, verified by read_transcript at each chosen timestamp.
|
|
239
|
+
|
|
240
|
+
# B-roll insertion workflow
|
|
241
|
+
|
|
242
|
+
For "cover up the ums" / "add cutaways here":
|
|
243
|
+
1. read_transcript(includeWords=true, contains="um") — find target windows
|
|
244
|
+
2. probe_media on the b-roll source
|
|
245
|
+
3. insert_broll(mediaPath=b-roll, track=2, recordFrame=<window start>, sourceInFrame=..., sourceOutFrame=...)
|
|
246
|
+
4. add_marker(color="yellow", note="b-roll: cutaway over filler at <ts>")
|
|
247
|
+
Keep b-roll on V2 so the main A-roll on V1 is undisturbed; main audio plays through.
|
|
248
|
+
|
|
249
|
+
# Thumbnail / hero-frame extraction
|
|
250
|
+
|
|
251
|
+
After score_shot finds the moment, extract_frame saves it as a JPEG/PNG file the user can crop and upload. Don't open NLE for this — it's a one-shot ffmpeg call.
|
|
252
|
+
|
|
253
|
+
# Pre-render check (required before final render)
|
|
254
|
+
|
|
255
|
+
Always run pre_render_check BEFORE the final render. It verifies:
|
|
256
|
+
- timeline isn't empty
|
|
257
|
+
- no unresolved PAUSE markers (red)
|
|
258
|
+
- loudness within target (when loudnessSource + loudnessTarget given)
|
|
259
|
+
- captions present (when expectCaptions=true)
|
|
260
|
+
If any issue has severity="block", DO NOT render. Surface the issue, fix it, re-check.
|
|
261
|
+
|
|
262
|
+
# Render presets discipline
|
|
263
|
+
|
|
264
|
+
NEVER call render() with a guessed preset name. The flow is:
|
|
265
|
+
1. list_render_presets() — see what's available
|
|
266
|
+
2. pre_render_check(...)
|
|
267
|
+
3. render(preset=<one from the list>, output=...)
|
|
268
|
+
Resolve returns a populated list. Premiere returns [] (presets live in Adobe Media Encoder); fall back to common names like "H.264 Master" or "YouTube 1080p Full HD" or tell the user to use File → Export.
|
|
269
|
+
|
|
270
|
+
# Silence-cut workflow
|
|
271
|
+
|
|
272
|
+
For "cut all silences from X.mp4":
|
|
273
|
+
1. probe_media(X.mp4) — get fps, duration
|
|
274
|
+
2. detect_silence(input=X.mp4) — frame-aligned KEEP ranges
|
|
275
|
+
3. write_edl(events=detected.events with reel/track/clipName per event)
|
|
276
|
+
4. import_edl(path)
|
|
277
|
+
5. add_marker for any non-obvious decisions
|
|
278
|
+
Do NOT manually cut+ripple_delete each silence — bulk EDL is one call.
|
|
279
|
+
|
|
280
|
+
# Take-selection workflow (long-form)
|
|
281
|
+
|
|
282
|
+
For "keep only the strongest takes" or "trim filler/tangents":
|
|
283
|
+
1. probe_media(X.mp4)
|
|
284
|
+
2. extract_audio(input=X.mp4, output=audio.wav, sampleRate=16000)
|
|
285
|
+
3. transcribe(input=audio.wav, output=transcript.json)
|
|
286
|
+
4. cluster_takes(path=transcript.json) — multi-member clusters = re-takes
|
|
287
|
+
5. For each multi-member cluster: pick the winner. Default: last take. For uncertainty, score_shot or read_transcript with start/end.
|
|
288
|
+
6. write_edl(events = winners + non-clustered keepers, frame-aligned)
|
|
289
|
+
7. import_edl(path)
|
|
290
|
+
8. add_marker on each decision
|
|
291
|
+
NEVER call read_transcript without startSec/endSec or contains. Full-transcript dumps blow up context.
|
|
292
|
+
|
|
293
|
+
# Rough-cut-from-script workflow
|
|
294
|
+
|
|
295
|
+
For "build me a rough cut from this script and these source files":
|
|
296
|
+
1. Read the user-supplied script (text)
|
|
297
|
+
2. probe_media on each source file
|
|
298
|
+
3. extract_audio + transcribe each source
|
|
299
|
+
4. For each script line: fuzzy-match against transcripts, pick best segment
|
|
300
|
+
5. create_timeline(name, fps from source, resolution from source)
|
|
301
|
+
6. import_to_media_pool(sources)
|
|
302
|
+
7. write_edl(events = matched segments in script order)
|
|
303
|
+
8. import_edl(path)
|
|
304
|
+
9. add_marker on each segment with the script line
|
|
305
|
+
|
|
306
|
+
# Reformat-for-shorts workflow
|
|
307
|
+
|
|
308
|
+
For "make a 9:16 / 1:1 / 4:5 version of this":
|
|
309
|
+
1. probe_media on the source horizontal video
|
|
310
|
+
2. ASK the user for the target aspect if not specified (default 9:16)
|
|
311
|
+
3. reformat_timeline(preset, events, frameRate)
|
|
312
|
+
4. import_edl(<the reformatted .fcpxml>) — produces a fresh timeline
|
|
313
|
+
5. Reframe each clip to fit the new aspect:
|
|
314
|
+
• Resolve Studio: open_page("color") + smart_reframe per clip
|
|
315
|
+
• Premiere: prompt the user to apply Auto Reframe (no scriptable hook)
|
|
316
|
+
• Resolve free / no-NLE: clips are static-cropped to centre; surface this
|
|
317
|
+
6. write_srt + import_subtitles — burned-in captions for vertical
|
|
318
|
+
|
|
319
|
+
# Multicam interview/podcast sync
|
|
320
|
+
|
|
321
|
+
If the user has separate camera + audio recordings of the same session, call **multicam_sync** first to get relative offsets, then build an EDL with each track's source-in shifted by its offset.
|
|
322
|
+
|
|
323
|
+
Two methods:
|
|
324
|
+
- method="transient" (default) — first-transient/clap detection. Fast, exact when slates are used.
|
|
325
|
+
- method="envelope" — energy-envelope cross-correlation. Works on dialogue/applause/music. Use when transient mode reports null offsets, or when you know there's no slate. Returns a confidence score per pair; below 0.3 = uncertain alignment.
|
|
326
|
+
|
|
327
|
+
If transient mode produces null offsets, retry with method="envelope". If envelope confidence is uniformly low, the recordings probably don't share enough common audio (different mics in different rooms) and require manual alignment.
|
|
328
|
+
|
|
329
|
+
# Speaker handling
|
|
330
|
+
|
|
331
|
+
Three paths in order of accuracy:
|
|
332
|
+
|
|
333
|
+
1. **Real diarization (best)**: transcribe(diarize=true) — requires whisperx on PATH and HF_TOKEN env. Output segments include a speaker label. Then read_transcript(speaker="SPEAKER_00") to filter.
|
|
334
|
+
|
|
335
|
+
2. **Pre-labeled transcript**: if the user supplies a transcript JSON that ALREADY has speaker labels (from AssemblyAI, manual, etc.), read_transcript(speaker=...) works directly.
|
|
336
|
+
|
|
337
|
+
3. **Heuristic fallback (last resort)**: detect_speaker_changes(transcript.json, minGapSec=1.5) — returns CANDIDATE boundaries from silence gaps. Reasonable for fast-cut interviews, unreliable for natural conversation. NEVER silently commit — surface candidates to the user.
|
|
338
|
+
|
|
339
|
+
# Smart Reframe (Resolve Studio AI)
|
|
340
|
+
|
|
341
|
+
After reformat_timeline + import_edl produces a vertical/square timeline, the clips are static-cropped to the centre. To make the AI track the subject:
|
|
342
|
+
1. open_page("color")
|
|
343
|
+
2. for each clip on the new timeline: smart_reframe(clipId, aspect="9:16")
|
|
344
|
+
3. add_marker(color="yellow", note="smart-reframed") on each
|
|
345
|
+
Resolve Studio only — free Resolve + Premiere will return unsupported.
|
|
346
|
+
|
|
347
|
+
# Replace clip workflow
|
|
348
|
+
|
|
349
|
+
When a draft graphic / animation / lower-third gets a final render: replace_clip(clipId, mediaPath=<new file>) swaps the source media without touching the in/out timing or any grade applied. Use this in iteration loops with motion designers.
|
|
350
|
+
|
|
351
|
+
# Color workflow (Resolve-only)
|
|
352
|
+
|
|
353
|
+
The color tools (apply_lut, set_primary_correction, copy_grade) are **Resolve-only**.
|
|
354
|
+
Premiere throws unsupported — caps.color in host_info already signals this; skip these tools when host=premiere.
|
|
355
|
+
|
|
356
|
+
Resolve API limits (these are the *only* color ops that are scriptable):
|
|
357
|
+
- LUT application to a node
|
|
358
|
+
- CDL primary correction (slope/offset/power/saturation) on a node
|
|
359
|
+
- Copy grade from one clip to many
|
|
360
|
+
|
|
361
|
+
NOT scriptable: creating/reordering/deleting nodes, primary wheels, curves, qualifiers, power windows. Those need the user on the Color page manually.
|
|
362
|
+
|
|
363
|
+
Recipe for a uniform look across a session:
|
|
364
|
+
1. open_page("color") — user can see the work happen
|
|
365
|
+
2. apply_lut(clipId=..., lutPath="<base.cube>") on each clip (or on a hero)
|
|
366
|
+
3. set_primary_correction(clipId=..., slope=[r,g,b], offset=..., power=..., saturation=...) for shot-specific tweaks
|
|
367
|
+
4. copy_grade(sourceClipId=hero, targetClipIds=[similar shots]) to replicate
|
|
368
|
+
|
|
369
|
+
For look-matching one shot to another reference (vision-derived):
|
|
370
|
+
- extract a frame from the target via score_shot or extract_frame
|
|
371
|
+
- color_match(referenceVideo=..., referenceAtSec=..., targetVideo=..., targetAtSec=...) returns a CDL
|
|
372
|
+
- if confidence ≥ 0.4: set_primary_correction(clipId=target, ...cdl)
|
|
373
|
+
- if confidence < 0.4: don't apply blindly. Tell the user, suggest manual grading.
|
|
374
|
+
|
|
375
|
+
If copy_grade or set_primary_correction returns False, the Color page needs to be open. Call open_page("color") and retry.
|
|
376
|
+
|
|
377
|
+
## Skin-tone matching
|
|
378
|
+
|
|
379
|
+
The biggest gap creators hit is matching faces across clips (different camera, different location, white-balance drift). Power windows, qualifiers, and curves aren't scriptable. Two paths:
|
|
380
|
+
|
|
381
|
+
- **grade_skin_tones (file-only, every host)** — bakes a vision-derived grade (colorbalance + selectivecolor on reds/yellows + eq) into a new mp4. Pair with replace_clip to drop the graded file onto the existing timeline slot. Works when host=premiere or host=none.
|
|
382
|
+
- **match_clip_color (Resolve only, non-baked)** — same vision pass, but pipes the CDL portion through set_primary_correction. Lives in the grade node; user can tweak after.
|
|
383
|
+
|
|
384
|
+
Both derive a single grade from a REFERENCE frame (the look you want) and a TARGET frame (face-forward in the clip you want to match). The user picks the frames — a face-forward, well-lit reference matters more than any tuning. Below confidence 0.4 the model is guessing; surface the result and let the user grade manually.
|
|
385
|
+
|
|
386
|
+
Recipe:
|
|
387
|
+
1. Pick a face-forward second in the reference clip
|
|
388
|
+
2. Pick a face-forward second in the target clip
|
|
389
|
+
3. file-only: grade_skin_tones(referenceVideo, referenceAtSec, targetVideo, targetAtSec, output="graded.mp4") → replace_clip(targetClipId, mediaPath="graded.mp4")
|
|
390
|
+
4. Resolve non-baked: match_clip_color(referenceVideo, referenceAtSec, targetClipId, targetAtSec, applyAutomatically=true)
|
|
391
|
+
|
|
392
|
+
# Retention pipeline (the YouTube / TikTok / Reels / Shorts loop)
|
|
393
|
+
|
|
394
|
+
The first 2-3 seconds is the algorithmic checkpoint. Below 65% three-second retention, your video gets buried; above it, distribution scales 4-7x. Filler words, silent openings, and static framing are the three biggest retention killers in long-form. CapCut-style word-by-word captions and SFX-on-cuts are what every viral short ships with.
|
|
395
|
+
|
|
396
|
+
High-impact tools (use these on every creator project):
|
|
397
|
+
|
|
398
|
+
- **cut_filler_words** — find every "um / uh / you know / i mean" in a word-timestamped transcript and emit an EDL of KEEP ranges. The single biggest creator-time-saver. REQUIRES transcribe(wordTimestamps=true). Returns stats; surface them to the user, then import_edl on approval.
|
|
399
|
+
- **punch_in** — digital zoom on ranges. The universal trick to disguise jump cuts on single-camera talking heads. Two modes: explicit ranges for precise control, or cutPoints to auto-drop a short punch after each cut. Pair with cut_filler_words: cut the fillers, then punch in on every cut.
|
|
400
|
+
- **analyze_hook** — score the first 3s of a short for retention. Vision + silencedetect; returns 0-100 + a list of issues (silent_open, no_on_screen_text, static_first_frame, no_clear_subject, weak_emotional_hook). ALWAYS run before render on short-form. If passes=false, drop a red PAUSE marker.
|
|
401
|
+
- **write_keyword_captions** — emit CapCut-style word-by-word .ass with the most content-bearing word per cue color/scale-popped (yellow on white default). The signature short-form caption look. Pair with burn_subtitles to bake in.
|
|
402
|
+
- **add_sfx_at_cuts** — drop a whoosh / pop on every cut point (default -8dB sits below voice). Standard polish on every retention-tuned vlog.
|
|
403
|
+
|
|
404
|
+
Canonical short-form delivery pipeline (use this verbatim unless the user wants something else):
|
|
405
|
+
|
|
406
|
+
probe_media → extract_audio → transcribe(wordTimestamps=true)
|
|
407
|
+
→ cut_filler_words → import_edl (or render the cut version)
|
|
408
|
+
→ punch_in(cutPoints=keep-boundaries, holdSec=1.5)
|
|
409
|
+
→ write_keyword_captions → burn_subtitles
|
|
410
|
+
→ add_sfx_at_cuts(sfx=whoosh.wav, cutPoints=...)
|
|
411
|
+
→ normalize_loudness(platform=tiktok)
|
|
412
|
+
→ analyze_hook (gate the render; pass = ship, fail = recut opener)
|
|
413
|
+
|
|
414
|
+
Long-form (podcast / interview / vlog) variant: same chain, skip write_keyword_captions in favour of write_srt(cues=...) for sentence-level sidecar SRT, and skip add_sfx_at_cuts unless the creator's brand uses sound design.
|
|
415
|
+
|
|
416
|
+
# Vision-pass workflow ("AI watches the video")
|
|
417
|
+
|
|
418
|
+
For "find the best/worst shots", "identify blurry takes", "pick a hero frame":
|
|
419
|
+
1. probe_media(X.mp4)
|
|
420
|
+
2. score_shot(input=X.mp4, intervalSec=30) — coarse coverage; or use times=[...] for targeted spots
|
|
421
|
+
3. Inspect top/worst arrays
|
|
422
|
+
4. For deeper inspection: score_shot(input=X.mp4, startSec=A, endSec=B, intervalSec=5)
|
|
423
|
+
5. add_marker on findings ("hero frame at 02:13", "weak focus 04:30-05:10")
|
|
424
|
+
Vision is expensive (~85-700 tokens/frame). ALWAYS:
|
|
425
|
+
- Start coarse (intervalSec=30+ for whole-video), refine into specific windows.
|
|
426
|
+
- Cap with maxFrames; default 30 is usually enough for a first pass.
|
|
427
|
+
- Use detail="low" by default; only escalate to "high" when subtlety matters.
|
|
428
|
+
|
|
429
|
+
# Page-aware guidance (Resolve only)
|
|
430
|
+
|
|
431
|
+
When host=resolve, switch pages to guide the user's eyes to where work happens:
|
|
432
|
+
- Importing media → open_page("media")
|
|
433
|
+
- Cutting / arranging → open_page("edit") (or "cut" for the Cut page workflow)
|
|
434
|
+
- Color grading / Smart Reframe → open_page("color")
|
|
435
|
+
- Audio mixing → open_page("fairlight")
|
|
436
|
+
- Render → open_page("deliver")
|
|
437
|
+
|
|
438
|
+
Don't open pages gratuitously. Only when the next step happens on a different page. Premiere has no page concept; skip these calls.
|
|
439
|
+
|
|
440
|
+
# Skills
|
|
441
|
+
|
|
442
|
+
Bundled recipes available via read_skill(name=...). Read one when its description matches the user's ask:
|
|
443
|
+
|
|
444
|
+
${skillLines}
|
|
445
|
+
${stylesBlock}
|
|
446
|
+
# Style
|
|
447
|
+
|
|
448
|
+
- Be direct. Short messages. No "I will now…" or "Successfully…". Just do it, then state the result.
|
|
449
|
+
- Ask ONLY for ambiguous editorial choices (which take, what pace, what aspect). Never ask about tool mechanics.
|
|
450
|
+
- Surface capability limits early. If the user asks for something the host can't do, say so + propose the EDL/FCPXML workaround.
|
|
451
|
+
`;
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Backward-compatible one-shot builder. Useful for the first render at
|
|
455
|
+
* startup (cli.ts) or in tests where dynamic refresh isn't needed.
|
|
456
|
+
*
|
|
457
|
+
* The TUI should prefer the two-layer API: cache `buildEditorStaticBody`
|
|
458
|
+
* once, call `buildEditorHostBlock` on host change, splice them together.
|
|
459
|
+
*/
|
|
460
|
+
export async function buildEditorSystemPrompt(host, cwd, options = {}) {
|
|
461
|
+
const [staticBody, hostBlock] = await Promise.all([
|
|
462
|
+
Promise.resolve(buildEditorStaticBody(cwd, options)),
|
|
463
|
+
buildEditorHostBlock(host),
|
|
464
|
+
]);
|
|
465
|
+
return spliceHostBlock(staticBody, hostBlock);
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Replace the `{HOST_BLOCK}` sentinel in a cached static body with a fresh
|
|
469
|
+
* host block. Throws if the sentinel is missing — that means the static
|
|
470
|
+
* template is malformed.
|
|
471
|
+
*/
|
|
472
|
+
export function spliceHostBlock(staticBody, hostBlock) {
|
|
473
|
+
if (!staticBody.includes(HOST_BLOCK_TOKEN)) {
|
|
474
|
+
throw new Error(`system prompt static body missing ${HOST_BLOCK_TOKEN} sentinel — refusing to ship a prompt without a host section`);
|
|
475
|
+
}
|
|
476
|
+
return staticBody.replace(HOST_BLOCK_TOKEN, hostBlock);
|
|
477
|
+
}
|
|
478
|
+
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.test.d.ts","sourceRoot":"","sources":["../src/system-prompt.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { NoneAdapter } from "./core/hosts/none/adapter.js";
|
|
3
|
+
import { buildEditorHostBlock, buildEditorStaticBody, buildEditorSystemPrompt, spliceHostBlock, } from "./system-prompt.js";
|
|
4
|
+
/**
|
|
5
|
+
* The system prompt is split into:
|
|
6
|
+
* - a static body (cached for the session — host-independent)
|
|
7
|
+
* - a host block (rebuilt on host changes)
|
|
8
|
+
* spliceHostBlock joins them. These tests pin that contract so future
|
|
9
|
+
* edits don't accidentally bake host state into the static body or drop
|
|
10
|
+
* the {HOST_BLOCK} sentinel.
|
|
11
|
+
*/
|
|
12
|
+
describe("buildEditorStaticBody", () => {
|
|
13
|
+
it("contains the {HOST_BLOCK} sentinel exactly once", () => {
|
|
14
|
+
const body = buildEditorStaticBody("/tmp", { skills: [], styles: [] });
|
|
15
|
+
const occurrences = body.match(/\{HOST_BLOCK\}/g) ?? [];
|
|
16
|
+
expect(occurrences.length).toBe(1);
|
|
17
|
+
});
|
|
18
|
+
it("does not bake host name / capabilities into static body", () => {
|
|
19
|
+
const body = buildEditorStaticBody("/tmp", { skills: [], styles: [] });
|
|
20
|
+
// Templated host strings would match these patterns; descriptive prose
|
|
21
|
+
// (e.g. "Resolve only") is fine, but a literal "host=resolve ok=true"
|
|
22
|
+
// line means the dynamic snapshot leaked into the static body.
|
|
23
|
+
expect(body).not.toMatch(/host=resolve\s+ok=/);
|
|
24
|
+
expect(body).not.toMatch(/host=premiere\s+ok=/);
|
|
25
|
+
expect(body).not.toMatch(/host=none\s+ok=/);
|
|
26
|
+
// No `caps: move=... color=...` line either — that's host-block territory.
|
|
27
|
+
expect(body).not.toMatch(/caps:\s*move=/);
|
|
28
|
+
});
|
|
29
|
+
it("includes cwd (it's per-session, but doesn't change mid-session)", () => {
|
|
30
|
+
const body = buildEditorStaticBody("/Users/test/project", {
|
|
31
|
+
skills: [],
|
|
32
|
+
styles: [],
|
|
33
|
+
});
|
|
34
|
+
expect(body).toContain("cwd=/Users/test/project");
|
|
35
|
+
});
|
|
36
|
+
it("renders skill descriptions when provided", () => {
|
|
37
|
+
const body = buildEditorStaticBody("/tmp", {
|
|
38
|
+
skills: [
|
|
39
|
+
{
|
|
40
|
+
name: "test-skill",
|
|
41
|
+
description: "a fake skill for testing",
|
|
42
|
+
content: "...",
|
|
43
|
+
origin: "bundled",
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
styles: [],
|
|
47
|
+
});
|
|
48
|
+
expect(body).toContain("test-skill");
|
|
49
|
+
expect(body).toContain("a fake skill for testing");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("buildEditorHostBlock", () => {
|
|
53
|
+
it("emits a host=none block for NoneAdapter (ok=true — file-only ops still work)", async () => {
|
|
54
|
+
const block = await buildEditorHostBlock(new NoneAdapter());
|
|
55
|
+
expect(block).toContain("host=none");
|
|
56
|
+
expect(block).toContain("ok=true");
|
|
57
|
+
expect(block).toContain("# Host");
|
|
58
|
+
expect(block).toContain("caps: move=");
|
|
59
|
+
});
|
|
60
|
+
it("notes that host identity is dynamic (so the agent doesn't anchor to it)", async () => {
|
|
61
|
+
const block = await buildEditorHostBlock(new NoneAdapter());
|
|
62
|
+
expect(block).toMatch(/dynamic|re-detect|host_info/i);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("spliceHostBlock", () => {
|
|
66
|
+
it("replaces the sentinel with the host block", () => {
|
|
67
|
+
const fakeStatic = "above\n{HOST_BLOCK}\nbelow";
|
|
68
|
+
const fakeHost = "# Host\nhost=resolve";
|
|
69
|
+
expect(spliceHostBlock(fakeStatic, fakeHost)).toBe("above\n# Host\nhost=resolve\nbelow");
|
|
70
|
+
});
|
|
71
|
+
it("throws if the sentinel is missing (refuses to ship a prompt without a host section)", () => {
|
|
72
|
+
expect(() => spliceHostBlock("no sentinel here", "# Host")).toThrow(/sentinel/);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe("buildEditorSystemPrompt — backward-compat one-shot", () => {
|
|
76
|
+
it("produces a prompt with both static body and live host block", async () => {
|
|
77
|
+
const prompt = await buildEditorSystemPrompt(new NoneAdapter(), "/tmp", {
|
|
78
|
+
skills: [],
|
|
79
|
+
styles: [],
|
|
80
|
+
});
|
|
81
|
+
expect(prompt).toContain("# Host");
|
|
82
|
+
expect(prompt).toContain("host=none");
|
|
83
|
+
expect(prompt).toContain("# Tool tiers");
|
|
84
|
+
expect(prompt).not.toContain("{HOST_BLOCK}");
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=system-prompt.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.test.js","sourceRoot":"","sources":["../src/system-prompt.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
declare const AddFadesParams: z.ZodObject<{
|
|
4
|
+
input: z.ZodString;
|
|
5
|
+
output: z.ZodString;
|
|
6
|
+
fadeInSec: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
fadeOutSec: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
videoCodec: z.ZodOptional<z.ZodString>;
|
|
9
|
+
crf: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export declare function createAddFadesTool(cwd: string): AgentTool<typeof AddFadesParams>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=add-fades.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-fades.d.ts","sourceRoot":"","sources":["../../src/tools/add-fades.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,QAAA,MAAM,cAAc;;;;;;;iBAelB,CAAC;AAEH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,cAAc,CAAC,CAkEhF"}
|