mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-16 05:10:42 -07:00
* Add "Log in with browser" cloud device login Connects the desktop app to Voicebox Cloud without the user ever handling an API key. One button in Settings → General opens the system browser to voicebox.sh, the user authorizes while signed in, and the credential lands back in the app automatically. Backend (FastAPI): - /cloud/login/start opens the browser to the cloud authorize page with a state we mint; the existing loopback server catches the redirect at /cloud/callback and exchanges the one-time code (server-to-server, over TLS) for a voicebox_ API key, verifies it against the API, and stores it. - /cloud/status and /cloud/disconnect back the settings UI. - state round-trip guards against login-CSRF; the key never crosses a browser URL and is never exposed to the frontend (status returns a prefix only). - CloudSettings singleton row; config gains VOICEBOX_CLOUD_URL / VOICEBOX_CLOUD_API_URL (default the prod hosts, overridable for dev). Frontend (React): - CloudSection in Settings → General: "Log in with browser", polls status, shows the connected device + a dashboard link. API keys are the advanced path only, surfaced in the web dashboard. The key is stored in the local app DB for now; OS keychain is a marked follow-up. * Address review feedback on cloud login - time out status polling after 2 min so an abandoned browser flow doesn't leave the button stuck on "Waiting for browser…" - handle non-JSON / non-object payloads from the exchange and account endpoints instead of 500ing after the state is consumed - make singleton row creation race-safe (IntegrityError -> re-query) - clear device_name on disconnect along with the rest of the metadata - serve the dashboard URL from /cloud/status so the Manage link follows VOICEBOX_CLOUD_URL instead of hardcoding production - keep a "Disconnecting…" label on the disconnect button while pending * Remove orphaned react-qr-code entries from lockfile bun.lock was out of date with package.json (react-qr-code was removed without reinstalling), failing the frozen-lockfile install in CI.
49 lines
1.9 KiB
Python
49 lines
1.9 KiB
Python
"""Route registration for the voicebox API."""
|
|
|
|
from fastapi import FastAPI
|
|
|
|
|
|
def register_routers(app: FastAPI) -> None:
|
|
"""Include all domain routers on the application."""
|
|
from .health import router as health_router
|
|
from .profiles import router as profiles_router
|
|
from .channels import router as channels_router
|
|
from .generations import router as generations_router
|
|
from .history import router as history_router
|
|
from .transcription import router as transcription_router
|
|
from .llm import router as llm_router
|
|
from .captures import router as captures_router
|
|
from .stories import router as stories_router
|
|
from .effects import router as effects_router
|
|
from .audio import router as audio_router
|
|
from .models import router as models_router
|
|
from .settings import router as settings_router
|
|
from .tasks import router as tasks_router
|
|
from .cuda import router as cuda_router
|
|
from .rocm import router as rocm_router
|
|
from .speak import router as speak_router
|
|
from .mcp_bindings import router as mcp_bindings_router
|
|
from .events import router as events_router
|
|
from .cloud import router as cloud_router
|
|
|
|
app.include_router(health_router)
|
|
app.include_router(profiles_router)
|
|
app.include_router(channels_router)
|
|
app.include_router(generations_router)
|
|
app.include_router(history_router)
|
|
app.include_router(transcription_router)
|
|
app.include_router(llm_router)
|
|
app.include_router(captures_router)
|
|
app.include_router(stories_router)
|
|
app.include_router(effects_router)
|
|
app.include_router(audio_router)
|
|
app.include_router(models_router)
|
|
app.include_router(settings_router)
|
|
app.include_router(tasks_router)
|
|
app.include_router(cuda_router)
|
|
app.include_router(rocm_router)
|
|
app.include_router(speak_router)
|
|
app.include_router(mcp_bindings_router)
|
|
app.include_router(events_router)
|
|
app.include_router(cloud_router)
|