openvibers/openvibe.live Commits
N-1 fixtures re-recorded from 9437263, the release now in production (npm run n-1:record).
Changes
@@@ -1,16 +1,16 @@{"service": "live",-- "release": "fb3957f3ca2b54b65f3e51aa70eff606a47c5928",-- "recorded_at": "2026-09-29T18:32:58.308Z",++ "release": "9437263f09b5f742aa4f8a5f0a5741029752d744",++ "recorded_at": "2026-10-02T16:12:35.016Z","note": "N-1 fixture: written by `npm run n-1:record`, replayed by test/n-1.test.js","manifest": {"service": "live",-- "release": "fb3957f3ca2b",-- "released_at": "2026-09-29T18:32:06.000Z",-- "booted_at": "2026-09-29T18:32:56.084Z",-- "contracts_version": "0.71.0",++ "release": "9437263f09b5",++ "released_at": "2026-10-02T16:01:38.000Z",++ "booted_at": "2026-10-02T16:12:30.723Z",++ "contracts_version": "0.83.0","packages": {-- "openvibe-shared": "1.30.1",++ "openvibe-shared": "2.4.0","openvibe-sdk": "0.16.0"},"min_client_release": null,@@@ -22,11 +22,11 @@},"shell": {"kind": "script",-- "version": "a6dd3b98e643"++ "version": "60a3f0a39211"},"server": {"kind": "server",-- "version": "521d6d204d65"++ "version": "b6aaf8e6e88d"}},"assets": {@@@ -2956,7 +2956,7 @@"method": "GET","path": "/api/pastes/config","auth": "anon",-- "status": 504,++ "status": 502,"kind": "json","from": ["public/js/pastes.js"@@@ -2966,7 +2966,7 @@"method": "GET","path": "/api/pastes/config","auth": "user",-- "status": 504,++ "status": 502,"kind": "json","from": ["public/js/pastes.js"@@@ -7088,7 +7088,7 @@},{"method": "GET",-- "path": "/shared/navbar.js?v=b8089ee3bd11",++ "path": "/shared/navbar.js?v=017a740747b4","auth": "anon","accept": "html","status": 200,@@@ -7099,7 +7099,7 @@},{"method": "GET",-- "path": "/js/app.js?v=4d24e4b46d7b",++ "path": "/js/app.js?v=0fd06344b140","auth": "anon","accept": "html","status": 200,@@@ -7275,7 +7275,7 @@},{"method": "GET",-- "path": "/js/app-home.js?v=f3884800e9a3",++ "path": "/js/app-home.js?v=1dc431184ccc","auth": "anon","accept": "html","status": 200,@@@ -7473,7 +7473,7 @@},{"method": "GET",-- "path": "/js/app-channel.js?v=c148cdba2aee",++ "path": "/js/app-channel.js?v=7734c5c60717","auth": "anon","accept": "html","status": 200,@@@ -8357,7 +8357,7 @@"method": "POST","path": "/api/pastes","auth": "anon",-- "status": 504,++ "status": 502,"kind": "json","from": ["public/js/pastes.js"@@@ -8397,7 +8397,7 @@"method": "POST","path": "/api/pastes/n1star/comments","auth": "anon",-- "status": 504,++ "status": 502,"kind": "json","from": ["public/js/pastes.js"@@@ -8417,7 +8417,7 @@"method": "POST","path": "/api/pastes/n1star/copy","auth": "anon",-- "status": 504,++ "status": 502,"kind": "json","from": ["public/js/pastes.js"@@@ -8427,7 +8427,7 @@"method": "POST","path": "/api/pastes/n1star/fork","auth": "anon",-- "status": 504,++ "status": 502,"kind": "json","from": ["public/js/pastes.js"@@@ -1,7 +1,7 @@{"service": "live",-- "release": "fb3957f3ca2b54b65f3e51aa70eff606a47c5928",-- "recorded_at": "2026-09-29T18:32:58.308Z",++ "release": "9437263f09b5f742aa4f8a5f0a5741029752d744",++ "recorded_at": "2026-10-02T16:12:35.016Z","note": "N-1 fixture: written by `npm run n-1:record`, replayed by test/n-1.test.js","user_version": 0,"schema": [@@@ -49,7 +49,6 @@"CREATE TABLE dm_participants (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n conversation_id INTEGER NOT NULL,\n user_id INTEGER NOT NULL,\n last_read_at DATETIME DEFAULT '1970-01-01 00:00:00',\n joined_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(conversation_id, user_id),\n FOREIGN KEY (conversation_id) REFERENCES dm_conversations(id) ON DELETE CASCADE,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )","CREATE TABLE donation_goals (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n title TEXT NOT NULL,\n target_amount INTEGER NOT NULL, -- in Vibes (dollars)\n current_amount INTEGER DEFAULT 0,\n is_active INTEGER DEFAULT 1,\n image_url TEXT, -- optional goal media (webp image / webm video)\n media_type TEXT, -- 'image' | 'video'\n reached_at DATETIME, -- set when target hit; drives the ~1h celebration window\n sort_order INTEGER DEFAULT 0,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n)","CREATE TABLE easter_egg_solves (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n egg_date TEXT NOT NULL,\n solver_key TEXT NOT NULL,\n user_id INTEGER,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(egg_date, solver_key)\n )",-- "CREATE TABLE \"emotes\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n code TEXT NOT NULL,\n url TEXT NOT NULL,\n animated INTEGER DEFAULT 0,\n width INTEGER DEFAULT 28,\n height INTEGER DEFAULT 28,\n is_global INTEGER DEFAULT 0,\n is_approved INTEGER DEFAULT 1,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n channel_owner_id INTEGER,\n size INTEGER DEFAULT 100,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )","CREATE TABLE follows (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n follower_id INTEGER NOT NULL,\n streamer_id INTEGER NOT NULL,\n email_notify INTEGER DEFAULT 0,\n push_notify INTEGER DEFAULT 0,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(follower_id, streamer_id),\n FOREIGN KEY (follower_id) REFERENCES users(id) ON DELETE CASCADE,\n FOREIGN KEY (streamer_id) REFERENCES users(id) ON DELETE CASCADE\n)","CREATE TABLE hidden_relay_users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n channel_id INTEGER,\n platform TEXT NOT NULL,\n external_username TEXT NOT NULL,\n action TEXT DEFAULT 'hide' CHECK(action IN ('hide','ban')),\n reason TEXT,\n created_by INTEGER,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE,\n FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL\n )","CREATE TABLE ip_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER,\n anon_id TEXT,\n ip_address TEXT NOT NULL,\n action TEXT NOT NULL DEFAULT 'chat',\n geo_country TEXT,\n geo_region TEXT,\n geo_city TEXT,\n geo_isp TEXT,\n geo_org TEXT,\n geo_ll TEXT,\n user_agent TEXT,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL\n )",@@@ -155,11 +154,6 @@"CREATE INDEX idx_dm_participants_conv ON dm_participants(conversation_id)","CREATE INDEX idx_dm_participants_user ON dm_participants(user_id)","CREATE INDEX idx_egg_solves_date ON easter_egg_solves(egg_date)",-- "CREATE UNIQUE INDEX idx_emotes_channel_code ON emotes(COALESCE(channel_owner_id, user_id), code)",-- "CREATE INDEX idx_emotes_channel_owner ON emotes(channel_owner_id)",-- "CREATE INDEX idx_emotes_code ON emotes(code)",-- "CREATE INDEX idx_emotes_global ON emotes(is_global)",-- "CREATE INDEX idx_emotes_user ON emotes(user_id)","CREATE INDEX idx_follows_follower ON follows(follower_id)","CREATE INDEX idx_follows_streamer ON follows(streamer_id)","CREATE INDEX idx_goals_active ON donation_goals(is_active)",@@@ -246,25 +240,31 @@"schema_migrations": [{"id": "001_vibes_decimal_to_bits",-- "applied_at": "2026-09-29 18:32:54",++ "applied_at": "2026-10-02 16:12:28","mode": "adopted",-- "duration_ms": 0++ "duration_ms": 1},{"id": "002_pastes_ai_columns",-- "applied_at": "2026-09-29 18:32:54",++ "applied_at": "2026-10-02 16:12:28","mode": "applied","duration_ms": 8},{"id": "004_hot_path_indexes",-- "applied_at": "2026-09-29 18:32:54",++ "applied_at": "2026-10-02 16:12:28","mode": "applied","duration_ms": 1},{"id": "005_drop_chat_staged_tables",-- "applied_at": "2026-09-29 18:32:54",++ "applied_at": "2026-10-02 16:12:28",++ "mode": "adopted",++ "duration_ms": 1++ },++ {++ "id": "006_drop_emotes",++ "applied_at": "2026-10-02 16:12:28","mode": "adopted","duration_ms": 0}@@@ -1000,7 +1000,6 @@"SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name='chat_messages' AND sql IS NOT NULL","SELECT sql FROM sqlite_master WHERE type='table' AND name='channel_sounds'","SELECT sql FROM sqlite_master WHERE type='table' AND name='chat_messages'",-- "SELECT sql FROM sqlite_master WHERE type='table' AND name='emotes'","SELECT sql FROM sqlite_master WHERE type='table' AND name='stream_controls'","SELECT started_at, is_live FROM streams WHERE id = ?","SELECT status, COUNT(*) AS n FROM billing_actions GROUP BY status",
@@ -1,16 +1,16 @@
@@ -1,16 +1,16 @@
{
{
"service": "live",
"service": "live",
- "release": "fb3957f3ca2b54b65f3e51aa70eff606a47c5928",
- "recorded_at": "2026-09-29T18:32:58.308Z",
+ "release": "9437263f09b5f742aa4f8a5f0a5741029752d744",
+ "recorded_at": "2026-10-02T16:12:35.016Z",
"note": "N-1 fixture: written by `npm run n-1:record`, replayed by test/n-1.test.js",
"note": "N-1 fixture: written by `npm run n-1:record`, replayed by test/n-1.test.js",
"manifest": {
"manifest": {
"service": "live",
"service": "live",
- "release": "fb3957f3ca2b",
- "released_at": "2026-09-29T18:32:06.000Z",
- "booted_at": "2026-09-29T18:32:56.084Z",
- "contracts_version": "0.71.0",
+ "release": "9437263f09b5",
+ "released_at": "2026-10-02T16:01:38.000Z",
+ "booted_at": "2026-10-02T16:12:30.723Z",
+ "contracts_version": "0.83.0",
"packages": {
"packages": {
- "openvibe-shared": "1.30.1",
+ "openvibe-shared": "2.4.0",
"openvibe-sdk": "0.16.0"
"openvibe-sdk": "0.16.0"
},
},
"min_client_release": null,
"min_client_release": null,
@@ -22,11 +22,11 @@
@@ -22,11 +22,11 @@
},
},
"shell": {
"shell": {
"kind": "script",
"kind": "script",
- "version": "a6dd3b98e643"
+ "version": "60a3f0a39211"
},
},
"server": {
"server": {
"kind": "server",
"kind": "server",
- "version": "521d6d204d65"
+ "version": "b6aaf8e6e88d"
}
}
},
},
"assets": {
"assets": {
@@ -2956,7 +2956,7 @@
@@ -2956,7 +2956,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/config",
"path": "/api/pastes/config",
"auth": "anon",
"auth": "anon",
- "status": 504,
+ "status": 502,
"kind": "json",
"kind": "json",
"from": [
"from": [
"public/js/pastes.js"
"public/js/pastes.js"
@@ -2966,7 +2966,7 @@
@@ -2966,7 +2966,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/config",
"path": "/api/pastes/config",
"auth": "user",
"auth": "user",
- "status": 504,
+ "status": 502,
"kind": "json",
"kind": "json",
"from": [
"from": [
"public/js/pastes.js"
"public/js/pastes.js"
@@ -7088,7 +7088,7 @@
@@ -7088,7 +7088,7 @@
},
},
{
{
"method": "GET",
"method": "GET",
- "path": "/shared/navbar.js?v=b8089ee3bd11",
+ "path": "/shared/navbar.js?v=017a740747b4",
"auth": "anon",
"auth": "anon",
"accept": "html",
"accept": "html",
"status": 200,
"status": 200,
@@ -7099,7 +7099,7 @@
@@ -7099,7 +7099,7 @@
},
},
{
{
"method": "GET",
"method": "GET",
- "path": "/js/app.js?v=4d24e4b46d7b",
+ "path": "/js/app.js?v=0fd06344b140",
"auth": "anon",
"auth": "anon",
"accept": "html",
"accept": "html",
"status": 200,
"status": 200,
@@ -7275,7 +7275,7 @@
@@ -7275,7 +7275,7 @@
},
},
{
{
"method": "GET",
"method": "GET",
- "path": "/js/app-home.js?v=f3884800e9a3",
+ "path": "/js/app-home.js?v=1dc431184ccc",
"auth": "anon",
"auth": "anon",
"accept": "html",
"accept": "html",
"status": 200,
"status": 200,
@@ -7473,7 +7473,7 @@
@@ -7473,7 +7473,7 @@
},
},
{
{
"method": "GET",
"method": "GET",
- "path": "/js/app-channel.js?v=c148cdba2aee",
+ "path": "/js/app-channel.js?v=7734c5c60717",
"auth": "anon",
"auth": "anon",
"accept": "html",
"accept": "html",
"status": 200,
"status": 200,
@@ -8357,7 +8357,7 @@
@@ -8357,7 +8357,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes",
"path": "/api/pastes",
"auth": "anon",
"auth": "anon",
- "status": 504,
+ "status": 502,
"kind": "json",
"kind": "json",
"from": [
"from": [
"public/js/pastes.js"
"public/js/pastes.js"
@@ -8397,7 +8397,7 @@
@@ -8397,7 +8397,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/n1star/comments",
"path": "/api/pastes/n1star/comments",
"auth": "anon",
"auth": "anon",
- "status": 504,
+ "status": 502,
"kind": "json",
"kind": "json",
"from": [
"from": [
"public/js/pastes.js"
"public/js/pastes.js"
@@ -8417,7 +8417,7 @@
@@ -8417,7 +8417,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/n1star/copy",
"path": "/api/pastes/n1star/copy",
"auth": "anon",
"auth": "anon",
- "status": 504,
+ "status": 502,
"kind": "json",
"kind": "json",
"from": [
"from": [
"public/js/pastes.js"
"public/js/pastes.js"
@@ -8427,7 +8427,7 @@
@@ -8427,7 +8427,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/n1star/fork",
"path": "/api/pastes/n1star/fork",
"auth": "anon",
"auth": "anon",
- "status": 504,
+ "status": 502,
"kind": "json",
"kind": "json",
"from": [
"from": [
"public/js/pastes.js"
"public/js/pastes.js"
@@ -1,7 +1,7 @@
@@ -1,7 +1,7 @@
{
{
"service": "live",
"service": "live",
- "release": "fb3957f3ca2b54b65f3e51aa70eff606a47c5928",
- "recorded_at": "2026-09-29T18:32:58.308Z",
+ "release": "9437263f09b5f742aa4f8a5f0a5741029752d744",
+ "recorded_at": "2026-10-02T16:12:35.016Z",
"note": "N-1 fixture: written by `npm run n-1:record`, replayed by test/n-1.test.js",
"note": "N-1 fixture: written by `npm run n-1:record`, replayed by test/n-1.test.js",
"user_version": 0,
"user_version": 0,
"schema": [
"schema": [
@@ -49,7 +49,6 @@
@@ -49,7 +49,6 @@
"CREATE TABLE dm_participants (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n conversation_id INTEGER NOT NULL,\n user_id INTEGER NOT NULL,\n last_read_at DATETIME DEFAULT '1970-01-01 00:00:00',\n joined_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(conversation_id, user_id),\n FOREIGN KEY (conversation_id) REFERENCES dm_conversations(id) ON DELETE CASCADE,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )",
"CREATE TABLE dm_participants (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n conversation_id INTEGER NOT NULL,\n user_id INTEGER NOT NULL,\n last_read_at DATETIME DEFAULT '1970-01-01 00:00:00',\n joined_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(conversation_id, user_id),\n FOREIGN KEY (conversation_id) REFERENCES dm_conversations(id) ON DELETE CASCADE,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )",
"CREATE TABLE donation_goals (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n title TEXT NOT NULL,\n target_amount INTEGER NOT NULL, -- in Vibes (dollars)\n current_amount INTEGER DEFAULT 0,\n is_active INTEGER DEFAULT 1,\n image_url TEXT, -- optional goal media (webp image / webm video)\n media_type TEXT, -- 'image' | 'video'\n reached_at DATETIME, -- set when target hit; drives the ~1h celebration window\n sort_order INTEGER DEFAULT 0,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n)",
"CREATE TABLE donation_goals (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n title TEXT NOT NULL,\n target_amount INTEGER NOT NULL, -- in Vibes (dollars)\n current_amount INTEGER DEFAULT 0,\n is_active INTEGER DEFAULT 1,\n image_url TEXT, -- optional goal media (webp image / webm video)\n media_type TEXT, -- 'image' | 'video'\n reached_at DATETIME, -- set when target hit; drives the ~1h celebration window\n sort_order INTEGER DEFAULT 0,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n)",
"CREATE TABLE easter_egg_solves (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n egg_date TEXT NOT NULL,\n solver_key TEXT NOT NULL,\n user_id INTEGER,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(egg_date, solver_key)\n )",
"CREATE TABLE easter_egg_solves (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n egg_date TEXT NOT NULL,\n solver_key TEXT NOT NULL,\n user_id INTEGER,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(egg_date, solver_key)\n )",
- "CREATE TABLE \"emotes\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n code TEXT NOT NULL,\n url TEXT NOT NULL,\n animated INTEGER DEFAULT 0,\n width INTEGER DEFAULT 28,\n height INTEGER DEFAULT 28,\n is_global INTEGER DEFAULT 0,\n is_approved INTEGER DEFAULT 1,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n channel_owner_id INTEGER,\n size INTEGER DEFAULT 100,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )",
"CREATE TABLE follows (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n follower_id INTEGER NOT NULL,\n streamer_id INTEGER NOT NULL,\n email_notify INTEGER DEFAULT 0,\n push_notify INTEGER DEFAULT 0,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(follower_id, streamer_id),\n FOREIGN KEY (follower_id) REFERENCES users(id) ON DELETE CASCADE,\n FOREIGN KEY (streamer_id) REFERENCES users(id) ON DELETE CASCADE\n)",
"CREATE TABLE follows (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n follower_id INTEGER NOT NULL,\n streamer_id INTEGER NOT NULL,\n email_notify INTEGER DEFAULT 0,\n push_notify INTEGER DEFAULT 0,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(follower_id, streamer_id),\n FOREIGN KEY (follower_id) REFERENCES users(id) ON DELETE CASCADE,\n FOREIGN KEY (streamer_id) REFERENCES users(id) ON DELETE CASCADE\n)",
"CREATE TABLE hidden_relay_users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n channel_id INTEGER,\n platform TEXT NOT NULL,\n external_username TEXT NOT NULL,\n action TEXT DEFAULT 'hide' CHECK(action IN ('hide','ban')),\n reason TEXT,\n created_by INTEGER,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE,\n FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL\n )",
"CREATE TABLE hidden_relay_users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n channel_id INTEGER,\n platform TEXT NOT NULL,\n external_username TEXT NOT NULL,\n action TEXT DEFAULT 'hide' CHECK(action IN ('hide','ban')),\n reason TEXT,\n created_by INTEGER,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE,\n FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL\n )",
"CREATE TABLE ip_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER,\n anon_id TEXT,\n ip_address TEXT NOT NULL,\n action TEXT NOT NULL DEFAULT 'chat',\n geo_country TEXT,\n geo_region TEXT,\n geo_city TEXT,\n geo_isp TEXT,\n geo_org TEXT,\n geo_ll TEXT,\n user_agent TEXT,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL\n )",
"CREATE TABLE ip_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER,\n anon_id TEXT,\n ip_address TEXT NOT NULL,\n action TEXT NOT NULL DEFAULT 'chat',\n geo_country TEXT,\n geo_region TEXT,\n geo_city TEXT,\n geo_isp TEXT,\n geo_org TEXT,\n geo_ll TEXT,\n user_agent TEXT,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL\n )",
@@ -155,11 +154,6 @@
@@ -155,11 +154,6 @@
"CREATE INDEX idx_dm_participants_conv ON dm_participants(conversation_id)",
"CREATE INDEX idx_dm_participants_conv ON dm_participants(conversation_id)",
"CREATE INDEX idx_dm_participants_user ON dm_participants(user_id)",
"CREATE INDEX idx_dm_participants_user ON dm_participants(user_id)",
"CREATE INDEX idx_egg_solves_date ON easter_egg_solves(egg_date)",
"CREATE INDEX idx_egg_solves_date ON easter_egg_solves(egg_date)",
- "CREATE UNIQUE INDEX idx_emotes_channel_code ON emotes(COALESCE(channel_owner_id, user_id), code)",
- "CREATE INDEX idx_emotes_channel_owner ON emotes(channel_owner_id)",
- "CREATE INDEX idx_emotes_code ON emotes(code)",
- "CREATE INDEX idx_emotes_global ON emotes(is_global)",
- "CREATE INDEX idx_emotes_user ON emotes(user_id)",
"CREATE INDEX idx_follows_follower ON follows(follower_id)",
"CREATE INDEX idx_follows_follower ON follows(follower_id)",
"CREATE INDEX idx_follows_streamer ON follows(streamer_id)",
"CREATE INDEX idx_follows_streamer ON follows(streamer_id)",
"CREATE INDEX idx_goals_active ON donation_goals(is_active)",
"CREATE INDEX idx_goals_active ON donation_goals(is_active)",
@@ -246,25 +240,31 @@
@@ -246,25 +240,31 @@
"schema_migrations": [
"schema_migrations": [
{
{
"id": "001_vibes_decimal_to_bits",
"id": "001_vibes_decimal_to_bits",
- "applied_at": "2026-09-29 18:32:54",
+ "applied_at": "2026-10-02 16:12:28",
"mode": "adopted",
"mode": "adopted",
- "duration_ms": 0
+ "duration_ms": 1
},
},
{
{
"id": "002_pastes_ai_columns",
"id": "002_pastes_ai_columns",
- "applied_at": "2026-09-29 18:32:54",
+ "applied_at": "2026-10-02 16:12:28",
"mode": "applied",
"mode": "applied",
"duration_ms": 8
"duration_ms": 8
},
},
{
{
"id": "004_hot_path_indexes",
"id": "004_hot_path_indexes",
- "applied_at": "2026-09-29 18:32:54",
+ "applied_at": "2026-10-02 16:12:28",
"mode": "applied",
"mode": "applied",
"duration_ms": 1
"duration_ms": 1
},
},
{
{
"id": "005_drop_chat_staged_tables",
"id": "005_drop_chat_staged_tables",
- "applied_at": "2026-09-29 18:32:54",
+ "applied_at": "2026-10-02 16:12:28",
+ "mode": "adopted",
+ "duration_ms": 1
+ },
+ {
+ "id": "006_drop_emotes",
+ "applied_at": "2026-10-02 16:12:28",
"mode": "adopted",
"mode": "adopted",
"duration_ms": 0
"duration_ms": 0
}
}
@@ -1000,7 +1000,6 @@
@@ -1000,7 +1000,6 @@
"SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name='chat_messages' AND sql IS NOT NULL",
"SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name='chat_messages' AND sql IS NOT NULL",
"SELECT sql FROM sqlite_master WHERE type='table' AND name='channel_sounds'",
"SELECT sql FROM sqlite_master WHERE type='table' AND name='channel_sounds'",
"SELECT sql FROM sqlite_master WHERE type='table' AND name='chat_messages'",
"SELECT sql FROM sqlite_master WHERE type='table' AND name='chat_messages'",
- "SELECT sql FROM sqlite_master WHERE type='table' AND name='emotes'",
"SELECT sql FROM sqlite_master WHERE type='table' AND name='stream_controls'",
"SELECT sql FROM sqlite_master WHERE type='table' AND name='stream_controls'",
"SELECT started_at, is_live FROM streams WHERE id = ?",
"SELECT started_at, is_live FROM streams WHERE id = ?",
"SELECT status, COUNT(*) AS n FROM billing_actions GROUP BY status",
"SELECT status, COUNT(*) AS n FROM billing_actions GROUP BY status",