openvibers/openvibe.live Commits

N-1 fixtures re-recorded from fb3957f, the release now in production (npm run n-1:record).

OP OpenVibers committed 29 Sept 2026 · b3b93dbf9c · 2 files, +19 −28


Changes

ddiff --git a/test/fixtures/n-1/client.json b/test/fixtures/n-1/client.json
iindex fc827831..9e2f84a8 100644
---- a/test/fixtures/n-1/client.json
++++ b/test/fixtures/n-1/client.json
@@@ -1,13 +1,13 @@
{
"service": "live",
-- "release": "8654ef6b86143d4117ff010ce19aa0124a6bcd57",
-- "recorded_at": "2026-09-29T17:33:21.954Z",
++ "release": "fb3957f3ca2b54b65f3e51aa70eff606a47c5928",
++ "recorded_at": "2026-09-29T18:32:58.308Z",
"note": "N-1 fixture: written by `npm run n-1:record`, replayed by test/n-1.test.js",
"manifest": {
"service": "live",
-- "release": "8654ef6b8614",
-- "released_at": "2026-09-29T17:32:19.000Z",
-- "booted_at": "2026-09-29T17:33:19.050Z",
++ "release": "fb3957f3ca2b",
++ "released_at": "2026-09-29T18:32:06.000Z",
++ "booted_at": "2026-09-29T18:32:56.084Z",
"contracts_version": "0.71.0",
"packages": {
"openvibe-shared": "1.30.1",
@@@ -22,11 +22,11 @@
},
"shell": {
"kind": "script",
-- "version": "a1a892dca8f8"
++ "version": "a6dd3b98e643"
},
"server": {
"kind": "server",
-- "version": "ac8c4a25efa6"
++ "version": "521d6d204d65"
}
},
"assets": {
@@@ -7275,7 +7275,7 @@
},
{
"method": "GET",
-- "path": "/js/app-home.js?v=a0db64b33480",
++ "path": "/js/app-home.js?v=f3884800e9a3",
"auth": "anon",
"accept": "html",
"status": 200,
ddiff --git a/test/fixtures/n-1/worker.json b/test/fixtures/n-1/worker.json
iindex cfe6cf91..944b4efe 100644
---- a/test/fixtures/n-1/worker.json
++++ b/test/fixtures/n-1/worker.json
@@@ -1,7 +1,7 @@
{
"service": "live",
-- "release": "8654ef6b86143d4117ff010ce19aa0124a6bcd57",
-- "recorded_at": "2026-09-29T17:33:21.954Z",
++ "release": "fb3957f3ca2b54b65f3e51aa70eff606a47c5928",
++ "recorded_at": "2026-09-29T18:32:58.308Z",
"note": "N-1 fixture: written by `npm run n-1:record`, replayed by test/n-1.test.js",
"user_version": 0,
"schema": [
@@@ -28,17 +28,11 @@
"CREATE TABLE cameras (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n stream_id INTEGER NOT NULL,\n camera_index INTEGER DEFAULT 0,\n label TEXT DEFAULT 'Main',\n protocol TEXT DEFAULT 'jsmpeg',\n jsmpeg_video_port INTEGER,\n jsmpeg_audio_port INTEGER,\n webrtc_room_id TEXT,\n is_active INTEGER DEFAULT 1,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (stream_id) REFERENCES streams(id) ON DELETE CASCADE\n)",
"CREATE TABLE channel_ai_bots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n channel_user_id INTEGER NOT NULL, -- the streamer (owner)\n username TEXT NOT NULL,\n display_name TEXT,\n avatar_color TEXT DEFAULT '#8a8aff',\n source TEXT DEFAULT 'ambient', -- 'ambient' | 'clone'\n cloned_from_kind TEXT, -- 'user' | 'relay' | NULL\n cloned_from_ref TEXT, -- user_id (string) or \"platform:username\"\n persona_json TEXT DEFAULT '{}', -- character + typing style + identity\n brain_json TEXT DEFAULT '{}', -- rolling condensed memory + short timeline\n is_active INTEGER DEFAULT 1,\n msg_count INTEGER DEFAULT 0,\n last_active_at DATETIME,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (channel_user_id) REFERENCES users(id) ON DELETE CASCADE\n )",
"CREATE TABLE channel_ai_config (\n user_id INTEGER PRIMARY KEY,\n enabled INTEGER DEFAULT 0,\n num_ambient_bots INTEGER DEFAULT 3,\n pacing_seconds INTEGER DEFAULT 45,\n persona TEXT DEFAULT '',\n transcribe_enabled INTEGER DEFAULT 0,\n vision_enabled INTEGER DEFAULT 0,\n use_shared_key INTEGER DEFAULT 1, -- 1 = OpenVibe.Live shared key (capped), 0 = BYO\n daily_budget_cents INTEGER DEFAULT 20, -- shared-key daily cap\n byo_key TEXT DEFAULT '',\n byo_base_url TEXT DEFAULT '',\n byo_model TEXT DEFAULT 'gpt-4o-mini',\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, settings_json TEXT DEFAULT '{}', byo_in_ai INTEGER DEFAULT 0,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )",
-- "CREATE TABLE channel_moderation_settings (\n channel_id INTEGER PRIMARY KEY,\n slow_mode_seconds INTEGER DEFAULT 0,\n followers_only INTEGER DEFAULT 0,\n emote_only INTEGER DEFAULT 0,\n allow_anonymous INTEGER DEFAULT 1,\n links_allowed INTEGER DEFAULT 1,\n gifs_enabled INTEGER DEFAULT 1,\n account_age_gate_hours INTEGER DEFAULT 0,\n caps_percentage_limit INTEGER DEFAULT 0,\n aggressive_filter INTEGER DEFAULT 0,\n max_message_length INTEGER DEFAULT 500,\n slur_filter_enabled INTEGER DEFAULT 0,\n slur_filter_use_builtin INTEGER DEFAULT 1,\n slur_filter_terms TEXT DEFAULT '',\n slur_filter_regexes TEXT DEFAULT '',\n slur_filter_nudge_message TEXT DEFAULT '',\n slur_filter_disabled_categories TEXT DEFAULT '[]',\n ip_approval_mode INTEGER DEFAULT 0,\n soundboard_enabled INTEGER DEFAULT 1,\n soundboard_allow_pitch INTEGER DEFAULT 1,\n soundboard_allow_speed INTEGER DEFAULT 1,\n soundboard_banned_ids TEXT DEFAULT '',\n viewer_auto_delete_enabled INTEGER DEFAULT 1,\n viewer_delete_all_enabled INTEGER DEFAULT 1,\n custom_emotes_enabled INTEGER DEFAULT 1, -- viewers may upload gif/png emotes for this channel\n custom_sounds_enabled INTEGER DEFAULT 1, -- viewers may upload !sound commands for this channel\n max_sound_seconds INTEGER DEFAULT 10, -- max duration of an uploaded channel sound\n uploads_mods_only INTEGER DEFAULT 0, -- restrict emote/sound uploads to channel mods\n mods_can_edit_about INTEGER DEFAULT 0, -- allow channel mods to edit the streamer's About/panels\n donation_sound_url TEXT, -- on-disk path to the streamer's donation alert sound\n donation_sound_mime TEXT,\n goal_sound_url TEXT, -- optional override sound for goal-reached\n goal_sound_mime TEXT,\n emote_scale INTEGER DEFAULT 100, -- emote display size in chat, percent (50-300)\n sub_only INTEGER DEFAULT 0, -- only active subscribers (and the channel's moderators) may chat\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, tts_max_length INTEGER DEFAULT 200, sound_min_speed REAL DEFAULT 0.5, sound_max_speed REAL DEFAULT 3.0, sound_min_pitch_cents INTEGER DEFAULT -1200, sound_max_pitch_cents INTEGER DEFAULT 1200, emote_size_min INTEGER DEFAULT 50, emote_size_max INTEGER DEFAULT 200, sounds_mods_only INTEGER DEFAULT 0,\n FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE\n)",
-- "CREATE TABLE channel_moderators (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n channel_id INTEGER NOT NULL,\n user_id INTEGER NOT NULL,\n added_by INTEGER NOT NULL,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(channel_id, user_id),\n FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\n FOREIGN KEY (added_by) REFERENCES users(id) ON DELETE SET NULL\n)",
"CREATE TABLE channel_points (\n user_id INTEGER NOT NULL,\n streamer_id INTEGER NOT NULL,\n balance INTEGER NOT NULL DEFAULT 0,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (user_id, streamer_id)\n )",
"CREATE TABLE channel_points_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n idempotency_key TEXT NOT NULL UNIQUE,\n user_id INTEGER NOT NULL,\n streamer_id INTEGER NOT NULL,\n delta INTEGER NOT NULL,\n reason TEXT,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n )",
"CREATE TABLE channel_sounds (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n channel_owner_id INTEGER NOT NULL, -- streamer whose channel this sound belongs to\n command TEXT NOT NULL, -- trigger word (without leading '!'), lowercased\n url TEXT NOT NULL, -- served path of the audio file on disk\n mime TEXT DEFAULT 'audio/mpeg',\n duration_seconds REAL DEFAULT 0,\n created_by INTEGER, -- uploader user id (NULL if removed user)\n created_by_name TEXT DEFAULT '',\n is_approved INTEGER DEFAULT 1,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP, emote_code TEXT DEFAULT '',\n -- Multiple sounds may share a command; playback picks one at random.\n FOREIGN KEY (channel_owner_id) REFERENCES users(id) ON DELETE CASCADE\n)",
"CREATE TABLE channels (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL UNIQUE,\n title TEXT DEFAULT 'Untitled Channel',\n description TEXT DEFAULT '',\n category TEXT DEFAULT 'irl',\n tags TEXT DEFAULT '[]',\n protocol TEXT DEFAULT 'webrtc' CHECK(protocol IN ('jsmpeg', 'webrtc', 'rtmp')),\n is_nsfw INTEGER DEFAULT 0,\n auto_record INTEGER DEFAULT 0,\n offline_banner_url TEXT,\n panels TEXT DEFAULT '[]', -- JSON array of info panels\n emote_sources TEXT DEFAULT '{\"defaults\":true,\"custom\":true,\"ffz\":true,\"bttv\":true,\"7tv\":true}',\n default_vod_visibility TEXT DEFAULT 'public' CHECK(default_vod_visibility IN ('public', 'unlisted', 'private')),\n default_clip_visibility TEXT DEFAULT 'public' CHECK(default_clip_visibility IN ('public', 'unlisted', 'private')),\n vod_recording_enabled INTEGER DEFAULT 1,\n force_vod_recording_disabled INTEGER DEFAULT 0,\n weather_zip TEXT DEFAULT NULL,\n weather_detail TEXT DEFAULT 'basic' CHECK(weather_detail IN ('off', 'basic', 'hourly', 'detailed')),\n weather_show_location INTEGER DEFAULT 0,\n control_mode TEXT DEFAULT 'open' CHECK(control_mode IN ('open','whitelist','disabled')),\n anon_controls_enabled INTEGER DEFAULT 1,\n control_rate_limit_ms INTEGER DEFAULT 100,\n video_click_enabled INTEGER DEFAULT 0,\n video_click_rate_limit_ms INTEGER DEFAULT 0,\n active_control_config_id INTEGER,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, chat_language TEXT DEFAULT 'auto', cp_name TEXT DEFAULT 'Channel Points', cp_icon TEXT DEFAULT 'fa-coins', cp_watch_interval_min INTEGER DEFAULT 5, cp_watch_amount INTEGER DEFAULT 10, cp_game_interval_min INTEGER DEFAULT 0, clips_allow_creator_delete INTEGER DEFAULT 0, hide_ai_overview INTEGER DEFAULT 0, ai_overview_pref TEXT DEFAULT 'auto', ai_derivation_enabled INTEGER DEFAULT 1, ai_category TEXT, force_nsfw INTEGER DEFAULT 0, offline_screen_type TEXT DEFAULT 'none', offline_screen_url TEXT, offline_html TEXT, offline_css TEXT, social_links TEXT,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n)",
-- "CREATE TABLE chat_ai_summaries (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n scope TEXT NOT NULL,\n subject_id INTEGER NOT NULL DEFAULT 0,\n window TEXT NOT NULL,\n overview TEXT DEFAULT '',\n memory_json TEXT DEFAULT '',\n timeline_json TEXT DEFAULT '[]',\n message_count INTEGER DEFAULT 0,\n window_message_count INTEGER DEFAULT 0,\n last_message_id INTEGER DEFAULT 0,\n window_label TEXT DEFAULT '',\n window_start DATETIME,\n window_end DATETIME,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(scope, subject_id, window)\n )",
-- "CREATE TABLE chat_dual_read_stats (\n tbl TEXT PRIMARY KEY,\n compared INTEGER NOT NULL DEFAULT 0,\n matched INTEGER NOT NULL DEFAULT 0,\n mismatched INTEGER NOT NULL DEFAULT 0,\n inconclusive INTEGER NOT NULL DEFAULT 0,\n errors INTEGER NOT NULL DEFAULT 0,\n last_mismatch_at DATETIME,\n last_mismatch TEXT,\n since DATETIME DEFAULT CURRENT_TIMESTAMP\n)",
"CREATE TABLE \"chat_messages\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n stream_id INTEGER,\n user_id INTEGER, -- NULL for anon\n anon_id TEXT, -- 'anon12345' format\n username TEXT,\n message TEXT NOT NULL,\n message_type TEXT DEFAULT 'chat' CHECK(message_type IN ('chat', 'system', 'donation', 'command', 'tts', 'channel-sound', 'soundboard', 'clip')),\n metadata TEXT, -- JSON sidecar for rich events (donation/goal-reached)\n is_global INTEGER DEFAULT 0,\n is_deleted INTEGER DEFAULT 0,\n is_filtered INTEGER DEFAULT 0,\n reply_to_id INTEGER REFERENCES chat_messages(id) ON DELETE SET NULL,\n source_platform TEXT,\n deleted_by INTEGER,\n deleted_at DATETIME,\n auto_delete_at DATETIME,\n timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, channel_user_id INTEGER,\n FOREIGN KEY (stream_id) REFERENCES streams(id) ON DELETE CASCADE,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL\n)",
-- "CREATE TABLE chat_staged_outbox (\n seq INTEGER PRIMARY KEY AUTOINCREMENT,\n tbl TEXT NOT NULL,\n op TEXT NOT NULL,\n pk TEXT NOT NULL,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n)",
-- "CREATE TABLE chat_timeline_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n scope TEXT NOT NULL DEFAULT 'global',\n subject_id INTEGER NOT NULL DEFAULT 0,\n ts DATETIME NOT NULL,\n label TEXT NOT NULL,\n detail TEXT DEFAULT '',\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n )",
"CREATE TABLE clip_ai_state (\n clip_id INTEGER PRIMARY KEY,\n ai_overview_short TEXT,\n ai_transcript_json TEXT,\n transcript_status TEXT,\n transcript_attempts INTEGER DEFAULT 0,\n transcript_error TEXT,\n transcript_next_at DATETIME,\n clip_notified INTEGER DEFAULT 0,\n clip_notify_at DATETIME\n , ai_overview TEXT, transcript_partial_json TEXT, transcript_progress_sec INTEGER DEFAULT 0)",
"CREATE TABLE clips (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n vod_id INTEGER,\n stream_id INTEGER,\n user_id INTEGER NOT NULL,\n title TEXT DEFAULT 'Untitled Clip',\n description TEXT DEFAULT '',\n file_path TEXT,\n thumbnail_url TEXT,\n start_time REAL NOT NULL DEFAULT 0,\n end_time REAL NOT NULL DEFAULT 0,\n duration_seconds REAL DEFAULT 0,\n is_public INTEGER DEFAULT 1,\n view_count INTEGER DEFAULT 0,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP, storage_provider TEXT DEFAULT 'local', storage_key TEXT, ai_overview TEXT, ai_transcript TEXT, ai_analyzed_at DATETIME, clip_notified INTEGER DEFAULT 0, clip_notify_at DATETIME, visibility TEXT DEFAULT 'public', auto_generated INTEGER DEFAULT 0,\n FOREIGN KEY (vod_id) REFERENCES vods(id) ON DELETE SET NULL,\n FOREIGN KEY (stream_id) REFERENCES streams(id) ON DELETE SET NULL,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n)",
"CREATE TABLE coin_redemptions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n reward_id INTEGER NOT NULL,\n user_id INTEGER NOT NULL,\n stream_id INTEGER,\n status TEXT DEFAULT 'pending' CHECK(status IN ('pending', 'fulfilled', 'rejected', 'refunded')),\n user_input TEXT, -- message if requires_input\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n resolved_at DATETIME,\n FOREIGN KEY (reward_id) REFERENCES coin_rewards(id) ON DELETE CASCADE,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\n FOREIGN KEY (stream_id) REFERENCES streams(id) ON DELETE SET NULL\n)",
@@@ -97,7 +91,6 @@
"CREATE TABLE user_equipped (\n user_id INTEGER NOT NULL,\n slot TEXT NOT NULL, -- 'name_effect'|'particle'|'hat'|'voice'\n item_id TEXT NOT NULL,\n PRIMARY KEY (user_id, slot),\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n)",
"CREATE TABLE user_equipped_tag (\n user_id INTEGER NOT NULL PRIMARY KEY,\n tag_id TEXT NOT NULL,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )",
"CREATE TABLE user_preferences (\n user_id INTEGER PRIMARY KEY,\n chat_settings TEXT DEFAULT '{}',\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n)",
-- "CREATE TABLE user_tags (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n tag_id TEXT NOT NULL,\n source TEXT DEFAULT 'shop',\n granted_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(user_id, tag_id),\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )",
"CREATE TABLE user_themes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n theme_id INTEGER, -- NULL = custom\n custom_variables TEXT DEFAULT '{}', -- JSON: custom overrides\n is_custom INTEGER DEFAULT 0,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\n FOREIGN KEY (theme_id) REFERENCES themes(id) ON DELETE SET NULL\n)",
"CREATE TABLE users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n username TEXT UNIQUE NOT NULL,\n email TEXT UNIQUE,\n password_hash TEXT NOT NULL,\n display_name TEXT,\n avatar_url TEXT,\n bio TEXT DEFAULT '',\n role TEXT DEFAULT 'user' CHECK(role IN ('user', 'streamer', 'global_mod', 'admin')),\n stream_key TEXT UNIQUE,\n openvibe_bucks_balance REAL DEFAULT 0.00,\n openvibe_coins_balance INTEGER DEFAULT 0,\n is_banned INTEGER DEFAULT 0,\n ban_reason TEXT,\n profile_color TEXT DEFAULT '#8b5cf6',\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n last_seen DATETIME DEFAULT CURRENT_TIMESTAMP\n, openvibe_bucks_cashout_balance REAL DEFAULT 0.00, token_valid_after TEXT DEFAULT NULL, max_managed_streams INTEGER DEFAULT 3, avatar_paste_id INTEGER DEFAULT NULL, is_owner INTEGER DEFAULT 0)",
"CREATE TABLE verification_keys (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n key TEXT UNIQUE NOT NULL,\n target_username TEXT NOT NULL, -- the reserved username this key unlocks\n note TEXT DEFAULT '', -- admin notes (e.g. RS-Companion user_id)\n created_by INTEGER NOT NULL, -- admin who generated it\n used_by INTEGER, -- user who redeemed it (NULL until used)\n status TEXT DEFAULT 'active' CHECK(status IN ('active', 'used', 'revoked')),\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n used_at DATETIME,\n FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE CASCADE,\n FOREIGN KEY (used_by) REFERENCES users(id) ON DELETE SET NULL\n)",
@@@ -128,19 +121,14 @@
"CREATE INDEX idx_cameras_stream_id ON cameras(stream_id)",
"CREATE INDEX idx_channel_ai_bots_channel ON channel_ai_bots(channel_user_id, is_active)",
"CREATE UNIQUE INDEX idx_channel_ai_bots_uname ON channel_ai_bots(channel_user_id, username)",
-- "CREATE INDEX idx_channel_mods_channel ON channel_moderators(channel_id)",
-- "CREATE INDEX idx_channel_mods_user ON channel_moderators(user_id)",
"CREATE INDEX idx_channel_sounds_cmd ON channel_sounds(channel_owner_id, command)",
"CREATE INDEX idx_channel_sounds_owner ON channel_sounds(channel_owner_id)",
"CREATE INDEX idx_channels_user_id ON channels(user_id)",
-- "CREATE INDEX idx_chat_ai_scope ON chat_ai_summaries(scope, subject_id, window)",
"CREATE INDEX idx_chat_autodelete ON chat_messages(auto_delete_at)",
"CREATE INDEX idx_chat_channel_user_ts ON chat_messages(channel_user_id, timestamp)",
"CREATE INDEX idx_chat_stream_id ON chat_messages(stream_id)",
"CREATE INDEX idx_chat_stream_ts ON chat_messages(stream_id, timestamp)",
"CREATE INDEX idx_chat_timestamp ON chat_messages(timestamp)",
-- "CREATE UNIQUE INDEX idx_chat_tl_dedup ON chat_timeline_events(scope, subject_id, ts, label)",
-- "CREATE INDEX idx_chat_tl_scope_ts ON chat_timeline_events(scope, subject_id, ts DESC)",
"CREATE INDEX idx_chat_ts_deleted ON chat_messages(timestamp, is_deleted)",
"CREATE INDEX idx_chat_user_id ON chat_messages(user_id)",
"CREATE UNIQUE INDEX idx_clip_ai_state_clip_id_unique ON clip_ai_state(clip_id)",
@@@ -236,7 +224,6 @@
"CREATE INDEX idx_transactions_to_user ON transactions(to_user_id)",
"CREATE INDEX idx_tx_type_created ON transactions(type, created_at)",
"CREATE INDEX idx_user_cosmetics_user ON user_cosmetics(user_id)",
-- "CREATE INDEX idx_user_tags_user ON user_tags(user_id)",
"CREATE INDEX idx_user_themes_user ON user_themes(user_id)",
"CREATE INDEX idx_users_created ON users(created_at)",
"CREATE INDEX idx_users_role ON users(role)",
@@@ -259,21 +246,27 @@
"schema_migrations": [
{
"id": "001_vibes_decimal_to_bits",
-- "applied_at": "2026-09-29 17:33:17",
++ "applied_at": "2026-09-29 18:32:54",
"mode": "adopted",
"duration_ms": 0
},
{
"id": "002_pastes_ai_columns",
-- "applied_at": "2026-09-29 17:33:17",
++ "applied_at": "2026-09-29 18:32:54",
"mode": "applied",
"duration_ms": 8
},
{
"id": "004_hot_path_indexes",
-- "applied_at": "2026-09-29 17:33:17",
++ "applied_at": "2026-09-29 18:32:54",
"mode": "applied",
"duration_ms": 1
++ },
++ {
++ "id": "005_drop_chat_staged_tables",
++ "applied_at": "2026-09-29 18:32:54",
++ "mode": "adopted",
++ "duration_ms": 0
}
]
},
@@@ -709,8 +702,6 @@
"SELECT COUNT(*) AS count FROM donation_goals WHERE created_at >= datetime('now', ?)",
"SELECT COUNT(*) AS count FROM donation_goals WHERE is_active = 1",
"SELECT COUNT(*) AS count FROM donation_goals WHERE reached_at IS NOT NULL OR current_amount >= target_amount",
-- "SELECT COUNT(*) AS count FROM emotes WHERE created_at >= datetime('now', '-14 days') AND created_at < datetime('now', '-7 days')",
-- "SELECT COUNT(*) AS count FROM emotes WHERE created_at >= datetime('now', ?)",
"SELECT COUNT(*) AS count FROM follows",
"SELECT COUNT(*) AS count FROM follows WHERE created_at >= datetime('now', '-14 days') AND created_at < datetime('now', '-7 days')",
"SELECT COUNT(*) AS count FROM follows WHERE created_at >= datetime('now', ?)",