openvibers/openvibe.network Commits

Roadmap baseline regenerated from origin/main (2026-09-24): D20 remaining is the consumers' switch and OpenRe session lineage (Media owner_subject done, grants issued); new Live tables (channel_points_log, opencoin_admin_grants, tips_deliveries) and routes (/api/content/*, /llms.txt) classified; 6/7 exit criteria pass (EC7 waits on the owner's hazard review)

OP OpenVibers committed 24 Sept 2026 · 89f0e44dd9 · 16 files, +3594 −3116


Changes

ddiff --git a/docs/roadmap-baseline/01-services.md b/docs/roadmap-baseline/01-services.md
iindex 88e6586d..5cd851a2 100644
---- a/docs/roadmap-baseline/01-services.md
++++ b/docs/roadmap-baseline/01-services.md
@@@ -39,33 +39,33 @@ Deliverable 1: runtimes, ports, units, env files and repository state.
| Repo | HEAD | origin/main | Source files | LOC | Test files | CI | Routes | Tables | WS servers | Timers/jobs | TODO(contract) |
|---|---|---|---|---|---|---|---|---|---|---|---|
--| OpenVibe.Live | ca7cc87 | ca7cc87 | 194 | 74460 | 81 | yes | 631 | 125 | 8 | 51 | 14 |
--| OpenVibe.Network | 09bf748 | 09bf748 | 68 | 15275 | 29 | yes | 248 | 45 | 0 | 7 | 0 |
--| OpenVibe.Shared | c272680 | c272680 | 47 | 11774 | 19 | yes | 2 | 0 | 0 | 6 | 0 |
--| OpenVibe.Media | ad2217b | ad2217b | 47 | 13469 | 20 | yes | 109 | 22 | 0 | 13 | 0 |
--| OpenVibe.Tools | 5d1b423 | 5d1b423 | 130 | 22829 | 16 | yes | 118 | 3 | 0 | 16 | 0 |
--| OpenVibe.Community | 63b90a8 | 63b90a8 | 47 | 7886 | 25 | yes | 107 | 20 | 0 | 3 | 0 |
--| OpenVibe.Games | 7863fc6 | 7863fc6 | 117 | 22529 | 68 | yes | 21 | 12 | 2 | 3 | 0 |
--| OpenVibe.Sites | d6e4cbd | d6e4cbd | 1 | 308 | 1 | yes | 0 | 0 | 0 | 0 | 0 |
--| OpenVibe.Events | efc09a7 | efc09a7 | 17 | 2914 | 12 | yes | 17 | 7 | 0 | 3 | 0 |
--| OpenVibe.Chat | ed90461 | ed90461 | 34 | 11947 | 19 | yes | 63 | 34 | 1 | 10 | 0 |
--| OpenRe.Stream | c091a09 | c091a09 | 34 | 4641 | 18 | yes | 37 | 12 | 0 | 2 | 0 |
--| OpenVibe.Billing | aa445d0 | aa445d0 | 36 | 5124 | 16 | yes | 54 | 19 | 0 | 3 | 0 |
--| OpenVibe.Tips | f211c03 | f211c03 | 29 | 5250 | 15 | yes | 62 | 17 | 0 | 3 | 0 |
--| OpenVibe.VIP | fe7eaad | fe7eaad | 29 | 4194 | 11 | yes | 44 | 13 | 0 | 2 | 0 |
--| OpenVibe.AI | 3a480ac | 3a480ac | 30 | 4576 | 17 | yes | 33 | 16 | 0 | 2 | 0 |
--| OpenVibe.Search | a707e38 | a707e38 | 17 | 2733 | 13 | yes | 20 | 11 | 0 | 4 | 0 |
--| OpenVibe.Sources | 2e986af | 2e986af | 23 | 2974 | 10 | yes | 17 | 8 | 0 | 4 | 0 |
--| OpenVibe.Wiki | b4e70ac | b4e70ac | 20 | 4297 | 21 | yes | 76 | 8 | 0 | 2 | 0 |
--| OpenVibe.Blog | 95e99ac | 95e99ac | 31 | 4663 | 14 | yes | 56 | 6 | 0 | 2 | 0 |
--| OpenVibe.News | 5b393d2 | 5b393d2 | 33 | 5080 | 16 | yes | 51 | 13 | 0 | 1 | 0 |
--| OpenVibe.Reviews | a7b50a6 | a7b50a6 | 22 | 4626 | 13 | yes | 70 | 14 | 0 | 2 | 0 |
--| OpenVibe.Deals | 91ca223 | 91ca223 | 35 | 4766 | 13 | yes | 58 | 15 | 0 | 1 | 0 |
--| OpenVibe.Coupons | 1c57c47 | 1c57c47 | 28 | 4081 | 12 | yes | 46 | 12 | 0 | 2 | 0 |
--| OpenVibe.Trade | ddbc60c | ddbc60c | 36 | 4405 | 13 | yes | 7 | 10 | 0 | 2 | 0 |
--| OpenVibe.Codes | 51d2386 | 51d2386 | 27 | 3966 | 19 | yes | 95 | 7 | 0 | 0 | 0 |
--| OpenVibe.Host | 03dfcb3 | 03dfcb3 | 55 | 8099 | 27 | yes | 56 | 11 | 0 | 1 | 0 |
--| OpenVibe.Examples | d5f4efc | d5f4efc | 11 | 1604 | 14 | yes | 0 | 1 | 0 | 0 | 0 |
++| OpenVibe.Live | 12c1c11 | 12c1c11 | 197 | 72676 | 98 | yes | 632 | 112 | 8 | 51 | 14 |
++| OpenVibe.Network | 26c0395 | 26c0395 | 72 | 15901 | 34 | yes | 254 | 45 | 0 | 7 | 4 |
++| OpenVibe.Shared | c7489fc | c7489fc | 47 | 11792 | 19 | yes | 2 | 0 | 0 | 6 | 0 |
++| OpenVibe.Media | 984e7ad | 984e7ad | 56 | 15482 | 34 | yes | 110 | 24 | 0 | 16 | 0 |
++| OpenVibe.Tools | b0aada2 | b0aada2 | 169 | 29390 | 39 | yes | 119 | 6 | 0 | 15 | 0 |
++| OpenVibe.Community | e075d39 | e075d39 | 47 | 7941 | 26 | yes | 107 | 20 | 0 | 3 | 0 |
++| OpenVibe.Games | 4e5bc50 | 4e5bc50 | 118 | 22678 | 69 | yes | 29 | 12 | 2 | 3 | 0 |
++| OpenVibe.Sites | 63683d2 | 63683d2 | 1 | 520 | 1 | yes | 0 | 0 | 0 | 0 | 0 |
++| OpenVibe.Events | 9f51514 | 9f51514 | 17 | 2955 | 12 | yes | 17 | 7 | 0 | 3 | 0 |
++| OpenVibe.Chat | 1ef6f99 | 1ef6f99 | 34 | 11951 | 19 | yes | 63 | 34 | 1 | 10 | 0 |
++| OpenRe.Stream | e517ed4 | e517ed4 | 34 | 4641 | 18 | yes | 37 | 12 | 0 | 2 | 0 |
++| OpenVibe.Billing | 42ad547 | 42ad547 | 36 | 5124 | 16 | yes | 54 | 19 | 0 | 3 | 0 |
++| OpenVibe.Tips | 847d22a | 847d22a | 29 | 5251 | 15 | yes | 61 | 17 | 0 | 3 | 0 |
++| OpenVibe.VIP | a0a8f75 | a0a8f75 | 29 | 4195 | 11 | yes | 43 | 13 | 0 | 2 | 0 |
++| OpenVibe.AI | a6d4f39 | a6d4f39 | 30 | 4577 | 17 | yes | 32 | 16 | 0 | 2 | 0 |
++| OpenVibe.Search | 4603541 | 4603541 | 17 | 2734 | 13 | yes | 19 | 11 | 0 | 4 | 0 |
++| OpenVibe.Sources | cf00390 | cf00390 | 23 | 2975 | 10 | yes | 16 | 8 | 0 | 4 | 0 |
++| OpenVibe.Wiki | fe113b9 | fe113b9 | 20 | 4298 | 21 | yes | 75 | 8 | 0 | 2 | 0 |
++| OpenVibe.Blog | 0784b42 | 0784b42 | 31 | 4669 | 14 | yes | 55 | 6 | 0 | 2 | 0 |
++| OpenVibe.News | 42ce43b | 42ce43b | 33 | 5081 | 16 | yes | 50 | 13 | 0 | 1 | 0 |
++| OpenVibe.Reviews | 70de372 | 70de372 | 22 | 4627 | 13 | yes | 69 | 14 | 0 | 2 | 0 |
++| OpenVibe.Deals | 3910b58 | 3910b58 | 35 | 4772 | 13 | yes | 57 | 15 | 0 | 1 | 0 |
++| OpenVibe.Coupons | ae3a25e | ae3a25e | 28 | 4089 | 12 | yes | 45 | 12 | 0 | 2 | 0 |
++| OpenVibe.Trade | 7f418d2 | 7f418d2 | 36 | 4409 | 13 | yes | 7 | 10 | 0 | 2 | 0 |
++| OpenVibe.Codes | a129415 | a129415 | 27 | 3969 | 19 | yes | 94 | 7 | 0 | 0 | 0 |
++| OpenVibe.Host | f8ac37d | f8ac37d | 55 | 8103 | 28 | yes | 55 | 11 | 0 | 1 | 0 |
++| OpenVibe.Examples | 0bbe579 | 0bbe579 | 11 | 1604 | 14 | yes | 0 | 1 | 0 | 0 | 0 |
LOC counts non-test source files in the scanned directories only (`server/`, `apps/`, `packages/`), not frontend assets.
ddiff --git a/docs/roadmap-baseline/02-schema.md b/docs/roadmap-baseline/02-schema.md
iindex 9ee321c5..436b9107 100644
---- a/docs/roadmap-baseline/02-schema.md
++++ b/docs/roadmap-baseline/02-schema.md
@@@ -64,18 +64,18 @@ Deliverable 2: every table declared in code or present in production, with curre
| /var/lib/openvibe-vip/vip.db | 344 KB | 15 |
| /var/lib/openvibe-wiki/wiki.db | 377 KB | 20 |
--## OpenVibe.Live (193)
++## OpenVibe.Live (196)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
| active_effects | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| ai_chatbot_configs | server/db/database.js:1782 | live.db | OpenVibe.AI | extract | W13 |
++| ai_chatbot_configs | server/db/database.js:1805 | live.db | OpenVibe.AI | extract | W13 |
| ai_conversations | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| ai_memory | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| ai_timeline_cache | server/db/database.js:1303 | live.db | OpenVibe.AI | extract | W13 |
--| ai_usage | server/db/database.js:1261 | live.db | OpenVibe.AI | extract | W13 |
--| ai_viewer_log | server/db/database.js:1866 | live.db | OpenVibe.AI | extract | W13 |
--| ai_viewer_threads | server/db/database.js:1852 | live.db | OpenVibe.AI | extract | W13 |
++| ai_timeline_cache | server/db/database.js:1326 | live.db | OpenVibe.AI | extract | W13 |
++| ai_usage | server/db/database.js:1284 | live.db | OpenVibe.AI | extract | W13 |
++| ai_viewer_log | server/db/database.js:1889 | live.db | OpenVibe.AI | extract | W13 |
++| ai_viewer_threads | server/db/database.js:1875 | live.db | OpenVibe.AI | extract | W13 |
| analytics_daily | (prod only) | analytics.db | OpenVibe.Live | keep | Track O / ADR-021 |
| analytics_day_salts | (prod only) | analytics.db | OpenVibe.Live | keep | Track O / ADR-021 |
| analytics_events | (prod only) | analytics.db | OpenVibe.Live | keep | Track O / ADR-021 |
@@@ -83,11 +83,11 @@ Deliverable 2: every table declared in code or present in production, with curre
| analytics_rate_tracking | (prod only) | analytics.db | OpenVibe.Live | keep | Track O / ADR-021 |
| analytics_snapshots | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| analytics_visitor_days | (prod only) | analytics.db | OpenVibe.Live | keep | Track O / ADR-021 |
--| anon_ip_mappings | server/db/database.js:942 | live.db | OpenVibe.Network (policy) | extract | W1 |
++| anon_ip_mappings | server/db/database.js:964 | live.db | OpenVibe.Network (policy) | extract | W1 |
| api_keys | server/db/schema.sql:391 | live.db | OpenVibe.Network (principals) / OpenVibe.Codes | extract | W1/W20 |
| api_tokens | server/db/schema.sql:404 | live.db | OpenVibe.Network (principals) / OpenVibe.Codes | extract | W1/W20 |
--| app_state | server/db/database.js:1174 | live.db | OpenVibe.Live | keep | - |
--| approved_ips | server/db/database.js:2054 | live.db | OpenVibe.Network (policy) | extract | W1 |
++| app_state | server/db/database.js:1196 | live.db | OpenVibe.Live | keep | - |
++| approved_ips | server/db/database.js:2077 | live.db | OpenVibe.Network (policy) | extract | W1 |
| arena_achievements | (prod only) | live.db | archive then drop | investigate | W0 |
| arena_battles | (prod only) | live.db | archive then drop | investigate | W0 |
| arena_beef_hype | server/arena/beef.js:58 | live.db | OpenVibe.Live | keep | - |
@@@ -95,7 +95,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| arena_beefs | server/arena/beef.js:34 | live.db | OpenVibe.Live | keep | - |
| arena_events | (prod only) | live.db | archive then drop | investigate | W0 |
| arena_mic_moments | server/arena/mic.js:54 | live.db | OpenVibe.Live | keep | - |
--| arena_profiles | server/arena/arena-service.js:82 | live.db | OpenVibe.Live | keep | - |
++| arena_profiles | server/arena/arena-service.js:83 | live.db | OpenVibe.Live | keep | - |
| arena_talk | (prod only) | live.db | archive then drop | investigate | W0 |
| arena_talk_hype | (prod only) | live.db | archive then drop | investigate | W0 |
| arena_talk_session_hype | (prod only) | live.db | archive then drop | investigate | W0 |
@@@ -129,34 +129,35 @@ Deliverable 2: every table declared in code or present in production, with curre
| canvas_tiles | (prod only) | live.db | OpenVibe.Games | frozen-legacy | W12 |
| canvas_user_overrides | (prod only) | live.db | OpenVibe.Games | frozen-legacy | W12 |
| changelog_entries | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| channel_ai_bots | server/db/database.js:1807 | live.db | OpenVibe.AI | extract | W13 |
--| channel_ai_config | server/db/database.js:1831 | live.db | OpenVibe.AI | extract | W13 |
--| channel_moderation_settings | server/db/database.js:1617, server/db/schema.sql:514 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
--| channel_moderators | server/db/database.js:1600, server/db/schema.sql:499 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
--| channel_points | server/db/database.js:766 | live.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
--| channel_sounds | server/db/database.js:1720, server/db/schema.sql:625 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
--| channel_sounds_new | server/db/database.js:1744 | no | OpenVibe.Chat | extract | W6 (remainder) |
++| channel_ai_bots | server/db/database.js:1830 | live.db | OpenVibe.AI | extract | W13 |
++| channel_ai_config | server/db/database.js:1854 | live.db | OpenVibe.AI | extract | W13 |
++| channel_moderation_settings | server/db/database.js:1640, server/db/schema.sql:514 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
++| channel_moderators | server/db/database.js:1623, server/db/schema.sql:499 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
++| channel_points | server/db/database.js:770 | live.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
++| channel_points_log | server/db/database.js:780 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
++| channel_sounds | server/db/database.js:1743, server/db/schema.sql:625 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
++| channel_sounds_new | server/db/database.js:1767 | no | OpenVibe.Chat | extract | W6 (remainder) |
| channels | server/db/schema.sql:26 | live.db | OpenVibe.Live | keep | - |
--| chat_ai_summaries | server/db/database.js:1315 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
++| chat_ai_summaries | server/db/database.js:1338 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
| chat_bridge_outbox | server/chat/chat-remote.js:94 | live.db | OpenVibe.Live | keep | W6 (compat) |
| chat_log | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| chat_messages | server/db/schema.sql:148 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
--| chat_messages_new | server/db/database.js:421 | no | OpenVibe.Chat | extract | W6 (remainder) |
--| chat_timeline_events | server/db/database.js:1335 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
++| chat_messages_new | server/db/database.js:422 | no | OpenVibe.Chat | extract | W6 (remainder) |
++| chat_timeline_events | server/db/database.js:1358 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
| chatter_profiles | (prod only) | live.db | archive then drop | investigate | W0 |
| chatter_subjects | (prod only) | live.db | archive then drop | investigate | W0 |
| chatter_xp_log | (prod only) | live.db | archive then drop | investigate | W0 |
--| clip_ai_state | server/db/database.js:274 | live.db | OpenVibe.AI | extract | W13 |
++| clip_ai_state | server/db/database.js:275 | live.db | OpenVibe.AI | extract | W13 |
| clips | server/db/schema.sql:307 | live.db | OpenVibe.Media | frozen-legacy | W4 |
| coin_redemptions | server/db/schema.sql:689 | live.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| coin_rewards | server/db/schema.sql:668 | live.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| coin_transactions | server/db/schema.sql:651 | live.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| comment_thread_refs | server/comments-client.js:47 | live.db | OpenVibe.Live | keep | W5 |
--| comments | server/db/database.js:855, server/db/schema.sql:585 | live.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-23) |
++| comments | server/db/database.js:872, server/db/schema.sql:585 | live.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-23) |
| content_views | server/db/schema.sql:328 | live.db | OpenVibe.Live | keep | - |
--| control_config_buttons | server/db/database.js:2278 | live.db | OpenRe.Stream | extract | W7 |
--| control_configs | server/db/database.js:2264 | live.db | OpenRe.Stream | extract | W7 |
--| control_whitelist | server/db/database.js:2249 | live.db | OpenRe.Stream | extract | W7 |
++| control_config_buttons | server/db/database.js:2301 | live.db | OpenRe.Stream | extract | W7 |
++| control_configs | server/db/database.js:2287 | live.db | OpenRe.Stream | extract | W7 |
++| control_whitelist | server/db/database.js:2272 | live.db | OpenRe.Stream | extract | W7 |
| custom_rewards | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| daily_claims | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| divorce_history | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
@@@ -166,97 +167,99 @@ Deliverable 2: every table declared in code or present in production, with curre
| dm_participants | server/chat/dm.js:31 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| donation_goals | server/db/schema.sql:264 | live.db | OpenVibe.Tips | extract | W9 |
| dungeon_stats | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| easter_egg_solves | server/db/database.js:1347 | live.db | OpenVibe.AI | extract | W13 |
++| easter_egg_solves | server/db/database.js:1370 | live.db | OpenVibe.AI | extract | W13 |
| emotes | server/db/schema.sql:603 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
--| emotes_new | server/db/database.js:1688 | no | OpenVibe.Chat | extract | W6 (remainder) |
++| emotes_new | server/db/database.js:1711 | no | OpenVibe.Chat | extract | W6 (remainder) |
| event_log | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| event_outbox | (prod only) | live.db | OpenVibe.Live | keep | W3 |
| farm_plots | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| file_checksums | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| fish_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| follows | server/db/schema.sql:221 | live.db | OpenVibe.Network | extract | W1 |
--| game_achievements | server/game/game-engine.js:536 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_bank | server/game/schema.sql:77 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_battle_stats | server/game/schema.sql:142 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_daily_quest_claims | server/game/game-engine.js:557, server/game/schema.sql:203 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_daily_quest_progress | server/game/game-engine.js:546, server/game/schema.sql:192 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_dungeon_runs | server/game/schema.sql:156 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_effects | server/game/schema.sql:128 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_farm_plots | server/game/schema.sql:104 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_fish_collection | server/game/game-engine.js:522, server/game/schema.sql:180 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_inventory | server/game/schema.sql:66 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_leaderboard | server/game/schema.sql:168 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_players | server/game/schema.sql:13 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_recipes | server/game/schema.sql:118 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_structures | server/game/schema.sql:87 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
--| game_world_state | server/game/schema.sql:7 | live.db | OpenVibe.Games | migrate-then-drop | W12 |
++| game_achievements | (prod only) | live.db | ? | investigate | W0 |
++| game_bank | (prod only) | live.db | ? | investigate | W0 |
++| game_battle_stats | (prod only) | live.db | ? | investigate | W0 |
++| game_daily_quest_claims | (prod only) | live.db | ? | investigate | W0 |
++| game_daily_quest_progress | (prod only) | live.db | ? | investigate | W0 |
++| game_dungeon_runs | (prod only) | live.db | ? | investigate | W0 |
++| game_effects | (prod only) | live.db | ? | investigate | W0 |
++| game_farm_plots | (prod only) | live.db | ? | investigate | W0 |
++| game_fish_collection | (prod only) | live.db | ? | investigate | W0 |
++| game_inventory | (prod only) | live.db | ? | investigate | W0 |
++| game_leaderboard | (prod only) | live.db | ? | investigate | W0 |
++| game_players | (prod only) | live.db | ? | investigate | W0 |
++| game_recipes | (prod only) | live.db | ? | investigate | W0 |
++| game_structures | (prod only) | live.db | ? | investigate | W0 |
++| game_world_state | (prod only) | live.db | ? | investigate | W0 |
| gusher_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| hidden_relay_users | server/db/database.js:2091 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
++| hidden_relay_users | server/db/database.js:2114 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| inventory | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| ip_log | server/db/database.js:2030 | live.db | OpenVibe.Network (policy) | extract | W1 |
++| ip_log | server/db/database.js:2053 | live.db | OpenVibe.Network (policy) | extract | W1 |
| jo_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| kick_channel_cache | server/db/database.js:780 | live.db | OpenRe.Stream | extract | W7 |
--| linked_accounts | server/db/database.js:386 | live.db | OpenVibe.Network | extract | W1 |
++| kick_channel_cache | server/db/database.js:797 | live.db | OpenRe.Stream | extract | W7 |
++| linked_accounts | server/db/database.js:387 | live.db | OpenVibe.Network | extract | W1 |
| love_affinity | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| love_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| love_proposals | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| managed_streams | server/db/database.js:2392, server/db/schema.sql:78 | live.db | OpenRe.Stream | extract | W7 |
--| media_request_settings | server/db/database.js:875, server/db/schema.sql:722 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
--| media_requests | server/db/database.js:889, server/db/schema.sql:739 | live.db, rs-companion.db | OpenVibe.Chat | extract | W6 (remainder) |
++| managed_streams | server/db/database.js:2415, server/db/schema.sql:78 | live.db | OpenRe.Stream | extract | W7 |
++| media_request_settings | server/db/database.js:892, server/db/schema.sql:722 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
++| media_requests | server/db/database.js:906, server/db/schema.sql:739 | live.db, rs-companion.db | OpenVibe.Chat | extract | W6 (remainder) |
| mine_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| mod_persuasion | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| moderation_actions | server/db/database.js:1899 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
++| moderation_actions | server/db/database.js:1922 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| music_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| news_settings | server/news/news-service.js:47 | live.db | OpenVibe.Live | keep | - |
++| opencoin_admin_grants | server/monetization/opencoins.js:330 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| openre_sessions | server/openre/schema.js:21 | live.db | OpenVibe.Live | keep | W7 |
--| paste_comments | server/db/database.js:1987 | live.db | OpenVibe.Community | frozen-legacy | W5 |
--| paste_likes | server/db/database.js:1955 | live.db | OpenVibe.Community | frozen-legacy | W5 |
--| pastes | server/db/database.js:1918 | live.db | OpenVibe.Community | frozen-legacy | W5 |
--| payment_orders | server/db/database.js:1567 | live.db | OpenVibe.Billing | extract | W8 (after ADR-012) |
--| pending_ip_messages | server/db/database.js:2071 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
--| platform_connections | server/db/database.js:715 | live.db | OpenRe.Stream | extract | W7 |
--| powerchat_connections | server/db/database.js:737 | live.db | OpenVibe.Live | keep | W3 (deliveries -> Events) |
--| powerchat_webhook_deliveries | server/db/database.js:754 | live.db | OpenVibe.Live | keep | W3 (deliveries -> Events) |
++| paste_comments | server/db/database.js:2010 | live.db | OpenVibe.Community | frozen-legacy | W5 |
++| paste_likes | server/db/database.js:1978 | live.db | OpenVibe.Community | frozen-legacy | W5 |
++| pastes | server/db/database.js:1941 | live.db | OpenVibe.Community | frozen-legacy | W5 |
++| payment_orders | server/db/database.js:1590 | live.db | OpenVibe.Billing | extract | W8 (after ADR-012) |
++| pending_ip_messages | server/db/database.js:2094 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
++| platform_connections | server/db/database.js:719 | live.db | OpenRe.Stream | extract | W7 |
++| powerchat_connections | server/db/database.js:741 | live.db | OpenVibe.Live | keep | W3 (deliveries -> Events) |
++| powerchat_webhook_deliveries | server/db/database.js:758 | live.db | OpenVibe.Live | keep | W3 (deliveries -> Events) |
| promo_claims | (prod only) | live.db | archive then drop | investigate | W0 |
--| relay_users | server/db/database.js:1472 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
--| restream_destinations | server/db/database.js:697 | live.db | OpenRe.Stream | extract | W7 |
++| relay_users | server/db/database.js:1495 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
++| restream_destinations | server/db/database.js:701 | live.db | OpenRe.Stream | extract | W7 |
| roast_dossier | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| roast_log | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--| robotstreamer_integrations | server/db/database.js:611, server/db/schema.sql:58 | live.db | OpenRe.Stream | extract | W7 |
--| robotstreamer_integrations_new | server/db/database.js:662 | no | OpenRe.Stream | extract | W7 |
++| robotstreamer_integrations | server/db/database.js:615, server/db/schema.sql:58 | live.db | OpenRe.Stream | extract | W7 |
++| robotstreamer_integrations_new | server/db/database.js:666 | no | OpenRe.Stream | extract | W7 |
| schema_migrations | server/db/migrations.js:27 | live.db | OpenVibe.Live | keep | - |
--| site_settings | server/db/database.js:355, server/db/schema.sql:556 | live.db | OpenVibe.Live | keep | - |
++| site_settings | server/db/database.js:356, server/db/schema.sql:556 | live.db | OpenVibe.Live | keep | - |
| stream_analytics | server/db/schema.sql:810 | live.db | OpenVibe.Live | keep | - |
| stream_controls | server/db/schema.sql:372 | live.db | OpenRe.Stream | extract | W7 |
--| stream_controls_new | server/db/database.js:2357 | no | OpenRe.Stream | extract | W7 |
--| stream_first_chats | server/db/database.js:2019 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
--| stream_memories | server/db/database.js:1188 | live.db | OpenVibe.AI | extract | W13 |
++| stream_controls_new | server/db/database.js:2380 | no | OpenRe.Stream | extract | W7 |
++| stream_first_chats | server/db/database.js:2042 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
++| stream_memories | server/db/database.js:1210 | live.db | OpenVibe.AI | extract | W13 |
| stream_recaps | server/recap/recap.js:27 | live.db | OpenVibe.AI | extract | W13 |
--| stream_timeline_events | server/db/database.js:1236 | live.db | OpenVibe.Live | keep | - |
--| streamer_overviews | server/db/database.js:1281 | live.db | OpenVibe.AI | extract | W13 |
++| stream_timeline_events | server/db/database.js:1259 | live.db | OpenVibe.Live | keep | - |
++| streamer_overviews | server/db/database.js:1304 | live.db | OpenVibe.AI | extract | W13 |
| streams | server/db/schema.sql:103 | live.db | OpenVibe.Live | keep | - |
| subscriptions | server/db/schema.sql:234 | live.db | OpenVibe.Billing + OpenVibe.VIP | extract | W8/W10 |
--| tag_guardian_defeats | server/game/tags.js:81 | live.db | OpenVibe.Live | keep | - |
++| tag_guardian_defeats | (prod only) | live.db | ? | investigate | W0 |
| themes | server/db/schema.sql:446 | live.db | OpenVibe.Network | extract | W1 |
++| tips_deliveries | server/tips/delivery-routes.js:39 | no | OpenVibe.Live | keep | W9 |
| transactions | server/db/schema.sql:247 | live.db | OpenVibe.Billing | extract | W8 (after ADR-012) |
--| translations | server/db/database.js:512, server/i18n/translate.js:147 | live.db | OpenVibe.AI | extract | W13 |
--| tts_voice_overrides | server/db/database.js:1359 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
++| translations | server/db/database.js:513, server/i18n/translate.js:147 | live.db | OpenVibe.AI | extract | W13 |
++| tts_voice_overrides | server/db/database.js:1382 | live.db | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| unlocked_recipes | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| user_cosmetics | server/db/schema.sql:774, server/monetization/cosmetics.js:111 | live.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| user_equipped | server/db/schema.sql:786, server/monetization/cosmetics.js:120 | live.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
--| user_equipped_tag | server/game/tags.js:76 | live.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
++| user_equipped_tag | server/chat/tags.js:61 | live.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| user_preferences | server/db/schema.sql:825 | live.db | OpenVibe.Network | extract | W1 |
--| user_tags | server/game/tags.js:67 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
++| user_tags | server/chat/tags.js:52 | live.db | OpenVibe.Chat | extract | W6 (remainder) |
| user_themes | server/db/schema.sql:467 | live.db | OpenVibe.Network | extract | W1 |
| user_voice_selection | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| user_voices | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| users | server/db/schema.sql:5 | live.db, rs-companion.db | OpenVibe.Network | extract | W1 |
--| verification_keys | server/db/database.js:366, server/db/schema.sql:567 | live.db | OpenVibe.Network | extract | W1 |
--| vibe_coding_events | server/db/database.js:2649, server/db/schema.sql:198 | live.db | OpenVibe.Codes | extract | W20 |
--| vibe_coding_sessions | server/db/database.js:2614, server/db/schema.sql:170 | live.db | OpenVibe.Codes | extract | W20 |
--| viewer_samples | server/db/database.js:3832 | live.db | OpenVibe.Live | keep | - |
++| verification_keys | server/db/database.js:367, server/db/schema.sql:567 | live.db | OpenVibe.Network | extract | W1 |
++| vibe_coding_events | server/db/database.js:2672, server/db/schema.sql:198 | live.db | OpenVibe.Codes | extract | W20 |
++| vibe_coding_sessions | server/db/database.js:2637, server/db/schema.sql:170 | live.db | OpenVibe.Codes | extract | W20 |
++| viewer_samples | server/db/database.js:3855 | live.db | OpenVibe.Live | keep | - |
| viewer_snapshots | server/db/schema.sql:799 | live.db | OpenVibe.Live | keep | - |
--| vod_ai_state | server/db/database.js:265 | live.db | OpenVibe.AI | extract | W13 |
++| vod_ai_state | server/db/database.js:266 | live.db | OpenVibe.AI | extract | W13 |
| vods | server/db/schema.sql:280 | live.db | OpenVibe.Media | frozen-legacy | W4 |
| vpn_approvals | server/db/schema.sql:434 | live.db | OpenVibe.Network (policy) | extract | W1 |
| watch_time | server/db/schema.sql:706 | live.db | OpenVibe.Live | keep | - |
@@@ -288,7 +291,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| dev_projects | server/developer/store.js:45 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_quotas | server/developer/store.js:104 | network.db | OpenVibe.Network | keep | W1 (module split) |
| email_delivery_log | server/db/database.js:222 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) |
--| email_verification_tokens | server/db/database.js:431 | network.db | OpenVibe.Network | keep | W1 (module split) |
++| email_verification_tokens | server/db/database.js:438 | network.db | OpenVibe.Network | keep | W1 (module split) |
| follows | server/db/database.js:306 | network.db | OpenVibe.Network | keep | W1 (module split) |
| identity_legacy_map | server/identity/subjects.js:25 | network.db | OpenVibe.Network | keep | W1 (module split) |
| ip_log | server/db/database.js:145 | network.db | OpenVibe.Network | keep | W1 (module split) |
@@@ -301,8 +304,8 @@ Deliverable 2: every table declared in code or present in production, with curre
| oauth_codes | server/db/database.js:64 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_tokens | server/db/database.js:78 | network.db | OpenVibe.Network | keep | W1 (module split) |
| password_reset_tokens | server/db/database.js:241 | network.db | OpenVibe.Network | keep | W1 (module split) |
--| principal_grants | server/identity/principals.js:164 | network.db | OpenVibe.Network | keep | W1 (module split) |
--| principal_usage | server/identity/principals.js:174 | network.db | OpenVibe.Network | keep | W1 (module split) |
++| principal_grants | server/identity/principals.js:171 | network.db | OpenVibe.Network | keep | W1 (module split) |
++| principal_usage | server/identity/principals.js:181 | network.db | OpenVibe.Network | keep | W1 (module split) |
| push_subscriptions | server/db/database.js:380 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) |
| site_settings | server/db/database.js:158 | network.db | OpenVibe.Network | keep | - |
| stream_live_announcements | server/notifications/stream-live.js:31 | network.db | OpenVibe.Events | extract | W3 |
@@@ -311,9 +314,9 @@ Deliverable 2: every table declared in code or present in production, with curre
| url_registry | server/db/database.js:165, server/url-registry.js:7 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_effects | server/db/database.js:295 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_history | server/history/routes.js:26 | network.db | OpenVibe.Network | keep | W1 (module split) |
--| user_module_retirements | server/identity/modules.js:93 | no | OpenVibe.Network | keep | W1 (module split) |
--| user_module_revisions | server/identity/modules.js:86 | no | OpenVibe.Network | keep | W1 (module split) |
--| user_modules | server/identity/modules.js:75 | network.db | OpenVibe.Network | keep | W1 (module split) |
++| user_module_retirements | server/identity/modules.js:91 | no | OpenVibe.Network | keep | W1 (module split) |
++| user_module_revisions | server/identity/modules.js:84 | no | OpenVibe.Network | keep | W1 (module split) |
++| user_modules | server/identity/modules.js:73 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_preferences | server/db/database.js:92 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_sessions | server/db/database.js:274 | network.db | OpenVibe.Network | keep | W1 (module split) |
| users | server/db/database.js:33 | network.db | OpenVibe.Network | keep | W1 (module split) |
@@@ -324,35 +327,37 @@ Deliverable 2: every table declared in code or present in production, with curre
No tables.
--## OpenVibe.Media (23)
++## OpenVibe.Media (25)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
| apps | server/db/schema.sql:8 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| assets | server/db/schema.sql:193 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| clips | server/db/schema.sql:64 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| content_views | server/db/schema.sql:96 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| assets | server/db/schema.sql:194 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| clips | server/db/schema.sql:65 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| content_views | server/db/schema.sql:97 | media.db | OpenVibe.Media | keep | W4 (object model) |
| content_visits | server/views/service.js:43 | media.db | OpenVibe.Media | keep | W4 (object model) |
| event_outbox | (prod only) | media.db | OpenVibe.Media | keep | W3 |
--| files | server/db/schema.sql:167 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_holds | server/db/schema.sql:338 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_invariant_violations | server/db/schema.sql:351 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_jobs | server/db/schema.sql:281 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_locations | server/db/schema.sql:241 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_objects | server/db/schema.sql:214 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_relationships | server/db/schema.sql:257 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_settings | server/db/schema.sql:182 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_upload_parts | server/db/schema.sql:328 | no | OpenVibe.Media | keep | W4 (object model) |
--| media_uploads | server/db/schema.sql:312 | no | OpenVibe.Media | keep | W4 (object model) |
--| media_variants | server/db/schema.sql:268 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_verifications | server/db/schema.sql:365 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| media_verify_runs | server/db/schema.sql:377 | media.db | OpenVibe.Media | keep | W4 (object model) |
--| paste_comments | server/db/schema.sql:149 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
--| paste_likes | server/db/schema.sql:141 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
--| pastes | server/db/schema.sql:107 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
++| files | server/db/schema.sql:168 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_holds | server/db/schema.sql:339 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_invariant_violations | server/db/schema.sql:352 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_jobs | server/db/schema.sql:282 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_locations | server/db/schema.sql:242 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_object_changes | server/db/schema.sql:390 | no | OpenVibe.Media | keep | W4 (object model) |
++| media_objects | server/db/schema.sql:215 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_relationships | server/db/schema.sql:258 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_settings | server/db/schema.sql:183 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_tier_decisions | server/db/schema.sql:367 | no | OpenVibe.Media | keep | W4 (object model) |
++| media_upload_parts | server/db/schema.sql:329 | no | OpenVibe.Media | keep | W4 (object model) |
++| media_uploads | server/db/schema.sql:313 | no | OpenVibe.Media | keep | W4 (object model) |
++| media_variants | server/db/schema.sql:269 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_verifications | server/db/schema.sql:402 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| media_verify_runs | server/db/schema.sql:414 | media.db | OpenVibe.Media | keep | W4 (object model) |
++| paste_comments | server/db/schema.sql:150 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
++| paste_likes | server/db/schema.sql:142 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
++| pastes | server/db/schema.sql:108 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
| vods | server/db/schema.sql:22 | media.db | OpenVibe.Media | keep | W4 (object model) |
--## OpenVibe.Tools (10)
++## OpenVibe.Tools (13)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
@@@ -363,6 +368,9 @@ No tables.
| analytics_rate_tracking | (prod only) | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 |
| analytics_visitor_days | (prod only) | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 |
| event_outbox | (prod only) | jobs.db | OpenVibe.Tools | keep | W3 |
++| guard_abuse | apps/_shared/guard/store.js:38 | no | OpenVibe.Tools | keep | - |
++| guard_day | apps/_shared/guard/store.js:31 | no | OpenVibe.Tools | keep | - |
++| guard_salt | apps/_shared/guard/store.js:27 | no | OpenVibe.Tools | keep | - |
| tool_job_events | apps/_shared/jobs/store.js:47 | jobs.db | OpenVibe.Tools | keep | - |
| tool_job_references | apps/_shared/jobs/store.js:55 | jobs.db | OpenVibe.Tools | keep | - |
| tool_jobs | apps/_shared/jobs/store.js:17 | jobs.db | OpenVibe.Tools | keep | - |
ddiff --git a/docs/roadmap-baseline/03-routes.md b/docs/roadmap-baseline/03-routes.md
iindex 0dd38168..c7be475d 100644
---- a/docs/roadmap-baseline/03-routes.md
++++ b/docs/roadmap-baseline/03-routes.md
@@@ -8,31 +8,31 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| Repo | Routes | GET | POST | PUT/PATCH | DELETE | Other | /internal/* | Stay | Elsewhere or moving |
|---|---|---|---|---|---|---|---|---|---|
--| OpenVibe.Live | 631 | 312 | 220 | 50 | 48 | 1 | 95 | 345 | 286 |
--| OpenVibe.Network | 248 | 116 | 82 | 30 | 20 | 0 | 30 | 247 | 1 |
++| OpenVibe.Live | 632 | 313 | 220 | 50 | 48 | 1 | 95 | 347 | 285 |
++| OpenVibe.Network | 254 | 120 | 84 | 30 | 20 | 0 | 31 | 253 | 1 |
| OpenVibe.Shared | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 0 |
--| OpenVibe.Media | 109 | 44 | 44 | 6 | 15 | 0 | 1 | 91 | 18 |
--| OpenVibe.Tools | 118 | 98 | 14 | 1 | 4 | 1 | 0 | 118 | 0 |
++| OpenVibe.Media | 110 | 45 | 44 | 6 | 15 | 0 | 1 | 92 | 18 |
++| OpenVibe.Tools | 119 | 97 | 16 | 1 | 4 | 1 | 0 | 119 | 0 |
| OpenVibe.Community | 107 | 54 | 32 | 12 | 9 | 0 | 0 | 107 | 0 |
--| OpenVibe.Games | 21 | 0 | 3 | 0 | 0 | 18 | 0 | 21 | 0 |
--| OpenVibe.Events | 17 | 11 | 5 | 1 | 0 | 0 | 1 | 17 | 0 |
++| OpenVibe.Games | 29 | 0 | 3 | 0 | 0 | 26 | 0 | 29 | 0 |
++| OpenVibe.Events | 17 | 10 | 6 | 1 | 0 | 0 | 1 | 17 | 0 |
| OpenVibe.Chat | 63 | 38 | 15 | 4 | 6 | 0 | 0 | 63 | 0 |
| OpenRe.Stream | 37 | 25 | 8 | 2 | 2 | 0 | 0 | 37 | 0 |
| OpenVibe.Billing | 54 | 31 | 22 | 0 | 0 | 1 | 0 | 54 | 0 |
--| OpenVibe.Tips | 62 | 37 | 22 | 3 | 0 | 0 | 0 | 62 | 0 |
--| OpenVibe.VIP | 44 | 28 | 12 | 3 | 1 | 0 | 0 | 44 | 0 |
--| OpenVibe.AI | 33 | 18 | 12 | 2 | 1 | 0 | 0 | 33 | 0 |
--| OpenVibe.Search | 20 | 15 | 2 | 1 | 2 | 0 | 1 | 20 | 0 |
--| OpenVibe.Sources | 17 | 11 | 3 | 1 | 2 | 0 | 0 | 17 | 0 |
--| OpenVibe.Wiki | 76 | 43 | 28 | 4 | 1 | 0 | 0 | 76 | 0 |
--| OpenVibe.Blog | 56 | 38 | 14 | 3 | 1 | 0 | 0 | 56 | 0 |
--| OpenVibe.News | 51 | 34 | 17 | 0 | 0 | 0 | 1 | 51 | 0 |
--| OpenVibe.Reviews | 70 | 34 | 31 | 2 | 3 | 0 | 0 | 70 | 0 |
--| OpenVibe.Deals | 58 | 31 | 23 | 2 | 2 | 0 | 1 | 58 | 0 |
--| OpenVibe.Coupons | 46 | 30 | 16 | 0 | 0 | 0 | 0 | 46 | 0 |
++| OpenVibe.Tips | 61 | 36 | 22 | 3 | 0 | 0 | 0 | 61 | 0 |
++| OpenVibe.VIP | 43 | 27 | 12 | 3 | 1 | 0 | 0 | 43 | 0 |
++| OpenVibe.AI | 32 | 17 | 12 | 2 | 1 | 0 | 0 | 32 | 0 |
++| OpenVibe.Search | 19 | 14 | 2 | 1 | 2 | 0 | 1 | 19 | 0 |
++| OpenVibe.Sources | 16 | 10 | 3 | 1 | 2 | 0 | 0 | 16 | 0 |
++| OpenVibe.Wiki | 75 | 42 | 28 | 4 | 1 | 0 | 0 | 75 | 0 |
++| OpenVibe.Blog | 55 | 37 | 14 | 3 | 1 | 0 | 0 | 55 | 0 |
++| OpenVibe.News | 50 | 33 | 17 | 0 | 0 | 0 | 1 | 50 | 0 |
++| OpenVibe.Reviews | 69 | 33 | 31 | 2 | 3 | 0 | 0 | 69 | 0 |
++| OpenVibe.Deals | 57 | 30 | 23 | 2 | 2 | 0 | 1 | 57 | 0 |
++| OpenVibe.Coupons | 45 | 29 | 16 | 0 | 0 | 0 | 0 | 45 | 0 |
| OpenVibe.Trade | 7 | 4 | 3 | 0 | 0 | 0 | 1 | 7 | 0 |
--| OpenVibe.Codes | 95 | 52 | 42 | 0 | 0 | 1 | 0 | 95 | 0 |
--| OpenVibe.Host | 56 | 23 | 24 | 2 | 7 | 0 | 0 | 56 | 0 |
++| OpenVibe.Codes | 94 | 51 | 42 | 0 | 0 | 1 | 0 | 94 | 0 |
++| OpenVibe.Host | 55 | 22 | 24 | 2 | 7 | 0 | 0 | 55 | 0 |
## Route authority
@@@ -45,7 +45,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| OpenVibe.Live | OpenVibe.Chat | extract | 24 | W6 (remainder) | Emotes and channel moderators are still Live-written (Chat holds staged copies). |
| OpenVibe.Live | OpenVibe.Chat | shadowed | 52 | W6 (done 2026-09-23) | nginx sends /api/chat, /api/dm, /api/tts and /api/sounds on openvibe.live to Chat (:4400); Live's handlers remain for rollback. |
| OpenVibe.Live | OpenVibe.Codes | extract | 4 | W20 | Coding-session capture belongs to Codes. |
--| OpenVibe.Live | OpenVibe.Community | adapter | 34 | W5 (done) | Forwards to Community with a service token (pastes since 2026-09-22, VOD/clip comments since b8afb71); /p/* 301s to openvibe.community. |
++| OpenVibe.Live | OpenVibe.Community | adapter | 33 | W5 (done) | Forwards to Community with a service token (pastes since 2026-09-22, VOD/clip comments since b8afb71); /p/* 301s to openvibe.community. |
| OpenVibe.Live | OpenVibe.Events | compat | 1 | W3 | Direct Media webhook kept while Events delivers the same outcomes (MEDIA_EVENTS_AUTHORITY); each outcome applies once (d2715e5). |
| OpenVibe.Live | OpenVibe.Games | compat | 2 | W12 | 301 to openvibe.games. |
| OpenVibe.Live | OpenVibe.Media | adapter | 36 | W4 | media-proxy: Media holds the objects; Live keeps presentation and AI state. |
@@@ -73,19 +73,19 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/admin/ai/viewers/:userId/:action | server/admin/routes.js:550 | | keep |
| GET | /api/admin/ai/viewers/:userId/log | server/admin/routes.js:560 | | keep |
| GET | /api/admin/ai/viewers/status | server/admin/routes.js:532 | | keep |
--| GET | /api/admin/analytics | server/index.js:709 | | keep |
--| GET | /api/admin/analytics/bots | server/index.js:718 | | keep |
++| GET | /api/admin/analytics | server/index.js:717 | | keep |
++| GET | /api/admin/analytics/bots | server/index.js:726 | | keep |
| GET | /api/admin/bans | server/admin/routes.js:429 | | keep |
--| POST | /api/admin/broadcast | server/index.js:826 | | keep |
++| POST | /api/admin/broadcast | server/index.js:837 | | keep |
| PUT | /api/admin/channels/:id/force-nsfw | server/admin/routes.js:370 | | keep |
| GET | /api/admin/diagnostics | server/admin/routes.js:55 | | keep |
--| DELETE | /api/admin/media-tools/cookies | server/admin/routes.js:1250 | | keep |
--| PUT | /api/admin/media-tools/cookies | server/admin/routes.js:1169 | | keep |
--| POST | /api/admin/media-tools/cookies/check | server/admin/routes.js:1228 | | keep |
--| DELETE | /api/admin/media-tools/extra-args | server/admin/routes.js:1283 | | keep |
--| PUT | /api/admin/media-tools/extra-args | server/admin/routes.js:1264 | | keep |
--| GET | /api/admin/media-tools/status | server/admin/routes.js:1124 | | keep |
--| POST | /api/admin/media-tools/test | server/admin/routes.js:1294 | | keep |
++| DELETE | /api/admin/media-tools/cookies | server/admin/routes.js:1251 | | keep |
++| PUT | /api/admin/media-tools/cookies | server/admin/routes.js:1170 | | keep |
++| POST | /api/admin/media-tools/cookies/check | server/admin/routes.js:1229 | | keep |
++| DELETE | /api/admin/media-tools/extra-args | server/admin/routes.js:1284 | | keep |
++| PUT | /api/admin/media-tools/extra-args | server/admin/routes.js:1265 | | keep |
++| GET | /api/admin/media-tools/status | server/admin/routes.js:1125 | | keep |
++| POST | /api/admin/media-tools/test | server/admin/routes.js:1295 | | keep |
| GET | /api/admin/moderators | server/admin/routes.js:731 | | keep |
| POST | /api/admin/moderators | server/admin/routes.js:743 | | keep |
| DELETE | /api/admin/moderators/:id | server/admin/routes.js:770 | | keep |
@@@ -100,9 +100,9 @@ Owner = the repository whose code answers the route; target = the authority it b
| PUT | /api/admin/settings/:key | server/admin/routes.js:697 | | keep |
| GET | /api/admin/stats | server/admin/routes.js:67 | | keep |
| GET | /api/admin/storage | server/admin/routes.js:969 | | keep |
--| DELETE | /api/admin/storage/clips/bulk | server/admin/routes.js:1074 | | keep |
--| GET | /api/admin/storage/vods | server/admin/routes.js:1024 | | keep |
--| DELETE | /api/admin/storage/vods/bulk | server/admin/routes.js:1043 | | keep |
++| DELETE | /api/admin/storage/clips/bulk | server/admin/routes.js:1075 | | keep |
++| GET | /api/admin/storage/vods | server/admin/routes.js:1025 | | keep |
++| DELETE | /api/admin/storage/vods/bulk | server/admin/routes.js:1044 | | keep |
| GET | /api/admin/streams | server/admin/routes.js:305 | | keep |
| DELETE | /api/admin/streams/:id | server/admin/routes.js:324 | | keep |
| PUT | /api/admin/streams/:id/nsfw | server/admin/routes.js:418 | | keep |
@@@ -191,39 +191,39 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/chat-ai/transcript/:streamId | server/ai/chat-ai-routes.js:335 | | keep |
| GET | /api/chat-ai/user/:id | server/ai/chat-ai-routes.js:39 | | keep |
| GET | /api/chat-ai/vod-transcripts | server/ai/chat-ai-routes.js:273 | | keep |
--| GET | /api/chat/:streamId/history | server/chat/routes.js:509 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/:streamId/replay | server/chat/routes.js:487 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/:streamId/users | server/chat/routes.js:633 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/admin/logs | server/chat/routes.js:718 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/admin/logs/export | server/chat/routes.js:755 | OpenVibe.Chat | shadowed |
--| DELETE | /api/chat/admin/purge | server/chat/routes.js:674 | OpenVibe.Chat | shadowed |
--| POST | /api/chat/admin/purge/preview | server/chat/routes.js:642 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/anon/:anonId | server/chat/routes.js:419 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/anon/:anonId/logs | server/chat/routes.js:430 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/channel/:userId/history | server/chat/routes.js:609 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/filters/friendly | server/chat/routes.js:462 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/:streamId/history | server/chat/routes.js:489 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/:streamId/replay | server/chat/routes.js:467 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/:streamId/users | server/chat/routes.js:613 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/admin/logs | server/chat/routes.js:698 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/admin/logs/export | server/chat/routes.js:735 | OpenVibe.Chat | shadowed |
++| DELETE | /api/chat/admin/purge | server/chat/routes.js:654 | OpenVibe.Chat | shadowed |
++| POST | /api/chat/admin/purge/preview | server/chat/routes.js:622 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/anon/:anonId | server/chat/routes.js:399 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/anon/:anonId/logs | server/chat/routes.js:410 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/channel/:userId/history | server/chat/routes.js:589 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/filters/friendly | server/chat/routes.js:442 | OpenVibe.Chat | shadowed |
| GET | /api/chat/gif/providers | server/chat/routes.js:109 | OpenVibe.Chat | shadowed |
| GET | /api/chat/gif/search | server/chat/routes.js:145 | OpenVibe.Chat | shadowed |
| GET | /api/chat/gif/trending | server/chat/routes.js:119 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/global/history | server/chat/routes.js:468 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/relay-user/:platform/:username | server/chat/routes.js:409 | OpenVibe.Chat | shadowed |
--| GET | /api/chat/relay-user/:platform/:username/logs | server/chat/routes.js:446 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/global/history | server/chat/routes.js:448 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/relay-user/:platform/:username | server/chat/routes.js:389 | OpenVibe.Chat | shadowed |
++| GET | /api/chat/relay-user/:platform/:username/logs | server/chat/routes.js:426 | OpenVibe.Chat | shadowed |
| GET | /api/chat/search | server/chat/routes.js:319 | OpenVibe.Chat | shadowed |
| POST | /api/chat/send | server/chat/routes.js:209 | OpenVibe.Chat | shadowed |
| GET | /api/chat/user/:userId/history | server/chat/routes.js:341 | OpenVibe.Chat | shadowed |
| GET | /api/chat/user/:username/profile | server/chat/routes.js:360 | OpenVibe.Chat | shadowed |
--| GET | /api/clips | server/media-proxy/clips.js:168 | OpenVibe.Media | adapter |
--| DELETE | /api/clips/:id | server/media-proxy/clips.js:337 | OpenVibe.Media | adapter |
--| GET | /api/clips/:id | server/media-proxy/clips.js:197 | OpenVibe.Media | adapter |
--| POST | /api/clips/:id/recut | server/media-proxy/clips.js:356 | OpenVibe.Media | adapter |
--| PUT | /api/clips/:id/title | server/media-proxy/clips.js:271 | OpenVibe.Media | adapter |
--| PUT | /api/clips/:id/visibility | server/media-proxy/clips.js:288 | OpenVibe.Media | adapter |
--| POST | /api/clips/bulk | server/media-proxy/clips.js:312 | OpenVibe.Media | adapter |
--| GET | /api/clips/mine | server/media-proxy/clips.js:120 | OpenVibe.Media | adapter |
--| GET | /api/clips/my-stream | server/media-proxy/clips.js:134 | OpenVibe.Media | adapter |
--| GET | /api/clips/settings/channel | server/media-proxy/clips.js:146 | OpenVibe.Media | adapter |
--| PUT | /api/clips/settings/channel | server/media-proxy/clips.js:155 | OpenVibe.Media | adapter |
--| POST | /api/coins/admin/grant | server/monetization/coins-routes.js:310 | | keep |
++| GET | /api/clips | server/media-proxy/clips.js:181 | OpenVibe.Media | adapter |
++| DELETE | /api/clips/:id | server/media-proxy/clips.js:351 | OpenVibe.Media | adapter |
++| GET | /api/clips/:id | server/media-proxy/clips.js:210 | OpenVibe.Media | adapter |
++| POST | /api/clips/:id/recut | server/media-proxy/clips.js:370 | OpenVibe.Media | adapter |
++| PUT | /api/clips/:id/title | server/media-proxy/clips.js:285 | OpenVibe.Media | adapter |
++| PUT | /api/clips/:id/visibility | server/media-proxy/clips.js:302 | OpenVibe.Media | adapter |
++| POST | /api/clips/bulk | server/media-proxy/clips.js:326 | OpenVibe.Media | adapter |
++| GET | /api/clips/mine | server/media-proxy/clips.js:123 | OpenVibe.Media | adapter |
++| GET | /api/clips/my-stream | server/media-proxy/clips.js:141 | OpenVibe.Media | adapter |
++| GET | /api/clips/settings/channel | server/media-proxy/clips.js:159 | OpenVibe.Media | adapter |
++| PUT | /api/clips/settings/channel | server/media-proxy/clips.js:168 | OpenVibe.Media | adapter |
++| POST | /api/coins/admin/grant | server/monetization/coins-routes.js:316 | | keep |
| GET | /api/coins/balance | server/monetization/coins-routes.js:26 | | keep |
| POST | /api/coins/bonus | server/monetization/coins-routes.js:70 | | keep |
| GET | /api/coins/channel-balance | server/monetization/coins-routes.js:31 | | keep |
@@@ -244,6 +244,8 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/comments/:commentId/replies | server/media-proxy/comments.js:144 | OpenVibe.Community | adapter |
| GET | /api/comments/:type/:id | server/media-proxy/comments.js:162 | OpenVibe.Community | adapter |
| POST | /api/comments/:type/:id | server/media-proxy/comments.js:209 | OpenVibe.Community | adapter |
++| GET | /api/content/feed | server/content/routes.js:36 | | keep |
++| GET | /api/content/moments | server/content/routes.js:37 | | keep |
| GET | /api/controls/:streamId | server/controls/routes.js:1460 | OpenRe.Stream | extract |
| GET | /api/controls/:streamId/config | server/controls/routes.js:1417 | OpenRe.Stream | extract |
| PUT | /api/controls/:streamId/config | server/controls/routes.js:1431 | OpenRe.Stream | extract |
@@@ -274,26 +276,26 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/cosmetics/deactivate | server/monetization/cosmetics-routes.js:73 | | keep |
| POST | /api/cosmetics/equip | server/monetization/cosmetics-routes.js:46 | | keep |
| GET | /api/cosmetics/equipped/:userId | server/monetization/cosmetics-routes.js:38 | | keep |
--| POST | /api/cosmetics/internal-unlock | server/monetization/cosmetics-routes.js:91 | | keep |
++| POST | /api/cosmetics/internal-unlock | server/monetization/cosmetics-routes.js:87 | | keep |
| GET | /api/cosmetics/inventory | server/monetization/cosmetics-routes.js:32 | | keep |
| POST | /api/cosmetics/unequip | server/monetization/cosmetics-routes.js:55 | | keep |
--| POST | /api/csp-report | server/index.js:847 | | keep |
--| GET | /api/dm/blocks | server/chat/dm-routes.js:401 | OpenVibe.Chat | shadowed |
--| DELETE | /api/dm/blocks/:userId | server/chat/dm-routes.js:389 | OpenVibe.Chat | shadowed |
--| POST | /api/dm/blocks/:userId | server/chat/dm-routes.js:374 | OpenVibe.Chat | shadowed |
--| GET | /api/dm/blocks/check/:userId | server/chat/dm-routes.js:411 | OpenVibe.Chat | shadowed |
--| GET | /api/dm/conversations | server/chat/dm-routes.js:49 | OpenVibe.Chat | shadowed |
--| POST | /api/dm/conversations | server/chat/dm-routes.js:64 | OpenVibe.Chat | shadowed |
--| GET | /api/dm/conversations/:id | server/chat/dm-routes.js:120 | OpenVibe.Chat | shadowed |
--| PATCH | /api/dm/conversations/:id | server/chat/dm-routes.js:331 | OpenVibe.Chat | shadowed |
--| GET | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:137 | OpenVibe.Chat | shadowed |
--| POST | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:155 | OpenVibe.Chat | shadowed |
--| DELETE | /api/dm/conversations/:id/messages/:msgId | server/chat/dm-routes.js:421 | OpenVibe.Chat | shadowed |
--| POST | /api/dm/conversations/:id/participants | server/chat/dm-routes.js:256 | OpenVibe.Chat | shadowed |
--| DELETE | /api/dm/conversations/:id/participants/:userId | server/chat/dm-routes.js:310 | OpenVibe.Chat | shadowed |
--| POST | /api/dm/conversations/:id/read | server/chat/dm-routes.js:234 | OpenVibe.Chat | shadowed |
--| GET | /api/dm/unread | server/chat/dm-routes.js:350 | OpenVibe.Chat | shadowed |
--| GET | /api/dm/users/search | server/chat/dm-routes.js:360 | OpenVibe.Chat | shadowed |
++| POST | /api/csp-report | server/index.js:858 | | keep |
++| GET | /api/dm/blocks | server/chat/dm-routes.js:402 | OpenVibe.Chat | shadowed |
++| DELETE | /api/dm/blocks/:userId | server/chat/dm-routes.js:390 | OpenVibe.Chat | shadowed |
++| POST | /api/dm/blocks/:userId | server/chat/dm-routes.js:375 | OpenVibe.Chat | shadowed |
++| GET | /api/dm/blocks/check/:userId | server/chat/dm-routes.js:412 | OpenVibe.Chat | shadowed |
++| GET | /api/dm/conversations | server/chat/dm-routes.js:50 | OpenVibe.Chat | shadowed |
++| POST | /api/dm/conversations | server/chat/dm-routes.js:65 | OpenVibe.Chat | shadowed |
++| GET | /api/dm/conversations/:id | server/chat/dm-routes.js:121 | OpenVibe.Chat | shadowed |
++| PATCH | /api/dm/conversations/:id | server/chat/dm-routes.js:332 | OpenVibe.Chat | shadowed |
++| GET | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:138 | OpenVibe.Chat | shadowed |
++| POST | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:156 | OpenVibe.Chat | shadowed |
++| DELETE | /api/dm/conversations/:id/messages/:msgId | server/chat/dm-routes.js:422 | OpenVibe.Chat | shadowed |
++| POST | /api/dm/conversations/:id/participants | server/chat/dm-routes.js:257 | OpenVibe.Chat | shadowed |
++| DELETE | /api/dm/conversations/:id/participants/:userId | server/chat/dm-routes.js:311 | OpenVibe.Chat | shadowed |
++| POST | /api/dm/conversations/:id/read | server/chat/dm-routes.js:235 | OpenVibe.Chat | shadowed |
++| GET | /api/dm/unread | server/chat/dm-routes.js:351 | OpenVibe.Chat | shadowed |
++| GET | /api/dm/users/search | server/chat/dm-routes.js:361 | OpenVibe.Chat | shadowed |
| GET | /api/easter-egg/daily | server/ai/easter-egg-routes.js:16 | | keep |
| POST | /api/easter-egg/reveal | server/ai/easter-egg-routes.js:69 | | keep |
| POST | /api/easter-egg/solve | server/ai/easter-egg-routes.js:41 | | keep |
@@@ -327,14 +329,14 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/funds/leaderboard/:streamId | server/monetization/routes.js:233 | OpenVibe.Tips | extract |
| POST | /api/funds/purchase | server/monetization/routes.js:42 | OpenVibe.Tips | extract |
| POST | /api/funds/recycle | server/monetization/routes.js:206 | OpenVibe.Tips | extract |
--| GET | /api/health | server/index.js:728 | | keep |
--| GET | /api/home/digest | server/home/routes.js:437 | | keep |
--| GET | /api/home/discover | server/home/routes.js:487 | | keep |
++| GET | /api/health | server/index.js:736 | | keep |
++| GET | /api/home/digest | server/home/routes.js:438 | | keep |
++| GET | /api/home/discover | server/home/routes.js:488 | | keep |
| GET | /api/home/featured | server/home/routes.js:227 | | keep |
| GET | /api/home/hero | server/home/routes.js:313 | | keep |
| GET | /api/home/pulse | server/home/routes.js:386 | | keep |
| GET | /api/home/star | server/home/routes.js:332 | | keep |
--| POST | /api/home/star/rotate | server/home/routes.js:549 | | keep |
++| POST | /api/home/star/rotate | server/home/routes.js:550 | | keep |
| GET | /api/home/stats-live | server/home/routes.js:267 | | keep |
| GET | /api/home/stats/series/:metric | server/home/routes.js:166 | | keep |
| GET | /api/i18n/languages | server/i18n/routes.js:31 | | keep |
@@@ -342,7 +344,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/img-proxy | server/media/external-image-proxy.js:31 | | keep |
| GET | /api/kiosk/favicon | server/kiosk/routes.js:122 | | keep |
| GET | /api/kiosk/site | server/kiosk/routes.js:77 | | keep |
--| GET | /api/live-events | server/index.js:651 | | keep |
++| GET | /api/live-events | server/index.js:658 | | keep |
| POST | /api/media/advance | server/media/routes.js:267 | | keep |
| GET | /api/media/channel/:username | server/media/routes.js:52 | | keep |
| GET | /api/media/downloader/status | server/media/routes.js:418 | | keep |
@@@ -399,31 +401,31 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/onvif/cameras/:id/presets | server/controls/onvif-routes.js:349 | OpenRe.Stream | extract |
| POST | /api/onvif/cameras/:id/presets | server/controls/onvif-routes.js:372 | OpenRe.Stream | extract |
| POST | /api/onvif/discover | server/controls/onvif-routes.js:70 | OpenRe.Stream | extract |
--| GET | /api/pastes | server/media-proxy/pastes.js:167 | OpenVibe.Community | adapter |
--| POST | /api/pastes | server/media-proxy/pastes.js:168 | OpenVibe.Community | adapter |
--| DELETE | /api/pastes/:slug | server/media-proxy/pastes.js:217 | OpenVibe.Community | adapter |
--| GET | /api/pastes/:slug | server/media-proxy/pastes.js:215 | OpenVibe.Community | adapter |
--| PUT | /api/pastes/:slug | server/media-proxy/pastes.js:216 | OpenVibe.Community | adapter |
--| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:222 | OpenVibe.Community | adapter |
--| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:315 | OpenVibe.Community | adapter |
--| GET | /api/pastes/:slug/comments | server/media-proxy/pastes.js:243 | OpenVibe.Community | adapter |
--| POST | /api/pastes/:slug/comments | server/media-proxy/pastes.js:246 | OpenVibe.Community | adapter |
--| DELETE | /api/pastes/:slug/comments/:commentId | server/media-proxy/pastes.js:248 | OpenVibe.Community | adapter |
--| POST | /api/pastes/:slug/copy | server/media-proxy/pastes.js:242 | OpenVibe.Community | adapter |
--| POST | /api/pastes/:slug/fork | server/media-proxy/pastes.js:238 | OpenVibe.Community | adapter |
--| POST | /api/pastes/:slug/like | server/media-proxy/pastes.js:241 | OpenVibe.Community | adapter |
--| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:240 | OpenVibe.Community | adapter |
--| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:311 | OpenVibe.Community | adapter |
--| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:110 | OpenVibe.Community | adapter |
--| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:296 | OpenVibe.Community | adapter |
--| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:171 | OpenVibe.Community | adapter |
--| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:313 | OpenVibe.Community | adapter |
--| GET | /api/pastes/admin/stats | server/media-proxy/pastes.js:170 | OpenVibe.Community | adapter |
--| POST | /api/pastes/bulk | server/media-proxy/pastes.js:172 | OpenVibe.Community | adapter |
--| POST | /api/pastes/bulk | server/media-proxy/pastes.js:314 | OpenVibe.Community | adapter |
--| GET | /api/pastes/by-user/:username | server/media-proxy/pastes.js:177 | OpenVibe.Community | adapter |
--| GET | /api/pastes/config | server/media-proxy/pastes.js:169 | OpenVibe.Community | adapter |
--| POST | /api/pastes/screenshot | server/media-proxy/pastes.js:83 | OpenVibe.Community | adapter |
++| GET | /api/pastes | server/media-proxy/pastes.js:168 | OpenVibe.Community | adapter |
++| POST | /api/pastes | server/media-proxy/pastes.js:169 | OpenVibe.Community | adapter |
++| DELETE | /api/pastes/:slug | server/media-proxy/pastes.js:218 | OpenVibe.Community | adapter |
++| GET | /api/pastes/:slug | server/media-proxy/pastes.js:216 | OpenVibe.Community | adapter |
++| PUT | /api/pastes/:slug | server/media-proxy/pastes.js:217 | OpenVibe.Community | adapter |
++| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:223 | OpenVibe.Community | adapter |
++| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:316 | OpenVibe.Community | adapter |
++| GET | /api/pastes/:slug/comments | server/media-proxy/pastes.js:244 | OpenVibe.Community | adapter |
++| POST | /api/pastes/:slug/comments | server/media-proxy/pastes.js:247 | OpenVibe.Community | adapter |
++| DELETE | /api/pastes/:slug/comments/:commentId | server/media-proxy/pastes.js:249 | OpenVibe.Community | adapter |
++| POST | /api/pastes/:slug/copy | server/media-proxy/pastes.js:243 | OpenVibe.Community | adapter |
++| POST | /api/pastes/:slug/fork | server/media-proxy/pastes.js:239 | OpenVibe.Community | adapter |
++| POST | /api/pastes/:slug/like | server/media-proxy/pastes.js:242 | OpenVibe.Community | adapter |
++| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:241 | OpenVibe.Community | adapter |
++| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:312 | OpenVibe.Community | adapter |
++| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:111 | OpenVibe.Community | adapter |
++| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:297 | OpenVibe.Community | adapter |
++| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:172 | OpenVibe.Community | adapter |
++| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:314 | OpenVibe.Community | adapter |
++| GET | /api/pastes/admin/stats | server/media-proxy/pastes.js:171 | OpenVibe.Community | adapter |
++| POST | /api/pastes/bulk | server/media-proxy/pastes.js:173 | OpenVibe.Community | adapter |
++| POST | /api/pastes/bulk | server/media-proxy/pastes.js:315 | OpenVibe.Community | adapter |
++| GET | /api/pastes/by-user/:username | server/media-proxy/pastes.js:178 | OpenVibe.Community | adapter |
++| GET | /api/pastes/config | server/media-proxy/pastes.js:170 | OpenVibe.Community | adapter |
++| POST | /api/pastes/screenshot | server/media-proxy/pastes.js:84 | OpenVibe.Community | adapter |
| POST | /api/payments/bucks/checkout | server/monetization/payments-routes.js:41 | OpenVibe.Billing | extract |
| GET | /api/payments/channel/:username | server/monetization/payments-routes.js:243 | OpenVibe.Billing | extract |
| GET | /api/payments/config | server/monetization/payments-routes.js:36 | OpenVibe.Billing | extract |
@@@ -446,32 +448,32 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/powerchat/test-tip | server/integrations/powerchat-routes.js:350 | OpenVibe.Billing | extract |
| GET | /api/powerchat/tip-link | server/integrations/powerchat-routes.js:291 | OpenVibe.Billing | extract |
| POST | /api/powerchat/webhook | server/integrations/powerchat-routes.js:442 | OpenVibe.Billing | extract |
--| GET | /api/ready | server/index.js:766 | | keep |
++| GET | /api/ready | server/index.js:777 | | keep |
| GET | /api/recap/:streamId | server/recap/routes.js:21 | | keep |
| POST | /api/recap/:streamId/regenerate | server/recap/routes.js:43 | | keep |
| GET | /api/recap/channel/:username | server/recap/routes.js:14 | | keep |
--| GET | /api/restream/destinations | server/streaming/restream-routes.js:174 | OpenRe.Stream | extract |
--| POST | /api/restream/destinations | server/streaming/restream-routes.js:196 | OpenRe.Stream | extract |
--| DELETE | /api/restream/destinations/:id | server/streaming/restream-routes.js:362 | OpenRe.Stream | extract |
--| PUT | /api/restream/destinations/:id | server/streaming/restream-routes.js:272 | OpenRe.Stream | extract |
--| POST | /api/restream/destinations/:id/start | server/streaming/restream-routes.js:386 | OpenRe.Stream | extract |
--| POST | /api/restream/destinations/:id/stop | server/streaming/restream-routes.js:443 | OpenRe.Stream | extract |
--| GET | /api/restream/oauth/:platform/callback | server/streaming/restream-routes.js:623 | OpenRe.Stream | extract |
--| DELETE | /api/restream/oauth/:platform/connection | server/streaming/restream-routes.js:717 | OpenRe.Stream | extract |
--| GET | /api/restream/oauth/:platform/start | server/streaming/restream-routes.js:609 | OpenRe.Stream | extract |
--| GET | /api/restream/oauth/status | server/streaming/restream-routes.js:587 | OpenRe.Stream | extract |
--| GET | /api/restream/presets | server/streaming/restream-routes.js:164 | OpenRe.Stream | extract |
--| GET | /api/restream/status | server/streaming/restream-routes.js:464 | OpenRe.Stream | extract |
--| GET | /api/restream/viewer-config | server/streaming/restream-routes.js:513 | OpenRe.Stream | extract |
--| GET | /api/restream/viewer-counts | server/streaming/restream-routes.js:503 | OpenRe.Stream | extract |
--| POST | /api/restream/viewer-counts | server/streaming/restream-routes.js:485 | OpenRe.Stream | extract |
--| DELETE | /api/robotstreamer/integration | server/integrations/routes.js:226 | OpenRe.Stream | extract |
--| GET | /api/robotstreamer/integration | server/integrations/routes.js:41 | OpenRe.Stream | extract |
--| PUT | /api/robotstreamer/integration | server/integrations/routes.js:152 | OpenRe.Stream | extract |
--| POST | /api/robotstreamer/integration/login | server/integrations/routes.js:107 | OpenRe.Stream | extract |
--| POST | /api/robotstreamer/integration/validate | server/integrations/routes.js:70 | OpenRe.Stream | extract |
--| POST | /api/robotstreamer/restream/start | server/integrations/routes.js:194 | OpenRe.Stream | extract |
--| POST | /api/robotstreamer/restream/stop | server/integrations/routes.js:214 | OpenRe.Stream | extract |
++| GET | /api/restream/destinations | server/streaming/restream-routes.js:177 | OpenRe.Stream | extract |
++| POST | /api/restream/destinations | server/streaming/restream-routes.js:201 | OpenRe.Stream | extract |
++| DELETE | /api/restream/destinations/:id | server/streaming/restream-routes.js:367 | OpenRe.Stream | extract |
++| PUT | /api/restream/destinations/:id | server/streaming/restream-routes.js:277 | OpenRe.Stream | extract |
++| POST | /api/restream/destinations/:id/start | server/streaming/restream-routes.js:391 | OpenRe.Stream | extract |
++| POST | /api/restream/destinations/:id/stop | server/streaming/restream-routes.js:448 | OpenRe.Stream | extract |
++| GET | /api/restream/oauth/:platform/callback | server/streaming/restream-routes.js:645 | OpenRe.Stream | extract |
++| DELETE | /api/restream/oauth/:platform/connection | server/streaming/restream-routes.js:739 | OpenRe.Stream | extract |
++| GET | /api/restream/oauth/:platform/start | server/streaming/restream-routes.js:631 | OpenRe.Stream | extract |
++| GET | /api/restream/oauth/status | server/streaming/restream-routes.js:609 | OpenRe.Stream | extract |
++| GET | /api/restream/presets | server/streaming/restream-routes.js:165 | OpenRe.Stream | extract |
++| GET | /api/restream/status | server/streaming/restream-routes.js:469 | OpenRe.Stream | extract |
++| GET | /api/restream/viewer-config | server/streaming/restream-routes.js:535 | OpenRe.Stream | extract |
++| GET | /api/restream/viewer-counts | server/streaming/restream-routes.js:511 | OpenRe.Stream | extract |
++| POST | /api/restream/viewer-counts | server/streaming/restream-routes.js:490 | OpenRe.Stream | extract |
++| DELETE | /api/robotstreamer/integration | server/integrations/routes.js:232 | OpenRe.Stream | extract |
++| GET | /api/robotstreamer/integration | server/integrations/routes.js:52 | OpenRe.Stream | extract |
++| PUT | /api/robotstreamer/integration | server/integrations/routes.js:158 | OpenRe.Stream | extract |
++| POST | /api/robotstreamer/integration/login | server/integrations/routes.js:115 | OpenRe.Stream | extract |
++| POST | /api/robotstreamer/integration/validate | server/integrations/routes.js:79 | OpenRe.Stream | extract |
++| POST | /api/robotstreamer/restream/start | server/integrations/routes.js:200 | OpenRe.Stream | extract |
++| POST | /api/robotstreamer/restream/stop | server/integrations/routes.js:220 | OpenRe.Stream | extract |
| POST | /api/sounds | server/chat/sounds-routes.js:147 | OpenVibe.Chat | shadowed |
| DELETE | /api/sounds/:id | server/chat/sounds-routes.js:287 | OpenVibe.Chat | shadowed |
| DELETE | /api/sounds/alert/:kind | server/chat/sounds-routes.js:440 | OpenVibe.Chat | shadowed |
@@@ -481,53 +483,53 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/sounds/channel/:userId | server/chat/sounds-routes.js:125 | OpenVibe.Chat | shadowed |
| PATCH | /api/sounds/command | server/chat/sounds-routes.js:313 | OpenVibe.Chat | shadowed |
| GET | /api/sounds/file/:filename | server/chat/sounds-routes.js:371 | OpenVibe.Chat | shadowed |
--| GET | /api/streams | server/streaming/routes.js:1093 | | keep |
--| POST | /api/streams | server/streaming/routes.js:1924 | | keep |
--| DELETE | /api/streams/:id | server/streaming/routes.js:2119 | | keep |
--| GET | /api/streams/:id | server/streaming/routes.js:1876 | | keep |
--| PUT | /api/streams/:id | server/streaming/routes.js:2068 | | keep |
--| GET | /api/streams/:id/call | server/streaming/routes.js:2438 | | keep |
--| PUT | /api/streams/:id/call | server/streaming/routes.js:2399 | | keep |
--| GET | /api/streams/:id/endpoint | server/streaming/routes.js:2166 | | keep |
--| POST | /api/streams/:id/follow | server/streaming/routes.js:2307 | | keep |
--| POST | /api/streams/:id/heartbeat | server/streaming/routes.js:2264 | | keep |
--| GET | /api/streams/:id/rtmp-status | server/streaming/routes.js:2282 | | keep |
--| GET | /api/streams/broadcast-settings | server/streaming/routes.js:1393 | | keep |
--| PUT | /api/streams/broadcast-settings | server/streaming/routes.js:1410 | | keep |
--| GET | /api/streams/channel | server/streaming/routes.js:645 | | keep |
--| PUT | /api/streams/channel | server/streaming/routes.js:657 | | keep |
--| GET | /api/streams/channel/:username | server/streaming/routes.js:207 | | keep |
--| PUT | /api/streams/channel/:username/about | server/streaming/routes.js:772 | | keep |
--| GET | /api/streams/channel/:username/bio-en | server/streaming/routes.js:753 | | keep |
--| GET | /api/streams/channel/:username/clips-taken | server/streaming/routes.js:564 | | keep |
--| POST | /api/streams/channel/:username/follow | server/streaming/routes.js:2352 | | keep |
--| GET | /api/streams/channel/:username/live | server/streaming/routes.js:607 | | keep |
--| GET | /api/streams/channel/:username/popular | server/streaming/routes.js:538 | | keep |
--| GET | /api/streams/channel/:username/resolve/:ref | server/streaming/routes.js:1432 | | keep |
--| GET | /api/streams/channel/:username/weather | server/streaming/routes.js:982 | | keep |
--| POST | /api/streams/channel/offline-screen | server/streaming/routes.js:878 | | keep |
--| POST | /api/streams/diag-log | server/streaming/routes.js:2257 | | keep |
--| POST | /api/streams/goal-media | server/streaming/routes.js:843 | | keep |
--| GET | /api/streams/managed | server/streaming/routes.js:1594 | | keep |
--| POST | /api/streams/managed | server/streaming/routes.js:1606 | | keep |
--| DELETE | /api/streams/managed/:id | server/streaming/routes.js:1820 | | keep |
--| PUT | /api/streams/managed/:id | server/streaming/routes.js:1660 | | keep |
--| POST | /api/streams/managed/:id/regenerate-key | server/streaming/routes.js:1845 | | keep |
--| GET | /api/streams/managed/:managedStreamId/history | server/streaming/routes.js:1466 | | keep |
--| GET | /api/streams/managed/:managedStreamId/profile | server/streaming/routes.js:1487 | | keep |
--| GET | /api/streams/mine | server/streaming/routes.js:1129 | | keep |
--| POST | /api/streams/panel-image | server/streaming/routes.js:821 | | keep |
--| GET | /api/streams/recent | server/streaming/routes.js:1141 | | keep |
--| GET | /api/streams/recent-vods | server/streaming/routes.js:1212 | | keep |
--| GET | /api/streams/recently-online | server/streaming/routes.js:1158 | | keep |
--| GET | /api/streams/rtmp-proxy/:streamId.flv | server/streaming/routes.js:2459 | | keep |
--| GET | /api/streams/setup-progress | server/streaming/routes.js:1539 | | keep |
--| GET | /api/streams/voice-channels | server/streaming/routes.js:1242 | | keep |
--| POST | /api/streams/voice-channels | server/streaming/routes.js:1263 | | keep |
--| DELETE | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1275 | | keep |
--| GET | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1252 | | keep |
--| POST | /api/streams/voice-channels/call-user | server/streaming/routes.js:1287 | | keep |
--| POST | /api/streams/voice-channels/call-user/respond | server/streaming/routes.js:1356 | | keep |
++| GET | /api/streams | server/streaming/routes.js:1126 | | keep |
++| POST | /api/streams | server/streaming/routes.js:1957 | | keep |
++| DELETE | /api/streams/:id | server/streaming/routes.js:2152 | | keep |
++| GET | /api/streams/:id | server/streaming/routes.js:1909 | | keep |
++| PUT | /api/streams/:id | server/streaming/routes.js:2101 | | keep |
++| GET | /api/streams/:id/call | server/streaming/routes.js:2471 | | keep |
++| PUT | /api/streams/:id/call | server/streaming/routes.js:2432 | | keep |
++| GET | /api/streams/:id/endpoint | server/streaming/routes.js:2199 | | keep |
++| POST | /api/streams/:id/follow | server/streaming/routes.js:2340 | | keep |
++| POST | /api/streams/:id/heartbeat | server/streaming/routes.js:2297 | | keep |
++| GET | /api/streams/:id/rtmp-status | server/streaming/routes.js:2315 | | keep |
++| GET | /api/streams/broadcast-settings | server/streaming/routes.js:1426 | | keep |
++| PUT | /api/streams/broadcast-settings | server/streaming/routes.js:1443 | | keep |
++| GET | /api/streams/channel | server/streaming/routes.js:674 | | keep |
++| PUT | /api/streams/channel | server/streaming/routes.js:686 | | keep |
++| GET | /api/streams/channel/:username | server/streaming/routes.js:218 | | keep |
++| PUT | /api/streams/channel/:username/about | server/streaming/routes.js:805 | | keep |
++| GET | /api/streams/channel/:username/bio-en | server/streaming/routes.js:786 | | keep |
++| GET | /api/streams/channel/:username/clips-taken | server/streaming/routes.js:592 | | keep |
++| POST | /api/streams/channel/:username/follow | server/streaming/routes.js:2385 | | keep |
++| GET | /api/streams/channel/:username/live | server/streaming/routes.js:636 | | keep |
++| GET | /api/streams/channel/:username/popular | server/streaming/routes.js:566 | | keep |
++| GET | /api/streams/channel/:username/resolve/:ref | server/streaming/routes.js:1465 | | keep |
++| GET | /api/streams/channel/:username/weather | server/streaming/routes.js:1015 | | keep |
++| POST | /api/streams/channel/offline-screen | server/streaming/routes.js:911 | | keep |
++| POST | /api/streams/diag-log | server/streaming/routes.js:2290 | | keep |
++| POST | /api/streams/goal-media | server/streaming/routes.js:876 | | keep |
++| GET | /api/streams/managed | server/streaming/routes.js:1627 | | keep |
++| POST | /api/streams/managed | server/streaming/routes.js:1639 | | keep |
++| DELETE | /api/streams/managed/:id | server/streaming/routes.js:1853 | | keep |
++| PUT | /api/streams/managed/:id | server/streaming/routes.js:1693 | | keep |
++| POST | /api/streams/managed/:id/regenerate-key | server/streaming/routes.js:1878 | | keep |
++| GET | /api/streams/managed/:managedStreamId/history | server/streaming/routes.js:1499 | | keep |
++| GET | /api/streams/managed/:managedStreamId/profile | server/streaming/routes.js:1520 | | keep |
++| GET | /api/streams/mine | server/streaming/routes.js:1162 | | keep |
++| POST | /api/streams/panel-image | server/streaming/routes.js:854 | | keep |
++| GET | /api/streams/recent | server/streaming/routes.js:1174 | | keep |
++| GET | /api/streams/recent-vods | server/streaming/routes.js:1245 | | keep |
++| GET | /api/streams/recently-online | server/streaming/routes.js:1191 | | keep |
++| GET | /api/streams/rtmp-proxy/:streamId.flv | server/streaming/routes.js:2492 | | keep |
++| GET | /api/streams/setup-progress | server/streaming/routes.js:1572 | | keep |
++| GET | /api/streams/voice-channels | server/streaming/routes.js:1275 | | keep |
++| POST | /api/streams/voice-channels | server/streaming/routes.js:1296 | | keep |
++| DELETE | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1308 | | keep |
++| GET | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1285 | | keep |
++| POST | /api/streams/voice-channels/call-user | server/streaming/routes.js:1320 | | keep |
++| POST | /api/streams/voice-channels/call-user/respond | server/streaming/routes.js:1389 | | keep |
| GET | /api/themes | server/themes/routes.js:20 | OpenVibe.Network | extract |
| POST | /api/themes | server/themes/routes.js:108 | OpenVibe.Network | extract |
| DELETE | /api/themes/:id | server/themes/routes.js:147 | OpenVibe.Network | extract |
@@@ -548,165 +550,164 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/tts/audio/:file | server/chat/tts-routes.js:125 | OpenVibe.Chat | shadowed |
| GET | /api/tts/settings | server/chat/tts-routes.js:43 | OpenVibe.Chat | shadowed |
| GET | /api/tts/voices | server/chat/tts-routes.js:33 | OpenVibe.Chat | shadowed |
--| GET | /api/updates | server/index.js:813 | | keep |
++| GET | /api/updates | server/index.js:824 | | keep |
| GET | /api/vibe-coding/channel/:username/:slotIdOrSlug/events | server/vibe-coding/routes.js:17 | OpenVibe.Codes | extract |
| GET | /api/vibe-coding/managed/:managedStreamId/events | server/vibe-coding/routes.js:47 | OpenVibe.Codes | extract |
| GET | /api/vibe-coding/managed/:managedStreamId/settings | server/vibe-coding/routes.js:74 | OpenVibe.Codes | extract |
| PUT | /api/vibe-coding/managed/:managedStreamId/settings | server/vibe-coding/routes.js:91 | OpenVibe.Codes | extract |
| GET | /api/vods | server/media-proxy/vods.js:303 | OpenVibe.Media | adapter |
--| DELETE | /api/vods/:id | server/media-proxy/vods.js:565 | OpenVibe.Media | adapter |
++| DELETE | /api/vods/:id | server/media-proxy/vods.js:566 | OpenVibe.Media | adapter |
| GET | /api/vods/:id | server/media-proxy/vods.js:460 | OpenVibe.Media | adapter |
--| PUT | /api/vods/:id | server/media-proxy/vods.js:520 | OpenVibe.Media | adapter |
++| PUT | /api/vods/:id | server/media-proxy/vods.js:521 | OpenVibe.Media | adapter |
| GET | /api/vods/:id/context | server/media-proxy/vods.js:401 | OpenVibe.Media | adapter |
| GET | /api/vods/:id/live-info | server/media-proxy/vods.js:282 | OpenVibe.Media | adapter |
| GET | /api/vods/:id/memories | server/media-proxy/vods.js:377 | OpenVibe.Media | adapter |
--| POST | /api/vods/:id/publish | server/media-proxy/vods.js:577 | OpenVibe.Media | adapter |
--| POST | /api/vods/bulk | server/media-proxy/vods.js:537 | OpenVibe.Media | adapter |
++| POST | /api/vods/:id/publish | server/media-proxy/vods.js:578 | OpenVibe.Media | adapter |
++| POST | /api/vods/bulk | server/media-proxy/vods.js:538 | OpenVibe.Media | adapter |
| POST | /api/vods/bulk-delete-old | server/media-proxy/vods.js:333 | OpenVibe.Media | adapter |
--| POST | /api/vods/clips | server/media-proxy/vods.js:637 | OpenVibe.Media | adapter |
--| POST | /api/vods/clips/:id/trim | server/media-proxy/vods.js:791 | OpenVibe.Media | adapter |
--| GET | /api/vods/clips/stream/:streamId | server/media-proxy/vods.js:780 | OpenVibe.Media | adapter |
--| GET | /api/vods/file/:filename | server/media-proxy/vods.js:593 | OpenVibe.Media | adapter |
++| POST | /api/vods/clips | server/media-proxy/vods.js:638 | OpenVibe.Media | adapter |
++| POST | /api/vods/clips/:id/trim | server/media-proxy/vods.js:792 | OpenVibe.Media | adapter |
++| GET | /api/vods/clips/stream/:streamId | server/media-proxy/vods.js:781 | OpenVibe.Media | adapter |
++| GET | /api/vods/file/:filename | server/media-proxy/vods.js:594 | OpenVibe.Media | adapter |
| GET | /api/vods/mine | server/media-proxy/vods.js:321 | OpenVibe.Media | adapter |
| POST | /api/vods/stream/:streamId/chunk | server/media-proxy/vods.js:183 | OpenVibe.Media | adapter |
| POST | /api/vods/stream/:streamId/finalize | server/media-proxy/vods.js:237 | OpenVibe.Media | adapter |
| GET | /api/vods/stream/:streamId/live | server/media-proxy/vods.js:257 | OpenVibe.Media | adapter |
--| POST | /api/vods/upload | server/media-proxy/vods.js:599 | OpenVibe.Media | adapter |
--| GET | /banned | server/index.js:985 | | keep |
--| POST | /banned/continue | server/index.js:955 | | keep |
--| GET | /canvas | server/index.js:684 | OpenVibe.Games | compat |
--| GET | /data/pastes/screenshots/:filename | server/index.js:602 | | keep |
--| GET | /dmca | server/index.js:894 | | keep |
++| POST | /api/vods/upload | server/media-proxy/vods.js:600 | OpenVibe.Media | adapter |
++| GET | /banned | server/index.js:996 | | keep |
++| POST | /banned/continue | server/index.js:966 | | keep |
++| GET | /canvas | server/index.js:691 | OpenVibe.Games | compat |
++| GET | /data/pastes/screenshots/:filename | server/index.js:626 | | keep |
++| GET | /dmca | server/index.js:905 | | keep |
| GET | /docs | server/docs/routes.js:304 | | keep |
| GET | /docs/:name | server/docs/routes.js:306 | | keep |
| GET | /docs/:name.md | server/docs/routes.js:305 | | keep |
--| GET | /game | server/index.js:683 | OpenVibe.Games | compat |
--| GET | /internal/analytics-summary | server/index.js:562 | | keep |
--| POST | /internal/chat-context/ai/mod-command | server/chat/live-context-routes.js:459 | | keep |
--| POST | /internal/chat-context/alert-sound | server/chat/live-context-routes.js:375 | | keep |
--| POST | /internal/chat-context/anon | server/chat/live-context-routes.js:274 | | keep |
--| GET | /internal/chat-context/anon-first-seen | server/chat/live-context-routes.js:244 | | keep |
--| GET | /internal/chat-context/anon/:num | server/chat/live-context-routes.js:241 | | keep |
--| POST | /internal/chat-context/approve-ip | server/chat/live-context-routes.js:354 | | keep |
--| POST | /internal/chat-context/arena-command | server/chat/live-context-routes.js:470 | | keep |
--| POST | /internal/chat-context/asset-sync | server/chat/live-context-routes.js:584 | | keep |
++| GET | /game | server/index.js:690 | OpenVibe.Games | compat |
++| GET | /internal/analytics-summary | server/index.js:587 | | keep |
++| POST | /internal/chat-context/ai/mod-command | server/chat/live-context-routes.js:440 | | keep |
++| POST | /internal/chat-context/alert-sound | server/chat/live-context-routes.js:356 | | keep |
++| POST | /internal/chat-context/anon | server/chat/live-context-routes.js:255 | | keep |
++| GET | /internal/chat-context/anon-first-seen | server/chat/live-context-routes.js:225 | | keep |
++| GET | /internal/chat-context/anon/:num | server/chat/live-context-routes.js:222 | | keep |
++| POST | /internal/chat-context/approve-ip | server/chat/live-context-routes.js:335 | | keep |
++| POST | /internal/chat-context/arena-command | server/chat/live-context-routes.js:451 | | keep |
++| POST | /internal/chat-context/asset-sync | server/chat/live-context-routes.js:565 | | keep |
| POST | /internal/chat-context/auth | server/chat/live-context-routes.js:75 | | keep |
--| POST | /internal/chat-context/ban | server/chat/live-context-routes.js:318 | | keep |
--| GET | /internal/chat-context/bans | server/chat/live-context-routes.js:205 | | keep |
--| POST | /internal/chat-context/channel-settings | server/chat/live-context-routes.js:363 | | keep |
--| GET | /internal/chat-context/channels | server/chat/live-context-routes.js:180 | | keep |
--| GET | /internal/chat-context/channels/:id/approved-ip | server/chat/live-context-routes.js:199 | | keep |
--| GET | /internal/chat-context/channels/:id/policy | server/chat/live-context-routes.js:187 | | keep |
--| GET | /internal/chat-context/channels/by-user/:userId | server/chat/live-context-routes.js:184 | | keep |
--| POST | /internal/chat-context/chat-message | server/chat/live-context-routes.js:417 | | keep |
--| POST | /internal/chat-context/decor | server/chat/live-context-routes.js:215 | | keep |
--| POST | /internal/chat-context/ensure-channel | server/chat/live-context-routes.js:390 | | keep |
--| POST | /internal/chat-context/hardware | server/chat/live-context-routes.js:511 | | keep |
--| POST | /internal/chat-context/ip-log | server/chat/live-context-routes.js:280 | | keep |
--| GET | /internal/chat-context/managed-streams | server/chat/live-context-routes.js:175 | | keep |
--| POST | /internal/chat-context/media-queue | server/chat/live-context-routes.js:483 | | keep |
--| POST | /internal/chat-context/mirror | server/chat/live-context-routes.js:259 | | keep |
--| POST | /internal/chat-context/mirror | server/chat/live-context-routes.js:654 | | keep |
--| POST | /internal/chat-context/notify/dm | server/chat/live-context-routes.js:554 | | keep |
--| POST | /internal/chat-context/notify/dm-read | server/chat/live-context-routes.js:575 | | keep |
--| POST | /internal/chat-context/paste | server/chat/live-context-routes.js:529 | | keep |
--| GET | /internal/chat-context/settings | server/chat/live-context-routes.js:233 | | keep |
--| POST | /internal/chat-context/site-settings | server/chat/live-context-routes.js:398 | | keep |
--| GET | /internal/chat-context/streams | server/chat/live-context-routes.js:156 | | keep |
--| GET | /internal/chat-context/streams/:id | server/chat/live-context-routes.js:164 | | keep |
--| GET | /internal/chat-context/streams/active | server/chat/live-context-routes.js:161 | | keep |
--| POST | /internal/chat-context/translate | server/chat/live-context-routes.js:544 | | keep |
--| GET | /internal/chat-context/tts-audio/:file | server/chat/live-context-routes.js:248 | | keep |
--| POST | /internal/chat-context/user-color | server/chat/live-context-routes.js:308 | | keep |
++| POST | /internal/chat-context/ban | server/chat/live-context-routes.js:299 | | keep |
++| GET | /internal/chat-context/bans | server/chat/live-context-routes.js:186 | | keep |
++| POST | /internal/chat-context/channel-settings | server/chat/live-context-routes.js:344 | | keep |
++| GET | /internal/chat-context/channels | server/chat/live-context-routes.js:161 | | keep |
++| GET | /internal/chat-context/channels/:id/approved-ip | server/chat/live-context-routes.js:180 | | keep |
++| GET | /internal/chat-context/channels/:id/policy | server/chat/live-context-routes.js:168 | | keep |
++| GET | /internal/chat-context/channels/by-user/:userId | server/chat/live-context-routes.js:165 | | keep |
++| POST | /internal/chat-context/chat-message | server/chat/live-context-routes.js:398 | | keep |
++| POST | /internal/chat-context/decor | server/chat/live-context-routes.js:196 | | keep |
++| POST | /internal/chat-context/ensure-channel | server/chat/live-context-routes.js:371 | | keep |
++| POST | /internal/chat-context/hardware | server/chat/live-context-routes.js:492 | | keep |
++| POST | /internal/chat-context/ip-log | server/chat/live-context-routes.js:261 | | keep |
++| GET | /internal/chat-context/managed-streams | server/chat/live-context-routes.js:156 | | keep |
++| POST | /internal/chat-context/media-queue | server/chat/live-context-routes.js:464 | | keep |
++| POST | /internal/chat-context/mirror | server/chat/live-context-routes.js:240 | | keep |
++| POST | /internal/chat-context/mirror | server/chat/live-context-routes.js:635 | | keep |
++| POST | /internal/chat-context/notify/dm | server/chat/live-context-routes.js:535 | | keep |
++| POST | /internal/chat-context/notify/dm-read | server/chat/live-context-routes.js:556 | | keep |
++| POST | /internal/chat-context/paste | server/chat/live-context-routes.js:510 | | keep |
++| GET | /internal/chat-context/settings | server/chat/live-context-routes.js:214 | | keep |
++| POST | /internal/chat-context/site-settings | server/chat/live-context-routes.js:379 | | keep |
++| GET | /internal/chat-context/streams | server/chat/live-context-routes.js:137 | | keep |
++| GET | /internal/chat-context/streams/:id | server/chat/live-context-routes.js:145 | | keep |
++| GET | /internal/chat-context/streams/active | server/chat/live-context-routes.js:142 | | keep |
++| POST | /internal/chat-context/translate | server/chat/live-context-routes.js:525 | | keep |
++| GET | /internal/chat-context/tts-audio/:file | server/chat/live-context-routes.js:229 | | keep |
++| POST | /internal/chat-context/user-color | server/chat/live-context-routes.js:289 | | keep |
| GET | /internal/chat-context/users | server/chat/live-context-routes.js:95 | | keep |
--| GET | /internal/chat-context/users/:id/follows | server/chat/live-context-routes.js:152 | | keep |
++| GET | /internal/chat-context/users/:id/follows | server/chat/live-context-routes.js:133 | | keep |
| POST | /internal/chat-context/users/lookup | server/chat/live-context-routes.js:100 | | keep |
| GET | /internal/chat-context/users/profile | server/chat/live-context-routes.js:109 | | keep |
--| POST | /internal/chat-context/viewer-counts | server/chat/live-context-routes.js:293 | | keep |
--| POST | /internal/chat-context/viewer-snapshots | server/chat/live-context-routes.js:300 | | keep |
--| POST | /internal/chat-effects/ai/mod-command | server/chat/live-context-routes.js:459 | | keep |
--| POST | /internal/chat-effects/alert-sound | server/chat/live-context-routes.js:375 | | keep |
--| POST | /internal/chat-effects/anon | server/chat/live-context-routes.js:274 | | keep |
--| GET | /internal/chat-effects/anon-first-seen | server/chat/live-context-routes.js:244 | | keep |
--| GET | /internal/chat-effects/anon/:num | server/chat/live-context-routes.js:241 | | keep |
--| POST | /internal/chat-effects/approve-ip | server/chat/live-context-routes.js:354 | | keep |
--| POST | /internal/chat-effects/arena-command | server/chat/live-context-routes.js:470 | | keep |
--| POST | /internal/chat-effects/asset-sync | server/chat/live-context-routes.js:584 | | keep |
++| POST | /internal/chat-context/viewer-counts | server/chat/live-context-routes.js:274 | | keep |
++| POST | /internal/chat-context/viewer-snapshots | server/chat/live-context-routes.js:281 | | keep |
++| POST | /internal/chat-effects/ai/mod-command | server/chat/live-context-routes.js:440 | | keep |
++| POST | /internal/chat-effects/alert-sound | server/chat/live-context-routes.js:356 | | keep |
++| POST | /internal/chat-effects/anon | server/chat/live-context-routes.js:255 | | keep |
++| GET | /internal/chat-effects/anon-first-seen | server/chat/live-context-routes.js:225 | | keep |
++| GET | /internal/chat-effects/anon/:num | server/chat/live-context-routes.js:222 | | keep |
++| POST | /internal/chat-effects/approve-ip | server/chat/live-context-routes.js:335 | | keep |
++| POST | /internal/chat-effects/arena-command | server/chat/live-context-routes.js:451 | | keep |
++| POST | /internal/chat-effects/asset-sync | server/chat/live-context-routes.js:565 | | keep |
| POST | /internal/chat-effects/auth | server/chat/live-context-routes.js:75 | | keep |
--| POST | /internal/chat-effects/ban | server/chat/live-context-routes.js:318 | | keep |
--| GET | /internal/chat-effects/bans | server/chat/live-context-routes.js:205 | | keep |
--| POST | /internal/chat-effects/channel-settings | server/chat/live-context-routes.js:363 | | keep |
--| GET | /internal/chat-effects/channels | server/chat/live-context-routes.js:180 | | keep |
--| GET | /internal/chat-effects/channels/:id/approved-ip | server/chat/live-context-routes.js:199 | | keep |
--| GET | /internal/chat-effects/channels/:id/policy | server/chat/live-context-routes.js:187 | | keep |
--| GET | /internal/chat-effects/channels/by-user/:userId | server/chat/live-context-routes.js:184 | | keep |
--| POST | /internal/chat-effects/chat-message | server/chat/live-context-routes.js:417 | | keep |
--| POST | /internal/chat-effects/decor | server/chat/live-context-routes.js:215 | | keep |
--| POST | /internal/chat-effects/ensure-channel | server/chat/live-context-routes.js:390 | | keep |
--| POST | /internal/chat-effects/hardware | server/chat/live-context-routes.js:511 | | keep |
--| POST | /internal/chat-effects/ip-log | server/chat/live-context-routes.js:280 | | keep |
--| GET | /internal/chat-effects/managed-streams | server/chat/live-context-routes.js:175 | | keep |
--| POST | /internal/chat-effects/media-queue | server/chat/live-context-routes.js:483 | | keep |
--| POST | /internal/chat-effects/mirror | server/chat/live-context-routes.js:259 | | keep |
--| POST | /internal/chat-effects/mirror | server/chat/live-context-routes.js:654 | | keep |
--| POST | /internal/chat-effects/notify/dm | server/chat/live-context-routes.js:554 | | keep |
--| POST | /internal/chat-effects/notify/dm-read | server/chat/live-context-routes.js:575 | | keep |
--| POST | /internal/chat-effects/paste | server/chat/live-context-routes.js:529 | | keep |
--| GET | /internal/chat-effects/settings | server/chat/live-context-routes.js:233 | | keep |
--| POST | /internal/chat-effects/site-settings | server/chat/live-context-routes.js:398 | | keep |
--| GET | /internal/chat-effects/streams | server/chat/live-context-routes.js:156 | | keep |
--| GET | /internal/chat-effects/streams/:id | server/chat/live-context-routes.js:164 | | keep |
--| GET | /internal/chat-effects/streams/active | server/chat/live-context-routes.js:161 | | keep |
--| POST | /internal/chat-effects/translate | server/chat/live-context-routes.js:544 | | keep |
--| GET | /internal/chat-effects/tts-audio/:file | server/chat/live-context-routes.js:248 | | keep |
--| POST | /internal/chat-effects/user-color | server/chat/live-context-routes.js:308 | | keep |
++| POST | /internal/chat-effects/ban | server/chat/live-context-routes.js:299 | | keep |
++| GET | /internal/chat-effects/bans | server/chat/live-context-routes.js:186 | | keep |
++| POST | /internal/chat-effects/channel-settings | server/chat/live-context-routes.js:344 | | keep |
++| GET | /internal/chat-effects/channels | server/chat/live-context-routes.js:161 | | keep |
++| GET | /internal/chat-effects/channels/:id/approved-ip | server/chat/live-context-routes.js:180 | | keep |
++| GET | /internal/chat-effects/channels/:id/policy | server/chat/live-context-routes.js:168 | | keep |
++| GET | /internal/chat-effects/channels/by-user/:userId | server/chat/live-context-routes.js:165 | | keep |
++| POST | /internal/chat-effects/chat-message | server/chat/live-context-routes.js:398 | | keep |
++| POST | /internal/chat-effects/decor | server/chat/live-context-routes.js:196 | | keep |
++| POST | /internal/chat-effects/ensure-channel | server/chat/live-context-routes.js:371 | | keep |
++| POST | /internal/chat-effects/hardware | server/chat/live-context-routes.js:492 | | keep |
++| POST | /internal/chat-effects/ip-log | server/chat/live-context-routes.js:261 | | keep |
++| GET | /internal/chat-effects/managed-streams | server/chat/live-context-routes.js:156 | | keep |
++| POST | /internal/chat-effects/media-queue | server/chat/live-context-routes.js:464 | | keep |
++| POST | /internal/chat-effects/mirror | server/chat/live-context-routes.js:240 | | keep |
++| POST | /internal/chat-effects/mirror | server/chat/live-context-routes.js:635 | | keep |
++| POST | /internal/chat-effects/notify/dm | server/chat/live-context-routes.js:535 | | keep |
++| POST | /internal/chat-effects/notify/dm-read | server/chat/live-context-routes.js:556 | | keep |
++| POST | /internal/chat-effects/paste | server/chat/live-context-routes.js:510 | | keep |
++| GET | /internal/chat-effects/settings | server/chat/live-context-routes.js:214 | | keep |
++| POST | /internal/chat-effects/site-settings | server/chat/live-context-routes.js:379 | | keep |
++| GET | /internal/chat-effects/streams | server/chat/live-context-routes.js:137 | | keep |
++| GET | /internal/chat-effects/streams/:id | server/chat/live-context-routes.js:145 | | keep |
++| GET | /internal/chat-effects/streams/active | server/chat/live-context-routes.js:142 | | keep |
++| POST | /internal/chat-effects/translate | server/chat/live-context-routes.js:525 | | keep |
++| GET | /internal/chat-effects/tts-audio/:file | server/chat/live-context-routes.js:229 | | keep |
++| POST | /internal/chat-effects/user-color | server/chat/live-context-routes.js:289 | | keep |
| GET | /internal/chat-effects/users | server/chat/live-context-routes.js:95 | | keep |
--| GET | /internal/chat-effects/users/:id/follows | server/chat/live-context-routes.js:152 | | keep |
++| GET | /internal/chat-effects/users/:id/follows | server/chat/live-context-routes.js:133 | | keep |
| POST | /internal/chat-effects/users/lookup | server/chat/live-context-routes.js:100 | | keep |
| GET | /internal/chat-effects/users/profile | server/chat/live-context-routes.js:109 | | keep |
--| POST | /internal/chat-effects/viewer-counts | server/chat/live-context-routes.js:293 | | keep |
--| POST | /internal/chat-effects/viewer-snapshots | server/chat/live-context-routes.js:300 | | keep |
++| POST | /internal/chat-effects/viewer-counts | server/chat/live-context-routes.js:274 | | keep |
++| POST | /internal/chat-effects/viewer-snapshots | server/chat/live-context-routes.js:281 | | keep |
| GET | /internal/followers | server/streaming/followers-internal.js:12 | | keep |
| GET | /internal/lineage/resolve | server/lineage/routes.js:33 | | keep |
| POST | /internal/lineage/resolve | server/lineage/routes.js:34 | | keep |
--| POST | /internal/media-events | server/index.js:554 | | keep |
--| POST | /internal/media-webhook | server/index.js:552 | OpenVibe.Events | compat |
--| POST | /internal/openre-events | server/index.js:557 | | keep |
--| POST | /internal/tips/deliveries | server/tips/delivery-routes.js:49 | | keep |
--| POST | /internal/url-registry/refresh | server/internal/routes.js:28 | OpenVibe.Network | compat |
--| POST | /internal/user-avatar | server/internal/routes.js:46 | OpenVibe.Network | compat |
--| POST | /internal/user-role | server/internal/routes.js:71 | OpenVibe.Network | compat |
--| GET | /media/:username | server/index.js:885 | | keep |
--| GET | /obs/chat/:username | server/index.js:873 | | keep |
--| GET | /openvibe-sw.js | server/index.js:455 | | keep |
--| GET | /overlay/chat/:username | server/index.js:881 | | keep |
--| GET | /overlay/chat/:username/:slotIdOrSlug | server/index.js:878 | | keep |
--| GET | /p/:slug | server/index.js:620 | OpenVibe.Community | adapter |
--| GET | /p/:slug/raw | server/index.js:631 | OpenVibe.Community | adapter |
--| GET | /p/:slug/screenshot | server/index.js:627 | OpenVibe.Community | adapter |
--| GET | /pastes | server/index.js:621 | OpenVibe.Community | adapter |
--| GET | /privacy | server/index.js:903 | | keep |
--| GET | /release.json | server/index.js:753 | | keep |
--| GET | /sitemap.xml | server/seo/seo.js:602 | | keep |
--| GET | /terms | server/index.js:900 | | keep |
--| GET | /tos | server/index.js:897 | | keep |
--| POST | /whip/:streamId | server/index.js:912 | OpenRe.Stream | extract |
--| DELETE | /whip/:streamId/:resourceId | server/index.js:914 | OpenRe.Stream | extract |
--| PATCH | /whip/:streamId/:resourceId | server/index.js:913 | OpenRe.Stream | extract |
++| POST | /internal/media-events | server/index.js:579 | | keep |
++| POST | /internal/media-webhook | server/index.js:577 | OpenVibe.Events | compat |
++| POST | /internal/openre-events | server/index.js:582 | | keep |
++| POST | /internal/tips/deliveries | server/tips/delivery-routes.js:104 | | keep |
++| POST | /internal/url-registry/refresh | server/internal/routes.js:29 | OpenVibe.Network | compat |
++| POST | /internal/user-avatar | server/internal/routes.js:47 | OpenVibe.Network | compat |
++| POST | /internal/user-role | server/internal/routes.js:72 | OpenVibe.Network | compat |
++| GET | /llms.txt | server/seo/seo.js:1141 | | keep |
++| GET | /media/:username | server/index.js:896 | | keep |
++| GET | /obs/chat/:username | server/index.js:884 | | keep |
++| GET | /openvibe-sw.js | server/index.js:478 | | keep |
++| GET | /overlay/chat/:username | server/index.js:892 | | keep |
++| GET | /overlay/chat/:username/:slotIdOrSlug | server/index.js:889 | | keep |
++| GET | /p/:slug | server/web/paste-handover.js:32 | OpenVibe.Community | adapter |
++| GET | /p/:slug/raw | server/index.js:638 | OpenVibe.Community | adapter |
++| GET | /p/:slug/screenshot | server/index.js:634 | OpenVibe.Community | adapter |
++| GET | /privacy | server/index.js:914 | | keep |
++| GET | /sitemap.xml | server/seo/seo.js:1140 | | keep |
++| GET | /terms | server/index.js:911 | | keep |
++| GET | /tos | server/index.js:908 | | keep |
++| POST | /whip/:streamId | server/index.js:923 | OpenRe.Stream | extract |
++| DELETE | /whip/:streamId/:resourceId | server/index.js:925 | OpenRe.Stream | extract |
++| PATCH | /whip/:streamId/:resourceId | server/index.js:924 | OpenRe.Stream | extract |
## OpenVibe.Network
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
| DELETE | / | server/notifications/routes.js:111 | | keep |
--| GET | / | server/discord/routes.js:17 | | keep |
++| GET | / | server/discord/routes.js:18 | | keep |
| GET | / | server/notifications/routes.js:16 | | keep |
| POST | / | server/notifications/events-consumer.js:245 | | keep |
--| PUT | / | server/discord/routes.js:33 | | keep |
++| PUT | / | server/discord/routes.js:37 | | keep |
| POST | /:id/dismiss | server/notifications/routes.js:100 | | keep |
| POST | /:id/read | server/notifications/routes.js:67 | | keep |
--| GET | /.well-known/openvibe | server/registry/ecosystem.js:223 | | keep |
--| GET | /.well-known/web-identity | server/index.js:630 | | keep |
++| GET | /.well-known/openvibe | server/registry/ecosystem.js:312 | | keep |
++| GET | /.well-known/web-identity | server/index.js:632 | | keep |
| POST | /admin | server/setup/routes.js:114 | | keep |
| GET | /api/.well-known/jwks | server/index.js:395 | | keep |
| GET | /api/admin/domains | server/domains/routes.js:176 | | keep |
@@@ -716,7 +717,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| PUT | /api/admin/domains/:id | server/domains/routes.js:238 | | keep |
| GET | /api/admin/domains/catalog | server/domains/routes.js:206 | | keep |
| POST | /api/admin/domains/check | server/domains/routes.js:217 | | keep |
--| GET | /api/admin/ssh-info | server/index.js:510 | | keep |
++| GET | /api/admin/ssh-info | server/index.js:512 | | keep |
| GET | /api/auth/anon-identities | server/auth/routes.js:647 | | keep |
| POST | /api/auth/anon-session | server/auth/routes.js:518 | | keep |
| GET | /api/auth/anon/:token | server/auth/routes.js:588 | | keep |
@@@ -748,8 +749,8 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/auth/users/:id/follow | server/auth/routes.js:792 | | keep |
| GET | /api/brand | server/index.js:421 | | keep |
| GET | /api/catalog.json | server/index.js:481 | | keep |
--| GET | /api/chrome | server/chrome/service.js:171 | | keep |
--| POST | /api/chrome/hit | server/chrome/service.js:184 | | keep |
++| GET | /api/chrome | server/chrome/service.js:173 | | keep |
++| POST | /api/chrome/hit | server/chrome/service.js:186 | | keep |
| GET | /api/domains | server/domains/routes.js:176 | | keep |
| GET | /api/domains | server/domains/routes.js:197 | | keep |
| POST | /api/domains | server/domains/routes.js:224 | | keep |
@@@ -763,14 +764,14 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/history | server/history/routes.js:108 | | keep |
| DELETE | /api/history/:id | server/history/routes.js:148 | | keep |
| PUT | /api/history/settings | server/history/routes.js:137 | | keep |
--| GET | /api/modules | server/identity/modules.js:322 | | keep |
--| DELETE | /api/modules/:ns | server/identity/modules.js:347 | | keep |
--| GET | /api/modules/:ns | server/identity/modules.js:330 | | keep |
--| PUT | /api/modules/:ns | server/identity/modules.js:338 | | keep |
--| GET | /api/modules/:ns/public/:subject | server/identity/modules.js:314 | | keep |
--| DELETE | /api/modules/modules/:ns/:subject | server/identity/modules.js:382 | | keep |
--| GET | /api/modules/modules/:ns/:subject | server/identity/modules.js:362 | | keep |
--| PUT | /api/modules/modules/:ns/:subject | server/identity/modules.js:371 | | keep |
++| GET | /api/modules | server/identity/modules.js:320 | | keep |
++| DELETE | /api/modules/:ns | server/identity/modules.js:345 | | keep |
++| GET | /api/modules/:ns | server/identity/modules.js:328 | | keep |
++| PUT | /api/modules/:ns | server/identity/modules.js:336 | | keep |
++| GET | /api/modules/:ns/public/:subject | server/identity/modules.js:312 | | keep |
++| DELETE | /api/modules/modules/:ns/:subject | server/identity/modules.js:380 | | keep |
++| GET | /api/modules/modules/:ns/:subject | server/identity/modules.js:360 | | keep |
++| PUT | /api/modules/modules/:ns/:subject | server/identity/modules.js:369 | | keep |
| DELETE | /api/profile/avatar | server/profile/avatar.js:107 | | keep |
| PUT | /api/profile/avatar | server/profile/avatar.js:96 | | keep |
| GET | /api/profile/avatar/:username | server/profile/avatar.js:110 | | keep |
@@@ -816,29 +817,32 @@ Owner = the repository whose code answers the route; target = the authority it b
| DELETE | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:116 | | keep |
| PUT | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:115 | | keep |
| GET | /api/v1/projects/catalog | server/developer/routes.js:76 | | keep |
--| GET | /api/v1/registry | server/registry/ecosystem.js:224 | | keep |
--| GET | /api/v1/registry/capabilities | server/registry/ecosystem.js:242 | | keep |
--| GET | /api/v1/registry/capabilities/:id | server/registry/ecosystem.js:247 | | keep |
--| GET | /api/v1/registry/contracts | server/registry/ecosystem.js:253 | | keep |
--| GET | /api/v1/registry/domains/:domain | server/registry/ecosystem.js:236 | | keep |
--| GET | /api/v1/registry/health | server/registry/ecosystem.js:271 | | keep |
--| GET | /api/v1/registry/namespaces | server/registry/ecosystem.js:252 | | keep |
--| GET | /api/v1/registry/releases | server/registry/ecosystem.js:270 | | keep |
--| GET | /api/v1/registry/search | server/registry/ecosystem.js:277 | | keep |
--| GET | /api/v1/registry/services | server/registry/ecosystem.js:225 | | keep |
--| GET | /api/v1/registry/services/:id | server/registry/ecosystem.js:231 | | keep |
--| GET | /api/v1/registry/topics | server/registry/ecosystem.js:254 | | keep |
--| GET | /api/v1/registry/topics/:topic | server/registry/ecosystem.js:265 | | keep |
++| GET | /api/v1/registry | server/registry/ecosystem.js:313 | | keep |
++| GET | /api/v1/registry/capabilities | server/registry/ecosystem.js:338 | | keep |
++| GET | /api/v1/registry/capabilities/:id | server/registry/ecosystem.js:343 | | keep |
++| GET | /api/v1/registry/categories | server/registry/ecosystem.js:314 | | keep |
++| GET | /api/v1/registry/categories/:id | server/registry/ecosystem.js:315 | | keep |
++| GET | /api/v1/registry/contracts | server/registry/ecosystem.js:349 | | keep |
++| GET | /api/v1/registry/domains/:domain | server/registry/ecosystem.js:332 | | keep |
++| GET | /api/v1/registry/featured | server/registry/ecosystem.js:320 | | keep |
++| GET | /api/v1/registry/health | server/registry/ecosystem.js:367 | | keep |
++| GET | /api/v1/registry/namespaces | server/registry/ecosystem.js:348 | | keep |
++| GET | /api/v1/registry/releases | server/registry/ecosystem.js:366 | | keep |
++| GET | /api/v1/registry/search | server/registry/ecosystem.js:373 | | keep |
++| GET | /api/v1/registry/services | server/registry/ecosystem.js:321 | | keep |
++| GET | /api/v1/registry/services/:id | server/registry/ecosystem.js:327 | | keep |
++| GET | /api/v1/registry/topics | server/registry/ecosystem.js:350 | | keep |
++| GET | /api/v1/registry/topics/:topic | server/registry/ecosystem.js:361 | | keep |
| GET | /api/v1/status | server/status/routes.js:157 | | keep |
| GET | /api/v1/status/slo | server/status/routes.js:171 | | keep |
| POST | /api/webhooks/resend | server/notifications/resend-webhook.js:26 | | keep |
--| GET | /audit | server/admin/routes.js:797 | | keep |
++| GET | /audit | server/admin/routes.js:821 | | keep |
| DELETE | /avatar | server/profile/avatar.js:107 | | keep |
| PUT | /avatar | server/profile/avatar.js:96 | | keep |
| GET | /avatar/:username | server/profile/avatar.js:110 | | keep |
| POST | /bootstrap | server/setup/routes.js:99 | | keep |
| GET | /bots | server/admin/analytics-routes.js:255 | | keep |
--| POST | /broadcast | server/admin/routes.js:721 | | keep |
++| POST | /broadcast | server/admin/routes.js:745 | | keep |
| GET | /certs | server/deploy/routes.js:139 | | keep |
| POST | /certs/issue-cloudflare | server/deploy/routes.js:164 | | keep |
| POST | /certs/issue-manual | server/deploy/routes.js:236 | | keep |
@@@ -850,63 +854,66 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /deploy-status | server/setup/routes.js:309 | | keep |
| GET | /domains | server/deploy/routes.js:406 | | keep |
| PUT | /domains | server/deploy/routes.js:426 | | keep |
--| GET | /email | server/admin/routes.js:240 | | keep |
--| PUT | /email | server/admin/routes.js:250 | | keep |
--| POST | /email/test | server/admin/routes.js:283 | | keep |
++| GET | /email | server/admin/routes.js:241 | | keep |
++| PUT | /email | server/admin/routes.js:251 | | keep |
++| POST | /email/test | server/admin/routes.js:289 | | keep |
| GET | /fedcm/accounts | server/auth/fedcm.js:111 | | keep |
| POST | /fedcm/assertion | server/auth/fedcm.js:125 | | keep |
| GET | /fedcm/client-metadata | server/auth/fedcm.js:120 | | keep |
| GET | /fedcm/config.json | server/auth/fedcm.js:97 | | keep |
| POST | /fedcm/disconnect | server/auth/fedcm.js:142 | | keep |
--| GET | /health | server/admin/routes.js:766 | | keep |
++| GET | /health | server/admin/routes.js:790 | | keep |
| POST | /identity | server/setup/routes.js:152 | | keep |
--| GET | /internal/anon-admin | server/internal/routes.js:638 | | keep |
--| GET | /internal/anon-list | server/internal/routes.js:687 | | keep |
--| POST | /internal/audit | server/internal/routes.js:206 | | keep |
--| POST | /internal/coins/credit | server/internal/routes.js:295 | | keep |
--| POST | /internal/coins/debit | server/internal/routes.js:307 | | keep |
--| GET | /internal/coins/stats | server/internal/routes.js:254 | | keep |
--| POST | /internal/coins/transfer | server/internal/routes.js:320 | | keep |
--| POST | /internal/events/stream-live | server/internal/routes.js:338 | OpenVibe.Events | compat |
++| GET | /internal/anon-admin | server/internal/routes.js:659 | | keep |
++| GET | /internal/anon-list | server/internal/routes.js:708 | | keep |
++| POST | /internal/audit | server/internal/routes.js:224 | | keep |
++| POST | /internal/coins/credit | server/internal/routes.js:316 | | keep |
++| POST | /internal/coins/debit | server/internal/routes.js:328 | | keep |
++| GET | /internal/coins/stats | server/internal/routes.js:275 | | keep |
++| POST | /internal/coins/transfer | server/internal/routes.js:341 | | keep |
++| POST | /internal/events/stream-live | server/internal/routes.js:359 | OpenVibe.Events | compat |
| POST | /internal/identity/legacy-map | server/identity/internal-routes.js:52 | | keep |
++| POST | /internal/identity/legacy-map | server/internal/routes.js:84 | | keep |
| GET | /internal/identity/resolve | server/identity/internal-routes.js:18 | | keep |
--| GET | /internal/identity/resolve | server/internal/routes.js:66 | | keep |
++| GET | /internal/identity/resolve | server/internal/routes.js:80 | | keep |
| POST | /internal/identity/resolve-batch | server/identity/internal-routes.js:35 | | keep |
--| POST | /internal/identity/resolve-batch | server/internal/routes.js:67 | | keep |
--| POST | /internal/issue-token | server/internal/routes.js:528 | | keep |
--| POST | /internal/link-account | server/internal/routes.js:148 | | keep |
--| POST | /internal/notifications/mark-read | server/internal/routes.js:489 | | keep |
--| POST | /internal/notifications/push | server/internal/routes.js:431 | | keep |
--| POST | /internal/notifications/push-bulk | server/internal/routes.js:451 | | keep |
--| POST | /internal/notifications/resolve-users | server/internal/routes.js:508 | | keep |
--| GET | /internal/notifications/unread/:userId | server/internal/routes.js:474 | | keep |
--| POST | /internal/resolve-anon | server/internal/routes.js:559 | | keep |
--| GET | /internal/stats | server/internal/routes.js:215 | | keep |
--| GET | /internal/url-registry/resolved | server/internal/routes.js:224 | | keep |
--| POST | /internal/user-avatar | server/internal/routes.js:191 | | keep |
--| GET | /internal/users/:id | server/internal/routes.js:99 | | keep |
--| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:199 | | keep |
--| GET | /internal/users/:id/theme | server/internal/routes.js:136 | | keep |
--| POST | /internal/users/bulk | server/internal/routes.js:121 | | keep |
--| GET | /internal/users/by-username/:username | server/internal/routes.js:110 | | keep |
--| POST | /internal/verify-token | server/internal/routes.js:75 | | keep |
--| GET | /llms.txt | server/index.js:608 | | keep |
++| POST | /internal/identity/resolve-batch | server/internal/routes.js:81 | | keep |
++| POST | /internal/issue-token | server/internal/routes.js:549 | | keep |
++| POST | /internal/link-account | server/internal/routes.js:166 | | keep |
++| POST | /internal/notifications/mark-read | server/internal/routes.js:510 | | keep |
++| POST | /internal/notifications/push | server/internal/routes.js:452 | | keep |
++| POST | /internal/notifications/push-bulk | server/internal/routes.js:472 | | keep |
++| POST | /internal/notifications/resolve-users | server/internal/routes.js:529 | | keep |
++| GET | /internal/notifications/unread/:userId | server/internal/routes.js:495 | | keep |
++| POST | /internal/resolve-anon | server/internal/routes.js:580 | | keep |
++| GET | /internal/stats | server/internal/routes.js:233 | | keep |
++| GET | /internal/url-registry/resolved | server/internal/routes.js:244 | | keep |
++| POST | /internal/user-avatar | server/internal/routes.js:209 | | keep |
++| GET | /internal/users/:id | server/internal/routes.js:116 | | keep |
++| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:217 | | keep |
++| GET | /internal/users/:id/theme | server/internal/routes.js:153 | | keep |
++| POST | /internal/users/bulk | server/internal/routes.js:138 | | keep |
++| GET | /internal/users/by-username/:username | server/internal/routes.js:127 | | keep |
++| POST | /internal/verify-token | server/internal/routes.js:92 | | keep |
++| GET | /llms.txt | server/index.js:610 | | keep |
| GET | /me | server/coins/routes.js:18 | | keep |
| GET | /me/history | server/coins/routes.js:24 | | keep |
--| GET | /net-config | server/admin/routes.js:907 | | keep |
--| PUT | /net-config | server/admin/routes.js:926 | | keep |
++| GET | /net-config | server/admin/routes.js:931 | | keep |
++| PUT | /net-config | server/admin/routes.js:950 | | keep |
| GET | /newest | server/notifications/routes.js:57 | | keep |
| POST | /nginx/apply | server/deploy/routes.js:343 | | keep |
| GET | /nginx/preview | server/deploy/routes.js:296 | | keep |
| GET | /nginx/preview/:serviceId | server/deploy/routes.js:314 | | keep |
| POST | /nginx/reload | server/deploy/routes.js:382 | | keep |
| POST | /nginx/validate | server/deploy/routes.js:330 | | keep |
--| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:416 | | keep |
--| GET | /oauth/authorize | server/auth/oauth-routes.js:53 | | keep |
--| GET | /oauth/client-info | server/auth/oauth-routes.js:124 | | keep |
--| POST | /oauth/confirm | server/auth/oauth-routes.js:149 | | keep |
--| POST | /oauth/token | server/auth/oauth-routes.js:207 | | keep |
--| GET | /openvibe-sw.js | server/index.js:657 | | keep |
++| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:419 | | keep |
++| GET | /oauth/authorize | server/auth/oauth-routes.js:55 | | keep |
++| GET | /oauth/client-info | server/auth/oauth-routes.js:129 | | keep |
++| POST | /oauth/confirm | server/auth/oauth-routes.js:154 | | keep |
++| POST | /oauth/token | server/auth/oauth-routes.js:214 | | keep |
++| GET | /oauth/userinfo | server/auth/oauth-routes.js:423 | | keep |
++| POST | /oauth/userinfo | server/auth/oauth-routes.js:424 | | keep |
++| GET | /openvibe-sw.js | server/index.js:661 | | keep |
| GET | /overview | server/admin/analytics-routes.js:75 | | keep |
| GET | /preferences | server/notifications/routes.js:121 | | keep |
| PUT | /preferences | server/notifications/routes.js:132 | | keep |
@@@ -915,37 +922,37 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /read-all | server/notifications/routes.js:89 | | keep |
| POST | /read-batch | server/notifications/routes.js:78 | | keep |
| GET | /realtime | server/admin/analytics-routes.js:285 | | keep |
--| POST | /reinit | server/discord/routes.js:96 | | keep |
--| GET | /release.json | server/index.js:684 | | keep |
--| POST | /reset-db | server/admin/routes.js:473 | | keep |
++| POST | /reinit | server/discord/routes.js:103 | | keep |
++| POST | /reset-db | server/admin/routes.js:497 | | keep |
++| GET | /secrets | server/admin/routes.js:306 | | keep |
| GET | /service/:name | server/admin/analytics-routes.js:224 | | keep |
--| GET | /settings | server/admin/routes.js:300 | | keep |
--| PUT | /settings | server/admin/routes.js:328 | | keep |
--| GET | /sso/check | server/index.js:635 | | keep |
++| GET | /settings | server/admin/routes.js:311 | | keep |
++| PUT | /settings | server/admin/routes.js:348 | | keep |
++| GET | /sso/check | server/index.js:639 | | keep |
| GET | /status | server/setup/routes.js:91 | | keep |
| GET | /status | server/status/routes.js:174 | | keep |
--| POST | /test | server/discord/routes.js:77 | | keep |
--| POST | /test-live | server/discord/routes.js:87 | | keep |
++| POST | /test | server/discord/routes.js:84 | | keep |
++| POST | /test-live | server/discord/routes.js:94 | | keep |
| GET | /tos | server/index.js:477 | | keep |
| GET | /unread-by-category | server/notifications/routes.js:47 | | keep |
| GET | /unread-count | server/notifications/routes.js:37 | | keep |
--| GET | /url-registry | server/admin/routes.js:353 | | keep |
--| PUT | /url-registry | server/admin/routes.js:380 | | keep |
--| DELETE | /url-registry/:key | server/admin/routes.js:423 | | keep |
--| PUT | /url-registry/:key | server/admin/routes.js:401 | | keep |
--| POST | /url-registry/:key/reset | server/admin/routes.js:458 | | keep |
--| POST | /url-registry/refresh-all | server/admin/routes.js:438 | | keep |
++| GET | /url-registry | server/admin/routes.js:377 | | keep |
++| PUT | /url-registry | server/admin/routes.js:404 | | keep |
++| DELETE | /url-registry/:key | server/admin/routes.js:447 | | keep |
++| PUT | /url-registry/:key | server/admin/routes.js:425 | | keep |
++| POST | /url-registry/:key/reset | server/admin/routes.js:482 | | keep |
++| POST | /url-registry/refresh-all | server/admin/routes.js:462 | | keep |
| POST | /urls | server/setup/routes.js:193 | | keep |
--| GET | /users | server/admin/routes.js:536 | | keep |
--| PUT | /users/:id/ban | server/admin/routes.js:691 | | keep |
--| PUT | /users/:id/email | server/admin/routes.js:568 | | keep |
--| PUT | /users/:id/role | server/admin/routes.js:666 | | keep |
--| POST | /users/:id/send-reset | server/admin/routes.js:607 | | keep |
--| POST | /users/grant-admin | server/admin/routes.js:500 | | keep |
--| GET | /verification-keys | server/admin/routes.js:824 | | keep |
--| POST | /verification-keys | server/admin/routes.js:833 | | keep |
--| DELETE | /verification-keys/:id | server/admin/routes.js:881 | | keep |
--| GET | /verify-email | server/index.js:620 | | keep |
++| GET | /users | server/admin/routes.js:560 | | keep |
++| PUT | /users/:id/ban | server/admin/routes.js:715 | | keep |
++| PUT | /users/:id/email | server/admin/routes.js:592 | | keep |
++| PUT | /users/:id/role | server/admin/routes.js:690 | | keep |
++| POST | /users/:id/send-reset | server/admin/routes.js:631 | | keep |
++| POST | /users/grant-admin | server/admin/routes.js:524 | | keep |
++| GET | /verification-keys | server/admin/routes.js:848 | | keep |
++| POST | /verification-keys | server/admin/routes.js:857 | | keep |
++| DELETE | /verification-keys/:id | server/admin/routes.js:905 | | keep |
++| GET | /verify-email | server/index.js:622 | | keep |
## OpenVibe.Shared
@@@ -958,29 +965,31 @@ Owner = the repository whose code answers the route; target = the authority it b
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
--| GET | /api/ready | server/observability.js:140 | | keep |
--| GET | /api/v1/:app/admin/storage | server/admin/routes.js:72 | | keep |
--| GET | /api/v1/:app/admin/storage/buckets | server/admin/routes.js:404 | | keep |
--| GET | /api/v1/:app/admin/storage/tiers | server/admin/routes.js:258 | | keep |
--| POST | /api/v1/:app/admin/storage/tiers/bulk-move | server/admin/routes.js:377 | | keep |
--| POST | /api/v1/:app/admin/storage/tiers/move | server/admin/routes.js:359 | | keep |
--| PUT | /api/v1/:app/admin/storage/tiers/settings | server/admin/routes.js:306 | | keep |
--| POST | /api/v1/:app/admin/storage/tiers/sweep | server/admin/routes.js:332 | | keep |
--| GET | /api/v1/:app/admin/storage/vods | server/admin/routes.js:127 | | keep |
--| DELETE | /api/v1/:app/admin/storage/vods/bulk | server/admin/routes.js:199 | | keep |
++| GET | /api/ready | server/observability.js:148 | | keep |
++| GET | /api/v1/:app/admin/storage | server/admin/routes.js:77 | | keep |
++| GET | /api/v1/:app/admin/storage/buckets | server/admin/routes.js:471 | | keep |
++| GET | /api/v1/:app/admin/storage/tiers | server/admin/routes.js:263 | | keep |
++| POST | /api/v1/:app/admin/storage/tiers/bulk-move | server/admin/routes.js:444 | | keep |
++| GET | /api/v1/:app/admin/storage/tiers/decisions | server/admin/routes.js:373 | | keep |
++| POST | /api/v1/:app/admin/storage/tiers/move | server/admin/routes.js:426 | | keep |
++| GET | /api/v1/:app/admin/storage/tiers/policy | server/admin/routes.js:346 | | keep |
++| PUT | /api/v1/:app/admin/storage/tiers/settings | server/admin/routes.js:311 | | keep |
++| POST | /api/v1/:app/admin/storage/tiers/sweep | server/admin/routes.js:398 | | keep |
++| GET | /api/v1/:app/admin/storage/vods | server/admin/routes.js:132 | | keep |
++| DELETE | /api/v1/:app/admin/storage/vods/bulk | server/admin/routes.js:204 | | keep |
| GET | /api/v1/:app/assets | server/assets/routes.js:72 | | keep |
| POST | /api/v1/:app/assets | server/assets/routes.js:39 | | keep |
| DELETE | /api/v1/:app/assets/:id | server/assets/routes.js:84 | | keep |
--| GET | /api/v1/:app/clips | server/vod/clips-routes.js:301 | | keep |
--| POST | /api/v1/:app/clips | server/vod/clips-routes.js:120 | | keep |
--| DELETE | /api/v1/:app/clips/:id | server/vod/clips-routes.js:386 | | keep |
--| GET | /api/v1/:app/clips/:id | server/vod/clips-routes.js:327 | | keep |
--| PUT | /api/v1/:app/clips/:id | server/vod/clips-routes.js:367 | | keep |
--| POST | /api/v1/:app/clips/:id/recut | server/vod/clips-routes.js:350 | | keep |
--| GET | /api/v1/:app/files | server/files/routes.js:152 | | keep |
--| POST | /api/v1/:app/files | server/files/routes.js:83 | | keep |
--| DELETE | /api/v1/:app/files/:key | server/files/routes.js:180 | | keep |
--| GET | /api/v1/:app/files/:key | server/files/routes.js:169 | | keep |
++| GET | /api/v1/:app/clips | server/vod/clips-routes.js:312 | | keep |
++| POST | /api/v1/:app/clips | server/vod/clips-routes.js:122 | | keep |
++| DELETE | /api/v1/:app/clips/:id | server/vod/clips-routes.js:405 | | keep |
++| GET | /api/v1/:app/clips/:id | server/vod/clips-routes.js:341 | | keep |
++| PUT | /api/v1/:app/clips/:id | server/vod/clips-routes.js:381 | | keep |
++| POST | /api/v1/:app/clips/:id/recut | server/vod/clips-routes.js:364 | | keep |
++| GET | /api/v1/:app/files | server/files/routes.js:153 | | keep |
++| POST | /api/v1/:app/files | server/files/routes.js:84 | | keep |
++| DELETE | /api/v1/:app/files/:key | server/files/routes.js:181 | | keep |
++| GET | /api/v1/:app/files/:key | server/files/routes.js:170 | | keep |
| GET | /api/v1/:app/pastes | server/pastes/routes.js:260 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes | server/pastes/routes.js:476 | OpenVibe.Community | frozen-legacy |
| DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:631 | OpenVibe.Community | frozen-legacy |
@@@ -988,9 +997,9 @@ Owner = the repository whose code answers the route; target = the authority it b
| PUT | /api/v1/:app/pastes/:slug | server/pastes/routes.js:593 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes/:slug/ai | server/pastes/routes.js:573 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes/:slug/censor | server/pastes/routes.js:409 | OpenVibe.Community | frozen-legacy |
--| GET | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:717 | OpenVibe.Community | frozen-legacy |
--| POST | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:740 | OpenVibe.Community | frozen-legacy |
--| DELETE | /api/v1/:app/pastes/:slug/comments/:commentId | server/pastes/routes.js:818 | OpenVibe.Community | frozen-legacy |
++| GET | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:718 | OpenVibe.Community | frozen-legacy |
++| POST | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:741 | OpenVibe.Community | frozen-legacy |
++| DELETE | /api/v1/:app/pastes/:slug/comments/:commentId | server/pastes/routes.js:819 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes/:slug/copy | server/pastes/routes.js:692 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes/:slug/fork | server/pastes/routes.js:649 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes/:slug/like | server/pastes/routes.js:675 | OpenVibe.Community | frozen-legacy |
@@@ -999,23 +1008,23 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:341 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:384 | OpenVibe.Community | frozen-legacy |
| GET | /api/v1/:app/pastes/config | server/pastes/routes.js:319 | OpenVibe.Community | frozen-legacy |
--| GET | /api/v1/:app/stats | server/index.js:115 | | keep |
--| GET | /api/v1/:app/stats/series/:metric | server/index.js:125 | | keep |
++| GET | /api/v1/:app/stats | server/index.js:148 | | keep |
++| GET | /api/v1/:app/stats/series/:metric | server/index.js:158 | | keep |
| POST | /api/v1/:app/thumbnails/:kind/:id | server/thumbnails/routes.js:42 | | keep |
| GET | /api/v1/:app/views | server/views/routes.js:39 | | keep |
| POST | /api/v1/:app/views | server/views/routes.js:24 | | keep |
| GET | /api/v1/:app/vods | server/vod/routes.js:273 | | keep |
| POST | /api/v1/:app/vods | server/vod/routes.js:95 | | keep |
--| DELETE | /api/v1/:app/vods/:id | server/vod/routes.js:366 | | keep |
--| GET | /api/v1/:app/vods/:id | server/vod/routes.js:312 | | keep |
--| PUT | /api/v1/:app/vods/:id | server/vod/routes.js:343 | | keep |
++| DELETE | /api/v1/:app/vods/:id | server/vod/routes.js:369 | | keep |
++| GET | /api/v1/:app/vods/:id | server/vod/routes.js:314 | | keep |
++| PUT | /api/v1/:app/vods/:id | server/vod/routes.js:346 | | keep |
| POST | /api/v1/:app/vods/:id/chunks | server/vod/routes.js:162 | | keep |
| POST | /api/v1/:app/vods/:id/complete | server/vod/routes.js:266 | | keep |
| POST | /api/v1/:app/vods/:id/finalize | server/vod/routes.js:267 | | keep |
| POST | /api/v1/:app/vods/:id/ingest/rtmp | server/vod/routes.js:119 | | keep |
| POST | /api/v1/:app/vods/:id/ingest/rtp/start | server/vod/routes.js:133 | | keep |
| POST | /api/v1/:app/vods/:id/ingest/rtp/stop | server/vod/routes.js:147 | | keep |
--| GET | /api/v1/:app/vods/latest-thumbs | server/vod/routes.js:301 | | keep |
++| GET | /api/v1/:app/vods/latest-thumbs | server/vod/routes.js:303 | | keep |
| GET | /api/v2/:app/jobs | server/jobs/routes.js:63 | | keep |
| POST | /api/v2/:app/jobs | server/jobs/routes.js:76 | | keep |
| DELETE | /api/v2/:app/jobs/:jobId | server/jobs/routes.js:135 | | keep |
@@@ -1028,7 +1037,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/v2/:app/objects/:id | server/objects/routes.js:522 | | keep |
| GET | /api/v2/:app/objects/:id | server/objects/routes.js:601 | | keep |
| POST | /api/v2/:app/objects/:id/complete | server/objects/routes.js:371 | | keep |
--| PUT | /api/v2/:app/objects/:id/content | server/index.js:35 | | keep |
++| PUT | /api/v2/:app/objects/:id/content | server/index.js:63 | | keep |
| GET | /api/v2/:app/objects/:id/download | server/objects/routes.js:553 | | keep |
| GET | /api/v2/:app/objects/:id/holds | server/objects/routes.js:572 | | keep |
| POST | /api/v2/:app/objects/:id/holds | server/objects/routes.js:578 | | keep |
@@@ -1037,18 +1046,18 @@ Owner = the repository whose code answers the route; target = the authority it b
| DELETE | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:486 | | keep |
| GET | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:440 | | keep |
| POST | /api/v2/:app/objects/:id/multipart/:uploadId/complete | server/objects/routes.js:449 | | keep |
--| PUT | /api/v2/:app/objects/:id/multipart/:uploadId/parts/:n | server/index.js:36 | | keep |
++| PUT | /api/v2/:app/objects/:id/multipart/:uploadId/parts/:n | server/index.js:64 | | keep |
| POST | /api/v2/:app/objects/:id/restore | server/objects/routes.js:543 | | keep |
| POST | /api/v2/:app/objects/:id/upload-url | server/objects/routes.js:387 | | keep |
--| GET | /auth/callback | server/user-auth.js:281 | | keep |
--| POST | /auth/fedcm | server/user-auth.js:327 | | keep |
--| GET | /auth/login | server/user-auth.js:259 | | keep |
--| GET | /auth/logout | server/user-auth.js:355 | | keep |
--| GET | /auth/me | server/user-auth.js:379 | | keep |
--| POST | /auth/refresh | server/user-auth.js:389 | | keep |
--| GET | /healthz | server/index.js:93 | | keep |
--| POST | /internal/avatar-ingest | server/index.js:64 | | keep |
--| GET | /manifest.webmanifest | server/index.js:52 | | keep |
++| GET | /auth/callback | server/user-auth.js:282 | | keep |
++| POST | /auth/fedcm | server/user-auth.js:328 | | keep |
++| GET | /auth/login | server/user-auth.js:260 | | keep |
++| GET | /auth/logout | server/user-auth.js:356 | | keep |
++| GET | /auth/me | server/user-auth.js:380 | | keep |
++| POST | /auth/refresh | server/user-auth.js:390 | | keep |
++| GET | /healthz | server/index.js:125 | | keep |
++| POST | /internal/avatar-ingest | server/index.js:92 | | keep |
++| GET | /manifest.webmanifest | server/index.js:80 | | keep |
| GET | /o | server/objects/routes.js:497 | | keep |
| POST | /o | server/objects/routes.js:261 | | keep |
| DELETE | /o/:id | server/objects/routes.js:527 | | keep |
@@@ -1065,100 +1074,81 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /o/:id/multipart/:uploadId/complete | server/objects/routes.js:449 | | keep |
| POST | /o/:id/restore | server/objects/routes.js:543 | | keep |
| POST | /o/:id/upload-url | server/objects/routes.js:387 | | keep |
--| GET | /release.json | server/index.js:91 | | keep |
--| GET | /tos | server/index.js:49 | | keep |
++| GET | /tos | server/index.js:77 | | keep |
## OpenVibe.Tools
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
| GET | / | apps/gateway/server/pages/site.js:257 | | keep |
--| GET | / | apps/text/server/index.js:209 | | keep |
++| GET | / | apps/text/server/index.js:152 | | keep |
| GET | /:slug | apps/gateway/server/pages/site.js:265 | | keep |
| GET | /all-tools | apps/gateway/server/pages/site.js:258 | | keep |
--| GET | /api/brand | apps/gateway/server/index.js:176 | | keep |
++| GET | /api/brand | apps/gateway/server/index.js:259 | | keep |
| GET | /api/catalog.json | apps/gateway/server/pages/site.js:256 | | keep |
--| GET | /api/context | apps/audio/server/index.js:133 | | keep |
--| GET | /api/context | apps/docs/server/index.js:129 | | keep |
--| GET | /api/context | apps/img/server/index.js:130 | | keep |
--| GET | /api/dev/opengraph | apps/gateway/server/dev/routes.js:83 | | keep |
--| GET | /api/dev/tools | apps/gateway/server/dev/routes.js:71 | | keep |
--| POST | /api/dev/webhook/bins | apps/gateway/server/dev/routes.js:151 | | keep |
--| DELETE | /api/dev/webhook/bins/:binId | apps/gateway/server/dev/routes.js:217 | | keep |
--| GET | /api/dev/webhook/bins/:binId | apps/gateway/server/dev/routes.js:172 | | keep |
--| ALL | /api/dev/webhook/bins/:binId/in | apps/gateway/server/dev/routes.js:186 | | keep |
--| POST | /api/download | apps/yt/server/index.js:142 | | keep |
--| DELETE | /api/download/:id | apps/yt/server/index.js:223 | | keep |
--| GET | /api/download/:id | apps/audio/server/index.js:222 | | keep |
--| GET | /api/download/:id | apps/docs/server/index.js:269 | | keep |
--| GET | /api/download/:id | apps/img/server/index.js:219 | | keep |
--| GET | /api/download/:id | apps/yt/server/index.js:230 | | keep |
--| GET | /api/food-banks | apps/food/server/index.js:105 | | keep |
--| GET | /api/food-banks | apps/maps/server/index.js:398 | | keep |
--| GET | /api/foods | apps/food/server/index.js:107 | | keep |
--| GET | /api/foods | apps/maps/server/index.js:419 | | keep |
--| GET | /api/geocode | apps/food/server/index.js:109 | | keep |
--| GET | /api/geocode | apps/maps/server/index.js:121 | | keep |
--| GET | /api/health | apps/audio/server/index.js:127 | | keep |
--| GET | /api/health | apps/docs/server/index.js:123 | | keep |
--| GET | /api/health | apps/gateway/server/index.js:172 | | keep |
--| GET | /api/health | apps/img/server/index.js:124 | | keep |
--| GET | /api/health | apps/text/server/index.js:182 | | keep |
--| GET | /api/health | apps/yt/server/index.js:120 | | keep |
--| POST | /api/info | apps/docs/server/index.js:151 | | keep |
--| POST | /api/info | apps/yt/server/index.js:127 | | keep |
--| GET | /api/internal/analytics | apps/audio/server/index.js:271 | | keep |
--| GET | /api/internal/analytics | apps/docs/server/index.js:287 | | keep |
--| GET | /api/internal/analytics | apps/food/server/index.js:112 | | keep |
--| GET | /api/internal/analytics | apps/gateway/server/index.js:256 | | keep |
--| GET | /api/internal/analytics | apps/img/server/index.js:237 | | keep |
--| GET | /api/internal/analytics | apps/maps/server/index.js:441 | | keep |
--| GET | /api/internal/analytics | apps/text/server/index.js:170 | | keep |
--| GET | /api/internal/analytics | apps/yt/server/index.js:244 | | keep |
--| GET | /api/internal/analytics/bots | apps/audio/server/index.js:276 | | keep |
--| GET | /api/internal/analytics/bots | apps/docs/server/index.js:292 | | keep |
--| GET | /api/internal/analytics/bots | apps/food/server/index.js:117 | | keep |
--| GET | /api/internal/analytics/bots | apps/img/server/index.js:242 | | keep |
--| GET | /api/internal/analytics/bots | apps/maps/server/index.js:446 | | keep |
--| GET | /api/internal/analytics/bots | apps/text/server/index.js:175 | | keep |
--| GET | /api/internal/analytics/bots | apps/yt/server/index.js:249 | | keep |
--| GET | /api/meal-plan | apps/food/server/index.js:108 | | keep |
--| GET | /api/meal-plan | apps/maps/server/index.js:429 | | keep |
--| GET | /api/net/dns/:target? | apps/gateway/server/net/routes.js:298 | | keep |
--| GET | /api/net/headers/:target? | apps/gateway/server/net/routes.js:504 | | keep |
--| GET | /api/net/ip/:target? | apps/gateway/server/net/routes.js:122 | | keep |
--| GET | /api/net/ipv4/:target? | apps/gateway/server/net/routes.js:176 | | keep |
--| GET | /api/net/ipv6/:target? | apps/gateway/server/net/routes.js:250 | | keep |
--| GET | /api/net/lookup/:target? | apps/gateway/server/net/routes.js:676 | | keep |
--| GET | /api/net/myip | apps/gateway/server/net/routes.js:115 | | keep |
--| GET | /api/net/ping/:target? | apps/gateway/server/net/routes.js:639 | | keep |
--| GET | /api/net/port/:target? | apps/gateway/server/net/routes.js:613 | | keep |
--| GET | /api/net/rdap/:target? | apps/gateway/server/net/routes.js:389 | | keep |
--| GET | /api/net/rdns/:target? | apps/gateway/server/net/routes.js:361 | | keep |
--| GET | /api/net/redirects/:target? | apps/gateway/server/net/routes.js:550 | | keep |
--| GET | /api/net/ssl/:target? | apps/gateway/server/net/routes.js:437 | | keep |
--| GET | /api/net/tools | apps/gateway/server/net/routes.js:107 | | keep |
--| GET | /api/net/whois/:target? | apps/gateway/server/net/routes.js:426 | | keep |
--| GET | /api/preview/:id | apps/audio/server/index.js:240 | | keep |
--| POST | /api/probe | apps/audio/server/index.js:155 | | keep |
--| POST | /api/process | apps/audio/server/index.js:168 | | keep |
--| POST | /api/process | apps/docs/server/index.js:163 | | keep |
--| POST | /api/process | apps/img/server/index.js:152 | | keep |
--| POST | /api/process/direct | apps/img/server/index.js:180 | | keep |
--| POST | /api/process/multi | apps/docs/server/index.js:210 | | keep |
++| GET | /api/context | apps/audio/server/index.js:161 | | keep |
++| GET | /api/context | apps/docs/server/index.js:190 | | keep |
++| GET | /api/context | apps/img/server/index.js:184 | | keep |
++| POST | /api/download | apps/yt/server/index.js:171 | | keep |
++| DELETE | /api/download/:id | apps/yt/server/index.js:258 | | keep |
++| GET | /api/download/:id | apps/audio/server/index.js:294 | | keep |
++| GET | /api/download/:id | apps/docs/server/index.js:345 | | keep |
++| GET | /api/download/:id | apps/img/server/index.js:287 | | keep |
++| GET | /api/download/:id | apps/yt/server/index.js:265 | | keep |
++| GET | /api/food-banks | apps/food/server/index.js:136 | | keep |
++| GET | /api/food-banks | apps/maps/server/index.js:428 | | keep |
++| GET | /api/foods | apps/food/server/index.js:138 | | keep |
++| GET | /api/foods | apps/maps/server/index.js:449 | | keep |
++| GET | /api/geocode | apps/food/server/index.js:140 | | keep |
++| GET | /api/geocode | apps/maps/server/index.js:150 | | keep |
++| GET | /api/health | apps/audio/server/index.js:154 | | keep |
++| GET | /api/health | apps/docs/server/index.js:183 | | keep |
++| GET | /api/health | apps/gateway/server/index.js:255 | | keep |
++| GET | /api/health | apps/img/server/index.js:177 | | keep |
++| GET | /api/health | apps/text/server/index.js:125 | | keep |
++| GET | /api/health | apps/yt/server/index.js:146 | | keep |
++| POST | /api/info | apps/docs/server/index.js:214 | | keep |
++| POST | /api/info | apps/yt/server/index.js:153 | | keep |
++| GET | /api/internal/analytics | apps/audio/server/index.js:343 | | keep |
++| GET | /api/internal/analytics | apps/docs/server/index.js:363 | | keep |
++| GET | /api/internal/analytics | apps/food/server/index.js:143 | | keep |
++| GET | /api/internal/analytics | apps/gateway/server/index.js:342 | | keep |
++| GET | /api/internal/analytics | apps/img/server/index.js:305 | | keep |
++| GET | /api/internal/analytics | apps/maps/server/index.js:471 | | keep |
++| GET | /api/internal/analytics | apps/text/server/index.js:113 | | keep |
++| GET | /api/internal/analytics | apps/yt/server/index.js:279 | | keep |
++| GET | /api/internal/analytics/bots | apps/audio/server/index.js:348 | | keep |
++| GET | /api/internal/analytics/bots | apps/docs/server/index.js:368 | | keep |
++| GET | /api/internal/analytics/bots | apps/food/server/index.js:148 | | keep |
++| GET | /api/internal/analytics/bots | apps/img/server/index.js:310 | | keep |
++| GET | /api/internal/analytics/bots | apps/maps/server/index.js:476 | | keep |
++| GET | /api/internal/analytics/bots | apps/text/server/index.js:118 | | keep |
++| GET | /api/internal/analytics/bots | apps/yt/server/index.js:284 | | keep |
++| GET | /api/internal/jobs/:id | apps/_shared/jobs/http.js:112 | | keep |
++| GET | /api/meal-plan | apps/food/server/index.js:139 | | keep |
++| GET | /api/meal-plan | apps/maps/server/index.js:459 | | keep |
++| GET | /api/preview/:id | apps/audio/server/index.js:312 | | keep |
++| POST | /api/probe | apps/audio/server/index.js:185 | | keep |
++| POST | /api/process | apps/_shared/guard/index.js:12 | | keep |
++| POST | /api/process | apps/audio/server/index.js:198 | | keep |
++| POST | /api/process | apps/docs/server/index.js:226 | | keep |
++| POST | /api/process | apps/img/server/index.js:210 | | keep |
++| POST | /api/process/direct | apps/img/server/index.js:237 | | keep |
++| POST | /api/process/multi | apps/audio/server/index.js:239 | | keep |
++| POST | /api/process/multi | apps/docs/server/index.js:273 | | keep |
| GET | /api/ready | apps/_shared/observe.js:73 | | keep |
--| GET | /api/ready | apps/gateway/server/index.js:108 | | keep |
--| GET | /api/search | apps/maps/server/index.js:227 | | keep |
--| GET | /api/search/stream | apps/maps/server/index.js:272 | | keep |
--| GET | /api/status/:id | apps/yt/server/index.js:157 | | keep |
--| GET | /api/status/:id/stream | apps/yt/server/index.js:173 | | keep |
--| GET | /api/stores | apps/food/server/index.js:106 | | keep |
--| GET | /api/stores | apps/maps/server/index.js:409 | | keep |
--| GET | /api/terrain | apps/maps/server/index.js:388 | | keep |
--| GET | /api/tools | apps/audio/server/index.js:150 | | keep |
--| GET | /api/tools | apps/docs/server/index.js:146 | | keep |
--| GET | /api/tools | apps/img/server/index.js:147 | | keep |
--| POST | /api/v1/jobs | apps/_shared/jobs/http.js:161 | | keep |
++| GET | /api/ready | apps/gateway/server/index.js:130 | | keep |
++| GET | /api/search | apps/maps/server/index.js:257 | | keep |
++| GET | /api/search/stream | apps/maps/server/index.js:302 | | keep |
++| GET | /api/status/:id | apps/yt/server/index.js:191 | | keep |
++| GET | /api/status/:id/stream | apps/yt/server/index.js:207 | | keep |
++| GET | /api/stores | apps/food/server/index.js:137 | | keep |
++| GET | /api/stores | apps/maps/server/index.js:439 | | keep |
++| GET | /api/terrain | apps/maps/server/index.js:418 | | keep |
++| GET | /api/tools | apps/audio/server/index.js:180 | | keep |
++| GET | /api/tools | apps/docs/server/index.js:209 | | keep |
++| GET | /api/tools | apps/img/server/index.js:205 | | keep |
++| POST | /api/v1/jobs | apps/_shared/jobs/http.js:147 | | keep |
| DELETE | /api/v1/jobs/:id | apps/_shared/jobs/http.js:194 | | keep |
| GET | /api/v1/jobs/:id | apps/_shared/jobs/http.js:188 | | keep |
| GET | /api/v1/jobs/:id/events | apps/_shared/jobs/http.js:238 | | keep |
@@@ -1166,61 +1156,80 @@ Owner = the repository whose code answers the route; target = the authority it b
| DELETE | /api/v1/jobs/:id/references/:ref | apps/_shared/jobs/http.js:236 | | keep |
| PUT | /api/v1/jobs/:id/references/:ref | apps/_shared/jobs/http.js:235 | | keep |
| POST | /api/v1/jobs/:id/retry | apps/_shared/jobs/http.js:204 | | keep |
--| GET | /api/weather | apps/maps/server/index.js:372 | | keep |
++| GET | /api/weather | apps/maps/server/index.js:402 | | keep |
| GET | /auth/fedcm/callback | apps/gateway/server/auth/routes.js:331 | | keep |
| POST | /auth/fedcm/fedcm | apps/gateway/server/auth/routes.js:381 | | keep |
| GET | /auth/fedcm/login | apps/gateway/server/auth/routes.js:303 | | keep |
| GET | /auth/fedcm/logout | apps/gateway/server/auth/routes.js:431 | | keep |
| GET | /auth/fedcm/me | apps/gateway/server/auth/routes.js:458 | | keep |
| POST | /auth/fedcm/refresh | apps/gateway/server/auth/routes.js:469 | | keep |
--| GET | /js/ov-jobs.js | apps/_shared/jobs/http.js:143 | | keep |
++| GET | /blacklist/:target? | apps/gateway/server/net/routes.js:952 | | keep |
++| GET | /dns/:target? | apps/gateway/server/net/routes.js:434 | | keep |
++| GET | /dnsprop/:target? | apps/gateway/server/net/routes.js:953 | | keep |
++| GET | /headers/:target? | apps/gateway/server/net/routes.js:627 | | keep |
++| GET | /ip/:target? | apps/gateway/server/net/routes.js:298 | | keep |
++| GET | /ipv4/:target? | apps/gateway/server/net/routes.js:350 | | keep |
++| GET | /ipv6/:target? | apps/gateway/server/net/routes.js:395 | | keep |
++| GET | /js/ov-jobs.js | apps/_shared/jobs/http.js:120 | | keep |
| GET | /llms.txt | apps/gateway/server/pages/site.js:263 | | keep |
--| GET | /openvibe-sw.js | apps/gateway/server/index.js:321 | | keep |
--| GET | /release.json | apps/audio/server/index.js:64 | | keep |
--| GET | /release.json | apps/docs/server/index.js:61 | | keep |
--| GET | /release.json | apps/food/server/index.js:44 | | keep |
--| GET | /release.json | apps/gateway/server/index.js:74 | | keep |
--| GET | /release.json | apps/img/server/index.js:61 | | keep |
--| GET | /release.json | apps/maps/server/index.js:45 | | keep |
--| GET | /release.json | apps/text/server/index.js:37 | | keep |
--| GET | /release.json | apps/yt/server/index.js:53 | | keep |
++| GET | /lookup/:target? | apps/gateway/server/net/routes.js:802 | | keep |
++| GET | /myip | apps/gateway/server/net/routes.js:293 | | keep |
++| GET | /opengraph | apps/gateway/server/dev/routes.js:87 | | keep |
++| GET | /openvibe-sw.js | apps/gateway/server/index.js:407 | | keep |
++| GET | /ping/:target? | apps/gateway/server/net/routes.js:765 | | keep |
++| GET | /port/:target? | apps/gateway/server/net/routes.js:736 | | keep |
++| GET | /rdap/:target? | apps/gateway/server/net/routes.js:515 | | keep |
++| GET | /rdns/:target? | apps/gateway/server/net/routes.js:487 | | keep |
++| GET | /redirects/:target? | apps/gateway/server/net/routes.js:673 | | keep |
| GET | /robots.txt | apps/gateway/server/pages/site.js:262 | | keep |
++| GET | /robots/:target? | apps/gateway/server/net/routes.js:948 | | keep |
| GET | /search | apps/gateway/server/pages/site.js:259 | | keep |
| GET | /sitemap.xml | apps/gateway/server/pages/site.js:261 | | keep |
--| GET | /sitemap.xml | apps/text/server/index.js:203 | | keep |
++| GET | /sitemap.xml | apps/text/server/index.js:146 | | keep |
++| GET | /sitemap/:target? | apps/gateway/server/net/routes.js:949 | | keep |
++| GET | /smtp/:target? | apps/gateway/server/net/routes.js:951 | | keep |
++| GET | /ssl/:target? | apps/gateway/server/net/routes.js:560 | | keep |
| GET | /tool/:id | apps/gateway/server/pages/site.js:260 | | keep |
--| GET | /tos | apps/gateway/server/index.js:281 | | keep |
++| GET | /tools | apps/gateway/server/dev/routes.js:75 | | keep |
++| GET | /tools | apps/gateway/server/net/routes.js:283 | | keep |
++| GET | /tos | apps/gateway/server/index.js:367 | | keep |
++| GET | /uptime/:target? | apps/gateway/server/net/routes.js:950 | | keep |
++| POST | /webhook/bins | apps/gateway/server/dev/routes.js:165 | | keep |
++| DELETE | /webhook/bins/:binId | apps/gateway/server/dev/routes.js:239 | | keep |
++| GET | /webhook/bins/:binId | apps/gateway/server/dev/routes.js:193 | | keep |
++| ALL | /webhook/bins/:binId/in | apps/gateway/server/dev/routes.js:208 | | keep |
++| GET | /whois/:target? | apps/gateway/server/net/routes.js:549 | | keep |
## OpenVibe.Community
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
--| GET | / | server/app.js:202 | | keep |
++| GET | / | server/app.js:205 | | keep |
| GET | /api/health | server/app.js:172 | | keep |
--| GET | /api/pastes | server/pastes/api.js:102 | | keep |
--| POST | /api/pastes | server/pastes/api.js:106 | | keep |
--| DELETE | /api/pastes/:slug | server/pastes/api.js:124 | | keep |
--| GET | /api/pastes/:slug | server/pastes/api.js:122 | | keep |
--| PUT | /api/pastes/:slug | server/pastes/api.js:123 | | keep |
--| POST | /api/pastes/:slug/ai | server/pastes/api.js:127 | | keep |
--| POST | /api/pastes/:slug/censor | server/pastes/api.js:126 | | keep |
--| GET | /api/pastes/:slug/comments | server/pastes/api.js:136 | | keep |
--| POST | /api/pastes/:slug/comments | server/pastes/api.js:137 | | keep |
--| DELETE | /api/pastes/:slug/comments/:commentId | server/pastes/api.js:140 | | keep |
--| POST | /api/pastes/:slug/copy | server/pastes/api.js:134 | | keep |
--| POST | /api/pastes/:slug/fork | server/pastes/api.js:132 | | keep |
--| POST | /api/pastes/:slug/like | server/pastes/api.js:133 | | keep |
--| GET | /api/pastes/:slug/raw | server/pastes/api.js:129 | | keep |
--| POST | /api/pastes/:slug/set-avatar | server/pastes/api.js:143 | | keep |
--| GET | /api/pastes/:slug/versions | server/pastes/api.js:130 | | keep |
--| DELETE | /api/pastes/admin/forks | server/pastes/api.js:113 | | keep |
--| GET | /api/pastes/admin/forks | server/pastes/api.js:112 | | keep |
--| GET | /api/pastes/admin/stats | server/pastes/api.js:111 | | keep |
--| POST | /api/pastes/bulk | server/pastes/api.js:114 | | keep |
--| GET | /api/pastes/by-user/:username | server/pastes/api.js:119 | | keep |
--| GET | /api/pastes/config | server/pastes/api.js:109 | | keep |
--| POST | /api/pastes/screenshot | server/pastes/api.js:116 | | keep |
--| GET | /api/ready | server/app.js:177 | | keep |
++| GET | /api/pastes | server/pastes/api.js:105 | | keep |
++| POST | /api/pastes | server/pastes/api.js:109 | | keep |
++| DELETE | /api/pastes/:slug | server/pastes/api.js:127 | | keep |
++| GET | /api/pastes/:slug | server/pastes/api.js:125 | | keep |
++| PUT | /api/pastes/:slug | server/pastes/api.js:126 | | keep |
++| POST | /api/pastes/:slug/ai | server/pastes/api.js:130 | | keep |
++| POST | /api/pastes/:slug/censor | server/pastes/api.js:129 | | keep |
++| GET | /api/pastes/:slug/comments | server/pastes/api.js:139 | | keep |
++| POST | /api/pastes/:slug/comments | server/pastes/api.js:140 | | keep |
++| DELETE | /api/pastes/:slug/comments/:commentId | server/pastes/api.js:143 | | keep |
++| POST | /api/pastes/:slug/copy | server/pastes/api.js:137 | | keep |
++| POST | /api/pastes/:slug/fork | server/pastes/api.js:135 | | keep |
++| POST | /api/pastes/:slug/like | server/pastes/api.js:136 | | keep |
++| GET | /api/pastes/:slug/raw | server/pastes/api.js:132 | | keep |
++| POST | /api/pastes/:slug/set-avatar | server/pastes/api.js:146 | | keep |
++| GET | /api/pastes/:slug/versions | server/pastes/api.js:133 | | keep |
++| DELETE | /api/pastes/admin/forks | server/pastes/api.js:116 | | keep |
++| GET | /api/pastes/admin/forks | server/pastes/api.js:115 | | keep |
++| GET | /api/pastes/admin/stats | server/pastes/api.js:114 | | keep |
++| POST | /api/pastes/bulk | server/pastes/api.js:117 | | keep |
++| GET | /api/pastes/by-user/:username | server/pastes/api.js:122 | | keep |
++| GET | /api/pastes/config | server/pastes/api.js:112 | | keep |
++| POST | /api/pastes/screenshot | server/pastes/api.js:119 | | keep |
++| GET | /api/ready | server/app.js:179 | | keep |
| DELETE | /api/v1/comments/:commentId | server/comments/api.js:45 | | keep |
| GET | /api/v1/comments/:commentId | server/comments/api.js:43 | | keep |
| PATCH | /api/v1/comments/:commentId | server/comments/api.js:44 | | keep |
@@@ -1269,25 +1278,25 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /c/:accessId | server/comments/routes.js:50 | | keep |
| GET | /callback | server/auth/routes.js:289 | | keep |
| POST | /fedcm | server/auth/routes.js:335 | | keep |
--| GET | /feed.xml | server/app.js:194 | | keep |
++| GET | /feed.xml | server/app.js:197 | | keep |
++| GET | /llms.txt | server/app.js:195 | | keep |
| GET | /login | server/auth/routes.js:267 | | keep |
| GET | /logout | server/auth/routes.js:363 | | keep |
| GET | /me | server/auth/routes.js:387 | | keep |
--| GET | /my | server/app.js:319 | | keep |
--| GET | /new | server/app.js:270 | | keep |
--| POST | /new | server/app.js:281 | | keep |
--| GET | /p/:slug | server/app.js:215 | | keep |
--| GET | /p/:slug/download | server/app.js:258 | | keep |
--| GET | /p/:slug/raw | server/app.js:234 | | keep |
--| GET | /p/:slug/raw | server/app.js:254 | | keep |
--| GET | /p/:slug/screenshot | server/app.js:247 | | keep |
--| GET | /p/:slug/screenshot | server/app.js:255 | | keep |
--| GET | /pastes | server/app.js:207 | | keep |
--| GET | /pastes/:slug | server/app.js:213 | | keep |
--| GET | /pulse | server/app.js:311 | | keep |
++| GET | /my | server/app.js:322 | | keep |
++| GET | /new | server/app.js:273 | | keep |
++| POST | /new | server/app.js:284 | | keep |
++| GET | /p/:slug | server/app.js:218 | | keep |
++| GET | /p/:slug/download | server/app.js:261 | | keep |
++| GET | /p/:slug/raw | server/app.js:237 | | keep |
++| GET | /p/:slug/raw | server/app.js:257 | | keep |
++| GET | /p/:slug/screenshot | server/app.js:250 | | keep |
++| GET | /p/:slug/screenshot | server/app.js:258 | | keep |
++| GET | /pastes | server/app.js:210 | | keep |
++| GET | /pastes/:slug | server/app.js:216 | | keep |
++| GET | /pulse | server/app.js:314 | | keep |
| POST | /refresh | server/auth/routes.js:397 | | keep |
--| GET | /release.json | server/app.js:173 | | keep |
--| GET | /robots.txt | server/app.js:192 | | keep |
++| GET | /robots.txt | server/app.js:194 | | keep |
| GET | /s | server/forum/routes.js:51 | | keep |
| GET | /s/:space | server/forum/routes.js:65 | | keep |
| GET | /s/:space/feed.xml | server/forum/routes.js:59 | | keep |
@@@ -1300,42 +1309,50 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /s/:space/t/:slug/state | server/forum/routes.js:142 | | keep |
| POST | /s/:space/t/:slug/vote | server/forum/routes.js:126 | | keep |
| GET | /s/feed.xml | server/forum/routes.js:55 | | keep |
--| GET | /sitemap.xml | server/app.js:193 | | keep |
++| GET | /sitemap.xml | server/app.js:196 | | keep |
| GET | /tos | server/app.js:109 | | keep |
## OpenVibe.Games
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
--| ANY | / | apps/server/src/net/httpServer.ts:628 | | keep |
--| ANY | /api/characters | apps/server/src/net/httpServer.ts:313 | | keep |
--| POST | /api/map | apps/server/src/net/httpServer.ts:161 | | keep |
--| POST | /api/map-assets | apps/server/src/net/httpServer.ts:231 | | keep |
--| POST | /api/texture | apps/server/src/net/httpServer.ts:231 | | keep |
--| ANY | /auth/* | apps/server/src/net/httpServer.ts:333 | | keep |
--| ANY | /auth/callback | apps/server/src/net/httpServer.ts:399 | | keep |
--| ANY | /auth/fedcm | apps/server/src/net/httpServer.ts:485 | | keep |
--| ANY | /auth/login | apps/server/src/net/httpServer.ts:348 | | keep |
--| ANY | /auth/logout | apps/server/src/net/httpServer.ts:561 | | keep |
--| ANY | /auth/me | apps/server/src/net/httpServer.ts:578 | | keep |
--| ANY | /editor | apps/server/src/net/httpServer.ts:632 | | keep |
--| ANY | /editor.html | apps/server/src/net/httpServer.ts:615 | | keep |
--| ANY | /healthz | apps/server/src/net/httpServer.ts:596 | | keep |
--| ANY | /map-assets/* | apps/server/src/net/httpServer.ts:287 | | keep |
--| ANY | /map.json | apps/server/src/net/httpServer.ts:148 | | keep |
--| ANY | /metrics | apps/server/src/net/httpServer.ts:601 | | keep |
--| ANY | /play | apps/server/src/net/httpServer.ts:622 | | keep |
--| ANY | /play | apps/server/src/net/httpServer.ts:630 | | keep |
--| ANY | /play.html | apps/server/src/net/httpServer.ts:615 | | keep |
--| ANY | /play.html | apps/server/src/net/httpServer.ts:617 | | keep |
++| ANY | / | apps/server/src/net/httpServer.ts:661 | | keep |
++| ANY | /api | apps/server/src/net/httpServer.ts:623 | | keep |
++| ANY | /api/* | apps/server/src/net/httpServer.ts:623 | | keep |
++| ANY | /api/characters | apps/server/src/net/httpServer.ts:329 | | keep |
++| POST | /api/map | apps/server/src/net/httpServer.ts:177 | | keep |
++| POST | /api/map-assets | apps/server/src/net/httpServer.ts:247 | | keep |
++| POST | /api/texture | apps/server/src/net/httpServer.ts:247 | | keep |
++| ANY | /auth/* | apps/server/src/net/httpServer.ts:349 | | keep |
++| ANY | /auth/callback | apps/server/src/net/httpServer.ts:415 | | keep |
++| ANY | /auth/fedcm | apps/server/src/net/httpServer.ts:501 | | keep |
++| ANY | /auth/login | apps/server/src/net/httpServer.ts:364 | | keep |
++| ANY | /auth/logout | apps/server/src/net/httpServer.ts:577 | | keep |
++| ANY | /auth/me | apps/server/src/net/httpServer.ts:594 | | keep |
++| ANY | /canvas | apps/server/src/net/httpServer.ts:655 | | keep |
++| ANY | /editor | apps/server/src/net/httpServer.ts:667 | | keep |
++| ANY | /editor.html | apps/server/src/net/httpServer.ts:635 | | keep |
++| ANY | /editor/ | apps/server/src/net/httpServer.ts:647 | | keep |
++| ANY | /game | apps/server/src/net/httpServer.ts:655 | | keep |
++| ANY | /game | apps/server/src/net/httpServer.ts:656 | | keep |
++| ANY | /healthz | apps/server/src/net/httpServer.ts:612 | | keep |
++| ANY | /map-assets/* | apps/server/src/net/httpServer.ts:303 | | keep |
++| ANY | /map.json | apps/server/src/net/httpServer.ts:164 | | keep |
++| ANY | /metrics | apps/server/src/net/httpServer.ts:617 | | keep |
++| ANY | /play | apps/server/src/net/httpServer.ts:642 | | keep |
++| ANY | /play | apps/server/src/net/httpServer.ts:665 | | keep |
++| ANY | /play.html | apps/server/src/net/httpServer.ts:635 | | keep |
++| ANY | /play.html | apps/server/src/net/httpServer.ts:637 | | keep |
++| ANY | /play/ | apps/server/src/net/httpServer.ts:642 | | keep |
++| ANY | /play/ | apps/server/src/net/httpServer.ts:647 | | keep |
## OpenVibe.Events
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
--| GET | / | server/app.js:72 | | keep |
--| GET | /api/health | server/app.js:35 | | keep |
--| GET | /api/ready | server/app.js:66 | | keep |
++| GET | / | server/app.js:73 | | keep |
++| GET | /api/health | server/app.js:36 | | keep |
++| GET | /api/ready | server/app.js:67 | | keep |
| GET | /api/v1/checkpoints | server/api/read.js:94 | | keep |
| PUT | /api/v1/checkpoints | server/api/read.js:103 | | keep |
| GET | /api/v1/deliveries | server/api/read.js:114 | | keep |
@@@ -1346,10 +1363,10 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/v1/subscriptions | server/api/subscriptions.js:133 | | keep |
| POST | /api/v1/subscriptions | server/api/subscriptions.js:74 | | keep |
| GET | /api/v1/subscriptions/:id | server/api/subscriptions.js:137 | | keep |
--| POST | /api/v1/subscriptions/:id/${action} | server/api/subscriptions.js:143 | | keep |
++| POST | /api/v1/subscriptions/:id/${action} | server/api/subscriptions.js:162 | | keep |
++| POST | /api/v1/subscriptions/:id/rotate-secret | server/api/subscriptions.js:145 | | keep |
| POST | /internal/events | lib/client.js:18 | | keep |
--| GET | /realtime/stream | server/app.js:31 | | keep |
--| GET | /release.json | server/app.js:23 | | keep |
++| GET | /realtime/stream | server/app.js:32 | | keep |
## OpenVibe.Chat
@@@ -1414,9 +1431,9 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/tts/queue/skip | server/chat/tts-routes.js:225 | | keep |
| GET | /api/tts/settings | server/chat/tts-routes.js:90 | | keep |
| GET | /api/tts/voices | server/chat/tts-routes.js:80 | | keep |
--| POST | /calls | server/bridge/live-bridge.js:220 | | keep |
++| POST | /calls | server/bridge/live-bridge.js:218 | | keep |
| GET | /health | server/app.js:80 | | keep |
--| GET | /presence | server/bridge/live-bridge.js:242 | | keep |
++| GET | /presence | server/bridge/live-bridge.js:240 | | keep |
| GET | /ready | server/app.js:97 | | keep |
## OpenRe.Stream
@@@ -1583,7 +1600,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /receipts/erase | server/web/routes.js:102 | | keep |
| POST | /receipts/erase | server/web/routes.js:106 | | keep |
| GET | /receipts/export | server/web/routes.js:89 | | keep |
--| GET | /release.json | server/app.js:85 | | keep |
| GET | /robots.txt | server/web/routes.js:69 | | keep |
| GET | /sitemap.xml | server/web/routes.js:71 | | keep |
@@@ -1632,7 +1648,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /embed/:username/widget | server/web/embeds.js:113 | | keep |
| POST | /events | server/events/consumer.js:75 | | keep |
| GET | /me | server/web/routes.js:86 | | keep |
--| GET | /release.json | server/app.js:89 | | keep |
| GET | /robots.txt | server/web/routes.js:74 | | keep |
| GET | /sitemap.xml | server/web/routes.js:75 | | keep |
@@@ -1640,7 +1655,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
--| GET | / | server/app.js:44 | | keep |
++| GET | / | server/app.js:45 | | keep |
| GET | /api/health | server/app.js:31 | | keep |
| GET | /api/ready | server/app.js:38 | | keep |
| POST | /api/v1/${op} | server/api/runs.js:120 | | keep |
@@@ -1672,7 +1687,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/v1/runs/:id/retry | server/api/runs.js:88 | | keep |
| GET | /api/v1/status | server/api/admin.js:37 | | keep |
| GET | /api/v1/usage | server/api/admin.js:121 | | keep |
--| GET | /release.json | server/app.js:39 | | keep |
## OpenVibe.Search
@@@ -1696,14 +1710,13 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/v1/search | server/api/query.js:194 | | keep |
| GET | /api/v1/suggest | server/api/query.js:206 | | keep |
| POST | /internal/events | server/api/webhook.js:126 | | keep |
--| GET | /release.json | server/app.js:45 | | keep |
| GET | /robots.txt | server/web/page.js:120 | | keep |
## OpenVibe.Sources
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
--| GET | / | server/app.js:98 | | keep |
++| GET | / | server/app.js:99 | | keep |
| GET | /api/health | server/app.js:82 | | keep |
| GET | /api/ready | server/app.js:89 | | keep |
| GET | /api/v1/health | server/api/sources.js:78 | | keep |
@@@ -1719,7 +1732,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/v1/sources/:key/fetch | server/api/sources.js:115 | | keep |
| POST | /api/v1/sources/:key/items | server/api/items.js:82 | | keep |
| GET | /api/v1/sources/:key/runs | server/api/sources.js:59 | | keep |
--| GET | /release.json | server/app.js:90 | | keep |
## OpenVibe.Wiki
@@@ -1727,7 +1739,7 @@ Owner = the repository whose code answers the route; target = the authority it b
|---|---|---|---|---|
| GET | / | server/http/pages.js:96 | | keep |
| GET | /api/health | server/app.js:61 | | keep |
--| GET | /api/ready | server/app.js:75 | | keep |
++| GET | /api/ready | server/app.js:76 | | keep |
| DELETE | /api/v1/pages/:id | server/http/api.js:164 | | keep |
| GET | /api/v1/pages/:id | server/http/api.js:144 | | keep |
| PATCH | /api/v1/pages/:id | server/http/api.js:156 | | keep |
@@@ -1771,7 +1783,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /new-space | server/http/pages.js:115 | | keep |
| POST | /proposals/:id | server/http/pages.js:243 | | keep |
| GET | /recent | server/http/pages.js:104 | | keep |
--| GET | /release.json | server/app.js:62 | | keep |
| GET | /robots.txt | server/http/machine.js:24 | | keep |
| GET | /s/:space | server/http/pages.js:127 | | keep |
| GET | /s/:space/import | server/http/pages.js:211 | | keep |
@@@ -1781,7 +1792,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /s/:space/proposals | server/http/pages.js:236 | | keep |
| GET | /s/:space/settings | server/http/pages.js:179 | | keep |
| POST | /s/:space/settings | server/http/pages.js:186 | | keep |
--| GET | /search | server/app.js:94 | | keep |
++| GET | /search | server/app.js:95 | | keep |
| GET | /search | server/http/pages.js:105 | | keep |
| GET | /sitemap.xml | server/http/machine.js:46 | | keep |
| GET | /sitemaps/pages-:n.xml | server/http/machine.js:53 | | keep |
@@@ -1817,7 +1828,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /@:handle/tags/:tag | server/http/public.js:176 | | keep |
| GET | /${file} | server/http/public.js:143 | | keep |
| GET | /api/health | server/app.js:107 | | keep |
--| GET | /api/ready | server/app.js:110 | | keep |
++| GET | /api/ready | server/app.js:111 | | keep |
| POST | /api/v1/blogs | server/http/api.js:127 | | keep |
| GET | /api/v1/blogs/:handle | server/http/api.js:122 | | keep |
| PATCH | /api/v1/blogs/:handle | server/http/api.js:134 | | keep |
@@@ -1841,7 +1852,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /auth/refresh | server/auth/sso.js:390 | | keep |
| GET | /authors/:who | server/http/public.js:223 | | keep |
| GET | /llms.txt | server/http/discovery.js:49 | | keep |
--| GET | /release.json | server/app.js:108 | | keep |
| GET | /robots.txt | server/http/discovery.js:39 | | keep |
| GET | /sitemap.xml | server/http/discovery.js:69 | | keep |
| GET | /sitemaps/blogs.xml | server/http/discovery.js:83 | | keep |
@@@ -1870,7 +1880,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | / | server/http/public.js:90 | | keep |
| GET | /${f.file} | server/http/public.js:122 | | keep |
| GET | /api/health | server/app.js:106 | | keep |
--| GET | /api/ready | server/app.js:109 | | keep |
++| GET | /api/ready | server/app.js:110 | | keep |
| GET | /api/v1/clusters | server/http/api.js:219 | | keep |
| GET | /api/v1/clusters/:id | server/http/api.js:224 | | keep |
| POST | /api/v1/clusters/:id/merge | server/http/api.js:235 | | keep |
@@@ -1908,7 +1918,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /edit/topics | server/http/editor.js:91 | | keep |
| POST | /internal/events | server/http/webhook.js:29 | | keep |
| GET | /llms.txt | server/http/discovery.js:47 | | keep |
--| GET | /release.json | server/app.js:107 | | keep |
| GET | /robots.txt | server/http/discovery.js:35 | | keep |
| GET | /sitemap.xml | server/http/discovery.js:67 | | keep |
| GET | /sitemaps/stories.xml | server/http/discovery.js:76 | | keep |
@@@ -1926,7 +1935,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | / | server/http/pages.js:139 | | keep |
| GET | /about | server/http/pages.js:146 | | keep |
| GET | /api/health | server/app.js:80 | | keep |
--| GET | /api/ready | server/app.js:99 | | keep |
++| GET | /api/ready | server/app.js:100 | | keep |
| GET | /api/v1/corrections | server/http/api.js:152 | | keep |
| PATCH | /api/v1/corrections/:id | server/http/api.js:156 | | keep |
| GET | /api/v1/entities | server/http/api.js:71 | | keep |
@@@ -1965,7 +1974,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /e/:slug | server/http/pages.js:172 | | keep |
| GET | /e/:slug.json | server/http/pages.js:152 | | keep |
| GET | /e/:slug/correct | server/http/pages.js:200 | | keep |
--| POST | /e/:slug/correct | server/app.js:113 | | keep |
++| POST | /e/:slug/correct | server/app.js:114 | | keep |
| POST | /e/:slug/correct | server/http/pages.js:206 | | keep |
| POST | /e/:slug/discuss | server/http/pages.js:220 | | keep |
| GET | /e/:slug/edit | server/http/pages.js:281 | | keep |
@@@ -1987,7 +1996,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /feed.atom | server/http/machine.js:66 | | keep |
| GET | /feed.json | server/http/machine.js:71 | | keep |
| GET | /llms.txt | server/http/machine.js:75 | | keep |
--| GET | /release.json | server/app.js:81 | | keep |
| GET | /robots.txt | server/http/machine.js:23 | | keep |
| GET | /search | server/http/pages.js:147 | | keep |
| GET | /sitemap.xml | server/http/machine.js:34 | | keep |
@@@ -2000,7 +2008,7 @@ Owner = the repository whose code answers the route; target = the authority it b
|---|---|---|---|---|
| GET | / | server/http/pages.js:130 | | keep |
| GET | /api/health | server/app.js:113 | | keep |
--| GET | /api/ready | server/app.js:116 | | keep |
++| GET | /api/ready | server/app.js:117 | | keep |
| GET | /api/v1/flags | server/http/api.js:144 | | keep |
| POST | /api/v1/flags/:id/resolve | server/http/api.js:150 | | keep |
| GET | /api/v1/offers | server/http/api.js:65 | | keep |
@@@ -2044,7 +2052,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /mod/offers/:slug/:action | server/http/pages.js:372 | | keep |
| GET | /new | server/http/pages.js:131 | | keep |
| GET | /p/:slug | server/http/pages.js:244 | | keep |
--| GET | /release.json | server/app.js:114 | | keep |
| GET | /robots.txt | server/http/discovery.js:39 | | keep |
| GET | /s/:domain | server/http/pages.js:267 | | keep |
| GET | /search | server/http/pages.js:285 | | keep |
@@@ -2064,7 +2071,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | / | server/http/public.js:97 | | keep |
| GET | /about | server/http/public.js:110 | | keep |
| GET | /api/health | server/app.js:97 | | keep |
--| GET | /api/ready | server/app.js:100 | | keep |
++| GET | /api/ready | server/app.js:101 | | keep |
| GET | /api/v1/coupons/:id | server/http/api.js:143 | | keep |
| POST | /api/v1/coupons/:id/report | server/http/api.js:152 | | keep |
| POST | /api/v1/coupons/:id/status | server/http/api.js:176 | | keep |
@@@ -2095,7 +2102,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /m/:slug.json | server/http/public.js:132 | | keep |
| GET | /m/:slug/feed.xml | server/http/discovery.js:120 | | keep |
| POST | /m/:slug/watch | server/http/public.js:163 | | keep |
--| GET | /release.json | server/app.js:98 | | keep |
| GET | /robots.txt | server/http/discovery.js:39 | | keep |
| GET | /sitemap.xml | server/http/discovery.js:70 | | keep |
| GET | /sitemaps/coupons.xml | server/http/discovery.js:79 | | keep |
@@@ -2126,7 +2132,7 @@ Owner = the repository whose code answers the route; target = the authority it b
|---|---|---|---|---|
| GET | / | server/http/pages.js:57 | | keep |
| GET | /api/health | server/app.js:97 | | keep |
--| GET | /api/ready | server/app.js:100 | | keep |
++| GET | /api/ready | server/app.js:101 | | keep |
| GET | /api/v1/apps/:app/releases | server/http/api.js:65 | | keep |
| POST | /api/v1/apps/:app/releases | server/http/api.js:107 | | keep |
| GET | /api/v1/apps/:app/trust | server/http/api.js:70 | | keep |
@@@ -2137,16 +2143,16 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /apps/:app | server/http/pages.js:177 | | keep |
| GET | /callback | server/auth/sso.js:182 | | keep |
| GET | /docs | server/http/docs.js:32 | | keep |
--| GET | /docs/adr/:id | server/http/docs.js:216 | | keep |
++| GET | /docs/adr/:id | server/http/docs.js:218 | | keep |
| GET | /docs/capabilities | server/http/docs.js:109 | | keep |
| GET | /docs/capabilities/:id | server/http/docs.js:128 | | keep |
| GET | /docs/contracts | server/http/docs.js:56 | | keep |
| GET | /docs/contracts/:id | server/http/docs.js:75 | | keep |
| GET | /docs/contracts/:id.json | server/http/docs.js:69 | | keep |
--| GET | /docs/events | server/http/docs.js:151 | | keep |
--| GET | /docs/sdk | server/http/docs.js:191 | | keep |
--| GET | /docs/sdk/:module | server/http/docs.js:203 | | keep |
--| GET | /docs/services | server/http/docs.js:162 | | keep |
++| GET | /docs/events | server/http/docs.js:153 | | keep |
++| GET | /docs/sdk | server/http/docs.js:193 | | keep |
++| GET | /docs/sdk/:module | server/http/docs.js:205 | | keep |
++| GET | /docs/services | server/http/docs.js:164 | | keep |
| GET | /login | server/auth/sso.js:173 | | keep |
| ALL | /logout | server/auth/sso.js:228 | | keep |
| GET | /logout | server/auth/sso.js:219 | | keep |
@@@ -2186,7 +2192,6 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /projects/:project/members | server/http/portal.js:209 | | keep |
| POST | /projects/:project/members/:subject/remove | server/http/portal.js:219 | | keep |
| POST | /projects/:project/members/:subject/role | server/http/portal.js:214 | | keep |
--| GET | /release.json | server/app.js:98 | | keep |
| GET | /releases | server/http/portal.js:109 | | keep |
| POST | /releases | server/http/portal.js:110 | | keep |
| GET | /releases/:id | server/http/pages.js:197 | | keep |
@@@ -2226,7 +2231,7 @@ Owner = the repository whose code answers the route; target = the authority it b
|---|---|---|---|---|
| GET | / | server/http/dashboard.js:64 | | keep |
| GET | /api/health | server/app.js:130 | | keep |
--| GET | /api/ready | server/app.js:133 | | keep |
++| GET | /api/ready | server/app.js:134 | | keep |
| DELETE | /api/v1/deploys/:id | server/http/api.js:191 | | keep |
| GET | /api/v1/deploys/:id | server/http/api.js:173 | | keep |
| POST | /api/v1/deploys/:id/activate | server/http/api.js:181 | | keep |
@@@ -2265,16 +2270,15 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /deploys/:id/delete | server/http/dashboard.js:148 | | keep |
| POST | /domains/:id/delete | server/http/dashboard.js:157 | | keep |
| POST | /domains/:id/verify | server/http/dashboard.js:153 | | keep |
--| GET | /metrics | server/app.js:134 | | keep |
++| GET | /metrics | server/app.js:135 | | keep |
| POST | /projects | server/http/dashboard.js:100 | | keep |
| GET | /projects/:id | server/http/dashboard.js:71 | | keep |
| POST | /projects/:id/delete | server/http/dashboard.js:122 | | keep |
| POST | /projects/:id/members | server/http/dashboard.js:110 | | keep |
| POST | /projects/:id/members/remove | server/http/dashboard.js:116 | | keep |
| POST | /projects/:id/sites | server/http/dashboard.js:104 | | keep |
--| GET | /release.json | server/app.js:131 | | keep |
--| GET | /robots.txt | server/app.js:138 | | keep |
--| GET | /sitemap.xml | server/app.js:140 | | keep |
++| GET | /robots.txt | server/app.js:139 | | keep |
++| GET | /sitemap.xml | server/app.js:141 | | keep |
| GET | /sites/:id | server/http/dashboard.js:81 | | keep |
| POST | /sites/:id/delete | server/http/dashboard.js:137 | | keep |
| POST | /sites/:id/deploys | server/http/dashboard.js:164 | | keep |
ddiff --git a/docs/roadmap-baseline/04-cross-service.md b/docs/roadmap-baseline/04-cross-service.md
iindex ac6da70e..018c0bb8 100644
---- a/docs/roadmap-baseline/04-cross-service.md
++++ b/docs/roadmap-baseline/04-cross-service.md
@@@ -40,13 +40,13 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| OpenVibe.Network | OpenVibe.Tools | 4 | bearer, internal-key, none-detected |
| OpenVibe.News | OpenVibe.Network | 2 | internal-key, oauth-client |
| OpenVibe.Shared | OpenVibe.Network | 4 | bearer, internal-key, oauth-client |
--| OpenVibe.Sites | OpenVibe.Network | 1 | bearer |
++| OpenVibe.Sites | OpenVibe.Network | 2 | bearer, none-detected |
| OpenVibe.Tips | OpenVibe.Network | 1 | internal-key, oauth-client |
| OpenVibe.Tools | OpenVibe.Community | 1 | bearer, internal-key |
| OpenVibe.Tools | OpenVibe.Events | 1 | oauth-client, service-token |
| OpenVibe.Tools | OpenVibe.Live | 1 | bearer, internal-key |
| OpenVibe.Tools | OpenVibe.Media | 1 | oauth-client, service-token |
--| OpenVibe.Tools | OpenVibe.Network | 10 | bearer, internal-key, none-detected, oauth-client, service-token |
++| OpenVibe.Tools | OpenVibe.Network | 9 | bearer, internal-key, none-detected, oauth-client, service-token |
| OpenVibe.Tools | OpenVibe.Search | 1 | none-detected |
| OpenVibe.Trade | OpenVibe.Network | 2 | internal-key, oauth-client |
| OpenVibe.VIP | OpenVibe.Network | 1 | internal-key, oauth-client |
@@@ -74,22 +74,22 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Coupons/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Deals/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Deals/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
--| Games/apps/server/src/net/httpServer.ts:346 | OpenVibe.Network | /api/auth/me, /oauth/token | oauth-client | **no** | yes |
++| Games/apps/server/src/net/httpServer.ts:362 | OpenVibe.Network | /api/auth/me, /oauth/token | oauth-client | **no** | yes |
| Games/apps/server/src/net/networkAuth.ts:3 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Host/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Host/server/auth/sso.js:47 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Live/server/openre/openre-client.js:12 | OpenRe.Stream | :4500, OPENRE_URL | bearer, oauth-client, service-token | yes | no |
| Live/server/ai/ai-service.js:40 | OpenVibe.AI | OV_AI_INTERNAL_URL, :4700 | none-detected | yes | yes |
| Live/server/monetization/billing-client.js:28 | OpenVibe.Billing | OV_BILLING_INTERNAL_URL, :4600 | none-detected | yes | yes |
--| Live/server/integrations/robotstreamer-service.js:586 | OpenVibe.Chat | chatUrl | none-detected | yes | no |
++| Live/server/integrations/robotstreamer-service.js:568 | OpenVibe.Chat | chatUrl | none-detected | yes | no |
| Live/server/comments-client.js:29 | OpenVibe.Community | OV_COMMUNITY_INTERNAL_URL, :4200, OV_COMMUNITY_URL | none-detected | yes | yes |
--| Live/server/media-proxy/pastes.js:311 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | yes | yes |
++| Live/server/media-proxy/pastes.js:312 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | yes | yes |
| Live/server/pastes-client.js:16 | OpenVibe.Community | OV_COMMUNITY_INTERNAL_URL, :4200 | none-detected | yes | yes |
--| Live/server/seo/seo.js:432 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | **no** | no |
--| Live/server/config.js:175 | OpenVibe.Media | MEDIA_URL, :4100 | internal-key | yes | no |
++| Live/server/seo/seo.js:145 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | **no** | no |
++| Live/server/config.js:177 | OpenVibe.Media | MEDIA_URL, :4100 | internal-key | yes | no |
| Live/server/media-client.js:14 | OpenVibe.Media | :4100, MEDIA_URL, /api/v1/${ | api-key, bearer | yes | no |
| Live/server/chat/chat-server.js:84 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL | internal-key | **no** | no |
--| Live/server/config.js:21 | OpenVibe.Network | :4000, OV_NETWORK_URL | internal-key | yes | no |
++| Live/server/config.js:23 | OpenVibe.Network | :4000, OV_NETWORK_URL | internal-key | yes | no |
| Live/server/integrations/platform-oauth.js:52 | OpenVibe.Network | /oauth/token | bearer, hmac, oauth-client | **no** | yes |
| Live/server/integrations/powerchat-oauth.js:51 | OpenVibe.Network | /oauth/token | bearer, hmac, oauth-client | **no** | yes |
| Live/server/monetization/billing-client.js:112 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000 | none-detected | yes | yes |
@@@ -97,10 +97,10 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Live/server/openre/openre-client.js:27 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, networkInternalUrl, :4000, /oauth/token | bearer, oauth-client, service-token | yes | no |
| Live/server/pastes-client.js:39 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000 | none-detected | yes | yes |
| Live/server/streaming/golive-notify.js:62 | OpenVibe.Network | /internal/events | internal-key, oauth-client | **no** | no |
--| Live/server/streaming/restream-manager.js:1387 | OpenVibe.Network | /oauth/token | bearer, oauth-client, service-token | yes | yes |
++| Live/server/streaming/restream-manager.js:1383 | OpenVibe.Network | /oauth/token | bearer, oauth-client, service-token | yes | yes |
| Live/server/utils/notify.js:16 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications | internal-key | **no** | yes |
| Live/server/chat/routes.js:56 | OpenVibe.Search | searchUrl | none-detected | **no** | no |
--| Live/server/streaming/restream-manager.js:1639 | OpenVibe.Search | searchUrl | bearer, oauth-client, service-token | yes | yes |
++| Live/server/streaming/restream-manager.js:1635 | OpenVibe.Search | searchUrl | bearer, oauth-client, service-token | yes | yes |
| Live/server/integrations/discord-webhook.js:16 | webhook | webhook_url (per-app, configured in DB) | none-detected | **no** | no |
| Live/server/media-proxy/outcomes.js:78 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | no |
| Media/server/thumbnails/live-frame-service.js:170 | OpenVibe.Live | :3000 | none-detected | yes | yes |
@@@ -112,19 +112,19 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Network/server/chrome/service.js:32 | OpenVibe.AI | aiUrl, OV_AI_INTERNAL_URL, :4700 | internal-key, bearer, service-token | yes | no |
| Network/server/index.js:449 | OpenVibe.Events | eventsUrl, eventsInternalUrl | internal-key, bearer | **no** | no |
| Network/server/admin/analytics-routes.js:24 | OpenVibe.Games | :8000 | internal-key, bearer | yes | no |
--| Network/server/admin/routes.js:71 | OpenVibe.Games | games.internalUrl | internal-key | yes | no |
++| Network/server/admin/routes.js:72 | OpenVibe.Games | games.internalUrl | internal-key | yes | no |
| Network/server/index.js:236 | OpenVibe.Games | :8000, games.internalUrl | internal-key, bearer | **no** | no |
| Network/server/admin/analytics-routes.js:22 | OpenVibe.Live | :3000 | internal-key, bearer | yes | no |
--| Network/server/admin/routes.js:69 | OpenVibe.Live | live.internalUrl, OV_LIVE_INTERNAL_URL, :3000 | internal-key | yes | no |
--| Network/server/chrome/service.js:82 | OpenVibe.Live | :3000 | internal-key, bearer, service-token | yes | no |
++| Network/server/admin/routes.js:70 | OpenVibe.Live | live.internalUrl, OV_LIVE_INTERNAL_URL, :3000 | internal-key | yes | no |
++| Network/server/chrome/service.js:84 | OpenVibe.Live | :3000 | internal-key, bearer, service-token | yes | no |
| Network/server/index.js:232 | OpenVibe.Live | :3000, live.internalUrl, liveUrl | internal-key, bearer | **no** | no |
| Network/server/profile/avatar.js:64 | OpenVibe.Live | live.internalUrl, :3000 | internal-key | yes | no |
| Network/server/admin/analytics-routes.js:25 | OpenVibe.Media | :4100 | internal-key, bearer | yes | no |
--| Network/server/admin/routes.js:72 | OpenVibe.Media | media.internalUrl | internal-key | yes | no |
++| Network/server/admin/routes.js:73 | OpenVibe.Media | media.internalUrl | internal-key | yes | no |
| Network/server/index.js:235 | OpenVibe.Media | :4100, media.internalUrl | internal-key, bearer | **no** | no |
| Network/server/profile/avatar.js:72 | OpenVibe.Media | media.internalUrl, :4100 | internal-key | yes | no |
| Network/server/admin/analytics-routes.js:23 | OpenVibe.Tools | :4001 | internal-key, bearer | yes | no |
--| Network/server/admin/routes.js:70 | OpenVibe.Tools | tools.internalUrl | internal-key | yes | no |
++| Network/server/admin/routes.js:71 | OpenVibe.Tools | tools.internalUrl | internal-key | yes | no |
| Network/server/domains/catalog.js:17 | OpenVibe.Tools | OV_TOOLS_INTERNAL_URL, :4001 | none-detected | yes | no |
| Network/server/index.js:234 | OpenVibe.Tools | :4001, tools.internalUrl | internal-key, bearer | **no** | no |
| News/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
@@@ -133,20 +133,20 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Shared/navbar.js:10 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
++| Sites/build.js:100 | OpenVibe.Network | networkUrl | none-detected | **no** | no |
| Sites/OpenVibe.Shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Tips/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
--| Tools/apps/gateway/server/index.js:70 | OpenVibe.Community | communityUrl, OV_COMMUNITY_URL | internal-key, bearer | yes | no |
--| Tools/apps/_shared/jobs/index.js:87 | OpenVibe.Events | EVENTS_URL | oauth-client, service-token | yes | no |
--| Tools/apps/gateway/server/index.js:354 | OpenVibe.Live | liveUrl | internal-key, bearer | yes | no |
--| Tools/apps/_shared/jobs/index.js:14 | OpenVibe.Media | :4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL | oauth-client, service-token | yes | no |
--| Tools/apps/_shared/jobs/index.js:16 | OpenVibe.Network | :4000, OV_NETWORK_INTERNAL_URL, /oauth/token | oauth-client, service-token | yes | no |
--| Tools/apps/audio/server/auth.js:9 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl | none-detected | yes | yes |
--| Tools/apps/docs/server/auth.js:9 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl | none-detected | yes | yes |
++| Tools/apps/gateway/server/index.js:84 | OpenVibe.Community | communityUrl, OV_COMMUNITY_URL | internal-key, bearer | yes | yes |
++| Tools/apps/_shared/jobs/index.js:96 | OpenVibe.Events | EVENTS_URL | oauth-client, service-token | yes | no |
++| Tools/apps/gateway/server/index.js:443 | OpenVibe.Live | liveUrl | internal-key, bearer | yes | yes |
++| Tools/apps/_shared/jobs/index.js:18 | OpenVibe.Media | :4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL | oauth-client, service-token | yes | no |
++| Tools/apps/_shared/guard/tokens.js:25 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl | service-token | yes | yes |
++| Tools/apps/_shared/jobs/index.js:20 | OpenVibe.Network | :4000, OV_NETWORK_INTERNAL_URL, /oauth/token | oauth-client, service-token | yes | no |
++| Tools/apps/food/server/index.js:33 | OpenVibe.Network | OV_NETWORK_URL, OV_NETWORK_INTERNAL_URL, networkUrl, networkInternalUrl, :4000 | none-detected | yes | no |
| Tools/apps/gateway/server/auth/routes.js:53 | OpenVibe.Network | /oauth/token, /api/.well-known/jwks, networkUrl, networkInternalUrl | oauth-client | yes | yes |
--| Tools/apps/gateway/server/index.js:353 | OpenVibe.Network | networkUrl | internal-key, bearer | yes | no |
++| Tools/apps/gateway/server/index.js:61 | OpenVibe.Network | networkUrl | internal-key, bearer | yes | yes |
| Tools/apps/gateway/server/registry/services.js:28 | OpenVibe.Network | OV_NETWORK_URL, OV_NETWORK_INTERNAL_URL | none-detected | yes | no |
--| Tools/apps/img/server/auth.js:9 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl | none-detected | yes | yes |
--| Tools/apps/yt/server/auth.js:9 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl | none-detected | yes | yes |
++| Tools/apps/maps/server/index.js:39 | OpenVibe.Network | OV_NETWORK_URL, OV_NETWORK_INTERNAL_URL, networkUrl, networkInternalUrl, :4000 | none-detected | yes | yes |
| Tools/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Tools/OpenVibe.Shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Tools/apps/maps/server/sources/grocery.js:27 | OpenVibe.Search | searchUrl | none-detected | yes | no |
ddiff --git a/docs/roadmap-baseline/05-realtime-and-jobs.md b/docs/roadmap-baseline/05-realtime-and-jobs.md
iindex a6238d30..01d2aa63 100644
---- a/docs/roadmap-baseline/05-realtime-and-jobs.md
++++ b/docs/roadmap-baseline/05-realtime-and-jobs.md
@@@ -15,7 +15,7 @@ Deliverable 4, plus the background-job half of the exit criteria.
| OpenVibe.Live | server/streaming/call-server.js:62 |
| OpenVibe.Live | server/streaming/jsmpeg-relay.js:53 |
| OpenVibe.Live | server/streaming/jsmpeg-relay.js:99 |
--| OpenVibe.Live | server/vibe-coding/publish-server.js:23 |
++| OpenVibe.Live | server/vibe-coding/publish-server.js:27 |
| OpenVibe.Games | apps/server/src/net/editorWs.ts:53 |
| OpenVibe.Games | apps/server/src/net/wsTransport.ts:19 |
| OpenVibe.Chat | server/chat/chat-server.js:172 |
@@@ -24,15 +24,15 @@ Deliverable 4, plus the background-job half of the exit criteria.
| Repo | Path | Referenced at |
|---|---|---|
--| OpenVibe.Live | /ws/ | server/index.js:427, server/index.js:437, server/web/page-status.js:180 |
--| OpenVibe.Live | /ws/broadcast | server/index.js:1046, server/streaming/broadcast-server.js:187 |
--| OpenVibe.Live | /ws/call | server/index.js:1050, server/streaming/call-server.js:98 |
--| OpenVibe.Live | /ws/canvas | server/index.js:1052 |
--| OpenVibe.Live | /ws/chat | server/chat/chat-server.js:294, server/index.js:1042 |
--| OpenVibe.Live | /ws/control | server/controls/control-server.js:46, server/index.js:1048 |
--| OpenVibe.Live | /ws/game | server/index.js:1052 |
--| OpenVibe.Live | /ws/robotstreamer-publish | server/index.js:1054, server/integrations/robotstreamer-service.js:807 |
--| OpenVibe.Live | /ws/vibe-coding/publish | server/index.js:1044, server/vibe-coding/publish-server.js:31 |
++| OpenVibe.Live | /ws/ | server/index.js:450, server/index.js:460, server/web/page-status.js:184 |
++| OpenVibe.Live | /ws/broadcast | server/index.js:1073, server/streaming/broadcast-server.js:187 |
++| OpenVibe.Live | /ws/call | server/index.js:1077, server/streaming/call-server.js:98 |
++| OpenVibe.Live | /ws/canvas | server/index.js:1079 |
++| OpenVibe.Live | /ws/chat | server/chat/chat-server.js:294, server/index.js:1069 |
++| OpenVibe.Live | /ws/control | server/controls/control-server.js:46, server/index.js:1075 |
++| OpenVibe.Live | /ws/game | server/index.js:1079 |
++| OpenVibe.Live | /ws/robotstreamer-publish | server/index.js:1081, server/integrations/robotstreamer-service.js:789 |
++| OpenVibe.Live | /ws/vibe-coding/publish | server/index.js:1071, server/vibe-coding/publish-server.js:35 |
| OpenVibe.Network | /ws/ | server/deploy/nginx-generator.js:153 |
| OpenVibe.Games | /ws | apps/server/src/main.ts:254 |
| OpenVibe.Chat | /ws/chat | server/app.js:210, server/chat/chat-server.js:234 |
@@@ -56,13 +56,13 @@ Owner = the repository whose process runs the job; target = the authority the wo
| Repo | Kind | Name | Interval | At | Target | Disposition |
|---|---|---|---|---|---|---|
--| OpenVibe.Live | setInterval | | 5 min | server/ai/ai-moments-job.js:495 | | keep |
--| OpenVibe.Live | setInterval | | ? | server/ai/auto-clip-job.js:308 | | keep |
++| OpenVibe.Live | setInterval | | 5 min | server/ai/ai-moments-job.js:496 | | keep |
++| OpenVibe.Live | setInterval | | ? | server/ai/auto-clip-job.js:354 | | keep |
| OpenVibe.Live | setInterval | | 1 min | server/ai/backfill-job.js:160 | | keep |
| OpenVibe.Live | setInterval | | ? | server/ai/chat-ai.js:473 | | keep |
| OpenVibe.Live | setInterval | | 5 min | server/ai/easter-egg-job.js:215 | | keep |
| OpenVibe.Live | setInterval | | ? | server/ai/slogan-job.js:190 | | keep |
--| OpenVibe.Live | setInterval | | 30 s | server/ai/stream-memory-job.js:239 | | keep |
++| OpenVibe.Live | setInterval | | 30 s | server/ai/stream-memory-job.js:241 | | keep |
| OpenVibe.Live | setInterval | | ? | server/ai/streamer-overview-job.js:40 | | keep |
| OpenVibe.Live | setInterval | | ? | server/ai/timeline-job.js:205 | OpenVibe.AI | extract |
| OpenVibe.Live | setInterval | | ? | server/ai/viewers/engine.js:79 | | keep |
@@@ -73,32 +73,32 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Live | setInterval | | ? | server/chat/chat-server.js:250 | OpenVibe.Chat | compat |
| OpenVibe.Live | setInterval | | ? | server/chat/chat-server.js:272 | OpenVibe.Chat | compat |
| OpenVibe.Live | setInterval | | ? | server/chat/chat-server.js:277 | OpenVibe.Chat | compat |
--| OpenVibe.Live | setInterval | | ? | server/chat/dm-routes.js:39 | OpenVibe.Chat | compat |
--| OpenVibe.Live | setInterval | | ? | server/diagnostics.js:18 | | keep |
++| OpenVibe.Live | setInterval | | ? | server/chat/dm-routes.js:40 | OpenVibe.Chat | compat |
++| OpenVibe.Live | setInterval | | ? | server/diagnostics.js:19 | | keep |
| OpenVibe.Live | setInterval | | ? | server/events/stream-events.js:100 | | keep |
--| OpenVibe.Live | setInterval | | 5 min | server/home/routes.js:563 | | keep |
++| OpenVibe.Live | setInterval | | 5 min | server/home/routes.js:564 | | keep |
| OpenVibe.Live | setInterval | | ? | server/home/star-job.js:130 | | keep |
--| OpenVibe.Live | setInterval | | 360 min | server/index.js:1314 | | keep |
--| OpenVibe.Live | setInterval | | 45 s | server/index.js:1331 | | keep |
--| OpenVibe.Live | setInterval | | ? | server/index.js:1355 | | keep |
--| OpenVibe.Live | setInterval | | ? | server/index.js:1366 | | keep |
++| OpenVibe.Live | setInterval | | 360 min | server/index.js:1342 | | keep |
++| OpenVibe.Live | setInterval | | 45 s | server/index.js:1359 | | keep |
++| OpenVibe.Live | setInterval | | ? | server/index.js:1383 | | keep |
++| OpenVibe.Live | setInterval | | ? | server/index.js:1394 | | keep |
| OpenVibe.Live | setInterval | | ? | server/integrations/chat-relay-service.js:615 | OpenVibe.Chat | extract |
| OpenVibe.Live | setInterval | | 1 s | server/integrations/powerchat-platform.js:296 | OpenVibe.Billing | extract |
| OpenVibe.Live | setInterval | | ? | server/integrations/powerchat-platform.js:430 | OpenVibe.Billing | extract |
| OpenVibe.Live | setInterval | | ? | server/integrations/powerchat-platform.js:538 | OpenVibe.Billing | extract |
--| OpenVibe.Live | setInterval | | ? | server/integrations/robotstreamer-service.js:1023 | OpenRe.Stream | extract |
++| OpenVibe.Live | setInterval | | ? | server/integrations/robotstreamer-service.js:1005 | OpenRe.Stream | extract |
| OpenVibe.Live | setInterval | | ? | server/integrations/rs-passthrough-relay.js:537 | OpenRe.Stream | extract |
| OpenVibe.Live | setInterval | | ? | server/integrations/rs-passthrough-relay.js:755 | OpenRe.Stream | extract |
| OpenVibe.Live | setInterval | | ? | server/integrations/rs-passthrough-relay.js:965 | OpenRe.Stream | extract |
--| OpenVibe.Live | setInterval | | 60 min | server/media/media-downloader.js:550 | | keep |
--| OpenVibe.Live | setInterval | | ? | server/media/media-downloader.js:553 | | keep |
--| OpenVibe.Live | setInterval | | ? | server/media-proxy/asset-sync.js:119 | | keep |
++| OpenVibe.Live | setInterval | | 60 min | server/media/media-downloader.js:554 | | keep |
++| OpenVibe.Live | setInterval | | ? | server/media/media-downloader.js:557 | | keep |
++| OpenVibe.Live | setInterval | | ? | server/media-proxy/asset-sync.js:120 | | keep |
| OpenVibe.Live | setInterval | | ? | server/media-proxy/clip-notify.js:95 | | keep |
| OpenVibe.Live | setInterval | | 60 min | server/monetization/payments.js:390 | OpenVibe.Billing | extract |
| OpenVibe.Live | setInterval | | 30 s | server/news/news-service.js:94 | | keep |
| OpenVibe.Live | setInterval | | ? | server/news/sources/base-source.js:28 | | keep |
| OpenVibe.Live | setInterval | | ? | server/openre/mirror.js:210 | | keep |
--| OpenVibe.Live | setInterval | | ? | server/recap/recap.js:243 | | keep |
++| OpenVibe.Live | setInterval | | ? | server/recap/recap.js:246 | | keep |
| OpenVibe.Live | setInterval | | ? | server/streaming/broadcast-server.js:133 | OpenRe.Stream | extract |
| OpenVibe.Live | setInterval | | ? | server/streaming/call-server.js:64 | OpenVibe.Chat | extract |
| OpenVibe.Live | setInterval | | 5 min | server/streaming/call-server.js:76 | OpenVibe.Chat | extract |
@@@ -108,12 +108,12 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Live | jobs.every | restream-viewer-counts | 1 min | server/utils/jobs.js:12 | OpenRe.Stream | extract |
| OpenVibe.Live | jobs.singleFlight | auto-clip-backfill | ? | server/utils/jobs.js:13 | | keep |
| OpenVibe.Network | setInterval | | ? | server/auth/discord-link.js:20 | | keep |
--| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:201 | | keep |
--| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:203 | | keep |
--| OpenVibe.Network | setInterval | | 60 min | server/index.js:722 | | keep |
--| OpenVibe.Network | setInterval | | 2 min | server/index.js:725 | | keep |
--| OpenVibe.Network | setInterval | | ? | server/index.js:740 | | keep |
--| OpenVibe.Network | setInterval | | ? | server/index.js:743 | | keep |
++| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:205 | | keep |
++| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:207 | | keep |
++| OpenVibe.Network | setInterval | | 60 min | server/index.js:724 | | keep |
++| OpenVibe.Network | setInterval | | 2 min | server/index.js:727 | | keep |
++| OpenVibe.Network | setInterval | | ? | server/index.js:742 | | keep |
++| OpenVibe.Network | setInterval | | ? | server/index.js:745 | | keep |
| OpenVibe.Shared | setInterval | | 15 min | account-switcher.js:624 | | keep |
| OpenVibe.Shared | setInterval | | ? | analytics/retention.js:230 | | keep |
| OpenVibe.Shared | setInterval | | ? | analytics/tracker.js:115 | | keep |
@@@ -121,36 +121,38 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Shared | setInterval | | ? | release-watch.js:170 | | keep |
| OpenVibe.Shared | setInterval | | 10 min | release-watch.js:175 | | keep |
| OpenVibe.Media | setInterval | | ? | server/auth.js:59 | | keep |
--| OpenVibe.Media | setInterval | | ? | server/events.js:73 | | keep |
--| OpenVibe.Media | setInterval | | 720 min | server/index.js:137 | | keep |
--| OpenVibe.Media | setInterval | | ? | server/index.js:166 | | keep |
--| OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:64 | | keep |
--| OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:183 | | keep |
++| OpenVibe.Media | setInterval | | 60 min | server/events.js:68 | | keep |
++| OpenVibe.Media | setInterval | | ? | server/events.js:86 | | keep |
++| OpenVibe.Media | setInterval | | ? | server/events.js:90 | | keep |
++| OpenVibe.Media | setInterval | | 720 min | server/index.js:170 | | keep |
++| OpenVibe.Media | setInterval | | ? | server/index.js:199 | | keep |
++| OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:68 | | keep |
++| OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:193 | | keep |
++| OpenVibe.Media | setInterval | | ? | server/objects/owner-subject-job.js:51 | | keep |
| OpenVibe.Media | setInterval | | ? | server/objects/verify-job.js:226 | | keep |
--| OpenVibe.Media | setInterval | | ? | server/pastes/routes.js:709 | OpenVibe.Community | frozen-legacy |
++| OpenVibe.Media | setInterval | | ? | server/pastes/routes.js:710 | OpenVibe.Community | frozen-legacy |
| OpenVibe.Media | setInterval | | ? | server/vod/clip-cutter.js:111 | | keep |
| OpenVibe.Media | setInterval | | ? | server/vod/clip-jobs.js:125 | | keep |
| OpenVibe.Media | setInterval | | ? | server/vod/health-job.js:266 | | keep |
--| OpenVibe.Media | setInterval | | 1 min | server/vod/recorder.js:213 | | keep |
--| OpenVibe.Media | setInterval | | ? | server/vod/vod-storage.js:484 | | keep |
++| OpenVibe.Media | setInterval | | 1 min | server/vod/recorder.js:235 | | keep |
++| OpenVibe.Media | setInterval | | ? | server/vod/vod-storage.js:571 | | keep |
++| OpenVibe.Tools | setInterval | | ? | apps/_shared/guard/index.js:484 | | keep |
| OpenVibe.Tools | setInterval | | 15 s | apps/_shared/jobs/http.js:270 | | keep |
--| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/index.js:102 | | keep |
--| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/system.js:582 | | keep |
--| OpenVibe.Tools | setInterval | | ? | apps/audio/server/auth.js:60 | | keep |
++| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/index.js:123 | | keep |
++| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/system.js:648 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/audio/server/retention/manager.js:193 | | keep |
--| OpenVibe.Tools | setInterval | | ? | apps/docs/server/auth.js:60 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/docs/server/retention/manager.js:145 | | keep |
--| OpenVibe.Tools | setInterval | | 5 min | apps/gateway/server/dev/routes.js:26 | | keep |
--| OpenVibe.Tools | setInterval | | 1 min | apps/gateway/server/registry/index.js:198 | | keep |
++| OpenVibe.Tools | setInterval | | 5 min | apps/gateway/server/dev/routes.js:32 | | keep |
++| OpenVibe.Tools | setInterval | | ? | apps/gateway/server/registry/descriptors.js:162 | | keep |
++| OpenVibe.Tools | setInterval | | 1 min | apps/gateway/server/registry/index.js:176 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/gateway/server/registry/services.js:109 | | keep |
--| OpenVibe.Tools | setInterval | | ? | apps/img/server/auth.js:60 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/img/server/retention/manager.js:146 | | keep |
--| OpenVibe.Tools | setInterval | | ? | apps/yt/server/auth.js:60 | | keep |
--| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:555 | | keep |
--| OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:606 | | keep |
--| OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:217 | | keep |
++| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:662 | | keep |
++| OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:713 | | keep |
++| OpenVibe.Tools | setInterval | | 10 min | apps/yt/server/index.js:135 | | keep |
++| OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:252 | | keep |
| OpenVibe.Community | setInterval | | ? | server/limits.js:47 | | keep |
--| OpenVibe.Community | setInterval | | ? | server/pastes/service.js:213 | | keep |
++| OpenVibe.Community | setInterval | | ? | server/pastes/service.js:221 | | keep |
| OpenVibe.Community | setInterval | | ? | server/relay/discord.js:152 | | keep |
| OpenVibe.Games | setInterval | | 360 min | apps/server/src/main.ts:148 | | keep |
| OpenVibe.Games | setInterval | | ? | apps/server/src/main.ts:284 | | keep |
@@@ -158,7 +160,7 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Events | setInterval | | ? | server/auth.js:80 | | keep |
| OpenVibe.Events | setInterval | | ? | server/index.js:49 | | keep |
| OpenVibe.Events | setInterval | | ? | server/realtime.js:192 | | keep |
--| OpenVibe.Chat | setInterval | | 1 min | server/bridge/live-bridge.js:134 | | keep |
++| OpenVibe.Chat | setInterval | | 1 min | server/bridge/live-bridge.js:132 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/bridge/live-mirror.js:105 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:178 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:200 | | keep |
ddiff --git a/docs/roadmap-baseline/06-secrets.md b/docs/roadmap-baseline/06-secrets.md
iindex fcb6b916..79215af9 100644
---- a/docs/roadmap-baseline/06-secrets.md
++++ b/docs/roadmap-baseline/06-secrets.md
@@@ -82,7 +82,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Media | MEDIA_R2_SECRET_ACCESS_KEY | media.env | server/vod/vod-storage.js |
| OpenVibe.Media | MEDIA_SECRET | **not set** | server/views/service.js |
| OpenVibe.Media | MEDIA_SIGNING_SECRET | media.env | server/config.js |
--| OpenVibe.Media | OV_OAUTH_CLIENT_SECRET | media.env | server/events.js, server/index.js |
++| OpenVibe.Media | OV_OAUTH_CLIENT_SECRET | media.env | server/events.js, server/index.js, server/objects/owner-subject.js |
| OpenVibe.Media | VIEW_HASH_SECRET | **not set** | server/views/service.js |
| OpenVibe.Network | ADMIN_PASSWORD | network.env | server/config.js |
| OpenVibe.Network | DEV_CREDENTIAL_OVERLAP_S | **not set** | server/config.js |
@@@ -404,6 +404,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Codes | CODES_PLAYGROUND_MAX_UPLOAD_BYTES | | server/config.js |
| OpenVibe.Codes | CODES_PLAYGROUND_MEDIA_URL | | server/config.js |
| OpenVibe.Codes | CODES_PLAYGROUND_RUNS_PER_HOUR | | server/config.js |
++| OpenVibe.Codes | CODES_RATE_LIMIT_PER_MIN | | server/app.js |
| OpenVibe.Codes | CODES_REGISTRY_TTL_MS | | server/config.js |
| OpenVibe.Codes | CODES_STAFF_SUBJECTS | codes.env | server/config.js |
| OpenVibe.Codes | COOKIE_SECURE | | server/config.js |
@@@ -665,31 +666,29 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | ADMIN_USERNAME | live.env | server/config.js |
| OpenVibe.Live | AI_HEAR_MAX_SPOOL | | server/ai/stream-audio.js |
| OpenVibe.Live | AI_HEAR_SEGMENT_SEC | | server/ai/stream-audio.js |
--| OpenVibe.Live | AI_MOMENTS_PATH | | server/ai/stream-memory-job.js, server/arena/arena-service.js +1 |
| OpenVibe.Live | AI_SERVICE | live.env | server/ai/ai-service.js |
| OpenVibe.Live | AI_VOD_MAX_WINDOWS | | server/ai/media-analysis.js |
| OpenVibe.Live | ALLOW_P2P_FALLBACK | | server/config.js |
--| OpenVibe.Live | ARENA_IMAGE_PATH | | server/arena/arena-service.js, server/index.js |
| OpenVibe.Live | BASE_URL | live.env | server/auth/routes.js, server/config.js |
| OpenVibe.Live | BILLING_AUTHORITY | | server/admin/routes.js, server/db/database.js +1 |
| OpenVibe.Live | BTTV_CACHE_TTL | | server/config.js |
| OpenVibe.Live | CHAT_AUTHORITY | live.env | server/chat/chat-authority.js |
--| OpenVibe.Live | CLIPS_PATH | | server/config.js |
| OpenVibe.Live | COLD_STORAGE_PATH | | server/config.js |
--| OpenVibe.Live | DB_PATH | live.env | server/config.js, server/db/database.js +1 |
++| OpenVibe.Live | DATA_DIR | | server/drill.js, server/index.js +1 |
++| OpenVibe.Live | DB_PATH | live.env | server/db/init.js, server/drill.js +2 |
| OpenVibe.Live | DEBUG_DM_DELIVERY | | server/chat/chat-server.js |
--| OpenVibe.Live | EMOTES_PATH | live.env | server/config.js, server/media-proxy/asset-sync.js |
++| OpenVibe.Live | EMOTES_PATH | live.env | (not referenced) |
| OpenVibe.Live | ESCROW_HOLD_DAYS | live.env | server/config.js |
| OpenVibe.Live | EVENTS_PUBLISH | | server/events/stream-events.js |
| OpenVibe.Live | EVENTS_URL | live.env | server/events/stream-events.js |
| OpenVibe.Live | FFZ_CACHE_TTL | | server/config.js |
--| OpenVibe.Live | HOST | live.env | server/config.js |
++| OpenVibe.Live | HOST | live.env | server/config.js, server/drill.js +1 |
| OpenVibe.Live | JSMPEG_AUDIO_PORT | live.env | server/config.js |
| OpenVibe.Live | JSMPEG_VIDEO_PORT | live.env | server/config.js |
| OpenVibe.Live | LEGACY_QUEST_API_URL | | server/monetization/cosmetics.js |
--| OpenVibe.Live | LISTEN_FDS | | server/index.js |
--| OpenVibe.Live | LISTEN_PID | | server/index.js |
--| OpenVibe.Live | LIVE_THUMBS_PATH | | server/media-proxy/live-thumbs.js |
++| OpenVibe.Live | LISTEN_FDS | | server/drill.js, server/index.js |
++| OpenVibe.Live | LISTEN_PID | | server/drill.js, server/index.js |
++| OpenVibe.Live | LIVE_DRILL | | server/drill.js |
| OpenVibe.Live | MAX_EMOTE_SIZE_KB | live.env | server/config.js |
| OpenVibe.Live | MAX_EMOTES_PER_CHANNEL | | server/config.js |
| OpenVibe.Live | MAX_EMOTES_PER_UPLOADER_PER_CHANNEL | | server/config.js |
@@@ -710,7 +709,6 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | MIN_CASHOUT_BUCKS | | server/config.js |
| OpenVibe.Live | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |
| OpenVibe.Live | NODE_ENV | live.env | server/comments-client.js, server/config.js +1 |
--| OpenVibe.Live | OFFLINE_SCREEN_PATH | | server/monetization/routes.js, server/streaming/routes.js |
| OpenVibe.Live | OPENRE_PUBLIC_URL | live.env | server/openre/openre-client.js |
| OpenVibe.Live | OPENRE_URL | live.env | server/openre/openre-client.js |
| OpenVibe.Live | OV_AI_INTERNAL_URL | | server/ai/ai-service.js |
@@@ -729,11 +727,11 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | OV_PUBLIC_DIR | | server/web/assets.js |
| OpenVibe.Live | OWNER_USERNAME | | server/db/database.js |
| OpenVibe.Live | PASTES_AUTHORITY | live.env | server/pastes-client.js |
--| OpenVibe.Live | PASTES_ON_COMMUNITY | live.env | server/index.js, server/seo/seo.js |
++| OpenVibe.Live | PASTES_ON_COMMUNITY | live.env | server/seo/seo.js, server/web/paste-handover.js |
| OpenVibe.Live | PATH | | server/media/media-downloader.js |
| OpenVibe.Live | PAYPAL_CLIENT_ID | live.env | server/config.js |
| OpenVibe.Live | PAYPAL_MODE | live.env | server/config.js |
--| OpenVibe.Live | PORT | live.env | server/config.js |
++| OpenVibe.Live | PORT | live.env | server/config.js, server/drill.js +1 |
| OpenVibe.Live | RELEASE_AT | | OpenVibe.Shared/release.js |
| OpenVibe.Live | RELEASE_COMMIT | | OpenVibe.Shared/release.js |
| OpenVibe.Live | RS_COMPANION_DB_PATH | live.env | (not referenced) |
@@@ -746,14 +744,10 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | SEVENTV_CACHE_TTL | | server/config.js |
| OpenVibe.Live | SITE_URL | | server/chat/chat-server.js |
| OpenVibe.Live | SOUND_DEFAULT_MAX_SECONDS | | server/config.js |
--| OpenVibe.Live | SOUNDS_PATH | | server/config.js, server/media-proxy/asset-sync.js |
| OpenVibe.Live | STAR_STREAMER | live.env | server/config.js |
--| OpenVibe.Live | THUMBNAILS_PATH | | server/config.js |
--| OpenVibe.Live | TTS_CACHE_PATH | | server/arena/voice.js |
| OpenVibe.Live | TURN_URL | live.env | server/config.js |
| OpenVibe.Live | TURN_USERNAME | live.env | server/config.js |
| OpenVibe.Live | UNSAFE_WORDS_PATH | live.env | (not referenced) |
--| OpenVibe.Live | VOD_PATH | | server/config.js |
| OpenVibe.Live | WEBRTC_PORT | live.env | server/config.js |
| OpenVibe.Live | WHIP_PUBLIC_URL | | server/config.js |
| OpenVibe.Live | WHIP_PUBLIC_URL_ENABLED | | server/config.js |
@@@ -781,11 +775,11 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Media | CLIP_MAX_CONCURRENT_FFMPEG | | server/vod/clip-cutter.js |
| OpenVibe.Media | CLIP_QUEUE_WAIT_MS | | server/vod/clip-cutter.js |
| OpenVibe.Media | CLIPS_PATH | media.env | server/config.js |
--| OpenVibe.Media | DB_PATH | media.env | server/config.js |
++| OpenVibe.Media | DB_PATH | media.env | server/config.js, server/drill.js +1 |
| OpenVibe.Media | EVENTS_PUBLISH | | server/events.js |
| OpenVibe.Media | EVENTS_URL | media.env | server/events.js |
| OpenVibe.Media | FILES_PATH | media.env | server/config.js |
--| OpenVibe.Media | HOST | media.env | server/config.js |
++| OpenVibe.Media | HOST | media.env | server/config.js, server/drill.js +1 |
| OpenVibe.Media | LIVE_APP_INTERNAL_URL | | server/thumbnails/live-frame-service.js |
| OpenVibe.Media | MEDIA_APP_KEYS | | server/config.js |
| OpenVibe.Media | MEDIA_APPS_SEED | media.env | server/config.js |
@@@ -793,13 +787,17 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Media | MEDIA_B2_ENDPOINT | media.env | server/vod/vod-storage.js |
| OpenVibe.Media | MEDIA_B2_KEY_ID | media.env | server/vod/vod-storage.js |
| OpenVibe.Media | MEDIA_B2_REGION | media.env | server/vod/vod-storage.js |
++| OpenVibe.Media | MEDIA_DRILL | | server/drill.js |
++| OpenVibe.Media | MEDIA_DURATION_RECONCILE_APPLY | | server/jobs/duration-reconcile.js |
| OpenVibe.Media | MEDIA_JOBS_ENABLED | | server/config.js |
| OpenVibe.Media | MEDIA_JOBS_HEAVY_WHILE_RECORDING | | server/config.js |
++| OpenVibe.Media | MEDIA_OWNER_SUBJECT_SYNC | | server/config.js |
| OpenVibe.Media | MEDIA_PUBLIC_URL | | server/config.js |
| OpenVibe.Media | MEDIA_R2_ACCESS_KEY_ID | media.env | server/vod/vod-storage.js |
| OpenVibe.Media | MEDIA_R2_BUCKET | media.env | server/vod/vod-storage.js |
| OpenVibe.Media | MEDIA_R2_ENDPOINT | media.env | server/vod/vod-storage.js |
| OpenVibe.Media | MEDIA_R2_REGION | | server/vod/vod-storage.js |
++| OpenVibe.Media | MEDIA_RTMP_PULL_ALLOW | | server/config.js |
| OpenVibe.Media | MEDIA_VERIFY_ENABLED | | server/config.js |
| OpenVibe.Media | MEDIA_VERIFY_REPAIR_CORRUPT | | server/config.js |
| OpenVibe.Media | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |
@@@ -808,12 +806,12 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Media | OBJECTS_PATH | | server/config.js |
| OpenVibe.Media | OV_NETWORK_INTERNAL_URL | media.env | server/config.js, server/events.js |
| OpenVibe.Media | OV_NETWORK_URL | media.env | server/config.js |
--| OpenVibe.Media | OV_OAUTH_CLIENT_ID | media.env | server/events.js, server/index.js |
++| OpenVibe.Media | OV_OAUTH_CLIENT_ID | media.env | server/events.js, server/index.js +1 |
| OpenVibe.Media | OV_OAUTH_REDIRECT_URI | | server/index.js |
| OpenVibe.Media | PASTES_FROZEN_APPS | media.env | server/pastes/routes.js |
| OpenVibe.Media | PASTES_MOVED_TO | media.env | (not referenced) |
| OpenVibe.Media | PASTES_PATH | media.env | server/config.js |
--| OpenVibe.Media | PORT | media.env | (not referenced) |
++| OpenVibe.Media | PORT | media.env | server/drill.js, server/index.js |
| OpenVibe.Media | RELEASE_AT | | OpenVibe.Shared/release.js |
| OpenVibe.Media | RELEASE_COMMIT | | OpenVibe.Shared/release.js |
| OpenVibe.Media | RTP_PORT_MAX | media.env | (not referenced) |
@@@ -1060,9 +1058,10 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Tips | TIPS_POWERCHAT_LINK_TEMPLATE | | server/config.js |
| OpenVibe.Tips | TIPS_TTS_HARD_CAP | | server/config.js |
| OpenVibe.Tips | TRUST_PROXY | tips.env | server/config.js |
++| OpenVibe.Tools | AUDIO_MAX_DURATION | | apps/audio/server/descriptors.js |
| OpenVibe.Tools | BASE_URL | | apps/gateway/server/config.js, apps/maps/server/config.js +1 |
| OpenVibe.Tools | COOKIE_SECURE | | apps/gateway/server/config.js |
--| OpenVibe.Tools | DATA_DIR | | apps/audio/server/config.js, apps/docs/server/config.js +3 |
++| OpenVibe.Tools | DATA_DIR | | apps/audio/server/config.js, apps/docs/server/config.js +4 |
| OpenVibe.Tools | DOWNLOADS_DIR | | apps/yt/server/config.js |
| OpenVibe.Tools | EVENTS_PUBLISH | | apps/_shared/jobs/events.js |
| OpenVibe.Tools | EVENTS_RELAY_INTERVAL_MS | | apps/_shared/jobs/events.js |
@@@ -1074,8 +1073,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Tools | MAPS_API | | apps/food/server/index.js |
| OpenVibe.Tools | MEDIA_PUBLIC_URL | tools.env | apps/_shared/jobs/index.js |
| OpenVibe.Tools | MEDIA_URL | tools.env | apps/_shared/jobs/index.js |
--| OpenVibe.Tools | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |
--| OpenVibe.Tools | NODE_ENV | tools.env | apps/_shared/jobs/http.js, apps/audio/server/index.js +7 |
++| OpenVibe.Tools | NODE_ENV | tools.env | apps/_shared/guard/caller.js, apps/_shared/guard/index.js +8 |
| OpenVibe.Tools | OUTPUT_DIR | | apps/audio/server/config.js, apps/docs/server/config.js +1 |
| OpenVibe.Tools | OV_AUDIO_URL | | OpenVibe.Shared/brand.js |
| OpenVibe.Tools | OV_COMMUNITY_INTERNAL_URL | | apps/gateway/server/config.js |
@@@ -1094,26 +1092,32 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Tools | OV_MEDIA_INTERNAL_URL | tools.env | apps/_shared/jobs/index.js |
| OpenVibe.Tools | OV_MEDIA_URL | | OpenVibe.Shared/brand.js, apps/_shared/jobs/index.js |
| OpenVibe.Tools | OV_NET_URL | | OpenVibe.Shared/brand.js |
--| OpenVibe.Tools | OV_NETWORK_INTERNAL_URL | tools.env | apps/_shared/jobs/events.js, apps/_shared/jobs/index.js +6 |
++| OpenVibe.Tools | OV_NETWORK_INTERNAL_URL | tools.env | apps/_shared/jobs/events.js, apps/_shared/jobs/index.js +9 |
| OpenVibe.Tools | OV_NETWORK_LOGIN_URL | | OpenVibe.Shared/brand.js |
--| OpenVibe.Tools | OV_NETWORK_PUBLIC_KEY | | apps/audio/server/config.js, apps/docs/server/config.js +2 |
--| OpenVibe.Tools | OV_NETWORK_URL | tools.env | OpenVibe.Shared/brand.js, apps/audio/server/config.js +6 |
++| OpenVibe.Tools | OV_NETWORK_PUBLIC_KEY | | apps/audio/server/config.js, apps/docs/server/config.js +5 |
++| OpenVibe.Tools | OV_NETWORK_URL | tools.env | OpenVibe.Shared/brand.js, apps/audio/server/config.js +9 |
| OpenVibe.Tools | OV_OAUTH_CLIENT_ID | tools.env | apps/_shared/jobs/events.js, apps/_shared/jobs/index.js +1 |
| OpenVibe.Tools | OV_OAUTH_REDIRECT_URI | | apps/gateway/server/config.js |
| OpenVibe.Tools | OV_PASTES_URL | | OpenVibe.Shared/brand.js |
| OpenVibe.Tools | OV_REGISTRY_URL | | apps/gateway/server/registry/services.js |
| OpenVibe.Tools | OV_TEXT_URL | | OpenVibe.Shared/brand.js |
++| OpenVibe.Tools | OV_TOOLS_AUDIENCE | | apps/_shared/guard/index.js |
| OpenVibe.Tools | OV_TOOLS_URL | | OpenVibe.Shared/brand.js |
| OpenVibe.Tools | OV_YT_URL | | OpenVibe.Shared/brand.js |
| OpenVibe.Tools | PATH | | apps/_shared/observe.js |
++| OpenVibe.Tools | PDF_MAX_PAGES | | apps/docs/server/descriptors.js, apps/docs/server/tools/pdf.js |
++| OpenVibe.Tools | PDF2IMG_MAX_PAGES | | apps/docs/server/descriptors.js, apps/docs/server/tools/pdf2img.js |
| OpenVibe.Tools | PORT | | apps/audio/server/config.js, apps/docs/server/config.js +6 |
--| OpenVibe.Tools | RELEASE_AT | | OpenVibe.Shared/release.js |
--| OpenVibe.Tools | RELEASE_COMMIT | | OpenVibe.Shared/release.js |
++| OpenVibe.Tools | TOOLS_GUARD | | apps/_shared/guard/index.js |
++| OpenVibe.Tools | TOOLS_GUARD_LIMITS | | apps/_shared/guard/limits.js |
| OpenVibe.Tools | TOOLS_JOB_RESULTS | tools.env | apps/_shared/jobs/index.js |
| OpenVibe.Tools | TOOLS_MEDIA_NAMESPACE | | apps/_shared/jobs/index.js |
--| OpenVibe.Tools | TOOLS_SATELLITE_PORTS | | apps/gateway/server/index.js |
++| OpenVibe.Tools | TOOLS_SATELLITE_PORTS | | apps/_shared/tools/satellites.js |
| OpenVibe.Tools | UPLOADS_DIR | | apps/audio/server/config.js, apps/docs/server/config.js +1 |
| OpenVibe.Tools | YT_COOKIES_FILE | | apps/yt/server/downloader.js, apps/yt/server/index.js |
++| OpenVibe.Tools | YT_INFO_CONCURRENCY | | apps/yt/server/config.js |
++| OpenVibe.Tools | YT_MAX_DURATION | | apps/yt/server/config.js, apps/yt/server/descriptors.js |
++| OpenVibe.Tools | YT_MAX_FILESIZE_MB | | apps/yt/server/config.js |
| OpenVibe.Tools | YT_PROXY | | apps/yt/server/downloader.js, apps/yt/server/index.js |
| OpenVibe.Tools | YTDLP_PATH | | apps/yt/server/config.js |
| OpenVibe.Trade | API_CORS_ORIGINS | | server/config.js |
ddiff --git a/docs/roadmap-baseline/07-ownership.md b/docs/roadmap-baseline/07-ownership.md
iindex 579af223..4d0157a8 100644
---- a/docs/roadmap-baseline/07-ownership.md
++++ b/docs/roadmap-baseline/07-ownership.md
@@@ -8,11 +8,11 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r
| Current owner | Tables | Stay | Staged copy | Moved (mirror left) | To move | Frozen legacy | Investigate |
|---|---|---|---|---|---|---|---|
--| OpenVibe.Live | 193 | 33 | 0 | 12 | 81 | 44 | 23 |
++| OpenVibe.Live | 196 | 33 | 0 | 12 | 68 | 44 | 39 |
| OpenVibe.Network | 53 | 50 | 0 | 0 | 3 | 0 | 0 |
| OpenVibe.Shared | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
--| OpenVibe.Media | 23 | 20 | 0 | 0 | 0 | 3 | 0 |
--| OpenVibe.Tools | 10 | 10 | 0 | 0 | 0 | 0 | 0 |
++| OpenVibe.Media | 25 | 22 | 0 | 0 | 0 | 3 | 0 |
++| OpenVibe.Tools | 13 | 13 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Community | 20 | 20 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Games | 13 | 13 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Sites | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
@@@ -40,11 +40,12 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r
| Target authority | From | Tables | Wave |
|---|---|---|---|
++| ? | OpenVibe.Live | game_achievements, game_bank, game_battle_stats, game_daily_quest_claims, game_daily_quest_progress, game_dungeon_runs, game_effects, game_farm_plots, game_fish_collection, game_inventory, game_leaderboard, game_players, game_recipes, game_structures, game_world_state, tag_guardian_defeats | W0 |
| archive then drop | OpenVibe.Live | arena_achievements, arena_battles, arena_events, arena_talk, arena_talk_hype, arena_talk_session_hype, arena_talk_session_topics, arena_talk_sessions, arena_talk_topics, arena_tier_paid, arena_topic_hype, arena_topic_members, arena_topic_moments, arena_topic_progress, arena_topic_sides, arena_topic_threads, arena_topics, arena_viewer_clout, arena_votes, chatter_profiles, chatter_subjects, chatter_xp_log, promo_claims | W0 |
| OpenRe.Stream | OpenVibe.Live | camera_presets, camera_profiles, cameras, control_config_buttons, control_configs, control_whitelist, kick_channel_cache, managed_streams, platform_connections, restream_destinations, robotstreamer_integrations, robotstreamer_integrations_new, stream_controls, stream_controls_new | W7 |
| OpenVibe.AI | OpenVibe.Live | ai_chatbot_configs, ai_timeline_cache, ai_usage, ai_viewer_log, ai_viewer_threads, channel_ai_bots, channel_ai_config, clip_ai_state, easter_egg_solves, stream_memories, stream_recaps, streamer_overviews, translations, vod_ai_state | W13 |
| OpenVibe.Billing | OpenVibe.Live | payment_orders, transactions | W8 (after ADR-012) |
--| OpenVibe.Billing (loyalty ledger) | OpenVibe.Live | channel_points, coin_redemptions, coin_rewards, coin_transactions, user_cosmetics, user_equipped, user_equipped_tag | W8 (after ADR-012) |
++| OpenVibe.Billing (loyalty ledger) | OpenVibe.Live | channel_points, channel_points_log, coin_redemptions, coin_rewards, coin_transactions, opencoin_admin_grants, user_cosmetics, user_equipped, user_equipped_tag | W8 (after ADR-012) |
| OpenVibe.Billing (loyalty ledger) | OpenVibe.Network | coin_transactions, wallets | W8 (after ADR-012) |
| OpenVibe.Billing + OpenVibe.VIP | OpenVibe.Live | subscriptions | W8/W10 |
| OpenVibe.Chat | OpenVibe.Live | channel_moderation_settings, channel_moderators, channel_sounds, channel_sounds_new, chat_ai_summaries, chat_messages, chat_messages_new, chat_timeline_events, dm_blocks, dm_conversations, dm_messages, dm_participants, emotes, emotes_new, hidden_relay_users, media_request_settings, media_requests, moderation_actions, pending_ip_messages, relay_users, stream_first_chats, tts_voice_overrides, user_tags | W6 (remainder) |
@@@ -52,7 +53,7 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r
| OpenVibe.Community | OpenVibe.Live | comments, paste_comments, paste_likes, pastes | W5 (done 2026-09-23) |
| OpenVibe.Community | OpenVibe.Media | paste_comments, paste_likes, pastes | W5 (done 2026-09-22) |
| OpenVibe.Events | OpenVibe.Network | stream_live_announcements | W3 |
--| OpenVibe.Games | OpenVibe.Live | canvas_actions, canvas_bans, canvas_region_locks, canvas_settings, canvas_snapshots, canvas_tiles, canvas_user_overrides, game_achievements, game_bank, game_battle_stats, game_daily_quest_claims, game_daily_quest_progress, game_dungeon_runs, game_effects, game_farm_plots, game_fish_collection, game_inventory, game_leaderboard, game_players, game_recipes, game_structures, game_world_state | W12 |
++| OpenVibe.Games | OpenVibe.Live | canvas_actions, canvas_bans, canvas_region_locks, canvas_settings, canvas_snapshots, canvas_tiles, canvas_user_overrides | W12 |
| OpenVibe.Games (import source) | OpenVibe.Live | active_effects, ai_conversations, ai_memory, analytics_snapshots, bank_items, battle_stats, changelog_entries, chat_log, custom_rewards, daily_claims, divorce_history, dungeon_stats, event_log, farm_plots, file_checksums, fish_profile, gusher_profile, inventory, jo_profile, love_affinity, love_profile, love_proposals, mine_profile, mod_persuasion, music_profile, roast_dossier, roast_log, unlocked_recipes, user_voice_selection, user_voices, woodcut_profile | W12 |
| OpenVibe.Media | OpenVibe.Live | clips, vods | W4 |
| OpenVibe.Network | OpenVibe.Live | follows, linked_accounts, themes, user_preferences, user_themes, users, verification_keys | W1 |
ddiff --git a/docs/roadmap-baseline/08-discrepancies.md b/docs/roadmap-baseline/08-discrepancies.md
iindex 5e0f1f6c..6018d3e6 100644
---- a/docs/roadmap-baseline/08-discrepancies.md
++++ b/docs/roadmap-baseline/08-discrepancies.md
@@@ -6,27 +6,31 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-23 20:32 UTC compared w
| Severity | Area | Subject | Detail |
|---|---|---|---|
--| medium | deploy | ai | deployed 96dc8a3 is 1 commit(s) behind origin/main 3a480ac |
--| medium | deploy | billing | deployed c646279 is 1 commit(s) behind origin/main aa445d0 |
--| medium | deploy | chat | deployed 7897688 is 2 commit(s) behind origin/main ed90461 |
--| medium | deploy | codes | deployed d60f279 is 1 commit(s) behind origin/main 51d2386 |
--| medium | deploy | community | deployed 57d1dd4 is 1 commit(s) behind origin/main 63b90a8 |
--| medium | deploy | coupons | deployed 54df411 is 3 commit(s) behind origin/main 1c57c47 |
--| medium | deploy | deals | deployed e72aeec is 2 commit(s) behind origin/main 91ca223 |
--| medium | deploy | events | deployed 3366132 is 1 commit(s) behind origin/main efc09a7 |
--| medium | deploy | games | deployed 474df50 is 1 commit(s) behind origin/main 7863fc6 |
--| medium | deploy | host | deployed 30f08d6 is 15 commit(s) behind origin/main 03dfcb3 |
--| medium | deploy | live | deployed c893c6c is 12 commit(s) behind origin/main ca7cc87 |
--| medium | deploy | media | deployed 9de4b25 is 4 commit(s) behind origin/main ad2217b |
--| medium | deploy | network | deployed 9bbd90f is 4 commit(s) behind origin/main 09bf748 |
--| medium | deploy | news | deployed 5a17e7f is 1 commit(s) behind origin/main 5b393d2 |
--| medium | deploy | openre | deployed e0dc1b4 is 2 commit(s) behind origin/main c091a09 |
--| medium | deploy | reviews | deployed 1d462a2 is 1 commit(s) behind origin/main a7b50a6 |
--| medium | deploy | sites | deployed d3b71af is 2 commit(s) behind origin/main d6e4cbd |
--| medium | deploy | tips | deployed 15bfc12 is 6 commit(s) behind origin/main f211c03 |
--| medium | deploy | trade | deployed 9a55644 is 2 commit(s) behind origin/main ddbc60c |
--| medium | deploy | vip | deployed 9668a49 is 1 commit(s) behind origin/main fe7eaad |
--| medium | deploy | wiki | deployed 011a68f is 1 commit(s) behind origin/main b4e70ac |
++| medium | deploy | ai | deployed 96dc8a3 is 4 commit(s) behind origin/main a6d4f39 |
++| medium | deploy | billing | deployed c646279 is 4 commit(s) behind origin/main 42ad547 |
++| medium | deploy | blog | deployed 95e99ac is 5 commit(s) behind origin/main 0784b42 |
++| medium | deploy | chat | deployed 7897688 is 6 commit(s) behind origin/main 1ef6f99 |
++| medium | deploy | codes | deployed d60f279 is 5 commit(s) behind origin/main a129415 |
++| medium | deploy | community | deployed 57d1dd4 is 5 commit(s) behind origin/main e075d39 |
++| medium | deploy | coupons | deployed 54df411 is 8 commit(s) behind origin/main ae3a25e |
++| medium | deploy | deals | deployed e72aeec is 7 commit(s) behind origin/main 3910b58 |
++| medium | deploy | events | deployed 3366132 is 6 commit(s) behind origin/main 9f51514 |
++| medium | deploy | games | deployed 474df50 is 4 commit(s) behind origin/main 4e5bc50 |
++| medium | deploy | host | deployed 30f08d6 is 22 commit(s) behind origin/main f8ac37d |
++| medium | deploy | live | deployed c893c6c is 47 commit(s) behind origin/main 12c1c11 |
++| medium | deploy | media | deployed 9de4b25 is 22 commit(s) behind origin/main 984e7ad |
++| medium | deploy | network | deployed 9bbd90f is 24 commit(s) behind origin/main 26c0395 |
++| medium | deploy | news | deployed 5a17e7f is 6 commit(s) behind origin/main 42ce43b |
++| medium | deploy | openre | deployed e0dc1b4 is 5 commit(s) behind origin/main e517ed4 |
++| medium | deploy | reviews | deployed 1d462a2 is 5 commit(s) behind origin/main 70de372 |
++| medium | deploy | search | deployed a707e38 is 3 commit(s) behind origin/main 4603541 |
++| medium | deploy | sites | deployed d3b71af is 13 commit(s) behind origin/main 63683d2 |
++| medium | deploy | sources | deployed 2e986af is 3 commit(s) behind origin/main cf00390 |
++| medium | deploy | tips | deployed 15bfc12 is 9 commit(s) behind origin/main 847d22a |
++| medium | deploy | tools | deployed 5d1b423 is 22 commit(s) behind origin/main b0aada2 |
++| medium | deploy | trade | deployed 9a55644 is 6 commit(s) behind origin/main 7f418d2 |
++| medium | deploy | vip | deployed 9668a49 is 4 commit(s) behind origin/main a0a8f75 |
++| medium | deploy | wiki | deployed 011a68f is 5 commit(s) behind origin/main fe113b9 |
| low | database | /opt/openvibe.community/data/community.db | 115 KB, 9 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.games/data/legacy-import/world-before-20260923T184930Z.db | 193 KB, 13 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.live/data/backups/analytics-pre-adr021-2026-09-23.db | 1.76 GB copy (backup, import snapshot or rehearsal) kept beside the service data |
@@@ -128,6 +132,21 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-23 20:32 UTC compared w
| low | schema | OpenVibe.Live:farm_plots | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
| low | schema | OpenVibe.Live:file_checksums | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
| low | schema | OpenVibe.Live:fish_profile | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
++| low | schema | OpenVibe.Live:game_achievements | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_bank | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_battle_stats | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_daily_quest_claims | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_daily_quest_progress | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_dungeon_runs | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_effects | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_farm_plots | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_fish_collection | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_inventory | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_leaderboard | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_players | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_recipes | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_structures | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
++| low | schema | OpenVibe.Live:game_world_state | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
| low | schema | OpenVibe.Live:gusher_profile | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
| low | schema | OpenVibe.Live:inventory | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
| low | schema | OpenVibe.Live:jo_profile | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
@@@ -140,6 +159,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-23 20:32 UTC compared w
| low | schema | OpenVibe.Live:promo_claims | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> archive then drop (RobotStreamer promo cashout ledger; campaign removed in a4c8aea and must not be rebuilt. May hold payout records: archive before dropping.) |
| low | schema | OpenVibe.Live:roast_dossier | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
| low | schema | OpenVibe.Live:roast_log | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
++| low | schema | OpenVibe.Live:tag_guardian_defeats | in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
| low | schema | OpenVibe.Live:unlocked_recipes | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
| low | schema | OpenVibe.Live:user_voice_selection | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
| low | schema | OpenVibe.Live:user_voices | in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.) |
@@@ -151,13 +171,13 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-23 20:32 UTC compared w
| info | env | OpenVibe.Events:OV_OAUTH_CLIENT_SECRET | set in events.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Games:NODE_ENV | set in games.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Games:PORT | set in games.env but not referenced by scanned code (may be read by a dependency or stale) |
++| info | env | OpenVibe.Live:EMOTES_PATH | set in live.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Live:MIN_CASHOUT | set in live.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Live:OV_LIVE_URL | set in live.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Live:RS_COMPANION_DB_PATH | set in live.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Live:RS_PASSTHROUGH_ROBOTS | set in live.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Live:UNSAFE_WORDS_PATH | set in live.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Media:PASTES_MOVED_TO | set in media.env but not referenced by scanned code (may be read by a dependency or stale) |
--| info | env | OpenVibe.Media:PORT | set in media.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Media:RTP_PORT_MAX | set in media.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Media:RTP_PORT_MIN | set in media.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Network:NOTIFICATION_EMAIL_CRITICAL_ONLY | set in network.env but not referenced by scanned code (may be read by a dependency or stale) |
@@@ -198,13 +218,18 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-23 20:32 UTC compared w
| info | schema | OpenVibe.Live:analytics_rate_tracking | in production (analytics.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Live (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) |
| info | schema | OpenVibe.Live:analytics_visitor_days | in production (analytics.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Live (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) |
| info | schema | OpenVibe.Live:billing_actions | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
++| info | schema | OpenVibe.Live:channel_points_log | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:channel_sounds_new | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:chat_messages_new | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:emotes_new | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:event_outbox | in production (live.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Live (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
++| info | schema | OpenVibe.Live:opencoin_admin_grants | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:robotstreamer_integrations_new | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:stream_controls_new | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
++| info | schema | OpenVibe.Live:tips_deliveries | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Media:event_outbox | in production (media.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Media (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
++| info | schema | OpenVibe.Media:media_object_changes | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
++| info | schema | OpenVibe.Media:media_tier_decisions | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Media:media_upload_parts | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Media:media_uploads | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Network:admin_rate_limits | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
@@@ -259,6 +284,9 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-23 20:32 UTC compared w
| info | schema | OpenVibe.Tools:analytics_rate_tracking | in production (analytics.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Tools (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) |
| info | schema | OpenVibe.Tools:analytics_visitor_days | in production (analytics.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Tools (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) |
| info | schema | OpenVibe.Tools:event_outbox | in production (jobs.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Tools (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
++| info | schema | OpenVibe.Tools:guard_abuse | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
++| info | schema | OpenVibe.Tools:guard_day | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
++| info | schema | OpenVibe.Tools:guard_salt | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Trade:event_outbox | in production (trade.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Trade (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
| info | schema | OpenVibe.Trade:idempotency_receipts | in production (trade.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Trade (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
| info | schema | OpenVibe.Trade:trade_context_drafts | in production (trade.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Trade (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) |
ddiff --git a/docs/roadmap-baseline/09-d-status.md b/docs/roadmap-baseline/09-d-status.md
iindex 34e2b860..32f44c62 100644
---- a/docs/roadmap-baseline/09-d-status.md
++++ b/docs/roadmap-baseline/09-d-status.md
@@@ -7,7 +7,7 @@ Deliverable 8, derived from the [requirement ledger](requirement-ledger.md) (as
| IDs | Family | W0 (2026-09-22) | Now | Requirements | Wave | Verified | Measured |
|---|---|---|---|---|---|---|---|
| D01 | Identity/account | partial | **partial** | D01 partial | W1 | yes | 7 Live tables target OpenVibe.Network |
--| D02-D04 | Registry, capabilities, contracts | absent | **partial** | D02 partial, D03 partial, D04 partial | W1, W2 | yes | 1 charter-only repos of 36; Live 14, Network 0, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0 |
++| D02-D04 | Registry, capabilities, contracts | absent | **partial** | D02 partial, D03 partial, D04 partial | W1, W2 | yes | 1 charter-only repos of 36; Live 14, Network 4, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0 |
| D05-D06 | Policy, staff, user modules | partial | **partial** | D05 partial, D06 partial | W1, W2 | yes | - |
| D07-D10 | Themes, notifications, social, analytics | partial | **partial** | D07 partial, D08 partial, D09 partial, D10 partial | W1, W2, Track O | yes | 3 repos carry their own analytics_events |
| D11-D13 | Events, realtime, SDK | absent | **partial** | D11 met, D12 partial, D13 partial | W2, W3 | yes | 98 caller-file/target pairs across 75 files; 11 WebSocket server constructions |
@@@ -16,17 +16,17 @@ Deliverable 8, derived from the [requirement ledger](requirement-ledger.md) (as
| D21-D23 | Chat | partial | **partial** | D21 partial, D22 partial, D23 partial | W6 | yes | 23 Live tables target OpenVibe.Chat; 19 test files |
| D24-D27 | Community | partial | **partial** | D24 partial, D25 met, D26 partial, D27 met | W5 | yes | 20 tables; 4 Live tables target OpenVibe.Community |
| D28-D30 | Billing, Tips, VIP | partial | **blocked on owner** | D28 blocked on owner, D29 blocked on owner, D30 blocked on owner | W8-W10 (ADR-012 first) | yes | 2 Live tables target OpenVibe.Billing; 16 test files |
--| D31 | Tools | built | **partial** | D31 partial | W11 | yes | 16 test files |
--| D32 | Games | built | **partial** | D32 partial | W12 | yes | 68 test files |
--| D33-D34 | Codes, Host | absent | **partial** | D33 partial, D34 partial | W20, W21 | yes | 19 test files; 27 test files |
++| D31 | Tools | built | **partial** | D31 partial | W11 | yes | 39 test files |
++| D32 | Games | built | **partial** | D32 partial | W12 | yes | 69 test files |
++| D33-D34 | Codes, Host | absent | **partial** | D33 partial, D34 partial | W20, W21 | yes | 19 test files; 28 test files |
| D35-D38 | AI, content, sources, search | partial | **partial** | D35 partial, D36 blocked on owner, D37 blocked on owner, D38 blocked on owner | W13-W15 | yes | 14 Live tables target OpenVibe.AI; 17 test files |
| D39 | Mods | absent | **partial** | D39 partial | W12, W21 | yes | - |
| D40 | Open developer services | absent | **partial** | D40 partial | W20, W21 | yes | 39 of 98 call sites authenticate with the shared internal key |
| D41 | Independent runtime lifecycle | partial | **partial** | D41 partial | W7, W21 | yes | - |
--| D42 | Shared component architecture | partial | **partial** | D42 partial | W2, Track R | yes | 23 repos pin a tagged openvibe-shared release (latest v1.5.0): OpenRe.Stream v1.2.1, AI v1.3.0, Billing v1.3.0, Blog v1.3.0, Codes v1.3.0, Community v1.3.0, Coupons v1.3.0, Deals v1.3.0, Events v1.3.0, Host v1.3.0, Live v1.4.0, Media v1.3.0, Network v1.4.0, News v1.3.0, Reviews v1.3.0, Search v1.3.0, Sites v1.0.0, Sources v1.3.0, Tips v1.3.0, Tools v1.4.0, Trade v1.3.0, VIP v1.3.0, Wiki v1.3.0; 30 manifests unpinned or behind: OpenRe.Stream (v1.2.1), AI (v1.3.0), Billing (v1.3.0), Blog (v1.3.0), Codes (v1.3.0), Community (v1.3.0), Coupons (v1.3.0), Deals (v1.3.0), Events (v1.3.0), Host (v1.3.0), Live (v1.4.0), Media (v1.3.0), Network (v1.4.0), News (v1.3.0), Reviews (v1.3.0), Search (v1.3.0), Sites (v1.0.0), Sources (v1.3.0), Tips (v1.3.0), Tools/apps/audio (v1.4.0), Tools/apps/docs (v1.4.0), Tools/apps/food (v1.4.0), Tools/apps/gateway (v1.4.0), Tools/apps/img (v1.4.0), Tools/apps/maps (v1.4.0), Tools/apps/text (v1.4.0), Tools/apps/yt (v1.4.0), Trade (v1.3.0), VIP (v1.3.0), Wiki (v1.3.0) |
++| D42 | Shared component architecture | partial | **partial** | D42 partial | W2, Track R | yes | 23 repos pin a tagged openvibe-shared release (latest v1.5.1): OpenRe.Stream v1.5.1, AI v1.5.1, Billing v1.5.1, Blog v1.5.1, Codes v1.5.1, Community v1.5.1, Coupons v1.5.1, Deals v1.5.1, Events v1.5.1, Host v1.5.1, Live v1.5.1, Media v1.5.1, Network v1.5.1, News v1.5.1, Reviews v1.5.1, Search v1.5.1, Sites v1.5.1, Sources v1.5.1, Tips v1.5.1, Tools v1.5.1, Trade v1.5.1, VIP v1.5.1, Wiki v1.5.1; 0 manifests unpinned or behind: none |
| D43 | Safe active-client updates | absent | **partial** | D43 partial | Track R | yes | - |
| D44 | Crawlable component rendering | built | **partial** | D44 partial | Track R (preserve) | yes | - |
--| D45 | Release compatibility and recovery | absent | **partial** | D45 partial | Track R, W22 | yes | 21 service(s) not running origin/main |
++| D45 | Release compatibility and recovery | absent | **partial** | D45 partial | Track R, W22 | yes | 25 service(s) not running origin/main |
| D46 | Update observability and acceptance | absent | **partial** | D46 partial | Track R, Track O | yes | 27 of 27 scanned repos have .github/workflows |
Families: 0 met, 21 partial, 0 not met, 1 blocked on owner (of 22). Requirements: 3 met, 36 partial, 0 not met, 7 blocked on owner (of 46); 46 verified. At Wave 0 the same 22 families were 3 built, 11 partial, 8 absent.
@@@ -39,7 +39,7 @@ Families: 0 met, 21 partial, 0 not met, 1 blocked on owner (of 22). Requirements
- **D07-D10 Themes, notifications, social, analytics** (partial). D07: ADR-024 (accepted 2026-09-23) sets the boundary, and code and production follow it. Shared owns the token vocabulary, the built-in catalog and the first-paint loader, with a parity test. Network seeds its catalog from openvibe-shared/theme-sync and serves /api/themes (35 themes in network.db at 20:22Z). Media's page paints an inline #ov-critical canvas and loads the theme loader deferred. ADR-024's own acceptance tests are not automated: that every site paints with Network down, and that a preference follows the user across sites. The preference is stored in Network's user_preferences table, not in the user module the ADR names. D08: Network consumes three topics through Events: deals.watch.matched, trade.alert.triggered and, since Network 2a95548 (subscribed 2026-09-23 19:54 UTC), live.stream.started. It applies per-category preferences and uses an inbox so a redelivery never notifies twice; test/events-consumer.test.js covers this. In production at 20:22Z the consumer has received nothing: network_event_inbox is empty, and there has been no live.stream.started since 16:21 UTC. Live's direct go-live push still runs beside it (C-85), and all 675 STREAM_LIVE notifications came from that push. Browsers get the inbox by polling every 15 s plus Web Push, not through a realtime plane. D09: There is no canonical social graph yet. Live's follows table (62 rows in production at 20:22Z) is the real follow graph. Since Live 456eccd, other services can read it through GET /internal/followers (service token with live.follower.read, loopback only, paged), and Network's go-live consumer uses that read. Network's own follows table has 0 rows. Blocks exist only as Chat's dm_blocks, and memberships only inside Community and VIP. No product shares a follow, block or membership API. D10: Privacy governance is in place. ADR-021's module moved into Shared v1.4.0 (9aaf919), with a Sec-GPC/DNT opt-out and an analytics/event.v1 schema. Live and Network run it in production (releases c893c6ca7099 and 9bbd90f786fb at 20:22Z, both committed after the scan-root snapshot). Production holds no IP, user id or city in 780,665 Network and 1,773,833 Live analytics rows, and the oldest row is from 2026-08-24 (30-day prune). The analytics are not event-fed: each service runs a request-level tracker, creator analytics are Live's own queries on live.db, and nothing consumes OpenVibe.Events for analytics.
- **D11-D13 Events, realtime, SDK** (partial). D11: OpenVibe.Events is the production event store. At 20:21Z, /api/ready reported ready: db, JWKS and the delivery worker ok, DLQ depth 0. The store held 199 events from Live, Media, Chat, Games, VIP, Network, Wiki, Blog, Trade, OpenRe, Community and a developer app, and 16 subscriptions for 7 consumers; all 20 deliveries so far succeeded, with 0 failed or dead. The restore drill passed at 05:22. Tests prove retry with backoff, dead-lettering after 8 attempts, operator replay (by event and from a sequence), and exactly-once effects through the SDK inbox after a consumer crash. The store is SQLite, not the roadmap's PostgreSQL, a choice that rests on ADR-004 and ADR-007. D12: ADR-005 (accepted 2026-09-22) replaced the separate Realtime service with an SSE plane inside Events. The plane authorises each topic by visibility, resumes from Last-Event-ID, and sends gap markers. Since 18b873f it also redacts deleted chat messages and limits public replay to 300 s. Media and game traffic keep their own protocols. In production at 20:23Z, an anonymous replay from cursor 0 got only a gap marker. However, events_realtime_connections was 0: no product browser uses the plane, and presence does not exist. D13: openvibe-sdk v0.4.0 lives in a public repository and installs by tag. It has hand-written clients (core, auth, registry, identity, modules, events with outbox and inbox, realtime, media, community, jobs, projects), generated ESM and browser bundles, and contract types copied from Contracts' generated output. CI passed on the last three main runs (from 654d4b2, 20:20Z check), and 17 repositories pin it, 12 of them at v0.4.0. It still lacks Chat, Live, Billing and Games clients and a Media v2 object client, its contract types stop at Contracts v0.28.0 (Contracts is at v0.30.2), and it has only been tested against stubs and the mock platform.
- **D14-D16 Media** (partial). D14: The generalised model is in production. At 20:22Z Media held 3,056 media_objects, 2,881 media_locations, 1,288 media_relationships and 998 media_variants; the backfill projected every legacy row, is idempotent, and is tested. But it is still a projection of the predecessor tables: vods, clips and files are written first and then synced, and a failed sync only logs (C-75). So VODs and clips are not yet typed projections over objects. Namespaces are the :app tenants without per-namespace read, write, list, delete and transform grants, and there is no segment model. D15: Objects have a canonical lifecycle: uploading, then ready or failed, then soft delete with restore, plus retention holds and purge. Since cbf8410, Media writes each outcome's Events outbox row in the same transaction as the state change. Live consumes media.vod, media.clip and media.storage outcomes through Events (d2715e5, MEDIA_EVENTS_AUTHORITY=both) and applies each one once. There is no job system: media_jobs had 0 rows in production at 20:22Z, and no outcome has yet been applied through Live's Events inbox (its table is not created yet). Uploads are signed single-part PUTs to Media; there is no multipart or presigned direct-to-bucket upload. D16: Copies are explicit: media_locations holds one row per provider copy. In production at 20:22Z that was local 2,172 present and 2 missing, B2 684 present and 4 corrupt, and R2 19 present. Reconciliation detects missing canonical copies, lost files, size and hash mismatches, orphan location rows and deleted-but-served objects. Since e42af9e, a scheduled verification has run every 10 minutes (11 runs and 550 objects since 18:42 UTC). The v2 object API signs private downloads, and a private object answers exactly like a missing one. Still open: 6 ready objects have no good copy; orphan provider objects and incomplete multipart uploads are not detected; there is no R2-eviction drill; and native objects are never tiered to B2 or R2.
--- **D17-D20 Live, OpenRe, channel/VOD lineage** (partial). D17: Chat (2026-09-23 02:03 UTC), pastes (2026-09-22) and VOD/clip comments (Live b8afb71, deployed 2026-09-23 between 19:00 and 19:25 UTC) have left Live's authority, and the old response shapes and pages were kept. One UX regression from the paste move (broken AI Moments thumbnails) was fixed in Live 047f206. Production on 2026-09-23 20:23 UTC: CHAT_AUTHORITY, PASTES_AUTHORITY and AI_SERVICE are set in live.env, BILLING_AUTHORITY is not, Live still listens on *:1935, and all 102 slots have ingest_authority=live. Live therefore still holds ingest, money and calls. D18: Live f0ca18b (deployed, wired to OpenRe since 2026-09-23 19:23 UTC) rebinds a switched slot's key, ingest URL and key rotation to OpenRe, and sends restream edits to OpenRe's own destinations UI. On 2026-09-23 20:18 UTC no slot is switched (102/102 ingest_authority=live, openre_stream_id set on 0, openre_sessions 0), so no production Stream Manager control operates on OpenRe state yet. D19: OpenRe runs as its own units on production release e0dc1b4 (openre-api, session-coordinator, rtmp-ingest@ and restream-worker@ all active on 2026-09-23 20:19 UTC), with RTMP 1936 reachable from outside the host, a production worker generation rollover (generation 1 stopped, generation 2 ready), and a passed restore drill at 19:24 UTC. It carries no broadcaster: 0 of 102 slots are switched, openre.db has 1 session (the ended rehearsal) and 0 destinations, and WHIP, SFU and JSMPEG are not ported. D20: The lineage-resolver contract exists (openvibe-contracts v0.32.0: lineage.resolve-request@1 -> lineage.resolution@1, capability live.lineage.resolve) and is implemented once in Live, deployed 2026-09-23 21:36 UTC: it answers which channel, and whose, a slug, nested slug, channel id, stream, slot, VOD, clip, Media object, owner subject or legacy id belongs to, in the roadmap's precedence, with explicit unresolved states (conflict, source_unavailable, display_name_only, not_found) and never from a display name; VODs, clips and objects come from Media. Live's clip owner check uses it. No other service calls it yet (no principal holds live.lineage.resolve), OpenRe sessions record no lineage, and Media objects still lack owner_subject.
++- **D17-D20 Live, OpenRe, channel/VOD lineage** (partial). D17: Chat (2026-09-23 02:03 UTC), pastes (2026-09-22) and VOD/clip comments (Live b8afb71, deployed 2026-09-23 between 19:00 and 19:25 UTC) have left Live's authority, and the old response shapes and pages were kept. One UX regression from the paste move (broken AI Moments thumbnails) was fixed in Live 047f206. Production on 2026-09-23 20:23 UTC: CHAT_AUTHORITY, PASTES_AUTHORITY and AI_SERVICE are set in live.env, BILLING_AUTHORITY is not, Live still listens on *:1935, and all 102 slots have ingest_authority=live. Live therefore still holds ingest, money and calls. D18: Live f0ca18b (deployed, wired to OpenRe since 2026-09-23 19:23 UTC) rebinds a switched slot's key, ingest URL and key rotation to OpenRe, and sends restream edits to OpenRe's own destinations UI. On 2026-09-23 20:18 UTC no slot is switched (102/102 ingest_authority=live, openre_stream_id set on 0, openre_sessions 0), so no production Stream Manager control operates on OpenRe state yet. D19: OpenRe runs as its own units on production release e0dc1b4 (openre-api, session-coordinator, rtmp-ingest@ and restream-worker@ all active on 2026-09-23 20:19 UTC), with RTMP 1936 reachable from outside the host, a production worker generation rollover (generation 1 stopped, generation 2 ready), and a passed restore drill at 19:24 UTC. It carries no broadcaster: 0 of 102 slots are switched, openre.db has 1 session (the ended rehearsal) and 0 destinations, and WHIP, SFU and JSMPEG are not ported. D20: The lineage-resolver contract exists (openvibe-contracts v0.32.0: lineage.resolve-request@1 -> lineage.resolution@1, capability live.lineage.resolve) and is implemented once in Live, deployed 2026-09-23 21:36 UTC: it answers which channel, and whose, a slug, nested slug, channel id, stream, slot, VOD, clip, Media object, owner subject or legacy id belongs to, in the roadmap's precedence, with explicit unresolved states (conflict, source_unavailable, display_name_only, not_found) and never from a display name; VODs, clips and objects come from Media. Live's clip owner check uses it. OpenRe, Media and Community hold live.lineage.resolve (2026-09-24) but do not call it yet; OpenRe sessions record no lineage. Media owner_subject is filled on all 3,034 owned objects (2026-09-23) with a 10-minute reconcile job for new ones.
- **D21-D23 Chat** (partial). D21: OpenVibe.Chat has been the production chat authority since 2026-09-23 02:03 UTC: CHAT_AUTHORITY is set in live.env, 12 tables have table_authority=chat, and chat.db holds 70,864 stream/global messages and 1,522 DMs in 11 conversations (checked 20:18 UTC; Chat active, NRestarts 0). Six staged tables are still Live's, call signalling is still Live's /ws/call, and Chat has no room, membership or unread model. D22: Chat enforces the chat.message.send capability on its service API (791cd3d, deployed in Chat 7897688 on 2026-09-23), checks DM participants on every route, and publishes chat.message.created (5 public events in Events on 20:23 UTC) with chat.message.deleted redaction. But browser tokens and roles are still resolved by Live, legacy token forms are still accepted, and no consumer subscribes to chat.* events. D23: History, DMs, TTS overrides, sounds and moderation were imported with stable ids and nothing held (70,864 messages and 1,522 DMs in chat.db on 2026-09-23 20:18 UTC; 15/15 read paths identical at cutover). Since the audit, Chat added a restart-and-cursor-resume test (49a5011) and a persisted TTS/sound queue with skip, clear and failure states (bf88760); one post-cutover regression (deploy cards folding across rooms) was fixed in 7897688. Calls are not migrated and there is no browser parity test.
- **D24-D27 Community** (partial). D24: Community is the production authority for pastes (since 2026-09-22) and for typed comment threads, including Live's VOD/clip comments since 2026-09-23 (on 20:18 UTC: 903 pastes; 40 threads = live/vod 22, live/clip 8, wiki/page 10; 20 comments; 3 spaces). Its store is SQLite, not PostgreSQL, under ADR-007, and the categories, attachments, moderation-action and external-message-map schema families do not exist. D25: Community serves spaces, threads, replies (posts), thread and comment votes, and staff moderation (pin, lock, delete, hide) over the API and as no-JS SSR pages; behavioural tests cover each, including concurrent votes. Production serves the forum (openvibe.community/s and /api/v1/spaces answer 200 with 3 public spaces on 2026-09-23 20:22 UTC) but has no threads yet; the wider §15.8 obligations (categories, tags, profiles, search) are outside this target. D26: Community has an outbound Discord relay for new threads, with dedupe, retry/backoff, loop prevention and an allow-list, covered by tests. It is off in production on 2026-09-23 (no DISCORD_* variables in community.env, 0 relay mappings, 0 deliveries). It does not run behind Events (Community publishes no relay events), and it has no edit/delete mapping and no inbound direction (schema allows direction 'out' only). D27: Community has been the paste authority since 2026-09-22 ~23:35 UTC: every source row was imported (889+2 pastes, 60 comments, 48 likes) with a legacy id map, reconciliation and sha256 checks, and 903 pastes, 991 legacy map rows and 3 migration runs were present on 2026-09-23 20:18 UTC. A pre-migration paste (created 2026-03-11) 301s from both Live and Media to Community, and pastes.openvibe.tools 301s to Community. The 5 ambiguous_owner holds (1 paste, 4 comments) were imported ownerless as the import-hold rule requires, and their attribution waits for the owner.
- **D28-D30 Billing, Tips, VIP** (blocked on owner). D28: Billing's balanced, append-only journal is deployed (c646279) with database triggers that refuse updates and deletes, hourly reconciliation (runs at 18:54, 19:05 and 20:04 UTC on 2026-09-23, all ok) and /metrics. It is still a shadow: all 322 transactions are `import`, every provider is off, and BILLING_AUTHORITY does not appear in live.env (count 0 at 20:18 UTC), so Live remains the ledger. D29: Tips settles through Billing and delivers to Live and Chat as retryable effects. It consumes Billing's EXTERNAL PowerChat receipts (Events subscriptions billing.transaction.* and billing.receipt.*). The Live history import was applied: 139 interactions, all test-era (128 imported, 11 external), 4 goals and 143 migration maps. No real settlement has happened yet: Billing is a shadow, the Events store holds 0 billing.* or tips.* events, TIPS_CHAT_ADAPTER=none, Live's /api/funds routes remain the authority, and openvibe.tips serves the Sites placeholder (checked 2026-09-23 20:19 UTC). D30: VIP has immutable plan versions and an entitlement projection fed by Billing events, with a tested convergence bound. Since the audit, consumers gate on it: Chat member badges (d02a73c), Community members-only spaces (57d1dd4), Blog members-only posts (95e99ac) and Network grants (50552b6). In production (2026-09-23 20:18 UTC) VIP holds 44 creators and 43 imported plans, but 0 memberships and 0 projections. Checkout providers are empty, Billing has 0 subscriptions and 0 entitlements, and openvibe.vip is the Sites placeholder.
ddiff --git a/docs/roadmap-baseline/10-hazards.md b/docs/roadmap-baseline/10-hazards.md
iindex 9c4711fb..51335227 100644
---- a/docs/roadmap-baseline/10-hazards.md
++++ b/docs/roadmap-baseline/10-hazards.md
@@@ -12,13 +12,13 @@ Deliverable 9. **Not yet reviewed by the production-host owner** (Wave 0 exit cr
| H4 | managed_streams.stream_key values still need rotation after a past leak | high | partial | **needed** | Live maintainers (security track S) | W7 (openre.key.rotate) - or earlier as a standalone rotation | The one key committed to a repository (in Live's control-bridge example since ac0d6a47) was rotated on 2026-09-23 and replaced by a placeholder, with the commit allow-listed in the secret scan. The leaked slot keys are rotated per slot at its OpenRe cutover (ADR-009, openre.key.rotate), or by a standalone rotation in Live if the cutover slips. | - |
| H5 | Multilingual Whisper model missing breaks non-English captions | medium | mitigated | - | Live maintainers | - | Install the model and set WHISPER_MODEL_MULTI in live.env. | WHISPER_MODEL_MULTI is set in live.env |
| H6 | YouTube refuses the server IP; the yt tool needs a proxy | low | blocked-on-owner | **needed** | Platform operator | W11 | Set YT_PROXY and/or YT_COOKIES_FILE for openvibe-tools-yt. | YT_PROXY unset in tools.env |
--| H7 | Workstation root disk near full; headless Chrome can hit ENOSPC | low | open | - | Workstation owner | Track Q | Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB). | workstation / is 87% used (at generation time) |
++| H7 | Workstation root disk near full; headless Chrome can hit ENOSPC | low | open | - | Workstation owner | Track Q | Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB). | workstation / is 90% used (at generation time) |
| H8 | A hardcoded internal secret was previously public | high | partial | **needed** | Platform operator (security track S) | W1 (scoped service principals) / Track S | Removed: the hard-coded openvibe-internal-2026 value and the hard-coded quest secret (register C-59, Live e505868). New services use Network-issued service tokens; Network records every legacy-key call per route (principal_usage) and the key-only routes have removal dates (register C-50..C-57). Remaining: rotate INTERNAL_API_KEY in every env file, then retire the key routes by their dates. | - |
| H9 | Removed features and copy rules must not be undone | medium | standing-rule | - | Every product wave | all | Product waves check the prohibitions list (roadmap 9.1) before adding copy or campaigns. | - |
| H10 | Commit identity | medium | partial | **needed** | Every contributor | all | Per-repo git config user.email = [email protected]; every new commit follows it. Older history keeps some assistant trailers. | main history violates the rule in: Live (238 commits with assistant trailers); Network (14 commits with assistant trailers); Media (30 commits with assistant trailers); Tools (9 commits with assistant trailers) |
| H11 | analytics_events grows without pruning | medium | mitigated | - | OpenVibe.Shared maintainers (openvibe-shared/analytics.js) | Track O / ADR-021 - before any schema wave touching Live or Network | ADR-021: no IP, user id or city stored; raw analytics events are pruned after 30 days on a schedule in Live (nightly job), Tools (timer) and Network (openvibe-shared analytics retention.schedulePrune since 9bbd90f), rollups kept. | largest analytics stores: live/data/analytics.db 500.5 MB; network/data/network.db 277.7 MB; tools/apps/audio/data/analytics.db 35.4 MB; tools/apps/text/data/analytics.db 5.5 MB |
| H12 | No Cloudflare cache-purge step after deploys | low | blocked-on-owner | **needed** | Platform operator | W21 / Track I | Cache Rules "browser_ttl respect_origin" on every openvibe.* zone and openre.stream (2026-09-23) make the edge follow origin max-age; Search has a purge queue that stays inert until a purge-scoped token exists (CLOUDFLARE_PURGE_TOKEN). | CLOUDFLARE_PURGE_TOKEN unset in search.env |
--| H13 | Production drifts from main | medium | open | - | Platform operator | W0 (checklist) / W21 (release manifests) | Deploy or record why each lagging service is held back. | ai: deployed 96dc8a3 is 1 commit(s) behind origin/main 3a480ac; billing: deployed c646279 is 1 commit(s) behind origin/main aa445d0; chat: deployed 7897688 is 2 commit(s) behind origin/main ed90461; codes: deployed d60f279 is 1 commit(s) behind origin/main 51d2386; community: deployed 57d1dd4 is 1 commit(s) behind origin/main 63b90a8; coupons: deployed 54df411 is 3 commit(s) behind origin/main 1c57c47; deals: deployed e72aeec is 2 commit(s) behind origin/main 91ca223; events: deployed 3366132 is 1 commit(s) behind origin/main efc09a7; games: deployed 474df50 is 1 commit(s) behind origin/main 7863fc6; host: deployed 30f08d6 is 15 commit(s) behind origin/main 03dfcb3; live: deployed c893c6c is 12 commit(s) behind origin/main ca7cc87; media: deployed 9de4b25 is 4 commit(s) behind origin/main ad2217b; network: deployed 9bbd90f is 4 commit(s) behind origin/main 09bf748; news: deployed 5a17e7f is 1 commit(s) behind origin/main 5b393d2; openre: deployed e0dc1b4 is 2 commit(s) behind origin/main c091a09; reviews: deployed 1d462a2 is 1 commit(s) behind origin/main a7b50a6; sites: deployed d3b71af is 2 commit(s) behind origin/main d6e4cbd; tips: deployed 15bfc12 is 6 commit(s) behind origin/main f211c03; trade: deployed 9a55644 is 2 commit(s) behind origin/main ddbc60c; vip: deployed 9668a49 is 1 commit(s) behind origin/main fe7eaad; wiki: deployed 011a68f is 1 commit(s) behind origin/main b4e70ac |
++| H13 | Production drifts from main | medium | open | - | Platform operator | W0 (checklist) / W21 (release manifests) | Deploy or record why each lagging service is held back. | ai: deployed 96dc8a3 is 4 commit(s) behind origin/main a6d4f39; billing: deployed c646279 is 4 commit(s) behind origin/main 42ad547; blog: deployed 95e99ac is 5 commit(s) behind origin/main 0784b42; chat: deployed 7897688 is 6 commit(s) behind origin/main 1ef6f99; codes: deployed d60f279 is 5 commit(s) behind origin/main a129415; community: deployed 57d1dd4 is 5 commit(s) behind origin/main e075d39; coupons: deployed 54df411 is 8 commit(s) behind origin/main ae3a25e; deals: deployed e72aeec is 7 commit(s) behind origin/main 3910b58; events: deployed 3366132 is 6 commit(s) behind origin/main 9f51514; games: deployed 474df50 is 4 commit(s) behind origin/main 4e5bc50; host: deployed 30f08d6 is 22 commit(s) behind origin/main f8ac37d; live: deployed c893c6c is 47 commit(s) behind origin/main 12c1c11; media: deployed 9de4b25 is 22 commit(s) behind origin/main 984e7ad; network: deployed 9bbd90f is 24 commit(s) behind origin/main 26c0395; news: deployed 5a17e7f is 6 commit(s) behind origin/main 42ce43b; openre: deployed e0dc1b4 is 5 commit(s) behind origin/main e517ed4; reviews: deployed 1d462a2 is 5 commit(s) behind origin/main 70de372; search: deployed a707e38 is 3 commit(s) behind origin/main 4603541; sites: deployed d3b71af is 13 commit(s) behind origin/main 63683d2; sources: deployed 2e986af is 3 commit(s) behind origin/main cf00390; tips: deployed 15bfc12 is 9 commit(s) behind origin/main 847d22a; tools: deployed 5d1b423 is 22 commit(s) behind origin/main b0aada2; trade: deployed 9a55644 is 6 commit(s) behind origin/main 7f418d2; vip: deployed 9668a49 is 4 commit(s) behind origin/main a0a8f75; wiki: deployed 011a68f is 5 commit(s) behind origin/main fe113b9 |
| H14 | Dead and backup database files on the production host | low | open | **needed** | Live maintainers | W0 | Confirm no code opens them, then delete the empty files; move copies (backups, import snapshots, rehearsal databases) to /var/backups/openvibe with a retention date. | community/data/community.db, games/data/legacy-import/world-before-20260923T184930Z.db, live/data/backups/analytics-pre-adr021-2026-09-23.db, live/data/backups/live-pre-643a2e6.db, live/data/hobo.db, live/data/openvibe.db, tips/data/tips.db, tools/backups/analytics-2026-09-23/audio.analytics.db, tools/backups/analytics-2026-09-23/docs.analytics.db, tools/backups/analytics-2026-09-23/food.analytics.db, tools/backups/analytics-2026-09-23/img.analytics.db, tools/backups/analytics-2026-09-23/maps.analytics.db, tools/backups/analytics-2026-09-23/text.analytics.db, tools/backups/analytics-2026-09-23/yt.analytics.db, billing/live-snapshot-202609230121.db, chat/live-snap-a.db, chat/live-snap-b.db, chat/live-snapshot-0159.db, chat/rehearsal.db, community/community.pre-live-comments-20260923T191345Z.db |
| H15 | Media objects with no good copy | medium | blocked-on-owner | **needed** | Media maintainers | W4 (repair) / W22 (DR drills) | Scheduled copy verification now runs inside Media and reports through /api/ready (object_copies); the 6 objects are marked degraded. Each needs a decision: re-upload from a surviving source, or mark it unrecoverable and tell its owner. | - |
| H16 | Off-host backups are unreadable without the backup key, which lives only on the host | high | blocked-on-owner | **needed** | Production-host owner | W22 | Escrow the key offline (password manager or paper), record its key id (`ovhost offsite check`) next to it, and test a restore from the bucket with the escrowed copy. | openvibe-backup.timer is active/waiting |
ddiff --git a/docs/roadmap-baseline/README.md b/docs/roadmap-baseline/README.md
iindex 5986d342..8186c7c5 100644
---- a/docs/roadmap-baseline/README.md
++++ b/docs/roadmap-baseline/README.md
@@@ -2,19 +2,19 @@
The audit baseline from the OpenVibe development roadmap (Wave 0; section 12 items 1-3): what exists across the estate, who owns each piece of data today and who should, what production looks like next to the repos, and which hazards constrain later waves. Every file here except `data/*.json` is generated.
--Source commits: Live `ca7cc87`, Network `09bf748`, Shared `c272680`, Media `ad2217b`, Tools `5d1b423`, Community `63b90a8`, Games `7863fc6`, Sites `d6e4cbd`, Events `efc09a7`, Chat `ed90461`, OpenRe.Stream `c091a09`, Billing `aa445d0`, Tips `f211c03`, VIP `fe7eaad`, AI `3a480ac`, Search `a707e38`, Sources `2e986af`, Wiki `b4e70ac`, Blog `95e99ac`, News `5b393d2`, Reviews `a7b50a6`, Deals `91ca223`, Coupons `1c57c47`, Trade `ddbc60c`, Codes `51d2386`, Host `03dfcb3`, Examples `d5f4efc`. Production snapshot: openvibe-oregon, 2026-09-23.
++Source commits: Live `12c1c11`, Network `26c0395`, Shared `c7489fc`, Media `984e7ad`, Tools `b0aada2`, Community `e075d39`, Games `4e5bc50`, Sites `63683d2`, Events `9f51514`, Chat `1ef6f99`, OpenRe.Stream `e517ed4`, Billing `42ad547`, Tips `847d22a`, VIP `a0a8f75`, AI `a6d4f39`, Search `4603541`, Sources `cf00390`, Wiki `fe113b9`, Blog `0784b42`, News `42ce43b`, Reviews `70de372`, Deals `3910b58`, Coupons `ae3a25e`, Trade `7f418d2`, Codes `a129415`, Host `f8ac37d`, Examples `0bbe579`. Production snapshot: openvibe-oregon, 2026-09-23.
## Deliverables
| # | Artifact | Contents |
|---|---|---|
| 1 | [01-services.md](01-services.md) | services, ports, units, env files, repo state, GitHub census |
--| 2 | [02-schema.md](02-schema.md) | 621 tables with current/target owner |
--| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 2098 routes; 98 cross-service call sites |
++| 2 | [02-schema.md](02-schema.md) | 629 tables with current/target owner |
++| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 2102 routes; 98 cross-service call sites |
| 4 | [05-realtime-and-jobs.md](05-realtime-and-jobs.md) | WebSocket servers and paths, non-HTTP protocols, background jobs |
| 5 | [06-secrets.md](06-secrets.md) | auth mechanisms and secret names (no values) |
| 6 | [07-ownership.md](07-ownership.md) | current vs target data ownership |
--| 7 | [08-discrepancies.md](08-discrepancies.md) | 276 production-vs-repo items |
++| 7 | [08-discrepancies.md](08-discrepancies.md) | 304 production-vs-repo items |
| 8 | [09-d-status.md](09-d-status.md) | D01-D46 family status, derived from the requirement ledger (families: 0 met, 21 partial, 0 not met, 1 blocked on owner) |
| 9 | [10-hazards.md](10-hazards.md) | 18 hazards with owners, mitigations and waves; 10 need the owner's review |
| 10 | [requirement-ledger.md](requirement-ledger.md), [requirement-ledger.json](requirement-ledger.json) | D01-D46 with acceptance artifacts (roadmap §22.4/§25): 3 met, 36 partial, 0 not met, 7 blocked on owner |
@@@ -24,10 +24,10 @@ Source commits: Live `ca7cc87`, Network `09bf748`, Shared `c272680`, Media `ad22
| | Criterion | Result |
|---|---|---|
--| pass | Every table has an owner classification | 621 tables classified, 0 unclassified |
--| pass | Every route is attributed to a repo and source line, with an owner classification | 2098 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix) |
--| pass | Every background job is listed with its location and an owner classification | 145 timers/jobs, 0 unclassified |
--| pass | Every cross-service call records caller, callee, auth, timeout and retry | 98 call sites; 36 with no timeout detected |
++| pass | Every table has an owner classification | 629 tables classified, 0 unclassified |
++| pass | Every route is attributed to a repo and source line, with an owner classification | 2102 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix) |
++| pass | Every background job is listed with its location and an owner classification | 147 timers/jobs, 0 unclassified |
++| pass | Every cross-service call records caller, callee, auth, timeout and retry | 98 call sites; 37 with no timeout detected |
| pass | Unknowns are marked unknown, not guessed | 2 unknown items recorded |
| pass | Every D01-D46 requirement has a status and verified acceptance artifacts (requirement ledger) | 46/46 requirements verified |
| **open** | Hazard register reviewed by the production-host owner | pending: set reviewedBy in data/hazards.json after review |
ddiff --git a/docs/roadmap-baseline/data/ownership-rules.json b/docs/roadmap-baseline/data/ownership-rules.json
iindex deae2d94..ea579472 100644
---- a/docs/roadmap-baseline/data/ownership-rules.json
++++ b/docs/roadmap-baseline/data/ownership-rules.json
@@@ -536,6 +536,22 @@
"disposition": "investigate",
"wave": "W0",
"note": "Exists in a production database but no CREATE TABLE in the repo."
++ },
++ {
++ "repo": "OpenVibe.Live",
++ "match": "^(channel_points_log|opencoin_admin_grants)$",
++ "target": "OpenVibe.Billing (loyalty ledger)",
++ "disposition": "extract",
++ "wave": "W8 (after ADR-012)",
++ "note": "Idempotency logs for channel points and admin OpenCoins grants (2026-09-24, ADR-012 rule 5); they move with the loyalty tables."
++ },
++ {
++ "repo": "OpenVibe.Live",
++ "match": "^tips_deliveries$",
++ "target": "keep",
++ "disposition": "keep",
++ "wave": "W9",
++ "note": "Live's side of Tips delivery idempotency (Idempotency-Key -> stored response, pruned after 7 days); Live renders the delivery."
}
],
"_routeDispositions": {
@@@ -907,6 +923,22 @@
"disposition": "keep",
"wave": "-",
"note": "The service is the authority for its own API and pages."
++ },
++ {
++ "repo": "OpenVibe.Live",
++ "match": "^/api/content/(feed|moments)$",
++ "target": "keep",
++ "disposition": "keep",
++ "wave": "§33",
++ "note": "Content (human) and Moments (AI) feeds merged from Media and Community (2026-09-23)."
++ },
++ {
++ "repo": "OpenVibe.Live",
++ "match": "^/llms\\.txt$",
++ "target": "keep",
++ "disposition": "keep",
++ "wave": "§32",
++ "note": "Crawler/AI readability page."
}
],
"jobs": [
ddiff --git a/docs/roadmap-baseline/data/requirement-ledger.json b/docs/roadmap-baseline/data/requirement-ledger.json
iindex 17a6efd8..7f5cd6cf 100644
---- a/docs/roadmap-baseline/data/requirement-ledger.json
++++ b/docs/roadmap-baseline/data/requirement-ledger.json
@@@ -1193,7 +1193,7 @@
"owner": "OpenVibe.Live (server/lineage/resolver.js, GET|POST /internal/lineage/resolve); contract in OpenVibe.Contracts",
"target": "shared lineage-resolver contract",
"status": "partial",
-- "summary": "The lineage-resolver contract exists (openvibe-contracts v0.32.0: lineage.resolve-request@1 -> lineage.resolution@1, capability live.lineage.resolve) and is implemented once in Live, deployed 2026-09-23 21:36 UTC: it answers which channel, and whose, a slug, nested slug, channel id, stream, slot, VOD, clip, Media object, owner subject or legacy id belongs to, in the roadmap's precedence, with explicit unresolved states (conflict, source_unavailable, display_name_only, not_found) and never from a display name; VODs, clips and objects come from Media. Live's clip owner check uses it. No other service calls it yet (no principal holds live.lineage.resolve), OpenRe sessions record no lineage, and Media objects still lack owner_subject.",
++ "summary": "The lineage-resolver contract exists (openvibe-contracts v0.32.0: lineage.resolve-request@1 -> lineage.resolution@1, capability live.lineage.resolve) and is implemented once in Live, deployed 2026-09-23 21:36 UTC: it answers which channel, and whose, a slug, nested slug, channel id, stream, slot, VOD, clip, Media object, owner subject or legacy id belongs to, in the roadmap's precedence, with explicit unresolved states (conflict, source_unavailable, display_name_only, not_found) and never from a display name; VODs, clips and objects come from Media. Live's clip owner check uses it. OpenRe, Media and Community hold live.lineage.resolve (2026-09-24) but do not call it yet; OpenRe sessions record no lineage. Media owner_subject is filled on all 3,034 owned objects (2026-09-23) with a 10-minute reconcile job for new ones.",
"artifacts": [
{
"kind": "doc",
@@@ -1218,9 +1218,8 @@
}
],
"remaining": [
-- "Grant live.lineage.resolve to the consumers (OpenRe, Media, Pulse, creator UI) once their contracts pin is 0.32.0+, and switch their per-product channel mappings to the resolver",
-- "Record VOD/clip lineage to OpenRe session (roadmap §20 'VOD lineage maps back to the canonical channel, stream and session'); no OpenRe session exists in production yet",
-- "Backfill Media owner_subject so the resolver has a subject for every object (Live now knows the subject of all 328 linked accounts)"
++ "Switch OpenRe, Media and Community (Pulse) channel mappings to the resolver: they hold live.lineage.resolve since 2026-09-24 (Network 80a841c) but still use their own mappings",
++ "Record VOD/clip lineage to OpenRe session (roadmap §20); no OpenRe session exists in production yet"
],
"blockedOn": null,
"ownerReview": false
ddiff --git a/docs/roadmap-baseline/inventory.json b/docs/roadmap-baseline/inventory.json
iindex d892e844..726323b5 100644
---- a/docs/roadmap-baseline/inventory.json
++++ b/docs/roadmap-baseline/inventory.json
@@@ -1,32 +1,32 @@
{
"generatedFrom": {
-- "OpenVibe.Live": "ca7cc87672602e35756b8b348559543efab1bc38",
-- "OpenVibe.Network": "09bf748b7f459ac127b3f4045085c20189d39dbb",
-- "OpenVibe.Shared": "c2726807c19505bc22d2bce794188a9d1516b022",
-- "OpenVibe.Media": "ad2217be56627efca799fd3ce0987d91cb6f3e24",
-- "OpenVibe.Tools": "5d1b42357392d47e5cc3f6bef3f22facdc6c23cd",
-- "OpenVibe.Community": "63b90a838d280aada7d6c98aee61335b972c1105",
-- "OpenVibe.Games": "7863fc6a71890b264c29ddd6bfa7e4c162da4883",
-- "OpenVibe.Sites": "d6e4cbd3a2091bb9970ee15504c7758da8a96a24",
-- "OpenVibe.Events": "efc09a795ea0fdea9e6eca04f20cc44362b91e3f",
-- "OpenVibe.Chat": "ed90461e2fd4537332275f6efec8bb878ce4ac2a",
-- "OpenRe.Stream": "c091a0959a6d727ec702ee589300cd42a0902be9",
-- "OpenVibe.Billing": "aa445d0c8b7351afae910b9572a2f9ae674e0914",
-- "OpenVibe.Tips": "f211c03ed01b58dd52d104bda8b07ce1a82da2db",
-- "OpenVibe.VIP": "fe7eaad183622f303d2ea1efde80d1674478d948",
-- "OpenVibe.AI": "3a480ac9f20ca018f5c2c8973f92d32dbe1a44cd",
-- "OpenVibe.Search": "a707e38f87a077bbf2f570537a89b2f890d45e22",
-- "OpenVibe.Sources": "2e986af27a5554fd01803daf9e55c726deded80d",
-- "OpenVibe.Wiki": "b4e70acdab789cefc24aa9b5ab2a40fecc7be9d5",
-- "OpenVibe.Blog": "95e99acdcf4610f244b64d8e34afcb8f394685d9",
-- "OpenVibe.News": "5b393d27ba4167910e8019874a92f3d5dbf455cb",
-- "OpenVibe.Reviews": "a7b50a6231c44271e0611df2e25e366a980a13c4",
-- "OpenVibe.Deals": "91ca2235e0a4c7018a0b0bf5f49ba1f32db6d018",
-- "OpenVibe.Coupons": "1c57c4743b016ecf6f72d8d03feb7f56806920a6",
-- "OpenVibe.Trade": "ddbc60c5e2f5ab16cfd17cd126803c9c24784662",
-- "OpenVibe.Codes": "51d23865f2630203cf734c019309c7ffc053f89c",
-- "OpenVibe.Host": "03dfcb32a9fecb85d509f5d92d0a166a26d86fe7",
-- "OpenVibe.Examples": "d5f4efc02165f42b9feac5d2743de6e6c75c27de"
++ "OpenVibe.Live": "12c1c11920027b5c511a2916bbe63aae699596e7",
++ "OpenVibe.Network": "26c0395dbd9b654cd53c9ba33d38255a5fc32d27",
++ "OpenVibe.Shared": "c7489fc8690967ffebcd9f0b45790e577b9fa468",
++ "OpenVibe.Media": "984e7ad9364971286ed1a9665159c5f304372344",
++ "OpenVibe.Tools": "b0aada2c3887b009176ceb934e7df98faa666cae",
++ "OpenVibe.Community": "e075d39907c6e9f6d02ae45a760b1052158417d5",
++ "OpenVibe.Games": "4e5bc50590375e514de14b9a0fa384a601f69b2a",
++ "OpenVibe.Sites": "63683d22217b0ddb7488b5e4b56932c37b426e28",
++ "OpenVibe.Events": "9f515142868af343b42c1c58faac1fd6805076fc",
++ "OpenVibe.Chat": "1ef6f992570328e6f7c8c7a8e5168226fb2987db",
++ "OpenRe.Stream": "e517ed43466184790187143c974313f1fe7125b3",
++ "OpenVibe.Billing": "42ad547a34d098e28e1ad9abb4ad6759fbac5bdb",
++ "OpenVibe.Tips": "847d22a7a0594881c3204b6aac48bacbfa6087ea",
++ "OpenVibe.VIP": "a0a8f7566414fd0c04da0ddbe5a6bcb1df624027",
++ "OpenVibe.AI": "a6d4f39b6562dbd70a343a7d1c61ad46f57c3826",
++ "OpenVibe.Search": "46035416946d065627a4ed1ec89b5b0ac7a302ec",
++ "OpenVibe.Sources": "cf003901ae1000a9f0e568d05390da2c36180dcc",
++ "OpenVibe.Wiki": "fe113b90321852c24f11f1d19905bd77fbe7f463",
++ "OpenVibe.Blog": "0784b429a1bdcc3c770abed5800ca5171ecb0cf2",
++ "OpenVibe.News": "42ce43b84b830ed37f8e02389f4bbdae20212510",
++ "OpenVibe.Reviews": "70de372e0c2826c061080826f192ca2d0a51c6a4",
++ "OpenVibe.Deals": "3910b58cd10a700a22c6c7129cd4c1c1e586cc95",
++ "OpenVibe.Coupons": "ae3a25ed5d4e33f81df1147940d8f3100d13513b",
++ "OpenVibe.Trade": "7f418d25e8ca7288a8cf09738e7c8b5609c2578b",
++ "OpenVibe.Codes": "a1294156cdb9aa3d82c15708c12509d805ff561f",
++ "OpenVibe.Host": "f8ac37d08425f0ff3779084db7146eb262576769",
++ "OpenVibe.Examples": "0bbe579f685cfe1b495699b0e69c7fbf6ee1f27c"
},
"prodSnapshot": {
"host": "openvibe-oregon",
@@@ -38,18 +38,18 @@
"service": "live",
"present": true,
"git": {
-- "head": "ca7cc87672602e35756b8b348559543efab1bc38",
++ "head": "12c1c11920027b5c511a2916bbe63aae699596e7",
"branch": "main",
-- "originMain": "ca7cc87672602e35756b8b348559543efab1bc38",
-- "committedAt": "2026-09-23T14:33:07-07:00"
++ "originMain": "12c1c11920027b5c511a2916bbe63aae699596e7",
++ "committedAt": "2026-09-23T19:28:11-07:00"
},
-- "sourceFiles": 194,
-- "loc": 74460,
++ "sourceFiles": 197,
++ "loc": 72676,
"tables": [
{
"table": "arena_profiles",
"file": "server/arena/arena-service.js",
-- "line": 82,
++ "line": 83,
"via": "repo"
},
{
@@@ -118,6 +118,18 @@
"line": 57,
"via": "repo"
},
++ {
++ "table": "user_tags",
++ "file": "server/chat/tags.js",
++ "line": 52,
++ "via": "repo"
++ },
++ {
++ "table": "user_equipped_tag",
++ "file": "server/chat/tags.js",
++ "line": 61,
++ "via": "repo"
++ },
{
"table": "comment_thread_refs",
"file": "server/comments-client.js",
@@@ -127,349 +139,355 @@
{
"table": "vod_ai_state",
"file": "server/db/database.js",
-- "line": 265,
++ "line": 266,
"via": "repo"
},
{
"table": "clip_ai_state",
"file": "server/db/database.js",
-- "line": 274,
++ "line": 275,
"via": "repo"
},
{
"table": "site_settings",
"file": "server/db/database.js",
-- "line": 355,
++ "line": 356,
"via": "repo"
},
{
"table": "verification_keys",
"file": "server/db/database.js",
-- "line": 366,
++ "line": 367,
"via": "repo"
},
{
"table": "linked_accounts",
"file": "server/db/database.js",
-- "line": 386,
++ "line": 387,
"via": "repo"
},
{
"table": "chat_messages_new",
"file": "server/db/database.js",
-- "line": 421,
++ "line": 422,
"via": "repo"
},
{
"table": "translations",
"file": "server/db/database.js",
-- "line": 512,
++ "line": 513,
"via": "repo"
},
{
"table": "robotstreamer_integrations",
"file": "server/db/database.js",
-- "line": 611,
++ "line": 615,
"via": "repo"
},
{
"table": "robotstreamer_integrations_new",
"file": "server/db/database.js",
-- "line": 662,
++ "line": 666,
"via": "repo"
},
{
"table": "restream_destinations",
"file": "server/db/database.js",
-- "line": 697,
++ "line": 701,
"via": "repo"
},
{
"table": "platform_connections",
"file": "server/db/database.js",
-- "line": 715,
++ "line": 719,
"via": "repo"
},
{
"table": "powerchat_connections",
"file": "server/db/database.js",
-- "line": 737,
++ "line": 741,
"via": "repo"
},
{
"table": "powerchat_webhook_deliveries",
"file": "server/db/database.js",
-- "line": 754,
++ "line": 758,
"via": "repo"
},
{
"table": "channel_points",
"file": "server/db/database.js",
-- "line": 766,
++ "line": 770,
"via": "repo"
},
{
-- "table": "kick_channel_cache",
++ "table": "channel_points_log",
"file": "server/db/database.js",
"line": 780,
"via": "repo"
},
++ {
++ "table": "kick_channel_cache",
++ "file": "server/db/database.js",
++ "line": 797,
++ "via": "repo"
++ },
{
"table": "comments",
"file": "server/db/database.js",
-- "line": 855,
++ "line": 872,
"via": "repo"
},
{
"table": "media_request_settings",
"file": "server/db/database.js",
-- "line": 875,
++ "line": 892,
"via": "repo"
},
{
"table": "media_requests",
"file": "server/db/database.js",
-- "line": 889,
++ "line": 906,
"via": "repo"
},
{
"table": "anon_ip_mappings",
"file": "server/db/database.js",
-- "line": 942,
++ "line": 964,
"via": "repo"
},
{
"table": "app_state",
"file": "server/db/database.js",
-- "line": 1174,
++ "line": 1196,
"via": "repo"
},
{
"table": "stream_memories",
"file": "server/db/database.js",
-- "line": 1188,
++ "line": 1210,
"via": "repo"
},
{
"table": "stream_timeline_events",
"file": "server/db/database.js",
-- "line": 1236,
++ "line": 1259,
"via": "repo"
},
{
"table": "ai_usage",
"file": "server/db/database.js",
-- "line": 1261,
++ "line": 1284,
"via": "repo"
},
{
"table": "streamer_overviews",
"file": "server/db/database.js",
-- "line": 1281,
++ "line": 1304,
"via": "repo"
},
{
"table": "ai_timeline_cache",
"file": "server/db/database.js",
-- "line": 1303,
++ "line": 1326,
"via": "repo"
},
{
"table": "chat_ai_summaries",
"file": "server/db/database.js",
-- "line": 1315,
++ "line": 1338,
"via": "repo"
},
{
"table": "chat_timeline_events",
"file": "server/db/database.js",
-- "line": 1335,
++ "line": 1358,
"via": "repo"
},
{
"table": "easter_egg_solves",
"file": "server/db/database.js",
-- "line": 1347,
++ "line": 1370,
"via": "repo"
},
{
"table": "tts_voice_overrides",
"file": "server/db/database.js",
-- "line": 1359,
++ "line": 1382,
"via": "repo"
},
{
"table": "relay_users",
"file": "server/db/database.js",
-- "line": 1472,
++ "line": 1495,
"via": "repo"
},
{
"table": "payment_orders",
"file": "server/db/database.js",
-- "line": 1567,
++ "line": 1590,
"via": "repo"
},
{
"table": "channel_moderators",
"file": "server/db/database.js",
-- "line": 1600,
++ "line": 1623,
"via": "repo"
},
{
"table": "channel_moderation_settings",
"file": "server/db/database.js",
-- "line": 1617,
++ "line": 1640,
"via": "repo"
},
{
"table": "emotes_new",
"file": "server/db/database.js",
-- "line": 1688,
++ "line": 1711,
"via": "repo"
},
{
"table": "channel_sounds",
"file": "server/db/database.js",
-- "line": 1720,
++ "line": 1743,
"via": "repo"
},
{
"table": "channel_sounds_new",
"file": "server/db/database.js",
-- "line": 1744,
++ "line": 1767,
"via": "repo"
},
{
"table": "ai_chatbot_configs",
"file": "server/db/database.js",
-- "line": 1782,
++ "line": 1805,
"via": "repo"
},
{
"table": "channel_ai_bots",
"file": "server/db/database.js",
-- "line": 1807,
++ "line": 1830,
"via": "repo"
},
{
"table": "channel_ai_config",
"file": "server/db/database.js",
-- "line": 1831,
++ "line": 1854,
"via": "repo"
},
{
"table": "ai_viewer_threads",
"file": "server/db/database.js",
-- "line": 1852,
++ "line": 1875,
"via": "repo"
},
{
"table": "ai_viewer_log",
"file": "server/db/database.js",
-- "line": 1866,
++ "line": 1889,
"via": "repo"
},
{
"table": "moderation_actions",
"file": "server/db/database.js",
-- "line": 1899,
++ "line": 1922,
"via": "repo"
},
{
"table": "pastes",
"file": "server/db/database.js",
-- "line": 1918,
++ "line": 1941,
"via": "repo"
},
{
"table": "paste_likes",
"file": "server/db/database.js",
-- "line": 1955,
++ "line": 1978,
"via": "repo"
},
{
"table": "paste_comments",
"file": "server/db/database.js",
-- "line": 1987,
++ "line": 2010,
"via": "repo"
},
{
"table": "stream_first_chats",
"file": "server/db/database.js",
-- "line": 2019,
++ "line": 2042,
"via": "repo"
},
{
"table": "ip_log",
"file": "server/db/database.js",
-- "line": 2030,
++ "line": 2053,
"via": "repo"
},
{
"table": "approved_ips",
"file": "server/db/database.js",
-- "line": 2054,
++ "line": 2077,
"via": "repo"
},
{
"table": "pending_ip_messages",
"file": "server/db/database.js",
-- "line": 2071,
++ "line": 2094,
"via": "repo"
},
{
"table": "hidden_relay_users",
"file": "server/db/database.js",
-- "line": 2091,
++ "line": 2114,
"via": "repo"
},
{
"table": "control_whitelist",
"file": "server/db/database.js",
-- "line": 2249,
++ "line": 2272,
"via": "repo"
},
{
"table": "control_configs",
"file": "server/db/database.js",
-- "line": 2264,
++ "line": 2287,
"via": "repo"
},
{
"table": "control_config_buttons",
"file": "server/db/database.js",
-- "line": 2278,
++ "line": 2301,
"via": "repo"
},
{
"table": "stream_controls_new",
"file": "server/db/database.js",
-- "line": 2357,
++ "line": 2380,
"via": "repo"
},
{
"table": "managed_streams",
"file": "server/db/database.js",
-- "line": 2392,
++ "line": 2415,
"via": "repo"
},
{
"table": "vibe_coding_sessions",
"file": "server/db/database.js",
-- "line": 2614,
++ "line": 2637,
"via": "repo"
},
{
"table": "vibe_coding_events",
"file": "server/db/database.js",
-- "line": 2649,
++ "line": 2672,
"via": "repo"
},
{
"table": "viewer_samples",
"file": "server/db/database.js",
-- "line": 3832,
++ "line": 3855,
"via": "repo"
},
{
@@@ -736,132 +754,6 @@
"line": 825,
"via": "repo"
},
-- {
-- "table": "game_fish_collection",
-- "file": "server/game/game-engine.js",
-- "line": 522,
-- "via": "repo"
-- },
-- {
-- "table": "game_achievements",
-- "file": "server/game/game-engine.js",
-- "line": 536,
-- "via": "repo"
-- },
-- {
-- "table": "game_daily_quest_progress",
-- "file": "server/game/game-engine.js",
-- "line": 546,
-- "via": "repo"
-- },
-- {
-- "table": "game_daily_quest_claims",
-- "file": "server/game/game-engine.js",
-- "line": 557,
-- "via": "repo"
-- },
-- {
-- "table": "game_world_state",
-- "file": "server/game/schema.sql",
-- "line": 7,
-- "via": "repo"
-- },
-- {
-- "table": "game_players",
-- "file": "server/game/schema.sql",
-- "line": 13,
-- "via": "repo"
-- },
-- {
-- "table": "game_inventory",
-- "file": "server/game/schema.sql",
-- "line": 66,
-- "via": "repo"
-- },
-- {
-- "table": "game_bank",
-- "file": "server/game/schema.sql",
-- "line": 77,
-- "via": "repo"
-- },
-- {
-- "table": "game_structures",
-- "file": "server/game/schema.sql",
-- "line": 87,
-- "via": "repo"
-- },
-- {
-- "table": "game_farm_plots",
-- "file": "server/game/schema.sql",
-- "line": 104,
-- "via": "repo"
-- },
-- {
-- "table": "game_recipes",
-- "file": "server/game/schema.sql",
-- "line": 118,
-- "via": "repo"
-- },
-- {
-- "table": "game_effects",
-- "file": "server/game/schema.sql",
-- "line": 128,
-- "via": "repo"
-- },
-- {
-- "table": "game_battle_stats",
-- "file": "server/game/schema.sql",
-- "line": 142,
-- "via": "repo"
-- },
-- {
-- "table": "game_dungeon_runs",
-- "file": "server/game/schema.sql",
-- "line": 156,
-- "via": "repo"
-- },
-- {
-- "table": "game_leaderboard",
-- "file": "server/game/schema.sql",
-- "line": 168,
-- "via": "repo"
-- },
-- {
-- "table": "game_fish_collection",
-- "file": "server/game/schema.sql",
-- "line": 180,
-- "via": "repo"
-- },
-- {
-- "table": "game_daily_quest_progress",
-- "file": "server/game/schema.sql",
-- "line": 192,
-- "via": "repo"
-- },
-- {
-- "table": "game_daily_quest_claims",
-- "file": "server/game/schema.sql",
-- "line": 203,
-- "via": "repo"
-- },
-- {
-- "table": "user_tags",
-- "file": "server/game/tags.js",
-- "line": 67,
-- "via": "repo"
-- },
-- {
-- "table": "user_equipped_tag",
-- "file": "server/game/tags.js",
-- "line": 76,
-- "via": "repo"
-- },
-- {
-- "table": "tag_guardian_defeats",
-- "file": "server/game/tags.js",
-- "line": 81,
-- "via": "repo"
-- },
{
"table": "translations",
"file": "server/i18n/translate.js",
@@@ -886,6 +778,12 @@
"line": 120,
"via": "repo"
},
++ {
++ "table": "opencoin_admin_grants",
++ "file": "server/monetization/opencoins.js",
++ "line": 330,
++ "via": "repo"
++ },
{
"table": "news_settings",
"file": "server/news/news-service.js",
@@@ -903,6 +801,12 @@
"file": "server/recap/recap.js",
"line": 27,
"via": "repo"
++ },
++ {
++ "table": "tips_deliveries",
++ "file": "server/tips/delivery-routes.js",
++ "line": 39,
++ "via": "repo"
}
],
"routes": [
@@@ -1020,7 +924,7 @@
"method": "GET",
"path": "/api/admin/analytics",
"file": "server/index.js",
-- "line": 709,
++ "line": 717,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1030,7 +934,7 @@
"method": "GET",
"path": "/api/admin/analytics/bots",
"file": "server/index.js",
-- "line": 718,
++ "line": 726,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1050,7 +954,7 @@
"method": "POST",
"path": "/api/admin/broadcast",
"file": "server/index.js",
-- "line": 826,
++ "line": 837,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1080,7 +984,7 @@
"method": "DELETE",
"path": "/api/admin/media-tools/cookies",
"file": "server/admin/routes.js",
-- "line": 1250,
++ "line": 1251,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1090,7 +994,7 @@
"method": "PUT",
"path": "/api/admin/media-tools/cookies",
"file": "server/admin/routes.js",
-- "line": 1169,
++ "line": 1170,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1100,7 +1004,7 @@
"method": "POST",
"path": "/api/admin/media-tools/cookies/check",
"file": "server/admin/routes.js",
-- "line": 1228,
++ "line": 1229,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1110,7 +1014,7 @@
"method": "DELETE",
"path": "/api/admin/media-tools/extra-args",
"file": "server/admin/routes.js",
-- "line": 1283,
++ "line": 1284,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1120,7 +1024,7 @@
"method": "PUT",
"path": "/api/admin/media-tools/extra-args",
"file": "server/admin/routes.js",
-- "line": 1264,
++ "line": 1265,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1130,7 +1034,7 @@
"method": "GET",
"path": "/api/admin/media-tools/status",
"file": "server/admin/routes.js",
-- "line": 1124,
++ "line": 1125,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1140,7 +1044,7 @@
"method": "POST",
"path": "/api/admin/media-tools/test",
"file": "server/admin/routes.js",
-- "line": 1294,
++ "line": 1295,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1290,7 +1194,7 @@
"method": "DELETE",
"path": "/api/admin/storage/clips/bulk",
"file": "server/admin/routes.js",
-- "line": 1074,
++ "line": 1075,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1300,7 +1204,7 @@
"method": "GET",
"path": "/api/admin/storage/vods",
"file": "server/admin/routes.js",
-- "line": 1024,
++ "line": 1025,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -1310,7 +1214,7 @@
"method": "DELETE",
"path": "/api/admin/storage/vods/bulk",
"file": "server/admin/routes.js",
-- "line": 1043,
++ "line": 1044,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -2200,7 +2104,7 @@
"method": "GET",
"path": "/api/chat/:streamId/history",
"file": "server/chat/routes.js",
-- "line": 509,
++ "line": 489,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2210,7 +2114,7 @@
"method": "GET",
"path": "/api/chat/:streamId/replay",
"file": "server/chat/routes.js",
-- "line": 487,
++ "line": 467,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2220,7 +2124,7 @@
"method": "GET",
"path": "/api/chat/:streamId/users",
"file": "server/chat/routes.js",
-- "line": 633,
++ "line": 613,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2230,7 +2134,7 @@
"method": "GET",
"path": "/api/chat/admin/logs",
"file": "server/chat/routes.js",
-- "line": 718,
++ "line": 698,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2240,7 +2144,7 @@
"method": "GET",
"path": "/api/chat/admin/logs/export",
"file": "server/chat/routes.js",
-- "line": 755,
++ "line": 735,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2250,7 +2154,7 @@
"method": "DELETE",
"path": "/api/chat/admin/purge",
"file": "server/chat/routes.js",
-- "line": 674,
++ "line": 654,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2260,7 +2164,7 @@
"method": "POST",
"path": "/api/chat/admin/purge/preview",
"file": "server/chat/routes.js",
-- "line": 642,
++ "line": 622,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2270,7 +2174,7 @@
"method": "GET",
"path": "/api/chat/anon/:anonId",
"file": "server/chat/routes.js",
-- "line": 419,
++ "line": 399,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2280,7 +2184,7 @@
"method": "GET",
"path": "/api/chat/anon/:anonId/logs",
"file": "server/chat/routes.js",
-- "line": 430,
++ "line": 410,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2290,7 +2194,7 @@
"method": "GET",
"path": "/api/chat/channel/:userId/history",
"file": "server/chat/routes.js",
-- "line": 609,
++ "line": 589,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2300,7 +2204,7 @@
"method": "GET",
"path": "/api/chat/filters/friendly",
"file": "server/chat/routes.js",
-- "line": 462,
++ "line": 442,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2340,7 +2244,7 @@
"method": "GET",
"path": "/api/chat/global/history",
"file": "server/chat/routes.js",
-- "line": 468,
++ "line": 448,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2350,7 +2254,7 @@
"method": "GET",
"path": "/api/chat/relay-user/:platform/:username",
"file": "server/chat/routes.js",
-- "line": 409,
++ "line": 389,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2360,7 +2264,7 @@
"method": "GET",
"path": "/api/chat/relay-user/:platform/:username/logs",
"file": "server/chat/routes.js",
-- "line": 446,
++ "line": 426,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -2410,7 +2314,7 @@
"method": "GET",
"path": "/api/clips",
"file": "server/media-proxy/clips.js",
-- "line": 168,
++ "line": 181,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2420,7 +2324,7 @@
"method": "DELETE",
"path": "/api/clips/:id",
"file": "server/media-proxy/clips.js",
-- "line": 337,
++ "line": 351,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2430,7 +2334,7 @@
"method": "GET",
"path": "/api/clips/:id",
"file": "server/media-proxy/clips.js",
-- "line": 197,
++ "line": 210,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2440,7 +2344,7 @@
"method": "POST",
"path": "/api/clips/:id/recut",
"file": "server/media-proxy/clips.js",
-- "line": 356,
++ "line": 370,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2450,7 +2354,7 @@
"method": "PUT",
"path": "/api/clips/:id/title",
"file": "server/media-proxy/clips.js",
-- "line": 271,
++ "line": 285,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2460,7 +2364,7 @@
"method": "PUT",
"path": "/api/clips/:id/visibility",
"file": "server/media-proxy/clips.js",
-- "line": 288,
++ "line": 302,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2470,7 +2374,7 @@
"method": "POST",
"path": "/api/clips/bulk",
"file": "server/media-proxy/clips.js",
-- "line": 312,
++ "line": 326,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2480,7 +2384,7 @@
"method": "GET",
"path": "/api/clips/mine",
"file": "server/media-proxy/clips.js",
-- "line": 120,
++ "line": 123,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2490,7 +2394,7 @@
"method": "GET",
"path": "/api/clips/my-stream",
"file": "server/media-proxy/clips.js",
-- "line": 134,
++ "line": 141,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2500,7 +2404,7 @@
"method": "GET",
"path": "/api/clips/settings/channel",
"file": "server/media-proxy/clips.js",
-- "line": 146,
++ "line": 159,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2510,7 +2414,7 @@
"method": "PUT",
"path": "/api/clips/settings/channel",
"file": "server/media-proxy/clips.js",
-- "line": 155,
++ "line": 168,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -2520,7 +2424,7 @@
"method": "POST",
"path": "/api/coins/admin/grant",
"file": "server/monetization/coins-routes.js",
-- "line": 310,
++ "line": 316,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -2726,6 +2630,26 @@
"wave": "W5 (done)",
"note": "Forwards to Community with a service token (pastes since 2026-09-22, VOD/clip comments since b8afb71); /p/* 301s to openvibe.community."
},
++ {
++ "method": "GET",
++ "path": "/api/content/feed",
++ "file": "server/content/routes.js",
++ "line": 36,
++ "target": "OpenVibe.Live",
++ "disposition": "keep",
++ "wave": "§33",
++ "note": "Content (human) and Moments (AI) feeds merged from Media and Community (2026-09-23)."
++ },
++ {
++ "method": "GET",
++ "path": "/api/content/moments",
++ "file": "server/content/routes.js",
++ "line": 37,
++ "target": "OpenVibe.Live",
++ "disposition": "keep",
++ "wave": "§33",
++ "note": "Content (human) and Moments (AI) feeds merged from Media and Community (2026-09-23)."
++ },
{
"method": "GET",
"path": "/api/controls/:streamId",
@@@ -3030,7 +2954,7 @@
"method": "POST",
"path": "/api/cosmetics/internal-unlock",
"file": "server/monetization/cosmetics-routes.js",
-- "line": 91,
++ "line": 87,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -3060,7 +2984,7 @@
"method": "POST",
"path": "/api/csp-report",
"file": "server/index.js",
-- "line": 847,
++ "line": 858,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -3070,7 +2994,7 @@
"method": "GET",
"path": "/api/dm/blocks",
"file": "server/chat/dm-routes.js",
-- "line": 401,
++ "line": 402,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3080,7 +3004,7 @@
"method": "DELETE",
"path": "/api/dm/blocks/:userId",
"file": "server/chat/dm-routes.js",
-- "line": 389,
++ "line": 390,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3090,7 +3014,7 @@
"method": "POST",
"path": "/api/dm/blocks/:userId",
"file": "server/chat/dm-routes.js",
-- "line": 374,
++ "line": 375,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3100,7 +3024,7 @@
"method": "GET",
"path": "/api/dm/blocks/check/:userId",
"file": "server/chat/dm-routes.js",
-- "line": 411,
++ "line": 412,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3110,7 +3034,7 @@
"method": "GET",
"path": "/api/dm/conversations",
"file": "server/chat/dm-routes.js",
-- "line": 49,
++ "line": 50,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3120,7 +3044,7 @@
"method": "POST",
"path": "/api/dm/conversations",
"file": "server/chat/dm-routes.js",
-- "line": 64,
++ "line": 65,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3130,7 +3054,7 @@
"method": "GET",
"path": "/api/dm/conversations/:id",
"file": "server/chat/dm-routes.js",
-- "line": 120,
++ "line": 121,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3140,7 +3064,7 @@
"method": "PATCH",
"path": "/api/dm/conversations/:id",
"file": "server/chat/dm-routes.js",
-- "line": 331,
++ "line": 332,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3150,7 +3074,7 @@
"method": "GET",
"path": "/api/dm/conversations/:id/messages",
"file": "server/chat/dm-routes.js",
-- "line": 137,
++ "line": 138,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3160,7 +3084,7 @@
"method": "POST",
"path": "/api/dm/conversations/:id/messages",
"file": "server/chat/dm-routes.js",
-- "line": 155,
++ "line": 156,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3170,7 +3094,7 @@
"method": "DELETE",
"path": "/api/dm/conversations/:id/messages/:msgId",
"file": "server/chat/dm-routes.js",
-- "line": 421,
++ "line": 422,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3180,7 +3104,7 @@
"method": "POST",
"path": "/api/dm/conversations/:id/participants",
"file": "server/chat/dm-routes.js",
-- "line": 256,
++ "line": 257,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3190,7 +3114,7 @@
"method": "DELETE",
"path": "/api/dm/conversations/:id/participants/:userId",
"file": "server/chat/dm-routes.js",
-- "line": 310,
++ "line": 311,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3200,7 +3124,7 @@
"method": "POST",
"path": "/api/dm/conversations/:id/read",
"file": "server/chat/dm-routes.js",
-- "line": 234,
++ "line": 235,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3210,7 +3134,7 @@
"method": "GET",
"path": "/api/dm/unread",
"file": "server/chat/dm-routes.js",
-- "line": 350,
++ "line": 351,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3220,7 +3144,7 @@
"method": "GET",
"path": "/api/dm/users/search",
"file": "server/chat/dm-routes.js",
-- "line": 360,
++ "line": 361,
"target": "OpenVibe.Chat",
"disposition": "shadowed",
"wave": "W6 (done 2026-09-23)",
@@@ -3560,7 +3484,7 @@
"method": "GET",
"path": "/api/health",
"file": "server/index.js",
-- "line": 728,
++ "line": 736,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -3570,7 +3494,7 @@
"method": "GET",
"path": "/api/home/digest",
"file": "server/home/routes.js",
-- "line": 437,
++ "line": 438,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -3580,7 +3504,7 @@
"method": "GET",
"path": "/api/home/discover",
"file": "server/home/routes.js",
-- "line": 487,
++ "line": 488,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -3630,7 +3554,7 @@
"method": "POST",
"path": "/api/home/star/rotate",
"file": "server/home/routes.js",
-- "line": 549,
++ "line": 550,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -3710,7 +3634,7 @@
"method": "GET",
"path": "/api/live-events",
"file": "server/index.js",
-- "line": 651,
++ "line": 658,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -4280,7 +4204,7 @@
"method": "GET",
"path": "/api/pastes",
"file": "server/media-proxy/pastes.js",
-- "line": 167,
++ "line": 168,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4290,7 +4214,7 @@
"method": "POST",
"path": "/api/pastes",
"file": "server/media-proxy/pastes.js",
-- "line": 168,
++ "line": 169,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4300,7 +4224,7 @@
"method": "DELETE",
"path": "/api/pastes/:slug",
"file": "server/media-proxy/pastes.js",
-- "line": 217,
++ "line": 218,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4310,7 +4234,7 @@
"method": "GET",
"path": "/api/pastes/:slug",
"file": "server/media-proxy/pastes.js",
-- "line": 215,
++ "line": 216,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4320,7 +4244,7 @@
"method": "PUT",
"path": "/api/pastes/:slug",
"file": "server/media-proxy/pastes.js",
-- "line": 216,
++ "line": 217,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4330,7 +4254,7 @@
"method": "POST",
"path": "/api/pastes/:slug/censor",
"file": "server/media-proxy/pastes.js",
-- "line": 222,
++ "line": 223,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4340,7 +4264,7 @@
"method": "POST",
"path": "/api/pastes/:slug/censor",
"file": "server/media-proxy/pastes.js",
-- "line": 315,
++ "line": 316,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4350,7 +4274,7 @@
"method": "GET",
"path": "/api/pastes/:slug/comments",
"file": "server/media-proxy/pastes.js",
-- "line": 243,
++ "line": 244,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4360,7 +4284,7 @@
"method": "POST",
"path": "/api/pastes/:slug/comments",
"file": "server/media-proxy/pastes.js",
-- "line": 246,
++ "line": 247,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4370,7 +4294,7 @@
"method": "DELETE",
"path": "/api/pastes/:slug/comments/:commentId",
"file": "server/media-proxy/pastes.js",
-- "line": 248,
++ "line": 249,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4380,7 +4304,7 @@
"method": "POST",
"path": "/api/pastes/:slug/copy",
"file": "server/media-proxy/pastes.js",
-- "line": 242,
++ "line": 243,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4390,7 +4314,7 @@
"method": "POST",
"path": "/api/pastes/:slug/fork",
"file": "server/media-proxy/pastes.js",
-- "line": 238,
++ "line": 239,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4400,7 +4324,7 @@
"method": "POST",
"path": "/api/pastes/:slug/like",
"file": "server/media-proxy/pastes.js",
-- "line": 241,
++ "line": 242,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4410,7 +4334,7 @@
"method": "GET",
"path": "/api/pastes/:slug/raw",
"file": "server/media-proxy/pastes.js",
-- "line": 240,
++ "line": 241,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4420,7 +4344,7 @@
"method": "GET",
"path": "/api/pastes/:slug/raw",
"file": "server/media-proxy/pastes.js",
-- "line": 311,
++ "line": 312,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4430,7 +4354,7 @@
"method": "POST",
"path": "/api/pastes/:slug/set-avatar",
"file": "server/media-proxy/pastes.js",
-- "line": 110,
++ "line": 111,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4440,7 +4364,7 @@
"method": "POST",
"path": "/api/pastes/:slug/set-avatar",
"file": "server/media-proxy/pastes.js",
-- "line": 296,
++ "line": 297,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4450,7 +4374,7 @@
"method": "DELETE",
"path": "/api/pastes/admin/forks",
"file": "server/media-proxy/pastes.js",
-- "line": 171,
++ "line": 172,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4460,7 +4384,7 @@
"method": "DELETE",
"path": "/api/pastes/admin/forks",
"file": "server/media-proxy/pastes.js",
-- "line": 313,
++ "line": 314,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4470,7 +4394,7 @@
"method": "GET",
"path": "/api/pastes/admin/stats",
"file": "server/media-proxy/pastes.js",
-- "line": 170,
++ "line": 171,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4480,7 +4404,7 @@
"method": "POST",
"path": "/api/pastes/bulk",
"file": "server/media-proxy/pastes.js",
-- "line": 172,
++ "line": 173,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4490,7 +4414,7 @@
"method": "POST",
"path": "/api/pastes/bulk",
"file": "server/media-proxy/pastes.js",
-- "line": 314,
++ "line": 315,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4500,7 +4424,7 @@
"method": "GET",
"path": "/api/pastes/by-user/:username",
"file": "server/media-proxy/pastes.js",
-- "line": 177,
++ "line": 178,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4510,7 +4434,7 @@
"method": "GET",
"path": "/api/pastes/config",
"file": "server/media-proxy/pastes.js",
-- "line": 169,
++ "line": 170,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4520,7 +4444,7 @@
"method": "POST",
"path": "/api/pastes/screenshot",
"file": "server/media-proxy/pastes.js",
-- "line": 83,
++ "line": 84,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -4750,7 +4674,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/index.js",
-- "line": 766,
++ "line": 777,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -4790,7 +4714,7 @@
"method": "GET",
"path": "/api/restream/destinations",
"file": "server/streaming/restream-routes.js",
-- "line": 174,
++ "line": 177,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4800,7 +4724,7 @@
"method": "POST",
"path": "/api/restream/destinations",
"file": "server/streaming/restream-routes.js",
-- "line": 196,
++ "line": 201,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4810,7 +4734,7 @@
"method": "DELETE",
"path": "/api/restream/destinations/:id",
"file": "server/streaming/restream-routes.js",
-- "line": 362,
++ "line": 367,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4820,7 +4744,7 @@
"method": "PUT",
"path": "/api/restream/destinations/:id",
"file": "server/streaming/restream-routes.js",
-- "line": 272,
++ "line": 277,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4830,7 +4754,7 @@
"method": "POST",
"path": "/api/restream/destinations/:id/start",
"file": "server/streaming/restream-routes.js",
-- "line": 386,
++ "line": 391,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4840,7 +4764,7 @@
"method": "POST",
"path": "/api/restream/destinations/:id/stop",
"file": "server/streaming/restream-routes.js",
-- "line": 443,
++ "line": 448,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4850,7 +4774,7 @@
"method": "GET",
"path": "/api/restream/oauth/:platform/callback",
"file": "server/streaming/restream-routes.js",
-- "line": 623,
++ "line": 645,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4860,7 +4784,7 @@
"method": "DELETE",
"path": "/api/restream/oauth/:platform/connection",
"file": "server/streaming/restream-routes.js",
-- "line": 717,
++ "line": 739,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4870,7 +4794,7 @@
"method": "GET",
"path": "/api/restream/oauth/:platform/start",
"file": "server/streaming/restream-routes.js",
-- "line": 609,
++ "line": 631,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4880,7 +4804,7 @@
"method": "GET",
"path": "/api/restream/oauth/status",
"file": "server/streaming/restream-routes.js",
-- "line": 587,
++ "line": 609,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4890,7 +4814,7 @@
"method": "GET",
"path": "/api/restream/presets",
"file": "server/streaming/restream-routes.js",
-- "line": 164,
++ "line": 165,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4900,7 +4824,7 @@
"method": "GET",
"path": "/api/restream/status",
"file": "server/streaming/restream-routes.js",
-- "line": 464,
++ "line": 469,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4910,7 +4834,7 @@
"method": "GET",
"path": "/api/restream/viewer-config",
"file": "server/streaming/restream-routes.js",
-- "line": 513,
++ "line": 535,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4920,7 +4844,7 @@
"method": "GET",
"path": "/api/restream/viewer-counts",
"file": "server/streaming/restream-routes.js",
-- "line": 503,
++ "line": 511,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4930,7 +4854,7 @@
"method": "POST",
"path": "/api/restream/viewer-counts",
"file": "server/streaming/restream-routes.js",
-- "line": 485,
++ "line": 490,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4940,7 +4864,7 @@
"method": "DELETE",
"path": "/api/robotstreamer/integration",
"file": "server/integrations/routes.js",
-- "line": 226,
++ "line": 232,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4950,7 +4874,7 @@
"method": "GET",
"path": "/api/robotstreamer/integration",
"file": "server/integrations/routes.js",
-- "line": 41,
++ "line": 52,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4960,7 +4884,7 @@
"method": "PUT",
"path": "/api/robotstreamer/integration",
"file": "server/integrations/routes.js",
-- "line": 152,
++ "line": 158,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4970,7 +4894,7 @@
"method": "POST",
"path": "/api/robotstreamer/integration/login",
"file": "server/integrations/routes.js",
-- "line": 107,
++ "line": 115,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4980,7 +4904,7 @@
"method": "POST",
"path": "/api/robotstreamer/integration/validate",
"file": "server/integrations/routes.js",
-- "line": 70,
++ "line": 79,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -4990,7 +4914,7 @@
"method": "POST",
"path": "/api/robotstreamer/restream/start",
"file": "server/integrations/routes.js",
-- "line": 194,
++ "line": 200,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -5000,7 +4924,7 @@
"method": "POST",
"path": "/api/robotstreamer/restream/stop",
"file": "server/integrations/routes.js",
-- "line": 214,
++ "line": 220,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -5100,7 +5024,7 @@
"method": "GET",
"path": "/api/streams",
"file": "server/streaming/routes.js",
-- "line": 1093,
++ "line": 1126,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5110,7 +5034,7 @@
"method": "POST",
"path": "/api/streams",
"file": "server/streaming/routes.js",
-- "line": 1924,
++ "line": 1957,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5120,7 +5044,7 @@
"method": "DELETE",
"path": "/api/streams/:id",
"file": "server/streaming/routes.js",
-- "line": 2119,
++ "line": 2152,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5130,7 +5054,7 @@
"method": "GET",
"path": "/api/streams/:id",
"file": "server/streaming/routes.js",
-- "line": 1876,
++ "line": 1909,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5140,7 +5064,7 @@
"method": "PUT",
"path": "/api/streams/:id",
"file": "server/streaming/routes.js",
-- "line": 2068,
++ "line": 2101,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5150,7 +5074,7 @@
"method": "GET",
"path": "/api/streams/:id/call",
"file": "server/streaming/routes.js",
-- "line": 2438,
++ "line": 2471,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5160,7 +5084,7 @@
"method": "PUT",
"path": "/api/streams/:id/call",
"file": "server/streaming/routes.js",
-- "line": 2399,
++ "line": 2432,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5170,7 +5094,7 @@
"method": "GET",
"path": "/api/streams/:id/endpoint",
"file": "server/streaming/routes.js",
-- "line": 2166,
++ "line": 2199,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5180,7 +5104,7 @@
"method": "POST",
"path": "/api/streams/:id/follow",
"file": "server/streaming/routes.js",
-- "line": 2307,
++ "line": 2340,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5190,7 +5114,7 @@
"method": "POST",
"path": "/api/streams/:id/heartbeat",
"file": "server/streaming/routes.js",
-- "line": 2264,
++ "line": 2297,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5200,7 +5124,7 @@
"method": "GET",
"path": "/api/streams/:id/rtmp-status",
"file": "server/streaming/routes.js",
-- "line": 2282,
++ "line": 2315,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5210,7 +5134,7 @@
"method": "GET",
"path": "/api/streams/broadcast-settings",
"file": "server/streaming/routes.js",
-- "line": 1393,
++ "line": 1426,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5220,7 +5144,7 @@
"method": "PUT",
"path": "/api/streams/broadcast-settings",
"file": "server/streaming/routes.js",
-- "line": 1410,
++ "line": 1443,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5230,7 +5154,7 @@
"method": "GET",
"path": "/api/streams/channel",
"file": "server/streaming/routes.js",
-- "line": 645,
++ "line": 674,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5240,7 +5164,7 @@
"method": "PUT",
"path": "/api/streams/channel",
"file": "server/streaming/routes.js",
-- "line": 657,
++ "line": 686,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5250,7 +5174,7 @@
"method": "GET",
"path": "/api/streams/channel/:username",
"file": "server/streaming/routes.js",
-- "line": 207,
++ "line": 218,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5260,7 +5184,7 @@
"method": "PUT",
"path": "/api/streams/channel/:username/about",
"file": "server/streaming/routes.js",
-- "line": 772,
++ "line": 805,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5270,7 +5194,7 @@
"method": "GET",
"path": "/api/streams/channel/:username/bio-en",
"file": "server/streaming/routes.js",
-- "line": 753,
++ "line": 786,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5280,7 +5204,7 @@
"method": "GET",
"path": "/api/streams/channel/:username/clips-taken",
"file": "server/streaming/routes.js",
-- "line": 564,
++ "line": 592,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5290,7 +5214,7 @@
"method": "POST",
"path": "/api/streams/channel/:username/follow",
"file": "server/streaming/routes.js",
-- "line": 2352,
++ "line": 2385,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5300,7 +5224,7 @@
"method": "GET",
"path": "/api/streams/channel/:username/live",
"file": "server/streaming/routes.js",
-- "line": 607,
++ "line": 636,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5310,7 +5234,7 @@
"method": "GET",
"path": "/api/streams/channel/:username/popular",
"file": "server/streaming/routes.js",
-- "line": 538,
++ "line": 566,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5320,7 +5244,7 @@
"method": "GET",
"path": "/api/streams/channel/:username/resolve/:ref",
"file": "server/streaming/routes.js",
-- "line": 1432,
++ "line": 1465,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5330,7 +5254,7 @@
"method": "GET",
"path": "/api/streams/channel/:username/weather",
"file": "server/streaming/routes.js",
-- "line": 982,
++ "line": 1015,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5340,7 +5264,7 @@
"method": "POST",
"path": "/api/streams/channel/offline-screen",
"file": "server/streaming/routes.js",
-- "line": 878,
++ "line": 911,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5350,7 +5274,7 @@
"method": "POST",
"path": "/api/streams/diag-log",
"file": "server/streaming/routes.js",
-- "line": 2257,
++ "line": 2290,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5360,7 +5284,7 @@
"method": "POST",
"path": "/api/streams/goal-media",
"file": "server/streaming/routes.js",
-- "line": 843,
++ "line": 876,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5370,7 +5294,7 @@
"method": "GET",
"path": "/api/streams/managed",
"file": "server/streaming/routes.js",
-- "line": 1594,
++ "line": 1627,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5380,7 +5304,7 @@
"method": "POST",
"path": "/api/streams/managed",
"file": "server/streaming/routes.js",
-- "line": 1606,
++ "line": 1639,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5390,7 +5314,7 @@
"method": "DELETE",
"path": "/api/streams/managed/:id",
"file": "server/streaming/routes.js",
-- "line": 1820,
++ "line": 1853,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5400,7 +5324,7 @@
"method": "PUT",
"path": "/api/streams/managed/:id",
"file": "server/streaming/routes.js",
-- "line": 1660,
++ "line": 1693,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5410,7 +5334,7 @@
"method": "POST",
"path": "/api/streams/managed/:id/regenerate-key",
"file": "server/streaming/routes.js",
-- "line": 1845,
++ "line": 1878,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5420,7 +5344,7 @@
"method": "GET",
"path": "/api/streams/managed/:managedStreamId/history",
"file": "server/streaming/routes.js",
-- "line": 1466,
++ "line": 1499,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5430,7 +5354,7 @@
"method": "GET",
"path": "/api/streams/managed/:managedStreamId/profile",
"file": "server/streaming/routes.js",
-- "line": 1487,
++ "line": 1520,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5440,7 +5364,7 @@
"method": "GET",
"path": "/api/streams/mine",
"file": "server/streaming/routes.js",
-- "line": 1129,
++ "line": 1162,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5450,7 +5374,7 @@
"method": "POST",
"path": "/api/streams/panel-image",
"file": "server/streaming/routes.js",
-- "line": 821,
++ "line": 854,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5460,7 +5384,7 @@
"method": "GET",
"path": "/api/streams/recent",
"file": "server/streaming/routes.js",
-- "line": 1141,
++ "line": 1174,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5470,7 +5394,7 @@
"method": "GET",
"path": "/api/streams/recent-vods",
"file": "server/streaming/routes.js",
-- "line": 1212,
++ "line": 1245,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5480,7 +5404,7 @@
"method": "GET",
"path": "/api/streams/recently-online",
"file": "server/streaming/routes.js",
-- "line": 1158,
++ "line": 1191,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5490,7 +5414,7 @@
"method": "GET",
"path": "/api/streams/rtmp-proxy/:streamId.flv",
"file": "server/streaming/routes.js",
-- "line": 2459,
++ "line": 2492,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5500,7 +5424,7 @@
"method": "GET",
"path": "/api/streams/setup-progress",
"file": "server/streaming/routes.js",
-- "line": 1539,
++ "line": 1572,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5510,7 +5434,7 @@
"method": "GET",
"path": "/api/streams/voice-channels",
"file": "server/streaming/routes.js",
-- "line": 1242,
++ "line": 1275,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5520,7 +5444,7 @@
"method": "POST",
"path": "/api/streams/voice-channels",
"file": "server/streaming/routes.js",
-- "line": 1263,
++ "line": 1296,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5530,7 +5454,7 @@
"method": "DELETE",
"path": "/api/streams/voice-channels/:channelId",
"file": "server/streaming/routes.js",
-- "line": 1275,
++ "line": 1308,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5540,7 +5464,7 @@
"method": "GET",
"path": "/api/streams/voice-channels/:channelId",
"file": "server/streaming/routes.js",
-- "line": 1252,
++ "line": 1285,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5550,7 +5474,7 @@
"method": "POST",
"path": "/api/streams/voice-channels/call-user",
"file": "server/streaming/routes.js",
-- "line": 1287,
++ "line": 1320,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5560,7 +5484,7 @@
"method": "POST",
"path": "/api/streams/voice-channels/call-user/respond",
"file": "server/streaming/routes.js",
-- "line": 1356,
++ "line": 1389,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5770,7 +5694,7 @@
"method": "GET",
"path": "/api/updates",
"file": "server/index.js",
-- "line": 813,
++ "line": 824,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -5830,7 +5754,7 @@
"method": "DELETE",
"path": "/api/vods/:id",
"file": "server/media-proxy/vods.js",
-- "line": 565,
++ "line": 566,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -5850,7 +5774,7 @@
"method": "PUT",
"path": "/api/vods/:id",
"file": "server/media-proxy/vods.js",
-- "line": 520,
++ "line": 521,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -5890,7 +5814,7 @@
"method": "POST",
"path": "/api/vods/:id/publish",
"file": "server/media-proxy/vods.js",
-- "line": 577,
++ "line": 578,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -5900,7 +5824,7 @@
"method": "POST",
"path": "/api/vods/bulk",
"file": "server/media-proxy/vods.js",
-- "line": 537,
++ "line": 538,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -5920,7 +5844,7 @@
"method": "POST",
"path": "/api/vods/clips",
"file": "server/media-proxy/vods.js",
-- "line": 637,
++ "line": 638,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -5930,7 +5854,7 @@
"method": "POST",
"path": "/api/vods/clips/:id/trim",
"file": "server/media-proxy/vods.js",
-- "line": 791,
++ "line": 792,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -5940,7 +5864,7 @@
"method": "GET",
"path": "/api/vods/clips/stream/:streamId",
"file": "server/media-proxy/vods.js",
-- "line": 780,
++ "line": 781,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -5950,7 +5874,7 @@
"method": "GET",
"path": "/api/vods/file/:filename",
"file": "server/media-proxy/vods.js",
-- "line": 593,
++ "line": 594,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -6000,7 +5924,7 @@
"method": "POST",
"path": "/api/vods/upload",
"file": "server/media-proxy/vods.js",
-- "line": 599,
++ "line": 600,
"target": "OpenVibe.Media",
"disposition": "adapter",
"wave": "W4",
@@@ -6010,7 +5934,7 @@
"method": "GET",
"path": "/banned",
"file": "server/index.js",
-- "line": 985,
++ "line": 996,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -6020,7 +5944,7 @@
"method": "POST",
"path": "/banned/continue",
"file": "server/index.js",
-- "line": 955,
++ "line": 966,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -6030,7 +5954,7 @@
"method": "GET",
"path": "/canvas",
"file": "server/index.js",
-- "line": 684,
++ "line": 691,
"target": "OpenVibe.Games",
"disposition": "compat",
"wave": "W12",
@@@ -6040,7 +5964,7 @@
"method": "GET",
"path": "/data/pastes/screenshots/:filename",
"file": "server/index.js",
-- "line": 602,
++ "line": 626,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -6050,7 +5974,7 @@
"method": "GET",
"path": "/dmca",
"file": "server/index.js",
-- "line": 894,
++ "line": 905,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -6090,7 +6014,7 @@
"method": "GET",
"path": "/game",
"file": "server/index.js",
-- "line": 683,
++ "line": 690,
"target": "OpenVibe.Games",
"disposition": "compat",
"wave": "W12",
@@@ -6100,7 +6024,7 @@
"method": "GET",
"path": "/internal/analytics-summary",
"file": "server/index.js",
-- "line": 562,
++ "line": 587,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6110,7 +6034,7 @@
"method": "POST",
"path": "/internal/chat-context/ai/mod-command",
"file": "server/chat/live-context-routes.js",
-- "line": 459,
++ "line": 440,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6120,7 +6044,7 @@
"method": "POST",
"path": "/internal/chat-context/alert-sound",
"file": "server/chat/live-context-routes.js",
-- "line": 375,
++ "line": 356,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6130,7 +6054,7 @@
"method": "POST",
"path": "/internal/chat-context/anon",
"file": "server/chat/live-context-routes.js",
-- "line": 274,
++ "line": 255,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6140,7 +6064,7 @@
"method": "GET",
"path": "/internal/chat-context/anon-first-seen",
"file": "server/chat/live-context-routes.js",
-- "line": 244,
++ "line": 225,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6150,7 +6074,7 @@
"method": "GET",
"path": "/internal/chat-context/anon/:num",
"file": "server/chat/live-context-routes.js",
-- "line": 241,
++ "line": 222,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6160,7 +6084,7 @@
"method": "POST",
"path": "/internal/chat-context/approve-ip",
"file": "server/chat/live-context-routes.js",
-- "line": 354,
++ "line": 335,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6170,7 +6094,7 @@
"method": "POST",
"path": "/internal/chat-context/arena-command",
"file": "server/chat/live-context-routes.js",
-- "line": 470,
++ "line": 451,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6180,7 +6104,7 @@
"method": "POST",
"path": "/internal/chat-context/asset-sync",
"file": "server/chat/live-context-routes.js",
-- "line": 584,
++ "line": 565,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6200,7 +6124,7 @@
"method": "POST",
"path": "/internal/chat-context/ban",
"file": "server/chat/live-context-routes.js",
-- "line": 318,
++ "line": 299,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6210,7 +6134,7 @@
"method": "GET",
"path": "/internal/chat-context/bans",
"file": "server/chat/live-context-routes.js",
-- "line": 205,
++ "line": 186,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6220,7 +6144,7 @@
"method": "POST",
"path": "/internal/chat-context/channel-settings",
"file": "server/chat/live-context-routes.js",
-- "line": 363,
++ "line": 344,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6230,7 +6154,7 @@
"method": "GET",
"path": "/internal/chat-context/channels",
"file": "server/chat/live-context-routes.js",
-- "line": 180,
++ "line": 161,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6240,7 +6164,7 @@
"method": "GET",
"path": "/internal/chat-context/channels/:id/approved-ip",
"file": "server/chat/live-context-routes.js",
-- "line": 199,
++ "line": 180,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6250,7 +6174,7 @@
"method": "GET",
"path": "/internal/chat-context/channels/:id/policy",
"file": "server/chat/live-context-routes.js",
-- "line": 187,
++ "line": 168,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6260,7 +6184,7 @@
"method": "GET",
"path": "/internal/chat-context/channels/by-user/:userId",
"file": "server/chat/live-context-routes.js",
-- "line": 184,
++ "line": 165,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6270,7 +6194,7 @@
"method": "POST",
"path": "/internal/chat-context/chat-message",
"file": "server/chat/live-context-routes.js",
-- "line": 417,
++ "line": 398,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6280,7 +6204,7 @@
"method": "POST",
"path": "/internal/chat-context/decor",
"file": "server/chat/live-context-routes.js",
-- "line": 215,
++ "line": 196,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6290,7 +6214,7 @@
"method": "POST",
"path": "/internal/chat-context/ensure-channel",
"file": "server/chat/live-context-routes.js",
-- "line": 390,
++ "line": 371,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6300,7 +6224,7 @@
"method": "POST",
"path": "/internal/chat-context/hardware",
"file": "server/chat/live-context-routes.js",
-- "line": 511,
++ "line": 492,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6310,7 +6234,7 @@
"method": "POST",
"path": "/internal/chat-context/ip-log",
"file": "server/chat/live-context-routes.js",
-- "line": 280,
++ "line": 261,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6320,7 +6244,7 @@
"method": "GET",
"path": "/internal/chat-context/managed-streams",
"file": "server/chat/live-context-routes.js",
-- "line": 175,
++ "line": 156,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6330,7 +6254,7 @@
"method": "POST",
"path": "/internal/chat-context/media-queue",
"file": "server/chat/live-context-routes.js",
-- "line": 483,
++ "line": 464,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6340,7 +6264,7 @@
"method": "POST",
"path": "/internal/chat-context/mirror",
"file": "server/chat/live-context-routes.js",
-- "line": 259,
++ "line": 240,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6350,7 +6274,7 @@
"method": "POST",
"path": "/internal/chat-context/mirror",
"file": "server/chat/live-context-routes.js",
-- "line": 654,
++ "line": 635,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6360,7 +6284,7 @@
"method": "POST",
"path": "/internal/chat-context/notify/dm",
"file": "server/chat/live-context-routes.js",
-- "line": 554,
++ "line": 535,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6370,7 +6294,7 @@
"method": "POST",
"path": "/internal/chat-context/notify/dm-read",
"file": "server/chat/live-context-routes.js",
-- "line": 575,
++ "line": 556,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6380,7 +6304,7 @@
"method": "POST",
"path": "/internal/chat-context/paste",
"file": "server/chat/live-context-routes.js",
-- "line": 529,
++ "line": 510,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6390,7 +6314,7 @@
"method": "GET",
"path": "/internal/chat-context/settings",
"file": "server/chat/live-context-routes.js",
-- "line": 233,
++ "line": 214,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6400,7 +6324,7 @@
"method": "POST",
"path": "/internal/chat-context/site-settings",
"file": "server/chat/live-context-routes.js",
-- "line": 398,
++ "line": 379,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6410,7 +6334,7 @@
"method": "GET",
"path": "/internal/chat-context/streams",
"file": "server/chat/live-context-routes.js",
-- "line": 156,
++ "line": 137,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6420,7 +6344,7 @@
"method": "GET",
"path": "/internal/chat-context/streams/:id",
"file": "server/chat/live-context-routes.js",
-- "line": 164,
++ "line": 145,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6430,7 +6354,7 @@
"method": "GET",
"path": "/internal/chat-context/streams/active",
"file": "server/chat/live-context-routes.js",
-- "line": 161,
++ "line": 142,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6440,7 +6364,7 @@
"method": "POST",
"path": "/internal/chat-context/translate",
"file": "server/chat/live-context-routes.js",
-- "line": 544,
++ "line": 525,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6450,7 +6374,7 @@
"method": "GET",
"path": "/internal/chat-context/tts-audio/:file",
"file": "server/chat/live-context-routes.js",
-- "line": 248,
++ "line": 229,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6460,7 +6384,7 @@
"method": "POST",
"path": "/internal/chat-context/user-color",
"file": "server/chat/live-context-routes.js",
-- "line": 308,
++ "line": 289,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6480,7 +6404,7 @@
"method": "GET",
"path": "/internal/chat-context/users/:id/follows",
"file": "server/chat/live-context-routes.js",
-- "line": 152,
++ "line": 133,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6510,7 +6434,7 @@
"method": "POST",
"path": "/internal/chat-context/viewer-counts",
"file": "server/chat/live-context-routes.js",
-- "line": 293,
++ "line": 274,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6520,7 +6444,7 @@
"method": "POST",
"path": "/internal/chat-context/viewer-snapshots",
"file": "server/chat/live-context-routes.js",
-- "line": 300,
++ "line": 281,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6530,7 +6454,7 @@
"method": "POST",
"path": "/internal/chat-effects/ai/mod-command",
"file": "server/chat/live-context-routes.js",
-- "line": 459,
++ "line": 440,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6540,7 +6464,7 @@
"method": "POST",
"path": "/internal/chat-effects/alert-sound",
"file": "server/chat/live-context-routes.js",
-- "line": 375,
++ "line": 356,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6550,7 +6474,7 @@
"method": "POST",
"path": "/internal/chat-effects/anon",
"file": "server/chat/live-context-routes.js",
-- "line": 274,
++ "line": 255,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6560,7 +6484,7 @@
"method": "GET",
"path": "/internal/chat-effects/anon-first-seen",
"file": "server/chat/live-context-routes.js",
-- "line": 244,
++ "line": 225,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6570,7 +6494,7 @@
"method": "GET",
"path": "/internal/chat-effects/anon/:num",
"file": "server/chat/live-context-routes.js",
-- "line": 241,
++ "line": 222,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6580,7 +6504,7 @@
"method": "POST",
"path": "/internal/chat-effects/approve-ip",
"file": "server/chat/live-context-routes.js",
-- "line": 354,
++ "line": 335,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6590,7 +6514,7 @@
"method": "POST",
"path": "/internal/chat-effects/arena-command",
"file": "server/chat/live-context-routes.js",
-- "line": 470,
++ "line": 451,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6600,7 +6524,7 @@
"method": "POST",
"path": "/internal/chat-effects/asset-sync",
"file": "server/chat/live-context-routes.js",
-- "line": 584,
++ "line": 565,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6620,7 +6544,7 @@
"method": "POST",
"path": "/internal/chat-effects/ban",
"file": "server/chat/live-context-routes.js",
-- "line": 318,
++ "line": 299,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6630,7 +6554,7 @@
"method": "GET",
"path": "/internal/chat-effects/bans",
"file": "server/chat/live-context-routes.js",
-- "line": 205,
++ "line": 186,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6640,7 +6564,7 @@
"method": "POST",
"path": "/internal/chat-effects/channel-settings",
"file": "server/chat/live-context-routes.js",
-- "line": 363,
++ "line": 344,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6650,7 +6574,7 @@
"method": "GET",
"path": "/internal/chat-effects/channels",
"file": "server/chat/live-context-routes.js",
-- "line": 180,
++ "line": 161,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6660,7 +6584,7 @@
"method": "GET",
"path": "/internal/chat-effects/channels/:id/approved-ip",
"file": "server/chat/live-context-routes.js",
-- "line": 199,
++ "line": 180,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6670,7 +6594,7 @@
"method": "GET",
"path": "/internal/chat-effects/channels/:id/policy",
"file": "server/chat/live-context-routes.js",
-- "line": 187,
++ "line": 168,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6680,7 +6604,7 @@
"method": "GET",
"path": "/internal/chat-effects/channels/by-user/:userId",
"file": "server/chat/live-context-routes.js",
-- "line": 184,
++ "line": 165,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6690,7 +6614,7 @@
"method": "POST",
"path": "/internal/chat-effects/chat-message",
"file": "server/chat/live-context-routes.js",
-- "line": 417,
++ "line": 398,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6700,7 +6624,7 @@
"method": "POST",
"path": "/internal/chat-effects/decor",
"file": "server/chat/live-context-routes.js",
-- "line": 215,
++ "line": 196,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6710,7 +6634,7 @@
"method": "POST",
"path": "/internal/chat-effects/ensure-channel",
"file": "server/chat/live-context-routes.js",
-- "line": 390,
++ "line": 371,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6720,7 +6644,7 @@
"method": "POST",
"path": "/internal/chat-effects/hardware",
"file": "server/chat/live-context-routes.js",
-- "line": 511,
++ "line": 492,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6730,7 +6654,7 @@
"method": "POST",
"path": "/internal/chat-effects/ip-log",
"file": "server/chat/live-context-routes.js",
-- "line": 280,
++ "line": 261,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6740,7 +6664,7 @@
"method": "GET",
"path": "/internal/chat-effects/managed-streams",
"file": "server/chat/live-context-routes.js",
-- "line": 175,
++ "line": 156,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6750,7 +6674,7 @@
"method": "POST",
"path": "/internal/chat-effects/media-queue",
"file": "server/chat/live-context-routes.js",
-- "line": 483,
++ "line": 464,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6760,7 +6684,7 @@
"method": "POST",
"path": "/internal/chat-effects/mirror",
"file": "server/chat/live-context-routes.js",
-- "line": 259,
++ "line": 240,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6770,7 +6694,7 @@
"method": "POST",
"path": "/internal/chat-effects/mirror",
"file": "server/chat/live-context-routes.js",
-- "line": 654,
++ "line": 635,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6780,7 +6704,7 @@
"method": "POST",
"path": "/internal/chat-effects/notify/dm",
"file": "server/chat/live-context-routes.js",
-- "line": 554,
++ "line": 535,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6790,7 +6714,7 @@
"method": "POST",
"path": "/internal/chat-effects/notify/dm-read",
"file": "server/chat/live-context-routes.js",
-- "line": 575,
++ "line": 556,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6800,7 +6724,7 @@
"method": "POST",
"path": "/internal/chat-effects/paste",
"file": "server/chat/live-context-routes.js",
-- "line": 529,
++ "line": 510,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6810,7 +6734,7 @@
"method": "GET",
"path": "/internal/chat-effects/settings",
"file": "server/chat/live-context-routes.js",
-- "line": 233,
++ "line": 214,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6820,7 +6744,7 @@
"method": "POST",
"path": "/internal/chat-effects/site-settings",
"file": "server/chat/live-context-routes.js",
-- "line": 398,
++ "line": 379,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6830,7 +6754,7 @@
"method": "GET",
"path": "/internal/chat-effects/streams",
"file": "server/chat/live-context-routes.js",
-- "line": 156,
++ "line": 137,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6840,7 +6764,7 @@
"method": "GET",
"path": "/internal/chat-effects/streams/:id",
"file": "server/chat/live-context-routes.js",
-- "line": 164,
++ "line": 145,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6850,7 +6774,7 @@
"method": "GET",
"path": "/internal/chat-effects/streams/active",
"file": "server/chat/live-context-routes.js",
-- "line": 161,
++ "line": 142,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6860,7 +6784,7 @@
"method": "POST",
"path": "/internal/chat-effects/translate",
"file": "server/chat/live-context-routes.js",
-- "line": 544,
++ "line": 525,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6870,7 +6794,7 @@
"method": "GET",
"path": "/internal/chat-effects/tts-audio/:file",
"file": "server/chat/live-context-routes.js",
-- "line": 248,
++ "line": 229,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6880,7 +6804,7 @@
"method": "POST",
"path": "/internal/chat-effects/user-color",
"file": "server/chat/live-context-routes.js",
-- "line": 308,
++ "line": 289,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6900,7 +6824,7 @@
"method": "GET",
"path": "/internal/chat-effects/users/:id/follows",
"file": "server/chat/live-context-routes.js",
-- "line": 152,
++ "line": 133,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6930,7 +6854,7 @@
"method": "POST",
"path": "/internal/chat-effects/viewer-counts",
"file": "server/chat/live-context-routes.js",
-- "line": 293,
++ "line": 274,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6940,7 +6864,7 @@
"method": "POST",
"path": "/internal/chat-effects/viewer-snapshots",
"file": "server/chat/live-context-routes.js",
-- "line": 300,
++ "line": 281,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6980,7 +6904,7 @@
"method": "POST",
"path": "/internal/media-events",
"file": "server/index.js",
-- "line": 554,
++ "line": 579,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -6990,7 +6914,7 @@
"method": "POST",
"path": "/internal/media-webhook",
"file": "server/index.js",
-- "line": 552,
++ "line": 577,
"target": "OpenVibe.Events",
"disposition": "compat",
"wave": "W3",
@@@ -7000,7 +6924,7 @@
"method": "POST",
"path": "/internal/openre-events",
"file": "server/index.js",
-- "line": 557,
++ "line": 582,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -7010,7 +6934,7 @@
"method": "POST",
"path": "/internal/tips/deliveries",
"file": "server/tips/delivery-routes.js",
-- "line": 49,
++ "line": 104,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "W3",
@@@ -7020,7 +6944,7 @@
"method": "POST",
"path": "/internal/url-registry/refresh",
"file": "server/internal/routes.js",
-- "line": 28,
++ "line": 29,
"target": "OpenVibe.Network",
"disposition": "compat",
"wave": "W1 (register C-54/C-55)",
@@@ -7030,7 +6954,7 @@
"method": "POST",
"path": "/internal/user-avatar",
"file": "server/internal/routes.js",
-- "line": 46,
++ "line": 47,
"target": "OpenVibe.Network",
"disposition": "compat",
"wave": "W1 (register C-54/C-55)",
@@@ -7040,17 +6964,27 @@
"method": "POST",
"path": "/internal/user-role",
"file": "server/internal/routes.js",
-- "line": 71,
++ "line": 72,
"target": "OpenVibe.Network",
"disposition": "compat",
"wave": "W1 (register C-54/C-55)",
"note": "Key-authenticated internal routes; role truth moves to Network (ADR-022)."
},
++ {
++ "method": "GET",
++ "path": "/llms.txt",
++ "file": "server/seo/seo.js",
++ "line": 1141,
++ "target": "OpenVibe.Live",
++ "disposition": "keep",
++ "wave": "§32",
++ "note": "Crawler/AI readability page."
++ },
{
"method": "GET",
"path": "/media/:username",
"file": "server/index.js",
-- "line": 885,
++ "line": 896,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -7060,7 +6994,7 @@
"method": "GET",
"path": "/obs/chat/:username",
"file": "server/index.js",
-- "line": 873,
++ "line": 884,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -7070,7 +7004,7 @@
"method": "GET",
"path": "/openvibe-sw.js",
"file": "server/index.js",
-- "line": 455,
++ "line": 478,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -7080,7 +7014,7 @@
"method": "GET",
"path": "/overlay/chat/:username",
"file": "server/index.js",
-- "line": 881,
++ "line": 892,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -7090,7 +7024,7 @@
"method": "GET",
"path": "/overlay/chat/:username/:slotIdOrSlug",
"file": "server/index.js",
-- "line": 878,
++ "line": 889,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -7099,8 +7033,8 @@
{
"method": "GET",
"path": "/p/:slug",
-- "file": "server/index.js",
-- "line": 620,
++ "file": "server/web/paste-handover.js",
++ "line": 32,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -7110,7 +7044,7 @@
"method": "GET",
"path": "/p/:slug/raw",
"file": "server/index.js",
-- "line": 631,
++ "line": 638,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -7120,17 +7054,7 @@
"method": "GET",
"path": "/p/:slug/screenshot",
"file": "server/index.js",
-- "line": 627,
-- "target": "OpenVibe.Community",
-- "disposition": "adapter",
-- "wave": "W5 (done)",
-- "note": "Forwards to Community with a service token (pastes since 2026-09-22, VOD/clip comments since b8afb71); /p/* 301s to openvibe.community."
-- },
-- {
-- "method": "GET",
-- "path": "/pastes",
-- "file": "server/index.js",
-- "line": 621,
++ "line": 634,
"target": "OpenVibe.Community",
"disposition": "adapter",
"wave": "W5 (done)",
@@@ -7140,17 +7064,7 @@
"method": "GET",
"path": "/privacy",
"file": "server/index.js",
-- "line": 903,
-- "target": "OpenVibe.Live",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "Live pages, overlays, docs and release manifest."
-- },
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/index.js",
-- "line": 753,
++ "line": 914,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -7160,7 +7074,7 @@
"method": "GET",
"path": "/sitemap.xml",
"file": "server/seo/seo.js",
-- "line": 602,
++ "line": 1140,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -7170,7 +7084,7 @@
"method": "GET",
"path": "/terms",
"file": "server/index.js",
-- "line": 900,
++ "line": 911,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -7180,7 +7094,7 @@
"method": "GET",
"path": "/tos",
"file": "server/index.js",
-- "line": 897,
++ "line": 908,
"target": "OpenVibe.Live",
"disposition": "keep",
"wave": "-",
@@@ -7190,7 +7104,7 @@
"method": "POST",
"path": "/whip/:streamId",
"file": "server/index.js",
-- "line": 912,
++ "line": 923,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -7200,7 +7114,7 @@
"method": "DELETE",
"path": "/whip/:streamId/:resourceId",
"file": "server/index.js",
-- "line": 914,
++ "line": 925,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -7210,7 +7124,7 @@
"method": "PATCH",
"path": "/whip/:streamId/:resourceId",
"file": "server/index.js",
-- "line": 913,
++ "line": 924,
"target": "OpenRe.Stream",
"disposition": "extract",
"wave": "W7",
@@@ -7249,7 +7163,7 @@
},
{
"file": "server/vibe-coding/publish-server.js",
-- "line": 23
++ "line": 27
}
],
"paths": [
@@@ -7266,57 +7180,57 @@
{
"path": "/ws/",
"file": "server/index.js",
-- "line": 427
++ "line": 450
},
{
"path": "/ws/",
"file": "server/index.js",
-- "line": 437
++ "line": 460
},
{
"path": "/ws/chat",
"file": "server/index.js",
-- "line": 1042
++ "line": 1069
},
{
"path": "/ws/vibe-coding/publish",
"file": "server/index.js",
-- "line": 1044
++ "line": 1071
},
{
"path": "/ws/broadcast",
"file": "server/index.js",
-- "line": 1046
++ "line": 1073
},
{
"path": "/ws/control",
"file": "server/index.js",
-- "line": 1048
++ "line": 1075
},
{
"path": "/ws/call",
"file": "server/index.js",
-- "line": 1050
++ "line": 1077
},
{
"path": "/ws/game",
"file": "server/index.js",
-- "line": 1052
++ "line": 1079
},
{
"path": "/ws/canvas",
"file": "server/index.js",
-- "line": 1052
++ "line": 1079
},
{
"path": "/ws/robotstreamer-publish",
"file": "server/index.js",
-- "line": 1054
++ "line": 1081
},
{
"path": "/ws/robotstreamer-publish",
"file": "server/integrations/robotstreamer-service.js",
-- "line": 807
++ "line": 789
},
{
"path": "/ws/broadcast",
@@@ -7331,12 +7245,12 @@
{
"path": "/ws/vibe-coding/publish",
"file": "server/vibe-coding/publish-server.js",
-- "line": 31
++ "line": 35
},
{
"path": "/ws/",
"file": "server/web/page-status.js",
-- "line": 180
++ "line": 184
}
]
},
@@@ -7349,9 +7263,9 @@
"OV_COMMUNITY_URL": [
"server/ai/ai-moments-job.js",
"server/comments-client.js",
-- "server/index.js",
"server/media-proxy/pastes.js",
-- "server/seo/seo.js"
++ "server/seo/seo.js",
++ "server/web/paste-handover.js"
],
"AI_SERVICE": [
"server/ai/ai-service.js"
@@@ -7377,11 +7291,6 @@
"AI_HEAR_MAX_SPOOL": [
"server/ai/stream-audio.js"
],
-- "AI_MOMENTS_PATH": [
-- "server/ai/stream-memory-job.js",
-- "server/arena/arena-service.js",
-- "server/index.js"
-- ],
"WHISPER_BIN": [
"server/ai/transcribe.js"
],
@@@ -7409,19 +7318,12 @@
"WHISPER_MAX_CONCURRENT": [
"server/ai/transcribe.js"
],
-- "ARENA_IMAGE_PATH": [
-- "server/arena/arena-service.js",
-- "server/index.js"
-- ],
"JWT_SECRET": [
"server/arena/arena-service.js",
"server/config.js",
"server/integrations/platform-oauth.js",
"server/integrations/powerchat-oauth.js"
],
-- "TTS_CACHE_PATH": [
-- "server/arena/voice.js"
-- ],
"OV_NETWORK_URL": [
"server/auth/auth.js",
"server/config.js",
@@@ -7514,10 +7416,14 @@
"server/config.js"
],
"PORT": [
-- "server/config.js"
++ "server/config.js",
++ "server/drill.js",
++ "server/index.js"
],
"HOST": [
-- "server/config.js"
++ "server/config.js",
++ "server/drill.js",
++ "server/index.js"
],
"RTMP_PORT": [
"server/config.js"
@@@ -7568,11 +7474,6 @@
"STAR_STREAMER": [
"server/config.js"
],
-- "DB_PATH": [
-- "server/config.js",
-- "server/db/database.js",
-- "server/db/init.js"
-- ],
"JSMPEG_VIDEO_PORT": [
"server/config.js"
],
@@@ -7588,26 +7489,13 @@
"ESCROW_HOLD_DAYS": [
"server/config.js"
],
-- "VOD_PATH": [
-- "server/config.js"
-- ],
"COLD_STORAGE_PATH": [
"server/config.js"
],
-- "CLIPS_PATH": [
-- "server/config.js"
-- ],
"MAX_VOD_SIZE_MB": [
"server/config.js",
"server/media-proxy/vods.js"
],
-- "THUMBNAILS_PATH": [
-- "server/config.js"
-- ],
-- "EMOTES_PATH": [
-- "server/config.js",
-- "server/media-proxy/asset-sync.js"
-- ],
"MAX_EMOTE_SIZE_KB": [
"server/config.js"
],
@@@ -7629,10 +7517,6 @@
"SEVENTV_CACHE_TTL": [
"server/config.js"
],
-- "SOUNDS_PATH": [
-- "server/config.js",
-- "server/media-proxy/asset-sync.js"
-- ],
"MAX_SOUND_SIZE_KB": [
"server/config.js"
],
@@@ -7657,26 +7541,38 @@
"OWNER_USERNAME": [
"server/db/database.js"
],
++ "DB_PATH": [
++ "server/db/init.js",
++ "server/drill.js",
++ "server/index.js",
++ "server/paths.js"
++ ],
"OV_APP_ROOT": [
"server/docs/routes.js",
"server/web/assets.js"
],
-- "EVENTS_URL": [
-- "server/events/stream-events.js"
-- ],
-- "EVENTS_PUBLISH": [
-- "server/events/stream-events.js"
++ "LIVE_DRILL": [
++ "server/drill.js"
],
-- "PASTES_ON_COMMUNITY": [
++ "DATA_DIR": [
++ "server/drill.js",
"server/index.js",
-- "server/seo/seo.js"
++ "server/paths.js"
],
"LISTEN_FDS": [
++ "server/drill.js",
"server/index.js"
],
"LISTEN_PID": [
++ "server/drill.js",
"server/index.js"
],
++ "EVENTS_URL": [
++ "server/events/stream-events.js"
++ ],
++ "EVENTS_PUBLISH": [
++ "server/events/stream-events.js"
++ ],
"YT_MIN_CREATE_INTERVAL_MS": [
"server/integrations/platform-oauth.js"
],
@@@ -7708,9 +7604,6 @@
"PATH": [
"server/media/media-downloader.js"
],
-- "LIVE_THUMBS_PATH": [
-- "server/media-proxy/live-thumbs.js"
-- ],
"MEDIA_EVENTS_SECRET": [
"server/media-proxy/media-events.js"
],
@@@ -7741,10 +7634,6 @@
"LEGACY_QUEST_API_URL": [
"server/monetization/cosmetics.js"
],
-- "OFFLINE_SCREEN_PATH": [
-- "server/monetization/routes.js",
-- "server/streaming/routes.js"
-- ],
"OPENRE_EVENTS_SECRET": [
"server/openre/mirror.js",
"server/openre/routes.js"
@@@ -7758,6 +7647,10 @@
"PASTES_AUTHORITY": [
"server/pastes-client.js"
],
++ "PASTES_ON_COMMUNITY": [
++ "server/seo/seo.js",
++ "server/web/paste-handover.js"
++ ],
"OV_PUBLIC_DIR": [
"server/web/assets.js"
],
@@@ -7876,11 +7769,11 @@
"refs": [
{
"via": ":4000",
-- "line": 21
++ "line": 23
},
{
"via": "OV_NETWORK_URL",
-- "line": 101
++ "line": 103
}
]
},
@@@ -7889,11 +7782,11 @@
"refs": [
{
"via": "MEDIA_URL",
-- "line": 175
++ "line": 177
},
{
"via": ":4100",
-- "line": 175
++ "line": 177
}
]
}
@@@ -7989,11 +7882,11 @@
"refs": [
{
"via": "chatUrl",
-- "line": 586
++ "line": 568
},
{
"via": "chatUrl",
-- "line": 596
++ "line": 578
}
]
}
@@@ -8071,7 +7964,7 @@
"refs": [
{
"via": "OV_COMMUNITY_URL",
-- "line": 311
++ "line": 312
}
]
}
@@@ -8151,6 +8044,10 @@
{
"via": "/internal/coins",
"line": 151
++ },
++ {
++ "via": "/internal/coins",
++ "line": 152
}
]
}
@@@ -8264,7 +8161,7 @@
"refs": [
{
"via": "OV_COMMUNITY_URL",
-- "line": 432
++ "line": 145
}
]
}
@@@ -8303,7 +8200,7 @@
"refs": [
{
"via": "/oauth/token",
-- "line": 1387
++ "line": 1383
}
]
},
@@@ -8312,11 +8209,11 @@
"refs": [
{
"via": "searchUrl",
-- "line": 1639
++ "line": 1635
},
{
"via": "searchUrl",
-- "line": 1640
++ "line": 1636
}
]
}
@@@ -8370,7 +8267,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 300000,
-- "line": 495,
++ "line": 496,
"file": "server/ai/ai-moments-job.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8381,7 +8278,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 308,
++ "line": 354,
"file": "server/ai/auto-clip-job.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8436,7 +8333,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 30000,
-- "line": 239,
++ "line": 241,
"file": "server/ai/stream-memory-job.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8557,7 +8454,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 39,
++ "line": 40,
"file": "server/chat/dm-routes.js",
"target": "OpenVibe.Chat",
"disposition": "compat",
@@@ -8568,7 +8465,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 18,
++ "line": 19,
"file": "server/diagnostics.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8590,7 +8487,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 300000,
-- "line": 563,
++ "line": 564,
"file": "server/home/routes.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8612,7 +8509,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 21600000,
-- "line": 1314,
++ "line": 1342,
"file": "server/index.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8623,7 +8520,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 45000,
-- "line": 1331,
++ "line": 1359,
"file": "server/index.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8634,7 +8531,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 1355,
++ "line": 1383,
"file": "server/index.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8645,7 +8542,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 1366,
++ "line": 1394,
"file": "server/index.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8700,7 +8597,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 1023,
++ "line": 1005,
"file": "server/integrations/robotstreamer-service.js",
"target": "OpenRe.Stream",
"disposition": "extract",
@@@ -8744,7 +8641,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 3600000,
-- "line": 550,
++ "line": 554,
"file": "server/media/media-downloader.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8755,7 +8652,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 553,
++ "line": 557,
"file": "server/media/media-downloader.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8766,7 +8663,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 119,
++ "line": 120,
"file": "server/media-proxy/asset-sync.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8832,7 +8729,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 243,
++ "line": 246,
"file": "server/recap/recap.js",
"target": "OpenVibe.Live",
"disposition": "keep",
@@@ -8930,7 +8827,7 @@
],
"contractTodos": 14,
"unresolvedMounts": [],
-- "testFiles": 81,
++ "testFiles": 98,
"ci": true
},
{
@@@ -8938,13 +8835,13 @@
"service": "network",
"present": true,
"git": {
-- "head": "09bf748b7f459ac127b3f4045085c20189d39dbb",
++ "head": "26c0395dbd9b654cd53c9ba33d38255a5fc32d27",
"branch": "main",
-- "originMain": "09bf748b7f459ac127b3f4045085c20189d39dbb",
-- "committedAt": "2026-09-23T14:33:16-07:00"
++ "originMain": "26c0395dbd9b654cd53c9ba33d38255a5fc32d27",
++ "committedAt": "2026-09-23T19:27:40-07:00"
},
-- "sourceFiles": 68,
-- "loc": 15275,
++ "sourceFiles": 72,
++ "loc": 15901,
"tables": [
{
"table": "admin_rate_limits",
@@@ -9111,7 +9008,7 @@
{
"table": "email_verification_tokens",
"file": "server/db/database.js",
-- "line": 431,
++ "line": 438,
"via": "repo"
},
{
@@@ -9177,31 +9074,31 @@
{
"table": "user_modules",
"file": "server/identity/modules.js",
-- "line": 75,
++ "line": 73,
"via": "repo"
},
{
"table": "user_module_revisions",
"file": "server/identity/modules.js",
-- "line": 86,
++ "line": 84,
"via": "repo"
},
{
"table": "user_module_retirements",
"file": "server/identity/modules.js",
-- "line": 93,
++ "line": 91,
"via": "repo"
},
{
"table": "principal_grants",
"file": "server/identity/principals.js",
-- "line": 164,
++ "line": 171,
"via": "repo"
},
{
"table": "principal_usage",
"file": "server/identity/principals.js",
-- "line": 174,
++ "line": 181,
"via": "repo"
},
{
@@@ -9238,7 +9135,7 @@
"method": "GET",
"path": "/",
"file": "server/discord/routes.js",
-- "line": 17,
++ "line": 18,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9268,7 +9165,7 @@
"method": "PUT",
"path": "/",
"file": "server/discord/routes.js",
-- "line": 33,
++ "line": 37,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9298,7 +9195,7 @@
"method": "GET",
"path": "/.well-known/openvibe",
"file": "server/registry/ecosystem.js",
-- "line": 223,
++ "line": 312,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9308,7 +9205,7 @@
"method": "GET",
"path": "/.well-known/web-identity",
"file": "server/index.js",
-- "line": 630,
++ "line": 632,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9408,7 +9305,7 @@
"method": "GET",
"path": "/api/admin/ssh-info",
"file": "server/index.js",
-- "line": 510,
++ "line": 512,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9728,7 +9625,7 @@
"method": "GET",
"path": "/api/chrome",
"file": "server/chrome/service.js",
-- "line": 171,
++ "line": 173,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9738,7 +9635,7 @@
"method": "POST",
"path": "/api/chrome/hit",
"file": "server/chrome/service.js",
-- "line": 184,
++ "line": 186,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9878,7 +9775,7 @@
"method": "GET",
"path": "/api/modules",
"file": "server/identity/modules.js",
-- "line": 322,
++ "line": 320,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9888,7 +9785,7 @@
"method": "DELETE",
"path": "/api/modules/:ns",
"file": "server/identity/modules.js",
-- "line": 347,
++ "line": 345,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9898,7 +9795,7 @@
"method": "GET",
"path": "/api/modules/:ns",
"file": "server/identity/modules.js",
-- "line": 330,
++ "line": 328,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9908,7 +9805,7 @@
"method": "PUT",
"path": "/api/modules/:ns",
"file": "server/identity/modules.js",
-- "line": 338,
++ "line": 336,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9918,7 +9815,7 @@
"method": "GET",
"path": "/api/modules/:ns/public/:subject",
"file": "server/identity/modules.js",
-- "line": 314,
++ "line": 312,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9928,7 +9825,7 @@
"method": "DELETE",
"path": "/api/modules/modules/:ns/:subject",
"file": "server/identity/modules.js",
-- "line": 382,
++ "line": 380,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9938,7 +9835,7 @@
"method": "GET",
"path": "/api/modules/modules/:ns/:subject",
"file": "server/identity/modules.js",
-- "line": 362,
++ "line": 360,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -9948,7 +9845,7 @@
"method": "PUT",
"path": "/api/modules/modules/:ns/:subject",
"file": "server/identity/modules.js",
-- "line": 371,
++ "line": 369,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10408,7 +10305,7 @@
"method": "GET",
"path": "/api/v1/registry",
"file": "server/registry/ecosystem.js",
-- "line": 224,
++ "line": 313,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10418,7 +10315,7 @@
"method": "GET",
"path": "/api/v1/registry/capabilities",
"file": "server/registry/ecosystem.js",
-- "line": 242,
++ "line": 338,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10428,7 +10325,27 @@
"method": "GET",
"path": "/api/v1/registry/capabilities/:id",
"file": "server/registry/ecosystem.js",
-- "line": 247,
++ "line": 343,
++ "target": "OpenVibe.Network",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/api/v1/registry/categories",
++ "file": "server/registry/ecosystem.js",
++ "line": 314,
++ "target": "OpenVibe.Network",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/api/v1/registry/categories/:id",
++ "file": "server/registry/ecosystem.js",
++ "line": 315,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10438,7 +10355,7 @@
"method": "GET",
"path": "/api/v1/registry/contracts",
"file": "server/registry/ecosystem.js",
-- "line": 253,
++ "line": 349,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10448,7 +10365,17 @@
"method": "GET",
"path": "/api/v1/registry/domains/:domain",
"file": "server/registry/ecosystem.js",
-- "line": 236,
++ "line": 332,
++ "target": "OpenVibe.Network",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/api/v1/registry/featured",
++ "file": "server/registry/ecosystem.js",
++ "line": 320,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10458,7 +10385,7 @@
"method": "GET",
"path": "/api/v1/registry/health",
"file": "server/registry/ecosystem.js",
-- "line": 271,
++ "line": 367,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10468,7 +10395,7 @@
"method": "GET",
"path": "/api/v1/registry/namespaces",
"file": "server/registry/ecosystem.js",
-- "line": 252,
++ "line": 348,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10478,7 +10405,7 @@
"method": "GET",
"path": "/api/v1/registry/releases",
"file": "server/registry/ecosystem.js",
-- "line": 270,
++ "line": 366,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10488,7 +10415,7 @@
"method": "GET",
"path": "/api/v1/registry/search",
"file": "server/registry/ecosystem.js",
-- "line": 277,
++ "line": 373,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10498,7 +10425,7 @@
"method": "GET",
"path": "/api/v1/registry/services",
"file": "server/registry/ecosystem.js",
-- "line": 225,
++ "line": 321,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10508,7 +10435,7 @@
"method": "GET",
"path": "/api/v1/registry/services/:id",
"file": "server/registry/ecosystem.js",
-- "line": 231,
++ "line": 327,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10518,7 +10445,7 @@
"method": "GET",
"path": "/api/v1/registry/topics",
"file": "server/registry/ecosystem.js",
-- "line": 254,
++ "line": 350,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10528,7 +10455,7 @@
"method": "GET",
"path": "/api/v1/registry/topics/:topic",
"file": "server/registry/ecosystem.js",
-- "line": 265,
++ "line": 361,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10568,7 +10495,7 @@
"method": "GET",
"path": "/audit",
"file": "server/admin/routes.js",
-- "line": 797,
++ "line": 821,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10628,7 +10555,7 @@
"method": "POST",
"path": "/broadcast",
"file": "server/admin/routes.js",
-- "line": 721,
++ "line": 745,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10748,7 +10675,7 @@
"method": "GET",
"path": "/email",
"file": "server/admin/routes.js",
-- "line": 240,
++ "line": 241,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10758,7 +10685,7 @@
"method": "PUT",
"path": "/email",
"file": "server/admin/routes.js",
-- "line": 250,
++ "line": 251,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10768,7 +10695,7 @@
"method": "POST",
"path": "/email/test",
"file": "server/admin/routes.js",
-- "line": 283,
++ "line": 289,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10828,7 +10755,7 @@
"method": "GET",
"path": "/health",
"file": "server/admin/routes.js",
-- "line": 766,
++ "line": 790,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -10848,7 +10775,7 @@
"method": "GET",
"path": "/internal/anon-admin",
"file": "server/internal/routes.js",
-- "line": 638,
++ "line": 659,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10858,7 +10785,7 @@
"method": "GET",
"path": "/internal/anon-list",
"file": "server/internal/routes.js",
-- "line": 687,
++ "line": 708,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10868,7 +10795,7 @@
"method": "POST",
"path": "/internal/audit",
"file": "server/internal/routes.js",
-- "line": 206,
++ "line": 224,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10878,7 +10805,7 @@
"method": "POST",
"path": "/internal/coins/credit",
"file": "server/internal/routes.js",
-- "line": 295,
++ "line": 316,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10888,7 +10815,7 @@
"method": "POST",
"path": "/internal/coins/debit",
"file": "server/internal/routes.js",
-- "line": 307,
++ "line": 328,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10898,7 +10825,7 @@
"method": "GET",
"path": "/internal/coins/stats",
"file": "server/internal/routes.js",
-- "line": 254,
++ "line": 275,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10908,7 +10835,7 @@
"method": "POST",
"path": "/internal/coins/transfer",
"file": "server/internal/routes.js",
-- "line": 320,
++ "line": 341,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10918,7 +10845,7 @@
"method": "POST",
"path": "/internal/events/stream-live",
"file": "server/internal/routes.js",
-- "line": 338,
++ "line": 359,
"target": "OpenVibe.Events",
"disposition": "compat",
"wave": "W3",
@@@ -10934,6 +10861,16 @@
"wave": "W1",
"note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
},
++ {
++ "method": "POST",
++ "path": "/internal/identity/legacy-map",
++ "file": "server/internal/routes.js",
++ "line": 84,
++ "target": "OpenVibe.Network",
++ "disposition": "keep",
++ "wave": "W1",
++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
++ },
{
"method": "GET",
"path": "/internal/identity/resolve",
@@@ -10948,7 +10885,7 @@
"method": "GET",
"path": "/internal/identity/resolve",
"file": "server/internal/routes.js",
-- "line": 66,
++ "line": 80,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10968,7 +10905,7 @@
"method": "POST",
"path": "/internal/identity/resolve-batch",
"file": "server/internal/routes.js",
-- "line": 67,
++ "line": 81,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10978,7 +10915,7 @@
"method": "POST",
"path": "/internal/issue-token",
"file": "server/internal/routes.js",
-- "line": 528,
++ "line": 549,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10988,7 +10925,7 @@
"method": "POST",
"path": "/internal/link-account",
"file": "server/internal/routes.js",
-- "line": 148,
++ "line": 166,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -10998,7 +10935,7 @@
"method": "POST",
"path": "/internal/notifications/mark-read",
"file": "server/internal/routes.js",
-- "line": 489,
++ "line": 510,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11008,7 +10945,7 @@
"method": "POST",
"path": "/internal/notifications/push",
"file": "server/internal/routes.js",
-- "line": 431,
++ "line": 452,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11018,7 +10955,7 @@
"method": "POST",
"path": "/internal/notifications/push-bulk",
"file": "server/internal/routes.js",
-- "line": 451,
++ "line": 472,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11028,7 +10965,7 @@
"method": "POST",
"path": "/internal/notifications/resolve-users",
"file": "server/internal/routes.js",
-- "line": 508,
++ "line": 529,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11038,7 +10975,7 @@
"method": "GET",
"path": "/internal/notifications/unread/:userId",
"file": "server/internal/routes.js",
-- "line": 474,
++ "line": 495,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11048,7 +10985,7 @@
"method": "POST",
"path": "/internal/resolve-anon",
"file": "server/internal/routes.js",
-- "line": 559,
++ "line": 580,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11058,7 +10995,7 @@
"method": "GET",
"path": "/internal/stats",
"file": "server/internal/routes.js",
-- "line": 215,
++ "line": 233,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11068,7 +11005,7 @@
"method": "GET",
"path": "/internal/url-registry/resolved",
"file": "server/internal/routes.js",
-- "line": 224,
++ "line": 244,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11078,7 +11015,7 @@
"method": "POST",
"path": "/internal/user-avatar",
"file": "server/internal/routes.js",
-- "line": 191,
++ "line": 209,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11088,7 +11025,7 @@
"method": "GET",
"path": "/internal/users/:id",
"file": "server/internal/routes.js",
-- "line": 99,
++ "line": 116,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11098,7 +11035,7 @@
"method": "GET",
"path": "/internal/users/:id/linked-accounts",
"file": "server/internal/routes.js",
-- "line": 199,
++ "line": 217,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11108,7 +11045,7 @@
"method": "GET",
"path": "/internal/users/:id/theme",
"file": "server/internal/routes.js",
-- "line": 136,
++ "line": 153,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11118,7 +11055,7 @@
"method": "POST",
"path": "/internal/users/bulk",
"file": "server/internal/routes.js",
-- "line": 121,
++ "line": 138,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11128,7 +11065,7 @@
"method": "GET",
"path": "/internal/users/by-username/:username",
"file": "server/internal/routes.js",
-- "line": 110,
++ "line": 127,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11138,7 +11075,7 @@
"method": "POST",
"path": "/internal/verify-token",
"file": "server/internal/routes.js",
-- "line": 75,
++ "line": 92,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "W1",
@@@ -11148,7 +11085,7 @@
"method": "GET",
"path": "/llms.txt",
"file": "server/index.js",
-- "line": 608,
++ "line": 610,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11178,7 +11115,7 @@
"method": "GET",
"path": "/net-config",
"file": "server/admin/routes.js",
-- "line": 907,
++ "line": 931,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11188,7 +11125,7 @@
"method": "PUT",
"path": "/net-config",
"file": "server/admin/routes.js",
-- "line": 926,
++ "line": 950,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11258,7 +11195,7 @@
"method": "GET",
"path": "/oauth/.well-known/openid-configuration",
"file": "server/auth/oauth-routes.js",
-- "line": 416,
++ "line": 419,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11268,7 +11205,7 @@
"method": "GET",
"path": "/oauth/authorize",
"file": "server/auth/oauth-routes.js",
-- "line": 53,
++ "line": 55,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11278,7 +11215,7 @@
"method": "GET",
"path": "/oauth/client-info",
"file": "server/auth/oauth-routes.js",
-- "line": 124,
++ "line": 129,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11288,7 +11225,7 @@
"method": "POST",
"path": "/oauth/confirm",
"file": "server/auth/oauth-routes.js",
-- "line": 149,
++ "line": 154,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11298,7 +11235,27 @@
"method": "POST",
"path": "/oauth/token",
"file": "server/auth/oauth-routes.js",
-- "line": 207,
++ "line": 214,
++ "target": "OpenVibe.Network",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/oauth/userinfo",
++ "file": "server/auth/oauth-routes.js",
++ "line": 423,
++ "target": "OpenVibe.Network",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "POST",
++ "path": "/oauth/userinfo",
++ "file": "server/auth/oauth-routes.js",
++ "line": 424,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11308,7 +11265,7 @@
"method": "GET",
"path": "/openvibe-sw.js",
"file": "server/index.js",
-- "line": 657,
++ "line": 661,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11398,27 +11355,27 @@
"method": "POST",
"path": "/reinit",
"file": "server/discord/routes.js",
-- "line": 96,
++ "line": 103,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
{
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/index.js",
-- "line": 684,
++ "method": "POST",
++ "path": "/reset-db",
++ "file": "server/admin/routes.js",
++ "line": 497,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
{
-- "method": "POST",
-- "path": "/reset-db",
++ "method": "GET",
++ "path": "/secrets",
"file": "server/admin/routes.js",
-- "line": 473,
++ "line": 306,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11438,7 +11395,7 @@
"method": "GET",
"path": "/settings",
"file": "server/admin/routes.js",
-- "line": 300,
++ "line": 311,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11448,7 +11405,7 @@
"method": "PUT",
"path": "/settings",
"file": "server/admin/routes.js",
-- "line": 328,
++ "line": 348,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11458,7 +11415,7 @@
"method": "GET",
"path": "/sso/check",
"file": "server/index.js",
-- "line": 635,
++ "line": 639,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11488,7 +11445,7 @@
"method": "POST",
"path": "/test",
"file": "server/discord/routes.js",
-- "line": 77,
++ "line": 84,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11498,7 +11455,7 @@
"method": "POST",
"path": "/test-live",
"file": "server/discord/routes.js",
-- "line": 87,
++ "line": 94,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11538,7 +11495,7 @@
"method": "GET",
"path": "/url-registry",
"file": "server/admin/routes.js",
-- "line": 353,
++ "line": 377,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11548,7 +11505,7 @@
"method": "PUT",
"path": "/url-registry",
"file": "server/admin/routes.js",
-- "line": 380,
++ "line": 404,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11558,7 +11515,7 @@
"method": "DELETE",
"path": "/url-registry/:key",
"file": "server/admin/routes.js",
-- "line": 423,
++ "line": 447,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11568,7 +11525,7 @@
"method": "PUT",
"path": "/url-registry/:key",
"file": "server/admin/routes.js",
-- "line": 401,
++ "line": 425,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11578,7 +11535,7 @@
"method": "POST",
"path": "/url-registry/:key/reset",
"file": "server/admin/routes.js",
-- "line": 458,
++ "line": 482,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11588,7 +11545,7 @@
"method": "POST",
"path": "/url-registry/refresh-all",
"file": "server/admin/routes.js",
-- "line": 438,
++ "line": 462,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11608,7 +11565,7 @@
"method": "GET",
"path": "/users",
"file": "server/admin/routes.js",
-- "line": 536,
++ "line": 560,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11618,7 +11575,7 @@
"method": "PUT",
"path": "/users/:id/ban",
"file": "server/admin/routes.js",
-- "line": 691,
++ "line": 715,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11628,7 +11585,7 @@
"method": "PUT",
"path": "/users/:id/email",
"file": "server/admin/routes.js",
-- "line": 568,
++ "line": 592,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11638,7 +11595,7 @@
"method": "PUT",
"path": "/users/:id/role",
"file": "server/admin/routes.js",
-- "line": 666,
++ "line": 690,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11648,7 +11605,7 @@
"method": "POST",
"path": "/users/:id/send-reset",
"file": "server/admin/routes.js",
-- "line": 607,
++ "line": 631,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11658,7 +11615,7 @@
"method": "POST",
"path": "/users/grant-admin",
"file": "server/admin/routes.js",
-- "line": 500,
++ "line": 524,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11668,7 +11625,7 @@
"method": "GET",
"path": "/verification-keys",
"file": "server/admin/routes.js",
-- "line": 824,
++ "line": 848,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11678,7 +11635,7 @@
"method": "POST",
"path": "/verification-keys",
"file": "server/admin/routes.js",
-- "line": 833,
++ "line": 857,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11688,7 +11645,7 @@
"method": "DELETE",
"path": "/verification-keys/:id",
"file": "server/admin/routes.js",
-- "line": 881,
++ "line": 905,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11698,7 +11655,7 @@
"method": "GET",
"path": "/verify-email",
"file": "server/index.js",
-- "line": 620,
++ "line": 622,
"target": "OpenVibe.Network",
"disposition": "keep",
"wave": "-",
@@@ -11982,15 +11939,15 @@
"refs": [
{
"via": "live.internalUrl",
-- "line": 69
++ "line": 70
},
{
"via": "OV_LIVE_INTERNAL_URL",
-- "line": 219
++ "line": 220
},
{
"via": ":3000",
-- "line": 219
++ "line": 220
}
]
},
@@@ -11999,7 +11956,7 @@
"refs": [
{
"via": "tools.internalUrl",
-- "line": 70
++ "line": 71
}
]
},
@@@ -12008,7 +11965,7 @@
"refs": [
{
"via": "games.internalUrl",
-- "line": 71
++ "line": 72
}
]
},
@@@ -12017,7 +11974,7 @@
"refs": [
{
"via": "media.internalUrl",
-- "line": 72
++ "line": 73
}
]
}
@@@ -12069,7 +12026,7 @@
"refs": [
{
"via": ":3000",
-- "line": 82
++ "line": 84
}
]
}
@@@ -12117,19 +12074,19 @@
},
{
"via": "live.internalUrl",
-- "line": 308
++ "line": 302
},
{
"via": "liveUrl",
-- "line": 364
++ "line": 361
},
{
"via": "live.internalUrl",
-- "line": 364
++ "line": 361
},
{
"via": "live.internalUrl",
-- "line": 535
++ "line": 537
}
]
},
@@@ -12142,7 +12099,7 @@
},
{
"via": "tools.internalUrl",
-- "line": 309
++ "line": 303
}
]
},
@@@ -12155,7 +12112,7 @@
},
{
"via": "media.internalUrl",
-- "line": 311
++ "line": 305
}
]
},
@@@ -12168,7 +12125,7 @@
},
{
"via": "games.internalUrl",
-- "line": 310
++ "line": 304
}
]
},
@@@ -12246,7 +12203,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 201,
++ "line": 205,
"file": "server/chrome/service.js",
"target": "OpenVibe.Network",
"disposition": "keep",
@@@ -12257,7 +12214,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 203,
++ "line": 207,
"file": "server/chrome/service.js",
"target": "OpenVibe.Network",
"disposition": "keep",
@@@ -12268,7 +12225,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 3600000,
-- "line": 722,
++ "line": 724,
"file": "server/index.js",
"target": "OpenVibe.Network",
"disposition": "keep",
@@@ -12279,7 +12236,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 120000,
-- "line": 725,
++ "line": 727,
"file": "server/index.js",
"target": "OpenVibe.Network",
"disposition": "keep",
@@@ -12290,7 +12247,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 740,
++ "line": 742,
"file": "server/index.js",
"target": "OpenVibe.Network",
"disposition": "keep",
@@@ -12301,7 +12258,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 743,
++ "line": 745,
"file": "server/index.js",
"target": "OpenVibe.Network",
"disposition": "keep",
@@@ -12309,9 +12266,9 @@
"note": "Runs in, and for, the service that owns it."
}
],
-- "contractTodos": 0,
++ "contractTodos": 4,
"unresolvedMounts": [],
-- "testFiles": 29,
++ "testFiles": 34,
"ci": true
},
{
@@@ -12319,13 +12276,13 @@
"service": "shared",
"present": true,
"git": {
-- "head": "c2726807c19505bc22d2bce794188a9d1516b022",
++ "head": "c7489fc8690967ffebcd9f0b45790e577b9fa468",
"branch": "main",
-- "originMain": "c2726807c19505bc22d2bce794188a9d1516b022",
-- "committedAt": "2026-09-23T13:40:53-07:00"
++ "originMain": "c7489fc8690967ffebcd9f0b45790e577b9fa468",
++ "committedAt": "2026-09-23T19:27:49-07:00"
},
"sourceFiles": 47,
-- "loc": 11774,
++ "loc": 11792,
"tables": [],
"routes": [
{
@@@ -12510,11 +12467,11 @@
},
{
"via": "/api/auth/me",
-- "line": 1013
++ "line": 1027
},
{
"via": "/api/auth/me",
-- "line": 1016
++ "line": 1030
}
]
}
@@@ -12604,13 +12561,13 @@
"service": "media",
"present": true,
"git": {
-- "head": "ad2217be56627efca799fd3ce0987d91cb6f3e24",
++ "head": "984e7ad9364971286ed1a9665159c5f304372344",
"branch": "main",
-- "originMain": "ad2217be56627efca799fd3ce0987d91cb6f3e24",
-- "committedAt": "2026-09-23T14:23:36-07:00"
++ "originMain": "984e7ad9364971286ed1a9665159c5f304372344",
++ "committedAt": "2026-09-23T19:27:39-07:00"
},
-- "sourceFiles": 47,
-- "loc": 13469,
++ "sourceFiles": 56,
++ "loc": 15482,
"tables": [
{
"table": "apps",
@@@ -12627,115 +12584,127 @@
{
"table": "clips",
"file": "server/db/schema.sql",
-- "line": 64,
++ "line": 65,
"via": "repo"
},
{
"table": "content_views",
"file": "server/db/schema.sql",
-- "line": 96,
++ "line": 97,
"via": "repo"
},
{
"table": "pastes",
"file": "server/db/schema.sql",
-- "line": 107,
++ "line": 108,
"via": "repo"
},
{
"table": "paste_likes",
"file": "server/db/schema.sql",
-- "line": 141,
++ "line": 142,
"via": "repo"
},
{
"table": "paste_comments",
"file": "server/db/schema.sql",
-- "line": 149,
++ "line": 150,
"via": "repo"
},
{
"table": "files",
"file": "server/db/schema.sql",
-- "line": 167,
++ "line": 168,
"via": "repo"
},
{
"table": "media_settings",
"file": "server/db/schema.sql",
-- "line": 182,
++ "line": 183,
"via": "repo"
},
{
"table": "assets",
"file": "server/db/schema.sql",
-- "line": 193,
++ "line": 194,
"via": "repo"
},
{
"table": "media_objects",
"file": "server/db/schema.sql",
-- "line": 214,
++ "line": 215,
"via": "repo"
},
{
"table": "media_locations",
"file": "server/db/schema.sql",
-- "line": 241,
++ "line": 242,
"via": "repo"
},
{
"table": "media_relationships",
"file": "server/db/schema.sql",
-- "line": 257,
++ "line": 258,
"via": "repo"
},
{
"table": "media_variants",
"file": "server/db/schema.sql",
-- "line": 268,
++ "line": 269,
"via": "repo"
},
{
"table": "media_jobs",
"file": "server/db/schema.sql",
-- "line": 281,
++ "line": 282,
"via": "repo"
},
{
"table": "media_uploads",
"file": "server/db/schema.sql",
-- "line": 312,
++ "line": 313,
"via": "repo"
},
{
"table": "media_upload_parts",
"file": "server/db/schema.sql",
-- "line": 328,
++ "line": 329,
"via": "repo"
},
{
"table": "media_holds",
"file": "server/db/schema.sql",
-- "line": 338,
++ "line": 339,
"via": "repo"
},
{
"table": "media_invariant_violations",
"file": "server/db/schema.sql",
-- "line": 351,
++ "line": 352,
++ "via": "repo"
++ },
++ {
++ "table": "media_tier_decisions",
++ "file": "server/db/schema.sql",
++ "line": 367,
++ "via": "repo"
++ },
++ {
++ "table": "media_object_changes",
++ "file": "server/db/schema.sql",
++ "line": 390,
"via": "repo"
},
{
"table": "media_verifications",
"file": "server/db/schema.sql",
-- "line": 365,
++ "line": 402,
"via": "repo"
},
{
"table": "media_verify_runs",
"file": "server/db/schema.sql",
-- "line": 377,
++ "line": 414,
"via": "repo"
},
{
@@@ -12750,7 +12719,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/observability.js",
-- "line": 140,
++ "line": 148,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12760,7 +12729,7 @@
"method": "GET",
"path": "/api/v1/:app/admin/storage",
"file": "server/admin/routes.js",
-- "line": 72,
++ "line": 77,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12770,7 +12739,7 @@
"method": "GET",
"path": "/api/v1/:app/admin/storage/buckets",
"file": "server/admin/routes.js",
-- "line": 404,
++ "line": 471,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12780,7 +12749,7 @@
"method": "GET",
"path": "/api/v1/:app/admin/storage/tiers",
"file": "server/admin/routes.js",
-- "line": 258,
++ "line": 263,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12790,7 +12759,17 @@
"method": "POST",
"path": "/api/v1/:app/admin/storage/tiers/bulk-move",
"file": "server/admin/routes.js",
-- "line": 377,
++ "line": 444,
++ "target": "OpenVibe.Media",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/api/v1/:app/admin/storage/tiers/decisions",
++ "file": "server/admin/routes.js",
++ "line": 373,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12800,7 +12779,17 @@
"method": "POST",
"path": "/api/v1/:app/admin/storage/tiers/move",
"file": "server/admin/routes.js",
-- "line": 359,
++ "line": 426,
++ "target": "OpenVibe.Media",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/api/v1/:app/admin/storage/tiers/policy",
++ "file": "server/admin/routes.js",
++ "line": 346,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12810,7 +12799,7 @@
"method": "PUT",
"path": "/api/v1/:app/admin/storage/tiers/settings",
"file": "server/admin/routes.js",
-- "line": 306,
++ "line": 311,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12820,7 +12809,7 @@
"method": "POST",
"path": "/api/v1/:app/admin/storage/tiers/sweep",
"file": "server/admin/routes.js",
-- "line": 332,
++ "line": 398,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12830,7 +12819,7 @@
"method": "GET",
"path": "/api/v1/:app/admin/storage/vods",
"file": "server/admin/routes.js",
-- "line": 127,
++ "line": 132,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12840,7 +12829,7 @@
"method": "DELETE",
"path": "/api/v1/:app/admin/storage/vods/bulk",
"file": "server/admin/routes.js",
-- "line": 199,
++ "line": 204,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12880,7 +12869,7 @@
"method": "GET",
"path": "/api/v1/:app/clips",
"file": "server/vod/clips-routes.js",
-- "line": 301,
++ "line": 312,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12890,7 +12879,7 @@
"method": "POST",
"path": "/api/v1/:app/clips",
"file": "server/vod/clips-routes.js",
-- "line": 120,
++ "line": 122,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12900,7 +12889,7 @@
"method": "DELETE",
"path": "/api/v1/:app/clips/:id",
"file": "server/vod/clips-routes.js",
-- "line": 386,
++ "line": 405,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12910,7 +12899,7 @@
"method": "GET",
"path": "/api/v1/:app/clips/:id",
"file": "server/vod/clips-routes.js",
-- "line": 327,
++ "line": 341,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12920,7 +12909,7 @@
"method": "PUT",
"path": "/api/v1/:app/clips/:id",
"file": "server/vod/clips-routes.js",
-- "line": 367,
++ "line": 381,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12930,7 +12919,7 @@
"method": "POST",
"path": "/api/v1/:app/clips/:id/recut",
"file": "server/vod/clips-routes.js",
-- "line": 350,
++ "line": 364,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12940,7 +12929,7 @@
"method": "GET",
"path": "/api/v1/:app/files",
"file": "server/files/routes.js",
-- "line": 152,
++ "line": 153,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12950,7 +12939,7 @@
"method": "POST",
"path": "/api/v1/:app/files",
"file": "server/files/routes.js",
-- "line": 83,
++ "line": 84,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12960,7 +12949,7 @@
"method": "DELETE",
"path": "/api/v1/:app/files/:key",
"file": "server/files/routes.js",
-- "line": 180,
++ "line": 181,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -12970,7 +12959,7 @@
"method": "GET",
"path": "/api/v1/:app/files/:key",
"file": "server/files/routes.js",
-- "line": 169,
++ "line": 170,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13050,7 +13039,7 @@
"method": "GET",
"path": "/api/v1/:app/pastes/:slug/comments",
"file": "server/pastes/routes.js",
-- "line": 717,
++ "line": 718,
"target": "OpenVibe.Community",
"disposition": "frozen-legacy",
"wave": "W5 (done 2026-09-22)",
@@@ -13060,7 +13049,7 @@
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/comments",
"file": "server/pastes/routes.js",
-- "line": 740,
++ "line": 741,
"target": "OpenVibe.Community",
"disposition": "frozen-legacy",
"wave": "W5 (done 2026-09-22)",
@@@ -13070,7 +13059,7 @@
"method": "DELETE",
"path": "/api/v1/:app/pastes/:slug/comments/:commentId",
"file": "server/pastes/routes.js",
-- "line": 818,
++ "line": 819,
"target": "OpenVibe.Community",
"disposition": "frozen-legacy",
"wave": "W5 (done 2026-09-22)",
@@@ -13160,7 +13149,7 @@
"method": "GET",
"path": "/api/v1/:app/stats",
"file": "server/index.js",
-- "line": 115,
++ "line": 148,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13170,7 +13159,7 @@
"method": "GET",
"path": "/api/v1/:app/stats/series/:metric",
"file": "server/index.js",
-- "line": 125,
++ "line": 158,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13230,7 +13219,7 @@
"method": "DELETE",
"path": "/api/v1/:app/vods/:id",
"file": "server/vod/routes.js",
-- "line": 366,
++ "line": 369,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13240,7 +13229,7 @@
"method": "GET",
"path": "/api/v1/:app/vods/:id",
"file": "server/vod/routes.js",
-- "line": 312,
++ "line": 314,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13250,7 +13239,7 @@
"method": "PUT",
"path": "/api/v1/:app/vods/:id",
"file": "server/vod/routes.js",
-- "line": 343,
++ "line": 346,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13320,7 +13309,7 @@
"method": "GET",
"path": "/api/v1/:app/vods/latest-thumbs",
"file": "server/vod/routes.js",
-- "line": 301,
++ "line": 303,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13450,7 +13439,7 @@
"method": "PUT",
"path": "/api/v2/:app/objects/:id/content",
"file": "server/index.js",
-- "line": 35,
++ "line": 63,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13540,7 +13529,7 @@
"method": "PUT",
"path": "/api/v2/:app/objects/:id/multipart/:uploadId/parts/:n",
"file": "server/index.js",
-- "line": 36,
++ "line": 64,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13570,7 +13559,7 @@
"method": "GET",
"path": "/auth/callback",
"file": "server/user-auth.js",
-- "line": 281,
++ "line": 282,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13580,7 +13569,7 @@
"method": "POST",
"path": "/auth/fedcm",
"file": "server/user-auth.js",
-- "line": 327,
++ "line": 328,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13590,7 +13579,7 @@
"method": "GET",
"path": "/auth/login",
"file": "server/user-auth.js",
-- "line": 259,
++ "line": 260,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13600,7 +13589,7 @@
"method": "GET",
"path": "/auth/logout",
"file": "server/user-auth.js",
-- "line": 355,
++ "line": 356,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13610,7 +13599,7 @@
"method": "GET",
"path": "/auth/me",
"file": "server/user-auth.js",
-- "line": 379,
++ "line": 380,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13620,7 +13609,7 @@
"method": "POST",
"path": "/auth/refresh",
"file": "server/user-auth.js",
-- "line": 389,
++ "line": 390,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13630,7 +13619,7 @@
"method": "GET",
"path": "/healthz",
"file": "server/index.js",
-- "line": 93,
++ "line": 125,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13640,7 +13629,7 @@
"method": "POST",
"path": "/internal/avatar-ingest",
"file": "server/index.js",
-- "line": 64,
++ "line": 92,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13650,7 +13639,7 @@
"method": "GET",
"path": "/manifest.webmanifest",
"file": "server/index.js",
-- "line": 52,
++ "line": 80,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13816,21 +13805,11 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/index.js",
-- "line": 91,
-- "target": "OpenVibe.Media",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/tos",
"file": "server/index.js",
-- "line": 49,
++ "line": 77,
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
@@@ -13843,7 +13822,9 @@
},
"env": {
"HOST": [
-- "server/config.js"
++ "server/config.js",
++ "server/drill.js",
++ "server/index.js"
],
"NODE_ENV": [
"server/config.js"
@@@ -13852,7 +13833,9 @@
"server/config.js"
],
"DB_PATH": [
-- "server/config.js"
++ "server/config.js",
++ "server/drill.js",
++ "server/index.js"
],
"VOD_PATH": [
"server/config.js"
@@@ -13890,6 +13873,12 @@
"MEDIA_VERIFY_REPAIR_CORRUPT": [
"server/config.js"
],
++ "MEDIA_OWNER_SUBJECT_SYNC": [
++ "server/config.js"
++ ],
++ "MEDIA_RTMP_PULL_ALLOW": [
++ "server/config.js"
++ ],
"OV_NETWORK_URL": [
"server/config.js"
],
@@@ -13907,16 +13896,25 @@
"MEDIA_APP_KEYS": [
"server/config.js"
],
++ "MEDIA_DRILL": [
++ "server/drill.js"
++ ],
++ "PORT": [
++ "server/drill.js",
++ "server/index.js"
++ ],
"EVENTS_URL": [
"server/events.js"
],
"OV_OAUTH_CLIENT_SECRET": [
"server/events.js",
-- "server/index.js"
++ "server/index.js",
++ "server/objects/owner-subject.js"
],
"OV_OAUTH_CLIENT_ID": [
"server/events.js",
-- "server/index.js"
++ "server/index.js",
++ "server/objects/owner-subject.js"
],
"EVENTS_PUBLISH": [
"server/events.js"
@@@ -13924,6 +13922,9 @@
"OV_OAUTH_REDIRECT_URI": [
"server/index.js"
],
++ "MEDIA_DURATION_RECONCILE_APPLY": [
++ "server/jobs/duration-reconcile.js"
++ ],
"PASTES_FROZEN_APPS": [
"server/pastes/routes.js"
],
@@@ -14092,23 +14093,23 @@
},
{
"via": "networkUrl",
-- "line": 146
++ "line": 147
},
{
"via": "networkInternalUrl",
-- "line": 227
++ "line": 228
},
{
"via": "networkUrl",
-- "line": 227
++ "line": 228
},
{
"via": "/oauth/token",
-- "line": 230
++ "line": 231
},
{
"via": "networkInternalUrl",
-- "line": 361
++ "line": 362
}
]
}
@@@ -14135,11 +14136,11 @@
},
{
"via": "webhook_url (per-app, configured in DB)",
-- "line": 56
++ "line": 58
},
{
"via": "webhook_url (per-app, configured in DB)",
-- "line": 65
++ "line": 67
}
]
}
@@@ -14195,11 +14196,33 @@
"wave": "-",
"note": "Runs in, and for, the service that owns it."
},
++ {
++ "kind": "setInterval",
++ "name": null,
++ "intervalMs": 3600000,
++ "line": 68,
++ "file": "server/events.js",
++ "target": "OpenVibe.Media",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "Runs in, and for, the service that owns it."
++ },
{
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 73,
++ "line": 86,
++ "file": "server/events.js",
++ "target": "OpenVibe.Media",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "Runs in, and for, the service that owns it."
++ },
++ {
++ "kind": "setInterval",
++ "name": null,
++ "intervalMs": null,
++ "line": 90,
"file": "server/events.js",
"target": "OpenVibe.Media",
"disposition": "keep",
@@@ -14210,7 +14233,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 43200000,
-- "line": 137,
++ "line": 170,
"file": "server/index.js",
"target": "OpenVibe.Media",
"disposition": "keep",
@@@ -14221,7 +14244,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 166,
++ "line": 199,
"file": "server/index.js",
"target": "OpenVibe.Media",
"disposition": "keep",
@@@ -14232,7 +14255,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 64,
++ "line": 68,
"file": "server/jobs/worker.js",
"target": "OpenVibe.Media",
"disposition": "keep",
@@@ -14243,13 +14266,24 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 183,
++ "line": 193,
"file": "server/jobs/worker.js",
"target": "OpenVibe.Media",
"disposition": "keep",
"wave": "-",
"note": "Runs in, and for, the service that owns it."
},
++ {
++ "kind": "setInterval",
++ "name": null,
++ "intervalMs": null,
++ "line": 51,
++ "file": "server/objects/owner-subject-job.js",
++ "target": "OpenVibe.Media",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "Runs in, and for, the service that owns it."
++ },
{
"kind": "setInterval",
"name": null,
@@@ -14265,7 +14299,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 709,
++ "line": 710,
"file": "server/pastes/routes.js",
"target": "OpenVibe.Community",
"disposition": "frozen-legacy",
@@@ -14309,7 +14343,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 60000,
-- "line": 213,
++ "line": 235,
"file": "server/vod/recorder.js",
"target": "OpenVibe.Media",
"disposition": "keep",
@@@ -14320,7 +14354,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 484,
++ "line": 571,
"file": "server/vod/vod-storage.js",
"target": "OpenVibe.Media",
"disposition": "keep",
@@@ -14330,7 +14364,7 @@
],
"contractTodos": 0,
"unresolvedMounts": [],
-- "testFiles": 20,
++ "testFiles": 34,
"ci": true
},
{
@@@ -14338,14 +14372,32 @@
"service": "tools",
"present": true,
"git": {
-- "head": "5d1b42357392d47e5cc3f6bef3f22facdc6c23cd",
++ "head": "b0aada2c3887b009176ceb934e7df98faa666cae",
"branch": "main",
-- "originMain": "5d1b42357392d47e5cc3f6bef3f22facdc6c23cd",
-- "committedAt": "2026-09-23T13:17:07-07:00"
++ "originMain": "b0aada2c3887b009176ceb934e7df98faa666cae",
++ "committedAt": "2026-09-23T19:27:54-07:00"
},
-- "sourceFiles": 130,
-- "loc": 22829,
++ "sourceFiles": 169,
++ "loc": 29390,
"tables": [
++ {
++ "table": "guard_salt",
++ "file": "apps/_shared/guard/store.js",
++ "line": 27,
++ "via": "repo"
++ },
++ {
++ "table": "guard_day",
++ "file": "apps/_shared/guard/store.js",
++ "line": 31,
++ "via": "repo"
++ },
++ {
++ "table": "guard_abuse",
++ "file": "apps/_shared/guard/store.js",
++ "line": 38,
++ "via": "repo"
++ },
{
"table": "tool_jobs",
"file": "apps/_shared/jobs/store.js",
@@@ -14380,7 +14432,7 @@
"method": "GET",
"path": "/",
"file": "apps/text/server/index.js",
-- "line": 209,
++ "line": 152,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14410,7 +14462,7 @@
"method": "GET",
"path": "/api/brand",
"file": "apps/gateway/server/index.js",
-- "line": 176,
++ "line": 259,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14430,7 +14482,7 @@
"method": "GET",
"path": "/api/context",
"file": "apps/audio/server/index.js",
-- "line": 133,
++ "line": 161,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14440,7 +14492,7 @@
"method": "GET",
"path": "/api/context",
"file": "apps/docs/server/index.js",
-- "line": 129,
++ "line": 190,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14450,67 +14502,7 @@
"method": "GET",
"path": "/api/context",
"file": "apps/img/server/index.js",
-- "line": 130,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/dev/opengraph",
-- "file": "apps/gateway/server/dev/routes.js",
-- "line": 83,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/dev/tools",
-- "file": "apps/gateway/server/dev/routes.js",
-- "line": 71,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "POST",
-- "path": "/api/dev/webhook/bins",
-- "file": "apps/gateway/server/dev/routes.js",
-- "line": 151,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "DELETE",
-- "path": "/api/dev/webhook/bins/:binId",
-- "file": "apps/gateway/server/dev/routes.js",
-- "line": 217,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/dev/webhook/bins/:binId",
-- "file": "apps/gateway/server/dev/routes.js",
-- "line": 172,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "ALL",
-- "path": "/api/dev/webhook/bins/:binId/in",
-- "file": "apps/gateway/server/dev/routes.js",
-- "line": 186,
++ "line": 184,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14520,7 +14512,7 @@
"method": "POST",
"path": "/api/download",
"file": "apps/yt/server/index.js",
-- "line": 142,
++ "line": 171,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14530,7 +14522,7 @@
"method": "DELETE",
"path": "/api/download/:id",
"file": "apps/yt/server/index.js",
-- "line": 223,
++ "line": 258,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14540,7 +14532,7 @@
"method": "GET",
"path": "/api/download/:id",
"file": "apps/audio/server/index.js",
-- "line": 222,
++ "line": 294,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14550,7 +14542,7 @@
"method": "GET",
"path": "/api/download/:id",
"file": "apps/docs/server/index.js",
-- "line": 269,
++ "line": 345,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14560,7 +14552,7 @@
"method": "GET",
"path": "/api/download/:id",
"file": "apps/img/server/index.js",
-- "line": 219,
++ "line": 287,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14570,7 +14562,7 @@
"method": "GET",
"path": "/api/download/:id",
"file": "apps/yt/server/index.js",
-- "line": 230,
++ "line": 265,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14580,7 +14572,7 @@
"method": "GET",
"path": "/api/food-banks",
"file": "apps/food/server/index.js",
-- "line": 105,
++ "line": 136,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14590,7 +14582,7 @@
"method": "GET",
"path": "/api/food-banks",
"file": "apps/maps/server/index.js",
-- "line": 398,
++ "line": 428,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14600,7 +14592,7 @@
"method": "GET",
"path": "/api/foods",
"file": "apps/food/server/index.js",
-- "line": 107,
++ "line": 138,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14610,7 +14602,7 @@
"method": "GET",
"path": "/api/foods",
"file": "apps/maps/server/index.js",
-- "line": 419,
++ "line": 449,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14620,7 +14612,7 @@
"method": "GET",
"path": "/api/geocode",
"file": "apps/food/server/index.js",
-- "line": 109,
++ "line": 140,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14630,7 +14622,7 @@
"method": "GET",
"path": "/api/geocode",
"file": "apps/maps/server/index.js",
-- "line": 121,
++ "line": 150,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14640,7 +14632,7 @@
"method": "GET",
"path": "/api/health",
"file": "apps/audio/server/index.js",
-- "line": 127,
++ "line": 154,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14650,7 +14642,7 @@
"method": "GET",
"path": "/api/health",
"file": "apps/docs/server/index.js",
-- "line": 123,
++ "line": 183,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14660,7 +14652,7 @@
"method": "GET",
"path": "/api/health",
"file": "apps/gateway/server/index.js",
-- "line": 172,
++ "line": 255,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14670,7 +14662,7 @@
"method": "GET",
"path": "/api/health",
"file": "apps/img/server/index.js",
-- "line": 124,
++ "line": 177,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14680,7 +14672,7 @@
"method": "GET",
"path": "/api/health",
"file": "apps/text/server/index.js",
-- "line": 182,
++ "line": 125,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14690,7 +14682,7 @@
"method": "GET",
"path": "/api/health",
"file": "apps/yt/server/index.js",
-- "line": 120,
++ "line": 146,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14700,7 +14692,7 @@
"method": "POST",
"path": "/api/info",
"file": "apps/docs/server/index.js",
-- "line": 151,
++ "line": 214,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14710,7 +14702,7 @@
"method": "POST",
"path": "/api/info",
"file": "apps/yt/server/index.js",
-- "line": 127,
++ "line": 153,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14720,7 +14712,7 @@
"method": "GET",
"path": "/api/internal/analytics",
"file": "apps/audio/server/index.js",
-- "line": 271,
++ "line": 343,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14730,7 +14722,7 @@
"method": "GET",
"path": "/api/internal/analytics",
"file": "apps/docs/server/index.js",
-- "line": 287,
++ "line": 363,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14740,7 +14732,7 @@
"method": "GET",
"path": "/api/internal/analytics",
"file": "apps/food/server/index.js",
-- "line": 112,
++ "line": 143,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14750,7 +14742,7 @@
"method": "GET",
"path": "/api/internal/analytics",
"file": "apps/gateway/server/index.js",
-- "line": 256,
++ "line": 342,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14760,7 +14752,7 @@
"method": "GET",
"path": "/api/internal/analytics",
"file": "apps/img/server/index.js",
-- "line": 237,
++ "line": 305,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14770,7 +14762,7 @@
"method": "GET",
"path": "/api/internal/analytics",
"file": "apps/maps/server/index.js",
-- "line": 441,
++ "line": 471,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14780,7 +14772,7 @@
"method": "GET",
"path": "/api/internal/analytics",
"file": "apps/text/server/index.js",
-- "line": 170,
++ "line": 113,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14790,7 +14782,7 @@
"method": "GET",
"path": "/api/internal/analytics",
"file": "apps/yt/server/index.js",
-- "line": 244,
++ "line": 279,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14800,7 +14792,7 @@
"method": "GET",
"path": "/api/internal/analytics/bots",
"file": "apps/audio/server/index.js",
-- "line": 276,
++ "line": 348,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14810,7 +14802,7 @@
"method": "GET",
"path": "/api/internal/analytics/bots",
"file": "apps/docs/server/index.js",
-- "line": 292,
++ "line": 368,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14820,7 +14812,7 @@
"method": "GET",
"path": "/api/internal/analytics/bots",
"file": "apps/food/server/index.js",
-- "line": 117,
++ "line": 148,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14830,7 +14822,7 @@
"method": "GET",
"path": "/api/internal/analytics/bots",
"file": "apps/img/server/index.js",
-- "line": 242,
++ "line": 310,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14840,7 +14832,7 @@
"method": "GET",
"path": "/api/internal/analytics/bots",
"file": "apps/maps/server/index.js",
-- "line": 446,
++ "line": 476,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14850,7 +14842,7 @@
"method": "GET",
"path": "/api/internal/analytics/bots",
"file": "apps/text/server/index.js",
-- "line": 175,
++ "line": 118,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14860,7 +14852,7 @@
"method": "GET",
"path": "/api/internal/analytics/bots",
"file": "apps/yt/server/index.js",
-- "line": 249,
++ "line": 284,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14868,9 +14860,9 @@
},
{
"method": "GET",
-- "path": "/api/meal-plan",
-- "file": "apps/food/server/index.js",
-- "line": 108,
++ "path": "/api/internal/jobs/:id",
++ "file": "apps/_shared/jobs/http.js",
++ "line": 112,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -14879,128 +14871,8 @@
{
"method": "GET",
"path": "/api/meal-plan",
-- "file": "apps/maps/server/index.js",
-- "line": 429,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/dns/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 298,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/headers/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 504,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/ip/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 122,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/ipv4/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 176,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/ipv6/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 250,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/lookup/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 676,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/myip",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 115,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/ping/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 639,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/port/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 613,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/rdap/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 389,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/rdns/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 361,
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/api/net/redirects/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 550,
++ "file": "apps/food/server/index.js",
++ "line": 139,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15008,9 +14880,9 @@
},
{
"method": "GET",
-- "path": "/api/net/ssl/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 437,
++ "path": "/api/meal-plan",
++ "file": "apps/maps/server/index.js",
++ "line": 459,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15018,29 +14890,29 @@
},
{
"method": "GET",
-- "path": "/api/net/tools",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 107,
++ "path": "/api/preview/:id",
++ "file": "apps/audio/server/index.js",
++ "line": 312,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
{
-- "method": "GET",
-- "path": "/api/net/whois/:target?",
-- "file": "apps/gateway/server/net/routes.js",
-- "line": 426,
++ "method": "POST",
++ "path": "/api/probe",
++ "file": "apps/audio/server/index.js",
++ "line": 185,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
{
-- "method": "GET",
-- "path": "/api/preview/:id",
-- "file": "apps/audio/server/index.js",
-- "line": 240,
++ "method": "POST",
++ "path": "/api/process",
++ "file": "apps/_shared/guard/index.js",
++ "line": 12,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15048,9 +14920,9 @@
},
{
"method": "POST",
-- "path": "/api/probe",
++ "path": "/api/process",
"file": "apps/audio/server/index.js",
-- "line": 155,
++ "line": 198,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15059,8 +14931,8 @@
{
"method": "POST",
"path": "/api/process",
-- "file": "apps/audio/server/index.js",
-- "line": 168,
++ "file": "apps/docs/server/index.js",
++ "line": 226,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15069,8 +14941,8 @@
{
"method": "POST",
"path": "/api/process",
-- "file": "apps/docs/server/index.js",
-- "line": 163,
++ "file": "apps/img/server/index.js",
++ "line": 210,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15078,9 +14950,9 @@
},
{
"method": "POST",
-- "path": "/api/process",
++ "path": "/api/process/direct",
"file": "apps/img/server/index.js",
-- "line": 152,
++ "line": 237,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15088,9 +14960,9 @@
},
{
"method": "POST",
-- "path": "/api/process/direct",
-- "file": "apps/img/server/index.js",
-- "line": 180,
++ "path": "/api/process/multi",
++ "file": "apps/audio/server/index.js",
++ "line": 239,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15100,7 +14972,7 @@
"method": "POST",
"path": "/api/process/multi",
"file": "apps/docs/server/index.js",
-- "line": 210,
++ "line": 273,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15120,7 +14992,7 @@
"method": "GET",
"path": "/api/ready",
"file": "apps/gateway/server/index.js",
-- "line": 108,
++ "line": 130,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15130,7 +15002,7 @@
"method": "GET",
"path": "/api/search",
"file": "apps/maps/server/index.js",
-- "line": 227,
++ "line": 257,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15140,7 +15012,7 @@
"method": "GET",
"path": "/api/search/stream",
"file": "apps/maps/server/index.js",
-- "line": 272,
++ "line": 302,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15150,7 +15022,7 @@
"method": "GET",
"path": "/api/status/:id",
"file": "apps/yt/server/index.js",
-- "line": 157,
++ "line": 191,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15160,7 +15032,7 @@
"method": "GET",
"path": "/api/status/:id/stream",
"file": "apps/yt/server/index.js",
-- "line": 173,
++ "line": 207,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15170,7 +15042,7 @@
"method": "GET",
"path": "/api/stores",
"file": "apps/food/server/index.js",
-- "line": 106,
++ "line": 137,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15180,7 +15052,7 @@
"method": "GET",
"path": "/api/stores",
"file": "apps/maps/server/index.js",
-- "line": 409,
++ "line": 439,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15190,7 +15062,7 @@
"method": "GET",
"path": "/api/terrain",
"file": "apps/maps/server/index.js",
-- "line": 388,
++ "line": 418,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15200,7 +15072,7 @@
"method": "GET",
"path": "/api/tools",
"file": "apps/audio/server/index.js",
-- "line": 150,
++ "line": 180,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15210,7 +15082,7 @@
"method": "GET",
"path": "/api/tools",
"file": "apps/docs/server/index.js",
-- "line": 146,
++ "line": 209,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15220,7 +15092,7 @@
"method": "GET",
"path": "/api/tools",
"file": "apps/img/server/index.js",
-- "line": 147,
++ "line": 205,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15230,7 +15102,7 @@
"method": "POST",
"path": "/api/v1/jobs",
"file": "apps/_shared/jobs/http.js",
-- "line": 161,
++ "line": 147,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15310,7 +15182,7 @@
"method": "GET",
"path": "/api/weather",
"file": "apps/maps/server/index.js",
-- "line": 372,
++ "line": 402,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15376,11 +15248,81 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
++ {
++ "method": "GET",
++ "path": "/blacklist/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 952,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/dns/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 434,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/dnsprop/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 953,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/headers/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 627,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/ip/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 298,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/ipv4/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 350,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/ipv6/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 395,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
{
"method": "GET",
"path": "/js/ov-jobs.js",
"file": "apps/_shared/jobs/http.js",
-- "line": 143,
++ "line": 120,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15398,9 +15340,9 @@
},
{
"method": "GET",
-- "path": "/openvibe-sw.js",
-- "file": "apps/gateway/server/index.js",
-- "line": 321,
++ "path": "/lookup/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 802,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15408,9 +15350,9 @@
},
{
"method": "GET",
-- "path": "/release.json",
-- "file": "apps/audio/server/index.js",
-- "line": 64,
++ "path": "/myip",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 293,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15418,9 +15360,9 @@
},
{
"method": "GET",
-- "path": "/release.json",
-- "file": "apps/docs/server/index.js",
-- "line": 61,
++ "path": "/opengraph",
++ "file": "apps/gateway/server/dev/routes.js",
++ "line": 87,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15428,9 +15370,9 @@
},
{
"method": "GET",
-- "path": "/release.json",
-- "file": "apps/food/server/index.js",
-- "line": 44,
++ "path": "/openvibe-sw.js",
++ "file": "apps/gateway/server/index.js",
++ "line": 407,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15438,9 +15380,9 @@
},
{
"method": "GET",
-- "path": "/release.json",
-- "file": "apps/gateway/server/index.js",
-- "line": 74,
++ "path": "/ping/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 765,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15448,9 +15390,9 @@
},
{
"method": "GET",
-- "path": "/release.json",
-- "file": "apps/img/server/index.js",
-- "line": 61,
++ "path": "/port/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 736,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15458,9 +15400,9 @@
},
{
"method": "GET",
-- "path": "/release.json",
-- "file": "apps/maps/server/index.js",
-- "line": 45,
++ "path": "/rdap/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 515,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15468,9 +15410,9 @@
},
{
"method": "GET",
-- "path": "/release.json",
-- "file": "apps/text/server/index.js",
-- "line": 37,
++ "path": "/rdns/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 487,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15478,9 +15420,9 @@
},
{
"method": "GET",
-- "path": "/release.json",
-- "file": "apps/yt/server/index.js",
-- "line": 53,
++ "path": "/redirects/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 673,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15496,6 +15438,16 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
++ {
++ "method": "GET",
++ "path": "/robots/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 948,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
{
"method": "GET",
"path": "/search",
@@@ -15520,7 +15472,37 @@
"method": "GET",
"path": "/sitemap.xml",
"file": "apps/text/server/index.js",
-- "line": 203,
++ "line": 146,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/sitemap/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 949,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/smtp/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 951,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/ssl/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 560,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15536,11 +15518,91 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
++ {
++ "method": "GET",
++ "path": "/tools",
++ "file": "apps/gateway/server/dev/routes.js",
++ "line": 75,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/tools",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 283,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
{
"method": "GET",
"path": "/tos",
"file": "apps/gateway/server/index.js",
-- "line": 281,
++ "line": 367,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/uptime/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 950,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "POST",
++ "path": "/webhook/bins",
++ "file": "apps/gateway/server/dev/routes.js",
++ "line": 165,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "DELETE",
++ "path": "/webhook/bins/:binId",
++ "file": "apps/gateway/server/dev/routes.js",
++ "line": 239,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/webhook/bins/:binId",
++ "file": "apps/gateway/server/dev/routes.js",
++ "line": 193,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "ALL",
++ "path": "/webhook/bins/:binId/in",
++ "file": "apps/gateway/server/dev/routes.js",
++ "line": 208,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/whois/:target?",
++ "file": "apps/gateway/server/net/routes.js",
++ "line": 549,
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -15552,6 +15614,27 @@
"paths": []
},
"env": {
++ "NODE_ENV": [
++ "apps/_shared/guard/caller.js",
++ "apps/_shared/guard/index.js",
++ "apps/audio/server/index.js",
++ "apps/docs/server/index.js",
++ "apps/food/server/index.js",
++ "apps/gateway/server/config.js",
++ "apps/img/server/index.js",
++ "apps/text/server/index.js",
++ "apps/yt/server/index.js",
++ "apps/yt/server/seo.js"
++ ],
++ "TOOLS_GUARD": [
++ "apps/_shared/guard/index.js"
++ ],
++ "OV_TOOLS_AUDIENCE": [
++ "apps/_shared/guard/index.js"
++ ],
++ "TOOLS_GUARD_LIMITS": [
++ "apps/_shared/guard/limits.js"
++ ],
"OV_EXTRA_HOSTS": [
"apps/_shared/host-role.js"
],
@@@ -15578,9 +15661,12 @@
"apps/_shared/jobs/index.js",
"apps/audio/server/config.js",
"apps/docs/server/config.js",
++ "apps/food/server/index.js",
"apps/gateway/server/config.js",
"apps/gateway/server/registry/services.js",
"apps/img/server/config.js",
++ "apps/maps/server/index.js",
++ "apps/text/server/index.js",
"apps/yt/server/config.js"
],
"OV_OAUTH_CLIENT_ID": [
@@@ -15591,17 +15677,6 @@
"EVENTS_RELAY_INTERVAL_MS": [
"apps/_shared/jobs/events.js"
],
-- "NODE_ENV": [
-- "apps/_shared/jobs/http.js",
-- "apps/audio/server/index.js",
-- "apps/docs/server/index.js",
-- "apps/food/server/index.js",
-- "apps/gateway/server/config.js",
-- "apps/img/server/index.js",
-- "apps/text/server/index.js",
-- "apps/yt/server/index.js",
-- "apps/yt/server/seo.js"
-- ],
"TOOLS_JOB_RESULTS": [
"apps/_shared/jobs/index.js"
],
@@@ -15624,6 +15699,9 @@
"PATH": [
"apps/_shared/observe.js"
],
++ "TOOLS_SATELLITE_PORTS": [
++ "apps/_shared/tools/satellites.js"
++ ],
"PORT": [
"apps/audio/server/config.js",
"apps/docs/server/config.js",
@@@ -15646,6 +15724,7 @@
"DATA_DIR": [
"apps/audio/server/config.js",
"apps/docs/server/config.js",
++ "apps/gateway/server/index.js",
"apps/img/server/config.js",
"apps/text/server/index.js",
"apps/yt/server/config.js"
@@@ -15663,23 +15742,40 @@
"OV_NETWORK_URL": [
"apps/audio/server/config.js",
"apps/docs/server/config.js",
++ "apps/food/server/index.js",
"apps/gateway/server/config.js",
"apps/gateway/server/registry/services.js",
"apps/img/server/config.js",
++ "apps/maps/server/index.js",
"apps/text/server/config.js",
++ "apps/text/server/index.js",
"apps/yt/server/config.js",
"OpenVibe.Shared/brand.js"
],
"OV_NETWORK_PUBLIC_KEY": [
"apps/audio/server/config.js",
"apps/docs/server/config.js",
++ "apps/food/server/index.js",
"apps/img/server/config.js",
++ "apps/maps/server/index.js",
++ "apps/text/server/index.js",
"apps/yt/server/config.js"
],
++ "AUDIO_MAX_DURATION": [
++ "apps/audio/server/descriptors.js"
++ ],
"FFMPEG_PATH": [
"apps/audio/server/index.js",
"apps/yt/server/index.js"
],
++ "PDF_MAX_PAGES": [
++ "apps/docs/server/descriptors.js",
++ "apps/docs/server/tools/pdf.js"
++ ],
++ "PDF2IMG_MAX_PAGES": [
++ "apps/docs/server/descriptors.js",
++ "apps/docs/server/tools/pdf2img.js"
++ ],
"MAPS_API": [
"apps/food/server/index.js"
],
@@@ -15703,9 +15799,6 @@
"OV_COMMUNITY_INTERNAL_URL": [
"apps/gateway/server/config.js"
],
-- "TOOLS_SATELLITE_PORTS": [
-- "apps/gateway/server/index.js"
-- ],
"OV_ENFORCE_HOSTS": [
"apps/gateway/server/index.js"
],
@@@ -15732,6 +15825,16 @@
"YTDLP_PATH": [
"apps/yt/server/config.js"
],
++ "YT_MAX_DURATION": [
++ "apps/yt/server/config.js",
++ "apps/yt/server/descriptors.js"
++ ],
++ "YT_MAX_FILESIZE_MB": [
++ "apps/yt/server/config.js"
++ ],
++ "YT_INFO_CONCURRENCY": [
++ "apps/yt/server/config.js"
++ ],
"DOWNLOADS_DIR": [
"apps/yt/server/config.js"
],
@@@ -15790,18 +15893,44 @@
],
"OV_PASTES_URL": [
"OpenVibe.Shared/brand.js"
-- ],
-- "MIN_CLIENT_RELEASE": [
-- "OpenVibe.Shared/release.js"
-- ],
-- "RELEASE_COMMIT": [
-- "OpenVibe.Shared/release.js"
-- ],
-- "RELEASE_AT": [
-- "OpenVibe.Shared/release.js"
]
},
"outbound": [
++ {
++ "file": "apps/_shared/guard/tokens.js",
++ "targets": [
++ {
++ "service": "network",
++ "refs": [
++ {
++ "via": "/api/.well-known/jwks",
++ "line": 25
++ },
++ {
++ "via": "networkUrl",
++ "line": 131
++ },
++ {
++ "via": "networkInternalUrl",
++ "line": 131
++ },
++ {
++ "via": "networkInternalUrl",
++ "line": 140
++ },
++ {
++ "via": "networkUrl",
++ "line": 140
++ }
++ ]
++ }
++ ],
++ "auth": [
++ "service-token"
++ ],
++ "timeout": true,
++ "retry": true
++ },
{
"file": "apps/_shared/jobs/index.js",
"targets": [
@@@ -15810,43 +15939,43 @@
"refs": [
{
"via": ":4100",
-- "line": 14
++ "line": 18
},
{
"via": "OV_MEDIA_INTERNAL_URL",
-- "line": 50
++ "line": 54
},
{
"via": "MEDIA_URL",
-- "line": 50
++ "line": 54
},
{
"via": ":4100",
-- "line": 50
++ "line": 54
},
{
"via": "mediaOrigin",
-- "line": 58
++ "line": 62
},
{
"via": "OV_MEDIA_URL",
-- "line": 59
++ "line": 63
},
{
"via": "OV_MEDIA_INTERNAL_URL",
-- "line": 122
++ "line": 143
},
{
"via": "MEDIA_URL",
-- "line": 122
++ "line": 143
},
{
"via": ":4100",
-- "line": 122
++ "line": 143
},
{
"via": "mediaOrigin",
-- "line": 136
++ "line": 157
}
]
},
@@@ -15855,19 +15984,19 @@
"refs": [
{
"via": ":4000",
-- "line": 16
++ "line": 20
},
{
"via": "OV_NETWORK_INTERNAL_URL",
-- "line": 41
++ "line": 45
},
{
"via": ":4000",
-- "line": 41
++ "line": 45
},
{
"via": "/oauth/token",
-- "line": 43
++ "line": 47
}
]
},
@@@ -15876,7 +16005,7 @@
"refs": [
{
"via": "EVENTS_URL",
-- "line": 87
++ "line": 96
}
]
}
@@@ -15889,65 +16018,30 @@
"retry": false
},
{
-- "file": "apps/audio/server/auth.js",
++ "file": "apps/food/server/index.js",
"targets": [
{
"service": "network",
"refs": [
{
-- "via": "/api/.well-known/jwks",
-- "line": 9
-- },
-- {
-- "via": "networkUrl",
-- "line": 20
-- },
-- {
-- "via": "/api/.well-known/jwks",
-- "line": 21
-- },
-- {
-- "via": "networkInternalUrl",
-- "line": 40
++ "via": "OV_NETWORK_URL",
++ "line": 33
},
{
-- "via": "networkUrl",
-- "line": 40
-- }
-- ]
-- }
-- ],
-- "auth": [
-- "none-detected"
-- ],
-- "timeout": true,
-- "retry": true
-- },
-- {
-- "file": "apps/docs/server/auth.js",
-- "targets": [
-- {
-- "service": "network",
-- "refs": [
-- {
-- "via": "/api/.well-known/jwks",
-- "line": 9
++ "via": "OV_NETWORK_INTERNAL_URL",
++ "line": 36
},
{
"via": "networkUrl",
-- "line": 20
-- },
-- {
-- "via": "/api/.well-known/jwks",
-- "line": 21
++ "line": 36
},
{
"via": "networkInternalUrl",
-- "line": 40
++ "line": 36
},
{
-- "via": "networkUrl",
-- "line": 40
++ "via": ":4000",
++ "line": 36
}
]
}
@@@ -15956,7 +16050,7 @@
"none-detected"
],
"timeout": true,
-- "retry": true
++ "retry": false
},
{
"file": "apps/gateway/server/auth/routes.js",
@@@ -16021,28 +16115,32 @@
"file": "apps/gateway/server/index.js",
"targets": [
{
-- "service": "community",
++ "service": "network",
"refs": [
{
-- "via": "communityUrl",
-- "line": 70
-- },
-- {
-- "via": "communityUrl",
-- "line": 185
++ "via": "networkUrl",
++ "line": 61
},
{
-- "via": "OV_COMMUNITY_URL",
-- "line": 302
++ "via": "networkUrl",
++ "line": 442
}
]
},
{
-- "service": "network",
++ "service": "community",
"refs": [
{
-- "via": "networkUrl",
-- "line": 353
++ "via": "communityUrl",
++ "line": 84
++ },
++ {
++ "via": "communityUrl",
++ "line": 268
++ },
++ {
++ "via": "OV_COMMUNITY_URL",
++ "line": 388
}
]
},
@@@ -16051,7 +16149,7 @@
"refs": [
{
"via": "liveUrl",
-- "line": 354
++ "line": 443
}
]
}
@@@ -16061,7 +16159,7 @@
"bearer"
],
"timeout": true,
-- "retry": false
++ "retry": true
},
{
"file": "apps/gateway/server/registry/services.js",
@@@ -16091,30 +16189,30 @@
"retry": false
},
{
-- "file": "apps/img/server/auth.js",
++ "file": "apps/maps/server/index.js",
"targets": [
{
"service": "network",
"refs": [
{
-- "via": "/api/.well-known/jwks",
-- "line": 9
++ "via": "OV_NETWORK_URL",
++ "line": 39
},
{
-- "via": "networkUrl",
-- "line": 20
++ "via": "OV_NETWORK_INTERNAL_URL",
++ "line": 42
},
{
-- "via": "/api/.well-known/jwks",
-- "line": 21
++ "via": "networkUrl",
++ "line": 42
},
{
"via": "networkInternalUrl",
-- "line": 40
++ "line": 42
},
{
-- "via": "networkUrl",
-- "line": 40
++ "via": ":4000",
++ "line": 42
}
]
}
@@@ -16160,41 +16258,6 @@
"timeout": true,
"retry": false
},
-- {
-- "file": "apps/yt/server/auth.js",
-- "targets": [
-- {
-- "service": "network",
-- "refs": [
-- {
-- "via": "/api/.well-known/jwks",
-- "line": 9
-- },
-- {
-- "via": "networkUrl",
-- "line": 20
-- },
-- {
-- "via": "/api/.well-known/jwks",
-- "line": 21
-- },
-- {
-- "via": "networkInternalUrl",
-- "line": 40
-- },
-- {
-- "via": "networkUrl",
-- "line": 40
-- }
-- ]
-- }
-- ],
-- "auth": [
-- "none-detected"
-- ],
-- "timeout": true,
-- "retry": true
-- },
{
"file": "OpenVibe.Shared/auth-client.js",
"targets": [
@@@ -16251,9 +16314,9 @@
{
"kind": "setInterval",
"name": null,
-- "intervalMs": 15000,
-- "line": 270,
-- "file": "apps/_shared/jobs/http.js",
++ "intervalMs": null,
++ "line": 484,
++ "file": "apps/_shared/guard/index.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -16262,9 +16325,9 @@
{
"kind": "setInterval",
"name": null,
-- "intervalMs": null,
-- "line": 102,
-- "file": "apps/_shared/jobs/index.js",
++ "intervalMs": 15000,
++ "line": 270,
++ "file": "apps/_shared/jobs/http.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -16274,8 +16337,8 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 582,
-- "file": "apps/_shared/jobs/system.js",
++ "line": 123,
++ "file": "apps/_shared/jobs/index.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -16285,8 +16348,8 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 60,
-- "file": "apps/audio/server/auth.js",
++ "line": 648,
++ "file": "apps/_shared/jobs/system.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -16303,17 +16366,6 @@
"wave": "-",
"note": "Runs in, and for, the service that owns it."
},
-- {
-- "kind": "setInterval",
-- "name": null,
-- "intervalMs": null,
-- "line": 60,
-- "file": "apps/docs/server/auth.js",
-- "target": "OpenVibe.Tools",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "Runs in, and for, the service that owns it."
-- },
{
"kind": "setInterval",
"name": null,
@@@ -16329,7 +16381,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 300000,
-- "line": 26,
++ "line": 32,
"file": "apps/gateway/server/dev/routes.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
@@@ -16339,9 +16391,9 @@
{
"kind": "setInterval",
"name": null,
-- "intervalMs": 60000,
-- "line": 198,
-- "file": "apps/gateway/server/registry/index.js",
++ "intervalMs": null,
++ "line": 162,
++ "file": "apps/gateway/server/registry/descriptors.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -16350,9 +16402,9 @@
{
"kind": "setInterval",
"name": null,
-- "intervalMs": null,
-- "line": 109,
-- "file": "apps/gateway/server/registry/services.js",
++ "intervalMs": 60000,
++ "line": 176,
++ "file": "apps/gateway/server/registry/index.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -16362,8 +16414,8 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 60,
-- "file": "apps/img/server/auth.js",
++ "line": 109,
++ "file": "apps/gateway/server/registry/services.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -16384,8 +16436,8 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 60,
-- "file": "apps/yt/server/auth.js",
++ "line": 662,
++ "file": "apps/yt/server/downloader.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -16394,8 +16446,8 @@
{
"kind": "setInterval",
"name": null,
-- "intervalMs": null,
-- "line": 555,
++ "intervalMs": 5000,
++ "line": 713,
"file": "apps/yt/server/downloader.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
@@@ -16405,9 +16457,9 @@
{
"kind": "setInterval",
"name": null,
-- "intervalMs": 5000,
-- "line": 606,
-- "file": "apps/yt/server/downloader.js",
++ "intervalMs": 600000,
++ "line": 135,
++ "file": "apps/yt/server/index.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
"wave": "-",
@@@ -16417,7 +16469,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 500,
-- "line": 217,
++ "line": 252,
"file": "apps/yt/server/index.js",
"target": "OpenVibe.Tools",
"disposition": "keep",
@@@ -16427,7 +16479,7 @@
],
"contractTodos": 0,
"unresolvedMounts": [],
-- "testFiles": 16,
++ "testFiles": 39,
"ci": true
},
{
@@@ -16435,13 +16487,13 @@
"service": "community",
"present": true,
"git": {
-- "head": "63b90a838d280aada7d6c98aee61335b972c1105",
++ "head": "e075d39907c6e9f6d02ae45a760b1052158417d5",
"branch": "main",
-- "originMain": "63b90a838d280aada7d6c98aee61335b972c1105",
-- "committedAt": "2026-09-23T14:22:33-07:00"
++ "originMain": "e075d39907c6e9f6d02ae45a760b1052158417d5",
++ "committedAt": "2026-09-23T19:27:27-07:00"
},
"sourceFiles": 47,
-- "loc": 7886,
++ "loc": 7941,
"tables": [
{
"table": "pastes",
@@@ -16569,7 +16621,7 @@
"method": "GET",
"path": "/",
"file": "server/app.js",
-- "line": 202,
++ "line": 205,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16589,7 +16641,7 @@
"method": "GET",
"path": "/api/pastes",
"file": "server/pastes/api.js",
-- "line": 102,
++ "line": 105,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16599,7 +16651,7 @@
"method": "POST",
"path": "/api/pastes",
"file": "server/pastes/api.js",
-- "line": 106,
++ "line": 109,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16609,7 +16661,7 @@
"method": "DELETE",
"path": "/api/pastes/:slug",
"file": "server/pastes/api.js",
-- "line": 124,
++ "line": 127,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16619,7 +16671,7 @@
"method": "GET",
"path": "/api/pastes/:slug",
"file": "server/pastes/api.js",
-- "line": 122,
++ "line": 125,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16629,7 +16681,7 @@
"method": "PUT",
"path": "/api/pastes/:slug",
"file": "server/pastes/api.js",
-- "line": 123,
++ "line": 126,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16639,7 +16691,7 @@
"method": "POST",
"path": "/api/pastes/:slug/ai",
"file": "server/pastes/api.js",
-- "line": 127,
++ "line": 130,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16649,7 +16701,7 @@
"method": "POST",
"path": "/api/pastes/:slug/censor",
"file": "server/pastes/api.js",
-- "line": 126,
++ "line": 129,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16659,7 +16711,7 @@
"method": "GET",
"path": "/api/pastes/:slug/comments",
"file": "server/pastes/api.js",
-- "line": 136,
++ "line": 139,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16669,7 +16721,7 @@
"method": "POST",
"path": "/api/pastes/:slug/comments",
"file": "server/pastes/api.js",
-- "line": 137,
++ "line": 140,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16679,7 +16731,7 @@
"method": "DELETE",
"path": "/api/pastes/:slug/comments/:commentId",
"file": "server/pastes/api.js",
-- "line": 140,
++ "line": 143,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16689,7 +16741,7 @@
"method": "POST",
"path": "/api/pastes/:slug/copy",
"file": "server/pastes/api.js",
-- "line": 134,
++ "line": 137,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16699,7 +16751,7 @@
"method": "POST",
"path": "/api/pastes/:slug/fork",
"file": "server/pastes/api.js",
-- "line": 132,
++ "line": 135,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16709,7 +16761,7 @@
"method": "POST",
"path": "/api/pastes/:slug/like",
"file": "server/pastes/api.js",
-- "line": 133,
++ "line": 136,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16719,7 +16771,7 @@
"method": "GET",
"path": "/api/pastes/:slug/raw",
"file": "server/pastes/api.js",
-- "line": 129,
++ "line": 132,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16729,7 +16781,7 @@
"method": "POST",
"path": "/api/pastes/:slug/set-avatar",
"file": "server/pastes/api.js",
-- "line": 143,
++ "line": 146,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16739,7 +16791,7 @@
"method": "GET",
"path": "/api/pastes/:slug/versions",
"file": "server/pastes/api.js",
-- "line": 130,
++ "line": 133,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16749,7 +16801,7 @@
"method": "DELETE",
"path": "/api/pastes/admin/forks",
"file": "server/pastes/api.js",
-- "line": 113,
++ "line": 116,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16759,7 +16811,7 @@
"method": "GET",
"path": "/api/pastes/admin/forks",
"file": "server/pastes/api.js",
-- "line": 112,
++ "line": 115,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16769,7 +16821,7 @@
"method": "GET",
"path": "/api/pastes/admin/stats",
"file": "server/pastes/api.js",
-- "line": 111,
++ "line": 114,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16779,7 +16831,7 @@
"method": "POST",
"path": "/api/pastes/bulk",
"file": "server/pastes/api.js",
-- "line": 114,
++ "line": 117,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16789,7 +16841,7 @@
"method": "GET",
"path": "/api/pastes/by-user/:username",
"file": "server/pastes/api.js",
-- "line": 119,
++ "line": 122,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16799,7 +16851,7 @@
"method": "GET",
"path": "/api/pastes/config",
"file": "server/pastes/api.js",
-- "line": 109,
++ "line": 112,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16809,7 +16861,7 @@
"method": "POST",
"path": "/api/pastes/screenshot",
"file": "server/pastes/api.js",
-- "line": 116,
++ "line": 119,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -16819,7 +16871,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 177,
++ "line": 179,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17309,7 +17361,17 @@
"method": "GET",
"path": "/feed.xml",
"file": "server/app.js",
-- "line": 194,
++ "line": 197,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "GET",
++ "path": "/llms.txt",
++ "file": "server/app.js",
++ "line": 195,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17349,7 +17411,7 @@
"method": "GET",
"path": "/my",
"file": "server/app.js",
-- "line": 319,
++ "line": 322,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17359,7 +17421,7 @@
"method": "GET",
"path": "/new",
"file": "server/app.js",
-- "line": 270,
++ "line": 273,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17369,7 +17431,7 @@
"method": "POST",
"path": "/new",
"file": "server/app.js",
-- "line": 281,
++ "line": 284,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17379,7 +17441,7 @@
"method": "GET",
"path": "/p/:slug",
"file": "server/app.js",
-- "line": 215,
++ "line": 218,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17389,7 +17451,7 @@
"method": "GET",
"path": "/p/:slug/download",
"file": "server/app.js",
-- "line": 258,
++ "line": 261,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17399,7 +17461,7 @@
"method": "GET",
"path": "/p/:slug/raw",
"file": "server/app.js",
-- "line": 234,
++ "line": 237,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17409,7 +17471,7 @@
"method": "GET",
"path": "/p/:slug/raw",
"file": "server/app.js",
-- "line": 254,
++ "line": 257,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17419,7 +17481,7 @@
"method": "GET",
"path": "/p/:slug/screenshot",
"file": "server/app.js",
-- "line": 247,
++ "line": 250,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17429,7 +17491,7 @@
"method": "GET",
"path": "/p/:slug/screenshot",
"file": "server/app.js",
-- "line": 255,
++ "line": 258,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17439,7 +17501,7 @@
"method": "GET",
"path": "/pastes",
"file": "server/app.js",
-- "line": 207,
++ "line": 210,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17449,7 +17511,7 @@
"method": "GET",
"path": "/pastes/:slug",
"file": "server/app.js",
-- "line": 213,
++ "line": 216,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17459,7 +17521,7 @@
"method": "GET",
"path": "/pulse",
"file": "server/app.js",
-- "line": 311,
++ "line": 314,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17475,21 +17537,11 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 173,
-- "target": "OpenVibe.Community",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
"file": "server/app.js",
-- "line": 192,
++ "line": 194,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17619,7 +17671,7 @@
"method": "GET",
"path": "/sitemap.xml",
"file": "server/app.js",
-- "line": 193,
++ "line": 196,
"target": "OpenVibe.Community",
"disposition": "keep",
"wave": "-",
@@@ -17932,7 +17984,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 213,
++ "line": 221,
"file": "server/pastes/service.js",
"target": "OpenVibe.Community",
"disposition": "keep",
@@@ -17953,7 +18005,7 @@
],
"contractTodos": 0,
"unresolvedMounts": [],
-- "testFiles": 25,
++ "testFiles": 26,
"ci": true
},
{
@@@ -17961,13 +18013,13 @@
"service": "games",
"present": true,
"git": {
-- "head": "7863fc6a71890b264c29ddd6bfa7e4c162da4883",
++ "head": "4e5bc50590375e514de14b9a0fa384a601f69b2a",
"branch": "main",
-- "originMain": "7863fc6a71890b264c29ddd6bfa7e4c162da4883",
-- "committedAt": "2026-09-23T12:33:56-07:00"
++ "originMain": "4e5bc50590375e514de14b9a0fa384a601f69b2a",
++ "committedAt": "2026-09-23T19:57:03-07:00"
},
-- "sourceFiles": 117,
-- "loc": 22529,
++ "sourceFiles": 118,
++ "loc": 22678,
"tables": [
{
"table": "world_entities",
@@@ -18065,7 +18117,27 @@
"method": "ANY",
"path": "/",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 628,
++ "line": 661,
++ "target": "OpenVibe.Games",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "ANY",
++ "path": "/api",
++ "file": "apps/server/src/net/httpServer.ts",
++ "line": 623,
++ "target": "OpenVibe.Games",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "ANY",
++ "path": "/api/*",
++ "file": "apps/server/src/net/httpServer.ts",
++ "line": 623,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18075,7 +18147,7 @@
"method": "ANY",
"path": "/api/characters",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 313,
++ "line": 329,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18085,7 +18157,7 @@
"method": "POST",
"path": "/api/map",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 161,
++ "line": 177,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18095,7 +18167,7 @@
"method": "POST",
"path": "/api/map-assets",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 231,
++ "line": 247,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18105,7 +18177,7 @@
"method": "POST",
"path": "/api/texture",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 231,
++ "line": 247,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18115,7 +18187,7 @@
"method": "ANY",
"path": "/auth/*",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 333,
++ "line": 349,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18125,7 +18197,7 @@
"method": "ANY",
"path": "/auth/callback",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 399,
++ "line": 415,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18135,7 +18207,7 @@
"method": "ANY",
"path": "/auth/fedcm",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 485,
++ "line": 501,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18145,7 +18217,7 @@
"method": "ANY",
"path": "/auth/login",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 348,
++ "line": 364,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18155,7 +18227,7 @@
"method": "ANY",
"path": "/auth/logout",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 561,
++ "line": 577,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18165,7 +18237,17 @@
"method": "ANY",
"path": "/auth/me",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 578,
++ "line": 594,
++ "target": "OpenVibe.Games",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "ANY",
++ "path": "/canvas",
++ "file": "apps/server/src/net/httpServer.ts",
++ "line": 655,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18175,7 +18257,7 @@
"method": "ANY",
"path": "/editor",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 632,
++ "line": 667,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18185,7 +18267,37 @@
"method": "ANY",
"path": "/editor.html",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 615,
++ "line": 635,
++ "target": "OpenVibe.Games",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "ANY",
++ "path": "/editor/",
++ "file": "apps/server/src/net/httpServer.ts",
++ "line": 647,
++ "target": "OpenVibe.Games",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "ANY",
++ "path": "/game",
++ "file": "apps/server/src/net/httpServer.ts",
++ "line": 655,
++ "target": "OpenVibe.Games",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "ANY",
++ "path": "/game",
++ "file": "apps/server/src/net/httpServer.ts",
++ "line": 656,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18195,7 +18307,7 @@
"method": "ANY",
"path": "/healthz",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 596,
++ "line": 612,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18205,7 +18317,7 @@
"method": "ANY",
"path": "/map-assets/*",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 287,
++ "line": 303,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18215,7 +18327,7 @@
"method": "ANY",
"path": "/map.json",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 148,
++ "line": 164,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18225,7 +18337,7 @@
"method": "ANY",
"path": "/metrics",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 601,
++ "line": 617,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18235,7 +18347,7 @@
"method": "ANY",
"path": "/play",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 622,
++ "line": 642,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18245,7 +18357,7 @@
"method": "ANY",
"path": "/play",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 630,
++ "line": 665,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18255,7 +18367,7 @@
"method": "ANY",
"path": "/play.html",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 615,
++ "line": 635,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18265,7 +18377,27 @@
"method": "ANY",
"path": "/play.html",
"file": "apps/server/src/net/httpServer.ts",
-- "line": 617,
++ "line": 637,
++ "target": "OpenVibe.Games",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "ANY",
++ "path": "/play/",
++ "file": "apps/server/src/net/httpServer.ts",
++ "line": 642,
++ "target": "OpenVibe.Games",
++ "disposition": "keep",
++ "wave": "-",
++ "note": "The service is the authority for its own API and pages."
++ },
++ {
++ "method": "ANY",
++ "path": "/play/",
++ "file": "apps/server/src/net/httpServer.ts",
++ "line": 647,
"target": "OpenVibe.Games",
"disposition": "keep",
"wave": "-",
@@@ -18365,19 +18497,19 @@
"refs": [
{
"via": "/api/auth/me",
-- "line": 346
++ "line": 362
},
{
"via": "/api/auth/me",
-- "line": 378
++ "line": 394
},
{
"via": "/oauth/token",
-- "line": 443
++ "line": 459
},
{
"via": "/oauth/token",
-- "line": 522
++ "line": 538
}
]
}
@@@ -18453,7 +18585,7 @@
],
"contractTodos": 0,
"unresolvedMounts": [],
-- "testFiles": 68,
++ "testFiles": 69,
"ci": true
},
{
@@@ -18461,13 +18593,13 @@
"service": "sites",
"present": true,
"git": {
-- "head": "d6e4cbd3a2091bb9970ee15504c7758da8a96a24",
++ "head": "63683d22217b0ddb7488b5e4b56932c37b426e28",
"branch": "main",
-- "originMain": "d6e4cbd3a2091bb9970ee15504c7758da8a96a24",
-- "committedAt": "2026-09-23T12:33:56-07:00"
++ "originMain": "63683d22217b0ddb7488b5e4b56932c37b426e28",
++ "committedAt": "2026-09-23T19:30:17-07:00"
},
"sourceFiles": 1,
-- "loc": 308,
++ "loc": 520,
"tables": [],
"routes": [],
"ws": {
@@@ -18476,6 +18608,97 @@
},
"env": {},
"outbound": [
++ {
++ "file": "build.js",
++ "targets": [
++ {
++ "service": "network",
++ "refs": [
++ {
++ "via": "networkUrl",
++ "line": 100
++ },
++ {
++ "via": "networkUrl",
++ "line": 111
++ },
++ {
++ "via": "networkUrl",
++ "line": 111
++ },
++ {
++ "via": "networkUrl",
++ "line": 112
++ },
++ {
++ "via": "networkUrl",
++ "line": 112
++ },
++ {
++ "via": "networkUrl",
++ "line": 114
++ },
++ {
++ "via": "networkUrl",
++ "line": 145
++ },
++ {
++ "via": "networkUrl",
++ "line": 216
++ },
++ {
++ "via": "networkUrl",
++ "line": 217
++ },
++ {
++ "via": "networkUrl",
++ "line": 266
++ },
++ {
++ "via": "networkUrl",
++ "line": 267
++ },
++ {
++ "via": "networkUrl",
++ "line": 268
++ },
++ {
++ "via": "networkUrl",
++ "line": 271
++ },
++ {
++ "via": "networkUrl",
++ "line": 271
++ },
++ {
++ "via": "networkUrl",
++ "line": 272
++ },
++ {
++ "via": "networkUrl",
++ "line": 272
++ },
++ {
++ "via": "networkUrl",
++ "line": 283
++ },
++ {
++ "via": "networkUrl",
++ "line": 318
++ },
++ {
++ "via": "networkUrl",
++ "line": 482
++ }
++ ]
++ }
++ ],
++ "auth": [
++ "none-detected"
++ ],
++ "timeout": false,
++ "retry": false
++ },
{
"file": "OpenVibe.Shared/footer.js",
"targets": [
@@@ -18507,13 +18730,13 @@
"service": "events",
"present": true,
"git": {
-- "head": "efc09a795ea0fdea9e6eca04f20cc44362b91e3f",
++ "head": "9f515142868af343b42c1c58faac1fd6805076fc",
"branch": "main",
-- "originMain": "efc09a795ea0fdea9e6eca04f20cc44362b91e3f",
-- "committedAt": "2026-09-23T12:33:56-07:00"
++ "originMain": "9f515142868af343b42c1c58faac1fd6805076fc",
++ "committedAt": "2026-09-23T19:54:18-07:00"
},
"sourceFiles": 17,
-- "loc": 2914,
++ "loc": 2955,
"tables": [
{
"table": "sequences",
@@@ -18563,7 +18786,7 @@
"method": "GET",
"path": "/",
"file": "server/app.js",
-- "line": 72,
++ "line": 73,
"target": "OpenVibe.Events",
"disposition": "keep",
"wave": "-",
@@@ -18573,7 +18796,7 @@
"method": "GET",
"path": "/api/health",
"file": "server/app.js",
-- "line": 35,
++ "line": 36,
"target": "OpenVibe.Events",
"disposition": "keep",
"wave": "-",
@@@ -18583,7 +18806,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 66,
++ "line": 67,
"target": "OpenVibe.Events",
"disposition": "keep",
"wave": "-",
@@@ -18693,7 +18916,7 @@
"method": "POST",
"path": "/api/v1/subscriptions/:id/${action}",
"file": "server/api/subscriptions.js",
-- "line": 143,
++ "line": 162,
"target": "OpenVibe.Events",
"disposition": "keep",
"wave": "-",
@@@ -18701,19 +18924,19 @@
},
{
"method": "POST",
-- "path": "/internal/events",
-- "file": "lib/client.js",
-- "line": 18,
++ "path": "/api/v1/subscriptions/:id/rotate-secret",
++ "file": "server/api/subscriptions.js",
++ "line": 145,
"target": "OpenVibe.Events",
"disposition": "keep",
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
{
-- "method": "GET",
-- "path": "/realtime/stream",
-- "file": "server/app.js",
-- "line": 31,
++ "method": "POST",
++ "path": "/internal/events",
++ "file": "lib/client.js",
++ "line": 18,
"target": "OpenVibe.Events",
"disposition": "keep",
"wave": "-",
@@@ -18721,9 +18944,9 @@
},
{
"method": "GET",
-- "path": "/release.json",
++ "path": "/realtime/stream",
"file": "server/app.js",
-- "line": 23,
++ "line": 32,
"target": "OpenVibe.Events",
"disposition": "keep",
"wave": "-",
@@@ -18914,13 +19137,13 @@
"service": "chat",
"present": true,
"git": {
-- "head": "ed90461e2fd4537332275f6efec8bb878ce4ac2a",
++ "head": "1ef6f992570328e6f7c8c7a8e5168226fb2987db",
"branch": "main",
-- "originMain": "ed90461e2fd4537332275f6efec8bb878ce4ac2a",
-- "committedAt": "2026-09-23T14:40:27-07:00"
++ "originMain": "1ef6f992570328e6f7c8c7a8e5168226fb2987db",
++ "committedAt": "2026-09-23T19:27:25-07:00"
},
"sourceFiles": 34,
-- "loc": 11947,
++ "loc": 11951,
"tables": [
{
"table": "chat_messages",
@@@ -19722,7 +19945,7 @@
"method": "POST",
"path": "/calls",
"file": "server/bridge/live-bridge.js",
-- "line": 220,
++ "line": 218,
"target": "OpenVibe.Chat",
"disposition": "keep",
"wave": "-",
@@@ -19742,7 +19965,7 @@
"method": "GET",
"path": "/presence",
"file": "server/bridge/live-bridge.js",
-- "line": 242,
++ "line": 240,
"target": "OpenVibe.Chat",
"disposition": "keep",
"wave": "-",
@@@ -20039,7 +20262,7 @@
"kind": "setInterval",
"name": null,
"intervalMs": 60000,
-- "line": 134,
++ "line": 132,
"file": "server/bridge/live-bridge.js",
"target": "OpenVibe.Chat",
"disposition": "keep",
@@@ -20156,10 +20379,10 @@
"service": "openre",
"present": true,
"git": {
-- "head": "c091a0959a6d727ec702ee589300cd42a0902be9",
++ "head": "e517ed43466184790187143c974313f1fe7125b3",
"branch": "main",
-- "originMain": "c091a0959a6d727ec702ee589300cd42a0902be9",
-- "committedAt": "2026-09-23T12:33:55-07:00"
++ "originMain": "e517ed43466184790187143c974313f1fe7125b3",
++ "committedAt": "2026-09-23T19:27:59-07:00"
},
"sourceFiles": 34,
"loc": 4641,
@@@ -20877,10 +21100,10 @@
"service": "billing",
"present": true,
"git": {
-- "head": "aa445d0c8b7351afae910b9572a2f9ae674e0914",
++ "head": "42ad547a34d098e28e1ad9abb4ad6759fbac5bdb",
"branch": "main",
-- "originMain": "aa445d0c8b7351afae910b9572a2f9ae674e0914",
-- "committedAt": "2026-09-23T12:33:55-07:00"
++ "originMain": "42ad547a34d098e28e1ad9abb4ad6759fbac5bdb",
++ "committedAt": "2026-09-23T19:27:22-07:00"
},
"sourceFiles": 36,
"loc": 5124,
@@@ -21777,13 +22000,13 @@
"service": "tips",
"present": true,
"git": {
-- "head": "f211c03ed01b58dd52d104bda8b07ce1a82da2db",
++ "head": "847d22a7a0594881c3204b6aac48bacbfa6087ea",
"branch": "main",
-- "originMain": "f211c03ed01b58dd52d104bda8b07ce1a82da2db",
-- "committedAt": "2026-09-23T14:22:34-07:00"
++ "originMain": "847d22a7a0594881c3204b6aac48bacbfa6087ea",
++ "committedAt": "2026-09-23T19:27:53-07:00"
},
"sourceFiles": 29,
-- "loc": 5250,
++ "loc": 5251,
"tables": [
{
"table": "settings",
@@@ -22479,16 +22702,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 85,
-- "target": "OpenVibe.Tips",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
@@@ -22733,13 +22946,13 @@
"service": "vip",
"present": true,
"git": {
-- "head": "fe7eaad183622f303d2ea1efde80d1674478d948",
++ "head": "a0a8f7566414fd0c04da0ddbe5a6bcb1df624027",
"branch": "main",
-- "originMain": "fe7eaad183622f303d2ea1efde80d1674478d948",
-- "committedAt": "2026-09-23T13:50:44-07:00"
++ "originMain": "a0a8f7566414fd0c04da0ddbe5a6bcb1df624027",
++ "committedAt": "2026-09-23T19:27:57-07:00"
},
"sourceFiles": 29,
-- "loc": 4194,
++ "loc": 4195,
"tables": [
{
"table": "settings",
@@@ -23231,16 +23444,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 89,
-- "target": "OpenVibe.VIP",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
@@@ -23447,13 +23650,13 @@
"service": "ai",
"present": true,
"git": {
-- "head": "3a480ac9f20ca018f5c2c8973f92d32dbe1a44cd",
++ "head": "a6d4f39b6562dbd70a343a7d1c61ad46f57c3826",
"branch": "main",
-- "originMain": "3a480ac9f20ca018f5c2c8973f92d32dbe1a44cd",
-- "committedAt": "2026-09-23T12:33:55-07:00"
++ "originMain": "a6d4f39b6562dbd70a343a7d1c61ad46f57c3826",
++ "committedAt": "2026-09-23T19:27:21-07:00"
},
"sourceFiles": 30,
-- "loc": 4576,
++ "loc": 4577,
"tables": [
{
"table": "providers",
@@@ -23557,7 +23760,7 @@
"method": "GET",
"path": "/",
"file": "server/app.js",
-- "line": 44,
++ "line": 45,
"target": "OpenVibe.AI",
"disposition": "keep",
"wave": "-",
@@@ -23872,16 +24075,6 @@
"disposition": "keep",
"wave": "-",
"note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 39,
-- "target": "OpenVibe.AI",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
}
],
"ws": {
@@@ -24108,13 +24301,13 @@
"service": "search",
"present": true,
"git": {
-- "head": "a707e38f87a077bbf2f570537a89b2f890d45e22",
++ "head": "46035416946d065627a4ed1ec89b5b0ac7a302ec",
"branch": "main",
-- "originMain": "a707e38f87a077bbf2f570537a89b2f890d45e22",
-- "committedAt": "2026-09-23T12:57:06-07:00"
++ "originMain": "46035416946d065627a4ed1ec89b5b0ac7a302ec",
++ "committedAt": "2026-09-23T19:27:48-07:00"
},
"sourceFiles": 17,
-- "loc": 2733,
++ "loc": 2734,
"tables": [
{
"table": "documents",
@@@ -24364,16 +24557,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 45,
-- "target": "OpenVibe.Search",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
@@@ -24532,13 +24715,13 @@
"service": "sources",
"present": true,
"git": {
-- "head": "2e986af27a5554fd01803daf9e55c726deded80d",
++ "head": "cf003901ae1000a9f0e568d05390da2c36180dcc",
"branch": "main",
-- "originMain": "2e986af27a5554fd01803daf9e55c726deded80d",
-- "committedAt": "2026-09-23T12:56:42-07:00"
++ "originMain": "cf003901ae1000a9f0e568d05390da2c36180dcc",
++ "committedAt": "2026-09-23T19:27:52-07:00"
},
"sourceFiles": 23,
-- "loc": 2974,
++ "loc": 2975,
"tables": [
{
"table": "sources",
@@@ -24594,7 +24777,7 @@
"method": "GET",
"path": "/",
"file": "server/app.js",
-- "line": 98,
++ "line": 99,
"target": "OpenVibe.Sources",
"disposition": "keep",
"wave": "-",
@@@ -24749,16 +24932,6 @@
"disposition": "keep",
"wave": "-",
"note": "The service is the authority for its own API and pages."
-- },
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 90,
-- "target": "OpenVibe.Sources",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
}
],
"ws": {
@@@ -24914,13 +25087,13 @@
"service": "wiki",
"present": true,
"git": {
-- "head": "b4e70acdab789cefc24aa9b5ab2a40fecc7be9d5",
++ "head": "fe113b90321852c24f11f1d19905bd77fbe7f463",
"branch": "main",
-- "originMain": "b4e70acdab789cefc24aa9b5ab2a40fecc7be9d5",
-- "committedAt": "2026-09-23T12:33:56-07:00"
++ "originMain": "fe113b90321852c24f11f1d19905bd77fbe7f463",
++ "committedAt": "2026-09-23T19:32:13-07:00"
},
"sourceFiles": 20,
-- "loc": 4297,
++ "loc": 4298,
"tables": [
{
"table": "wiki_spaces",
@@@ -24996,7 +25169,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 75,
++ "line": 76,
"target": "OpenVibe.Wiki",
"disposition": "keep",
"wave": "-",
@@@ -25432,16 +25605,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 62,
-- "target": "OpenVibe.Wiki",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
@@@ -25536,7 +25699,7 @@
"method": "GET",
"path": "/search",
"file": "server/app.js",
-- "line": 94,
++ "line": 95,
"target": "OpenVibe.Wiki",
"disposition": "keep",
"wave": "-",
@@@ -25870,13 +26033,13 @@
"service": "blog",
"present": true,
"git": {
-- "head": "95e99acdcf4610f244b64d8e34afcb8f394685d9",
++ "head": "0784b429a1bdcc3c770abed5800ca5171ecb0cf2",
"branch": "main",
-- "originMain": "95e99acdcf4610f244b64d8e34afcb8f394685d9",
-- "committedAt": "2026-09-23T12:37:08-07:00"
++ "originMain": "0784b429a1bdcc3c770abed5800ca5171ecb0cf2",
++ "committedAt": "2026-09-23T19:36:08-07:00"
},
"sourceFiles": 31,
-- "loc": 4663,
++ "loc": 4669,
"tables": [
{
"table": "blogs",
@@@ -26030,7 +26193,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 110,
++ "line": 111,
"target": "OpenVibe.Blog",
"disposition": "keep",
"wave": "-",
@@@ -26266,16 +26429,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 108,
-- "target": "OpenVibe.Blog",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
@@@ -26724,13 +26877,13 @@
"service": "news",
"present": true,
"git": {
-- "head": "5b393d27ba4167910e8019874a92f3d5dbf455cb",
++ "head": "42ce43b84b830ed37f8e02389f4bbdae20212510",
"branch": "main",
-- "originMain": "5b393d27ba4167910e8019874a92f3d5dbf455cb",
-- "committedAt": "2026-09-23T12:33:56-07:00"
++ "originMain": "42ce43b84b830ed37f8e02389f4bbdae20212510",
++ "committedAt": "2026-09-23T19:32:48-07:00"
},
"sourceFiles": 33,
-- "loc": 5080,
++ "loc": 5081,
"tables": [
{
"table": "news_topics",
@@@ -26846,7 +26999,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 109,
++ "line": 110,
"target": "OpenVibe.News",
"disposition": "keep",
"wave": "-",
@@@ -27222,16 +27375,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 107,
-- "target": "OpenVibe.News",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
@@@ -27547,13 +27690,13 @@
"service": "reviews",
"present": true,
"git": {
-- "head": "a7b50a6231c44271e0611df2e25e366a980a13c4",
++ "head": "70de372e0c2826c061080826f192ca2d0a51c6a4",
"branch": "main",
-- "originMain": "a7b50a6231c44271e0611df2e25e366a980a13c4",
-- "committedAt": "2026-09-23T12:33:56-07:00"
++ "originMain": "70de372e0c2826c061080826f192ca2d0a51c6a4",
++ "committedAt": "2026-09-23T19:33:09-07:00"
},
"sourceFiles": 22,
-- "loc": 4626,
++ "loc": 4627,
"tables": [
{
"table": "review_entities",
@@@ -27675,7 +27818,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 99,
++ "line": 100,
"target": "OpenVibe.Reviews",
"disposition": "keep",
"wave": "-",
@@@ -28065,7 +28208,7 @@
"method": "POST",
"path": "/e/:slug/correct",
"file": "server/app.js",
-- "line": 113,
++ "line": 114,
"target": "OpenVibe.Reviews",
"disposition": "keep",
"wave": "-",
@@@ -28281,16 +28424,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 81,
-- "target": "OpenVibe.Reviews",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
@@@ -28476,13 +28609,13 @@
"service": "deals",
"present": true,
"git": {
-- "head": "91ca2235e0a4c7018a0b0bf5f49ba1f32db6d018",
++ "head": "3910b58cd10a700a22c6c7129cd4c1c1e586cc95",
"branch": "main",
-- "originMain": "91ca2235e0a4c7018a0b0bf5f49ba1f32db6d018",
-- "committedAt": "2026-09-23T12:33:56-07:00"
++ "originMain": "3910b58cd10a700a22c6c7129cd4c1c1e586cc95",
++ "committedAt": "2026-09-23T19:33:27-07:00"
},
"sourceFiles": 35,
-- "loc": 4766,
++ "loc": 4772,
"tables": [
{
"table": "deal_stores",
@@@ -28600,7 +28733,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 116,
++ "line": 117,
"target": "OpenVibe.Deals",
"disposition": "keep",
"wave": "-",
@@@ -29036,16 +29169,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 114,
-- "target": "OpenVibe.Deals",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
@@@ -29417,13 +29540,13 @@
"service": "coupons",
"present": true,
"git": {
-- "head": "1c57c4743b016ecf6f72d8d03feb7f56806920a6",
++ "head": "ae3a25ed5d4e33f81df1147940d8f3100d13513b",
"branch": "main",
-- "originMain": "1c57c4743b016ecf6f72d8d03feb7f56806920a6",
-- "committedAt": "2026-09-23T12:33:55-07:00"
++ "originMain": "ae3a25ed5d4e33f81df1147940d8f3100d13513b",
++ "committedAt": "2026-09-23T19:33:39-07:00"
},
"sourceFiles": 28,
-- "loc": 4081,
++ "loc": 4089,
"tables": [
{
"table": "coupon_merchants",
@@@ -29533,7 +29656,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 100,
++ "line": 101,
"target": "OpenVibe.Coupons",
"disposition": "keep",
"wave": "-",
@@@ -29839,16 +29962,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 98,
-- "target": "OpenVibe.Coupons",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
@@@ -30201,13 +30314,13 @@
"service": "trade",
"present": true,
"git": {
-- "head": "ddbc60c5e2f5ab16cfd17cd126803c9c24784662",
++ "head": "7f418d25e8ca7288a8cf09738e7c8b5609c2578b",
"branch": "main",
-- "originMain": "ddbc60c5e2f5ab16cfd17cd126803c9c24784662",
-- "committedAt": "2026-09-23T12:33:56-07:00"
++ "originMain": "7f418d25e8ca7288a8cf09738e7c8b5609c2578b",
++ "committedAt": "2026-09-23T19:33:52-07:00"
},
"sourceFiles": 36,
-- "loc": 4405,
++ "loc": 4409,
"tables": [
{
"table": "trade_instruments",
@@@ -30565,13 +30678,13 @@
"service": "codes",
"present": true,
"git": {
-- "head": "51d23865f2630203cf734c019309c7ffc053f89c",
++ "head": "a1294156cdb9aa3d82c15708c12509d805ff561f",
"branch": "main",
-- "originMain": "51d23865f2630203cf734c019309c7ffc053f89c",
-- "committedAt": "2026-09-23T12:33:55-07:00"
++ "originMain": "a1294156cdb9aa3d82c15708c12509d805ff561f",
++ "committedAt": "2026-09-23T19:41:06-07:00"
},
"sourceFiles": 27,
-- "loc": 3966,
++ "loc": 3969,
"tables": [
{
"table": "manifests",
@@@ -30641,7 +30754,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 100,
++ "line": 101,
"target": "OpenVibe.Codes",
"disposition": "keep",
"wave": "-",
@@@ -30751,7 +30864,7 @@
"method": "GET",
"path": "/docs/adr/:id",
"file": "server/http/docs.js",
-- "line": 216,
++ "line": 218,
"target": "OpenVibe.Codes",
"disposition": "keep",
"wave": "-",
@@@ -30811,7 +30924,7 @@
"method": "GET",
"path": "/docs/events",
"file": "server/http/docs.js",
-- "line": 151,
++ "line": 153,
"target": "OpenVibe.Codes",
"disposition": "keep",
"wave": "-",
@@@ -30821,7 +30934,7 @@
"method": "GET",
"path": "/docs/sdk",
"file": "server/http/docs.js",
-- "line": 191,
++ "line": 193,
"target": "OpenVibe.Codes",
"disposition": "keep",
"wave": "-",
@@@ -30831,7 +30944,7 @@
"method": "GET",
"path": "/docs/sdk/:module",
"file": "server/http/docs.js",
-- "line": 203,
++ "line": 205,
"target": "OpenVibe.Codes",
"disposition": "keep",
"wave": "-",
@@@ -30841,7 +30954,7 @@
"method": "GET",
"path": "/docs/services",
"file": "server/http/docs.js",
-- "line": 162,
++ "line": 164,
"target": "OpenVibe.Codes",
"disposition": "keep",
"wave": "-",
@@@ -31237,16 +31350,6 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 98,
-- "target": "OpenVibe.Codes",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/releases",
@@@ -31573,6 +31676,9 @@
"paths": []
},
"env": {
++ "CODES_RATE_LIMIT_PER_MIN": [
++ "server/app.js"
++ ],
"NODE_ENV": [
"server/config.js"
],
@@@ -31667,13 +31773,13 @@
"service": "host",
"present": true,
"git": {
-- "head": "03dfcb32a9fecb85d509f5d92d0a166a26d86fe7",
++ "head": "f8ac37d08425f0ff3779084db7146eb262576769",
"branch": "main",
-- "originMain": "03dfcb32a9fecb85d509f5d92d0a166a26d86fe7",
-- "committedAt": "2026-09-23T13:48:51-07:00"
++ "originMain": "f8ac37d08425f0ff3779084db7146eb262576769",
++ "committedAt": "2026-09-23T19:43:16-07:00"
},
"sourceFiles": 55,
-- "loc": 8099,
++ "loc": 8103,
"tables": [
{
"table": "host_projects",
@@@ -31767,7 +31873,7 @@
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 133,
++ "line": 134,
"target": "OpenVibe.Host",
"disposition": "keep",
"wave": "-",
@@@ -32157,7 +32263,7 @@
"method": "GET",
"path": "/metrics",
"file": "server/app.js",
-- "line": 134,
++ "line": 135,
"target": "OpenVibe.Host",
"disposition": "keep",
"wave": "-",
@@@ -32223,21 +32329,11 @@
"wave": "-",
"note": "The service is the authority for its own API and pages."
},
-- {
-- "method": "GET",
-- "path": "/release.json",
-- "file": "server/app.js",
-- "line": 131,
-- "target": "OpenVibe.Host",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "The service is the authority for its own API and pages."
-- },
{
"method": "GET",
"path": "/robots.txt",
"file": "server/app.js",
-- "line": 138,
++ "line": 139,
"target": "OpenVibe.Host",
"disposition": "keep",
"wave": "-",
@@@ -32247,7 +32343,7 @@
"method": "GET",
"path": "/sitemap.xml",
"file": "server/app.js",
-- "line": 140,
++ "line": 141,
"target": "OpenVibe.Host",
"disposition": "keep",
"wave": "-",
@@@ -32551,7 +32647,7 @@
],
"contractTodos": 0,
"unresolvedMounts": [],
-- "testFiles": 27,
++ "testFiles": 28,
"ci": true
},
{
@@@ -32559,10 +32655,10 @@
"service": "examples",
"present": true,
"git": {
-- "head": "d5f4efc02165f42b9feac5d2743de6e6c75c27de",
++ "head": "0bbe579f685cfe1b495699b0e69c7fbf6ee1f27c",
"branch": "main",
-- "originMain": "d5f4efc02165f42b9feac5d2743de6e6c75c27de",
-- "committedAt": "2026-09-23T12:33:56-07:00"
++ "originMain": "0bbe579f685cfe1b495699b0e69c7fbf6ee1f27c",
++ "committedAt": "2026-09-23T19:42:45-07:00"
},
"sourceFiles": 11,
"loc": 1604,
@@@ -32727,182 +32823,182 @@
{
"repo": "OpenRe.Stream",
"manifest": "package.json",
-- "spec": "v1.2.1",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.AI",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Billing",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Blog",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Codes",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Community",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Coupons",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Deals",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Events",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Host",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Live",
"manifest": "package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Media",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Network",
"manifest": "package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.News",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Reviews",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Search",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Sites",
"manifest": "package.json",
-- "spec": "v1.0.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Sources",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Tips",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Tools",
"manifest": "apps/audio/package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Tools",
"manifest": "apps/docs/package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Tools",
"manifest": "apps/food/package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Tools",
"manifest": "apps/gateway/package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Tools",
"manifest": "apps/img/package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Tools",
"manifest": "apps/maps/package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Tools",
"manifest": "apps/text/package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Tools",
"manifest": "apps/yt/package.json",
-- "spec": "v1.4.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Trade",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.VIP",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
},
{
"repo": "OpenVibe.Wiki",
"manifest": "package.json",
-- "spec": "v1.3.0",
-- "state": "behind"
++ "spec": "v1.5.1",
++ "state": "current"
}
],
"ownership": [
@@@ -36005,7 +36101,7 @@
"repo": "OpenVibe.Live",
"table": "ai_chatbot_configs",
"declaredAt": [
-- "server/db/database.js:1782"
++ "server/db/database.js:1805"
],
"prodDbs": [
"live.db"
@@@ -36049,7 +36145,7 @@
"repo": "OpenVibe.Live",
"table": "ai_timeline_cache",
"declaredAt": [
-- "server/db/database.js:1303"
++ "server/db/database.js:1326"
],
"prodDbs": [
"live.db"
@@@ -36065,7 +36161,7 @@
"repo": "OpenVibe.Live",
"table": "ai_usage",
"declaredAt": [
-- "server/db/database.js:1261"
++ "server/db/database.js:1284"
],
"prodDbs": [
"live.db"
@@@ -36081,7 +36177,7 @@
"repo": "OpenVibe.Live",
"table": "ai_viewer_log",
"declaredAt": [
-- "server/db/database.js:1866"
++ "server/db/database.js:1889"
],
"prodDbs": [
"live.db"
@@@ -36097,7 +36193,7 @@
"repo": "OpenVibe.Live",
"table": "ai_viewer_threads",
"declaredAt": [
-- "server/db/database.js:1852"
++ "server/db/database.js:1875"
],
"prodDbs": [
"live.db"
@@@ -36211,7 +36307,7 @@
"repo": "OpenVibe.Live",
"table": "anon_ip_mappings",
"declaredAt": [
-- "server/db/database.js:942"
++ "server/db/database.js:964"
],
"prodDbs": [
"live.db"
@@@ -36259,7 +36355,7 @@
"repo": "OpenVibe.Live",
"table": "app_state",
"declaredAt": [
-- "server/db/database.js:1174"
++ "server/db/database.js:1196"
],
"prodDbs": [
"live.db"
@@@ -36275,7 +36371,7 @@
"repo": "OpenVibe.Live",
"table": "approved_ips",
"declaredAt": [
-- "server/db/database.js:2054"
++ "server/db/database.js:2077"
],
"prodDbs": [
"live.db"
@@@ -36397,7 +36493,7 @@
"repo": "OpenVibe.Live",
"table": "arena_profiles",
"declaredAt": [
-- "server/arena/arena-service.js:82"
++ "server/arena/arena-service.js:83"
],
"prodDbs": [
"live.db"
@@@ -36887,7 +36983,7 @@
"repo": "OpenVibe.Live",
"table": "channel_ai_bots",
"declaredAt": [
-- "server/db/database.js:1807"
++ "server/db/database.js:1830"
],
"prodDbs": [
"live.db"
@@@ -36903,7 +36999,7 @@
"repo": "OpenVibe.Live",
"table": "channel_ai_config",
"declaredAt": [
-- "server/db/database.js:1831"
++ "server/db/database.js:1854"
],
"prodDbs": [
"live.db"
@@@ -36919,7 +37015,7 @@
"repo": "OpenVibe.Live",
"table": "channel_moderation_settings",
"declaredAt": [
-- "server/db/database.js:1617",
++ "server/db/database.js:1640",
"server/db/schema.sql:514"
],
"prodDbs": [
@@@ -36936,7 +37032,7 @@
"repo": "OpenVibe.Live",
"table": "channel_moderators",
"declaredAt": [
-- "server/db/database.js:1600",
++ "server/db/database.js:1623",
"server/db/schema.sql:499"
],
"prodDbs": [
@@@ -36953,7 +37049,7 @@
"repo": "OpenVibe.Live",
"table": "channel_points",
"declaredAt": [
-- "server/db/database.js:766"
++ "server/db/database.js:770"
],
"prodDbs": [
"live.db"
@@@ -36965,11 +37061,25 @@
"wave": "W8 (after ADR-012)",
"note": "Loyalty/progression, never money. Classification blocks migration."
},
++ {
++ "repo": "OpenVibe.Live",
++ "table": "channel_points_log",
++ "declaredAt": [
++ "server/db/database.js:780"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Billing (loyalty ledger)",
++ "disposition": "extract",
++ "wave": "W8 (after ADR-012)",
++ "note": "Idempotency logs for channel points and admin OpenCoins grants (2026-09-24, ADR-012 rule 5); they move with the loyalty tables."
++ },
{
"repo": "OpenVibe.Live",
"table": "channel_sounds",
"declaredAt": [
-- "server/db/database.js:1720",
++ "server/db/database.js:1743",
"server/db/schema.sql:625"
],
"prodDbs": [
@@@ -36986,7 +37096,7 @@
"repo": "OpenVibe.Live",
"table": "channel_sounds_new",
"declaredAt": [
-- "server/db/database.js:1744"
++ "server/db/database.js:1767"
],
"prodDbs": [],
"inCode": true,
@@@ -37016,7 +37126,7 @@
"repo": "OpenVibe.Live",
"table": "chat_ai_summaries",
"declaredAt": [
-- "server/db/database.js:1315"
++ "server/db/database.js:1338"
],
"prodDbs": [
"live.db"
@@@ -37078,7 +37188,7 @@
"repo": "OpenVibe.Live",
"table": "chat_messages_new",
"declaredAt": [
-- "server/db/database.js:421"
++ "server/db/database.js:422"
],
"prodDbs": [],
"inCode": true,
@@@ -37092,7 +37202,7 @@
"repo": "OpenVibe.Live",
"table": "chat_timeline_events",
"declaredAt": [
-- "server/db/database.js:1335"
++ "server/db/database.js:1358"
],
"prodDbs": [
"live.db"
@@@ -37150,7 +37260,7 @@
"repo": "OpenVibe.Live",
"table": "clip_ai_state",
"declaredAt": [
-- "server/db/database.js:274"
++ "server/db/database.js:275"
],
"prodDbs": [
"live.db"
@@@ -37246,7 +37356,7 @@
"repo": "OpenVibe.Live",
"table": "comments",
"declaredAt": [
-- "server/db/database.js:855",
++ "server/db/database.js:872",
"server/db/schema.sql:585"
],
"prodDbs": [
@@@ -37279,7 +37389,7 @@
"repo": "OpenVibe.Live",
"table": "control_config_buttons",
"declaredAt": [
-- "server/db/database.js:2278"
++ "server/db/database.js:2301"
],
"prodDbs": [
"live.db"
@@@ -37295,7 +37405,7 @@
"repo": "OpenVibe.Live",
"table": "control_configs",
"declaredAt": [
-- "server/db/database.js:2264"
++ "server/db/database.js:2287"
],
"prodDbs": [
"live.db"
@@@ -37311,7 +37421,7 @@
"repo": "OpenVibe.Live",
"table": "control_whitelist",
"declaredAt": [
-- "server/db/database.js:2249"
++ "server/db/database.js:2272"
],
"prodDbs": [
"live.db"
@@@ -37463,7 +37573,7 @@
"repo": "OpenVibe.Live",
"table": "easter_egg_solves",
"declaredAt": [
-- "server/db/database.js:1347"
++ "server/db/database.js:1370"
],
"prodDbs": [
"live.db"
@@@ -37495,7 +37605,7 @@
"repo": "OpenVibe.Live",
"table": "emotes_new",
"declaredAt": [
-- "server/db/database.js:1688"
++ "server/db/database.js:1711"
],
"prodDbs": [],
"inCode": true,
@@@ -37594,245 +37704,212 @@
{
"repo": "OpenVibe.Live",
"table": "game_achievements",
-- "declaredAt": [
-- "server/game/game-engine.js:536"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_bank",
-- "declaredAt": [
-- "server/game/schema.sql:77"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_battle_stats",
-- "declaredAt": [
-- "server/game/schema.sql:142"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_daily_quest_claims",
-- "declaredAt": [
-- "server/game/game-engine.js:557",
-- "server/game/schema.sql:203"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_daily_quest_progress",
-- "declaredAt": [
-- "server/game/game-engine.js:546",
-- "server/game/schema.sql:192"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_dungeon_runs",
-- "declaredAt": [
-- "server/game/schema.sql:156"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_effects",
-- "declaredAt": [
-- "server/game/schema.sql:128"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_farm_plots",
-- "declaredAt": [
-- "server/game/schema.sql:104"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_fish_collection",
-- "declaredAt": [
-- "server/game/game-engine.js:522",
-- "server/game/schema.sql:180"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_inventory",
-- "declaredAt": [
-- "server/game/schema.sql:66"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_leaderboard",
-- "declaredAt": [
-- "server/game/schema.sql:168"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_players",
-- "declaredAt": [
-- "server/game/schema.sql:13"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_recipes",
-- "declaredAt": [
-- "server/game/schema.sql:118"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_structures",
-- "declaredAt": [
-- "server/game/schema.sql:87"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
"table": "game_world_state",
-- "declaredAt": [
-- "server/game/schema.sql:7"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Games",
-- "disposition": "migrate-then-drop",
-- "wave": "W12",
-- "note": "Legacy HoboQuest state (progression, bank, farming, dungeons, quests). /api/game already returns 410."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
@@@ -37852,7 +37929,7 @@
"repo": "OpenVibe.Live",
"table": "hidden_relay_users",
"declaredAt": [
-- "server/db/database.js:2091"
++ "server/db/database.js:2114"
],
"prodDbs": [
"live.db"
@@@ -37882,7 +37959,7 @@
"repo": "OpenVibe.Live",
"table": "ip_log",
"declaredAt": [
-- "server/db/database.js:2030"
++ "server/db/database.js:2053"
],
"prodDbs": [
"live.db"
@@@ -37912,7 +37989,7 @@
"repo": "OpenVibe.Live",
"table": "kick_channel_cache",
"declaredAt": [
-- "server/db/database.js:780"
++ "server/db/database.js:797"
],
"prodDbs": [
"live.db"
@@@ -37928,7 +38005,7 @@
"repo": "OpenVibe.Live",
"table": "linked_accounts",
"declaredAt": [
-- "server/db/database.js:386"
++ "server/db/database.js:387"
],
"prodDbs": [
"live.db"
@@@ -37986,7 +38063,7 @@
"repo": "OpenVibe.Live",
"table": "managed_streams",
"declaredAt": [
-- "server/db/database.js:2392",
++ "server/db/database.js:2415",
"server/db/schema.sql:78"
],
"prodDbs": [
@@@ -38003,7 +38080,7 @@
"repo": "OpenVibe.Live",
"table": "media_request_settings",
"declaredAt": [
-- "server/db/database.js:875",
++ "server/db/database.js:892",
"server/db/schema.sql:722"
],
"prodDbs": [
@@@ -38020,7 +38097,7 @@
"repo": "OpenVibe.Live",
"table": "media_requests",
"declaredAt": [
-- "server/db/database.js:889",
++ "server/db/database.js:906",
"server/db/schema.sql:739"
],
"prodDbs": [
@@@ -38066,7 +38143,7 @@
"repo": "OpenVibe.Live",
"table": "moderation_actions",
"declaredAt": [
-- "server/db/database.js:1899"
++ "server/db/database.js:1922"
],
"prodDbs": [
"live.db"
@@@ -38108,6 +38185,20 @@
"wave": "-",
"note": "Live product data and read models."
},
++ {
++ "repo": "OpenVibe.Live",
++ "table": "opencoin_admin_grants",
++ "declaredAt": [
++ "server/monetization/opencoins.js:330"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Billing (loyalty ledger)",
++ "disposition": "extract",
++ "wave": "W8 (after ADR-012)",
++ "note": "Idempotency logs for channel points and admin OpenCoins grants (2026-09-24, ADR-012 rule 5); they move with the loyalty tables."
++ },
{
"repo": "OpenVibe.Live",
"table": "openre_sessions",
@@@ -38128,7 +38219,7 @@
"repo": "OpenVibe.Live",
"table": "paste_comments",
"declaredAt": [
-- "server/db/database.js:1987"
++ "server/db/database.js:2010"
],
"prodDbs": [
"live.db"
@@@ -38144,7 +38235,7 @@
"repo": "OpenVibe.Live",
"table": "paste_likes",
"declaredAt": [
-- "server/db/database.js:1955"
++ "server/db/database.js:1978"
],
"prodDbs": [
"live.db"
@@@ -38160,7 +38251,7 @@
"repo": "OpenVibe.Live",
"table": "pastes",
"declaredAt": [
-- "server/db/database.js:1918"
++ "server/db/database.js:1941"
],
"prodDbs": [
"live.db"
@@@ -38176,7 +38267,7 @@
"repo": "OpenVibe.Live",
"table": "payment_orders",
"declaredAt": [
-- "server/db/database.js:1567"
++ "server/db/database.js:1590"
],
"prodDbs": [
"live.db"
@@@ -38192,7 +38283,7 @@
"repo": "OpenVibe.Live",
"table": "pending_ip_messages",
"declaredAt": [
-- "server/db/database.js:2071"
++ "server/db/database.js:2094"
],
"prodDbs": [
"live.db"
@@@ -38208,7 +38299,7 @@
"repo": "OpenVibe.Live",
"table": "platform_connections",
"declaredAt": [
-- "server/db/database.js:715"
++ "server/db/database.js:719"
],
"prodDbs": [
"live.db"
@@@ -38224,7 +38315,7 @@
"repo": "OpenVibe.Live",
"table": "powerchat_connections",
"declaredAt": [
-- "server/db/database.js:737"
++ "server/db/database.js:741"
],
"prodDbs": [
"live.db"
@@@ -38240,7 +38331,7 @@
"repo": "OpenVibe.Live",
"table": "powerchat_webhook_deliveries",
"declaredAt": [
-- "server/db/database.js:754"
++ "server/db/database.js:758"
],
"prodDbs": [
"live.db"
@@@ -38270,7 +38361,7 @@
"repo": "OpenVibe.Live",
"table": "relay_users",
"declaredAt": [
-- "server/db/database.js:1472"
++ "server/db/database.js:1495"
],
"prodDbs": [
"live.db"
@@@ -38286,7 +38377,7 @@
"repo": "OpenVibe.Live",
"table": "restream_destinations",
"declaredAt": [
-- "server/db/database.js:697"
++ "server/db/database.js:701"
],
"prodDbs": [
"live.db"
@@@ -38330,7 +38421,7 @@
"repo": "OpenVibe.Live",
"table": "robotstreamer_integrations",
"declaredAt": [
-- "server/db/database.js:611",
++ "server/db/database.js:615",
"server/db/schema.sql:58"
],
"prodDbs": [
@@@ -38347,7 +38438,7 @@
"repo": "OpenVibe.Live",
"table": "robotstreamer_integrations_new",
"declaredAt": [
-- "server/db/database.js:662"
++ "server/db/database.js:666"
],
"prodDbs": [],
"inCode": true,
@@@ -38377,7 +38468,7 @@
"repo": "OpenVibe.Live",
"table": "site_settings",
"declaredAt": [
-- "server/db/database.js:355",
++ "server/db/database.js:356",
"server/db/schema.sql:556"
],
"prodDbs": [
@@@ -38426,7 +38517,7 @@
"repo": "OpenVibe.Live",
"table": "stream_controls_new",
"declaredAt": [
-- "server/db/database.js:2357"
++ "server/db/database.js:2380"
],
"prodDbs": [],
"inCode": true,
@@@ -38440,7 +38531,7 @@
"repo": "OpenVibe.Live",
"table": "stream_first_chats",
"declaredAt": [
-- "server/db/database.js:2019"
++ "server/db/database.js:2042"
],
"prodDbs": [
"live.db"
@@@ -38456,7 +38547,7 @@
"repo": "OpenVibe.Live",
"table": "stream_memories",
"declaredAt": [
-- "server/db/database.js:1188"
++ "server/db/database.js:1210"
],
"prodDbs": [
"live.db"
@@@ -38488,7 +38579,7 @@
"repo": "OpenVibe.Live",
"table": "stream_timeline_events",
"declaredAt": [
-- "server/db/database.js:1236"
++ "server/db/database.js:1259"
],
"prodDbs": [
"live.db"
@@@ -38504,7 +38595,7 @@
"repo": "OpenVibe.Live",
"table": "streamer_overviews",
"declaredAt": [
-- "server/db/database.js:1281"
++ "server/db/database.js:1304"
],
"prodDbs": [
"live.db"
@@@ -38551,18 +38642,16 @@
{
"repo": "OpenVibe.Live",
"table": "tag_guardian_defeats",
-- "declaredAt": [
-- "server/game/tags.js:81"
-- ],
++ "declaredAt": [],
"prodDbs": [
"live.db"
],
-- "inCode": true,
++ "inCode": false,
"inProd": true,
-- "target": "OpenVibe.Live",
-- "disposition": "keep",
-- "wave": "-",
-- "note": "Live product feature."
++ "target": "?",
++ "disposition": "investigate",
++ "wave": "W0",
++ "note": "Exists in a production database but no CREATE TABLE in the repo."
},
{
"repo": "OpenVibe.Live",
@@@ -38580,6 +38669,20 @@
"wave": "W1",
"note": "Identity truth moves to Network subjects; Live keeps a subject projection + channel state."
},
++ {
++ "repo": "OpenVibe.Live",
++ "table": "tips_deliveries",
++ "declaredAt": [
++ "server/tips/delivery-routes.js:39"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Live",
++ "disposition": "keep",
++ "wave": "W9",
++ "note": "Live's side of Tips delivery idempotency (Idempotency-Key -> stored response, pruned after 7 days); Live renders the delivery."
++ },
{
"repo": "OpenVibe.Live",
"table": "transactions",
@@@ -38600,7 +38703,7 @@
"repo": "OpenVibe.Live",
"table": "translations",
"declaredAt": [
-- "server/db/database.js:512",
++ "server/db/database.js:513",
"server/i18n/translate.js:147"
],
"prodDbs": [
@@@ -38617,7 +38720,7 @@
"repo": "OpenVibe.Live",
"table": "tts_voice_overrides",
"declaredAt": [
-- "server/db/database.js:1359"
++ "server/db/database.js:1382"
],
"prodDbs": [
"live.db"
@@@ -38681,7 +38784,7 @@
"repo": "OpenVibe.Live",
"table": "user_equipped_tag",
"declaredAt": [
-- "server/game/tags.js:76"
++ "server/chat/tags.js:61"
],
"prodDbs": [
"live.db"
@@@ -38713,7 +38816,7 @@
"repo": "OpenVibe.Live",
"table": "user_tags",
"declaredAt": [
-- "server/game/tags.js:67"
++ "server/chat/tags.js:52"
],
"prodDbs": [
"live.db"
@@@ -38790,7 +38893,7 @@
"repo": "OpenVibe.Live",
"table": "verification_keys",
"declaredAt": [
-- "server/db/database.js:366",
++ "server/db/database.js:367",
"server/db/schema.sql:567"
],
"prodDbs": [
@@@ -38807,7 +38910,7 @@
"repo": "OpenVibe.Live",
"table": "vibe_coding_events",
"declaredAt": [
-- "server/db/database.js:2649",
++ "server/db/database.js:2672",
"server/db/schema.sql:198"
],
"prodDbs": [
@@@ -38824,7 +38927,7 @@
"repo": "OpenVibe.Live",
"table": "vibe_coding_sessions",
"declaredAt": [
-- "server/db/database.js:2614",
++ "server/db/database.js:2637",
"server/db/schema.sql:170"
],
"prodDbs": [
@@@ -38841,7 +38944,7 @@
"repo": "OpenVibe.Live",
"table": "viewer_samples",
"declaredAt": [
-- "server/db/database.js:3832"
++ "server/db/database.js:3855"
],
"prodDbs": [
"live.db"
@@@ -38873,7 +38976,7 @@
"repo": "OpenVibe.Live",
"table": "vod_ai_state",
"declaredAt": [
-- "server/db/database.js:265"
++ "server/db/database.js:266"
],
"prodDbs": [
"live.db"
@@@ -38967,7 +39070,7 @@
"repo": "OpenVibe.Media",
"table": "assets",
"declaredAt": [
-- "server/db/schema.sql:193"
++ "server/db/schema.sql:194"
],
"prodDbs": [
"media.db"
@@@ -38983,7 +39086,7 @@
"repo": "OpenVibe.Media",
"table": "clips",
"declaredAt": [
-- "server/db/schema.sql:64"
++ "server/db/schema.sql:65"
],
"prodDbs": [
"media.db"
@@@ -38999,7 +39102,7 @@
"repo": "OpenVibe.Media",
"table": "content_views",
"declaredAt": [
-- "server/db/schema.sql:96"
++ "server/db/schema.sql:97"
],
"prodDbs": [
"media.db"
@@@ -39045,7 +39148,7 @@
"repo": "OpenVibe.Media",
"table": "files",
"declaredAt": [
-- "server/db/schema.sql:167"
++ "server/db/schema.sql:168"
],
"prodDbs": [
"media.db"
@@@ -39061,7 +39164,7 @@
"repo": "OpenVibe.Media",
"table": "media_holds",
"declaredAt": [
-- "server/db/schema.sql:338"
++ "server/db/schema.sql:339"
],
"prodDbs": [
"media.db"
@@@ -39077,7 +39180,7 @@
"repo": "OpenVibe.Media",
"table": "media_invariant_violations",
"declaredAt": [
-- "server/db/schema.sql:351"
++ "server/db/schema.sql:352"
],
"prodDbs": [
"media.db"
@@@ -39093,7 +39196,7 @@
"repo": "OpenVibe.Media",
"table": "media_jobs",
"declaredAt": [
-- "server/db/schema.sql:281"
++ "server/db/schema.sql:282"
],
"prodDbs": [
"media.db"
@@@ -39109,7 +39212,7 @@
"repo": "OpenVibe.Media",
"table": "media_locations",
"declaredAt": [
-- "server/db/schema.sql:241"
++ "server/db/schema.sql:242"
],
"prodDbs": [
"media.db"
@@@ -39121,11 +39224,25 @@
"wave": "W4 (object model)",
"note": "Becomes projections over media_objects/media_locations."
},
++ {
++ "repo": "OpenVibe.Media",
++ "table": "media_object_changes",
++ "declaredAt": [
++ "server/db/schema.sql:390"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Media",
++ "disposition": "keep",
++ "wave": "W4 (object model)",
++ "note": "Becomes projections over media_objects/media_locations."
++ },
{
"repo": "OpenVibe.Media",
"table": "media_objects",
"declaredAt": [
-- "server/db/schema.sql:214"
++ "server/db/schema.sql:215"
],
"prodDbs": [
"media.db"
@@@ -39141,7 +39258,7 @@
"repo": "OpenVibe.Media",
"table": "media_relationships",
"declaredAt": [
-- "server/db/schema.sql:257"
++ "server/db/schema.sql:258"
],
"prodDbs": [
"media.db"
@@@ -39157,7 +39274,7 @@
"repo": "OpenVibe.Media",
"table": "media_settings",
"declaredAt": [
-- "server/db/schema.sql:182"
++ "server/db/schema.sql:183"
],
"prodDbs": [
"media.db"
@@@ -39169,11 +39286,25 @@
"wave": "W4 (object model)",
"note": "Becomes projections over media_objects/media_locations."
},
++ {
++ "repo": "OpenVibe.Media",
++ "table": "media_tier_decisions",
++ "declaredAt": [
++ "server/db/schema.sql:367"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Media",
++ "disposition": "keep",
++ "wave": "W4 (object model)",
++ "note": "Becomes projections over media_objects/media_locations."
++ },
{
"repo": "OpenVibe.Media",
"table": "media_upload_parts",
"declaredAt": [
-- "server/db/schema.sql:328"
++ "server/db/schema.sql:329"
],
"prodDbs": [],
"inCode": true,
@@@ -39187,7 +39318,7 @@
"repo": "OpenVibe.Media",
"table": "media_uploads",
"declaredAt": [
-- "server/db/schema.sql:312"
++ "server/db/schema.sql:313"
],
"prodDbs": [],
"inCode": true,
@@@ -39201,7 +39332,7 @@
"repo": "OpenVibe.Media",
"table": "media_variants",
"declaredAt": [
-- "server/db/schema.sql:268"
++ "server/db/schema.sql:269"
],
"prodDbs": [
"media.db"
@@@ -39217,7 +39348,7 @@
"repo": "OpenVibe.Media",
"table": "media_verifications",
"declaredAt": [
-- "server/db/schema.sql:365"
++ "server/db/schema.sql:402"
],
"prodDbs": [
"media.db"
@@@ -39233,7 +39364,7 @@
"repo": "OpenVibe.Media",
"table": "media_verify_runs",
"declaredAt": [
-- "server/db/schema.sql:377"
++ "server/db/schema.sql:414"
],
"prodDbs": [
"media.db"
@@@ -39249,7 +39380,7 @@
"repo": "OpenVibe.Media",
"table": "paste_comments",
"declaredAt": [
-- "server/db/schema.sql:149"
++ "server/db/schema.sql:150"
],
"prodDbs": [
"media.db"
@@@ -39265,7 +39396,7 @@
"repo": "OpenVibe.Media",
"table": "paste_likes",
"declaredAt": [
-- "server/db/schema.sql:141"
++ "server/db/schema.sql:142"
],
"prodDbs": [
"media.db"
@@@ -39281,7 +39412,7 @@
"repo": "OpenVibe.Media",
"table": "pastes",
"declaredAt": [
-- "server/db/schema.sql:107"
++ "server/db/schema.sql:108"
],
"prodDbs": [
"media.db"
@@@ -39651,7 +39782,7 @@
"repo": "OpenVibe.Network",
"table": "email_verification_tokens",
"declaredAt": [
-- "server/db/database.js:431"
++ "server/db/database.js:438"
],
"prodDbs": [
"network.db"
@@@ -39855,7 +39986,7 @@
"repo": "OpenVibe.Network",
"table": "principal_grants",
"declaredAt": [
-- "server/identity/principals.js:164"
++ "server/identity/principals.js:171"
],
"prodDbs": [
"network.db"
@@@ -39871,7 +40002,7 @@
"repo": "OpenVibe.Network",
"table": "principal_usage",
"declaredAt": [
-- "server/identity/principals.js:174"
++ "server/identity/principals.js:181"
],
"prodDbs": [
"network.db"
@@@ -40016,7 +40147,7 @@
"repo": "OpenVibe.Network",
"table": "user_module_retirements",
"declaredAt": [
-- "server/identity/modules.js:93"
++ "server/identity/modules.js:91"
],
"prodDbs": [],
"inCode": true,
@@@ -40030,7 +40161,7 @@
"repo": "OpenVibe.Network",
"table": "user_module_revisions",
"declaredAt": [
-- "server/identity/modules.js:86"
++ "server/identity/modules.js:84"
],
"prodDbs": [],
"inCode": true,
@@@ -40044,7 +40175,7 @@
"repo": "OpenVibe.Network",
"table": "user_modules",
"declaredAt": [
-- "server/identity/modules.js:75"
++ "server/identity/modules.js:73"
],
"prodDbs": [
"network.db"
@@@ -41670,6 +41801,48 @@
"wave": "W3",
"note": "Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers."
},
++ {
++ "repo": "OpenVibe.Tools",
++ "table": "guard_abuse",
++ "declaredAt": [
++ "apps/_shared/guard/store.js:38"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": ""
++ },
++ {
++ "repo": "OpenVibe.Tools",
++ "table": "guard_day",
++ "declaredAt": [
++ "apps/_shared/guard/store.js:31"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": ""
++ },
++ {
++ "repo": "OpenVibe.Tools",
++ "table": "guard_salt",
++ "declaredAt": [
++ "apps/_shared/guard/store.js:27"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Tools",
++ "disposition": "keep",
++ "wave": "-",
++ "note": ""
++ },
{
"repo": "OpenVibe.Tools",
"table": "tool_job_events",
@@@ -42705,7 +42878,7 @@
"file": "apps/server/src/net/httpServer.ts",
"target": "OpenVibe.Network",
"via": "/api/auth/me, /oauth/token",
-- "lines": "346,378,443,522",
++ "lines": "362,394,459,538",
"auth": "oauth-client",
"timeout": false,
"retry": true
@@@ -42775,7 +42948,7 @@
"file": "server/integrations/robotstreamer-service.js",
"target": "OpenVibe.Chat",
"via": "chatUrl",
-- "lines": "586,596",
++ "lines": "568,578",
"auth": "none-detected",
"timeout": true,
"retry": false
@@@ -42795,7 +42968,7 @@
"file": "server/media-proxy/pastes.js",
"target": "OpenVibe.Community",
"via": "OV_COMMUNITY_URL",
-- "lines": "311",
++ "lines": "312",
"auth": "none-detected",
"timeout": true,
"retry": true
@@@ -42815,7 +42988,7 @@
"file": "server/seo/seo.js",
"target": "OpenVibe.Community",
"via": "OV_COMMUNITY_URL",
-- "lines": "432",
++ "lines": "145",
"auth": "none-detected",
"timeout": false,
"retry": false
@@@ -42825,7 +42998,7 @@
"file": "server/config.js",
"target": "OpenVibe.Media",
"via": "MEDIA_URL, :4100",
-- "lines": "175,175",
++ "lines": "177,177",
"auth": "internal-key",
"timeout": true,
"retry": false
@@@ -42855,7 +43028,7 @@
"file": "server/config.js",
"target": "OpenVibe.Network",
"via": ":4000, OV_NETWORK_URL",
-- "lines": "21,101",
++ "lines": "23,103",
"auth": "internal-key",
"timeout": true,
"retry": false
@@@ -42895,7 +43068,7 @@
"file": "server/monetization/wallet-client.js",
"target": "OpenVibe.Network",
"via": "/internal/coins, OV_NETWORK_INTERNAL_URL, :4000",
-- "lines": "9,19,19,79,92,103,151",
++ "lines": "9,19,19,79,92,103,151,152",
"auth": "internal-key, bearer",
"timeout": true,
"retry": true
@@@ -42935,7 +43108,7 @@
"file": "server/streaming/restream-manager.js",
"target": "OpenVibe.Network",
"via": "/oauth/token",
-- "lines": "1387",
++ "lines": "1383",
"auth": "bearer, oauth-client, service-token",
"timeout": true,
"retry": true
@@@ -42965,7 +43138,7 @@
"file": "server/streaming/restream-manager.js",
"target": "OpenVibe.Search",
"via": "searchUrl",
-- "lines": "1639,1640",
++ "lines": "1635,1636",
"auth": "bearer, oauth-client, service-token",
"timeout": true,
"retry": true
@@@ -43025,7 +43198,7 @@
"file": "server/user-auth.js",
"target": "OpenVibe.Network",
"via": "/api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token",
-- "lines": "49,57,58,67,67,70,146,227,227,230,361",
++ "lines": "49,57,58,67,67,70,147,228,228,231,362",
"auth": "oauth-client",
"timeout": true,
"retry": true
@@@ -43045,7 +43218,7 @@
"file": "server/webhooks.js",
"target": "webhook",
"via": "webhook_url (per-app, configured in DB)",
-- "lines": "4,43,56,65",
++ "lines": "4,43,58,67",
"auth": "hmac",
"timeout": true,
"retry": true
@@@ -43085,7 +43258,7 @@
"file": "server/admin/routes.js",
"target": "OpenVibe.Games",
"via": "games.internalUrl",
-- "lines": "71",
++ "lines": "72",
"auth": "internal-key",
"timeout": true,
"retry": false
@@@ -43095,7 +43268,7 @@
"file": "server/index.js",
"target": "OpenVibe.Games",
"via": ":8000, games.internalUrl",
-- "lines": "236,310",
++ "lines": "236,304",
"auth": "internal-key, bearer",
"timeout": false,
"retry": false
@@@ -43115,7 +43288,7 @@
"file": "server/admin/routes.js",
"target": "OpenVibe.Live",
"via": "live.internalUrl, OV_LIVE_INTERNAL_URL, :3000",
-- "lines": "69,219,219",
++ "lines": "70,220,220",
"auth": "internal-key",
"timeout": true,
"retry": false
@@@ -43125,7 +43298,7 @@
"file": "server/chrome/service.js",
"target": "OpenVibe.Live",
"via": ":3000",
-- "lines": "82",
++ "lines": "84",
"auth": "internal-key, bearer, service-token",
"timeout": true,
"retry": false
@@@ -43135,7 +43308,7 @@
"file": "server/index.js",
"target": "OpenVibe.Live",
"via": ":3000, live.internalUrl, liveUrl",
-- "lines": "232,308,364,364,535",
++ "lines": "232,302,361,361,537",
"auth": "internal-key, bearer",
"timeout": false,
"retry": false
@@@ -43165,7 +43338,7 @@
"file": "server/admin/routes.js",
"target": "OpenVibe.Media",
"via": "media.internalUrl",
-- "lines": "72",
++ "lines": "73",
"auth": "internal-key",
"timeout": true,
"retry": false
@@@ -43175,7 +43348,7 @@
"file": "server/index.js",
"target": "OpenVibe.Media",
"via": ":4100, media.internalUrl",
-- "lines": "235,311",
++ "lines": "235,305",
"auth": "internal-key, bearer",
"timeout": false,
"retry": false
@@@ -43205,7 +43378,7 @@
"file": "server/admin/routes.js",
"target": "OpenVibe.Tools",
"via": "tools.internalUrl",
-- "lines": "70",
++ "lines": "71",
"auth": "internal-key",
"timeout": true,
"retry": false
@@@ -43225,7 +43398,7 @@
"file": "server/index.js",
"target": "OpenVibe.Tools",
"via": ":4001, tools.internalUrl",
-- "lines": "234,309",
++ "lines": "234,303",
"auth": "internal-key, bearer",
"timeout": false,
"retry": false
@@@ -43285,11 +43458,21 @@
"file": "navbar.js",
"target": "OpenVibe.Network",
"via": "/api/auth/me",
-- "lines": "10,1013,1016",
++ "lines": "10,1027,1030",
"auth": "bearer",
"timeout": false,
"retry": true
},
++ {
++ "caller": "OpenVibe.Sites",
++ "file": "build.js",
++ "target": "OpenVibe.Network",
++ "via": "networkUrl",
++ "lines": "100,111,111,112,112,114,145,216,217,266,267,268,271,271,272,272,283,318,482",
++ "auth": "none-detected",
++ "timeout": false,
++ "retry": false
++ },
{
"caller": "OpenVibe.Sites",
"file": "OpenVibe.Shared/footer.js",
@@@ -43315,17 +43498,17 @@
"file": "apps/gateway/server/index.js",
"target": "OpenVibe.Community",
"via": "communityUrl, OV_COMMUNITY_URL",
-- "lines": "70,185,302",
++ "lines": "84,268,388",
"auth": "internal-key, bearer",
"timeout": true,
-- "retry": false
++ "retry": true
},
{
"caller": "OpenVibe.Tools",
"file": "apps/_shared/jobs/index.js",
"target": "OpenVibe.Events",
"via": "EVENTS_URL",
-- "lines": "87",
++ "lines": "96",
"auth": "oauth-client, service-token",
"timeout": true,
"retry": false
@@@ -43335,50 +43518,50 @@
"file": "apps/gateway/server/index.js",
"target": "OpenVibe.Live",
"via": "liveUrl",
-- "lines": "354",
++ "lines": "443",
"auth": "internal-key, bearer",
"timeout": true,
-- "retry": false
++ "retry": true
},
{
"caller": "OpenVibe.Tools",
"file": "apps/_shared/jobs/index.js",
"target": "OpenVibe.Media",
"via": ":4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL",
-- "lines": "14,50,50,50,58,59,122,122,122,136",
++ "lines": "18,54,54,54,62,63,143,143,143,157",
"auth": "oauth-client, service-token",
"timeout": true,
"retry": false
},
{
"caller": "OpenVibe.Tools",
-- "file": "apps/_shared/jobs/index.js",
++ "file": "apps/_shared/guard/tokens.js",
"target": "OpenVibe.Network",
-- "via": ":4000, OV_NETWORK_INTERNAL_URL, /oauth/token",
-- "lines": "16,41,41,43",
-- "auth": "oauth-client, service-token",
++ "via": "/api/.well-known/jwks, networkUrl, networkInternalUrl",
++ "lines": "25,131,131,140,140",
++ "auth": "service-token",
"timeout": true,
-- "retry": false
++ "retry": true
},
{
"caller": "OpenVibe.Tools",
-- "file": "apps/audio/server/auth.js",
++ "file": "apps/_shared/jobs/index.js",
"target": "OpenVibe.Network",
-- "via": "/api/.well-known/jwks, networkUrl, networkInternalUrl",
-- "lines": "9,20,21,40,40",
-- "auth": "none-detected",
++ "via": ":4000, OV_NETWORK_INTERNAL_URL, /oauth/token",
++ "lines": "20,45,45,47",
++ "auth": "oauth-client, service-token",
"timeout": true,
-- "retry": true
++ "retry": false
},
{
"caller": "OpenVibe.Tools",
-- "file": "apps/docs/server/auth.js",
++ "file": "apps/food/server/index.js",
"target": "OpenVibe.Network",
-- "via": "/api/.well-known/jwks, networkUrl, networkInternalUrl",
-- "lines": "9,20,21,40,40",
++ "via": "OV_NETWORK_URL, OV_NETWORK_INTERNAL_URL, networkUrl, networkInternalUrl, :4000",
++ "lines": "33,36,36,36,36",
"auth": "none-detected",
"timeout": true,
-- "retry": true
++ "retry": false
},
{
"caller": "OpenVibe.Tools",
@@@ -43395,10 +43578,10 @@
"file": "apps/gateway/server/index.js",
"target": "OpenVibe.Network",
"via": "networkUrl",
-- "lines": "353",
++ "lines": "61,442",
"auth": "internal-key, bearer",
"timeout": true,
-- "retry": false
++ "retry": true
},
{
"caller": "OpenVibe.Tools",
@@@ -43412,20 +43595,10 @@
},
{
"caller": "OpenVibe.Tools",
-- "file": "apps/img/server/auth.js",
-- "target": "OpenVibe.Network",
-- "via": "/api/.well-known/jwks, networkUrl, networkInternalUrl",
-- "lines": "9,20,21,40,40",
-- "auth": "none-detected",
-- "timeout": true,
-- "retry": true
-- },
-- {
-- "caller": "OpenVibe.Tools",
-- "file": "apps/yt/server/auth.js",
++ "file": "apps/maps/server/index.js",
"target": "OpenVibe.Network",
-- "via": "/api/.well-known/jwks, networkUrl, networkInternalUrl",
-- "lines": "9,20,21,40,40",
++ "via": "OV_NETWORK_URL, OV_NETWORK_INTERNAL_URL, networkUrl, networkInternalUrl, :4000",
++ "lines": "39,42,42,42,42",
"auth": "none-detected",
"timeout": true,
"retry": true
@@@ -45905,6 +46078,15 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Codes",
++ "name": "CODES_RATE_LIMIT_PER_MIN",
++ "secret": false,
++ "files": [
++ "server/app.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Codes",
"name": "CODES_REGISTRY_TTL_MS",
@@@ -48490,17 +48672,6 @@
],
"prod": null
},
-- {
-- "repo": "OpenVibe.Live",
-- "name": "AI_MOMENTS_PATH",
-- "secret": false,
-- "files": [
-- "server/ai/stream-memory-job.js",
-- "server/arena/arena-service.js",
-- "server/index.js"
-- ],
-- "prod": null
-- },
{
"repo": "OpenVibe.Live",
"name": "AI_SERVICE",
@@@ -48528,16 +48699,6 @@
],
"prod": null
},
-- {
-- "repo": "OpenVibe.Live",
-- "name": "ARENA_IMAGE_PATH",
-- "secret": false,
-- "files": [
-- "server/arena/arena-service.js",
-- "server/index.js"
-- ],
-- "prod": null
-- },
{
"repo": "OpenVibe.Live",
"name": "BASE_URL",
@@@ -48579,7 +48740,7 @@
},
{
"repo": "OpenVibe.Live",
-- "name": "CLIPS_PATH",
++ "name": "COLD_STORAGE_PATH",
"secret": false,
"files": [
"server/config.js"
@@@ -48588,10 +48749,12 @@
},
{
"repo": "OpenVibe.Live",
-- "name": "COLD_STORAGE_PATH",
++ "name": "DATA_DIR",
"secret": false,
"files": [
-- "server/config.js"
++ "server/drill.js",
++ "server/index.js",
++ "server/paths.js"
],
"prod": null
},
@@@ -48600,9 +48763,10 @@
"name": "DB_PATH",
"secret": false,
"files": [
-- "server/config.js",
-- "server/db/database.js",
-- "server/db/init.js"
++ "server/db/init.js",
++ "server/drill.js",
++ "server/index.js",
++ "server/paths.js"
],
"prod": "live.env"
},
@@@ -48619,11 +48783,9 @@
"repo": "OpenVibe.Live",
"name": "EMOTES_PATH",
"secret": false,
-- "files": [
-- "server/config.js",
-- "server/media-proxy/asset-sync.js"
-- ],
-- "prod": "live.env"
++ "files": [],
++ "prod": "live.env",
++ "unreferenced": true
},
{
"repo": "OpenVibe.Live",
@@@ -48684,7 +48846,9 @@
"name": "HOST",
"secret": false,
"files": [
-- "server/config.js"
++ "server/config.js",
++ "server/drill.js",
++ "server/index.js"
],
"prod": "live.env"
},
@@@ -48746,6 +48910,7 @@
"name": "LISTEN_FDS",
"secret": false,
"files": [
++ "server/drill.js",
"server/index.js"
],
"prod": null
@@@ -48755,16 +48920,17 @@
"name": "LISTEN_PID",
"secret": false,
"files": [
++ "server/drill.js",
"server/index.js"
],
"prod": null
},
{
"repo": "OpenVibe.Live",
-- "name": "LIVE_THUMBS_PATH",
++ "name": "LIVE_DRILL",
"secret": false,
"files": [
-- "server/media-proxy/live-thumbs.js"
++ "server/drill.js"
],
"prod": null
},
@@@ -48982,16 +49148,6 @@
],
"prod": "live.env"
},
-- {
-- "repo": "OpenVibe.Live",
-- "name": "OFFLINE_SCREEN_PATH",
-- "secret": false,
-- "files": [
-- "server/monetization/routes.js",
-- "server/streaming/routes.js"
-- ],
-- "prod": null
-- },
{
"repo": "OpenVibe.Live",
"name": "OPENRE_EVENTS_SECRET",
@@@ -49101,9 +49257,9 @@
"files": [
"server/ai/ai-moments-job.js",
"server/comments-client.js",
-- "server/index.js",
"server/media-proxy/pastes.js",
-- "server/seo/seo.js"
++ "server/seo/seo.js",
++ "server/web/paste-handover.js"
],
"prod": "live.env"
},
@@@ -49222,8 +49378,8 @@
"name": "PASTES_ON_COMMUNITY",
"secret": false,
"files": [
-- "server/index.js",
-- "server/seo/seo.js"
++ "server/seo/seo.js",
++ "server/web/paste-handover.js"
],
"prod": "live.env"
},
@@@ -49268,7 +49424,9 @@
"name": "PORT",
"secret": false,
"files": [
-- "server/config.js"
++ "server/config.js",
++ "server/drill.js",
++ "server/index.js"
],
"prod": "live.env"
},
@@@ -49378,16 +49536,6 @@
],
"prod": null
},
-- {
-- "repo": "OpenVibe.Live",
-- "name": "SOUNDS_PATH",
-- "secret": false,
-- "files": [
-- "server/config.js",
-- "server/media-proxy/asset-sync.js"
-- ],
-- "prod": null
-- },
{
"repo": "OpenVibe.Live",
"name": "STAR_STREAMER",
@@@ -49397,24 +49545,6 @@
],
"prod": "live.env"
},
-- {
-- "repo": "OpenVibe.Live",
-- "name": "THUMBNAILS_PATH",
-- "secret": false,
-- "files": [
-- "server/config.js"
-- ],
-- "prod": null
-- },
-- {
-- "repo": "OpenVibe.Live",
-- "name": "TTS_CACHE_PATH",
-- "secret": false,
-- "files": [
-- "server/arena/voice.js"
-- ],
-- "prod": null
-- },
{
"repo": "OpenVibe.Live",
"name": "TURN_AUTH_SECRET",
@@@ -49460,15 +49590,6 @@
"prod": "live.env",
"unreferenced": true
},
-- {
-- "repo": "OpenVibe.Live",
-- "name": "VOD_PATH",
-- "secret": false,
-- "files": [
-- "server/config.js"
-- ],
-- "prod": null
-- },
{
"repo": "OpenVibe.Live",
"name": "WEBRTC_PORT",
@@@ -49717,7 +49838,9 @@
"name": "DB_PATH",
"secret": false,
"files": [
-- "server/config.js"
++ "server/config.js",
++ "server/drill.js",
++ "server/index.js"
],
"prod": "media.env"
},
@@@ -49753,7 +49876,9 @@
"name": "HOST",
"secret": false,
"files": [
-- "server/config.js"
++ "server/config.js",
++ "server/drill.js",
++ "server/index.js"
],
"prod": "media.env"
},
@@@ -49839,6 +49964,24 @@
],
"prod": "media.env"
},
++ {
++ "repo": "OpenVibe.Media",
++ "name": "MEDIA_DRILL",
++ "secret": false,
++ "files": [
++ "server/drill.js"
++ ],
++ "prod": null
++ },
++ {
++ "repo": "OpenVibe.Media",
++ "name": "MEDIA_DURATION_RECONCILE_APPLY",
++ "secret": false,
++ "files": [
++ "server/jobs/duration-reconcile.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Media",
"name": "MEDIA_JOBS_ENABLED",
@@@ -49857,6 +50000,15 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Media",
++ "name": "MEDIA_OWNER_SUBJECT_SYNC",
++ "secret": false,
++ "files": [
++ "server/config.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Media",
"name": "MEDIA_PUBLIC_URL",
@@@ -49911,6 +50063,15 @@
],
"prod": "media.env"
},
++ {
++ "repo": "OpenVibe.Media",
++ "name": "MEDIA_RTMP_PULL_ALLOW",
++ "secret": false,
++ "files": [
++ "server/config.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Media",
"name": "MEDIA_SECRET",
@@@ -50008,7 +50169,8 @@
"secret": false,
"files": [
"server/events.js",
-- "server/index.js"
++ "server/index.js",
++ "server/objects/owner-subject.js"
],
"prod": "media.env"
},
@@@ -50018,7 +50180,8 @@
"secret": true,
"files": [
"server/events.js",
-- "server/index.js"
++ "server/index.js",
++ "server/objects/owner-subject.js"
],
"prod": "media.env"
},
@@@ -50061,9 +50224,11 @@
"repo": "OpenVibe.Media",
"name": "PORT",
"secret": false,
-- "files": [],
-- "prod": "media.env",
-- "unreferenced": true
++ "files": [
++ "server/drill.js",
++ "server/index.js"
++ ],
++ "prod": "media.env"
},
{
"repo": "OpenVibe.Media",
@@@ -52501,6 +52666,15 @@
],
"prod": "tips.env"
},
++ {
++ "repo": "OpenVibe.Tools",
++ "name": "AUDIO_MAX_DURATION",
++ "secret": false,
++ "files": [
++ "apps/audio/server/descriptors.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Tools",
"name": "BASE_URL",
@@@ -52537,6 +52711,7 @@
"files": [
"apps/audio/server/config.js",
"apps/docs/server/config.js",
++ "apps/gateway/server/index.js",
"apps/img/server/config.js",
"apps/text/server/index.js",
"apps/yt/server/config.js"
@@@ -52659,21 +52834,13 @@
],
"prod": "tools.env"
},
-- {
-- "repo": "OpenVibe.Tools",
-- "name": "MIN_CLIENT_RELEASE",
-- "secret": false,
-- "files": [
-- "OpenVibe.Shared/release.js"
-- ],
-- "prod": null
-- },
{
"repo": "OpenVibe.Tools",
"name": "NODE_ENV",
"secret": false,
"files": [
-- "apps/_shared/jobs/http.js",
++ "apps/_shared/guard/caller.js",
++ "apps/_shared/guard/index.js",
"apps/audio/server/index.js",
"apps/docs/server/index.js",
"apps/food/server/index.js",
@@@ -52887,9 +53054,12 @@
"apps/_shared/jobs/index.js",
"apps/audio/server/config.js",
"apps/docs/server/config.js",
++ "apps/food/server/index.js",
"apps/gateway/server/config.js",
"apps/gateway/server/registry/services.js",
"apps/img/server/config.js",
++ "apps/maps/server/index.js",
++ "apps/text/server/index.js",
"apps/yt/server/config.js"
],
"prod": "tools.env"
@@@ -52910,7 +53080,10 @@
"files": [
"apps/audio/server/config.js",
"apps/docs/server/config.js",
++ "apps/food/server/index.js",
"apps/img/server/config.js",
++ "apps/maps/server/index.js",
++ "apps/text/server/index.js",
"apps/yt/server/config.js"
],
"prod": null
@@@ -52923,10 +53096,13 @@
"OpenVibe.Shared/brand.js",
"apps/audio/server/config.js",
"apps/docs/server/config.js",
++ "apps/food/server/index.js",
"apps/gateway/server/config.js",
"apps/gateway/server/registry/services.js",
"apps/img/server/config.js",
++ "apps/maps/server/index.js",
"apps/text/server/config.js",
++ "apps/text/server/index.js",
"apps/yt/server/config.js"
],
"prod": "tools.env"
@@@ -52989,6 +53165,15 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Tools",
++ "name": "OV_TOOLS_AUDIENCE",
++ "secret": false,
++ "files": [
++ "apps/_shared/guard/index.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Tools",
"name": "OV_TOOLS_URL",
@@@ -53016,6 +53201,26 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Tools",
++ "name": "PDF_MAX_PAGES",
++ "secret": false,
++ "files": [
++ "apps/docs/server/descriptors.js",
++ "apps/docs/server/tools/pdf.js"
++ ],
++ "prod": null
++ },
++ {
++ "repo": "OpenVibe.Tools",
++ "name": "PDF2IMG_MAX_PAGES",
++ "secret": false,
++ "files": [
++ "apps/docs/server/descriptors.js",
++ "apps/docs/server/tools/pdf2img.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Tools",
"name": "PORT",
@@@ -53034,29 +53239,29 @@
},
{
"repo": "OpenVibe.Tools",
-- "name": "RELEASE_AT",
-- "secret": false,
++ "name": "RIDB_API_KEY",
++ "secret": true,
"files": [
-- "OpenVibe.Shared/release.js"
++ "apps/maps/server/config.js",
++ "apps/maps/server/sources/ridb.js"
],
"prod": null
},
{
"repo": "OpenVibe.Tools",
-- "name": "RELEASE_COMMIT",
++ "name": "TOOLS_GUARD",
"secret": false,
"files": [
-- "OpenVibe.Shared/release.js"
++ "apps/_shared/guard/index.js"
],
"prod": null
},
{
"repo": "OpenVibe.Tools",
-- "name": "RIDB_API_KEY",
-- "secret": true,
++ "name": "TOOLS_GUARD_LIMITS",
++ "secret": false,
"files": [
-- "apps/maps/server/config.js",
-- "apps/maps/server/sources/ridb.js"
++ "apps/_shared/guard/limits.js"
],
"prod": null
},
@@@ -53083,7 +53288,7 @@
"name": "TOOLS_SATELLITE_PORTS",
"secret": false,
"files": [
-- "apps/gateway/server/index.js"
++ "apps/_shared/tools/satellites.js"
],
"prod": null
},
@@@ -53108,6 +53313,34 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Tools",
++ "name": "YT_INFO_CONCURRENCY",
++ "secret": false,
++ "files": [
++ "apps/yt/server/config.js"
++ ],
++ "prod": null
++ },
++ {
++ "repo": "OpenVibe.Tools",
++ "name": "YT_MAX_DURATION",
++ "secret": false,
++ "files": [
++ "apps/yt/server/config.js",
++ "apps/yt/server/descriptors.js"
++ ],
++ "prod": null
++ },
++ {
++ "repo": "OpenVibe.Tools",
++ "name": "YT_MAX_FILESIZE_MB",
++ "secret": false,
++ "files": [
++ "apps/yt/server/config.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Tools",
"name": "YT_PROXY",
@@@ -54024,127 +54257,151 @@
"severity": "medium",
"area": "deploy",
"subject": "ai",
-- "detail": "deployed 96dc8a3 is 1 commit(s) behind origin/main 3a480ac"
++ "detail": "deployed 96dc8a3 is 4 commit(s) behind origin/main a6d4f39"
},
{
"severity": "medium",
"area": "deploy",
"subject": "billing",
-- "detail": "deployed c646279 is 1 commit(s) behind origin/main aa445d0"
++ "detail": "deployed c646279 is 4 commit(s) behind origin/main 42ad547"
++ },
++ {
++ "severity": "medium",
++ "area": "deploy",
++ "subject": "blog",
++ "detail": "deployed 95e99ac is 5 commit(s) behind origin/main 0784b42"
},
{
"severity": "medium",
"area": "deploy",
"subject": "chat",
-- "detail": "deployed 7897688 is 2 commit(s) behind origin/main ed90461"
++ "detail": "deployed 7897688 is 6 commit(s) behind origin/main 1ef6f99"
},
{
"severity": "medium",
"area": "deploy",
"subject": "codes",
-- "detail": "deployed d60f279 is 1 commit(s) behind origin/main 51d2386"
++ "detail": "deployed d60f279 is 5 commit(s) behind origin/main a129415"
},
{
"severity": "medium",
"area": "deploy",
"subject": "community",
-- "detail": "deployed 57d1dd4 is 1 commit(s) behind origin/main 63b90a8"
++ "detail": "deployed 57d1dd4 is 5 commit(s) behind origin/main e075d39"
},
{
"severity": "medium",
"area": "deploy",
"subject": "coupons",
-- "detail": "deployed 54df411 is 3 commit(s) behind origin/main 1c57c47"
++ "detail": "deployed 54df411 is 8 commit(s) behind origin/main ae3a25e"
},
{
"severity": "medium",
"area": "deploy",
"subject": "deals",
-- "detail": "deployed e72aeec is 2 commit(s) behind origin/main 91ca223"
++ "detail": "deployed e72aeec is 7 commit(s) behind origin/main 3910b58"
},
{
"severity": "medium",
"area": "deploy",
"subject": "events",
-- "detail": "deployed 3366132 is 1 commit(s) behind origin/main efc09a7"
++ "detail": "deployed 3366132 is 6 commit(s) behind origin/main 9f51514"
},
{
"severity": "medium",
"area": "deploy",
"subject": "games",
-- "detail": "deployed 474df50 is 1 commit(s) behind origin/main 7863fc6"
++ "detail": "deployed 474df50 is 4 commit(s) behind origin/main 4e5bc50"
},
{
"severity": "medium",
"area": "deploy",
"subject": "host",
-- "detail": "deployed 30f08d6 is 15 commit(s) behind origin/main 03dfcb3"
++ "detail": "deployed 30f08d6 is 22 commit(s) behind origin/main f8ac37d"
},
{
"severity": "medium",
"area": "deploy",
"subject": "live",
-- "detail": "deployed c893c6c is 12 commit(s) behind origin/main ca7cc87"
++ "detail": "deployed c893c6c is 47 commit(s) behind origin/main 12c1c11"
},
{
"severity": "medium",
"area": "deploy",
"subject": "media",
-- "detail": "deployed 9de4b25 is 4 commit(s) behind origin/main ad2217b"
++ "detail": "deployed 9de4b25 is 22 commit(s) behind origin/main 984e7ad"
},
{
"severity": "medium",
"area": "deploy",
"subject": "network",
-- "detail": "deployed 9bbd90f is 4 commit(s) behind origin/main 09bf748"
++ "detail": "deployed 9bbd90f is 24 commit(s) behind origin/main 26c0395"
},
{
"severity": "medium",
"area": "deploy",
"subject": "news",
-- "detail": "deployed 5a17e7f is 1 commit(s) behind origin/main 5b393d2"
++ "detail": "deployed 5a17e7f is 6 commit(s) behind origin/main 42ce43b"
},
{
"severity": "medium",
"area": "deploy",
"subject": "openre",
-- "detail": "deployed e0dc1b4 is 2 commit(s) behind origin/main c091a09"
++ "detail": "deployed e0dc1b4 is 5 commit(s) behind origin/main e517ed4"
},
{
"severity": "medium",
"area": "deploy",
"subject": "reviews",
-- "detail": "deployed 1d462a2 is 1 commit(s) behind origin/main a7b50a6"
++ "detail": "deployed 1d462a2 is 5 commit(s) behind origin/main 70de372"
++ },
++ {
++ "severity": "medium",
++ "area": "deploy",
++ "subject": "search",
++ "detail": "deployed a707e38 is 3 commit(s) behind origin/main 4603541"
},
{
"severity": "medium",
"area": "deploy",
"subject": "sites",
-- "detail": "deployed d3b71af is 2 commit(s) behind origin/main d6e4cbd"
++ "detail": "deployed d3b71af is 13 commit(s) behind origin/main 63683d2"
++ },
++ {
++ "severity": "medium",
++ "area": "deploy",
++ "subject": "sources",
++ "detail": "deployed 2e986af is 3 commit(s) behind origin/main cf00390"
},
{
"severity": "medium",
"area": "deploy",
"subject": "tips",
-- "detail": "deployed 15bfc12 is 6 commit(s) behind origin/main f211c03"
++ "detail": "deployed 15bfc12 is 9 commit(s) behind origin/main 847d22a"
++ },
++ {
++ "severity": "medium",
++ "area": "deploy",
++ "subject": "tools",
++ "detail": "deployed 5d1b423 is 22 commit(s) behind origin/main b0aada2"
},
{
"severity": "medium",
"area": "deploy",
"subject": "trade",
-- "detail": "deployed 9a55644 is 2 commit(s) behind origin/main ddbc60c"
++ "detail": "deployed 9a55644 is 6 commit(s) behind origin/main 7f418d2"
},
{
"severity": "medium",
"area": "deploy",
"subject": "vip",
-- "detail": "deployed 9668a49 is 1 commit(s) behind origin/main fe7eaad"
++ "detail": "deployed 9668a49 is 4 commit(s) behind origin/main a0a8f75"
},
{
"severity": "medium",
"area": "deploy",
"subject": "wiki",
-- "detail": "deployed 011a68f is 1 commit(s) behind origin/main b4e70ac"
++ "detail": "deployed 011a68f is 5 commit(s) behind origin/main fe113b9"
},
{
"severity": "low",
@@@ -54752,6 +55009,96 @@
"subject": "OpenVibe.Live:fish_profile",
"detail": "in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.)"
},
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_achievements",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_bank",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_battle_stats",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_daily_quest_claims",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_daily_quest_progress",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_dungeon_runs",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_effects",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_farm_plots",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_fish_collection",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_inventory",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_leaderboard",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_players",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_recipes",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_structures",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:game_world_state",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
{
"severity": "low",
"area": "schema",
@@@ -54824,6 +55171,12 @@
"subject": "OpenVibe.Live:roast_log",
"detail": "in production (rs-companion.db) but no CREATE TABLE in the repo; classified frozen-legacy -> OpenVibe.Games (import source) (RobotStreamer companion game DB (unmodified since Mar 2026); read only by scripts/migrate-rs-companion.js.)"
},
++ {
++ "severity": "low",
++ "area": "schema",
++ "subject": "OpenVibe.Live:tag_guardian_defeats",
++ "detail": "in production (live.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.)"
++ },
{
"severity": "low",
"area": "schema",
@@@ -54890,6 +55243,12 @@
"subject": "OpenVibe.Games:PORT",
"detail": "set in games.env but not referenced by scanned code (may be read by a dependency or stale)"
},
++ {
++ "severity": "info",
++ "area": "env",
++ "subject": "OpenVibe.Live:EMOTES_PATH",
++ "detail": "set in live.env but not referenced by scanned code (may be read by a dependency or stale)"
++ },
{
"severity": "info",
"area": "env",
@@@ -54926,12 +55285,6 @@
"subject": "OpenVibe.Media:PASTES_MOVED_TO",
"detail": "set in media.env but not referenced by scanned code (may be read by a dependency or stale)"
},
-- {
-- "severity": "info",
-- "area": "env",
-- "subject": "OpenVibe.Media:PORT",
-- "detail": "set in media.env but not referenced by scanned code (may be read by a dependency or stale)"
-- },
{
"severity": "info",
"area": "env",
@@@ -55172,6 +55525,12 @@
"subject": "OpenVibe.Live:billing_actions",
"detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
},
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Live:channel_points_log",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
{
"severity": "info",
"area": "schema",
@@@ -55196,6 +55555,12 @@
"subject": "OpenVibe.Live:event_outbox",
"detail": "in production (live.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Live (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.)"
},
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Live:opencoin_admin_grants",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
{
"severity": "info",
"area": "schema",
@@@ -55208,12 +55573,30 @@
"subject": "OpenVibe.Live:stream_controls_new",
"detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
},
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Live:tips_deliveries",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
{
"severity": "info",
"area": "schema",
"subject": "OpenVibe.Media:event_outbox",
"detail": "in production (media.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Media (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.)"
},
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Media:media_object_changes",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Media:media_tier_decisions",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
{
"severity": "info",
"area": "schema",
@@@ -55538,6 +55921,24 @@
"subject": "OpenVibe.Tools:event_outbox",
"detail": "in production (jobs.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Tools (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.)"
},
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Tools:guard_abuse",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Tools:guard_day",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Tools:guard_salt",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
{
"severity": "info",
"area": "schema",
@@@ -55679,17 +56080,17 @@
],
"metrics": {
"github.charters": "1 charter-only repos of 36",
-- "contract.todo-markers": "Live 14, Network 0, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0",
++ "contract.todo-markers": "Live 14, Network 4, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0",
"outbound.call-sites": "98 caller-file/target pairs across 75 files",
"outbound.internal-key": "39 of 98 call sites authenticate with the shared internal key",
"ws.servers": "11 WebSocket server constructions",
"tables.analytics-copies": "3 repos carry their own analytics_events",
-- "shared.pins": "23 repos pin a tagged openvibe-shared release (latest v1.5.0): OpenRe.Stream v1.2.1, AI v1.3.0, Billing v1.3.0, Blog v1.3.0, Codes v1.3.0, Community v1.3.0, Coupons v1.3.0, Deals v1.3.0, Events v1.3.0, Host v1.3.0, Live v1.4.0, Media v1.3.0, Network v1.4.0, News v1.3.0, Reviews v1.3.0, Search v1.3.0, Sites v1.0.0, Sources v1.3.0, Tips v1.3.0, Tools v1.4.0, Trade v1.3.0, VIP v1.3.0, Wiki v1.3.0",
-- "shared.drift": "30 manifests unpinned or behind: OpenRe.Stream (v1.2.1), AI (v1.3.0), Billing (v1.3.0), Blog (v1.3.0), Codes (v1.3.0), Community (v1.3.0), Coupons (v1.3.0), Deals (v1.3.0), Events (v1.3.0), Host (v1.3.0), Live (v1.4.0), Media (v1.3.0), Network (v1.4.0), News (v1.3.0), Reviews (v1.3.0), Search (v1.3.0), Sites (v1.0.0), Sources (v1.3.0), Tips (v1.3.0), Tools/apps/audio (v1.4.0), Tools/apps/docs (v1.4.0), Tools/apps/food (v1.4.0), Tools/apps/gateway (v1.4.0), Tools/apps/img (v1.4.0), Tools/apps/maps (v1.4.0), Tools/apps/text (v1.4.0), Tools/apps/yt (v1.4.0), Trade (v1.3.0), VIP (v1.3.0), Wiki (v1.3.0)",
++ "shared.pins": "23 repos pin a tagged openvibe-shared release (latest v1.5.1): OpenRe.Stream v1.5.1, AI v1.5.1, Billing v1.5.1, Blog v1.5.1, Codes v1.5.1, Community v1.5.1, Coupons v1.5.1, Deals v1.5.1, Events v1.5.1, Host v1.5.1, Live v1.5.1, Media v1.5.1, Network v1.5.1, News v1.5.1, Reviews v1.5.1, Search v1.5.1, Sites v1.5.1, Sources v1.5.1, Tips v1.5.1, Tools v1.5.1, Trade v1.5.1, VIP v1.5.1, Wiki v1.5.1",
++ "shared.drift": "0 manifests unpinned or behind: none",
"ci.repos": "27 of 27 scanned repos have .github/workflows",
-- "deploy.drift": "21 service(s) not running origin/main",
-- "tests.OpenVibe.Live": "81 test files",
-- "tables.OpenVibe.Live": "125 tables",
++ "deploy.drift": "25 service(s) not running origin/main",
++ "tests.OpenVibe.Live": "98 test files",
++ "tables.OpenVibe.Live": "112 tables",
"tables.OpenVibe.Live.target:OpenVibe.Games (import source)": "31 Live tables target OpenVibe.Games (import source)",
"tables.OpenVibe.Live.target:OpenVibe.AI": "14 Live tables target OpenVibe.AI",
"tables.OpenVibe.Live.target:OpenVibe.Live": "33 Live tables target OpenVibe.Live",
@@@ -55697,34 +56098,35 @@
"tables.OpenVibe.Live.target:OpenVibe.Network (principals) / OpenVibe.Codes": "2 Live tables target OpenVibe.Network (principals) / OpenVibe.Codes",
"tables.OpenVibe.Live.target:archive then drop": "23 Live tables target archive then drop",
"tables.OpenVibe.Live.target:OpenRe.Stream": "14 Live tables target OpenRe.Stream",
-- "tables.OpenVibe.Live.target:OpenVibe.Games": "22 Live tables target OpenVibe.Games",
++ "tables.OpenVibe.Live.target:OpenVibe.Games": "7 Live tables target OpenVibe.Games",
"tables.OpenVibe.Live.target:OpenVibe.Chat": "23 Live tables target OpenVibe.Chat",
-- "tables.OpenVibe.Live.target:OpenVibe.Billing (loyalty ledger)": "7 Live tables target OpenVibe.Billing (loyalty ledger)",
++ "tables.OpenVibe.Live.target:OpenVibe.Billing (loyalty ledger)": "9 Live tables target OpenVibe.Billing (loyalty ledger)",
"tables.OpenVibe.Live.target:OpenVibe.Media": "2 Live tables target OpenVibe.Media",
"tables.OpenVibe.Live.target:OpenVibe.Community": "4 Live tables target OpenVibe.Community",
"tables.OpenVibe.Live.target:OpenVibe.Tips": "1 Live tables target OpenVibe.Tips",
"tables.OpenVibe.Live.target:OpenVibe.Network": "7 Live tables target OpenVibe.Network",
++ "tables.OpenVibe.Live.target:?": "16 Live tables target ?",
"tables.OpenVibe.Live.target:OpenVibe.Billing": "2 Live tables target OpenVibe.Billing",
"tables.OpenVibe.Live.target:OpenVibe.Billing + OpenVibe.VIP": "1 Live tables target OpenVibe.Billing + OpenVibe.VIP",
"tables.OpenVibe.Live.target:OpenVibe.Codes": "2 Live tables target OpenVibe.Codes",
-- "tests.OpenVibe.Network": "29 test files",
++ "tests.OpenVibe.Network": "34 test files",
"tables.OpenVibe.Network": "45 tables",
"tables.OpenVibe.Network.target:OpenVibe.Network": "50 Network tables target OpenVibe.Network",
"tables.OpenVibe.Network.target:OpenVibe.Billing (loyalty ledger)": "2 Network tables target OpenVibe.Billing (loyalty ledger)",
"tables.OpenVibe.Network.target:OpenVibe.Events": "1 Network tables target OpenVibe.Events",
"tests.OpenVibe.Shared": "19 test files",
"tables.OpenVibe.Shared": "0 tables",
-- "tests.OpenVibe.Media": "20 test files",
-- "tables.OpenVibe.Media": "22 tables",
-- "tables.OpenVibe.Media.target:OpenVibe.Media": "20 Media tables target OpenVibe.Media",
++ "tests.OpenVibe.Media": "34 test files",
++ "tables.OpenVibe.Media": "24 tables",
++ "tables.OpenVibe.Media.target:OpenVibe.Media": "22 Media tables target OpenVibe.Media",
"tables.OpenVibe.Media.target:OpenVibe.Community": "3 Media tables target OpenVibe.Community",
-- "tests.OpenVibe.Tools": "16 test files",
-- "tables.OpenVibe.Tools": "3 tables",
-- "tables.OpenVibe.Tools.target:OpenVibe.Tools": "10 Tools tables target OpenVibe.Tools",
-- "tests.OpenVibe.Community": "25 test files",
++ "tests.OpenVibe.Tools": "39 test files",
++ "tables.OpenVibe.Tools": "6 tables",
++ "tables.OpenVibe.Tools.target:OpenVibe.Tools": "13 Tools tables target OpenVibe.Tools",
++ "tests.OpenVibe.Community": "26 test files",
"tables.OpenVibe.Community": "20 tables",
"tables.OpenVibe.Community.target:OpenVibe.Community": "20 Community tables target OpenVibe.Community",
-- "tests.OpenVibe.Games": "68 test files",
++ "tests.OpenVibe.Games": "69 test files",
"tables.OpenVibe.Games": "12 tables",
"tables.OpenVibe.Games.target:OpenVibe.Games": "13 Games tables target OpenVibe.Games",
"tests.OpenVibe.Sites": "1 test files",
@@@ -55780,7 +56182,7 @@
"tests.OpenVibe.Codes": "19 test files",
"tables.OpenVibe.Codes": "7 tables",
"tables.OpenVibe.Codes.target:OpenVibe.Codes": "8 Codes tables target OpenVibe.Codes",
-- "tests.OpenVibe.Host": "27 test files",
++ "tests.OpenVibe.Host": "28 test files",
"tables.OpenVibe.Host": "11 tables",
"tables.OpenVibe.Host.target:OpenVibe.Host": "12 Host tables target OpenVibe.Host",
"tests.OpenVibe.Examples": "14 test files",
@@@ -55820,7 +56222,7 @@
},
{
"key": "contract.todo-markers",
-- "value": "Live 14, Network 0, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0"
++ "value": "Live 14, Network 4, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0"
}
],
"members": [
@@@ -56055,7 +56457,7 @@
"metrics": [
{
"key": "tests.OpenVibe.Tools",
-- "value": "16 test files"
++ "value": "39 test files"
}
],
"members": [
@@@ -56075,7 +56477,7 @@
"metrics": [
{
"key": "tests.OpenVibe.Games",
-- "value": "68 test files"
++ "value": "69 test files"
}
],
"members": [
@@@ -56099,7 +56501,7 @@
},
{
"key": "tests.OpenVibe.Host",
-- "value": "27 test files"
++ "value": "28 test files"
}
],
"members": [
@@@ -56201,11 +56603,11 @@
"metrics": [
{
"key": "shared.pins",
-- "value": "23 repos pin a tagged openvibe-shared release (latest v1.5.0): OpenRe.Stream v1.2.1, AI v1.3.0, Billing v1.3.0, Blog v1.3.0, Codes v1.3.0, Community v1.3.0, Coupons v1.3.0, Deals v1.3.0, Events v1.3.0, Host v1.3.0, Live v1.4.0, Media v1.3.0, Network v1.4.0, News v1.3.0, Reviews v1.3.0, Search v1.3.0, Sites v1.0.0, Sources v1.3.0, Tips v1.3.0, Tools v1.4.0, Trade v1.3.0, VIP v1.3.0, Wiki v1.3.0"
++ "value": "23 repos pin a tagged openvibe-shared release (latest v1.5.1): OpenRe.Stream v1.5.1, AI v1.5.1, Billing v1.5.1, Blog v1.5.1, Codes v1.5.1, Community v1.5.1, Coupons v1.5.1, Deals v1.5.1, Events v1.5.1, Host v1.5.1, Live v1.5.1, Media v1.5.1, Network v1.5.1, News v1.5.1, Reviews v1.5.1, Search v1.5.1, Sites v1.5.1, Sources v1.5.1, Tips v1.5.1, Tools v1.5.1, Trade v1.5.1, VIP v1.5.1, Wiki v1.5.1"
},
{
"key": "shared.drift",
-- "value": "30 manifests unpinned or behind: OpenRe.Stream (v1.2.1), AI (v1.3.0), Billing (v1.3.0), Blog (v1.3.0), Codes (v1.3.0), Community (v1.3.0), Coupons (v1.3.0), Deals (v1.3.0), Events (v1.3.0), Host (v1.3.0), Live (v1.4.0), Media (v1.3.0), Network (v1.4.0), News (v1.3.0), Reviews (v1.3.0), Search (v1.3.0), Sites (v1.0.0), Sources (v1.3.0), Tips (v1.3.0), Tools/apps/audio (v1.4.0), Tools/apps/docs (v1.4.0), Tools/apps/food (v1.4.0), Tools/apps/gateway (v1.4.0), Tools/apps/img (v1.4.0), Tools/apps/maps (v1.4.0), Tools/apps/text (v1.4.0), Tools/apps/yt (v1.4.0), Trade (v1.3.0), VIP (v1.3.0), Wiki (v1.3.0)"
++ "value": "0 manifests unpinned or behind: none"
}
],
"members": [
@@@ -56255,7 +56657,7 @@
"metrics": [
{
"key": "deploy.drift",
-- "value": "21 service(s) not running origin/main"
++ "value": "25 service(s) not running origin/main"
}
],
"members": [
@@@ -56388,7 +56790,7 @@
"status": "open",
"check": "workstation-disk",
"ownerReview": false,
-- "checkResult": "workstation / is 87% used (at generation time)"
++ "checkResult": "workstation / is 90% used (at generation time)"
},
{
"id": "H8",
@@@ -56473,7 +56875,7 @@
"status": "open",
"check": "deploy-drift",
"ownerReview": false,
-- "checkResult": "ai: deployed 96dc8a3 is 1 commit(s) behind origin/main 3a480ac; billing: deployed c646279 is 1 commit(s) behind origin/main aa445d0; chat: deployed 7897688 is 2 commit(s) behind origin/main ed90461; codes: deployed d60f279 is 1 commit(s) behind origin/main 51d2386; community: deployed 57d1dd4 is 1 commit(s) behind origin/main 63b90a8; coupons: deployed 54df411 is 3 commit(s) behind origin/main 1c57c47; deals: deployed e72aeec is 2 commit(s) behind origin/main 91ca223; events: deployed 3366132 is 1 commit(s) behind origin/main efc09a7; games: deployed 474df50 is 1 commit(s) behind origin/main 7863fc6; host: deployed 30f08d6 is 15 commit(s) behind origin/main 03dfcb3; live: deployed c893c6c is 12 commit(s) behind origin/main ca7cc87; media: deployed 9de4b25 is 4 commit(s) behind origin/main ad2217b; network: deployed 9bbd90f is 4 commit(s) behind origin/main 09bf748; news: deployed 5a17e7f is 1 commit(s) behind origin/main 5b393d2; openre: deployed e0dc1b4 is 2 commit(s) behind origin/main c091a09; reviews: deployed 1d462a2 is 1 commit(s) behind origin/main a7b50a6; sites: deployed d3b71af is 2 commit(s) behind origin/main d6e4cbd; tips: deployed 15bfc12 is 6 commit(s) behind origin/main f211c03; trade: deployed 9a55644 is 2 commit(s) behind origin/main ddbc60c; vip: deployed 9668a49 is 1 commit(s) behind origin/main fe7eaad; wiki: deployed 011a68f is 1 commit(s) behind origin/main b4e70ac"
++ "checkResult": "ai: deployed 96dc8a3 is 4 commit(s) behind origin/main a6d4f39; billing: deployed c646279 is 4 commit(s) behind origin/main 42ad547; blog: deployed 95e99ac is 5 commit(s) behind origin/main 0784b42; chat: deployed 7897688 is 6 commit(s) behind origin/main 1ef6f99; codes: deployed d60f279 is 5 commit(s) behind origin/main a129415; community: deployed 57d1dd4 is 5 commit(s) behind origin/main e075d39; coupons: deployed 54df411 is 8 commit(s) behind origin/main ae3a25e; deals: deployed e72aeec is 7 commit(s) behind origin/main 3910b58; events: deployed 3366132 is 6 commit(s) behind origin/main 9f51514; games: deployed 474df50 is 4 commit(s) behind origin/main 4e5bc50; host: deployed 30f08d6 is 22 commit(s) behind origin/main f8ac37d; live: deployed c893c6c is 47 commit(s) behind origin/main 12c1c11; media: deployed 9de4b25 is 22 commit(s) behind origin/main 984e7ad; network: deployed 9bbd90f is 24 commit(s) behind origin/main 26c0395; news: deployed 5a17e7f is 6 commit(s) behind origin/main 42ce43b; openre: deployed e0dc1b4 is 5 commit(s) behind origin/main e517ed4; reviews: deployed 1d462a2 is 5 commit(s) behind origin/main 70de372; search: deployed a707e38 is 3 commit(s) behind origin/main 4603541; sites: deployed d3b71af is 13 commit(s) behind origin/main 63683d2; sources: deployed 2e986af is 3 commit(s) behind origin/main cf00390; tips: deployed 15bfc12 is 9 commit(s) behind origin/main 847d22a; tools: deployed 5d1b423 is 22 commit(s) behind origin/main b0aada2; trade: deployed 9a55644 is 6 commit(s) behind origin/main 7f418d2; vip: deployed 9668a49 is 4 commit(s) behind origin/main a0a8f75; wiki: deployed 011a68f is 5 commit(s) behind origin/main fe113b9"
},
{
"id": "H14",
@@@ -56552,25 +56954,25 @@
"id": "EC1",
"text": "Every table has an owner classification",
"pass": true,
-- "detail": "621 tables classified, 0 unclassified"
++ "detail": "629 tables classified, 0 unclassified"
},
{
"id": "EC2",
"text": "Every route is attributed to a repo and source line, with an owner classification",
"pass": true,
-- "detail": "2098 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"
++ "detail": "2102 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"
},
{
"id": "EC3",
"text": "Every background job is listed with its location and an owner classification",
"pass": true,
-- "detail": "145 timers/jobs, 0 unclassified"
++ "detail": "147 timers/jobs, 0 unclassified"
},
{
"id": "EC4",
"text": "Every cross-service call records caller, callee, auth, timeout and retry",
"pass": true,
-- "detail": "98 call sites; 36 with no timeout detected"
++ "detail": "98 call sites; 37 with no timeout detected"
},
{
"id": "EC5",
ddiff --git a/docs/roadmap-baseline/requirement-ledger.json b/docs/roadmap-baseline/requirement-ledger.json
iindex 4a51a2b7..fb2d9926 100644
---- a/docs/roadmap-baseline/requirement-ledger.json
++++ b/docs/roadmap-baseline/requirement-ledger.json
@@@ -2,33 +2,33 @@
"_about": "Generated from data/requirement-ledger.json by scripts/roadmap-baseline/generate.js. Umbrella-level ledger (roadmap §22.4/§25): one row per D01-D46 requirement, every artifact re-verified against the scanned origin/main checkouts and prod-snapshot.json. Do not edit; edit the data file and regenerate.",
"asOf": "2026-09-23T20:30Z",
"generatedFrom": {
-- "OpenVibe.Live": "ca7cc87672602e35756b8b348559543efab1bc38",
-- "OpenVibe.Network": "09bf748b7f459ac127b3f4045085c20189d39dbb",
-- "OpenVibe.Shared": "c2726807c19505bc22d2bce794188a9d1516b022",
-- "OpenVibe.Media": "ad2217be56627efca799fd3ce0987d91cb6f3e24",
-- "OpenVibe.Tools": "5d1b42357392d47e5cc3f6bef3f22facdc6c23cd",
-- "OpenVibe.Community": "63b90a838d280aada7d6c98aee61335b972c1105",
-- "OpenVibe.Games": "7863fc6a71890b264c29ddd6bfa7e4c162da4883",
-- "OpenVibe.Sites": "d6e4cbd3a2091bb9970ee15504c7758da8a96a24",
-- "OpenVibe.Events": "efc09a795ea0fdea9e6eca04f20cc44362b91e3f",
-- "OpenVibe.Chat": "ed90461e2fd4537332275f6efec8bb878ce4ac2a",
-- "OpenRe.Stream": "c091a0959a6d727ec702ee589300cd42a0902be9",
-- "OpenVibe.Billing": "aa445d0c8b7351afae910b9572a2f9ae674e0914",
-- "OpenVibe.Tips": "f211c03ed01b58dd52d104bda8b07ce1a82da2db",
-- "OpenVibe.VIP": "fe7eaad183622f303d2ea1efde80d1674478d948",
-- "OpenVibe.AI": "3a480ac9f20ca018f5c2c8973f92d32dbe1a44cd",
-- "OpenVibe.Search": "a707e38f87a077bbf2f570537a89b2f890d45e22",
-- "OpenVibe.Sources": "2e986af27a5554fd01803daf9e55c726deded80d",
-- "OpenVibe.Wiki": "b4e70acdab789cefc24aa9b5ab2a40fecc7be9d5",
-- "OpenVibe.Blog": "95e99acdcf4610f244b64d8e34afcb8f394685d9",
-- "OpenVibe.News": "5b393d27ba4167910e8019874a92f3d5dbf455cb",
-- "OpenVibe.Reviews": "a7b50a6231c44271e0611df2e25e366a980a13c4",
-- "OpenVibe.Deals": "91ca2235e0a4c7018a0b0bf5f49ba1f32db6d018",
-- "OpenVibe.Coupons": "1c57c4743b016ecf6f72d8d03feb7f56806920a6",
-- "OpenVibe.Trade": "ddbc60c5e2f5ab16cfd17cd126803c9c24784662",
-- "OpenVibe.Codes": "51d23865f2630203cf734c019309c7ffc053f89c",
-- "OpenVibe.Host": "03dfcb32a9fecb85d509f5d92d0a166a26d86fe7",
-- "OpenVibe.Examples": "d5f4efc02165f42b9feac5d2743de6e6c75c27de"
++ "OpenVibe.Live": "12c1c11920027b5c511a2916bbe63aae699596e7",
++ "OpenVibe.Network": "26c0395dbd9b654cd53c9ba33d38255a5fc32d27",
++ "OpenVibe.Shared": "c7489fc8690967ffebcd9f0b45790e577b9fa468",
++ "OpenVibe.Media": "984e7ad9364971286ed1a9665159c5f304372344",
++ "OpenVibe.Tools": "b0aada2c3887b009176ceb934e7df98faa666cae",
++ "OpenVibe.Community": "e075d39907c6e9f6d02ae45a760b1052158417d5",
++ "OpenVibe.Games": "4e5bc50590375e514de14b9a0fa384a601f69b2a",
++ "OpenVibe.Sites": "63683d22217b0ddb7488b5e4b56932c37b426e28",
++ "OpenVibe.Events": "9f515142868af343b42c1c58faac1fd6805076fc",
++ "OpenVibe.Chat": "1ef6f992570328e6f7c8c7a8e5168226fb2987db",
++ "OpenRe.Stream": "e517ed43466184790187143c974313f1fe7125b3",
++ "OpenVibe.Billing": "42ad547a34d098e28e1ad9abb4ad6759fbac5bdb",
++ "OpenVibe.Tips": "847d22a7a0594881c3204b6aac48bacbfa6087ea",
++ "OpenVibe.VIP": "a0a8f7566414fd0c04da0ddbe5a6bcb1df624027",
++ "OpenVibe.AI": "a6d4f39b6562dbd70a343a7d1c61ad46f57c3826",
++ "OpenVibe.Search": "46035416946d065627a4ed1ec89b5b0ac7a302ec",
++ "OpenVibe.Sources": "cf003901ae1000a9f0e568d05390da2c36180dcc",
++ "OpenVibe.Wiki": "fe113b90321852c24f11f1d19905bd77fbe7f463",
++ "OpenVibe.Blog": "0784b429a1bdcc3c770abed5800ca5171ecb0cf2",
++ "OpenVibe.News": "42ce43b84b830ed37f8e02389f4bbdae20212510",
++ "OpenVibe.Reviews": "70de372e0c2826c061080826f192ca2d0a51c6a4",
++ "OpenVibe.Deals": "3910b58cd10a700a22c6c7129cd4c1c1e586cc95",
++ "OpenVibe.Coupons": "ae3a25ed5d4e33f81df1147940d8f3100d13513b",
++ "OpenVibe.Trade": "7f418d25e8ca7288a8cf09738e7c8b5609c2578b",
++ "OpenVibe.Codes": "a1294156cdb9aa3d82c15708c12509d805ff561f",
++ "OpenVibe.Host": "f8ac37d08425f0ff3779084db7146eb262576769",
++ "OpenVibe.Examples": "0bbe579f685cfe1b495699b0e69c7fbf6ee1f27c"
},
"prodSnapshot": {
"host": "openvibe-oregon",
@@@ -97,7 +97,7 @@
},
{
"key": "contract.todo-markers",
-- "value": "Live 14, Network 0, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0"
++ "value": "Live 14, Network 4, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0"
}
]
},
@@@ -283,7 +283,7 @@
"metrics": [
{
"key": "tests.OpenVibe.Tools",
-- "value": "16 test files"
++ "value": "39 test files"
}
]
},
@@@ -300,7 +300,7 @@
"metrics": [
{
"key": "tests.OpenVibe.Games",
-- "value": "68 test files"
++ "value": "69 test files"
}
]
},
@@@ -322,7 +322,7 @@
},
{
"key": "tests.OpenVibe.Host",
-- "value": "27 test files"
++ "value": "28 test files"
}
]
},
@@@ -404,11 +404,11 @@
"metrics": [
{
"key": "shared.pins",
-- "value": "23 repos pin a tagged openvibe-shared release (latest v1.5.0): OpenRe.Stream v1.2.1, AI v1.3.0, Billing v1.3.0, Blog v1.3.0, Codes v1.3.0, Community v1.3.0, Coupons v1.3.0, Deals v1.3.0, Events v1.3.0, Host v1.3.0, Live v1.4.0, Media v1.3.0, Network v1.4.0, News v1.3.0, Reviews v1.3.0, Search v1.3.0, Sites v1.0.0, Sources v1.3.0, Tips v1.3.0, Tools v1.4.0, Trade v1.3.0, VIP v1.3.0, Wiki v1.3.0"
++ "value": "23 repos pin a tagged openvibe-shared release (latest v1.5.1): OpenRe.Stream v1.5.1, AI v1.5.1, Billing v1.5.1, Blog v1.5.1, Codes v1.5.1, Community v1.5.1, Coupons v1.5.1, Deals v1.5.1, Events v1.5.1, Host v1.5.1, Live v1.5.1, Media v1.5.1, Network v1.5.1, News v1.5.1, Reviews v1.5.1, Search v1.5.1, Sites v1.5.1, Sources v1.5.1, Tips v1.5.1, Tools v1.5.1, Trade v1.5.1, VIP v1.5.1, Wiki v1.5.1"
},
{
"key": "shared.drift",
-- "value": "30 manifests unpinned or behind: OpenRe.Stream (v1.2.1), AI (v1.3.0), Billing (v1.3.0), Blog (v1.3.0), Codes (v1.3.0), Community (v1.3.0), Coupons (v1.3.0), Deals (v1.3.0), Events (v1.3.0), Host (v1.3.0), Live (v1.4.0), Media (v1.3.0), Network (v1.4.0), News (v1.3.0), Reviews (v1.3.0), Search (v1.3.0), Sites (v1.0.0), Sources (v1.3.0), Tips (v1.3.0), Tools/apps/audio (v1.4.0), Tools/apps/docs (v1.4.0), Tools/apps/food (v1.4.0), Tools/apps/gateway (v1.4.0), Tools/apps/img (v1.4.0), Tools/apps/maps (v1.4.0), Tools/apps/text (v1.4.0), Tools/apps/yt (v1.4.0), Trade (v1.3.0), VIP (v1.3.0), Wiki (v1.3.0)"
++ "value": "0 manifests unpinned or behind: none"
}
]
},
@@@ -449,7 +449,7 @@
"metrics": [
{
"key": "deploy.drift",
-- "value": "21 service(s) not running origin/main"
++ "value": "25 service(s) not running origin/main"
}
]
},
@@@ -1579,7 +1579,7 @@
"owner": "OpenVibe.Live (server/lineage/resolver.js, GET|POST /internal/lineage/resolve); contract in OpenVibe.Contracts",
"target": "shared lineage-resolver contract",
"status": "partial",
-- "summary": "The lineage-resolver contract exists (openvibe-contracts v0.32.0: lineage.resolve-request@1 -> lineage.resolution@1, capability live.lineage.resolve) and is implemented once in Live, deployed 2026-09-23 21:36 UTC: it answers which channel, and whose, a slug, nested slug, channel id, stream, slot, VOD, clip, Media object, owner subject or legacy id belongs to, in the roadmap's precedence, with explicit unresolved states (conflict, source_unavailable, display_name_only, not_found) and never from a display name; VODs, clips and objects come from Media. Live's clip owner check uses it. No other service calls it yet (no principal holds live.lineage.resolve), OpenRe sessions record no lineage, and Media objects still lack owner_subject.",
++ "summary": "The lineage-resolver contract exists (openvibe-contracts v0.32.0: lineage.resolve-request@1 -> lineage.resolution@1, capability live.lineage.resolve) and is implemented once in Live, deployed 2026-09-23 21:36 UTC: it answers which channel, and whose, a slug, nested slug, channel id, stream, slot, VOD, clip, Media object, owner subject or legacy id belongs to, in the roadmap's precedence, with explicit unresolved states (conflict, source_unavailable, display_name_only, not_found) and never from a display name; VODs, clips and objects come from Media. Live's clip owner check uses it. OpenRe, Media and Community hold live.lineage.resolve (2026-09-24) but do not call it yet; OpenRe sessions record no lineage. Media owner_subject is filled on all 3,034 owned objects (2026-09-23) with a 10-minute reconcile job for new ones.",
"artifacts": [
{
"kind": "doc",
@@@ -1607,9 +1607,8 @@
}
],
"remaining": [
-- "Grant live.lineage.resolve to the consumers (OpenRe, Media, Pulse, creator UI) once their contracts pin is 0.32.0+, and switch their per-product channel mappings to the resolver",
-- "Record VOD/clip lineage to OpenRe session (roadmap §20 'VOD lineage maps back to the canonical channel, stream and session'); no OpenRe session exists in production yet",
-- "Backfill Media owner_subject so the resolver has a subject for every object (Live now knows the subject of all 328 linked accounts)"
++ "Switch OpenRe, Media and Community (Pulse) channel mappings to the resolver: they hold live.lineage.resolve since 2026-09-24 (Network 80a841c) but still use their own mappings",
++ "Record VOD/clip lineage to OpenRe session (roadmap §20); no OpenRe session exists in production yet"
],
"blockedOn": null,
"ownerReview": false,
ddiff --git a/docs/roadmap-baseline/requirement-ledger.md b/docs/roadmap-baseline/requirement-ledger.md
iindex bbad3c88..6dd2be43 100644
---- a/docs/roadmap-baseline/requirement-ledger.md
++++ b/docs/roadmap-baseline/requirement-ledger.md
@@@ -51,7 +51,7 @@ Every run re-verifies each artifact: a test, doc or drill file must exist at ori
| [D17](#d17) | Live product | **partial** | OpenVibe.Live | 5/5 | Ingest transport: move RTMP slots to OpenRe (0 of 102 switched), then WHIP, JSMPEG and SFU, so Live stops binding 1935 and a Live deploy stops dropping streams |
| [D18](#d18) | Stream Manager | **blocked on owner** | OpenVibe.Live (Stream Manager UX) + OpenRe.Stream (control API) | 4/4 | Switch slots to OpenRe (OpenRe docs/cutover.md A7 rehearsal, then B1-B6 per slot) so the rebinding runs in production |
| [D19](#d19) | OpenRe | **partial** | OpenRe.Stream (runtime); OpenVibe.Live still ingests every slot | 5/5 | Cut slots over (0 of 102 switched; migrate-from-live.js never applied, migration_map 0) so OpenRe owns real sessions |
--| [D20](#d20) | Canonical resolver | **partial** | OpenVibe.Live (server/lineage/resolver.js, GET\|POST /internal/lineage/resolve); contract in OpenVibe.Contracts | 3/3 | Grant live.lineage.resolve to the consumers (OpenRe, Media, Pulse, creator UI) once their contracts pin is 0.32.0+, and switch their per-product channel mappings to the resolver |
++| [D20](#d20) | Canonical resolver | **partial** | OpenVibe.Live (server/lineage/resolver.js, GET\|POST /internal/lineage/resolve); contract in OpenVibe.Contracts | 3/3 | Switch OpenRe, Media and Community (Pulse) channel mappings to the resolver: they hold live.lineage.resolve since 2026-09-24 (Network 80a841c) but still use their own mappings |
| [D21](#d21) | Chat model | **partial** | OpenVibe.Chat (Live keeps 6 staged tables, media requests and calls) | 4/4 | Move call signalling and call state from Live's /ws/call into Chat |
| [D22](#d22) | Chat authorization | **partial** | OpenVibe.Chat (user identity still resolved by OpenVibe.Live) | 5/5 | Authenticate browsers in Chat from Network tokens and a central capability/staff map; today Chat's auth.js resolves users, roles and API-token scopes through Live (live-context.authenticate) |
| [D23](#d23) | Chat parity | **partial** | OpenVibe.Chat | 5/5 | Calls: move signalling to Chat with the pending\|ringing\|active\|ended\|missed\|declined\|failed lifecycle and an explicit failure state (roadmap §15.9, §20) |
@@@ -143,7 +143,7 @@ Remaining:
### D02-D04 Registry, capabilities, contracts: partial
--Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W1, W2. Measured this run: 1 charter-only repos of 36; Live 14, Network 0, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0.
++Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W1, W2. Measured this run: 1 charter-only repos of 36; Live 14, Network 4, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0.
#### D02
@@@ -555,7 +555,7 @@ Blocked on the owner: A7 rehearsal inputs (test account + real rtmp:// destinati
**Canonical resolver: partial**. Owner today: OpenVibe.Live (server/lineage/resolver.js, GET|POST /internal/lineage/resolve); contract in OpenVibe.Contracts. Target (§15.0): shared lineage-resolver contract.
--The lineage-resolver contract exists (openvibe-contracts v0.32.0: lineage.resolve-request@1 -> lineage.resolution@1, capability live.lineage.resolve) and is implemented once in Live, deployed 2026-09-23 21:36 UTC: it answers which channel, and whose, a slug, nested slug, channel id, stream, slot, VOD, clip, Media object, owner subject or legacy id belongs to, in the roadmap's precedence, with explicit unresolved states (conflict, source_unavailable, display_name_only, not_found) and never from a display name; VODs, clips and objects come from Media. Live's clip owner check uses it. No other service calls it yet (no principal holds live.lineage.resolve), OpenRe sessions record no lineage, and Media objects still lack owner_subject.
++The lineage-resolver contract exists (openvibe-contracts v0.32.0: lineage.resolve-request@1 -> lineage.resolution@1, capability live.lineage.resolve) and is implemented once in Live, deployed 2026-09-23 21:36 UTC: it answers which channel, and whose, a slug, nested slug, channel id, stream, slot, VOD, clip, Media object, owner subject or legacy id belongs to, in the roadmap's precedence, with explicit unresolved states (conflict, source_unavailable, display_name_only, not_found) and never from a display name; VODs, clips and objects come from Media. Live's clip owner check uses it. OpenRe, Media and Community hold live.lineage.resolve (2026-09-24) but do not call it yet; OpenRe sessions record no lineage. Media owner_subject is filled on all 3,034 owned objects (2026-09-23) with a 10-minute reconcile job for new ones.
Acceptance artifacts:
@@@ -565,9 +565,8 @@ Acceptance artifacts:
Remaining:
--- Grant live.lineage.resolve to the consumers (OpenRe, Media, Pulse, creator UI) once their contracts pin is 0.32.0+, and switch their per-product channel mappings to the resolver
--- Record VOD/clip lineage to OpenRe session (roadmap §20 'VOD lineage maps back to the canonical channel, stream and session'); no OpenRe session exists in production yet
--- Backfill Media owner_subject so the resolver has a subject for every object (Live now knows the subject of all 328 linked accounts)
++- Switch OpenRe, Media and Community (Pulse) channel mappings to the resolver: they hold live.lineage.resolve since 2026-09-24 (Network 80a841c) but still use their own mappings
++- Record VOD/clip lineage to OpenRe session (roadmap §20); no OpenRe session exists in production yet
### D21-D23 Chat: partial
@@@ -789,7 +788,7 @@ Blocked on the owner: Owner: the Billing cutover prerequisites: the PowerChat we
### D31 Tools: partial
--Roadmap §3.2 (W0, 2026-09-22): built. Waves: W11. Measured this run: 16 test files.
++Roadmap §3.2 (W0, 2026-09-22): built. Waves: W11. Measured this run: 39 test files.
#### D31
@@@ -817,7 +816,7 @@ Blocked on the owner: Owner: supply YT_PROXY or YT_COOKIES_FILE for the YouTube
### D32 Games: partial
--Roadmap §3.2 (W0, 2026-09-22): built. Waves: W12. Measured this run: 68 test files.
++Roadmap §3.2 (W0, 2026-09-22): built. Waves: W12. Measured this run: 69 test files.
#### D32
@@@ -845,7 +844,7 @@ Blocked on the owner: Owner: accept ADR-013's trust-tier names (unreviewed/revie
### D33-D34 Codes, Host: partial
--Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 19 test files; 27 test files.
++Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 19 test files; 28 test files.
#### D33
@@@ -1076,7 +1075,7 @@ Blocked on the owner: Open 1936/tcp at the host firewall and at the provider edg
### D42 Shared component architecture: partial
--Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W2, Track R. Measured this run: 23 repos pin a tagged openvibe-shared release (latest v1.5.0): OpenRe.Stream v1.2.1, AI v1.3.0, Billing v1.3.0, Blog v1.3.0, Codes v1.3.0, Community v1.3.0, Coupons v1.3.0, Deals v1.3.0, Events v1.3.0, Host v1.3.0, Live v1.4.0, Media v1.3.0, Network v1.4.0, News v1.3.0, Reviews v1.3.0, Search v1.3.0, Sites v1.0.0, Sources v1.3.0, Tips v1.3.0, Tools v1.4.0, Trade v1.3.0, VIP v1.3.0, Wiki v1.3.0; 30 manifests unpinned or behind: OpenRe.Stream (v1.2.1), AI (v1.3.0), Billing (v1.3.0), Blog (v1.3.0), Codes (v1.3.0), Community (v1.3.0), Coupons (v1.3.0), Deals (v1.3.0), Events (v1.3.0), Host (v1.3.0), Live (v1.4.0), Media (v1.3.0), Network (v1.4.0), News (v1.3.0), Reviews (v1.3.0), Search (v1.3.0), Sites (v1.0.0), Sources (v1.3.0), Tips (v1.3.0), Tools/apps/audio (v1.4.0), Tools/apps/docs (v1.4.0), Tools/apps/food (v1.4.0), Tools/apps/gateway (v1.4.0), Tools/apps/img (v1.4.0), Tools/apps/maps (v1.4.0), Tools/apps/text (v1.4.0), Tools/apps/yt (v1.4.0), Trade (v1.3.0), VIP (v1.3.0), Wiki (v1.3.0).
++Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W2, Track R. Measured this run: 23 repos pin a tagged openvibe-shared release (latest v1.5.1): OpenRe.Stream v1.5.1, AI v1.5.1, Billing v1.5.1, Blog v1.5.1, Codes v1.5.1, Community v1.5.1, Coupons v1.5.1, Deals v1.5.1, Events v1.5.1, Host v1.5.1, Live v1.5.1, Media v1.5.1, Network v1.5.1, News v1.5.1, Reviews v1.5.1, Search v1.5.1, Sites v1.5.1, Sources v1.5.1, Tips v1.5.1, Tools v1.5.1, Trade v1.5.1, VIP v1.5.1, Wiki v1.5.1; 0 manifests unpinned or behind: none.
#### D42
@@@ -1157,7 +1156,7 @@ Remaining:
### D45 Release compatibility and recovery: partial
--Roadmap §3.2 (W0, 2026-09-22): absent. Waves: Track R, W22. Measured this run: 21 service(s) not running origin/main.
++Roadmap §3.2 (W0, 2026-09-22): absent. Waves: Track R, W22. Measured this run: 25 service(s) not running origin/main.
#### D45