@kenkaiiii/gg-editor 0.6.7 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +64 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/audio-mix.d.ts.map +1 -1
- package/dist/core/audio-mix.js +8 -1
- package/dist/core/audio-mix.js.map +1 -1
- package/dist/core/audio-mix.test.js +1 -1
- package/dist/core/audio-mix.test.js.map +1 -1
- package/dist/core/auth/api-keys.d.ts +1 -1
- package/dist/core/auth/api-keys.d.ts.map +1 -1
- package/dist/core/auth/api-keys.js +2 -1
- package/dist/core/auth/api-keys.js.map +1 -1
- package/dist/core/auth/index.d.ts +18 -5
- package/dist/core/auth/index.d.ts.map +1 -1
- package/dist/core/auth/index.js +16 -4
- package/dist/core/auth/index.js.map +1 -1
- package/dist/core/auth/login.d.ts.map +1 -1
- package/dist/core/auth/login.js +4 -31
- package/dist/core/auth/login.js.map +1 -1
- package/dist/core/beats.d.ts +59 -0
- package/dist/core/beats.d.ts.map +1 -0
- package/dist/core/beats.js +122 -0
- package/dist/core/beats.js.map +1 -0
- package/dist/core/beats.test.d.ts +2 -0
- package/dist/core/beats.test.d.ts.map +1 -0
- package/dist/core/beats.test.js +86 -0
- package/dist/core/beats.test.js.map +1 -0
- package/dist/core/brand-kit.d.ts +80 -0
- package/dist/core/brand-kit.d.ts.map +1 -0
- package/dist/core/brand-kit.js +96 -0
- package/dist/core/brand-kit.js.map +1 -0
- package/dist/core/brand-kit.test.d.ts +2 -0
- package/dist/core/brand-kit.test.d.ts.map +1 -0
- package/dist/core/brand-kit.test.js +76 -0
- package/dist/core/brand-kit.test.js.map +1 -0
- package/dist/core/bundled-sfx.d.ts +64 -0
- package/dist/core/bundled-sfx.d.ts.map +1 -0
- package/dist/core/bundled-sfx.js +218 -0
- package/dist/core/bundled-sfx.js.map +1 -0
- package/dist/core/bundled-sfx.test.d.ts +2 -0
- package/dist/core/bundled-sfx.test.d.ts.map +1 -0
- package/dist/core/bundled-sfx.test.js +81 -0
- package/dist/core/bundled-sfx.test.js.map +1 -0
- package/dist/core/child-abort.d.ts +57 -0
- package/dist/core/child-abort.d.ts.map +1 -0
- package/dist/core/child-abort.js +95 -0
- package/dist/core/child-abort.js.map +1 -0
- package/dist/core/child-abort.test.d.ts +2 -0
- package/dist/core/child-abort.test.d.ts.map +1 -0
- package/dist/core/child-abort.test.js +88 -0
- package/dist/core/child-abort.test.js.map +1 -0
- package/dist/core/clip-scoring.d.ts +44 -0
- package/dist/core/clip-scoring.d.ts.map +1 -0
- package/dist/core/clip-scoring.js +165 -0
- package/dist/core/clip-scoring.js.map +1 -0
- package/dist/core/clip-scoring.test.d.ts +2 -0
- package/dist/core/clip-scoring.test.d.ts.map +1 -0
- package/dist/core/clip-scoring.test.js +113 -0
- package/dist/core/clip-scoring.test.js.map +1 -0
- package/dist/core/emoji-captions.d.ts +45 -0
- package/dist/core/emoji-captions.d.ts.map +1 -0
- package/dist/core/emoji-captions.js +121 -0
- package/dist/core/emoji-captions.js.map +1 -0
- package/dist/core/face-reframe.d.ts +91 -0
- package/dist/core/face-reframe.d.ts.map +1 -0
- package/dist/core/face-reframe.js +141 -0
- package/dist/core/face-reframe.js.map +1 -0
- package/dist/core/face-reframe.test.d.ts +2 -0
- package/dist/core/face-reframe.test.d.ts.map +1 -0
- package/dist/core/face-reframe.test.js +171 -0
- package/dist/core/face-reframe.test.js.map +1 -0
- package/dist/core/filler-words.d.ts +57 -9
- package/dist/core/filler-words.d.ts.map +1 -1
- package/dist/core/filler-words.js +61 -9
- package/dist/core/filler-words.js.map +1 -1
- package/dist/core/filler-words.test.js +91 -17
- package/dist/core/filler-words.test.js.map +1 -1
- package/dist/core/hook-rewrite.d.ts +48 -0
- package/dist/core/hook-rewrite.d.ts.map +1 -0
- package/dist/core/hook-rewrite.js +151 -0
- package/dist/core/hook-rewrite.js.map +1 -0
- package/dist/core/hook-rewrite.test.d.ts +2 -0
- package/dist/core/hook-rewrite.test.d.ts.map +1 -0
- package/dist/core/hook-rewrite.test.js +58 -0
- package/dist/core/hook-rewrite.test.js.map +1 -0
- package/dist/core/hosts/lazy.d.ts.map +1 -1
- package/dist/core/hosts/lazy.js +2 -0
- package/dist/core/hosts/lazy.js.map +1 -1
- package/dist/core/hosts/premiere/adapter.d.ts +1 -0
- package/dist/core/hosts/premiere/adapter.d.ts.map +1 -1
- package/dist/core/hosts/premiere/adapter.js.map +1 -1
- package/dist/core/hosts/premiere/bridge-source.d.ts.map +1 -1
- package/dist/core/hosts/premiere/bridge-source.js +6 -3
- package/dist/core/hosts/premiere/bridge-source.js.map +1 -1
- package/dist/core/hosts/resolve/adapter.d.ts +1 -0
- package/dist/core/hosts/resolve/adapter.d.ts.map +1 -1
- package/dist/core/hosts/resolve/adapter.js.map +1 -1
- package/dist/core/hosts/resolve/bridge-source.d.ts.map +1 -1
- package/dist/core/hosts/resolve/bridge-source.js +31 -4
- package/dist/core/hosts/resolve/bridge-source.js.map +1 -1
- package/dist/core/hosts/resolve/bridge.d.ts +2 -19
- package/dist/core/hosts/resolve/bridge.d.ts.map +1 -1
- package/dist/core/hosts/resolve/bridge.js +70 -41
- package/dist/core/hosts/resolve/bridge.js.map +1 -1
- package/dist/core/hosts/resolve/bridge.test.js +130 -0
- package/dist/core/hosts/resolve/bridge.test.js.map +1 -1
- package/dist/core/hosts/types.d.ts +6 -0
- package/dist/core/hosts/types.d.ts.map +1 -1
- package/dist/core/hosts/types.js.map +1 -1
- package/dist/core/logger.d.ts +32 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +188 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/loop-match.d.ts +57 -0
- package/dist/core/loop-match.d.ts.map +1 -0
- package/dist/core/loop-match.js +91 -0
- package/dist/core/loop-match.js.map +1 -0
- package/dist/core/media/ffmpeg.d.ts.map +1 -1
- package/dist/core/media/ffmpeg.js +14 -3
- package/dist/core/media/ffmpeg.js.map +1 -1
- package/dist/core/multi-format.d.ts +67 -0
- package/dist/core/multi-format.d.ts.map +1 -0
- package/dist/core/multi-format.js +127 -0
- package/dist/core/multi-format.js.map +1 -0
- package/dist/core/multi-format.test.d.ts +2 -0
- package/dist/core/multi-format.test.d.ts.map +1 -0
- package/dist/core/multi-format.test.js +151 -0
- package/dist/core/multi-format.test.js.map +1 -0
- package/dist/core/python/beats.py +61 -0
- package/dist/core/python/face_reframe.py +163 -0
- package/dist/core/python/sidecar-path.d.ts +13 -0
- package/dist/core/python/sidecar-path.d.ts.map +1 -0
- package/dist/core/python/sidecar-path.js +24 -0
- package/dist/core/python/sidecar-path.js.map +1 -0
- package/dist/core/python.d.ts +57 -0
- package/dist/core/python.d.ts.map +1 -0
- package/dist/core/python.js +107 -0
- package/dist/core/python.js.map +1 -0
- package/dist/core/python.test.d.ts +2 -0
- package/dist/core/python.test.d.ts.map +1 -0
- package/dist/core/python.test.js +129 -0
- package/dist/core/python.test.js.map +1 -0
- package/dist/core/retention-structure.d.ts +81 -0
- package/dist/core/retention-structure.d.ts.map +1 -0
- package/dist/core/retention-structure.js +206 -0
- package/dist/core/retention-structure.js.map +1 -0
- package/dist/core/retention-structure.test.d.ts +2 -0
- package/dist/core/retention-structure.test.d.ts.map +1 -0
- package/dist/core/retention-structure.test.js +88 -0
- package/dist/core/retention-structure.test.js.map +1 -0
- package/dist/core/review.d.ts +17 -0
- package/dist/core/review.d.ts.map +1 -1
- package/dist/core/review.js +20 -24
- package/dist/core/review.js.map +1 -1
- package/dist/core/safe-paths.d.ts +11 -0
- package/dist/core/safe-paths.d.ts.map +1 -1
- package/dist/core/safe-paths.js +26 -10
- package/dist/core/safe-paths.js.map +1 -1
- package/dist/core/safe-paths.test.js +16 -0
- package/dist/core/safe-paths.test.js.map +1 -1
- package/dist/core/skills-loader.d.ts +48 -2
- package/dist/core/skills-loader.d.ts.map +1 -1
- package/dist/core/skills-loader.js +97 -19
- package/dist/core/skills-loader.js.map +1 -1
- package/dist/core/skills-loader.test.js +63 -1
- package/dist/core/skills-loader.test.js.map +1 -1
- package/dist/core/srt.d.ts +42 -7
- package/dist/core/srt.d.ts.map +1 -1
- package/dist/core/srt.js +101 -32
- package/dist/core/srt.js.map +1 -1
- package/dist/core/srt.test.js +54 -1
- package/dist/core/srt.test.js.map +1 -1
- package/dist/core/thumbnail-compose.d.ts +58 -0
- package/dist/core/thumbnail-compose.d.ts.map +1 -0
- package/dist/core/thumbnail-compose.js +101 -0
- package/dist/core/thumbnail-compose.js.map +1 -0
- package/dist/core/thumbnail-promise.d.ts +46 -0
- package/dist/core/thumbnail-promise.d.ts.map +1 -0
- package/dist/core/thumbnail-promise.js +133 -0
- package/dist/core/thumbnail-promise.js.map +1 -0
- package/dist/core/thumbnail-promise.test.d.ts +2 -0
- package/dist/core/thumbnail-promise.test.d.ts.map +1 -0
- package/dist/core/thumbnail-promise.test.js +52 -0
- package/dist/core/thumbnail-promise.test.js.map +1 -0
- package/dist/core/viral-moments.d.ts +70 -0
- package/dist/core/viral-moments.d.ts.map +1 -0
- package/dist/core/viral-moments.js +192 -0
- package/dist/core/viral-moments.js.map +1 -0
- package/dist/core/viral-moments.test.d.ts +2 -0
- package/dist/core/viral-moments.test.d.ts.map +1 -0
- package/dist/core/viral-moments.test.js +153 -0
- package/dist/core/viral-moments.test.js.map +1 -0
- package/dist/core/whisper.d.ts +16 -0
- package/dist/core/whisper.d.ts.map +1 -1
- package/dist/core/whisper.js +72 -5
- package/dist/core/whisper.js.map +1 -1
- package/dist/core/whisper.test.js +111 -1
- package/dist/core/whisper.test.js.map +1 -1
- package/dist/core/youtube-metadata.d.ts +44 -0
- package/dist/core/youtube-metadata.d.ts.map +1 -0
- package/dist/core/youtube-metadata.js +168 -0
- package/dist/core/youtube-metadata.js.map +1 -0
- package/dist/core/youtube-metadata.test.d.ts +2 -0
- package/dist/core/youtube-metadata.test.d.ts.map +1 -0
- package/dist/core/youtube-metadata.test.js +132 -0
- package/dist/core/youtube-metadata.test.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/prompt-commands.d.ts +24 -0
- package/dist/prompt-commands.d.ts.map +1 -0
- package/dist/prompt-commands.js +243 -0
- package/dist/prompt-commands.js.map +1 -0
- package/dist/prompt-commands.test.d.ts +2 -0
- package/dist/prompt-commands.test.d.ts.map +1 -0
- package/dist/prompt-commands.test.js +46 -0
- package/dist/prompt-commands.test.js.map +1 -0
- package/dist/skills.d.ts +6 -6
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +1426 -445
- package/dist/skills.js.map +1 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +108 -0
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/add-fades.d.ts.map +1 -1
- package/dist/tools/add-fades.js +2 -1
- package/dist/tools/add-fades.js.map +1 -1
- package/dist/tools/add-sfx-at-cuts.d.ts.map +1 -1
- package/dist/tools/add-sfx-at-cuts.js +36 -11
- package/dist/tools/add-sfx-at-cuts.js.map +1 -1
- package/dist/tools/add-sfx-to-timeline.d.ts +34 -0
- package/dist/tools/add-sfx-to-timeline.d.ts.map +1 -0
- package/dist/tools/add-sfx-to-timeline.js +169 -0
- package/dist/tools/add-sfx-to-timeline.js.map +1 -0
- package/dist/tools/add-sfx-to-timeline.test.d.ts +2 -0
- package/dist/tools/add-sfx-to-timeline.test.d.ts.map +1 -0
- package/dist/tools/add-sfx-to-timeline.test.js +181 -0
- package/dist/tools/add-sfx-to-timeline.test.js.map +1 -0
- package/dist/tools/audit-first-frame.d.ts +36 -0
- package/dist/tools/audit-first-frame.d.ts.map +1 -0
- package/dist/tools/audit-first-frame.js +181 -0
- package/dist/tools/audit-first-frame.js.map +1 -0
- package/dist/tools/audit-retention-structure.d.ts +20 -0
- package/dist/tools/audit-retention-structure.d.ts.map +1 -0
- package/dist/tools/audit-retention-structure.js +95 -0
- package/dist/tools/audit-retention-structure.js.map +1 -0
- package/dist/tools/audit-retention-structure.test.d.ts +2 -0
- package/dist/tools/audit-retention-structure.test.d.ts.map +1 -0
- package/dist/tools/audit-retention-structure.test.js +93 -0
- package/dist/tools/audit-retention-structure.test.js.map +1 -0
- package/dist/tools/bleep-words.d.ts +59 -0
- package/dist/tools/bleep-words.d.ts.map +1 -0
- package/dist/tools/bleep-words.js +211 -0
- package/dist/tools/bleep-words.js.map +1 -0
- package/dist/tools/bleep-words.test.d.ts +2 -0
- package/dist/tools/bleep-words.test.d.ts.map +1 -0
- package/dist/tools/bleep-words.test.js +96 -0
- package/dist/tools/bleep-words.test.js.map +1 -0
- package/dist/tools/burn-subtitles.d.ts.map +1 -1
- package/dist/tools/burn-subtitles.js +10 -5
- package/dist/tools/burn-subtitles.js.map +1 -1
- package/dist/tools/clean-audio.d.ts.map +1 -1
- package/dist/tools/clean-audio.js +2 -1
- package/dist/tools/clean-audio.js.map +1 -1
- package/dist/tools/cluster-takes.js +2 -1
- package/dist/tools/cluster-takes.js.map +1 -1
- package/dist/tools/compose-thumbnail-variants.d.ts +70 -0
- package/dist/tools/compose-thumbnail-variants.d.ts.map +1 -0
- package/dist/tools/compose-thumbnail-variants.js +274 -0
- package/dist/tools/compose-thumbnail-variants.js.map +1 -0
- package/dist/tools/compose-thumbnail.d.ts +6 -13
- package/dist/tools/compose-thumbnail.d.ts.map +1 -1
- package/dist/tools/compose-thumbnail.js +44 -81
- package/dist/tools/compose-thumbnail.js.map +1 -1
- package/dist/tools/concat-videos.d.ts.map +1 -1
- package/dist/tools/concat-videos.js +12 -5
- package/dist/tools/concat-videos.js.map +1 -1
- package/dist/tools/concat-videos.test.d.ts +2 -0
- package/dist/tools/concat-videos.test.d.ts.map +1 -0
- package/dist/tools/concat-videos.test.js +103 -0
- package/dist/tools/concat-videos.test.js.map +1 -0
- package/dist/tools/crossfade-videos.d.ts.map +1 -1
- package/dist/tools/crossfade-videos.js +2 -1
- package/dist/tools/crossfade-videos.js.map +1 -1
- package/dist/tools/cut-filler-words.d.ts.map +1 -1
- package/dist/tools/cut-filler-words.js +24 -8
- package/dist/tools/cut-filler-words.js.map +1 -1
- package/dist/tools/detect-speaker-changes.js +2 -1
- package/dist/tools/detect-speaker-changes.js.map +1 -1
- package/dist/tools/extract-audio.d.ts.map +1 -1
- package/dist/tools/extract-audio.js +13 -7
- package/dist/tools/extract-audio.js.map +1 -1
- package/dist/tools/face-reframe.d.ts +30 -0
- package/dist/tools/face-reframe.d.ts.map +1 -0
- package/dist/tools/face-reframe.js +143 -0
- package/dist/tools/face-reframe.js.map +1 -0
- package/dist/tools/face-reframe.test.d.ts +2 -0
- package/dist/tools/face-reframe.test.d.ts.map +1 -0
- package/dist/tools/face-reframe.test.js +139 -0
- package/dist/tools/face-reframe.test.js.map +1 -0
- package/dist/tools/find-viral-moments.d.ts +23 -0
- package/dist/tools/find-viral-moments.d.ts.map +1 -0
- package/dist/tools/find-viral-moments.js +176 -0
- package/dist/tools/find-viral-moments.js.map +1 -0
- package/dist/tools/find-viral-moments.test.d.ts +2 -0
- package/dist/tools/find-viral-moments.test.d.ts.map +1 -0
- package/dist/tools/find-viral-moments.test.js +144 -0
- package/dist/tools/find-viral-moments.test.js.map +1 -0
- package/dist/tools/generate-gif.d.ts.map +1 -1
- package/dist/tools/generate-gif.js +47 -40
- package/dist/tools/generate-gif.js.map +1 -1
- package/dist/tools/generate-gif.test.d.ts +2 -0
- package/dist/tools/generate-gif.test.d.ts.map +1 -0
- package/dist/tools/generate-gif.test.js +115 -0
- package/dist/tools/generate-gif.test.js.map +1 -0
- package/dist/tools/generate-outro.d.ts +18 -0
- package/dist/tools/generate-outro.d.ts.map +1 -0
- package/dist/tools/generate-outro.js +175 -0
- package/dist/tools/generate-outro.js.map +1 -0
- package/dist/tools/generate-youtube-metadata.d.ts +23 -0
- package/dist/tools/generate-youtube-metadata.d.ts.map +1 -0
- package/dist/tools/generate-youtube-metadata.js +103 -0
- package/dist/tools/generate-youtube-metadata.js.map +1 -0
- package/dist/tools/generate-youtube-metadata.test.d.ts +2 -0
- package/dist/tools/generate-youtube-metadata.test.d.ts.map +1 -0
- package/dist/tools/generate-youtube-metadata.test.js +118 -0
- package/dist/tools/generate-youtube-metadata.test.js.map +1 -0
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +130 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/index.test.js +27 -1
- package/dist/tools/index.test.js.map +1 -1
- package/dist/tools/ken-burns.d.ts.map +1 -1
- package/dist/tools/ken-burns.js +2 -1
- package/dist/tools/ken-burns.js.map +1 -1
- package/dist/tools/loop-match-short.d.ts +22 -0
- package/dist/tools/loop-match-short.d.ts.map +1 -0
- package/dist/tools/loop-match-short.js +107 -0
- package/dist/tools/loop-match-short.js.map +1 -0
- package/dist/tools/mix-audio.d.ts.map +1 -1
- package/dist/tools/mix-audio.js +2 -1
- package/dist/tools/mix-audio.js.map +1 -1
- package/dist/tools/normalize-loudness.d.ts.map +1 -1
- package/dist/tools/normalize-loudness.js +2 -1
- package/dist/tools/normalize-loudness.js.map +1 -1
- package/dist/tools/path-traversal.test.d.ts +15 -0
- package/dist/tools/path-traversal.test.d.ts.map +1 -0
- package/dist/tools/path-traversal.test.js +223 -0
- package/dist/tools/path-traversal.test.js.map +1 -0
- package/dist/tools/pick-best-takes.js +2 -1
- package/dist/tools/pick-best-takes.js.map +1 -1
- package/dist/tools/punch-in.d.ts.map +1 -1
- package/dist/tools/punch-in.js +2 -1
- package/dist/tools/punch-in.js.map +1 -1
- package/dist/tools/read-transcript.js +2 -1
- package/dist/tools/read-transcript.js.map +1 -1
- package/dist/tools/render-multi-format.d.ts +35 -0
- package/dist/tools/render-multi-format.d.ts.map +1 -0
- package/dist/tools/render-multi-format.js +206 -0
- package/dist/tools/render-multi-format.js.map +1 -0
- package/dist/tools/render-multi-format.test.d.ts +2 -0
- package/dist/tools/render-multi-format.test.d.ts.map +1 -0
- package/dist/tools/render-multi-format.test.js +312 -0
- package/dist/tools/render-multi-format.test.js.map +1 -0
- package/dist/tools/render.d.ts.map +1 -1
- package/dist/tools/render.js +2 -2
- package/dist/tools/render.js.map +1 -1
- package/dist/tools/rewrite-hook.d.ts +32 -0
- package/dist/tools/rewrite-hook.d.ts.map +1 -0
- package/dist/tools/rewrite-hook.js +65 -0
- package/dist/tools/rewrite-hook.js.map +1 -0
- package/dist/tools/score-clip.d.ts +30 -0
- package/dist/tools/score-clip.d.ts.map +1 -0
- package/dist/tools/score-clip.js +109 -0
- package/dist/tools/score-clip.js.map +1 -0
- package/dist/tools/score-clip.test.d.ts +2 -0
- package/dist/tools/score-clip.test.d.ts.map +1 -0
- package/dist/tools/score-clip.test.js +110 -0
- package/dist/tools/score-clip.test.js.map +1 -0
- package/dist/tools/search-tools.d.ts +34 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.js +86 -0
- package/dist/tools/search-tools.js.map +1 -0
- package/dist/tools/search-tools.test.d.ts +2 -0
- package/dist/tools/search-tools.test.d.ts.map +1 -0
- package/dist/tools/search-tools.test.js +60 -0
- package/dist/tools/search-tools.test.js.map +1 -0
- package/dist/tools/snap-cuts-to-beats.d.ts +18 -0
- package/dist/tools/snap-cuts-to-beats.d.ts.map +1 -0
- package/dist/tools/snap-cuts-to-beats.js +110 -0
- package/dist/tools/snap-cuts-to-beats.js.map +1 -0
- package/dist/tools/snap-cuts-to-beats.test.d.ts +2 -0
- package/dist/tools/snap-cuts-to-beats.test.d.ts.map +1 -0
- package/dist/tools/snap-cuts-to-beats.test.js +99 -0
- package/dist/tools/snap-cuts-to-beats.test.js.map +1 -0
- package/dist/tools/speed-ramp.d.ts.map +1 -1
- package/dist/tools/speed-ramp.js +2 -1
- package/dist/tools/speed-ramp.js.map +1 -1
- package/dist/tools/stabilize-video.d.ts.map +1 -1
- package/dist/tools/stabilize-video.js +2 -1
- package/dist/tools/stabilize-video.js.map +1 -1
- package/dist/tools/suggest-broll.d.ts +34 -0
- package/dist/tools/suggest-broll.d.ts.map +1 -0
- package/dist/tools/suggest-broll.js +367 -0
- package/dist/tools/suggest-broll.js.map +1 -0
- package/dist/tools/suggest-broll.test.d.ts +2 -0
- package/dist/tools/suggest-broll.test.d.ts.map +1 -0
- package/dist/tools/suggest-broll.test.js +217 -0
- package/dist/tools/suggest-broll.test.js.map +1 -0
- package/dist/tools/text-based-cut.d.ts +33 -0
- package/dist/tools/text-based-cut.d.ts.map +1 -0
- package/dist/tools/text-based-cut.js +172 -0
- package/dist/tools/text-based-cut.js.map +1 -0
- package/dist/tools/text-based-cut.test.d.ts +2 -0
- package/dist/tools/text-based-cut.test.d.ts.map +1 -0
- package/dist/tools/text-based-cut.test.js +32 -0
- package/dist/tools/text-based-cut.test.js.map +1 -0
- package/dist/tools/transcribe.d.ts +1 -1
- package/dist/tools/transition-videos.d.ts +1 -1
- package/dist/tools/transition-videos.d.ts.map +1 -1
- package/dist/tools/transition-videos.js +2 -1
- package/dist/tools/transition-videos.js.map +1 -1
- package/dist/tools/trim-dead-air.d.ts +59 -0
- package/dist/tools/trim-dead-air.d.ts.map +1 -0
- package/dist/tools/trim-dead-air.js +215 -0
- package/dist/tools/trim-dead-air.js.map +1 -0
- package/dist/tools/trim-dead-air.test.d.ts +2 -0
- package/dist/tools/trim-dead-air.test.d.ts.map +1 -0
- package/dist/tools/trim-dead-air.test.js +75 -0
- package/dist/tools/trim-dead-air.test.js.map +1 -0
- package/dist/tools/verify-thumbnail-promise.d.ts +33 -0
- package/dist/tools/verify-thumbnail-promise.d.ts.map +1 -0
- package/dist/tools/verify-thumbnail-promise.js +112 -0
- package/dist/tools/verify-thumbnail-promise.js.map +1 -0
- package/dist/tools/verify-thumbnail-promise.test.d.ts +2 -0
- package/dist/tools/verify-thumbnail-promise.test.d.ts.map +1 -0
- package/dist/tools/verify-thumbnail-promise.test.js +38 -0
- package/dist/tools/verify-thumbnail-promise.test.js.map +1 -0
- package/dist/tools/write-keyword-captions.d.ts +7 -0
- package/dist/tools/write-keyword-captions.d.ts.map +1 -1
- package/dist/tools/write-keyword-captions.js +35 -4
- package/dist/tools/write-keyword-captions.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +75 -11
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/tool-formatters.d.ts +30 -0
- package/dist/ui/tool-formatters.d.ts.map +1 -0
- package/dist/ui/tool-formatters.js +461 -0
- package/dist/ui/tool-formatters.js.map +1 -0
- package/dist/ui/tool-formatters.test.d.ts +2 -0
- package/dist/ui/tool-formatters.test.d.ts.map +1 -0
- package/dist/ui/tool-formatters.test.js +143 -0
- package/dist/ui/tool-formatters.test.js.map +1 -0
- package/package.json +10 -9
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { compact, err } from "../core/format.js";
|
|
3
|
+
import { HOOK_PATTERNS, runHookRewrite } from "../core/hook-rewrite.js";
|
|
4
|
+
const RewriteHookParams = z.object({
|
|
5
|
+
currentHook: z
|
|
6
|
+
.string()
|
|
7
|
+
.describe("The failing hook line. Pass an empty string when no hook exists yet."),
|
|
8
|
+
videoTopic: z.string().min(1).describe("One-line description of the video."),
|
|
9
|
+
transcriptExcerpt: z
|
|
10
|
+
.string()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe("200-500 char excerpt from the transcript for tone context. Helps the LLM match the " +
|
|
13
|
+
"creator's voice when picking power words."),
|
|
14
|
+
pattern: z
|
|
15
|
+
.enum(HOOK_PATTERNS)
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Target pattern from the `viral-hook-patterns` skill. 'auto' (default) lets the LLM " +
|
|
18
|
+
"pick the closest fit. Force a specific pattern when the user asked for it by name."),
|
|
19
|
+
model: z.string().optional().describe("OpenAI model. Default gpt-4o-mini."),
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* rewrite_hook — propose 3 hook rewrites using a viral pattern.
|
|
23
|
+
*
|
|
24
|
+
* The agent surfaces the candidates to the user — does NOT auto-apply
|
|
25
|
+
* (we don't generate footage). Use when `analyze_hook` returns score
|
|
26
|
+
* < 60 or when the user says "the opener feels weak."
|
|
27
|
+
*/
|
|
28
|
+
export function createRewriteHookTool(_cwd) {
|
|
29
|
+
return {
|
|
30
|
+
name: "rewrite_hook",
|
|
31
|
+
description: "Rewrite a hook using one of the 12 viral hook patterns from the `viral-hook-patterns` " +
|
|
32
|
+
"skill. Pass `pattern='auto'` to let the LLM pick the closest fit; pass a specific " +
|
|
33
|
+
"pattern name to force it. Returns 3 candidate rewrites with rationale. Use when " +
|
|
34
|
+
"`analyze_hook` returns score < 60, or when the user says 'the opener feels weak'. " +
|
|
35
|
+
"The agent should surface the candidates to the user — does NOT auto-apply (we don't " +
|
|
36
|
+
"generate footage). Pair with `read_skill('viral-hook-patterns')` for the full pattern " +
|
|
37
|
+
"library.",
|
|
38
|
+
parameters: RewriteHookParams,
|
|
39
|
+
async execute(args, ctx) {
|
|
40
|
+
try {
|
|
41
|
+
if (!process.env.OPENAI_API_KEY) {
|
|
42
|
+
return err("OPENAI_API_KEY not set", "export OPENAI_API_KEY=...");
|
|
43
|
+
}
|
|
44
|
+
const result = await runHookRewrite({
|
|
45
|
+
currentHook: args.currentHook,
|
|
46
|
+
videoTopic: args.videoTopic,
|
|
47
|
+
transcriptExcerpt: args.transcriptExcerpt,
|
|
48
|
+
pattern: args.pattern ?? "auto",
|
|
49
|
+
}, { model: args.model, signal: ctx.signal });
|
|
50
|
+
if (result.candidates.length === 0) {
|
|
51
|
+
return err("model returned no usable candidates", "retry or pass a more specific topic");
|
|
52
|
+
}
|
|
53
|
+
return compact({
|
|
54
|
+
candidates: result.candidates,
|
|
55
|
+
chosenPattern: result.chosenPattern,
|
|
56
|
+
why: result.why,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
return err(e.message);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=rewrite-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewrite-hook.js","sourceRoot":"","sources":["../../src/tools/rewrite-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAExE,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,CAAC,sEAAsE,CAAC;IACnF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC5E,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,qFAAqF;QACnF,2CAA2C,CAC9C;IACH,OAAO,EAAE,CAAC;SACP,IAAI,CAAC,aAAa,CAAC;SACnB,QAAQ,EAAE;SACV,QAAQ,CACP,qFAAqF;QACnF,oFAAoF,CACvF;IACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;CAC5E,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,wFAAwF;YACxF,oFAAoF;YACpF,kFAAkF;YAClF,oFAAoF;YACpF,sFAAsF;YACtF,wFAAwF;YACxF,UAAU;QACZ,UAAU,EAAE,iBAAiB;QAC7B,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACrB,IAAI,CAAC;gBACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;oBAChC,OAAO,GAAG,CAAC,wBAAwB,EAAE,2BAA2B,CAAC,CAAC;gBACpE,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;oBACE,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;oBACzC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,MAAM;iBAChC,EACD,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAC1C,CAAC;gBAEF,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACnC,OAAO,GAAG,CAAC,qCAAqC,EAAE,qCAAqC,CAAC,CAAC;gBAC3F,CAAC;gBAED,OAAO,OAAO,CAAC;oBACb,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,GAAG,EAAE,MAAM,CAAC,GAAG;iBAChB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
import type { Transcript } from "../core/whisper.js";
|
|
4
|
+
declare const ScoreClipParams: z.ZodObject<{
|
|
5
|
+
transcript: z.ZodString;
|
|
6
|
+
startSec: z.ZodNumber;
|
|
7
|
+
endSec: z.ZodNumber;
|
|
8
|
+
framePaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
|
+
model: z.ZodOptional<z.ZodString>;
|
|
10
|
+
detail: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
low: "low";
|
|
12
|
+
high: "high";
|
|
13
|
+
}>>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
/**
|
|
16
|
+
* score_clip — virality rubric for an arbitrary transcript window.
|
|
17
|
+
*
|
|
18
|
+
* Generalises `analyze_hook` past the t<3s checkpoint. Used as the
|
|
19
|
+
* ranking primitive for `find_viral_moments` and as a gate before
|
|
20
|
+
* rendering Shorts.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createScoreClipTool(cwd: string): AgentTool<typeof ScoreClipParams>;
|
|
23
|
+
/**
|
|
24
|
+
* Extract the transcript text inside [startSec, endSec). Joins matching
|
|
25
|
+
* segments with single spaces — punctuation already lives inside the
|
|
26
|
+
* segment text. Exported for tests.
|
|
27
|
+
*/
|
|
28
|
+
export declare function sliceTranscriptText(t: Transcript, startSec: number, endSec: number): string;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=score-clip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-clip.d.ts","sourceRoot":"","sources":["../../src/tools/score-clip.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,QAAA,MAAM,eAAe;;;;;;;;;;iBAqBnB,CAAC;AAEH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,eAAe,CAAC,CAoElF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAO3F"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { resolve as resolvePath } from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { scoreClipInternal } from "../core/clip-scoring.js";
|
|
5
|
+
import { compact, err } from "../core/format.js";
|
|
6
|
+
import { parseTranscript } from "../core/whisper.js";
|
|
7
|
+
const ScoreClipParams = z.object({
|
|
8
|
+
transcript: z
|
|
9
|
+
.string()
|
|
10
|
+
.describe("Path to a transcript JSON written by `transcribe`. Segments are required; word-level " +
|
|
11
|
+
"timings are not."),
|
|
12
|
+
startSec: z.number().min(0).describe("Window start in seconds (inclusive)."),
|
|
13
|
+
endSec: z.number().min(0).describe("Window end in seconds (exclusive)."),
|
|
14
|
+
framePaths: z
|
|
15
|
+
.array(z.string())
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Optional sampled frame paths (.jpg/.png). Use 1-3 for visual signal. Omit for " +
|
|
18
|
+
"transcript-only scoring (cheap path)."),
|
|
19
|
+
model: z.string().optional().describe("OpenAI model. Default gpt-4o-mini."),
|
|
20
|
+
detail: z
|
|
21
|
+
.enum(["low", "high"])
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("Vision detail. Default low (cheap, ~85 tok/img)."),
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* score_clip — virality rubric for an arbitrary transcript window.
|
|
27
|
+
*
|
|
28
|
+
* Generalises `analyze_hook` past the t<3s checkpoint. Used as the
|
|
29
|
+
* ranking primitive for `find_viral_moments` and as a gate before
|
|
30
|
+
* rendering Shorts.
|
|
31
|
+
*/
|
|
32
|
+
export function createScoreClipTool(cwd) {
|
|
33
|
+
return {
|
|
34
|
+
name: "score_clip",
|
|
35
|
+
description: "Score a clip's virality potential 0-100 across hook, flow, engagement, and trend " +
|
|
36
|
+
"dimensions. Generalises `analyze_hook` (which only covers t<3s) to arbitrary windows. " +
|
|
37
|
+
"ONE LLM call per clip. Use as the ranking primitive for `find_viral_moments` and as a " +
|
|
38
|
+
"gate before rendering Shorts. Surface the `why` to the user — it tells them what to fix.",
|
|
39
|
+
parameters: ScoreClipParams,
|
|
40
|
+
async execute(args, ctx) {
|
|
41
|
+
try {
|
|
42
|
+
if (!process.env.OPENAI_API_KEY) {
|
|
43
|
+
return err("OPENAI_API_KEY not set", "export OPENAI_API_KEY=...");
|
|
44
|
+
}
|
|
45
|
+
if (args.endSec <= args.startSec) {
|
|
46
|
+
return err("endSec must be > startSec");
|
|
47
|
+
}
|
|
48
|
+
const transcriptAbs = resolvePath(cwd, args.transcript);
|
|
49
|
+
let raw;
|
|
50
|
+
try {
|
|
51
|
+
raw = readFileSync(transcriptAbs, "utf8");
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
return err(`cannot read transcript ${transcriptAbs}: ${e.message}`, "verify the transcript JSON exists");
|
|
55
|
+
}
|
|
56
|
+
let t;
|
|
57
|
+
try {
|
|
58
|
+
t = parseTranscript(raw);
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
return err(e.message);
|
|
62
|
+
}
|
|
63
|
+
if (t.segments.length === 0) {
|
|
64
|
+
return err("transcript has no segments", "rerun transcribe(...)");
|
|
65
|
+
}
|
|
66
|
+
const text = sliceTranscriptText(t, args.startSec, args.endSec);
|
|
67
|
+
if (!text) {
|
|
68
|
+
return err("no transcript text in window", "verify [startSec, endSec) overlaps real segments");
|
|
69
|
+
}
|
|
70
|
+
const framePaths = (args.framePaths ?? []).map((p) => resolvePath(cwd, p));
|
|
71
|
+
const score = await scoreClipInternal(text, args.startSec, args.endSec, framePaths, {
|
|
72
|
+
model: args.model,
|
|
73
|
+
detail: args.detail,
|
|
74
|
+
signal: ctx.signal,
|
|
75
|
+
});
|
|
76
|
+
return compact({
|
|
77
|
+
score: score.score,
|
|
78
|
+
hook: round2(score.hook),
|
|
79
|
+
flow: round2(score.flow),
|
|
80
|
+
engagement: round2(score.engagement),
|
|
81
|
+
trend: round2(score.trend),
|
|
82
|
+
why: score.why,
|
|
83
|
+
durationSec: +score.durationSec.toFixed(2),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
return err(e.message);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extract the transcript text inside [startSec, endSec). Joins matching
|
|
94
|
+
* segments with single spaces — punctuation already lives inside the
|
|
95
|
+
* segment text. Exported for tests.
|
|
96
|
+
*/
|
|
97
|
+
export function sliceTranscriptText(t, startSec, endSec) {
|
|
98
|
+
const parts = [];
|
|
99
|
+
for (const seg of t.segments) {
|
|
100
|
+
if (seg.end <= startSec || seg.start >= endSec)
|
|
101
|
+
continue;
|
|
102
|
+
parts.push(seg.text.trim());
|
|
103
|
+
}
|
|
104
|
+
return parts.join(" ").trim();
|
|
105
|
+
}
|
|
106
|
+
function round2(n) {
|
|
107
|
+
return +n.toFixed(2);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=score-clip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-clip.js","sourceRoot":"","sources":["../../src/tools/score-clip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-clip.test.d.ts","sourceRoot":"","sources":["../../src/tools/score-clip.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { mkdtempSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { createScoreClipTool, sliceTranscriptText } from "./score-clip.js";
|
|
6
|
+
const ctx = {
|
|
7
|
+
signal: new AbortController().signal,
|
|
8
|
+
toolCallId: "t1",
|
|
9
|
+
};
|
|
10
|
+
function writeTranscript(dir, payload) {
|
|
11
|
+
const p = join(dir, "t.json");
|
|
12
|
+
writeFileSync(p, JSON.stringify(payload), "utf8");
|
|
13
|
+
return p;
|
|
14
|
+
}
|
|
15
|
+
describe("score_clip tool", () => {
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
vi.unstubAllGlobals();
|
|
18
|
+
delete process.env.OPENAI_API_KEY;
|
|
19
|
+
});
|
|
20
|
+
it("has a non-empty description naming the next-call hooks", () => {
|
|
21
|
+
const tool = createScoreClipTool("/tmp");
|
|
22
|
+
expect(tool.description.length).toBeGreaterThan(80);
|
|
23
|
+
expect(tool.description).toMatch(/find_viral_moments|virality/i);
|
|
24
|
+
});
|
|
25
|
+
it("errors when OPENAI_API_KEY is missing", async () => {
|
|
26
|
+
delete process.env.OPENAI_API_KEY;
|
|
27
|
+
const tool = createScoreClipTool("/tmp");
|
|
28
|
+
const r = await tool.execute({ transcript: "no.json", startSec: 0, endSec: 10 }, ctx);
|
|
29
|
+
expect(r).toMatch(/^error:.*OPENAI_API_KEY/);
|
|
30
|
+
});
|
|
31
|
+
it("errors when endSec <= startSec", async () => {
|
|
32
|
+
process.env.OPENAI_API_KEY = "k";
|
|
33
|
+
const tool = createScoreClipTool("/tmp");
|
|
34
|
+
const r = await tool.execute({ transcript: "no.json", startSec: 5, endSec: 5 }, ctx);
|
|
35
|
+
expect(r).toMatch(/^error:.*startSec/);
|
|
36
|
+
});
|
|
37
|
+
it("errors when transcript file is missing", async () => {
|
|
38
|
+
process.env.OPENAI_API_KEY = "k";
|
|
39
|
+
const tool = createScoreClipTool("/tmp");
|
|
40
|
+
const r = await tool.execute({ transcript: "no/such/file.json", startSec: 0, endSec: 10 }, ctx);
|
|
41
|
+
expect(r).toMatch(/^error:.*cannot read/);
|
|
42
|
+
});
|
|
43
|
+
it("errors on transcript with no segments", async () => {
|
|
44
|
+
process.env.OPENAI_API_KEY = "k";
|
|
45
|
+
const dir = mkdtempSync(join(tmpdir(), "gg-sc-"));
|
|
46
|
+
writeTranscript(dir, { language: "en", durationSec: 10, segments: [] });
|
|
47
|
+
const tool = createScoreClipTool(dir);
|
|
48
|
+
const r = await tool.execute({ transcript: "t.json", startSec: 0, endSec: 5 }, ctx);
|
|
49
|
+
expect(r).toMatch(/^error:.*no segments/);
|
|
50
|
+
});
|
|
51
|
+
it("returns a JSON-shaped success when LLM responds correctly", async () => {
|
|
52
|
+
process.env.OPENAI_API_KEY = "k";
|
|
53
|
+
const dir = mkdtempSync(join(tmpdir(), "gg-sc-"));
|
|
54
|
+
writeTranscript(dir, {
|
|
55
|
+
language: "en",
|
|
56
|
+
durationSec: 60,
|
|
57
|
+
segments: [
|
|
58
|
+
{ start: 0, end: 30, text: "this is a strong hook line about money" },
|
|
59
|
+
{ start: 30, end: 60, text: "and the payoff lands cleanly" },
|
|
60
|
+
],
|
|
61
|
+
});
|
|
62
|
+
vi.stubGlobal("fetch", vi.fn(async () => ({
|
|
63
|
+
ok: true,
|
|
64
|
+
status: 200,
|
|
65
|
+
json: async () => ({
|
|
66
|
+
choices: [
|
|
67
|
+
{
|
|
68
|
+
message: {
|
|
69
|
+
content: JSON.stringify({
|
|
70
|
+
hook: 0.9,
|
|
71
|
+
flow: 0.7,
|
|
72
|
+
engagement: 0.8,
|
|
73
|
+
trend: 0.6,
|
|
74
|
+
why: "tight",
|
|
75
|
+
}),
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
}),
|
|
80
|
+
text: async () => "",
|
|
81
|
+
})));
|
|
82
|
+
const tool = createScoreClipTool(dir);
|
|
83
|
+
const r = await tool.execute({ transcript: "t.json", startSec: 0, endSec: 60 }, ctx);
|
|
84
|
+
const parsed = JSON.parse(r);
|
|
85
|
+
expect(parsed.score).toBeGreaterThan(0);
|
|
86
|
+
expect(parsed.score).toBeLessThanOrEqual(100);
|
|
87
|
+
expect(parsed.hook).toBe(0.9);
|
|
88
|
+
expect(parsed.durationSec).toBe(60);
|
|
89
|
+
expect(parsed.why).toBeDefined();
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe("sliceTranscriptText", () => {
|
|
93
|
+
it("includes overlapping segments and trims", () => {
|
|
94
|
+
const text = sliceTranscriptText({
|
|
95
|
+
language: "en",
|
|
96
|
+
durationSec: 30,
|
|
97
|
+
segments: [
|
|
98
|
+
{ start: 0, end: 10, text: " alpha " },
|
|
99
|
+
{ start: 10, end: 20, text: " beta" },
|
|
100
|
+
{ start: 20, end: 30, text: "gamma" },
|
|
101
|
+
],
|
|
102
|
+
}, 5, 18);
|
|
103
|
+
// overlaps [0,10] and [10,20]; not [20,30]
|
|
104
|
+
expect(text).toBe("alpha beta");
|
|
105
|
+
});
|
|
106
|
+
it("returns empty when nothing overlaps", () => {
|
|
107
|
+
expect(sliceTranscriptText({ language: "en", durationSec: 10, segments: [{ start: 0, end: 5, text: "x" }] }, 6, 10)).toBe("");
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=score-clip.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-clip.test.js","sourceRoot":"","sources":["../../src/tools/score-clip.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
/**
|
|
4
|
+
* search_tools — meta-tool. With ~85+ named tools the agent can wind up
|
|
5
|
+
* scanning the system prompt to remember a tool's exact name; this is
|
|
6
|
+
* a token-cheap shortcut: pass a query, get back the top matches with
|
|
7
|
+
* their one-line descriptions.
|
|
8
|
+
*
|
|
9
|
+
* The factory receives a *getter* so we can reflect over the live tool
|
|
10
|
+
* registry as it stands at agent-construction time. We avoid a circular
|
|
11
|
+
* import by accepting the tool list directly.
|
|
12
|
+
*/
|
|
13
|
+
declare const SearchToolsParams: z.ZodObject<{
|
|
14
|
+
query: z.ZodString;
|
|
15
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export interface SearchableTool {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Score a tool against a query. Higher = better match. Pure function so the
|
|
23
|
+
* algorithm can be tuned + tested without booting the agent.
|
|
24
|
+
*
|
|
25
|
+
* Heuristic:
|
|
26
|
+
* +5 per query word that appears in the tool name
|
|
27
|
+
* +1 per query word that appears in the description
|
|
28
|
+
* +3 if the query is a substring of the name
|
|
29
|
+
* normalize: lowercase, strip non-alphanumerics
|
|
30
|
+
*/
|
|
31
|
+
export declare function scoreToolMatch(query: string, tool: SearchableTool): number;
|
|
32
|
+
export declare function createSearchToolsTool(getTools: () => SearchableTool[]): AgentTool<typeof SearchToolsParams>;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=search-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools.d.ts","sourceRoot":"","sources":["../../src/tools/search-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD;;;;;;;;;GASG;AAEH,QAAA,MAAM,iBAAiB;;;iBASrB,CAAC;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAe1E;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,cAAc,EAAE,GAC/B,SAAS,CAAC,OAAO,iBAAiB,CAAC,CAkCrC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { compact, err } from "../core/format.js";
|
|
3
|
+
/**
|
|
4
|
+
* search_tools — meta-tool. With ~85+ named tools the agent can wind up
|
|
5
|
+
* scanning the system prompt to remember a tool's exact name; this is
|
|
6
|
+
* a token-cheap shortcut: pass a query, get back the top matches with
|
|
7
|
+
* their one-line descriptions.
|
|
8
|
+
*
|
|
9
|
+
* The factory receives a *getter* so we can reflect over the live tool
|
|
10
|
+
* registry as it stands at agent-construction time. We avoid a circular
|
|
11
|
+
* import by accepting the tool list directly.
|
|
12
|
+
*/
|
|
13
|
+
const SearchToolsParams = z.object({
|
|
14
|
+
query: z
|
|
15
|
+
.string()
|
|
16
|
+
.min(1)
|
|
17
|
+
.describe("What you're looking for. Free text — matches against tool names AND descriptions. " +
|
|
18
|
+
"E.g. 'silence', 'youtube metadata', 'caption emoji'."),
|
|
19
|
+
limit: z.number().int().min(1).max(20).optional().describe("Max results. Default 8."),
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Score a tool against a query. Higher = better match. Pure function so the
|
|
23
|
+
* algorithm can be tuned + tested without booting the agent.
|
|
24
|
+
*
|
|
25
|
+
* Heuristic:
|
|
26
|
+
* +5 per query word that appears in the tool name
|
|
27
|
+
* +1 per query word that appears in the description
|
|
28
|
+
* +3 if the query is a substring of the name
|
|
29
|
+
* normalize: lowercase, strip non-alphanumerics
|
|
30
|
+
*/
|
|
31
|
+
export function scoreToolMatch(query, tool) {
|
|
32
|
+
const q = query.toLowerCase().trim();
|
|
33
|
+
if (q.length === 0)
|
|
34
|
+
return 0;
|
|
35
|
+
const nameLc = tool.name.toLowerCase();
|
|
36
|
+
const descLc = tool.description.toLowerCase();
|
|
37
|
+
let score = 0;
|
|
38
|
+
if (nameLc.includes(q.replace(/\s+/g, "_")))
|
|
39
|
+
score += 3;
|
|
40
|
+
if (nameLc.includes(q))
|
|
41
|
+
score += 3;
|
|
42
|
+
const words = q.split(/[^a-z0-9]+/).filter((w) => w.length >= 2);
|
|
43
|
+
for (const w of words) {
|
|
44
|
+
if (nameLc.includes(w))
|
|
45
|
+
score += 5;
|
|
46
|
+
if (descLc.includes(w))
|
|
47
|
+
score += 1;
|
|
48
|
+
}
|
|
49
|
+
return score;
|
|
50
|
+
}
|
|
51
|
+
export function createSearchToolsTool(getTools) {
|
|
52
|
+
return {
|
|
53
|
+
name: "search_tools",
|
|
54
|
+
description: "Find tools by query — fuzzy-matches against names and descriptions. Use when you need a " +
|
|
55
|
+
"capability and aren't sure which tool exposes it. Returns top matches with their one-line " +
|
|
56
|
+
"descriptions. Cheap (no LLM, no I/O). Token-savvy alternative to re-scanning the system " +
|
|
57
|
+
"prompt.",
|
|
58
|
+
parameters: SearchToolsParams,
|
|
59
|
+
async execute({ query, limit }) {
|
|
60
|
+
try {
|
|
61
|
+
const tools = getTools().filter((t) => t.name !== "search_tools");
|
|
62
|
+
const max = Math.min(limit ?? 8, 20);
|
|
63
|
+
const scored = tools
|
|
64
|
+
.map((t) => ({ tool: t, score: scoreToolMatch(query, t) }))
|
|
65
|
+
.filter((s) => s.score > 0)
|
|
66
|
+
.sort((a, b) => b.score - a.score)
|
|
67
|
+
.slice(0, max);
|
|
68
|
+
if (scored.length === 0) {
|
|
69
|
+
return compact({ matches: [], note: "no tools matched — try a broader query" });
|
|
70
|
+
}
|
|
71
|
+
return compact({
|
|
72
|
+
matches: scored.map((s) => ({
|
|
73
|
+
name: s.tool.name,
|
|
74
|
+
description: s.tool.description,
|
|
75
|
+
score: s.score,
|
|
76
|
+
})),
|
|
77
|
+
total: scored.length,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
return err(e.message);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=search-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools.js","sourceRoot":"","sources":["../../src/tools/search-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools.test.d.ts","sourceRoot":"","sources":["../../src/tools/search-tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createSearchToolsTool, scoreToolMatch } from "./search-tools.js";
|
|
3
|
+
const FAKE_TOOLS = [
|
|
4
|
+
{ name: "detect_silence", description: "ffmpeg silencedetect → frame-aligned KEEP ranges" },
|
|
5
|
+
{ name: "trim_dead_air", description: "Trim leading/trailing or all silence in one call" },
|
|
6
|
+
{ name: "write_srt", description: "SubRip caption writer (sentence + word-level)" },
|
|
7
|
+
{ name: "burn_subtitles", description: "Hardcode .srt or .ass into a video" },
|
|
8
|
+
{
|
|
9
|
+
name: "generate_youtube_metadata",
|
|
10
|
+
description: "Title, description, tags, chapters from a transcript",
|
|
11
|
+
},
|
|
12
|
+
];
|
|
13
|
+
const ctx = {
|
|
14
|
+
signal: new AbortController().signal,
|
|
15
|
+
toolCallId: "t1",
|
|
16
|
+
};
|
|
17
|
+
describe("scoreToolMatch", () => {
|
|
18
|
+
it("ranks exact name substring highest", () => {
|
|
19
|
+
expect(scoreToolMatch("silence", FAKE_TOOLS[0])).toBeGreaterThan(scoreToolMatch("silence", FAKE_TOOLS[2]));
|
|
20
|
+
});
|
|
21
|
+
it("returns 0 when no overlap", () => {
|
|
22
|
+
expect(scoreToolMatch("rocket", FAKE_TOOLS[0])).toBe(0);
|
|
23
|
+
});
|
|
24
|
+
it("rewards multi-word queries", () => {
|
|
25
|
+
const single = scoreToolMatch("youtube", FAKE_TOOLS[4]);
|
|
26
|
+
const multi = scoreToolMatch("youtube metadata", FAKE_TOOLS[4]);
|
|
27
|
+
expect(multi).toBeGreaterThan(single);
|
|
28
|
+
});
|
|
29
|
+
it("handles empty query", () => {
|
|
30
|
+
expect(scoreToolMatch("", FAKE_TOOLS[0])).toBe(0);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe("search_tools tool", () => {
|
|
34
|
+
const tool = createSearchToolsTool(() => FAKE_TOOLS);
|
|
35
|
+
it("returns matches in score order", async () => {
|
|
36
|
+
const r = await tool.execute({ query: "silence" }, ctx);
|
|
37
|
+
expect(typeof r).toBe("string");
|
|
38
|
+
const parsed = JSON.parse(r);
|
|
39
|
+
expect(parsed.matches[0].name).toBe("detect_silence");
|
|
40
|
+
});
|
|
41
|
+
it("limits results", async () => {
|
|
42
|
+
const r = await tool.execute({ query: "the" }, ctx);
|
|
43
|
+
const parsed = JSON.parse(r);
|
|
44
|
+
expect(parsed.matches.length).toBeLessThanOrEqual(8);
|
|
45
|
+
});
|
|
46
|
+
it("returns empty matches with a note on miss", async () => {
|
|
47
|
+
const r = await tool.execute({ query: "blockchain ethereum" }, ctx);
|
|
48
|
+
const parsed = JSON.parse(r);
|
|
49
|
+
expect(parsed.matches).toEqual([]);
|
|
50
|
+
expect(parsed.note).toBeTruthy();
|
|
51
|
+
});
|
|
52
|
+
it("excludes itself from results", async () => {
|
|
53
|
+
const tools = [...FAKE_TOOLS, { name: "search_tools", description: "Find tools by query" }];
|
|
54
|
+
const t = createSearchToolsTool(() => tools);
|
|
55
|
+
const r = await t.execute({ query: "tools" }, ctx);
|
|
56
|
+
const parsed = JSON.parse(r);
|
|
57
|
+
expect(parsed.matches.find((m) => m.name === "search_tools")).toBeUndefined();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=search-tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools.test.js","sourceRoot":"","sources":["../../src/tools/search-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
declare const SnapCutsToBeatsParams: z.ZodObject<{
|
|
4
|
+
audio: z.ZodString;
|
|
5
|
+
cutPoints: z.ZodArray<z.ZodNumber>;
|
|
6
|
+
toleranceSec: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
sampleRate: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
/**
|
|
10
|
+
* snap_cuts_to_beats — the music-driven cut primitive. CapCut ships this
|
|
11
|
+
* as "Auto Beat" and it's the single biggest reason their music shorts
|
|
12
|
+
* feel snappy. We expose it as a pure data tool: in → cut points; out →
|
|
13
|
+
* beat-aligned cut points. The agent then feeds the result to cut_at /
|
|
14
|
+
* add_sfx_at_cuts / punch_in for the actual edit.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createSnapCutsToBeatsTool(cwd: string): AgentTool<typeof SnapCutsToBeatsParams>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=snap-cuts-to-beats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snap-cuts-to-beats.d.ts","sourceRoot":"","sources":["../../src/tools/snap-cuts-to-beats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKrD,QAAA,MAAM,qBAAqB;;;;;iBAmCzB,CAAC;AAEH;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,qBAAqB,CAAC,CAwE9F"}
|