@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.
Files changed (516) hide show
  1. package/.agents/skills/dollarplatoon-skill/SKILL.md +1227 -0
  2. package/.agents/skills/editor-capabilities/SKILL.md +182 -0
  3. package/.agents/skills/editor-capabilities/references/re-theme-walkthrough.md +58 -0
  4. package/.agents/skills/embedded-captions/CATALOG.md +93 -0
  5. package/.agents/skills/embedded-captions/SKILL.md +286 -0
  6. package/.agents/skills/embedded-captions/assets/brand/CDPR-fankit-terms.txt +35 -0
  7. package/.agents/skills/embedded-captions/assets/brand/cyberpunk-widths.json +115 -0
  8. package/.agents/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
  9. package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
  10. package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
  11. package/.agents/skills/embedded-captions/dna/README.md +148 -0
  12. package/.agents/skills/embedded-captions/dna/chrome.json +68 -0
  13. package/.agents/skills/embedded-captions/dna/cream.json +69 -0
  14. package/.agents/skills/embedded-captions/dna/documentary.json +62 -0
  15. package/.agents/skills/embedded-captions/dna/editorial.json +70 -0
  16. package/.agents/skills/embedded-captions/dna/glitch.json +82 -0
  17. package/.agents/skills/embedded-captions/dna/ink.json +65 -0
  18. package/.agents/skills/embedded-captions/dna/keynote.json +62 -0
  19. package/.agents/skills/embedded-captions/dna/loud.json +75 -0
  20. package/.agents/skills/embedded-captions/dna/neon.json +58 -0
  21. package/.agents/skills/embedded-captions/dna/velocity.json +89 -0
  22. package/.agents/skills/embedded-captions/modes/cinematic/README.md +48 -0
  23. package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
  24. package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
  25. package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
  26. package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
  27. package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
  28. package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
  29. package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
  30. package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
  31. package/.agents/skills/embedded-captions/modes/cinematic/engine.html +355 -0
  32. package/.agents/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
  33. package/.agents/skills/embedded-captions/modes/standard/_motion.md +192 -0
  34. package/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
  35. package/.agents/skills/embedded-captions/references/aesthetic-principles.md +168 -0
  36. package/.agents/skills/embedded-captions/references/anti-patterns.md +188 -0
  37. package/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
  38. package/.agents/skills/embedded-captions/references/caption-grouping.md +130 -0
  39. package/.agents/skills/embedded-captions/references/composition-craft.md +522 -0
  40. package/.agents/skills/embedded-captions/references/direction-catalog.md +138 -0
  41. package/.agents/skills/embedded-captions/references/example-renders/champion.html +371 -0
  42. package/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
  43. package/.agents/skills/embedded-captions/references/failure-modes.md +145 -0
  44. package/.agents/skills/embedded-captions/references/layout-heuristics.md +238 -0
  45. package/.agents/skills/embedded-captions/references/motion-vocabulary.md +148 -0
  46. package/.agents/skills/embedded-captions/references/rail.md +68 -0
  47. package/.agents/skills/embedded-captions/references/reference-bar.md +47 -0
  48. package/.agents/skills/embedded-captions/references/scene-types.md +94 -0
  49. package/.agents/skills/embedded-captions/references/test-set.md +66 -0
  50. package/.agents/skills/embedded-captions/references/typographic-moves.md +266 -0
  51. package/.agents/skills/embedded-captions/references/typography-presets.md +63 -0
  52. package/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
  53. package/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
  54. package/.agents/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
  55. package/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
  56. package/.agents/skills/embedded-captions/scripts/check-timing.cjs +173 -0
  57. package/.agents/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
  58. package/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
  59. package/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +46 -0
  60. package/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
  61. package/.agents/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
  62. package/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +1205 -0
  63. package/.agents/skills/embedded-captions/scripts/make-composition.cjs +404 -0
  64. package/.agents/skills/embedded-captions/scripts/make-theme.cjs +8781 -0
  65. package/.agents/skills/embedded-captions/scripts/matte.cjs +294 -0
  66. package/.agents/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
  67. package/.agents/skills/embedded-captions/scripts/prepare.sh +39 -0
  68. package/.agents/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
  69. package/.agents/skills/embedded-captions/scripts/render-and-composite.sh +509 -0
  70. package/.agents/skills/embedded-captions/scripts/render-theme.sh +34 -0
  71. package/.agents/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
  72. package/.agents/skills/embedded-captions/scripts/transcribe.cjs +349 -0
  73. package/.agents/skills/embedded-captions/themes/PORTING.md +49 -0
  74. package/.agents/skills/embedded-captions/themes/README.md +244 -0
  75. package/.agents/skills/embedded-captions/themes/anchor.json +27 -0
  76. package/.agents/skills/embedded-captions/themes/arcade.json +51 -0
  77. package/.agents/skills/embedded-captions/themes/aurora.json +41 -0
  78. package/.agents/skills/embedded-captions/themes/biolume.json +35 -0
  79. package/.agents/skills/embedded-captions/themes/brush.json +74 -0
  80. package/.agents/skills/embedded-captions/themes/chalkboard.json +52 -0
  81. package/.agents/skills/embedded-captions/themes/dossier.json +56 -0
  82. package/.agents/skills/embedded-captions/themes/graffiti.json +62 -0
  83. package/.agents/skills/embedded-captions/themes/hologram.json +41 -0
  84. package/.agents/skills/embedded-captions/themes/inkwater.json +43 -0
  85. package/.agents/skills/embedded-captions/themes/laser.json +46 -0
  86. package/.agents/skills/embedded-captions/themes/lastpage.json +33 -0
  87. package/.agents/skills/embedded-captions/themes/neonsign.json +53 -0
  88. package/.agents/skills/embedded-captions/themes/nightcity.json +56 -0
  89. package/.agents/skills/embedded-captions/themes/ordnance.json +54 -0
  90. package/.agents/skills/embedded-captions/themes/papercut.json +37 -0
  91. package/.agents/skills/embedded-captions/themes/popup.json +46 -0
  92. package/.agents/skills/embedded-captions/themes/ransom.json +62 -0
  93. package/.agents/skills/embedded-captions/themes/scoreboard.json +54 -0
  94. package/.agents/skills/embedded-captions/themes/spectrum.json +46 -0
  95. package/.agents/skills/embedded-captions/themes/stardust.json +29 -0
  96. package/.agents/skills/embedded-captions/themes/stomp.json +43 -0
  97. package/.agents/skills/embedded-captions/themes/terminal.json +49 -0
  98. package/.agents/skills/embedded-captions/themes/thunder.json +44 -0
  99. package/.agents/skills/embedded-captions/themes/transit.json +44 -0
  100. package/.agents/skills/embedded-captions/themes/vhs.json +47 -0
  101. package/.agents/skills/faceless-explainer/SKILL.md +209 -0
  102. package/.agents/skills/faceless-explainer/references/cut-catalog.md +215 -0
  103. package/.agents/skills/faceless-explainer/references/motion-language.md +156 -0
  104. package/.agents/skills/faceless-explainer/references/story-design.md +248 -0
  105. package/.agents/skills/faceless-explainer/references/visual-design.md +146 -0
  106. package/.agents/skills/faceless-explainer/scripts/assemble-index.mjs +570 -0
  107. package/.agents/skills/faceless-explainer/scripts/audio.mjs +260 -0
  108. package/.agents/skills/faceless-explainer/scripts/build-frame.mjs +536 -0
  109. package/.agents/skills/faceless-explainer/scripts/captions.mjs +508 -0
  110. package/.agents/skills/faceless-explainer/scripts/lib/assets.mjs +55 -0
  111. package/.agents/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
  112. package/.agents/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
  113. package/.agents/skills/faceless-explainer/scripts/lib/tokens.mjs +204 -0
  114. package/.agents/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
  115. package/.agents/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
  116. package/.agents/skills/faceless-explainer/scripts/transitions.mjs +320 -0
  117. package/.agents/skills/faceless-explainer/sub-agents/frame-worker.md +75 -0
  118. package/.agents/skills/farmville-saas-ux/SKILL.md +156 -0
  119. package/.agents/skills/farmville-saas-ux/assets/starter.html +294 -0
  120. package/.agents/skills/farmville-saas-ux/references/components.md +340 -0
  121. package/.agents/skills/farmville-saas-ux/references/porting-guide.md +121 -0
  122. package/.agents/skills/farmville-saas-ux/references/tokens.md +271 -0
  123. package/.agents/skills/flockposter/LICENSE +17 -0
  124. package/.agents/skills/flockposter/README.md +72 -0
  125. package/.agents/skills/flockposter/SKILL.md +562 -0
  126. package/.agents/skills/flockposter/examples/cli-instagram-reel.sh +21 -0
  127. package/.agents/skills/flockposter/examples/cli-multi-platform.json +69 -0
  128. package/.agents/skills/flockposter/examples/cli-tiktok-upload-only.sh +22 -0
  129. package/.agents/skills/flockposter/examples/cli-x-thread.sh +17 -0
  130. package/.agents/skills/flockposter/examples/cli-youtube-short.sh +21 -0
  131. package/.agents/skills/flockposter/examples/public-api-instagram-reel.json +28 -0
  132. package/.agents/skills/general-video/SKILL.md +143 -0
  133. package/.agents/skills/hyperframes/SKILL.md +160 -0
  134. package/.agents/skills/hyperframes-animation/SKILL.md +84 -0
  135. package/.agents/skills/hyperframes-animation/adapters/animate-text.md +64 -0
  136. package/.agents/skills/hyperframes-animation/adapters/animejs.md +114 -0
  137. package/.agents/skills/hyperframes-animation/adapters/css-animations.md +143 -0
  138. package/.agents/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +118 -0
  139. package/.agents/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
  140. package/.agents/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +96 -0
  141. package/.agents/skills/hyperframes-animation/adapters/gsap.md +105 -0
  142. package/.agents/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
  143. package/.agents/skills/hyperframes-animation/adapters/lottie.md +117 -0
  144. package/.agents/skills/hyperframes-animation/adapters/three.md +131 -0
  145. package/.agents/skills/hyperframes-animation/adapters/typegpu.md +178 -0
  146. package/.agents/skills/hyperframes-animation/adapters/waapi.md +101 -0
  147. package/.agents/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
  148. package/.agents/skills/hyperframes-animation/blueprints/constellation-hub.md +44 -0
  149. package/.agents/skills/hyperframes-animation/blueprints/cta-morph-press.md +28 -0
  150. package/.agents/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +57 -0
  151. package/.agents/skills/hyperframes-animation/blueprints/dataviz-countup.md +46 -0
  152. package/.agents/skills/hyperframes-animation/blueprints/device-surface-showcase.md +53 -0
  153. package/.agents/skills/hyperframes-animation/blueprints/grid-card-assemble.md +66 -0
  154. package/.agents/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +78 -0
  155. package/.agents/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +69 -0
  156. package/.agents/skills/hyperframes-animation/blueprints/overwhelm-surround.md +28 -0
  157. package/.agents/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
  158. package/.agents/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
  159. package/.agents/skills/hyperframes-animation/blueprints/titlecard-reveal.md +42 -0
  160. package/.agents/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
  161. package/.agents/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
  162. package/.agents/skills/hyperframes-animation/blueprints-index.md +146 -0
  163. package/.agents/skills/hyperframes-animation/examples/assets/avatars/02.avif +0 -0
  164. package/.agents/skills/hyperframes-animation/examples/assets/brands/github.avif +0 -0
  165. package/.agents/skills/hyperframes-animation/examples/assets/brands/nvidia.avif +0 -0
  166. package/.agents/skills/hyperframes-animation/examples/assets/brands/visa.avif +0 -0
  167. package/.agents/skills/hyperframes-animation/examples/assets/brands/zoominfo.avif +0 -0
  168. package/.agents/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
  169. package/.agents/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
  170. package/.agents/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
  171. package/.agents/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
  172. package/.agents/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
  173. package/.agents/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
  174. package/.agents/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
  175. package/.agents/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
  176. package/.agents/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
  177. package/.agents/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
  178. package/.agents/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
  179. package/.agents/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
  180. package/.agents/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
  181. package/.agents/skills/hyperframes-animation/rules/3d-page-scroll.md +227 -0
  182. package/.agents/skills/hyperframes-animation/rules/3d-text-depth-layers.md +297 -0
  183. package/.agents/skills/hyperframes-animation/rules/ai-tracking-box.md +382 -0
  184. package/.agents/skills/hyperframes-animation/rules/ambient-glow-bloom.md +305 -0
  185. package/.agents/skills/hyperframes-animation/rules/asr-keyword-glow.md +286 -0
  186. package/.agents/skills/hyperframes-animation/rules/avatar-cloud-network.md +371 -0
  187. package/.agents/skills/hyperframes-animation/rules/camera-cursor-tracking.md +246 -0
  188. package/.agents/skills/hyperframes-animation/rules/card-morph-anchor.md +267 -0
  189. package/.agents/skills/hyperframes-animation/rules/center-outward-expansion.md +227 -0
  190. package/.agents/skills/hyperframes-animation/rules/context-sensitive-cursor.md +257 -0
  191. package/.agents/skills/hyperframes-animation/rules/coordinate-target-zoom.md +332 -0
  192. package/.agents/skills/hyperframes-animation/rules/counting-dynamic-scale.md +283 -0
  193. package/.agents/skills/hyperframes-animation/rules/css-marker-patterns.md +373 -0
  194. package/.agents/skills/hyperframes-animation/rules/cursor-click-ripple.md +262 -0
  195. package/.agents/skills/hyperframes-animation/rules/depth-of-field-blur.md +313 -0
  196. package/.agents/skills/hyperframes-animation/rules/depth-scatter-assemble.md +303 -0
  197. package/.agents/skills/hyperframes-animation/rules/discrete-text-sequence.md +273 -0
  198. package/.agents/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +307 -0
  199. package/.agents/skills/hyperframes-animation/rules/gsap-effects.md +299 -0
  200. package/.agents/skills/hyperframes-animation/rules/hacker-flip-3d.md +223 -0
  201. package/.agents/skills/hyperframes-animation/rules/kinetic-beat-slam.md +183 -0
  202. package/.agents/skills/hyperframes-animation/rules/motion-blur-streak.md +328 -0
  203. package/.agents/skills/hyperframes-animation/rules/multi-phase-camera.md +273 -0
  204. package/.agents/skills/hyperframes-animation/rules/orbit-3d-entry.md +301 -0
  205. package/.agents/skills/hyperframes-animation/rules/physics-press-reaction.md +350 -0
  206. package/.agents/skills/hyperframes-animation/rules/press-release-spring.md +296 -0
  207. package/.agents/skills/hyperframes-animation/rules/reactive-displacement.md +277 -0
  208. package/.agents/skills/hyperframes-animation/rules/scale-swap-transition.md +298 -0
  209. package/.agents/skills/hyperframes-animation/rules/sine-wave-loop.md +278 -0
  210. package/.agents/skills/hyperframes-animation/rules/split-tilt-cards.md +277 -0
  211. package/.agents/skills/hyperframes-animation/rules/spring-pop-entrance.md +273 -0
  212. package/.agents/skills/hyperframes-animation/rules/stat-bars-and-fills.md +156 -0
  213. package/.agents/skills/hyperframes-animation/rules/svg-icon-enrichment.md +329 -0
  214. package/.agents/skills/hyperframes-animation/rules/svg-path-draw.md +274 -0
  215. package/.agents/skills/hyperframes-animation/rules/vertical-spring-ticker.md +239 -0
  216. package/.agents/skills/hyperframes-animation/rules/viewport-change.md +349 -0
  217. package/.agents/skills/hyperframes-animation/rules-index.md +86 -0
  218. package/.agents/skills/hyperframes-animation/scripts/animation-map.mjs +606 -0
  219. package/.agents/skills/hyperframes-animation/scripts/package-loader.mjs +288 -0
  220. package/.agents/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
  221. package/.agents/skills/hyperframes-animation/techniques.md +507 -0
  222. package/.agents/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +167 -0
  223. package/.agents/skills/hyperframes-animation/transitions/catalog.md +127 -0
  224. package/.agents/skills/hyperframes-animation/transitions/css-3d.md +12 -0
  225. package/.agents/skills/hyperframes-animation/transitions/css-blur.md +51 -0
  226. package/.agents/skills/hyperframes-animation/transitions/css-cover.md +43 -0
  227. package/.agents/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
  228. package/.agents/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
  229. package/.agents/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
  230. package/.agents/skills/hyperframes-animation/transitions/css-grid.md +10 -0
  231. package/.agents/skills/hyperframes-animation/transitions/css-light.md +49 -0
  232. package/.agents/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
  233. package/.agents/skills/hyperframes-animation/transitions/css-other.md +25 -0
  234. package/.agents/skills/hyperframes-animation/transitions/css-push.md +41 -0
  235. package/.agents/skills/hyperframes-animation/transitions/css-radial.md +37 -0
  236. package/.agents/skills/hyperframes-animation/transitions/css-scale.md +24 -0
  237. package/.agents/skills/hyperframes-animation/transitions/overview.md +153 -0
  238. package/.agents/skills/hyperframes-cli/SKILL.md +113 -0
  239. package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
  240. package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +55 -0
  241. package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
  242. package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
  243. package/.agents/skills/hyperframes-cli/references/preview-render.md +149 -0
  244. package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
  245. package/.agents/skills/hyperframes-core/SKILL.md +78 -0
  246. package/.agents/skills/hyperframes-core/references/composition-patterns.md +263 -0
  247. package/.agents/skills/hyperframes-core/references/data-attributes.md +70 -0
  248. package/.agents/skills/hyperframes-core/references/determinism-rules.md +68 -0
  249. package/.agents/skills/hyperframes-core/references/full-screen-motion.md +62 -0
  250. package/.agents/skills/hyperframes-core/references/minimal-composition.md +66 -0
  251. package/.agents/skills/hyperframes-core/references/script-format.md +49 -0
  252. package/.agents/skills/hyperframes-core/references/storyboard-format.md +95 -0
  253. package/.agents/skills/hyperframes-core/references/sub-compositions.md +237 -0
  254. package/.agents/skills/hyperframes-core/references/subagent-dispatch.md +41 -0
  255. package/.agents/skills/hyperframes-core/references/tailwind.md +125 -0
  256. package/.agents/skills/hyperframes-core/references/tracks-and-clips.md +76 -0
  257. package/.agents/skills/hyperframes-core/references/variables-and-media.md +90 -0
  258. package/.agents/skills/hyperframes-creative/SKILL.md +70 -0
  259. package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
  260. package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
  261. package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
  262. package/.agents/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
  263. package/.agents/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
  264. package/.agents/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
  265. package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
  266. package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
  267. package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
  268. package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
  269. package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
  270. package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
  271. package/.agents/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
  272. package/.agents/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
  273. package/.agents/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
  274. package/.agents/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
  275. package/.agents/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
  276. package/.agents/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
  277. package/.agents/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
  278. package/.agents/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
  279. package/.agents/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
  280. package/.agents/skills/hyperframes-creative/frame-presets/claude/FRAME.md +277 -0
  281. package/.agents/skills/hyperframes-creative/frame-presets/claude/caption-skin.html +224 -0
  282. package/.agents/skills/hyperframes-creative/frame-presets/claude/frame-showcase.html +1439 -0
  283. package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
  284. package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
  285. package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
  286. package/.agents/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
  287. package/.agents/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
  288. package/.agents/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
  289. package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
  290. package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
  291. package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
  292. package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
  293. package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
  294. package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
  295. package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
  296. package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
  297. package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
  298. package/.agents/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
  299. package/.agents/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
  300. package/.agents/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
  301. package/.agents/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
  302. package/.agents/skills/hyperframes-creative/palettes/monochrome.md +14 -0
  303. package/.agents/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
  304. package/.agents/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
  305. package/.agents/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
  306. package/.agents/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
  307. package/.agents/skills/hyperframes-creative/references/audio-reactive.md +76 -0
  308. package/.agents/skills/hyperframes-creative/references/beat-direction.md +164 -0
  309. package/.agents/skills/hyperframes-creative/references/composition-patterns.md +199 -0
  310. package/.agents/skills/hyperframes-creative/references/data-in-motion.md +19 -0
  311. package/.agents/skills/hyperframes-creative/references/design-adherence.md +19 -0
  312. package/.agents/skills/hyperframes-creative/references/design-picker.md +123 -0
  313. package/.agents/skills/hyperframes-creative/references/design-spec.md +55 -0
  314. package/.agents/skills/hyperframes-creative/references/house-style.md +73 -0
  315. package/.agents/skills/hyperframes-creative/references/motion-principles.md +150 -0
  316. package/.agents/skills/hyperframes-creative/references/narration.md +92 -0
  317. package/.agents/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
  318. package/.agents/skills/hyperframes-creative/references/typography.md +218 -0
  319. package/.agents/skills/hyperframes-creative/references/video-composition.md +63 -0
  320. package/.agents/skills/hyperframes-creative/references/visual-styles.md +457 -0
  321. package/.agents/skills/hyperframes-creative/scripts/contrast-report.mjs +353 -0
  322. package/.agents/skills/hyperframes-creative/scripts/extract-audio-data.py +188 -0
  323. package/.agents/skills/hyperframes-creative/scripts/package-loader.mjs +288 -0
  324. package/.agents/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
  325. package/.agents/skills/hyperframes-creative/templates/design-picker.html +1432 -0
  326. package/.agents/skills/hyperframes-keyframes/SKILL.md +237 -0
  327. package/.agents/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
  328. package/.agents/skills/hyperframes-keyframes/references/keyframe-patterns.md +106 -0
  329. package/.agents/skills/motion-graphics/SKILL.md +172 -0
  330. package/.agents/skills/motion-graphics/agents/builder.md +40 -0
  331. package/.agents/skills/motion-graphics/agents/director.md +53 -0
  332. package/.agents/skills/motion-graphics/agents/finalize.md +17 -0
  333. package/.agents/skills/motion-graphics/catalog-map.md +40 -0
  334. package/.agents/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
  335. package/.agents/skills/motion-graphics/categories/charts/module.md +21 -0
  336. package/.agents/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
  337. package/.agents/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
  338. package/.agents/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
  339. package/.agents/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
  340. package/.agents/skills/motion-graphics/categories/maps/module.md +61 -0
  341. package/.agents/skills/motion-graphics/categories/news/module.md +56 -0
  342. package/.agents/skills/motion-graphics/categories/stat/module.md +21 -0
  343. package/.agents/skills/motion-graphics/categories/tweet/module.md +16 -0
  344. package/.agents/skills/motion-graphics/categories/webpage/module.md +21 -0
  345. package/.agents/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
  346. package/.agents/skills/motion-graphics/grounding/locate.mjs +227 -0
  347. package/.agents/skills/motion-graphics/phases/source/guide.md +21 -0
  348. package/.agents/skills/motion-graphics/references/builder-contract.md +38 -0
  349. package/.agents/skills/motion-graphics/references/motion-vocabulary.md +43 -0
  350. package/.agents/skills/motion-graphics/references/shot-plan-ir.md +54 -0
  351. package/.agents/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
  352. package/.agents/skills/music/SKILL.md +416 -0
  353. package/.agents/skills/music/references/api_reference.md +519 -0
  354. package/.agents/skills/music/references/installation.md +65 -0
  355. package/.agents/skills/product-launch-video/SKILL.md +208 -0
  356. package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
  357. package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
  358. package/.agents/skills/product-launch-video/references/story-design.md +373 -0
  359. package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
  360. package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
  361. package/.agents/skills/product-launch-video/scripts/audio.mjs +260 -0
  362. package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
  363. package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
  364. package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
  365. package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
  366. package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
  367. package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
  368. package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
  369. package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
  370. package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
  371. package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
  372. package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
  373. package/.agents/skills/product-launch-video/scripts/transitions.mjs +327 -0
  374. package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +75 -0
  375. package/.agents/skills/slideshow/SKILL.md +550 -0
  376. package/.agents/skills/slideshow/references/standalone-harness.md +1020 -0
  377. package/.agents/skills/talking-head-recut/NOTICE.md +39 -0
  378. package/.agents/skills/talking-head-recut/SKILL.md +1195 -0
  379. package/.agents/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
  380. package/.agents/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
  381. package/.agents/skills/talking-head-recut/references/frames/clean.html +92 -0
  382. package/.agents/skills/talking-head-recut/references/frames/hairline.html +171 -0
  383. package/.agents/skills/talking-head-recut/references/frames/polaroid.html +131 -0
  384. package/.agents/skills/talking-head-recut/references/layouts/overlay.html +164 -0
  385. package/.agents/skills/talking-head-recut/references/layouts/pip.html +143 -0
  386. package/.agents/skills/talking-head-recut/references/layouts/split.html +121 -0
  387. package/.agents/skills/talking-head-recut/references/layouts/stack.html +109 -0
  388. package/.agents/skills/talking-head-recut/references/styles/academic.html +172 -0
  389. package/.agents/skills/talking-head-recut/references/styles/audit.html +170 -0
  390. package/.agents/skills/talking-head-recut/references/styles/editorial.html +189 -0
  391. package/.agents/skills/talking-head-recut/references/styles/geom.html +181 -0
  392. package/.agents/skills/talking-head-recut/references/styles/minimal.html +130 -0
  393. package/.agents/skills/talking-head-recut/references/styles/spotlight.html +142 -0
  394. package/.agents/skills/talking-head-recut/references/styles/swiss.html +188 -0
  395. package/.agents/skills/talking-head-recut/references/styles/terminal.html +196 -0
  396. package/.agents/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
  397. package/.agents/skills/talking-head-recut/references/styles/xhs.html +206 -0
  398. package/.agents/skills/text-to-speech/SKILL.md +226 -0
  399. package/.agents/skills/text-to-speech/references/installation.md +90 -0
  400. package/.agents/skills/text-to-speech/references/streaming.md +307 -0
  401. package/.agents/skills/text-to-speech/references/voice-settings.md +115 -0
  402. package/.agents/skills/vidfarm-director/SKILL.md +179 -0
  403. package/.agents/skills/vidfarm-director/recipes/find-and-fork-template.md +16 -0
  404. package/.agents/skills/vidfarm-director/recipes/local-edit-render-approve.md +13 -0
  405. package/.agents/skills/vidfarm-director/recipes/onboard-a-new-director.md +13 -0
  406. package/.agents/skills/vidfarm-director/recipes/retheme-template.md +17 -0
  407. package/.agents/skills/vidfarm-director/references/assets-and-sourcing.md +117 -0
  408. package/.agents/skills/vidfarm-director/references/automation-and-local-dev.md +276 -0
  409. package/.agents/skills/vidfarm-director/references/core-workflows.md +301 -0
  410. package/.agents/skills/vidfarm-director/references/editor-workflows.md +367 -0
  411. package/.agents/skills/vidfarm-director/references/onboarding.md +28 -0
  412. package/.agents/skills/vidfarm-director/references/primitives.md +307 -0
  413. package/.agents/skills/vidfarm-director/references/rest-api.md +84 -0
  414. package/.agents/skills/vidfarm-media/SKILL.md +158 -0
  415. package/.agents/skills/vidfarm-media/references/tts.md +111 -0
  416. package/.agents/skills/vidfarm-media/scripts/audio.mjs +628 -0
  417. package/.agents/skills/vidfarm-media/scripts/wait-bgm.mjs +31 -0
  418. package/.agents/skills/website-to-video/SKILL.md +145 -0
  419. package/.agents/skills/website-to-video/assets/sfx/CREDITS.md +35 -0
  420. package/.agents/skills/website-to-video/assets/sfx/manifest.json +97 -0
  421. package/.agents/skills/website-to-video/references/beat-builder-guide.md +263 -0
  422. package/.agents/skills/website-to-video/references/capabilities.md +713 -0
  423. package/.agents/skills/website-to-video/references/step-0-capture.md +55 -0
  424. package/.agents/skills/website-to-video/references/step-1-design.md +333 -0
  425. package/.agents/skills/website-to-video/references/step-2-brief.md +178 -0
  426. package/.agents/skills/website-to-video/references/step-3-storyboard.md +572 -0
  427. package/.agents/skills/website-to-video/references/step-4-vo.md +225 -0
  428. package/.agents/skills/website-to-video/references/step-5-build.md +483 -0
  429. package/.agents/skills/website-to-video/references/step-6-validate.md +341 -0
  430. package/.agents/skills/website-to-video/scripts/w2h-verify.mjs +759 -0
  431. package/README.md +97 -0
  432. package/SKILL.director.md +1644 -0
  433. package/SKILL.md +83 -0
  434. package/demo/README.md +28 -0
  435. package/demo/dist/app.css +1 -0
  436. package/demo/dist/app.js +968 -0
  437. package/demo/dist/chunks/chunk-3OT2D42H.js +1 -0
  438. package/demo/dist/chunks/chunk-DXB73IDG.js +1 -0
  439. package/demo/dist/chunks/domEditingLayers-AT7G6F4L-ZTHJHB7R.js +1 -0
  440. package/demo/dist/chunks/hyperframes-player-7HKH6NSO.js +459 -0
  441. package/demo/dist/chunks/lib-XAQ37YOE.js +1 -0
  442. package/demo/dist/chunks/src-TJ2QYA4U.js +207 -0
  443. package/demo/dist/favicon.ico +0 -0
  444. package/demo/dist/icons/timeline/audio.svg +7 -0
  445. package/demo/dist/icons/timeline/captions.svg +5 -0
  446. package/demo/dist/icons/timeline/composition.svg +12 -0
  447. package/demo/dist/icons/timeline/image.svg +18 -0
  448. package/demo/dist/icons/timeline/music.svg +10 -0
  449. package/demo/dist/icons/timeline/text.svg +3 -0
  450. package/demo/dist/index.html +16 -0
  451. package/dist/src/cli.js +7258 -0
  452. package/dist/src/devcli/auth-store.js +67 -0
  453. package/dist/src/devcli/captions.js +310 -0
  454. package/dist/src/devcli/clip-store.js +368 -0
  455. package/dist/src/devcli/clips.js +1138 -0
  456. package/dist/src/devcli/composition-edit.js +1292 -0
  457. package/dist/src/devcli/cost-mode.js +149 -0
  458. package/dist/src/devcli/doctor.js +192 -0
  459. package/dist/src/devcli/hyperframes-cli.js +118 -0
  460. package/dist/src/devcli/local-backend.js +167 -0
  461. package/dist/src/devcli/local-frontend-server.js +681 -0
  462. package/dist/src/devcli/local-render.js +136 -0
  463. package/dist/src/devcli/skills.js +476 -0
  464. package/dist/src/devcli/speech.js +178 -0
  465. package/dist/src/devcli/stills.js +249 -0
  466. package/dist/src/devcli/telemetry.js +236 -0
  467. package/dist/src/devcli/timeline-edit.js +490 -0
  468. package/dist/src/devcli/transitions.js +205 -0
  469. package/dist/src/hyperframes/composition.js +780 -0
  470. package/dist/src/lib/crypto.js +45 -0
  471. package/dist/src/lib/dev-log.js +54 -0
  472. package/dist/src/lib/display-name.js +11 -0
  473. package/dist/src/lib/ids.js +24 -0
  474. package/dist/src/lib/images.js +19 -0
  475. package/dist/src/lib/json.js +15 -0
  476. package/dist/src/lib/package-root.js +47 -0
  477. package/dist/src/lib/render-media-prep.js +293 -0
  478. package/dist/src/lib/template-paths.js +28 -0
  479. package/dist/src/lib/time.js +7 -0
  480. package/dist/src/lib/url-clean.js +85 -0
  481. package/dist/src/services/captions.js +123 -0
  482. package/dist/src/services/clip-curation/cost.js +116 -0
  483. package/dist/src/services/clip-curation/ffmpeg.js +352 -0
  484. package/dist/src/services/clip-curation/gemini.js +418 -0
  485. package/dist/src/services/clip-curation/hunt.js +470 -0
  486. package/dist/src/services/clip-curation/index.js +19 -0
  487. package/dist/src/services/clip-curation/local-agent.js +248 -0
  488. package/dist/src/services/clip-curation/media-select.js +152 -0
  489. package/dist/src/services/clip-curation/presets.js +20 -0
  490. package/dist/src/services/clip-curation/presets.v1.json +59 -0
  491. package/dist/src/services/clip-curation/query.js +167 -0
  492. package/dist/src/services/clip-curation/refine.js +165 -0
  493. package/dist/src/services/clip-curation/scan.js +189 -0
  494. package/dist/src/services/clip-curation/source-naming.js +131 -0
  495. package/dist/src/services/clip-curation/taxonomy.js +73 -0
  496. package/dist/src/services/clip-curation/taxonomy.v1.json +102 -0
  497. package/dist/src/services/clip-curation/types.js +7 -0
  498. package/dist/src/services/composition-lint.js +199 -0
  499. package/dist/src/services/provider-errors.js +128 -0
  500. package/dist/src/services/speech.js +629 -0
  501. package/package.json +154 -0
  502. package/public/assets/discover-client-app.js +1 -0
  503. package/public/assets/favicon.ico +0 -0
  504. package/public/assets/file-directory-app.js +89 -0
  505. package/public/assets/homepage-app.js +54 -0
  506. package/public/assets/homepage-client-app.js +80 -0
  507. package/public/assets/landing-page-client-app.js +87 -0
  508. package/public/assets/logo-vidfarm.png +0 -0
  509. package/public/assets/page-runtime-client-app.js +94 -0
  510. package/public/assets/placeholders/scene-placeholder.png +0 -0
  511. package/public/serve-shells/editor.html +3146 -0
  512. package/public/serve-shells/library-files.html +3450 -0
  513. package/public/serve-shells/library-raws.html +4404 -0
  514. package/public/serve-shells/tools-clipper.html +3991 -0
  515. package/public/serve-shells/tools-image.html +5584 -0
  516. 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