@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,45 @@
1
+ import { createCipheriv, createDecipheriv, createHash, randomBytes, scryptSync, timingSafeEqual } from "node:crypto";
2
+ function deriveKey(secret) {
3
+ return scryptSync(secret, "vidfarm", 32);
4
+ }
5
+ export function hashSecret(value) {
6
+ return createHash("sha256").update(value).digest("hex");
7
+ }
8
+ export function safeEqualHash(raw, hashed) {
9
+ const left = Buffer.from(hashSecret(raw), "hex");
10
+ const right = Buffer.from(hashed, "hex");
11
+ return left.length === right.length && timingSafeEqual(left, right);
12
+ }
13
+ export function encryptString(value, secret) {
14
+ const iv = randomBytes(12);
15
+ const key = deriveKey(secret);
16
+ const cipher = createCipheriv("aes-256-gcm", key, iv);
17
+ const encrypted = Buffer.concat([cipher.update(value, "utf8"), cipher.final()]);
18
+ const tag = cipher.getAuthTag();
19
+ return Buffer.concat([iv, tag, encrypted]).toString("base64");
20
+ }
21
+ export function decryptString(value, secret) {
22
+ const raw = Buffer.from(value, "base64");
23
+ const iv = raw.subarray(0, 12);
24
+ const tag = raw.subarray(12, 28);
25
+ const encrypted = raw.subarray(28);
26
+ const key = deriveKey(secret);
27
+ const decipher = createDecipheriv("aes-256-gcm", key, iv);
28
+ decipher.setAuthTag(tag);
29
+ return Buffer.concat([decipher.update(encrypted), decipher.final()]).toString("utf8");
30
+ }
31
+ export function hashPassword(password) {
32
+ const salt = randomBytes(16).toString("hex");
33
+ const digest = scryptSync(password, salt, 32).toString("hex");
34
+ return `${salt}:${digest}`;
35
+ }
36
+ export function verifyPassword(password, storedHash) {
37
+ const [salt, digest] = storedHash.split(":");
38
+ if (!salt || !digest) {
39
+ return false;
40
+ }
41
+ const left = Buffer.from(scryptSync(password, salt, 32).toString("hex"), "hex");
42
+ const right = Buffer.from(digest, "hex");
43
+ return left.length === right.length && timingSafeEqual(left, right);
44
+ }
45
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1,54 @@
1
+ import { config } from "../config.js";
2
+ const SECRET_KEY_PATTERN = /(secret|token|password|api[_-]?key|authorization|credential)/i;
3
+ export function devLog(event, fields = {}, level = "info") {
4
+ if (!config.debugLogs) {
5
+ return;
6
+ }
7
+ const entry = {
8
+ level,
9
+ event,
10
+ time: new Date().toISOString(),
11
+ deployment_target: config.VIDFARM_DEPLOYMENT_TARGET ?? null,
12
+ runtime_backend: config.VIDFARM_RUNTIME_BACKEND,
13
+ ...sanitizeLogFields(fields)
14
+ };
15
+ const line = JSON.stringify(entry);
16
+ if (level === "error") {
17
+ console.error(line);
18
+ }
19
+ else if (level === "warn") {
20
+ console.warn(line);
21
+ }
22
+ else {
23
+ console.log(line);
24
+ }
25
+ }
26
+ export function devErrorFields(error) {
27
+ if (error instanceof Error) {
28
+ return {
29
+ error_name: error.name,
30
+ error_message: error.message,
31
+ error_stack: error.stack?.split("\n").slice(0, 8).join("\n") ?? null
32
+ };
33
+ }
34
+ return {
35
+ error_message: String(error)
36
+ };
37
+ }
38
+ function sanitizeLogValue(value) {
39
+ if (Array.isArray(value)) {
40
+ return value.map(sanitizeLogValue);
41
+ }
42
+ if (!value || typeof value !== "object") {
43
+ return value;
44
+ }
45
+ const output = {};
46
+ for (const [key, child] of Object.entries(value)) {
47
+ output[key] = SECRET_KEY_PATTERN.test(key) ? "[redacted]" : sanitizeLogValue(child);
48
+ }
49
+ return output;
50
+ }
51
+ function sanitizeLogFields(fields) {
52
+ return sanitizeLogValue(fields);
53
+ }
54
+ //# sourceMappingURL=dev-log.js.map
@@ -0,0 +1,11 @@
1
+ export function displayNameFromEmail(email) {
2
+ const normalized = email.trim().toLowerCase();
3
+ const localPart = normalized.split("@", 1)[0] || normalized;
4
+ const words = localPart
5
+ .split(/[^a-z0-9]+/i)
6
+ .map((word) => word.trim())
7
+ .filter(Boolean)
8
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase());
9
+ return words.join(" ") || normalized;
10
+ }
11
+ //# sourceMappingURL=display-name.js.map
@@ -0,0 +1,24 @@
1
+ import { randomBytes, randomUUID } from "node:crypto";
2
+ export function createId(prefix) {
3
+ return `${prefix}_${randomUUID().replace(/-/g, "")}`;
4
+ }
5
+ // UUIDv7: time-ordered 128-bit id. First 48 bits are Unix millis, next 4 bits
6
+ // are the version (7), next 12 bits are random, next 2 bits are the variant
7
+ // (0b10), and the rest is random. Chronologically sortable — good for DDB
8
+ // keys and for humans skimming a list of forks.
9
+ export function uuidv7() {
10
+ const timestampMs = BigInt(Date.now());
11
+ const rand = randomBytes(10);
12
+ const bytes = Buffer.alloc(16);
13
+ bytes.writeUIntBE(Number((timestampMs >> 16n) & 0xffffffffn), 0, 4);
14
+ bytes.writeUIntBE(Number(timestampMs & 0xffffn), 4, 2);
15
+ rand.copy(bytes, 6);
16
+ bytes[6] = (bytes[6] & 0x0f) | 0x70; // version 7
17
+ bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant RFC 4122
18
+ const hex = bytes.toString("hex");
19
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
20
+ }
21
+ export function createIdV7(prefix) {
22
+ return `${prefix}_${uuidv7().replace(/-/g, "")}`;
23
+ }
24
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1,19 @@
1
+ import sharp from "sharp";
2
+ export async function normalizeToPortraitFrame(input, target = { width: 1080, height: 1920 }) {
3
+ const buffer = Buffer.isBuffer(input) ? input : Buffer.from(input);
4
+ const output = await sharp(buffer, { density: 144 })
5
+ .rotate()
6
+ .resize(target.width, target.height, {
7
+ fit: "cover",
8
+ position: sharp.strategy.attention
9
+ })
10
+ .png()
11
+ .toBuffer();
12
+ return {
13
+ bytes: output,
14
+ contentType: "image/png",
15
+ width: target.width,
16
+ height: target.height
17
+ };
18
+ }
19
+ //# sourceMappingURL=images.js.map
@@ -0,0 +1,15 @@
1
+ export function parseJson(value, fallback) {
2
+ if (!value) {
3
+ return fallback;
4
+ }
5
+ try {
6
+ return JSON.parse(value);
7
+ }
8
+ catch {
9
+ return fallback;
10
+ }
11
+ }
12
+ export function stringifyJson(value) {
13
+ return JSON.stringify(value ?? null);
14
+ }
15
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1,47 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ // Server asset files (the hyperframes editor bundle, public/assets JS bundles,
5
+ // SKILL.*.md, src/assets binaries) are laid out relative to the PACKAGE root:
6
+ // the repo checkout in dev, /app–/var/task in Docker/Lambda, or
7
+ // node_modules/@officexapp/vidfarm-devcli when `vidfarm serve` runs from the
8
+ // published npm package. cwd-relative reads only cover the first two, so every
9
+ // root-file read should try cwd first (preserves the existing dev/Docker
10
+ // behavior) and then fall back to this package root.
11
+ function findPackageRoot() {
12
+ let current = path.dirname(fileURLToPath(import.meta.url));
13
+ for (let depth = 0; depth < 6; depth += 1) {
14
+ const manifest = path.join(current, "package.json");
15
+ if (existsSync(manifest)) {
16
+ try {
17
+ const parsed = JSON.parse(readFileSync(manifest, "utf8"));
18
+ if (parsed.name === "@officexapp/vidfarm-devcli") {
19
+ return current;
20
+ }
21
+ }
22
+ catch {
23
+ // Unreadable manifest — keep walking up.
24
+ }
25
+ }
26
+ const parent = path.dirname(current);
27
+ if (parent === current)
28
+ break;
29
+ current = parent;
30
+ }
31
+ return null;
32
+ }
33
+ export const packageRoot = findPackageRoot();
34
+ // All plausible absolute paths for a package-root-relative file, ordered
35
+ // cwd-first so a dev checkout (or Docker task root) always wins over the
36
+ // installed package copy.
37
+ export function resolveRootFileCandidates(relativePath) {
38
+ const candidates = [path.resolve(relativePath)];
39
+ if (packageRoot) {
40
+ const packaged = path.resolve(packageRoot, relativePath);
41
+ if (!candidates.includes(packaged)) {
42
+ candidates.push(packaged);
43
+ }
44
+ }
45
+ return candidates;
46
+ }
47
+ //# sourceMappingURL=package-root.js.map
@@ -0,0 +1,293 @@
1
+ // Render media prep — "download once, cut from it".
2
+ //
3
+ // A composition that drops N short windows of the same long source video onto
4
+ // the timeline (e.g. "insert a 5s clip of my Dubai raw every 10 seconds")
5
+ // naively makes the renderer load the ENTIRE long source once per <video>
6
+ // element. Headless Chrome buffers each element independently, so a 12-minute
7
+ // source referenced five times stalls the media-ready phase for minutes (or
8
+ // forever on slow links) to ultimately show 25 seconds of footage.
9
+ //
10
+ // This pass runs at project-staging time, before any renderer sees the HTML:
11
+ // 1. group <video>/<audio> clips by remote source URL,
12
+ // 2. probe the source's duration (ffprobe reads headers over HTTP — cheap),
13
+ // 3. when the composition only plays small windows of a big source (or plays
14
+ // the same source from several elements), download the source ONCE to a
15
+ // temp dir, ffmpeg-cut each element's exact window into a small local
16
+ // segment file inside the project dir, and rewrite the element to play
17
+ // that segment from 0,
18
+ // 4. when cutting isn't safe (looping layers, alpha/webm containers) but the
19
+ // source is still referenced multiple times, download it once into the
20
+ // project dir and point every element at the single local copy.
21
+ //
22
+ // The module is dependency-light on purpose (node builtins + linkedom +
23
+ // bundled ffmpeg/ffprobe statics) so the PUBLIC devcli package can ship it for
24
+ // free local renders; the backend render paths (in-process + Lambda staging)
25
+ // call the same function.
26
+ import { spawn } from "node:child_process";
27
+ import { createWriteStream, existsSync } from "node:fs";
28
+ import { mkdir, mkdtemp, rm, stat } from "node:fs/promises";
29
+ import { createHash } from "node:crypto";
30
+ import os from "node:os";
31
+ import path from "node:path";
32
+ import { Readable, Transform } from "node:stream";
33
+ import { pipeline } from "node:stream/promises";
34
+ import { parseHTML } from "linkedom";
35
+ // Trailing pad added to every cut so the renderer never runs out of media on
36
+ // the final frame of a clip (frame quantization + audio priming).
37
+ const SEGMENT_PAD_SECONDS = 0.5;
38
+ // A single-reference source is only worth cutting when the unused tail is
39
+ // substantial — the download itself is the expensive part we're amortizing.
40
+ const SINGLE_REF_MIN_WASTE_SECONDS = 60;
41
+ const SINGLE_REF_MIN_RATIO = 3;
42
+ const CUTTABLE_VIDEO = /\.(mp4|m4v)(\?|#|$)/i;
43
+ const CUTTABLE_AUDIO = /\.(mp3|m4a|aac|wav|mp4)(\?|#|$)/i;
44
+ function numAttr(node, name) {
45
+ const raw = Number.parseFloat(node?.getAttribute?.(name) ?? "");
46
+ return Number.isFinite(raw) ? raw : NaN;
47
+ }
48
+ function readMediaRef(node, kind) {
49
+ const playbackStart = numAttr(node, "data-playback-start");
50
+ const mediaStart = numAttr(node, "data-media-start");
51
+ const duration = numAttr(node, "data-duration");
52
+ return {
53
+ node,
54
+ kind,
55
+ mediaStart: Number.isFinite(playbackStart) ? playbackStart : (Number.isFinite(mediaStart) ? mediaStart : 0),
56
+ duration: Number.isFinite(duration) && duration > 0 ? duration : null,
57
+ loops: node.hasAttribute("loop") || node.getAttribute("data-loop") === "true"
58
+ };
59
+ }
60
+ async function resolveFfmpegPath() {
61
+ const env = process.env.HYPERFRAMES_FFMPEG_PATH?.trim();
62
+ if (env && existsSync(env))
63
+ return env;
64
+ try {
65
+ const mod = (await import("ffmpeg-static"));
66
+ const resolved = typeof mod === "string" ? mod : mod.default;
67
+ if (typeof resolved === "string" && resolved && existsSync(resolved))
68
+ return resolved;
69
+ }
70
+ catch { /* PATH fallback */ }
71
+ return "ffmpeg";
72
+ }
73
+ async function resolveFfprobePath() {
74
+ const env = process.env.HYPERFRAMES_FFPROBE_PATH?.trim();
75
+ if (env && existsSync(env))
76
+ return env;
77
+ try {
78
+ const mod = (await import("ffprobe-static"));
79
+ const resolved = (mod.path ?? mod.default?.path);
80
+ if (typeof resolved === "string" && resolved && existsSync(resolved))
81
+ return resolved;
82
+ }
83
+ catch { /* PATH fallback */ }
84
+ return "ffprobe";
85
+ }
86
+ function runCommand(bin, args, timeoutMs) {
87
+ return new Promise((resolve, reject) => {
88
+ const proc = spawn(bin, args, { stdio: ["ignore", "pipe", "pipe"] });
89
+ let stdout = "";
90
+ let stderr = "";
91
+ const timer = setTimeout(() => {
92
+ proc.kill("SIGKILL");
93
+ reject(new Error(`${path.basename(bin)} timed out after ${Math.round(timeoutMs / 1000)}s`));
94
+ }, timeoutMs);
95
+ proc.stdout.on("data", (chunk) => { stdout += chunk.toString(); });
96
+ proc.stderr.on("data", (chunk) => { stderr = (stderr + chunk.toString()).slice(-8192); });
97
+ proc.on("error", (error) => { clearTimeout(timer); reject(error); });
98
+ proc.on("close", (code) => { clearTimeout(timer); resolve({ code: code ?? 1, stdout, stderr }); });
99
+ });
100
+ }
101
+ /** Probe a (remote or local) media file's duration in seconds, or null. */
102
+ export async function probeMediaDurationSeconds(source, timeoutMs = 30_000) {
103
+ const ffprobe = await resolveFfprobePath();
104
+ try {
105
+ const result = await runCommand(ffprobe, [
106
+ "-v", "error",
107
+ "-show_entries", "format=duration",
108
+ "-of", "json",
109
+ source
110
+ ], timeoutMs);
111
+ if (result.code !== 0)
112
+ return null;
113
+ const parsed = JSON.parse(result.stdout || "{}");
114
+ const duration = Number.parseFloat(parsed.format?.duration ?? "");
115
+ return Number.isFinite(duration) && duration > 0 ? duration : null;
116
+ }
117
+ catch {
118
+ return null;
119
+ }
120
+ }
121
+ async function downloadToFile(url, filePath, maxBytes) {
122
+ const response = await fetch(url, { redirect: "follow" });
123
+ if (!response.ok || !response.body) {
124
+ throw new Error(`download failed with HTTP ${response.status}`);
125
+ }
126
+ const contentLength = Number.parseInt(response.headers.get("content-length") ?? "", 10);
127
+ if (Number.isFinite(contentLength) && contentLength > maxBytes) {
128
+ throw new Error(`source is ${Math.round(contentLength / 1e6)} MB (cap ${Math.round(maxBytes / 1e6)} MB)`);
129
+ }
130
+ // Streamed byte cap — aborts mid-download instead of filling the disk when
131
+ // content-length lied or was absent.
132
+ let received = 0;
133
+ const cap = new Transform({
134
+ transform(chunk, _enc, callback) {
135
+ received += chunk.length;
136
+ if (received > maxBytes) {
137
+ callback(new Error(`download exceeded ${Math.round(maxBytes / 1e6)} MB cap`));
138
+ return;
139
+ }
140
+ callback(null, chunk);
141
+ }
142
+ });
143
+ await pipeline(Readable.fromWeb(response.body), cap, createWriteStream(filePath));
144
+ return received;
145
+ }
146
+ function shortHash(value) {
147
+ return createHash("sha256").update(value).digest("hex").slice(0, 10);
148
+ }
149
+ function urlExtension(url, fallback) {
150
+ const match = url.match(/\.([a-z0-9]{2,5})(\?|#|$)/i);
151
+ return match ? match[1].toLowerCase() : fallback;
152
+ }
153
+ /**
154
+ * Rewrite the composition so no remote source is loaded more times (or longer)
155
+ * than the timeline actually needs. Returns the (possibly rewritten) HTML plus
156
+ * a note per touched source; on any per-source failure that source is left
157
+ * untouched, so the pass can only improve the render, never break it.
158
+ */
159
+ export async function prepareProjectMediaForRender(options) {
160
+ const log = options.log ?? (() => { });
161
+ const maxSourceBytes = options.maxSourceBytes ?? 1.5e9;
162
+ const localizeMaxBytes = options.localizeMaxBytes ?? 512e6;
163
+ const deadline = Date.now() + (options.budgetMs ?? 4 * 60_000);
164
+ const notes = [];
165
+ const { document } = parseHTML(options.html);
166
+ const groups = new Map();
167
+ for (const tag of ["video", "audio"]) {
168
+ for (const node of Array.from(document.querySelectorAll(`${tag}[src]`))) {
169
+ const src = String(node.getAttribute("src") ?? "").trim();
170
+ if (!/^https?:\/\//i.test(src))
171
+ continue;
172
+ const list = groups.get(src) ?? [];
173
+ list.push(readMediaRef(node, tag));
174
+ groups.set(src, list);
175
+ }
176
+ }
177
+ if (groups.size === 0)
178
+ return { html: options.html, changed: false, notes };
179
+ const mediaDir = path.join(options.projectDir, "media");
180
+ let changed = false;
181
+ let ffmpegPath = null;
182
+ for (const [url, refs] of groups) {
183
+ if (Date.now() > deadline) {
184
+ notes.push({ url, action: "skipped", refs: refs.length, reason: "media-prep time budget exhausted" });
185
+ continue;
186
+ }
187
+ const isVideoGroup = refs.some((ref) => ref.kind === "video");
188
+ const cuttable = isVideoGroup ? CUTTABLE_VIDEO.test(url) : CUTTABLE_AUDIO.test(url);
189
+ const cutRefs = refs.filter((ref) => ref.duration !== null && !ref.loops);
190
+ const multiRef = refs.length >= 2;
191
+ // Probe duration first — it's cheap and it decides everything else.
192
+ const sourceDuration = await probeMediaDurationSeconds(url);
193
+ const totalWindow = cutRefs.reduce((sum, ref) => sum + (ref.duration ?? 0) + SEGMENT_PAD_SECONDS, 0);
194
+ const singleRefWorthCutting = sourceDuration !== null && cutRefs.length === refs.length && refs.length === 1
195
+ && (sourceDuration - totalWindow) >= SINGLE_REF_MIN_WASTE_SECONDS
196
+ && sourceDuration >= totalWindow * SINGLE_REF_MIN_RATIO;
197
+ const shouldCut = cuttable && cutRefs.length > 0 && (multiRef || singleRefWorthCutting);
198
+ const shouldLocalize = !shouldCut && multiRef;
199
+ if (!shouldCut && !shouldLocalize)
200
+ continue;
201
+ log("render_media_prep.source", {
202
+ url,
203
+ refs: refs.length,
204
+ source_duration_s: sourceDuration,
205
+ mode: shouldCut ? "cut" : "localize"
206
+ });
207
+ let tempDir = null;
208
+ try {
209
+ if (shouldCut) {
210
+ tempDir = await mkdtemp(path.join(os.tmpdir(), "vf-media-prep-"));
211
+ const sourceFile = path.join(tempDir, `source.${urlExtension(url, isVideoGroup ? "mp4" : "m4a")}`);
212
+ await downloadToFile(url, sourceFile, maxSourceBytes);
213
+ ffmpegPath = ffmpegPath ?? await resolveFfmpegPath();
214
+ await mkdir(mediaDir, { recursive: true });
215
+ const segments = [];
216
+ for (const [index, ref] of cutRefs.entries()) {
217
+ const duration = (ref.duration ?? 0) + SEGMENT_PAD_SECONDS;
218
+ const ext = ref.kind === "video" ? "mp4" : "m4a";
219
+ const segmentName = `vfprep-${shortHash(url)}-${index}.${ext}`;
220
+ const segmentPath = path.join(mediaDir, segmentName);
221
+ // -ss before -i + re-encode = frame-accurate fast seek. veryfast/crf18
222
+ // is visually lossless for a short segment and keeps prep quick.
223
+ const args = ref.kind === "video"
224
+ ? [
225
+ "-y", "-ss", String(Math.max(0, ref.mediaStart)), "-i", sourceFile, "-t", String(duration),
226
+ "-c:v", "libx264", "-preset", "veryfast", "-crf", "18", "-pix_fmt", "yuv420p",
227
+ "-c:a", "aac", "-movflags", "+faststart", segmentPath
228
+ ]
229
+ : [
230
+ "-y", "-ss", String(Math.max(0, ref.mediaStart)), "-i", sourceFile, "-t", String(duration),
231
+ "-vn", "-c:a", "aac", segmentPath
232
+ ];
233
+ const cut = await runCommand(ffmpegPath, args, 5 * 60_000);
234
+ if (cut.code !== 0)
235
+ throw new Error(`ffmpeg segment cut failed: ${cut.stderr.slice(-400)}`);
236
+ ref.node.setAttribute("src", `media/${segmentName}`);
237
+ ref.node.setAttribute("data-media-start", "0");
238
+ ref.node.setAttribute("data-playback-start", "0");
239
+ segments.push(`media/${segmentName}`);
240
+ changed = true;
241
+ }
242
+ // Refs we couldn't cut (loops / no duration) keep the remote URL — the
243
+ // group note records the split so render logs explain the leftovers.
244
+ notes.push({
245
+ url,
246
+ action: "cut-segments",
247
+ refs: refs.length,
248
+ segments,
249
+ sourceDurationSeconds: sourceDuration,
250
+ reason: cutRefs.length < refs.length ? `${refs.length - cutRefs.length} looping/unbounded ref(s) kept the remote URL` : undefined
251
+ });
252
+ }
253
+ else {
254
+ // Localize: one shared local copy for every reference.
255
+ await mkdir(mediaDir, { recursive: true });
256
+ const localName = `vfprep-${shortHash(url)}-full.${urlExtension(url, isVideoGroup ? "mp4" : "m4a")}`;
257
+ const localPath = path.join(mediaDir, localName);
258
+ if (!existsSync(localPath)) {
259
+ await downloadToFile(url, localPath, localizeMaxBytes);
260
+ }
261
+ const size = (await stat(localPath)).size;
262
+ for (const ref of refs) {
263
+ ref.node.setAttribute("src", `media/${localName}`);
264
+ changed = true;
265
+ }
266
+ notes.push({ url, action: "localized", refs: refs.length, segments: [`media/${localName}`], sourceDurationSeconds: sourceDuration, reason: `${Math.round(size / 1e6)} MB single copy` });
267
+ }
268
+ }
269
+ catch (error) {
270
+ // Best-effort: leave this source untouched and let the renderer handle
271
+ // the original URL. Remove any partial local files so a broken segment
272
+ // can never shadow the remote source.
273
+ notes.push({
274
+ url,
275
+ action: "skipped",
276
+ refs: refs.length,
277
+ sourceDurationSeconds: sourceDuration,
278
+ reason: error instanceof Error ? error.message : String(error)
279
+ });
280
+ log("render_media_prep.source_failed", { url, error: error instanceof Error ? error.message : String(error) });
281
+ }
282
+ finally {
283
+ if (tempDir)
284
+ await rm(tempDir, { recursive: true, force: true }).catch(() => { });
285
+ }
286
+ }
287
+ if (!changed)
288
+ return { html: options.html, changed: false, notes };
289
+ const html = `<!doctype html>\n${document.documentElement.outerHTML}`;
290
+ log("render_media_prep.done", { sources: notes.length, changed });
291
+ return { html, changed, notes };
292
+ }
293
+ //# sourceMappingURL=render-media-prep.js.map
@@ -0,0 +1,28 @@
1
+ import path from "node:path";
2
+ export const TEMPLATE_FOLDER_PREFIX = "vidfarm_template_";
3
+ export const LEGACY_TEMPLATE_FOLDER_PREFIX = "template_";
4
+ export function assertTemplateFolderNameHasPrefix(folderName) {
5
+ if (!folderName.startsWith(TEMPLATE_FOLDER_PREFIX) && !folderName.startsWith(LEGACY_TEMPLATE_FOLDER_PREFIX)) {
6
+ throw new Error(`Template folder name must start with ${TEMPLATE_FOLDER_PREFIX} or ${LEGACY_TEMPLATE_FOLDER_PREFIX}. Received: ${folderName}`);
7
+ }
8
+ }
9
+ export function deriveTemplateRootDirFromModulePath(templateModulePath) {
10
+ const normalizedModulePath = templateModulePath.replace(/\\/g, "/");
11
+ const templateSourceDir = path.posix.dirname(normalizedModulePath);
12
+ const templateRootDir = path.posix.dirname(templateSourceDir);
13
+ const sourceDirName = path.posix.basename(templateSourceDir);
14
+ if (sourceDirName !== "src") {
15
+ throw new Error("template_module_path must point at a TypeScript entrypoint inside a src/ folder, such as src/template.ts or templates/vidfarm_template_example/src/template.ts.");
16
+ }
17
+ if (templateRootDir === "." || templateRootDir === "") {
18
+ return "";
19
+ }
20
+ const folderName = path.posix.basename(templateRootDir);
21
+ assertTemplateFolderNameHasPrefix(folderName);
22
+ return templateRootDir;
23
+ }
24
+ export function defaultSkillPathForTemplateModule(templateModulePath) {
25
+ const templateRootDir = deriveTemplateRootDirFromModulePath(templateModulePath);
26
+ return templateRootDir ? path.posix.join(templateRootDir, "SKILL.md") : "SKILL.md";
27
+ }
28
+ //# sourceMappingURL=template-paths.js.map
@@ -0,0 +1,7 @@
1
+ export function nowIso() {
2
+ return new Date().toISOString();
3
+ }
4
+ export function addSeconds(date, seconds) {
5
+ return new Date(date.getTime() + seconds * 1000).toISOString();
6
+ }
7
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1,85 @@
1
+ const TRACKING_PARAM_PREFIXES = ["utm_", "mc_", "ic_"];
2
+ const TRACKING_PARAMS = new Set([
3
+ "si",
4
+ "share_link_id",
5
+ "share_app_id",
6
+ "share_iid",
7
+ "shareid",
8
+ "sender_device",
9
+ "sender_web_id",
10
+ "source",
11
+ "timestamp",
12
+ "user_id",
13
+ "sec_uid",
14
+ "t",
15
+ "feature",
16
+ "app",
17
+ "referer",
18
+ "referrer",
19
+ "ref",
20
+ "ref_src",
21
+ "ref_url",
22
+ "fbclid",
23
+ "gclid",
24
+ "igshid",
25
+ "igsh",
26
+ "mibextid",
27
+ "twclid",
28
+ "twsrc",
29
+ "trk",
30
+ "hl",
31
+ "context",
32
+ "checksum",
33
+ "_r",
34
+ "_t",
35
+ "_d",
36
+ "_i",
37
+ "_hsenc",
38
+ "_hsmi"
39
+ ]);
40
+ function shouldStrip(param) {
41
+ const lower = param.toLowerCase();
42
+ if (TRACKING_PARAMS.has(lower))
43
+ return true;
44
+ return TRACKING_PARAM_PREFIXES.some((prefix) => lower.startsWith(prefix));
45
+ }
46
+ export function stripTrackingParams(input) {
47
+ const trimmed = input.trim();
48
+ if (!trimmed)
49
+ return trimmed;
50
+ let url;
51
+ try {
52
+ url = new URL(trimmed);
53
+ }
54
+ catch {
55
+ return trimmed;
56
+ }
57
+ const kept = [];
58
+ url.searchParams.forEach((value, key) => {
59
+ if (!shouldStrip(key))
60
+ kept.push([key, value]);
61
+ });
62
+ const params = new URLSearchParams(kept);
63
+ const search = params.toString();
64
+ url.search = search ? `?${search}` : "";
65
+ url.hash = "";
66
+ return url.toString();
67
+ }
68
+ export function detectSourceHost(rawUrl) {
69
+ try {
70
+ const host = new URL(rawUrl).hostname.toLowerCase().replace(/^www\./, "");
71
+ if (host.endsWith("tiktok.com"))
72
+ return "tiktok";
73
+ if (host === "instagram.com" || host.endsWith(".instagram.com"))
74
+ return "instagram";
75
+ if (host === "youtube.com" || host.endsWith(".youtube.com") || host === "youtu.be")
76
+ return "youtube";
77
+ if (host === "twitter.com" || host === "x.com" || host.endsWith(".twitter.com") || host.endsWith(".x.com"))
78
+ return "twitter";
79
+ return "other";
80
+ }
81
+ catch {
82
+ return "other";
83
+ }
84
+ }
85
+ //# sourceMappingURL=url-clean.js.map