openvibers/openvibe.network Commits
Wave 0 baseline: regenerate after the Wave 5 paste cutover (Community owns pastes; Media paste writes frozen)
Changes
@@@ -8,23 +8,23 @@ Deliverable 1: runtimes, ports, units, env files and repository state.| Service | Repo | Stage | Ports | Units | Env file | Deployed | Databases ||---|---|---|---|---|---|---|---|--| network | OpenVibe.Network | live | http 4000 | openvibe-network.service | /etc/openvibe/network.env | 9b4e262 | data/network.db |--| live | OpenVibe.Live | live | http 3000, rtmp 1935/9935, mediasoup 11000-11300/udp, jsmpegRelayTls 9710-9789 | openvibe-live.socket, openvibe-live.service | /etc/openvibe/live.env | 24151bd | data/live.db, data/analytics.db, data/rs-companion.db |--| media | OpenVibe.Media | partial | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | 6114bc6 | data/media.db |++| network | OpenVibe.Network | live | http 4000 | openvibe-network.service | /etc/openvibe/network.env | 1b79576 | data/network.db |++| live | OpenVibe.Live | live | http 3000, rtmp 1935/9935, mediasoup 11000-11300/udp, jsmpegRelayTls 9710-9789 | openvibe-live.socket, openvibe-live.service | /etc/openvibe/live.env | e266060 | data/live.db, data/analytics.db, data/rs-companion.db |++| media | OpenVibe.Media | partial | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | ddfefcf | data/media.db || tools | OpenVibe.Tools | live | gateway 4001, maps 4010, food 4011, img 4012, yt 4013, audio 4014, text 4015, docs 4016 | openvibe-tools.service, openvibe-tools-maps.service, openvibe-tools-food.service, openvibe-tools-img.service, openvibe-tools-yt.service, openvibe-tools-audio.service, openvibe-tools-text.service, openvibe-tools-docs.service | /etc/openvibe/tools.env | 0346edc | apps/<satellite>/data/analytics.db || games | OpenVibe.Games | live | http 8000 | openvibe-games.service | /etc/openvibe/games.env | 43c11f0 | data/world.db |--| community | OpenVibe.Community | partial | http 4200 | openvibe-community.service | /etc/openvibe/community.env | de947ea | none |++| community | OpenVibe.Community | partial | http 4200 | openvibe-community.service | /etc/openvibe/community.env | d7c6e60 | none || sites | OpenVibe.Sites | placeholder-host | | - | - | 185014f | none |## Scanned repositories| Repo | HEAD | origin/main | Source files | LOC | Test files | CI | Routes | Tables | WS servers | Timers/jobs | TODO(contract) ||---|---|---|---|---|---|---|---|---|---|---|---|--| OpenVibe.Live | 24151bd | 24151bd | 165 | 69699 | 56 | no | 532 | 125 | 8 | 48 | 15 |--| OpenVibe.Network | 9b4e262 | 9b4e262 | 79 | 20646 | 18 | no | 187 | 36 | 0 | 11 | 0 |--| OpenVibe.Media | 6114bc6 | 6114bc6 | 28 | 8702 | 4 | no | 67 | 15 | 0 | 9 | 0 |++| OpenVibe.Live | e266060 | e266060 | 167 | 69978 | 58 | yes | 537 | 125 | 8 | 48 | 15 |++| OpenVibe.Network | 1b79576 | 1b79576 | 81 | 21029 | 20 | yes | 197 | 39 | 0 | 11 | 0 |++| OpenVibe.Media | ddfefcf | ddfefcf | 28 | 8752 | 6 | yes | 67 | 15 | 0 | 9 | 0 || OpenVibe.Tools | 0346edc | 0346edc | 117 | 20018 | 2 | no | 99 | 4 | 0 | 12 | 0 |--| OpenVibe.Community | de947ea | de947ea | 11 | 1754 | 8 | no | 22 | 4 | 0 | 0 | 0 |++| OpenVibe.Community | d7c6e60 | d7c6e60 | 21 | 3950 | 14 | yes | 47 | 13 | 0 | 1 | 0 || OpenVibe.Games | 5710287 | 5710287 | 101 | 18511 | 56 | no | 21 | 5 | 2 | 2 | 0 || OpenVibe.Sites | 185014f | 185014f | 1 | 306 | 0 | no | 0 | 0 | 0 | 0 | 0 |@@@ -43,17 +43,17 @@ LOC counts non-test source files in the scanned directories only (`server/`, `ap| OpenVibe.Blog | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds. || OpenVibe.Chat | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation. || OpenVibe.Codes | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance. |--| OpenVibe.Community | PUBLIC | - | 2026-09-21 | 687 KB | |--| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-22 | 13 KB | Machine-readable contracts for the whole OpenVibe network. |++| OpenVibe.Community | PUBLIC | - | 2026-09-22 | 689 KB | |++| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-22 | 89 KB | Machine-readable contracts for the whole OpenVibe network. || OpenVibe.Coupons | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Coupon codes with merchant matching, restrictions, expiry and real-people validity reports. || OpenVibe.Deals | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Deals submitted and voted on by the community, with source, price and freshness always shown. || OpenVibe.Events | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Durable events, subscriptions, delivery, retry, dead letters and replay for the network. || OpenVibe.Examples | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Executable public integration examples, tested in CI against the platform. || OpenVibe.Games | PUBLIC | - | 2026-09-21 | 4675 KB | || OpenVibe.Host | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The network's deployment/control plane first; then isolated hosting for community sites, bots and mods. |--| OpenVibe.Live | PUBLIC | - | 2026-09-22 | 6455 KB | |--| OpenVibe.Media | PUBLIC | - | 2026-09-21 | 847 KB | |--| OpenVibe.Network | PUBLIC | - | 2026-09-22 | 1037 KB | |++| OpenVibe.Live | PUBLIC | - | 2026-09-22 | 6507 KB | |++| OpenVibe.Media | PUBLIC | - | 2026-09-22 | 847 KB | |++| OpenVibe.Network | PUBLIC | - | 2026-09-22 | 1306 KB | || OpenVibe.News | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Source-backed stories: clustered coverage, cited summaries, perspectives and timelines. || OpenVibe.Realtime | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Browser delivery plane for events: authorised WS/SSE topics with cursors, resume and presence. || OpenVibe.Reviews | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Review signals gathered across sources with provenance, entity resolution and honest aggregates. |@@@ -8,6 +8,7 @@ Deliverable 2: every table declared in code or present in production, with curre| File | Size | Tables ||---|---|---|++| /opt/openvibe.community/data/community.db | 115 KB | 9 || /opt/openvibe.games/data/world.db | 74 KB | 5 || /opt/openvibe.live/data/backups/live-pre-643a2e6.db | 264.7 MB | 145 || /opt/openvibe.live/data/openvibe.db | 0 B | 0 |@@@ -16,7 +17,7 @@ Deliverable 2: every table declared in code or present in production, with curre| /opt/openvibe.live/data/live.db | 279.2 MB | 146 || /opt/openvibe.live/data/rs-companion.db | 8.6 MB | 33 || /opt/openvibe.media/data/media.db | 5.6 MB | 11 |--| /opt/openvibe.network/data/network.db | 766.5 MB | 35 |++| /opt/openvibe.network/data/network.db | 766.5 MB | 38 || /opt/openvibe.tools/apps/audio/data/analytics.db | 59.9 MB | 4 || /opt/openvibe.tools/apps/img/data/analytics.db | 5.5 MB | 4 || /opt/openvibe.tools/apps/docs/data/analytics.db | 1.5 MB | 4 |@@@ -216,7 +217,7 @@ Deliverable 2: every table declared in code or present in production, with curre| watch_time | server/db/schema.sql:706 | live.db | OpenVibe.Live | keep | - || woodcut_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |--## OpenVibe.Network (36)++## OpenVibe.Network (39)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|@@@ -243,14 +244,17 @@ Deliverable 2: every table declared in code or present in production, with curre| oauth_codes | server/db/database.js:144 | network.db | OpenVibe.Network | keep | W1 (module split) || oauth_tokens | server/db/database.js:158 | network.db | OpenVibe.Network | keep | W1 (module split) || password_reset_tokens | server/db/database.js:321 | network.db | OpenVibe.Network | keep | W1 (module split) |++| principal_grants | server/identity/principals.js:44 | network.db | OpenVibe.Network | keep | W1 (module split) |++| principal_usage | server/identity/principals.js:54 | network.db | OpenVibe.Network | keep | W1 (module split) || push_subscriptions | server/db/database.js:460 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) || site_settings | server/db/database.js:238 | network.db | OpenVibe.Network | keep | - |--| stream_live_announcements | server/internal/routes.js:310 | network.db | OpenVibe.Events | extract | W3 |++| stream_live_announcements | server/internal/routes.js:325 | network.db | OpenVibe.Events | extract | W3 || themes | server/db/database.js:183 | network.db | OpenVibe.Network | keep | W1 (module split) || tool_domains | server/domains/routes.js:44 | network.db | OpenVibe.Network | keep | W1 (module split) || url_registry | server/db/database.js:245, server/url-registry.js:7 | network.db | OpenVibe.Network | keep | W1 (module split) || user_effects | server/db/database.js:375 | network.db | OpenVibe.Network | keep | W1 (module split) || user_history | server/history/routes.js:26 | network.db | OpenVibe.Network | keep | W1 (module split) |++| user_modules | server/identity/modules.js:24 | network.db | OpenVibe.Network | keep | W1 (module split) || user_preferences | server/db/database.js:172 | network.db | OpenVibe.Network | keep | W1 (module split) || user_sessions | server/db/database.js:354 | network.db | OpenVibe.Network | keep | W1 (module split) || users | server/db/database.js:113 | network.db | OpenVibe.Network | keep | W1 (module split) |@@@ -286,7 +290,7 @@ Deliverable 2: every table declared in code or present in production, with curre| analytics_hourly | vendor/openvibe-shared/analytics.js:98 | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 || analytics_rate_tracking | vendor/openvibe-shared/analytics.js:137 | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 |--## OpenVibe.Community (4)++## OpenVibe.Community (13)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|@@@ -294,6 +298,15 @@ Deliverable 2: every table declared in code or present in production, with curre| analytics_events | vendor/openvibe-shared/analytics.js:74 | no | OpenVibe.Community | keep | Track O / ADR-021 || analytics_hourly | vendor/openvibe-shared/analytics.js:98 | no | OpenVibe.Community | keep | Track O / ADR-021 || analytics_rate_tracking | vendor/openvibe-shared/analytics.js:137 | no | OpenVibe.Community | keep | Track O / ADR-021 |++| import_hold | server/db.js:125 | community.db | OpenVibe.Community | keep | W5 |++| legacy_id_map | server/db.js:116 | community.db | OpenVibe.Community | keep | W5 |++| migration_runs | server/db.js:108 | community.db | OpenVibe.Community | keep | W5 |++| paste_comments | server/db.js:72 | community.db | OpenVibe.Community | keep | W5 |++| paste_likes | server/db.js:65 | community.db | OpenVibe.Community | keep | W5 |++| paste_versions | server/db.js:54 | community.db | OpenVibe.Community | keep | W5 |++| paste_visits | server/db.js:88 | community.db | OpenVibe.Community | keep | W5 |++| pastes | server/db.js:18 | community.db | OpenVibe.Community | keep | W5 |++| subject_projection | server/db.js:98 | community.db | OpenVibe.Community | keep | W5 |## OpenVibe.Games (5)@@@ -8,11 +8,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| Repo | Routes | GET | POST | PUT/PATCH | DELETE | Other | /internal/* ||---|---|---|---|---|---|---|---|--| OpenVibe.Live | 532 | 274 | 160 | 50 | 47 | 1 | 6 |--| OpenVibe.Network | 187 | 81 | 70 | 22 | 14 | 0 | 27 |++| OpenVibe.Live | 537 | 275 | 163 | 50 | 48 | 1 | 6 |++| OpenVibe.Network | 197 | 86 | 72 | 24 | 15 | 0 | 30 || OpenVibe.Media | 67 | 28 | 27 | 4 | 8 | 0 | 1 || OpenVibe.Tools | 99 | 84 | 12 | 0 | 2 | 1 | 0 |--| OpenVibe.Community | 22 | 19 | 3 | 0 | 0 | 0 | 0 |++| OpenVibe.Community | 47 | 30 | 13 | 1 | 3 | 0 | 0 || OpenVibe.Games | 21 | 0 | 3 | 0 | 0 | 18 | 0 |@@@ -359,6 +359,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| GET | /api/pastes/:slug | server/media-proxy/pastes.js:215 || PUT | /api/pastes/:slug | server/media-proxy/pastes.js:216 || POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:222 |++| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:315 || GET | /api/pastes/:slug/comments | server/media-proxy/pastes.js:243 || POST | /api/pastes/:slug/comments | server/media-proxy/pastes.js:246 || DELETE | /api/pastes/:slug/comments/:commentId | server/media-proxy/pastes.js:248 |@@@ -366,10 +367,14 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| POST | /api/pastes/:slug/fork | server/media-proxy/pastes.js:238 || POST | /api/pastes/:slug/like | server/media-proxy/pastes.js:241 || GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:240 |++| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:311 || POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:110 |++| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:296 || DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:171 |++| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:313 || GET | /api/pastes/admin/stats | server/media-proxy/pastes.js:170 || POST | /api/pastes/bulk | server/media-proxy/pastes.js:172 |++| POST | /api/pastes/bulk | server/media-proxy/pastes.js:314 || GET | /api/pastes/by-user/:username | server/media-proxy/pastes.js:177 || GET | /api/pastes/config | server/media-proxy/pastes.js:169 || POST | /api/pastes/screenshot | server/media-proxy/pastes.js:83 |@@@ -563,7 +568,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| PUT | / | server/discord/routes.js:33 || POST | /:id/dismiss | server/notifications/routes.js:100 || POST | /:id/read | server/notifications/routes.js:67 |--| GET | /.well-known/web-identity | server/index.js:572 |++| GET | /.well-known/web-identity | server/index.js:574 || POST | /admin | server/setup/routes.js:114 || GET | /api/.well-known/jwks | server/index.js:356 || GET | /api/admin/domains | server/domains/routes.js:176 |@@@ -573,7 +578,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| PUT | /api/admin/domains/:id | server/domains/routes.js:238 || GET | /api/admin/domains/catalog | server/domains/routes.js:206 || POST | /api/admin/domains/check | server/domains/routes.js:217 |--| GET | /api/admin/ssh-info | server/index.js:452 |++| GET | /api/admin/ssh-info | server/index.js:454 || GET | /api/auth/anon-identities | server/auth/routes.js:638 || POST | /api/auth/anon-session | server/auth/routes.js:515 || GET | /api/auth/anon/:token | server/auth/routes.js:585 |@@@ -604,7 +609,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| DELETE | /api/auth/users/:id/follow | server/auth/routes.js:814 || POST | /api/auth/users/:id/follow | server/auth/routes.js:783 || GET | /api/brand | server/index.js:373 |--| GET | /api/catalog.json | server/index.js:423 |++| GET | /api/catalog.json | server/index.js:425 || GET | /api/chrome | server/chrome/service.js:137 || POST | /api/chrome/hit | server/chrome/service.js:150 || GET | /api/domains | server/domains/routes.js:176 |@@@ -620,6 +625,13 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| POST | /api/history | server/history/routes.js:108 || DELETE | /api/history/:id | server/history/routes.js:148 || PUT | /api/history/settings | server/history/routes.js:137 |++| GET | /api/modules | server/identity/modules.js:101 |++| DELETE | /api/modules/:ns | server/identity/modules.js:126 |++| GET | /api/modules/:ns | server/identity/modules.js:109 |++| PUT | /api/modules/:ns | server/identity/modules.js:117 |++| GET | /api/modules/:ns/public/:subject | server/identity/modules.js:93 |++| GET | /api/modules/modules/:ns/:subject | server/identity/modules.js:140 |++| PUT | /api/modules/modules/:ns/:subject | server/identity/modules.js:149 || DELETE | /api/profile/avatar | server/profile/avatar.js:107 || PUT | /api/profile/avatar | server/profile/avatar.js:96 || GET | /api/profile/avatar/:username | server/profile/avatar.js:110 |@@@ -628,7 +640,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| POST | /api/push/subscribe | server/push/routes.js:17 || POST | /api/push/unsubscribe | server/push/routes.js:29 || GET | /api/push/vapid-key | server/push/routes.js:10 |--| GET | /api/sso/targets | server/index.js:405 |++| GET | /api/sso/targets | server/index.js:407 || GET | /api/themes | server/themes/routes.js:41 || POST | /api/themes | server/themes/routes.js:148 || GET | /api/themes/:idOrSlug | server/themes/routes.js:109 |@@@ -664,34 +676,37 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| POST | /fedcm/disconnect | server/auth/fedcm.js:142 || GET | /health | server/admin/routes.js:766 || POST | /identity | server/setup/routes.js:152 |--| GET | /internal/anon-admin | server/internal/routes.js:628 |--| GET | /internal/anon-list | server/internal/routes.js:677 |--| POST | /internal/audit | server/internal/routes.js:166 |--| POST | /internal/coins/credit | server/internal/routes.js:252 |--| POST | /internal/coins/debit | server/internal/routes.js:264 |--| GET | /internal/coins/stats | server/internal/routes.js:214 |--| POST | /internal/coins/transfer | server/internal/routes.js:277 |--| POST | /internal/events/stream-live | server/internal/routes.js:294 |--| POST | /internal/identity/legacy-map | server/identity/internal-routes.js:29 |++| GET | /internal/anon-admin | server/internal/routes.js:643 |++| GET | /internal/anon-list | server/internal/routes.js:692 |++| POST | /internal/audit | server/internal/routes.js:178 |++| POST | /internal/coins/credit | server/internal/routes.js:267 |++| POST | /internal/coins/debit | server/internal/routes.js:279 |++| GET | /internal/coins/stats | server/internal/routes.js:226 |++| POST | /internal/coins/transfer | server/internal/routes.js:292 |++| POST | /internal/events/stream-live | server/internal/routes.js:309 |++| POST | /internal/identity/legacy-map | server/identity/internal-routes.js:52 || GET | /internal/identity/resolve | server/identity/internal-routes.js:18 |--| POST | /internal/issue-token | server/internal/routes.js:518 |--| POST | /internal/link-account | server/internal/routes.js:108 |--| POST | /internal/notifications/mark-read | server/internal/routes.js:479 |--| POST | /internal/notifications/push | server/internal/routes.js:421 |--| POST | /internal/notifications/push-bulk | server/internal/routes.js:441 |--| POST | /internal/notifications/resolve-users | server/internal/routes.js:498 |--| GET | /internal/notifications/unread/:userId | server/internal/routes.js:464 |--| POST | /internal/resolve-anon | server/internal/routes.js:549 |--| GET | /internal/stats | server/internal/routes.js:175 |--| GET | /internal/url-registry/resolved | server/internal/routes.js:184 |--| POST | /internal/user-avatar | server/internal/routes.js:151 |--| GET | /internal/users/:id | server/internal/routes.js:59 |--| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:159 |--| GET | /internal/users/:id/theme | server/internal/routes.js:96 |--| POST | /internal/users/bulk | server/internal/routes.js:81 |--| GET | /internal/users/by-username/:username | server/internal/routes.js:70 |--| POST | /internal/verify-token | server/internal/routes.js:37 |--| GET | /llms.txt | server/index.js:550 |++| GET | /internal/identity/resolve | server/internal/routes.js:40 |++| POST | /internal/identity/resolve-batch | server/identity/internal-routes.js:35 |++| POST | /internal/identity/resolve-batch | server/internal/routes.js:41 |++| POST | /internal/issue-token | server/internal/routes.js:533 |++| POST | /internal/link-account | server/internal/routes.js:120 |++| POST | /internal/notifications/mark-read | server/internal/routes.js:494 |++| POST | /internal/notifications/push | server/internal/routes.js:436 |++| POST | /internal/notifications/push-bulk | server/internal/routes.js:456 |++| POST | /internal/notifications/resolve-users | server/internal/routes.js:513 |++| GET | /internal/notifications/unread/:userId | server/internal/routes.js:479 |++| POST | /internal/resolve-anon | server/internal/routes.js:564 |++| GET | /internal/stats | server/internal/routes.js:187 |++| GET | /internal/url-registry/resolved | server/internal/routes.js:196 |++| POST | /internal/user-avatar | server/internal/routes.js:163 |++| GET | /internal/users/:id | server/internal/routes.js:71 |++| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:171 |++| GET | /internal/users/:id/theme | server/internal/routes.js:108 |++| POST | /internal/users/bulk | server/internal/routes.js:93 |++| GET | /internal/users/by-username/:username | server/internal/routes.js:82 |++| POST | /internal/verify-token | server/internal/routes.js:49 |++| GET | /llms.txt | server/index.js:552 || GET | /me | server/coins/routes.js:18 || GET | /me/history | server/coins/routes.js:24 || GET | /net-config | server/admin/routes.js:907 |@@@ -702,11 +717,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| GET | /nginx/preview/:serviceId | server/deploy/routes.js:314 || POST | /nginx/reload | server/deploy/routes.js:382 || POST | /nginx/validate | server/deploy/routes.js:330 |--| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:306 |--| GET | /oauth/authorize | server/auth/oauth-routes.js:21 |--| POST | /oauth/confirm | server/auth/oauth-routes.js:79 |--| POST | /oauth/token | server/auth/oauth-routes.js:132 |--| GET | /openvibe-sw.js | server/index.js:596 |++| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:318 |++| GET | /oauth/authorize | server/auth/oauth-routes.js:22 |++| POST | /oauth/confirm | server/auth/oauth-routes.js:80 |++| POST | /oauth/token | server/auth/oauth-routes.js:133 |++| GET | /openvibe-sw.js | server/index.js:598 || GET | /overview | server/admin/analytics-routes.js:75 || GET | /preferences | server/notifications/routes.js:121 || PUT | /preferences | server/notifications/routes.js:132 |@@@ -720,11 +735,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| GET | /service/:name | server/admin/analytics-routes.js:224 || GET | /settings | server/admin/routes.js:300 || PUT | /settings | server/admin/routes.js:328 |--| GET | /sso/check | server/index.js:577 |++| GET | /sso/check | server/index.js:579 || GET | /status | server/setup/routes.js:91 || POST | /test | server/discord/routes.js:77 || POST | /test-live | server/discord/routes.js:87 |--| GET | /tos | server/index.js:419 |++| GET | /tos | server/index.js:421 || GET | /unread-by-category | server/notifications/routes.js:47 || GET | /unread-count | server/notifications/routes.js:37 || GET | /url-registry | server/admin/routes.js:353 |@@@ -743,7 +758,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| GET | /verification-keys | server/admin/routes.js:824 || POST | /verification-keys | server/admin/routes.js:833 || DELETE | /verification-keys/:id | server/admin/routes.js:881 |--| GET | /verify-email | server/index.js:562 |++| GET | /verify-email | server/index.js:564 |## OpenVibe.Media@@@ -771,26 +786,26 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| POST | /api/v1/:app/files | server/files/routes.js:75 || DELETE | /api/v1/:app/files/:key | server/files/routes.js:167 || GET | /api/v1/:app/files/:key | server/files/routes.js:156 |--| GET | /api/v1/:app/pastes | server/pastes/routes.js:248 |--| POST | /api/v1/:app/pastes | server/pastes/routes.js:462 |--| DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:616 |--| GET | /api/v1/:app/pastes/:slug | server/pastes/routes.js:436 |--| PUT | /api/v1/:app/pastes/:slug | server/pastes/routes.js:578 |--| POST | /api/v1/:app/pastes/:slug/ai | server/pastes/routes.js:558 |--| POST | /api/v1/:app/pastes/:slug/censor | server/pastes/routes.js:397 |--| GET | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:702 |--| POST | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:725 |--| DELETE | /api/v1/:app/pastes/:slug/comments/:commentId | server/pastes/routes.js:803 |--| POST | /api/v1/:app/pastes/:slug/copy | server/pastes/routes.js:677 |--| POST | /api/v1/:app/pastes/:slug/fork | server/pastes/routes.js:634 |--| POST | /api/v1/:app/pastes/:slug/like | server/pastes/routes.js:660 |--| DELETE | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:359 |--| GET | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:339 |--| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:329 |--| POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:372 |--| GET | /api/v1/:app/pastes/config | server/pastes/routes.js:307 |--| GET | /api/v1/:app/stats | server/index.js:93 |--| GET | /api/v1/:app/stats/series/:metric | server/index.js:103 |++| GET | /api/v1/:app/pastes | server/pastes/routes.js:257 |++| POST | /api/v1/:app/pastes | server/pastes/routes.js:471 |++| DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:625 |++| GET | /api/v1/:app/pastes/:slug | server/pastes/routes.js:445 |++| PUT | /api/v1/:app/pastes/:slug | server/pastes/routes.js:587 |++| POST | /api/v1/:app/pastes/:slug/ai | server/pastes/routes.js:567 |++| POST | /api/v1/:app/pastes/:slug/censor | server/pastes/routes.js:406 |++| GET | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:711 |++| POST | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:734 |++| DELETE | /api/v1/:app/pastes/:slug/comments/:commentId | server/pastes/routes.js:812 |++| POST | /api/v1/:app/pastes/:slug/copy | server/pastes/routes.js:686 |++| POST | /api/v1/:app/pastes/:slug/fork | server/pastes/routes.js:643 |++| POST | /api/v1/:app/pastes/:slug/like | server/pastes/routes.js:669 |++| DELETE | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:368 |++| GET | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:348 |++| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:338 |++| POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:381 |++| GET | /api/v1/:app/pastes/config | server/pastes/routes.js:316 |++| GET | /api/v1/:app/stats | server/index.js:94 |++| GET | /api/v1/:app/stats/series/:metric | server/index.js:104 || POST | /api/v1/:app/thumbnails/:kind/:id | server/thumbnails/routes.js:38 || GET | /api/v1/:app/views | server/views/routes.js:39 || POST | /api/v1/:app/views | server/views/routes.js:24 |@@@ -812,10 +827,10 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| GET | /auth/logout | server/user-auth.js:355 || GET | /auth/me | server/user-auth.js:379 || POST | /auth/refresh | server/user-auth.js:389 |--| GET | /healthz | server/index.js:82 |--| POST | /internal/avatar-ingest | server/index.js:56 |--| GET | /manifest.webmanifest | server/index.js:44 |--| GET | /tos | server/index.js:41 |++| GET | /healthz | server/index.js:83 |++| POST | /internal/avatar-ingest | server/index.js:57 |++| GET | /manifest.webmanifest | server/index.js:45 |++| GET | /tos | server/index.js:42 |## OpenVibe.Tools@@@ -925,28 +940,53 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| Method | Path | Source ||---|---|---|--| GET | / | server/app.js:106 |--| GET | /api/health | server/app.js:81 |--| GET | /api/ready | server/app.js:82 |--| GET | /callback | server/auth/routes.js:281 |--| POST | /fedcm | server/auth/routes.js:327 |--| GET | /feed.xml | server/app.js:99 |--| GET | /login | server/auth/routes.js:259 |--| GET | /logout | server/auth/routes.js:355 |--| GET | /me | server/auth/routes.js:379 |--| GET | /my | server/app.js:186 |--| GET | /new | server/app.js:150 |--| POST | /new | server/app.js:159 |--| GET | /p/:slug | server/app.js:119 |--| GET | /p/:slug/download | server/app.js:138 |--| GET | /p/:slug/raw | server/app.js:135 |--| GET | /p/:slug/screenshot | server/app.js:136 |--| GET | /pastes | server/app.js:111 |--| GET | /pastes/:slug | server/app.js:117 |--| POST | /refresh | server/auth/routes.js:389 |--| GET | /robots.txt | server/app.js:97 |--| GET | /sitemap.xml | server/app.js:98 |--| GET | /tos | server/app.js:75 |++| GET | / | server/app.js:146 |++| GET | /api/health | server/app.js:120 |++| GET | /api/pastes | server/pastes/api.js:102 |++| POST | /api/pastes | server/pastes/api.js:106 |++| DELETE | /api/pastes/:slug | server/pastes/api.js:124 |++| GET | /api/pastes/:slug | server/pastes/api.js:122 |++| PUT | /api/pastes/:slug | server/pastes/api.js:123 |++| POST | /api/pastes/:slug/ai | server/pastes/api.js:127 |++| POST | /api/pastes/:slug/censor | server/pastes/api.js:126 |++| GET | /api/pastes/:slug/comments | server/pastes/api.js:136 |++| POST | /api/pastes/:slug/comments | server/pastes/api.js:137 |++| DELETE | /api/pastes/:slug/comments/:commentId | server/pastes/api.js:140 |++| POST | /api/pastes/:slug/copy | server/pastes/api.js:134 |++| POST | /api/pastes/:slug/fork | server/pastes/api.js:132 |++| POST | /api/pastes/:slug/like | server/pastes/api.js:133 |++| GET | /api/pastes/:slug/raw | server/pastes/api.js:129 |++| POST | /api/pastes/:slug/set-avatar | server/pastes/api.js:143 |++| GET | /api/pastes/:slug/versions | server/pastes/api.js:130 |++| DELETE | /api/pastes/admin/forks | server/pastes/api.js:113 |++| GET | /api/pastes/admin/forks | server/pastes/api.js:112 |++| GET | /api/pastes/admin/stats | server/pastes/api.js:111 |++| POST | /api/pastes/bulk | server/pastes/api.js:114 |++| GET | /api/pastes/by-user/:username | server/pastes/api.js:119 |++| GET | /api/pastes/config | server/pastes/api.js:109 |++| POST | /api/pastes/screenshot | server/pastes/api.js:116 |++| GET | /api/ready | server/app.js:121 |++| GET | /callback | server/auth/routes.js:289 |++| POST | /fedcm | server/auth/routes.js:335 |++| GET | /feed.xml | server/app.js:138 |++| GET | /login | server/auth/routes.js:267 |++| GET | /logout | server/auth/routes.js:363 |++| GET | /me | server/auth/routes.js:387 |++| GET | /my | server/app.js:252 |++| GET | /new | server/app.js:214 |++| POST | /new | server/app.js:225 |++| GET | /p/:slug | server/app.js:159 |++| GET | /p/:slug/download | server/app.js:202 |++| GET | /p/:slug/raw | server/app.js:178 |++| GET | /p/:slug/raw | server/app.js:198 |++| GET | /p/:slug/screenshot | server/app.js:191 |++| GET | /p/:slug/screenshot | server/app.js:199 |++| GET | /pastes | server/app.js:151 |++| GET | /pastes/:slug | server/app.js:157 |++| POST | /refresh | server/auth/routes.js:397 |++| GET | /robots.txt | server/app.js:136 |++| GET | /sitemap.xml | server/app.js:137 |++| GET | /tos | server/app.js:82 |## OpenVibe.Games@@@ -12,9 +12,9 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| OpenVibe.Community | OpenVibe.Media | 1 | bearer || OpenVibe.Community | OpenVibe.Network | 5 | bearer, internal-key, oauth-client || OpenVibe.Games | OpenVibe.Network | 2 | bearer, oauth-client |--| OpenVibe.Live | OpenVibe.Community | 1 | none-detected |++| OpenVibe.Live | OpenVibe.Community | 3 | none-detected || OpenVibe.Live | OpenVibe.Media | 2 | api-key, bearer, internal-key |--| OpenVibe.Live | OpenVibe.Network | 12 | bearer, hmac, internal-key, oauth-client |++| OpenVibe.Live | OpenVibe.Network | 13 | bearer, hmac, internal-key, none-detected, oauth-client || OpenVibe.Live | webhook | 2 | hmac, none-detected || OpenVibe.Media | OpenVibe.Live | 1 | none-detected || OpenVibe.Media | OpenVibe.Network | 6 | bearer, internal-key, none-detected, oauth-client |@@@ -42,6 +42,8 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| Community/vendor/openvibe-shared/navbar.js:10 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes || Games/apps/server/src/net/httpServer.ts:335 | 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 |++| Live/server/media-proxy/pastes.js:311 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | yes | yes |++| Live/server/pastes-client.js:16 | OpenVibe.Community | OV_COMMUNITY_INTERNAL_URL | none-detected | yes | yes || Live/server/seo/seo.js:424 | 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/media-client.js:14 | OpenVibe.Media | :4100, MEDIA_URL, /api/v1/${ | api-key, bearer | yes | no |@@@ -49,10 +51,11 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| Live/server/config.js:21 | 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/wallet-client.js:9 | OpenVibe.Network | /internal/coins, OV_NETWORK_INTERNAL_URL, :4000 | internal-key, bearer | yes | no |++| Live/server/monetization/wallet-client.js:9 | OpenVibe.Network | /internal/coins, OV_NETWORK_INTERNAL_URL, :4000 | internal-key, bearer | yes | yes |++| Live/server/pastes-client.js:39 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000 | none-detected | yes | yes || Live/server/streaming/golive-notify.js:60 | OpenVibe.Network | /internal/events | internal-key | **no** | no || Live/server/streaming/restream-manager.js:1387 | OpenVibe.Network | /oauth/token | bearer, oauth-client | yes | yes |--| Live/server/utils/notify.js:16 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications | internal-key | **no** | no |++| Live/server/utils/notify.js:16 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications | internal-key | **no** | yes || Live/vendor/openvibe-shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes || Live/vendor/openvibe-shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no || Live/vendor/openvibe-shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |@@@ -60,13 +63,13 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| Live/server/integrations/discord-webhook.js:16 | webhook | webhook_url (per-app, configured in DB) | none-detected | **no** | no || Live/server/media-proxy/webhook.js:38 | webhook | webhook_url (per-app, configured in DB) | hmac | yes | no || Media/server/thumbnails/live-frame-service.js:170 | OpenVibe.Live | :3000 | none-detected | yes | yes |--| Media/server/auth.js:28 | OpenVibe.Network | network.url, /api/.well-known/jwks | none-detected | yes | yes |++| Media/server/auth.js:29 | OpenVibe.Network | network.url, /api/.well-known/jwks | none-detected | yes | yes || Media/server/user-auth.js:49 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes || Media/vendor/openvibe-shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes || Media/vendor/openvibe-shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no || Media/vendor/openvibe-shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no || Media/vendor/openvibe-shared/navbar.js:10 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |--| Media/server/auth.js:268 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | yes |++| Media/server/auth.js:305 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | yes || Media/server/webhooks.js:4 | webhook | webhook_url (per-app, configured in DB) | hmac | yes | yes || 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 |@@@ -101,18 +101,18 @@ Deliverable 4, plus the background-job half of the exit criteria.| OpenVibe.Network | setInterval | | ? | server/auth/discord-link.js:20 || OpenVibe.Network | setInterval | | ? | server/chrome/service.js:167 || OpenVibe.Network | setInterval | | ? | server/chrome/service.js:169 |--| OpenVibe.Network | setInterval | | 60 min | server/index.js:652 |--| OpenVibe.Network | setInterval | | 2 min | server/index.js:655 |--| OpenVibe.Network | setInterval | | ? | server/index.js:658 |++| OpenVibe.Network | setInterval | | 60 min | server/index.js:654 |++| OpenVibe.Network | setInterval | | 2 min | server/index.js:657 |++| OpenVibe.Network | setInterval | | ? | server/index.js:660 || OpenVibe.Network | setInterval | | 15 min | packages/openvibe-shared/account-switcher.js:624 || OpenVibe.Network | setInterval | | 5 s | packages/openvibe-shared/analytics.js:238 || OpenVibe.Network | setInterval | | 60 min | packages/openvibe-shared/analytics.js:241 || OpenVibe.Network | setInterval | | ? | packages/openvibe-shared/analytics.js:247 || OpenVibe.Network | setInterval | | ? | packages/openvibe-shared/notification-ui.js:548 |--| OpenVibe.Media | setInterval | | ? | server/auth.js:58 |--| OpenVibe.Media | setInterval | | 720 min | server/index.js:115 |--| OpenVibe.Media | setInterval | | ? | server/index.js:141 |--| OpenVibe.Media | setInterval | | ? | server/pastes/routes.js:694 |++| OpenVibe.Media | setInterval | | ? | server/auth.js:59 |++| OpenVibe.Media | setInterval | | 720 min | server/index.js:116 |++| OpenVibe.Media | setInterval | | ? | server/index.js:142 |++| OpenVibe.Media | setInterval | | ? | server/pastes/routes.js:703 || OpenVibe.Media | setInterval | | ? | server/vod/clip-cutter.js:111 || OpenVibe.Media | setInterval | | ? | server/vod/clip-jobs.js:117 || OpenVibe.Media | setInterval | | ? | server/vod/health-job.js:262 |@@@ -130,5 +130,6 @@ Deliverable 4, plus the background-job half of the exit criteria.| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:555 || OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:606 || OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:196 |++| OpenVibe.Community | setInterval | | ? | server/pastes/service.js:211 || OpenVibe.Games | setInterval | | ? | apps/server/src/main.ts:159 || OpenVibe.Games | setInterval | | ? | apps/server/src/net/editorWs.ts:82 |@@@ -22,18 +22,19 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the|---|---|---|---|| OpenVibe.Community | COOKIE_SECURE | **not set** | server/config.js || OpenVibe.Community | OV_OAUTH_CLIENT_SECRET | community.env | server/config.js |++| OpenVibe.Community | VIEW_HASH_SECRET | **not set** | server/pastes/service.js || OpenVibe.Games | EDITOR_KEY | games.env | apps/server/src/config.ts || OpenVibe.Games | OV_OAUTH_CLIENT_SECRET | games.env | apps/server/src/config.ts || OpenVibe.Live | ADMIN_PASSWORD | live.env | server/config.js || OpenVibe.Live | GH_TOKEN | **not set** | server/meta/routes.js || OpenVibe.Live | GITHUB_TOKEN | **not set** | server/meta/routes.js |--| OpenVibe.Live | INTERNAL_API_KEY | live.env | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +2 |++| OpenVibe.Live | INTERNAL_API_KEY | live.env | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +3 || OpenVibe.Live | JWT_SECRET | live.env | server/arena/arena-service.js, server/config.js, server/integrations/platform-oauth.js +1 || OpenVibe.Live | MEDIA_API_KEY | live.env | server/media-client.js || OpenVibe.Live | MEDIA_WEBHOOK_SECRET | live.env | server/media-proxy/webhook.js || OpenVibe.Live | OPS_ALERT_WEBHOOK_URL | **not set** | server/media-proxy/webhook.js |--| OpenVibe.Live | OV_INTERNAL_KEY | **not set** | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +2 |--| OpenVibe.Live | OV_OAUTH_CLIENT_SECRET | live.env | server/auth/routes.js |++| OpenVibe.Live | OV_INTERNAL_KEY | **not set** | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +3 |++| OpenVibe.Live | OV_OAUTH_CLIENT_SECRET | live.env | server/auth/routes.js, server/net/network-principal.js || OpenVibe.Live | PAYPAL_CLIENT_SECRET | live.env | server/config.js || OpenVibe.Live | TURN_AUTH_SECRET | live.env | server/auth/routes.js, server/net/turn.js || OpenVibe.Live | TURN_CREDENTIAL | live.env | server/config.js |@@@ -63,11 +64,11 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| File | Variables ||---|---|--| /etc/openvibe/community.env | 13 |++| /etc/openvibe/community.env | 14 || /etc/openvibe/games.env | 12 || /etc/openvibe/generated-secrets.env | 6 |--| /etc/openvibe/live.env | 53 |--| /etc/openvibe/media.env | 26 |++| /etc/openvibe/live.env | 54 |++| /etc/openvibe/media.env | 28 || /etc/openvibe/network.env | 21 || /etc/openvibe/tools.env | 9 |@@@ -76,6 +77,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| Repo | Variable | In prod | Read at ||---|---|---|---|| OpenVibe.Community | BASE_URL | community.env | server/config.js |++| OpenVibe.Community | COMMUNITY_DB_PATH | | server/config.js || OpenVibe.Community | HOST | community.env | server/config.js || OpenVibe.Community | LOGIN_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Community | NODE_ENV | community.env | server/config.js |@@@ -90,6 +92,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Community | OV_LIVE_URL | community.env | server/config.js, vendor/openvibe-shared/brand.js || OpenVibe.Community | OV_LOGO_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Community | OV_MAPS_URL | | vendor/openvibe-shared/brand.js |++| OpenVibe.Community | OV_MEDIA_INTERNAL_URL | | server/config.js || OpenVibe.Community | OV_MEDIA_URL | community.env | server/config.js, vendor/openvibe-shared/brand.js || OpenVibe.Community | OV_NET_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Community | OV_NETWORK_INTERNAL_URL | community.env | server/config.js |@@@ -101,6 +104,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Community | OV_TEXT_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Community | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Community | OV_YT_URL | | vendor/openvibe-shared/brand.js |++| OpenVibe.Community | PASTES_AUTHORITY | community.env | server/config.js || OpenVibe.Community | PORT | community.env | server/config.js || OpenVibe.Community | TRUST_PROXY | community.env | server/config.js || OpenVibe.Games | DB_PATH | games.env | apps/server/src/config.ts |@@@ -162,7 +166,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Live | OFFLINE_SCREEN_PATH | | server/monetization/routes.js, server/streaming/routes.js || OpenVibe.Live | OV_APP_ROOT | | server/docs/routes.js, server/web/assets.js || OpenVibe.Live | OV_AUDIO_URL | | vendor/openvibe-shared/brand.js |--| OpenVibe.Live | OV_COMMUNITY_URL | live.env | server/index.js, server/seo/seo.js +1 |++| OpenVibe.Live | OV_COMMUNITY_INTERNAL_URL | | server/pastes-client.js |++| OpenVibe.Live | OV_COMMUNITY_URL | live.env | server/index.js, server/media-proxy/pastes.js +2 || OpenVibe.Live | OV_DEV_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Live | OV_DOCS_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Live | OV_FOOD_URL | | vendor/openvibe-shared/brand.js |@@@ -173,17 +178,18 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Live | OV_MAPS_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Live | OV_MEDIA_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Live | OV_NET_URL | | vendor/openvibe-shared/brand.js |--| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/chat/chat-server.js, server/monetization/wallet-client.js +1 |++| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/chat/chat-server.js, server/monetization/wallet-client.js +3 || OpenVibe.Live | OV_NETWORK_LOGIN_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Live | OV_NETWORK_PUBLIC_KEY | live.env | server/auth/auth.js || OpenVibe.Live | OV_NETWORK_URL | live.env | server/auth/auth.js, server/config.js +2 |--| OpenVibe.Live | OV_OAUTH_CLIENT_ID | live.env | server/auth/routes.js |++| OpenVibe.Live | OV_OAUTH_CLIENT_ID | live.env | server/auth/routes.js, server/net/network-principal.js || OpenVibe.Live | OV_PASTES_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Live | OV_PUBLIC_DIR | | server/web/assets.js || OpenVibe.Live | OV_TEXT_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Live | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Live | OV_YT_URL | | vendor/openvibe-shared/brand.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 | PATH | | server/media/media-downloader.js || OpenVibe.Live | PAYPAL_CLIENT_ID | live.env | server/config.js |@@@ -273,6 +279,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Media | OV_TEXT_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Media | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js || OpenVibe.Media | OV_YT_URL | | vendor/openvibe-shared/brand.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 | RTP_PORT_MAX | media.env | (not referenced) |@@@ -9,10 +9,10 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r| Current owner | Tables | Stay | Move | Frozen legacy | Investigate ||---|---|---|---|---|---|| OpenVibe.Live | 186 | 26 | 94 | 43 | 23 |--| OpenVibe.Network | 36 | 33 | 3 | 0 | 0 |++| OpenVibe.Network | 39 | 36 | 3 | 0 | 0 || OpenVibe.Media | 15 | 12 | 3 | 0 | 0 || OpenVibe.Tools | 4 | 4 | 0 | 0 | 0 |--| OpenVibe.Community | 4 | 4 | 0 | 0 | 0 |++| OpenVibe.Community | 13 | 13 | 0 | 0 | 0 || OpenVibe.Games | 5 | 5 | 0 | 0 | 0 || OpenVibe.Sites | 0 | 0 | 0 | 0 | 0 |@@@ -2,7 +2,7 @@> Generated by `scripts/roadmap-baseline/generate.js`. Do not edit by hand; edit `data/*.json` or the extractor and regenerate.--Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.++Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 23:36 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.| Severity | Area | Subject | Detail ||---|---|---|---|@@@ -11,6 +11,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w| low | database | /opt/openvibe.live/data/openvibe.db | 0 B, zero tables (dead file) || low | deploy | games | deployed 43c11f0 has the same file tree as origin/main 5710287 but a different SHA (pre-rewrite history); reset the checkout so later pulls fast-forward || low | env | OpenVibe.Community:COOKIE_SECURE | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |++| low | env | OpenVibe.Community:VIEW_HASH_SECRET | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback || low | env | OpenVibe.Live:GH_TOKEN | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback || low | env | OpenVibe.Live:GITHUB_TOKEN | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback || low | env | OpenVibe.Live:OPS_ALERT_WEBHOOK_URL | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |@@@ -94,6 +95,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w| 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) |@@@ -102,6 +104,10 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w| info | env | OpenVibe.Network:NOTIFICATIONS_ENABLED | set in network.env but not referenced by scanned code (may be read by a dependency or stale) || info | env | OpenVibe.Tools:MEDIA_PUBLIC_URL | set in tools.env but not referenced by scanned code (may be read by a dependency or stale) || info | env | OpenVibe.Tools:MEDIA_URL | set in tools.env but not referenced by scanned code (may be read by a dependency or stale) |++| info | schema | OpenVibe.Community:analytics_daily | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |++| info | schema | OpenVibe.Community:analytics_events | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |++| info | schema | OpenVibe.Community:analytics_hourly | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |++| info | schema | OpenVibe.Community:analytics_rate_tracking | 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) |@@@ -10,24 +10,24 @@ Deliverable 8. Family-level status from roadmap 3.2. Evidence paths are checked| D02-D04 | Registry, capabilities, contracts | absent | missing | W1, W2 | Network/server/url-registry.js; Sites/sites.json | 20 charter-only repos of 32; Live 15, Network 0, Media 0, Tools 0, Community 0, Games 0, Sites 0 || D05-D06 | Policy, staff, user modules | partial | partial | W1, W2 | Network/server/admin; Live/server/auth/permissions.js | - || D07-D10 | Themes, notifications, social, analytics | partial | partial | W1, W2, Track O | Network/server/themes; Network/server/notifications | 5 repos carry their own analytics_events |--| D11-D13 | Events, realtime, SDK | absent | missing | W2, W3 | Media/server/webhooks.js | 65 caller-file/target pairs across 50 files; 10 WebSocket server constructions |++| D11-D13 | Events, realtime, SDK | absent | missing | W2, W3 | Media/server/webhooks.js | 68 caller-file/target pairs across 52 files; 10 WebSocket server constructions || D14-D16 | Media | partial | partial | W4 | Media/server/vod; Media/server/pastes | 3 Media tables target OpenVibe.Community || D17-D20 | Live, OpenRe, channel/VOD lineage | partial | partial | W7 | Live/server/streaming/rtmp-server.js; Live/server/streaming/restream-manager.js | 14 Live tables target OpenRe.Stream || D21-D23 | Chat | partial | partial | W6 | Live/server/chat/chat-server.js; Live/server/streaming/call-server.js | 23 Live tables target OpenVibe.Chat |--| D24-D27 | Community | partial | partial | W5 | Community/server/pastes | 4 tables; 4 Live tables target OpenVibe.Community |++| D24-D27 | Community | partial | partial | W5 | Community/server/pastes | 13 tables; 4 Live tables target OpenVibe.Community || D28-D30 | Billing, Tips, VIP | partial | partial | W8-W10 (ADR-012 first) | Live/server/monetization/payments.js; Network/server/coins | 2 Live tables target OpenVibe.Billing; 2 Network tables target OpenVibe.Billing (loyalty ledger) || D31 | Tools | built | already-present-and-verified | W11 | Tools/apps/gateway | 2 test files || D32 | Games | built | already-present-and-verified | W12 | Games/apps/server/src/net/sso.ts | 56 test files || D33-D34 | Codes, Host | absent | missing | W20, W21 | - | 20 charter-only repos of 32 || D35-D38 | AI, content, sources, search | partial | partial | W13-W15 | Live/server/ai/moment-registry.js; Live/server/ai/llm.js | 14 Live tables target OpenVibe.AI || D39 | Mods | absent | missing | W12, W21 | - | - |--| D40 | Open developer services | absent | missing | W20, W21 | Live/server/integrations/powerchat-routes.js | 28 of 65 call sites authenticate with the shared internal key |++| D40 | Open developer services | absent | missing | W20, W21 | Live/server/integrations/powerchat-routes.js | 28 of 68 call sites authenticate with the shared internal key || D41 | Independent runtime lifecycle | partial | partial | W7, W21 | Live/deploy | hazard H1; hazard H3 || D42 | Shared component architecture | partial | partial | W2, Track R | Network/packages/openvibe-shared | 5 repos vendor openvibe-shared (129 files); 4 divergent: Community/ov-icons.js, Live/user-card.js, Media/ov-icons.js, Tools/ov-icons.js || D43 | Safe active-client updates | absent | missing | Track R | Live/server/chat/deploy-notice.js; Live/server/web/assets.js | - || D44 | Crawlable component rendering | built | already-present-and-verified | Track R (preserve) | Community/server/seo.js; Sites/build.js | - || D45 | Release compatibility and recovery | absent | missing | Track R, W22 | - | 1 service(s) not running origin/main |--| D46 | Update observability and acceptance | absent | missing | Track R, Track O | - | 0 of 7 scanned repos have .github/workflows |++| D46 | Update observability and acceptance | absent | missing | Track R, Track O | - | 4 of 7 scanned repos have .github/workflows |Totals: 3 built, 11 partial, 8 absent across 22 families; 22 verified.@@@ -12,7 +12,7 @@ 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 | open | Live maintainers (security track S) | W7 (openre.key.rotate) - or earlier as a standalone rotation | Ship per-stream key regeneration and rotate every key; notify affected streamers. | - || 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 | open | Platform operator | W11 | Set YT_PROXY and/or YT_COOKIES_FILE for openvibe-tools-yt. | YT_PROXY still 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 82% 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 83% used (at generation time) || H8 | A hardcoded internal secret was previously public | high | open | Platform operator (security track S) | W1 (scoped service principals) / Track S | Rotate INTERNAL_API_KEY per service and the Cloudflare token; move to scoped service tokens. | - || 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 | open | Every contributor | all | Per-repo git config user.email = [email protected]; review history before push. | 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) |@@@ -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 `24151bd`, Network `9b4e262`, Media `6114bc6`, Tools `0346edc`, Community `de947ea`, Games `5710287`, Sites `185014f`. Production snapshot: openvibe-oregon, 2026-09-22.++Source commits: Live `e266060`, Network `1b79576`, Media `ddfefcf`, Tools `0346edc`, Community `d7c6e60`, Games `5710287`, Sites `185014f`. Production snapshot: openvibe-oregon, 2026-09-22.## 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) | 250 tables with current/target owner |--| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 928 routes; 65 cross-service call sites |++| 2 | [02-schema.md](02-schema.md) | 262 tables with current/target owner |++| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 968 routes; 68 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) | 108 production-vs-repo items |++| 7 | [08-discrepancies.md](08-discrepancies.md) | 114 production-vs-repo items || 8 | [09-d-status.md](09-d-status.md) | D01-D46 family status from evidence || 9 | [10-hazards.md](10-hazards.md) | 14 hazards with owners, mitigations and waves || - | [inventory.json](inventory.json) | everything above, machine-readable |@@@ -23,10 +23,10 @@ Source commits: Live `24151bd`, Network `9b4e262`, Media `6114bc6`, Tools `0346e| | Criterion | Result ||---|---|---|--| pass | Every table has an owner classification | 250 tables classified, 0 unclassified |--| pass | Every route is attributed to a repo and source line | 928 routes; 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 | 82 timers/jobs |--| pass | Every cross-service call records caller, callee, auth, timeout and retry | 65 call sites; 30 with no timeout detected |++| pass | Every table has an owner classification | 262 tables classified, 0 unclassified |++| pass | Every route is attributed to a repo and source line | 968 routes; 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 | 83 timers/jobs |++| pass | Every cross-service call records caller, callee, auth, timeout and retry | 68 call sites; 30 with no timeout detected || pass | Unknowns are marked unknown, not guessed | 2 unknown items recorded || pass | D01-D46 status resolved from evidence | 22/22 families verified || **open** | Hazard register reviewed by the production-host owner | pending: set reviewedBy in data/hazards.json after review |@@@ -1,16 +1,16 @@{"generatedFrom": {-- "OpenVibe.Live": "24151bdc12ffe6e6f2fbe8c3770327b2d1635a8a",-- "OpenVibe.Network": "9b4e262cd8daf05ee2b6b92a06dabe70e2d42bc7",-- "OpenVibe.Media": "6114bc61c466cd51335548d0ce87058df125c577",++ "OpenVibe.Live": "e26606082958f8cf6bb7c4587c225ca09335b5fe",++ "OpenVibe.Network": "1b79576cb024714e56ae2ccc7728080d3d3e0118",++ "OpenVibe.Media": "ddfefcf47740715f24fe7aa7dea648b4699162fc","OpenVibe.Tools": "0346edc57fb9f588abcdea171a22a5ca33f772d2",-- "OpenVibe.Community": "de947ead2addce29d7f9b98f3d894075ca4e82f2",++ "OpenVibe.Community": "d7c6e608d8e27e6ddbfc78a15fa7590036b1dded","OpenVibe.Games": "571028796639c00d5deecca038634ef1c52d3480","OpenVibe.Sites": "185014ff01ed8bd8f6df3dd5099e2b6c904e235d"},"prodSnapshot": {"host": "openvibe-oregon",-- "collectedAt": "2026-09-22T21:23:31.121Z"++ "collectedAt": "2026-09-22T23:36:01.667Z"},"repos": [{@@@ -18,13 +18,13 @@"service": "live","present": true,"git": {-- "head": "24151bdc12ffe6e6f2fbe8c3770327b2d1635a8a",++ "head": "e26606082958f8cf6bb7c4587c225ca09335b5fe","branch": "main",-- "originMain": "24151bdc12ffe6e6f2fbe8c3770327b2d1635a8a",-- "committedAt": "2026-09-22T14:18:25-07:00"++ "originMain": "e26606082958f8cf6bb7c4587c225ca09335b5fe",++ "committedAt": "2026-09-22T16:28:23-07:00"},-- "sourceFiles": 165,-- "loc": 69699,++ "sourceFiles": 167,++ "loc": 69978,"tables": [{"table": "arena_profiles",@@@ -2920,6 +2920,12 @@"file": "server/media-proxy/pastes.js","line": 222},++ {++ "method": "POST",++ "path": "/api/pastes/:slug/censor",++ "file": "server/media-proxy/pastes.js",++ "line": 315++ },{"method": "GET","path": "/api/pastes/:slug/comments",@@@ -2962,18 +2968,36 @@"file": "server/media-proxy/pastes.js","line": 240},++ {++ "method": "GET",++ "path": "/api/pastes/:slug/raw",++ "file": "server/media-proxy/pastes.js",++ "line": 311++ },{"method": "POST","path": "/api/pastes/:slug/set-avatar","file": "server/media-proxy/pastes.js","line": 110},++ {++ "method": "POST",++ "path": "/api/pastes/:slug/set-avatar",++ "file": "server/media-proxy/pastes.js",++ "line": 296++ },{"method": "DELETE","path": "/api/pastes/admin/forks","file": "server/media-proxy/pastes.js","line": 171},++ {++ "method": "DELETE",++ "path": "/api/pastes/admin/forks",++ "file": "server/media-proxy/pastes.js",++ "line": 313++ },{"method": "GET","path": "/api/pastes/admin/stats",@@@ -2986,6 +3010,12 @@"file": "server/media-proxy/pastes.js","line": 172},++ {++ "method": "POST",++ "path": "/api/pastes/bulk",++ "file": "server/media-proxy/pastes.js",++ "line": 314++ },{"method": "GET","path": "/api/pastes/by-user/:username",@@@ -4276,10 +4306,12 @@"server/auth/auth.js"],"OV_OAUTH_CLIENT_ID": [-- "server/auth/routes.js"++ "server/auth/routes.js",++ "server/net/network-principal.js"],"OV_OAUTH_CLIENT_SECRET": [-- "server/auth/routes.js"++ "server/auth/routes.js",++ "server/net/network-principal.js"],"BASE_URL": ["server/auth/routes.js",@@@ -4295,12 +4327,15 @@"OV_NETWORK_INTERNAL_URL": ["server/chat/chat-server.js","server/monetization/wallet-client.js",++ "server/net/network-principal.js",++ "server/pastes-client.js","server/utils/notify.js"],"INTERNAL_API_KEY": ["server/chat/chat-server.js","server/config.js","server/monetization/wallet-client.js",++ "server/net/network-principal.js","server/streaming/routes.js","server/utils/notify.js"],@@@ -4308,6 +4343,7 @@"server/chat/chat-server.js","server/config.js","server/monetization/wallet-client.js",++ "server/net/network-principal.js","server/streaming/routes.js","server/utils/notify.js"],@@@ -4482,6 +4518,7 @@],"OV_COMMUNITY_URL": ["server/index.js",++ "server/media-proxy/pastes.js","server/seo/seo.js","vendor/openvibe-shared/brand.js"],@@@ -4544,6 +4581,12 @@"server/monetization/routes.js","server/streaming/routes.js"],++ "OV_COMMUNITY_INTERNAL_URL": [++ "server/pastes-client.js"++ ],++ "PASTES_AUTHORITY": [++ "server/pastes-client.js"++ ],"OV_PUBLIC_DIR": ["server/web/assets.js"],@@@ -4764,6 +4807,25 @@"timeout": true,"retry": false},++ {++ "file": "server/media-proxy/pastes.js",++ "targets": [++ {++ "service": "community",++ "refs": [++ {++ "via": "OV_COMMUNITY_URL",++ "line": 311++ }++ ]++ }++ ],++ "auth": [++ "none-detected"++ ],++ "timeout": true,++ "retry": true++ },{"file": "server/media-proxy/webhook.js","targets": [@@@ -4803,27 +4865,27 @@},{"via": "OV_NETWORK_INTERNAL_URL",-- "line": 18++ "line": 19},{"via": ":4000",-- "line": 18++ "line": 19},{"via": "/internal/coins",-- "line": 71++ "line": 79},{"via": "/internal/coins",-- "line": 84++ "line": 92},{"via": "/internal/coins",-- "line": 95++ "line": 103},{"via": "/internal/coins",-- "line": 143++ "line": 151}]}@@@ -4833,7 +4895,39 @@"bearer"],"timeout": true,-- "retry": false++ "retry": true++ },++ {++ "file": "server/pastes-client.js",++ "targets": [++ {++ "service": "community",++ "refs": [++ {++ "via": "OV_COMMUNITY_INTERNAL_URL",++ "line": 16++ }++ ]++ },++ {++ "service": "network",++ "refs": [++ {++ "via": "OV_NETWORK_INTERNAL_URL",++ "line": 39++ },++ {++ "via": ":4000",++ "line": 39++ }++ ]++ }++ ],++ "auth": [++ "none-detected"++ ],++ "timeout": true,++ "retry": true},{"file": "server/seo/seo.js",@@@ -4909,15 +5003,15 @@},{"via": "/internal/notifications",-- "line": 60++ "line": 66},{"via": "/internal/notifications",-- "line": 114++ "line": 120},{"via": "/internal/notifications",-- "line": 137++ "line": 143}]}@@@ -4926,7 +5020,7 @@"internal-key"],"timeout": false,-- "retry": false++ "retry": true},{"file": "vendor/openvibe-shared/account-switcher.js",@@@ -5366,21 +5460,21 @@],"contractTodos": 15,"unresolvedMounts": [],-- "testFiles": 56,-- "ci": false++ "testFiles": 58,++ "ci": true},{"name": "OpenVibe.Network","service": "network","present": true,"git": {-- "head": "9b4e262cd8daf05ee2b6b92a06dabe70e2d42bc7",++ "head": "1b79576cb024714e56ae2ccc7728080d3d3e0118","branch": "main",-- "originMain": "9b4e262cd8daf05ee2b6b92a06dabe70e2d42bc7",-- "committedAt": "2026-09-22T14:14:53-07:00"++ "originMain": "1b79576cb024714e56ae2ccc7728080d3d3e0118",++ "committedAt": "2026-09-22T16:11:37-07:00"},-- "sourceFiles": 79,-- "loc": 20646,++ "sourceFiles": 81,++ "loc": 21029,"tables": [{"table": "admin_rate_limits",@@@ -5562,6 +5656,24 @@"line": 26,"via": "repo"},++ {++ "table": "user_modules",++ "file": "server/identity/modules.js",++ "line": 24,++ "via": "repo"++ },++ {++ "table": "principal_grants",++ "file": "server/identity/principals.js",++ "line": 44,++ "via": "repo"++ },++ {++ "table": "principal_usage",++ "file": "server/identity/principals.js",++ "line": 54,++ "via": "repo"++ },{"table": "identity_legacy_map","file": "server/identity/subjects.js",@@@ -5571,7 +5683,7 @@{"table": "stream_live_announcements","file": "server/internal/routes.js",-- "line": 310,++ "line": 325,"via": "repo"},{@@@ -5646,7 +5758,7 @@"method": "GET","path": "/.well-known/web-identity","file": "server/index.js",-- "line": 572++ "line": 574},{"method": "POST",@@@ -5706,7 +5818,7 @@"method": "GET","path": "/api/admin/ssh-info","file": "server/index.js",-- "line": 452++ "line": 454},{"method": "GET",@@@ -5892,7 +6004,7 @@"method": "GET","path": "/api/catalog.json","file": "server/index.js",-- "line": 423++ "line": 425},{"method": "GET",@@@ -5984,6 +6096,48 @@"file": "server/history/routes.js","line": 137},++ {++ "method": "GET",++ "path": "/api/modules",++ "file": "server/identity/modules.js",++ "line": 101++ },++ {++ "method": "DELETE",++ "path": "/api/modules/:ns",++ "file": "server/identity/modules.js",++ "line": 126++ },++ {++ "method": "GET",++ "path": "/api/modules/:ns",++ "file": "server/identity/modules.js",++ "line": 109++ },++ {++ "method": "PUT",++ "path": "/api/modules/:ns",++ "file": "server/identity/modules.js",++ "line": 117++ },++ {++ "method": "GET",++ "path": "/api/modules/:ns/public/:subject",++ "file": "server/identity/modules.js",++ "line": 93++ },++ {++ "method": "GET",++ "path": "/api/modules/modules/:ns/:subject",++ "file": "server/identity/modules.js",++ "line": 140++ },++ {++ "method": "PUT",++ "path": "/api/modules/modules/:ns/:subject",++ "file": "server/identity/modules.js",++ "line": 149++ },{"method": "DELETE","path": "/api/profile/avatar",@@@ -6036,7 +6190,7 @@"method": "GET","path": "/api/sso/targets","file": "server/index.js",-- "line": 405++ "line": 407},{"method": "GET",@@@ -6252,55 +6406,55 @@"method": "GET","path": "/internal/anon-admin","file": "server/internal/routes.js",-- "line": 628++ "line": 643},{"method": "GET","path": "/internal/anon-list","file": "server/internal/routes.js",-- "line": 677++ "line": 692},{"method": "POST","path": "/internal/audit","file": "server/internal/routes.js",-- "line": 166++ "line": 178},{"method": "POST","path": "/internal/coins/credit","file": "server/internal/routes.js",-- "line": 252++ "line": 267},{"method": "POST","path": "/internal/coins/debit","file": "server/internal/routes.js",-- "line": 264++ "line": 279},{"method": "GET","path": "/internal/coins/stats","file": "server/internal/routes.js",-- "line": 214++ "line": 226},{"method": "POST","path": "/internal/coins/transfer","file": "server/internal/routes.js",-- "line": 277++ "line": 292},{"method": "POST","path": "/internal/events/stream-live","file": "server/internal/routes.js",-- "line": 294++ "line": 309},{"method": "POST","path": "/internal/identity/legacy-map","file": "server/identity/internal-routes.js",-- "line": 29++ "line": 52},{"method": "GET",@@@ -6308,113 +6462,131 @@"file": "server/identity/internal-routes.js","line": 18},++ {++ "method": "GET",++ "path": "/internal/identity/resolve",++ "file": "server/internal/routes.js",++ "line": 40++ },++ {++ "method": "POST",++ "path": "/internal/identity/resolve-batch",++ "file": "server/identity/internal-routes.js",++ "line": 35++ },++ {++ "method": "POST",++ "path": "/internal/identity/resolve-batch",++ "file": "server/internal/routes.js",++ "line": 41++ },{"method": "POST","path": "/internal/issue-token","file": "server/internal/routes.js",-- "line": 518++ "line": 533},{"method": "POST","path": "/internal/link-account","file": "server/internal/routes.js",-- "line": 108++ "line": 120},{"method": "POST","path": "/internal/notifications/mark-read","file": "server/internal/routes.js",-- "line": 479++ "line": 494},{"method": "POST","path": "/internal/notifications/push","file": "server/internal/routes.js",-- "line": 421++ "line": 436},{"method": "POST","path": "/internal/notifications/push-bulk","file": "server/internal/routes.js",-- "line": 441++ "line": 456},{"method": "POST","path": "/internal/notifications/resolve-users","file": "server/internal/routes.js",-- "line": 498++ "line": 513},{"method": "GET","path": "/internal/notifications/unread/:userId","file": "server/internal/routes.js",-- "line": 464++ "line": 479},{"method": "POST","path": "/internal/resolve-anon","file": "server/internal/routes.js",-- "line": 549++ "line": 564},{"method": "GET","path": "/internal/stats","file": "server/internal/routes.js",-- "line": 175++ "line": 187},{"method": "GET","path": "/internal/url-registry/resolved","file": "server/internal/routes.js",-- "line": 184++ "line": 196},{"method": "POST","path": "/internal/user-avatar","file": "server/internal/routes.js",-- "line": 151++ "line": 163},{"method": "GET","path": "/internal/users/:id","file": "server/internal/routes.js",-- "line": 59++ "line": 71},{"method": "GET","path": "/internal/users/:id/linked-accounts","file": "server/internal/routes.js",-- "line": 159++ "line": 171},{"method": "GET","path": "/internal/users/:id/theme","file": "server/internal/routes.js",-- "line": 96++ "line": 108},{"method": "POST","path": "/internal/users/bulk","file": "server/internal/routes.js",-- "line": 81++ "line": 93},{"method": "GET","path": "/internal/users/by-username/:username","file": "server/internal/routes.js",-- "line": 70++ "line": 82},{"method": "POST","path": "/internal/verify-token","file": "server/internal/routes.js",-- "line": 37++ "line": 49},{"method": "GET","path": "/llms.txt","file": "server/index.js",-- "line": 550++ "line": 552},{"method": "GET",@@@ -6480,31 +6652,31 @@"method": "GET","path": "/oauth/.well-known/openid-configuration","file": "server/auth/oauth-routes.js",-- "line": 306++ "line": 318},{"method": "GET","path": "/oauth/authorize","file": "server/auth/oauth-routes.js",-- "line": 21++ "line": 22},{"method": "POST","path": "/oauth/confirm","file": "server/auth/oauth-routes.js",-- "line": 79++ "line": 80},{"method": "POST","path": "/oauth/token","file": "server/auth/oauth-routes.js",-- "line": 132++ "line": 133},{"method": "GET","path": "/openvibe-sw.js","file": "server/index.js",-- "line": 596++ "line": 598},{"method": "GET",@@@ -6588,7 +6760,7 @@"method": "GET","path": "/sso/check","file": "server/index.js",-- "line": 577++ "line": 579},{"method": "GET",@@@ -6612,7 +6784,7 @@"method": "GET","path": "/tos","file": "server/index.js",-- "line": 419++ "line": 421},{"method": "GET",@@@ -6726,7 +6898,7 @@"method": "GET","path": "/verify-email","file": "server/index.js",-- "line": 562++ "line": 564}],"ws": {@@@ -7079,7 +7251,7 @@},{"via": "live.internalUrl",-- "line": 477++ "line": 479}]},@@@ -7193,21 +7365,21 @@"kind": "setInterval","name": null,"intervalMs": 3600000,-- "line": 652,++ "line": 654,"file": "server/index.js"},{"kind": "setInterval","name": null,"intervalMs": 120000,-- "line": 655,++ "line": 657,"file": "server/index.js"},{"kind": "setInterval","name": null,"intervalMs": null,-- "line": 658,++ "line": 660,"file": "server/index.js"},{@@@ -7248,21 +7420,21 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 18,-- "ci": false++ "testFiles": 20,++ "ci": true},{"name": "OpenVibe.Media","service": "media","present": true,"git": {-- "head": "6114bc61c466cd51335548d0ce87058df125c577",++ "head": "ddfefcf47740715f24fe7aa7dea648b4699162fc","branch": "main",-- "originMain": "6114bc61c466cd51335548d0ce87058df125c577",-- "committedAt": "2026-09-21T09:58:34-07:00"++ "originMain": "ddfefcf47740715f24fe7aa7dea648b4699162fc",++ "committedAt": "2026-09-22T16:14:04-07:00"},"sourceFiles": 28,-- "loc": 8702,++ "loc": 8752,"tables": [{"table": "apps",@@@ -7492,121 +7664,121 @@"method": "GET","path": "/api/v1/:app/pastes","file": "server/pastes/routes.js",-- "line": 248++ "line": 257},{"method": "POST","path": "/api/v1/:app/pastes","file": "server/pastes/routes.js",-- "line": 462++ "line": 471},{"method": "DELETE","path": "/api/v1/:app/pastes/:slug","file": "server/pastes/routes.js",-- "line": 616++ "line": 625},{"method": "GET","path": "/api/v1/:app/pastes/:slug","file": "server/pastes/routes.js",-- "line": 436++ "line": 445},{"method": "PUT","path": "/api/v1/:app/pastes/:slug","file": "server/pastes/routes.js",-- "line": 578++ "line": 587},{"method": "POST","path": "/api/v1/:app/pastes/:slug/ai","file": "server/pastes/routes.js",-- "line": 558++ "line": 567},{"method": "POST","path": "/api/v1/:app/pastes/:slug/censor","file": "server/pastes/routes.js",-- "line": 397++ "line": 406},{"method": "GET","path": "/api/v1/:app/pastes/:slug/comments","file": "server/pastes/routes.js",-- "line": 702++ "line": 711},{"method": "POST","path": "/api/v1/:app/pastes/:slug/comments","file": "server/pastes/routes.js",-- "line": 725++ "line": 734},{"method": "DELETE","path": "/api/v1/:app/pastes/:slug/comments/:commentId","file": "server/pastes/routes.js",-- "line": 803++ "line": 812},{"method": "POST","path": "/api/v1/:app/pastes/:slug/copy","file": "server/pastes/routes.js",-- "line": 677++ "line": 686},{"method": "POST","path": "/api/v1/:app/pastes/:slug/fork","file": "server/pastes/routes.js",-- "line": 634++ "line": 643},{"method": "POST","path": "/api/v1/:app/pastes/:slug/like","file": "server/pastes/routes.js",-- "line": 660++ "line": 669},{"method": "DELETE","path": "/api/v1/:app/pastes/admin/forks","file": "server/pastes/routes.js",-- "line": 359++ "line": 368},{"method": "GET","path": "/api/v1/:app/pastes/admin/forks","file": "server/pastes/routes.js",-- "line": 339++ "line": 348},{"method": "GET","path": "/api/v1/:app/pastes/admin/stats","file": "server/pastes/routes.js",-- "line": 329++ "line": 338},{"method": "POST","path": "/api/v1/:app/pastes/bulk","file": "server/pastes/routes.js",-- "line": 372++ "line": 381},{"method": "GET","path": "/api/v1/:app/pastes/config","file": "server/pastes/routes.js",-- "line": 307++ "line": 316},{"method": "GET","path": "/api/v1/:app/stats","file": "server/index.js",-- "line": 93++ "line": 94},{"method": "GET","path": "/api/v1/:app/stats/series/:metric","file": "server/index.js",-- "line": 103++ "line": 104},{"method": "POST",@@@ -7738,25 +7910,25 @@"method": "GET","path": "/healthz","file": "server/index.js",-- "line": 82++ "line": 83},{"method": "POST","path": "/internal/avatar-ingest","file": "server/index.js",-- "line": 56++ "line": 57},{"method": "GET","path": "/manifest.webmanifest","file": "server/index.js",-- "line": 44++ "line": 45},{"method": "GET","path": "/tos","file": "server/index.js",-- "line": 41++ "line": 42}],"ws": {@@@ -7820,6 +7992,9 @@"OV_OAUTH_REDIRECT_URI": ["server/index.js"],++ "PASTES_FROZEN_APPS": [++ "server/pastes/routes.js"++ ],"APP_INTERNAL_URLS": ["server/thumbnails/live-frame-service.js"],@@@ -7947,15 +8122,19 @@"refs": [{"via": "network.url",-- "line": 28++ "line": 29},{"via": "/api/.well-known/jwks",-- "line": 28++ "line": 29++ },++ {++ "via": "network.url",++ "line": 84},{"via": "network.url",-- "line": 83++ "line": 99}]},@@@ -7964,7 +8143,7 @@"refs": [{"via": "webhook_url (per-app, configured in DB)",-- "line": 268++ "line": 305}]}@@@ -8187,28 +8366,28 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 58,++ "line": 59,"file": "server/auth.js"},{"kind": "setInterval","name": null,"intervalMs": 43200000,-- "line": 115,++ "line": 116,"file": "server/index.js"},{"kind": "setInterval","name": null,"intervalMs": null,-- "line": 141,++ "line": 142,"file": "server/index.js"},{"kind": "setInterval","name": null,"intervalMs": null,-- "line": 694,++ "line": 703,"file": "server/pastes/routes.js"},{@@@ -8249,8 +8428,8 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 4,-- "ci": false++ "testFiles": 6,++ "ci": true},{"name": "OpenVibe.Tools",@@@ -9513,25 +9692,79 @@"service": "community","present": true,"git": {-- "head": "de947ead2addce29d7f9b98f3d894075ca4e82f2",++ "head": "d7c6e608d8e27e6ddbfc78a15fa7590036b1dded","branch": "main",-- "originMain": "de947ead2addce29d7f9b98f3d894075ca4e82f2",-- "committedAt": "2026-09-21T09:58:34-07:00"++ "originMain": "d7c6e608d8e27e6ddbfc78a15fa7590036b1dded",++ "committedAt": "2026-09-22T16:32:05-07:00"},-- "sourceFiles": 11,-- "loc": 1754,++ "sourceFiles": 21,++ "loc": 3950,"tables": [{-- "table": "analytics_events",-- "file": "vendor/openvibe-shared/analytics.js",-- "line": 74,-- "via": "vendored openvibe-shared"++ "table": "pastes",++ "file": "server/db.js",++ "line": 18,++ "via": "repo"},{-- "table": "analytics_hourly",-- "file": "vendor/openvibe-shared/analytics.js",-- "line": 98,-- "via": "vendored openvibe-shared"++ "table": "paste_versions",++ "file": "server/db.js",++ "line": 54,++ "via": "repo"++ },++ {++ "table": "paste_likes",++ "file": "server/db.js",++ "line": 65,++ "via": "repo"++ },++ {++ "table": "paste_comments",++ "file": "server/db.js",++ "line": 72,++ "via": "repo"++ },++ {++ "table": "paste_visits",++ "file": "server/db.js",++ "line": 88,++ "via": "repo"++ },++ {++ "table": "subject_projection",++ "file": "server/db.js",++ "line": 98,++ "via": "repo"++ },++ {++ "table": "migration_runs",++ "file": "server/db.js",++ "line": 108,++ "via": "repo"++ },++ {++ "table": "legacy_id_map",++ "file": "server/db.js",++ "line": 116,++ "via": "repo"++ },++ {++ "table": "import_hold",++ "file": "server/db.js",++ "line": 125,++ "via": "repo"++ },++ {++ "table": "analytics_events",++ "file": "vendor/openvibe-shared/analytics.js",++ "line": 74,++ "via": "vendored openvibe-shared"++ },++ {++ "table": "analytics_hourly",++ "file": "vendor/openvibe-shared/analytics.js",++ "line": 98,++ "via": "vendored openvibe-shared"},{"table": "analytics_daily",@@@ -9551,133 +9784,283 @@"method": "GET","path": "/","file": "server/app.js",-- "line": 106++ "line": 146},{"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 81++ "line": 120++ },++ {++ "method": "GET",++ "path": "/api/pastes",++ "file": "server/pastes/api.js",++ "line": 102++ },++ {++ "method": "POST",++ "path": "/api/pastes",++ "file": "server/pastes/api.js",++ "line": 106++ },++ {++ "method": "DELETE",++ "path": "/api/pastes/:slug",++ "file": "server/pastes/api.js",++ "line": 124++ },++ {++ "method": "GET",++ "path": "/api/pastes/:slug",++ "file": "server/pastes/api.js",++ "line": 122++ },++ {++ "method": "PUT",++ "path": "/api/pastes/:slug",++ "file": "server/pastes/api.js",++ "line": 123++ },++ {++ "method": "POST",++ "path": "/api/pastes/:slug/ai",++ "file": "server/pastes/api.js",++ "line": 127++ },++ {++ "method": "POST",++ "path": "/api/pastes/:slug/censor",++ "file": "server/pastes/api.js",++ "line": 126++ },++ {++ "method": "GET",++ "path": "/api/pastes/:slug/comments",++ "file": "server/pastes/api.js",++ "line": 136++ },++ {++ "method": "POST",++ "path": "/api/pastes/:slug/comments",++ "file": "server/pastes/api.js",++ "line": 137++ },++ {++ "method": "DELETE",++ "path": "/api/pastes/:slug/comments/:commentId",++ "file": "server/pastes/api.js",++ "line": 140++ },++ {++ "method": "POST",++ "path": "/api/pastes/:slug/copy",++ "file": "server/pastes/api.js",++ "line": 134++ },++ {++ "method": "POST",++ "path": "/api/pastes/:slug/fork",++ "file": "server/pastes/api.js",++ "line": 132++ },++ {++ "method": "POST",++ "path": "/api/pastes/:slug/like",++ "file": "server/pastes/api.js",++ "line": 133++ },++ {++ "method": "GET",++ "path": "/api/pastes/:slug/raw",++ "file": "server/pastes/api.js",++ "line": 129++ },++ {++ "method": "POST",++ "path": "/api/pastes/:slug/set-avatar",++ "file": "server/pastes/api.js",++ "line": 143++ },++ {++ "method": "GET",++ "path": "/api/pastes/:slug/versions",++ "file": "server/pastes/api.js",++ "line": 130++ },++ {++ "method": "DELETE",++ "path": "/api/pastes/admin/forks",++ "file": "server/pastes/api.js",++ "line": 113++ },++ {++ "method": "GET",++ "path": "/api/pastes/admin/forks",++ "file": "server/pastes/api.js",++ "line": 112++ },++ {++ "method": "GET",++ "path": "/api/pastes/admin/stats",++ "file": "server/pastes/api.js",++ "line": 111++ },++ {++ "method": "POST",++ "path": "/api/pastes/bulk",++ "file": "server/pastes/api.js",++ "line": 114++ },++ {++ "method": "GET",++ "path": "/api/pastes/by-user/:username",++ "file": "server/pastes/api.js",++ "line": 119++ },++ {++ "method": "GET",++ "path": "/api/pastes/config",++ "file": "server/pastes/api.js",++ "line": 109++ },++ {++ "method": "POST",++ "path": "/api/pastes/screenshot",++ "file": "server/pastes/api.js",++ "line": 116},{"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 82++ "line": 121},{"method": "GET","path": "/callback","file": "server/auth/routes.js",-- "line": 281++ "line": 289},{"method": "POST","path": "/fedcm","file": "server/auth/routes.js",-- "line": 327++ "line": 335},{"method": "GET","path": "/feed.xml","file": "server/app.js",-- "line": 99++ "line": 138},{"method": "GET","path": "/login","file": "server/auth/routes.js",-- "line": 259++ "line": 267},{"method": "GET","path": "/logout","file": "server/auth/routes.js",-- "line": 355++ "line": 363},{"method": "GET","path": "/me","file": "server/auth/routes.js",-- "line": 379++ "line": 387},{"method": "GET","path": "/my","file": "server/app.js",-- "line": 186++ "line": 252},{"method": "GET","path": "/new","file": "server/app.js",-- "line": 150++ "line": 214},{"method": "POST","path": "/new","file": "server/app.js",-- "line": 159++ "line": 225},{"method": "GET","path": "/p/:slug","file": "server/app.js",-- "line": 119++ "line": 159},{"method": "GET","path": "/p/:slug/download","file": "server/app.js",-- "line": 138++ "line": 202},{"method": "GET","path": "/p/:slug/raw","file": "server/app.js",-- "line": 135++ "line": 178++ },++ {++ "method": "GET",++ "path": "/p/:slug/raw",++ "file": "server/app.js",++ "line": 198},{"method": "GET","path": "/p/:slug/screenshot","file": "server/app.js",-- "line": 136++ "line": 191++ },++ {++ "method": "GET",++ "path": "/p/:slug/screenshot",++ "file": "server/app.js",++ "line": 199},{"method": "GET","path": "/pastes","file": "server/app.js",-- "line": 111++ "line": 151},{"method": "GET","path": "/pastes/:slug","file": "server/app.js",-- "line": 117++ "line": 157},{"method": "POST","path": "/refresh","file": "server/auth/routes.js",-- "line": 389++ "line": 397},{"method": "GET","path": "/robots.txt","file": "server/app.js",-- "line": 97++ "line": 136},{"method": "GET","path": "/sitemap.xml","file": "server/app.js",-- "line": 98++ "line": 137},{"method": "GET","path": "/tos","file": "server/app.js",-- "line": 75++ "line": 82}],"ws": {@@@ -9730,6 +10113,18 @@"server/config.js","vendor/openvibe-shared/brand.js"],++ "OV_MEDIA_INTERNAL_URL": [++ "server/config.js"++ ],++ "PASTES_AUTHORITY": [++ "server/config.js"++ ],++ "COMMUNITY_DB_PATH": [++ "server/config.js"++ ],++ "VIEW_HASH_SECRET": [++ "server/pastes/service.js"++ ],"LOGIN_URL": ["vendor/openvibe-shared/brand.js"],@@@ -9800,35 +10195,35 @@},{"via": "networkInternalUrl",-- "line": 67++ "line": 75},{"via": "networkUrl",-- "line": 67++ "line": 75},{"via": "/api/.well-known/jwks",-- "line": 70++ "line": 78},{"via": "networkUrl",-- "line": 146++ "line": 154},{"via": "networkInternalUrl",-- "line": 227++ "line": 235},{"via": "networkUrl",-- "line": 227++ "line": 235},{"via": "/oauth/token",-- "line": 230++ "line": 238},{"via": "networkInternalUrl",-- "line": 361++ "line": 369}]}@@@ -10000,11 +10395,19 @@"retry": true}],-- "jobs": [],++ "jobs": [++ {++ "kind": "setInterval",++ "name": null,++ "intervalMs": null,++ "line": 211,++ "file": "server/pastes/service.js"++ }++ ],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 8,-- "ci": false++ "testFiles": 14,++ "ci": true},{"name": "OpenVibe.Games",@@@ -11018,77 +11421,221 @@"state": "identical"},{-- "repo": "OpenVibe.Tools",-- "file": "ui.js",-- "state": "identical"++ "repo": "OpenVibe.Tools",++ "file": "ui.js",++ "state": "identical"++ },++ {++ "repo": "OpenVibe.Tools",++ "file": "url-resolver.js",++ "state": "identical"++ },++ {++ "repo": "OpenVibe.Tools",++ "file": "user-card.js",++ "state": "identical"++ }++ ],++ "ownership": [++ {++ "repo": "OpenVibe.Community",++ "table": "analytics_daily",++ "declaredAt": [++ "vendor/openvibe-shared/analytics.js:116"++ ],++ "prodDbs": [],++ "inCode": true,++ "inProd": false,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "Track O / ADR-021",++ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."++ },++ {++ "repo": "OpenVibe.Community",++ "table": "analytics_events",++ "declaredAt": [++ "vendor/openvibe-shared/analytics.js:74"++ ],++ "prodDbs": [],++ "inCode": true,++ "inProd": false,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "Track O / ADR-021",++ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."++ },++ {++ "repo": "OpenVibe.Community",++ "table": "analytics_hourly",++ "declaredAt": [++ "vendor/openvibe-shared/analytics.js:98"++ ],++ "prodDbs": [],++ "inCode": true,++ "inProd": false,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "Track O / ADR-021",++ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."++ },++ {++ "repo": "OpenVibe.Community",++ "table": "analytics_rate_tracking",++ "declaredAt": [++ "vendor/openvibe-shared/analytics.js:137"++ ],++ "prodDbs": [],++ "inCode": true,++ "inProd": false,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "Track O / ADR-021",++ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."++ },++ {++ "repo": "OpenVibe.Community",++ "table": "import_hold",++ "declaredAt": [++ "server/db.js:125"++ ],++ "prodDbs": [++ "community.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "W5",++ "note": ""++ },++ {++ "repo": "OpenVibe.Community",++ "table": "legacy_id_map",++ "declaredAt": [++ "server/db.js:116"++ ],++ "prodDbs": [++ "community.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "W5",++ "note": ""++ },++ {++ "repo": "OpenVibe.Community",++ "table": "migration_runs",++ "declaredAt": [++ "server/db.js:108"++ ],++ "prodDbs": [++ "community.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "W5",++ "note": ""},{-- "repo": "OpenVibe.Tools",-- "file": "url-resolver.js",-- "state": "identical"++ "repo": "OpenVibe.Community",++ "table": "paste_comments",++ "declaredAt": [++ "server/db.js:72"++ ],++ "prodDbs": [++ "community.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "W5",++ "note": ""},{-- "repo": "OpenVibe.Tools",-- "file": "user-card.js",-- "state": "identical"-- }-- ],-- "ownership": [++ "repo": "OpenVibe.Community",++ "table": "paste_likes",++ "declaredAt": [++ "server/db.js:65"++ ],++ "prodDbs": [++ "community.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "W5",++ "note": ""++ },{"repo": "OpenVibe.Community",-- "table": "analytics_daily",++ "table": "paste_versions","declaredAt": [-- "vendor/openvibe-shared/analytics.js:116"++ "server/db.js:54"++ ],++ "prodDbs": [++ "community.db"],-- "prodDbs": [],"inCode": true,-- "inProd": false,++ "inProd": true,"target": "OpenVibe.Community","disposition": "keep",-- "wave": "Track O / ADR-021",-- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."++ "wave": "W5",++ "note": ""},{"repo": "OpenVibe.Community",-- "table": "analytics_events",++ "table": "paste_visits","declaredAt": [-- "vendor/openvibe-shared/analytics.js:74"++ "server/db.js:88"++ ],++ "prodDbs": [++ "community.db"],-- "prodDbs": [],"inCode": true,-- "inProd": false,++ "inProd": true,"target": "OpenVibe.Community","disposition": "keep",-- "wave": "Track O / ADR-021",-- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."++ "wave": "W5",++ "note": ""},{"repo": "OpenVibe.Community",-- "table": "analytics_hourly",++ "table": "pastes","declaredAt": [-- "vendor/openvibe-shared/analytics.js:98"++ "server/db.js:18"++ ],++ "prodDbs": [++ "community.db"],-- "prodDbs": [],"inCode": true,-- "inProd": false,++ "inProd": true,"target": "OpenVibe.Community","disposition": "keep",-- "wave": "Track O / ADR-021",-- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."++ "wave": "W5",++ "note": ""},{"repo": "OpenVibe.Community",-- "table": "analytics_rate_tracking",++ "table": "subject_projection","declaredAt": [-- "vendor/openvibe-shared/analytics.js:137"++ "server/db.js:98"++ ],++ "prodDbs": [++ "community.db"],-- "prodDbs": [],"inCode": true,-- "inProd": false,++ "inProd": true,"target": "OpenVibe.Community","disposition": "keep",-- "wave": "Track O / ADR-021",-- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."++ "wave": "W5",++ "note": ""},{"repo": "OpenVibe.Games",@@@ -14635,6 +15182,38 @@"wave": "W1 (module split)","note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."},++ {++ "repo": "OpenVibe.Network",++ "table": "principal_grants",++ "declaredAt": [++ "server/identity/principals.js:44"++ ],++ "prodDbs": [++ "network.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1 (module split)",++ "note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."++ },++ {++ "repo": "OpenVibe.Network",++ "table": "principal_usage",++ "declaredAt": [++ "server/identity/principals.js:54"++ ],++ "prodDbs": [++ "network.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1 (module split)",++ "note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."++ },{"repo": "OpenVibe.Network","table": "push_subscriptions",@@@ -14671,7 +15250,7 @@"repo": "OpenVibe.Network","table": "stream_live_announcements","declaredAt": [-- "server/internal/routes.js:310"++ "server/internal/routes.js:325"],"prodDbs": ["network.db"@@@ -14764,6 +15343,22 @@"wave": "W1 (module split)","note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."},++ {++ "repo": "OpenVibe.Network",++ "table": "user_modules",++ "declaredAt": [++ "server/identity/modules.js:24"++ ],++ "prodDbs": [++ "network.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1 (module split)",++ "note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."++ },{"repo": "OpenVibe.Network","table": "user_preferences",@@@ -14945,7 +15540,7 @@"file": "server/auth/routes.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,75,75,78,154,235,235,238,369","auth": "oauth-client","timeout": true,"retry": true@@@ -15010,6 +15605,26 @@"timeout": false,"retry": false},++ {++ "caller": "OpenVibe.Live",++ "file": "server/media-proxy/pastes.js",++ "target": "OpenVibe.Community",++ "via": "OV_COMMUNITY_URL",++ "lines": "311",++ "auth": "none-detected",++ "timeout": true,++ "retry": true++ },++ {++ "caller": "OpenVibe.Live",++ "file": "server/pastes-client.js",++ "target": "OpenVibe.Community",++ "via": "OV_COMMUNITY_INTERNAL_URL",++ "lines": "16",++ "auth": "none-detected",++ "timeout": true,++ "retry": true++ },{"caller": "OpenVibe.Live","file": "server/seo/seo.js",@@@ -15085,10 +15700,20 @@"file": "server/monetization/wallet-client.js","target": "OpenVibe.Network","via": "/internal/coins, OV_NETWORK_INTERNAL_URL, :4000",-- "lines": "9,18,18,71,84,95,143",++ "lines": "9,19,19,79,92,103,151","auth": "internal-key, bearer","timeout": true,-- "retry": false++ "retry": true++ },++ {++ "caller": "OpenVibe.Live",++ "file": "server/pastes-client.js",++ "target": "OpenVibe.Network",++ "via": "OV_NETWORK_INTERNAL_URL, :4000",++ "lines": "39,39",++ "auth": "none-detected",++ "timeout": true,++ "retry": true},{"caller": "OpenVibe.Live",@@@ -15115,10 +15740,10 @@"file": "server/utils/notify.js","target": "OpenVibe.Network","via": "OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications",-- "lines": "16,16,60,114,137",++ "lines": "16,16,66,120,143","auth": "internal-key","timeout": false,-- "retry": false++ "retry": true},{"caller": "OpenVibe.Live",@@@ -15195,7 +15820,7 @@"file": "server/auth.js","target": "OpenVibe.Network","via": "network.url, /api/.well-known/jwks",-- "lines": "28,28,83",++ "lines": "29,29,84,99","auth": "none-detected","timeout": true,"retry": true@@@ -15255,7 +15880,7 @@"file": "server/auth.js","target": "webhook","via": "webhook_url (per-app, configured in DB)",-- "lines": "268",++ "lines": "305","auth": "none-detected","timeout": true,"retry": true@@@ -15335,7 +15960,7 @@"file": "server/index.js","target": "OpenVibe.Live","via": ":3000, live.internalUrl",-- "lines": "215,289,477",++ "lines": "215,289,479","auth": "internal-key, bearer","timeout": false,"retry": false@@@ -15571,6 +16196,15 @@],"prod": "community.env"},++ {++ "repo": "OpenVibe.Community",++ "name": "COMMUNITY_DB_PATH",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Community","name": "COOKIE_SECURE",@@@ -15707,6 +16341,15 @@],"prod": null},++ {++ "repo": "OpenVibe.Community",++ "name": "OV_MEDIA_INTERNAL_URL",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Community","name": "OV_MEDIA_URL",@@@ -15817,6 +16460,15 @@],"prod": null},++ {++ "repo": "OpenVibe.Community",++ "name": "PASTES_AUTHORITY",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": "community.env"++ },{"repo": "OpenVibe.Community","name": "PORT",@@@ -15835,6 +16487,15 @@],"prod": "community.env"},++ {++ "repo": "OpenVibe.Community",++ "name": "VIEW_HASH_SECRET",++ "secret": true,++ "files": [++ "server/pastes/service.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Games","name": "DB_PATH",@@@ -16181,6 +16842,7 @@"server/chat/chat-server.js","server/config.js","server/monetization/wallet-client.js",++ "server/net/network-principal.js","server/streaming/routes.js","server/utils/notify.js"],@@@ -16474,12 +17136,22 @@],"prod": null},++ {++ "repo": "OpenVibe.Live",++ "name": "OV_COMMUNITY_INTERNAL_URL",++ "secret": false,++ "files": [++ "server/pastes-client.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Live","name": "OV_COMMUNITY_URL","secret": false,"files": ["server/index.js",++ "server/media-proxy/pastes.js","server/seo/seo.js","vendor/openvibe-shared/brand.js"],@@@ -16538,6 +17210,7 @@"server/chat/chat-server.js","server/config.js","server/monetization/wallet-client.js",++ "server/net/network-principal.js","server/streaming/routes.js","server/utils/notify.js"],@@@ -16595,6 +17268,8 @@"files": ["server/chat/chat-server.js","server/monetization/wallet-client.js",++ "server/net/network-principal.js",++ "server/pastes-client.js","server/utils/notify.js"],"prod": "live.env"@@@ -16634,7 +17309,8 @@"name": "OV_OAUTH_CLIENT_ID","secret": false,"files": [-- "server/auth/routes.js"++ "server/auth/routes.js",++ "server/net/network-principal.js"],"prod": "live.env"},@@@ -16643,7 +17319,8 @@"name": "OV_OAUTH_CLIENT_SECRET","secret": true,"files": [-- "server/auth/routes.js"++ "server/auth/routes.js",++ "server/net/network-principal.js"],"prod": "live.env"},@@@ -16701,6 +17378,15 @@],"prod": null},++ {++ "repo": "OpenVibe.Live",++ "name": "PASTES_AUTHORITY",++ "secret": false,++ "files": [++ "server/pastes-client.js"++ ],++ "prod": "live.env"++ },{"repo": "OpenVibe.Live","name": "PASTES_ON_COMMUNITY",@@@ -17576,6 +18262,23 @@],"prod": null},++ {++ "repo": "OpenVibe.Media",++ "name": "PASTES_FROZEN_APPS",++ "secret": false,++ "files": [++ "server/pastes/routes.js"++ ],++ "prod": "media.env"++ },++ {++ "repo": "OpenVibe.Media",++ "name": "PASTES_MOVED_TO",++ "secret": false,++ "files": [],++ "prod": "media.env",++ "unreferenced": true++ },{"repo": "OpenVibe.Media","name": "PASTES_PATH",@@@ -18697,6 +19400,12 @@"subject": "OpenVibe.Community:COOKIE_SECURE","detail": "secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback"},++ {++ "severity": "low",++ "area": "env",++ "subject": "OpenVibe.Community:VIEW_HASH_SECRET",++ "detail": "secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback"++ },{"severity": "low","area": "env",@@@ -19195,6 +19904,12 @@"subject": "OpenVibe.Live:UNSAFE_WORDS_PATH","detail": "set in live.env but not referenced by scanned code (may be read by a dependency or stale)"},++ {++ "severity": "info",++ "area": "env",++ "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",@@@ -19243,6 +19958,30 @@"subject": "OpenVibe.Tools:MEDIA_URL","detail": "set in tools.env but not referenced by scanned code (may be read by a dependency or stale)"},++ {++ "severity": "info",++ "area": "schema",++ "subject": "OpenVibe.Community:analytics_daily",++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"++ },++ {++ "severity": "info",++ "area": "schema",++ "subject": "OpenVibe.Community:analytics_events",++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"++ },++ {++ "severity": "info",++ "area": "schema",++ "subject": "OpenVibe.Community:analytics_hourly",++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"++ },++ {++ "severity": "info",++ "area": "schema",++ "subject": "OpenVibe.Community:analytics_rate_tracking",++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"++ },{"severity": "info","area": "schema",@@@ -19319,15 +20058,15 @@"metrics": {"github.charters": "20 charter-only repos of 32","contract.todo-markers": "Live 15, Network 0, Media 0, Tools 0, Community 0, Games 0, Sites 0",-- "outbound.call-sites": "65 caller-file/target pairs across 50 files",-- "outbound.internal-key": "28 of 65 call sites authenticate with the shared internal key",++ "outbound.call-sites": "68 caller-file/target pairs across 52 files",++ "outbound.internal-key": "28 of 68 call sites authenticate with the shared internal key","ws.servers": "10 WebSocket server constructions","tables.analytics-copies": "5 repos carry their own analytics_events","vendored.copies": "5 repos vendor openvibe-shared (129 files)","vendored.divergent": "4 divergent: Community/ov-icons.js, Live/user-card.js, Media/ov-icons.js, Tools/ov-icons.js",-- "ci.repos": "0 of 7 scanned repos have .github/workflows",++ "ci.repos": "4 of 7 scanned repos have .github/workflows","deploy.drift": "1 service(s) not running origin/main",-- "tests.OpenVibe.Live": "56 test files",++ "tests.OpenVibe.Live": "58 test files","tables.OpenVibe.Live": "125 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",@@@ -19346,21 +20085,21 @@"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": "18 test files",-- "tables.OpenVibe.Network": "36 tables",-- "tables.OpenVibe.Network.target:OpenVibe.Network": "33 Network tables target OpenVibe.Network",++ "tests.OpenVibe.Network": "20 test files",++ "tables.OpenVibe.Network": "39 tables",++ "tables.OpenVibe.Network.target:OpenVibe.Network": "36 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.Media": "4 test files",++ "tests.OpenVibe.Media": "6 test files","tables.OpenVibe.Media": "15 tables","tables.OpenVibe.Media.target:OpenVibe.Media": "12 Media tables target OpenVibe.Media","tables.OpenVibe.Media.target:OpenVibe.Community": "3 Media tables target OpenVibe.Community","tests.OpenVibe.Tools": "2 test files","tables.OpenVibe.Tools": "4 tables","tables.OpenVibe.Tools.target:OpenVibe.Tools": "4 Tools tables target OpenVibe.Tools",-- "tests.OpenVibe.Community": "8 test files",-- "tables.OpenVibe.Community": "4 tables",-- "tables.OpenVibe.Community.target:OpenVibe.Community": "4 Community tables target OpenVibe.Community",++ "tests.OpenVibe.Community": "14 test files",++ "tables.OpenVibe.Community": "13 tables",++ "tables.OpenVibe.Community.target:OpenVibe.Community": "13 Community tables target OpenVibe.Community","tests.OpenVibe.Games": "56 test files","tables.OpenVibe.Games": "5 tables","tables.OpenVibe.Games.target:OpenVibe.Games": "5 Games tables target OpenVibe.Games",@@@ -19492,7 +20231,7 @@"metrics": [{"key": "outbound.call-sites",-- "value": "65 caller-file/target pairs across 50 files"++ "value": "68 caller-file/target pairs across 52 files"},{"key": "ws.servers",@@@ -19599,7 +20338,7 @@"metrics": [{"key": "tables.OpenVibe.Community",-- "value": "4 tables"++ "value": "13 tables"},{"key": "tables.OpenVibe.Live.target:OpenVibe.Community",@@@ -19754,7 +20493,7 @@"metrics": [{"key": "outbound.internal-key",-- "value": "28 of 65 call sites authenticate with the shared internal key"++ "value": "28 of 68 call sites authenticate with the shared internal key"}],"verified": true@@@ -19877,7 +20616,7 @@"metrics": [{"key": "ci.repos",-- "value": "0 of 7 scanned repos have .github/workflows"++ "value": "4 of 7 scanned repos have .github/workflows"}],"verified": true@@@ -19972,7 +20711,7 @@"mitigation": "Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB).","status": "open","check": "workstation-disk",-- "checkResult": "workstation / is 82% used (at generation time)"++ "checkResult": "workstation / is 83% used (at generation time)"},{"id": "H8",@@@ -20068,25 +20807,25 @@"id": "EC1","text": "Every table has an owner classification","pass": true,-- "detail": "250 tables classified, 0 unclassified"++ "detail": "262 tables classified, 0 unclassified"},{"id": "EC2","text": "Every route is attributed to a repo and source line","pass": true,-- "detail": "928 routes; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"++ "detail": "968 routes; 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","pass": true,-- "detail": "82 timers/jobs"++ "detail": "83 timers/jobs"},{"id": "EC4","text": "Every cross-service call records caller, callee, auth, timeout and retry","pass": true,-- "detail": "65 call sites; 30 with no timeout detected"++ "detail": "68 call sites; 30 with no timeout detected"},{"id": "EC5",
@@ -8,23 +8,23 @@ Deliverable 1: runtimes, ports, units, env files and repository state.
@@ -8,23 +8,23 @@ Deliverable 1: runtimes, ports, units, env files and repository state.
| Service | Repo | Stage | Ports | Units | Env file | Deployed | Databases |
| Service | Repo | Stage | Ports | Units | Env file | Deployed | Databases |
|---|---|---|---|---|---|---|---|
|---|---|---|---|---|---|---|---|
-| network | OpenVibe.Network | live | http 4000 | openvibe-network.service | /etc/openvibe/network.env | 9b4e262 | data/network.db |
-| live | OpenVibe.Live | live | http 3000, rtmp 1935/9935, mediasoup 11000-11300/udp, jsmpegRelayTls 9710-9789 | openvibe-live.socket, openvibe-live.service | /etc/openvibe/live.env | 24151bd | data/live.db, data/analytics.db, data/rs-companion.db |
-| media | OpenVibe.Media | partial | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | 6114bc6 | data/media.db |
+| network | OpenVibe.Network | live | http 4000 | openvibe-network.service | /etc/openvibe/network.env | 1b79576 | data/network.db |
+| live | OpenVibe.Live | live | http 3000, rtmp 1935/9935, mediasoup 11000-11300/udp, jsmpegRelayTls 9710-9789 | openvibe-live.socket, openvibe-live.service | /etc/openvibe/live.env | e266060 | data/live.db, data/analytics.db, data/rs-companion.db |
+| media | OpenVibe.Media | partial | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | ddfefcf | data/media.db |
| tools | OpenVibe.Tools | live | gateway 4001, maps 4010, food 4011, img 4012, yt 4013, audio 4014, text 4015, docs 4016 | openvibe-tools.service, openvibe-tools-maps.service, openvibe-tools-food.service, openvibe-tools-img.service, openvibe-tools-yt.service, openvibe-tools-audio.service, openvibe-tools-text.service, openvibe-tools-docs.service | /etc/openvibe/tools.env | 0346edc | apps/<satellite>/data/analytics.db |
| tools | OpenVibe.Tools | live | gateway 4001, maps 4010, food 4011, img 4012, yt 4013, audio 4014, text 4015, docs 4016 | openvibe-tools.service, openvibe-tools-maps.service, openvibe-tools-food.service, openvibe-tools-img.service, openvibe-tools-yt.service, openvibe-tools-audio.service, openvibe-tools-text.service, openvibe-tools-docs.service | /etc/openvibe/tools.env | 0346edc | apps/<satellite>/data/analytics.db |
| games | OpenVibe.Games | live | http 8000 | openvibe-games.service | /etc/openvibe/games.env | 43c11f0 | data/world.db |
| games | OpenVibe.Games | live | http 8000 | openvibe-games.service | /etc/openvibe/games.env | 43c11f0 | data/world.db |
-| community | OpenVibe.Community | partial | http 4200 | openvibe-community.service | /etc/openvibe/community.env | de947ea | none |
+| community | OpenVibe.Community | partial | http 4200 | openvibe-community.service | /etc/openvibe/community.env | d7c6e60 | none |
| sites | OpenVibe.Sites | placeholder-host | | - | - | 185014f | none |
| sites | OpenVibe.Sites | placeholder-host | | - | - | 185014f | none |
## Scanned repositories
## Scanned repositories
| Repo | HEAD | origin/main | Source files | LOC | Test files | CI | Routes | Tables | WS servers | Timers/jobs | TODO(contract) |
| Repo | HEAD | origin/main | Source files | LOC | Test files | CI | Routes | Tables | WS servers | Timers/jobs | TODO(contract) |
|---|---|---|---|---|---|---|---|---|---|---|---|
|---|---|---|---|---|---|---|---|---|---|---|---|
-| OpenVibe.Live | 24151bd | 24151bd | 165 | 69699 | 56 | no | 532 | 125 | 8 | 48 | 15 |
-| OpenVibe.Network | 9b4e262 | 9b4e262 | 79 | 20646 | 18 | no | 187 | 36 | 0 | 11 | 0 |
-| OpenVibe.Media | 6114bc6 | 6114bc6 | 28 | 8702 | 4 | no | 67 | 15 | 0 | 9 | 0 |
+| OpenVibe.Live | e266060 | e266060 | 167 | 69978 | 58 | yes | 537 | 125 | 8 | 48 | 15 |
+| OpenVibe.Network | 1b79576 | 1b79576 | 81 | 21029 | 20 | yes | 197 | 39 | 0 | 11 | 0 |
+| OpenVibe.Media | ddfefcf | ddfefcf | 28 | 8752 | 6 | yes | 67 | 15 | 0 | 9 | 0 |
| OpenVibe.Tools | 0346edc | 0346edc | 117 | 20018 | 2 | no | 99 | 4 | 0 | 12 | 0 |
| OpenVibe.Tools | 0346edc | 0346edc | 117 | 20018 | 2 | no | 99 | 4 | 0 | 12 | 0 |
-| OpenVibe.Community | de947ea | de947ea | 11 | 1754 | 8 | no | 22 | 4 | 0 | 0 | 0 |
+| OpenVibe.Community | d7c6e60 | d7c6e60 | 21 | 3950 | 14 | yes | 47 | 13 | 0 | 1 | 0 |
| OpenVibe.Games | 5710287 | 5710287 | 101 | 18511 | 56 | no | 21 | 5 | 2 | 2 | 0 |
| OpenVibe.Games | 5710287 | 5710287 | 101 | 18511 | 56 | no | 21 | 5 | 2 | 2 | 0 |
| OpenVibe.Sites | 185014f | 185014f | 1 | 306 | 0 | no | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Sites | 185014f | 185014f | 1 | 306 | 0 | no | 0 | 0 | 0 | 0 | 0 |
@@ -43,17 +43,17 @@ LOC counts non-test source files in the scanned directories only (`server/`, `ap
@@ -43,17 +43,17 @@ LOC counts non-test source files in the scanned directories only (`server/`, `ap
| OpenVibe.Blog | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds. |
| OpenVibe.Blog | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds. |
| OpenVibe.Chat | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation. |
| OpenVibe.Chat | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation. |
| OpenVibe.Codes | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance. |
| OpenVibe.Codes | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance. |
-| OpenVibe.Community | PUBLIC | - | 2026-09-21 | 687 KB | |
-| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-22 | 13 KB | Machine-readable contracts for the whole OpenVibe network. |
+| OpenVibe.Community | PUBLIC | - | 2026-09-22 | 689 KB | |
+| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-22 | 89 KB | Machine-readable contracts for the whole OpenVibe network. |
| OpenVibe.Coupons | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Coupon codes with merchant matching, restrictions, expiry and real-people validity reports. |
| OpenVibe.Coupons | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Coupon codes with merchant matching, restrictions, expiry and real-people validity reports. |
| OpenVibe.Deals | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Deals submitted and voted on by the community, with source, price and freshness always shown. |
| OpenVibe.Deals | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Deals submitted and voted on by the community, with source, price and freshness always shown. |
| OpenVibe.Events | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Durable events, subscriptions, delivery, retry, dead letters and replay for the network. |
| OpenVibe.Events | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Durable events, subscriptions, delivery, retry, dead letters and replay for the network. |
| OpenVibe.Examples | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Executable public integration examples, tested in CI against the platform. |
| OpenVibe.Examples | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Executable public integration examples, tested in CI against the platform. |
| OpenVibe.Games | PUBLIC | - | 2026-09-21 | 4675 KB | |
| OpenVibe.Games | PUBLIC | - | 2026-09-21 | 4675 KB | |
| OpenVibe.Host | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The network's deployment/control plane first; then isolated hosting for community sites, bots and mods. |
| OpenVibe.Host | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The network's deployment/control plane first; then isolated hosting for community sites, bots and mods. |
-| OpenVibe.Live | PUBLIC | - | 2026-09-22 | 6455 KB | |
-| OpenVibe.Media | PUBLIC | - | 2026-09-21 | 847 KB | |
-| OpenVibe.Network | PUBLIC | - | 2026-09-22 | 1037 KB | |
+| OpenVibe.Live | PUBLIC | - | 2026-09-22 | 6507 KB | |
+| OpenVibe.Media | PUBLIC | - | 2026-09-22 | 847 KB | |
+| OpenVibe.Network | PUBLIC | - | 2026-09-22 | 1306 KB | |
| OpenVibe.News | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Source-backed stories: clustered coverage, cited summaries, perspectives and timelines. |
| OpenVibe.News | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Source-backed stories: clustered coverage, cited summaries, perspectives and timelines. |
| OpenVibe.Realtime | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Browser delivery plane for events: authorised WS/SSE topics with cursors, resume and presence. |
| OpenVibe.Realtime | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Browser delivery plane for events: authorised WS/SSE topics with cursors, resume and presence. |
| OpenVibe.Reviews | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Review signals gathered across sources with provenance, entity resolution and honest aggregates. |
| OpenVibe.Reviews | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Review signals gathered across sources with provenance, entity resolution and honest aggregates. |
@@ -8,6 +8,7 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -8,6 +8,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| File | Size | Tables |
| File | Size | Tables |
|---|---|---|
|---|---|---|
+| /opt/openvibe.community/data/community.db | 115 KB | 9 |
| /opt/openvibe.games/data/world.db | 74 KB | 5 |
| /opt/openvibe.games/data/world.db | 74 KB | 5 |
| /opt/openvibe.live/data/backups/live-pre-643a2e6.db | 264.7 MB | 145 |
| /opt/openvibe.live/data/backups/live-pre-643a2e6.db | 264.7 MB | 145 |
| /opt/openvibe.live/data/openvibe.db | 0 B | 0 |
| /opt/openvibe.live/data/openvibe.db | 0 B | 0 |
@@ -16,7 +17,7 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -16,7 +17,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| /opt/openvibe.live/data/live.db | 279.2 MB | 146 |
| /opt/openvibe.live/data/live.db | 279.2 MB | 146 |
| /opt/openvibe.live/data/rs-companion.db | 8.6 MB | 33 |
| /opt/openvibe.live/data/rs-companion.db | 8.6 MB | 33 |
| /opt/openvibe.media/data/media.db | 5.6 MB | 11 |
| /opt/openvibe.media/data/media.db | 5.6 MB | 11 |
-| /opt/openvibe.network/data/network.db | 766.5 MB | 35 |
+| /opt/openvibe.network/data/network.db | 766.5 MB | 38 |
| /opt/openvibe.tools/apps/audio/data/analytics.db | 59.9 MB | 4 |
| /opt/openvibe.tools/apps/audio/data/analytics.db | 59.9 MB | 4 |
| /opt/openvibe.tools/apps/img/data/analytics.db | 5.5 MB | 4 |
| /opt/openvibe.tools/apps/img/data/analytics.db | 5.5 MB | 4 |
| /opt/openvibe.tools/apps/docs/data/analytics.db | 1.5 MB | 4 |
| /opt/openvibe.tools/apps/docs/data/analytics.db | 1.5 MB | 4 |
@@ -216,7 +217,7 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -216,7 +217,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| watch_time | server/db/schema.sql:706 | live.db | OpenVibe.Live | keep | - |
| watch_time | server/db/schema.sql:706 | live.db | OpenVibe.Live | keep | - |
| woodcut_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
| woodcut_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
-## OpenVibe.Network (36)
+## OpenVibe.Network (39)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
@@ -243,14 +244,17 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -243,14 +244,17 @@ Deliverable 2: every table declared in code or present in production, with curre
| oauth_codes | server/db/database.js:144 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_codes | server/db/database.js:144 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_tokens | server/db/database.js:158 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_tokens | server/db/database.js:158 | network.db | OpenVibe.Network | keep | W1 (module split) |
| password_reset_tokens | server/db/database.js:321 | network.db | OpenVibe.Network | keep | W1 (module split) |
| password_reset_tokens | server/db/database.js:321 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| principal_grants | server/identity/principals.js:44 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| principal_usage | server/identity/principals.js:54 | network.db | OpenVibe.Network | keep | W1 (module split) |
| push_subscriptions | server/db/database.js:460 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) |
| push_subscriptions | server/db/database.js:460 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) |
| site_settings | server/db/database.js:238 | network.db | OpenVibe.Network | keep | - |
| site_settings | server/db/database.js:238 | network.db | OpenVibe.Network | keep | - |
-| stream_live_announcements | server/internal/routes.js:310 | network.db | OpenVibe.Events | extract | W3 |
+| stream_live_announcements | server/internal/routes.js:325 | network.db | OpenVibe.Events | extract | W3 |
| themes | server/db/database.js:183 | network.db | OpenVibe.Network | keep | W1 (module split) |
| themes | server/db/database.js:183 | network.db | OpenVibe.Network | keep | W1 (module split) |
| tool_domains | server/domains/routes.js:44 | network.db | OpenVibe.Network | keep | W1 (module split) |
| tool_domains | server/domains/routes.js:44 | network.db | OpenVibe.Network | keep | W1 (module split) |
| url_registry | server/db/database.js:245, server/url-registry.js:7 | network.db | OpenVibe.Network | keep | W1 (module split) |
| url_registry | server/db/database.js:245, server/url-registry.js:7 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_effects | server/db/database.js:375 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_effects | server/db/database.js:375 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_history | server/history/routes.js:26 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_history | server/history/routes.js:26 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| user_modules | server/identity/modules.js:24 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_preferences | server/db/database.js:172 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_preferences | server/db/database.js:172 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_sessions | server/db/database.js:354 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_sessions | server/db/database.js:354 | network.db | OpenVibe.Network | keep | W1 (module split) |
| users | server/db/database.js:113 | network.db | OpenVibe.Network | keep | W1 (module split) |
| users | server/db/database.js:113 | network.db | OpenVibe.Network | keep | W1 (module split) |
@@ -286,7 +290,7 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -286,7 +290,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| analytics_hourly | vendor/openvibe-shared/analytics.js:98 | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 |
| analytics_hourly | vendor/openvibe-shared/analytics.js:98 | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 |
| analytics_rate_tracking | vendor/openvibe-shared/analytics.js:137 | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 |
| analytics_rate_tracking | vendor/openvibe-shared/analytics.js:137 | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 |
-## OpenVibe.Community (4)
+## OpenVibe.Community (13)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
@@ -294,6 +298,15 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -294,6 +298,15 @@ Deliverable 2: every table declared in code or present in production, with curre
| analytics_events | vendor/openvibe-shared/analytics.js:74 | no | OpenVibe.Community | keep | Track O / ADR-021 |
| analytics_events | vendor/openvibe-shared/analytics.js:74 | no | OpenVibe.Community | keep | Track O / ADR-021 |
| analytics_hourly | vendor/openvibe-shared/analytics.js:98 | no | OpenVibe.Community | keep | Track O / ADR-021 |
| analytics_hourly | vendor/openvibe-shared/analytics.js:98 | no | OpenVibe.Community | keep | Track O / ADR-021 |
| analytics_rate_tracking | vendor/openvibe-shared/analytics.js:137 | no | OpenVibe.Community | keep | Track O / ADR-021 |
| analytics_rate_tracking | vendor/openvibe-shared/analytics.js:137 | no | OpenVibe.Community | keep | Track O / ADR-021 |
+| import_hold | server/db.js:125 | community.db | OpenVibe.Community | keep | W5 |
+| legacy_id_map | server/db.js:116 | community.db | OpenVibe.Community | keep | W5 |
+| migration_runs | server/db.js:108 | community.db | OpenVibe.Community | keep | W5 |
+| paste_comments | server/db.js:72 | community.db | OpenVibe.Community | keep | W5 |
+| paste_likes | server/db.js:65 | community.db | OpenVibe.Community | keep | W5 |
+| paste_versions | server/db.js:54 | community.db | OpenVibe.Community | keep | W5 |
+| paste_visits | server/db.js:88 | community.db | OpenVibe.Community | keep | W5 |
+| pastes | server/db.js:18 | community.db | OpenVibe.Community | keep | W5 |
+| subject_projection | server/db.js:98 | community.db | OpenVibe.Community | keep | W5 |
## OpenVibe.Games (5)
## OpenVibe.Games (5)
@@ -8,11 +8,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -8,11 +8,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| Repo | Routes | GET | POST | PUT/PATCH | DELETE | Other | /internal/* |
| Repo | Routes | GET | POST | PUT/PATCH | DELETE | Other | /internal/* |
|---|---|---|---|---|---|---|---|
|---|---|---|---|---|---|---|---|
-| OpenVibe.Live | 532 | 274 | 160 | 50 | 47 | 1 | 6 |
-| OpenVibe.Network | 187 | 81 | 70 | 22 | 14 | 0 | 27 |
+| OpenVibe.Live | 537 | 275 | 163 | 50 | 48 | 1 | 6 |
+| OpenVibe.Network | 197 | 86 | 72 | 24 | 15 | 0 | 30 |
| OpenVibe.Media | 67 | 28 | 27 | 4 | 8 | 0 | 1 |
| OpenVibe.Media | 67 | 28 | 27 | 4 | 8 | 0 | 1 |
| OpenVibe.Tools | 99 | 84 | 12 | 0 | 2 | 1 | 0 |
| OpenVibe.Tools | 99 | 84 | 12 | 0 | 2 | 1 | 0 |
-| OpenVibe.Community | 22 | 19 | 3 | 0 | 0 | 0 | 0 |
+| OpenVibe.Community | 47 | 30 | 13 | 1 | 3 | 0 | 0 |
| OpenVibe.Games | 21 | 0 | 3 | 0 | 0 | 18 | 0 |
| OpenVibe.Games | 21 | 0 | 3 | 0 | 0 | 18 | 0 |
@@ -359,6 +359,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -359,6 +359,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /api/pastes/:slug | server/media-proxy/pastes.js:215 |
| GET | /api/pastes/:slug | server/media-proxy/pastes.js:215 |
| PUT | /api/pastes/:slug | server/media-proxy/pastes.js:216 |
| PUT | /api/pastes/:slug | server/media-proxy/pastes.js:216 |
| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:222 |
| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:222 |
+| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:315 |
| GET | /api/pastes/:slug/comments | server/media-proxy/pastes.js:243 |
| GET | /api/pastes/:slug/comments | server/media-proxy/pastes.js:243 |
| POST | /api/pastes/:slug/comments | server/media-proxy/pastes.js:246 |
| POST | /api/pastes/:slug/comments | server/media-proxy/pastes.js:246 |
| DELETE | /api/pastes/:slug/comments/:commentId | server/media-proxy/pastes.js:248 |
| DELETE | /api/pastes/:slug/comments/:commentId | server/media-proxy/pastes.js:248 |
@@ -366,10 +367,14 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -366,10 +367,14 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /api/pastes/:slug/fork | server/media-proxy/pastes.js:238 |
| POST | /api/pastes/:slug/fork | server/media-proxy/pastes.js:238 |
| POST | /api/pastes/:slug/like | server/media-proxy/pastes.js:241 |
| POST | /api/pastes/:slug/like | server/media-proxy/pastes.js:241 |
| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:240 |
| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:240 |
+| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:311 |
| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:110 |
| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:110 |
+| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:296 |
| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:171 |
| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:171 |
+| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:313 |
| GET | /api/pastes/admin/stats | server/media-proxy/pastes.js:170 |
| GET | /api/pastes/admin/stats | server/media-proxy/pastes.js:170 |
| POST | /api/pastes/bulk | server/media-proxy/pastes.js:172 |
| POST | /api/pastes/bulk | server/media-proxy/pastes.js:172 |
+| POST | /api/pastes/bulk | server/media-proxy/pastes.js:314 |
| GET | /api/pastes/by-user/:username | server/media-proxy/pastes.js:177 |
| GET | /api/pastes/by-user/:username | server/media-proxy/pastes.js:177 |
| GET | /api/pastes/config | server/media-proxy/pastes.js:169 |
| GET | /api/pastes/config | server/media-proxy/pastes.js:169 |
| POST | /api/pastes/screenshot | server/media-proxy/pastes.js:83 |
| POST | /api/pastes/screenshot | server/media-proxy/pastes.js:83 |
@@ -563,7 +568,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -563,7 +568,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| PUT | / | server/discord/routes.js:33 |
| PUT | / | server/discord/routes.js:33 |
| POST | /:id/dismiss | server/notifications/routes.js:100 |
| POST | /:id/dismiss | server/notifications/routes.js:100 |
| POST | /:id/read | server/notifications/routes.js:67 |
| POST | /:id/read | server/notifications/routes.js:67 |
-| GET | /.well-known/web-identity | server/index.js:572 |
+| GET | /.well-known/web-identity | server/index.js:574 |
| POST | /admin | server/setup/routes.js:114 |
| POST | /admin | server/setup/routes.js:114 |
| GET | /api/.well-known/jwks | server/index.js:356 |
| GET | /api/.well-known/jwks | server/index.js:356 |
| GET | /api/admin/domains | server/domains/routes.js:176 |
| GET | /api/admin/domains | server/domains/routes.js:176 |
@@ -573,7 +578,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -573,7 +578,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| PUT | /api/admin/domains/:id | server/domains/routes.js:238 |
| PUT | /api/admin/domains/:id | server/domains/routes.js:238 |
| GET | /api/admin/domains/catalog | server/domains/routes.js:206 |
| GET | /api/admin/domains/catalog | server/domains/routes.js:206 |
| POST | /api/admin/domains/check | server/domains/routes.js:217 |
| POST | /api/admin/domains/check | server/domains/routes.js:217 |
-| GET | /api/admin/ssh-info | server/index.js:452 |
+| GET | /api/admin/ssh-info | server/index.js:454 |
| GET | /api/auth/anon-identities | server/auth/routes.js:638 |
| GET | /api/auth/anon-identities | server/auth/routes.js:638 |
| POST | /api/auth/anon-session | server/auth/routes.js:515 |
| POST | /api/auth/anon-session | server/auth/routes.js:515 |
| GET | /api/auth/anon/:token | server/auth/routes.js:585 |
| GET | /api/auth/anon/:token | server/auth/routes.js:585 |
@@ -604,7 +609,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -604,7 +609,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| DELETE | /api/auth/users/:id/follow | server/auth/routes.js:814 |
| DELETE | /api/auth/users/:id/follow | server/auth/routes.js:814 |
| POST | /api/auth/users/:id/follow | server/auth/routes.js:783 |
| POST | /api/auth/users/:id/follow | server/auth/routes.js:783 |
| GET | /api/brand | server/index.js:373 |
| GET | /api/brand | server/index.js:373 |
-| GET | /api/catalog.json | server/index.js:423 |
+| GET | /api/catalog.json | server/index.js:425 |
| GET | /api/chrome | server/chrome/service.js:137 |
| GET | /api/chrome | server/chrome/service.js:137 |
| POST | /api/chrome/hit | server/chrome/service.js:150 |
| POST | /api/chrome/hit | server/chrome/service.js:150 |
| GET | /api/domains | server/domains/routes.js:176 |
| GET | /api/domains | server/domains/routes.js:176 |
@@ -620,6 +625,13 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -620,6 +625,13 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /api/history | server/history/routes.js:108 |
| POST | /api/history | server/history/routes.js:108 |
| DELETE | /api/history/:id | server/history/routes.js:148 |
| DELETE | /api/history/:id | server/history/routes.js:148 |
| PUT | /api/history/settings | server/history/routes.js:137 |
| PUT | /api/history/settings | server/history/routes.js:137 |
+| GET | /api/modules | server/identity/modules.js:101 |
+| DELETE | /api/modules/:ns | server/identity/modules.js:126 |
+| GET | /api/modules/:ns | server/identity/modules.js:109 |
+| PUT | /api/modules/:ns | server/identity/modules.js:117 |
+| GET | /api/modules/:ns/public/:subject | server/identity/modules.js:93 |
+| GET | /api/modules/modules/:ns/:subject | server/identity/modules.js:140 |
+| PUT | /api/modules/modules/:ns/:subject | server/identity/modules.js:149 |
| DELETE | /api/profile/avatar | server/profile/avatar.js:107 |
| DELETE | /api/profile/avatar | server/profile/avatar.js:107 |
| PUT | /api/profile/avatar | server/profile/avatar.js:96 |
| PUT | /api/profile/avatar | server/profile/avatar.js:96 |
| GET | /api/profile/avatar/:username | server/profile/avatar.js:110 |
| GET | /api/profile/avatar/:username | server/profile/avatar.js:110 |
@@ -628,7 +640,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -628,7 +640,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /api/push/subscribe | server/push/routes.js:17 |
| POST | /api/push/subscribe | server/push/routes.js:17 |
| POST | /api/push/unsubscribe | server/push/routes.js:29 |
| POST | /api/push/unsubscribe | server/push/routes.js:29 |
| GET | /api/push/vapid-key | server/push/routes.js:10 |
| GET | /api/push/vapid-key | server/push/routes.js:10 |
-| GET | /api/sso/targets | server/index.js:405 |
+| GET | /api/sso/targets | server/index.js:407 |
| GET | /api/themes | server/themes/routes.js:41 |
| GET | /api/themes | server/themes/routes.js:41 |
| POST | /api/themes | server/themes/routes.js:148 |
| POST | /api/themes | server/themes/routes.js:148 |
| GET | /api/themes/:idOrSlug | server/themes/routes.js:109 |
| GET | /api/themes/:idOrSlug | server/themes/routes.js:109 |
@@ -664,34 +676,37 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -664,34 +676,37 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /fedcm/disconnect | server/auth/fedcm.js:142 |
| POST | /fedcm/disconnect | server/auth/fedcm.js:142 |
| GET | /health | server/admin/routes.js:766 |
| GET | /health | server/admin/routes.js:766 |
| POST | /identity | server/setup/routes.js:152 |
| POST | /identity | server/setup/routes.js:152 |
-| GET | /internal/anon-admin | server/internal/routes.js:628 |
-| GET | /internal/anon-list | server/internal/routes.js:677 |
-| POST | /internal/audit | server/internal/routes.js:166 |
-| POST | /internal/coins/credit | server/internal/routes.js:252 |
-| POST | /internal/coins/debit | server/internal/routes.js:264 |
-| GET | /internal/coins/stats | server/internal/routes.js:214 |
-| POST | /internal/coins/transfer | server/internal/routes.js:277 |
-| POST | /internal/events/stream-live | server/internal/routes.js:294 |
-| POST | /internal/identity/legacy-map | server/identity/internal-routes.js:29 |
+| GET | /internal/anon-admin | server/internal/routes.js:643 |
+| GET | /internal/anon-list | server/internal/routes.js:692 |
+| POST | /internal/audit | server/internal/routes.js:178 |
+| POST | /internal/coins/credit | server/internal/routes.js:267 |
+| POST | /internal/coins/debit | server/internal/routes.js:279 |
+| GET | /internal/coins/stats | server/internal/routes.js:226 |
+| POST | /internal/coins/transfer | server/internal/routes.js:292 |
+| POST | /internal/events/stream-live | server/internal/routes.js:309 |
+| POST | /internal/identity/legacy-map | server/identity/internal-routes.js:52 |
| GET | /internal/identity/resolve | server/identity/internal-routes.js:18 |
| GET | /internal/identity/resolve | server/identity/internal-routes.js:18 |
-| POST | /internal/issue-token | server/internal/routes.js:518 |
-| POST | /internal/link-account | server/internal/routes.js:108 |
-| POST | /internal/notifications/mark-read | server/internal/routes.js:479 |
-| POST | /internal/notifications/push | server/internal/routes.js:421 |
-| POST | /internal/notifications/push-bulk | server/internal/routes.js:441 |
-| POST | /internal/notifications/resolve-users | server/internal/routes.js:498 |
-| GET | /internal/notifications/unread/:userId | server/internal/routes.js:464 |
-| POST | /internal/resolve-anon | server/internal/routes.js:549 |
-| GET | /internal/stats | server/internal/routes.js:175 |
-| GET | /internal/url-registry/resolved | server/internal/routes.js:184 |
-| POST | /internal/user-avatar | server/internal/routes.js:151 |
-| GET | /internal/users/:id | server/internal/routes.js:59 |
-| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:159 |
-| GET | /internal/users/:id/theme | server/internal/routes.js:96 |
-| POST | /internal/users/bulk | server/internal/routes.js:81 |
-| GET | /internal/users/by-username/:username | server/internal/routes.js:70 |
-| POST | /internal/verify-token | server/internal/routes.js:37 |
-| GET | /llms.txt | server/index.js:550 |
+| GET | /internal/identity/resolve | server/internal/routes.js:40 |
+| POST | /internal/identity/resolve-batch | server/identity/internal-routes.js:35 |
+| POST | /internal/identity/resolve-batch | server/internal/routes.js:41 |
+| POST | /internal/issue-token | server/internal/routes.js:533 |
+| POST | /internal/link-account | server/internal/routes.js:120 |
+| POST | /internal/notifications/mark-read | server/internal/routes.js:494 |
+| POST | /internal/notifications/push | server/internal/routes.js:436 |
+| POST | /internal/notifications/push-bulk | server/internal/routes.js:456 |
+| POST | /internal/notifications/resolve-users | server/internal/routes.js:513 |
+| GET | /internal/notifications/unread/:userId | server/internal/routes.js:479 |
+| POST | /internal/resolve-anon | server/internal/routes.js:564 |
+| GET | /internal/stats | server/internal/routes.js:187 |
+| GET | /internal/url-registry/resolved | server/internal/routes.js:196 |
+| POST | /internal/user-avatar | server/internal/routes.js:163 |
+| GET | /internal/users/:id | server/internal/routes.js:71 |
+| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:171 |
+| GET | /internal/users/:id/theme | server/internal/routes.js:108 |
+| POST | /internal/users/bulk | server/internal/routes.js:93 |
+| GET | /internal/users/by-username/:username | server/internal/routes.js:82 |
+| POST | /internal/verify-token | server/internal/routes.js:49 |
+| GET | /llms.txt | server/index.js:552 |
| GET | /me | server/coins/routes.js:18 |
| GET | /me | server/coins/routes.js:18 |
| GET | /me/history | server/coins/routes.js:24 |
| GET | /me/history | server/coins/routes.js:24 |
| GET | /net-config | server/admin/routes.js:907 |
| GET | /net-config | server/admin/routes.js:907 |
@@ -702,11 +717,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -702,11 +717,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /nginx/preview/:serviceId | server/deploy/routes.js:314 |
| GET | /nginx/preview/:serviceId | server/deploy/routes.js:314 |
| POST | /nginx/reload | server/deploy/routes.js:382 |
| POST | /nginx/reload | server/deploy/routes.js:382 |
| POST | /nginx/validate | server/deploy/routes.js:330 |
| POST | /nginx/validate | server/deploy/routes.js:330 |
-| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:306 |
-| GET | /oauth/authorize | server/auth/oauth-routes.js:21 |
-| POST | /oauth/confirm | server/auth/oauth-routes.js:79 |
-| POST | /oauth/token | server/auth/oauth-routes.js:132 |
-| GET | /openvibe-sw.js | server/index.js:596 |
+| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:318 |
+| GET | /oauth/authorize | server/auth/oauth-routes.js:22 |
+| POST | /oauth/confirm | server/auth/oauth-routes.js:80 |
+| POST | /oauth/token | server/auth/oauth-routes.js:133 |
+| GET | /openvibe-sw.js | server/index.js:598 |
| GET | /overview | server/admin/analytics-routes.js:75 |
| GET | /overview | server/admin/analytics-routes.js:75 |
| GET | /preferences | server/notifications/routes.js:121 |
| GET | /preferences | server/notifications/routes.js:121 |
| PUT | /preferences | server/notifications/routes.js:132 |
| PUT | /preferences | server/notifications/routes.js:132 |
@@ -720,11 +735,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -720,11 +735,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /service/:name | server/admin/analytics-routes.js:224 |
| GET | /service/:name | server/admin/analytics-routes.js:224 |
| GET | /settings | server/admin/routes.js:300 |
| GET | /settings | server/admin/routes.js:300 |
| PUT | /settings | server/admin/routes.js:328 |
| PUT | /settings | server/admin/routes.js:328 |
-| GET | /sso/check | server/index.js:577 |
+| GET | /sso/check | server/index.js:579 |
| GET | /status | server/setup/routes.js:91 |
| GET | /status | server/setup/routes.js:91 |
| POST | /test | server/discord/routes.js:77 |
| POST | /test | server/discord/routes.js:77 |
| POST | /test-live | server/discord/routes.js:87 |
| POST | /test-live | server/discord/routes.js:87 |
-| GET | /tos | server/index.js:419 |
+| GET | /tos | server/index.js:421 |
| GET | /unread-by-category | server/notifications/routes.js:47 |
| GET | /unread-by-category | server/notifications/routes.js:47 |
| GET | /unread-count | server/notifications/routes.js:37 |
| GET | /unread-count | server/notifications/routes.js:37 |
| GET | /url-registry | server/admin/routes.js:353 |
| GET | /url-registry | server/admin/routes.js:353 |
@@ -743,7 +758,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -743,7 +758,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /verification-keys | server/admin/routes.js:824 |
| GET | /verification-keys | server/admin/routes.js:824 |
| POST | /verification-keys | server/admin/routes.js:833 |
| POST | /verification-keys | server/admin/routes.js:833 |
| DELETE | /verification-keys/:id | server/admin/routes.js:881 |
| DELETE | /verification-keys/:id | server/admin/routes.js:881 |
-| GET | /verify-email | server/index.js:562 |
+| GET | /verify-email | server/index.js:564 |
## OpenVibe.Media
## OpenVibe.Media
@@ -771,26 +786,26 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -771,26 +786,26 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /api/v1/:app/files | server/files/routes.js:75 |
| POST | /api/v1/:app/files | server/files/routes.js:75 |
| DELETE | /api/v1/:app/files/:key | server/files/routes.js:167 |
| DELETE | /api/v1/:app/files/:key | server/files/routes.js:167 |
| GET | /api/v1/:app/files/:key | server/files/routes.js:156 |
| GET | /api/v1/:app/files/:key | server/files/routes.js:156 |
-| GET | /api/v1/:app/pastes | server/pastes/routes.js:248 |
-| POST | /api/v1/:app/pastes | server/pastes/routes.js:462 |
-| DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:616 |
-| GET | /api/v1/:app/pastes/:slug | server/pastes/routes.js:436 |
-| PUT | /api/v1/:app/pastes/:slug | server/pastes/routes.js:578 |
-| POST | /api/v1/:app/pastes/:slug/ai | server/pastes/routes.js:558 |
-| POST | /api/v1/:app/pastes/:slug/censor | server/pastes/routes.js:397 |
-| GET | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:702 |
-| POST | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:725 |
-| DELETE | /api/v1/:app/pastes/:slug/comments/:commentId | server/pastes/routes.js:803 |
-| POST | /api/v1/:app/pastes/:slug/copy | server/pastes/routes.js:677 |
-| POST | /api/v1/:app/pastes/:slug/fork | server/pastes/routes.js:634 |
-| POST | /api/v1/:app/pastes/:slug/like | server/pastes/routes.js:660 |
-| DELETE | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:359 |
-| GET | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:339 |
-| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:329 |
-| POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:372 |
-| GET | /api/v1/:app/pastes/config | server/pastes/routes.js:307 |
-| GET | /api/v1/:app/stats | server/index.js:93 |
-| GET | /api/v1/:app/stats/series/:metric | server/index.js:103 |
+| GET | /api/v1/:app/pastes | server/pastes/routes.js:257 |
+| POST | /api/v1/:app/pastes | server/pastes/routes.js:471 |
+| DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:625 |
+| GET | /api/v1/:app/pastes/:slug | server/pastes/routes.js:445 |
+| PUT | /api/v1/:app/pastes/:slug | server/pastes/routes.js:587 |
+| POST | /api/v1/:app/pastes/:slug/ai | server/pastes/routes.js:567 |
+| POST | /api/v1/:app/pastes/:slug/censor | server/pastes/routes.js:406 |
+| GET | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:711 |
+| POST | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:734 |
+| DELETE | /api/v1/:app/pastes/:slug/comments/:commentId | server/pastes/routes.js:812 |
+| POST | /api/v1/:app/pastes/:slug/copy | server/pastes/routes.js:686 |
+| POST | /api/v1/:app/pastes/:slug/fork | server/pastes/routes.js:643 |
+| POST | /api/v1/:app/pastes/:slug/like | server/pastes/routes.js:669 |
+| DELETE | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:368 |
+| GET | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:348 |
+| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:338 |
+| POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:381 |
+| GET | /api/v1/:app/pastes/config | server/pastes/routes.js:316 |
+| GET | /api/v1/:app/stats | server/index.js:94 |
+| GET | /api/v1/:app/stats/series/:metric | server/index.js:104 |
| POST | /api/v1/:app/thumbnails/:kind/:id | server/thumbnails/routes.js:38 |
| POST | /api/v1/:app/thumbnails/:kind/:id | server/thumbnails/routes.js:38 |
| GET | /api/v1/:app/views | server/views/routes.js:39 |
| GET | /api/v1/:app/views | server/views/routes.js:39 |
| POST | /api/v1/:app/views | server/views/routes.js:24 |
| POST | /api/v1/:app/views | server/views/routes.js:24 |
@@ -812,10 +827,10 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -812,10 +827,10 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /auth/logout | server/user-auth.js:355 |
| GET | /auth/logout | server/user-auth.js:355 |
| GET | /auth/me | server/user-auth.js:379 |
| GET | /auth/me | server/user-auth.js:379 |
| POST | /auth/refresh | server/user-auth.js:389 |
| POST | /auth/refresh | server/user-auth.js:389 |
-| GET | /healthz | server/index.js:82 |
-| POST | /internal/avatar-ingest | server/index.js:56 |
-| GET | /manifest.webmanifest | server/index.js:44 |
-| GET | /tos | server/index.js:41 |
+| GET | /healthz | server/index.js:83 |
+| POST | /internal/avatar-ingest | server/index.js:57 |
+| GET | /manifest.webmanifest | server/index.js:45 |
+| GET | /tos | server/index.js:42 |
## OpenVibe.Tools
## OpenVibe.Tools
@@ -925,28 +940,53 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -925,28 +940,53 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| Method | Path | Source |
| Method | Path | Source |
|---|---|---|
|---|---|---|
-| GET | / | server/app.js:106 |
-| GET | /api/health | server/app.js:81 |
-| GET | /api/ready | server/app.js:82 |
-| GET | /callback | server/auth/routes.js:281 |
-| POST | /fedcm | server/auth/routes.js:327 |
-| GET | /feed.xml | server/app.js:99 |
-| GET | /login | server/auth/routes.js:259 |
-| GET | /logout | server/auth/routes.js:355 |
-| GET | /me | server/auth/routes.js:379 |
-| GET | /my | server/app.js:186 |
-| GET | /new | server/app.js:150 |
-| POST | /new | server/app.js:159 |
-| GET | /p/:slug | server/app.js:119 |
-| GET | /p/:slug/download | server/app.js:138 |
-| GET | /p/:slug/raw | server/app.js:135 |
-| GET | /p/:slug/screenshot | server/app.js:136 |
-| GET | /pastes | server/app.js:111 |
-| GET | /pastes/:slug | server/app.js:117 |
-| POST | /refresh | server/auth/routes.js:389 |
-| GET | /robots.txt | server/app.js:97 |
-| GET | /sitemap.xml | server/app.js:98 |
-| GET | /tos | server/app.js:75 |
+| GET | / | server/app.js:146 |
+| GET | /api/health | server/app.js:120 |
+| GET | /api/pastes | server/pastes/api.js:102 |
+| POST | /api/pastes | server/pastes/api.js:106 |
+| DELETE | /api/pastes/:slug | server/pastes/api.js:124 |
+| GET | /api/pastes/:slug | server/pastes/api.js:122 |
+| PUT | /api/pastes/:slug | server/pastes/api.js:123 |
+| POST | /api/pastes/:slug/ai | server/pastes/api.js:127 |
+| POST | /api/pastes/:slug/censor | server/pastes/api.js:126 |
+| GET | /api/pastes/:slug/comments | server/pastes/api.js:136 |
+| POST | /api/pastes/:slug/comments | server/pastes/api.js:137 |
+| DELETE | /api/pastes/:slug/comments/:commentId | server/pastes/api.js:140 |
+| POST | /api/pastes/:slug/copy | server/pastes/api.js:134 |
+| POST | /api/pastes/:slug/fork | server/pastes/api.js:132 |
+| POST | /api/pastes/:slug/like | server/pastes/api.js:133 |
+| GET | /api/pastes/:slug/raw | server/pastes/api.js:129 |
+| POST | /api/pastes/:slug/set-avatar | server/pastes/api.js:143 |
+| GET | /api/pastes/:slug/versions | server/pastes/api.js:130 |
+| DELETE | /api/pastes/admin/forks | server/pastes/api.js:113 |
+| GET | /api/pastes/admin/forks | server/pastes/api.js:112 |
+| GET | /api/pastes/admin/stats | server/pastes/api.js:111 |
+| POST | /api/pastes/bulk | server/pastes/api.js:114 |
+| GET | /api/pastes/by-user/:username | server/pastes/api.js:119 |
+| GET | /api/pastes/config | server/pastes/api.js:109 |
+| POST | /api/pastes/screenshot | server/pastes/api.js:116 |
+| GET | /api/ready | server/app.js:121 |
+| GET | /callback | server/auth/routes.js:289 |
+| POST | /fedcm | server/auth/routes.js:335 |
+| GET | /feed.xml | server/app.js:138 |
+| GET | /login | server/auth/routes.js:267 |
+| GET | /logout | server/auth/routes.js:363 |
+| GET | /me | server/auth/routes.js:387 |
+| GET | /my | server/app.js:252 |
+| GET | /new | server/app.js:214 |
+| POST | /new | server/app.js:225 |
+| GET | /p/:slug | server/app.js:159 |
+| GET | /p/:slug/download | server/app.js:202 |
+| GET | /p/:slug/raw | server/app.js:178 |
+| GET | /p/:slug/raw | server/app.js:198 |
+| GET | /p/:slug/screenshot | server/app.js:191 |
+| GET | /p/:slug/screenshot | server/app.js:199 |
+| GET | /pastes | server/app.js:151 |
+| GET | /pastes/:slug | server/app.js:157 |
+| POST | /refresh | server/auth/routes.js:397 |
+| GET | /robots.txt | server/app.js:136 |
+| GET | /sitemap.xml | server/app.js:137 |
+| GET | /tos | server/app.js:82 |
## OpenVibe.Games
## OpenVibe.Games
@@ -12,9 +12,9 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -12,9 +12,9 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| OpenVibe.Community | OpenVibe.Media | 1 | bearer |
| OpenVibe.Community | OpenVibe.Media | 1 | bearer |
| OpenVibe.Community | OpenVibe.Network | 5 | bearer, internal-key, oauth-client |
| OpenVibe.Community | OpenVibe.Network | 5 | bearer, internal-key, oauth-client |
| OpenVibe.Games | OpenVibe.Network | 2 | bearer, oauth-client |
| OpenVibe.Games | OpenVibe.Network | 2 | bearer, oauth-client |
-| OpenVibe.Live | OpenVibe.Community | 1 | none-detected |
+| OpenVibe.Live | OpenVibe.Community | 3 | none-detected |
| OpenVibe.Live | OpenVibe.Media | 2 | api-key, bearer, internal-key |
| OpenVibe.Live | OpenVibe.Media | 2 | api-key, bearer, internal-key |
-| OpenVibe.Live | OpenVibe.Network | 12 | bearer, hmac, internal-key, oauth-client |
+| OpenVibe.Live | OpenVibe.Network | 13 | bearer, hmac, internal-key, none-detected, oauth-client |
| OpenVibe.Live | webhook | 2 | hmac, none-detected |
| OpenVibe.Live | webhook | 2 | hmac, none-detected |
| OpenVibe.Media | OpenVibe.Live | 1 | none-detected |
| OpenVibe.Media | OpenVibe.Live | 1 | none-detected |
| OpenVibe.Media | OpenVibe.Network | 6 | bearer, internal-key, none-detected, oauth-client |
| OpenVibe.Media | OpenVibe.Network | 6 | bearer, internal-key, none-detected, oauth-client |
@@ -42,6 +42,8 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -42,6 +42,8 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Community/vendor/openvibe-shared/navbar.js:10 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Community/vendor/openvibe-shared/navbar.js:10 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Games/apps/server/src/net/httpServer.ts:335 | OpenVibe.Network | /api/auth/me, /oauth/token | oauth-client | **no** | yes |
| Games/apps/server/src/net/httpServer.ts:335 | 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 |
| Games/apps/server/src/net/networkAuth.ts:3 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
+| Live/server/media-proxy/pastes.js:311 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | yes | yes |
+| Live/server/pastes-client.js:16 | OpenVibe.Community | OV_COMMUNITY_INTERNAL_URL | none-detected | yes | yes |
| Live/server/seo/seo.js:424 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | **no** | no |
| Live/server/seo/seo.js:424 | 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/config.js:175 | 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/media-client.js:14 | OpenVibe.Media | :4100, MEDIA_URL, /api/v1/${ | api-key, bearer | yes | no |
@@ -49,10 +51,11 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -49,10 +51,11 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Live/server/config.js:21 | OpenVibe.Network | :4000, OV_NETWORK_URL | internal-key | yes | no |
| Live/server/config.js:21 | 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/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/integrations/powerchat-oauth.js:51 | OpenVibe.Network | /oauth/token | bearer, hmac, oauth-client | **no** | yes |
-| Live/server/monetization/wallet-client.js:9 | OpenVibe.Network | /internal/coins, OV_NETWORK_INTERNAL_URL, :4000 | internal-key, bearer | yes | no |
+| Live/server/monetization/wallet-client.js:9 | OpenVibe.Network | /internal/coins, OV_NETWORK_INTERNAL_URL, :4000 | internal-key, bearer | yes | yes |
+| Live/server/pastes-client.js:39 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000 | none-detected | yes | yes |
| Live/server/streaming/golive-notify.js:60 | OpenVibe.Network | /internal/events | internal-key | **no** | no |
| Live/server/streaming/golive-notify.js:60 | OpenVibe.Network | /internal/events | internal-key | **no** | no |
| Live/server/streaming/restream-manager.js:1387 | OpenVibe.Network | /oauth/token | bearer, oauth-client | yes | yes |
| Live/server/streaming/restream-manager.js:1387 | OpenVibe.Network | /oauth/token | bearer, oauth-client | yes | yes |
-| Live/server/utils/notify.js:16 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications | internal-key | **no** | no |
+| Live/server/utils/notify.js:16 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications | internal-key | **no** | yes |
| Live/vendor/openvibe-shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Live/vendor/openvibe-shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Live/vendor/openvibe-shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Live/vendor/openvibe-shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Live/vendor/openvibe-shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Live/vendor/openvibe-shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
@@ -60,13 +63,13 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -60,13 +63,13 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Live/server/integrations/discord-webhook.js:16 | webhook | webhook_url (per-app, configured in DB) | none-detected | **no** | no |
| Live/server/integrations/discord-webhook.js:16 | webhook | webhook_url (per-app, configured in DB) | none-detected | **no** | no |
| Live/server/media-proxy/webhook.js:38 | webhook | webhook_url (per-app, configured in DB) | hmac | yes | no |
| Live/server/media-proxy/webhook.js:38 | webhook | webhook_url (per-app, configured in DB) | hmac | yes | no |
| Media/server/thumbnails/live-frame-service.js:170 | OpenVibe.Live | :3000 | none-detected | yes | yes |
| Media/server/thumbnails/live-frame-service.js:170 | OpenVibe.Live | :3000 | none-detected | yes | yes |
-| Media/server/auth.js:28 | OpenVibe.Network | network.url, /api/.well-known/jwks | none-detected | yes | yes |
+| Media/server/auth.js:29 | OpenVibe.Network | network.url, /api/.well-known/jwks | none-detected | yes | yes |
| Media/server/user-auth.js:49 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Media/server/user-auth.js:49 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Media/vendor/openvibe-shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Media/vendor/openvibe-shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Media/vendor/openvibe-shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Media/vendor/openvibe-shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Media/vendor/openvibe-shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Media/vendor/openvibe-shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Media/vendor/openvibe-shared/navbar.js:10 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Media/vendor/openvibe-shared/navbar.js:10 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
-| Media/server/auth.js:268 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | yes |
+| Media/server/auth.js:305 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | yes |
| Media/server/webhooks.js:4 | webhook | webhook_url (per-app, configured in DB) | hmac | yes | yes |
| Media/server/webhooks.js:4 | webhook | webhook_url (per-app, configured in DB) | hmac | yes | yes |
| Network/server/admin/analytics-routes.js:24 | OpenVibe.Games | :8000 | internal-key, bearer | yes | 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:71 | OpenVibe.Games | games.internalUrl | internal-key | yes | no |
@@ -101,18 +101,18 @@ Deliverable 4, plus the background-job half of the exit criteria.
@@ -101,18 +101,18 @@ Deliverable 4, plus the background-job half of the exit criteria.
| OpenVibe.Network | setInterval | | ? | server/auth/discord-link.js:20 |
| OpenVibe.Network | setInterval | | ? | server/auth/discord-link.js:20 |
| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:167 |
| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:167 |
| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:169 |
| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:169 |
-| OpenVibe.Network | setInterval | | 60 min | server/index.js:652 |
-| OpenVibe.Network | setInterval | | 2 min | server/index.js:655 |
-| OpenVibe.Network | setInterval | | ? | server/index.js:658 |
+| OpenVibe.Network | setInterval | | 60 min | server/index.js:654 |
+| OpenVibe.Network | setInterval | | 2 min | server/index.js:657 |
+| OpenVibe.Network | setInterval | | ? | server/index.js:660 |
| OpenVibe.Network | setInterval | | 15 min | packages/openvibe-shared/account-switcher.js:624 |
| OpenVibe.Network | setInterval | | 15 min | packages/openvibe-shared/account-switcher.js:624 |
| OpenVibe.Network | setInterval | | 5 s | packages/openvibe-shared/analytics.js:238 |
| OpenVibe.Network | setInterval | | 5 s | packages/openvibe-shared/analytics.js:238 |
| OpenVibe.Network | setInterval | | 60 min | packages/openvibe-shared/analytics.js:241 |
| OpenVibe.Network | setInterval | | 60 min | packages/openvibe-shared/analytics.js:241 |
| OpenVibe.Network | setInterval | | ? | packages/openvibe-shared/analytics.js:247 |
| OpenVibe.Network | setInterval | | ? | packages/openvibe-shared/analytics.js:247 |
| OpenVibe.Network | setInterval | | ? | packages/openvibe-shared/notification-ui.js:548 |
| OpenVibe.Network | setInterval | | ? | packages/openvibe-shared/notification-ui.js:548 |
-| OpenVibe.Media | setInterval | | ? | server/auth.js:58 |
-| OpenVibe.Media | setInterval | | 720 min | server/index.js:115 |
-| OpenVibe.Media | setInterval | | ? | server/index.js:141 |
-| OpenVibe.Media | setInterval | | ? | server/pastes/routes.js:694 |
+| OpenVibe.Media | setInterval | | ? | server/auth.js:59 |
+| OpenVibe.Media | setInterval | | 720 min | server/index.js:116 |
+| OpenVibe.Media | setInterval | | ? | server/index.js:142 |
+| OpenVibe.Media | setInterval | | ? | server/pastes/routes.js:703 |
| OpenVibe.Media | setInterval | | ? | server/vod/clip-cutter.js:111 |
| OpenVibe.Media | setInterval | | ? | server/vod/clip-cutter.js:111 |
| OpenVibe.Media | setInterval | | ? | server/vod/clip-jobs.js:117 |
| OpenVibe.Media | setInterval | | ? | server/vod/clip-jobs.js:117 |
| OpenVibe.Media | setInterval | | ? | server/vod/health-job.js:262 |
| OpenVibe.Media | setInterval | | ? | server/vod/health-job.js:262 |
@@ -130,5 +130,6 @@ Deliverable 4, plus the background-job half of the exit criteria.
@@ -130,5 +130,6 @@ Deliverable 4, plus the background-job half of the exit criteria.
| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:555 |
| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:555 |
| OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:606 |
| OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:606 |
| OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:196 |
| OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:196 |
+| OpenVibe.Community | setInterval | | ? | server/pastes/service.js:211 |
| OpenVibe.Games | setInterval | | ? | apps/server/src/main.ts:159 |
| OpenVibe.Games | setInterval | | ? | apps/server/src/main.ts:159 |
| OpenVibe.Games | setInterval | | ? | apps/server/src/net/editorWs.ts:82 |
| OpenVibe.Games | setInterval | | ? | apps/server/src/net/editorWs.ts:82 |
@@ -22,18 +22,19 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -22,18 +22,19 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
|---|---|---|---|
|---|---|---|---|
| OpenVibe.Community | COOKIE_SECURE | **not set** | server/config.js |
| OpenVibe.Community | COOKIE_SECURE | **not set** | server/config.js |
| OpenVibe.Community | OV_OAUTH_CLIENT_SECRET | community.env | server/config.js |
| OpenVibe.Community | OV_OAUTH_CLIENT_SECRET | community.env | server/config.js |
+| OpenVibe.Community | VIEW_HASH_SECRET | **not set** | server/pastes/service.js |
| OpenVibe.Games | EDITOR_KEY | games.env | apps/server/src/config.ts |
| OpenVibe.Games | EDITOR_KEY | games.env | apps/server/src/config.ts |
| OpenVibe.Games | OV_OAUTH_CLIENT_SECRET | games.env | apps/server/src/config.ts |
| OpenVibe.Games | OV_OAUTH_CLIENT_SECRET | games.env | apps/server/src/config.ts |
| OpenVibe.Live | ADMIN_PASSWORD | live.env | server/config.js |
| OpenVibe.Live | ADMIN_PASSWORD | live.env | server/config.js |
| OpenVibe.Live | GH_TOKEN | **not set** | server/meta/routes.js |
| OpenVibe.Live | GH_TOKEN | **not set** | server/meta/routes.js |
| OpenVibe.Live | GITHUB_TOKEN | **not set** | server/meta/routes.js |
| OpenVibe.Live | GITHUB_TOKEN | **not set** | server/meta/routes.js |
-| OpenVibe.Live | INTERNAL_API_KEY | live.env | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +2 |
+| OpenVibe.Live | INTERNAL_API_KEY | live.env | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +3 |
| OpenVibe.Live | JWT_SECRET | live.env | server/arena/arena-service.js, server/config.js, server/integrations/platform-oauth.js +1 |
| OpenVibe.Live | JWT_SECRET | live.env | server/arena/arena-service.js, server/config.js, server/integrations/platform-oauth.js +1 |
| OpenVibe.Live | MEDIA_API_KEY | live.env | server/media-client.js |
| OpenVibe.Live | MEDIA_API_KEY | live.env | server/media-client.js |
| OpenVibe.Live | MEDIA_WEBHOOK_SECRET | live.env | server/media-proxy/webhook.js |
| OpenVibe.Live | MEDIA_WEBHOOK_SECRET | live.env | server/media-proxy/webhook.js |
| OpenVibe.Live | OPS_ALERT_WEBHOOK_URL | **not set** | server/media-proxy/webhook.js |
| OpenVibe.Live | OPS_ALERT_WEBHOOK_URL | **not set** | server/media-proxy/webhook.js |
-| OpenVibe.Live | OV_INTERNAL_KEY | **not set** | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +2 |
-| OpenVibe.Live | OV_OAUTH_CLIENT_SECRET | live.env | server/auth/routes.js |
+| OpenVibe.Live | OV_INTERNAL_KEY | **not set** | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +3 |
+| OpenVibe.Live | OV_OAUTH_CLIENT_SECRET | live.env | server/auth/routes.js, server/net/network-principal.js |
| OpenVibe.Live | PAYPAL_CLIENT_SECRET | live.env | server/config.js |
| OpenVibe.Live | PAYPAL_CLIENT_SECRET | live.env | server/config.js |
| OpenVibe.Live | TURN_AUTH_SECRET | live.env | server/auth/routes.js, server/net/turn.js |
| OpenVibe.Live | TURN_AUTH_SECRET | live.env | server/auth/routes.js, server/net/turn.js |
| OpenVibe.Live | TURN_CREDENTIAL | live.env | server/config.js |
| OpenVibe.Live | TURN_CREDENTIAL | live.env | server/config.js |
@@ -63,11 +64,11 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -63,11 +64,11 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| File | Variables |
| File | Variables |
|---|---|
|---|---|
-| /etc/openvibe/community.env | 13 |
+| /etc/openvibe/community.env | 14 |
| /etc/openvibe/games.env | 12 |
| /etc/openvibe/games.env | 12 |
| /etc/openvibe/generated-secrets.env | 6 |
| /etc/openvibe/generated-secrets.env | 6 |
-| /etc/openvibe/live.env | 53 |
-| /etc/openvibe/media.env | 26 |
+| /etc/openvibe/live.env | 54 |
+| /etc/openvibe/media.env | 28 |
| /etc/openvibe/network.env | 21 |
| /etc/openvibe/network.env | 21 |
| /etc/openvibe/tools.env | 9 |
| /etc/openvibe/tools.env | 9 |
@@ -76,6 +77,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -76,6 +77,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| Repo | Variable | In prod | Read at |
| Repo | Variable | In prod | Read at |
|---|---|---|---|
|---|---|---|---|
| OpenVibe.Community | BASE_URL | community.env | server/config.js |
| OpenVibe.Community | BASE_URL | community.env | server/config.js |
+| OpenVibe.Community | COMMUNITY_DB_PATH | | server/config.js |
| OpenVibe.Community | HOST | community.env | server/config.js |
| OpenVibe.Community | HOST | community.env | server/config.js |
| OpenVibe.Community | LOGIN_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | LOGIN_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | NODE_ENV | community.env | server/config.js |
| OpenVibe.Community | NODE_ENV | community.env | server/config.js |
@@ -90,6 +92,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -90,6 +92,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Community | OV_LIVE_URL | community.env | server/config.js, vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_LIVE_URL | community.env | server/config.js, vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_LOGO_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_LOGO_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_MAPS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_MAPS_URL | | vendor/openvibe-shared/brand.js |
+| OpenVibe.Community | OV_MEDIA_INTERNAL_URL | | server/config.js |
| OpenVibe.Community | OV_MEDIA_URL | community.env | server/config.js, vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_MEDIA_URL | community.env | server/config.js, vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_NET_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_NET_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_NETWORK_INTERNAL_URL | community.env | server/config.js |
| OpenVibe.Community | OV_NETWORK_INTERNAL_URL | community.env | server/config.js |
@@ -101,6 +104,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -101,6 +104,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Community | OV_TEXT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_TEXT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_YT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_YT_URL | | vendor/openvibe-shared/brand.js |
+| OpenVibe.Community | PASTES_AUTHORITY | community.env | server/config.js |
| OpenVibe.Community | PORT | community.env | server/config.js |
| OpenVibe.Community | PORT | community.env | server/config.js |
| OpenVibe.Community | TRUST_PROXY | community.env | server/config.js |
| OpenVibe.Community | TRUST_PROXY | community.env | server/config.js |
| OpenVibe.Games | DB_PATH | games.env | apps/server/src/config.ts |
| OpenVibe.Games | DB_PATH | games.env | apps/server/src/config.ts |
@@ -162,7 +166,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -162,7 +166,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | OFFLINE_SCREEN_PATH | | server/monetization/routes.js, server/streaming/routes.js |
| OpenVibe.Live | OFFLINE_SCREEN_PATH | | server/monetization/routes.js, server/streaming/routes.js |
| OpenVibe.Live | OV_APP_ROOT | | server/docs/routes.js, server/web/assets.js |
| OpenVibe.Live | OV_APP_ROOT | | server/docs/routes.js, server/web/assets.js |
| OpenVibe.Live | OV_AUDIO_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_AUDIO_URL | | vendor/openvibe-shared/brand.js |
-| OpenVibe.Live | OV_COMMUNITY_URL | live.env | server/index.js, server/seo/seo.js +1 |
+| OpenVibe.Live | OV_COMMUNITY_INTERNAL_URL | | server/pastes-client.js |
+| OpenVibe.Live | OV_COMMUNITY_URL | live.env | server/index.js, server/media-proxy/pastes.js +2 |
| OpenVibe.Live | OV_DEV_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_DEV_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_DOCS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_DOCS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_FOOD_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_FOOD_URL | | vendor/openvibe-shared/brand.js |
@@ -173,17 +178,18 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -173,17 +178,18 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | OV_MAPS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_MAPS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_MEDIA_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_MEDIA_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_NET_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_NET_URL | | vendor/openvibe-shared/brand.js |
-| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/chat/chat-server.js, server/monetization/wallet-client.js +1 |
+| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/chat/chat-server.js, server/monetization/wallet-client.js +3 |
| OpenVibe.Live | OV_NETWORK_LOGIN_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_NETWORK_LOGIN_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_NETWORK_PUBLIC_KEY | live.env | server/auth/auth.js |
| OpenVibe.Live | OV_NETWORK_PUBLIC_KEY | live.env | server/auth/auth.js |
| OpenVibe.Live | OV_NETWORK_URL | live.env | server/auth/auth.js, server/config.js +2 |
| OpenVibe.Live | OV_NETWORK_URL | live.env | server/auth/auth.js, server/config.js +2 |
-| OpenVibe.Live | OV_OAUTH_CLIENT_ID | live.env | server/auth/routes.js |
+| OpenVibe.Live | OV_OAUTH_CLIENT_ID | live.env | server/auth/routes.js, server/net/network-principal.js |
| OpenVibe.Live | OV_PASTES_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_PASTES_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_PUBLIC_DIR | | server/web/assets.js |
| OpenVibe.Live | OV_PUBLIC_DIR | | server/web/assets.js |
| OpenVibe.Live | OV_TEXT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_TEXT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_YT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_YT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OWNER_USERNAME | | server/db/database.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/index.js, server/seo/seo.js |
| OpenVibe.Live | PATH | | server/media/media-downloader.js |
| OpenVibe.Live | PATH | | server/media/media-downloader.js |
| OpenVibe.Live | PAYPAL_CLIENT_ID | live.env | server/config.js |
| OpenVibe.Live | PAYPAL_CLIENT_ID | live.env | server/config.js |
@@ -273,6 +279,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -273,6 +279,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Media | OV_TEXT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Media | OV_TEXT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Media | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Media | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Media | OV_YT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Media | OV_YT_URL | | vendor/openvibe-shared/brand.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 | PASTES_PATH | media.env | server/config.js |
| OpenVibe.Media | PORT | media.env | (not referenced) |
| OpenVibe.Media | PORT | media.env | (not referenced) |
| OpenVibe.Media | RTP_PORT_MAX | media.env | (not referenced) |
| OpenVibe.Media | RTP_PORT_MAX | media.env | (not referenced) |
@@ -9,10 +9,10 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r
@@ -9,10 +9,10 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r
| Current owner | Tables | Stay | Move | Frozen legacy | Investigate |
| Current owner | Tables | Stay | Move | Frozen legacy | Investigate |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
| OpenVibe.Live | 186 | 26 | 94 | 43 | 23 |
| OpenVibe.Live | 186 | 26 | 94 | 43 | 23 |
-| OpenVibe.Network | 36 | 33 | 3 | 0 | 0 |
+| OpenVibe.Network | 39 | 36 | 3 | 0 | 0 |
| OpenVibe.Media | 15 | 12 | 3 | 0 | 0 |
| OpenVibe.Media | 15 | 12 | 3 | 0 | 0 |
| OpenVibe.Tools | 4 | 4 | 0 | 0 | 0 |
| OpenVibe.Tools | 4 | 4 | 0 | 0 | 0 |
-| OpenVibe.Community | 4 | 4 | 0 | 0 | 0 |
+| OpenVibe.Community | 13 | 13 | 0 | 0 | 0 |
| OpenVibe.Games | 5 | 5 | 0 | 0 | 0 |
| OpenVibe.Games | 5 | 5 | 0 | 0 | 0 |
| OpenVibe.Sites | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Sites | 0 | 0 | 0 | 0 | 0 |
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
> Generated by `scripts/roadmap-baseline/generate.js`. Do not edit by hand; edit `data/*.json` or the extractor and regenerate.
> Generated by `scripts/roadmap-baseline/generate.js`. Do not edit by hand; edit `data/*.json` or the extractor and regenerate.
-Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.
+Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 23:36 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.
| Severity | Area | Subject | Detail |
| Severity | Area | Subject | Detail |
|---|---|---|---|
|---|---|---|---|
@@ -11,6 +11,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w
@@ -11,6 +11,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w
| low | database | /opt/openvibe.live/data/openvibe.db | 0 B, zero tables (dead file) |
| low | database | /opt/openvibe.live/data/openvibe.db | 0 B, zero tables (dead file) |
| low | deploy | games | deployed 43c11f0 has the same file tree as origin/main 5710287 but a different SHA (pre-rewrite history); reset the checkout so later pulls fast-forward |
| low | deploy | games | deployed 43c11f0 has the same file tree as origin/main 5710287 but a different SHA (pre-rewrite history); reset the checkout so later pulls fast-forward |
| low | env | OpenVibe.Community:COOKIE_SECURE | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Community:COOKIE_SECURE | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
+| low | env | OpenVibe.Community:VIEW_HASH_SECRET | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Live:GH_TOKEN | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Live:GH_TOKEN | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Live:GITHUB_TOKEN | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Live:GITHUB_TOKEN | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Live:OPS_ALERT_WEBHOOK_URL | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Live:OPS_ALERT_WEBHOOK_URL | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
@@ -94,6 +95,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w
@@ -94,6 +95,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w
| 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_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: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.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: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_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.Media:RTP_PORT_MIN | set in media.env but not referenced by scanned code (may be read by a dependency or stale) |
@@ -102,6 +104,10 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w
@@ -102,6 +104,10 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w
| info | env | OpenVibe.Network:NOTIFICATIONS_ENABLED | set in network.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Network:NOTIFICATIONS_ENABLED | set in network.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Tools:MEDIA_PUBLIC_URL | set in tools.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Tools:MEDIA_PUBLIC_URL | set in tools.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Tools:MEDIA_URL | set in tools.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Tools:MEDIA_URL | set in tools.env but not referenced by scanned code (may be read by a dependency or stale) |
+| info | schema | OpenVibe.Community:analytics_daily | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
+| info | schema | OpenVibe.Community:analytics_events | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
+| info | schema | OpenVibe.Community:analytics_hourly | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
+| info | schema | OpenVibe.Community:analytics_rate_tracking | 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: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: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:emotes_new | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
@@ -10,24 +10,24 @@ Deliverable 8. Family-level status from roadmap 3.2. Evidence paths are checked
@@ -10,24 +10,24 @@ Deliverable 8. Family-level status from roadmap 3.2. Evidence paths are checked
| D02-D04 | Registry, capabilities, contracts | absent | missing | W1, W2 | Network/server/url-registry.js; Sites/sites.json | 20 charter-only repos of 32; Live 15, Network 0, Media 0, Tools 0, Community 0, Games 0, Sites 0 |
| D02-D04 | Registry, capabilities, contracts | absent | missing | W1, W2 | Network/server/url-registry.js; Sites/sites.json | 20 charter-only repos of 32; Live 15, Network 0, Media 0, Tools 0, Community 0, Games 0, Sites 0 |
| D05-D06 | Policy, staff, user modules | partial | partial | W1, W2 | Network/server/admin; Live/server/auth/permissions.js | - |
| D05-D06 | Policy, staff, user modules | partial | partial | W1, W2 | Network/server/admin; Live/server/auth/permissions.js | - |
| D07-D10 | Themes, notifications, social, analytics | partial | partial | W1, W2, Track O | Network/server/themes; Network/server/notifications | 5 repos carry their own analytics_events |
| D07-D10 | Themes, notifications, social, analytics | partial | partial | W1, W2, Track O | Network/server/themes; Network/server/notifications | 5 repos carry their own analytics_events |
-| D11-D13 | Events, realtime, SDK | absent | missing | W2, W3 | Media/server/webhooks.js | 65 caller-file/target pairs across 50 files; 10 WebSocket server constructions |
+| D11-D13 | Events, realtime, SDK | absent | missing | W2, W3 | Media/server/webhooks.js | 68 caller-file/target pairs across 52 files; 10 WebSocket server constructions |
| D14-D16 | Media | partial | partial | W4 | Media/server/vod; Media/server/pastes | 3 Media tables target OpenVibe.Community |
| D14-D16 | Media | partial | partial | W4 | Media/server/vod; Media/server/pastes | 3 Media tables target OpenVibe.Community |
| D17-D20 | Live, OpenRe, channel/VOD lineage | partial | partial | W7 | Live/server/streaming/rtmp-server.js; Live/server/streaming/restream-manager.js | 14 Live tables target OpenRe.Stream |
| D17-D20 | Live, OpenRe, channel/VOD lineage | partial | partial | W7 | Live/server/streaming/rtmp-server.js; Live/server/streaming/restream-manager.js | 14 Live tables target OpenRe.Stream |
| D21-D23 | Chat | partial | partial | W6 | Live/server/chat/chat-server.js; Live/server/streaming/call-server.js | 23 Live tables target OpenVibe.Chat |
| D21-D23 | Chat | partial | partial | W6 | Live/server/chat/chat-server.js; Live/server/streaming/call-server.js | 23 Live tables target OpenVibe.Chat |
-| D24-D27 | Community | partial | partial | W5 | Community/server/pastes | 4 tables; 4 Live tables target OpenVibe.Community |
+| D24-D27 | Community | partial | partial | W5 | Community/server/pastes | 13 tables; 4 Live tables target OpenVibe.Community |
| D28-D30 | Billing, Tips, VIP | partial | partial | W8-W10 (ADR-012 first) | Live/server/monetization/payments.js; Network/server/coins | 2 Live tables target OpenVibe.Billing; 2 Network tables target OpenVibe.Billing (loyalty ledger) |
| D28-D30 | Billing, Tips, VIP | partial | partial | W8-W10 (ADR-012 first) | Live/server/monetization/payments.js; Network/server/coins | 2 Live tables target OpenVibe.Billing; 2 Network tables target OpenVibe.Billing (loyalty ledger) |
| D31 | Tools | built | already-present-and-verified | W11 | Tools/apps/gateway | 2 test files |
| D31 | Tools | built | already-present-and-verified | W11 | Tools/apps/gateway | 2 test files |
| D32 | Games | built | already-present-and-verified | W12 | Games/apps/server/src/net/sso.ts | 56 test files |
| D32 | Games | built | already-present-and-verified | W12 | Games/apps/server/src/net/sso.ts | 56 test files |
| D33-D34 | Codes, Host | absent | missing | W20, W21 | - | 20 charter-only repos of 32 |
| D33-D34 | Codes, Host | absent | missing | W20, W21 | - | 20 charter-only repos of 32 |
| D35-D38 | AI, content, sources, search | partial | partial | W13-W15 | Live/server/ai/moment-registry.js; Live/server/ai/llm.js | 14 Live tables target OpenVibe.AI |
| D35-D38 | AI, content, sources, search | partial | partial | W13-W15 | Live/server/ai/moment-registry.js; Live/server/ai/llm.js | 14 Live tables target OpenVibe.AI |
| D39 | Mods | absent | missing | W12, W21 | - | - |
| D39 | Mods | absent | missing | W12, W21 | - | - |
-| D40 | Open developer services | absent | missing | W20, W21 | Live/server/integrations/powerchat-routes.js | 28 of 65 call sites authenticate with the shared internal key |
+| D40 | Open developer services | absent | missing | W20, W21 | Live/server/integrations/powerchat-routes.js | 28 of 68 call sites authenticate with the shared internal key |
| D41 | Independent runtime lifecycle | partial | partial | W7, W21 | Live/deploy | hazard H1; hazard H3 |
| D41 | Independent runtime lifecycle | partial | partial | W7, W21 | Live/deploy | hazard H1; hazard H3 |
| D42 | Shared component architecture | partial | partial | W2, Track R | Network/packages/openvibe-shared | 5 repos vendor openvibe-shared (129 files); 4 divergent: Community/ov-icons.js, Live/user-card.js, Media/ov-icons.js, Tools/ov-icons.js |
| D42 | Shared component architecture | partial | partial | W2, Track R | Network/packages/openvibe-shared | 5 repos vendor openvibe-shared (129 files); 4 divergent: Community/ov-icons.js, Live/user-card.js, Media/ov-icons.js, Tools/ov-icons.js |
| D43 | Safe active-client updates | absent | missing | Track R | Live/server/chat/deploy-notice.js; Live/server/web/assets.js | - |
| D43 | Safe active-client updates | absent | missing | Track R | Live/server/chat/deploy-notice.js; Live/server/web/assets.js | - |
| D44 | Crawlable component rendering | built | already-present-and-verified | Track R (preserve) | Community/server/seo.js; Sites/build.js | - |
| D44 | Crawlable component rendering | built | already-present-and-verified | Track R (preserve) | Community/server/seo.js; Sites/build.js | - |
| D45 | Release compatibility and recovery | absent | missing | Track R, W22 | - | 1 service(s) not running origin/main |
| D45 | Release compatibility and recovery | absent | missing | Track R, W22 | - | 1 service(s) not running origin/main |
-| D46 | Update observability and acceptance | absent | missing | Track R, Track O | - | 0 of 7 scanned repos have .github/workflows |
+| D46 | Update observability and acceptance | absent | missing | Track R, Track O | - | 4 of 7 scanned repos have .github/workflows |
Totals: 3 built, 11 partial, 8 absent across 22 families; 22 verified.
Totals: 3 built, 11 partial, 8 absent across 22 families; 22 verified.
@@ -12,7 +12,7 @@ Deliverable 9. **Not yet reviewed by the production-host owner** (Wave 0 exit cr
@@ -12,7 +12,7 @@ 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 | open | Live maintainers (security track S) | W7 (openre.key.rotate) - or earlier as a standalone rotation | Ship per-stream key regeneration and rotate every key; notify affected streamers. | - |
| H4 | managed_streams.stream_key values still need rotation after a past leak | high | open | Live maintainers (security track S) | W7 (openre.key.rotate) - or earlier as a standalone rotation | Ship per-stream key regeneration and rotate every key; notify affected streamers. | - |
| 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 |
| 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 | open | Platform operator | W11 | Set YT_PROXY and/or YT_COOKIES_FILE for openvibe-tools-yt. | YT_PROXY still unset in tools.env |
| H6 | YouTube refuses the server IP; the yt tool needs a proxy | low | open | Platform operator | W11 | Set YT_PROXY and/or YT_COOKIES_FILE for openvibe-tools-yt. | YT_PROXY still 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 82% 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 83% used (at generation time) |
| H8 | A hardcoded internal secret was previously public | high | open | Platform operator (security track S) | W1 (scoped service principals) / Track S | Rotate INTERNAL_API_KEY per service and the Cloudflare token; move to scoped service tokens. | - |
| H8 | A hardcoded internal secret was previously public | high | open | Platform operator (security track S) | W1 (scoped service principals) / Track S | Rotate INTERNAL_API_KEY per service and the Cloudflare token; move to scoped service tokens. | - |
| 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. | - |
| 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 | open | Every contributor | all | Per-repo git config user.email = [email protected]; review history before push. | 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) |
| H10 | Commit identity | medium | open | Every contributor | all | Per-repo git config user.email = [email protected]; review history before push. | 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) |
@@ -2,19 +2,19 @@
@@ -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.
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 `24151bd`, Network `9b4e262`, Media `6114bc6`, Tools `0346edc`, Community `de947ea`, Games `5710287`, Sites `185014f`. Production snapshot: openvibe-oregon, 2026-09-22.
+Source commits: Live `e266060`, Network `1b79576`, Media `ddfefcf`, Tools `0346edc`, Community `d7c6e60`, Games `5710287`, Sites `185014f`. Production snapshot: openvibe-oregon, 2026-09-22.
## Deliverables
## Deliverables
| # | Artifact | Contents |
| # | Artifact | Contents |
|---|---|---|
|---|---|---|
| 1 | [01-services.md](01-services.md) | services, ports, units, env files, repo state, GitHub census |
| 1 | [01-services.md](01-services.md) | services, ports, units, env files, repo state, GitHub census |
-| 2 | [02-schema.md](02-schema.md) | 250 tables with current/target owner |
-| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 928 routes; 65 cross-service call sites |
+| 2 | [02-schema.md](02-schema.md) | 262 tables with current/target owner |
+| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 968 routes; 68 cross-service call sites |
| 4 | [05-realtime-and-jobs.md](05-realtime-and-jobs.md) | WebSocket servers and paths, non-HTTP protocols, background jobs |
| 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) |
| 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 |
| 6 | [07-ownership.md](07-ownership.md) | current vs target data ownership |
-| 7 | [08-discrepancies.md](08-discrepancies.md) | 108 production-vs-repo items |
+| 7 | [08-discrepancies.md](08-discrepancies.md) | 114 production-vs-repo items |
| 8 | [09-d-status.md](09-d-status.md) | D01-D46 family status from evidence |
| 8 | [09-d-status.md](09-d-status.md) | D01-D46 family status from evidence |
| 9 | [10-hazards.md](10-hazards.md) | 14 hazards with owners, mitigations and waves |
| 9 | [10-hazards.md](10-hazards.md) | 14 hazards with owners, mitigations and waves |
| - | [inventory.json](inventory.json) | everything above, machine-readable |
| - | [inventory.json](inventory.json) | everything above, machine-readable |
@@ -23,10 +23,10 @@ Source commits: Live `24151bd`, Network `9b4e262`, Media `6114bc6`, Tools `0346e
@@ -23,10 +23,10 @@ Source commits: Live `24151bd`, Network `9b4e262`, Media `6114bc6`, Tools `0346e
| | Criterion | Result |
| | Criterion | Result |
|---|---|---|
|---|---|---|
-| pass | Every table has an owner classification | 250 tables classified, 0 unclassified |
-| pass | Every route is attributed to a repo and source line | 928 routes; 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 | 82 timers/jobs |
-| pass | Every cross-service call records caller, callee, auth, timeout and retry | 65 call sites; 30 with no timeout detected |
+| pass | Every table has an owner classification | 262 tables classified, 0 unclassified |
+| pass | Every route is attributed to a repo and source line | 968 routes; 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 | 83 timers/jobs |
+| pass | Every cross-service call records caller, callee, auth, timeout and retry | 68 call sites; 30 with no timeout detected |
| pass | Unknowns are marked unknown, not guessed | 2 unknown items recorded |
| pass | Unknowns are marked unknown, not guessed | 2 unknown items recorded |
| pass | D01-D46 status resolved from evidence | 22/22 families verified |
| pass | D01-D46 status resolved from evidence | 22/22 families verified |
| **open** | Hazard register reviewed by the production-host owner | pending: set reviewedBy in data/hazards.json after review |
| **open** | Hazard register reviewed by the production-host owner | pending: set reviewedBy in data/hazards.json after review |
@@ -1,16 +1,16 @@
@@ -1,16 +1,16 @@
{
{
"generatedFrom": {
"generatedFrom": {
- "OpenVibe.Live": "24151bdc12ffe6e6f2fbe8c3770327b2d1635a8a",
- "OpenVibe.Network": "9b4e262cd8daf05ee2b6b92a06dabe70e2d42bc7",
- "OpenVibe.Media": "6114bc61c466cd51335548d0ce87058df125c577",
+ "OpenVibe.Live": "e26606082958f8cf6bb7c4587c225ca09335b5fe",
+ "OpenVibe.Network": "1b79576cb024714e56ae2ccc7728080d3d3e0118",
+ "OpenVibe.Media": "ddfefcf47740715f24fe7aa7dea648b4699162fc",
"OpenVibe.Tools": "0346edc57fb9f588abcdea171a22a5ca33f772d2",
"OpenVibe.Tools": "0346edc57fb9f588abcdea171a22a5ca33f772d2",
- "OpenVibe.Community": "de947ead2addce29d7f9b98f3d894075ca4e82f2",
+ "OpenVibe.Community": "d7c6e608d8e27e6ddbfc78a15fa7590036b1dded",
"OpenVibe.Games": "571028796639c00d5deecca038634ef1c52d3480",
"OpenVibe.Games": "571028796639c00d5deecca038634ef1c52d3480",
"OpenVibe.Sites": "185014ff01ed8bd8f6df3dd5099e2b6c904e235d"
"OpenVibe.Sites": "185014ff01ed8bd8f6df3dd5099e2b6c904e235d"
},
},
"prodSnapshot": {
"prodSnapshot": {
"host": "openvibe-oregon",
"host": "openvibe-oregon",
- "collectedAt": "2026-09-22T21:23:31.121Z"
+ "collectedAt": "2026-09-22T23:36:01.667Z"
},
},
"repos": [
"repos": [
{
{
@@ -18,13 +18,13 @@
@@ -18,13 +18,13 @@
"service": "live",
"service": "live",
"present": true,
"present": true,
"git": {
"git": {
- "head": "24151bdc12ffe6e6f2fbe8c3770327b2d1635a8a",
+ "head": "e26606082958f8cf6bb7c4587c225ca09335b5fe",
"branch": "main",
"branch": "main",
- "originMain": "24151bdc12ffe6e6f2fbe8c3770327b2d1635a8a",
- "committedAt": "2026-09-22T14:18:25-07:00"
+ "originMain": "e26606082958f8cf6bb7c4587c225ca09335b5fe",
+ "committedAt": "2026-09-22T16:28:23-07:00"
},
},
- "sourceFiles": 165,
- "loc": 69699,
+ "sourceFiles": 167,
+ "loc": 69978,
"tables": [
"tables": [
{
{
"table": "arena_profiles",
"table": "arena_profiles",
@@ -2920,6 +2920,12 @@
@@ -2920,6 +2920,12 @@
"file": "server/media-proxy/pastes.js",
"file": "server/media-proxy/pastes.js",
"line": 222
"line": 222
},
},
+ {
+ "method": "POST",
+ "path": "/api/pastes/:slug/censor",
+ "file": "server/media-proxy/pastes.js",
+ "line": 315
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/api/pastes/:slug/comments",
"path": "/api/pastes/:slug/comments",
@@ -2962,18 +2968,36 @@
@@ -2962,18 +2968,36 @@
"file": "server/media-proxy/pastes.js",
"file": "server/media-proxy/pastes.js",
"line": 240
"line": 240
},
},
+ {
+ "method": "GET",
+ "path": "/api/pastes/:slug/raw",
+ "file": "server/media-proxy/pastes.js",
+ "line": 311
+ },
{
{
"method": "POST",
"method": "POST",
"path": "/api/pastes/:slug/set-avatar",
"path": "/api/pastes/:slug/set-avatar",
"file": "server/media-proxy/pastes.js",
"file": "server/media-proxy/pastes.js",
"line": 110
"line": 110
},
},
+ {
+ "method": "POST",
+ "path": "/api/pastes/:slug/set-avatar",
+ "file": "server/media-proxy/pastes.js",
+ "line": 296
+ },
{
{
"method": "DELETE",
"method": "DELETE",
"path": "/api/pastes/admin/forks",
"path": "/api/pastes/admin/forks",
"file": "server/media-proxy/pastes.js",
"file": "server/media-proxy/pastes.js",
"line": 171
"line": 171
},
},
+ {
+ "method": "DELETE",
+ "path": "/api/pastes/admin/forks",
+ "file": "server/media-proxy/pastes.js",
+ "line": 313
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/api/pastes/admin/stats",
"path": "/api/pastes/admin/stats",
@@ -2986,6 +3010,12 @@
@@ -2986,6 +3010,12 @@
"file": "server/media-proxy/pastes.js",
"file": "server/media-proxy/pastes.js",
"line": 172
"line": 172
},
},
+ {
+ "method": "POST",
+ "path": "/api/pastes/bulk",
+ "file": "server/media-proxy/pastes.js",
+ "line": 314
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/api/pastes/by-user/:username",
"path": "/api/pastes/by-user/:username",
@@ -4276,10 +4306,12 @@
@@ -4276,10 +4306,12 @@
"server/auth/auth.js"
"server/auth/auth.js"
],
],
"OV_OAUTH_CLIENT_ID": [
"OV_OAUTH_CLIENT_ID": [
- "server/auth/routes.js"
+ "server/auth/routes.js",
+ "server/net/network-principal.js"
],
],
"OV_OAUTH_CLIENT_SECRET": [
"OV_OAUTH_CLIENT_SECRET": [
- "server/auth/routes.js"
+ "server/auth/routes.js",
+ "server/net/network-principal.js"
],
],
"BASE_URL": [
"BASE_URL": [
"server/auth/routes.js",
"server/auth/routes.js",
@@ -4295,12 +4327,15 @@
@@ -4295,12 +4327,15 @@
"OV_NETWORK_INTERNAL_URL": [
"OV_NETWORK_INTERNAL_URL": [
"server/chat/chat-server.js",
"server/chat/chat-server.js",
"server/monetization/wallet-client.js",
"server/monetization/wallet-client.js",
+ "server/net/network-principal.js",
+ "server/pastes-client.js",
"server/utils/notify.js"
"server/utils/notify.js"
],
],
"INTERNAL_API_KEY": [
"INTERNAL_API_KEY": [
"server/chat/chat-server.js",
"server/chat/chat-server.js",
"server/config.js",
"server/config.js",
"server/monetization/wallet-client.js",
"server/monetization/wallet-client.js",
+ "server/net/network-principal.js",
"server/streaming/routes.js",
"server/streaming/routes.js",
"server/utils/notify.js"
"server/utils/notify.js"
],
],
@@ -4308,6 +4343,7 @@
@@ -4308,6 +4343,7 @@
"server/chat/chat-server.js",
"server/chat/chat-server.js",
"server/config.js",
"server/config.js",
"server/monetization/wallet-client.js",
"server/monetization/wallet-client.js",
+ "server/net/network-principal.js",
"server/streaming/routes.js",
"server/streaming/routes.js",
"server/utils/notify.js"
"server/utils/notify.js"
],
],
@@ -4482,6 +4518,7 @@
@@ -4482,6 +4518,7 @@
],
],
"OV_COMMUNITY_URL": [
"OV_COMMUNITY_URL": [
"server/index.js",
"server/index.js",
+ "server/media-proxy/pastes.js",
"server/seo/seo.js",
"server/seo/seo.js",
"vendor/openvibe-shared/brand.js"
"vendor/openvibe-shared/brand.js"
],
],
@@ -4544,6 +4581,12 @@
@@ -4544,6 +4581,12 @@
"server/monetization/routes.js",
"server/monetization/routes.js",
"server/streaming/routes.js"
"server/streaming/routes.js"
],
],
+ "OV_COMMUNITY_INTERNAL_URL": [
+ "server/pastes-client.js"
+ ],
+ "PASTES_AUTHORITY": [
+ "server/pastes-client.js"
+ ],
"OV_PUBLIC_DIR": [
"OV_PUBLIC_DIR": [
"server/web/assets.js"
"server/web/assets.js"
],
],
@@ -4764,6 +4807,25 @@
@@ -4764,6 +4807,25 @@
"timeout": true,
"timeout": true,
"retry": false
"retry": false
},
},
+ {
+ "file": "server/media-proxy/pastes.js",
+ "targets": [
+ {
+ "service": "community",
+ "refs": [
+ {
+ "via": "OV_COMMUNITY_URL",
+ "line": 311
+ }
+ ]
+ }
+ ],
+ "auth": [
+ "none-detected"
+ ],
+ "timeout": true,
+ "retry": true
+ },
{
{
"file": "server/media-proxy/webhook.js",
"file": "server/media-proxy/webhook.js",
"targets": [
"targets": [
@@ -4803,27 +4865,27 @@
@@ -4803,27 +4865,27 @@
},
},
{
{
"via": "OV_NETWORK_INTERNAL_URL",
"via": "OV_NETWORK_INTERNAL_URL",
- "line": 18
+ "line": 19
},
},
{
{
"via": ":4000",
"via": ":4000",
- "line": 18
+ "line": 19
},
},
{
{
"via": "/internal/coins",
"via": "/internal/coins",
- "line": 71
+ "line": 79
},
},
{
{
"via": "/internal/coins",
"via": "/internal/coins",
- "line": 84
+ "line": 92
},
},
{
{
"via": "/internal/coins",
"via": "/internal/coins",
- "line": 95
+ "line": 103
},
},
{
{
"via": "/internal/coins",
"via": "/internal/coins",
- "line": 143
+ "line": 151
}
}
]
]
}
}
@@ -4833,7 +4895,39 @@
@@ -4833,7 +4895,39 @@
"bearer"
"bearer"
],
],
"timeout": true,
"timeout": true,
- "retry": false
+ "retry": true
+ },
+ {
+ "file": "server/pastes-client.js",
+ "targets": [
+ {
+ "service": "community",
+ "refs": [
+ {
+ "via": "OV_COMMUNITY_INTERNAL_URL",
+ "line": 16
+ }
+ ]
+ },
+ {
+ "service": "network",
+ "refs": [
+ {
+ "via": "OV_NETWORK_INTERNAL_URL",
+ "line": 39
+ },
+ {
+ "via": ":4000",
+ "line": 39
+ }
+ ]
+ }
+ ],
+ "auth": [
+ "none-detected"
+ ],
+ "timeout": true,
+ "retry": true
},
},
{
{
"file": "server/seo/seo.js",
"file": "server/seo/seo.js",
@@ -4909,15 +5003,15 @@
@@ -4909,15 +5003,15 @@
},
},
{
{
"via": "/internal/notifications",
"via": "/internal/notifications",
- "line": 60
+ "line": 66
},
},
{
{
"via": "/internal/notifications",
"via": "/internal/notifications",
- "line": 114
+ "line": 120
},
},
{
{
"via": "/internal/notifications",
"via": "/internal/notifications",
- "line": 137
+ "line": 143
}
}
]
]
}
}
@@ -4926,7 +5020,7 @@
@@ -4926,7 +5020,7 @@
"internal-key"
"internal-key"
],
],
"timeout": false,
"timeout": false,
- "retry": false
+ "retry": true
},
},
{
{
"file": "vendor/openvibe-shared/account-switcher.js",
"file": "vendor/openvibe-shared/account-switcher.js",
@@ -5366,21 +5460,21 @@
@@ -5366,21 +5460,21 @@
],
],
"contractTodos": 15,
"contractTodos": 15,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 56,
- "ci": false
+ "testFiles": 58,
+ "ci": true
},
},
{
{
"name": "OpenVibe.Network",
"name": "OpenVibe.Network",
"service": "network",
"service": "network",
"present": true,
"present": true,
"git": {
"git": {
- "head": "9b4e262cd8daf05ee2b6b92a06dabe70e2d42bc7",
+ "head": "1b79576cb024714e56ae2ccc7728080d3d3e0118",
"branch": "main",
"branch": "main",
- "originMain": "9b4e262cd8daf05ee2b6b92a06dabe70e2d42bc7",
- "committedAt": "2026-09-22T14:14:53-07:00"
+ "originMain": "1b79576cb024714e56ae2ccc7728080d3d3e0118",
+ "committedAt": "2026-09-22T16:11:37-07:00"
},
},
- "sourceFiles": 79,
- "loc": 20646,
+ "sourceFiles": 81,
+ "loc": 21029,
"tables": [
"tables": [
{
{
"table": "admin_rate_limits",
"table": "admin_rate_limits",
@@ -5562,6 +5656,24 @@
@@ -5562,6 +5656,24 @@
"line": 26,
"line": 26,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "user_modules",
+ "file": "server/identity/modules.js",
+ "line": 24,
+ "via": "repo"
+ },
+ {
+ "table": "principal_grants",
+ "file": "server/identity/principals.js",
+ "line": 44,
+ "via": "repo"
+ },
+ {
+ "table": "principal_usage",
+ "file": "server/identity/principals.js",
+ "line": 54,
+ "via": "repo"
+ },
{
{
"table": "identity_legacy_map",
"table": "identity_legacy_map",
"file": "server/identity/subjects.js",
"file": "server/identity/subjects.js",
@@ -5571,7 +5683,7 @@
@@ -5571,7 +5683,7 @@
{
{
"table": "stream_live_announcements",
"table": "stream_live_announcements",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 310,
+ "line": 325,
"via": "repo"
"via": "repo"
},
},
{
{
@@ -5646,7 +5758,7 @@
@@ -5646,7 +5758,7 @@
"method": "GET",
"method": "GET",
"path": "/.well-known/web-identity",
"path": "/.well-known/web-identity",
"file": "server/index.js",
"file": "server/index.js",
- "line": 572
+ "line": 574
},
},
{
{
"method": "POST",
"method": "POST",
@@ -5706,7 +5818,7 @@
@@ -5706,7 +5818,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/ssh-info",
"path": "/api/admin/ssh-info",
"file": "server/index.js",
"file": "server/index.js",
- "line": 452
+ "line": 454
},
},
{
{
"method": "GET",
"method": "GET",
@@ -5892,7 +6004,7 @@
@@ -5892,7 +6004,7 @@
"method": "GET",
"method": "GET",
"path": "/api/catalog.json",
"path": "/api/catalog.json",
"file": "server/index.js",
"file": "server/index.js",
- "line": 423
+ "line": 425
},
},
{
{
"method": "GET",
"method": "GET",
@@ -5984,6 +6096,48 @@
@@ -5984,6 +6096,48 @@
"file": "server/history/routes.js",
"file": "server/history/routes.js",
"line": 137
"line": 137
},
},
+ {
+ "method": "GET",
+ "path": "/api/modules",
+ "file": "server/identity/modules.js",
+ "line": 101
+ },
+ {
+ "method": "DELETE",
+ "path": "/api/modules/:ns",
+ "file": "server/identity/modules.js",
+ "line": 126
+ },
+ {
+ "method": "GET",
+ "path": "/api/modules/:ns",
+ "file": "server/identity/modules.js",
+ "line": 109
+ },
+ {
+ "method": "PUT",
+ "path": "/api/modules/:ns",
+ "file": "server/identity/modules.js",
+ "line": 117
+ },
+ {
+ "method": "GET",
+ "path": "/api/modules/:ns/public/:subject",
+ "file": "server/identity/modules.js",
+ "line": 93
+ },
+ {
+ "method": "GET",
+ "path": "/api/modules/modules/:ns/:subject",
+ "file": "server/identity/modules.js",
+ "line": 140
+ },
+ {
+ "method": "PUT",
+ "path": "/api/modules/modules/:ns/:subject",
+ "file": "server/identity/modules.js",
+ "line": 149
+ },
{
{
"method": "DELETE",
"method": "DELETE",
"path": "/api/profile/avatar",
"path": "/api/profile/avatar",
@@ -6036,7 +6190,7 @@
@@ -6036,7 +6190,7 @@
"method": "GET",
"method": "GET",
"path": "/api/sso/targets",
"path": "/api/sso/targets",
"file": "server/index.js",
"file": "server/index.js",
- "line": 405
+ "line": 407
},
},
{
{
"method": "GET",
"method": "GET",
@@ -6252,55 +6406,55 @@
@@ -6252,55 +6406,55 @@
"method": "GET",
"method": "GET",
"path": "/internal/anon-admin",
"path": "/internal/anon-admin",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 628
+ "line": 643
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/internal/anon-list",
"path": "/internal/anon-list",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 677
+ "line": 692
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/audit",
"path": "/internal/audit",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 166
+ "line": 178
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/coins/credit",
"path": "/internal/coins/credit",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 252
+ "line": 267
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/coins/debit",
"path": "/internal/coins/debit",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 264
+ "line": 279
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/internal/coins/stats",
"path": "/internal/coins/stats",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 214
+ "line": 226
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/coins/transfer",
"path": "/internal/coins/transfer",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 277
+ "line": 292
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/events/stream-live",
"path": "/internal/events/stream-live",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 294
+ "line": 309
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/identity/legacy-map",
"path": "/internal/identity/legacy-map",
"file": "server/identity/internal-routes.js",
"file": "server/identity/internal-routes.js",
- "line": 29
+ "line": 52
},
},
{
{
"method": "GET",
"method": "GET",
@@ -6308,113 +6462,131 @@
@@ -6308,113 +6462,131 @@
"file": "server/identity/internal-routes.js",
"file": "server/identity/internal-routes.js",
"line": 18
"line": 18
},
},
+ {
+ "method": "GET",
+ "path": "/internal/identity/resolve",
+ "file": "server/internal/routes.js",
+ "line": 40
+ },
+ {
+ "method": "POST",
+ "path": "/internal/identity/resolve-batch",
+ "file": "server/identity/internal-routes.js",
+ "line": 35
+ },
+ {
+ "method": "POST",
+ "path": "/internal/identity/resolve-batch",
+ "file": "server/internal/routes.js",
+ "line": 41
+ },
{
{
"method": "POST",
"method": "POST",
"path": "/internal/issue-token",
"path": "/internal/issue-token",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 518
+ "line": 533
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/link-account",
"path": "/internal/link-account",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 108
+ "line": 120
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/notifications/mark-read",
"path": "/internal/notifications/mark-read",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 479
+ "line": 494
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/notifications/push",
"path": "/internal/notifications/push",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 421
+ "line": 436
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/notifications/push-bulk",
"path": "/internal/notifications/push-bulk",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 441
+ "line": 456
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/notifications/resolve-users",
"path": "/internal/notifications/resolve-users",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 498
+ "line": 513
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/internal/notifications/unread/:userId",
"path": "/internal/notifications/unread/:userId",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 464
+ "line": 479
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/resolve-anon",
"path": "/internal/resolve-anon",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 549
+ "line": 564
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/internal/stats",
"path": "/internal/stats",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 175
+ "line": 187
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/internal/url-registry/resolved",
"path": "/internal/url-registry/resolved",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 184
+ "line": 196
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/user-avatar",
"path": "/internal/user-avatar",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 151
+ "line": 163
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/internal/users/:id",
"path": "/internal/users/:id",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 59
+ "line": 71
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/internal/users/:id/linked-accounts",
"path": "/internal/users/:id/linked-accounts",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 159
+ "line": 171
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/internal/users/:id/theme",
"path": "/internal/users/:id/theme",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 96
+ "line": 108
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/users/bulk",
"path": "/internal/users/bulk",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 81
+ "line": 93
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/internal/users/by-username/:username",
"path": "/internal/users/by-username/:username",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 70
+ "line": 82
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/verify-token",
"path": "/internal/verify-token",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 37
+ "line": 49
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/llms.txt",
"path": "/llms.txt",
"file": "server/index.js",
"file": "server/index.js",
- "line": 550
+ "line": 552
},
},
{
{
"method": "GET",
"method": "GET",
@@ -6480,31 +6652,31 @@
@@ -6480,31 +6652,31 @@
"method": "GET",
"method": "GET",
"path": "/oauth/.well-known/openid-configuration",
"path": "/oauth/.well-known/openid-configuration",
"file": "server/auth/oauth-routes.js",
"file": "server/auth/oauth-routes.js",
- "line": 306
+ "line": 318
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/oauth/authorize",
"path": "/oauth/authorize",
"file": "server/auth/oauth-routes.js",
"file": "server/auth/oauth-routes.js",
- "line": 21
+ "line": 22
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/oauth/confirm",
"path": "/oauth/confirm",
"file": "server/auth/oauth-routes.js",
"file": "server/auth/oauth-routes.js",
- "line": 79
+ "line": 80
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/oauth/token",
"path": "/oauth/token",
"file": "server/auth/oauth-routes.js",
"file": "server/auth/oauth-routes.js",
- "line": 132
+ "line": 133
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/openvibe-sw.js",
"path": "/openvibe-sw.js",
"file": "server/index.js",
"file": "server/index.js",
- "line": 596
+ "line": 598
},
},
{
{
"method": "GET",
"method": "GET",
@@ -6588,7 +6760,7 @@
@@ -6588,7 +6760,7 @@
"method": "GET",
"method": "GET",
"path": "/sso/check",
"path": "/sso/check",
"file": "server/index.js",
"file": "server/index.js",
- "line": 577
+ "line": 579
},
},
{
{
"method": "GET",
"method": "GET",
@@ -6612,7 +6784,7 @@
@@ -6612,7 +6784,7 @@
"method": "GET",
"method": "GET",
"path": "/tos",
"path": "/tos",
"file": "server/index.js",
"file": "server/index.js",
- "line": 419
+ "line": 421
},
},
{
{
"method": "GET",
"method": "GET",
@@ -6726,7 +6898,7 @@
@@ -6726,7 +6898,7 @@
"method": "GET",
"method": "GET",
"path": "/verify-email",
"path": "/verify-email",
"file": "server/index.js",
"file": "server/index.js",
- "line": 562
+ "line": 564
}
}
],
],
"ws": {
"ws": {
@@ -7079,7 +7251,7 @@
@@ -7079,7 +7251,7 @@
},
},
{
{
"via": "live.internalUrl",
"via": "live.internalUrl",
- "line": 477
+ "line": 479
}
}
]
]
},
},
@@ -7193,21 +7365,21 @@
@@ -7193,21 +7365,21 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 3600000,
"intervalMs": 3600000,
- "line": 652,
+ "line": 654,
"file": "server/index.js"
"file": "server/index.js"
},
},
{
{
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 120000,
"intervalMs": 120000,
- "line": 655,
+ "line": 657,
"file": "server/index.js"
"file": "server/index.js"
},
},
{
{
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 658,
+ "line": 660,
"file": "server/index.js"
"file": "server/index.js"
},
},
{
{
@@ -7248,21 +7420,21 @@
@@ -7248,21 +7420,21 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 18,
- "ci": false
+ "testFiles": 20,
+ "ci": true
},
},
{
{
"name": "OpenVibe.Media",
"name": "OpenVibe.Media",
"service": "media",
"service": "media",
"present": true,
"present": true,
"git": {
"git": {
- "head": "6114bc61c466cd51335548d0ce87058df125c577",
+ "head": "ddfefcf47740715f24fe7aa7dea648b4699162fc",
"branch": "main",
"branch": "main",
- "originMain": "6114bc61c466cd51335548d0ce87058df125c577",
- "committedAt": "2026-09-21T09:58:34-07:00"
+ "originMain": "ddfefcf47740715f24fe7aa7dea648b4699162fc",
+ "committedAt": "2026-09-22T16:14:04-07:00"
},
},
"sourceFiles": 28,
"sourceFiles": 28,
- "loc": 8702,
+ "loc": 8752,
"tables": [
"tables": [
{
{
"table": "apps",
"table": "apps",
@@ -7492,121 +7664,121 @@
@@ -7492,121 +7664,121 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/pastes",
"path": "/api/v1/:app/pastes",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 248
+ "line": 257
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/pastes",
"path": "/api/v1/:app/pastes",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 462
+ "line": 471
},
},
{
{
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/:app/pastes/:slug",
"path": "/api/v1/:app/pastes/:slug",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 616
+ "line": 625
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/pastes/:slug",
"path": "/api/v1/:app/pastes/:slug",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 436
+ "line": 445
},
},
{
{
"method": "PUT",
"method": "PUT",
"path": "/api/v1/:app/pastes/:slug",
"path": "/api/v1/:app/pastes/:slug",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 578
+ "line": 587
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/ai",
"path": "/api/v1/:app/pastes/:slug/ai",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 558
+ "line": 567
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/censor",
"path": "/api/v1/:app/pastes/:slug/censor",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 397
+ "line": 406
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/pastes/:slug/comments",
"path": "/api/v1/:app/pastes/:slug/comments",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 702
+ "line": 711
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/comments",
"path": "/api/v1/:app/pastes/:slug/comments",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 725
+ "line": 734
},
},
{
{
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/:app/pastes/:slug/comments/:commentId",
"path": "/api/v1/:app/pastes/:slug/comments/:commentId",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 803
+ "line": 812
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/copy",
"path": "/api/v1/:app/pastes/:slug/copy",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 677
+ "line": 686
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/fork",
"path": "/api/v1/:app/pastes/:slug/fork",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 634
+ "line": 643
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/like",
"path": "/api/v1/:app/pastes/:slug/like",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 660
+ "line": 669
},
},
{
{
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/:app/pastes/admin/forks",
"path": "/api/v1/:app/pastes/admin/forks",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 359
+ "line": 368
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/pastes/admin/forks",
"path": "/api/v1/:app/pastes/admin/forks",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 339
+ "line": 348
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/pastes/admin/stats",
"path": "/api/v1/:app/pastes/admin/stats",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 329
+ "line": 338
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/pastes/bulk",
"path": "/api/v1/:app/pastes/bulk",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 372
+ "line": 381
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/pastes/config",
"path": "/api/v1/:app/pastes/config",
"file": "server/pastes/routes.js",
"file": "server/pastes/routes.js",
- "line": 307
+ "line": 316
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/stats",
"path": "/api/v1/:app/stats",
"file": "server/index.js",
"file": "server/index.js",
- "line": 93
+ "line": 94
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/stats/series/:metric",
"path": "/api/v1/:app/stats/series/:metric",
"file": "server/index.js",
"file": "server/index.js",
- "line": 103
+ "line": 104
},
},
{
{
"method": "POST",
"method": "POST",
@@ -7738,25 +7910,25 @@
@@ -7738,25 +7910,25 @@
"method": "GET",
"method": "GET",
"path": "/healthz",
"path": "/healthz",
"file": "server/index.js",
"file": "server/index.js",
- "line": 82
+ "line": 83
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/internal/avatar-ingest",
"path": "/internal/avatar-ingest",
"file": "server/index.js",
"file": "server/index.js",
- "line": 56
+ "line": 57
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/manifest.webmanifest",
"path": "/manifest.webmanifest",
"file": "server/index.js",
"file": "server/index.js",
- "line": 44
+ "line": 45
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/tos",
"path": "/tos",
"file": "server/index.js",
"file": "server/index.js",
- "line": 41
+ "line": 42
}
}
],
],
"ws": {
"ws": {
@@ -7820,6 +7992,9 @@
@@ -7820,6 +7992,9 @@
"OV_OAUTH_REDIRECT_URI": [
"OV_OAUTH_REDIRECT_URI": [
"server/index.js"
"server/index.js"
],
],
+ "PASTES_FROZEN_APPS": [
+ "server/pastes/routes.js"
+ ],
"APP_INTERNAL_URLS": [
"APP_INTERNAL_URLS": [
"server/thumbnails/live-frame-service.js"
"server/thumbnails/live-frame-service.js"
],
],
@@ -7947,15 +8122,19 @@
@@ -7947,15 +8122,19 @@
"refs": [
"refs": [
{
{
"via": "network.url",
"via": "network.url",
- "line": 28
+ "line": 29
},
},
{
{
"via": "/api/.well-known/jwks",
"via": "/api/.well-known/jwks",
- "line": 28
+ "line": 29
+ },
+ {
+ "via": "network.url",
+ "line": 84
},
},
{
{
"via": "network.url",
"via": "network.url",
- "line": 83
+ "line": 99
}
}
]
]
},
},
@@ -7964,7 +8143,7 @@
@@ -7964,7 +8143,7 @@
"refs": [
"refs": [
{
{
"via": "webhook_url (per-app, configured in DB)",
"via": "webhook_url (per-app, configured in DB)",
- "line": 268
+ "line": 305
}
}
]
]
}
}
@@ -8187,28 +8366,28 @@
@@ -8187,28 +8366,28 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 58,
+ "line": 59,
"file": "server/auth.js"
"file": "server/auth.js"
},
},
{
{
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 43200000,
"intervalMs": 43200000,
- "line": 115,
+ "line": 116,
"file": "server/index.js"
"file": "server/index.js"
},
},
{
{
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 141,
+ "line": 142,
"file": "server/index.js"
"file": "server/index.js"
},
},
{
{
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 694,
+ "line": 703,
"file": "server/pastes/routes.js"
"file": "server/pastes/routes.js"
},
},
{
{
@@ -8249,8 +8428,8 @@
@@ -8249,8 +8428,8 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 4,
- "ci": false
+ "testFiles": 6,
+ "ci": true
},
},
{
{
"name": "OpenVibe.Tools",
"name": "OpenVibe.Tools",
@@ -9513,25 +9692,79 @@
@@ -9513,25 +9692,79 @@
"service": "community",
"service": "community",
"present": true,
"present": true,
"git": {
"git": {
- "head": "de947ead2addce29d7f9b98f3d894075ca4e82f2",
+ "head": "d7c6e608d8e27e6ddbfc78a15fa7590036b1dded",
"branch": "main",
"branch": "main",
- "originMain": "de947ead2addce29d7f9b98f3d894075ca4e82f2",
- "committedAt": "2026-09-21T09:58:34-07:00"
+ "originMain": "d7c6e608d8e27e6ddbfc78a15fa7590036b1dded",
+ "committedAt": "2026-09-22T16:32:05-07:00"
},
},
- "sourceFiles": 11,
- "loc": 1754,
+ "sourceFiles": 21,
+ "loc": 3950,
"tables": [
"tables": [
{
{
- "table": "analytics_events",
- "file": "vendor/openvibe-shared/analytics.js",
- "line": 74,
- "via": "vendored openvibe-shared"
+ "table": "pastes",
+ "file": "server/db.js",
+ "line": 18,
+ "via": "repo"
},
},
{
{
- "table": "analytics_hourly",
- "file": "vendor/openvibe-shared/analytics.js",
- "line": 98,
- "via": "vendored openvibe-shared"
+ "table": "paste_versions",
+ "file": "server/db.js",
+ "line": 54,
+ "via": "repo"
+ },
+ {
+ "table": "paste_likes",
+ "file": "server/db.js",
+ "line": 65,
+ "via": "repo"
+ },
+ {
+ "table": "paste_comments",
+ "file": "server/db.js",
+ "line": 72,
+ "via": "repo"
+ },
+ {
+ "table": "paste_visits",
+ "file": "server/db.js",
+ "line": 88,
+ "via": "repo"
+ },
+ {
+ "table": "subject_projection",
+ "file": "server/db.js",
+ "line": 98,
+ "via": "repo"
+ },
+ {
+ "table": "migration_runs",
+ "file": "server/db.js",
+ "line": 108,
+ "via": "repo"
+ },
+ {
+ "table": "legacy_id_map",
+ "file": "server/db.js",
+ "line": 116,
+ "via": "repo"
+ },
+ {
+ "table": "import_hold",
+ "file": "server/db.js",
+ "line": 125,
+ "via": "repo"
+ },
+ {
+ "table": "analytics_events",
+ "file": "vendor/openvibe-shared/analytics.js",
+ "line": 74,
+ "via": "vendored openvibe-shared"
+ },
+ {
+ "table": "analytics_hourly",
+ "file": "vendor/openvibe-shared/analytics.js",
+ "line": 98,
+ "via": "vendored openvibe-shared"
},
},
{
{
"table": "analytics_daily",
"table": "analytics_daily",
@@ -9551,133 +9784,283 @@
@@ -9551,133 +9784,283 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/app.js",
"file": "server/app.js",
- "line": 106
+ "line": 146
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 81
+ "line": 120
+ },
+ {
+ "method": "GET",
+ "path": "/api/pastes",
+ "file": "server/pastes/api.js",
+ "line": 102
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes",
+ "file": "server/pastes/api.js",
+ "line": 106
+ },
+ {
+ "method": "DELETE",
+ "path": "/api/pastes/:slug",
+ "file": "server/pastes/api.js",
+ "line": 124
+ },
+ {
+ "method": "GET",
+ "path": "/api/pastes/:slug",
+ "file": "server/pastes/api.js",
+ "line": 122
+ },
+ {
+ "method": "PUT",
+ "path": "/api/pastes/:slug",
+ "file": "server/pastes/api.js",
+ "line": 123
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes/:slug/ai",
+ "file": "server/pastes/api.js",
+ "line": 127
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes/:slug/censor",
+ "file": "server/pastes/api.js",
+ "line": 126
+ },
+ {
+ "method": "GET",
+ "path": "/api/pastes/:slug/comments",
+ "file": "server/pastes/api.js",
+ "line": 136
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes/:slug/comments",
+ "file": "server/pastes/api.js",
+ "line": 137
+ },
+ {
+ "method": "DELETE",
+ "path": "/api/pastes/:slug/comments/:commentId",
+ "file": "server/pastes/api.js",
+ "line": 140
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes/:slug/copy",
+ "file": "server/pastes/api.js",
+ "line": 134
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes/:slug/fork",
+ "file": "server/pastes/api.js",
+ "line": 132
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes/:slug/like",
+ "file": "server/pastes/api.js",
+ "line": 133
+ },
+ {
+ "method": "GET",
+ "path": "/api/pastes/:slug/raw",
+ "file": "server/pastes/api.js",
+ "line": 129
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes/:slug/set-avatar",
+ "file": "server/pastes/api.js",
+ "line": 143
+ },
+ {
+ "method": "GET",
+ "path": "/api/pastes/:slug/versions",
+ "file": "server/pastes/api.js",
+ "line": 130
+ },
+ {
+ "method": "DELETE",
+ "path": "/api/pastes/admin/forks",
+ "file": "server/pastes/api.js",
+ "line": 113
+ },
+ {
+ "method": "GET",
+ "path": "/api/pastes/admin/forks",
+ "file": "server/pastes/api.js",
+ "line": 112
+ },
+ {
+ "method": "GET",
+ "path": "/api/pastes/admin/stats",
+ "file": "server/pastes/api.js",
+ "line": 111
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes/bulk",
+ "file": "server/pastes/api.js",
+ "line": 114
+ },
+ {
+ "method": "GET",
+ "path": "/api/pastes/by-user/:username",
+ "file": "server/pastes/api.js",
+ "line": 119
+ },
+ {
+ "method": "GET",
+ "path": "/api/pastes/config",
+ "file": "server/pastes/api.js",
+ "line": 109
+ },
+ {
+ "method": "POST",
+ "path": "/api/pastes/screenshot",
+ "file": "server/pastes/api.js",
+ "line": 116
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 82
+ "line": 121
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/callback",
"path": "/callback",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 281
+ "line": 289
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/fedcm",
"path": "/fedcm",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 327
+ "line": 335
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/feed.xml",
"path": "/feed.xml",
"file": "server/app.js",
"file": "server/app.js",
- "line": 99
+ "line": 138
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/login",
"path": "/login",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 259
+ "line": 267
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/logout",
"path": "/logout",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 355
+ "line": 363
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/me",
"path": "/me",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 379
+ "line": 387
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/my",
"path": "/my",
"file": "server/app.js",
"file": "server/app.js",
- "line": 186
+ "line": 252
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/new",
"path": "/new",
"file": "server/app.js",
"file": "server/app.js",
- "line": 150
+ "line": 214
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/new",
"path": "/new",
"file": "server/app.js",
"file": "server/app.js",
- "line": 159
+ "line": 225
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/p/:slug",
"path": "/p/:slug",
"file": "server/app.js",
"file": "server/app.js",
- "line": 119
+ "line": 159
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/p/:slug/download",
"path": "/p/:slug/download",
"file": "server/app.js",
"file": "server/app.js",
- "line": 138
+ "line": 202
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/p/:slug/raw",
"path": "/p/:slug/raw",
"file": "server/app.js",
"file": "server/app.js",
- "line": 135
+ "line": 178
+ },
+ {
+ "method": "GET",
+ "path": "/p/:slug/raw",
+ "file": "server/app.js",
+ "line": 198
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/p/:slug/screenshot",
"path": "/p/:slug/screenshot",
"file": "server/app.js",
"file": "server/app.js",
- "line": 136
+ "line": 191
+ },
+ {
+ "method": "GET",
+ "path": "/p/:slug/screenshot",
+ "file": "server/app.js",
+ "line": 199
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/pastes",
"path": "/pastes",
"file": "server/app.js",
"file": "server/app.js",
- "line": 111
+ "line": 151
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/pastes/:slug",
"path": "/pastes/:slug",
"file": "server/app.js",
"file": "server/app.js",
- "line": 117
+ "line": 157
},
},
{
{
"method": "POST",
"method": "POST",
"path": "/refresh",
"path": "/refresh",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 389
+ "line": 397
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/robots.txt",
"path": "/robots.txt",
"file": "server/app.js",
"file": "server/app.js",
- "line": 97
+ "line": 136
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/sitemap.xml",
"path": "/sitemap.xml",
"file": "server/app.js",
"file": "server/app.js",
- "line": 98
+ "line": 137
},
},
{
{
"method": "GET",
"method": "GET",
"path": "/tos",
"path": "/tos",
"file": "server/app.js",
"file": "server/app.js",
- "line": 75
+ "line": 82
}
}
],
],
"ws": {
"ws": {
@@ -9730,6 +10113,18 @@
@@ -9730,6 +10113,18 @@
"server/config.js",
"server/config.js",
"vendor/openvibe-shared/brand.js"
"vendor/openvibe-shared/brand.js"
],
],
+ "OV_MEDIA_INTERNAL_URL": [
+ "server/config.js"
+ ],
+ "PASTES_AUTHORITY": [
+ "server/config.js"
+ ],
+ "COMMUNITY_DB_PATH": [
+ "server/config.js"
+ ],
+ "VIEW_HASH_SECRET": [
+ "server/pastes/service.js"
+ ],
"LOGIN_URL": [
"LOGIN_URL": [
"vendor/openvibe-shared/brand.js"
"vendor/openvibe-shared/brand.js"
],
],
@@ -9800,35 +10195,35 @@
@@ -9800,35 +10195,35 @@
},
},
{
{
"via": "networkInternalUrl",
"via": "networkInternalUrl",
- "line": 67
+ "line": 75
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 67
+ "line": 75
},
},
{
{
"via": "/api/.well-known/jwks",
"via": "/api/.well-known/jwks",
- "line": 70
+ "line": 78
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 146
+ "line": 154
},
},
{
{
"via": "networkInternalUrl",
"via": "networkInternalUrl",
- "line": 227
+ "line": 235
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 227
+ "line": 235
},
},
{
{
"via": "/oauth/token",
"via": "/oauth/token",
- "line": 230
+ "line": 238
},
},
{
{
"via": "networkInternalUrl",
"via": "networkInternalUrl",
- "line": 361
+ "line": 369
}
}
]
]
}
}
@@ -10000,11 +10395,19 @@
@@ -10000,11 +10395,19 @@
"retry": true
"retry": true
}
}
],
],
- "jobs": [],
+ "jobs": [
+ {
+ "kind": "setInterval",
+ "name": null,
+ "intervalMs": null,
+ "line": 211,
+ "file": "server/pastes/service.js"
+ }
+ ],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 8,
- "ci": false
+ "testFiles": 14,
+ "ci": true
},
},
{
{
"name": "OpenVibe.Games",
"name": "OpenVibe.Games",
@@ -11018,77 +11421,221 @@
@@ -11018,77 +11421,221 @@
"state": "identical"
"state": "identical"
},
},
{
{
- "repo": "OpenVibe.Tools",
- "file": "ui.js",
- "state": "identical"
+ "repo": "OpenVibe.Tools",
+ "file": "ui.js",
+ "state": "identical"
+ },
+ {
+ "repo": "OpenVibe.Tools",
+ "file": "url-resolver.js",
+ "state": "identical"
+ },
+ {
+ "repo": "OpenVibe.Tools",
+ "file": "user-card.js",
+ "state": "identical"
+ }
+ ],
+ "ownership": [
+ {
+ "repo": "OpenVibe.Community",
+ "table": "analytics_daily",
+ "declaredAt": [
+ "vendor/openvibe-shared/analytics.js:116"
+ ],
+ "prodDbs": [],
+ "inCode": true,
+ "inProd": false,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "Track O / ADR-021",
+ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
+ },
+ {
+ "repo": "OpenVibe.Community",
+ "table": "analytics_events",
+ "declaredAt": [
+ "vendor/openvibe-shared/analytics.js:74"
+ ],
+ "prodDbs": [],
+ "inCode": true,
+ "inProd": false,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "Track O / ADR-021",
+ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
+ },
+ {
+ "repo": "OpenVibe.Community",
+ "table": "analytics_hourly",
+ "declaredAt": [
+ "vendor/openvibe-shared/analytics.js:98"
+ ],
+ "prodDbs": [],
+ "inCode": true,
+ "inProd": false,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "Track O / ADR-021",
+ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
+ },
+ {
+ "repo": "OpenVibe.Community",
+ "table": "analytics_rate_tracking",
+ "declaredAt": [
+ "vendor/openvibe-shared/analytics.js:137"
+ ],
+ "prodDbs": [],
+ "inCode": true,
+ "inProd": false,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "Track O / ADR-021",
+ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
+ },
+ {
+ "repo": "OpenVibe.Community",
+ "table": "import_hold",
+ "declaredAt": [
+ "server/db.js:125"
+ ],
+ "prodDbs": [
+ "community.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "W5",
+ "note": ""
+ },
+ {
+ "repo": "OpenVibe.Community",
+ "table": "legacy_id_map",
+ "declaredAt": [
+ "server/db.js:116"
+ ],
+ "prodDbs": [
+ "community.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "W5",
+ "note": ""
+ },
+ {
+ "repo": "OpenVibe.Community",
+ "table": "migration_runs",
+ "declaredAt": [
+ "server/db.js:108"
+ ],
+ "prodDbs": [
+ "community.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "W5",
+ "note": ""
},
},
{
{
- "repo": "OpenVibe.Tools",
- "file": "url-resolver.js",
- "state": "identical"
+ "repo": "OpenVibe.Community",
+ "table": "paste_comments",
+ "declaredAt": [
+ "server/db.js:72"
+ ],
+ "prodDbs": [
+ "community.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "W5",
+ "note": ""
},
},
{
{
- "repo": "OpenVibe.Tools",
- "file": "user-card.js",
- "state": "identical"
- }
- ],
- "ownership": [
+ "repo": "OpenVibe.Community",
+ "table": "paste_likes",
+ "declaredAt": [
+ "server/db.js:65"
+ ],
+ "prodDbs": [
+ "community.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "W5",
+ "note": ""
+ },
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
- "table": "analytics_daily",
+ "table": "paste_versions",
"declaredAt": [
"declaredAt": [
- "vendor/openvibe-shared/analytics.js:116"
+ "server/db.js:54"
+ ],
+ "prodDbs": [
+ "community.db"
],
],
- "prodDbs": [],
"inCode": true,
"inCode": true,
- "inProd": false,
+ "inProd": true,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
- "wave": "Track O / ADR-021",
- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
+ "wave": "W5",
+ "note": ""
},
},
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
- "table": "analytics_events",
+ "table": "paste_visits",
"declaredAt": [
"declaredAt": [
- "vendor/openvibe-shared/analytics.js:74"
+ "server/db.js:88"
+ ],
+ "prodDbs": [
+ "community.db"
],
],
- "prodDbs": [],
"inCode": true,
"inCode": true,
- "inProd": false,
+ "inProd": true,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
- "wave": "Track O / ADR-021",
- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
+ "wave": "W5",
+ "note": ""
},
},
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
- "table": "analytics_hourly",
+ "table": "pastes",
"declaredAt": [
"declaredAt": [
- "vendor/openvibe-shared/analytics.js:98"
+ "server/db.js:18"
+ ],
+ "prodDbs": [
+ "community.db"
],
],
- "prodDbs": [],
"inCode": true,
"inCode": true,
- "inProd": false,
+ "inProd": true,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
- "wave": "Track O / ADR-021",
- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
+ "wave": "W5",
+ "note": ""
},
},
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
- "table": "analytics_rate_tracking",
+ "table": "subject_projection",
"declaredAt": [
"declaredAt": [
- "vendor/openvibe-shared/analytics.js:137"
+ "server/db.js:98"
+ ],
+ "prodDbs": [
+ "community.db"
],
],
- "prodDbs": [],
"inCode": true,
"inCode": true,
- "inProd": false,
+ "inProd": true,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
- "wave": "Track O / ADR-021",
- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
+ "wave": "W5",
+ "note": ""
},
},
{
{
"repo": "OpenVibe.Games",
"repo": "OpenVibe.Games",
@@ -14635,6 +15182,38 @@
@@ -14635,6 +15182,38 @@
"wave": "W1 (module split)",
"wave": "W1 (module split)",
"note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
"note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
},
},
+ {
+ "repo": "OpenVibe.Network",
+ "table": "principal_grants",
+ "declaredAt": [
+ "server/identity/principals.js:44"
+ ],
+ "prodDbs": [
+ "network.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1 (module split)",
+ "note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
+ },
+ {
+ "repo": "OpenVibe.Network",
+ "table": "principal_usage",
+ "declaredAt": [
+ "server/identity/principals.js:54"
+ ],
+ "prodDbs": [
+ "network.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1 (module split)",
+ "note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
+ },
{
{
"repo": "OpenVibe.Network",
"repo": "OpenVibe.Network",
"table": "push_subscriptions",
"table": "push_subscriptions",
@@ -14671,7 +15250,7 @@
@@ -14671,7 +15250,7 @@
"repo": "OpenVibe.Network",
"repo": "OpenVibe.Network",
"table": "stream_live_announcements",
"table": "stream_live_announcements",
"declaredAt": [
"declaredAt": [
- "server/internal/routes.js:310"
+ "server/internal/routes.js:325"
],
],
"prodDbs": [
"prodDbs": [
"network.db"
"network.db"
@@ -14764,6 +15343,22 @@
@@ -14764,6 +15343,22 @@
"wave": "W1 (module split)",
"wave": "W1 (module split)",
"note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
"note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
},
},
+ {
+ "repo": "OpenVibe.Network",
+ "table": "user_modules",
+ "declaredAt": [
+ "server/identity/modules.js:24"
+ ],
+ "prodDbs": [
+ "network.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1 (module split)",
+ "note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
+ },
{
{
"repo": "OpenVibe.Network",
"repo": "OpenVibe.Network",
"table": "user_preferences",
"table": "user_preferences",
@@ -14945,7 +15540,7 @@
@@ -14945,7 +15540,7 @@
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"via": "/api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token",
"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,75,75,78,154,235,235,238,369",
"auth": "oauth-client",
"auth": "oauth-client",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
@@ -15010,6 +15605,26 @@
@@ -15010,6 +15605,26 @@
"timeout": false,
"timeout": false,
"retry": false
"retry": false
},
},
+ {
+ "caller": "OpenVibe.Live",
+ "file": "server/media-proxy/pastes.js",
+ "target": "OpenVibe.Community",
+ "via": "OV_COMMUNITY_URL",
+ "lines": "311",
+ "auth": "none-detected",
+ "timeout": true,
+ "retry": true
+ },
+ {
+ "caller": "OpenVibe.Live",
+ "file": "server/pastes-client.js",
+ "target": "OpenVibe.Community",
+ "via": "OV_COMMUNITY_INTERNAL_URL",
+ "lines": "16",
+ "auth": "none-detected",
+ "timeout": true,
+ "retry": true
+ },
{
{
"caller": "OpenVibe.Live",
"caller": "OpenVibe.Live",
"file": "server/seo/seo.js",
"file": "server/seo/seo.js",
@@ -15085,10 +15700,20 @@
@@ -15085,10 +15700,20 @@
"file": "server/monetization/wallet-client.js",
"file": "server/monetization/wallet-client.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"via": "/internal/coins, OV_NETWORK_INTERNAL_URL, :4000",
"via": "/internal/coins, OV_NETWORK_INTERNAL_URL, :4000",
- "lines": "9,18,18,71,84,95,143",
+ "lines": "9,19,19,79,92,103,151",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": true,
"timeout": true,
- "retry": false
+ "retry": true
+ },
+ {
+ "caller": "OpenVibe.Live",
+ "file": "server/pastes-client.js",
+ "target": "OpenVibe.Network",
+ "via": "OV_NETWORK_INTERNAL_URL, :4000",
+ "lines": "39,39",
+ "auth": "none-detected",
+ "timeout": true,
+ "retry": true
},
},
{
{
"caller": "OpenVibe.Live",
"caller": "OpenVibe.Live",
@@ -15115,10 +15740,10 @@
@@ -15115,10 +15740,10 @@
"file": "server/utils/notify.js",
"file": "server/utils/notify.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"via": "OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications",
"via": "OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications",
- "lines": "16,16,60,114,137",
+ "lines": "16,16,66,120,143",
"auth": "internal-key",
"auth": "internal-key",
"timeout": false,
"timeout": false,
- "retry": false
+ "retry": true
},
},
{
{
"caller": "OpenVibe.Live",
"caller": "OpenVibe.Live",
@@ -15195,7 +15820,7 @@
@@ -15195,7 +15820,7 @@
"file": "server/auth.js",
"file": "server/auth.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"via": "network.url, /api/.well-known/jwks",
"via": "network.url, /api/.well-known/jwks",
- "lines": "28,28,83",
+ "lines": "29,29,84,99",
"auth": "none-detected",
"auth": "none-detected",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
@@ -15255,7 +15880,7 @@
@@ -15255,7 +15880,7 @@
"file": "server/auth.js",
"file": "server/auth.js",
"target": "webhook",
"target": "webhook",
"via": "webhook_url (per-app, configured in DB)",
"via": "webhook_url (per-app, configured in DB)",
- "lines": "268",
+ "lines": "305",
"auth": "none-detected",
"auth": "none-detected",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
@@ -15335,7 +15960,7 @@
@@ -15335,7 +15960,7 @@
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"via": ":3000, live.internalUrl",
"via": ":3000, live.internalUrl",
- "lines": "215,289,477",
+ "lines": "215,289,479",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": false,
"timeout": false,
"retry": false
"retry": false
@@ -15571,6 +16196,15 @@
@@ -15571,6 +16196,15 @@
],
],
"prod": "community.env"
"prod": "community.env"
},
},
+ {
+ "repo": "OpenVibe.Community",
+ "name": "COMMUNITY_DB_PATH",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
"name": "COOKIE_SECURE",
"name": "COOKIE_SECURE",
@@ -15707,6 +16341,15 @@
@@ -15707,6 +16341,15 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Community",
+ "name": "OV_MEDIA_INTERNAL_URL",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
"name": "OV_MEDIA_URL",
"name": "OV_MEDIA_URL",
@@ -15817,6 +16460,15 @@
@@ -15817,6 +16460,15 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Community",
+ "name": "PASTES_AUTHORITY",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": "community.env"
+ },
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
"name": "PORT",
"name": "PORT",
@@ -15835,6 +16487,15 @@
@@ -15835,6 +16487,15 @@
],
],
"prod": "community.env"
"prod": "community.env"
},
},
+ {
+ "repo": "OpenVibe.Community",
+ "name": "VIEW_HASH_SECRET",
+ "secret": true,
+ "files": [
+ "server/pastes/service.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Games",
"repo": "OpenVibe.Games",
"name": "DB_PATH",
"name": "DB_PATH",
@@ -16181,6 +16842,7 @@
@@ -16181,6 +16842,7 @@
"server/chat/chat-server.js",
"server/chat/chat-server.js",
"server/config.js",
"server/config.js",
"server/monetization/wallet-client.js",
"server/monetization/wallet-client.js",
+ "server/net/network-principal.js",
"server/streaming/routes.js",
"server/streaming/routes.js",
"server/utils/notify.js"
"server/utils/notify.js"
],
],
@@ -16474,12 +17136,22 @@
@@ -16474,12 +17136,22 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Live",
+ "name": "OV_COMMUNITY_INTERNAL_URL",
+ "secret": false,
+ "files": [
+ "server/pastes-client.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"name": "OV_COMMUNITY_URL",
"name": "OV_COMMUNITY_URL",
"secret": false,
"secret": false,
"files": [
"files": [
"server/index.js",
"server/index.js",
+ "server/media-proxy/pastes.js",
"server/seo/seo.js",
"server/seo/seo.js",
"vendor/openvibe-shared/brand.js"
"vendor/openvibe-shared/brand.js"
],
],
@@ -16538,6 +17210,7 @@
@@ -16538,6 +17210,7 @@
"server/chat/chat-server.js",
"server/chat/chat-server.js",
"server/config.js",
"server/config.js",
"server/monetization/wallet-client.js",
"server/monetization/wallet-client.js",
+ "server/net/network-principal.js",
"server/streaming/routes.js",
"server/streaming/routes.js",
"server/utils/notify.js"
"server/utils/notify.js"
],
],
@@ -16595,6 +17268,8 @@
@@ -16595,6 +17268,8 @@
"files": [
"files": [
"server/chat/chat-server.js",
"server/chat/chat-server.js",
"server/monetization/wallet-client.js",
"server/monetization/wallet-client.js",
+ "server/net/network-principal.js",
+ "server/pastes-client.js",
"server/utils/notify.js"
"server/utils/notify.js"
],
],
"prod": "live.env"
"prod": "live.env"
@@ -16634,7 +17309,8 @@
@@ -16634,7 +17309,8 @@
"name": "OV_OAUTH_CLIENT_ID",
"name": "OV_OAUTH_CLIENT_ID",
"secret": false,
"secret": false,
"files": [
"files": [
- "server/auth/routes.js"
+ "server/auth/routes.js",
+ "server/net/network-principal.js"
],
],
"prod": "live.env"
"prod": "live.env"
},
},
@@ -16643,7 +17319,8 @@
@@ -16643,7 +17319,8 @@
"name": "OV_OAUTH_CLIENT_SECRET",
"name": "OV_OAUTH_CLIENT_SECRET",
"secret": true,
"secret": true,
"files": [
"files": [
- "server/auth/routes.js"
+ "server/auth/routes.js",
+ "server/net/network-principal.js"
],
],
"prod": "live.env"
"prod": "live.env"
},
},
@@ -16701,6 +17378,15 @@
@@ -16701,6 +17378,15 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Live",
+ "name": "PASTES_AUTHORITY",
+ "secret": false,
+ "files": [
+ "server/pastes-client.js"
+ ],
+ "prod": "live.env"
+ },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"name": "PASTES_ON_COMMUNITY",
"name": "PASTES_ON_COMMUNITY",
@@ -17576,6 +18262,23 @@
@@ -17576,6 +18262,23 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Media",
+ "name": "PASTES_FROZEN_APPS",
+ "secret": false,
+ "files": [
+ "server/pastes/routes.js"
+ ],
+ "prod": "media.env"
+ },
+ {
+ "repo": "OpenVibe.Media",
+ "name": "PASTES_MOVED_TO",
+ "secret": false,
+ "files": [],
+ "prod": "media.env",
+ "unreferenced": true
+ },
{
{
"repo": "OpenVibe.Media",
"repo": "OpenVibe.Media",
"name": "PASTES_PATH",
"name": "PASTES_PATH",
@@ -18697,6 +19400,12 @@
@@ -18697,6 +19400,12 @@
"subject": "OpenVibe.Community:COOKIE_SECURE",
"subject": "OpenVibe.Community:COOKIE_SECURE",
"detail": "secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback"
"detail": "secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback"
},
},
+ {
+ "severity": "low",
+ "area": "env",
+ "subject": "OpenVibe.Community:VIEW_HASH_SECRET",
+ "detail": "secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback"
+ },
{
{
"severity": "low",
"severity": "low",
"area": "env",
"area": "env",
@@ -19195,6 +19904,12 @@
@@ -19195,6 +19904,12 @@
"subject": "OpenVibe.Live:UNSAFE_WORDS_PATH",
"subject": "OpenVibe.Live:UNSAFE_WORDS_PATH",
"detail": "set in live.env but not referenced by scanned code (may be read by a dependency or stale)"
"detail": "set in live.env but not referenced by scanned code (may be read by a dependency or stale)"
},
},
+ {
+ "severity": "info",
+ "area": "env",
+ "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",
"severity": "info",
"area": "env",
"area": "env",
@@ -19243,6 +19958,30 @@
@@ -19243,6 +19958,30 @@
"subject": "OpenVibe.Tools:MEDIA_URL",
"subject": "OpenVibe.Tools:MEDIA_URL",
"detail": "set in tools.env but not referenced by scanned code (may be read by a dependency or stale)"
"detail": "set in tools.env but not referenced by scanned code (may be read by a dependency or stale)"
},
},
+ {
+ "severity": "info",
+ "area": "schema",
+ "subject": "OpenVibe.Community:analytics_daily",
+ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
+ },
+ {
+ "severity": "info",
+ "area": "schema",
+ "subject": "OpenVibe.Community:analytics_events",
+ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
+ },
+ {
+ "severity": "info",
+ "area": "schema",
+ "subject": "OpenVibe.Community:analytics_hourly",
+ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
+ },
+ {
+ "severity": "info",
+ "area": "schema",
+ "subject": "OpenVibe.Community:analytics_rate_tracking",
+ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
+ },
{
{
"severity": "info",
"severity": "info",
"area": "schema",
"area": "schema",
@@ -19319,15 +20058,15 @@
@@ -19319,15 +20058,15 @@
"metrics": {
"metrics": {
"github.charters": "20 charter-only repos of 32",
"github.charters": "20 charter-only repos of 32",
"contract.todo-markers": "Live 15, Network 0, Media 0, Tools 0, Community 0, Games 0, Sites 0",
"contract.todo-markers": "Live 15, Network 0, Media 0, Tools 0, Community 0, Games 0, Sites 0",
- "outbound.call-sites": "65 caller-file/target pairs across 50 files",
- "outbound.internal-key": "28 of 65 call sites authenticate with the shared internal key",
+ "outbound.call-sites": "68 caller-file/target pairs across 52 files",
+ "outbound.internal-key": "28 of 68 call sites authenticate with the shared internal key",
"ws.servers": "10 WebSocket server constructions",
"ws.servers": "10 WebSocket server constructions",
"tables.analytics-copies": "5 repos carry their own analytics_events",
"tables.analytics-copies": "5 repos carry their own analytics_events",
"vendored.copies": "5 repos vendor openvibe-shared (129 files)",
"vendored.copies": "5 repos vendor openvibe-shared (129 files)",
"vendored.divergent": "4 divergent: Community/ov-icons.js, Live/user-card.js, Media/ov-icons.js, Tools/ov-icons.js",
"vendored.divergent": "4 divergent: Community/ov-icons.js, Live/user-card.js, Media/ov-icons.js, Tools/ov-icons.js",
- "ci.repos": "0 of 7 scanned repos have .github/workflows",
+ "ci.repos": "4 of 7 scanned repos have .github/workflows",
"deploy.drift": "1 service(s) not running origin/main",
"deploy.drift": "1 service(s) not running origin/main",
- "tests.OpenVibe.Live": "56 test files",
+ "tests.OpenVibe.Live": "58 test files",
"tables.OpenVibe.Live": "125 tables",
"tables.OpenVibe.Live": "125 tables",
"tables.OpenVibe.Live.target:OpenVibe.Games (import source)": "31 Live tables target OpenVibe.Games (import source)",
"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.AI": "14 Live tables target OpenVibe.AI",
@@ -19346,21 +20085,21 @@
@@ -19346,21 +20085,21 @@
"tables.OpenVibe.Live.target:OpenVibe.Billing": "2 Live tables target OpenVibe.Billing",
"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.Billing + OpenVibe.VIP": "1 Live tables target OpenVibe.Billing + OpenVibe.VIP",
"tables.OpenVibe.Live.target:OpenVibe.Codes": "2 Live tables target OpenVibe.Codes",
"tables.OpenVibe.Live.target:OpenVibe.Codes": "2 Live tables target OpenVibe.Codes",
- "tests.OpenVibe.Network": "18 test files",
- "tables.OpenVibe.Network": "36 tables",
- "tables.OpenVibe.Network.target:OpenVibe.Network": "33 Network tables target OpenVibe.Network",
+ "tests.OpenVibe.Network": "20 test files",
+ "tables.OpenVibe.Network": "39 tables",
+ "tables.OpenVibe.Network.target:OpenVibe.Network": "36 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.Billing (loyalty ledger)": "2 Network tables target OpenVibe.Billing (loyalty ledger)",
"tables.OpenVibe.Network.target:OpenVibe.Events": "1 Network tables target OpenVibe.Events",
"tables.OpenVibe.Network.target:OpenVibe.Events": "1 Network tables target OpenVibe.Events",
- "tests.OpenVibe.Media": "4 test files",
+ "tests.OpenVibe.Media": "6 test files",
"tables.OpenVibe.Media": "15 tables",
"tables.OpenVibe.Media": "15 tables",
"tables.OpenVibe.Media.target:OpenVibe.Media": "12 Media tables target OpenVibe.Media",
"tables.OpenVibe.Media.target:OpenVibe.Media": "12 Media tables target OpenVibe.Media",
"tables.OpenVibe.Media.target:OpenVibe.Community": "3 Media tables target OpenVibe.Community",
"tables.OpenVibe.Media.target:OpenVibe.Community": "3 Media tables target OpenVibe.Community",
"tests.OpenVibe.Tools": "2 test files",
"tests.OpenVibe.Tools": "2 test files",
"tables.OpenVibe.Tools": "4 tables",
"tables.OpenVibe.Tools": "4 tables",
"tables.OpenVibe.Tools.target:OpenVibe.Tools": "4 Tools tables target OpenVibe.Tools",
"tables.OpenVibe.Tools.target:OpenVibe.Tools": "4 Tools tables target OpenVibe.Tools",
- "tests.OpenVibe.Community": "8 test files",
- "tables.OpenVibe.Community": "4 tables",
- "tables.OpenVibe.Community.target:OpenVibe.Community": "4 Community tables target OpenVibe.Community",
+ "tests.OpenVibe.Community": "14 test files",
+ "tables.OpenVibe.Community": "13 tables",
+ "tables.OpenVibe.Community.target:OpenVibe.Community": "13 Community tables target OpenVibe.Community",
"tests.OpenVibe.Games": "56 test files",
"tests.OpenVibe.Games": "56 test files",
"tables.OpenVibe.Games": "5 tables",
"tables.OpenVibe.Games": "5 tables",
"tables.OpenVibe.Games.target:OpenVibe.Games": "5 Games tables target OpenVibe.Games",
"tables.OpenVibe.Games.target:OpenVibe.Games": "5 Games tables target OpenVibe.Games",
@@ -19492,7 +20231,7 @@
@@ -19492,7 +20231,7 @@
"metrics": [
"metrics": [
{
{
"key": "outbound.call-sites",
"key": "outbound.call-sites",
- "value": "65 caller-file/target pairs across 50 files"
+ "value": "68 caller-file/target pairs across 52 files"
},
},
{
{
"key": "ws.servers",
"key": "ws.servers",
@@ -19599,7 +20338,7 @@
@@ -19599,7 +20338,7 @@
"metrics": [
"metrics": [
{
{
"key": "tables.OpenVibe.Community",
"key": "tables.OpenVibe.Community",
- "value": "4 tables"
+ "value": "13 tables"
},
},
{
{
"key": "tables.OpenVibe.Live.target:OpenVibe.Community",
"key": "tables.OpenVibe.Live.target:OpenVibe.Community",
@@ -19754,7 +20493,7 @@
@@ -19754,7 +20493,7 @@
"metrics": [
"metrics": [
{
{
"key": "outbound.internal-key",
"key": "outbound.internal-key",
- "value": "28 of 65 call sites authenticate with the shared internal key"
+ "value": "28 of 68 call sites authenticate with the shared internal key"
}
}
],
],
"verified": true
"verified": true
@@ -19877,7 +20616,7 @@
@@ -19877,7 +20616,7 @@
"metrics": [
"metrics": [
{
{
"key": "ci.repos",
"key": "ci.repos",
- "value": "0 of 7 scanned repos have .github/workflows"
+ "value": "4 of 7 scanned repos have .github/workflows"
}
}
],
],
"verified": true
"verified": true
@@ -19972,7 +20711,7 @@
@@ -19972,7 +20711,7 @@
"mitigation": "Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB).",
"mitigation": "Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB).",
"status": "open",
"status": "open",
"check": "workstation-disk",
"check": "workstation-disk",
- "checkResult": "workstation / is 82% used (at generation time)"
+ "checkResult": "workstation / is 83% used (at generation time)"
},
},
{
{
"id": "H8",
"id": "H8",
@@ -20068,25 +20807,25 @@
@@ -20068,25 +20807,25 @@
"id": "EC1",
"id": "EC1",
"text": "Every table has an owner classification",
"text": "Every table has an owner classification",
"pass": true,
"pass": true,
- "detail": "250 tables classified, 0 unclassified"
+ "detail": "262 tables classified, 0 unclassified"
},
},
{
{
"id": "EC2",
"id": "EC2",
"text": "Every route is attributed to a repo and source line",
"text": "Every route is attributed to a repo and source line",
"pass": true,
"pass": true,
- "detail": "928 routes; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"
+ "detail": "968 routes; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"
},
},
{
{
"id": "EC3",
"id": "EC3",
"text": "Every background job is listed with its location",
"text": "Every background job is listed with its location",
"pass": true,
"pass": true,
- "detail": "82 timers/jobs"
+ "detail": "83 timers/jobs"
},
},
{
{
"id": "EC4",
"id": "EC4",
"text": "Every cross-service call records caller, callee, auth, timeout and retry",
"text": "Every cross-service call records caller, callee, auth, timeout and retry",
"pass": true,
"pass": true,
- "detail": "65 call sites; 30 with no timeout detected"
+ "detail": "68 call sites; 30 with no timeout detected"
},
},
{
{
"id": "EC5",
"id": "EC5",