package store // schema is the SQLite DDL applied on Open. It is idempotent. const schema = ` CREATE TABLE IF NOT EXISTS workspaces ( id TEXT PRIMARY KEY, name TEXT NOT NULL, slug TEXT NOT NULL UNIQUE, created_at TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, role TEXT NOT NULL DEFAULT 'Member', created_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_users_workspace ON users(workspace_id); CREATE TABLE IF NOT EXISTS sessions ( token TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, created_at TEXT NOT NULL, expires_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions(user_id); CREATE TABLE IF NOT EXISTS model_profiles ( id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, source_type TEXT NOT NULL, source_uri TEXT NOT NULL DEFAULT '', provider TEXT NOT NULL DEFAULT '', external_id TEXT NOT NULL DEFAULT '', display_name TEXT NOT NULL DEFAULT '', task TEXT NOT NULL DEFAULT '', library TEXT NOT NULL DEFAULT '', license TEXT NOT NULL DEFAULT '', tags_json TEXT NOT NULL DEFAULT '[]', metadata_json TEXT NOT NULL DEFAULT '{}', status TEXT NOT NULL DEFAULT 'profile_only', created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_profiles_workspace ON model_profiles(workspace_id); CREATE TABLE IF NOT EXISTS model_runtime_installations ( id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, model_profile_id TEXT NOT NULL, runtime_id TEXT NOT NULL, install_mode TEXT NOT NULL DEFAULT 'pull_from_source', serving_engine TEXT NOT NULL DEFAULT '', status TEXT NOT NULL DEFAULT 'queued', progress INTEGER NOT NULL DEFAULT 0, local_path TEXT NOT NULL DEFAULT '', endpoint_url TEXT NOT NULL DEFAULT '', job_id TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_installs_workspace ON model_runtime_installations(workspace_id); -- =========================================================================== -- Hosted MatrixCloud (cloud.matrixhub.io): per-workspace runtimes, join -- tokens, BYO provider credentials and usage metering. All additive. -- =========================================================================== -- A registered runtime/sandbox plane that belongs to a workspace. A user's -- duplicated Hugging Face Space registers itself here (outbound) and is then -- managed centrally from the control plane. CREATE TABLE IF NOT EXISTS runtimes ( id TEXT PRIMARY KEY, -- rt_xxxx workspace_id TEXT NOT NULL, name TEXT NOT NULL, mode TEXT NOT NULL DEFAULT 'customer-agent', kind TEXT NOT NULL DEFAULT 'self-hosted', -- hf-space | self-hosted | local url TEXT NOT NULL DEFAULT '', -- e.g. https://user-space.hf.space hf_space TEXT NOT NULL DEFAULT '', -- "owner/space" for HF-space runtimes region TEXT NOT NULL DEFAULT '', caps_json TEXT NOT NULL DEFAULT '[]', status TEXT NOT NULL DEFAULT 'pending', -- pending | online | idle | offline token_hash TEXT NOT NULL DEFAULT '', -- hashed runtime token (heartbeat auth) version TEXT NOT NULL DEFAULT '', last_seen_at TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_runtimes_workspace ON runtimes(workspace_id); -- Single/limited-use tokens a workspace mints so a runtime can join. CREATE TABLE IF NOT EXISTS runtime_join_tokens ( id TEXT PRIMARY KEY, -- jt_xxxx workspace_id TEXT NOT NULL, token_hash TEXT NOT NULL UNIQUE, -- hash of the mxrt_ token label TEXT NOT NULL DEFAULT '', created_by TEXT NOT NULL DEFAULT '', max_uses INTEGER NOT NULL DEFAULT 1, uses INTEGER NOT NULL DEFAULT 0, revoked INTEGER NOT NULL DEFAULT 0, expires_at TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_jointokens_workspace ON runtime_join_tokens(workspace_id); -- BYO model-provider credentials (Hugging Face token, OpenAI-compatible, …), -- AES-GCM encrypted at rest. This is how a free user plugs in their own HF -- account to use HF inference inside MatrixCloud. CREATE TABLE IF NOT EXISTS provider_credentials ( id TEXT PRIMARY KEY, -- pc_xxxx workspace_id TEXT NOT NULL, provider TEXT NOT NULL, -- huggingface | openai | ollama | vllm | anthropic label TEXT NOT NULL DEFAULT 'default', secret_enc TEXT NOT NULL DEFAULT '', -- AES-GCM ciphertext (never plaintext) hint TEXT NOT NULL DEFAULT '', -- last-4 display hint meta_json TEXT NOT NULL DEFAULT '{}', -- {base_url, default_model, …} created_by TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL, updated_at TEXT NOT NULL, UNIQUE(workspace_id, provider, label) ); CREATE INDEX IF NOT EXISTS idx_providers_workspace ON provider_credentials(workspace_id); -- Append-only metering for free-plan limits and analytics. CREATE TABLE IF NOT EXISTS usage_events ( id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, user_id TEXT NOT NULL DEFAULT '', runtime_id TEXT NOT NULL DEFAULT '', kind TEXT NOT NULL, -- model.inspect | sandbox.start | llm.tokens | model.attach | matrixshell.exec quantity INTEGER NOT NULL DEFAULT 1, meta_json TEXT NOT NULL DEFAULT '{}', created_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_usage_workspace ON usage_events(workspace_id, kind); -- =========================================================================== -- Account email flows (Resend): password resets and email verification. -- Tokens are stored hashed; only single-use, time-bounded rows are honored. -- =========================================================================== CREATE TABLE IF NOT EXISTS password_resets ( id TEXT PRIMARY KEY, -- pr_xxxx user_id TEXT NOT NULL, token_hash TEXT NOT NULL UNIQUE, expires_at TEXT NOT NULL, used_at TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_resets_user ON password_resets(user_id); CREATE TABLE IF NOT EXISTS email_verifications ( id TEXT PRIMARY KEY, -- ev_xxxx user_id TEXT NOT NULL, token_hash TEXT NOT NULL UNIQUE, expires_at TEXT NOT NULL, used_at TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_verifs_user ON email_verifications(user_id); -- =========================================================================== -- Audit log — append-only record of sensitive actions for traceability. -- =========================================================================== CREATE TABLE IF NOT EXISTS audit_events ( id TEXT PRIMARY KEY, -- au_xxxx workspace_id TEXT NOT NULL DEFAULT '', actor TEXT NOT NULL DEFAULT '', -- user_id or runtime_id action TEXT NOT NULL, -- e.g. sandbox.started target TEXT NOT NULL DEFAULT '', ip TEXT NOT NULL DEFAULT '', status TEXT NOT NULL DEFAULT 'success', -- success | failure meta_json TEXT NOT NULL DEFAULT '{}', created_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_audit_workspace ON audit_events(workspace_id, created_at); `