@w3kits-com/plugin-opendesign 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/404/index.html +1 -1
- package/dist/404.html +1 -1
- package/dist/__next.$oc$slug.__PAGE__.txt +1 -1
- package/dist/__next.$oc$slug.txt +1 -1
- package/dist/__next._full.txt +1 -1
- package/dist/__next._head.txt +1 -1
- package/dist/__next._index.txt +1 -1
- package/dist/__next._tree.txt +1 -1
- package/dist/__w3kits/assets/design-systems/README.md +103 -0
- package/dist/__w3kits/assets/design-systems/_schema/AGENTS.md +179 -0
- package/dist/__w3kits/assets/design-systems/_schema/defaults.css +100 -0
- package/dist/__w3kits/assets/design-systems/_schema/tokens.schema.ts +275 -0
- package/dist/__w3kits/assets/design-systems/agentic/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/airbnb/DESIGN.md +393 -0
- package/dist/__w3kits/assets/design-systems/airbnb/components.html +1373 -0
- package/dist/__w3kits/assets/design-systems/airbnb/tokens.css +261 -0
- package/dist/__w3kits/assets/design-systems/airtable/DESIGN.md +92 -0
- package/dist/__w3kits/assets/design-systems/ant/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/apple/DESIGN.md +250 -0
- package/dist/__w3kits/assets/design-systems/apple/components.html +749 -0
- package/dist/__w3kits/assets/design-systems/apple/tokens.css +286 -0
- package/dist/__w3kits/assets/design-systems/application/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/arc/DESIGN.md +152 -0
- package/dist/__w3kits/assets/design-systems/artistic/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/atelier-zero/DESIGN.md +316 -0
- package/dist/__w3kits/assets/design-systems/bento/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/binance/DESIGN.md +348 -0
- package/dist/__w3kits/assets/design-systems/bmw/DESIGN.md +183 -0
- package/dist/__w3kits/assets/design-systems/bmw-m/DESIGN.md +246 -0
- package/dist/__w3kits/assets/design-systems/bold/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/brutalism/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/bugatti/DESIGN.md +271 -0
- package/dist/__w3kits/assets/design-systems/cafe/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/cal/DESIGN.md +262 -0
- package/dist/__w3kits/assets/design-systems/canva/DESIGN.md +157 -0
- package/dist/__w3kits/assets/design-systems/cisco/DESIGN.md +201 -0
- package/dist/__w3kits/assets/design-systems/claude/DESIGN.md +315 -0
- package/dist/__w3kits/assets/design-systems/clay/DESIGN.md +307 -0
- package/dist/__w3kits/assets/design-systems/claymorphism/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/clean/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/clickhouse/DESIGN.md +284 -0
- package/dist/__w3kits/assets/design-systems/cohere/DESIGN.md +269 -0
- package/dist/__w3kits/assets/design-systems/coinbase/DESIGN.md +132 -0
- package/dist/__w3kits/assets/design-systems/colorful/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/composio/DESIGN.md +310 -0
- package/dist/__w3kits/assets/design-systems/contemporary/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/corporate/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/cosmic/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/creative/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/cursor/DESIGN.md +312 -0
- package/dist/__w3kits/assets/design-systems/cursor/components.html +654 -0
- package/dist/__w3kits/assets/design-systems/cursor/tokens.css +218 -0
- package/dist/__w3kits/assets/design-systems/dashboard/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/default/DESIGN.md +62 -0
- package/dist/__w3kits/assets/design-systems/default/components.html +523 -0
- package/dist/__w3kits/assets/design-systems/default/tokens.css +200 -0
- package/dist/__w3kits/assets/design-systems/discord/DESIGN.md +162 -0
- package/dist/__w3kits/assets/design-systems/discord/components.html +359 -0
- package/dist/__w3kits/assets/design-systems/discord/tokens.css +125 -0
- package/dist/__w3kits/assets/design-systems/dithered/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/doodle/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/dramatic/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/duolingo/DESIGN.md +154 -0
- package/dist/__w3kits/assets/design-systems/editorial/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/elegant/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/elevenlabs/DESIGN.md +268 -0
- package/dist/__w3kits/assets/design-systems/energetic/DESIGN.md +72 -0
- package/dist/__w3kits/assets/design-systems/enterprise/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/expo/DESIGN.md +284 -0
- package/dist/__w3kits/assets/design-systems/expressive/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/fantasy/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/ferrari/DESIGN.md +317 -0
- package/dist/__w3kits/assets/design-systems/figma/DESIGN.md +223 -0
- package/dist/__w3kits/assets/design-systems/figma/components.html +344 -0
- package/dist/__w3kits/assets/design-systems/figma/tokens.css +126 -0
- package/dist/__w3kits/assets/design-systems/flat/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/framer/DESIGN.md +249 -0
- package/dist/__w3kits/assets/design-systems/friendly/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/futuristic/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/github/DESIGN.md +155 -0
- package/dist/__w3kits/assets/design-systems/github/components.html +383 -0
- package/dist/__w3kits/assets/design-systems/github/tokens.css +125 -0
- package/dist/__w3kits/assets/design-systems/glassmorphism/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/gradient/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/hashicorp/DESIGN.md +281 -0
- package/dist/__w3kits/assets/design-systems/hud/DESIGN.md +173 -0
- package/dist/__w3kits/assets/design-systems/huggingface/DESIGN.md +149 -0
- package/dist/__w3kits/assets/design-systems/ibm/DESIGN.md +335 -0
- package/dist/__w3kits/assets/design-systems/intercom/DESIGN.md +149 -0
- package/dist/__w3kits/assets/design-systems/kami/DESIGN.md +410 -0
- package/dist/__w3kits/assets/design-systems/kami/components.html +601 -0
- package/dist/__w3kits/assets/design-systems/kami/tokens.css +272 -0
- package/dist/__w3kits/assets/design-systems/kraken/DESIGN.md +128 -0
- package/dist/__w3kits/assets/design-systems/lamborghini/DESIGN.md +291 -0
- package/dist/__w3kits/assets/design-systems/levels/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/linear-app/DESIGN.md +370 -0
- package/dist/__w3kits/assets/design-systems/linear-app/components.html +370 -0
- package/dist/__w3kits/assets/design-systems/linear-app/tokens.css +130 -0
- package/dist/__w3kits/assets/design-systems/lingo/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/loom/DESIGN.md +201 -0
- package/dist/__w3kits/assets/design-systems/lovable/DESIGN.md +301 -0
- package/dist/__w3kits/assets/design-systems/luxury/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/mastercard/DESIGN.md +368 -0
- package/dist/__w3kits/assets/design-systems/material/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/meta/DESIGN.md +369 -0
- package/dist/__w3kits/assets/design-systems/minimal/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/minimax/DESIGN.md +260 -0
- package/dist/__w3kits/assets/design-systems/mintlify/DESIGN.md +329 -0
- package/dist/__w3kits/assets/design-systems/miro/DESIGN.md +111 -0
- package/dist/__w3kits/assets/design-systems/mission-control/DESIGN.md +474 -0
- package/dist/__w3kits/assets/design-systems/mistral-ai/DESIGN.md +264 -0
- package/dist/__w3kits/assets/design-systems/modern/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/mongodb/DESIGN.md +269 -0
- package/dist/__w3kits/assets/design-systems/mono/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/neobrutalism/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/neon/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/neumorphism/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/nike/DESIGN.md +366 -0
- package/dist/__w3kits/assets/design-systems/notion/DESIGN.md +312 -0
- package/dist/__w3kits/assets/design-systems/notion/components.html +413 -0
- package/dist/__w3kits/assets/design-systems/notion/tokens.css +130 -0
- package/dist/__w3kits/assets/design-systems/nvidia/DESIGN.md +296 -0
- package/dist/__w3kits/assets/design-systems/ollama/DESIGN.md +270 -0
- package/dist/__w3kits/assets/design-systems/openai/DESIGN.md +140 -0
- package/dist/__w3kits/assets/design-systems/openai/components.html +382 -0
- package/dist/__w3kits/assets/design-systems/openai/tokens.css +133 -0
- package/dist/__w3kits/assets/design-systems/opencode-ai/DESIGN.md +284 -0
- package/dist/__w3kits/assets/design-systems/pacman/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/paper/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/perspective/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/pinterest/DESIGN.md +233 -0
- package/dist/__w3kits/assets/design-systems/playstation/DESIGN.md +367 -0
- package/dist/__w3kits/assets/design-systems/posthog/DESIGN.md +259 -0
- package/dist/__w3kits/assets/design-systems/premium/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/professional/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/publication/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/raycast/DESIGN.md +271 -0
- package/dist/__w3kits/assets/design-systems/refined/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/renault/DESIGN.md +314 -0
- package/dist/__w3kits/assets/design-systems/replicate/DESIGN.md +264 -0
- package/dist/__w3kits/assets/design-systems/resend/DESIGN.md +306 -0
- package/dist/__w3kits/assets/design-systems/retro/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/revolut/DESIGN.md +188 -0
- package/dist/__w3kits/assets/design-systems/runwayml/DESIGN.md +247 -0
- package/dist/__w3kits/assets/design-systems/sanity/DESIGN.md +360 -0
- package/dist/__w3kits/assets/design-systems/sentry/DESIGN.md +265 -0
- package/dist/__w3kits/assets/design-systems/shadcn/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/shopify/DESIGN.md +353 -0
- package/dist/__w3kits/assets/design-systems/shopify/components.html +342 -0
- package/dist/__w3kits/assets/design-systems/shopify/tokens.css +141 -0
- package/dist/__w3kits/assets/design-systems/simple/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/skeumorphism/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/slack/DESIGN.md +363 -0
- package/dist/__w3kits/assets/design-systems/slack/components.html +387 -0
- package/dist/__w3kits/assets/design-systems/slack/tokens.css +127 -0
- package/dist/__w3kits/assets/design-systems/sleek/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/spacex/DESIGN.md +197 -0
- package/dist/__w3kits/assets/design-systems/spacious/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/spotify/DESIGN.md +249 -0
- package/dist/__w3kits/assets/design-systems/spotify/components.html +365 -0
- package/dist/__w3kits/assets/design-systems/spotify/tokens.css +127 -0
- package/dist/__w3kits/assets/design-systems/starbucks/DESIGN.md +583 -0
- package/dist/__w3kits/assets/design-systems/storytelling/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/stripe/DESIGN.md +325 -0
- package/dist/__w3kits/assets/design-systems/stripe/components.html +1018 -0
- package/dist/__w3kits/assets/design-systems/stripe/tokens.css +295 -0
- package/dist/__w3kits/assets/design-systems/supabase/DESIGN.md +258 -0
- package/dist/__w3kits/assets/design-systems/superhuman/DESIGN.md +255 -0
- package/dist/__w3kits/assets/design-systems/tesla/DESIGN.md +289 -0
- package/dist/__w3kits/assets/design-systems/tetris/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/theverge/DESIGN.md +342 -0
- package/dist/__w3kits/assets/design-systems/together-ai/DESIGN.md +266 -0
- package/dist/__w3kits/assets/design-systems/totality-festival/DESIGN.md +206 -0
- package/dist/__w3kits/assets/design-systems/trading-terminal/DESIGN.md +178 -0
- package/dist/__w3kits/assets/design-systems/uber/DESIGN.md +298 -0
- package/dist/__w3kits/assets/design-systems/uber/components.html +347 -0
- package/dist/__w3kits/assets/design-systems/uber/tokens.css +131 -0
- package/dist/__w3kits/assets/design-systems/urdu/DESIGN.md +1002 -0
- package/dist/__w3kits/assets/design-systems/vercel/DESIGN.md +313 -0
- package/dist/__w3kits/assets/design-systems/vercel/components.html +839 -0
- package/dist/__w3kits/assets/design-systems/vercel/tokens.css +270 -0
- package/dist/__w3kits/assets/design-systems/vibrant/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/vintage/DESIGN.md +71 -0
- package/dist/__w3kits/assets/design-systems/vodafone/DESIGN.md +426 -0
- package/dist/__w3kits/assets/design-systems/voltagent/DESIGN.md +326 -0
- package/dist/__w3kits/assets/design-systems/warm-editorial/DESIGN.md +65 -0
- package/dist/__w3kits/assets/design-systems/warp/DESIGN.md +256 -0
- package/dist/__w3kits/assets/design-systems/webex/DESIGN.md +207 -0
- package/dist/__w3kits/assets/design-systems/webflow/DESIGN.md +95 -0
- package/dist/__w3kits/assets/design-systems/wechat/DESIGN.md +302 -0
- package/dist/__w3kits/assets/design-systems/wired/DESIGN.md +281 -0
- package/dist/__w3kits/assets/design-systems/wise/DESIGN.md +176 -0
- package/dist/__w3kits/assets/design-systems/x-ai/DESIGN.md +260 -0
- package/dist/__w3kits/assets/design-systems/xiaohongshu/DESIGN.md +402 -0
- package/dist/__w3kits/assets/design-systems/zapier/DESIGN.md +331 -0
- package/dist/__w3kits/assets/design-templates/AGENTS.md +34 -0
- package/dist/__w3kits/assets/design-templates/audio-jingle/SKILL.md +132 -0
- package/dist/__w3kits/assets/design-templates/audio-jingle/example.html +128 -0
- package/dist/__w3kits/assets/design-templates/blog-post/SKILL.md +81 -0
- package/dist/__w3kits/assets/design-templates/blog-post/example.html +80 -0
- package/dist/__w3kits/assets/design-templates/clinical-case-report/SKILL.md +209 -0
- package/dist/__w3kits/assets/design-templates/clinical-case-report/example.html +698 -0
- package/dist/__w3kits/assets/design-templates/clinical-case-report/examples/example-stemi.html +698 -0
- package/dist/__w3kits/assets/design-templates/clinical-case-report/references/case-formats.md +94 -0
- package/dist/__w3kits/assets/design-templates/clinical-case-report/references/checklist.md +41 -0
- package/dist/__w3kits/assets/design-templates/critique/SKILL.md +258 -0
- package/dist/__w3kits/assets/design-templates/critique/example.html +671 -0
- package/dist/__w3kits/assets/design-templates/dashboard/SKILL.md +76 -0
- package/dist/__w3kits/assets/design-templates/dashboard/example.html +118 -0
- package/dist/__w3kits/assets/design-templates/dating-web/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/dating-web/example.html +265 -0
- package/dist/__w3kits/assets/design-templates/dcf-valuation/SKILL.md +140 -0
- package/dist/__w3kits/assets/design-templates/dcf-valuation/references/sector-wacc.md +42 -0
- package/dist/__w3kits/assets/design-templates/digital-eguide/SKILL.md +95 -0
- package/dist/__w3kits/assets/design-templates/digital-eguide/example.html +204 -0
- package/dist/__w3kits/assets/design-templates/docs-page/SKILL.md +80 -0
- package/dist/__w3kits/assets/design-templates/docs-page/example.html +122 -0
- package/dist/__w3kits/assets/design-templates/email-marketing/SKILL.md +85 -0
- package/dist/__w3kits/assets/design-templates/email-marketing/example.html +159 -0
- package/dist/__w3kits/assets/design-templates/eng-runbook/SKILL.md +51 -0
- package/dist/__w3kits/assets/design-templates/eng-runbook/example.html +250 -0
- package/dist/__w3kits/assets/design-templates/finance-report/SKILL.md +62 -0
- package/dist/__w3kits/assets/design-templates/finance-report/example.html +242 -0
- package/dist/__w3kits/assets/design-templates/flowai-live-dashboard-template/SKILL.md +87 -0
- package/dist/__w3kits/assets/design-templates/flowai-live-dashboard-template/assets/template.html +387 -0
- package/dist/__w3kits/assets/design-templates/flowai-live-dashboard-template/example.html +13 -0
- package/dist/__w3kits/assets/design-templates/flowai-live-dashboard-template/references/checklist.md +35 -0
- package/dist/__w3kits/assets/design-templates/gamified-app/SKILL.md +109 -0
- package/dist/__w3kits/assets/design-templates/gamified-app/example.html +292 -0
- package/dist/__w3kits/assets/design-templates/github-dashboard/SKILL.md +130 -0
- package/dist/__w3kits/assets/design-templates/github-dashboard/example.html +473 -0
- package/dist/__w3kits/assets/design-templates/github-dashboard/references/README.md +10 -0
- package/dist/__w3kits/assets/design-templates/github-dashboard/references/artifact-example.json +15 -0
- package/dist/__w3kits/assets/design-templates/github-dashboard/references/example-data.json +138 -0
- package/dist/__w3kits/assets/design-templates/github-dashboard/references/provenance-example.json +92 -0
- package/dist/__w3kits/assets/design-templates/github-dashboard/references/template.html +473 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/README.en.md +119 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/README.md +120 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/README.pt-BR.md +121 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/SKILL.md +314 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/assets/example-slides.html +318 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/assets/template.html +647 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/references/checklist.md +265 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/references/components.md +363 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/references/layouts.md +630 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/references/styles.md +195 -0
- package/dist/__w3kits/assets/design-templates/guizang-ppt/references/themes.md +122 -0
- package/dist/__w3kits/assets/design-templates/hr-onboarding/SKILL.md +52 -0
- package/dist/__w3kits/assets/design-templates/hr-onboarding/example.html +219 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/.clawscan-allow +12 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/README.md +234 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/README.pt-BR.md +239 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/README.zh-CN.md +238 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/SKILL.md +251 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/animations.css +138 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/_util.js +63 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/chain-react.js +41 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/confetti-cannon.js +49 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/constellation.js +44 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/counter-explosion.js +58 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/data-stream.js +45 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/firework.js +51 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/galaxy-swirl.js +33 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/gradient-blob.js +39 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/knowledge-graph.js +69 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/letter-explode.js +50 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/magnetic-field.js +40 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/matrix-rain.js +33 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/neural-net.js +75 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/orbit-ring.js +38 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/particle-burst.js +42 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/shockwave.js +39 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/sparkle-trail.js +62 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/starfield.js +30 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/typewriter-multi.js +51 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx/word-cascade.js +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/animations/fx-runtime.js +99 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/base.css +150 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/fonts.css +9 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/runtime.js +960 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/academic-paper.css +23 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/arctic-cool.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/aurora.css +20 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/bauhaus.css +16 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/blueprint.css +19 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/catppuccin-latte.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/catppuccin-mocha.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/corporate-clean.css +19 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/cyberpunk-neon.css +23 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/dracula.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/editorial-serif.css +18 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/engineering-whiteprint.css +26 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/glassmorphism.css +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/gruvbox-dark.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/japanese-minimal.css +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/magazine-bold.css +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/memphis-pop.css +20 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/midcentury.css +19 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/minimal-white.css +16 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/neo-brutalism.css +17 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/news-broadcast.css +20 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/nord.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/pitch-deck-vc.css +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/rainbow-gradient.css +16 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/retro-tv.css +22 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/rose-pine.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/sharp-mono.css +17 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/soft-pastel.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/solarized-light.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/sunset-warm.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/swiss-grid.css +17 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/terminal-green.css +18 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/tokyo-night.css +14 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/vaporwave.css +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/xiaohongshu-white.css +16 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/assets/themes/y2k-chrome.css +20 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/_theme-cell.html +56 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/animations.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/hero.gif +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/layouts-live.gif +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/layouts.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/montage-animations.html +61 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/montage-layouts.html +72 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/montage-templates.html +72 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/montage-themes.html +38 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/presenter-mode.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/templates.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/docs/readme/themes.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/examples/demo-deck/index.html +161 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/references/animations.md +147 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/references/authoring-guide.md +141 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/references/full-decks.md +98 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/references/layouts.md +103 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/references/presenter-mode.md +240 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/references/themes.md +107 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/new-deck.sh +46 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/render.sh +71 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_01.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_02.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_03.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_04.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_05.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_06.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_07.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_08.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_09.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_10.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_11.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_12.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_13.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_14.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_15.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_16.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_17.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_18.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_19.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_20.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_01.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_02.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_03.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_04.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_05.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_06.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_07.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_08.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_09.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_10.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_11.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_12.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_13.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_14.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_15.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_16.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_17.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_18.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_19.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_20.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_21.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_22.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_23.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_24.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_25.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_26.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_27.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_28.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_29.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_30.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_31.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_32.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_33.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_34.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_35.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_36.png +0 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/animation-showcase.html +172 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/deck.html +69 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/course-module/README.md +8 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/course-module/index.html +189 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/course-module/style.css +46 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/README.md +11 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/index.html +138 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/style.css +60 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/README.md +11 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/index.html +180 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/style.css +54 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/README.md +11 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/index.html +199 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/style.css +55 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/README.md +11 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/index.html +190 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/style.css +49 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/README.md +11 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/index.html +144 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/style.css +59 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/pitch-deck/README.md +9 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/pitch-deck/index.html +148 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/pitch-deck/style.css +40 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/README.md +102 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/index.html +187 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/style.css +216 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/product-launch/README.md +8 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/product-launch/index.html +121 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/product-launch/style.css +39 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/tech-sharing/README.md +8 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/tech-sharing/index.html +156 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/tech-sharing/style.css +49 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/testing-safety-alert/README.md +11 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/testing-safety-alert/index.html +183 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/testing-safety-alert/style.css +62 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/weekly-report/README.md +8 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/weekly-report/index.html +127 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/weekly-report/style.css +55 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/README.md +11 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/index.html +147 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/style.css +66 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/xhs-post/README.md +9 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/xhs-post/index.html +133 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/xhs-post/style.css +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/README.md +11 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/index.html +187 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/style.css +63 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/full-decks-index.html +82 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/layout-showcase.html +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/arch-diagram.html +46 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/big-quote.html +18 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/bullets.html +19 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/chart-bar.html +30 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/chart-line.html +35 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/chart-pie.html +36 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/chart-radar.html +31 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/code.html +33 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/comparison.html +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/cover.html +32 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/cta.html +27 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/diff.html +35 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/flow-diagram.html +33 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/gantt.html +29 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/image-grid.html +34 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/image-hero.html +33 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/kpi-grid.html +19 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/mindmap.html +38 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/process-steps.html +27 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/pros-cons.html +31 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/roadmap.html +46 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/section-divider.html +17 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/stat-highlight.html +17 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/table.html +33 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/terminal.html +35 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/thanks.html +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/three-column.html +18 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/timeline.html +32 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/toc.html +26 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/todo-checklist.html +33 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/single-page/two-column.html +39 -0
- package/dist/__w3kits/assets/design-templates/html-ppt/templates/theme-showcase.html +151 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-course-module/SKILL.md +79 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-course-module/example.html +542 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-dir-key-nav-minimal/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-dir-key-nav-minimal/example.html +366 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-graphify-dark-graph/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-graphify-dark-graph/example.html +402 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-hermes-cyber-terminal/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-hermes-cyber-terminal/example.html +422 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-knowledge-arch-blueprint/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-knowledge-arch-blueprint/example.html +407 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-obsidian-claude-gradient/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-obsidian-claude-gradient/example.html +371 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-pitch-deck/SKILL.md +79 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-pitch-deck/example.html +495 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-presenter-mode-reveal/SKILL.md +79 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-presenter-mode-reveal/example.html +725 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-product-launch/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-product-launch/example.html +467 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-taste-brutalist/SKILL.md +70 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-taste-brutalist/example.html +774 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-taste-editorial/SKILL.md +60 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-taste-editorial/example.html +490 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-tech-sharing/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-tech-sharing/example.html +512 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-testing-safety-alert/SKILL.md +79 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-testing-safety-alert/example.html +413 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-weekly-report/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-weekly-report/example.html +489 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-xhs-pastel-card/SKILL.md +79 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-xhs-pastel-card/example.html +381 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-xhs-post/SKILL.md +79 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-xhs-post/example.html +487 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-xhs-white-editorial/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-xhs-white-editorial/example.html +418 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-8-bit-orbit/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-8-bit-orbit/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-8-bit-orbit/example.html +1640 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-8-bit-orbit/template.json +48 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-biennale-yellow/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-biennale-yellow/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-biennale-yellow/example.html +833 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-biennale-yellow/template.json +49 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-block-frame/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-block-frame/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-block-frame/example.html +1453 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-block-frame/template.json +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-blue-professional/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-blue-professional/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-blue-professional/example.html +1423 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-blue-professional/template.json +44 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-bold-poster/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-bold-poster/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-bold-poster/example.html +876 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-bold-poster/template.json +45 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-broadside/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-broadside/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-broadside/example.html +2144 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-broadside/template.json +49 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-capsule/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-capsule/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-capsule/example.html +1413 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-capsule/template.json +51 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-cartesian/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-cartesian/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-cartesian/example.html +1136 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-cartesian/template.json +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-cobalt-grid/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-cobalt-grid/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-cobalt-grid/example.html +1205 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-cobalt-grid/template.json +49 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-coral/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-coral/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-coral/example.html +1487 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-coral/template.json +45 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-creative-mode/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-creative-mode/SKILL.md +99 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-creative-mode/assets/deck-stage.js +619 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-creative-mode/example.html +636 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-creative-mode/template.json +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-daisy-days/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-daisy-days/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-daisy-days/example.html +469 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-daisy-days/template.json +54 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-editorial-tri-tone/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-editorial-tri-tone/SKILL.md +98 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-editorial-tri-tone/assets/deck-stage.js +619 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-editorial-tri-tone/example.html +737 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-editorial-tri-tone/template.json +44 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-grove/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-grove/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-grove/example.html +1676 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-grove/template.json +51 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-long-table/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-long-table/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-long-table/example.html +1192 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-long-table/template.json +50 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-mat/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-mat/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-mat/example.html +1372 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-mat/template.json +49 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-monochrome/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-monochrome/SKILL.md +91 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-monochrome/example.html +2596 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-monochrome/template.json +50 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-neo-grid-bold/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-neo-grid-bold/SKILL.md +99 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-neo-grid-bold/assets/deck-stage.js +619 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-neo-grid-bold/example.html +865 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-neo-grid-bold/template.json +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-peoples-platform/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-peoples-platform/SKILL.md +99 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-peoples-platform/assets/deck-stage.js +619 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-peoples-platform/example.html +825 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-peoples-platform/template.json +48 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pin-and-paper/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pin-and-paper/SKILL.md +100 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pin-and-paper/assets/deck-stage.js +619 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pin-and-paper/assets/styles.css +668 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pin-and-paper/example.html +443 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pin-and-paper/template.json +46 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pink-script/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pink-script/SKILL.md +99 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pink-script/assets/deck-stage.js +619 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pink-script/example.html +658 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-pink-script/template.json +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-playful/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-playful/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-playful/example.html +1355 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-playful/template.json +43 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-raw-grid/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-raw-grid/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-raw-grid/example.html +1121 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-raw-grid/template.json +46 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-retro-windows/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-retro-windows/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-retro-windows/example.html +1287 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-retro-windows/template.json +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-retro-zine/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-retro-zine/SKILL.md +93 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-retro-zine/example.html +1058 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-retro-zine/template.json +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-sakura-chroma/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-sakura-chroma/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-sakura-chroma/example.html +1405 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-sakura-chroma/template.json +54 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-scatterbrain/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-scatterbrain/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-scatterbrain/example.html +1320 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-scatterbrain/template.json +50 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-signal/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-signal/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-signal/example.html +2558 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-signal/template.json +50 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-soft-editorial/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-soft-editorial/SKILL.md +98 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-soft-editorial/assets/deck-stage.js +619 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-soft-editorial/example.html +1183 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-soft-editorial/template.json +47 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-stencil-tablet/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-stencil-tablet/SKILL.md +99 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-stencil-tablet/assets/deck-stage.js +619 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-stencil-tablet/example.html +954 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-stencil-tablet/template.json +52 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-studio/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-studio/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-studio/example.html +1606 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-studio/template.json +49 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-vellum/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-vellum/SKILL.md +91 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-vellum/example.html +1091 -0
- package/dist/__w3kits/assets/design-templates/html-ppt-zhangzara-vellum/template.json +50 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/SKILL.md +500 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/data-in-motion.md +19 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/house-style.md +71 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/palettes/bold-energetic.md +14 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/palettes/clean-corporate.md +14 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/palettes/dark-premium.md +14 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/palettes/jewel-rich.md +14 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/palettes/monochrome.md +14 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/palettes/nature-earth.md +14 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/palettes/neon-electric.md +14 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/palettes/pastel-soft.md +14 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/palettes/warm-editorial.md +14 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/patterns.md +118 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/audio-reactive.md +76 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/captions.md +132 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/css-patterns.md +373 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/dynamic-techniques.md +90 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/html-in-canvas.md +146 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/motion-principles.md +69 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transcript-guide.md +151 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/catalog.md +117 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-3d.md +12 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-blur.md +51 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-cover.md +43 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-destruction.md +95 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-dissolve.md +66 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-distortion.md +45 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-grid.md +10 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-light.md +49 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-mechanical.md +30 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-other.md +25 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-push.md +41 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-radial.md +37 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions/css-scale.md +24 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/transitions.md +112 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/tts.md +75 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/references/typography.md +175 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/scripts/animation-map.mjs +601 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/scripts/contrast-report.mjs +338 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/scripts/package-loader.mjs +269 -0
- package/dist/__w3kits/assets/design-templates/hyperframes/visual-styles.md +211 -0
- package/dist/__w3kits/assets/design-templates/ib-pitch-book/SKILL.md +161 -0
- package/dist/__w3kits/assets/design-templates/ib-pitch-book/assets/template.html +436 -0
- package/dist/__w3kits/assets/design-templates/ib-pitch-book/example.html +1181 -0
- package/dist/__w3kits/assets/design-templates/ib-pitch-book/references/attribution.md +35 -0
- package/dist/__w3kits/assets/design-templates/ib-pitch-book/references/checklist.md +39 -0
- package/dist/__w3kits/assets/design-templates/ib-pitch-book/references/compliance.md +60 -0
- package/dist/__w3kits/assets/design-templates/ib-pitch-book/references/conventions.md +36 -0
- package/dist/__w3kits/assets/design-templates/image-poster/SKILL.md +104 -0
- package/dist/__w3kits/assets/design-templates/image-poster/example.html +113 -0
- package/dist/__w3kits/assets/design-templates/invoice/SKILL.md +48 -0
- package/dist/__w3kits/assets/design-templates/invoice/example.html +214 -0
- package/dist/__w3kits/assets/design-templates/kami-deck/README.md +72 -0
- package/dist/__w3kits/assets/design-templates/kami-deck/SKILL.md +196 -0
- package/dist/__w3kits/assets/design-templates/kami-deck/example.html +1101 -0
- package/dist/__w3kits/assets/design-templates/kami-landing/README.md +69 -0
- package/dist/__w3kits/assets/design-templates/kami-landing/SKILL.md +234 -0
- package/dist/__w3kits/assets/design-templates/kami-landing/example.html +673 -0
- package/dist/__w3kits/assets/design-templates/kanban-board/SKILL.md +50 -0
- package/dist/__w3kits/assets/design-templates/kanban-board/example.html +270 -0
- package/dist/__w3kits/assets/design-templates/last30days/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/last30days/SKILL.md +142 -0
- package/dist/__w3kits/assets/design-templates/last30days/references/save-html-brief.md +50 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/briefing.py +264 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/last30days.py +938 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/__init__.py +1 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/bird_x.py +443 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/bluesky.py +249 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/categories.py +283 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/chrome_cookies.py +265 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/cluster.py +271 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/competitors.py +199 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/cookie_extract.py +379 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/dates.py +120 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/dedupe.py +130 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/entity_extract.py +127 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/env.py +650 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/fanout.py +85 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/fusion.py +207 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/github.py +921 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/grounding.py +259 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/hackernews.py +301 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/html_render.py +674 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/http.py +204 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/instagram.py +500 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/log.py +28 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/normalize.py +499 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/perplexity.py +164 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/pinterest.py +182 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/pipeline.py +1069 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/planner.py +712 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/polymarket.py +786 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/preflight.py +119 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/providers.py +464 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/quality_nudge.py +190 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/query.py +117 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/reddit.py +703 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/reddit_enrich.py +322 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/reddit_public.py +377 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/relevance.py +168 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/render.py +1722 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/rerank.py +425 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/resolve.py +258 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/safari_cookies.py +182 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/schema.py +319 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/setup_wizard.py +535 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/signals.py +251 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/snippet.py +51 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/subproc.py +94 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/threads.py +224 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/tiktok.py +677 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/truthsocial.py +168 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/ui.py +610 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/LICENSE +21 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/bird-search.mjs +147 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/cookies.js +220 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/features.json +17 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/paginate-cursor.js +37 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/query-ids.json +20 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/runtime-features.js +151 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/runtime-query-ids.js +264 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-base.js +129 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-constants.js +50 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-features.js +347 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-search.js +157 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-types.js +2 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-utils.js +511 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/vendor/bird-search/package.json +13 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/xai_x.py +228 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/xiaohongshu_api.py +162 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/xquik.py +227 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/xurl_x.py +172 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/lib/youtube_yt.py +967 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/store.py +787 -0
- package/dist/__w3kits/assets/design-templates/last30days/scripts/watchlist.py +299 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/SKILL.md +136 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/assets/templates/clinic-console/README.md +342 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/assets/templates/clinic-console/data.json +165 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/assets/templates/clinic-console/template.html +548 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/baby-health-live.html +761 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/competitor-radar-live.html +1006 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/crm-table-live.html +1174 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/crypto-dashboard.html +2316 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/monday-operator-live.html +919 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/stock-dashboard.html +2246 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/stock-portfolio-live/artifact.json +16 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/stock-portfolio-live/data.json +453 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/stock-portfolio-live/provenance.json +19 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/examples/stock-portfolio-live/template.html +1071 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/references/artifact-schema.md +99 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/references/connector-policy.md +119 -0
- package/dist/__w3kits/assets/design-templates/live-artifact/references/refresh-contract.md +78 -0
- package/dist/__w3kits/assets/design-templates/live-dashboard/SKILL.md +203 -0
- package/dist/__w3kits/assets/design-templates/live-dashboard/assets/template.html +643 -0
- package/dist/__w3kits/assets/design-templates/live-dashboard/example.html +946 -0
- package/dist/__w3kits/assets/design-templates/live-dashboard/references/checklist.md +83 -0
- package/dist/__w3kits/assets/design-templates/live-dashboard/references/components.md +212 -0
- package/dist/__w3kits/assets/design-templates/live-dashboard/references/connectors.md +171 -0
- package/dist/__w3kits/assets/design-templates/live-dashboard/references/layouts.md +92 -0
- package/dist/__w3kits/assets/design-templates/magazine-poster/SKILL.md +88 -0
- package/dist/__w3kits/assets/design-templates/magazine-poster/example.html +207 -0
- package/dist/__w3kits/assets/design-templates/meeting-notes/SKILL.md +47 -0
- package/dist/__w3kits/assets/design-templates/meeting-notes/example.html +234 -0
- package/dist/__w3kits/assets/design-templates/mobile-app/SKILL.md +102 -0
- package/dist/__w3kits/assets/design-templates/mobile-app/assets/template.html +442 -0
- package/dist/__w3kits/assets/design-templates/mobile-app/example.html +92 -0
- package/dist/__w3kits/assets/design-templates/mobile-app/references/checklist.md +46 -0
- package/dist/__w3kits/assets/design-templates/mobile-app/references/layouts.md +312 -0
- package/dist/__w3kits/assets/design-templates/mobile-onboarding/SKILL.md +54 -0
- package/dist/__w3kits/assets/design-templates/mobile-onboarding/example.html +206 -0
- package/dist/__w3kits/assets/design-templates/motion-frames/SKILL.md +90 -0
- package/dist/__w3kits/assets/design-templates/motion-frames/example.html +221 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/README.md +119 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/SKILL.md +321 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/about.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/capabilities.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/cta.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/hero.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/image-manifest.json +168 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/imagegen-prompts.md +246 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/lab-1.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/lab-2.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/lab-3.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/lab-4.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/lab-5.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/method-1.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/method-2.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/method-3.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/method-4.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/testimonial.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/work-1.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/assets/work-2.png +0 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/example.html +2645 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/inputs.example.json +365 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/schema.ts +447 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/scripts/compose.ts +821 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/scripts/imagegen.ts +325 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/scripts/placeholder.ts +174 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing/styles.css +1858 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing-deck/README.md +118 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing-deck/SKILL.md +222 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing-deck/example.html +2900 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing-deck/inputs.example.json +210 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing-deck/schema.ts +128 -0
- package/dist/__w3kits/assets/design-templates/open-design-landing-deck/scripts/compose.ts +1056 -0
- package/dist/__w3kits/assets/design-templates/orbit-general/SKILL.md +203 -0
- package/dist/__w3kits/assets/design-templates/orbit-general/example.html +1302 -0
- package/dist/__w3kits/assets/design-templates/orbit-github/SKILL.md +167 -0
- package/dist/__w3kits/assets/design-templates/orbit-github/example.html +770 -0
- package/dist/__w3kits/assets/design-templates/orbit-gmail/SKILL.md +170 -0
- package/dist/__w3kits/assets/design-templates/orbit-gmail/example.html +643 -0
- package/dist/__w3kits/assets/design-templates/orbit-linear/SKILL.md +177 -0
- package/dist/__w3kits/assets/design-templates/orbit-linear/example.html +571 -0
- package/dist/__w3kits/assets/design-templates/orbit-notion/SKILL.md +186 -0
- package/dist/__w3kits/assets/design-templates/orbit-notion/example.html +529 -0
- package/dist/__w3kits/assets/design-templates/pm-spec/SKILL.md +52 -0
- package/dist/__w3kits/assets/design-templates/pm-spec/example.html +248 -0
- package/dist/__w3kits/assets/design-templates/pricing-page/SKILL.md +79 -0
- package/dist/__w3kits/assets/design-templates/pricing-page/example.html +127 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/SKILL.md +233 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/assets/template.html +488 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/examples/README.md +18 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/examples/example-atlas.html +499 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/examples/example-bluehouse.html +495 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/examples/example-helix.html +480 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/examples/example-holm.html +513 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/references/checklist.md +112 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/references/components.md +143 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/references/layouts.md +457 -0
- package/dist/__w3kits/assets/design-templates/replit-deck/references/themes.md +326 -0
- package/dist/__w3kits/assets/design-templates/saas-landing/SKILL.md +124 -0
- package/dist/__w3kits/assets/design-templates/saas-landing/example.html +153 -0
- package/dist/__w3kits/assets/design-templates/simple-deck/SKILL.md +120 -0
- package/dist/__w3kits/assets/design-templates/simple-deck/assets/template.html +353 -0
- package/dist/__w3kits/assets/design-templates/simple-deck/example.html +141 -0
- package/dist/__w3kits/assets/design-templates/simple-deck/references/checklist.md +55 -0
- package/dist/__w3kits/assets/design-templates/simple-deck/references/layouts.md +201 -0
- package/dist/__w3kits/assets/design-templates/social-carousel/SKILL.md +92 -0
- package/dist/__w3kits/assets/design-templates/social-carousel/example.html +219 -0
- package/dist/__w3kits/assets/design-templates/social-media-dashboard/.preview/hero.png +0 -0
- package/dist/__w3kits/assets/design-templates/social-media-dashboard/SKILL.md +118 -0
- package/dist/__w3kits/assets/design-templates/social-media-dashboard/example.html +1534 -0
- package/dist/__w3kits/assets/design-templates/social-media-matrix-tracker-template/SKILL.md +107 -0
- package/dist/__w3kits/assets/design-templates/social-media-matrix-tracker-template/assets/template.html +1258 -0
- package/dist/__w3kits/assets/design-templates/social-media-matrix-tracker-template/example.html +1258 -0
- package/dist/__w3kits/assets/design-templates/social-media-matrix-tracker-template/references/checklist.md +25 -0
- package/dist/__w3kits/assets/design-templates/sprite-animation/SKILL.md +95 -0
- package/dist/__w3kits/assets/design-templates/sprite-animation/example.html +271 -0
- package/dist/__w3kits/assets/design-templates/team-okrs/SKILL.md +47 -0
- package/dist/__w3kits/assets/design-templates/team-okrs/example.html +207 -0
- package/dist/__w3kits/assets/design-templates/trading-analysis-dashboard-template/SKILL.md +78 -0
- package/dist/__w3kits/assets/design-templates/trading-analysis-dashboard-template/assets/template.html +284 -0
- package/dist/__w3kits/assets/design-templates/trading-analysis-dashboard-template/example.html +22 -0
- package/dist/__w3kits/assets/design-templates/trading-analysis-dashboard-template/references/checklist.md +32 -0
- package/dist/__w3kits/assets/design-templates/tweaks/SKILL.md +240 -0
- package/dist/__w3kits/assets/design-templates/tweaks/assets/wrap.html +437 -0
- package/dist/__w3kits/assets/design-templates/tweaks/example.html +750 -0
- package/dist/__w3kits/assets/design-templates/video-shortform/SKILL.md +128 -0
- package/dist/__w3kits/assets/design-templates/video-shortform/example.html +90 -0
- package/dist/__w3kits/assets/design-templates/waitlist-page/SKILL.md +229 -0
- package/dist/__w3kits/assets/design-templates/waitlist-page/assets/template.html +457 -0
- package/dist/__w3kits/assets/design-templates/waitlist-page/example.html +400 -0
- package/dist/__w3kits/assets/design-templates/waitlist-page/references/checklist.md +42 -0
- package/dist/__w3kits/assets/design-templates/web-prototype/SKILL.md +97 -0
- package/dist/__w3kits/assets/design-templates/web-prototype/assets/template.html +338 -0
- package/dist/__w3kits/assets/design-templates/web-prototype/example.html +81 -0
- package/dist/__w3kits/assets/design-templates/web-prototype/references/checklist.md +44 -0
- package/dist/__w3kits/assets/design-templates/web-prototype/references/layouts.md +247 -0
- package/dist/__w3kits/assets/design-templates/web-prototype-taste-brutalist/SKILL.md +61 -0
- package/dist/__w3kits/assets/design-templates/web-prototype-taste-brutalist/example.html +449 -0
- package/dist/__w3kits/assets/design-templates/web-prototype-taste-editorial/SKILL.md +60 -0
- package/dist/__w3kits/assets/design-templates/web-prototype-taste-editorial/example.html +392 -0
- package/dist/__w3kits/assets/design-templates/web-prototype-taste-soft/SKILL.md +63 -0
- package/dist/__w3kits/assets/design-templates/web-prototype-taste-soft/example.html +542 -0
- package/dist/__w3kits/assets/design-templates/weekly-update/SKILL.md +50 -0
- package/dist/__w3kits/assets/design-templates/weekly-update/example.html +320 -0
- package/dist/__w3kits/assets/design-templates/wireframe-sketch/SKILL.md +97 -0
- package/dist/__w3kits/assets/design-templates/wireframe-sketch/example.html +256 -0
- package/dist/__w3kits/assets/design-templates/x-research/SKILL.md +116 -0
- package/dist/__w3kits/assets/skills/8-bit-orbit-video-template/SKILL.md +73 -0
- package/dist/__w3kits/assets/skills/8-bit-orbit-video-template/assets/default-showcase.mp4 +0 -0
- package/dist/__w3kits/assets/skills/8-bit-orbit-video-template/assets/template.html +506 -0
- package/dist/__w3kits/assets/skills/8-bit-orbit-video-template/example.html +43 -0
- package/dist/__w3kits/assets/skills/8-bit-orbit-video-template/references/checklist.md +21 -0
- package/dist/__w3kits/assets/skills/AGENTS.md +54 -0
- package/dist/__w3kits/assets/skills/README.md +25 -0
- package/dist/__w3kits/assets/skills/ad-creative/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/after-hours-editorial-template/SKILL.md +79 -0
- package/dist/__w3kits/assets/skills/after-hours-editorial-template/assets/template.html +173 -0
- package/dist/__w3kits/assets/skills/after-hours-editorial-template/example.html +12 -0
- package/dist/__w3kits/assets/skills/after-hours-editorial-template/references/checklist.md +25 -0
- package/dist/__w3kits/assets/skills/agent-browser/SKILL.md +193 -0
- package/dist/__w3kits/assets/skills/ai-music-album/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/algorithmic-art/SKILL.md +44 -0
- package/dist/__w3kits/assets/skills/apple-hig/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/artifacts-builder/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/brainstorming/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/brand-guidelines/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/canvas-design/SKILL.md +45 -0
- package/dist/__w3kits/assets/skills/color-expert/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/competitive-ads-extractor/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/copywriting/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/creative-director/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/d3-visualization/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/design-brief/SKILL.md +252 -0
- package/dist/__w3kits/assets/skills/design-consultation/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/design-md/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/design-review/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/digits-fintech-swiss-template/SKILL.md +68 -0
- package/dist/__w3kits/assets/skills/digits-fintech-swiss-template/assets/template.html +111 -0
- package/dist/__w3kits/assets/skills/digits-fintech-swiss-template/example.html +44 -0
- package/dist/__w3kits/assets/skills/digits-fintech-swiss-template/references/checklist.md +23 -0
- package/dist/__w3kits/assets/skills/doc/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/docx/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/domain-name-brainstormer/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/editorial-burgundy-principles-template/SKILL.md +71 -0
- package/dist/__w3kits/assets/skills/editorial-burgundy-principles-template/assets/template.html +94 -0
- package/dist/__w3kits/assets/skills/editorial-burgundy-principles-template/example.html +49 -0
- package/dist/__w3kits/assets/skills/editorial-burgundy-principles-template/references/checklist.md +22 -0
- package/dist/__w3kits/assets/skills/enhance-prompt/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/fal-3d/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/fal-generate/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/fal-image-edit/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/fal-kling-o3/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/fal-lip-sync/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/fal-realtime/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/fal-restore/SKILL.md +44 -0
- package/dist/__w3kits/assets/skills/fal-train/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/fal-tryon/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/fal-upscale/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/fal-video-edit/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/fal-vision/SKILL.md +44 -0
- package/dist/__w3kits/assets/skills/faq-page/SKILL.md +113 -0
- package/dist/__w3kits/assets/skills/faq-page/example.html +517 -0
- package/dist/__w3kits/assets/skills/field-notes-editorial-template/SKILL.md +78 -0
- package/dist/__w3kits/assets/skills/field-notes-editorial-template/assets/template.html +287 -0
- package/dist/__w3kits/assets/skills/field-notes-editorial-template/example.html +138 -0
- package/dist/__w3kits/assets/skills/field-notes-editorial-template/references/checklist.md +28 -0
- package/dist/__w3kits/assets/skills/figma-code-connect-components/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/figma-create-design-system-rules/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/figma-create-new-file/SKILL.md +41 -0
- package/dist/__w3kits/assets/skills/figma-generate-design/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/figma-generate-library/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/figma-implement-design/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/figma-use/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/flutter-animating-apps/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/frontend-design/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/frontend-dev/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/frontend-skill/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/frontend-slides/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/full-page-screenshot/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/gif-sticker-maker/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/gsap-core/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/gsap-react/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/gsap-scrolltrigger/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/gsap-timeline/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/hand-drawn-diagrams/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/hatch-pet/LICENSE.txt +201 -0
- package/dist/__w3kits/assets/skills/hatch-pet/README.md +56 -0
- package/dist/__w3kits/assets/skills/hatch-pet/SKILL.md +355 -0
- package/dist/__w3kits/assets/skills/hatch-pet/agents/openai.yaml +4 -0
- package/dist/__w3kits/assets/skills/hatch-pet/references/animation-rows.md +29 -0
- package/dist/__w3kits/assets/skills/hatch-pet/references/codex-pet-contract.md +35 -0
- package/dist/__w3kits/assets/skills/hatch-pet/references/qa-rubric.md +60 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/compose_atlas.py +150 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/derive_running_left_from_running_right.py +143 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/extract_strip_frames.py +323 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/finalize_pet_run.py +382 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/generate_pet_images.py +295 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/inspect_frames.py +246 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/make_contact_sheet.py +96 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/package_custom_pet.py +108 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/pet_job_status.py +117 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/prepare_pet_run.py +674 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/queue_pet_repairs.py +172 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/record_imagegen_result.py +250 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/render_animation_videos.py +134 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/render_animation_videos.sh +5 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/test_generate_pet_images.py +136 -0
- package/dist/__w3kits/assets/skills/hatch-pet/scripts/validate_atlas.py +139 -0
- package/dist/__w3kits/assets/skills/html-ppt-retro-quarterly-review/SKILL.md +79 -0
- package/dist/__w3kits/assets/skills/html-ppt-retro-quarterly-review/assets/template.html +164 -0
- package/dist/__w3kits/assets/skills/html-ppt-retro-quarterly-review/example.html +139 -0
- package/dist/__w3kits/assets/skills/html-ppt-retro-quarterly-review/references/checklist.md +23 -0
- package/dist/__w3kits/assets/skills/image-enhancer/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/imagegen/SKILL.md +44 -0
- package/dist/__w3kits/assets/skills/imagen/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/login-flow/SKILL.md +48 -0
- package/dist/__w3kits/assets/skills/login-flow/example.html +362 -0
- package/dist/__w3kits/assets/skills/login-flow/references/checklist.md +19 -0
- package/dist/__w3kits/assets/skills/marketing-psychology/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/minimax-docx/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/minimax-pdf/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/nanobanana-ppt/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/paywall-upgrade-cro/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/pdf/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/pixelbin-media/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/plan-design-review/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/platform-design/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/pptx/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/pptx-generator/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/pptx-html-fidelity-audit/SKILL.md +254 -0
- package/dist/__w3kits/assets/skills/pptx-html-fidelity-audit/references/audit-table-template.md +58 -0
- package/dist/__w3kits/assets/skills/pptx-html-fidelity-audit/references/font-discipline.md +363 -0
- package/dist/__w3kits/assets/skills/pptx-html-fidelity-audit/references/layout-discipline.md +371 -0
- package/dist/__w3kits/assets/skills/pptx-html-fidelity-audit/scripts/extract_pptx.py +134 -0
- package/dist/__w3kits/assets/skills/pptx-html-fidelity-audit/scripts/verify_layout.py +144 -0
- package/dist/__w3kits/assets/skills/release-notes-one-pager/SKILL.md +107 -0
- package/dist/__w3kits/assets/skills/release-notes-one-pager/assets/template.html +342 -0
- package/dist/__w3kits/assets/skills/release-notes-one-pager/example.html +156 -0
- package/dist/__w3kits/assets/skills/release-notes-one-pager/references/checklist.md +41 -0
- package/dist/__w3kits/assets/skills/release-notes-one-pager/references/layouts.md +299 -0
- package/dist/__w3kits/assets/skills/remotion/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/replicate/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/screenshot/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/screenshots-marketing/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/shadcn-ui/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/shader-dev/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/slack-gif-creator/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/slides/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/sora/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/speech/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/stitch-loop/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/swiftui-design/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/swiss-creative-mode-template/SKILL.md +79 -0
- package/dist/__w3kits/assets/skills/swiss-creative-mode-template/assets/template.html +375 -0
- package/dist/__w3kits/assets/skills/swiss-creative-mode-template/example.html +70 -0
- package/dist/__w3kits/assets/skills/swiss-creative-mode-template/references/checklist.md +33 -0
- package/dist/__w3kits/assets/skills/swiss-user-research-video-template/SKILL.md +81 -0
- package/dist/__w3kits/assets/skills/swiss-user-research-video-template/assets/template.html +265 -0
- package/dist/__w3kits/assets/skills/swiss-user-research-video-template/example.html +265 -0
- package/dist/__w3kits/assets/skills/swiss-user-research-video-template/references/checklist.md +24 -0
- package/dist/__w3kits/assets/skills/taste-skill/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/theme-factory/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/threejs/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/ui-skills/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/ui-ux-pro-max/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/venice-audio-music/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/venice-audio-speech/SKILL.md +43 -0
- package/dist/__w3kits/assets/skills/venice-image-edit/SKILL.md +41 -0
- package/dist/__w3kits/assets/skills/venice-image-generate/SKILL.md +41 -0
- package/dist/__w3kits/assets/skills/venice-video/SKILL.md +41 -0
- package/dist/__w3kits/assets/skills/video-downloader/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/web-artifacts-builder/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/web-design-guidelines/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/wpds/SKILL.md +42 -0
- package/dist/__w3kits/assets/skills/youtube-clipper/SKILL.md +42 -0
- package/dist/__w3kits/daemon-proxy-sw.js +45 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/acp.d.ts +59 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/acp.js +595 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/acp.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/active-context-routes.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/active-context-routes.js +64 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/active-context-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/agents.d.ts +9 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/agents.js +11 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/agents.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/analytics.d.ts +32 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/analytics.js +140 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/analytics.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/app-config.d.ts +34 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/app-config.js +305 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/app-config.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/app-version.d.ts +26 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/app-version.js +94 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/app-version.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/artifact-manifest.d.ts +13 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/artifact-manifest.js +244 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/artifact-manifest.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/artifact-stub-guard.d.ts +50 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/artifact-stub-guard.js +252 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/artifact-stub-guard.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/browser-open.d.ts +16 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/browser-open.js +57 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/browser-open.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/chat-routes.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/chat-routes.js +983 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/chat-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/claude-design-import.d.ts +4 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/claude-design-import.js +217 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/claude-design-import.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/claude-diagnostics.d.ts +14 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/claude-diagnostics.js +96 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/claude-diagnostics.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/claude-stream.d.ts +27 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/claude-stream.js +255 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/claude-stream.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/cli.d.ts +2 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/cli.js +681 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/cli.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/codex-pets.d.ts +26 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/codex-pets.js +234 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/codex-pets.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/community-pets-sync.d.ts +15 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/community-pets-sync.js +233 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/community-pets-sync.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectionTest.d.ts +31 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectionTest.js +1252 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectionTest.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/catalog.d.ts +121 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/catalog.js +102 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/catalog.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio-config.d.ts +14 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio-config.js +101 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio-config.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio-curation.d.ts +2 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio-curation.js +120 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio-curation.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio-descriptions.d.ts +15 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio-descriptions.js +765 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio-descriptions.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio.d.ts +114 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio.js +1328 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/composio.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/routes.d.ts +23 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/routes.js +735 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/service.d.ts +173 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/service.js +714 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/connectors/service.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/constants.d.ts +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/constants.js +2 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/constants.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/copilot-stream.d.ts +29 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/copilot-stream.js +129 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/copilot-stream.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/craft.d.ts +11 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/craft.js +47 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/craft.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/__fixtures__/adapters/synthetic-bad.d.ts +20 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/__fixtures__/adapters/synthetic-bad.js +30 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/__fixtures__/adapters/synthetic-bad.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/__fixtures__/adapters/synthetic-good.d.ts +42 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/__fixtures__/adapters/synthetic-good.js +52 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/__fixtures__/adapters/synthetic-good.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/__fixtures__/run-nightly.d.ts +24 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/__fixtures__/run-nightly.js +90 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/__fixtures__/run-nightly.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/adapter-degraded.d.ts +69 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/adapter-degraded.js +110 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/adapter-degraded.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/artifact-handler.d.ts +24 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/artifact-handler.js +195 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/artifact-handler.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/artifact-writer.d.ts +79 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/artifact-writer.js +142 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/artifact-writer.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/config.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/config.js +72 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/config.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/conformance-history.d.ts +48 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/conformance-history.js +119 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/conformance-history.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/conformance.d.ts +103 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/conformance.js +190 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/conformance.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/errors.d.ts +11 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/errors.js +23 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/errors.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/interrupt-handler.d.ts +20 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/interrupt-handler.js +110 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/interrupt-handler.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/orchestrator.d.ts +72 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/orchestrator.js +806 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/orchestrator.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/parser.d.ts +34 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/parser.js +7 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/parser.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/parsers/v1.d.ts +48 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/parsers/v1.js +526 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/parsers/v1.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/persistence.d.ts +101 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/persistence.js +238 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/persistence.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/ratchet.d.ts +100 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/ratchet.js +192 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/ratchet.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/rollout.d.ts +93 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/rollout.js +125 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/rollout.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/run-registry.d.ts +59 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/run-registry.js +58 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/run-registry.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/scoreboard.d.ts +39 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/scoreboard.js +62 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/scoreboard.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/spawn-inputs.d.ts +33 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/spawn-inputs.js +40 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/spawn-inputs.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/transcript.d.ts +30 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/transcript.js +153 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/critique/transcript.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/cwd-aliases.d.ts +22 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/cwd-aliases.js +131 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/cwd-aliases.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/db.d.ts +449 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/db.js +1142 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/db.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/deploy-routes.d.ts +8 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/deploy-routes.js +201 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/deploy-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/deploy.d.ts +288 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/deploy.js +1816 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/deploy.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/design-system-preview.d.ts +12 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/design-system-preview.js +603 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/design-system-preview.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/design-system-showcase.d.ts +18 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/design-system-showcase.js +844 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/design-system-showcase.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/design-systems.d.ts +73 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/design-systems.js +266 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/design-systems.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/document-preview.d.ts +26 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/document-preview.js +286 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/document-preview.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/elevenlabs-voices.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/elevenlabs-voices.js +108 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/elevenlabs-voices.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/finalize-design.d.ts +151 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/finalize-design.js +547 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/finalize-design.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/frontmatter.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/frontmatter.js +155 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/frontmatter.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/home-expansion.d.ts +2 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/home-expansion.js +39 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/home-expansion.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/import-export-routes.d.ts +11 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/import-export-routes.js +482 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/import-export-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/inline-assets.d.ts +50 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/inline-assets.js +332 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/inline-assets.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/json-event-stream.d.ts +8 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/json-event-stream.js +405 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/json-event-stream.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/langfuse-bridge.d.ts +35 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/langfuse-bridge.js +273 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/langfuse-bridge.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/langfuse-trace.d.ts +110 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/langfuse-trace.js +479 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/langfuse-trace.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/legacy-data-migrator.d.ts +90 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/legacy-data-migrator.js +340 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/legacy-data-migrator.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/library-install.d.ts +36 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/library-install.js +174 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/library-install.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/linked-dirs.d.ts +8 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/linked-dirs.js +62 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/linked-dirs.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/lint-artifact.d.ts +44 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/lint-artifact.js +952 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/lint-artifact.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifact-routes.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifact-routes.js +305 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifact-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/refresh-service.d.ts +23 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/refresh-service.js +178 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/refresh-service.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/refresh.d.ts +92 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/refresh.js +641 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/refresh.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/render.d.ts +15 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/render.js +68 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/render.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/schema.d.ts +144 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/schema.js +702 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/schema.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/store.d.ts +214 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/store.js +1002 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/live-artifacts/store.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/logging/critique.d.ts +57 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/logging/critique.js +30 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/logging/critique.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-config.d.ts +88 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-config.js +878 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-config.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-daemon-url.d.ts +22 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-daemon-url.js +44 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-daemon-url.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-install-info.d.ts +29 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-install-info.js +60 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-install-info.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-live-artifacts-server.d.ts +19 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-live-artifacts-server.js +238 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-live-artifacts-server.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-oauth.d.ts +155 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-oauth.js +412 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-oauth.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-routes.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-routes.js +365 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-tokens.d.ts +59 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-tokens.js +189 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp-tokens.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp.d.ts +52 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp.js +847 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/mcp.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-config.d.ts +69 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-config.js +408 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-config.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-models.d.ts +31 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-models.js +136 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-models.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-routes.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-routes.js +316 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-tasks.d.ts +65 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-tasks.js +199 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media-tasks.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media.d.ts +56 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media.js +2065 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/media.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/memory-extractions.d.ts +26 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/memory-extractions.js +233 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/memory-extractions.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/memory-llm.d.ts +7 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/memory-llm.js +809 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/memory-llm.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/memory.d.ts +70 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/memory.js +654 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/memory.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/metrics/index.d.ts +51 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/metrics/index.js +111 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/metrics/index.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/native-folder-dialog.d.ts +6 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/native-folder-dialog.js +32 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/native-folder-dialog.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/orbit-agent-summary.d.ts +7 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/orbit-agent-summary.js +34 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/orbit-agent-summary.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/orbit.d.ts +93 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/orbit.js +400 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/orbit.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/origin-validation.d.ts +21 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/origin-validation.js +149 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/origin-validation.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/pdf-export.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/pdf-export.js +43 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/pdf-export.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/pi-rpc.d.ts +93 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/pi-rpc.js +475 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/pi-rpc.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/project-routes.d.ts +14 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/project-routes.js +867 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/project-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/project-watchers.d.ts +52 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/project-watchers.js +162 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/project-watchers.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/projects.d.ts +90 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/projects.js +1186 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/projects.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompt-templates.d.ts +24 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompt-templates.js +122 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompt-templates.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/deck-framework.d.ts +38 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/deck-framework.js +373 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/deck-framework.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/directions.d.ts +68 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/directions.js +237 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/directions.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/discovery.d.ts +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/discovery.js +262 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/discovery.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/media-contract.d.ts +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/media-contract.js +359 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/media-contract.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/official-system.d.ts +11 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/official-system.js +124 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/official-system.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/panel.d.ts +48 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/panel.js +196 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/panel.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/research-contract.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/research-contract.js +52 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/research-contract.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/system.d.ts +97 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/system.js +598 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/prompts/system.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/providerModels.d.ts +6 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/providerModels.js +284 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/providerModels.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/qoder-stream.d.ts +13 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/qoder-stream.js +162 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/qoder-stream.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/redact.d.ts +18 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/redact.js +179 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/redact.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/research/cli-args.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/research/cli-args.js +11 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/research/cli-args.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/research/index.d.ts +14 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/research/index.js +78 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/research/index.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/research/tavily.d.ts +19 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/research/tavily.js +78 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/research/tavily.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/route-context-contract.d.ts +16 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/route-context-contract.js +4 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/route-context-contract.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/routine-routes.d.ts +37 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/routine-routes.js +212 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/routine-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/routines.d.ts +100 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/routines.js +390 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/routines.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runs.d.ts +59 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runs.js +217 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runs.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/auth.d.ts +9 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/auth.js +58 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/auth.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/capabilities.d.ts +2 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/capabilities.js +2 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/capabilities.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/claude.d.ts +17 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/claude.js +75 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/claude.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/codex.d.ts +15 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/codex.js +82 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/codex.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/copilot.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/copilot.js +68 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/copilot.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/cursor-agent.d.ts +16 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/cursor-agent.js +46 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/cursor-agent.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/deepseek.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/deepseek.js +54 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/deepseek.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/devin.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/devin.js +43 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/devin.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/gemini.d.ts +14 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/gemini.js +37 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/gemini.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/hermes.d.ts +11 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/hermes.js +27 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/hermes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/kilo.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/kilo.js +18 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/kilo.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/kimi.d.ts +11 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/kimi.js +24 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/kimi.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/kiro.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/kiro.js +18 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/kiro.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/opencode.d.ts +18 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/opencode.js +43 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/opencode.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/pi.d.ts +19 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/pi.js +88 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/pi.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/qoder.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/qoder.js +49 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/qoder.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/qwen.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/qwen.js +26 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/qwen.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/shared.d.ts +8 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/shared.js +44 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/shared.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/vibe.d.ts +10 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/vibe.js +18 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/defs/vibe.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/detection.d.ts +9 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/detection.js +180 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/detection.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/env.d.ts +3 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/env.js +38 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/env.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/executables.d.ts +8 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/executables.js +155 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/executables.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/invocation.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/invocation.js +21 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/invocation.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/launch.d.ts +11 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/launch.js +147 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/launch.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/mcp.d.ts +13 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/mcp.js +13 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/mcp.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/metadata.d.ts +4 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/metadata.js +90 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/metadata.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/models.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/models.js +43 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/models.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/paths.d.ts +2 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/paths.js +22 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/paths.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/prompt-budget.d.ts +4 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/prompt-budget.js +202 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/prompt-budget.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/registry.d.ts +3 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/registry.js +45 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/registry.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/resolution.d.ts +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/resolution.js +13 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/resolution.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/types.d.ts +62 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/types.js +2 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/runtimes/types.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/server-context.d.ts +93 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/server-context.js +2 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/server-context.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/server.d.ts +160 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/server.js +4384 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/server.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/sidecar/index.d.ts +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/sidecar/index.js +21 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/sidecar/index.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/sidecar/server.d.ts +23 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/sidecar/server.js +175 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/sidecar/server.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/skills.d.ts +100 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/skills.js +836 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/skills.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/static-resource-routes.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/static-resource-routes.js +593 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/static-resource-routes.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tool-tokens.d.ts +47 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tool-tokens.js +131 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tool-tokens.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tools/connectors.d.ts +12 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tools/connectors.js +124 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tools/connectors.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tools-connectors-cli.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tools-connectors-cli.js +270 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tools-connectors-cli.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tools-live-artifacts-cli.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tools-live-artifacts-cli.js +282 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/tools-live-artifacts-cli.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/transcript-export.d.ts +16 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/transcript-export.js +388 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/dist/transcript-export.js.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/apps/daemon/package.json +62 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/browser-vfs/dist/index.d.ts +108 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/browser-vfs/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/browser-vfs/dist/index.mjs +413 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/browser-vfs/package.json +12 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/analytics/artifact-id.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/analytics/artifact-id.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/analytics/events.d.ts +250 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/analytics/events.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/analytics/index.d.ts +4 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/analytics/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/analytics/index.mjs +186 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/analytics/public-params.d.ts +26 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/analytics/public-params.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/app-config.d.ts +44 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/app-config.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/artifacts.d.ts +34 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/artifacts.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/chat.d.ts +158 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/chat.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/comments.d.ts +65 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/comments.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/connectionTest.d.ts +49 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/connectionTest.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/connectionTest.mjs +83 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/connectors.d.ts +133 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/connectors.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/files.d.ts +43 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/files.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/finalize.d.ts +50 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/finalize.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/finalize.mjs +5 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/live-artifacts.d.ts +151 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/live-artifacts.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/mcp.d.ts +117 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/mcp.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/memory.d.ts +233 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/memory.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/orbit.d.ts +22 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/orbit.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/orbit.mjs +0 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/projects.d.ts +286 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/projects.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/providerModels.d.ts +19 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/providerModels.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/providerModels.mjs +0 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/proxy.d.ts +24 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/proxy.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/registry.d.ts +156 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/registry.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/research.d.ts +35 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/research.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/research.mjs +9 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/routines.d.ts +104 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/routines.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/version.d.ts +11 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/api/version.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/common.d.ts +33 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/common.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/critique.d.ts +344 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/critique.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/critique.mjs +182 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/errors.d.ts +40 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/errors.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/examples.d.ts +20 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/examples.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/index.d.ts +31 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/index.mjs +2072 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/deck-framework.d.ts +39 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/deck-framework.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/directions.d.ts +69 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/directions.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/discovery.d.ts +2 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/discovery.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/media-contract.d.ts +2 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/media-contract.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/official-system.d.ts +12 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/official-system.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/system.d.ts +58 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/prompts/system.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/sse/chat.d.ts +96 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/sse/chat.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/sse/common.d.ts +8 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/sse/common.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/sse/proxy.d.ts +6 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/sse/proxy.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/tasks.d.ts +12 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/dist/tasks.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/contracts/package.json +40 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/platform/dist/index.d.ts +68 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/platform/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/platform/dist/index.mjs +397 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/platform/package.json +12 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/sidecar/dist/index.d.ts +144 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/sidecar/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/sidecar/dist/index.mjs +412 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/sidecar/package.json +12 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/sidecar-proto/dist/index.d.ts +291 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/sidecar-proto/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/sidecar-proto/dist/index.mjs +315 -0
- package/dist/__w3kits/webcontainer-runtime/node_modules/@open-design/sidecar-proto/package.json +12 -0
- package/dist/__w3kits/webcontainer-runtime/package.json +20 -0
- package/dist/__w3kits/webcontainer-runtime.json +68 -0
- package/dist/_not-found/__next._full.txt +1 -1
- package/dist/_not-found/__next._head.txt +1 -1
- package/dist/_not-found/__next._index.txt +1 -1
- package/dist/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/_not-found/__next._not-found.txt +1 -1
- package/dist/_not-found/__next._tree.txt +1 -1
- package/dist/_not-found/index.html +1 -1
- package/dist/_not-found/index.txt +1 -1
- package/dist/browser-daemon.js +113 -7
- package/dist/index.html +1 -1
- package/dist/index.txt +1 -1
- package/package.json +3 -2
- /package/dist/_next/static/{ptaOAJFvinIcai1ShQRcW → Jxi73Py0I4WvBhRY47OF-}/_buildManifest.js +0 -0
- /package/dist/_next/static/{ptaOAJFvinIcai1ShQRcW → Jxi73Py0I4WvBhRY47OF-}/_clientMiddlewareManifest.js +0 -0
- /package/dist/_next/static/{ptaOAJFvinIcai1ShQRcW → Jxi73Py0I4WvBhRY47OF-}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,2065 @@
|
|
|
1
|
+
// Media-generation dispatcher. The unifying contract is:
|
|
2
|
+
//
|
|
3
|
+
// skills + metadata + system-prompt
|
|
4
|
+
// ↓ (the code agent decides what to make)
|
|
5
|
+
// `od media generate --surface … --model … --output … --prompt …`
|
|
6
|
+
// ↓ (this module routes to a provider)
|
|
7
|
+
// bytes written to <projectsRoot>/<projectId>/<output>
|
|
8
|
+
// ↓
|
|
9
|
+
// FileViewer renders it.
|
|
10
|
+
//
|
|
11
|
+
// Every surface (image / video / audio) flows through this single
|
|
12
|
+
// entrypoint. Providers live behind the `provider` field on each model
|
|
13
|
+
// entry in media-models.js — when a real integration ships we route to
|
|
14
|
+
// it; otherwise we emit a deterministic, lightweight placeholder
|
|
15
|
+
// (labelled SVG-PNG, silent WAV/MP3, blank MP4) so the framework works
|
|
16
|
+
// without API keys.
|
|
17
|
+
//
|
|
18
|
+
// Today we ship real integrations for:
|
|
19
|
+
// * provider 'openai' → OpenAI Images API (gpt-image-* / dall-e-*),
|
|
20
|
+
// plus text-to-speech via /v1/audio/speech,
|
|
21
|
+
// with auto-detection for Azure OpenAI
|
|
22
|
+
// deployments based on the configured base URL
|
|
23
|
+
// * provider 'volcengine' → Volcengine Ark async tasks API for
|
|
24
|
+
// Doubao Seedance 2.0 (video) and Seedream
|
|
25
|
+
// (image)
|
|
26
|
+
// * provider 'grok' → xAI Imagine API: synchronous
|
|
27
|
+
// /v1/images/generations for grok-imagine-image
|
|
28
|
+
// and async /v1/videos/generations + GET poll
|
|
29
|
+
// for grok-imagine-video (t2v + i2v + audio)
|
|
30
|
+
//
|
|
31
|
+
// The fallback stub handlers are gated behind OD_MEDIA_ALLOW_STUBS=1; in
|
|
32
|
+
// release builds they throw StubProviderDisabledError (mapped to HTTP
|
|
33
|
+
// 503) instead of writing placeholder bytes that look like a successful
|
|
34
|
+
// generation. Real-provider failures still produce a stub byte payload
|
|
35
|
+
// when stubs are allowed, but they tag the response with providerError
|
|
36
|
+
// so the CLI can exit non-zero and the agent can't silently narrate the
|
|
37
|
+
// placeholder as the final result.
|
|
38
|
+
import { mkdir, mkdtemp, readFile, rm, stat, writeFile } from 'node:fs/promises';
|
|
39
|
+
import { execFile as execFileCb, spawn } from 'node:child_process';
|
|
40
|
+
import os from 'node:os';
|
|
41
|
+
import path from 'node:path';
|
|
42
|
+
import { promisify } from 'node:util';
|
|
43
|
+
import { Agent as UndiciAgent } from 'undici';
|
|
44
|
+
import { AUDIO_DURATIONS_SEC, VIDEO_LENGTHS_SEC, findMediaModel, findProvider, modelsForSurface, } from './media-models.js';
|
|
45
|
+
import { resolveModelAlias, resolveProviderConfig } from './media-config.js';
|
|
46
|
+
import { ensureProject, kindFor, mimeFor, sanitizeName, } from './projects.js';
|
|
47
|
+
const execFile = promisify(execFileCb);
|
|
48
|
+
function isRecord(value) {
|
|
49
|
+
return value !== null && typeof value === 'object';
|
|
50
|
+
}
|
|
51
|
+
function errorMessage(err) {
|
|
52
|
+
return err instanceof Error ? err.message : String(err);
|
|
53
|
+
}
|
|
54
|
+
function errorStringProp(err, key) {
|
|
55
|
+
return isRecord(err) && typeof err[key] === 'string' ? err[key] : '';
|
|
56
|
+
}
|
|
57
|
+
const NANOBANANA_DEFAULT_BASE_URL = 'https://generativelanguage.googleapis.com';
|
|
58
|
+
// Verify the current Nano Banana / Gemini image model name against:
|
|
59
|
+
// https://ai.google.dev/gemini-api/docs/models
|
|
60
|
+
const NANOBANANA_DEFAULT_MODEL = 'gemini-3.1-flash-image-preview';
|
|
61
|
+
const NANOBANANA_DEFAULT_IMAGE_SIZE = '1K';
|
|
62
|
+
const DEFAULT_OUTPUT_BY_SURFACE = {
|
|
63
|
+
image: 'image.png',
|
|
64
|
+
video: 'video.mp4',
|
|
65
|
+
audio: 'audio.mp3',
|
|
66
|
+
};
|
|
67
|
+
const SURFACES = new Set(['image', 'video', 'audio']);
|
|
68
|
+
const AUDIO_KINDS = new Set(['music', 'speech', 'sfx']);
|
|
69
|
+
// Stubs ship a 1×1 PNG / ~24-byte mp4 / silent WAV / single-frame mp3 so
|
|
70
|
+
// the dispatch path is exercisable before real provider integrations
|
|
71
|
+
// land. On a release build that lands as "successful" but functionally
|
|
72
|
+
// empty bytes — confusing to users. We therefore gate the stub renderers
|
|
73
|
+
// behind OD_MEDIA_ALLOW_STUBS=1 and otherwise return a 503 (mapped from
|
|
74
|
+
// the StubProviderDisabledError thrown below) with a clear message.
|
|
75
|
+
class StubProviderDisabledError extends Error {
|
|
76
|
+
code = 'STUB_PROVIDER_DISABLED';
|
|
77
|
+
status = 503;
|
|
78
|
+
constructor(model) {
|
|
79
|
+
super(`provider not configured: ${model}. Add your API key in Settings -> Media Providers to enable real generation.`);
|
|
80
|
+
this.name = 'StubProviderDisabledError';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function stubsAllowed() {
|
|
84
|
+
const v = process.env.OD_MEDIA_ALLOW_STUBS;
|
|
85
|
+
return v === '1' || v === 'true';
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Resolve a project-relative `--image` path into a base64 data URL the
|
|
89
|
+
* upstream model APIs (Volcengine i2v, OpenAI image-edit, etc.) accept
|
|
90
|
+
* directly. Returns null when no path was supplied.
|
|
91
|
+
*
|
|
92
|
+
* Security: refuses anything that escapes the project directory.
|
|
93
|
+
* Without this guard, an agent (or a hallucinated arg) could ask the
|
|
94
|
+
* daemon to upload `/etc/passwd` to a paid model.
|
|
95
|
+
*/
|
|
96
|
+
async function resolveProjectImage(rel, projectDir) {
|
|
97
|
+
if (typeof rel !== 'string' || !rel.trim())
|
|
98
|
+
return null;
|
|
99
|
+
const projectRootResolved = path.resolve(projectDir);
|
|
100
|
+
const abs = path.resolve(projectRootResolved, rel.trim());
|
|
101
|
+
if (abs !== projectRootResolved &&
|
|
102
|
+
!abs.startsWith(projectRootResolved + path.sep)) {
|
|
103
|
+
throw new Error(`--image path "${rel}" resolves outside the project directory.`);
|
|
104
|
+
}
|
|
105
|
+
let info;
|
|
106
|
+
try {
|
|
107
|
+
info = await stat(abs);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
throw new Error(`--image not found: ${rel}`);
|
|
111
|
+
}
|
|
112
|
+
if (!info.isFile()) {
|
|
113
|
+
throw new Error(`--image is not a regular file: ${rel}`);
|
|
114
|
+
}
|
|
115
|
+
// Cap at 16 MB. Beyond this, base64 inflation alone (≈4/3) starts
|
|
116
|
+
// hitting body-size limits at the upstream APIs and our own express
|
|
117
|
+
// 4mb body cap on inbound requests; bigger payloads should travel
|
|
118
|
+
// via the dedicated upload endpoint, not the dispatcher.
|
|
119
|
+
const MAX_IMAGE_BYTES = 16 * 1024 * 1024;
|
|
120
|
+
if (info.size > MAX_IMAGE_BYTES) {
|
|
121
|
+
throw new Error(`--image too large (${info.size} bytes; max ${MAX_IMAGE_BYTES}).`);
|
|
122
|
+
}
|
|
123
|
+
const bytes = await readFile(abs);
|
|
124
|
+
const ext = path.extname(abs).toLowerCase();
|
|
125
|
+
// Tight allowlist: only what i2v / image-edit endpoints actually
|
|
126
|
+
// consume. Avoids smuggling arbitrary content through as data URLs.
|
|
127
|
+
const mime = ({
|
|
128
|
+
'.png': 'image/png',
|
|
129
|
+
'.jpg': 'image/jpeg',
|
|
130
|
+
'.jpeg': 'image/jpeg',
|
|
131
|
+
'.webp': 'image/webp',
|
|
132
|
+
'.gif': 'image/gif',
|
|
133
|
+
})[ext];
|
|
134
|
+
if (!mime) {
|
|
135
|
+
throw new Error(`--image has unsupported extension "${ext}". Use png, jpg, jpeg, webp, or gif.`);
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
path: rel.trim(),
|
|
139
|
+
abs,
|
|
140
|
+
mime,
|
|
141
|
+
size: bytes.length,
|
|
142
|
+
dataUrl: `data:${mime};base64,${bytes.toString('base64')}`,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function clampNumber(value, allowed) {
|
|
146
|
+
// Accept exact registry values; otherwise snap to the nearest allowed
|
|
147
|
+
// bucket so a hallucinated `Number.MAX_SAFE_INTEGER` can't bill an
|
|
148
|
+
// entire month of credits when real providers plug in.
|
|
149
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
150
|
+
return undefined;
|
|
151
|
+
if (allowed.length === 0)
|
|
152
|
+
return undefined;
|
|
153
|
+
if (allowed.includes(value))
|
|
154
|
+
return value;
|
|
155
|
+
let best = allowed[0];
|
|
156
|
+
let bestDiff = Math.abs(value - best);
|
|
157
|
+
for (const a of allowed) {
|
|
158
|
+
const d = Math.abs(value - a);
|
|
159
|
+
if (d < bestDiff) {
|
|
160
|
+
best = a;
|
|
161
|
+
bestDiff = d;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return best;
|
|
165
|
+
}
|
|
166
|
+
function clampWithWarning(value, allowed, flagName) {
|
|
167
|
+
const clamped = clampNumber(value, allowed);
|
|
168
|
+
if (typeof value === 'number'
|
|
169
|
+
&& Number.isFinite(value)
|
|
170
|
+
&& typeof clamped === 'number'
|
|
171
|
+
&& clamped !== value) {
|
|
172
|
+
return {
|
|
173
|
+
value: clamped,
|
|
174
|
+
warning: `--${flagName} ${value} clamped to ${clamped} (allowed: ${allowed.join(', ')})`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
return { value: clamped, warning: null };
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Generate a media artifact and write it into the project's files dir.
|
|
181
|
+
*
|
|
182
|
+
* @param {Object} args
|
|
183
|
+
* @param {string} args.projectRoot - Repo root (.od/ lives directly under).
|
|
184
|
+
* @param {string} args.projectsRoot - Absolute path to <repo>/.od/projects.
|
|
185
|
+
* @param {string} args.projectId
|
|
186
|
+
* @param {'image'|'video'|'audio'} args.surface
|
|
187
|
+
* @param {string} args.model
|
|
188
|
+
* @param {string} [args.prompt]
|
|
189
|
+
* @param {string} [args.output]
|
|
190
|
+
* @param {string} [args.aspect]
|
|
191
|
+
* @param {number} [args.length]
|
|
192
|
+
* @param {number} [args.duration]
|
|
193
|
+
* @param {string} [args.voice]
|
|
194
|
+
* @param {string} [args.audioKind]
|
|
195
|
+
* @param {string} [args.language]
|
|
196
|
+
* @returns {Promise<{ name: string, size: number, mtime: number, kind: string, mime: string, model: string, surface: string, providerNote: string, providerId: string }>}
|
|
197
|
+
*/
|
|
198
|
+
export async function generateMedia(args) {
|
|
199
|
+
const { projectRoot, projectsRoot, projectId, surface, model, prompt, output, aspect, length, duration, voice, audioKind, language, loop, promptInfluence, compositionDir, image, } = args;
|
|
200
|
+
if (!projectRoot)
|
|
201
|
+
throw new Error('projectRoot required');
|
|
202
|
+
if (!projectsRoot)
|
|
203
|
+
throw new Error('projectsRoot required');
|
|
204
|
+
if (typeof projectId !== 'string' || !projectId) {
|
|
205
|
+
throw new Error('projectId required');
|
|
206
|
+
}
|
|
207
|
+
if (!SURFACES.has(surface)) {
|
|
208
|
+
throw new Error(`unsupported surface: ${surface}`);
|
|
209
|
+
}
|
|
210
|
+
if (typeof model !== 'string' || !model) {
|
|
211
|
+
throw new Error('model required');
|
|
212
|
+
}
|
|
213
|
+
if (surface === 'audio' && audioKind && !AUDIO_KINDS.has(audioKind)) {
|
|
214
|
+
throw new Error(`unsupported audioKind: ${audioKind}. Allowed: music | speech | sfx.`);
|
|
215
|
+
}
|
|
216
|
+
const def = findMediaModel(model);
|
|
217
|
+
if (!def) {
|
|
218
|
+
throw new Error(`unknown model: ${model}. Pass --model from the registered list (see /api/media/models).`);
|
|
219
|
+
}
|
|
220
|
+
// Reject cross-surface combinations (e.g. surface=image + model=seedance-2)
|
|
221
|
+
// here so the dispatcher never silently routes a video model id through
|
|
222
|
+
// the image renderer. We compare against the surface-specific list — for
|
|
223
|
+
// audio we further restrict to the kind-specific bucket so a `music`
|
|
224
|
+
// surface can't bill an `elevenlabs-v3` (speech) call.
|
|
225
|
+
const resolvedAudioKind = surface === 'audio' ? audioKind || 'music' : undefined;
|
|
226
|
+
const allowed = modelsForSurface(surface, resolvedAudioKind);
|
|
227
|
+
if (!allowed.some((m) => m.id === model)) {
|
|
228
|
+
const ids = allowed.map((m) => m.id).join(', ');
|
|
229
|
+
const where = surface === 'audio' ? `audio · ${resolvedAudioKind}` : surface;
|
|
230
|
+
throw new Error(`model "${model}" is not registered for surface "${where}". Allowed: ${ids}.`);
|
|
231
|
+
}
|
|
232
|
+
// Clamp registry-bound numeric inputs to their allowed buckets so a
|
|
233
|
+
// hallucinated --length 9999999 doesn't reach a real provider as-is
|
|
234
|
+
// when stubs are swapped for paid integrations.
|
|
235
|
+
const lengthClamp = surface === 'video'
|
|
236
|
+
? clampWithWarning(length, VIDEO_LENGTHS_SEC, 'length')
|
|
237
|
+
: { value: undefined, warning: null };
|
|
238
|
+
const usesProviderSpecificAudioDuration = def.provider === 'elevenlabs'
|
|
239
|
+
&& surface === 'audio'
|
|
240
|
+
&& resolvedAudioKind === 'sfx';
|
|
241
|
+
const durationClamp = surface === 'audio' && !usesProviderSpecificAudioDuration
|
|
242
|
+
? clampWithWarning(duration, AUDIO_DURATIONS_SEC, 'duration')
|
|
243
|
+
: { value: undefined, warning: null };
|
|
244
|
+
const clampedLength = lengthClamp.value;
|
|
245
|
+
const clampedDuration = usesProviderSpecificAudioDuration
|
|
246
|
+
? duration
|
|
247
|
+
: durationClamp.value;
|
|
248
|
+
const warnings = [lengthClamp.warning, durationClamp.warning].filter(Boolean);
|
|
249
|
+
const dir = await ensureProject(projectsRoot, projectId);
|
|
250
|
+
const safeOut = sanitizeName(output || autoOutputName(surface, model, resolvedAudioKind));
|
|
251
|
+
const target = path.join(dir, safeOut);
|
|
252
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
253
|
+
// Reference image for image-to-video / image-edit flows. The agent
|
|
254
|
+
// passes a project-relative path; we read it once here, validate it
|
|
255
|
+
// stays inside the project, and turn it into a base64 data URL the
|
|
256
|
+
// upstream APIs accept directly. Renderers consume `ctx.imageRef`
|
|
257
|
+
// and decide how to splice the data URL into their request.
|
|
258
|
+
const imageRef = await resolveProjectImage(image, dir);
|
|
259
|
+
// Resolve any user-configured model alias BEFORE we hand the id to a
|
|
260
|
+
// dispatcher (issue #1277). Catalog lookup + surface validation above
|
|
261
|
+
// ran against the original id so we still enforce the registered
|
|
262
|
+
// catalog; the alias only changes what the provider receives on the
|
|
263
|
+
// wire. lefarcen + codex P2 on PR #1309: keep BOTH values on ctx so
|
|
264
|
+
// capability branches (DALL-E sizing, gpt-image quality, gpt-4o-mini-tts
|
|
265
|
+
// instructions, MINIMAX/FISHAUDIO TTS map) continue to key off the
|
|
266
|
+
// catalog id while the provider's request body carries the alias.
|
|
267
|
+
const wireModel = await resolveModelAlias(projectRoot, model);
|
|
268
|
+
const ctx = {
|
|
269
|
+
surface,
|
|
270
|
+
model,
|
|
271
|
+
wireModel,
|
|
272
|
+
modelDef: def,
|
|
273
|
+
provider: findProvider(def.provider),
|
|
274
|
+
prompt: prompt || '',
|
|
275
|
+
aspect: aspect || defaultAspectFor(surface),
|
|
276
|
+
length: clampedLength,
|
|
277
|
+
duration: clampedDuration,
|
|
278
|
+
voice: voice || '',
|
|
279
|
+
audioKind: resolvedAudioKind,
|
|
280
|
+
language: language || '',
|
|
281
|
+
loop: loop === true,
|
|
282
|
+
promptInfluence: typeof promptInfluence === 'number' && Number.isFinite(promptInfluence)
|
|
283
|
+
? promptInfluence
|
|
284
|
+
: undefined,
|
|
285
|
+
// Project-relative path to the directory the agent scaffolded with
|
|
286
|
+
// hyperframes.json / meta.json / index.html. Only consumed by the
|
|
287
|
+
// hyperframes renderer; null/empty for every other provider.
|
|
288
|
+
compositionDir: typeof compositionDir === 'string' ? compositionDir : null,
|
|
289
|
+
// Resolved reference image for i2v / image-edit flows. `null` when
|
|
290
|
+
// the agent didn't pass --image. See resolveProjectImage below.
|
|
291
|
+
imageRef,
|
|
292
|
+
};
|
|
293
|
+
const credentials = await resolveProviderConfig(projectRoot, def.provider);
|
|
294
|
+
let bytes;
|
|
295
|
+
let providerNote;
|
|
296
|
+
let suggestedExt;
|
|
297
|
+
// Tracks whether the bytes came from a real provider call or from the
|
|
298
|
+
// stub fallback. Surfaces in the response so the CLI/agent can tell a
|
|
299
|
+
// legitimate placeholder ("provider not integrated yet") apart from a
|
|
300
|
+
// silent failure ("API call blew up, here's a 67-byte PNG"). Without
|
|
301
|
+
// this flag the chat agent narrates the stub as if it's the expected
|
|
302
|
+
// output, and the user sees a blank file.
|
|
303
|
+
let providerError = null;
|
|
304
|
+
let usedStubFallback = false;
|
|
305
|
+
// True only when the dispatcher intentionally returned a stub because
|
|
306
|
+
// no real renderer is wired up for this (provider, surface) pair.
|
|
307
|
+
let intentionalStub = false;
|
|
308
|
+
try {
|
|
309
|
+
if (def.provider === 'openai' && surface === 'image') {
|
|
310
|
+
const result = await renderOpenAIImage(ctx, credentials);
|
|
311
|
+
bytes = result.bytes;
|
|
312
|
+
providerNote = result.providerNote;
|
|
313
|
+
suggestedExt = result.suggestedExt;
|
|
314
|
+
}
|
|
315
|
+
else if (def.provider === 'openai'
|
|
316
|
+
&& surface === 'audio'
|
|
317
|
+
&& ctx.audioKind === 'speech') {
|
|
318
|
+
const result = await renderOpenAISpeech(ctx, credentials, safeOut);
|
|
319
|
+
bytes = result.bytes;
|
|
320
|
+
providerNote = result.providerNote;
|
|
321
|
+
suggestedExt = result.suggestedExt;
|
|
322
|
+
}
|
|
323
|
+
else if (def.provider === 'volcengine' && surface === 'video') {
|
|
324
|
+
const result = await renderVolcengineVideo(ctx, credentials, args.onProgress);
|
|
325
|
+
bytes = result.bytes;
|
|
326
|
+
providerNote = result.providerNote;
|
|
327
|
+
suggestedExt = result.suggestedExt;
|
|
328
|
+
}
|
|
329
|
+
else if (def.provider === 'volcengine' && surface === 'image') {
|
|
330
|
+
const result = await renderVolcengineImage(ctx, credentials);
|
|
331
|
+
bytes = result.bytes;
|
|
332
|
+
providerNote = result.providerNote;
|
|
333
|
+
suggestedExt = result.suggestedExt;
|
|
334
|
+
}
|
|
335
|
+
else if (def.provider === 'grok' && surface === 'image') {
|
|
336
|
+
const result = await renderGrokImage(ctx, credentials);
|
|
337
|
+
bytes = result.bytes;
|
|
338
|
+
providerNote = result.providerNote;
|
|
339
|
+
suggestedExt = result.suggestedExt;
|
|
340
|
+
}
|
|
341
|
+
else if (def.provider === 'grok' && surface === 'video') {
|
|
342
|
+
const result = await renderGrokVideo(ctx, credentials, args.onProgress);
|
|
343
|
+
bytes = result.bytes;
|
|
344
|
+
providerNote = result.providerNote;
|
|
345
|
+
suggestedExt = result.suggestedExt;
|
|
346
|
+
}
|
|
347
|
+
else if (def.provider === 'nanobanana' && surface === 'image') {
|
|
348
|
+
const result = await renderNanoBananaImage(ctx, credentials);
|
|
349
|
+
bytes = result.bytes;
|
|
350
|
+
providerNote = result.providerNote;
|
|
351
|
+
suggestedExt = result.suggestedExt;
|
|
352
|
+
}
|
|
353
|
+
else if (def.provider === 'leonardo' && surface === 'image') {
|
|
354
|
+
const result = await renderLeonardoImage(ctx, credentials);
|
|
355
|
+
bytes = result.bytes;
|
|
356
|
+
providerNote = result.providerNote;
|
|
357
|
+
suggestedExt = result.suggestedExt;
|
|
358
|
+
}
|
|
359
|
+
else if (def.provider === 'elevenlabs'
|
|
360
|
+
&& surface === 'audio'
|
|
361
|
+
&& ctx.audioKind === 'speech') {
|
|
362
|
+
const result = await renderElevenLabsTTS(ctx, credentials);
|
|
363
|
+
bytes = result.bytes;
|
|
364
|
+
providerNote = result.providerNote;
|
|
365
|
+
suggestedExt = result.suggestedExt;
|
|
366
|
+
}
|
|
367
|
+
else if (def.provider === 'elevenlabs'
|
|
368
|
+
&& surface === 'audio'
|
|
369
|
+
&& ctx.audioKind === 'sfx') {
|
|
370
|
+
const result = await renderElevenLabsSfx(ctx, credentials);
|
|
371
|
+
bytes = result.bytes;
|
|
372
|
+
providerNote = result.providerNote;
|
|
373
|
+
suggestedExt = result.suggestedExt;
|
|
374
|
+
}
|
|
375
|
+
else if (def.provider === 'hyperframes' && surface === 'video') {
|
|
376
|
+
// HyperFrames is templated by the agent (it reads the vendored
|
|
377
|
+
// skill at skills/hyperframes/SKILL.md and writes a composition
|
|
378
|
+
// HTML based on the user's prompt). But the actual `npx
|
|
379
|
+
// hyperframes render` step runs HERE in the daemon process, not
|
|
380
|
+
// in the agent's shell. Reason: the agent's shell on macOS
|
|
381
|
+
// (Claude Code in particular) is wrapped in `sandbox-exec`, and
|
|
382
|
+
// puppeteer's Chrome subprocess hangs partway through frame
|
|
383
|
+
// capture under that sandbox. The daemon process is unsandboxed,
|
|
384
|
+
// so puppeteer behaves correctly. Agent-side npx is reserved for
|
|
385
|
+
// the lighter HF subcommands (lint, transcribe, tts) that don't
|
|
386
|
+
// need to spawn Chrome.
|
|
387
|
+
const result = await renderHyperFramesViaCli(ctx, dir, args.onProgress);
|
|
388
|
+
bytes = result.bytes;
|
|
389
|
+
providerNote = result.providerNote;
|
|
390
|
+
suggestedExt = result.suggestedExt;
|
|
391
|
+
}
|
|
392
|
+
else if (def.provider === 'minimax' && surface === 'audio') {
|
|
393
|
+
const result = await renderMinimaxTTS(ctx, credentials);
|
|
394
|
+
bytes = result.bytes;
|
|
395
|
+
providerNote = result.providerNote;
|
|
396
|
+
suggestedExt = result.suggestedExt;
|
|
397
|
+
}
|
|
398
|
+
else if (def.provider === 'senseaudio' && surface === 'audio') {
|
|
399
|
+
const result = await renderSenseAudioTTS(ctx, credentials);
|
|
400
|
+
bytes = result.bytes;
|
|
401
|
+
providerNote = result.providerNote;
|
|
402
|
+
suggestedExt = result.suggestedExt;
|
|
403
|
+
}
|
|
404
|
+
else if (def.provider === 'fishaudio' && surface === 'audio') {
|
|
405
|
+
const result = await renderFishAudioTTS(ctx, credentials);
|
|
406
|
+
bytes = result.bytes;
|
|
407
|
+
providerNote = result.providerNote;
|
|
408
|
+
suggestedExt = result.suggestedExt;
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
// No real renderer wired up for this (provider, surface). Gate the
|
|
412
|
+
// stub fallback behind OD_MEDIA_ALLOW_STUBS so release builds don't
|
|
413
|
+
// silently write placeholder bytes to disk and confuse the user.
|
|
414
|
+
if (!stubsAllowed()) {
|
|
415
|
+
throw new StubProviderDisabledError(model);
|
|
416
|
+
}
|
|
417
|
+
const result = await renderStub(ctx, safeOut);
|
|
418
|
+
bytes = result.bytes;
|
|
419
|
+
providerNote = result.providerNote;
|
|
420
|
+
intentionalStub = true;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
catch (err) {
|
|
424
|
+
// Stub-disabled errors are intentional — propagate so the daemon
|
|
425
|
+
// maps them to 503 and the CLI surfaces a clear "configure a real
|
|
426
|
+
// provider" message rather than writing fake bytes.
|
|
427
|
+
if (err instanceof StubProviderDisabledError) {
|
|
428
|
+
throw err;
|
|
429
|
+
}
|
|
430
|
+
// A real provider failed (network blip, 4xx, missing key, …). We
|
|
431
|
+
// still want to fall back to a stub so the agent's chat loop
|
|
432
|
+
// doesn't dead-end — but only when stubs are allowed for this
|
|
433
|
+
// build. Otherwise re-throw so the CLI exits non-zero with the
|
|
434
|
+
// real upstream message.
|
|
435
|
+
if (!stubsAllowed()) {
|
|
436
|
+
throw err;
|
|
437
|
+
}
|
|
438
|
+
const stub = await renderStub(ctx, safeOut);
|
|
439
|
+
bytes = stub.bytes;
|
|
440
|
+
const msg = errorMessage(err);
|
|
441
|
+
providerNote = `[${def.provider} error → stub] ${msg}`;
|
|
442
|
+
providerError = msg;
|
|
443
|
+
usedStubFallback = true;
|
|
444
|
+
// Also log to daemon stderr so the failure is visible in the daemon
|
|
445
|
+
// terminal — easiest place for the developer/operator to spot it.
|
|
446
|
+
try {
|
|
447
|
+
console.error(`[media] ${def.provider}/${surface}/${model} failed: ${msg}`);
|
|
448
|
+
}
|
|
449
|
+
catch {
|
|
450
|
+
// best-effort logging only
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// Tag the providerNote with `[stub]` only when the bytes actually came
|
|
454
|
+
// from the stub renderer — either as the intentional fallback for an
|
|
455
|
+
// unintegrated (provider, surface) pair, or because a real-provider
|
|
456
|
+
// call failed and we wrote a placeholder. Real-provider successes keep
|
|
457
|
+
// the renderer's own note (e.g. "openai/gpt-image-2 · 1:1 · 1.2 MB")
|
|
458
|
+
// untouched so the FileViewer toolbar shows the truth.
|
|
459
|
+
if (intentionalStub || usedStubFallback) {
|
|
460
|
+
providerNote = `[stub] ${providerNote}`;
|
|
461
|
+
}
|
|
462
|
+
// If the real provider returned a different extension than the
|
|
463
|
+
// requested filename, swap it. Saves the agent from having to guess
|
|
464
|
+
// (.png vs .jpg vs .webp) before it knows what the model emits.
|
|
465
|
+
let finalOut = safeOut;
|
|
466
|
+
if (suggestedExt) {
|
|
467
|
+
const dot = safeOut.lastIndexOf('.');
|
|
468
|
+
const stem = dot > 0 ? safeOut.slice(0, dot) : safeOut;
|
|
469
|
+
finalOut = `${stem}${suggestedExt}`;
|
|
470
|
+
}
|
|
471
|
+
const finalTarget = path.join(dir, finalOut);
|
|
472
|
+
await writeFile(finalTarget, bytes);
|
|
473
|
+
const st = await stat(finalTarget);
|
|
474
|
+
return {
|
|
475
|
+
name: finalOut,
|
|
476
|
+
size: st.size,
|
|
477
|
+
mtime: st.mtimeMs,
|
|
478
|
+
kind: kindFor(finalOut),
|
|
479
|
+
mime: mimeFor(finalOut),
|
|
480
|
+
model,
|
|
481
|
+
surface,
|
|
482
|
+
providerNote,
|
|
483
|
+
providerId: def.provider,
|
|
484
|
+
providerError,
|
|
485
|
+
usedStubFallback,
|
|
486
|
+
intentionalStub,
|
|
487
|
+
warnings,
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
function autoOutputName(surface, model, audioKind) {
|
|
491
|
+
const base = DEFAULT_OUTPUT_BY_SURFACE[surface] || 'artifact.bin';
|
|
492
|
+
const stamp = Date.now().toString(36);
|
|
493
|
+
// Slug the model id so the filename stays short and shell-safe.
|
|
494
|
+
const slug = String(model).toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 32);
|
|
495
|
+
const tag = surface === 'audio' && audioKind ? `${audioKind}-${slug}` : slug;
|
|
496
|
+
const dot = base.lastIndexOf('.');
|
|
497
|
+
const stem = dot > 0 ? base.slice(0, dot) : base;
|
|
498
|
+
const ext = dot > 0 ? base.slice(dot) : '';
|
|
499
|
+
return `${stem}-${tag}-${stamp}${ext}`;
|
|
500
|
+
}
|
|
501
|
+
function defaultAspectFor(surface) {
|
|
502
|
+
if (surface === 'image')
|
|
503
|
+
return '1:1';
|
|
504
|
+
if (surface === 'video')
|
|
505
|
+
return '16:9';
|
|
506
|
+
return undefined;
|
|
507
|
+
}
|
|
508
|
+
// ---------------------------------------------------------------------------
|
|
509
|
+
// Provider: OpenAI Images API (gpt-image-2, gpt-image-1.5, dall-e-3 …)
|
|
510
|
+
//
|
|
511
|
+
// We support both the canonical OpenAI endpoint AND Azure-hosted
|
|
512
|
+
// OpenAI deployments behind the same provider slot — Azure is detected
|
|
513
|
+
// from the base URL (`*.azure.com` host or a `/deployments/<name>`
|
|
514
|
+
// segment in the path). For Azure we additionally:
|
|
515
|
+
// * append `?api-version=…` (default 2024-02-01, unless the user has
|
|
516
|
+
// already encoded one into the base URL),
|
|
517
|
+
// * send the api-key header in addition to Authorization (Azure
|
|
518
|
+
// accepts either; some setups only honor api-key),
|
|
519
|
+
// * drop the `model` field from the body since the deployment in the
|
|
520
|
+
// path already names the model.
|
|
521
|
+
// ---------------------------------------------------------------------------
|
|
522
|
+
const AZURE_DEFAULT_API_VERSION = '2024-02-01';
|
|
523
|
+
const OPENAI_IMAGE_HEADERS_TIMEOUT_MS = 10 * 60 * 1000;
|
|
524
|
+
const OPENAI_IMAGE_BODY_TIMEOUT_MS = 10 * 60 * 1000;
|
|
525
|
+
const openAIImageDispatcher = new UndiciAgent({
|
|
526
|
+
headersTimeout: OPENAI_IMAGE_HEADERS_TIMEOUT_MS,
|
|
527
|
+
bodyTimeout: OPENAI_IMAGE_BODY_TIMEOUT_MS,
|
|
528
|
+
});
|
|
529
|
+
async function renderOpenAIImage(ctx, credentials) {
|
|
530
|
+
if (!credentials.apiKey) {
|
|
531
|
+
throw new Error('no OpenAI credential — configure an API key in Settings, set OPENAI_API_KEY, or refresh Codex/Hermes OAuth');
|
|
532
|
+
}
|
|
533
|
+
const rawBase = credentials.baseUrl || 'https://api.openai.com/v1';
|
|
534
|
+
const azure = detectAzureEndpoint(rawBase);
|
|
535
|
+
const url = buildOpenAIImageUrl(rawBase, azure);
|
|
536
|
+
const body = {
|
|
537
|
+
prompt: ctx.prompt || 'A high-quality reference image.',
|
|
538
|
+
n: 1,
|
|
539
|
+
size: openaiSizeFor(ctx.model, ctx.aspect),
|
|
540
|
+
};
|
|
541
|
+
// For non-Azure calls, include `model` in the body. Azure infers it
|
|
542
|
+
// from the deployment in the path so omitting it keeps payloads
|
|
543
|
+
// compatible across both flavors. The wire-name (post-alias) goes
|
|
544
|
+
// on the body so the user's alias from issue #1277 reaches the API.
|
|
545
|
+
if (!azure) {
|
|
546
|
+
body.model = ctx.wireModel;
|
|
547
|
+
}
|
|
548
|
+
// Capability branches key off the CATALOG id (not the alias) so a
|
|
549
|
+
// user who aliased `dall-e-3` to a custom Azure / proxy deployment
|
|
550
|
+
// still gets the DALL-E-specific quality + response_format flags
|
|
551
|
+
// (lefarcen + codex P2 on PR #1309).
|
|
552
|
+
if (ctx.model.startsWith('dall-e-')) {
|
|
553
|
+
body.response_format = 'b64_json';
|
|
554
|
+
body.quality = ctx.model === 'dall-e-3' ? 'hd' : 'standard';
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
// gpt-image-* accepts quality 'high' | 'medium' | 'low'.
|
|
558
|
+
body.quality = 'high';
|
|
559
|
+
}
|
|
560
|
+
const headers = {
|
|
561
|
+
'authorization': `Bearer ${credentials.apiKey}`,
|
|
562
|
+
'content-type': 'application/json',
|
|
563
|
+
};
|
|
564
|
+
if (azure) {
|
|
565
|
+
// Azure's canonical auth header. Some deployments accept Bearer
|
|
566
|
+
// (the curl example we tested against does) but api-key is what
|
|
567
|
+
// their docs document, so send both. OpenAI ignores unknown
|
|
568
|
+
// headers, so this is harmless on the standard endpoint too.
|
|
569
|
+
headers['api-key'] = credentials.apiKey;
|
|
570
|
+
}
|
|
571
|
+
const resp = await fetch(url, {
|
|
572
|
+
method: 'POST',
|
|
573
|
+
headers,
|
|
574
|
+
body: JSON.stringify(body),
|
|
575
|
+
dispatcher: openAIImageDispatcher,
|
|
576
|
+
});
|
|
577
|
+
const text = await resp.text();
|
|
578
|
+
if (!resp.ok) {
|
|
579
|
+
const tag = azure ? 'azure-openai' : 'openai';
|
|
580
|
+
throw new Error(`${tag} ${resp.status}: ${truncate(text, 240)}`);
|
|
581
|
+
}
|
|
582
|
+
let data;
|
|
583
|
+
try {
|
|
584
|
+
data = JSON.parse(text);
|
|
585
|
+
}
|
|
586
|
+
catch {
|
|
587
|
+
throw new Error(`openai non-JSON response: ${truncate(text, 200)}`);
|
|
588
|
+
}
|
|
589
|
+
const entry = data && Array.isArray(data.data) ? data.data[0] : null;
|
|
590
|
+
if (!entry)
|
|
591
|
+
throw new Error('openai response had no data[0]');
|
|
592
|
+
let bytes;
|
|
593
|
+
if (entry.b64_json) {
|
|
594
|
+
bytes = Buffer.from(entry.b64_json, 'base64');
|
|
595
|
+
}
|
|
596
|
+
else if (entry.url) {
|
|
597
|
+
const imgResp = await fetch(entry.url);
|
|
598
|
+
if (!imgResp.ok)
|
|
599
|
+
throw new Error(`openai image fetch ${imgResp.status}`);
|
|
600
|
+
const arr = await imgResp.arrayBuffer();
|
|
601
|
+
bytes = Buffer.from(arr);
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
throw new Error('openai response had neither b64_json nor url');
|
|
605
|
+
}
|
|
606
|
+
const tag = azure ? 'azure-openai' : 'openai';
|
|
607
|
+
return {
|
|
608
|
+
bytes,
|
|
609
|
+
providerNote: `${tag}/${ctx.wireModel} · ${ctx.aspect} · ${bytes.length} bytes`,
|
|
610
|
+
suggestedExt: '.png',
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Heuristic: do we think this base URL points at an Azure OpenAI
|
|
615
|
+
* deployment rather than the public OpenAI API?
|
|
616
|
+
*
|
|
617
|
+
* true examples
|
|
618
|
+
* https://x.cognitiveservices.azure.com/openai/deployments/gpt-image-2
|
|
619
|
+
* https://x.openai.azure.com/openai/deployments/foo
|
|
620
|
+
* /openai/deployments/foo?api-version=2024-02-01
|
|
621
|
+
* false examples
|
|
622
|
+
* https://api.openai.com/v1
|
|
623
|
+
* http://localhost:8080/v1
|
|
624
|
+
*/
|
|
625
|
+
function detectAzureEndpoint(baseUrl) {
|
|
626
|
+
if (typeof baseUrl !== 'string' || !baseUrl)
|
|
627
|
+
return false;
|
|
628
|
+
if (/\.azure\.com\b/i.test(baseUrl))
|
|
629
|
+
return true;
|
|
630
|
+
if (/\/openai\/deployments\//i.test(baseUrl))
|
|
631
|
+
return true;
|
|
632
|
+
return false;
|
|
633
|
+
}
|
|
634
|
+
/**
|
|
635
|
+
* Build the full /images/generations URL, preserving any user-supplied
|
|
636
|
+
* query string (e.g. an explicit `?api-version=2024-12-01`) and
|
|
637
|
+
* appending the default api-version for Azure when the user didn't
|
|
638
|
+
* specify one. Returns a string ready for `fetch`.
|
|
639
|
+
*/
|
|
640
|
+
function buildOpenAIImageUrl(baseUrl, isAzure) {
|
|
641
|
+
let parsed;
|
|
642
|
+
try {
|
|
643
|
+
parsed = new URL(baseUrl);
|
|
644
|
+
}
|
|
645
|
+
catch {
|
|
646
|
+
// Bad URL — fall back to naive concat so the upstream error is
|
|
647
|
+
// surfaced through the normal HTTP path rather than a parse crash.
|
|
648
|
+
const stripped = baseUrl.replace(/\/$/, '');
|
|
649
|
+
return `${stripped}/images/generations`;
|
|
650
|
+
}
|
|
651
|
+
parsed.pathname = parsed.pathname.replace(/\/+$/, '') + '/images/generations';
|
|
652
|
+
if (isAzure && !parsed.searchParams.has('api-version')) {
|
|
653
|
+
parsed.searchParams.set('api-version', AZURE_DEFAULT_API_VERSION);
|
|
654
|
+
}
|
|
655
|
+
return parsed.toString();
|
|
656
|
+
}
|
|
657
|
+
function openaiSizeFor(model, aspect) {
|
|
658
|
+
// gpt-image-1.5 / gpt-image-2 accept arbitrary sizes up to 4096; we
|
|
659
|
+
// pick concrete ones tuned to common aspects so the API never
|
|
660
|
+
// negotiates them down silently.
|
|
661
|
+
if (model.startsWith('gpt-image-')) {
|
|
662
|
+
if (aspect === '16:9')
|
|
663
|
+
return '1792x1024';
|
|
664
|
+
if (aspect === '9:16')
|
|
665
|
+
return '1024x1792';
|
|
666
|
+
if (aspect === '4:3')
|
|
667
|
+
return '1408x1056';
|
|
668
|
+
if (aspect === '3:4')
|
|
669
|
+
return '1056x1408';
|
|
670
|
+
return '1024x1024';
|
|
671
|
+
}
|
|
672
|
+
if (model === 'dall-e-3') {
|
|
673
|
+
if (aspect === '16:9')
|
|
674
|
+
return '1792x1024';
|
|
675
|
+
if (aspect === '9:16')
|
|
676
|
+
return '1024x1792';
|
|
677
|
+
return '1024x1024';
|
|
678
|
+
}
|
|
679
|
+
// dall-e-2 only supports 256/512/1024 squares.
|
|
680
|
+
return '1024x1024';
|
|
681
|
+
}
|
|
682
|
+
const OPENAI_TTS_VOICES = new Set([
|
|
683
|
+
'alloy',
|
|
684
|
+
'ash',
|
|
685
|
+
'ballad',
|
|
686
|
+
'coral',
|
|
687
|
+
'echo',
|
|
688
|
+
'fable',
|
|
689
|
+
'onyx',
|
|
690
|
+
'nova',
|
|
691
|
+
'sage',
|
|
692
|
+
'shimmer',
|
|
693
|
+
'verse',
|
|
694
|
+
]);
|
|
695
|
+
function buildOpenAISpeechUrl(baseUrl, isAzure) {
|
|
696
|
+
let parsed;
|
|
697
|
+
try {
|
|
698
|
+
parsed = new URL(baseUrl);
|
|
699
|
+
}
|
|
700
|
+
catch {
|
|
701
|
+
const stripped = baseUrl.replace(/\/$/, '');
|
|
702
|
+
return `${stripped}/audio/speech`;
|
|
703
|
+
}
|
|
704
|
+
parsed.pathname = parsed.pathname.replace(/\/+$/, '') + '/audio/speech';
|
|
705
|
+
if (isAzure && !parsed.searchParams.has('api-version')) {
|
|
706
|
+
parsed.searchParams.set('api-version', AZURE_DEFAULT_API_VERSION);
|
|
707
|
+
}
|
|
708
|
+
return parsed.toString();
|
|
709
|
+
}
|
|
710
|
+
function openaiSpeechFormatFor(fileName) {
|
|
711
|
+
const ext = path.extname(fileName).toLowerCase();
|
|
712
|
+
if (ext === '.wav')
|
|
713
|
+
return 'wav';
|
|
714
|
+
if (ext === '.flac')
|
|
715
|
+
return 'flac';
|
|
716
|
+
if (ext === '.aac')
|
|
717
|
+
return 'aac';
|
|
718
|
+
if (ext === '.opus' || ext === '.ogg' || ext === '.oga')
|
|
719
|
+
return 'opus';
|
|
720
|
+
return 'mp3';
|
|
721
|
+
}
|
|
722
|
+
async function renderOpenAISpeech(ctx, credentials, fileName) {
|
|
723
|
+
if (!credentials.apiKey) {
|
|
724
|
+
throw new Error('no OpenAI credential — configure an API key in Settings, set OPENAI_API_KEY, or refresh Codex/Hermes OAuth');
|
|
725
|
+
}
|
|
726
|
+
const rawBase = credentials.baseUrl || 'https://api.openai.com/v1';
|
|
727
|
+
const azure = detectAzureEndpoint(rawBase);
|
|
728
|
+
const url = buildOpenAISpeechUrl(rawBase, azure);
|
|
729
|
+
const format = openaiSpeechFormatFor(fileName);
|
|
730
|
+
const text = (ctx.prompt && ctx.prompt.trim()) || 'This is a test.';
|
|
731
|
+
let voiceId = 'alloy';
|
|
732
|
+
let instructions = '';
|
|
733
|
+
const requestedVoice = (ctx.voice && ctx.voice.trim()) || '';
|
|
734
|
+
if (requestedVoice) {
|
|
735
|
+
if (OPENAI_TTS_VOICES.has(requestedVoice)) {
|
|
736
|
+
voiceId = requestedVoice;
|
|
737
|
+
}
|
|
738
|
+
else {
|
|
739
|
+
// gpt-4o-mini-tts accepts free-form speaking style instructions.
|
|
740
|
+
// If the UI metadata carries prose rather than a concrete voice id,
|
|
741
|
+
// preserve it here instead of surfacing a provider error.
|
|
742
|
+
instructions = requestedVoice;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
const body = {
|
|
746
|
+
input: text,
|
|
747
|
+
voice: voiceId,
|
|
748
|
+
response_format: format,
|
|
749
|
+
};
|
|
750
|
+
if (!azure) {
|
|
751
|
+
body.model = ctx.wireModel;
|
|
752
|
+
}
|
|
753
|
+
if (instructions && ctx.model === 'gpt-4o-mini-tts') {
|
|
754
|
+
body.instructions = instructions;
|
|
755
|
+
}
|
|
756
|
+
const headers = {
|
|
757
|
+
authorization: `Bearer ${credentials.apiKey}`,
|
|
758
|
+
'content-type': 'application/json',
|
|
759
|
+
};
|
|
760
|
+
if (azure) {
|
|
761
|
+
headers['api-key'] = credentials.apiKey;
|
|
762
|
+
}
|
|
763
|
+
const resp = await fetch(url, {
|
|
764
|
+
method: 'POST',
|
|
765
|
+
headers,
|
|
766
|
+
body: JSON.stringify(body),
|
|
767
|
+
});
|
|
768
|
+
if (!resp.ok) {
|
|
769
|
+
const text = await resp.text();
|
|
770
|
+
const tag = azure ? 'azure-openai' : 'openai';
|
|
771
|
+
throw new Error(`${tag} speech ${resp.status}: ${truncate(text, 240)}`);
|
|
772
|
+
}
|
|
773
|
+
const arr = await resp.arrayBuffer();
|
|
774
|
+
const bytes = Buffer.from(arr);
|
|
775
|
+
if (bytes.length === 0) {
|
|
776
|
+
throw new Error('openai speech returned zero bytes');
|
|
777
|
+
}
|
|
778
|
+
const tag = azure ? 'azure-openai' : 'openai';
|
|
779
|
+
const noteBits = [`${tag}/${ctx.wireModel}`, voiceId, `${format}`, `${bytes.length} bytes`];
|
|
780
|
+
if (instructions)
|
|
781
|
+
noteBits.splice(2, 0, 'styled');
|
|
782
|
+
return {
|
|
783
|
+
bytes,
|
|
784
|
+
providerNote: noteBits.join(' · '),
|
|
785
|
+
suggestedExt: format === 'opus' ? '.ogg' : `.${format}`,
|
|
786
|
+
};
|
|
787
|
+
}
|
|
788
|
+
// ---------------------------------------------------------------------------
|
|
789
|
+
// Provider: Volcengine Ark — Doubao Seedance 2.0 video.
|
|
790
|
+
//
|
|
791
|
+
// Docs:
|
|
792
|
+
// POST /api/v3/contents/generations/tasks → { id }
|
|
793
|
+
// GET /api/v3/contents/generations/tasks/{id} → { status, content: { video_url } }
|
|
794
|
+
// We submit, poll until succeeded/failed, then fetch the produced
|
|
795
|
+
// video_url and return the raw bytes. The temporary URL Volcengine
|
|
796
|
+
// returns is only valid for ~24h, so streaming the bytes into the
|
|
797
|
+
// project folder is required to keep them addressable.
|
|
798
|
+
// ---------------------------------------------------------------------------
|
|
799
|
+
async function renderVolcengineVideo(ctx, credentials, onProgress) {
|
|
800
|
+
if (!credentials.apiKey) {
|
|
801
|
+
throw new Error('no Volcengine Ark API key — configure it in Settings or set ARK_API_KEY');
|
|
802
|
+
}
|
|
803
|
+
const baseUrl = (credentials.baseUrl || 'https://ark.cn-beijing.volces.com/api/v3').replace(/\/$/, '');
|
|
804
|
+
// Seedance accepts inline `--resolution`, `--duration`, `--ratio` and
|
|
805
|
+
// `--camerafixed` flags inside the prompt text. We append a flags
|
|
806
|
+
// suffix so user prompts that already contain them still win.
|
|
807
|
+
const ratio = volcengineRatioFor(ctx.aspect);
|
|
808
|
+
const durationSec = ctx.length || 5;
|
|
809
|
+
const resolution = '720p';
|
|
810
|
+
const promptText = (ctx.prompt && ctx.prompt.trim()) || 'A short cinematic clip.';
|
|
811
|
+
const suffixFlags = [];
|
|
812
|
+
if (!/--resolution\b/.test(promptText))
|
|
813
|
+
suffixFlags.push(`--resolution ${resolution}`);
|
|
814
|
+
if (!/--duration\b/.test(promptText))
|
|
815
|
+
suffixFlags.push(`--duration ${durationSec}`);
|
|
816
|
+
if (!/--ratio\b/.test(promptText))
|
|
817
|
+
suffixFlags.push(`--ratio ${ratio}`);
|
|
818
|
+
const fullText = suffixFlags.length
|
|
819
|
+
? `${promptText} ${suffixFlags.join(' ')}`
|
|
820
|
+
: promptText;
|
|
821
|
+
// Seedance i2v (and seedance-2.0/-fast which support both modes)
|
|
822
|
+
// accept an additional `image_url` content entry — Volcengine treats
|
|
823
|
+
// it as the first frame and animates from there. We pass the data
|
|
824
|
+
// URL directly; the API does not require a public URL. When no
|
|
825
|
+
// image is provided, this is a regular t2v call.
|
|
826
|
+
const content = [{ type: 'text', text: fullText }];
|
|
827
|
+
if (ctx.imageRef && ctx.imageRef.dataUrl) {
|
|
828
|
+
content.push({
|
|
829
|
+
type: 'image_url',
|
|
830
|
+
image_url: { url: ctx.imageRef.dataUrl },
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
const taskBody = {
|
|
834
|
+
model: ctx.wireModel,
|
|
835
|
+
content,
|
|
836
|
+
};
|
|
837
|
+
const taskResp = await fetch(`${baseUrl}/contents/generations/tasks`, {
|
|
838
|
+
method: 'POST',
|
|
839
|
+
headers: {
|
|
840
|
+
'authorization': `Bearer ${credentials.apiKey}`,
|
|
841
|
+
'content-type': 'application/json',
|
|
842
|
+
},
|
|
843
|
+
body: JSON.stringify(taskBody),
|
|
844
|
+
});
|
|
845
|
+
const taskText = await taskResp.text();
|
|
846
|
+
if (!taskResp.ok) {
|
|
847
|
+
throw new Error(`volcengine task create ${taskResp.status}: ${truncate(taskText, 240)}`);
|
|
848
|
+
}
|
|
849
|
+
let taskData;
|
|
850
|
+
try {
|
|
851
|
+
taskData = JSON.parse(taskText);
|
|
852
|
+
}
|
|
853
|
+
catch {
|
|
854
|
+
throw new Error(`volcengine non-JSON: ${truncate(taskText, 200)}`);
|
|
855
|
+
}
|
|
856
|
+
const taskId = taskData && taskData.id;
|
|
857
|
+
if (!taskId)
|
|
858
|
+
throw new Error('volcengine task response missing id');
|
|
859
|
+
// Poll until succeeded/failed. Keep a hard cap, but make it long
|
|
860
|
+
// enough for real Seedance queues: fast t2v often returns in 30-120s,
|
|
861
|
+
// while i2v and busy-region t2v can exceed the old 6-minute ceiling.
|
|
862
|
+
const startedAt = Date.now();
|
|
863
|
+
const configuredMaxMs = Number(process.env.OD_VOLCENGINE_VIDEO_MAX_POLL_MS);
|
|
864
|
+
const maxMs = Number.isFinite(configuredMaxMs) && configuredMaxMs >= 60_000
|
|
865
|
+
? configuredMaxMs
|
|
866
|
+
: 12 * 60 * 1000;
|
|
867
|
+
let videoUrl = null;
|
|
868
|
+
let lastStatus = '';
|
|
869
|
+
// Emit a "task accepted" line right away so the agent's chat shows
|
|
870
|
+
// something within the first second instead of going silent for the
|
|
871
|
+
// full poll loop. cc's Bash tool considers a long-quiet pipe stuck
|
|
872
|
+
// and times out at ~2 minutes — Volcengine i2v routinely takes
|
|
873
|
+
// 3-5 minutes, so without this stream, every i2v dispatch dies
|
|
874
|
+
// mid-flight.
|
|
875
|
+
if (typeof onProgress === 'function') {
|
|
876
|
+
const mode = ctx.imageRef ? 'i2v' : 't2v';
|
|
877
|
+
onProgress(`volcengine ${mode} task ${taskId} accepted; polling status…`);
|
|
878
|
+
}
|
|
879
|
+
while (Date.now() - startedAt < maxMs) {
|
|
880
|
+
await sleep(4000);
|
|
881
|
+
const pollResp = await fetch(`${baseUrl}/contents/generations/tasks/${encodeURIComponent(taskId)}`, {
|
|
882
|
+
headers: { 'authorization': `Bearer ${credentials.apiKey}` },
|
|
883
|
+
});
|
|
884
|
+
const pollText = await pollResp.text();
|
|
885
|
+
if (!pollResp.ok) {
|
|
886
|
+
throw new Error(`volcengine poll ${pollResp.status}: ${truncate(pollText, 240)}`);
|
|
887
|
+
}
|
|
888
|
+
let pollData;
|
|
889
|
+
try {
|
|
890
|
+
pollData = JSON.parse(pollText);
|
|
891
|
+
}
|
|
892
|
+
catch {
|
|
893
|
+
throw new Error(`volcengine poll non-JSON: ${truncate(pollText, 200)}`);
|
|
894
|
+
}
|
|
895
|
+
lastStatus = pollData.status || '';
|
|
896
|
+
// Forward each poll tick. Heartbeat doubles as a "command is alive"
|
|
897
|
+
// signal for the agent's bash tool — the daemon's SSE stream emits
|
|
898
|
+
// an event for every line, which cc renders into the chat as live
|
|
899
|
+
// output so its watchdog never marks the call as hung.
|
|
900
|
+
if (typeof onProgress === 'function') {
|
|
901
|
+
const elapsedSec = Math.round((Date.now() - startedAt) / 1000);
|
|
902
|
+
onProgress(`volcengine task ${taskId} status=${lastStatus || 'pending'} (elapsed ${elapsedSec}s)`);
|
|
903
|
+
}
|
|
904
|
+
if (lastStatus === 'succeeded') {
|
|
905
|
+
videoUrl = pollData?.content?.video_url || null;
|
|
906
|
+
break;
|
|
907
|
+
}
|
|
908
|
+
if (lastStatus === 'failed' || lastStatus === 'cancelled') {
|
|
909
|
+
const reason = pollData?.error?.message || lastStatus;
|
|
910
|
+
throw new Error(`volcengine task ${lastStatus}: ${reason}`);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
if (!videoUrl) {
|
|
914
|
+
throw new Error(`volcengine task did not finish in time (last status: ${lastStatus || 'unknown'})`);
|
|
915
|
+
}
|
|
916
|
+
const dlResp = await fetch(videoUrl);
|
|
917
|
+
if (!dlResp.ok)
|
|
918
|
+
throw new Error(`volcengine video fetch ${dlResp.status}`);
|
|
919
|
+
const arr = await dlResp.arrayBuffer();
|
|
920
|
+
const bytes = Buffer.from(arr);
|
|
921
|
+
return {
|
|
922
|
+
bytes,
|
|
923
|
+
providerNote: `volcengine/${ctx.wireModel} · ${ratio} · ${durationSec}s · ${bytes.length} bytes`,
|
|
924
|
+
suggestedExt: '.mp4',
|
|
925
|
+
};
|
|
926
|
+
}
|
|
927
|
+
function volcengineRatioFor(aspect) {
|
|
928
|
+
// Seedance accepts a fixed list of ratios; map the OD vocabulary to
|
|
929
|
+
// its canonical strings.
|
|
930
|
+
if (!aspect)
|
|
931
|
+
return '16:9';
|
|
932
|
+
if (aspect === '1:1' || aspect === '16:9' || aspect === '9:16' || aspect === '4:3' || aspect === '3:4') {
|
|
933
|
+
return aspect;
|
|
934
|
+
}
|
|
935
|
+
return '16:9';
|
|
936
|
+
}
|
|
937
|
+
// Volcengine Seedream / Seededit images. Same auth, different endpoint:
|
|
938
|
+
// POST /api/v3/images/generations (OpenAI-compatible payload).
|
|
939
|
+
async function renderVolcengineImage(ctx, credentials) {
|
|
940
|
+
if (!credentials.apiKey) {
|
|
941
|
+
throw new Error('no Volcengine Ark API key — configure it in Settings or set ARK_API_KEY');
|
|
942
|
+
}
|
|
943
|
+
const baseUrl = (credentials.baseUrl || 'https://ark.cn-beijing.volces.com/api/v3').replace(/\/$/, '');
|
|
944
|
+
const body = {
|
|
945
|
+
model: ctx.wireModel,
|
|
946
|
+
prompt: ctx.prompt || 'A high-quality reference image.',
|
|
947
|
+
response_format: 'b64_json',
|
|
948
|
+
// openaiSizeFor branches on the catalog id (gpt-image-* vs dall-e-*
|
|
949
|
+
// accept different size enums), so it must NOT see the post-alias
|
|
950
|
+
// wire name. lefarcen + codex P2 on PR #1309.
|
|
951
|
+
size: openaiSizeFor(ctx.model, ctx.aspect),
|
|
952
|
+
};
|
|
953
|
+
const resp = await fetch(`${baseUrl}/images/generations`, {
|
|
954
|
+
method: 'POST',
|
|
955
|
+
headers: {
|
|
956
|
+
'authorization': `Bearer ${credentials.apiKey}`,
|
|
957
|
+
'content-type': 'application/json',
|
|
958
|
+
},
|
|
959
|
+
body: JSON.stringify(body),
|
|
960
|
+
});
|
|
961
|
+
const text = await resp.text();
|
|
962
|
+
if (!resp.ok) {
|
|
963
|
+
throw new Error(`volcengine image ${resp.status}: ${truncate(text, 240)}`);
|
|
964
|
+
}
|
|
965
|
+
let data;
|
|
966
|
+
try {
|
|
967
|
+
data = JSON.parse(text);
|
|
968
|
+
}
|
|
969
|
+
catch {
|
|
970
|
+
throw new Error(`volcengine image non-JSON: ${truncate(text, 200)}`);
|
|
971
|
+
}
|
|
972
|
+
const entry = data && Array.isArray(data.data) ? data.data[0] : null;
|
|
973
|
+
if (!entry)
|
|
974
|
+
throw new Error('volcengine image response had no data[0]');
|
|
975
|
+
let bytes;
|
|
976
|
+
if (entry.b64_json) {
|
|
977
|
+
bytes = Buffer.from(entry.b64_json, 'base64');
|
|
978
|
+
}
|
|
979
|
+
else if (entry.url) {
|
|
980
|
+
const imgResp = await fetch(entry.url);
|
|
981
|
+
if (!imgResp.ok)
|
|
982
|
+
throw new Error(`volcengine image fetch ${imgResp.status}`);
|
|
983
|
+
bytes = Buffer.from(await imgResp.arrayBuffer());
|
|
984
|
+
}
|
|
985
|
+
else {
|
|
986
|
+
throw new Error('volcengine image response missing b64_json/url');
|
|
987
|
+
}
|
|
988
|
+
return {
|
|
989
|
+
bytes,
|
|
990
|
+
providerNote: `volcengine/${ctx.wireModel} · ${ctx.aspect} · ${bytes.length} bytes`,
|
|
991
|
+
suggestedExt: '.png',
|
|
992
|
+
};
|
|
993
|
+
}
|
|
994
|
+
// ---------------------------------------------------------------------------
|
|
995
|
+
// Provider: xAI Grok Imagine.
|
|
996
|
+
//
|
|
997
|
+
// Docs: https://docs.x.ai/developers/model-capabilities/{images,video}/generation
|
|
998
|
+
// * Image: POST /v1/images/generations — synchronous, returns
|
|
999
|
+
// {data:[{b64_json|url}]}; we ask for b64_json so the bytes
|
|
1000
|
+
// arrive in one round-trip.
|
|
1001
|
+
// * Video: POST /v1/videos/generations — may return the finished video
|
|
1002
|
+
// inline ({status:'done', video:{url}}) or an async stub
|
|
1003
|
+
// ({id, status:'pending'}); in the async case we poll
|
|
1004
|
+
// GET /v1/videos/{id} until status flips to done/failed.
|
|
1005
|
+
//
|
|
1006
|
+
// xAI's video model produces native audio (background music + SFX +
|
|
1007
|
+
// ambient) synchronised with the visual; that's the headline
|
|
1008
|
+
// differentiator vs Seedance and Sora and is why grok-imagine-video
|
|
1009
|
+
// declares the `audio` capability.
|
|
1010
|
+
// ---------------------------------------------------------------------------
|
|
1011
|
+
async function renderGrokImage(ctx, credentials) {
|
|
1012
|
+
if (!credentials.apiKey) {
|
|
1013
|
+
throw new Error('no xAI API key — configure it in Settings or set XAI_API_KEY');
|
|
1014
|
+
}
|
|
1015
|
+
const baseUrl = (credentials.baseUrl || 'https://api.x.ai/v1').replace(/\/$/, '');
|
|
1016
|
+
const aspectRatio = grokAspectFor(ctx.aspect);
|
|
1017
|
+
const body = {
|
|
1018
|
+
model: ctx.wireModel,
|
|
1019
|
+
prompt: ctx.prompt || 'A high-quality reference image.',
|
|
1020
|
+
n: 1,
|
|
1021
|
+
aspect_ratio: aspectRatio,
|
|
1022
|
+
response_format: 'b64_json',
|
|
1023
|
+
};
|
|
1024
|
+
const resp = await fetch(`${baseUrl}/images/generations`, {
|
|
1025
|
+
method: 'POST',
|
|
1026
|
+
headers: {
|
|
1027
|
+
'authorization': `Bearer ${credentials.apiKey}`,
|
|
1028
|
+
'content-type': 'application/json',
|
|
1029
|
+
},
|
|
1030
|
+
body: JSON.stringify(body),
|
|
1031
|
+
});
|
|
1032
|
+
const text = await resp.text();
|
|
1033
|
+
if (!resp.ok) {
|
|
1034
|
+
throw new Error(`grok image ${resp.status}: ${truncate(text, 240)}`);
|
|
1035
|
+
}
|
|
1036
|
+
let data;
|
|
1037
|
+
try {
|
|
1038
|
+
data = JSON.parse(text);
|
|
1039
|
+
}
|
|
1040
|
+
catch {
|
|
1041
|
+
throw new Error(`grok image non-JSON: ${truncate(text, 200)}`);
|
|
1042
|
+
}
|
|
1043
|
+
const entry = data && Array.isArray(data.data) ? data.data[0] : null;
|
|
1044
|
+
if (!entry)
|
|
1045
|
+
throw new Error('grok image response had no data[0]');
|
|
1046
|
+
let bytes;
|
|
1047
|
+
if (entry.b64_json) {
|
|
1048
|
+
bytes = Buffer.from(entry.b64_json, 'base64');
|
|
1049
|
+
}
|
|
1050
|
+
else if (entry.url) {
|
|
1051
|
+
const imgResp = await fetch(entry.url);
|
|
1052
|
+
if (!imgResp.ok)
|
|
1053
|
+
throw new Error(`grok image fetch ${imgResp.status}`);
|
|
1054
|
+
bytes = Buffer.from(await imgResp.arrayBuffer());
|
|
1055
|
+
}
|
|
1056
|
+
else {
|
|
1057
|
+
throw new Error('grok image response missing b64_json/url');
|
|
1058
|
+
}
|
|
1059
|
+
// xAI's Imagine returns JPEG by default (no format option in the API
|
|
1060
|
+
// surface), but PNG/WebP are technically possible. Sniff the magic
|
|
1061
|
+
// bytes so the on-disk extension matches reality — saving JPEG bytes
|
|
1062
|
+
// as `.png` confuses Finder previews and any downstream consumer that
|
|
1063
|
+
// trusts the extension.
|
|
1064
|
+
return {
|
|
1065
|
+
bytes,
|
|
1066
|
+
providerNote: `grok/${ctx.wireModel} · ${aspectRatio} · ${bytes.length} bytes`,
|
|
1067
|
+
suggestedExt: sniffImageExt(bytes),
|
|
1068
|
+
};
|
|
1069
|
+
}
|
|
1070
|
+
async function renderNanoBananaImage(ctx, credentials) {
|
|
1071
|
+
if (!credentials.apiKey) {
|
|
1072
|
+
throw new Error('no Nano Banana API key — configure it in Settings or set OD_NANOBANANA_API_KEY');
|
|
1073
|
+
}
|
|
1074
|
+
const baseUrl = (credentials.baseUrl || NANOBANANA_DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
1075
|
+
const wireModel = (credentials.model || ctx.wireModel || NANOBANANA_DEFAULT_MODEL).trim();
|
|
1076
|
+
const body = {
|
|
1077
|
+
contents: [{
|
|
1078
|
+
parts: [{
|
|
1079
|
+
text: ctx.prompt || 'A high-quality reference image.',
|
|
1080
|
+
}],
|
|
1081
|
+
}],
|
|
1082
|
+
generationConfig: {
|
|
1083
|
+
responseModalities: ['IMAGE'],
|
|
1084
|
+
imageConfig: {
|
|
1085
|
+
aspectRatio: nanoBananaAspectFor(ctx.aspect),
|
|
1086
|
+
imageSize: NANOBANANA_DEFAULT_IMAGE_SIZE,
|
|
1087
|
+
},
|
|
1088
|
+
},
|
|
1089
|
+
};
|
|
1090
|
+
const resp = await fetch(`${baseUrl}/v1beta/models/${encodeURIComponent(wireModel)}:generateContent`, {
|
|
1091
|
+
method: 'POST',
|
|
1092
|
+
headers: nanoBananaHeaders(baseUrl, credentials.apiKey),
|
|
1093
|
+
body: JSON.stringify(body),
|
|
1094
|
+
});
|
|
1095
|
+
const text = await resp.text();
|
|
1096
|
+
if (!resp.ok) {
|
|
1097
|
+
throw new Error(`nano-banana image ${resp.status}: ${truncate(text, 240)}`);
|
|
1098
|
+
}
|
|
1099
|
+
let data;
|
|
1100
|
+
try {
|
|
1101
|
+
data = JSON.parse(text);
|
|
1102
|
+
}
|
|
1103
|
+
catch {
|
|
1104
|
+
throw new Error(`nano-banana image non-JSON: ${truncate(text, 200)}`);
|
|
1105
|
+
}
|
|
1106
|
+
const bytes = inlineImageBytesFromGenerateContent(data);
|
|
1107
|
+
return {
|
|
1108
|
+
bytes,
|
|
1109
|
+
providerNote: `nano-banana/${wireModel} · ${nanoBananaAspectFor(ctx.aspect)} · ${NANOBANANA_DEFAULT_IMAGE_SIZE} · ${bytes.length} bytes`,
|
|
1110
|
+
suggestedExt: sniffImageExt(bytes),
|
|
1111
|
+
};
|
|
1112
|
+
}
|
|
1113
|
+
function nanoBananaHeaders(baseUrl, apiKey) {
|
|
1114
|
+
const headers = {
|
|
1115
|
+
'content-type': 'application/json',
|
|
1116
|
+
};
|
|
1117
|
+
if (usesOfficialGoogleApiKeyHeader(baseUrl)) {
|
|
1118
|
+
headers['x-goog-api-key'] = apiKey;
|
|
1119
|
+
return headers;
|
|
1120
|
+
}
|
|
1121
|
+
headers.authorization = `Bearer ${apiKey}`;
|
|
1122
|
+
return headers;
|
|
1123
|
+
}
|
|
1124
|
+
function usesOfficialGoogleApiKeyHeader(baseUrl) {
|
|
1125
|
+
try {
|
|
1126
|
+
const url = new URL(baseUrl);
|
|
1127
|
+
return url.hostname === 'generativelanguage.googleapis.com';
|
|
1128
|
+
}
|
|
1129
|
+
catch {
|
|
1130
|
+
return false;
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
function nanoBananaAspectFor(aspect) {
|
|
1134
|
+
if (aspect === '1:1'
|
|
1135
|
+
|| aspect === '16:9'
|
|
1136
|
+
|| aspect === '9:16'
|
|
1137
|
+
|| aspect === '4:3'
|
|
1138
|
+
|| aspect === '3:4') {
|
|
1139
|
+
return aspect;
|
|
1140
|
+
}
|
|
1141
|
+
return '1:1';
|
|
1142
|
+
}
|
|
1143
|
+
function inlineImageBytesFromGenerateContent(data) {
|
|
1144
|
+
const candidates = Array.isArray(data?.candidates) ? data.candidates : [];
|
|
1145
|
+
for (const candidate of candidates) {
|
|
1146
|
+
const parts = Array.isArray(candidate?.content?.parts) ? candidate.content.parts : [];
|
|
1147
|
+
for (const part of parts) {
|
|
1148
|
+
const inline = part?.inlineData;
|
|
1149
|
+
if (typeof inline?.data === 'string' && inline.data) {
|
|
1150
|
+
return Buffer.from(inline.data, 'base64');
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
throw new Error('nano-banana image response missing candidates[].content.parts[].inlineData.data');
|
|
1155
|
+
}
|
|
1156
|
+
function sniffImageExt(bytes) {
|
|
1157
|
+
if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {
|
|
1158
|
+
return '.jpg';
|
|
1159
|
+
}
|
|
1160
|
+
if (bytes.length >= 8
|
|
1161
|
+
&& bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {
|
|
1162
|
+
return '.png';
|
|
1163
|
+
}
|
|
1164
|
+
if (bytes.length >= 12
|
|
1165
|
+
&& bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46
|
|
1166
|
+
&& bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50) {
|
|
1167
|
+
return '.webp';
|
|
1168
|
+
}
|
|
1169
|
+
return '.png';
|
|
1170
|
+
}
|
|
1171
|
+
async function renderLeonardoImage(ctx, credentials) {
|
|
1172
|
+
if (!credentials.apiKey) {
|
|
1173
|
+
throw new Error('no Leonardo.ai API key — configure it in Settings or set LEONARDO_API_KEY');
|
|
1174
|
+
}
|
|
1175
|
+
const baseUrl = (credentials.baseUrl || 'https://cloud.leonardo.ai/api/rest/v1').replace(/\/$/, '');
|
|
1176
|
+
// Map model IDs to Leonardo.ai platform model IDs
|
|
1177
|
+
const modelMap = {
|
|
1178
|
+
'leonardo-phoenix': '6b645e3a-d64f-4341-a6d8-7a3690fbf042', // Phoenix
|
|
1179
|
+
'leonardo-kino-xl': 'aa77f04e-3eec-4034-9c07-d0f619684628', // Kino XL
|
|
1180
|
+
'leonardo-flux-dev': 'b2614463-296c-462a-9586-aafdb8f00e36', // FLUX.1 [dev]
|
|
1181
|
+
'leonardo-flux-schnell': '1dd50843-d653-4516-a8e3-f0238ee453ff', // FLUX.1 [schnell]
|
|
1182
|
+
'leonardo-anime-pastel': '1e60896f-3c26-4296-8ecc-53e2afecc132', // Anime Pastel Dream
|
|
1183
|
+
};
|
|
1184
|
+
const platformModelId = modelMap[ctx.model];
|
|
1185
|
+
if (!platformModelId) {
|
|
1186
|
+
throw new Error(`unsupported leonardo.ai model: ${ctx.model}`);
|
|
1187
|
+
}
|
|
1188
|
+
// Map aspect ratios to Leonardo.ai dimensions
|
|
1189
|
+
const aspectMap = {
|
|
1190
|
+
'1:1': { width: 1024, height: 1024 },
|
|
1191
|
+
'16:9': { width: 1344, height: 768 },
|
|
1192
|
+
'9:16': { width: 768, height: 1344 },
|
|
1193
|
+
'4:3': { width: 1152, height: 896 },
|
|
1194
|
+
'3:4': { width: 896, height: 1152 },
|
|
1195
|
+
};
|
|
1196
|
+
const size = (ctx.aspect ? aspectMap[ctx.aspect] : undefined) || { width: 1024, height: 1024 };
|
|
1197
|
+
// Submit generation request. Phoenix and the FLUX family require the
|
|
1198
|
+
// `contrast` field per Leonardo's API reference; valid values are
|
|
1199
|
+
// 3 (Low) / 3.5 (Medium) / 4 (High). Default to 3.5 so prompts that
|
|
1200
|
+
// omit a contrast hint fall in the middle of the supported range.
|
|
1201
|
+
const requiresContrast = ctx.model === 'leonardo-phoenix'
|
|
1202
|
+
|| ctx.model === 'leonardo-flux-dev'
|
|
1203
|
+
|| ctx.model === 'leonardo-flux-schnell';
|
|
1204
|
+
const body = {
|
|
1205
|
+
prompt: ctx.prompt || 'A high-quality reference image.',
|
|
1206
|
+
modelId: platformModelId,
|
|
1207
|
+
width: size.width,
|
|
1208
|
+
height: size.height,
|
|
1209
|
+
num_images: 1,
|
|
1210
|
+
...(requiresContrast ? { contrast: 3.5 } : {}),
|
|
1211
|
+
};
|
|
1212
|
+
const submitResp = await fetch(`${baseUrl}/generations`, {
|
|
1213
|
+
method: 'POST',
|
|
1214
|
+
headers: {
|
|
1215
|
+
'authorization': `Bearer ${credentials.apiKey}`,
|
|
1216
|
+
'content-type': 'application/json',
|
|
1217
|
+
},
|
|
1218
|
+
body: JSON.stringify(body),
|
|
1219
|
+
});
|
|
1220
|
+
const submitText = await submitResp.text();
|
|
1221
|
+
if (!submitResp.ok) {
|
|
1222
|
+
throw new Error(`leonardo.ai submit ${submitResp.status}: ${truncate(submitText, 240)}`);
|
|
1223
|
+
}
|
|
1224
|
+
let submitData;
|
|
1225
|
+
try {
|
|
1226
|
+
submitData = JSON.parse(submitText);
|
|
1227
|
+
}
|
|
1228
|
+
catch {
|
|
1229
|
+
throw new Error(`leonardo.ai non-JSON: ${truncate(submitText, 200)}`);
|
|
1230
|
+
}
|
|
1231
|
+
const generationId = submitData?.sdGenerationJob?.generationId;
|
|
1232
|
+
if (!generationId) {
|
|
1233
|
+
throw new Error('leonardo.ai response missing generationId');
|
|
1234
|
+
}
|
|
1235
|
+
// Poll for completion
|
|
1236
|
+
const maxPollMs = 120000; // 2 minutes
|
|
1237
|
+
const pollIntervalMs = 2000; // 2 seconds
|
|
1238
|
+
const startedAt = Date.now();
|
|
1239
|
+
let imageUrl = null;
|
|
1240
|
+
while (Date.now() - startedAt < maxPollMs) {
|
|
1241
|
+
await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
|
|
1242
|
+
const pollResp = await fetch(`${baseUrl}/generations/${generationId}`, {
|
|
1243
|
+
headers: {
|
|
1244
|
+
'authorization': `Bearer ${credentials.apiKey}`,
|
|
1245
|
+
},
|
|
1246
|
+
});
|
|
1247
|
+
if (!pollResp.ok) {
|
|
1248
|
+
throw new Error(`leonardo.ai poll ${pollResp.status}`);
|
|
1249
|
+
}
|
|
1250
|
+
const pollData = (await pollResp.json());
|
|
1251
|
+
const generation = pollData?.generations_by_pk;
|
|
1252
|
+
if (generation?.status === 'COMPLETE') {
|
|
1253
|
+
const images = generation?.generated_images;
|
|
1254
|
+
if (Array.isArray(images) && images.length > 0) {
|
|
1255
|
+
imageUrl = images[0]?.url;
|
|
1256
|
+
break;
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
else if (generation?.status === 'FAILED') {
|
|
1260
|
+
throw new Error('leonardo.ai generation failed');
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
if (!imageUrl) {
|
|
1264
|
+
throw new Error('leonardo.ai generation timed out after 2 minutes');
|
|
1265
|
+
}
|
|
1266
|
+
// Fetch the generated image
|
|
1267
|
+
const imgResp = await fetch(imageUrl);
|
|
1268
|
+
if (!imgResp.ok) {
|
|
1269
|
+
throw new Error(`leonardo.ai image fetch ${imgResp.status}`);
|
|
1270
|
+
}
|
|
1271
|
+
const bytes = Buffer.from(await imgResp.arrayBuffer());
|
|
1272
|
+
return {
|
|
1273
|
+
bytes,
|
|
1274
|
+
providerNote: `leonardo.ai/${ctx.model} · ${ctx.aspect} · ${bytes.length} bytes`,
|
|
1275
|
+
suggestedExt: sniffImageExt(bytes),
|
|
1276
|
+
};
|
|
1277
|
+
}
|
|
1278
|
+
async function renderGrokVideo(ctx, credentials, onProgress) {
|
|
1279
|
+
if (!credentials.apiKey) {
|
|
1280
|
+
throw new Error('no xAI API key — configure it in Settings or set XAI_API_KEY');
|
|
1281
|
+
}
|
|
1282
|
+
const baseUrl = (credentials.baseUrl || 'https://api.x.ai/v1').replace(/\/$/, '');
|
|
1283
|
+
// Grok caps duration at 15s. The dispatcher already clamps to
|
|
1284
|
+
// VIDEO_LENGTHS_SEC (which goes up to 30) — re-clamp here so a user
|
|
1285
|
+
// who picked 30 doesn't bounce off the upstream API with a 4xx.
|
|
1286
|
+
const requested = ctx.length || 5;
|
|
1287
|
+
const durationSec = Math.min(Math.max(requested, 1), 15);
|
|
1288
|
+
const aspectRatio = grokAspectFor(ctx.aspect);
|
|
1289
|
+
const body = {
|
|
1290
|
+
model: ctx.wireModel,
|
|
1291
|
+
prompt: ctx.prompt || 'A short cinematic clip.',
|
|
1292
|
+
duration: durationSec,
|
|
1293
|
+
aspect_ratio: aspectRatio,
|
|
1294
|
+
resolution: '720p',
|
|
1295
|
+
};
|
|
1296
|
+
if (ctx.imageRef && ctx.imageRef.dataUrl) {
|
|
1297
|
+
// grok-imagine-video accepts a base64 data URI in `image` for i2v.
|
|
1298
|
+
// Same surface as Seedance — the dispatcher already produced the
|
|
1299
|
+
// data URL via resolveProjectImage, so we just hand it through.
|
|
1300
|
+
body.image = ctx.imageRef.dataUrl;
|
|
1301
|
+
}
|
|
1302
|
+
const submitResp = await fetch(`${baseUrl}/videos/generations`, {
|
|
1303
|
+
method: 'POST',
|
|
1304
|
+
headers: {
|
|
1305
|
+
'authorization': `Bearer ${credentials.apiKey}`,
|
|
1306
|
+
'content-type': 'application/json',
|
|
1307
|
+
},
|
|
1308
|
+
body: JSON.stringify(body),
|
|
1309
|
+
});
|
|
1310
|
+
const submitText = await submitResp.text();
|
|
1311
|
+
if (!submitResp.ok) {
|
|
1312
|
+
throw new Error(`grok video submit ${submitResp.status}: ${truncate(submitText, 240)}`);
|
|
1313
|
+
}
|
|
1314
|
+
let submitData;
|
|
1315
|
+
try {
|
|
1316
|
+
submitData = JSON.parse(submitText);
|
|
1317
|
+
}
|
|
1318
|
+
catch {
|
|
1319
|
+
throw new Error(`grok video non-JSON: ${truncate(submitText, 200)}`);
|
|
1320
|
+
}
|
|
1321
|
+
// Two paths: (a) the API returned the finished video synchronously
|
|
1322
|
+
// (cached/short jobs), in which case we skip polling; (b) we got an
|
|
1323
|
+
// {id, status:'pending'} stub and need to poll GET /videos/{id}
|
|
1324
|
+
// until status flips to done/failed/expired.
|
|
1325
|
+
let videoUrl = submitData?.video?.url || null;
|
|
1326
|
+
let lastStatus = submitData?.status || '';
|
|
1327
|
+
const requestId = submitData?.id || submitData?.request_id || null;
|
|
1328
|
+
if (!videoUrl && requestId) {
|
|
1329
|
+
const startedAt = Date.now();
|
|
1330
|
+
const configuredMaxMs = Number(process.env.OD_GROK_VIDEO_MAX_POLL_MS);
|
|
1331
|
+
const maxMs = Number.isFinite(configuredMaxMs) && configuredMaxMs >= 60_000
|
|
1332
|
+
? configuredMaxMs
|
|
1333
|
+
: 8 * 60 * 1000;
|
|
1334
|
+
if (typeof onProgress === 'function') {
|
|
1335
|
+
const mode = ctx.imageRef ? 'i2v' : 't2v';
|
|
1336
|
+
onProgress(`grok ${mode} task ${requestId} accepted; polling status…`);
|
|
1337
|
+
}
|
|
1338
|
+
while (Date.now() - startedAt < maxMs) {
|
|
1339
|
+
await sleep(4000);
|
|
1340
|
+
const pollResp = await fetch(`${baseUrl}/videos/${encodeURIComponent(requestId)}`, {
|
|
1341
|
+
headers: { 'authorization': `Bearer ${credentials.apiKey}` },
|
|
1342
|
+
});
|
|
1343
|
+
const pollText = await pollResp.text();
|
|
1344
|
+
if (!pollResp.ok) {
|
|
1345
|
+
throw new Error(`grok poll ${pollResp.status}: ${truncate(pollText, 240)}`);
|
|
1346
|
+
}
|
|
1347
|
+
let pollData;
|
|
1348
|
+
try {
|
|
1349
|
+
pollData = JSON.parse(pollText);
|
|
1350
|
+
}
|
|
1351
|
+
catch {
|
|
1352
|
+
throw new Error(`grok poll non-JSON: ${truncate(pollText, 200)}`);
|
|
1353
|
+
}
|
|
1354
|
+
lastStatus = pollData.status || '';
|
|
1355
|
+
if (typeof onProgress === 'function') {
|
|
1356
|
+
const elapsedSec = Math.round((Date.now() - startedAt) / 1000);
|
|
1357
|
+
onProgress(`grok task ${requestId} status=${lastStatus || 'pending'} (elapsed ${elapsedSec}s)`);
|
|
1358
|
+
}
|
|
1359
|
+
if (lastStatus === 'done' || lastStatus === 'succeeded') {
|
|
1360
|
+
videoUrl = pollData?.video?.url || null;
|
|
1361
|
+
break;
|
|
1362
|
+
}
|
|
1363
|
+
if (lastStatus === 'failed' || lastStatus === 'expired') {
|
|
1364
|
+
const reasonRaw = pollData?.error?.message || pollData?.error || lastStatus;
|
|
1365
|
+
const reason = typeof reasonRaw === 'string' ? reasonRaw : JSON.stringify(reasonRaw);
|
|
1366
|
+
throw new Error(`grok task ${lastStatus}: ${reason}`);
|
|
1367
|
+
}
|
|
1368
|
+
}
|
|
1369
|
+
// Loop exited without a videoUrl. Distinguish the two reachable
|
|
1370
|
+
// cases so operators know which lever to pull: bumping the poll
|
|
1371
|
+
// ceiling (timeout) vs filing a bug against the upstream contract
|
|
1372
|
+
// (status=done but no video.url).
|
|
1373
|
+
if (!videoUrl) {
|
|
1374
|
+
const elapsedSec = Math.round((Date.now() - startedAt) / 1000);
|
|
1375
|
+
const ceilingSec = Math.round(maxMs / 1000);
|
|
1376
|
+
throw new Error(`grok video timed out after ${elapsedSec}s waiting for status=done `
|
|
1377
|
+
+ `(last status: ${lastStatus || 'pending'}, ceiling ${ceilingSec}s). `
|
|
1378
|
+
+ `If your jobs legitimately need longer, raise OD_GROK_VIDEO_MAX_POLL_MS.`);
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
if (!videoUrl) {
|
|
1382
|
+
// Submit returned neither an inline video.url nor a request_id —
|
|
1383
|
+
// upstream broke its own contract. Surfacing the last status helps
|
|
1384
|
+
// pinpoint whether it was a transient API blip or a malformed
|
|
1385
|
+
// response we should add a parser branch for.
|
|
1386
|
+
throw new Error(`grok video submit returned no inline video and no request_id to poll `
|
|
1387
|
+
+ `(status=${lastStatus || 'unknown'})`);
|
|
1388
|
+
}
|
|
1389
|
+
const dlResp = await fetch(videoUrl);
|
|
1390
|
+
if (!dlResp.ok)
|
|
1391
|
+
throw new Error(`grok video fetch ${dlResp.status}`);
|
|
1392
|
+
const arr = await dlResp.arrayBuffer();
|
|
1393
|
+
const bytes = Buffer.from(arr);
|
|
1394
|
+
return {
|
|
1395
|
+
bytes,
|
|
1396
|
+
providerNote: `grok/${ctx.wireModel} · ${aspectRatio} · ${durationSec}s · ${bytes.length} bytes`,
|
|
1397
|
+
suggestedExt: '.mp4',
|
|
1398
|
+
};
|
|
1399
|
+
}
|
|
1400
|
+
function grokAspectFor(aspect) {
|
|
1401
|
+
// xAI accepts a wide list (1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 2:1,
|
|
1402
|
+
// 1:2, 19.5:9, 9:19.5, 20:9, 9:20, auto). Our MEDIA_ASPECTS subset
|
|
1403
|
+
// is a strict subset — pass through known values, otherwise 16:9.
|
|
1404
|
+
if (aspect === '1:1'
|
|
1405
|
+
|| aspect === '16:9'
|
|
1406
|
+
|| aspect === '9:16'
|
|
1407
|
+
|| aspect === '4:3'
|
|
1408
|
+
|| aspect === '3:4') {
|
|
1409
|
+
return aspect;
|
|
1410
|
+
}
|
|
1411
|
+
return '16:9';
|
|
1412
|
+
}
|
|
1413
|
+
// ---------------------------------------------------------------------------
|
|
1414
|
+
// Provider: ElevenLabs — v3 text-to-speech (synchronous).
|
|
1415
|
+
//
|
|
1416
|
+
// Docs: https://elevenlabs.io/docs/api-reference/text-to-speech/convert
|
|
1417
|
+
// The API returns MP3 bytes directly. The catalogue id `elevenlabs-v3`
|
|
1418
|
+
// maps to the wire model `eleven_v3`, while `--voice` selects the
|
|
1419
|
+
// voice id in the path.
|
|
1420
|
+
// ---------------------------------------------------------------------------
|
|
1421
|
+
const ELEVENLABS_DEFAULT_BASE_URL = 'https://api.elevenlabs.io';
|
|
1422
|
+
const ELEVENLABS_DEFAULT_VOICE_ID = '21m00Tcm4TlvDq8ikWAM';
|
|
1423
|
+
const ELEVENLABS_TTS_MODEL_MAP = {
|
|
1424
|
+
'elevenlabs-v3': 'eleven_v3',
|
|
1425
|
+
};
|
|
1426
|
+
const ELEVENLABS_SFX_MODEL_MAP = {
|
|
1427
|
+
'elevenlabs-sfx': 'eleven_text_to_sound_v2',
|
|
1428
|
+
};
|
|
1429
|
+
const ELEVENLABS_SFX_MAX_PROMPT_CHARS = 450;
|
|
1430
|
+
const ELEVENLABS_SFX_DEFAULT_PROMPT_INFLUENCE = 0.3;
|
|
1431
|
+
function clampElevenLabsSfxDuration(value) {
|
|
1432
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
1433
|
+
return 5;
|
|
1434
|
+
return Math.min(30, Math.max(0.5, value));
|
|
1435
|
+
}
|
|
1436
|
+
function clampElevenLabsSfxPromptInfluence(value) {
|
|
1437
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
1438
|
+
return ELEVENLABS_SFX_DEFAULT_PROMPT_INFLUENCE;
|
|
1439
|
+
}
|
|
1440
|
+
return Math.min(1, Math.max(0, value));
|
|
1441
|
+
}
|
|
1442
|
+
function requireElevenLabsPrompt(text, kind) {
|
|
1443
|
+
const trimmed = text.trim();
|
|
1444
|
+
if (!trimmed) {
|
|
1445
|
+
throw new Error(`ElevenLabs ${kind} prompt must not be empty. Pass --prompt before retrying.`);
|
|
1446
|
+
}
|
|
1447
|
+
return trimmed;
|
|
1448
|
+
}
|
|
1449
|
+
function assertElevenLabsSfxPromptLength(text) {
|
|
1450
|
+
const promptChars = Array.from(text).length;
|
|
1451
|
+
if (promptChars > ELEVENLABS_SFX_MAX_PROMPT_CHARS) {
|
|
1452
|
+
throw new Error(`ElevenLabs SFX prompt exceeds ${ELEVENLABS_SFX_MAX_PROMPT_CHARS} characters (${promptChars}). Shorten --prompt before retrying.`);
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
async function renderElevenLabsTTS(ctx, credentials) {
|
|
1456
|
+
if (!credentials.apiKey) {
|
|
1457
|
+
throw new Error('no ElevenLabs API key - configure it in Settings or set OD_ELEVENLABS_API_KEY');
|
|
1458
|
+
}
|
|
1459
|
+
const baseUrl = (credentials.baseUrl || ELEVENLABS_DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
1460
|
+
const wireModel = ELEVENLABS_TTS_MODEL_MAP[ctx.model] || ctx.model;
|
|
1461
|
+
const text = requireElevenLabsPrompt(ctx.prompt ?? '', 'TTS');
|
|
1462
|
+
const voiceId = (ctx.voice && ctx.voice.trim()) || ELEVENLABS_DEFAULT_VOICE_ID;
|
|
1463
|
+
const body = {
|
|
1464
|
+
text,
|
|
1465
|
+
model_id: wireModel,
|
|
1466
|
+
voice_settings: {
|
|
1467
|
+
stability: 1,
|
|
1468
|
+
similarity_boost: 1,
|
|
1469
|
+
style: 0,
|
|
1470
|
+
speed: 1,
|
|
1471
|
+
use_speaker_boost: true,
|
|
1472
|
+
},
|
|
1473
|
+
};
|
|
1474
|
+
const resp = await fetch(`${baseUrl}/v1/text-to-speech/${encodeURIComponent(voiceId)}?output_format=mp3_44100_128`, {
|
|
1475
|
+
method: 'POST',
|
|
1476
|
+
headers: {
|
|
1477
|
+
'xi-api-key': credentials.apiKey,
|
|
1478
|
+
'content-type': 'application/json',
|
|
1479
|
+
},
|
|
1480
|
+
body: JSON.stringify(body),
|
|
1481
|
+
});
|
|
1482
|
+
if (!resp.ok) {
|
|
1483
|
+
const errText = await resp.text();
|
|
1484
|
+
throw new Error(`elevenlabs tts ${resp.status}: ${truncate(errText, 240)}`);
|
|
1485
|
+
}
|
|
1486
|
+
const arr = await resp.arrayBuffer();
|
|
1487
|
+
const bytes = Buffer.from(arr);
|
|
1488
|
+
if (bytes.length === 0) {
|
|
1489
|
+
throw new Error('elevenlabs tts returned zero bytes');
|
|
1490
|
+
}
|
|
1491
|
+
return {
|
|
1492
|
+
bytes,
|
|
1493
|
+
providerNote: `elevenlabs/${wireModel} · ${voiceId} · ${bytes.length} bytes`,
|
|
1494
|
+
suggestedExt: '.mp3',
|
|
1495
|
+
};
|
|
1496
|
+
}
|
|
1497
|
+
async function renderElevenLabsSfx(ctx, credentials) {
|
|
1498
|
+
if (!credentials.apiKey) {
|
|
1499
|
+
throw new Error('no ElevenLabs API key - configure it in Settings or set OD_ELEVENLABS_API_KEY');
|
|
1500
|
+
}
|
|
1501
|
+
const baseUrl = (credentials.baseUrl || ELEVENLABS_DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
1502
|
+
const wireModel = ELEVENLABS_SFX_MODEL_MAP[ctx.model] || ctx.model;
|
|
1503
|
+
const text = requireElevenLabsPrompt(ctx.prompt ?? '', 'SFX');
|
|
1504
|
+
assertElevenLabsSfxPromptLength(text);
|
|
1505
|
+
const durationSeconds = clampElevenLabsSfxDuration(ctx.duration);
|
|
1506
|
+
const promptInfluence = clampElevenLabsSfxPromptInfluence(ctx.promptInfluence);
|
|
1507
|
+
const body = {
|
|
1508
|
+
text,
|
|
1509
|
+
duration_seconds: durationSeconds,
|
|
1510
|
+
prompt_influence: promptInfluence,
|
|
1511
|
+
...(ctx.loop ? { loop: true } : {}),
|
|
1512
|
+
model_id: wireModel,
|
|
1513
|
+
};
|
|
1514
|
+
const resp = await fetch(`${baseUrl}/v1/sound-generation?output_format=mp3_44100_128`, {
|
|
1515
|
+
method: 'POST',
|
|
1516
|
+
headers: {
|
|
1517
|
+
'xi-api-key': credentials.apiKey,
|
|
1518
|
+
'content-type': 'application/json',
|
|
1519
|
+
},
|
|
1520
|
+
body: JSON.stringify(body),
|
|
1521
|
+
});
|
|
1522
|
+
if (!resp.ok) {
|
|
1523
|
+
const errText = await resp.text();
|
|
1524
|
+
throw new Error(`elevenlabs sfx ${resp.status}: ${truncate(errText, 240)}`);
|
|
1525
|
+
}
|
|
1526
|
+
const arr = await resp.arrayBuffer();
|
|
1527
|
+
const bytes = Buffer.from(arr);
|
|
1528
|
+
if (bytes.length === 0) {
|
|
1529
|
+
throw new Error('elevenlabs sfx returned zero bytes');
|
|
1530
|
+
}
|
|
1531
|
+
return {
|
|
1532
|
+
bytes,
|
|
1533
|
+
providerNote: `elevenlabs/${wireModel} · ${durationSeconds}s${ctx.loop ? ' · loop' : ''} · ${bytes.length} bytes`,
|
|
1534
|
+
suggestedExt: '.mp3',
|
|
1535
|
+
};
|
|
1536
|
+
}
|
|
1537
|
+
// ---------------------------------------------------------------------------
|
|
1538
|
+
// Provider: MiniMax — Speech-02 family text-to-speech (synchronous).
|
|
1539
|
+
//
|
|
1540
|
+
// Docs: https://platform.minimaxi.com — POST /t2a_v2 with a JSON body
|
|
1541
|
+
// describing the voice + audio settings. Response is JSON with the
|
|
1542
|
+
// audio bytes hex-encoded under `data.audio`. The MiniMax catalogue we
|
|
1543
|
+
// surface as the generic id `minimax-tts` resolves to `speech-02-turbo`
|
|
1544
|
+
// (their fast tier). Voice id defaults to a neutral Mandarin voice but
|
|
1545
|
+
// the agent can override via the model registry's `voice` slot.
|
|
1546
|
+
// ---------------------------------------------------------------------------
|
|
1547
|
+
const MINIMAX_DEFAULT_BASE_URL = 'https://api.minimaxi.chat/v1';
|
|
1548
|
+
// Map our generic catalogue ids onto MiniMax's actual model ids. The
|
|
1549
|
+
// `minimax-tts` slot in src/media/models.ts is shorthand for "their
|
|
1550
|
+
// fast TTS tier"; we substitute the real model name on the wire so
|
|
1551
|
+
// MiniMax accepts the request without exposing the user to their
|
|
1552
|
+
// internal naming.
|
|
1553
|
+
const MINIMAX_TTS_MODEL_MAP = {
|
|
1554
|
+
'minimax-tts': 'speech-02-turbo',
|
|
1555
|
+
};
|
|
1556
|
+
async function renderMinimaxTTS(ctx, credentials) {
|
|
1557
|
+
if (!credentials.apiKey) {
|
|
1558
|
+
throw new Error('no MiniMax API key — configure it in Settings or set OD_MINIMAX_API_KEY');
|
|
1559
|
+
}
|
|
1560
|
+
const baseUrl = (credentials.baseUrl || MINIMAX_DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
1561
|
+
// Precedence: user alias from #1277 (when set) -> project's known
|
|
1562
|
+
// MINIMAX legacy rename map -> catalog id. The user knows their
|
|
1563
|
+
// deployment name better than our hardcoded table, so an explicit
|
|
1564
|
+
// alias trumps the legacy mapping.
|
|
1565
|
+
const wireModel = ctx.wireModel !== ctx.model
|
|
1566
|
+
? ctx.wireModel
|
|
1567
|
+
: (MINIMAX_TTS_MODEL_MAP[ctx.model] || ctx.model);
|
|
1568
|
+
const text = (ctx.prompt && ctx.prompt.trim()) || 'This is a test.';
|
|
1569
|
+
// Voice id picks: the agent can pass --voice to choose, otherwise we
|
|
1570
|
+
// default to a neutral Mandarin male voice that handles both Chinese
|
|
1571
|
+
// and English text reasonably. MiniMax's voice catalogue is large
|
|
1572
|
+
// (`male-qn-qingse`, `female-shaonv`, etc.) — listed at
|
|
1573
|
+
// platform.minimaxi.com under voice management.
|
|
1574
|
+
const voiceId = (ctx.voice && ctx.voice.trim()) || 'male-qn-qingse';
|
|
1575
|
+
const languageBoost = typeof ctx.language === 'string' ? ctx.language.trim() : '';
|
|
1576
|
+
const body = {
|
|
1577
|
+
model: wireModel,
|
|
1578
|
+
text,
|
|
1579
|
+
stream: false,
|
|
1580
|
+
...(languageBoost ? { language_boost: languageBoost } : {}),
|
|
1581
|
+
voice_setting: {
|
|
1582
|
+
voice_id: voiceId,
|
|
1583
|
+
speed: 1.0,
|
|
1584
|
+
vol: 1.0,
|
|
1585
|
+
pitch: 0,
|
|
1586
|
+
},
|
|
1587
|
+
audio_setting: {
|
|
1588
|
+
sample_rate: 32000,
|
|
1589
|
+
format: 'mp3',
|
|
1590
|
+
},
|
|
1591
|
+
};
|
|
1592
|
+
const resp = await fetch(`${baseUrl}/t2a_v2`, {
|
|
1593
|
+
method: 'POST',
|
|
1594
|
+
headers: {
|
|
1595
|
+
authorization: `Bearer ${credentials.apiKey}`,
|
|
1596
|
+
'content-type': 'application/json',
|
|
1597
|
+
},
|
|
1598
|
+
body: JSON.stringify(body),
|
|
1599
|
+
});
|
|
1600
|
+
const respText = await resp.text();
|
|
1601
|
+
if (!resp.ok) {
|
|
1602
|
+
throw new Error(`minimax tts ${resp.status}: ${truncate(respText, 240)}`);
|
|
1603
|
+
}
|
|
1604
|
+
let data;
|
|
1605
|
+
try {
|
|
1606
|
+
data = JSON.parse(respText);
|
|
1607
|
+
}
|
|
1608
|
+
catch {
|
|
1609
|
+
throw new Error(`minimax tts non-JSON: ${truncate(respText, 200)}`);
|
|
1610
|
+
}
|
|
1611
|
+
// MiniMax wraps every response in `base_resp`; even an HTTP 200 can
|
|
1612
|
+
// be a logical failure (`status_code !== 0`). Surface that distinct
|
|
1613
|
+
// class of error so the user knows it's an auth / params issue, not
|
|
1614
|
+
// a network blip.
|
|
1615
|
+
if (data?.base_resp && data.base_resp.status_code !== 0) {
|
|
1616
|
+
throw new Error(`minimax tts api error ${data.base_resp.status_code}: ${data.base_resp.status_msg || 'unknown'}`);
|
|
1617
|
+
}
|
|
1618
|
+
const hex = data?.data?.audio;
|
|
1619
|
+
if (typeof hex !== 'string' || !hex) {
|
|
1620
|
+
throw new Error('minimax tts response missing data.audio');
|
|
1621
|
+
}
|
|
1622
|
+
const bytes = Buffer.from(hex, 'hex');
|
|
1623
|
+
if (bytes.length === 0) {
|
|
1624
|
+
throw new Error('minimax tts decoded zero bytes');
|
|
1625
|
+
}
|
|
1626
|
+
// Pull a few useful descriptors from extra_info for the providerNote
|
|
1627
|
+
// so the FileViewer toolbar tells the truth about what was generated.
|
|
1628
|
+
const xi = data?.extra_info || {};
|
|
1629
|
+
const seconds = xi.audio_length ? Math.round(xi.audio_length / 100) / 10 : '?';
|
|
1630
|
+
return {
|
|
1631
|
+
bytes,
|
|
1632
|
+
providerNote: `minimax/${wireModel} · ${voiceId} · ${seconds}s · ${bytes.length} bytes`,
|
|
1633
|
+
suggestedExt: '.mp3',
|
|
1634
|
+
};
|
|
1635
|
+
}
|
|
1636
|
+
// ---------------------------------------------------------------------------
|
|
1637
|
+
// Provider: SenseAudio — senseaudio-tts-1.5 text-to-speech (synchronous).
|
|
1638
|
+
//
|
|
1639
|
+
// Docs: https://docs.senseaudio.cn — POST /v1/t2a_v2 with a JSON body
|
|
1640
|
+
// shaped like MiniMax's (voice_setting / audio_setting). The response is
|
|
1641
|
+
// JSON with hex-encoded audio under `data.audio` and a `base_resp`
|
|
1642
|
+
// envelope that distinguishes HTTP-level from API-level failures, again
|
|
1643
|
+
// mirroring MiniMax. The catalogue id we surface as `senseaudio-tts`
|
|
1644
|
+
// resolves to `senseaudio-tts-1.5-260319` on the wire — SenseAudio's
|
|
1645
|
+
// recommended flagship model (supports emotion control, polyphonic
|
|
1646
|
+
// characters, LaTeX formula reading, voice cloning, and text-generated
|
|
1647
|
+
// voices). Default voice is `female_0033_b` per the official example; the agent
|
|
1648
|
+
// can override via the model registry's `voice` slot with any system,
|
|
1649
|
+
// cloned, or text-generated voice id from the customer's catalogue.
|
|
1650
|
+
// Audio shape is hard-coded to mp3 / 32kHz / 128kbps / stereo for parity
|
|
1651
|
+
// with the other TTS providers; SenseAudio supports wav/pcm/flac and
|
|
1652
|
+
// other sample rates but we don't expose them through MediaContext yet.
|
|
1653
|
+
// ---------------------------------------------------------------------------
|
|
1654
|
+
const SENSEAUDIO_DEFAULT_BASE_URL = 'https://api.senseaudio.cn';
|
|
1655
|
+
const SENSEAUDIO_DEFAULT_VOICE_ID = 'female_0033_b';
|
|
1656
|
+
const SENSEAUDIO_TTS_MODEL_MAP = {
|
|
1657
|
+
'senseaudio-tts': 'senseaudio-tts-1.5-260319',
|
|
1658
|
+
};
|
|
1659
|
+
async function renderSenseAudioTTS(ctx, credentials) {
|
|
1660
|
+
if (!credentials.apiKey) {
|
|
1661
|
+
throw new Error('no SenseAudio API key — configure it in Settings or set OD_SENSEAUDIO_API_KEY');
|
|
1662
|
+
}
|
|
1663
|
+
const baseUrl = (credentials.baseUrl || SENSEAUDIO_DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
1664
|
+
const wireModel = SENSEAUDIO_TTS_MODEL_MAP[ctx.model] || ctx.model;
|
|
1665
|
+
const text = (ctx.prompt && ctx.prompt.trim()) || 'This is a test.';
|
|
1666
|
+
const voiceId = (ctx.voice && ctx.voice.trim()) || SENSEAUDIO_DEFAULT_VOICE_ID;
|
|
1667
|
+
const body = {
|
|
1668
|
+
model: wireModel,
|
|
1669
|
+
text,
|
|
1670
|
+
stream: false,
|
|
1671
|
+
voice_setting: {
|
|
1672
|
+
voice_id: voiceId,
|
|
1673
|
+
speed: 1,
|
|
1674
|
+
vol: 1,
|
|
1675
|
+
pitch: 0,
|
|
1676
|
+
},
|
|
1677
|
+
audio_setting: {
|
|
1678
|
+
format: 'mp3',
|
|
1679
|
+
sample_rate: 32000,
|
|
1680
|
+
bitrate: 128000,
|
|
1681
|
+
channel: 2,
|
|
1682
|
+
},
|
|
1683
|
+
};
|
|
1684
|
+
const resp = await fetch(`${baseUrl}/v1/t2a_v2`, {
|
|
1685
|
+
method: 'POST',
|
|
1686
|
+
headers: {
|
|
1687
|
+
authorization: `Bearer ${credentials.apiKey}`,
|
|
1688
|
+
'content-type': 'application/json',
|
|
1689
|
+
},
|
|
1690
|
+
body: JSON.stringify(body),
|
|
1691
|
+
});
|
|
1692
|
+
const respText = await resp.text();
|
|
1693
|
+
if (!resp.ok) {
|
|
1694
|
+
throw new Error(`senseaudio tts ${resp.status}: ${truncate(respText, 240)}`);
|
|
1695
|
+
}
|
|
1696
|
+
let data;
|
|
1697
|
+
try {
|
|
1698
|
+
data = JSON.parse(respText);
|
|
1699
|
+
}
|
|
1700
|
+
catch {
|
|
1701
|
+
throw new Error(`senseaudio tts non-JSON: ${truncate(respText, 200)}`);
|
|
1702
|
+
}
|
|
1703
|
+
// SenseAudio mirrors MiniMax's base_resp envelope: HTTP 200 can still
|
|
1704
|
+
// be a logical failure (auth, quota, voice not on this account, …).
|
|
1705
|
+
// Surface the upstream status_code/status_msg so users see the real
|
|
1706
|
+
// cause instead of a downstream "missing data.audio" red herring.
|
|
1707
|
+
if (data?.base_resp && data.base_resp.status_code !== 0) {
|
|
1708
|
+
throw new Error(`senseaudio tts api error ${data.base_resp.status_code}: ${data.base_resp.status_msg || 'unknown'}`);
|
|
1709
|
+
}
|
|
1710
|
+
const hex = data?.data?.audio;
|
|
1711
|
+
if (typeof hex !== 'string' || !hex) {
|
|
1712
|
+
throw new Error('senseaudio tts response missing data.audio');
|
|
1713
|
+
}
|
|
1714
|
+
const bytes = Buffer.from(hex, 'hex');
|
|
1715
|
+
if (bytes.length === 0) {
|
|
1716
|
+
throw new Error('senseaudio tts decoded zero bytes');
|
|
1717
|
+
}
|
|
1718
|
+
const xi = data?.extra_info || {};
|
|
1719
|
+
const seconds = xi.audio_length ? Math.round(xi.audio_length / 100) / 10 : '?';
|
|
1720
|
+
return {
|
|
1721
|
+
bytes,
|
|
1722
|
+
providerNote: `senseaudio/${wireModel} · ${voiceId} · ${seconds}s · ${bytes.length} bytes`,
|
|
1723
|
+
suggestedExt: '.mp3',
|
|
1724
|
+
};
|
|
1725
|
+
}
|
|
1726
|
+
// ---------------------------------------------------------------------------
|
|
1727
|
+
// Provider: FishAudio — Speech-1.x family text-to-speech (synchronous).
|
|
1728
|
+
//
|
|
1729
|
+
// Docs: https://docs.fish.audio — POST /v1/tts with a JSON body.
|
|
1730
|
+
// FishAudio returns the audio bytes directly (Content-Type: audio/mpeg
|
|
1731
|
+
// for mp3, audio/wav for wav) rather than wrapping them in JSON, so we
|
|
1732
|
+
// stream the body straight into a Buffer. The catalogue id we expose
|
|
1733
|
+
// as `fish-speech-2` resolves to `speech-1.6` (their newer model) on
|
|
1734
|
+
// the wire; older builds can paste `speech-1.5` via the model picker
|
|
1735
|
+
// once arbitrary model ids are accepted.
|
|
1736
|
+
// ---------------------------------------------------------------------------
|
|
1737
|
+
const FISHAUDIO_DEFAULT_BASE_URL = 'https://api.fish.audio';
|
|
1738
|
+
const FISHAUDIO_TTS_MODEL_MAP = {
|
|
1739
|
+
'fish-speech-2': 'speech-1.6',
|
|
1740
|
+
};
|
|
1741
|
+
async function renderFishAudioTTS(ctx, credentials) {
|
|
1742
|
+
if (!credentials.apiKey) {
|
|
1743
|
+
throw new Error('no FishAudio API key — configure it in Settings or set OD_FISHAUDIO_API_KEY');
|
|
1744
|
+
}
|
|
1745
|
+
const baseUrl = (credentials.baseUrl || FISHAUDIO_DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
1746
|
+
// Same precedence as the MINIMAX TTS path: user alias wins, then
|
|
1747
|
+
// the project's hardcoded fishaudio map, then catalog id.
|
|
1748
|
+
const wireModel = ctx.wireModel !== ctx.model
|
|
1749
|
+
? ctx.wireModel
|
|
1750
|
+
: (FISHAUDIO_TTS_MODEL_MAP[ctx.model] || ctx.model);
|
|
1751
|
+
const text = (ctx.prompt && ctx.prompt.trim()) || 'This is a test.';
|
|
1752
|
+
// FishAudio's `reference_id` slot pins which voice the synth uses.
|
|
1753
|
+
// The agent passes it via --voice (carried in ctx.voice). Empty means
|
|
1754
|
+
// FishAudio falls back to its default voice for the chosen model.
|
|
1755
|
+
const body = {
|
|
1756
|
+
text,
|
|
1757
|
+
format: 'mp3',
|
|
1758
|
+
mp3_bitrate: 128,
|
|
1759
|
+
model: wireModel,
|
|
1760
|
+
normalize: true,
|
|
1761
|
+
latency: 'normal',
|
|
1762
|
+
};
|
|
1763
|
+
if (ctx.voice && ctx.voice.trim()) {
|
|
1764
|
+
body.reference_id = ctx.voice.trim();
|
|
1765
|
+
}
|
|
1766
|
+
const resp = await fetch(`${baseUrl}/v1/tts`, {
|
|
1767
|
+
method: 'POST',
|
|
1768
|
+
headers: {
|
|
1769
|
+
authorization: `Bearer ${credentials.apiKey}`,
|
|
1770
|
+
'content-type': 'application/json',
|
|
1771
|
+
},
|
|
1772
|
+
body: JSON.stringify(body),
|
|
1773
|
+
});
|
|
1774
|
+
if (!resp.ok) {
|
|
1775
|
+
const errText = await resp.text();
|
|
1776
|
+
throw new Error(`fishaudio tts ${resp.status}: ${truncate(errText, 240)}`);
|
|
1777
|
+
}
|
|
1778
|
+
const arr = await resp.arrayBuffer();
|
|
1779
|
+
const bytes = Buffer.from(arr);
|
|
1780
|
+
if (bytes.length === 0) {
|
|
1781
|
+
throw new Error('fishaudio tts returned zero bytes');
|
|
1782
|
+
}
|
|
1783
|
+
return {
|
|
1784
|
+
bytes,
|
|
1785
|
+
providerNote: `fishaudio/${wireModel} · ${bytes.length} bytes`,
|
|
1786
|
+
suggestedExt: '.mp3',
|
|
1787
|
+
};
|
|
1788
|
+
}
|
|
1789
|
+
// ---------------------------------------------------------------------------
|
|
1790
|
+
// Provider: HyperFrames — local HTML→MP4 renderer (heygen-com/hyperframes).
|
|
1791
|
+
//
|
|
1792
|
+
// The agent does the creative work: it reads skills/hyperframes/SKILL.md,
|
|
1793
|
+
// writes a composition (`hyperframes.json` + `meta.json` + `index.html`,
|
|
1794
|
+
// with a GSAP timeline) into a hidden cache dir under the project, then
|
|
1795
|
+
// dispatches here with `--composition-dir <relative-path>`.
|
|
1796
|
+
//
|
|
1797
|
+
// We run `npx hyperframes render <absolutePath> --output <tmp>/render.mp4`
|
|
1798
|
+
// from the daemon process (NOT the agent's shell) for two reasons:
|
|
1799
|
+
// 1. HyperFrames spawns a puppeteer-controlled Chrome to capture frames.
|
|
1800
|
+
// Claude Code's Bash tool wraps subprocesses in macOS sandbox-exec,
|
|
1801
|
+
// under which Chrome hangs partway through frame capture.
|
|
1802
|
+
// 2. Pointing --output at a temp dir keeps HF's auto-created
|
|
1803
|
+
// `work-<uuid>/` (per-frame jpegs + intermediate compiled HTML)
|
|
1804
|
+
// OUT of the project folder. We delete the temp tree in the
|
|
1805
|
+
// `finally` block; only the final mp4 bytes are returned to the
|
|
1806
|
+
// generic dispatcher flow, which writes them into the project dir
|
|
1807
|
+
// under the user-supplied filename.
|
|
1808
|
+
// ---------------------------------------------------------------------------
|
|
1809
|
+
const HYPERFRAMES_RENDER_TIMEOUT_MS = 5 * 60 * 1000;
|
|
1810
|
+
async function renderHyperFramesViaCli(ctx, projectDir, onProgress) {
|
|
1811
|
+
const compRel = ctx.compositionDir;
|
|
1812
|
+
if (typeof compRel !== 'string' || !compRel.trim()) {
|
|
1813
|
+
throw new Error('hyperframes-html requires --composition-dir <project-relative-path> ' +
|
|
1814
|
+
'pointing at the directory the agent scaffolded with hyperframes.json / ' +
|
|
1815
|
+
'meta.json / index.html. The agent should write the composition into ' +
|
|
1816
|
+
'$OD_PROJECT_DIR/.hyperframes-cache/<id>/ and pass that path here.');
|
|
1817
|
+
}
|
|
1818
|
+
// Resolve compositionDir against projectDir and refuse anything that
|
|
1819
|
+
// escapes — the agent has free file access to the project but the
|
|
1820
|
+
// dispatcher must not let a bad relative path render an arbitrary
|
|
1821
|
+
// directory on the host.
|
|
1822
|
+
const projectRootResolved = path.resolve(projectDir);
|
|
1823
|
+
const compAbs = path.resolve(projectRootResolved, compRel);
|
|
1824
|
+
if (compAbs !== projectRootResolved &&
|
|
1825
|
+
!compAbs.startsWith(projectRootResolved + path.sep)) {
|
|
1826
|
+
throw new Error(`compositionDir "${compRel}" resolves outside the project directory. ` +
|
|
1827
|
+
'Pass a path relative to the project (e.g. ".hyperframes-cache/abc").');
|
|
1828
|
+
}
|
|
1829
|
+
// Existence check — render against a missing directory hangs HF for
|
|
1830
|
+
// a while before failing, so short-circuit with a clear error.
|
|
1831
|
+
let compStat;
|
|
1832
|
+
try {
|
|
1833
|
+
compStat = await stat(compAbs);
|
|
1834
|
+
}
|
|
1835
|
+
catch {
|
|
1836
|
+
throw new Error(`compositionDir not found: ${compRel} (resolved to ${compAbs})`);
|
|
1837
|
+
}
|
|
1838
|
+
if (!compStat.isDirectory()) {
|
|
1839
|
+
throw new Error(`compositionDir is not a directory: ${compRel}`);
|
|
1840
|
+
}
|
|
1841
|
+
const indexStat = await stat(path.join(compAbs, 'index.html')).catch(() => null);
|
|
1842
|
+
if (!indexStat || !indexStat.isFile()) {
|
|
1843
|
+
throw new Error(`compositionDir is missing index.html: ${compRel}. The agent must ` +
|
|
1844
|
+
'write index.html (with window.__timelines registration) before dispatch.');
|
|
1845
|
+
}
|
|
1846
|
+
const tmpRoot = await mkdtemp(path.join(os.tmpdir(), 'open-design-hf-'));
|
|
1847
|
+
const tmpOutput = path.join(tmpRoot, 'render.mp4');
|
|
1848
|
+
try {
|
|
1849
|
+
// Pin --workers 1 to keep memory bounded (each worker is a Chrome
|
|
1850
|
+
// process at ~256 MB). standard quality matches HF's default. We
|
|
1851
|
+
// do NOT pass --quiet so progress lines stream out and the agent
|
|
1852
|
+
// (and the user reading the chat in real time) can see frame-by-
|
|
1853
|
+
// frame capture status instead of staring at a hung pipe.
|
|
1854
|
+
await runHyperFramesRender(compAbs, tmpOutput, onProgress);
|
|
1855
|
+
const bytes = await readFile(tmpOutput);
|
|
1856
|
+
return {
|
|
1857
|
+
bytes,
|
|
1858
|
+
providerNote: `hyperframes/local-html · ${ctx.aspect} · ${bytes.length} bytes`,
|
|
1859
|
+
suggestedExt: '.mp4',
|
|
1860
|
+
};
|
|
1861
|
+
}
|
|
1862
|
+
catch (err) {
|
|
1863
|
+
const stderr = errorStringProp(err, 'stderr').trim();
|
|
1864
|
+
const message = stderr || errorMessage(err);
|
|
1865
|
+
throw new Error(`hyperframes render failed: ${truncate(message, 480)}`);
|
|
1866
|
+
}
|
|
1867
|
+
finally {
|
|
1868
|
+
await rm(tmpRoot, { recursive: true, force: true });
|
|
1869
|
+
}
|
|
1870
|
+
}
|
|
1871
|
+
/**
|
|
1872
|
+
* Run `npx hyperframes render` and stream every line of stdout/stderr
|
|
1873
|
+
* through `onProgress`. Resolves on a clean exit, rejects on non-zero
|
|
1874
|
+
* exit (with the stderr tail attached so the dispatcher can surface it).
|
|
1875
|
+
*
|
|
1876
|
+
* Streaming matters for UX: the render typically takes 60–120s and
|
|
1877
|
+
* HF prints "Capturing frame N/M" as it goes. Without piping these
|
|
1878
|
+
* lines back to the caller, the HTTP request looks hung and the
|
|
1879
|
+
* agent's chat tool shows a long quiet spinner — users can't tell
|
|
1880
|
+
* whether anything is happening.
|
|
1881
|
+
*/
|
|
1882
|
+
function runHyperFramesRender(compAbs, tmpOutput, onProgress) {
|
|
1883
|
+
return new Promise((resolve, reject) => {
|
|
1884
|
+
const child = spawn('npx', [
|
|
1885
|
+
'-y',
|
|
1886
|
+
'hyperframes',
|
|
1887
|
+
'render',
|
|
1888
|
+
compAbs,
|
|
1889
|
+
'--output',
|
|
1890
|
+
tmpOutput,
|
|
1891
|
+
'--workers',
|
|
1892
|
+
'1',
|
|
1893
|
+
], {
|
|
1894
|
+
// Inherit env so npx can find the cached hyperframes install
|
|
1895
|
+
// and any user-level node config. stdin closed (HF doesn't
|
|
1896
|
+
// read from it), stdout/stderr piped so we can stream.
|
|
1897
|
+
env: process.env,
|
|
1898
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
1899
|
+
});
|
|
1900
|
+
// HF uses ANSI escape sequences (cursor moves, color codes, line
|
|
1901
|
+
// erases) for its pretty progress bar. Strip those before
|
|
1902
|
+
// forwarding so the agent's chat doesn't render a wall of `[2K`.
|
|
1903
|
+
// The regex covers CSI sequences (most of what HF emits).
|
|
1904
|
+
const stripAnsi = (s) => s.replace(/\x1b\[[0-9;?]*[A-Za-z]/g, '').replace(/\x1b\[\?[0-9]+[hl]/g, '');
|
|
1905
|
+
const emit = (chunk) => {
|
|
1906
|
+
if (typeof onProgress !== 'function')
|
|
1907
|
+
return;
|
|
1908
|
+
const text = stripAnsi(chunk.toString('utf8'));
|
|
1909
|
+
// HF refreshes a single progress line many times per second; split
|
|
1910
|
+
// on \r and \n so each "Capturing frame X/Y" update reaches the
|
|
1911
|
+
// caller as its own line. Drop empty/duplicate lines so the
|
|
1912
|
+
// SSE stream stays compact.
|
|
1913
|
+
const lines = text.split(/[\r\n]+/);
|
|
1914
|
+
for (const line of lines) {
|
|
1915
|
+
const trimmed = line.trim();
|
|
1916
|
+
if (!trimmed)
|
|
1917
|
+
continue;
|
|
1918
|
+
try {
|
|
1919
|
+
onProgress(trimmed);
|
|
1920
|
+
}
|
|
1921
|
+
catch {
|
|
1922
|
+
// best-effort: never let an emitter throw kill the render
|
|
1923
|
+
}
|
|
1924
|
+
}
|
|
1925
|
+
};
|
|
1926
|
+
let stderrTail = '';
|
|
1927
|
+
child.stdout.on('data', emit);
|
|
1928
|
+
child.stderr.on('data', (chunk) => {
|
|
1929
|
+
stderrTail += chunk.toString('utf8');
|
|
1930
|
+
if (stderrTail.length > 8000)
|
|
1931
|
+
stderrTail = stderrTail.slice(-8000);
|
|
1932
|
+
emit(chunk);
|
|
1933
|
+
});
|
|
1934
|
+
const timer = setTimeout(() => {
|
|
1935
|
+
try {
|
|
1936
|
+
child.kill('SIGKILL');
|
|
1937
|
+
}
|
|
1938
|
+
catch {
|
|
1939
|
+
// ignore
|
|
1940
|
+
}
|
|
1941
|
+
reject(new Error(`hyperframes render timed out after ${Math.round(HYPERFRAMES_RENDER_TIMEOUT_MS / 1000)}s`));
|
|
1942
|
+
}, HYPERFRAMES_RENDER_TIMEOUT_MS);
|
|
1943
|
+
child.on('error', (err) => {
|
|
1944
|
+
clearTimeout(timer);
|
|
1945
|
+
reject(err);
|
|
1946
|
+
});
|
|
1947
|
+
child.on('close', (code, signal) => {
|
|
1948
|
+
clearTimeout(timer);
|
|
1949
|
+
if (code === 0)
|
|
1950
|
+
return resolve();
|
|
1951
|
+
const reason = signal ? `signal ${signal}` : `exit ${code}`;
|
|
1952
|
+
const tail = stderrTail.trim().split('\n').slice(-12).join('\n');
|
|
1953
|
+
const err = new Error(`hyperframes render exited ${reason}` + (tail ? `\n${tail}` : ''));
|
|
1954
|
+
err.stderr = tail;
|
|
1955
|
+
reject(err);
|
|
1956
|
+
});
|
|
1957
|
+
});
|
|
1958
|
+
}
|
|
1959
|
+
// ---------------------------------------------------------------------------
|
|
1960
|
+
// Stub renderer.
|
|
1961
|
+
//
|
|
1962
|
+
// Used when no real provider integration ships for (provider, surface)
|
|
1963
|
+
// or when the real one fails. Produces small but valid bytes so the
|
|
1964
|
+
// downstream FileViewer round-trip works while the backend matures.
|
|
1965
|
+
// ---------------------------------------------------------------------------
|
|
1966
|
+
async function renderStub(ctx, fileName) {
|
|
1967
|
+
const note = ctx.provider && !ctx.provider.integrated
|
|
1968
|
+
? `stub-${ctx.surface} · provider '${ctx.provider.id}' integration pending`
|
|
1969
|
+
: `stub-${ctx.surface} · model=${ctx.model}`;
|
|
1970
|
+
if (ctx.surface === 'image') {
|
|
1971
|
+
const ext = path.extname(fileName).toLowerCase();
|
|
1972
|
+
if (ext === '.svg') {
|
|
1973
|
+
return { bytes: Buffer.from(svgPlaceholder(ctx), 'utf8'), providerNote: note };
|
|
1974
|
+
}
|
|
1975
|
+
const png = Buffer.from([
|
|
1976
|
+
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
|
1977
|
+
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
|
|
1978
|
+
0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x15, 0xc4, 0x89, 0x00, 0x00, 0x00,
|
|
1979
|
+
0x0d, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x00, 0x01, 0x00, 0x00,
|
|
1980
|
+
0x05, 0x00, 0x01, 0x0d, 0x0a, 0x2d, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x49,
|
|
1981
|
+
0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
|
1982
|
+
]);
|
|
1983
|
+
return {
|
|
1984
|
+
bytes: png,
|
|
1985
|
+
providerNote: `${note} · aspect=${ctx.aspect} · prompt=${truncate(ctx.prompt, 60)}`,
|
|
1986
|
+
};
|
|
1987
|
+
}
|
|
1988
|
+
if (ctx.surface === 'video') {
|
|
1989
|
+
const ftyp = Buffer.from([
|
|
1990
|
+
0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70, 0x69, 0x73, 0x6f, 0x6d,
|
|
1991
|
+
0x00, 0x00, 0x02, 0x00, 0x69, 0x73, 0x6f, 0x6d, 0x69, 0x73, 0x6f, 0x32,
|
|
1992
|
+
]);
|
|
1993
|
+
const mdat = Buffer.from([0x00, 0x00, 0x00, 0x08, 0x6d, 0x64, 0x61, 0x74]);
|
|
1994
|
+
return {
|
|
1995
|
+
bytes: Buffer.concat([ftyp, mdat]),
|
|
1996
|
+
providerNote: `${note} · aspect=${ctx.aspect} · length=${ctx.length ?? '?'}s · prompt=${truncate(ctx.prompt, 60)}`,
|
|
1997
|
+
};
|
|
1998
|
+
}
|
|
1999
|
+
// Audio
|
|
2000
|
+
const ext = path.extname(fileName).toLowerCase();
|
|
2001
|
+
if (ext === '.wav') {
|
|
2002
|
+
return {
|
|
2003
|
+
bytes: silentWav(0.5),
|
|
2004
|
+
providerNote: `${note} · kind=${ctx.audioKind} · duration=${ctx.duration ?? '?'}s`,
|
|
2005
|
+
};
|
|
2006
|
+
}
|
|
2007
|
+
const mp3 = Buffer.from([
|
|
2008
|
+
0xff, 0xfb, 0x90, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
2009
|
+
]);
|
|
2010
|
+
return {
|
|
2011
|
+
bytes: mp3,
|
|
2012
|
+
providerNote: `${note} · kind=${ctx.audioKind} · voice=${ctx.voice || '-'} · duration=${ctx.duration ?? '?'}s`,
|
|
2013
|
+
};
|
|
2014
|
+
}
|
|
2015
|
+
function svgPlaceholder(ctx) {
|
|
2016
|
+
const [w, h] = aspectToBox(ctx.aspect, 800);
|
|
2017
|
+
const safe = (s) => String(s || '')
|
|
2018
|
+
.replace(/&/g, '&')
|
|
2019
|
+
.replace(/</g, '<')
|
|
2020
|
+
.replace(/>/g, '>');
|
|
2021
|
+
return [
|
|
2022
|
+
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${w} ${h}" width="${w}" height="${h}">`,
|
|
2023
|
+
`<rect width="${w}" height="${h}" fill="#0f1424"/>`,
|
|
2024
|
+
`<text x="50%" y="50%" fill="#7da4ff" font-family="ui-sans-serif" font-size="20" text-anchor="middle">${safe(ctx.model)} — ${safe(ctx.prompt).slice(0, 60)}</text>`,
|
|
2025
|
+
'</svg>',
|
|
2026
|
+
].join('');
|
|
2027
|
+
}
|
|
2028
|
+
function aspectToBox(aspect, base) {
|
|
2029
|
+
const [a, b] = String(aspect || '1:1').split(':').map(Number);
|
|
2030
|
+
if (!a || !b)
|
|
2031
|
+
return [base, base];
|
|
2032
|
+
if (a >= b)
|
|
2033
|
+
return [base, Math.round((base * b) / a)];
|
|
2034
|
+
return [Math.round((base * a) / b), base];
|
|
2035
|
+
}
|
|
2036
|
+
function silentWav(seconds) {
|
|
2037
|
+
const sampleRate = 8000;
|
|
2038
|
+
const numSamples = Math.max(1, Math.round(sampleRate * seconds));
|
|
2039
|
+
const dataSize = numSamples * 2;
|
|
2040
|
+
const buf = Buffer.alloc(44 + dataSize);
|
|
2041
|
+
buf.write('RIFF', 0, 'ascii');
|
|
2042
|
+
buf.writeUInt32LE(36 + dataSize, 4);
|
|
2043
|
+
buf.write('WAVE', 8, 'ascii');
|
|
2044
|
+
buf.write('fmt ', 12, 'ascii');
|
|
2045
|
+
buf.writeUInt32LE(16, 16);
|
|
2046
|
+
buf.writeUInt16LE(1, 20);
|
|
2047
|
+
buf.writeUInt16LE(1, 22);
|
|
2048
|
+
buf.writeUInt32LE(sampleRate, 24);
|
|
2049
|
+
buf.writeUInt32LE(sampleRate * 2, 28);
|
|
2050
|
+
buf.writeUInt16LE(2, 32);
|
|
2051
|
+
buf.writeUInt16LE(16, 34);
|
|
2052
|
+
buf.write('data', 36, 'ascii');
|
|
2053
|
+
buf.writeUInt32LE(dataSize, 40);
|
|
2054
|
+
return buf;
|
|
2055
|
+
}
|
|
2056
|
+
function truncate(s, n) {
|
|
2057
|
+
const v = String(s || '');
|
|
2058
|
+
if (v.length <= n)
|
|
2059
|
+
return v;
|
|
2060
|
+
return v.slice(0, n - 1) + '…';
|
|
2061
|
+
}
|
|
2062
|
+
function sleep(ms) {
|
|
2063
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
2064
|
+
}
|
|
2065
|
+
//# sourceMappingURL=media.js.map
|