@officexapp/vidfarm-devcli 0.21.10
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/.agents/skills/dollarplatoon-skill/SKILL.md +1227 -0
- package/.agents/skills/editor-capabilities/SKILL.md +182 -0
- package/.agents/skills/editor-capabilities/references/re-theme-walkthrough.md +58 -0
- package/.agents/skills/embedded-captions/CATALOG.md +93 -0
- package/.agents/skills/embedded-captions/SKILL.md +286 -0
- package/.agents/skills/embedded-captions/assets/brand/CDPR-fankit-terms.txt +35 -0
- package/.agents/skills/embedded-captions/assets/brand/cyberpunk-widths.json +115 -0
- package/.agents/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
- package/.agents/skills/embedded-captions/dna/README.md +148 -0
- package/.agents/skills/embedded-captions/dna/chrome.json +68 -0
- package/.agents/skills/embedded-captions/dna/cream.json +69 -0
- package/.agents/skills/embedded-captions/dna/documentary.json +62 -0
- package/.agents/skills/embedded-captions/dna/editorial.json +70 -0
- package/.agents/skills/embedded-captions/dna/glitch.json +82 -0
- package/.agents/skills/embedded-captions/dna/ink.json +65 -0
- package/.agents/skills/embedded-captions/dna/keynote.json +62 -0
- package/.agents/skills/embedded-captions/dna/loud.json +75 -0
- package/.agents/skills/embedded-captions/dna/neon.json +58 -0
- package/.agents/skills/embedded-captions/dna/velocity.json +89 -0
- package/.agents/skills/embedded-captions/modes/cinematic/README.md +48 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
- package/.agents/skills/embedded-captions/modes/cinematic/engine.html +355 -0
- package/.agents/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
- package/.agents/skills/embedded-captions/modes/standard/_motion.md +192 -0
- package/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
- package/.agents/skills/embedded-captions/references/aesthetic-principles.md +168 -0
- package/.agents/skills/embedded-captions/references/anti-patterns.md +188 -0
- package/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
- package/.agents/skills/embedded-captions/references/caption-grouping.md +130 -0
- package/.agents/skills/embedded-captions/references/composition-craft.md +522 -0
- package/.agents/skills/embedded-captions/references/direction-catalog.md +138 -0
- package/.agents/skills/embedded-captions/references/example-renders/champion.html +371 -0
- package/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
- package/.agents/skills/embedded-captions/references/failure-modes.md +145 -0
- package/.agents/skills/embedded-captions/references/layout-heuristics.md +238 -0
- package/.agents/skills/embedded-captions/references/motion-vocabulary.md +148 -0
- package/.agents/skills/embedded-captions/references/rail.md +68 -0
- package/.agents/skills/embedded-captions/references/reference-bar.md +47 -0
- package/.agents/skills/embedded-captions/references/scene-types.md +94 -0
- package/.agents/skills/embedded-captions/references/test-set.md +66 -0
- package/.agents/skills/embedded-captions/references/typographic-moves.md +266 -0
- package/.agents/skills/embedded-captions/references/typography-presets.md +63 -0
- package/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
- package/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
- package/.agents/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
- package/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
- package/.agents/skills/embedded-captions/scripts/check-timing.cjs +173 -0
- package/.agents/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
- package/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
- package/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +46 -0
- package/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
- package/.agents/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
- package/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +1205 -0
- package/.agents/skills/embedded-captions/scripts/make-composition.cjs +404 -0
- package/.agents/skills/embedded-captions/scripts/make-theme.cjs +8781 -0
- package/.agents/skills/embedded-captions/scripts/matte.cjs +294 -0
- package/.agents/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
- package/.agents/skills/embedded-captions/scripts/prepare.sh +39 -0
- package/.agents/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
- package/.agents/skills/embedded-captions/scripts/render-and-composite.sh +509 -0
- package/.agents/skills/embedded-captions/scripts/render-theme.sh +34 -0
- package/.agents/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
- package/.agents/skills/embedded-captions/scripts/transcribe.cjs +349 -0
- package/.agents/skills/embedded-captions/themes/PORTING.md +49 -0
- package/.agents/skills/embedded-captions/themes/README.md +244 -0
- package/.agents/skills/embedded-captions/themes/anchor.json +27 -0
- package/.agents/skills/embedded-captions/themes/arcade.json +51 -0
- package/.agents/skills/embedded-captions/themes/aurora.json +41 -0
- package/.agents/skills/embedded-captions/themes/biolume.json +35 -0
- package/.agents/skills/embedded-captions/themes/brush.json +74 -0
- package/.agents/skills/embedded-captions/themes/chalkboard.json +52 -0
- package/.agents/skills/embedded-captions/themes/dossier.json +56 -0
- package/.agents/skills/embedded-captions/themes/graffiti.json +62 -0
- package/.agents/skills/embedded-captions/themes/hologram.json +41 -0
- package/.agents/skills/embedded-captions/themes/inkwater.json +43 -0
- package/.agents/skills/embedded-captions/themes/laser.json +46 -0
- package/.agents/skills/embedded-captions/themes/lastpage.json +33 -0
- package/.agents/skills/embedded-captions/themes/neonsign.json +53 -0
- package/.agents/skills/embedded-captions/themes/nightcity.json +56 -0
- package/.agents/skills/embedded-captions/themes/ordnance.json +54 -0
- package/.agents/skills/embedded-captions/themes/papercut.json +37 -0
- package/.agents/skills/embedded-captions/themes/popup.json +46 -0
- package/.agents/skills/embedded-captions/themes/ransom.json +62 -0
- package/.agents/skills/embedded-captions/themes/scoreboard.json +54 -0
- package/.agents/skills/embedded-captions/themes/spectrum.json +46 -0
- package/.agents/skills/embedded-captions/themes/stardust.json +29 -0
- package/.agents/skills/embedded-captions/themes/stomp.json +43 -0
- package/.agents/skills/embedded-captions/themes/terminal.json +49 -0
- package/.agents/skills/embedded-captions/themes/thunder.json +44 -0
- package/.agents/skills/embedded-captions/themes/transit.json +44 -0
- package/.agents/skills/embedded-captions/themes/vhs.json +47 -0
- package/.agents/skills/faceless-explainer/SKILL.md +209 -0
- package/.agents/skills/faceless-explainer/references/cut-catalog.md +215 -0
- package/.agents/skills/faceless-explainer/references/motion-language.md +156 -0
- package/.agents/skills/faceless-explainer/references/story-design.md +248 -0
- package/.agents/skills/faceless-explainer/references/visual-design.md +146 -0
- package/.agents/skills/faceless-explainer/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/faceless-explainer/scripts/audio.mjs +260 -0
- package/.agents/skills/faceless-explainer/scripts/build-frame.mjs +536 -0
- package/.agents/skills/faceless-explainer/scripts/captions.mjs +508 -0
- package/.agents/skills/faceless-explainer/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/faceless-explainer/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
- package/.agents/skills/faceless-explainer/scripts/transitions.mjs +320 -0
- package/.agents/skills/faceless-explainer/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/farmville-saas-ux/SKILL.md +156 -0
- package/.agents/skills/farmville-saas-ux/assets/starter.html +294 -0
- package/.agents/skills/farmville-saas-ux/references/components.md +340 -0
- package/.agents/skills/farmville-saas-ux/references/porting-guide.md +121 -0
- package/.agents/skills/farmville-saas-ux/references/tokens.md +271 -0
- package/.agents/skills/flockposter/LICENSE +17 -0
- package/.agents/skills/flockposter/README.md +72 -0
- package/.agents/skills/flockposter/SKILL.md +562 -0
- package/.agents/skills/flockposter/examples/cli-instagram-reel.sh +21 -0
- package/.agents/skills/flockposter/examples/cli-multi-platform.json +69 -0
- package/.agents/skills/flockposter/examples/cli-tiktok-upload-only.sh +22 -0
- package/.agents/skills/flockposter/examples/cli-x-thread.sh +17 -0
- package/.agents/skills/flockposter/examples/cli-youtube-short.sh +21 -0
- package/.agents/skills/flockposter/examples/public-api-instagram-reel.json +28 -0
- package/.agents/skills/general-video/SKILL.md +143 -0
- package/.agents/skills/hyperframes/SKILL.md +160 -0
- package/.agents/skills/hyperframes-animation/SKILL.md +84 -0
- package/.agents/skills/hyperframes-animation/adapters/animate-text.md +64 -0
- package/.agents/skills/hyperframes-animation/adapters/animejs.md +114 -0
- package/.agents/skills/hyperframes-animation/adapters/css-animations.md +143 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +118 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap.md +105 -0
- package/.agents/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
- package/.agents/skills/hyperframes-animation/adapters/lottie.md +117 -0
- package/.agents/skills/hyperframes-animation/adapters/three.md +131 -0
- package/.agents/skills/hyperframes-animation/adapters/typegpu.md +178 -0
- package/.agents/skills/hyperframes-animation/adapters/waapi.md +101 -0
- package/.agents/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
- package/.agents/skills/hyperframes-animation/blueprints/constellation-hub.md +44 -0
- package/.agents/skills/hyperframes-animation/blueprints/cta-morph-press.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +57 -0
- package/.agents/skills/hyperframes-animation/blueprints/dataviz-countup.md +46 -0
- package/.agents/skills/hyperframes-animation/blueprints/device-surface-showcase.md +53 -0
- package/.agents/skills/hyperframes-animation/blueprints/grid-card-assemble.md +66 -0
- package/.agents/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +78 -0
- package/.agents/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +69 -0
- package/.agents/skills/hyperframes-animation/blueprints/overwhelm-surround.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
- package/.agents/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
- package/.agents/skills/hyperframes-animation/blueprints/titlecard-reveal.md +42 -0
- package/.agents/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
- package/.agents/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
- package/.agents/skills/hyperframes-animation/blueprints-index.md +146 -0
- package/.agents/skills/hyperframes-animation/examples/assets/avatars/02.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/github.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/nvidia.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/visa.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/zoominfo.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
- package/.agents/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
- package/.agents/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
- package/.agents/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
- package/.agents/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
- package/.agents/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
- package/.agents/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
- package/.agents/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
- package/.agents/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
- package/.agents/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
- package/.agents/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
- package/.agents/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
- package/.agents/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
- package/.agents/skills/hyperframes-animation/rules/3d-page-scroll.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/3d-text-depth-layers.md +297 -0
- package/.agents/skills/hyperframes-animation/rules/ai-tracking-box.md +382 -0
- package/.agents/skills/hyperframes-animation/rules/ambient-glow-bloom.md +305 -0
- package/.agents/skills/hyperframes-animation/rules/asr-keyword-glow.md +286 -0
- package/.agents/skills/hyperframes-animation/rules/avatar-cloud-network.md +371 -0
- package/.agents/skills/hyperframes-animation/rules/camera-cursor-tracking.md +246 -0
- package/.agents/skills/hyperframes-animation/rules/card-morph-anchor.md +267 -0
- package/.agents/skills/hyperframes-animation/rules/center-outward-expansion.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/context-sensitive-cursor.md +257 -0
- package/.agents/skills/hyperframes-animation/rules/coordinate-target-zoom.md +332 -0
- package/.agents/skills/hyperframes-animation/rules/counting-dynamic-scale.md +283 -0
- package/.agents/skills/hyperframes-animation/rules/css-marker-patterns.md +373 -0
- package/.agents/skills/hyperframes-animation/rules/cursor-click-ripple.md +262 -0
- package/.agents/skills/hyperframes-animation/rules/depth-of-field-blur.md +313 -0
- package/.agents/skills/hyperframes-animation/rules/depth-scatter-assemble.md +303 -0
- package/.agents/skills/hyperframes-animation/rules/discrete-text-sequence.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +307 -0
- package/.agents/skills/hyperframes-animation/rules/gsap-effects.md +299 -0
- package/.agents/skills/hyperframes-animation/rules/hacker-flip-3d.md +223 -0
- package/.agents/skills/hyperframes-animation/rules/kinetic-beat-slam.md +183 -0
- package/.agents/skills/hyperframes-animation/rules/motion-blur-streak.md +328 -0
- package/.agents/skills/hyperframes-animation/rules/multi-phase-camera.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/orbit-3d-entry.md +301 -0
- package/.agents/skills/hyperframes-animation/rules/physics-press-reaction.md +350 -0
- package/.agents/skills/hyperframes-animation/rules/press-release-spring.md +296 -0
- package/.agents/skills/hyperframes-animation/rules/reactive-displacement.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/scale-swap-transition.md +298 -0
- package/.agents/skills/hyperframes-animation/rules/sine-wave-loop.md +278 -0
- package/.agents/skills/hyperframes-animation/rules/split-tilt-cards.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/spring-pop-entrance.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/stat-bars-and-fills.md +156 -0
- package/.agents/skills/hyperframes-animation/rules/svg-icon-enrichment.md +329 -0
- package/.agents/skills/hyperframes-animation/rules/svg-path-draw.md +274 -0
- package/.agents/skills/hyperframes-animation/rules/vertical-spring-ticker.md +239 -0
- package/.agents/skills/hyperframes-animation/rules/viewport-change.md +349 -0
- package/.agents/skills/hyperframes-animation/rules-index.md +86 -0
- package/.agents/skills/hyperframes-animation/scripts/animation-map.mjs +606 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-animation/techniques.md +507 -0
- package/.agents/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +167 -0
- package/.agents/skills/hyperframes-animation/transitions/catalog.md +127 -0
- package/.agents/skills/hyperframes-animation/transitions/css-3d.md +12 -0
- package/.agents/skills/hyperframes-animation/transitions/css-blur.md +51 -0
- package/.agents/skills/hyperframes-animation/transitions/css-cover.md +43 -0
- package/.agents/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
- package/.agents/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
- package/.agents/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
- package/.agents/skills/hyperframes-animation/transitions/css-grid.md +10 -0
- package/.agents/skills/hyperframes-animation/transitions/css-light.md +49 -0
- package/.agents/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
- package/.agents/skills/hyperframes-animation/transitions/css-other.md +25 -0
- package/.agents/skills/hyperframes-animation/transitions/css-push.md +41 -0
- package/.agents/skills/hyperframes-animation/transitions/css-radial.md +37 -0
- package/.agents/skills/hyperframes-animation/transitions/css-scale.md +24 -0
- package/.agents/skills/hyperframes-animation/transitions/overview.md +153 -0
- package/.agents/skills/hyperframes-cli/SKILL.md +113 -0
- package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
- package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +55 -0
- package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
- package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
- package/.agents/skills/hyperframes-cli/references/preview-render.md +149 -0
- package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
- package/.agents/skills/hyperframes-core/SKILL.md +78 -0
- package/.agents/skills/hyperframes-core/references/composition-patterns.md +263 -0
- package/.agents/skills/hyperframes-core/references/data-attributes.md +70 -0
- package/.agents/skills/hyperframes-core/references/determinism-rules.md +68 -0
- package/.agents/skills/hyperframes-core/references/full-screen-motion.md +62 -0
- package/.agents/skills/hyperframes-core/references/minimal-composition.md +66 -0
- package/.agents/skills/hyperframes-core/references/script-format.md +49 -0
- package/.agents/skills/hyperframes-core/references/storyboard-format.md +95 -0
- package/.agents/skills/hyperframes-core/references/sub-compositions.md +237 -0
- package/.agents/skills/hyperframes-core/references/subagent-dispatch.md +41 -0
- package/.agents/skills/hyperframes-core/references/tailwind.md +125 -0
- package/.agents/skills/hyperframes-core/references/tracks-and-clips.md +76 -0
- package/.agents/skills/hyperframes-core/references/variables-and-media.md +90 -0
- package/.agents/skills/hyperframes-creative/SKILL.md +70 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/FRAME.md +277 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/frame-showcase.html +1439 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
- package/.agents/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/monochrome.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
- package/.agents/skills/hyperframes-creative/references/audio-reactive.md +76 -0
- package/.agents/skills/hyperframes-creative/references/beat-direction.md +164 -0
- package/.agents/skills/hyperframes-creative/references/composition-patterns.md +199 -0
- package/.agents/skills/hyperframes-creative/references/data-in-motion.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-adherence.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-picker.md +123 -0
- package/.agents/skills/hyperframes-creative/references/design-spec.md +55 -0
- package/.agents/skills/hyperframes-creative/references/house-style.md +73 -0
- package/.agents/skills/hyperframes-creative/references/motion-principles.md +150 -0
- package/.agents/skills/hyperframes-creative/references/narration.md +92 -0
- package/.agents/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
- package/.agents/skills/hyperframes-creative/references/typography.md +218 -0
- package/.agents/skills/hyperframes-creative/references/video-composition.md +63 -0
- package/.agents/skills/hyperframes-creative/references/visual-styles.md +457 -0
- package/.agents/skills/hyperframes-creative/scripts/contrast-report.mjs +353 -0
- package/.agents/skills/hyperframes-creative/scripts/extract-audio-data.py +188 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-creative/templates/design-picker.html +1432 -0
- package/.agents/skills/hyperframes-keyframes/SKILL.md +237 -0
- package/.agents/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
- package/.agents/skills/hyperframes-keyframes/references/keyframe-patterns.md +106 -0
- package/.agents/skills/motion-graphics/SKILL.md +172 -0
- package/.agents/skills/motion-graphics/agents/builder.md +40 -0
- package/.agents/skills/motion-graphics/agents/director.md +53 -0
- package/.agents/skills/motion-graphics/agents/finalize.md +17 -0
- package/.agents/skills/motion-graphics/catalog-map.md +40 -0
- package/.agents/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
- package/.agents/skills/motion-graphics/categories/charts/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
- package/.agents/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
- package/.agents/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
- package/.agents/skills/motion-graphics/categories/maps/module.md +61 -0
- package/.agents/skills/motion-graphics/categories/news/module.md +56 -0
- package/.agents/skills/motion-graphics/categories/stat/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/tweet/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/webpage/module.md +21 -0
- package/.agents/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
- package/.agents/skills/motion-graphics/grounding/locate.mjs +227 -0
- package/.agents/skills/motion-graphics/phases/source/guide.md +21 -0
- package/.agents/skills/motion-graphics/references/builder-contract.md +38 -0
- package/.agents/skills/motion-graphics/references/motion-vocabulary.md +43 -0
- package/.agents/skills/motion-graphics/references/shot-plan-ir.md +54 -0
- package/.agents/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
- package/.agents/skills/music/SKILL.md +416 -0
- package/.agents/skills/music/references/api_reference.md +519 -0
- package/.agents/skills/music/references/installation.md +65 -0
- package/.agents/skills/product-launch-video/SKILL.md +208 -0
- package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
- package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
- package/.agents/skills/product-launch-video/references/story-design.md +373 -0
- package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
- package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/product-launch-video/scripts/audio.mjs +260 -0
- package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
- package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
- package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
- package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
- package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
- package/.agents/skills/product-launch-video/scripts/transitions.mjs +327 -0
- package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/slideshow/SKILL.md +550 -0
- package/.agents/skills/slideshow/references/standalone-harness.md +1020 -0
- package/.agents/skills/talking-head-recut/NOTICE.md +39 -0
- package/.agents/skills/talking-head-recut/SKILL.md +1195 -0
- package/.agents/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
- package/.agents/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
- package/.agents/skills/talking-head-recut/references/frames/clean.html +92 -0
- package/.agents/skills/talking-head-recut/references/frames/hairline.html +171 -0
- package/.agents/skills/talking-head-recut/references/frames/polaroid.html +131 -0
- package/.agents/skills/talking-head-recut/references/layouts/overlay.html +164 -0
- package/.agents/skills/talking-head-recut/references/layouts/pip.html +143 -0
- package/.agents/skills/talking-head-recut/references/layouts/split.html +121 -0
- package/.agents/skills/talking-head-recut/references/layouts/stack.html +109 -0
- package/.agents/skills/talking-head-recut/references/styles/academic.html +172 -0
- package/.agents/skills/talking-head-recut/references/styles/audit.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/editorial.html +189 -0
- package/.agents/skills/talking-head-recut/references/styles/geom.html +181 -0
- package/.agents/skills/talking-head-recut/references/styles/minimal.html +130 -0
- package/.agents/skills/talking-head-recut/references/styles/spotlight.html +142 -0
- package/.agents/skills/talking-head-recut/references/styles/swiss.html +188 -0
- package/.agents/skills/talking-head-recut/references/styles/terminal.html +196 -0
- package/.agents/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/xhs.html +206 -0
- package/.agents/skills/text-to-speech/SKILL.md +226 -0
- package/.agents/skills/text-to-speech/references/installation.md +90 -0
- package/.agents/skills/text-to-speech/references/streaming.md +307 -0
- package/.agents/skills/text-to-speech/references/voice-settings.md +115 -0
- package/.agents/skills/vidfarm-director/SKILL.md +179 -0
- package/.agents/skills/vidfarm-director/recipes/find-and-fork-template.md +16 -0
- package/.agents/skills/vidfarm-director/recipes/local-edit-render-approve.md +13 -0
- package/.agents/skills/vidfarm-director/recipes/onboard-a-new-director.md +13 -0
- package/.agents/skills/vidfarm-director/recipes/retheme-template.md +17 -0
- package/.agents/skills/vidfarm-director/references/assets-and-sourcing.md +117 -0
- package/.agents/skills/vidfarm-director/references/automation-and-local-dev.md +276 -0
- package/.agents/skills/vidfarm-director/references/core-workflows.md +301 -0
- package/.agents/skills/vidfarm-director/references/editor-workflows.md +367 -0
- package/.agents/skills/vidfarm-director/references/onboarding.md +28 -0
- package/.agents/skills/vidfarm-director/references/primitives.md +307 -0
- package/.agents/skills/vidfarm-director/references/rest-api.md +84 -0
- package/.agents/skills/vidfarm-media/SKILL.md +158 -0
- package/.agents/skills/vidfarm-media/references/tts.md +111 -0
- package/.agents/skills/vidfarm-media/scripts/audio.mjs +628 -0
- package/.agents/skills/vidfarm-media/scripts/wait-bgm.mjs +31 -0
- package/.agents/skills/website-to-video/SKILL.md +145 -0
- package/.agents/skills/website-to-video/assets/sfx/CREDITS.md +35 -0
- package/.agents/skills/website-to-video/assets/sfx/manifest.json +97 -0
- package/.agents/skills/website-to-video/references/beat-builder-guide.md +263 -0
- package/.agents/skills/website-to-video/references/capabilities.md +713 -0
- package/.agents/skills/website-to-video/references/step-0-capture.md +55 -0
- package/.agents/skills/website-to-video/references/step-1-design.md +333 -0
- package/.agents/skills/website-to-video/references/step-2-brief.md +178 -0
- package/.agents/skills/website-to-video/references/step-3-storyboard.md +572 -0
- package/.agents/skills/website-to-video/references/step-4-vo.md +225 -0
- package/.agents/skills/website-to-video/references/step-5-build.md +483 -0
- package/.agents/skills/website-to-video/references/step-6-validate.md +341 -0
- package/.agents/skills/website-to-video/scripts/w2h-verify.mjs +759 -0
- package/README.md +97 -0
- package/SKILL.director.md +1644 -0
- package/SKILL.md +83 -0
- package/demo/README.md +28 -0
- package/demo/dist/app.css +1 -0
- package/demo/dist/app.js +968 -0
- package/demo/dist/chunks/chunk-3OT2D42H.js +1 -0
- package/demo/dist/chunks/chunk-DXB73IDG.js +1 -0
- package/demo/dist/chunks/domEditingLayers-AT7G6F4L-ZTHJHB7R.js +1 -0
- package/demo/dist/chunks/hyperframes-player-7HKH6NSO.js +459 -0
- package/demo/dist/chunks/lib-XAQ37YOE.js +1 -0
- package/demo/dist/chunks/src-TJ2QYA4U.js +207 -0
- package/demo/dist/favicon.ico +0 -0
- package/demo/dist/icons/timeline/audio.svg +7 -0
- package/demo/dist/icons/timeline/captions.svg +5 -0
- package/demo/dist/icons/timeline/composition.svg +12 -0
- package/demo/dist/icons/timeline/image.svg +18 -0
- package/demo/dist/icons/timeline/music.svg +10 -0
- package/demo/dist/icons/timeline/text.svg +3 -0
- package/demo/dist/index.html +16 -0
- package/dist/src/cli.js +7258 -0
- package/dist/src/devcli/auth-store.js +67 -0
- package/dist/src/devcli/captions.js +310 -0
- package/dist/src/devcli/clip-store.js +368 -0
- package/dist/src/devcli/clips.js +1138 -0
- package/dist/src/devcli/composition-edit.js +1292 -0
- package/dist/src/devcli/cost-mode.js +149 -0
- package/dist/src/devcli/doctor.js +192 -0
- package/dist/src/devcli/hyperframes-cli.js +118 -0
- package/dist/src/devcli/local-backend.js +167 -0
- package/dist/src/devcli/local-frontend-server.js +681 -0
- package/dist/src/devcli/local-render.js +136 -0
- package/dist/src/devcli/skills.js +476 -0
- package/dist/src/devcli/speech.js +178 -0
- package/dist/src/devcli/stills.js +249 -0
- package/dist/src/devcli/telemetry.js +236 -0
- package/dist/src/devcli/timeline-edit.js +490 -0
- package/dist/src/devcli/transitions.js +205 -0
- package/dist/src/hyperframes/composition.js +780 -0
- package/dist/src/lib/crypto.js +45 -0
- package/dist/src/lib/dev-log.js +54 -0
- package/dist/src/lib/display-name.js +11 -0
- package/dist/src/lib/ids.js +24 -0
- package/dist/src/lib/images.js +19 -0
- package/dist/src/lib/json.js +15 -0
- package/dist/src/lib/package-root.js +47 -0
- package/dist/src/lib/render-media-prep.js +293 -0
- package/dist/src/lib/template-paths.js +28 -0
- package/dist/src/lib/time.js +7 -0
- package/dist/src/lib/url-clean.js +85 -0
- package/dist/src/services/captions.js +123 -0
- package/dist/src/services/clip-curation/cost.js +116 -0
- package/dist/src/services/clip-curation/ffmpeg.js +352 -0
- package/dist/src/services/clip-curation/gemini.js +418 -0
- package/dist/src/services/clip-curation/hunt.js +470 -0
- package/dist/src/services/clip-curation/index.js +19 -0
- package/dist/src/services/clip-curation/local-agent.js +248 -0
- package/dist/src/services/clip-curation/media-select.js +152 -0
- package/dist/src/services/clip-curation/presets.js +20 -0
- package/dist/src/services/clip-curation/presets.v1.json +59 -0
- package/dist/src/services/clip-curation/query.js +167 -0
- package/dist/src/services/clip-curation/refine.js +165 -0
- package/dist/src/services/clip-curation/scan.js +189 -0
- package/dist/src/services/clip-curation/source-naming.js +131 -0
- package/dist/src/services/clip-curation/taxonomy.js +73 -0
- package/dist/src/services/clip-curation/taxonomy.v1.json +102 -0
- package/dist/src/services/clip-curation/types.js +7 -0
- package/dist/src/services/composition-lint.js +199 -0
- package/dist/src/services/provider-errors.js +128 -0
- package/dist/src/services/speech.js +629 -0
- package/package.json +154 -0
- package/public/assets/discover-client-app.js +1 -0
- package/public/assets/favicon.ico +0 -0
- package/public/assets/file-directory-app.js +89 -0
- package/public/assets/homepage-app.js +54 -0
- package/public/assets/homepage-client-app.js +80 -0
- package/public/assets/landing-page-client-app.js +87 -0
- package/public/assets/logo-vidfarm.png +0 -0
- package/public/assets/page-runtime-client-app.js +94 -0
- package/public/assets/placeholders/scene-placeholder.png +0 -0
- package/public/serve-shells/editor.html +3146 -0
- package/public/serve-shells/library-files.html +3450 -0
- package/public/serve-shells/library-raws.html +4404 -0
- package/public/serve-shells/tools-clipper.html +3991 -0
- package/public/serve-shells/tools-image.html +5584 -0
- package/public/serve-shells/tools-video.html +4404 -0
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
// Clip-hunt spec — the user-facing controls for turning long-form video into
|
|
2
|
+
// short-form clips: time WINDOWS ("only hunt between 12:30 and 15:45"), a soft
|
|
3
|
+
// target DURATION band ("30 sec clips" → 20–40s), an output ASPECT crop
|
|
4
|
+
// ("vertical video of people holding food to their face"), and an avoid-text
|
|
5
|
+
// constraint ("without captions / no on-screen text" — a scene-SELECTION filter,
|
|
6
|
+
// NEVER GhostCut on the long-form source). Shared by devcli (local), the Hono
|
|
7
|
+
// API, and the cloud scan Lambda so every surface parses and normalizes
|
|
8
|
+
// identically. All helpers are pure/deterministic — no AI calls here.
|
|
9
|
+
import { ACTIVE_TAXONOMY_VERSION, getTaxonomy } from "./taxonomy.js";
|
|
10
|
+
// ── Unspecified-prompt defaults ─────────────────────────────────────────────
|
|
11
|
+
// When a user imports a source video without saying what they want, we bias
|
|
12
|
+
// toward the short-form product default: a handful of DISTINCT, vertical,
|
|
13
|
+
// text-free 5–15s clips rather than every raw cut. These fill only the gaps —
|
|
14
|
+
// any field the user (or their prompt) sets always wins.
|
|
15
|
+
/** Default soft clip length when unspecified: ~10s, 5–15s band. */
|
|
16
|
+
export const DEFAULT_CLIP_DURATION_BAND = { min_sec: 5, max_sec: 15, target_sec: 10 };
|
|
17
|
+
/** Default mining density when neither max_clips nor clips_per_10min is set. */
|
|
18
|
+
export const DEFAULT_CLIPS_PER_10_MIN = 10;
|
|
19
|
+
/** Default output aspect when unspecified (vertical / shorts). */
|
|
20
|
+
export const DEFAULT_CLIP_ASPECT = "9:16";
|
|
21
|
+
/**
|
|
22
|
+
* Fill the unspecified-prompt defaults on a normalized hunt spec: a 5–15s
|
|
23
|
+
* duration band, vertical 9:16 crop, and avoid-text ON. Only fills gaps — an
|
|
24
|
+
* explicit user choice (including avoid_text:false) is preserved.
|
|
25
|
+
*/
|
|
26
|
+
export function applyHuntSpecDefaults(spec) {
|
|
27
|
+
const out = { ...spec };
|
|
28
|
+
if (!out.duration_band)
|
|
29
|
+
out.duration_band = { ...DEFAULT_CLIP_DURATION_BAND };
|
|
30
|
+
if (out.avoid_text === undefined)
|
|
31
|
+
out.avoid_text = true;
|
|
32
|
+
if (!out.aspect)
|
|
33
|
+
out.aspect = DEFAULT_CLIP_ASPECT;
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The number of clips to aim for given the (effective, windowed) source
|
|
38
|
+
* duration. A hard max_clips wins; otherwise density (default 10 per 10 min ≈
|
|
39
|
+
* one clip per minute) scales with length. Always ≥ 1.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveTargetClipCount(effectiveDurationSec, spec) {
|
|
42
|
+
if (spec.max_clips && spec.max_clips > 0)
|
|
43
|
+
return Math.max(1, Math.round(spec.max_clips));
|
|
44
|
+
const per10 = spec.clips_per_10min && spec.clips_per_10min > 0 ? spec.clips_per_10min : DEFAULT_CLIPS_PER_10_MIN;
|
|
45
|
+
const tenMinBlocks = Math.max(0, effectiveDurationSec) / 600;
|
|
46
|
+
return Math.max(1, Math.round(tenMinBlocks * per10));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Deterministic count cap / uniqueness backstop: when more scenes survived than
|
|
50
|
+
* the target, keep an EVENLY-SPACED subset across the timeline. Spread-out
|
|
51
|
+
* scenes are far less likely to be near-duplicates of each other than adjacent
|
|
52
|
+
* ones, so this doubles as a cheap "distinct clips" filter when the AI refine
|
|
53
|
+
* pass is skipped (>60 scenes) or over-returns. Re-indexes the survivors.
|
|
54
|
+
*/
|
|
55
|
+
export function capScenesEvenlyToCount(scenes, target) {
|
|
56
|
+
if (!Number.isFinite(target) || target <= 0 || scenes.length <= target)
|
|
57
|
+
return scenes;
|
|
58
|
+
const step = scenes.length / target;
|
|
59
|
+
const picked = [];
|
|
60
|
+
const seen = new Set();
|
|
61
|
+
for (let i = 0; i < target; i++) {
|
|
62
|
+
const idx = Math.min(scenes.length - 1, Math.floor(i * step + step / 2));
|
|
63
|
+
if (seen.has(idx))
|
|
64
|
+
continue;
|
|
65
|
+
seen.add(idx);
|
|
66
|
+
picked.push(scenes[idx]);
|
|
67
|
+
}
|
|
68
|
+
return picked.map((s, i) => ({ ...s, index: i }));
|
|
69
|
+
}
|
|
70
|
+
// ── Duration band ───────────────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Map a spoken target ("10 sec", "30 sec", "60 sec", "120 sec") to a soft
|
|
73
|
+
* range. Anchors from product: 10 → 5–20, 30 → 20–40; the same formula extends
|
|
74
|
+
* smoothly (60 → 40–80, 120 → 80–160): ± target/3, with a minimum slack of
|
|
75
|
+
* −5s / +10s so short targets keep a usable band.
|
|
76
|
+
*/
|
|
77
|
+
export function resolveDurationBand(targetSec) {
|
|
78
|
+
if (!Number.isFinite(targetSec) || targetSec <= 0)
|
|
79
|
+
return null;
|
|
80
|
+
const target = Math.max(3, Math.min(600, targetSec));
|
|
81
|
+
const minSec = Math.max(2, round1(target - Math.max(target / 3, 5)));
|
|
82
|
+
const maxSec = round1(target + Math.max(target / 3, 10));
|
|
83
|
+
return { min_sec: minSec, max_sec: maxSec, target_sec: round1(target) };
|
|
84
|
+
}
|
|
85
|
+
// ── Timecodes & windows ─────────────────────────────────────────────────────
|
|
86
|
+
/** "1:02:03(.5)" | "12:30" | "95" | "95.5" → seconds (null when unparseable). */
|
|
87
|
+
export function parseTimecode(text) {
|
|
88
|
+
const trimmed = (text ?? "").trim();
|
|
89
|
+
if (!trimmed)
|
|
90
|
+
return null;
|
|
91
|
+
const parts = trimmed.split(":");
|
|
92
|
+
if (parts.length > 3)
|
|
93
|
+
return null;
|
|
94
|
+
let seconds = 0;
|
|
95
|
+
for (const part of parts) {
|
|
96
|
+
if (!/^\d+(\.\d+)?$/.test(part))
|
|
97
|
+
return null;
|
|
98
|
+
seconds = seconds * 60 + Number(part);
|
|
99
|
+
}
|
|
100
|
+
return Number.isFinite(seconds) ? seconds : null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Parse "12:30-15:45, 20:00-22:10" (also "–" and "to" separators, or
|
|
104
|
+
* {start,end} objects / [start,end] tuples) into windows. Invalid entries are
|
|
105
|
+
* dropped rather than failing the scan.
|
|
106
|
+
*/
|
|
107
|
+
export function parseTimeRanges(input) {
|
|
108
|
+
const out = [];
|
|
109
|
+
const push = (start, end) => {
|
|
110
|
+
if (start == null || end == null)
|
|
111
|
+
return;
|
|
112
|
+
if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start)
|
|
113
|
+
return;
|
|
114
|
+
out.push({ start_sec: round3(Math.max(0, start)), end_sec: round3(end) });
|
|
115
|
+
};
|
|
116
|
+
const parseOne = (value) => {
|
|
117
|
+
if (typeof value === "string") {
|
|
118
|
+
const m = value.trim().match(/^(.+?)\s*(?:-|–|—|\bto\b)\s*(.+)$/i);
|
|
119
|
+
if (m)
|
|
120
|
+
push(parseTimecode(m[1]), parseTimecode(m[2]));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (Array.isArray(value) && value.length === 2) {
|
|
124
|
+
push(toSeconds(value[0]), toSeconds(value[1]));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (value && typeof value === "object") {
|
|
128
|
+
const rec = value;
|
|
129
|
+
push(toSeconds(rec.start_sec ?? rec.start ?? rec.from), toSeconds(rec.end_sec ?? rec.end ?? rec.to));
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
if (typeof input === "string") {
|
|
133
|
+
for (const piece of input.split(/[,;]+/))
|
|
134
|
+
parseOne(piece);
|
|
135
|
+
}
|
|
136
|
+
else if (Array.isArray(input)) {
|
|
137
|
+
for (const piece of input)
|
|
138
|
+
parseOne(piece);
|
|
139
|
+
}
|
|
140
|
+
else if (input != null) {
|
|
141
|
+
parseOne(input);
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
function toSeconds(value) {
|
|
146
|
+
if (typeof value === "number")
|
|
147
|
+
return Number.isFinite(value) ? value : null;
|
|
148
|
+
if (typeof value === "string")
|
|
149
|
+
return parseTimecode(value);
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/** Clamp to [0, durationSec], drop empties, sort, and merge overlaps. */
|
|
153
|
+
export function normalizeWindows(windows, durationSec) {
|
|
154
|
+
if (!windows?.length)
|
|
155
|
+
return [];
|
|
156
|
+
const clamped = windows
|
|
157
|
+
.map((w) => ({
|
|
158
|
+
start_sec: Math.max(0, w.start_sec),
|
|
159
|
+
end_sec: durationSec && durationSec > 0 ? Math.min(w.end_sec, durationSec) : w.end_sec
|
|
160
|
+
}))
|
|
161
|
+
.filter((w) => Number.isFinite(w.start_sec) && Number.isFinite(w.end_sec) && w.end_sec - w.start_sec > 0.25)
|
|
162
|
+
.sort((a, b) => a.start_sec - b.start_sec);
|
|
163
|
+
const merged = [];
|
|
164
|
+
for (const w of clamped) {
|
|
165
|
+
const prev = merged[merged.length - 1];
|
|
166
|
+
if (prev && w.start_sec <= prev.end_sec + 0.05) {
|
|
167
|
+
prev.end_sec = Math.max(prev.end_sec, w.end_sec);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
merged.push({ ...w });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return merged;
|
|
174
|
+
}
|
|
175
|
+
/** The duration the scan actually processes — the cost-estimate input. */
|
|
176
|
+
export function effectiveHuntDurationSec(fullDurationSec, windows) {
|
|
177
|
+
const normalized = normalizeWindows(windows, fullDurationSec);
|
|
178
|
+
if (!normalized.length)
|
|
179
|
+
return fullDurationSec;
|
|
180
|
+
return round3(normalized.reduce((acc, w) => acc + (w.end_sec - w.start_sec), 0));
|
|
181
|
+
}
|
|
182
|
+
// ── Aspect / crop ───────────────────────────────────────────────────────────
|
|
183
|
+
const ASPECT_SYNONYMS = {
|
|
184
|
+
"9:16": "9:16",
|
|
185
|
+
"16:9": "16:9",
|
|
186
|
+
"4:3": "4:3",
|
|
187
|
+
"1:1": "1:1",
|
|
188
|
+
vertical: "9:16",
|
|
189
|
+
portrait: "9:16",
|
|
190
|
+
shorts: "9:16",
|
|
191
|
+
reels: "9:16",
|
|
192
|
+
tiktok: "9:16",
|
|
193
|
+
horizontal: "16:9",
|
|
194
|
+
landscape: "16:9",
|
|
195
|
+
widescreen: "16:9",
|
|
196
|
+
square: "1:1",
|
|
197
|
+
original: "original"
|
|
198
|
+
};
|
|
199
|
+
export function normalizeAspect(value) {
|
|
200
|
+
if (typeof value !== "string")
|
|
201
|
+
return null;
|
|
202
|
+
return ASPECT_SYNONYMS[value.trim().toLowerCase()] ?? null;
|
|
203
|
+
}
|
|
204
|
+
export function normalizeCropFocus(value) {
|
|
205
|
+
return value === "top" || value === "bottom" || value === "left" || value === "right" ? value : "center";
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* ffmpeg -vf crop expression for the target aspect: full-height (or full-width)
|
|
209
|
+
* centre crop with a focus bias — "smart centre" framing; the content guidance
|
|
210
|
+
* drives WHICH scenes are kept, this drives how each frame is cropped. Even
|
|
211
|
+
* output dims keep libx264 happy. Null = no crop.
|
|
212
|
+
*/
|
|
213
|
+
export function cropFilterFor(aspect, focus = "center") {
|
|
214
|
+
if (!aspect || aspect === "original")
|
|
215
|
+
return null;
|
|
216
|
+
const [aw, ah] = aspect.split(":").map(Number);
|
|
217
|
+
if (!aw || !ah)
|
|
218
|
+
return null;
|
|
219
|
+
const ratio = (aw / ah).toFixed(6);
|
|
220
|
+
const xf = focus === "left" ? "0.15" : focus === "right" ? "0.85" : "0.5";
|
|
221
|
+
// "top" biases toward faces/upper third when cropping vertically.
|
|
222
|
+
const yf = focus === "top" ? "0.2" : focus === "bottom" ? "0.8" : "0.5";
|
|
223
|
+
const w = `2*floor(min(iw\\,ih*${ratio})/2)`;
|
|
224
|
+
const h = `2*floor(min(ih\\,iw/${ratio})/2)`;
|
|
225
|
+
return `crop=w=${w}:h=${h}:x=(iw-ow)*${xf}:y=(ih-oh)*${yf}`;
|
|
226
|
+
}
|
|
227
|
+
// ── Scene fitting ───────────────────────────────────────────────────────────
|
|
228
|
+
/**
|
|
229
|
+
* Fit detected scenes to a soft duration band: greedily merge CONTIGUOUS
|
|
230
|
+
* scenes toward the target (never across dropped gaps — post-refine lists have
|
|
231
|
+
* holes and merging across them would re-include dropped footage), and split
|
|
232
|
+
* over-long spans into ≤ max chunks. Safe to run both before refine (fewer,
|
|
233
|
+
* clip-sized units to judge) and after (re-enforce max on refine merges).
|
|
234
|
+
*/
|
|
235
|
+
export function fitScenesToDurationBand(scenes, band) {
|
|
236
|
+
if (!band || scenes.length === 0)
|
|
237
|
+
return scenes;
|
|
238
|
+
const EPS = 0.05;
|
|
239
|
+
const spans = [];
|
|
240
|
+
let cur = null;
|
|
241
|
+
for (const s of scenes) {
|
|
242
|
+
if (!cur) {
|
|
243
|
+
cur = { start: s.start_time_sec, end: s.end_time_sec };
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
const contiguous = Math.abs(s.start_time_sec - cur.end) <= EPS;
|
|
247
|
+
const curDur = cur.end - cur.start;
|
|
248
|
+
const nextDur = s.end_time_sec - s.start_time_sec;
|
|
249
|
+
const wantMore = curDur < band.min_sec || (curDur < band.target_sec && curDur + nextDur <= band.max_sec);
|
|
250
|
+
if (contiguous && wantMore) {
|
|
251
|
+
cur.end = s.end_time_sec;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
spans.push(cur);
|
|
255
|
+
cur = { start: s.start_time_sec, end: s.end_time_sec };
|
|
256
|
+
}
|
|
257
|
+
if (cur)
|
|
258
|
+
spans.push(cur);
|
|
259
|
+
const fitted = [];
|
|
260
|
+
for (const span of spans) {
|
|
261
|
+
const dur = span.end - span.start;
|
|
262
|
+
if (dur > band.max_sec) {
|
|
263
|
+
const chunks = Math.ceil(dur / band.max_sec);
|
|
264
|
+
const step = dur / chunks;
|
|
265
|
+
for (let i = 0; i < chunks; i++) {
|
|
266
|
+
const start = span.start + i * step;
|
|
267
|
+
const end = i === chunks - 1 ? span.end : start + step;
|
|
268
|
+
fitted.push(makeScene(fitted.length, start, end));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
fitted.push(makeScene(fitted.length, span.start, span.end));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Orphan slivers (isolated scenes far below the band) are noise when the user
|
|
276
|
+
// asked for e.g. 30s clips — drop them unless they are all we have.
|
|
277
|
+
const solid = fitted.filter((s) => s.duration_sec >= band.min_sec / 2);
|
|
278
|
+
const kept = solid.length > 0 ? solid : fitted;
|
|
279
|
+
return kept.map((s, i) => ({ ...s, index: i }));
|
|
280
|
+
}
|
|
281
|
+
// ── Guidance composition ────────────────────────────────────────────────────
|
|
282
|
+
export const AVOID_TEXT_GUIDANCE = "Only keep scenes with NO burned-in captions, subtitles, watermark text, or on-screen text overlays; drop any scene whose frame shows readable overlay text.";
|
|
283
|
+
/**
|
|
284
|
+
* Compose the effective guidance prompt for the refine (keep/drop/merge) and
|
|
285
|
+
* tagging passes: the user's content intent plus the avoid-text constraint.
|
|
286
|
+
* avoid_text is deliberately a SELECTION filter — never caption removal
|
|
287
|
+
* (GhostCut) on the long-form source.
|
|
288
|
+
*/
|
|
289
|
+
export function buildEffectiveGuidance(input) {
|
|
290
|
+
const parts = [];
|
|
291
|
+
if (input.contentPrompt?.trim())
|
|
292
|
+
parts.push(input.contentPrompt.trim());
|
|
293
|
+
if (input.avoidText)
|
|
294
|
+
parts.push(AVOID_TEXT_GUIDANCE);
|
|
295
|
+
return parts.join("\n");
|
|
296
|
+
}
|
|
297
|
+
function canonicalizeContentTypeHint(value) {
|
|
298
|
+
const normalized = String(value ?? "")
|
|
299
|
+
.trim()
|
|
300
|
+
.toLowerCase()
|
|
301
|
+
.replace(/^#/, "")
|
|
302
|
+
.replace(/[\s-]+/g, "_");
|
|
303
|
+
if (!normalized)
|
|
304
|
+
return null;
|
|
305
|
+
if (normalized === "broll")
|
|
306
|
+
return "b_roll";
|
|
307
|
+
return normalized;
|
|
308
|
+
}
|
|
309
|
+
export function extractUserContentTypeHints(notes, version = ACTIVE_TAXONOMY_VERSION) {
|
|
310
|
+
const text = String(notes ?? "").trim();
|
|
311
|
+
if (!text)
|
|
312
|
+
return [];
|
|
313
|
+
const allowed = new Set(getTaxonomy(version).categories.content_type.map((value) => canonicalizeContentTypeHint(value)));
|
|
314
|
+
const found = new Set();
|
|
315
|
+
const capture = (value) => {
|
|
316
|
+
const normalized = canonicalizeContentTypeHint(value);
|
|
317
|
+
if (normalized && allowed.has(normalized))
|
|
318
|
+
found.add(normalized);
|
|
319
|
+
};
|
|
320
|
+
for (const match of text.matchAll(/\b(?:content[_\s-]*type|category|tag)s?\s*[:=]\s*([^\n.;]+)/gi)) {
|
|
321
|
+
const raw = String(match[1] ?? "");
|
|
322
|
+
for (const piece of raw.split(/[,/|]+|\band\b/gi))
|
|
323
|
+
capture(piece);
|
|
324
|
+
}
|
|
325
|
+
for (const match of text.matchAll(/\b#?(talking[\s_-]*head|b[\s_-]*roll|product[\s_-]*shot|screen[\s_-]*recording|demo|reaction|interview|establishing|lifestyle|text[\s_-]*graphic)\b/gi)) {
|
|
326
|
+
capture(String(match[1] ?? ""));
|
|
327
|
+
}
|
|
328
|
+
return [...found];
|
|
329
|
+
}
|
|
330
|
+
export function applyUserContentTypeHints(tags, notes, version = ACTIVE_TAXONOMY_VERSION) {
|
|
331
|
+
const hinted = extractUserContentTypeHints(notes, version);
|
|
332
|
+
if (!hinted.length)
|
|
333
|
+
return tags;
|
|
334
|
+
return {
|
|
335
|
+
...tags,
|
|
336
|
+
content_type: [...new Set([...(tags.content_type ?? []), ...hinted])]
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
export function buildPrivateUserNotesGuidance(notes, version = ACTIVE_TAXONOMY_VERSION) {
|
|
340
|
+
const text = String(notes ?? "").trim();
|
|
341
|
+
if (!text)
|
|
342
|
+
return "";
|
|
343
|
+
const hinted = extractUserContentTypeHints(text, version);
|
|
344
|
+
const parts = [
|
|
345
|
+
`Private owner notes for this raw: "${text}". Use them to bias categorization and description, but stay truthful to the footage.`
|
|
346
|
+
];
|
|
347
|
+
if (hinted.length) {
|
|
348
|
+
parts.push(`If the footage supports it, include these owner-requested private content_type tags: ${hinted.join(", ")}.`);
|
|
349
|
+
}
|
|
350
|
+
return parts.join("\n");
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Deterministically extract structured hints from a free-form hunt prompt:
|
|
354
|
+
* "please only hunt for clips between 12:30 and 15:45", "short 10 sec clips",
|
|
355
|
+
* "vertical video … without captions". Structured request fields always take
|
|
356
|
+
* precedence; this only fills gaps. The prompt itself stays intact as content
|
|
357
|
+
* guidance.
|
|
358
|
+
*/
|
|
359
|
+
export function parseClipHuntPrompt(prompt) {
|
|
360
|
+
const text = (prompt ?? "").trim();
|
|
361
|
+
const result = { windows: [], target_duration_sec: null, aspect: null, avoid_text: false, max_clips: null };
|
|
362
|
+
if (!text)
|
|
363
|
+
return result;
|
|
364
|
+
const tc = "\\d{1,2}:\\d{2}(?::\\d{2})?(?:\\.\\d+)?";
|
|
365
|
+
// "between 12:30 and 15:45" / "from 12:30 to 15:45" / bare "12:30-15:45"
|
|
366
|
+
const rangeRe = new RegExp(`(?:between|from)?\\s*(${tc})\\s*(?:-|–|—|to|and|until)\\s*(${tc})`, "gi");
|
|
367
|
+
let m;
|
|
368
|
+
while ((m = rangeRe.exec(text)) !== null) {
|
|
369
|
+
const start = parseTimecode(m[1]);
|
|
370
|
+
const end = parseTimecode(m[2]);
|
|
371
|
+
if (start != null && end != null && end > start) {
|
|
372
|
+
result.windows.push({ start_sec: round3(start), end_sec: round3(end) });
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
const secMatch = /(\d{1,3}(?:\.\d+)?)\s*-?\s*(?:sec(?:ond)?s?)\b/i.exec(text);
|
|
376
|
+
const minMatch = /(\d{1,2}(?:\.\d+)?)\s*-?\s*(?:min(?:ute)?s?)\b(?!\s*(?:mark|point))/i.exec(text);
|
|
377
|
+
if (secMatch) {
|
|
378
|
+
result.target_duration_sec = Number(secMatch[1]);
|
|
379
|
+
}
|
|
380
|
+
else if (minMatch && /clip/i.test(text)) {
|
|
381
|
+
// "2 minute clips" — only treat minutes as a duration when clips are the topic.
|
|
382
|
+
result.target_duration_sec = Number(minMatch[1]) * 60;
|
|
383
|
+
}
|
|
384
|
+
const aspectToken = /(\d{1,2}:\d{1,2})\s*(?:video|clip|ratio|aspect|crop)/i.exec(text)?.[1];
|
|
385
|
+
result.aspect =
|
|
386
|
+
normalizeAspect(aspectToken) ??
|
|
387
|
+
(/(vertical|portrait)\b/i.test(text) ? "9:16"
|
|
388
|
+
: /(horizontal|landscape|widescreen)\b/i.test(text) ? "16:9"
|
|
389
|
+
: /\bsquare\b/i.test(text) ? "1:1"
|
|
390
|
+
: /\b4:3\b/.test(text) ? "4:3"
|
|
391
|
+
: null);
|
|
392
|
+
result.avoid_text =
|
|
393
|
+
/(without|no)\s+(?:any\s+)?(captions?|subtitles?|(?:on[- ]?screen\s+)?text)/i.test(text) ||
|
|
394
|
+
/\b(caption|text)-free\b/i.test(text) ||
|
|
395
|
+
/no\s+text\s+on\s+screen/i.test(text);
|
|
396
|
+
// "10 clips" / "give me 20 raws" / "top 5 cuts" → a clip-count target.
|
|
397
|
+
const countMatch = /(\d{1,3})\s*(?:clips?|raws?|shots?|cuts?|segments?)\b/i.exec(text) ??
|
|
398
|
+
/\b(?:top|best|give me|find|get|pull|grab)\s+(\d{1,3})\b/i.exec(text);
|
|
399
|
+
if (countMatch) {
|
|
400
|
+
const n = Number(countMatch[1]);
|
|
401
|
+
if (Number.isFinite(n) && n > 0)
|
|
402
|
+
result.max_clips = Math.min(500, Math.round(n));
|
|
403
|
+
}
|
|
404
|
+
return result;
|
|
405
|
+
}
|
|
406
|
+
// ── Wire normalization (API / SFN / tool payloads) ──────────────────────────
|
|
407
|
+
/**
|
|
408
|
+
* Normalize an untrusted hunt-spec-shaped payload (HTTP body, tool args, SFN
|
|
409
|
+
* input) into a clean ClipHuntSpec. Unknown/invalid fields drop out silently.
|
|
410
|
+
*/
|
|
411
|
+
export function normalizeHuntSpec(raw) {
|
|
412
|
+
if (!raw || typeof raw !== "object")
|
|
413
|
+
return {};
|
|
414
|
+
const rec = raw;
|
|
415
|
+
const spec = {};
|
|
416
|
+
const windows = parseTimeRanges(rec.windows ?? rec.ranges ?? rec.time_ranges);
|
|
417
|
+
if (windows.length)
|
|
418
|
+
spec.windows = windows;
|
|
419
|
+
const band = rec.duration_band;
|
|
420
|
+
if (band && typeof band === "object" && Number(band.min_sec) > 0 && Number(band.max_sec) > Number(band.min_sec)) {
|
|
421
|
+
spec.duration_band = {
|
|
422
|
+
min_sec: Number(band.min_sec),
|
|
423
|
+
max_sec: Number(band.max_sec),
|
|
424
|
+
target_sec: Number(band.target_sec) > 0 ? Number(band.target_sec) : (Number(band.min_sec) + Number(band.max_sec)) / 2
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
const target = Number(rec.target_duration_sec ?? rec.duration_sec ?? rec.clip_duration_sec);
|
|
429
|
+
const resolved = resolveDurationBand(target);
|
|
430
|
+
if (resolved)
|
|
431
|
+
spec.duration_band = resolved;
|
|
432
|
+
}
|
|
433
|
+
const aspect = normalizeAspect(rec.aspect ?? rec.aspect_ratio ?? rec.orientation);
|
|
434
|
+
if (aspect)
|
|
435
|
+
spec.aspect = aspect;
|
|
436
|
+
if (rec.crop_focus != null)
|
|
437
|
+
spec.crop_focus = normalizeCropFocus(rec.crop_focus);
|
|
438
|
+
// Explicit true/false both honored so a caller can opt OUT of the avoid-text
|
|
439
|
+
// default; only an absent field falls through to applyHuntSpecDefaults.
|
|
440
|
+
if (rec.avoid_text === true || rec.no_text === true || rec.no_captions === true)
|
|
441
|
+
spec.avoid_text = true;
|
|
442
|
+
else if (rec.avoid_text === false || rec.no_text === false || rec.allow_text === true)
|
|
443
|
+
spec.avoid_text = false;
|
|
444
|
+
const maxClips = Number(rec.max_clips ?? rec.clip_count ?? rec.target_clip_count);
|
|
445
|
+
if (Number.isFinite(maxClips) && maxClips > 0)
|
|
446
|
+
spec.max_clips = Math.min(500, Math.round(maxClips));
|
|
447
|
+
const perTen = Number(rec.clips_per_10min ?? rec.clips_per_10_min ?? rec.density);
|
|
448
|
+
if (Number.isFinite(perTen) && perTen > 0)
|
|
449
|
+
spec.clips_per_10min = Math.min(200, perTen);
|
|
450
|
+
if (typeof rec.source_url === "string" && rec.source_url.trim())
|
|
451
|
+
spec.source_url = rec.source_url.trim();
|
|
452
|
+
if (typeof rec.folder_path === "string" && rec.folder_path.trim())
|
|
453
|
+
spec.folder_path = rec.folder_path.trim().slice(0, 500);
|
|
454
|
+
if (rec.audio_only === true || rec.audioOnly === true)
|
|
455
|
+
spec.audio_only = true;
|
|
456
|
+
return spec;
|
|
457
|
+
}
|
|
458
|
+
// ── misc ────────────────────────────────────────────────────────────────────
|
|
459
|
+
function makeScene(index, start, end) {
|
|
460
|
+
const s = Math.max(0, start);
|
|
461
|
+
const e = Math.max(s + 0.01, end);
|
|
462
|
+
return { index, start_time_sec: round3(s), end_time_sec: round3(e), duration_sec: round3(e - s) };
|
|
463
|
+
}
|
|
464
|
+
function round1(n) {
|
|
465
|
+
return Math.round(n * 10) / 10;
|
|
466
|
+
}
|
|
467
|
+
function round3(n) {
|
|
468
|
+
return Math.round(n * 1000) / 1000;
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=hunt.js.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// vidfarm clip-curation core — the shared "third pillar" library consumed by
|
|
2
|
+
// devcli (local), the Hono API (src/app.ts), and the cloud scan Lambdas. Build
|
|
3
|
+
// once, use in both targets (handoff: Shared Components).
|
|
4
|
+
export * from "./types.js";
|
|
5
|
+
export { ACTIVE_TAXONOMY_VERSION, MULTI_VALUE_CATEGORIES, getTaxonomy, sanitizeTagValues, taxonomyForPrompt } from "./taxonomy.js";
|
|
6
|
+
export { BUILTIN_PRESETS, findBuiltinPreset } from "./presets.js";
|
|
7
|
+
export { ClipModelClient, ClipGeminiClient, ClipEmbeddingClient, EMBEDDING_DIM, EMBEDDING_MODEL, EMBEDDING_MODELS, TAG_MODEL_BY_TIER, buildClipEmbeddingText, buildQueryPrompt, buildTaggingPrompt, normalize } from "./gemini.js";
|
|
8
|
+
export { LocalAgentClipClient, detectLocalAgent, extractJsonObject } from "./local-agent.js";
|
|
9
|
+
export { AVOID_TEXT_GUIDANCE, DEFAULT_CLIP_ASPECT, DEFAULT_CLIP_DURATION_BAND, DEFAULT_CLIPS_PER_10_MIN, applyHuntSpecDefaults, applyUserContentTypeHints, buildEffectiveGuidance, buildPrivateUserNotesGuidance, capScenesEvenlyToCount, cropFilterFor, effectiveHuntDurationSec, extractUserContentTypeHints, fitScenesToDurationBand, normalizeAspect, normalizeCropFocus, normalizeHuntSpec, normalizeWindows, parseClipHuntPrompt, parseTimecode, parseTimeRanges, resolveDurationBand, resolveTargetClipCount } from "./hunt.js";
|
|
10
|
+
export { detectScenes, extractAudioClip, extractClip, extractKeyframes, extractSceneAudio, extractThumbnail, extractWaveformThumbnail, hasFfmpeg, probeVideo, resolveFfmpeg, resolveFfprobe } from "./ffmpeg.js";
|
|
11
|
+
export { cosineSimilarity, matchesCriteria, rankHits, scoreClip, searchClips, structuredMatchRatio } from "./query.js";
|
|
12
|
+
export { estimateScanCostFromDuration, estimateScanCostFromScenes, formatCostEstimate } from "./cost.js";
|
|
13
|
+
export { processSceneToClip, scanVideo } from "./scan.js";
|
|
14
|
+
export { refineScenesWithGuidance } from "./refine.js";
|
|
15
|
+
export { estimateMediaHeight, pickBestVideoMedia, rankPlayableVideoMedias, fetchFirstDownloadableMedia } from "./media-select.js";
|
|
16
|
+
export { deriveMediaNameFromUrl, resolveRawSourceName, slugifyFolderName } from "./source-naming.js";
|
|
17
|
+
// Re-export ClipPreset-related helpers already covered by ./presets and ./types
|
|
18
|
+
// via the wildcard exports above; nothing extra needed here.
|
|
19
|
+
//# sourceMappingURL=index.js.map
|