mirror of
https://github.com/storytold/artcraft.git
synced 2026-10-25 18:49:38 +00:00
bec8c7ede4
Frontend for the new omni audio API
(`/v1/omni_gen/{models,generate,cost}/audio`).
### New pages
- **Webapp**: `/create-audio` page (desktop layout + mobile
Generate/History tabs with settings drawers), added to sidebar.
- **Desktop**: new `AUDIO` tab ("Create Audio") with `PromptBoxAudio`,
registered in the app menu / TopBar. Audio enqueues over HTTP and polls
the jobs feed (Tauri task queue untouched).
### Models & promptbox
- Suno Music / Remix / Sounds / Sample + Seed Audio 1.0, fetched live
from `GET /v1/omni_gen/models/audio` with per-model capability gating.
- Always-visible **style prompt** row (Suno tags), instrumental /
keep-lyrics / loop toggles, BPM + musical key popover (Suno Sounds),
sample rate + speed/volume/pitch tuning popover (Seed Audio).
- Audio/image reference uploads with server rules mirrored client-side
(remix/sample require exactly 1 audio track; Seed Audio can't combine
audio + image refs).
- One request can return multiple job tokens (Suno multi-clip) - every
token becomes its own pending card.
### Audio playback in galleries
- New **`@storyteller/ui-audio-player`** lib (wavesurfer.js v7):
waveform + seek, play/pause, volume, duration - only one player plays at
a time.
- Lazy waveform decode (IntersectionObserver + peaks cache) and a
no-waveform `<audio>` fallback if CORS/decode fails.
- Audio cards/rows added once in the shared `ui-generation-list`, so
both hosts' grid + list views get them.
- Audio playback in both lightboxes (webapp lightbox + desktop
lightbox-modal); Library gets an **Audio** filter tab and includes audio
in "All"; downloads keep the right extension.
### Shared plumbing
- `OmniGenApi` gains audio types + `getAudioModels` / `generateAudio` /
`estimateAudioCost`.
- `useOmniGenAudioModels`, request builder, enqueue + cost hook shared
via `@storyteller/omni-gen` (used by both hosts).
- `useGenerationJobs` moved from the webapp into `ui-generation-list`
(with re-export shim) and taught the `audio_generation` category - the
desktop audio feed reuses it.
- Suno model names/descriptions/creator icon added to `model-list`.
171 lines
3.4 KiB
JSON
171 lines
3.4 KiB
JSON
{
|
|
"extends": "../../tsconfig.base.json",
|
|
"include": [
|
|
"env.d.ts",
|
|
"app/**/*.js",
|
|
"app/**/*.ts",
|
|
"app/**/*.tsx",
|
|
"netlify-edge-plugin.ts"
|
|
],
|
|
"compilerOptions": {
|
|
"lib": [
|
|
"DOM",
|
|
"DOM.Iterable",
|
|
"ESNext"
|
|
],
|
|
"isolatedModules": true,
|
|
"esModuleInterop": true,
|
|
"jsx": "react-jsx",
|
|
"module": "ESNext",
|
|
"moduleResolution": "bundler",
|
|
"resolveJsonModule": true,
|
|
"target": "ESNext",
|
|
"strict": true,
|
|
"allowJs": true,
|
|
"skipLibCheck": true,
|
|
"forceConsistentCasingInFileNames": true,
|
|
// Vite takes care of building everything, not tsc.
|
|
"noEmit": true
|
|
},
|
|
"references": [
|
|
{
|
|
"path": "../../libs/components/video-editor"
|
|
},
|
|
{
|
|
"path": "../../libs/components/moodboard"
|
|
},
|
|
{
|
|
"path": "../../libs/components/vfx"
|
|
},
|
|
{
|
|
"path": "../../libs/omni-gen"
|
|
},
|
|
{
|
|
"path": "../../libs/components/slider-v2"
|
|
},
|
|
{
|
|
"path": "../../libs/components/loading-spinner"
|
|
},
|
|
{
|
|
"path": "../../libs/components/login-modal"
|
|
},
|
|
{
|
|
"path": "../../libs/soundboard"
|
|
},
|
|
{
|
|
"path": "../../libs/components/pagedraw"
|
|
},
|
|
{
|
|
"path": "../../libs/components/settings-modal"
|
|
},
|
|
{
|
|
"path": "../../libs/components/menu-icon-selector"
|
|
},
|
|
{
|
|
"path": "../../libs/state/subscription"
|
|
},
|
|
{
|
|
"path": "../../libs/components/provider-setup-modal"
|
|
},
|
|
{
|
|
"path": "../../libs/components/provider-billing-modal"
|
|
},
|
|
{
|
|
"path": "../../libs/analytics/google-analytics"
|
|
},
|
|
{
|
|
"path": "../../libs/state/credits"
|
|
},
|
|
{
|
|
"path": "../../libs/api-enums"
|
|
},
|
|
{
|
|
"path": "../../libs/components/action-reminder-modal"
|
|
},
|
|
{
|
|
"path": "../../libs/components/close-button"
|
|
},
|
|
{
|
|
"path": "../../libs/components/popover"
|
|
},
|
|
{
|
|
"path": "../../libs/components/gravatar"
|
|
},
|
|
{
|
|
"path": "../../libs/components/modal"
|
|
},
|
|
{
|
|
"path": "../../libs/components/loading"
|
|
},
|
|
{
|
|
"path": "../../libs/components/file-uploader"
|
|
},
|
|
{
|
|
"path": "../../libs/components/input"
|
|
},
|
|
{
|
|
"path": "../../libs/components/select"
|
|
},
|
|
{
|
|
"path": "../../libs/components/checkbox"
|
|
},
|
|
{
|
|
"path": "../../libs/common"
|
|
},
|
|
{
|
|
"path": "../../libs/tauri-events"
|
|
},
|
|
{
|
|
"path": "../../libs/components/promptbox"
|
|
},
|
|
{
|
|
"path": "../../libs/components/generation-list"
|
|
},
|
|
{
|
|
"path": "../../libs/components/toaster"
|
|
},
|
|
{
|
|
"path": "../../libs/components/help-menu"
|
|
},
|
|
{
|
|
"path": "../../libs/components/pricing-modal"
|
|
},
|
|
{
|
|
"path": "../../libs/components/model-selector"
|
|
},
|
|
{
|
|
"path": "../../libs/model-list"
|
|
},
|
|
{
|
|
"path": "../../libs/components/gallery-modal"
|
|
},
|
|
{
|
|
"path": "../../libs/components/viewer-3d"
|
|
},
|
|
{
|
|
"path": "../../libs/components/tooltip"
|
|
},
|
|
{
|
|
"path": "../../libs/components/tab-selector"
|
|
},
|
|
{
|
|
"path": "../../libs/components/button"
|
|
},
|
|
{
|
|
"path": "../../libs/components/upload-modal"
|
|
},
|
|
{
|
|
"path": "../../libs/tauri-api"
|
|
},
|
|
{
|
|
"path": "../../libs/components/pagescene"
|
|
},
|
|
{
|
|
"path": "../../libs/tauri-utils"
|
|
},
|
|
{
|
|
"path": "../../libs/api"
|
|
}
|
|
]
|
|
}
|