openvibers/openvibe.network Commits
Roadmap baseline regenerated 2026-09-28 (roadmap WS-Q task 6): 639 tables, 2453 routes, 112 call sites, 378 discrepancies, from fresh production, GitHub and origin/main scans. 6/7 exit criteria pass; EC7 waits for the host owner's hazard review. Ownership rules for Live's four new bookkeeping tables: account_data_events (ADR-033), subject_merges (ADR-029), follow_projection_revisions (ADR-030) and lineage_unresolved. D39 (Mods) records mod principals in Network, enforced budgets, the security tests and the production lifecycle proof of 2026-09-27; only executable runtimes remain (Host Stage C).
Changes
@@@ -8,64 +8,64 @@ 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 | a7b99c7 | data/network.db |++| network | OpenVibe.Network | live | http 4000 | openvibe-network.service | /etc/openvibe/network.env | ddd87b6 | 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 | 9f7f36c | data/live.db, data/analytics.db, data/rs-companion.db |--| media | OpenVibe.Media | live | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | b7fbe65 | 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 | 168e511 | apps/<app>/data/analytics.db, apps/<app>/data/jobs.db |--| games | OpenVibe.Games | live | http 8000 | openvibe-games.service | /etc/openvibe/games.env | b207e78 | data/world.db |--| community | OpenVibe.Community | live | http 4200 | openvibe-community.service | /etc/openvibe/community.env | 19441aa | /var/lib/openvibe-community/community.db |--| sites | OpenVibe.Sites | placeholder-host | | - | - | 3802ee3 | none |--| events | OpenVibe.Events | live | http 4300 | openvibe-events.service | /etc/openvibe/events.env | eb98f8c | /var/lib/openvibe-events/events.db |--| chat | OpenVibe.Chat | live | http 4400 | openvibe-chat.service | /etc/openvibe/chat.env | 739d3a1 | /var/lib/openvibe-chat/chat.db |--| openre | OpenRe.Stream | shadow | http 4500, rtmp 1936 | openre-api.service, openre-session-coordinator.service, [email protected], [email protected] | /etc/openvibe/openre.env | b34dcd6 | /var/lib/openre/openre.db |--| billing | OpenVibe.Billing | shadow | http 4600 | openvibe-billing.service | /etc/openvibe/billing.env | 180e246 | /var/lib/openvibe-billing/billing.db |--| tips | OpenVibe.Tips | loopback | http 4610 | openvibe-tips.service | /etc/openvibe/tips.env | 1d558c5 | /var/lib/openvibe-tips/tips.db |--| vip | OpenVibe.VIP | loopback | http 4620 | openvibe-vip.service | /etc/openvibe/vip.env | 4ddf723 | /var/lib/openvibe-vip/vip.db |--| ai | OpenVibe.AI | live-internal | http 4700 | openvibe-ai.service | /etc/openvibe/ai.env | c3ee605 | /var/lib/openvibe-ai/ai.db |--| search | OpenVibe.Search | live | http 4710 | openvibe-search.service | /etc/openvibe/search.env | b00aa4c | /var/lib/openvibe-search/search.db |--| sources | OpenVibe.Sources | loopback | http 4720 | openvibe-sources.service | /etc/openvibe/sources.env | 29cd386 | /var/lib/openvibe-sources/sources.db |--| wiki | OpenVibe.Wiki | live | http 4800 | openvibe-wiki.service | /etc/openvibe/wiki.env | 38a17bd | /var/lib/openvibe-wiki/wiki.db |--| blog | OpenVibe.Blog | live | http 4810 | openvibe-blog.service | /etc/openvibe/blog.env | 79e9e15 | /var/lib/openvibe-blog/blog.db |--| news | OpenVibe.News | loopback | http 4820 | openvibe-news.service | /etc/openvibe/news.env | 0860cf2 | /var/lib/openvibe-news/news.db |--| reviews | OpenVibe.Reviews | loopback | http 4830 | openvibe-reviews.service | /etc/openvibe/reviews.env | cfc37ac | /var/lib/openvibe-reviews/reviews.db |--| deals | OpenVibe.Deals | loopback | http 4840 | openvibe-deals.service | /etc/openvibe/deals.env | 99bd438 | /var/lib/openvibe-deals/deals.db |--| coupons | OpenVibe.Coupons | loopback | http 4850 | openvibe-coupons.service | /etc/openvibe/coupons.env | 348f585 | /var/lib/openvibe-coupons/coupons.db |--| trade | OpenVibe.Trade | loopback | http 4860 | openvibe-trade.service | /etc/openvibe/trade.env | fa38288 | /var/lib/openvibe-trade/trade.db |--| codes | OpenVibe.Codes | live | http 4900 | openvibe-codes.service | /etc/openvibe/codes.env | 0bfdf70 | /var/lib/openvibe-codes/codes.db |--| host | OpenVibe.Host | loopback | http 4910 | openvibe-host.service, openvibe-backup.timer, openvibe-backup.service | /etc/openvibe/host.env | 7514789 | /var/lib/openvibe-host-api/host.db |++| media | OpenVibe.Media | live | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | 6248363 | 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 | e55469f | apps/<app>/data/analytics.db, apps/<app>/data/jobs.db |++| games | OpenVibe.Games | live | http 8000 | openvibe-games.service | /etc/openvibe/games.env | 51d8688 | data/world.db |++| community | OpenVibe.Community | live | http 4200 | openvibe-community.service | /etc/openvibe/community.env | 52d923a | /var/lib/openvibe-community/community.db |++| sites | OpenVibe.Sites | placeholder-host | | - | - | 32464ec | none |++| events | OpenVibe.Events | live | http 4300 | openvibe-events.service | /etc/openvibe/events.env | f55f7eb | /var/lib/openvibe-events/events.db |++| chat | OpenVibe.Chat | live | http 4400 | openvibe-chat.service | /etc/openvibe/chat.env | 3aab730 | /var/lib/openvibe-chat/chat.db |++| openre | OpenRe.Stream | shadow | http 4500, rtmp 1936 | openre-api.service, openre-session-coordinator.service, [email protected], [email protected] | /etc/openvibe/openre.env | cf423e3 | /var/lib/openre/openre.db |++| billing | OpenVibe.Billing | shadow | http 4600 | openvibe-billing.service | /etc/openvibe/billing.env | 80f97aa | /var/lib/openvibe-billing/billing.db |++| tips | OpenVibe.Tips | loopback | http 4610 | openvibe-tips.service | /etc/openvibe/tips.env | 1e6bfbb | /var/lib/openvibe-tips/tips.db |++| vip | OpenVibe.VIP | loopback | http 4620 | openvibe-vip.service | /etc/openvibe/vip.env | 0fbcbb5 | /var/lib/openvibe-vip/vip.db |++| ai | OpenVibe.AI | live-internal | http 4700 | openvibe-ai.service | /etc/openvibe/ai.env | 549bed0 | /var/lib/openvibe-ai/ai.db |++| search | OpenVibe.Search | live | http 4710 | openvibe-search.service | /etc/openvibe/search.env | 8ed7667 | /var/lib/openvibe-search/search.db |++| sources | OpenVibe.Sources | loopback | http 4720 | openvibe-sources.service | /etc/openvibe/sources.env | 351383e | /var/lib/openvibe-sources/sources.db |++| wiki | OpenVibe.Wiki | live | http 4800 | openvibe-wiki.service | /etc/openvibe/wiki.env | 32a26ef | /var/lib/openvibe-wiki/wiki.db |++| blog | OpenVibe.Blog | live | http 4810 | openvibe-blog.service | /etc/openvibe/blog.env | 21d537c | /var/lib/openvibe-blog/blog.db |++| news | OpenVibe.News | loopback | http 4820 | openvibe-news.service | /etc/openvibe/news.env | 8ab47a6 | /var/lib/openvibe-news/news.db |++| reviews | OpenVibe.Reviews | loopback | http 4830 | openvibe-reviews.service | /etc/openvibe/reviews.env | 1cff36b | /var/lib/openvibe-reviews/reviews.db |++| deals | OpenVibe.Deals | loopback | http 4840 | openvibe-deals.service | /etc/openvibe/deals.env | fa0582d | /var/lib/openvibe-deals/deals.db |++| coupons | OpenVibe.Coupons | loopback | http 4850 | openvibe-coupons.service | /etc/openvibe/coupons.env | 64835d2 | /var/lib/openvibe-coupons/coupons.db |++| trade | OpenVibe.Trade | loopback | http 4860 | openvibe-trade.service | /etc/openvibe/trade.env | 4658447 | /var/lib/openvibe-trade/trade.db |++| codes | OpenVibe.Codes | live | http 4900 | openvibe-codes.service | /etc/openvibe/codes.env | d78de70 | /var/lib/openvibe-codes/codes.db |++| host | OpenVibe.Host | loopback | http 4910 | openvibe-host.service, openvibe-backup.timer, openvibe-backup.service | /etc/openvibe/host.env | 2b63389 | /var/lib/openvibe-host-api/host.db || examples | OpenVibe.Examples | sample | | - | - | - | none |## Scanned repositories| Repo | HEAD | origin/main | Source files | LOC | Test files | CI | Routes | Tables | WS servers | Timers/jobs | TODO(contract) ||---|---|---|---|---|---|---|---|---|---|---|---|--| OpenVibe.Live | 8caa540 | 8caa540 | 210 | 74897 | 126 | yes | 646 | 122 | 8 | 57 | 14 |--| OpenVibe.Network | a7b99c7 | a7b99c7 | 93 | 18495 | 60 | yes | 303 | 52 | 0 | 12 | 3 |--| OpenVibe.Shared | dbf9d39 | dbf9d39 | 57 | 15053 | 34 | yes | 2 | 2 | 0 | 7 | 0 |--| OpenVibe.Media | b7fbe65 | b7fbe65 | 73 | 19538 | 56 | yes | 140 | 28 | 0 | 16 | 0 |--| OpenVibe.Tools | 168e511 | 168e511 | 173 | 30080 | 49 | yes | 124 | 6 | 0 | 18 | 0 |--| OpenVibe.Community | 19441aa | 19441aa | 63 | 11502 | 48 | yes | 180 | 33 | 0 | 9 | 0 |--| OpenVibe.Games | b207e78 | b207e78 | 122 | 23563 | 76 | yes | 29 | 12 | 2 | 4 | 0 |--| OpenVibe.Sites | 3802ee3 | 3802ee3 | 1 | 540 | 1 | yes | 0 | 0 | 0 | 0 | 0 |--| OpenVibe.Events | eb98f8c | eb98f8c | 18 | 3024 | 14 | yes | 18 | 7 | 0 | 3 | 0 |--| OpenVibe.Chat | 739d3a1 | 739d3a1 | 50 | 16372 | 35 | yes | 121 | 41 | 2 | 12 | 0 |--| OpenRe.Stream | b34dcd6 | b34dcd6 | 35 | 4753 | 19 | yes | 38 | 13 | 0 | 2 | 0 |--| OpenVibe.Billing | 180e246 | 180e246 | 37 | 5325 | 21 | yes | 56 | 19 | 0 | 3 | 0 |--| OpenVibe.Tips | 1d558c5 | 1d558c5 | 29 | 5267 | 16 | yes | 62 | 17 | 0 | 3 | 0 |--| OpenVibe.VIP | 4ddf723 | 4ddf723 | 29 | 4211 | 13 | yes | 44 | 13 | 0 | 2 | 0 |--| OpenVibe.AI | c3ee605 | c3ee605 | 38 | 6339 | 20 | yes | 52 | 18 | 0 | 4 | 0 |--| OpenVibe.Search | b00aa4c | b00aa4c | 17 | 2787 | 13 | yes | 21 | 11 | 0 | 4 | 0 |--| OpenVibe.Sources | 29cd386 | 29cd386 | 23 | 2980 | 10 | yes | 16 | 8 | 0 | 4 | 0 |--| OpenVibe.Wiki | 38a17bd | 38a17bd | 21 | 4421 | 28 | yes | 76 | 10 | 0 | 3 | 0 |--| OpenVibe.Blog | 79e9e15 | 79e9e15 | 33 | 5037 | 23 | yes | 59 | 10 | 0 | 3 | 0 |--| OpenVibe.News | 0860cf2 | 0860cf2 | 33 | 5103 | 18 | yes | 51 | 13 | 0 | 1 | 0 |--| OpenVibe.Reviews | cfc37ac | cfc37ac | 22 | 4649 | 16 | yes | 70 | 14 | 0 | 2 | 0 |--| OpenVibe.Deals | 99bd438 | 99bd438 | 35 | 4845 | 16 | yes | 58 | 15 | 0 | 1 | 0 |--| OpenVibe.Coupons | 348f585 | 348f585 | 28 | 4155 | 15 | yes | 46 | 12 | 0 | 2 | 0 |--| OpenVibe.Trade | fa38288 | fa38288 | 36 | 4431 | 15 | yes | 7 | 10 | 0 | 2 | 0 |--| OpenVibe.Codes | 0bfdf70 | 0bfdf70 | 29 | 4803 | 27 | yes | 105 | 7 | 0 | 0 | 0 |--| OpenVibe.Host | 7514789 | 7514789 | 60 | 9185 | 38 | yes | 57 | 11 | 0 | 1 | 0 |--| OpenVibe.Examples | 36901ff | 36901ff | 11 | 1604 | 16 | yes | 0 | 1 | 0 | 0 | 0 |++| OpenVibe.Live | 03f49b7 | 03f49b7 | 221 | 75126 | 158 | yes | 648 | 126 | 8 | 57 | 14 |++| OpenVibe.Network | 5a50c12 | 5a50c12 | 103 | 21114 | 77 | yes | 355 | 70 | 0 | 14 | 3 |++| OpenVibe.Shared | b5a9bd7 | b5a9bd7 | 58 | 15503 | 39 | yes | 2 | 2 | 0 | 8 | 0 |++| OpenVibe.Media | 14cac06 | 14cac06 | 79 | 20861 | 67 | yes | 144 | 34 | 0 | 16 | 0 |++| OpenVibe.Tools | 4f4ed6e | 4f4ed6e | 176 | 30522 | 61 | yes | 125 | 7 | 0 | 18 | 0 |++| OpenVibe.Community | 2da3501 | 2da3501 | 66 | 12037 | 61 | yes | 180 | 35 | 0 | 9 | 0 |++| OpenVibe.Games | eb2d008 | eb2d008 | 126 | 24425 | 82 | yes | 29 | 13 | 2 | 4 | 0 |++| OpenVibe.Sites | 304e8b1 | 304e8b1 | 1 | 555 | 2 | yes | 0 | 0 | 0 | 0 | 0 |++| OpenVibe.Events | 19919ec | 19919ec | 20 | 3357 | 22 | yes | 18 | 8 | 0 | 4 | 0 |++| OpenVibe.Chat | d87c8d3 | d87c8d3 | 53 | 16898 | 48 | yes | 121 | 42 | 2 | 12 | 0 |++| OpenRe.Stream | c77ec2a | c77ec2a | 36 | 4806 | 21 | yes | 38 | 13 | 0 | 2 | 0 |++| OpenVibe.Billing | f24684b | f24684b | 38 | 5452 | 22 | yes | 56 | 19 | 0 | 3 | 0 |++| OpenVibe.Tips | 13986b5 | 13986b5 | 30 | 5346 | 17 | yes | 62 | 17 | 0 | 3 | 0 |++| OpenVibe.VIP | 95b3e19 | 95b3e19 | 30 | 4293 | 14 | yes | 44 | 13 | 0 | 2 | 0 |++| OpenVibe.AI | 6c8b833 | 6c8b833 | 44 | 7919 | 26 | yes | 58 | 19 | 0 | 4 | 0 |++| OpenVibe.Search | e8511d8 | e8511d8 | 18 | 2868 | 14 | yes | 21 | 11 | 0 | 4 | 0 |++| OpenVibe.Sources | 1670853 | 1670853 | 24 | 3100 | 13 | yes | 16 | 8 | 0 | 4 | 0 |++| OpenVibe.Wiki | 3302540 | 3302540 | 23 | 4751 | 35 | yes | 76 | 10 | 0 | 3 | 0 |++| OpenVibe.Blog | 8a7f8eb | 8a7f8eb | 34 | 5185 | 29 | yes | 64 | 10 | 0 | 3 | 0 |++| OpenVibe.News | 97dae43 | 97dae43 | 34 | 5251 | 19 | yes | 51 | 13 | 0 | 1 | 0 |++| OpenVibe.Reviews | c87b344 | c87b344 | 23 | 4792 | 17 | yes | 70 | 14 | 0 | 2 | 0 |++| OpenVibe.Deals | 533450f | 533450f | 36 | 4980 | 17 | yes | 58 | 15 | 0 | 1 | 0 |++| OpenVibe.Coupons | b91cd79 | b91cd79 | 29 | 4289 | 16 | yes | 46 | 12 | 0 | 2 | 0 |++| OpenVibe.Trade | 273bce7 | 273bce7 | 37 | 4562 | 16 | yes | 7 | 10 | 0 | 2 | 0 |++| OpenVibe.Codes | 7d6f65a | 7d6f65a | 32 | 5091 | 34 | yes | 107 | 7 | 0 | 0 | 0 |++| OpenVibe.Host | 6d2aaaa | 6d2aaaa | 68 | 11899 | 48 | yes | 57 | 11 | 0 | 1 | 0 |++| OpenVibe.Examples | 92eb7c3 | 92eb7c3 | 11 | 1604 | 16 | yes | 0 | 1 | 0 | 0 | 0 |LOC counts non-test source files in the scanned directories only (`server/`, `apps/`, `packages/`), not frontend assets.@@@ -76,39 +76,39 @@ LOC counts non-test source files in the scanned directories only (`server/`, `ap|---|---|---|---|---|---|| AFResume | PUBLIC | - | 2026-09-26 | 23430 KB | AlexFrison.net || BreakRoomSimulator | PUBLIC | - | 2026-09-21 | 2517 KB | Simulator.Rest - The most realistic break room simulator to ever exist |--| OpenRe.Stream | PUBLIC | alpha | 2026-09-26 | 413 KB | Ingest and restream: stream definitions, keys, sessions, transport workers, outputs and output health. |--| OpenVibe.AI | PUBLIC | alpha | 2026-09-26 | 526 KB | Providers, models, routing, prompt templates, workflows, runs, citations, cache and quotas for every product. |--| OpenVibe.Billing | PUBLIC | alpha | 2026-09-26 | 591 KB | The isolated money ledger: providers, receipts, subscriptions, entitlements, refunds and payouts. |--| OpenVibe.Blog | PUBLIC | alpha | 2026-09-26 | 667 KB | The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds. |--| OpenVibe.Chat | PUBLIC | alpha | 2026-09-26 | 842 KB | Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation. |--| OpenVibe.Codes | PUBLIC | alpha | 2026-09-26 | 706 KB | The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance. |--| OpenVibe.Community | PUBLIC | - | 2026-09-26 | 1474 KB | |--| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-26 | 2738 KB | Machine-readable contracts for the whole OpenVibe network. |--| OpenVibe.Coupons | PUBLIC | alpha | 2026-09-26 | 408 KB | Coupon codes with merchant matching, restrictions, expiry and real-people validity reports. |--| OpenVibe.Deals | PUBLIC | alpha | 2026-09-26 | 445 KB | Deals submitted and voted on by the community, with source, price and freshness always shown. |--| OpenVibe.Events | PUBLIC | alpha | 2026-09-26 | 388 KB | Durable events, subscriptions, delivery, retry, dead letters and replay for the network. |--| OpenVibe.Examples | PUBLIC | alpha | 2026-09-26 | 320 KB | Executable public integration examples, tested in CI against the platform. |++| OpenRe.Stream | PUBLIC | alpha | 2026-09-28 | 433 KB | Ingest and restream: stream definitions, keys, sessions, transport workers, outputs and output health. |++| OpenVibe.AI | PUBLIC | alpha | 2026-09-28 | 1033 KB | Providers, models, routing, prompt templates, workflows, runs, citations, cache and quotas for every product. |++| OpenVibe.Billing | PUBLIC | alpha | 2026-09-28 | 597 KB | The isolated money ledger: providers, receipts, subscriptions, entitlements, refunds and payouts. |++| OpenVibe.Blog | PUBLIC | alpha | 2026-09-28 | 722 KB | The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds. |++| OpenVibe.Chat | PUBLIC | alpha | 2026-09-28 | 977 KB | Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation. |++| OpenVibe.Codes | PUBLIC | alpha | 2026-09-28 | 814 KB | The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance. |++| OpenVibe.Community | PUBLIC | alpha | 2026-09-28 | 1778 KB | |++| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-28 | 3315 KB | Machine-readable contracts for the whole OpenVibe network. |++| OpenVibe.Coupons | PUBLIC | alpha | 2026-09-28 | 462 KB | Coupon codes with merchant matching, restrictions, expiry and real-people validity reports. |++| OpenVibe.Deals | PUBLIC | alpha | 2026-09-28 | 493 KB | Deals submitted and voted on by the community, with source, price and freshness always shown. |++| OpenVibe.Events | PUBLIC | alpha | 2026-09-28 | 550 KB | Durable events, subscriptions, delivery, retry, dead letters and replay for the network. |++| OpenVibe.Examples | PUBLIC | alpha | 2026-09-28 | 320 KB | Executable public integration examples, tested in CI against the platform. || OpenVibe.Extensions | PUBLIC | alpha | 2026-09-25 | 58 KB | First-party client surfaces for the network: the browser helper built on Coupons' public API with scoped, revocable credentials; later the kiosk/hardware companions and any desktop client (ADR-023). |--| OpenVibe.Games | PUBLIC | - | 2026-09-26 | 5417 KB | |--| OpenVibe.Host | PUBLIC | alpha | 2026-09-26 | 950 KB | The network's deployment/control plane first; then isolated hosting for community sites, bots and mods. |--| OpenVibe.Live | PUBLIC | - | 2026-09-26 | 8126 KB | |--| OpenVibe.Media | PUBLIC | - | 2026-09-26 | 1696 KB | |--| OpenVibe.Network | PUBLIC | - | 2026-09-26 | 2413 KB | |--| OpenVibe.News | PUBLIC | alpha | 2026-09-26 | 447 KB | Source-backed stories: clustered coverage, cited summaries, perspectives and timelines. |--| OpenVibe.Publishing | PUBLIC | alpha | 2026-09-26 | 247 KB | Shared publishing packages (drafts, revisions, citations, SEO gate, feeds, structured data) for Wiki, Blog, News, Reviews, Deals, Coupons and Trade. Packages only, no authority. |++| OpenVibe.Games | PUBLIC | stable | 2026-09-28 | 5596 KB | |++| OpenVibe.Host | PUBLIC | alpha | 2026-09-28 | 1384 KB | The network's deployment/control plane first; then isolated hosting for community sites, bots and mods. |++| OpenVibe.Live | PUBLIC | stable | 2026-09-28 | 9109 KB | |++| OpenVibe.Media | PUBLIC | beta | 2026-09-28 | 2022 KB | |++| OpenVibe.Network | PUBLIC | stable | 2026-09-28 | 3416 KB | |++| OpenVibe.News | PUBLIC | alpha | 2026-09-28 | 466 KB | Source-backed stories: clustered coverage, cited summaries, perspectives and timelines. |++| OpenVibe.Publishing | PUBLIC | alpha | 2026-09-28 | 248 KB | Shared publishing packages (drafts, revisions, citations, SEO gate, feeds, structured data) for Wiki, Blog, News, Reviews, Deals, Coupons and Trade. Packages only, no authority. || OpenVibe.Realtime | PUBLIC | closed (no code) | 2026-09-25 | 16 KB | Archived: browser realtime runs in OpenVibe.Events (/realtime/stream). Decision record for ADR-005. |--| OpenVibe.Reviews | PUBLIC | alpha | 2026-09-26 | 503 KB | Review signals gathered across sources with provenance, entity resolution and honest aggregates. |--| OpenVibe.SDK | PUBLIC | alpha | 2026-09-25 | 657 KB | Supported browser and server clients for the OpenVibe platform. |--| OpenVibe.Search | PUBLIC | alpha | 2026-09-26 | 278 KB | Permission-aware, event-fed search index for the network: canonical index documents, ACL-filtered queries, deletion propagation. |--| OpenVibe.Shared | PUBLIC | alpha | 2026-09-26 | 843 KB | Versioned UI, chrome, SEO, legal and release-client packages every OpenVibe site renders. |--| OpenVibe.Sites | PUBLIC | - | 2026-09-26 | 741 KB | Static front pages for OpenVibe domains that are not full apps yet |--| OpenVibe.Sources | PUBLIC | alpha | 2026-09-26 | 299 KB | Source registry and ingestion workers for the network: provenance, terms, rate limits, explicit failure states. |--| OpenVibe.Tips | PUBLIC | alpha | 2026-09-26 | 496 KB | Creator support: tips, goals, paid messages, TTS and media requests, overlays. |--| OpenVibe.Tools | PUBLIC | - | 2026-09-26 | 3267 KB | |--| OpenVibe.Trade | PUBLIC | alpha | 2026-09-26 | 399 KB | Informational watchlists, sourced market context and alerts. No custody, no order execution. |--| OpenVibe.VIP | PUBLIC | alpha | 2026-09-26 | 440 KB | Memberships: plans, perks and benefits recognised across every OpenVibe site. |--| OpenVibe.Wiki | PUBLIC | alpha | 2026-09-26 | 598 KB | Wiki spaces with page trees, revisions, citations, media and discussion — editable together, source-backed. |++| OpenVibe.Reviews | PUBLIC | alpha | 2026-09-28 | 501 KB | Review signals gathered across sources with provenance, entity resolution and honest aggregates. |++| OpenVibe.SDK | PUBLIC | alpha | 2026-09-28 | 706 KB | Supported browser and server clients for the OpenVibe platform. |++| OpenVibe.Search | PUBLIC | alpha | 2026-09-28 | 318 KB | Permission-aware, event-fed search index for the network: canonical index documents, ACL-filtered queries, deletion propagation. |++| OpenVibe.Shared | PUBLIC | alpha | 2026-09-28 | 1084 KB | Versioned UI, chrome, SEO, legal and release-client packages every OpenVibe site renders. |++| OpenVibe.Sites | PUBLIC | stable | 2026-09-28 | 967 KB | Static front pages for OpenVibe domains that are not full apps yet |++| OpenVibe.Sources | PUBLIC | alpha | 2026-09-28 | 309 KB | Source registry and ingestion workers for the network: provenance, terms, rate limits, explicit failure states. |++| OpenVibe.Tips | PUBLIC | alpha | 2026-09-28 | 563 KB | Creator support: tips, goals, paid messages, TTS and media requests, overlays. |++| OpenVibe.Tools | PUBLIC | stable | 2026-09-28 | 2632 KB | |++| OpenVibe.Trade | PUBLIC | alpha | 2026-09-28 | 418 KB | Informational watchlists, sourced market context and alerts. No custody, no order execution. |++| OpenVibe.VIP | PUBLIC | alpha | 2026-09-28 | 510 KB | Memberships: plans, perks and benefits recognised across every OpenVibe site. |++| OpenVibe.Wiki | PUBLIC | alpha | 2026-09-28 | 754 KB | Wiki spaces with page trees, revisions, citations, media and discussion — editable together, source-backed. || powerchat-devapp-demo | PUBLIC | - | 2026-09-23 | 200 KB | || Source.OpenVibe.Games | PUBLIC | - | 2026-09-21 | 20385 KB | OpenVibe: Source Game |--Collected 2026-09-26 via `gh repo list OpenVibers`.++Collected 2026-09-28 via `gh repo list OpenVibers`.@@@ -11,42 +11,45 @@ Deliverable 2: every table declared in code or present in production, with curre| /opt/openvibe.blog/data/blog.db | 401 KB | 20 || /opt/openvibe.community/data/community.db | 258 KB | 21 || /opt/openvibe.games/data/legacy-import/world-before-20260923T184930Z.db | 193 KB | 13 |--| /opt/openvibe.games/data/world.db | 508 KB | 14 |--| /opt/openvibe.live/shared/data/analytics.db | 518.0 MB | 6 |++| /opt/openvibe.games/data/world.db | 610 KB | 15 |++| /opt/openvibe.live/shared/data/analytics.db | 525.4 MB | 6 || /opt/openvibe.live/shared/data/backups/analytics-pre-adr021-2026-09-23.db | 1.76 GB | 6 || /opt/openvibe.live/shared/data/backups/live-20260926-072748.db | 284.0 MB | 161 || /opt/openvibe.live/shared/data/backups/live-20260926-095352.db | 284.0 MB | 161 || /opt/openvibe.live/shared/data/backups/live-pre-643a2e6.db | 264.7 MB | 145 |++| /opt/openvibe.live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db | 284.7 MB | 162 || /opt/openvibe.live/shared/data/hobo.db | 0 B | 0 || /opt/openvibe.live/shared/data/live-before-rs-slots-20260924T0153Z.db | 279.2 MB | 151 |--| /opt/openvibe.live/shared/data/live.db | 284.1 MB | 161 |++| /opt/openvibe.live/shared/data/live.db | 284.7 MB | 162 || /opt/openvibe.live/shared/data/openvibe.db | 0 B | 0 || /opt/openvibe.live/shared/data/rs-companion.db | 8.6 MB | 33 || /opt/openvibe.media/data/backups/owner-subject-20260923.media.db | 9.5 MB | 23 |--| /opt/openvibe.media/data/media.db | 11.5 MB | 31 |++| /opt/openvibe.media/data/media.db | 11.7 MB | 36 || /opt/openvibe.media/data/reports/h15-repair-applied-20260925.media.db | 11.3 MB | 27 |++| /opt/openvibe.network/data/backups/network-pre-creator-analytics-20260926.db | 292.4 MB | 66 |++| /opt/openvibe.network/data/backups/network-pre-follows-20260926.db | 292.1 MB | 63 || /opt/openvibe.network/data/network-pre-refresh-hash-2026-09-24.db | 279.1 MB | 52 || /opt/openvibe.network/data/network-pre-secrets-2026-09-24.db | 279.1 MB | 52 |--| /opt/openvibe.network/data/network.db | 290.3 MB | 57 |++| /opt/openvibe.network/data/network.db | 302.4 MB | 75 || /opt/openvibe.tips/data/tips.db | 4 KB | 15 |--| /opt/openvibe.tools/apps/audio/data/analytics.db | 36.6 MB | 6 |++| /opt/openvibe.tools/apps/audio/data/analytics.db | 36.7 MB | 6 || /opt/openvibe.tools/apps/audio/data/guard.db | 37 KB | 3 |--| /opt/openvibe.tools/apps/audio/data/jobs.db | 74 KB | 4 |++| /opt/openvibe.tools/apps/audio/data/jobs.db | 82 KB | 5 || /opt/openvibe.tools/apps/docs/data/analytics.db | 1.1 MB | 6 || /opt/openvibe.tools/apps/docs/data/guard.db | 37 KB | 3 |--| /opt/openvibe.tools/apps/docs/data/jobs.db | 66 KB | 4 |--| /opt/openvibe.tools/apps/food/data/analytics.db | 332 KB | 6 |++| /opt/openvibe.tools/apps/docs/data/jobs.db | 82 KB | 5 |++| /opt/openvibe.tools/apps/food/data/analytics.db | 344 KB | 6 || /opt/openvibe.tools/apps/food/data/guard.db | 37 KB | 3 || /opt/openvibe.tools/apps/gateway/data/guard.db | 37 KB | 3 || /opt/openvibe.tools/apps/gateway/data/token-revocations.db | 12 KB | 1 |--| /opt/openvibe.tools/apps/img/data/analytics.db | 4.7 MB | 6 |++| /opt/openvibe.tools/apps/img/data/analytics.db | 4.8 MB | 6 || /opt/openvibe.tools/apps/img/data/guard.db | 37 KB | 3 |--| /opt/openvibe.tools/apps/img/data/jobs.db | 246 KB | 4 |--| /opt/openvibe.tools/apps/maps/data/analytics.db | 389 KB | 6 |++| /opt/openvibe.tools/apps/img/data/jobs.db | 328 KB | 5 |++| /opt/openvibe.tools/apps/maps/data/analytics.db | 401 KB | 6 || /opt/openvibe.tools/apps/maps/data/guard.db | 37 KB | 3 |--| /opt/openvibe.tools/apps/text/data/analytics.db | 5.8 MB | 6 |++| /opt/openvibe.tools/apps/text/data/analytics.db | 5.9 MB | 6 || /opt/openvibe.tools/apps/text/data/guard.db | 37 KB | 3 |--| /opt/openvibe.tools/apps/yt/data/analytics.db | 631 KB | 6 |++| /opt/openvibe.tools/apps/yt/data/analytics.db | 647 KB | 6 || /opt/openvibe.tools/apps/yt/data/guard.db | 37 KB | 3 || /opt/openvibe.tools/backups/analytics-2026-09-23/audio.analytics.db | 60.3 MB | 6 || /opt/openvibe.tools/backups/analytics-2026-09-23/docs.analytics.db | 1.7 MB | 6 |@@@ -56,53 +59,54 @@ Deliverable 2: every table declared in code or present in production, with curre| /opt/openvibe.tools/backups/analytics-2026-09-23/text.analytics.db | 9.5 MB | 6 || /opt/openvibe.tools/backups/analytics-2026-09-23/yt.analytics.db | 975 KB | 6 || /var/lib/openre/openre.db | 209 KB | 14 |--| /var/lib/openvibe-ai/ai.db | 62.6 MB | 19 |--| /var/lib/openvibe-billing/billing.db | 745 KB | 19 |++| /var/lib/openvibe-ai/ai.db | 115.8 MB | 20 |++| /var/lib/openvibe-billing/billing.db | 831 KB | 19 || /var/lib/openvibe-billing/live-snapshot-202609230121.db | 279.2 MB | 146 |--| /var/lib/openvibe-blog/blog.db | 1.5 MB | 24 |--| /var/lib/openvibe-chat/chat.db | 25.3 MB | 41 |++| /var/lib/openvibe-blog/blog.db | 1.9 MB | 24 |++| /var/lib/openvibe-chat/chat.db | 25.3 MB | 42 || /var/lib/openvibe-chat/live-snap-a.db | 279.2 MB | 147 || /var/lib/openvibe-chat/live-snap-b.db | 279.2 MB | 148 || /var/lib/openvibe-chat/live-snapshot-0159.db | 279.2 MB | 147 || /var/lib/openvibe-chat/rehearsal.db | 360 KB | 30 |--| /var/lib/openvibe-codes/codes.db | 102 KB | 7 |--| /var/lib/openvibe-community/community.db | 4.4 MB | 34 |++| /var/lib/openvibe-codes/codes.db | 111 KB | 7 |++| /var/lib/openvibe-community/community.db | 5.3 MB | 36 || /var/lib/openvibe-community/community.pre-c24-20260925T185117Z.db | 2.2 MB | 29 || /var/lib/openvibe-community/community.pre-c24b-20260925T185400Z.db | 2.2 MB | 29 || /var/lib/openvibe-community/community.pre-c24c-20260925T185425Z.db | 2.2 MB | 29 || /var/lib/openvibe-community/community.pre-live-comments-20260923T191345Z.db | 2.0 MB | 20 || /var/lib/openvibe-coupons/coupons.db | 197 KB | 14 || /var/lib/openvibe-deals/deals.db | 266 KB | 19 |--| /var/lib/openvibe-events/events.db | 17.3 MB | 7 |++| /var/lib/openvibe-events/events.db | 23.5 MB | 8 || /var/lib/openvibe-host-api/host.db | 160 KB | 12 |--| /var/lib/openvibe-news/news.db | 446 KB | 23 |++| /var/lib/openvibe-news/news.db | 508 KB | 23 || /var/lib/openvibe-reviews/reviews.db | 311 KB | 23 |--| /var/lib/openvibe-search/search.db | 12.0 MB | 21 |++| /var/lib/openvibe-search/search.db | 13.3 MB | 21 || /var/lib/openvibe-sources/sources.db | 106 KB | 8 || /var/lib/openvibe-tips/tips.db | 422 KB | 19 || /var/lib/openvibe-trade/trade.db | 229 KB | 17 || /var/lib/openvibe-vip/vip.db | 344 KB | 15 |--| /var/lib/openvibe-wiki/wiki.db | 401 KB | 22 |++| /var/lib/openvibe-wiki/wiki.db | 410 KB | 22 |--## OpenVibe.Live (122)++## OpenVibe.Live (126)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|--| ai_chatbot_configs | server/db/database.js:1807 | no | OpenVibe.AI | extract | W13 |--| ai_timeline_cache | server/db/database.js:1326 | no | OpenVibe.AI | extract | W13 |--| ai_usage | server/db/database.js:1284 | no | OpenVibe.AI | extract | W13 |--| ai_viewer_log | server/db/database.js:1891 | no | OpenVibe.AI | extract | W13 |--| ai_viewer_threads | server/db/database.js:1877 | no | OpenVibe.AI | extract | W13 |++| account_data_events | server/auth/account-data.js:51 | no | OpenVibe.Live | keep | - |++| ai_chatbot_configs | server/db/database.js:1802 | no | OpenVibe.AI | extract | W13 |++| ai_timeline_cache | server/db/database.js:1321 | no | OpenVibe.AI | extract | W13 |++| ai_usage | server/db/database.js:1279 | no | OpenVibe.AI | extract | W13 |++| ai_viewer_log | server/db/database.js:1888 | no | OpenVibe.AI | extract | W13 |++| ai_viewer_threads | server/db/database.js:1874 | no | OpenVibe.AI | extract | W13 || anon_ip_mappings | server/db/database.js:964 | no | OpenVibe.Network (policy) | extract | W1 || api_keys | server/db/schema.sql:391 | no | OpenVibe.Network (principals) / OpenVibe.Codes | extract | W1/W20 || api_tokens | server/db/schema.sql:404 | no | OpenVibe.Network (principals) / OpenVibe.Codes | extract | W1/W20 |--| app_state | server/db/database.js:1196 | no | OpenVibe.Live | keep | - |--| approved_ips | server/db/database.js:2079 | no | OpenVibe.Network (policy) | extract | W1 |++| app_state | server/db/database.js:1191 | no | OpenVibe.Live | keep | - |++| approved_ips | server/db/database.js:2076 | no | OpenVibe.Network (policy) | extract | W1 || arena_beef_hype | server/arena/beef.js:58 | no | OpenVibe.Live | keep | - || arena_beef_sides | server/arena/beef.js:68 | no | OpenVibe.Live | keep | - || arena_beefs | server/arena/beef.js:34 | no | OpenVibe.Live | keep | - || arena_mic_moments | server/arena/mic.js:54 | no | OpenVibe.Live | keep | - |--| arena_profiles | server/arena/arena-service.js:83 | no | OpenVibe.Live | keep | - |++| arena_profiles | server/arena/arena-service.js:82 | no | OpenVibe.Live | keep | - || arena_trash_levels | server/arena/mic.js:31 | no | OpenVibe.Live | keep | - || arena_xp_log | server/arena/mic.js:45 | no | OpenVibe.Live | keep | - || bans | server/db/schema.sql:418 | no | OpenVibe.Network (policy) | extract | W1 |@@@ -110,22 +114,22 @@ Deliverable 2: every table declared in code or present in production, with curre| camera_presets | server/db/schema.sql:359 | no | OpenRe.Stream | extract | W7 || camera_profiles | server/db/schema.sql:339 | no | OpenRe.Stream | extract | W7 || cameras | server/db/schema.sql:133 | no | OpenRe.Stream | extract | W7 |--| channel_ai_bots | server/db/database.js:1832 | no | OpenVibe.AI | extract | W13 |--| channel_ai_config | server/db/database.js:1856 | no | OpenVibe.AI | extract | W13 |--| channel_moderation_settings | server/db/database.js:1640, server/db/schema.sql:514 | no | OpenVibe.Chat | extract | W6 (remainder) |--| channel_moderators | server/db/database.js:1623, server/db/schema.sql:499 | no | OpenVibe.Chat | extract | W6 (remainder) |++| channel_ai_bots | server/db/database.js:1827 | no | OpenVibe.AI | extract | W13 |++| channel_ai_config | server/db/database.js:1851 | no | OpenVibe.AI | extract | W13 |++| channel_moderation_settings | server/db/database.js:1635, server/db/schema.sql:514 | no | OpenVibe.Chat | extract | W6 (remainder) |++| channel_moderators | server/db/database.js:1618, server/db/schema.sql:499 | no | OpenVibe.Chat | extract | W6 (remainder) || channel_points | server/db/database.js:770 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) || channel_points_log | server/db/database.js:780 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |--| channel_sounds | server/db/database.js:1745, server/db/schema.sql:626 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |--| channel_sounds_new | server/db/database.js:1769 | no | OpenVibe.Chat | extract | W6 (remainder) |++| channel_sounds | server/db/database.js:1740, server/db/schema.sql:626 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |++| channel_sounds_new | server/db/database.js:1764 | no | OpenVibe.Chat | extract | W6 (remainder) || channels | server/db/schema.sql:26 | no | OpenVibe.Live | keep | - |--| chat_ai_summaries | server/db/database.js:1338 | no | OpenVibe.Chat | extract | W6 (remainder) |++| chat_ai_summaries | server/db/database.js:1333 | no | OpenVibe.Chat | extract | W6 (remainder) || chat_bridge_outbox | server/chat/chat-remote.js:94 | no | OpenVibe.Live | keep | W6 (compat) || chat_dual_read_stats | server/chat/chat-tables-sync.js:53 | no | OpenVibe.Chat | staged | C-04 || chat_messages | server/db/schema.sql:148 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) || chat_messages_new | server/db/database.js:422 | no | OpenVibe.Chat | extract | W6 (remainder) || chat_staged_outbox | server/chat/chat-tables-sync.js:46 | no | OpenVibe.Chat | staged | C-04 |--| chat_timeline_events | server/db/database.js:1358 | no | OpenVibe.Chat | extract | W6 (remainder) |++| chat_timeline_events | server/db/database.js:1353 | no | OpenVibe.Chat | extract | W6 (remainder) || clip_ai_state | server/db/database.js:275 | no | OpenVibe.AI | extract | W13 || clips | server/db/schema.sql:307 | no | OpenVibe.Media | frozen-legacy | W4 || coin_redemptions | server/db/schema.sql:690 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |@@@ -136,39 +140,41 @@ Deliverable 2: every table declared in code or present in production, with curre| config_keys | OpenVibe.Shared/config.js:252 | no | OpenVibe.Live | keep | - || config_snapshots | OpenVibe.Shared/config.js:231 | no | OpenVibe.Live | keep | - || content_views | server/db/schema.sql:328 | no | OpenVibe.Live | keep | - |--| control_config_buttons | server/db/database.js:2303 | no | OpenRe.Stream | extract | W7 |--| control_configs | server/db/database.js:2289 | no | OpenRe.Stream | extract | W7 |--| control_whitelist | server/db/database.js:2274 | no | OpenRe.Stream | extract | W7 |++| control_config_buttons | server/db/database.js:2300 | no | OpenRe.Stream | extract | W7 |++| control_configs | server/db/database.js:2286 | no | OpenRe.Stream | extract | W7 |++| control_whitelist | server/db/database.js:2271 | no | OpenRe.Stream | extract | W7 || dm_blocks | server/chat/dm.js:57 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) || dm_conversations | server/chat/dm.js:21 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) || dm_messages | server/chat/dm.js:42 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) || dm_participants | server/chat/dm.js:31 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) || donation_goals | server/db/schema.sql:264 | no | OpenVibe.Tips | extract | W9 |--| easter_egg_solves | server/db/database.js:1370 | no | OpenVibe.AI | extract | W13 |++| easter_egg_solves | server/db/database.js:1365 | no | OpenVibe.AI | extract | W13 || emotes | server/db/schema.sql:604 | no | OpenVibe.Chat | extract | W6 (remainder) |--| emotes_new | server/db/database.js:1713 | no | OpenVibe.Chat | extract | W6 (remainder) |++| emotes_new | server/db/database.js:1708 | no | OpenVibe.Chat | extract | W6 (remainder) |++| follow_projection_revisions | server/social/network-follows.js:63 | no | OpenVibe.Live | projection | - || follows | server/db/schema.sql:221 | no | OpenVibe.Network | extract | W1 |--| hidden_relay_users | server/db/database.js:2116 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |--| ip_log | server/db/database.js:2055 | no | OpenVibe.Network (policy) | extract | W1 |++| hidden_relay_users | server/db/database.js:2113 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |++| ip_log | server/db/database.js:2052 | no | OpenVibe.Network (policy) | extract | W1 || kick_channel_cache | server/db/database.js:797 | no | OpenRe.Stream | extract | W7 |++| lineage_unresolved | server/lineage/unresolved.js:26 | no | OpenVibe.Live | keep | - || linked_accounts | server/db/database.js:387 | no | OpenVibe.Network | extract | W1 |--| managed_streams | server/db/database.js:2417, server/db/schema.sql:78 | no | OpenRe.Stream | extract | W7 |++| managed_streams | server/db/database.js:2414, server/db/schema.sql:78 | no | OpenRe.Stream | extract | W7 || media_request_settings | server/db/database.js:892, server/db/schema.sql:723 | no | OpenVibe.Chat | extract | W6 (remainder) || media_requests | server/db/database.js:906, server/db/schema.sql:740 | no | OpenVibe.Chat | extract | W6 (remainder) |--| moderation_actions | server/db/database.js:1924 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |++| moderation_actions | server/db/database.js:1921 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) || module_summary_pushes | server/auth/module-summaries.js:34 | no | OpenVibe.Live | keep | - || news_settings | server/news/news-service.js:47 | no | OpenVibe.Live | keep | - || opencoin_admin_grants | server/monetization/opencoins.js:330 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) || openre_sessions | server/openre/schema.js:21 | no | OpenVibe.Live | keep | W7 |--| paste_comments | server/db/database.js:2012 | no | OpenVibe.Community | frozen-legacy | W5 |--| paste_likes | server/db/database.js:1980 | no | OpenVibe.Community | frozen-legacy | W5 |--| pastes | server/db/database.js:1943 | no | OpenVibe.Community | frozen-legacy | W5 |--| payment_orders | server/db/database.js:1590 | no | OpenVibe.Billing | extract | W8 (after ADR-012) |--| pending_ip_messages | server/db/database.js:2096 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |++| paste_comments | server/db/database.js:2009 | no | OpenVibe.Community | frozen-legacy | W5 |++| paste_likes | server/db/database.js:1977 | no | OpenVibe.Community | frozen-legacy | W5 |++| pastes | server/db/database.js:1940 | no | OpenVibe.Community | frozen-legacy | W5 |++| payment_orders | server/db/database.js:1585 | no | OpenVibe.Billing | extract | W8 (after ADR-012) |++| pending_ip_messages | server/db/database.js:2093 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) || platform_connections | server/db/database.js:719 | no | OpenRe.Stream | extract | W7 || powerchat_connections | server/db/database.js:741 | no | OpenVibe.Live | keep | W3 (deliveries -> Events) || powerchat_webhook_deliveries | server/db/database.js:758 | no | OpenVibe.Live | keep | W3 (deliveries -> Events) |--| relay_users | server/db/database.js:1495 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |++| relay_users | server/db/database.js:1490 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) || restream_destinations | server/db/database.js:701 | no | OpenRe.Stream | extract | W7 || robotstreamer_integrations | server/db/database.js:615, server/db/schema.sql:58 | no | OpenRe.Stream | extract | W7 || robotstreamer_integrations_new | server/db/database.js:666 | no | OpenRe.Stream | extract | W7 |@@@ -178,21 +184,22 @@ Deliverable 2: every table declared in code or present in production, with curre| site_settings | server/db/database.js:356, server/db/schema.sql:557 | no | OpenVibe.Live | keep | - || stream_analytics | server/db/schema.sql:811 | no | OpenVibe.Live | keep | - || stream_controls | server/db/schema.sql:372 | no | OpenRe.Stream | extract | W7 |--| stream_controls_new | server/db/database.js:2382 | no | OpenRe.Stream | extract | W7 |--| stream_first_chats | server/db/database.js:2044 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |--| stream_memories | server/db/database.js:1210 | no | OpenVibe.AI | extract | W13 |++| stream_controls_new | server/db/database.js:2379 | no | OpenRe.Stream | extract | W7 |++| stream_first_chats | server/db/database.js:2041 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |++| stream_memories | server/db/database.js:1205 | no | OpenVibe.AI | extract | W13 || stream_recaps | server/recap/recap.js:27 | no | OpenVibe.AI | extract | W13 |--| stream_timeline_events | server/db/database.js:1259 | no | OpenVibe.Live | keep | - |--| streamer_overviews | server/db/database.js:1304 | no | OpenVibe.AI | extract | W13 |++| stream_timeline_events | server/db/database.js:1254 | no | OpenVibe.Live | keep | - |++| streamer_overviews | server/db/database.js:1299 | no | OpenVibe.AI | extract | W13 || streams | server/db/schema.sql:103 | no | OpenVibe.Live | keep | - |++| subject_merges | server/auth/subject-merge.js:25 | no | OpenVibe.Live | keep | - || subject_projection | server/auth/subject-projection.js:52 | no | OpenVibe.Network | mirror | WS-B task 2 || subscriptions | server/db/schema.sql:234 | no | OpenVibe.Billing + OpenVibe.VIP | extract | W8/W10 || themes | server/db/schema.sql:446 | no | OpenVibe.Network | extract | W1 || tips_deliveries | server/tips/delivery-routes.js:39 | no | OpenVibe.Live | keep | W9 || token_revocations | server/auth/revocations.js:19 | no | OpenVibe.Network | mirror | W1 || transactions | server/db/schema.sql:247 | no | OpenVibe.Billing | extract | W8 (after ADR-012) |--| translations | server/db/database.js:513, server/i18n/translate.js:147 | no | OpenVibe.AI | extract | W13 |--| tts_voice_overrides | server/db/database.js:1382 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |++| translations | server/db/database.js:513, server/i18n/translate.js:148 | no | OpenVibe.AI | extract | W13 |++| tts_voice_overrides | server/db/database.js:1377 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) || user_cosmetics | server/db/schema.sql:775, server/monetization/cosmetics.js:111 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) || user_equipped | server/db/schema.sql:787, server/monetization/cosmetics.js:120 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) || user_equipped_tag | server/chat/tags.js:61 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |@@@ -202,19 +209,25 @@ Deliverable 2: every table declared in code or present in production, with curre| username_history | server/auth/usernames.js:24 | no | OpenVibe.Network | mirror | WS-B || users | server/db/schema.sql:5 | no | OpenVibe.Network | extract | W1 || verification_keys | server/db/database.js:367, server/db/schema.sql:568 | no | OpenVibe.Network | extract | W1 |--| vibe_coding_events | server/db/database.js:2674, server/db/schema.sql:198 | no | OpenVibe.Codes | extract | W20 |--| vibe_coding_sessions | server/db/database.js:2639, server/db/schema.sql:170 | no | OpenVibe.Codes | extract | W20 |--| viewer_samples | server/db/database.js:3861 | no | OpenVibe.Live | keep | - |++| vibe_coding_events | server/db/database.js:2671, server/db/schema.sql:198 | no | OpenVibe.Codes | extract | W20 |++| vibe_coding_sessions | server/db/database.js:2636, server/db/schema.sql:170 | no | OpenVibe.Codes | extract | W20 |++| viewer_samples | server/db/database.js:3868 | no | OpenVibe.Live | keep | - || viewer_snapshots | server/db/schema.sql:800 | no | OpenVibe.Live | keep | - || vod_ai_state | server/db/database.js:266 | no | OpenVibe.AI | extract | W13 || vods | server/db/schema.sql:280 | no | OpenVibe.Media | frozen-legacy | W4 || vpn_approvals | server/db/schema.sql:434 | no | OpenVibe.Network (policy) | extract | W1 || watch_time | server/db/schema.sql:707 | no | OpenVibe.Live | keep | - |--## OpenVibe.Network (60)++## OpenVibe.Network (78)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|++| account_deletion_confirmations | server/identity/account-data.js:94 | network.db | OpenVibe.Network | keep | W1 (module split) |++| account_deletions | server/identity/account-data.js:80 | network.db | OpenVibe.Network | keep | W1 (module split) |++| account_export_parts | server/identity/account-data.js:71 | network.db | OpenVibe.Network | keep | W1 (module split) |++| account_exports | server/identity/account-data.js:56 | network.db | OpenVibe.Network | keep | W1 (module split) |++| account_merge_intents | server/identity/account-merge.js:71 | network.db | OpenVibe.Network | keep | W1 (module split) |++| account_merges | server/identity/account-merge.js:56 | network.db | OpenVibe.Network | keep | W1 (module split) || admin_rate_limits | server/auth/admin-limits.js:24 | no | OpenVibe.Network | keep | W1 (module split) || analytics_daily | (prod only) | network.db | OpenVibe.Network | keep | Track O / ADR-021 || analytics_day_salts | (prod only) | network.db | OpenVibe.Network | keep | Track O / ADR-021 |@@@ -228,6 +241,7 @@ Deliverable 2: every table declared in code or present in production, with curre| coin_transactions | server/db/database.js:327 | network.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) || config_keys | OpenVibe.Shared/config.js:252 | no | OpenVibe.Network | keep | - || config_snapshots | OpenVibe.Shared/config.js:231 | no | OpenVibe.Network | keep | - |++| creator_streams | server/analytics/creators.js:27 | network.db | OpenVibe.Network | keep | W1 (module split) || dev_apps | server/developer/store.js:66 | network.db | OpenVibe.Network | keep | W1 (module split) || dev_audit | server/developer/store.js:124 | network.db | OpenVibe.Network | keep | W1 (module split) || dev_auth_codes | server/developer/store.js:114 | network.db | OpenVibe.Network | keep | W1 (module split) |@@@ -236,14 +250,20 @@ Deliverable 2: every table declared in code or present in production, with curre| dev_project_members | server/developer/store.js:57 | network.db | OpenVibe.Network | keep | W1 (module split) || dev_projects | server/developer/store.js:45 | network.db | OpenVibe.Network | keep | W1 (module split) || dev_quotas | server/developer/store.js:104 | network.db | OpenVibe.Network | keep | W1 (module split) |++| dev_usage_daily | server/developer/usage.js:69 | network.db | OpenVibe.Network | keep | W1 (module split) |++| dev_usage_errors | server/developer/usage.js:84 | network.db | OpenVibe.Network | keep | W1 (module split) |++| dev_usage_windows | server/developer/usage.js:50 | network.db | OpenVibe.Network | keep | W1 (module split) || email_delivery_log | server/db/database.js:222 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) || email_verification_tokens | server/db/database.js:438 | network.db | OpenVibe.Network | keep | W1 (module split) |++| follow_import_holds | server/identity/follows.js:57 | network.db | OpenVibe.Network | keep | W1 (module split) || follows | server/db/database.js:306 | network.db | OpenVibe.Network | keep | W1 (module split) || frame_cache | server/frame/service.js:68 | network.db | OpenVibe.Network | keep | W1 (module split) || frame_hits | server/frame/service.js:70 | network.db | OpenVibe.Network | keep | W1 (module split) || identity_legacy_map | server/identity/subjects.js:25 | network.db | OpenVibe.Network | keep | W1 (module split) || ip_log | server/db/database.js:145 | network.db | OpenVibe.Network | keep | W1 (module split) || linked_accounts | server/db/database.js:124 | network.db | OpenVibe.Network | keep | W1 (module split) |++| mod_principal_grants | server/identity/mod-principals.js:49 | network.db | OpenVibe.Network | keep | W1 (module split) |++| mod_principals | server/identity/mod-principals.js:33 | network.db | OpenVibe.Network | keep | W1 (module split) || moderation_audit | server/admin/moderation-audit.js:36 | network.db | OpenVibe.Network | keep | W1 (module split) || network_event_inbox | (prod only) | network.db | OpenVibe.Network | keep | W3 || network_event_outbox | (prod only) | network.db | OpenVibe.Network | keep | W3 |@@@ -252,18 +272,23 @@ Deliverable 2: every table declared in code or present in production, with curre| oauth_clients | server/db/database.js:54 | network.db | OpenVibe.Network | keep | W1 (module split) || oauth_codes | server/db/database.js:64 | network.db | OpenVibe.Network | keep | W1 (module split) || oauth_tokens | server/db/database.js:78 | network.db | OpenVibe.Network | keep | W1 (module split) |++| operator_alerts | server/operator/alerts.js:25 | network.db | OpenVibe.Network | keep | W1 (module split) || password_reset_tokens | server/db/database.js:241 | network.db | OpenVibe.Network | keep | W1 (module split) || principal_grant_changes | server/identity/grants-admin.js:38 | network.db | OpenVibe.Network | keep | W1 (module split) |--| principal_grants | server/identity/principals.js:217 | network.db | OpenVibe.Network | keep | W1 (module split) |--| principal_usage | server/identity/principals.js:227 | network.db | OpenVibe.Network | keep | W1 (module split) |++| principal_grants | server/identity/principals.js:246 | network.db | OpenVibe.Network | keep | W1 (module split) |++| principal_usage | server/identity/principals.js:256 | network.db | OpenVibe.Network | keep | W1 (module split) || push_subscriptions | server/db/database.js:380 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) || site_settings | server/db/database.js:158 | network.db | OpenVibe.Network | keep | - |++| status_incident_updates | server/status/incidents.js:43 | network.db | OpenVibe.Network | keep | W1 (module split) |++| status_incidents | server/status/incidents.js:30 | network.db | OpenVibe.Network | keep | W1 (module split) || stream_live_announcements | server/notifications/stream-live.js:31 | network.db | OpenVibe.Events | extract | W3 |++| subject_aliases | server/identity/account-merge.js:48 | network.db | OpenVibe.Network | keep | W1 (module split) || themes | server/db/database.js:103 | 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:165, server/url-registry.js:7 | network.db | OpenVibe.Network | keep | W1 (module split) || user_blocks | server/identity/blocks.js:41 | network.db | OpenVibe.Network | keep | W1 (module split) || user_effects | server/db/database.js:295 | network.db | OpenVibe.Network | keep | W1 (module split) |++| user_follows | server/identity/follows.js:42 | network.db | OpenVibe.Network | keep | W1 (module split) || user_history | server/history/routes.js:26 | network.db | OpenVibe.Network | keep | W1 (module split) || user_module_retirements | server/identity/modules.js:91 | network.db | OpenVibe.Network | keep | W1 (module split) || user_module_revisions | server/identity/modules.js:84 | network.db | OpenVibe.Network | keep | W1 (module split) |@@@ -283,10 +308,11 @@ Deliverable 2: every table declared in code or present in production, with curre| config_keys | config.js:252 | no | OpenVibe.Shared | keep | - || config_snapshots | config.js:231 | no | OpenVibe.Shared | keep | - |--## OpenVibe.Media (31)++## OpenVibe.Media (37)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|++| account_data_events | server/account-data.js:32 | media.db | OpenVibe.Media | keep | W4 (object model) || apps | server/db/schema.sql:8 | media.db | OpenVibe.Media | keep | W4 (object model) || assets | server/db/schema.sql:194 | media.db | OpenVibe.Media | keep | W4 (object model) || clips | server/db/schema.sql:65 | media.db | OpenVibe.Media | keep | W4 (object model) |@@@ -301,7 +327,11 @@ Deliverable 2: every table declared in code or present in production, with curre| media_jobs | server/db/schema.sql:323 | media.db | OpenVibe.Media | keep | W4 (object model) || media_locations | server/db/schema.sql:283 | media.db | OpenVibe.Media | keep | W4 (object model) || media_namespaces | server/db/schema.sql:249 | media.db | OpenVibe.Media | keep | W4 (object model) |--| media_object_changes | server/db/schema.sql:436 | media.db | OpenVibe.Media | keep | W4 (object model) |++| media_object_changes | server/db/schema.sql:480 | media.db | OpenVibe.Media | keep | W4 (object model) |++| media_object_tier_decisions | server/db/schema.sql:458 | media.db | OpenVibe.Media | keep | W4 (object model) |++| media_object_view_salts | server/db/schema.sql:435 | media.db | OpenVibe.Media | keep | W4 (object model) |++| media_object_viewer_days | server/db/schema.sql:440 | media.db | OpenVibe.Media | keep | W4 (object model) |++| media_object_views_daily | server/db/schema.sql:446 | media.db | OpenVibe.Media | keep | W4 (object model) || media_objects | server/db/schema.sql:215 | media.db | OpenVibe.Media | keep | W4 (object model) || media_quota_reservations | server/db/schema.sql:270 | media.db | OpenVibe.Media | keep | W4 (object model) || media_relationships | server/db/schema.sql:299 | media.db | OpenVibe.Media | keep | W4 (object model) |@@@ -310,16 +340,17 @@ Deliverable 2: every table declared in code or present in production, with curre| media_upload_parts | server/db/schema.sql:371 | media.db | OpenVibe.Media | keep | W4 (object model) || media_uploads | server/db/schema.sql:355 | media.db | OpenVibe.Media | keep | W4 (object model) || media_variants | server/db/schema.sql:310 | media.db | OpenVibe.Media | keep | W4 (object model) |--| media_verifications | server/db/schema.sql:448 | media.db | OpenVibe.Media | keep | W4 (object model) |--| media_verify_runs | server/db/schema.sql:460 | media.db | OpenVibe.Media | keep | W4 (object model) |++| media_verifications | server/db/schema.sql:492 | media.db | OpenVibe.Media | keep | W4 (object model) |++| media_verify_runs | server/db/schema.sql:504 | media.db | OpenVibe.Media | keep | W4 (object model) || paste_comments | server/db/schema.sql:150 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) || paste_likes | server/db/schema.sql:142 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) || pastes | server/db/schema.sql:108 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) || search_doc_pushes | (prod only) | media.db | ? | investigate | W0 |++| subject_merges | server/subject-merge.js:13 | no | OpenVibe.Media | keep | W4 (object model) || token_revocations | (prod only) | media.db | ? | investigate | W0 || vods | server/db/schema.sql:22 | media.db | OpenVibe.Media | keep | W4 (object model) |--## OpenVibe.Tools (13)++## OpenVibe.Tools (14)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|@@@ -335,12 +366,14 @@ Deliverable 2: every table declared in code or present in production, with curre| guard_salt | apps/_shared/guard/store.js:27 | no | OpenVibe.Tools | keep | - || tool_job_events | apps/_shared/jobs/store.js:47 | jobs.db | OpenVibe.Tools | keep | - || tool_job_references | apps/_shared/jobs/store.js:55 | jobs.db | OpenVibe.Tools | keep | - |++| tool_job_usage | apps/_shared/jobs/usage.js:36 | jobs.db | OpenVibe.Tools | keep | - || tool_jobs | apps/_shared/jobs/store.js:17 | jobs.db | OpenVibe.Tools | keep | - |--## OpenVibe.Community (36)++## OpenVibe.Community (38)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|++| account_data_events | server/identity/account-data.js:32 | community.db | OpenVibe.Community | keep | W5 || attachments | server/db.js:267 | community.db | OpenVibe.Community | keep | W5 || categories | server/db.js:308 | community.db | OpenVibe.Community | keep | W5 || comment_threads | server/db.js:150 | community.db | OpenVibe.Community | keep | W5 |@@@ -348,7 +381,8 @@ Deliverable 2: every table declared in code or present in production, with curre| comments | server/db.js:165 | community.db | OpenVibe.Community | keep | W5 || community_event_inbox | (prod only) | community.db | OpenVibe.Community | keep | W3 || event_outbox | (prod only) | community.db | OpenVibe.Community | keep | W3 |--| import_hold | server/db.js:425 | community.db | OpenVibe.Community | keep | W5 |++| game_progress | server/db.js:424 | community.db | OpenVibe.Community | keep | W5 |++| import_hold | server/db.js:431 | community.db | OpenVibe.Community | keep | W5 || legacy_id_map | server/db.js:138 | community.db | OpenVibe.Community | keep | W5 || migration_runs | server/db.js:130 | community.db | OpenVibe.Community | keep | W5 || network_blocks | server/identity/blocks.js:20 | no | OpenVibe.Community | keep | W5 |@@@ -365,7 +399,7 @@ Deliverable 2: every table declared in code or present in production, with curre| pulse_items | server/db.js:408 | community.db | OpenVibe.Community | keep | W5 || relay_cursors | server/db.js:385 | community.db | OpenVibe.Community | keep | W5 || relay_deliveries | server/db.js:353 | community.db | OpenVibe.Community | keep | W5 |--| relay_deliveries_v2 | server/db.js:554 | no | OpenVibe.Community | keep | W5 |++| relay_deliveries_v2 | server/db.js:560 | no | OpenVibe.Community | keep | W5 || relay_inbound_failures | server/db.js:394 | community.db | OpenVibe.Community | keep | W5 || relay_mappings | server/db.js:338 | community.db | OpenVibe.Community | keep | W5 || relay_message_map | server/db.js:363 | community.db | OpenVibe.Community | keep | W5 |@@@ -378,10 +412,11 @@ Deliverable 2: every table declared in code or present in production, with curre| threads | server/db.js:213 | community.db | OpenVibe.Community | keep | W5 || token_revocations | (prod only) | community.db | ? | investigate | W0 |--## OpenVibe.Games (14)++## OpenVibe.Games (15)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|++| account_data_events | apps/server/src/platform/accountData.ts:47 | world.db | OpenVibe.Games | keep | W12 || constraints | packages/persistence/src/sqlite/sqliteStore.ts:70, packages/persistence/src/sqlite/sqliteStore.ts:184 | world.db | OpenVibe.Games | keep | W12 || event_outbox | (prod only) | world.db | OpenVibe.Games | keep | W3 || guest_ips | packages/persistence/src/sqlite/sqliteStore.ts:78, packages/persistence/src/sqlite/sqliteStore.ts:229 | world.db | OpenVibe.Games | keep | W12 |@@@ -401,22 +436,24 @@ Deliverable 2: every table declared in code or present in production, with curreNo tables.--## OpenVibe.Events (7)++## OpenVibe.Events (8)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|--| app_revocations | server/store.js:90 | events.db | OpenVibe.Events | keep | W3 |--| consumer_checkpoints | server/store.js:79 | events.db | OpenVibe.Events | keep | W3 |--| deliveries | server/store.js:61 | events.db | OpenVibe.Events | keep | W3 |--| events | server/store.js:24 | events.db | OpenVibe.Events | keep | W3 |--| idempotency_receipts | server/store.js:99 | events.db | OpenVibe.Events | keep | W3 |--| sequences | server/store.js:20 | events.db | OpenVibe.Events | keep | W3 |--| subscriptions | server/store.js:48 | events.db | OpenVibe.Events | keep | W3 |++| app_revocations | server/store.js:91 | events.db | OpenVibe.Events | keep | W3 |++| app_usage | server/usage.js:40 | events.db | OpenVibe.Events | keep | W3 |++| consumer_checkpoints | server/store.js:80 | events.db | OpenVibe.Events | keep | W3 |++| deliveries | server/store.js:62 | events.db | OpenVibe.Events | keep | W3 |++| events | server/store.js:25 | events.db | OpenVibe.Events | keep | W3 |++| idempotency_receipts | server/store.js:100 | events.db | OpenVibe.Events | keep | W3 |++| sequences | server/store.js:21 | events.db | OpenVibe.Events | keep | W3 |++| subscriptions | server/store.js:49 | events.db | OpenVibe.Events | keep | W3 |--## OpenVibe.Chat (41)++## OpenVibe.Chat (42)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|++| account_data_events | server/chat/account-data.js:39 | chat.db | OpenVibe.Chat | keep | W6 || audio_requests | server/db/schema.sql:409 | chat.db | OpenVibe.Chat | keep | W6 || bridge_applied | server/db/schema.sql:399 | chat.db | OpenVibe.Chat | keep | W6 || bridge_refs | server/db/schema.sql:436 | chat.db | OpenVibe.Chat | keep | W6 |@@@ -546,7 +583,7 @@ No tables.| vip_plans | server/db.js:51 | vip.db | OpenVibe.VIP | keep | W10 || vip_product_bindings | server/db.js:122 | vip.db | OpenVibe.VIP | keep | W10 |--## OpenVibe.AI (19)++## OpenVibe.AI (20)| Table | Declared at | In prod | Target owner | Disposition | Wave ||---|---|---|---|---|---|@@@ -565,6 +602,7 @@ No tables.| requests | server/db.js:167 | ai.db | OpenVibe.AI | keep | W13 || routes | server/db.js:69 | ai.db | OpenVibe.AI | keep | W13 || runs | server/db.js:121 | ai.db | OpenVibe.AI | keep | W13 |++| subject_credentials | server/credentials.js:27 | ai.db | OpenVibe.AI | keep | W13 || templates | server/db.js:85 | ai.db | OpenVibe.AI | keep | W13 || usage_counters | server/db.js:248 | ai.db | OpenVibe.AI | keep | W13 || usage_daily | server/db.js:259 | ai.db | OpenVibe.AI | keep | W13 |@@@ -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/* | Stay | Elsewhere or moving ||---|---|---|---|---|---|---|---|---|---|--| OpenVibe.Live | 646 | 322 | 225 | 50 | 48 | 1 | 102 | 359 | 287 |--| OpenVibe.Network | 303 | 147 | 99 | 35 | 22 | 0 | 33 | 302 | 1 |++| OpenVibe.Live | 648 | 324 | 225 | 50 | 48 | 1 | 102 | 361 | 287 |++| OpenVibe.Network | 355 | 169 | 120 | 39 | 27 | 0 | 42 | 354 | 1 || OpenVibe.Shared | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 0 |--| OpenVibe.Media | 140 | 66 | 52 | 6 | 16 | 0 | 2 | 122 | 18 |--| OpenVibe.Tools | 124 | 101 | 17 | 1 | 4 | 1 | 1 | 124 | 0 |++| OpenVibe.Media | 144 | 70 | 52 | 6 | 16 | 0 | 2 | 126 | 18 |++| OpenVibe.Tools | 125 | 101 | 18 | 1 | 4 | 1 | 1 | 125 | 0 || OpenVibe.Community | 180 | 71 | 58 | 34 | 17 | 0 | 1 | 180 | 0 || OpenVibe.Games | 29 | 0 | 3 | 0 | 0 | 26 | 0 | 29 | 0 || OpenVibe.Events | 18 | 11 | 6 | 1 | 0 | 0 | 1 | 18 | 0 |@@@ -21,17 +21,17 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t| OpenVibe.Billing | 56 | 33 | 22 | 0 | 0 | 1 | 0 | 56 | 0 || OpenVibe.Tips | 62 | 37 | 22 | 3 | 0 | 0 | 0 | 62 | 0 || OpenVibe.VIP | 44 | 28 | 12 | 3 | 1 | 0 | 0 | 44 | 0 |--| OpenVibe.AI | 52 | 30 | 19 | 2 | 1 | 0 | 0 | 52 | 0 |++| OpenVibe.AI | 58 | 32 | 19 | 4 | 3 | 0 | 0 | 58 | 0 || OpenVibe.Search | 21 | 16 | 2 | 1 | 2 | 0 | 1 | 21 | 0 || OpenVibe.Sources | 16 | 10 | 3 | 1 | 2 | 0 | 0 | 16 | 0 || OpenVibe.Wiki | 76 | 43 | 28 | 4 | 1 | 0 | 0 | 76 | 0 |--| OpenVibe.Blog | 59 | 39 | 16 | 3 | 1 | 0 | 0 | 59 | 0 |++| OpenVibe.Blog | 64 | 39 | 21 | 3 | 1 | 0 | 0 | 64 | 0 || OpenVibe.News | 51 | 34 | 17 | 0 | 0 | 0 | 1 | 51 | 0 || OpenVibe.Reviews | 70 | 34 | 31 | 2 | 3 | 0 | 0 | 70 | 0 || OpenVibe.Deals | 58 | 31 | 23 | 2 | 2 | 0 | 1 | 58 | 0 || OpenVibe.Coupons | 46 | 30 | 16 | 0 | 0 | 0 | 0 | 46 | 0 || OpenVibe.Trade | 7 | 4 | 3 | 0 | 0 | 0 | 1 | 7 | 0 |--| OpenVibe.Codes | 105 | 60 | 44 | 0 | 0 | 1 | 0 | 105 | 0 |++| OpenVibe.Codes | 107 | 62 | 44 | 0 | 0 | 1 | 0 | 107 | 0 || OpenVibe.Host | 57 | 24 | 24 | 2 | 7 | 0 | 0 | 57 | 0 |## Route authority@@@ -63,83 +63,84 @@ Owner = the repository whose code answers the route; target = the authority it b| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | /api/admin/admins | server/admin/routes.js:841 | | keep |--| POST | /api/admin/admins | server/admin/routes.js:851 | | keep |--| DELETE | /api/admin/admins/:id | server/admin/routes.js:870 | | keep |--| GET | /api/admin/ai/explorer/:userId | server/admin/routes.js:582 | | keep |--| GET | /api/admin/ai/overviews | server/admin/routes.js:619 | | keep |--| GET | /api/admin/ai/status | server/admin/routes.js:571 | | keep |--| POST | /api/admin/ai/streamer/:userId/overview | server/admin/routes.js:628 | | keep |--| GET | /api/admin/ai/usage | server/admin/routes.js:524 | | keep |--| POST | /api/admin/ai/viewers/:userId/:action | server/admin/routes.js:552 | | keep |--| GET | /api/admin/ai/viewers/:userId/log | server/admin/routes.js:562 | | keep |--| GET | /api/admin/ai/viewers/status | server/admin/routes.js:534 | | keep |--| GET | /api/admin/analytics | server/index.js:732 | | keep |--| GET | /api/admin/analytics/bots | server/index.js:741 | | keep |--| GET | /api/admin/bans | server/admin/routes.js:431 | | keep |--| POST | /api/admin/broadcast | server/index.js:853 | | keep |--| PUT | /api/admin/channels/:id/force-nsfw | server/admin/routes.js:372 | | keep |--| GET | /api/admin/config | server/admin/routes.js:755 | | keep |--| GET | /api/admin/config/:namespace | server/admin/routes.js:756 | | keep |--| GET | /api/admin/config/:namespace/history | server/admin/routes.js:757 | | keep |--| POST | /api/admin/config/:namespace/rollback | server/admin/routes.js:758 | | keep |--| GET | /api/admin/diagnostics | server/admin/routes.js:55 | | keep |--| DELETE | /api/admin/media-tools/cookies | server/admin/routes.js:1296 | | keep |--| PUT | /api/admin/media-tools/cookies | server/admin/routes.js:1215 | | keep |--| POST | /api/admin/media-tools/cookies/check | server/admin/routes.js:1274 | | keep |--| DELETE | /api/admin/media-tools/extra-args | server/admin/routes.js:1329 | | keep |--| PUT | /api/admin/media-tools/extra-args | server/admin/routes.js:1310 | | keep |--| GET | /api/admin/media-tools/status | server/admin/routes.js:1170 | | keep |--| POST | /api/admin/media-tools/test | server/admin/routes.js:1340 | | keep |--| GET | /api/admin/moderators | server/admin/routes.js:776 | | keep |--| POST | /api/admin/moderators | server/admin/routes.js:788 | | keep |--| DELETE | /api/admin/moderators/:id | server/admin/routes.js:815 | | keep |--| GET | /api/admin/money | server/admin/routes.js:485 | | keep |--| POST | /api/admin/money/actions/:id/resolve | server/admin/routes.js:499 | | keep |--| POST | /api/admin/money/freeze | server/admin/routes.js:493 | | keep |++| GET | /api/admin/admins | server/admin/routes.js:848 | | keep |++| POST | /api/admin/admins | server/admin/routes.js:858 | | keep |++| DELETE | /api/admin/admins/:id | server/admin/routes.js:877 | | keep |++| GET | /api/admin/ai/explorer/:userId | server/admin/routes.js:589 | | keep |++| GET | /api/admin/ai/overviews | server/admin/routes.js:626 | | keep |++| GET | /api/admin/ai/status | server/admin/routes.js:578 | | keep |++| POST | /api/admin/ai/streamer/:userId/overview | server/admin/routes.js:635 | | keep |++| GET | /api/admin/ai/usage | server/admin/routes.js:531 | | keep |++| POST | /api/admin/ai/viewers/:userId/:action | server/admin/routes.js:559 | | keep |++| GET | /api/admin/ai/viewers/:userId/log | server/admin/routes.js:569 | | keep |++| GET | /api/admin/ai/viewers/status | server/admin/routes.js:541 | | keep |++| GET | /api/admin/analytics | server/index.js:745 | | keep |++| GET | /api/admin/analytics/bots | server/index.js:754 | | keep |++| GET | /api/admin/bans | server/admin/routes.js:438 | | keep |++| POST | /api/admin/broadcast | server/index.js:866 | | keep |++| PUT | /api/admin/channels/:id/force-nsfw | server/admin/routes.js:379 | | keep |++| GET | /api/admin/config | server/admin/routes.js:762 | | keep |++| GET | /api/admin/config/:namespace | server/admin/routes.js:763 | | keep |++| GET | /api/admin/config/:namespace/history | server/admin/routes.js:764 | | keep |++| POST | /api/admin/config/:namespace/rollback | server/admin/routes.js:765 | | keep |++| GET | /api/admin/diagnostics | server/admin/routes.js:62 | | keep |++| GET | /api/admin/lineage/unresolved | server/admin/routes.js:56 | | keep |++| DELETE | /api/admin/media-tools/cookies | server/admin/routes.js:1302 | | keep |++| PUT | /api/admin/media-tools/cookies | server/admin/routes.js:1221 | | keep |++| POST | /api/admin/media-tools/cookies/check | server/admin/routes.js:1280 | | keep |++| DELETE | /api/admin/media-tools/extra-args | server/admin/routes.js:1335 | | keep |++| PUT | /api/admin/media-tools/extra-args | server/admin/routes.js:1316 | | keep |++| GET | /api/admin/media-tools/status | server/admin/routes.js:1176 | | keep |++| POST | /api/admin/media-tools/test | server/admin/routes.js:1346 | | keep |++| GET | /api/admin/moderators | server/admin/routes.js:783 | | keep |++| POST | /api/admin/moderators | server/admin/routes.js:795 | | keep |++| DELETE | /api/admin/moderators/:id | server/admin/routes.js:822 | | keep |++| GET | /api/admin/money | server/admin/routes.js:492 | | keep |++| POST | /api/admin/money/actions/:id/resolve | server/admin/routes.js:506 | | keep |++| POST | /api/admin/money/freeze | server/admin/routes.js:500 | | keep || PUT | /api/admin/openre/managed/:id/ingest-authority | server/openre/routes.js:35 | | keep || GET | /api/admin/openre/status | server/openre/routes.js:18 | | keep |--| GET | /api/admin/settings | server/admin/routes.js:512 | | keep |--| PUT | /api/admin/settings | server/admin/routes.js:647 | | keep |--| DELETE | /api/admin/settings/:key | server/admin/routes.js:732 | | keep |--| PUT | /api/admin/settings/:key | server/admin/routes.js:712 | | keep |--| GET | /api/admin/stats | server/admin/routes.js:67 | | keep |--| GET | /api/admin/storage | server/admin/routes.js:1014 | | keep |--| DELETE | /api/admin/storage/clips/bulk | server/admin/routes.js:1120 | | keep |--| GET | /api/admin/storage/vods | server/admin/routes.js:1070 | | keep |--| DELETE | /api/admin/storage/vods/bulk | server/admin/routes.js:1089 | | keep |--| GET | /api/admin/streams | server/admin/routes.js:307 | | keep |--| DELETE | /api/admin/streams/:id | server/admin/routes.js:326 | | keep |--| PUT | /api/admin/streams/:id/nsfw | server/admin/routes.js:420 | | keep |--| GET | /api/admin/users | server/admin/routes.js:121 | | keep |--| PUT | /api/admin/users/:id | server/admin/routes.js:160 | | keep |--| DELETE | /api/admin/users/:id/ban | server/admin/routes.js:288 | | keep |--| POST | /api/admin/users/:id/ban | server/admin/routes.js:250 | | keep |--| PUT | /api/admin/users/:id/force-vod-recording | server/admin/routes.js:389 | | keep |--| GET | /api/admin/verification-keys | server/admin/routes.js:892 | | keep |--| POST | /api/admin/verification-keys | server/admin/routes.js:902 | | keep |--| DELETE | /api/admin/verification-keys/:id | server/admin/routes.js:945 | | keep |--| GET | /api/admin/vpn-queue | server/admin/routes.js:447 | | keep |--| PUT | /api/admin/vpn-queue/:id | server/admin/routes.js:463 | | keep |--| POST | /api/ai-viewers/${cmd} | server/ai/viewers/routes.js:117 | | keep |--| DELETE | /api/ai-viewers/bots/:id | server/ai/viewers/routes.js:220 | | keep |--| PATCH | /api/ai-viewers/bots/:id | server/ai/viewers/routes.js:185 | | keep |--| POST | /api/ai-viewers/bots/:id/clear-memory | server/ai/viewers/routes.js:209 | | keep |--| POST | /api/ai-viewers/bots/:id/mute | server/ai/viewers/routes.js:122 | | keep |--| POST | /api/ai-viewers/bots/:id/unmute | server/ai/viewers/routes.js:123 | | keep |--| POST | /api/ai-viewers/byo/test | server/ai/viewers/routes.js:124 | | keep |--| POST | /api/ai-viewers/clone | server/ai/viewers/routes.js:233 | | keep |--| GET | /api/ai-viewers/config | server/ai/viewers/routes.js:82 | | keep |--| PUT | /api/ai-viewers/config | server/ai/viewers/routes.js:134 | | keep |--| GET | /api/ai-viewers/log | server/ai/viewers/routes.js:106 | | keep |--| POST | /api/ai-viewers/preview | server/ai/viewers/routes.js:282 | | keep |--| GET | /api/ai-viewers/roster | server/ai/viewers/routes.js:167 | | keep |--| GET | /api/ai-viewers/status | server/ai/viewers/routes.js:99 | | keep |--| GET | /api/ai-viewers/threads | server/ai/viewers/routes.js:112 | | keep |++| GET | /api/admin/settings | server/admin/routes.js:519 | | keep |++| PUT | /api/admin/settings | server/admin/routes.js:654 | | keep |++| DELETE | /api/admin/settings/:key | server/admin/routes.js:739 | | keep |++| PUT | /api/admin/settings/:key | server/admin/routes.js:719 | | keep |++| GET | /api/admin/stats | server/admin/routes.js:74 | | keep |++| GET | /api/admin/storage | server/admin/routes.js:1021 | | keep |++| DELETE | /api/admin/storage/clips/bulk | server/admin/routes.js:1127 | | keep |++| GET | /api/admin/storage/vods | server/admin/routes.js:1077 | | keep |++| DELETE | /api/admin/storage/vods/bulk | server/admin/routes.js:1096 | | keep |++| GET | /api/admin/streams | server/admin/routes.js:314 | | keep |++| DELETE | /api/admin/streams/:id | server/admin/routes.js:333 | | keep |++| PUT | /api/admin/streams/:id/nsfw | server/admin/routes.js:427 | | keep |++| GET | /api/admin/users | server/admin/routes.js:128 | | keep |++| PUT | /api/admin/users/:id | server/admin/routes.js:167 | | keep |++| DELETE | /api/admin/users/:id/ban | server/admin/routes.js:295 | | keep |++| POST | /api/admin/users/:id/ban | server/admin/routes.js:257 | | keep |++| PUT | /api/admin/users/:id/force-vod-recording | server/admin/routes.js:396 | | keep |++| GET | /api/admin/verification-keys | server/admin/routes.js:899 | | keep |++| POST | /api/admin/verification-keys | server/admin/routes.js:909 | | keep |++| DELETE | /api/admin/verification-keys/:id | server/admin/routes.js:952 | | keep |++| GET | /api/admin/vpn-queue | server/admin/routes.js:454 | | keep |++| PUT | /api/admin/vpn-queue/:id | server/admin/routes.js:470 | | keep |++| POST | /api/ai-viewers/${cmd} | server/ai/viewers/routes.js:118 | | keep |++| DELETE | /api/ai-viewers/bots/:id | server/ai/viewers/routes.js:238 | | keep |++| PATCH | /api/ai-viewers/bots/:id | server/ai/viewers/routes.js:203 | | keep |++| POST | /api/ai-viewers/bots/:id/clear-memory | server/ai/viewers/routes.js:227 | | keep |++| POST | /api/ai-viewers/bots/:id/mute | server/ai/viewers/routes.js:123 | | keep |++| POST | /api/ai-viewers/bots/:id/unmute | server/ai/viewers/routes.js:124 | | keep |++| POST | /api/ai-viewers/byo/test | server/ai/viewers/routes.js:125 | | keep |++| POST | /api/ai-viewers/clone | server/ai/viewers/routes.js:251 | | keep |++| GET | /api/ai-viewers/config | server/ai/viewers/routes.js:83 | | keep |++| PUT | /api/ai-viewers/config | server/ai/viewers/routes.js:145 | | keep |++| GET | /api/ai-viewers/log | server/ai/viewers/routes.js:107 | | keep |++| POST | /api/ai-viewers/preview | server/ai/viewers/routes.js:300 | | keep |++| GET | /api/ai-viewers/roster | server/ai/viewers/routes.js:185 | | keep |++| GET | /api/ai-viewers/status | server/ai/viewers/routes.js:100 | | keep |++| GET | /api/ai-viewers/threads | server/ai/viewers/routes.js:113 | | keep || GET | /api/analytics/channel/:username | server/streaming/analytics-routes.js:23 | | keep |--| GET | /api/analytics/channel/:username/dashboard | server/streaming/analytics-routes.js:157 | | keep |--| GET | /api/analytics/channel/:username/streams | server/streaming/analytics-routes.js:58 | | keep |--| GET | /api/analytics/stream/:id | server/streaming/analytics-routes.js:97 | | keep |++| GET | /api/analytics/channel/:username/dashboard | server/streaming/analytics-routes.js:158 | | keep |++| GET | /api/analytics/channel/:username/streams | server/streaming/analytics-routes.js:59 | | keep |++| GET | /api/analytics/stream/:id | server/streaming/analytics-routes.js:98 | | keep || POST | /api/arena/backfill | server/arena/routes.js:80 | | keep || GET | /api/arena/beefs | server/arena/routes.js:112 | | keep || GET | /api/arena/beefs/:id | server/arena/routes.js:113 | | keep |@@@ -189,13 +190,13 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/channels/moderation/mine | server/admin/channel-mod-routes.js:51 | OpenVibe.Chat | extract || GET | /api/chat-ai/anon/:anonId | server/ai/chat-ai-routes.js:83 | | keep || GET | /api/chat-ai/global | server/ai/chat-ai-routes.js:14 | | keep |--| GET | /api/chat-ai/live-captions/:username | server/ai/chat-ai-routes.js:236 | | keep |++| GET | /api/chat-ai/live-captions/:username | server/ai/chat-ai-routes.js:235 | | keep || GET | /api/chat-ai/relay/:platform/:username | server/ai/chat-ai-routes.js:95 | | keep || GET | /api/chat-ai/timeline | server/ai/chat-ai-routes.js:24 | | keep |--| GET | /api/chat-ai/timeline/:username | server/ai/chat-ai-routes.js:174 | | keep |--| GET | /api/chat-ai/transcript/:streamId | server/ai/chat-ai-routes.js:335 | | keep |++| GET | /api/chat-ai/timeline/:username | server/ai/chat-ai-routes.js:173 | | keep |++| GET | /api/chat-ai/transcript/:streamId | server/ai/chat-ai-routes.js:334 | | keep || GET | /api/chat-ai/user/:id | server/ai/chat-ai-routes.js:39 | | keep |--| GET | /api/chat-ai/vod-transcripts | server/ai/chat-ai-routes.js:273 | | keep |++| GET | /api/chat-ai/vod-transcripts | server/ai/chat-ai-routes.js:272 | | keep || GET | /api/chat/:streamId/history | server/chat/routes.js:489 | OpenVibe.Chat | shadowed || GET | /api/chat/:streamId/replay | server/chat/routes.js:467 | OpenVibe.Chat | shadowed || GET | /api/chat/:streamId/users | server/chat/routes.js:613 | OpenVibe.Chat | shadowed |@@@ -217,18 +218,18 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /api/chat/send | server/chat/routes.js:209 | OpenVibe.Chat | shadowed || GET | /api/chat/user/:userId/history | server/chat/routes.js:341 | OpenVibe.Chat | shadowed || GET | /api/chat/user/:username/profile | server/chat/routes.js:360 | OpenVibe.Chat | shadowed |--| GET | /api/clips | server/media-proxy/clips.js:181 | OpenVibe.Media | adapter |--| DELETE | /api/clips/:id | server/media-proxy/clips.js:358 | OpenVibe.Media | adapter |--| GET | /api/clips/:id | server/media-proxy/clips.js:210 | OpenVibe.Media | adapter |--| GET | /api/clips/:id/job | server/media-proxy/clips.js:396 | OpenVibe.Media | adapter |--| POST | /api/clips/:id/recut | server/media-proxy/clips.js:377 | OpenVibe.Media | adapter |--| PUT | /api/clips/:id/title | server/media-proxy/clips.js:292 | OpenVibe.Media | adapter |--| PUT | /api/clips/:id/visibility | server/media-proxy/clips.js:309 | OpenVibe.Media | adapter |--| POST | /api/clips/bulk | server/media-proxy/clips.js:333 | OpenVibe.Media | adapter |--| GET | /api/clips/mine | server/media-proxy/clips.js:123 | OpenVibe.Media | adapter |--| GET | /api/clips/my-stream | server/media-proxy/clips.js:141 | OpenVibe.Media | adapter |--| GET | /api/clips/settings/channel | server/media-proxy/clips.js:159 | OpenVibe.Media | adapter |--| PUT | /api/clips/settings/channel | server/media-proxy/clips.js:168 | OpenVibe.Media | adapter |++| GET | /api/clips | server/media-proxy/clips.js:182 | OpenVibe.Media | adapter |++| DELETE | /api/clips/:id | server/media-proxy/clips.js:359 | OpenVibe.Media | adapter |++| GET | /api/clips/:id | server/media-proxy/clips.js:211 | OpenVibe.Media | adapter |++| GET | /api/clips/:id/job | server/media-proxy/clips.js:397 | OpenVibe.Media | adapter |++| POST | /api/clips/:id/recut | server/media-proxy/clips.js:378 | OpenVibe.Media | adapter |++| PUT | /api/clips/:id/title | server/media-proxy/clips.js:293 | OpenVibe.Media | adapter |++| PUT | /api/clips/:id/visibility | server/media-proxy/clips.js:310 | OpenVibe.Media | adapter |++| POST | /api/clips/bulk | server/media-proxy/clips.js:334 | OpenVibe.Media | adapter |++| GET | /api/clips/mine | server/media-proxy/clips.js:124 | OpenVibe.Media | adapter |++| GET | /api/clips/my-stream | server/media-proxy/clips.js:142 | OpenVibe.Media | adapter |++| GET | /api/clips/settings/channel | server/media-proxy/clips.js:160 | OpenVibe.Media | adapter |++| PUT | /api/clips/settings/channel | server/media-proxy/clips.js:169 | OpenVibe.Media | adapter || POST | /api/coins/admin/grant | server/monetization/coins-routes.js:316 | | keep || GET | /api/coins/balance | server/monetization/coins-routes.js:26 | | keep || POST | /api/coins/bonus | server/monetization/coins-routes.js:70 | | keep |@@@ -285,7 +286,7 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /api/cosmetics/internal-unlock | server/monetization/cosmetics-routes.js:87 | | keep || GET | /api/cosmetics/inventory | server/monetization/cosmetics-routes.js:32 | | keep || POST | /api/cosmetics/unequip | server/monetization/cosmetics-routes.js:55 | | keep |--| POST | /api/csp-report | server/index.js:874 | | keep |++| POST | /api/csp-report | server/index.js:887 | | keep || GET | /api/dm/blocks | server/chat/dm-routes.js:402 | OpenVibe.Chat | shadowed || DELETE | /api/dm/blocks/:userId | server/chat/dm-routes.js:390 | OpenVibe.Chat | shadowed || POST | /api/dm/blocks/:userId | server/chat/dm-routes.js:375 | OpenVibe.Chat | shadowed |@@@ -335,7 +336,7 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/funds/leaderboard/:streamId | server/monetization/routes.js:233 | OpenVibe.Tips | extract || POST | /api/funds/purchase | server/monetization/routes.js:42 | OpenVibe.Tips | extract || POST | /api/funds/recycle | server/monetization/routes.js:206 | OpenVibe.Tips | extract |--| GET | /api/health | server/index.js:751 | | keep |++| GET | /api/health | server/index.js:764 | | keep || GET | /api/home/digest | server/home/routes.js:444 | | keep || GET | /api/home/discover | server/home/routes.js:494 | | keep || GET | /api/home/featured | server/home/routes.js:231 | | keep |@@@ -350,7 +351,7 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/img-proxy | server/media/external-image-proxy.js:31 | | keep || GET | /api/kiosk/favicon | server/kiosk/routes.js:150 | | keep || GET | /api/kiosk/site | server/kiosk/routes.js:99 | | keep |--| GET | /api/live-events | server/index.js:670 | | keep |++| GET | /api/live-events | server/index.js:683 | | keep || POST | /api/media/advance | server/media/routes.js:267 | | keep || GET | /api/media/channel/:username | server/media/routes.js:52 | | keep || GET | /api/media/downloader/status | server/media/routes.js:418 | | keep |@@@ -454,7 +455,7 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /api/powerchat/test-tip | server/integrations/powerchat-routes.js:350 | OpenVibe.Billing | extract || GET | /api/powerchat/tip-link | server/integrations/powerchat-routes.js:291 | OpenVibe.Billing | extract || POST | /api/powerchat/webhook | server/integrations/powerchat-routes.js:442 | OpenVibe.Billing | extract |--| GET | /api/ready | server/index.js:792 | | keep |++| GET | /api/ready | server/index.js:805 | | keep || GET | /api/recap/:streamId | server/recap/routes.js:22 | | keep || POST | /api/recap/:streamId/regenerate | server/recap/routes.js:44 | | keep || GET | /api/recap/channel/:username | server/recap/routes.js:15 | | keep |@@@ -491,53 +492,54 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/sounds/channel/:userId | server/chat/sounds-routes.js:125 | OpenVibe.Chat | shadowed || PATCH | /api/sounds/command | server/chat/sounds-routes.js:313 | OpenVibe.Chat | shadowed || GET | /api/sounds/file/:filename | server/chat/sounds-routes.js:371 | OpenVibe.Chat | shadowed |--| GET | /api/streams | server/streaming/routes.js:1129 | | keep |--| POST | /api/streams | server/streaming/routes.js:1960 | | keep |--| DELETE | /api/streams/:id | server/streaming/routes.js:2155 | | keep |--| GET | /api/streams/:id | server/streaming/routes.js:1912 | | keep |--| PUT | /api/streams/:id | server/streaming/routes.js:2104 | | keep |--| GET | /api/streams/:id/call | server/streaming/routes.js:2474 | | keep |--| PUT | /api/streams/:id/call | server/streaming/routes.js:2435 | | keep |--| GET | /api/streams/:id/endpoint | server/streaming/routes.js:2202 | | keep |--| POST | /api/streams/:id/follow | server/streaming/routes.js:2343 | | keep |--| POST | /api/streams/:id/heartbeat | server/streaming/routes.js:2300 | | keep |--| GET | /api/streams/:id/rtmp-status | server/streaming/routes.js:2318 | | keep |--| GET | /api/streams/broadcast-settings | server/streaming/routes.js:1429 | | keep |--| PUT | /api/streams/broadcast-settings | server/streaming/routes.js:1446 | | keep |++| GET | /api/streams | server/streaming/routes.js:1140 | | keep |++| POST | /api/streams | server/streaming/routes.js:1971 | | keep |++| DELETE | /api/streams/:id | server/streaming/routes.js:2166 | | keep |++| GET | /api/streams/:id | server/streaming/routes.js:1923 | | keep |++| PUT | /api/streams/:id | server/streaming/routes.js:2115 | | keep |++| GET | /api/streams/:id/call | server/streaming/routes.js:2491 | | keep |++| PUT | /api/streams/:id/call | server/streaming/routes.js:2452 | | keep |++| GET | /api/streams/:id/endpoint | server/streaming/routes.js:2213 | | keep |++| POST | /api/streams/:id/follow | server/streaming/routes.js:2354 | | keep |++| POST | /api/streams/:id/heartbeat | server/streaming/routes.js:2311 | | keep |++| GET | /api/streams/:id/rtmp-status | server/streaming/routes.js:2329 | | keep |++| GET | /api/streams/broadcast-settings | server/streaming/routes.js:1440 | | keep |++| PUT | /api/streams/broadcast-settings | server/streaming/routes.js:1457 | | keep || GET | /api/streams/channel | server/streaming/routes.js:677 | | keep || PUT | /api/streams/channel | server/streaming/routes.js:689 | | keep || GET | /api/streams/channel/:username | server/streaming/routes.js:221 | | keep || PUT | /api/streams/channel/:username/about | server/streaming/routes.js:808 | | keep || GET | /api/streams/channel/:username/bio-en | server/streaming/routes.js:789 | | keep || GET | /api/streams/channel/:username/clips-taken | server/streaming/routes.js:595 | | keep |--| POST | /api/streams/channel/:username/follow | server/streaming/routes.js:2388 | | keep |++| POST | /api/streams/channel/:username/follow | server/streaming/routes.js:2402 | | keep |++| GET | /api/streams/channel/:username/game | server/streaming/routes.js:1020 | | keep || GET | /api/streams/channel/:username/live | server/streaming/routes.js:639 | | keep || GET | /api/streams/channel/:username/popular | server/streaming/routes.js:569 | | keep |--| GET | /api/streams/channel/:username/resolve/:ref | server/streaming/routes.js:1468 | | keep |--| GET | /api/streams/channel/:username/weather | server/streaming/routes.js:1018 | | keep |++| GET | /api/streams/channel/:username/resolve/:ref | server/streaming/routes.js:1479 | | keep |++| GET | /api/streams/channel/:username/weather | server/streaming/routes.js:1029 | | keep || POST | /api/streams/channel/offline-screen | server/streaming/routes.js:914 | | keep |--| POST | /api/streams/diag-log | server/streaming/routes.js:2293 | | keep |++| POST | /api/streams/diag-log | server/streaming/routes.js:2304 | | keep || POST | /api/streams/goal-media | server/streaming/routes.js:879 | | keep |--| GET | /api/streams/managed | server/streaming/routes.js:1630 | | keep |--| POST | /api/streams/managed | server/streaming/routes.js:1642 | | keep |--| DELETE | /api/streams/managed/:id | server/streaming/routes.js:1856 | | keep |--| PUT | /api/streams/managed/:id | server/streaming/routes.js:1696 | | keep |--| POST | /api/streams/managed/:id/regenerate-key | server/streaming/routes.js:1881 | | keep |--| GET | /api/streams/managed/:managedStreamId/history | server/streaming/routes.js:1502 | | keep |--| GET | /api/streams/managed/:managedStreamId/profile | server/streaming/routes.js:1523 | | keep |--| GET | /api/streams/mine | server/streaming/routes.js:1165 | | keep |++| GET | /api/streams/managed | server/streaming/routes.js:1641 | | keep |++| POST | /api/streams/managed | server/streaming/routes.js:1653 | | keep |++| DELETE | /api/streams/managed/:id | server/streaming/routes.js:1867 | | keep |++| PUT | /api/streams/managed/:id | server/streaming/routes.js:1707 | | keep |++| POST | /api/streams/managed/:id/regenerate-key | server/streaming/routes.js:1892 | | keep |++| GET | /api/streams/managed/:managedStreamId/history | server/streaming/routes.js:1513 | | keep |++| GET | /api/streams/managed/:managedStreamId/profile | server/streaming/routes.js:1534 | | keep |++| GET | /api/streams/mine | server/streaming/routes.js:1176 | | keep || POST | /api/streams/panel-image | server/streaming/routes.js:857 | | keep |--| GET | /api/streams/recent | server/streaming/routes.js:1177 | | keep |--| GET | /api/streams/recent-vods | server/streaming/routes.js:1248 | | keep |--| GET | /api/streams/recently-online | server/streaming/routes.js:1194 | | keep |--| GET | /api/streams/rtmp-proxy/:streamId.flv | server/streaming/routes.js:2495 | | keep |--| GET | /api/streams/setup-progress | server/streaming/routes.js:1575 | | keep |--| GET | /api/streams/voice-channels | server/streaming/routes.js:1278 | | keep |--| POST | /api/streams/voice-channels | server/streaming/routes.js:1299 | | keep |--| DELETE | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1311 | | keep |--| GET | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1288 | | keep |--| POST | /api/streams/voice-channels/call-user | server/streaming/routes.js:1323 | | keep |--| POST | /api/streams/voice-channels/call-user/respond | server/streaming/routes.js:1392 | | keep |++| GET | /api/streams/recent | server/streaming/routes.js:1188 | | keep |++| GET | /api/streams/recent-vods | server/streaming/routes.js:1259 | | keep |++| GET | /api/streams/recently-online | server/streaming/routes.js:1205 | | keep |++| GET | /api/streams/rtmp-proxy/:streamId.flv | server/streaming/routes.js:2512 | | keep |++| GET | /api/streams/setup-progress | server/streaming/routes.js:1586 | | keep |++| GET | /api/streams/voice-channels | server/streaming/routes.js:1289 | | keep |++| POST | /api/streams/voice-channels | server/streaming/routes.js:1310 | | keep |++| DELETE | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1322 | | keep |++| GET | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1299 | | keep |++| POST | /api/streams/voice-channels/call-user | server/streaming/routes.js:1334 | | keep |++| POST | /api/streams/voice-channels/call-user/respond | server/streaming/routes.js:1403 | | keep || GET | /api/themes | server/themes/routes.js:21 | OpenVibe.Network | extract || POST | /api/themes | server/themes/routes.js:109 | OpenVibe.Network | extract || DELETE | /api/themes/:id | server/themes/routes.js:148 | OpenVibe.Network | extract |@@@ -558,40 +560,40 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/tts/audio/:file | server/chat/tts-routes.js:125 | OpenVibe.Chat | shadowed || GET | /api/tts/settings | server/chat/tts-routes.js:43 | OpenVibe.Chat | shadowed || GET | /api/tts/voices | server/chat/tts-routes.js:33 | OpenVibe.Chat | shadowed |--| GET | /api/updates | server/index.js:840 | | keep |++| GET | /api/updates | server/index.js:853 | | keep || GET | /api/vibe-coding/channel/:username/:slotIdOrSlug/events | server/vibe-coding/routes.js:17 | OpenVibe.Codes | extract || GET | /api/vibe-coding/managed/:managedStreamId/events | server/vibe-coding/routes.js:47 | OpenVibe.Codes | extract || GET | /api/vibe-coding/managed/:managedStreamId/settings | server/vibe-coding/routes.js:74 | OpenVibe.Codes | extract || PUT | /api/vibe-coding/managed/:managedStreamId/settings | server/vibe-coding/routes.js:91 | OpenVibe.Codes | extract |--| GET | /api/vods | server/media-proxy/vods.js:303 | OpenVibe.Media | adapter |--| DELETE | /api/vods/:id | server/media-proxy/vods.js:566 | OpenVibe.Media | adapter |--| GET | /api/vods/:id | server/media-proxy/vods.js:460 | OpenVibe.Media | adapter |--| PUT | /api/vods/:id | server/media-proxy/vods.js:521 | OpenVibe.Media | adapter |--| GET | /api/vods/:id/context | server/media-proxy/vods.js:401 | OpenVibe.Media | adapter |++| GET | /api/vods | server/media-proxy/vods.js:308 | OpenVibe.Media | adapter |++| DELETE | /api/vods/:id | server/media-proxy/vods.js:571 | OpenVibe.Media | adapter |++| GET | /api/vods/:id | server/media-proxy/vods.js:465 | OpenVibe.Media | adapter |++| PUT | /api/vods/:id | server/media-proxy/vods.js:526 | OpenVibe.Media | adapter |++| GET | /api/vods/:id/context | server/media-proxy/vods.js:406 | OpenVibe.Media | adapter || GET | /api/vods/:id/live-info | server/media-proxy/vods.js:282 | OpenVibe.Media | adapter |--| GET | /api/vods/:id/memories | server/media-proxy/vods.js:377 | OpenVibe.Media | adapter |--| POST | /api/vods/:id/publish | server/media-proxy/vods.js:578 | OpenVibe.Media | adapter |--| POST | /api/vods/bulk | server/media-proxy/vods.js:538 | OpenVibe.Media | adapter |--| POST | /api/vods/bulk-delete-old | server/media-proxy/vods.js:333 | OpenVibe.Media | adapter |--| POST | /api/vods/clips | server/media-proxy/vods.js:638 | OpenVibe.Media | adapter |--| POST | /api/vods/clips/:id/trim | server/media-proxy/vods.js:792 | OpenVibe.Media | adapter |--| GET | /api/vods/clips/stream/:streamId | server/media-proxy/vods.js:781 | OpenVibe.Media | adapter |--| GET | /api/vods/file/:filename | server/media-proxy/vods.js:594 | OpenVibe.Media | adapter |--| GET | /api/vods/mine | server/media-proxy/vods.js:321 | OpenVibe.Media | adapter |++| GET | /api/vods/:id/memories | server/media-proxy/vods.js:382 | OpenVibe.Media | adapter |++| POST | /api/vods/:id/publish | server/media-proxy/vods.js:583 | OpenVibe.Media | adapter |++| POST | /api/vods/bulk | server/media-proxy/vods.js:543 | OpenVibe.Media | adapter |++| POST | /api/vods/bulk-delete-old | server/media-proxy/vods.js:338 | OpenVibe.Media | adapter |++| POST | /api/vods/clips | server/media-proxy/vods.js:643 | OpenVibe.Media | adapter |++| POST | /api/vods/clips/:id/trim | server/media-proxy/vods.js:797 | OpenVibe.Media | adapter |++| GET | /api/vods/clips/stream/:streamId | server/media-proxy/vods.js:786 | OpenVibe.Media | adapter |++| GET | /api/vods/file/:filename | server/media-proxy/vods.js:599 | OpenVibe.Media | adapter |++| GET | /api/vods/mine | server/media-proxy/vods.js:326 | OpenVibe.Media | adapter || POST | /api/vods/stream/:streamId/chunk | server/media-proxy/vods.js:183 | OpenVibe.Media | adapter || POST | /api/vods/stream/:streamId/finalize | server/media-proxy/vods.js:237 | OpenVibe.Media | adapter || GET | /api/vods/stream/:streamId/live | server/media-proxy/vods.js:257 | OpenVibe.Media | adapter |--| POST | /api/vods/upload | server/media-proxy/vods.js:600 | OpenVibe.Media | adapter |--| GET | /banned | server/index.js:1012 | | keep |--| POST | /banned/continue | server/index.js:982 | | keep |--| GET | /canvas | server/index.js:705 | OpenVibe.Games | compat |--| GET | /data/pastes/screenshots/:filename | server/index.js:638 | | keep |--| GET | /dmca | server/index.js:921 | | keep |++| POST | /api/vods/upload | server/media-proxy/vods.js:605 | OpenVibe.Media | adapter |++| GET | /banned | server/index.js:1025 | | keep |++| POST | /banned/continue | server/index.js:995 | | keep |++| GET | /canvas | server/index.js:718 | OpenVibe.Games | compat |++| GET | /data/pastes/screenshots/:filename | server/index.js:651 | | keep |++| GET | /dmca | server/index.js:934 | | keep || GET | /docs | server/docs/routes.js:315 | | keep || GET | /docs/:name | server/docs/routes.js:317 | | keep || GET | /docs/:name.md | server/docs/routes.js:316 | | keep |--| GET | /game | server/index.js:704 | OpenVibe.Games | compat |--| GET | /internal/analytics-summary | server/index.js:599 | | keep |++| GET | /game | server/index.js:717 | OpenVibe.Games | compat |++| GET | /internal/analytics-summary | server/index.js:612 | | keep || POST | /internal/chat-context/ai/mod-command | server/chat/live-context-routes.js:466 | | keep || POST | /internal/chat-context/alert-sound | server/chat/live-context-routes.js:382 | | keep || POST | /internal/chat-context/anon | server/chat/live-context-routes.js:280 | | keep |@@@ -684,31 +686,31 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /internal/chat-tables/:table | server/internal/routes.js:43 | | keep || POST | /internal/chat-tables/relay | server/internal/routes.js:36 | | keep || GET | /internal/followers | server/streaming/followers-internal.js:12 | | keep |--| GET | /internal/lineage/resolve | server/lineage/routes.js:33 | | keep |--| POST | /internal/lineage/resolve | server/lineage/routes.js:34 | | keep |--| POST | /internal/media-events | server/index.js:589 | | keep |--| POST | /internal/media-webhook | server/index.js:587 | OpenVibe.Events | compat |--| POST | /internal/network-events | server/index.js:591 | | keep |--| POST | /internal/openre-events | server/index.js:594 | | keep |++| GET | /internal/lineage/resolve | server/lineage/routes.js:36 | | keep |++| POST | /internal/lineage/resolve | server/lineage/routes.js:37 | | keep |++| POST | /internal/media-events | server/index.js:602 | | keep |++| POST | /internal/media-webhook | server/index.js:600 | OpenVibe.Events | compat |++| POST | /internal/network-events | server/index.js:604 | | keep |++| POST | /internal/openre-events | server/index.js:607 | | keep || POST | /internal/tips/deliveries | server/tips/delivery-routes.js:104 | | keep || POST | /internal/url-registry/refresh | server/internal/routes.js:64 | OpenVibe.Network | compat || POST | /internal/user-avatar | server/internal/routes.js:82 | OpenVibe.Network | compat || GET | /llms.txt | server/seo/seo.js:1175 | | keep |--| GET | /media/:username | server/index.js:912 | | keep |--| GET | /obs/chat/:username | server/index.js:900 | | keep |--| GET | /openvibe-sw.js | server/index.js:488 | | keep |--| GET | /overlay/chat/:username | server/index.js:908 | | keep |--| GET | /overlay/chat/:username/:slotIdOrSlug | server/index.js:905 | | keep |++| GET | /media/:username | server/index.js:925 | | keep |++| GET | /obs/chat/:username | server/index.js:913 | | keep |++| GET | /openvibe-sw.js | server/index.js:501 | | keep |++| GET | /overlay/chat/:username | server/index.js:921 | | keep |++| GET | /overlay/chat/:username/:slotIdOrSlug | server/index.js:918 | | keep || GET | /p/:slug | server/web/paste-handover.js:32 | OpenVibe.Community | adapter |--| GET | /p/:slug/raw | server/index.js:650 | OpenVibe.Community | adapter |--| GET | /p/:slug/screenshot | server/index.js:646 | OpenVibe.Community | adapter |--| GET | /privacy | server/index.js:930 | | keep |++| GET | /p/:slug/raw | server/index.js:663 | OpenVibe.Community | adapter |++| GET | /p/:slug/screenshot | server/index.js:659 | OpenVibe.Community | adapter |++| GET | /privacy | server/index.js:943 | | keep || GET | /sitemap.xml | server/seo/seo.js:1174 | | keep |--| GET | /terms | server/index.js:927 | | keep |--| GET | /tos | server/index.js:924 | | keep |--| POST | /whip/:streamId | server/index.js:939 | OpenRe.Stream | extract |--| DELETE | /whip/:streamId/:resourceId | server/index.js:941 | OpenRe.Stream | extract |--| PATCH | /whip/:streamId/:resourceId | server/index.js:940 | OpenRe.Stream | extract |++| GET | /terms | server/index.js:940 | | keep |++| GET | /tos | server/index.js:937 | | keep |++| POST | /whip/:streamId | server/index.js:952 | OpenRe.Stream | extract |++| DELETE | /whip/:streamId/:resourceId | server/index.js:954 | OpenRe.Stream | extract |++| PATCH | /whip/:streamId/:resourceId | server/index.js:953 | OpenRe.Stream | extract |## OpenVibe.Network@@@ -716,15 +718,21 @@ Owner = the repository whose code answers the route; target = the authority it b|---|---|---|---|---|| DELETE | / | server/notifications/routes.js:111 | | keep || GET | / | server/discord/routes.js:18 | | keep |++| GET | / | server/identity/account-data.js:554 | | keep |++| GET | / | server/identity/account-merge.js:316 | | keep || GET | / | server/notifications/routes.js:16 | | keep |--| POST | / | server/notifications/events-consumer.js:248 | | keep |++| POST | / | server/identity/account-merge.js:304 | | keep |++| POST | / | server/notifications/events-consumer.js:264 | | keep || PUT | / | server/discord/routes.js:37 | | keep |++| POST | /:id/cancel | server/identity/account-data.js:565 | | keep || POST | /:id/dismiss | server/notifications/routes.js:100 | | keep || POST | /:id/read | server/notifications/routes.js:67 | | keep || GET | /.well-known/openvibe | server/registry/ecosystem.js:317 | | keep |--| GET | /.well-known/web-identity | server/index.js:694 | | keep |++| GET | /.well-known/web-identity | server/index.js:755 | | keep |++| POST | /account-deletions/:id/confirmations | server/identity/account-data.js:547 | | keep |++| POST | /account-exports/:id/parts | server/identity/account-data.js:539 | | keep || POST | /admin | server/setup/routes.js:114 | | keep |--| GET | /api/.well-known/jwks | server/index.js:442 | | keep |++| GET | /api/.well-known/jwks | server/index.js:500 | | keep || GET | /api/admin/domains | server/domains/routes.js:176 | | keep || GET | /api/admin/domains | server/domains/routes.js:197 | | keep || POST | /api/admin/domains | server/domains/routes.js:224 | | keep |@@@ -742,8 +750,16 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/admin/integrations/github | server/integrations/github.js:50 | | keep || PUT | /api/admin/integrations/github | server/integrations/github.js:51 | | keep || POST | /api/admin/integrations/github/test | server/integrations/github.js:65 | | keep |++| GET | /api/admin/mods | server/identity/mod-principals.js:178 | | keep |++| GET | /api/admin/mods | server/identity/mod-principals.js:197 | | keep |++| POST | /api/admin/mods | server/identity/mod-principals.js:184 | | keep |++| GET | /api/admin/mods/:id | server/identity/mod-principals.js:183 | | keep |++| POST | /api/admin/mods/:id/grants | server/identity/mod-principals.js:185 | | keep |++| POST | /api/admin/mods/:id/grants | server/identity/mod-principals.js:201 | | keep |++| POST | /api/admin/mods/:id/revoke | server/identity/mod-principals.js:186 | | keep |++| POST | /api/admin/mods/:id/revoke | server/identity/mod-principals.js:210 | | keep || GET | /api/admin/operator-checklist | server/admin/operator-checklist.js:70 | | keep |--| GET | /api/admin/ssh-info | server/index.js:566 | | keep |++| GET | /api/admin/ssh-info | server/index.js:627 | | keep || GET | /api/admin/themes | server/themes/routes.js:64 | | keep || GET | /api/admin/themes | server/themes/routes.js:233 | | keep || POST | /api/admin/themes | server/themes/routes.js:217 | | keep |@@@ -755,12 +771,12 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/admin/themes/me/active | server/themes/routes.js:98 | | keep || PUT | /api/admin/themes/me/display | server/themes/routes.js:123 | | keep || GET | /api/admin/themes/me/submissions | server/themes/routes.js:133 | | keep |--| GET | /api/auth/anon-identities | server/auth/routes.js:667 | | keep |--| POST | /api/auth/anon-session | server/auth/routes.js:538 | | keep |--| GET | /api/auth/anon/:token | server/auth/routes.js:608 | | keep |--| POST | /api/auth/anon/:token/link | server/auth/routes.js:645 | | keep |--| PUT | /api/auth/anon/:token/preferences | server/auth/routes.js:622 | | keep |--| POST | /api/auth/change-password | server/auth/routes.js:431 | | keep |++| GET | /api/auth/anon-identities | server/auth/routes.js:679 | | keep |++| POST | /api/auth/anon-session | server/auth/routes.js:550 | | keep |++| GET | /api/auth/anon/:token | server/auth/routes.js:620 | | keep |++| POST | /api/auth/anon/:token/link | server/auth/routes.js:657 | | keep |++| PUT | /api/auth/anon/:token/preferences | server/auth/routes.js:634 | | keep |++| POST | /api/auth/change-password | server/auth/routes.js:443 | | keep || GET | /api/auth/discord/callback | server/auth/discord-link.js:61 | | keep || DELETE | /api/auth/discord/link | server/auth/discord-link.js:158 | | keep || GET | /api/auth/discord/link | server/auth/discord-link.js:31 | | keep |@@@ -768,25 +784,25 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /api/auth/email/send-verification | server/auth/email-verify.js:99 | | keep || GET | /api/auth/email/status | server/auth/email-verify.js:83 | | keep || POST | /api/auth/email/verify | server/auth/email-verify.js:122 | | keep |--| POST | /api/auth/forgot-password | server/auth/routes.js:213 | | keep |--| POST | /api/auth/login | server/auth/routes.js:190 | | keep |--| POST | /api/auth/logout | server/auth/routes.js:532 | | keep |--| GET | /api/auth/me | server/auth/routes.js:370 | | keep |--| PUT | /api/auth/profile | server/auth/routes.js:381 | | keep |--| POST | /api/auth/refresh | server/auth/routes.js:305 | | keep |--| POST | /api/auth/register | server/auth/routes.js:93 | | keep |--| POST | /api/auth/reset-password | server/auth/routes.js:261 | | keep |--| GET | /api/auth/reset-password/validate | server/auth/routes.js:245 | | keep |--| DELETE | /api/auth/sessions | server/auth/routes.js:750 | | keep |--| GET | /api/auth/sessions | server/auth/routes.js:705 | | keep |--| POST | /api/auth/sessions | server/auth/routes.js:718 | | keep |--| DELETE | /api/auth/sessions/:id | server/auth/routes.js:740 | | keep |--| POST | /api/auth/sign-out-everywhere | server/auth/routes.js:520 | | keep |--| GET | /api/auth/users/:id/card | server/auth/routes.js:765 | | keep |--| DELETE | /api/auth/users/:id/follow | server/auth/routes.js:848 | | keep |--| POST | /api/auth/users/:id/follow | server/auth/routes.js:817 | | keep |--| GET | /api/brand | server/index.js:468 | | keep |--| GET | /api/catalog.json | server/index.js:532 | | keep |++| POST | /api/auth/forgot-password | server/auth/routes.js:225 | | keep |++| POST | /api/auth/login | server/auth/routes.js:199 | | keep |++| POST | /api/auth/logout | server/auth/routes.js:544 | | keep |++| GET | /api/auth/me | server/auth/routes.js:382 | | keep |++| PUT | /api/auth/profile | server/auth/routes.js:393 | | keep |++| POST | /api/auth/refresh | server/auth/routes.js:317 | | keep |++| POST | /api/auth/register | server/auth/routes.js:102 | | keep |++| POST | /api/auth/reset-password | server/auth/routes.js:273 | | keep |++| GET | /api/auth/reset-password/validate | server/auth/routes.js:257 | | keep |++| DELETE | /api/auth/sessions | server/auth/routes.js:762 | | keep |++| GET | /api/auth/sessions | server/auth/routes.js:717 | | keep |++| POST | /api/auth/sessions | server/auth/routes.js:730 | | keep |++| DELETE | /api/auth/sessions/:id | server/auth/routes.js:752 | | keep |++| POST | /api/auth/sign-out-everywhere | server/auth/routes.js:532 | | keep |++| GET | /api/auth/users/:id/card | server/auth/routes.js:777 | | keep |++| DELETE | /api/auth/users/:id/follow | server/auth/routes.js:860 | | keep |++| POST | /api/auth/users/:id/follow | server/auth/routes.js:829 | | keep |++| GET | /api/brand | server/index.js:529 | | keep |++| GET | /api/catalog.json | server/index.js:593 | | keep || GET | /api/chrome | server/frame/service.js:178 | | keep || POST | /api/chrome/hit | server/frame/service.js:191 | | keep || GET | /api/domains | server/domains/routes.js:176 | | keep |@@@ -798,20 +814,20 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /api/domains/check | server/domains/routes.js:217 | | keep || GET | /api/frame | server/frame/service.js:178 | | keep || POST | /api/frame/hit | server/frame/service.js:191 | | keep |--| GET | /api/health | server/index.js:454 | | keep |++| GET | /api/health | server/index.js:515 | | keep || DELETE | /api/history | server/history/routes.js:143 | | keep || GET | /api/history | server/history/routes.js:92 | | keep || POST | /api/history | server/history/routes.js:108 | | keep || DELETE | /api/history/:id | server/history/routes.js:148 | | keep || PUT | /api/history/settings | server/history/routes.js:137 | | keep |--| GET | /api/modules | server/identity/modules.js:327 | | keep |--| DELETE | /api/modules/:ns | server/identity/modules.js:352 | | keep |--| GET | /api/modules/:ns | server/identity/modules.js:335 | | keep |--| PUT | /api/modules/:ns | server/identity/modules.js:343 | | keep |--| GET | /api/modules/:ns/public/:subject | server/identity/modules.js:319 | | keep |--| DELETE | /api/modules/modules/:ns/:subject | server/identity/modules.js:390 | | keep |--| GET | /api/modules/modules/:ns/:subject | server/identity/modules.js:367 | | keep |--| PUT | /api/modules/modules/:ns/:subject | server/identity/modules.js:379 | | keep |++| GET | /api/modules | server/identity/modules.js:345 | | keep |++| DELETE | /api/modules/:ns | server/identity/modules.js:370 | | keep |++| GET | /api/modules/:ns | server/identity/modules.js:353 | | keep |++| PUT | /api/modules/:ns | server/identity/modules.js:361 | | keep |++| GET | /api/modules/:ns/public/:subject | server/identity/modules.js:337 | | keep |++| DELETE | /api/modules/modules/:ns/:subject | server/identity/modules.js:408 | | keep |++| GET | /api/modules/modules/:ns/:subject | server/identity/modules.js:385 | | keep |++| PUT | /api/modules/modules/:ns/:subject | server/identity/modules.js:397 | | keep || DELETE | /api/profile/avatar | server/profile/avatar.js:107 | | keep || PUT | /api/profile/avatar | server/profile/avatar.js:96 | | keep || GET | /api/profile/avatar/:username | server/profile/avatar.js:110 | | keep |@@@ -820,8 +836,8 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /api/push/subscribe | server/push/routes.js:17 | | keep || POST | /api/push/unsubscribe | server/push/routes.js:29 | | keep || GET | /api/push/vapid-key | server/push/routes.js:10 | | keep |--| GET | /api/ready | server/index.js:464 | | keep |--| GET | /api/sso/targets | server/index.js:514 | | keep |++| GET | /api/ready | server/index.js:525 | | keep |++| GET | /api/sso/targets | server/index.js:575 | | keep || GET | /api/themes | server/themes/routes.js:64 | | keep || GET | /api/themes | server/themes/routes.js:233 | | keep || POST | /api/themes | server/themes/routes.js:217 | | keep |@@@ -834,39 +850,55 @@ Owner = the repository whose code answers the route; target = the authority it b| PUT | /api/themes/me/display | server/themes/routes.js:123 | | keep || GET | /api/themes/me/submissions | server/themes/routes.js:133 | | keep || GET | /api/v1/changelog | server/updates/routes.js:51 | | keep |++| GET | /api/v1/creators/:creator/analytics | server/analytics/creators.js:121 | | keep |++| GET | /api/v1/follows | server/identity/follows.js:262 | | keep |++| DELETE | /api/v1/follows/:type/:target | server/identity/follows.js:278 | | keep |++| DELETE | /api/v1/follows/:type/:target | server/identity/follows.js:337 | | keep |++| GET | /api/v1/follows/:type/:target | server/identity/follows.js:291 | | keep |++| PUT | /api/v1/follows/:type/:target | server/identity/follows.js:268 | | keep |++| PUT | /api/v1/follows/:type/:target | server/identity/follows.js:324 | | keep |++| GET | /api/v1/follows/:type/:target/followers | server/identity/follows.js:304 | | keep || GET | /api/v1/me/blocks | server/identity/blocks.js:159 | | keep || DELETE | /api/v1/me/blocks/:target | server/identity/blocks.js:175 | | keep || PUT | /api/v1/me/blocks/:target | server/identity/blocks.js:164 | | keep |--| GET | /api/v1/projects | server/developer/routes.js:86 | | keep |--| POST | /api/v1/projects | server/developer/routes.js:85 | | keep |--| GET | /api/v1/projects/:project | server/developer/routes.js:87 | | keep |--| PATCH | /api/v1/projects/:project | server/developer/routes.js:91 | | keep |--| PUT | /api/v1/projects/:project/allowance | server/developer/routes.js:93 | | keep |--| GET | /api/v1/projects/:project/apps | server/developer/routes.js:101 | | keep |--| POST | /api/v1/projects/:project/apps | server/developer/routes.js:102 | | keep |--| DELETE | /api/v1/projects/:project/apps/:app | server/developer/routes.js:105 | | keep |--| GET | /api/v1/projects/:project/apps/:app | server/developer/routes.js:103 | | keep |--| PATCH | /api/v1/projects/:project/apps/:app | server/developer/routes.js:104 | | keep |--| GET | /api/v1/projects/:project/apps/:app/credentials | server/developer/routes.js:107 | | keep |--| POST | /api/v1/projects/:project/apps/:app/credentials/:credential/revoke | server/developer/routes.js:109 | | keep |--| POST | /api/v1/projects/:project/apps/:app/credentials/rotate | server/developer/routes.js:108 | | keep |--| GET | /api/v1/projects/:project/apps/:app/grants | server/developer/routes.js:111 | | keep |--| POST | /api/v1/projects/:project/apps/:app/grants | server/developer/routes.js:112 | | keep |--| DELETE | /api/v1/projects/:project/apps/:app/grants/:capability | server/developer/routes.js:115 | | keep |--| POST | /api/v1/projects/:project/apps/:app/grants/:capability/approve | server/developer/routes.js:113 | | keep |--| POST | /api/v1/projects/:project/apps/:app/grants/:capability/deny | server/developer/routes.js:114 | | keep |--| POST | /api/v1/projects/:project/archive | server/developer/routes.js:92 | | keep |--| GET | /api/v1/projects/:project/audit | server/developer/routes.js:121 | | keep |--| PUT | /api/v1/projects/:project/environment-policy | server/developer/routes.js:94 | | keep |--| POST | /api/v1/projects/:project/export-tokens | server/developer/routes.js:127 | | keep |--| GET | /api/v1/projects/:project/members | server/developer/routes.js:96 | | keep |--| POST | /api/v1/projects/:project/members | server/developer/routes.js:97 | | keep |--| DELETE | /api/v1/projects/:project/members/:subject | server/developer/routes.js:99 | | keep |--| PATCH | /api/v1/projects/:project/members/:subject | server/developer/routes.js:98 | | keep |--| GET | /api/v1/projects/:project/quotas | server/developer/routes.js:117 | | keep |--| DELETE | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:119 | | keep |--| PUT | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:118 | | keep |--| GET | /api/v1/projects/catalog | server/developer/routes.js:79 | | keep |++| GET | /api/v1/me/follows | server/identity/follows.js:262 | | keep |++| DELETE | /api/v1/me/follows/:type/:target | server/identity/follows.js:278 | | keep |++| DELETE | /api/v1/me/follows/:type/:target | server/identity/follows.js:337 | | keep |++| GET | /api/v1/me/follows/:type/:target | server/identity/follows.js:291 | | keep |++| PUT | /api/v1/me/follows/:type/:target | server/identity/follows.js:268 | | keep |++| PUT | /api/v1/me/follows/:type/:target | server/identity/follows.js:324 | | keep |++| GET | /api/v1/me/follows/:type/:target/followers | server/identity/follows.js:304 | | keep |++| GET | /api/v1/projects | server/developer/routes.js:89 | | keep |++| POST | /api/v1/projects | server/developer/routes.js:88 | | keep |++| GET | /api/v1/projects/:project | server/developer/routes.js:90 | | keep |++| PATCH | /api/v1/projects/:project | server/developer/routes.js:94 | | keep |++| PUT | /api/v1/projects/:project/allowance | server/developer/routes.js:96 | | keep |++| GET | /api/v1/projects/:project/apps | server/developer/routes.js:104 | | keep |++| POST | /api/v1/projects/:project/apps | server/developer/routes.js:105 | | keep |++| DELETE | /api/v1/projects/:project/apps/:app | server/developer/routes.js:108 | | keep |++| GET | /api/v1/projects/:project/apps/:app | server/developer/routes.js:106 | | keep |++| PATCH | /api/v1/projects/:project/apps/:app | server/developer/routes.js:107 | | keep |++| GET | /api/v1/projects/:project/apps/:app/credentials | server/developer/routes.js:110 | | keep |++| POST | /api/v1/projects/:project/apps/:app/credentials/:credential/revoke | server/developer/routes.js:112 | | keep |++| POST | /api/v1/projects/:project/apps/:app/credentials/rotate | server/developer/routes.js:111 | | keep |++| GET | /api/v1/projects/:project/apps/:app/grants | server/developer/routes.js:114 | | keep |++| POST | /api/v1/projects/:project/apps/:app/grants | server/developer/routes.js:115 | | keep |++| DELETE | /api/v1/projects/:project/apps/:app/grants/:capability | server/developer/routes.js:118 | | keep |++| POST | /api/v1/projects/:project/apps/:app/grants/:capability/approve | server/developer/routes.js:116 | | keep |++| POST | /api/v1/projects/:project/apps/:app/grants/:capability/deny | server/developer/routes.js:117 | | keep |++| POST | /api/v1/projects/:project/archive | server/developer/routes.js:95 | | keep |++| GET | /api/v1/projects/:project/audit | server/developer/routes.js:130 | | keep |++| PUT | /api/v1/projects/:project/environment-policy | server/developer/routes.js:97 | | keep |++| POST | /api/v1/projects/:project/export-tokens | server/developer/routes.js:136 | | keep |++| GET | /api/v1/projects/:project/members | server/developer/routes.js:99 | | keep |++| POST | /api/v1/projects/:project/members | server/developer/routes.js:100 | | keep |++| DELETE | /api/v1/projects/:project/members/:subject | server/developer/routes.js:102 | | keep |++| PATCH | /api/v1/projects/:project/members/:subject | server/developer/routes.js:101 | | keep |++| GET | /api/v1/projects/:project/quotas | server/developer/routes.js:120 | | keep |++| DELETE | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:122 | | keep |++| PUT | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:121 | | keep |++| GET | /api/v1/projects/:project/usage | server/developer/routes.js:125 | | keep |++| GET | /api/v1/projects/catalog | server/developer/routes.js:82 | | keep || POST | /api/v1/realtime/ticket | server/auth/realtime-ticket.js:63 | | keep || GET | /api/v1/registry | server/registry/ecosystem.js:318 | | keep || GET | /api/v1/registry/capabilities | server/registry/ecosystem.js:343 | | keep |@@@ -887,28 +919,34 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/v1/staff/capabilities | server/admin/staff-api.js:34 | | keep || GET | /api/v1/staff/moderation-audit | server/admin/moderation-audit.js:140 | | keep || GET | /api/v1/staff/moderators | server/admin/staff-api.js:45 | | keep |--| GET | /api/v1/status | server/status/routes.js:228 | | keep |--| GET | /api/v1/status/slo | server/status/routes.js:245 | | keep |--| GET | /api/v1/users/names/:name | server/index.js:396 | | keep |++| GET | /api/v1/status | server/status/routes.js:242 | | keep |++| GET | /api/v1/status/incidents | server/status/incidents.js:128 | | keep |++| POST | /api/v1/status/incidents | server/status/incidents.js:153 | | keep |++| POST | /api/v1/status/incidents/:id/updates | server/status/incidents.js:154 | | keep |++| GET | /api/v1/status/slo | server/status/routes.js:259 | | keep |++| GET | /api/v1/users/names/:name | server/index.js:404 | | keep || POST | /api/webhooks/resend | server/notifications/resend-webhook.js:26 | | keep |--| GET | /audit | server/admin/routes.js:870 | | keep |++| GET | /audit | server/admin/routes.js:872 | | keep || DELETE | /avatar | server/profile/avatar.js:107 | | keep || PUT | /avatar | server/profile/avatar.js:96 | | keep || GET | /avatar/:username | server/profile/avatar.js:110 | | keep || POST | /bootstrap | server/setup/routes.js:99 | | keep || GET | /bots | server/admin/analytics-routes.js:255 | | keep |--| POST | /broadcast | server/admin/routes.js:794 | | keep |++| POST | /broadcast | server/admin/routes.js:796 | | keep || GET | /certs | server/deploy/routes.js:139 | | keep || POST | /certs/issue-cloudflare | server/deploy/routes.js:164 | | keep || POST | /certs/issue-manual | server/deploy/routes.js:236 | | keep || POST | /certs/manual-info | server/deploy/routes.js:215 | | keep || POST | /certs/renew | server/deploy/routes.js:281 | | keep |--| GET | /config | server/admin/routes.js:379 | | keep |++| GET | /config | server/admin/routes.js:380 | | keep || GET | /config | server/deploy/routes.js:81 | | keep || PUT | /config | server/deploy/routes.js:95 | | keep |--| GET | /config/:namespace | server/admin/routes.js:380 | | keep |--| GET | /config/:namespace/history | server/admin/routes.js:381 | | keep |--| POST | /config/:namespace/rollback | server/admin/routes.js:382 | | keep |++| GET | /config/:namespace | server/admin/routes.js:381 | | keep |++| GET | /config/:namespace/history | server/admin/routes.js:382 | | keep |++| POST | /config/:namespace/rollback | server/admin/routes.js:383 | | keep |++| DELETE | /deletion | server/identity/account-data.js:531 | | keep |++| GET | /deletion | server/identity/account-data.js:520 | | keep |++| POST | /deletion | server/identity/account-data.js:525 | | keep || POST | /deploy | server/setup/routes.js:239 | | keep || GET | /deploy-status | server/setup/routes.js:309 | | keep || GET | /domains | server/deploy/routes.js:406 | | keep |@@@ -916,65 +954,81 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /email | server/admin/routes.js:229 | | keep || PUT | /email | server/admin/routes.js:239 | | keep || POST | /email/test | server/admin/routes.js:281 | | keep |++| GET | /export | server/identity/account-data.js:498 | | keep |++| POST | /export | server/identity/account-data.js:490 | | keep |++| GET | /export/:id | server/identity/account-data.js:503 | | keep |++| GET | /export/:id/download | server/identity/account-data.js:509 | | keep || GET | /fedcm/accounts | server/auth/fedcm.js:111 | | keep || POST | /fedcm/assertion | server/auth/fedcm.js:125 | | keep || GET | /fedcm/client-metadata | server/auth/fedcm.js:120 | | keep || GET | /fedcm/config.json | server/auth/fedcm.js:97 | | keep || POST | /fedcm/disconnect | server/auth/fedcm.js:142 | | keep |--| GET | /health | server/admin/routes.js:839 | | keep |++| GET | /health | server/admin/routes.js:841 | | keep || POST | /identity | server/setup/routes.js:152 | | keep |--| GET | /internal/anon-admin | server/internal/routes.js:661 | | keep |--| GET | /internal/anon-list | server/internal/routes.js:710 | | keep |--| POST | /internal/audit | server/internal/routes.js:224 | | keep |--| GET | /internal/blocks | server/index.js:408 | | keep |--| POST | /internal/coins/credit | server/internal/routes.js:316 | | keep |--| POST | /internal/coins/debit | server/internal/routes.js:328 | | keep |--| GET | /internal/coins/stats | server/internal/routes.js:275 | | keep |--| POST | /internal/coins/transfer | server/internal/routes.js:341 | | keep |--| POST | /internal/events/stream-live | server/internal/routes.js:359 | OpenVibe.Events | compat |++| GET | /internal/anon-admin | server/internal/routes.js:685 | | keep |++| GET | /internal/anon-list | server/internal/routes.js:734 | | keep |++| POST | /internal/audit | server/internal/routes.js:226 | | keep |++| GET | /internal/blocks | server/index.js:452 | | keep |++| POST | /internal/coins/credit | server/internal/routes.js:322 | | keep |++| POST | /internal/coins/debit | server/internal/routes.js:334 | | keep |++| GET | /internal/coins/stats | server/internal/routes.js:281 | | keep |++| POST | /internal/coins/transfer | server/internal/routes.js:347 | | keep |++| POST | /internal/events/stream-live | server/internal/routes.js:365 | OpenVibe.Events | compat || POST | /internal/identity/legacy-map | server/identity/internal-routes.js:52 | | keep |--| POST | /internal/identity/legacy-map | server/internal/routes.js:84 | | keep |++| POST | /internal/identity/legacy-map | server/internal/routes.js:86 | | keep || GET | /internal/identity/resolve | server/identity/internal-routes.js:18 | | keep |--| GET | /internal/identity/resolve | server/internal/routes.js:80 | | keep |++| GET | /internal/identity/resolve | server/internal/routes.js:82 | | keep || POST | /internal/identity/resolve-batch | server/identity/internal-routes.js:35 | | keep |--| POST | /internal/identity/resolve-batch | server/internal/routes.js:81 | | keep |--| GET | /internal/integrations/github-token | server/index.js:404 | | keep |--| POST | /internal/issue-token | server/internal/routes.js:551 | | keep |--| POST | /internal/link-account | server/internal/routes.js:166 | | keep |--| POST | /internal/notifications/mark-read | server/internal/routes.js:512 | | keep |--| POST | /internal/notifications/push | server/internal/routes.js:454 | | keep |--| POST | /internal/notifications/push-bulk | server/internal/routes.js:474 | | keep |--| POST | /internal/notifications/resolve-users | server/internal/routes.js:531 | | keep |--| GET | /internal/notifications/unread/:userId | server/internal/routes.js:497 | | keep |--| POST | /internal/resolve-anon | server/internal/routes.js:582 | | keep |--| GET | /internal/stats | server/internal/routes.js:233 | | keep |--| GET | /internal/url-registry/resolved | server/internal/routes.js:244 | | keep |--| POST | /internal/user-avatar | server/internal/routes.js:209 | | keep |--| GET | /internal/users/:id | server/internal/routes.js:116 | | keep |--| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:217 | | keep |--| GET | /internal/users/:id/theme | server/internal/routes.js:153 | | keep |--| POST | /internal/users/bulk | server/internal/routes.js:138 | | keep |--| GET | /internal/users/by-username/:username | server/internal/routes.js:127 | | keep |--| POST | /internal/verify-token | server/internal/routes.js:92 | | keep |--| GET | /llms.txt | server/index.js:672 | | keep |++| POST | /internal/identity/resolve-batch | server/internal/routes.js:83 | | keep |++| GET | /internal/integrations/github-token | server/index.js:412 | | keep |++| POST | /internal/issue-token | server/internal/routes.js:575 | | keep |++| POST | /internal/link-account | server/internal/routes.js:168 | | keep |++| GET | /internal/mods | server/identity/mod-principals.js:178 | | keep |++| GET | /internal/mods | server/identity/mod-principals.js:197 | | keep |++| POST | /internal/mods | server/identity/mod-principals.js:184 | | keep |++| GET | /internal/mods/:id | server/identity/mod-principals.js:183 | | keep |++| POST | /internal/mods/:id/grants | server/identity/mod-principals.js:185 | | keep |++| POST | /internal/mods/:id/grants | server/identity/mod-principals.js:201 | | keep |++| POST | /internal/mods/:id/revoke | server/identity/mod-principals.js:186 | | keep |++| POST | /internal/mods/:id/revoke | server/identity/mod-principals.js:210 | | keep |++| POST | /internal/notifications/mark-read | server/internal/routes.js:536 | | keep |++| POST | /internal/notifications/push | server/internal/routes.js:460 | | keep |++| POST | /internal/notifications/push-bulk | server/internal/routes.js:480 | | keep |++| POST | /internal/notifications/resolve-users | server/internal/routes.js:555 | | keep |++| GET | /internal/notifications/unread/:userId | server/internal/routes.js:521 | | keep |++| POST | /internal/operator/alerts | server/internal/routes.js:505 | | keep |++| POST | /internal/resolve-anon | server/internal/routes.js:606 | | keep |++| GET | /internal/stats | server/internal/routes.js:235 | | keep |++| GET | /internal/url-registry/resolved | server/internal/routes.js:247 | | keep |++| POST | /internal/user-avatar | server/internal/routes.js:211 | | keep |++| GET | /internal/users/:id | server/internal/routes.js:118 | | keep |++| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:219 | | keep |++| GET | /internal/users/:id/theme | server/internal/routes.js:155 | | keep |++| POST | /internal/users/bulk | server/internal/routes.js:140 | | keep |++| GET | /internal/users/by-username/:username | server/internal/routes.js:129 | | keep |++| POST | /internal/verify-token | server/internal/routes.js:94 | | keep |++| GET | /llms.txt | server/index.js:733 | | keep || GET | /me | server/coins/routes.js:18 | | keep || GET | /me/history | server/coins/routes.js:24 | | keep |--| GET | /net-config | server/admin/routes.js:980 | | keep |--| PUT | /net-config | server/admin/routes.js:999 | | keep |++| POST | /merge | server/identity/account-merge.js:293 | | keep |++| POST | /merge/intents | server/identity/account-merge.js:289 | | keep |++| GET | /merges | server/identity/account-merge.js:296 | | keep |++| GET | /net-config | server/admin/routes.js:982 | | keep |++| PUT | /net-config | server/admin/routes.js:1001 | | keep || GET | /newest | server/notifications/routes.js:57 | | keep || POST | /nginx/apply | server/deploy/routes.js:343 | | keep || GET | /nginx/preview | server/deploy/routes.js:296 | | keep || GET | /nginx/preview/:serviceId | server/deploy/routes.js:314 | | keep || POST | /nginx/reload | server/deploy/routes.js:382 | | keep || POST | /nginx/validate | server/deploy/routes.js:330 | | keep |--| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:421 | | keep |++| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:422 | | keep || GET | /oauth/authorize | server/auth/oauth-routes.js:56 | | keep || GET | /oauth/client-info | server/auth/oauth-routes.js:130 | | keep || POST | /oauth/confirm | server/auth/oauth-routes.js:155 | | keep || POST | /oauth/token | server/auth/oauth-routes.js:215 | | keep |--| GET | /oauth/userinfo | server/auth/oauth-routes.js:425 | | keep |--| POST | /oauth/userinfo | server/auth/oauth-routes.js:426 | | keep |--| GET | /openvibe-sw.js | server/index.js:717 | | keep |++| GET | /oauth/userinfo | server/auth/oauth-routes.js:426 | | keep |++| POST | /oauth/userinfo | server/auth/oauth-routes.js:427 | | keep |++| GET | /openvibe-sw.js | server/index.js:778 | | keep || GET | /overview | server/admin/analytics-routes.js:75 | | keep || GET | /preferences | server/notifications/routes.js:121 | | keep || PUT | /preferences | server/notifications/routes.js:132 | | keep |@@@ -984,39 +1038,39 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /read-batch | server/notifications/routes.js:78 | | keep || GET | /realtime | server/admin/analytics-routes.js:285 | | keep || POST | /reinit | server/discord/routes.js:111 | | keep |--| POST | /reset-db | server/admin/routes.js:518 | | keep |++| POST | /reset-db | server/admin/routes.js:520 | | keep || GET | /secrets | server/admin/routes.js:298 | | keep || GET | /service/:name | server/admin/analytics-routes.js:224 | | keep || GET | /settings | server/admin/routes.js:303 | | keep |--| PUT | /settings | server/admin/routes.js:340 | | keep |--| GET | /sso/check | server/index.js:701 | | keep |++| PUT | /settings | server/admin/routes.js:341 | | keep |++| GET | /sso/check | server/index.js:762 | | keep || GET | /status | server/setup/routes.js:91 | | keep |--| GET | /status | server/status/routes.js:248 | | keep |++| GET | /status | server/status/routes.js:262 | | keep || POST | /test | server/discord/routes.js:92 | | keep || POST | /test-live | server/discord/routes.js:102 | | keep |--| GET | /tos | server/index.js:528 | | keep |++| GET | /tos | server/index.js:589 | | keep || GET | /unread-by-category | server/notifications/routes.js:47 | | keep || GET | /unread-count | server/notifications/routes.js:37 | | keep || GET | /updates | server/updates/routes.js:59 | | keep |--| GET | /url-registry | server/admin/routes.js:398 | | keep |--| PUT | /url-registry | server/admin/routes.js:425 | | keep |--| DELETE | /url-registry/:key | server/admin/routes.js:468 | | keep |--| PUT | /url-registry/:key | server/admin/routes.js:446 | | keep |--| POST | /url-registry/:key/reset | server/admin/routes.js:503 | | keep |--| POST | /url-registry/refresh-all | server/admin/routes.js:483 | | keep |++| GET | /url-registry | server/admin/routes.js:399 | | keep |++| PUT | /url-registry | server/admin/routes.js:427 | | keep |++| DELETE | /url-registry/:key | server/admin/routes.js:470 | | keep |++| PUT | /url-registry/:key | server/admin/routes.js:448 | | keep |++| POST | /url-registry/:key/reset | server/admin/routes.js:505 | | keep |++| POST | /url-registry/refresh-all | server/admin/routes.js:485 | | keep || POST | /urls | server/setup/routes.js:193 | | keep |--| GET | /users | server/admin/routes.js:580 | | keep |--| PUT | /users/:id/ban | server/admin/routes.js:733 | | keep |--| PUT | /users/:id/email | server/admin/routes.js:612 | | keep |--| PUT | /users/:id/role | server/admin/routes.js:710 | | keep |--| POST | /users/:id/send-reset | server/admin/routes.js:651 | | keep |--| POST | /users/:id/sign-out | server/admin/routes.js:776 | | keep |--| PUT | /users/:id/username | server/admin/routes.js:762 | | keep |--| POST | /users/grant-admin | server/admin/routes.js:545 | | keep |--| GET | /verification-keys | server/admin/routes.js:897 | | keep |--| POST | /verification-keys | server/admin/routes.js:906 | | keep |--| DELETE | /verification-keys/:id | server/admin/routes.js:954 | | keep |--| GET | /verify-email | server/index.js:684 | | keep |++| GET | /users | server/admin/routes.js:582 | | keep |++| PUT | /users/:id/ban | server/admin/routes.js:735 | | keep |++| PUT | /users/:id/email | server/admin/routes.js:614 | | keep |++| PUT | /users/:id/role | server/admin/routes.js:712 | | keep |++| POST | /users/:id/send-reset | server/admin/routes.js:653 | | keep |++| POST | /users/:id/sign-out | server/admin/routes.js:778 | | keep |++| PUT | /users/:id/username | server/admin/routes.js:764 | | keep |++| POST | /users/grant-admin | server/admin/routes.js:547 | | keep |++| GET | /verification-keys | server/admin/routes.js:899 | | keep |++| POST | /verification-keys | server/admin/routes.js:908 | | keep |++| DELETE | /verification-keys/:id | server/admin/routes.js:956 | | keep |++| GET | /verify-email | server/index.js:745 | | keep |## OpenVibe.Shared@@@ -1029,37 +1083,40 @@ Owner = the repository whose code answers the route; target = the authority it b| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | /api/ready | server/observability.js:153 | | keep |--| GET | /api/v1/:app/admin/storage | server/admin/routes.js:87 | | keep |--| GET | /api/v1/:app/admin/storage/buckets | server/admin/routes.js:639 | | keep |--| GET | /api/v1/:app/admin/storage/holds | server/admin/routes.js:537 | | keep |--| POST | /api/v1/:app/admin/storage/holds | server/admin/routes.js:558 | | keep |--| DELETE | /api/v1/:app/admin/storage/holds/:holdId | server/admin/routes.js:598 | | keep |--| POST | /api/v1/:app/admin/storage/holds/:holdId/release | server/admin/routes.js:597 | | keep |--| GET | /api/v1/:app/admin/storage/ops | server/admin/routes.js:613 | | keep |--| POST | /api/v1/:app/admin/storage/ops/recompute | server/admin/routes.js:624 | | keep |--| GET | /api/v1/:app/admin/storage/tiers | server/admin/routes.js:273 | | keep |--| POST | /api/v1/:app/admin/storage/tiers/bulk-move | server/admin/routes.js:465 | | keep |--| GET | /api/v1/:app/admin/storage/tiers/decisions | server/admin/routes.js:394 | | keep |--| POST | /api/v1/:app/admin/storage/tiers/move | server/admin/routes.js:447 | | keep |--| GET | /api/v1/:app/admin/storage/tiers/policy | server/admin/routes.js:367 | | keep |--| PUT | /api/v1/:app/admin/storage/tiers/settings | server/admin/routes.js:323 | | keep |--| POST | /api/v1/:app/admin/storage/tiers/sweep | server/admin/routes.js:419 | | keep |--| GET | /api/v1/:app/admin/storage/vods | server/admin/routes.js:142 | | keep |--| DELETE | /api/v1/:app/admin/storage/vods/bulk | server/admin/routes.js:214 | | keep |++| GET | /api/ready | server/observability.js:156 | | keep |++| GET | /api/v1/:app/admin/storage | server/admin/routes.js:102 | | keep |++| GET | /api/v1/:app/admin/storage/buckets | server/admin/routes.js:692 | | keep |++| GET | /api/v1/:app/admin/storage/holds | server/admin/routes.js:590 | | keep |++| POST | /api/v1/:app/admin/storage/holds | server/admin/routes.js:611 | | keep |++| DELETE | /api/v1/:app/admin/storage/holds/:holdId | server/admin/routes.js:651 | | keep |++| POST | /api/v1/:app/admin/storage/holds/:holdId/release | server/admin/routes.js:650 | | keep |++| GET | /api/v1/:app/admin/storage/ops | server/admin/routes.js:666 | | keep |++| POST | /api/v1/:app/admin/storage/ops/recompute | server/admin/routes.js:677 | | keep |++| GET | /api/v1/:app/admin/storage/tiers | server/admin/routes.js:288 | | keep |++| POST | /api/v1/:app/admin/storage/tiers/bulk-move | server/admin/routes.js:518 | | keep |++| GET | /api/v1/:app/admin/storage/tiers/decisions | server/admin/routes.js:410 | | keep |++| POST | /api/v1/:app/admin/storage/tiers/move | server/admin/routes.js:500 | | keep |++| GET | /api/v1/:app/admin/storage/tiers/objects/decisions | server/admin/routes.js:458 | | keep |++| GET | /api/v1/:app/admin/storage/tiers/objects/policy | server/admin/routes.js:439 | | keep |++| GET | /api/v1/:app/admin/storage/tiers/policy | server/admin/routes.js:383 | | keep |++| PUT | /api/v1/:app/admin/storage/tiers/settings | server/admin/routes.js:338 | | keep |++| POST | /api/v1/:app/admin/storage/tiers/sweep | server/admin/routes.js:472 | | keep |++| GET | /api/v1/:app/admin/storage/vods | server/admin/routes.js:157 | | keep |++| DELETE | /api/v1/:app/admin/storage/vods/bulk | server/admin/routes.js:229 | | keep || GET | /api/v1/:app/assets | server/assets/routes.js:72 | | keep || POST | /api/v1/:app/assets | server/assets/routes.js:39 | | keep || DELETE | /api/v1/:app/assets/:id | server/assets/routes.js:84 | | keep |--| GET | /api/v1/:app/clips | server/vod/clips-routes.js:288 | | keep |--| POST | /api/v1/:app/clips | server/vod/clips-routes.js:124 | | keep |--| DELETE | /api/v1/:app/clips/:id | server/vod/clips-routes.js:380 | | keep |--| GET | /api/v1/:app/clips/:id | server/vod/clips-routes.js:317 | | keep |--| PUT | /api/v1/:app/clips/:id | server/vod/clips-routes.js:357 | | keep |--| POST | /api/v1/:app/clips/:id/recut | server/vod/clips-routes.js:340 | | keep |--| GET | /api/v1/:app/files | server/files/routes.js:152 | | keep |--| POST | /api/v1/:app/files | server/files/routes.js:88 | | keep |--| DELETE | /api/v1/:app/files/:key | server/files/routes.js:180 | | keep |--| GET | /api/v1/:app/files/:key | server/files/routes.js:169 | | keep |++| GET | /api/v1/:app/clips | server/vod/clips-routes.js:302 | | keep |++| POST | /api/v1/:app/clips | server/vod/clips-routes.js:138 | | keep |++| DELETE | /api/v1/:app/clips/:id | server/vod/clips-routes.js:403 | | keep |++| GET | /api/v1/:app/clips/:id | server/vod/clips-routes.js:340 | | keep |++| PUT | /api/v1/:app/clips/:id | server/vod/clips-routes.js:380 | | keep |++| POST | /api/v1/:app/clips/:id/recut | server/vod/clips-routes.js:363 | | keep |++| GET | /api/v1/:app/clips/:id/signed-url | server/vod/clips-routes.js:332 | | keep |++| GET | /api/v1/:app/files | server/files/routes.js:155 | | keep |++| POST | /api/v1/:app/files | server/files/routes.js:91 | | keep |++| DELETE | /api/v1/:app/files/:key | server/files/routes.js:184 | | keep |++| GET | /api/v1/:app/files/:key | server/files/routes.js:172 | | keep || GET | /api/v1/:app/pastes | server/pastes/routes.js:260 | OpenVibe.Community | frozen-legacy || POST | /api/v1/:app/pastes | server/pastes/routes.js:477 | OpenVibe.Community | frozen-legacy || DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:633 | OpenVibe.Community | frozen-legacy |@@@ -1078,170 +1135,171 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:341 | OpenVibe.Community | frozen-legacy || POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:384 | OpenVibe.Community | frozen-legacy || GET | /api/v1/:app/pastes/config | server/pastes/routes.js:319 | OpenVibe.Community | frozen-legacy |--| GET | /api/v1/:app/stats | server/index.js:156 | | keep |--| GET | /api/v1/:app/stats/series/:metric | server/index.js:166 | | keep |++| GET | /api/v1/:app/stats | server/index.js:158 | | keep |++| GET | /api/v1/:app/stats/series/:metric | server/index.js:168 | | keep || POST | /api/v1/:app/thumbnails/:kind/:id | server/thumbnails/routes.js:42 | | keep || GET | /api/v1/:app/views | server/views/routes.js:39 | | keep || POST | /api/v1/:app/views | server/views/routes.js:24 | | keep |--| GET | /api/v1/:app/vods | server/vod/routes.js:272 | | keep |--| POST | /api/v1/:app/vods | server/vod/routes.js:95 | | keep |--| DELETE | /api/v1/:app/vods/:id | server/vod/routes.js:370 | | keep |--| GET | /api/v1/:app/vods/:id | server/vod/routes.js:313 | | keep |--| PUT | /api/v1/:app/vods/:id | server/vod/routes.js:345 | | keep |--| POST | /api/v1/:app/vods/:id/chunks | server/vod/routes.js:161 | | keep |--| POST | /api/v1/:app/vods/:id/complete | server/vod/routes.js:265 | | keep |--| POST | /api/v1/:app/vods/:id/finalize | server/vod/routes.js:266 | | keep |--| POST | /api/v1/:app/vods/:id/ingest/rtmp | server/vod/routes.js:118 | | keep |--| POST | /api/v1/:app/vods/:id/ingest/rtp/start | server/vod/routes.js:132 | | keep |--| POST | /api/v1/:app/vods/:id/ingest/rtp/stop | server/vod/routes.js:146 | | keep |--| GET | /api/v1/:app/vods/latest-thumbs | server/vod/routes.js:302 | | keep |--| GET | /api/v2/:app/jobs | server/jobs/routes.js:74 | | keep |--| POST | /api/v2/:app/jobs | server/jobs/routes.js:87 | | keep |--| DELETE | /api/v2/:app/jobs/:jobId | server/jobs/routes.js:147 | | keep |--| GET | /api/v2/:app/jobs/:jobId | server/jobs/routes.js:120 | | keep |--| POST | /api/v2/:app/jobs/:jobId/approve | server/jobs/routes.js:125 | | keep |--| POST | /api/v2/:app/jobs/:jobId/cancel | server/jobs/routes.js:146 | | keep |--| GET | /api/v2/:app/namespaces | server/objects/namespace-routes.js:32 | | keep |--| GET | /api/v2/:app/namespaces/:namespace | server/objects/namespace-routes.js:42 | | keep |--| GET | /api/v2/:app/objects | server/objects/routes.js:556 | | keep |--| POST | /api/v2/:app/objects | server/objects/routes.js:291 | | keep |--| DELETE | /api/v2/:app/objects/:id | server/objects/routes.js:609 | | keep |--| GET | /api/v2/:app/objects/:id | server/objects/routes.js:604 | | keep |--| GET | /api/v2/:app/objects/:id | server/objects/routes.js:700 | | keep |--| POST | /api/v2/:app/objects/:id/complete | server/objects/routes.js:425 | | keep |--| PUT | /api/v2/:app/objects/:id/content | server/index.js:63 | | keep |--| GET | /api/v2/:app/objects/:id/download | server/objects/routes.js:641 | | keep |--| GET | /api/v2/:app/objects/:id/holds | server/objects/routes.js:660 | | keep |--| POST | /api/v2/:app/objects/:id/holds | server/objects/routes.js:672 | | keep |--| DELETE | /api/v2/:app/objects/:id/holds/:holdId | server/objects/routes.js:684 | | keep |--| POST | /api/v2/:app/objects/:id/multipart | server/objects/routes.js:468 | | keep |--| DELETE | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:545 | | keep |--| GET | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:499 | | keep |--| POST | /api/v2/:app/objects/:id/multipart/:uploadId/complete | server/objects/routes.js:508 | | keep |--| PUT | /api/v2/:app/objects/:id/multipart/:uploadId/parts/:n | server/index.js:64 | | keep |--| POST | /api/v2/:app/objects/:id/restore | server/objects/routes.js:627 | | keep |--| POST | /api/v2/:app/objects/:id/upload-url | server/objects/routes.js:441 | | keep |--| GET | /api/v2/me | server/me/routes.js:202 | | keep |--| GET | /api/v2/me/app.js | server/me/routes.js:185 | | keep |--| GET | /api/v2/me/objects | server/me/routes.js:125 | | keep |--| GET | /api/v2/me/objects/:id | server/me/routes.js:137 | | keep |--| GET | /api/v2/me/objects/:id | server/me/routes.js:217 | | keep |--| GET | /api/v2/me/ops | server/me/routes.js:154 | | keep |--| GET | /api/v2/me/ops | server/me/routes.js:224 | | keep |--| POST | /api/v2/me/ops/recompute | server/me/routes.js:167 | | keep |--| POST | /api/v2/me/ops/recompute | server/me/routes.js:234 | | keep |--| GET | /api/v2/me/usage | server/me/routes.js:144 | | keep |++| GET | /api/v1/:app/vods | server/vod/routes.js:273 | | keep |++| POST | /api/v1/:app/vods | server/vod/routes.js:98 | | keep |++| DELETE | /api/v1/:app/vods/:id | server/vod/routes.js:383 | | keep |++| GET | /api/v1/:app/vods/:id | server/vod/routes.js:326 | | keep |++| PUT | /api/v1/:app/vods/:id | server/vod/routes.js:358 | | keep |++| POST | /api/v1/:app/vods/:id/chunks | server/vod/routes.js:164 | | keep |++| POST | /api/v1/:app/vods/:id/complete | server/vod/routes.js:266 | | keep |++| POST | /api/v1/:app/vods/:id/finalize | server/vod/routes.js:267 | | keep |++| POST | /api/v1/:app/vods/:id/ingest/rtmp | server/vod/routes.js:121 | | keep |++| POST | /api/v1/:app/vods/:id/ingest/rtp/start | server/vod/routes.js:135 | | keep |++| POST | /api/v1/:app/vods/:id/ingest/rtp/stop | server/vod/routes.js:149 | | keep |++| GET | /api/v1/:app/vods/:id/signed-url | server/vod/routes.js:317 | | keep |++| GET | /api/v1/:app/vods/latest-thumbs | server/vod/routes.js:303 | | keep |++| GET | /api/v2/:app/jobs | server/jobs/routes.js:78 | | keep |++| POST | /api/v2/:app/jobs | server/jobs/routes.js:91 | | keep |++| DELETE | /api/v2/:app/jobs/:jobId | server/jobs/routes.js:153 | | keep |++| GET | /api/v2/:app/jobs/:jobId | server/jobs/routes.js:124 | | keep |++| POST | /api/v2/:app/jobs/:jobId/approve | server/jobs/routes.js:129 | | keep |++| POST | /api/v2/:app/jobs/:jobId/cancel | server/jobs/routes.js:152 | | keep |++| GET | /api/v2/:app/namespaces | server/objects/namespace-routes.js:34 | | keep |++| GET | /api/v2/:app/namespaces/:namespace | server/objects/namespace-routes.js:44 | | keep |++| GET | /api/v2/:app/objects | server/objects/routes.js:564 | | keep |++| POST | /api/v2/:app/objects | server/objects/routes.js:296 | | keep |++| DELETE | /api/v2/:app/objects/:id | server/objects/routes.js:618 | | keep |++| GET | /api/v2/:app/objects/:id | server/objects/routes.js:612 | | keep |++| GET | /api/v2/:app/objects/:id | server/objects/routes.js:718 | | keep |++| POST | /api/v2/:app/objects/:id/complete | server/objects/routes.js:431 | | keep |++| PUT | /api/v2/:app/objects/:id/content | server/index.js:65 | | keep |++| GET | /api/v2/:app/objects/:id/download | server/objects/routes.js:650 | | keep |++| GET | /api/v2/:app/objects/:id/holds | server/objects/routes.js:669 | | keep |++| POST | /api/v2/:app/objects/:id/holds | server/objects/routes.js:688 | | keep |++| DELETE | /api/v2/:app/objects/:id/holds/:holdId | server/objects/routes.js:701 | | keep |++| POST | /api/v2/:app/objects/:id/multipart | server/objects/routes.js:474 | | keep |++| DELETE | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:553 | | keep |++| GET | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:505 | | keep |++| POST | /api/v2/:app/objects/:id/multipart/:uploadId/complete | server/objects/routes.js:515 | | keep |++| PUT | /api/v2/:app/objects/:id/multipart/:uploadId/parts/:n | server/index.js:66 | | keep |++| POST | /api/v2/:app/objects/:id/restore | server/objects/routes.js:636 | | keep |++| POST | /api/v2/:app/objects/:id/upload-url | server/objects/routes.js:447 | | keep |++| GET | /api/v2/me | server/me/routes.js:206 | | keep |++| GET | /api/v2/me/app.js | server/me/routes.js:189 | | keep |++| GET | /api/v2/me/objects | server/me/routes.js:128 | | keep |++| GET | /api/v2/me/objects/:id | server/me/routes.js:140 | | keep |++| GET | /api/v2/me/objects/:id | server/me/routes.js:221 | | keep |++| GET | /api/v2/me/ops | server/me/routes.js:157 | | keep |++| GET | /api/v2/me/ops | server/me/routes.js:228 | | keep |++| POST | /api/v2/me/ops/recompute | server/me/routes.js:171 | | keep |++| POST | /api/v2/me/ops/recompute | server/me/routes.js:238 | | keep |++| GET | /api/v2/me/usage | server/me/routes.js:147 | | keep || GET | /auth/callback | server/user-auth.js:288 | | keep || POST | /auth/fedcm | server/user-auth.js:334 | | keep || GET | /auth/login | server/user-auth.js:266 | | keep || GET | /auth/logout | server/user-auth.js:362 | | keep || GET | /auth/me | server/user-auth.js:386 | | keep || POST | /auth/refresh | server/user-auth.js:399 | | keep |--| GET | /healthz | server/index.js:133 | | keep |--| POST | /internal/avatar-ingest | server/index.js:97 | | keep |--| POST | /internal/events | server/index.js:67 | | keep |--| GET | /limits.json | server/limits.js:43 | | keep |--| GET | /manifest.webmanifest | server/index.js:85 | | keep |--| GET | /me | server/me/routes.js:202 | | keep |--| GET | /me/app.js | server/me/routes.js:185 | | keep |--| GET | /me/objects | server/me/routes.js:125 | | keep |--| GET | /me/objects/:id | server/me/routes.js:137 | | keep |--| GET | /me/objects/:id | server/me/routes.js:217 | | keep |--| GET | /me/ops | server/me/routes.js:154 | | keep |--| GET | /me/ops | server/me/routes.js:224 | | keep |--| POST | /me/ops/recompute | server/me/routes.js:167 | | keep |--| POST | /me/ops/recompute | server/me/routes.js:234 | | keep |--| GET | /me/usage | server/me/routes.js:144 | | keep |--| GET | /o | server/objects/routes.js:556 | | keep |--| POST | /o | server/objects/routes.js:291 | | keep |--| DELETE | /o/:id | server/objects/routes.js:609 | | keep |--| GET | /o/:id | server/objects/routes.js:604 | | keep |--| GET | /o/:id | server/objects/routes.js:700 | | keep |--| POST | /o/:id/complete | server/objects/routes.js:425 | | keep |--| GET | /o/:id/download | server/objects/routes.js:641 | | keep |--| GET | /o/:id/holds | server/objects/routes.js:660 | | keep |--| POST | /o/:id/holds | server/objects/routes.js:672 | | keep |--| DELETE | /o/:id/holds/:holdId | server/objects/routes.js:684 | | keep |--| POST | /o/:id/multipart | server/objects/routes.js:468 | | keep |--| DELETE | /o/:id/multipart/:uploadId | server/objects/routes.js:545 | | keep |--| GET | /o/:id/multipart/:uploadId | server/objects/routes.js:499 | | keep |--| POST | /o/:id/multipart/:uploadId/complete | server/objects/routes.js:508 | | keep |--| POST | /o/:id/restore | server/objects/routes.js:627 | | keep |--| POST | /o/:id/upload-url | server/objects/routes.js:441 | | keep |--| GET | /tos | server/index.js:80 | | keep |++| GET | /healthz | server/index.js:135 | | keep |++| POST | /internal/avatar-ingest | server/index.js:99 | | keep |++| POST | /internal/events | server/index.js:69 | | keep |++| GET | /limits.json | server/limits.js:42 | | keep |++| GET | /manifest.webmanifest | server/index.js:87 | | keep |++| GET | /me | server/me/routes.js:206 | | keep |++| GET | /me/app.js | server/me/routes.js:189 | | keep |++| GET | /me/objects | server/me/routes.js:128 | | keep |++| GET | /me/objects/:id | server/me/routes.js:140 | | keep |++| GET | /me/objects/:id | server/me/routes.js:221 | | keep |++| GET | /me/ops | server/me/routes.js:157 | | keep |++| GET | /me/ops | server/me/routes.js:228 | | keep |++| POST | /me/ops/recompute | server/me/routes.js:171 | | keep |++| POST | /me/ops/recompute | server/me/routes.js:238 | | keep |++| GET | /me/usage | server/me/routes.js:147 | | keep |++| GET | /o | server/objects/routes.js:564 | | keep |++| POST | /o | server/objects/routes.js:296 | | keep |++| DELETE | /o/:id | server/objects/routes.js:618 | | keep |++| GET | /o/:id | server/objects/routes.js:612 | | keep |++| GET | /o/:id | server/objects/routes.js:718 | | keep |++| POST | /o/:id/complete | server/objects/routes.js:431 | | keep |++| GET | /o/:id/download | server/objects/routes.js:650 | | keep |++| GET | /o/:id/holds | server/objects/routes.js:669 | | keep |++| POST | /o/:id/holds | server/objects/routes.js:688 | | keep |++| DELETE | /o/:id/holds/:holdId | server/objects/routes.js:701 | | keep |++| POST | /o/:id/multipart | server/objects/routes.js:474 | | keep |++| DELETE | /o/:id/multipart/:uploadId | server/objects/routes.js:553 | | keep |++| GET | /o/:id/multipart/:uploadId | server/objects/routes.js:505 | | keep |++| POST | /o/:id/multipart/:uploadId/complete | server/objects/routes.js:515 | | keep |++| POST | /o/:id/restore | server/objects/routes.js:636 | | keep |++| POST | /o/:id/upload-url | server/objects/routes.js:447 | | keep |++| GET | /tos | server/index.js:82 | | keep |## OpenVibe.Tools| Method | Path | Source | Target | Disposition ||---|---|---|---|---|| GET | / | apps/gateway/server/pages/site.js:309 | | keep |--| GET | / | apps/text/server/index.js:155 | | keep |++| GET | / | apps/text/server/index.js:159 | | keep || GET | /:slug | apps/gateway/server/pages/site.js:317 | | keep || GET | /all-tools | apps/gateway/server/pages/site.js:310 | | keep |--| GET | /api/brand | apps/gateway/server/index.js:309 | | keep |++| GET | /api/brand | apps/gateway/server/index.js:317 | | keep || GET | /api/catalog.json | apps/gateway/server/pages/site.js:308 | | keep |--| GET | /api/context | apps/audio/server/index.js:165 | | keep |--| GET | /api/context | apps/docs/server/index.js:194 | | keep |--| GET | /api/context | apps/img/server/index.js:188 | | keep |--| POST | /api/download | apps/yt/server/index.js:174 | | keep |--| DELETE | /api/download/:id | apps/yt/server/index.js:261 | | keep |--| GET | /api/download/:id | apps/audio/server/index.js:298 | | keep |--| GET | /api/download/:id | apps/docs/server/index.js:349 | | keep |--| GET | /api/download/:id | apps/img/server/index.js:291 | | keep |--| GET | /api/download/:id | apps/yt/server/index.js:268 | | keep |--| GET | /api/food-banks | apps/food/server/index.js:137 | | keep |--| GET | /api/food-banks | apps/maps/server/index.js:431 | | keep |--| GET | /api/foods | apps/food/server/index.js:139 | | keep |--| GET | /api/foods | apps/maps/server/index.js:452 | | keep |--| GET | /api/geocode | apps/food/server/index.js:141 | | keep |--| GET | /api/geocode | apps/maps/server/index.js:153 | | keep |--| GET | /api/health | apps/audio/server/index.js:158 | | keep |--| GET | /api/health | apps/docs/server/index.js:187 | | keep |--| GET | /api/health | apps/gateway/server/index.js:305 | | keep |--| GET | /api/health | apps/img/server/index.js:181 | | keep |--| GET | /api/health | apps/text/server/index.js:128 | | keep |--| GET | /api/health | apps/yt/server/index.js:149 | | keep |--| POST | /api/info | apps/docs/server/index.js:218 | | keep |--| POST | /api/info | apps/yt/server/index.js:156 | | keep |--| GET | /api/internal/analytics | apps/audio/server/index.js:347 | | keep |--| GET | /api/internal/analytics | apps/docs/server/index.js:367 | | keep |--| GET | /api/internal/analytics | apps/food/server/index.js:144 | | keep |--| GET | /api/internal/analytics | apps/gateway/server/index.js:392 | | keep |--| GET | /api/internal/analytics | apps/img/server/index.js:309 | | keep |--| GET | /api/internal/analytics | apps/maps/server/index.js:474 | | keep |--| GET | /api/internal/analytics | apps/text/server/index.js:116 | | keep |--| GET | /api/internal/analytics | apps/yt/server/index.js:282 | | keep |--| GET | /api/internal/analytics/bots | apps/audio/server/index.js:352 | | keep |--| GET | /api/internal/analytics/bots | apps/docs/server/index.js:372 | | keep |--| GET | /api/internal/analytics/bots | apps/food/server/index.js:149 | | keep |--| GET | /api/internal/analytics/bots | apps/img/server/index.js:314 | | keep |--| GET | /api/internal/analytics/bots | apps/maps/server/index.js:479 | | keep |--| GET | /api/internal/analytics/bots | apps/text/server/index.js:121 | | keep |--| GET | /api/internal/analytics/bots | apps/yt/server/index.js:287 | | keep |++| GET | /api/context | apps/audio/server/index.js:169 | | keep |++| GET | /api/context | apps/docs/server/index.js:198 | | keep |++| GET | /api/context | apps/img/server/index.js:192 | | keep |++| POST | /api/download | apps/yt/server/index.js:178 | | keep |++| DELETE | /api/download/:id | apps/yt/server/index.js:265 | | keep |++| GET | /api/download/:id | apps/audio/server/index.js:302 | | keep |++| GET | /api/download/:id | apps/docs/server/index.js:353 | | keep |++| GET | /api/download/:id | apps/img/server/index.js:295 | | keep |++| GET | /api/download/:id | apps/yt/server/index.js:272 | | keep |++| GET | /api/food-banks | apps/food/server/index.js:141 | | keep |++| GET | /api/food-banks | apps/maps/server/index.js:435 | | keep |++| GET | /api/foods | apps/food/server/index.js:143 | | keep |++| GET | /api/foods | apps/maps/server/index.js:456 | | keep |++| GET | /api/geocode | apps/food/server/index.js:145 | | keep |++| GET | /api/geocode | apps/maps/server/index.js:157 | | keep |++| GET | /api/health | apps/audio/server/index.js:162 | | keep |++| GET | /api/health | apps/docs/server/index.js:191 | | keep |++| GET | /api/health | apps/gateway/server/index.js:313 | | keep |++| GET | /api/health | apps/img/server/index.js:185 | | keep |++| GET | /api/health | apps/text/server/index.js:132 | | keep |++| GET | /api/health | apps/yt/server/index.js:153 | | keep |++| POST | /api/info | apps/docs/server/index.js:222 | | keep |++| POST | /api/info | apps/yt/server/index.js:160 | | keep |++| GET | /api/internal/analytics | apps/audio/server/index.js:351 | | keep |++| GET | /api/internal/analytics | apps/docs/server/index.js:371 | | keep |++| GET | /api/internal/analytics | apps/food/server/index.js:148 | | keep |++| GET | /api/internal/analytics | apps/gateway/server/index.js:409 | | keep |++| GET | /api/internal/analytics | apps/img/server/index.js:313 | | keep |++| GET | /api/internal/analytics | apps/maps/server/index.js:478 | | keep |++| GET | /api/internal/analytics | apps/text/server/index.js:120 | | keep |++| GET | /api/internal/analytics | apps/yt/server/index.js:286 | | keep |++| GET | /api/internal/analytics/bots | apps/audio/server/index.js:356 | | keep |++| GET | /api/internal/analytics/bots | apps/docs/server/index.js:376 | | keep |++| GET | /api/internal/analytics/bots | apps/food/server/index.js:153 | | keep |++| GET | /api/internal/analytics/bots | apps/img/server/index.js:318 | | keep |++| GET | /api/internal/analytics/bots | apps/maps/server/index.js:483 | | keep |++| GET | /api/internal/analytics/bots | apps/text/server/index.js:125 | | keep |++| GET | /api/internal/analytics/bots | apps/yt/server/index.js:291 | | keep || GET | /api/internal/jobs/:id | apps/_shared/jobs/http.js:112 | | keep |--| GET | /api/meal-plan | apps/food/server/index.js:140 | | keep |--| GET | /api/meal-plan | apps/maps/server/index.js:462 | | keep |--| GET | /api/preview/:id | apps/audio/server/index.js:316 | | keep |--| POST | /api/probe | apps/audio/server/index.js:189 | | keep |++| GET | /api/meal-plan | apps/food/server/index.js:144 | | keep |++| GET | /api/meal-plan | apps/maps/server/index.js:466 | | keep |++| GET | /api/preview/:id | apps/audio/server/index.js:320 | | keep |++| POST | /api/probe | apps/audio/server/index.js:193 | | keep || POST | /api/process | apps/_shared/guard/index.js:12 | | keep |--| POST | /api/process | apps/audio/server/index.js:202 | | keep |--| POST | /api/process | apps/docs/server/index.js:230 | | keep |--| POST | /api/process | apps/img/server/index.js:214 | | keep |--| POST | /api/process/direct | apps/img/server/index.js:241 | | keep |--| POST | /api/process/multi | apps/audio/server/index.js:243 | | keep |--| POST | /api/process/multi | apps/docs/server/index.js:277 | | keep |++| POST | /api/process | apps/audio/server/index.js:206 | | keep |++| POST | /api/process | apps/docs/server/index.js:234 | | keep |++| POST | /api/process | apps/img/server/index.js:218 | | keep |++| POST | /api/process/direct | apps/img/server/index.js:245 | | keep |++| POST | /api/process/multi | apps/audio/server/index.js:247 | | keep |++| POST | /api/process/multi | apps/docs/server/index.js:281 | | keep || GET | /api/ready | apps/_shared/observe.js:73 | | keep || GET | /api/ready | apps/gateway/server/index.js:133 | | keep |--| GET | /api/search | apps/maps/server/index.js:260 | | keep |--| GET | /api/search/stream | apps/maps/server/index.js:305 | | keep |--| GET | /api/status/:id | apps/yt/server/index.js:194 | | keep |--| GET | /api/status/:id/stream | apps/yt/server/index.js:210 | | keep |--| GET | /api/stores | apps/food/server/index.js:138 | | keep |--| GET | /api/stores | apps/maps/server/index.js:442 | | keep |--| GET | /api/terrain | apps/maps/server/index.js:421 | | keep |--| GET | /api/tools | apps/audio/server/index.js:184 | | keep |--| GET | /api/tools | apps/docs/server/index.js:213 | | keep |--| GET | /api/tools | apps/img/server/index.js:209 | | keep |++| GET | /api/search | apps/maps/server/index.js:264 | | keep |++| GET | /api/search/stream | apps/maps/server/index.js:309 | | keep |++| GET | /api/status/:id | apps/yt/server/index.js:198 | | keep |++| GET | /api/status/:id/stream | apps/yt/server/index.js:214 | | keep |++| GET | /api/stores | apps/food/server/index.js:142 | | keep |++| GET | /api/stores | apps/maps/server/index.js:446 | | keep |++| GET | /api/terrain | apps/maps/server/index.js:425 | | keep |++| GET | /api/tools | apps/audio/server/index.js:188 | | keep |++| GET | /api/tools | apps/docs/server/index.js:217 | | keep |++| GET | /api/tools | apps/img/server/index.js:213 | | keep || POST | /api/v1/jobs | apps/_shared/jobs/http.js:147 | | keep || DELETE | /api/v1/jobs/:id | apps/_shared/jobs/http.js:194 | | keep || GET | /api/v1/jobs/:id | apps/_shared/jobs/http.js:188 | | keep |@@@ -1250,9 +1308,10 @@ Owner = the repository whose code answers the route; target = the authority it b| DELETE | /api/v1/jobs/:id/references/:ref | apps/_shared/jobs/http.js:236 | | keep || PUT | /api/v1/jobs/:id/references/:ref | apps/_shared/jobs/http.js:235 | | keep || POST | /api/v1/jobs/:id/retry | apps/_shared/jobs/http.js:204 | | keep |--| GET | /api/v1/me/recent-tools | apps/gateway/server/index.js:203 | | keep |++| GET | /api/v1/me/recent-tools | apps/gateway/server/index.js:207 | | keep || GET | /api/v1/openapi.json | apps/gateway/server/pages/site.js:304 | | keep |--| GET | /api/weather | apps/maps/server/index.js:405 | | keep |++| POST | /api/v1/tools/:id/run | apps/gateway/server/index.js:266 | | keep |++| GET | /api/weather | apps/maps/server/index.js:409 | | keep || GET | /auth/fedcm/callback | apps/gateway/server/auth/routes.js:331 | | keep || POST | /auth/fedcm/fedcm | apps/gateway/server/auth/routes.js:381 | | keep || GET | /auth/fedcm/login | apps/gateway/server/auth/routes.js:303 | | keep |@@@ -1273,7 +1332,7 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /lookup/:target? | apps/gateway/server/net/routes.js:802 | | keep || GET | /myip | apps/gateway/server/net/routes.js:293 | | keep || GET | /opengraph | apps/gateway/server/dev/routes.js:87 | | keep |--| GET | /openvibe-sw.js | apps/gateway/server/index.js:459 | | keep |++| GET | /openvibe-sw.js | apps/gateway/server/index.js:476 | | keep || GET | /ping/:target? | apps/gateway/server/net/routes.js:765 | | keep || GET | /port/:target? | apps/gateway/server/net/routes.js:736 | | keep || GET | /rdap/:target? | apps/gateway/server/net/routes.js:515 | | keep |@@@ -1283,14 +1342,14 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /robots/:target? | apps/gateway/server/net/routes.js:948 | | keep || GET | /search | apps/gateway/server/pages/site.js:311 | | keep || GET | /sitemap.xml | apps/gateway/server/pages/site.js:313 | | keep |--| GET | /sitemap.xml | apps/text/server/index.js:149 | | keep |++| GET | /sitemap.xml | apps/text/server/index.js:153 | | keep || GET | /sitemap/:target? | apps/gateway/server/net/routes.js:949 | | keep || GET | /smtp/:target? | apps/gateway/server/net/routes.js:951 | | keep || GET | /ssl/:target? | apps/gateway/server/net/routes.js:560 | | keep || GET | /tool/:id | apps/gateway/server/pages/site.js:312 | | keep || GET | /tools | apps/gateway/server/dev/routes.js:75 | | keep || GET | /tools | apps/gateway/server/net/routes.js:283 | | keep |--| GET | /tos | apps/gateway/server/index.js:417 | | keep |++| GET | /tos | apps/gateway/server/index.js:434 | | keep || GET | /updates | apps/gateway/server/pages/site.js:307 | | keep || GET | /uptime/:target? | apps/gateway/server/net/routes.js:950 | | keep || POST | /webhook/bins | apps/gateway/server/dev/routes.js:165 | | keep |@@@ -1303,160 +1362,160 @@ Owner = the repository whose code answers the route; target = the authority it b| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/app.js:252 | | keep |--| GET | /api/health | server/app.js:217 | | keep |--| GET | /api/pastes | server/pastes/api.js:105 | | keep |--| POST | /api/pastes | server/pastes/api.js:109 | | keep |--| DELETE | /api/pastes/:slug | server/pastes/api.js:127 | | keep |--| GET | /api/pastes/:slug | server/pastes/api.js:125 | | keep |--| PUT | /api/pastes/:slug | server/pastes/api.js:126 | | keep |--| POST | /api/pastes/:slug/ai | server/pastes/api.js:130 | | keep |--| POST | /api/pastes/:slug/censor | server/pastes/api.js:129 | | keep |--| GET | /api/pastes/:slug/comments | server/pastes/api.js:139 | | keep |--| POST | /api/pastes/:slug/comments | server/pastes/api.js:140 | | keep |--| DELETE | /api/pastes/:slug/comments/:commentId | server/pastes/api.js:143 | | keep |--| POST | /api/pastes/:slug/copy | server/pastes/api.js:137 | | keep |--| POST | /api/pastes/:slug/fork | server/pastes/api.js:135 | | keep |--| POST | /api/pastes/:slug/like | server/pastes/api.js:136 | | keep |--| GET | /api/pastes/:slug/raw | server/pastes/api.js:132 | | keep |--| POST | /api/pastes/:slug/set-avatar | server/pastes/api.js:146 | | keep |--| GET | /api/pastes/:slug/versions | server/pastes/api.js:133 | | keep |--| DELETE | /api/pastes/admin/forks | server/pastes/api.js:116 | | keep |--| GET | /api/pastes/admin/forks | server/pastes/api.js:115 | | keep |--| GET | /api/pastes/admin/stats | server/pastes/api.js:114 | | keep |--| POST | /api/pastes/bulk | server/pastes/api.js:117 | | keep |--| GET | /api/pastes/by-user/:username | server/pastes/api.js:122 | | keep |--| GET | /api/pastes/config | server/pastes/api.js:112 | | keep |--| POST | /api/pastes/screenshot | server/pastes/api.js:119 | | keep |--| GET | /api/ready | server/app.js:224 | | keep |--| DELETE | /api/v1/comments/:commentId | server/comments/api.js:45 | | keep |--| GET | /api/v1/comments/:commentId | server/comments/api.js:43 | | keep |--| PATCH | /api/v1/comments/:commentId | server/comments/api.js:44 | | keep |--| POST | /api/v1/comments/:commentId/votes | server/comments/api.js:46 | | keep |--| GET | /api/v1/comments/threads/:id | server/comments/api.js:39 | | keep |--| POST | /api/v1/comments/threads/:id/comments | server/comments/api.js:40 | | keep |--| PUT | /api/v1/comments/threads/:id/visibility | server/comments/api.js:42 | | keep |--| POST | /api/v1/comments/threads/resolve | server/comments/api.js:37 | | keep |--| GET | /api/v1/posts | server/forum/api.js:57 | | keep |--| GET | /api/v1/posts | server/forum/api.js:110 | | keep |--| POST | /api/v1/posts | server/forum/api.js:58 | | keep |--| PUT | /api/v1/posts/:group | server/forum/api.js:111 | | keep |--| DELETE | /api/v1/posts/:id | server/forum/api.js:98 | | keep |--| PUT | /api/v1/posts/:id | server/forum/api.js:96 | | keep |--| POST | /api/v1/posts/:id/reactions | server/forum/api.js:97 | | keep |--| GET | /api/v1/posts/:id/versions | server/forum/api.js:99 | | keep |--| GET | /api/v1/posts/:space | server/forum/api.js:60 | | keep |--| POST | /api/v1/posts/:space/attachments | server/forum/api.js:68 | | keep |--| GET | /api/v1/posts/:space/categories | server/forum/api.js:62 | | keep |--| DELETE | /api/v1/posts/:space/categories/:category | server/forum/api.js:70 | | keep |--| PUT | /api/v1/posts/:space/categories/:category | server/forum/api.js:69 | | keep |--| DELETE | /api/v1/posts/:space/chat-room | server/forum/api.js:84 | | keep |--| PUT | /api/v1/posts/:space/chat-room | server/forum/api.js:83 | | keep |--| PUT | /api/v1/posts/:space/members-only | server/forum/api.js:81 | | keep |--| PUT | /api/v1/posts/:space/settings | server/forum/api.js:59 | | keep |--| GET | /api/v1/posts/:space/threads | server/forum/api.js:61 | | keep |--| POST | /api/v1/posts/:space/threads | server/forum/api.js:74 | | keep |--| DELETE | /api/v1/posts/:space/threads/:slug | server/forum/api.js:76 | | keep |--| GET | /api/v1/posts/:space/threads/:slug | server/forum/api.js:75 | | keep |--| PUT | /api/v1/posts/:space/threads/:slug/category | server/forum/api.js:71 | | keep |--| POST | /api/v1/posts/:space/threads/:slug/crosspost | server/forum/api.js:73 | | keep |--| PUT | /api/v1/posts/:space/threads/:slug/members-only | server/forum/api.js:80 | | keep |--| POST | /api/v1/posts/:space/threads/:slug/posts | server/forum/api.js:77 | | keep |--| PUT | /api/v1/posts/:space/threads/:slug/state | server/forum/api.js:79 | | keep |--| PUT | /api/v1/posts/:space/threads/:slug/status | server/forum/api.js:72 | | keep |--| POST | /api/v1/posts/:space/threads/:slug/votes | server/forum/api.js:78 | | keep |--| GET | /api/v1/pulse | server/pulse/api.js:27 | | keep |--| POST | /api/v1/pulse/items | server/pulse/api.js:28 | | keep |--| DELETE | /api/v1/pulse/items/:service/:type/:id | server/pulse/api.js:29 | | keep |--| GET | /api/v1/relay/deliveries | server/relay/api.js:54 | | keep |--| POST | /api/v1/relay/deliveries/:id/drop | server/relay/api.js:63 | | keep |--| POST | /api/v1/relay/deliveries/:id/retry | server/relay/api.js:59 | | keep |--| GET | /api/v1/relay/inbound | server/relay/api.js:67 | | keep |--| POST | /api/v1/relay/inbound/:id/dismiss | server/relay/api.js:70 | | keep |--| GET | /api/v1/relay/mappings | server/relay/api.js:74 | | keep |--| POST | /api/v1/relay/mappings | server/relay/api.js:75 | | keep |--| PUT | /api/v1/relay/mappings/:id | server/relay/api.js:85 | | keep |--| GET | /api/v1/relay/status | server/relay/api.js:53 | | keep |--| GET | /api/v1/space-groups | server/forum/api.js:57 | | keep |--| GET | /api/v1/space-groups | server/forum/api.js:110 | | keep |--| POST | /api/v1/space-groups | server/forum/api.js:58 | | keep |--| PUT | /api/v1/space-groups/:group | server/forum/api.js:111 | | keep |--| DELETE | /api/v1/space-groups/:id | server/forum/api.js:98 | | keep |--| PUT | /api/v1/space-groups/:id | server/forum/api.js:96 | | keep |--| POST | /api/v1/space-groups/:id/reactions | server/forum/api.js:97 | | keep |--| GET | /api/v1/space-groups/:id/versions | server/forum/api.js:99 | | keep |--| GET | /api/v1/space-groups/:space | server/forum/api.js:60 | | keep |--| POST | /api/v1/space-groups/:space/attachments | server/forum/api.js:68 | | keep |--| GET | /api/v1/space-groups/:space/categories | server/forum/api.js:62 | | keep |--| DELETE | /api/v1/space-groups/:space/categories/:category | server/forum/api.js:70 | | keep |--| PUT | /api/v1/space-groups/:space/categories/:category | server/forum/api.js:69 | | keep |--| DELETE | /api/v1/space-groups/:space/chat-room | server/forum/api.js:84 | | keep |--| PUT | /api/v1/space-groups/:space/chat-room | server/forum/api.js:83 | | keep |--| PUT | /api/v1/space-groups/:space/members-only | server/forum/api.js:81 | | keep |--| PUT | /api/v1/space-groups/:space/settings | server/forum/api.js:59 | | keep |--| GET | /api/v1/space-groups/:space/threads | server/forum/api.js:61 | | keep |--| POST | /api/v1/space-groups/:space/threads | server/forum/api.js:74 | | keep |--| DELETE | /api/v1/space-groups/:space/threads/:slug | server/forum/api.js:76 | | keep |--| GET | /api/v1/space-groups/:space/threads/:slug | server/forum/api.js:75 | | keep |--| PUT | /api/v1/space-groups/:space/threads/:slug/category | server/forum/api.js:71 | | keep |--| POST | /api/v1/space-groups/:space/threads/:slug/crosspost | server/forum/api.js:73 | | keep |--| PUT | /api/v1/space-groups/:space/threads/:slug/members-only | server/forum/api.js:80 | | keep |--| POST | /api/v1/space-groups/:space/threads/:slug/posts | server/forum/api.js:77 | | keep |--| PUT | /api/v1/space-groups/:space/threads/:slug/state | server/forum/api.js:79 | | keep |--| PUT | /api/v1/space-groups/:space/threads/:slug/status | server/forum/api.js:72 | | keep |--| POST | /api/v1/space-groups/:space/threads/:slug/votes | server/forum/api.js:78 | | keep |--| GET | /api/v1/spaces | server/forum/api.js:57 | | keep |--| GET | /api/v1/spaces | server/forum/api.js:110 | | keep |--| POST | /api/v1/spaces | server/forum/api.js:58 | | keep |--| PUT | /api/v1/spaces/:group | server/forum/api.js:111 | | keep |--| DELETE | /api/v1/spaces/:id | server/forum/api.js:98 | | keep |--| PUT | /api/v1/spaces/:id | server/forum/api.js:96 | | keep |--| POST | /api/v1/spaces/:id/reactions | server/forum/api.js:97 | | keep |--| GET | /api/v1/spaces/:id/versions | server/forum/api.js:99 | | keep |--| GET | /api/v1/spaces/:space | server/forum/api.js:60 | | keep |--| POST | /api/v1/spaces/:space/attachments | server/forum/api.js:68 | | keep |--| GET | /api/v1/spaces/:space/categories | server/forum/api.js:62 | | keep |--| DELETE | /api/v1/spaces/:space/categories/:category | server/forum/api.js:70 | | keep |--| PUT | /api/v1/spaces/:space/categories/:category | server/forum/api.js:69 | | keep |--| DELETE | /api/v1/spaces/:space/chat-room | server/forum/api.js:84 | | keep |--| PUT | /api/v1/spaces/:space/chat-room | server/forum/api.js:83 | | keep |--| PUT | /api/v1/spaces/:space/members-only | server/forum/api.js:81 | | keep |--| PUT | /api/v1/spaces/:space/settings | server/forum/api.js:59 | | keep |--| GET | /api/v1/spaces/:space/threads | server/forum/api.js:61 | | keep |--| POST | /api/v1/spaces/:space/threads | server/forum/api.js:74 | | keep |--| DELETE | /api/v1/spaces/:space/threads/:slug | server/forum/api.js:76 | | keep |--| GET | /api/v1/spaces/:space/threads/:slug | server/forum/api.js:75 | | keep |--| PUT | /api/v1/spaces/:space/threads/:slug/category | server/forum/api.js:71 | | keep |--| POST | /api/v1/spaces/:space/threads/:slug/crosspost | server/forum/api.js:73 | | keep |--| PUT | /api/v1/spaces/:space/threads/:slug/members-only | server/forum/api.js:80 | | keep |--| POST | /api/v1/spaces/:space/threads/:slug/posts | server/forum/api.js:77 | | keep |--| PUT | /api/v1/spaces/:space/threads/:slug/state | server/forum/api.js:79 | | keep |--| PUT | /api/v1/spaces/:space/threads/:slug/status | server/forum/api.js:72 | | keep |--| POST | /api/v1/spaces/:space/threads/:slug/votes | server/forum/api.js:78 | | keep |++| GET | / | server/app.js:259 | | keep |++| GET | /api/health | server/app.js:224 | | keep |++| GET | /api/pastes | server/pastes/api.js:111 | | keep |++| POST | /api/pastes | server/pastes/api.js:115 | | keep |++| DELETE | /api/pastes/:slug | server/pastes/api.js:134 | | keep |++| GET | /api/pastes/:slug | server/pastes/api.js:132 | | keep |++| PUT | /api/pastes/:slug | server/pastes/api.js:133 | | keep |++| POST | /api/pastes/:slug/ai | server/pastes/api.js:138 | | keep |++| POST | /api/pastes/:slug/censor | server/pastes/api.js:136 | | keep |++| GET | /api/pastes/:slug/comments | server/pastes/api.js:147 | | keep |++| POST | /api/pastes/:slug/comments | server/pastes/api.js:148 | | keep |++| DELETE | /api/pastes/:slug/comments/:commentId | server/pastes/api.js:151 | | keep |++| POST | /api/pastes/:slug/copy | server/pastes/api.js:145 | | keep |++| POST | /api/pastes/:slug/fork | server/pastes/api.js:143 | | keep |++| POST | /api/pastes/:slug/like | server/pastes/api.js:144 | | keep |++| GET | /api/pastes/:slug/raw | server/pastes/api.js:140 | | keep |++| POST | /api/pastes/:slug/set-avatar | server/pastes/api.js:154 | | keep |++| GET | /api/pastes/:slug/versions | server/pastes/api.js:141 | | keep |++| DELETE | /api/pastes/admin/forks | server/pastes/api.js:122 | | keep |++| GET | /api/pastes/admin/forks | server/pastes/api.js:121 | | keep |++| GET | /api/pastes/admin/stats | server/pastes/api.js:120 | | keep |++| POST | /api/pastes/bulk | server/pastes/api.js:123 | | keep |++| GET | /api/pastes/by-user/:username | server/pastes/api.js:129 | | keep |++| GET | /api/pastes/config | server/pastes/api.js:118 | | keep |++| POST | /api/pastes/screenshot | server/pastes/api.js:126 | | keep |++| GET | /api/ready | server/app.js:231 | | keep |++| DELETE | /api/v1/comments/:commentId | server/comments/api.js:51 | | keep |++| GET | /api/v1/comments/:commentId | server/comments/api.js:49 | | keep |++| PATCH | /api/v1/comments/:commentId | server/comments/api.js:50 | | keep |++| POST | /api/v1/comments/:commentId/votes | server/comments/api.js:52 | | keep |++| GET | /api/v1/comments/threads/:id | server/comments/api.js:45 | | keep |++| POST | /api/v1/comments/threads/:id/comments | server/comments/api.js:46 | | keep |++| PUT | /api/v1/comments/threads/:id/visibility | server/comments/api.js:48 | | keep |++| POST | /api/v1/comments/threads/resolve | server/comments/api.js:43 | | keep |++| GET | /api/v1/posts | server/forum/api.js:63 | | keep |++| GET | /api/v1/posts | server/forum/api.js:121 | | keep |++| POST | /api/v1/posts | server/forum/api.js:64 | | keep |++| PUT | /api/v1/posts/:group | server/forum/api.js:122 | | keep |++| DELETE | /api/v1/posts/:id | server/forum/api.js:107 | | keep |++| PUT | /api/v1/posts/:id | server/forum/api.js:105 | | keep |++| POST | /api/v1/posts/:id/reactions | server/forum/api.js:106 | | keep |++| GET | /api/v1/posts/:id/versions | server/forum/api.js:108 | | keep |++| GET | /api/v1/posts/:space | server/forum/api.js:66 | | keep |++| POST | /api/v1/posts/:space/attachments | server/forum/api.js:75 | | keep |++| GET | /api/v1/posts/:space/categories | server/forum/api.js:68 | | keep |++| DELETE | /api/v1/posts/:space/categories/:category | server/forum/api.js:77 | | keep |++| PUT | /api/v1/posts/:space/categories/:category | server/forum/api.js:76 | | keep |++| DELETE | /api/v1/posts/:space/chat-room | server/forum/api.js:91 | | keep |++| PUT | /api/v1/posts/:space/chat-room | server/forum/api.js:90 | | keep |++| PUT | /api/v1/posts/:space/members-only | server/forum/api.js:88 | | keep |++| PUT | /api/v1/posts/:space/settings | server/forum/api.js:65 | | keep |++| GET | /api/v1/posts/:space/threads | server/forum/api.js:67 | | keep |++| POST | /api/v1/posts/:space/threads | server/forum/api.js:81 | | keep |++| DELETE | /api/v1/posts/:space/threads/:slug | server/forum/api.js:83 | | keep |++| GET | /api/v1/posts/:space/threads/:slug | server/forum/api.js:82 | | keep |++| PUT | /api/v1/posts/:space/threads/:slug/category | server/forum/api.js:78 | | keep |++| POST | /api/v1/posts/:space/threads/:slug/crosspost | server/forum/api.js:80 | | keep |++| PUT | /api/v1/posts/:space/threads/:slug/members-only | server/forum/api.js:87 | | keep |++| POST | /api/v1/posts/:space/threads/:slug/posts | server/forum/api.js:84 | | keep |++| PUT | /api/v1/posts/:space/threads/:slug/state | server/forum/api.js:86 | | keep |++| PUT | /api/v1/posts/:space/threads/:slug/status | server/forum/api.js:79 | | keep |++| POST | /api/v1/posts/:space/threads/:slug/votes | server/forum/api.js:85 | | keep |++| GET | /api/v1/pulse | server/pulse/api.js:31 | | keep |++| POST | /api/v1/pulse/items | server/pulse/api.js:32 | | keep |++| DELETE | /api/v1/pulse/items/:service/:type/:id | server/pulse/api.js:33 | | keep |++| GET | /api/v1/relay/deliveries | server/relay/api.js:58 | | keep |++| POST | /api/v1/relay/deliveries/:id/drop | server/relay/api.js:67 | | keep |++| POST | /api/v1/relay/deliveries/:id/retry | server/relay/api.js:63 | | keep |++| GET | /api/v1/relay/inbound | server/relay/api.js:71 | | keep |++| POST | /api/v1/relay/inbound/:id/dismiss | server/relay/api.js:74 | | keep |++| GET | /api/v1/relay/mappings | server/relay/api.js:78 | | keep |++| POST | /api/v1/relay/mappings | server/relay/api.js:79 | | keep |++| PUT | /api/v1/relay/mappings/:id | server/relay/api.js:89 | | keep |++| GET | /api/v1/relay/status | server/relay/api.js:57 | | keep |++| GET | /api/v1/space-groups | server/forum/api.js:63 | | keep |++| GET | /api/v1/space-groups | server/forum/api.js:121 | | keep |++| POST | /api/v1/space-groups | server/forum/api.js:64 | | keep |++| PUT | /api/v1/space-groups/:group | server/forum/api.js:122 | | keep |++| DELETE | /api/v1/space-groups/:id | server/forum/api.js:107 | | keep |++| PUT | /api/v1/space-groups/:id | server/forum/api.js:105 | | keep |++| POST | /api/v1/space-groups/:id/reactions | server/forum/api.js:106 | | keep |++| GET | /api/v1/space-groups/:id/versions | server/forum/api.js:108 | | keep |++| GET | /api/v1/space-groups/:space | server/forum/api.js:66 | | keep |++| POST | /api/v1/space-groups/:space/attachments | server/forum/api.js:75 | | keep |++| GET | /api/v1/space-groups/:space/categories | server/forum/api.js:68 | | keep |++| DELETE | /api/v1/space-groups/:space/categories/:category | server/forum/api.js:77 | | keep |++| PUT | /api/v1/space-groups/:space/categories/:category | server/forum/api.js:76 | | keep |++| DELETE | /api/v1/space-groups/:space/chat-room | server/forum/api.js:91 | | keep |++| PUT | /api/v1/space-groups/:space/chat-room | server/forum/api.js:90 | | keep |++| PUT | /api/v1/space-groups/:space/members-only | server/forum/api.js:88 | | keep |++| PUT | /api/v1/space-groups/:space/settings | server/forum/api.js:65 | | keep |++| GET | /api/v1/space-groups/:space/threads | server/forum/api.js:67 | | keep |++| POST | /api/v1/space-groups/:space/threads | server/forum/api.js:81 | | keep |++| DELETE | /api/v1/space-groups/:space/threads/:slug | server/forum/api.js:83 | | keep |++| GET | /api/v1/space-groups/:space/threads/:slug | server/forum/api.js:82 | | keep |++| PUT | /api/v1/space-groups/:space/threads/:slug/category | server/forum/api.js:78 | | keep |++| POST | /api/v1/space-groups/:space/threads/:slug/crosspost | server/forum/api.js:80 | | keep |++| PUT | /api/v1/space-groups/:space/threads/:slug/members-only | server/forum/api.js:87 | | keep |++| POST | /api/v1/space-groups/:space/threads/:slug/posts | server/forum/api.js:84 | | keep |++| PUT | /api/v1/space-groups/:space/threads/:slug/state | server/forum/api.js:86 | | keep |++| PUT | /api/v1/space-groups/:space/threads/:slug/status | server/forum/api.js:79 | | keep |++| POST | /api/v1/space-groups/:space/threads/:slug/votes | server/forum/api.js:85 | | keep |++| GET | /api/v1/spaces | server/forum/api.js:63 | | keep |++| GET | /api/v1/spaces | server/forum/api.js:121 | | keep |++| POST | /api/v1/spaces | server/forum/api.js:64 | | keep |++| PUT | /api/v1/spaces/:group | server/forum/api.js:122 | | keep |++| DELETE | /api/v1/spaces/:id | server/forum/api.js:107 | | keep |++| PUT | /api/v1/spaces/:id | server/forum/api.js:105 | | keep |++| POST | /api/v1/spaces/:id/reactions | server/forum/api.js:106 | | keep |++| GET | /api/v1/spaces/:id/versions | server/forum/api.js:108 | | keep |++| GET | /api/v1/spaces/:space | server/forum/api.js:66 | | keep |++| POST | /api/v1/spaces/:space/attachments | server/forum/api.js:75 | | keep |++| GET | /api/v1/spaces/:space/categories | server/forum/api.js:68 | | keep |++| DELETE | /api/v1/spaces/:space/categories/:category | server/forum/api.js:77 | | keep |++| PUT | /api/v1/spaces/:space/categories/:category | server/forum/api.js:76 | | keep |++| DELETE | /api/v1/spaces/:space/chat-room | server/forum/api.js:91 | | keep |++| PUT | /api/v1/spaces/:space/chat-room | server/forum/api.js:90 | | keep |++| PUT | /api/v1/spaces/:space/members-only | server/forum/api.js:88 | | keep |++| PUT | /api/v1/spaces/:space/settings | server/forum/api.js:65 | | keep |++| GET | /api/v1/spaces/:space/threads | server/forum/api.js:67 | | keep |++| POST | /api/v1/spaces/:space/threads | server/forum/api.js:81 | | keep |++| DELETE | /api/v1/spaces/:space/threads/:slug | server/forum/api.js:83 | | keep |++| GET | /api/v1/spaces/:space/threads/:slug | server/forum/api.js:82 | | keep |++| PUT | /api/v1/spaces/:space/threads/:slug/category | server/forum/api.js:78 | | keep |++| POST | /api/v1/spaces/:space/threads/:slug/crosspost | server/forum/api.js:80 | | keep |++| PUT | /api/v1/spaces/:space/threads/:slug/members-only | server/forum/api.js:87 | | keep |++| POST | /api/v1/spaces/:space/threads/:slug/posts | server/forum/api.js:84 | | keep |++| PUT | /api/v1/spaces/:space/threads/:slug/state | server/forum/api.js:86 | | keep |++| PUT | /api/v1/spaces/:space/threads/:slug/status | server/forum/api.js:79 | | keep |++| POST | /api/v1/spaces/:space/threads/:slug/votes | server/forum/api.js:85 | | keep || GET | /c/:accessId | server/comments/routes.js:43 | | keep || POST | /c/:accessId | server/comments/routes.js:50 | | keep || GET | /callback | server/auth/routes.js:292 | | keep || POST | /fedcm | server/auth/routes.js:338 | | keep |--| GET | /feed.xml | server/app.js:244 | | keep |--| POST | /internal/events | server/pulse/consumer.js:74 | | keep |--| GET | /llms.txt | server/app.js:242 | | keep |++| GET | /feed.xml | server/app.js:251 | | keep |++| POST | /internal/events | server/pulse/consumer.js:109 | | keep |++| GET | /llms.txt | server/app.js:249 | | keep || GET | /login | server/auth/routes.js:270 | | keep || GET | /logout | server/auth/routes.js:366 | | keep || GET | /me | server/auth/routes.js:390 | | keep |--| GET | /my | server/app.js:388 | | keep |--| GET | /new | server/app.js:339 | | keep |--| POST | /new | server/app.js:350 | | keep |--| GET | /p/:slug | server/app.js:284 | | keep |--| GET | /p/:slug/download | server/app.js:327 | | keep |--| GET | /p/:slug/raw | server/app.js:303 | | keep |--| GET | /p/:slug/raw | server/app.js:323 | | keep |--| GET | /p/:slug/screenshot | server/app.js:316 | | keep |--| GET | /p/:slug/screenshot | server/app.js:324 | | keep |--| GET | /pastes | server/app.js:276 | | keep |--| GET | /pastes/:slug | server/app.js:282 | | keep |--| GET | /pulse | server/app.js:380 | | keep |++| GET | /my | server/app.js:399 | | keep |++| GET | /new | server/app.js:350 | | keep |++| POST | /new | server/app.js:361 | | keep |++| GET | /p/:slug | server/app.js:291 | | keep |++| GET | /p/:slug/download | server/app.js:338 | | keep |++| GET | /p/:slug/raw | server/app.js:310 | | keep |++| GET | /p/:slug/raw | server/app.js:334 | | keep |++| GET | /p/:slug/screenshot | server/app.js:323 | | keep |++| GET | /p/:slug/screenshot | server/app.js:335 | | keep |++| GET | /pastes | server/app.js:283 | | keep |++| GET | /pastes/:slug | server/app.js:289 | | keep |++| GET | /pulse | server/app.js:391 | | keep || POST | /refresh | server/auth/routes.js:403 | | keep |--| GET | /robots.txt | server/app.js:241 | | keep |++| GET | /robots.txt | server/app.js:248 | | keep || GET | /s | server/forum/routes.js:72 | | keep || GET | /s/:space | server/forum/routes.js:116 | | keep || POST | /s/:space/chat-room | server/forum/routes.js:252 | | keep |@@@ -1479,158 +1538,152 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /s/feed.xml | server/forum/routes.js:106 | | keep || GET | /s/new-space | server/forum/routes.js:77 | | keep || POST | /s/new-space | server/forum/routes.js:84 | | keep |--| GET | /search | server/app.js:261 | | keep |--| GET | /sitemap.xml | server/app.js:243 | | keep |--| GET | /tos | server/app.js:114 | | keep |--| GET | /updates | server/app.js:257 | | keep |++| GET | /search | server/app.js:268 | | keep |++| GET | /sitemap.xml | server/app.js:250 | | keep |++| GET | /tos | server/app.js:115 | | keep |++| GET | /updates | server/app.js:264 | | keep |## OpenVibe.Games| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| ANY | / | apps/server/src/net/httpServer.ts:672 | | keep |--| ANY | /api | apps/server/src/net/httpServer.ts:634 | | keep |--| ANY | /api/* | apps/server/src/net/httpServer.ts:634 | | keep |--| ANY | /api/characters | apps/server/src/net/httpServer.ts:330 | | keep |--| POST | /api/map | apps/server/src/net/httpServer.ts:178 | | keep |--| POST | /api/map-assets | apps/server/src/net/httpServer.ts:248 | | keep |--| POST | /api/texture | apps/server/src/net/httpServer.ts:248 | | keep |--| ANY | /auth/* | apps/server/src/net/httpServer.ts:350 | | keep |--| ANY | /auth/callback | apps/server/src/net/httpServer.ts:416 | | keep |--| ANY | /auth/fedcm | apps/server/src/net/httpServer.ts:502 | | keep |--| ANY | /auth/login | apps/server/src/net/httpServer.ts:365 | | keep |--| ANY | /auth/logout | apps/server/src/net/httpServer.ts:578 | | keep |--| ANY | /auth/me | apps/server/src/net/httpServer.ts:595 | | keep |--| ANY | /canvas | apps/server/src/net/httpServer.ts:666 | | keep |--| ANY | /editor | apps/server/src/net/httpServer.ts:678 | | keep |--| ANY | /editor.html | apps/server/src/net/httpServer.ts:646 | | keep |--| ANY | /editor/ | apps/server/src/net/httpServer.ts:658 | | keep |--| ANY | /game | apps/server/src/net/httpServer.ts:666 | | keep |--| ANY | /game | apps/server/src/net/httpServer.ts:667 | | keep |--| ANY | /healthz | apps/server/src/net/httpServer.ts:613 | | keep |--| ANY | /map-assets/* | apps/server/src/net/httpServer.ts:304 | | keep |--| ANY | /map.json | apps/server/src/net/httpServer.ts:165 | | keep |--| ANY | /metrics | apps/server/src/net/httpServer.ts:618 | | keep |--| ANY | /play | apps/server/src/net/httpServer.ts:653 | | keep |--| ANY | /play | apps/server/src/net/httpServer.ts:676 | | keep |--| ANY | /play.html | apps/server/src/net/httpServer.ts:646 | | keep |--| ANY | /play.html | apps/server/src/net/httpServer.ts:648 | | keep |--| ANY | /play/ | apps/server/src/net/httpServer.ts:653 | | keep |--| ANY | /play/ | apps/server/src/net/httpServer.ts:658 | | keep |++| ANY | / | apps/server/src/net/httpServer.ts:685 | | keep |++| ANY | /api | apps/server/src/net/httpServer.ts:647 | | keep |++| ANY | /api/* | apps/server/src/net/httpServer.ts:647 | | keep |++| ANY | /api/characters | apps/server/src/net/httpServer.ts:343 | | keep |++| POST | /api/map | apps/server/src/net/httpServer.ts:181 | | keep |++| POST | /api/map-assets | apps/server/src/net/httpServer.ts:256 | | keep |++| POST | /api/texture | apps/server/src/net/httpServer.ts:256 | | keep |++| ANY | /auth/* | apps/server/src/net/httpServer.ts:363 | | keep |++| ANY | /auth/callback | apps/server/src/net/httpServer.ts:429 | | keep |++| ANY | /auth/fedcm | apps/server/src/net/httpServer.ts:515 | | keep |++| ANY | /auth/login | apps/server/src/net/httpServer.ts:378 | | keep |++| ANY | /auth/logout | apps/server/src/net/httpServer.ts:591 | | keep |++| ANY | /auth/me | apps/server/src/net/httpServer.ts:608 | | keep |++| ANY | /canvas | apps/server/src/net/httpServer.ts:679 | | keep |++| ANY | /editor | apps/server/src/net/httpServer.ts:691 | | keep |++| ANY | /editor.html | apps/server/src/net/httpServer.ts:659 | | keep |++| ANY | /editor/ | apps/server/src/net/httpServer.ts:671 | | keep |++| ANY | /game | apps/server/src/net/httpServer.ts:679 | | keep |++| ANY | /game | apps/server/src/net/httpServer.ts:680 | | keep |++| ANY | /healthz | apps/server/src/net/httpServer.ts:626 | | keep |++| ANY | /map-assets/* | apps/server/src/net/httpServer.ts:317 | | keep |++| ANY | /map.json | apps/server/src/net/httpServer.ts:168 | | keep |++| ANY | /metrics | apps/server/src/net/httpServer.ts:631 | | keep |++| ANY | /play | apps/server/src/net/httpServer.ts:666 | | keep |++| ANY | /play | apps/server/src/net/httpServer.ts:689 | | keep |++| ANY | /play.html | apps/server/src/net/httpServer.ts:659 | | keep |++| ANY | /play.html | apps/server/src/net/httpServer.ts:661 | | keep |++| ANY | /play/ | apps/server/src/net/httpServer.ts:666 | | keep |++| ANY | /play/ | apps/server/src/net/httpServer.ts:671 | | keep |## OpenVibe.Events| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/app.js:76 | | keep |--| GET | /api/health | server/app.js:39 | | keep |--| GET | /api/ready | server/app.js:70 | | keep |--| GET | /api/v1/checkpoints | server/api/read.js:94 | | keep |--| PUT | /api/v1/checkpoints | server/api/read.js:103 | | keep |--| GET | /api/v1/deliveries | server/api/read.js:114 | | keep |--| POST | /api/v1/deliveries/replay | server/api/read.js:139 | | keep |--| GET | /api/v1/events | server/api/read.js:58 | | keep |--| POST | /api/v1/events | server/api/publish.js:80 | | keep |--| GET | /api/v1/events/:id | server/api/read.js:85 | | keep |--| GET | /api/v1/subscriptions | server/api/subscriptions.js:133 | | keep |--| POST | /api/v1/subscriptions | server/api/subscriptions.js:74 | | keep |--| GET | /api/v1/subscriptions/:id | server/api/subscriptions.js:137 | | keep |--| POST | /api/v1/subscriptions/:id/${action} | server/api/subscriptions.js:162 | | keep |--| POST | /api/v1/subscriptions/:id/rotate-secret | server/api/subscriptions.js:145 | | keep |++| GET | / | server/app.js:80 | | keep |++| GET | /api/health | server/app.js:40 | | keep |++| GET | /api/ready | server/app.js:71 | | keep |++| GET | /api/v1/checkpoints | server/api/read.js:98 | | keep |++| PUT | /api/v1/checkpoints | server/api/read.js:107 | | keep |++| GET | /api/v1/deliveries | server/api/read.js:118 | | keep |++| POST | /api/v1/deliveries/replay | server/api/read.js:145 | | keep |++| GET | /api/v1/events | server/api/read.js:62 | | keep |++| POST | /api/v1/events | server/api/publish.js:99 | | keep |++| GET | /api/v1/events/:id | server/api/read.js:89 | | keep |++| GET | /api/v1/subscriptions | server/api/subscriptions.js:142 | | keep |++| POST | /api/v1/subscriptions | server/api/subscriptions.js:83 | | keep |++| GET | /api/v1/subscriptions/:id | server/api/subscriptions.js:146 | | keep |++| POST | /api/v1/subscriptions/:id/${action} | server/api/subscriptions.js:172 | | keep |++| POST | /api/v1/subscriptions/:id/rotate-secret | server/api/subscriptions.js:154 | | keep || POST | /internal/events | lib/client.js:18 | | keep || GET | /limits.json | server/limits.js:41 | | keep |--| GET | /realtime/stream | server/app.js:35 | | keep |++| GET | /realtime/stream | server/app.js:36 | | keep |## OpenVibe.Chat| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/prefs/routes.js:35 | | keep |++| GET | / | server/prefs/routes.js:40 | | keep || GET | / | server/web/pages.js:144 | | keep |--| POST | / | server/events/consumer.js:143 | | keep |--| PUT | / | server/prefs/routes.js:38 | | keep |--| GET | /api/chat/:streamId/history | server/chat/routes.js:538 | | keep |--| GET | /api/chat/:streamId/replay | server/chat/routes.js:516 | | keep |--| GET | /api/chat/:streamId/users | server/chat/routes.js:681 | | keep |--| GET | /api/chat/admin/logs | server/chat/routes.js:777 | | keep |--| GET | /api/chat/admin/logs/export | server/chat/routes.js:821 | | keep |--| DELETE | /api/chat/admin/purge | server/chat/routes.js:722 | | keep |--| POST | /api/chat/admin/purge/preview | server/chat/routes.js:690 | | keep |--| GET | /api/chat/anon/:anonId | server/chat/routes.js:443 | | keep |--| GET | /api/chat/anon/:anonId/logs | server/chat/routes.js:457 | | keep |--| GET | /api/chat/channel/:userId/history | server/chat/routes.js:642 | | keep |--| GET | /api/chat/filters/friendly | server/chat/routes.js:489 | | keep |--| GET | /api/chat/gif/providers | server/chat/routes.js:164 | | keep |--| GET | /api/chat/gif/search | server/chat/routes.js:202 | | keep |--| GET | /api/chat/gif/trending | server/chat/routes.js:175 | | keep |--| GET | /api/chat/global/history | server/chat/routes.js:495 | | keep |++| POST | / | server/events/consumer.js:151 | | keep |++| PUT | / | server/prefs/routes.js:43 | | keep |++| GET | /:id/call | server/calls/routes.js:263 | | keep |++| PUT | /:id/call | server/calls/routes.js:231 | | keep |++| GET | /api/chat/:streamId/history | server/chat/routes.js:550 | | keep |++| GET | /api/chat/:streamId/replay | server/chat/routes.js:528 | | keep |++| GET | /api/chat/:streamId/users | server/chat/routes.js:693 | | keep |++| GET | /api/chat/admin/logs | server/chat/routes.js:793 | | keep |++| GET | /api/chat/admin/logs/export | server/chat/routes.js:837 | | keep |++| DELETE | /api/chat/admin/purge | server/chat/routes.js:738 | | keep |++| POST | /api/chat/admin/purge/preview | server/chat/routes.js:706 | | keep |++| GET | /api/chat/anon/:anonId | server/chat/routes.js:455 | | keep |++| GET | /api/chat/anon/:anonId/logs | server/chat/routes.js:469 | | keep |++| GET | /api/chat/channel/:userId/history | server/chat/routes.js:654 | | keep |++| GET | /api/chat/filters/friendly | server/chat/routes.js:501 | | keep |++| GET | /api/chat/gif/providers | server/chat/routes.js:174 | | keep |++| GET | /api/chat/gif/search | server/chat/routes.js:212 | | keep |++| GET | /api/chat/gif/trending | server/chat/routes.js:185 | | keep |++| GET | /api/chat/global/history | server/chat/routes.js:507 | | keep || GET | /api/chat/ice-servers | server/net/turn.js:65 | | keep |--| GET | /api/chat/me/export | server/chat/routes.js:869 | | keep |--| GET | /api/chat/online | server/chat/routes.js:670 | | keep |--| GET | /api/chat/relay-user/:platform/:username | server/chat/routes.js:433 | | keep |--| GET | /api/chat/relay-user/:platform/:username/logs | server/chat/routes.js:473 | | keep |--| GET | /api/chat/rooms | server/rooms/routes.js:65 | | keep |--| POST | /api/chat/rooms | server/rooms/routes.js:69 | | keep |--| GET | /api/chat/rooms/:slug | server/rooms/routes.js:73 | | keep |--| PATCH | /api/chat/rooms/:slug | server/rooms/routes.js:83 | | keep |--| GET | /api/chat/rooms/:slug/attachments | server/rooms/routes.js:155 | | keep |--| POST | /api/chat/rooms/:slug/attachments | server/rooms/routes.js:161 | | keep |--| DELETE | /api/chat/rooms/:slug/attachments/:service/:resource | server/rooms/routes.js:170 | | keep |--| POST | /api/chat/rooms/:slug/join | server/rooms/routes.js:114 | | keep |--| POST | /api/chat/rooms/:slug/leave | server/rooms/routes.js:120 | | keep |--| GET | /api/chat/rooms/:slug/members | server/rooms/routes.js:135 | | keep |--| POST | /api/chat/rooms/:slug/members | server/rooms/routes.js:141 | | keep |--| GET | /api/chat/rooms/:slug/messages | server/rooms/routes.js:88 | | keep |--| POST | /api/chat/rooms/:slug/messages | server/rooms/routes.js:96 | | keep |--| DELETE | /api/chat/rooms/:slug/messages/:id | server/rooms/routes.js:105 | | keep |--| POST | /api/chat/rooms/:slug/read | server/rooms/routes.js:130 | | keep |--| GET | /api/chat/search | server/chat/routes.js:372 | | keep |--| POST | /api/chat/send | server/chat/routes.js:267 | | keep |--| GET | /api/chat/user/:userId/history | server/chat/routes.js:399 | | keep |--| GET | /api/chat/user/:username/profile | server/chat/routes.js:420 | | keep |--| GET | /api/dm/blocks | server/chat/dm-routes.js:418 | | keep |--| DELETE | /api/dm/blocks/:userId | server/chat/dm-routes.js:406 | | keep |--| POST | /api/dm/blocks/:userId | server/chat/dm-routes.js:391 | | keep |--| GET | /api/dm/blocks/check/:userId | server/chat/dm-routes.js:428 | | keep |--| GET | /api/dm/conversations | server/chat/dm-routes.js:66 | | keep |--| POST | /api/dm/conversations | server/chat/dm-routes.js:81 | | keep |--| GET | /api/dm/conversations/:id | server/chat/dm-routes.js:145 | | keep |--| PATCH | /api/dm/conversations/:id | server/chat/dm-routes.js:348 | | keep |--| GET | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:162 | | keep |--| POST | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:180 | | keep |--| DELETE | /api/dm/conversations/:id/messages/:msgId | server/chat/dm-routes.js:438 | | keep |--| POST | /api/dm/conversations/:id/participants | server/chat/dm-routes.js:270 | | keep |--| DELETE | /api/dm/conversations/:id/participants/:userId | server/chat/dm-routes.js:327 | | keep |--| POST | /api/dm/conversations/:id/read | server/chat/dm-routes.js:249 | | keep |--| GET | /api/dm/unread | server/chat/dm-routes.js:367 | | keep |--| GET | /api/dm/users/search | server/chat/dm-routes.js:377 | | keep |--| POST | /api/sounds | server/chat/sounds-routes.js:165 | | keep |--| DELETE | /api/sounds/:id | server/chat/sounds-routes.js:307 | | keep |--| DELETE | /api/sounds/alert/:kind | server/chat/sounds-routes.js:464 | | keep |--| POST | /api/sounds/alert/:kind | server/chat/sounds-routes.js:425 | | keep |--| GET | /api/sounds/alert/mine | server/chat/sounds-routes.js:414 | | keep |--| GET | /api/sounds/all/:streamId | server/chat/sounds-routes.js:154 | | keep |--| GET | /api/sounds/channel/:userId | server/chat/sounds-routes.js:143 | | keep |--| PATCH | /api/sounds/command | server/chat/sounds-routes.js:334 | | keep |--| GET | /api/sounds/file/:filename | server/chat/sounds-routes.js:392 | | keep |--| GET | /api/streams/:id/call | server/calls/routes.js:253 | | keep |--| PUT | /api/streams/:id/call | server/calls/routes.js:221 | | keep |--| GET | /api/streams/voice-channels | server/calls/routes.js:37 | | keep |--| POST | /api/streams/voice-channels | server/calls/routes.js:58 | | keep |--| DELETE | /api/streams/voice-channels/:channelId | server/calls/routes.js:70 | | keep |--| GET | /api/streams/voice-channels/:channelId | server/calls/routes.js:47 | | keep |--| POST | /api/streams/voice-channels/call-user | server/calls/routes.js:108 | | keep |--| POST | /api/streams/voice-channels/call-user/respond | server/calls/routes.js:171 | | keep |--| GET | /api/tts/admin/settings | server/chat/tts-routes.js:112 | | keep |--| PUT | /api/tts/admin/settings | server/chat/tts-routes.js:130 | | keep |--| POST | /api/tts/admin/test | server/chat/tts-routes.js:162 | | keep |--| GET | /api/tts/audio/:file | server/chat/tts-routes.js:260 | | keep |--| GET | /api/tts/queue | server/chat/tts-routes.js:217 | | keep |--| POST | /api/tts/queue/:id/report | server/chat/tts-routes.js:247 | | keep |--| POST | /api/tts/queue/clear | server/chat/tts-routes.js:237 | | keep |--| POST | /api/tts/queue/skip | server/chat/tts-routes.js:225 | | keep |--| GET | /api/tts/settings | server/chat/tts-routes.js:90 | | keep |--| GET | /api/tts/voices | server/chat/tts-routes.js:80 | | keep |++| GET | /api/chat/me/export | server/chat/routes.js:885 | | keep |++| GET | /api/chat/online | server/chat/routes.js:682 | | keep |++| GET | /api/chat/relay-user/:platform/:username | server/chat/routes.js:445 | | keep |++| GET | /api/chat/relay-user/:platform/:username/logs | server/chat/routes.js:485 | | keep |++| GET | /api/chat/rooms | server/rooms/routes.js:80 | | keep |++| POST | /api/chat/rooms | server/rooms/routes.js:84 | | keep |++| GET | /api/chat/rooms/:slug | server/rooms/routes.js:88 | | keep |++| PATCH | /api/chat/rooms/:slug | server/rooms/routes.js:98 | | keep |++| GET | /api/chat/rooms/:slug/attachments | server/rooms/routes.js:170 | | keep |++| POST | /api/chat/rooms/:slug/attachments | server/rooms/routes.js:176 | | keep |++| DELETE | /api/chat/rooms/:slug/attachments/:service/:resource | server/rooms/routes.js:185 | | keep |++| POST | /api/chat/rooms/:slug/join | server/rooms/routes.js:129 | | keep |++| POST | /api/chat/rooms/:slug/leave | server/rooms/routes.js:135 | | keep |++| GET | /api/chat/rooms/:slug/members | server/rooms/routes.js:150 | | keep |++| POST | /api/chat/rooms/:slug/members | server/rooms/routes.js:156 | | keep |++| GET | /api/chat/rooms/:slug/messages | server/rooms/routes.js:103 | | keep |++| POST | /api/chat/rooms/:slug/messages | server/rooms/routes.js:111 | | keep |++| DELETE | /api/chat/rooms/:slug/messages/:id | server/rooms/routes.js:120 | | keep |++| POST | /api/chat/rooms/:slug/read | server/rooms/routes.js:145 | | keep |++| GET | /api/chat/search | server/chat/routes.js:384 | | keep |++| POST | /api/chat/send | server/chat/routes.js:279 | | keep |++| GET | /api/chat/user/:userId/history | server/chat/routes.js:411 | | keep |++| GET | /api/chat/user/:username/profile | server/chat/routes.js:432 | | keep |++| GET | /api/dm/blocks | server/chat/dm-routes.js:433 | | keep |++| DELETE | /api/dm/blocks/:userId | server/chat/dm-routes.js:421 | | keep |++| POST | /api/dm/blocks/:userId | server/chat/dm-routes.js:406 | | keep |++| GET | /api/dm/blocks/check/:userId | server/chat/dm-routes.js:443 | | keep |++| GET | /api/dm/conversations | server/chat/dm-routes.js:81 | | keep |++| POST | /api/dm/conversations | server/chat/dm-routes.js:96 | | keep |++| GET | /api/dm/conversations/:id | server/chat/dm-routes.js:160 | | keep |++| PATCH | /api/dm/conversations/:id | server/chat/dm-routes.js:363 | | keep |++| GET | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:177 | | keep |++| POST | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:195 | | keep |++| DELETE | /api/dm/conversations/:id/messages/:msgId | server/chat/dm-routes.js:453 | | keep |++| POST | /api/dm/conversations/:id/participants | server/chat/dm-routes.js:285 | | keep |++| DELETE | /api/dm/conversations/:id/participants/:userId | server/chat/dm-routes.js:342 | | keep |++| POST | /api/dm/conversations/:id/read | server/chat/dm-routes.js:264 | | keep |++| GET | /api/dm/unread | server/chat/dm-routes.js:382 | | keep |++| GET | /api/dm/users/search | server/chat/dm-routes.js:392 | | keep |++| POST | /api/sounds | server/chat/sounds-routes.js:173 | | keep |++| DELETE | /api/sounds/:id | server/chat/sounds-routes.js:315 | | keep |++| DELETE | /api/sounds/alert/:kind | server/chat/sounds-routes.js:472 | | keep |++| POST | /api/sounds/alert/:kind | server/chat/sounds-routes.js:433 | | keep |++| GET | /api/sounds/alert/mine | server/chat/sounds-routes.js:422 | | keep |++| GET | /api/sounds/all/:streamId | server/chat/sounds-routes.js:162 | | keep |++| GET | /api/sounds/channel/:userId | server/chat/sounds-routes.js:151 | | keep |++| PATCH | /api/sounds/command | server/chat/sounds-routes.js:342 | | keep |++| GET | /api/sounds/file/:filename | server/chat/sounds-routes.js:400 | | keep |++| GET | /api/tts/admin/settings | server/chat/tts-routes.js:113 | | keep |++| PUT | /api/tts/admin/settings | server/chat/tts-routes.js:132 | | keep |++| POST | /api/tts/admin/test | server/chat/tts-routes.js:165 | | keep |++| GET | /api/tts/audio/:file | server/chat/tts-routes.js:267 | | keep |++| GET | /api/tts/queue | server/chat/tts-routes.js:220 | | keep |++| POST | /api/tts/queue/:id/report | server/chat/tts-routes.js:254 | | keep |++| POST | /api/tts/queue/clear | server/chat/tts-routes.js:244 | | keep |++| POST | /api/tts/queue/skip | server/chat/tts-routes.js:232 | | keep |++| GET | /api/tts/settings | server/chat/tts-routes.js:91 | | keep |++| GET | /api/tts/voices | server/chat/tts-routes.js:81 | | keep || GET | /auth/callback | server/web/session.js:125 | | keep || POST | /auth/fedcm | server/web/session.js:150 | | keep || GET | /auth/login | server/web/session.js:111 | | keep |@@@ -1666,6 +1719,12 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /settings | server/web/pages.js:329 | | keep || GET | /sitemap.xml | server/web/pages.js:600 | | keep || GET | /updates | server/web/pages.js:594 | | keep |++| GET | /voice-channels | server/calls/routes.js:47 | | keep |++| POST | /voice-channels | server/calls/routes.js:68 | | keep |++| DELETE | /voice-channels/:channelId | server/calls/routes.js:80 | | keep |++| GET | /voice-channels/:channelId | server/calls/routes.js:57 | | keep |++| POST | /voice-channels/call-user | server/calls/routes.js:118 | | keep |++| POST | /voice-channels/call-user/respond | server/calls/routes.js:181 | | keep |## OpenRe.Stream@@@ -1687,8 +1746,8 @@ Owner = the repository whose code answers the route; target = the authority it b| POST | /destinations/:id/stop | server/api/v1.js:250 | | keep || POST | /destinations/:id/test | server/api/v1.js:237 | | keep || GET | /outputs/:id/logs | server/api/v1.js:305 | | keep |--| GET | /play/:file | server/app.js:90 | | keep |--| GET | /robots.txt | server/app.js:108 | | keep |++| GET | /play/:file | server/app.js:92 | | keep |++| GET | /robots.txt | server/app.js:110 | | keep || GET | /sessions | server/api/v1.js:262 | | keep || GET | /sessions | server/ui/routes.js:295 | | keep || GET | /sessions/:id | server/api/v1.js:283 | | keep |@@@ -1715,41 +1774,41 @@ Owner = the repository whose code answers the route; target = the authority it b| Method | Path | Source | Target | Disposition ||---|---|---|---|---|| GET | / | server/console/index.js:225 | | keep |--| GET | /api/health | server/app.js:64 | | keep |--| GET | /api/ready | server/app.js:79 | | keep |--| POST | /api/v1/admin/adjustments | server/api/v1.js:286 | | keep |--| GET | /api/v1/admin/freeze | server/api/v1.js:242 | | keep |--| POST | /api/v1/admin/freeze | server/api/v1.js:243 | | keep |--| GET | /api/v1/admin/import-holds | server/api/v1.js:301 | | keep |--| GET | /api/v1/admin/provider-accounts | server/api/v1.js:275 | | keep |--| POST | /api/v1/admin/provider-accounts | server/api/v1.js:279 | | keep |--| GET | /api/v1/admin/provider-events | server/api/v1.js:291 | | keep |--| POST | /api/v1/admin/provider-events/:id/reprocess | server/api/v1.js:296 | | keep |--| GET | /api/v1/admin/reconcile | server/api/v1.js:251 | | keep |--| GET | /api/v1/admin/reconciliations | server/api/v1.js:256 | | keep |--| GET | /api/v1/admin/reconciliations/:id | server/api/v1.js:267 | | keep |--| POST | /api/v1/admin/sweep | server/api/v1.js:300 | | keep |--| GET | /api/v1/balances/:subject | server/api/v1.js:216 | | keep |--| GET | /api/v1/cashouts | server/api/v1.js:143 | | keep |--| POST | /api/v1/cashouts | server/api/v1.js:138 | | keep |--| GET | /api/v1/cashouts/:id | server/api/v1.js:147 | | keep |--| POST | /api/v1/cashouts/:id/approve | server/api/v1.js:152 | | keep |--| POST | /api/v1/cashouts/:id/deny | server/api/v1.js:157 | | keep |--| GET | /api/v1/entitlements/:subject | server/api/v1.js:200 | | keep |--| POST | /api/v1/intents | server/api/v1.js:64 | | keep |--| GET | /api/v1/intents/:id | server/api/v1.js:87 | | keep |--| POST | /api/v1/intents/:id/capture | server/api/v1.js:92 | | keep |--| POST | /api/v1/purchases/settle | server/api/v1.js:103 | | keep |--| GET | /api/v1/rates | server/api/v1.js:52 | | keep |--| POST | /api/v1/recycle | server/api/v1.js:130 | | keep |--| GET | /api/v1/subscriptions | server/api/v1.js:183 | | keep |--| POST | /api/v1/subscriptions | server/api/v1.js:163 | | keep |--| GET | /api/v1/subscriptions/:id | server/api/v1.js:191 | | keep |--| POST | /api/v1/subscriptions/:id/cancel | server/api/v1.js:196 | | keep |--| GET | /api/v1/transactions | server/api/v1.js:218 | | keep |--| GET | /api/v1/transactions/:id | server/api/v1.js:234 | | keep |--| POST | /api/v1/transfers | server/api/v1.js:115 | | keep |--| POST | /api/v1/transfers/:id/refund | server/api/v1.js:123 | | keep |++| GET | /api/health | server/app.js:66 | | keep |++| GET | /api/ready | server/app.js:81 | | keep |++| POST | /api/v1/admin/adjustments | server/api/v1.js:292 | | keep |++| GET | /api/v1/admin/freeze | server/api/v1.js:248 | | keep |++| POST | /api/v1/admin/freeze | server/api/v1.js:249 | | keep |++| GET | /api/v1/admin/import-holds | server/api/v1.js:307 | | keep |++| GET | /api/v1/admin/provider-accounts | server/api/v1.js:281 | | keep |++| POST | /api/v1/admin/provider-accounts | server/api/v1.js:285 | | keep |++| GET | /api/v1/admin/provider-events | server/api/v1.js:297 | | keep |++| POST | /api/v1/admin/provider-events/:id/reprocess | server/api/v1.js:302 | | keep |++| GET | /api/v1/admin/reconcile | server/api/v1.js:257 | | keep |++| GET | /api/v1/admin/reconciliations | server/api/v1.js:262 | | keep |++| GET | /api/v1/admin/reconciliations/:id | server/api/v1.js:273 | | keep |++| POST | /api/v1/admin/sweep | server/api/v1.js:306 | | keep |++| GET | /api/v1/balances/:subject | server/api/v1.js:222 | | keep |++| GET | /api/v1/cashouts | server/api/v1.js:149 | | keep |++| POST | /api/v1/cashouts | server/api/v1.js:144 | | keep |++| GET | /api/v1/cashouts/:id | server/api/v1.js:153 | | keep |++| POST | /api/v1/cashouts/:id/approve | server/api/v1.js:158 | | keep |++| POST | /api/v1/cashouts/:id/deny | server/api/v1.js:163 | | keep |++| GET | /api/v1/entitlements/:subject | server/api/v1.js:206 | | keep |++| POST | /api/v1/intents | server/api/v1.js:70 | | keep |++| GET | /api/v1/intents/:id | server/api/v1.js:93 | | keep |++| POST | /api/v1/intents/:id/capture | server/api/v1.js:98 | | keep |++| POST | /api/v1/purchases/settle | server/api/v1.js:109 | | keep |++| GET | /api/v1/rates | server/api/v1.js:58 | | keep |++| POST | /api/v1/recycle | server/api/v1.js:136 | | keep |++| GET | /api/v1/subscriptions | server/api/v1.js:189 | | keep |++| POST | /api/v1/subscriptions | server/api/v1.js:169 | | keep |++| GET | /api/v1/subscriptions/:id | server/api/v1.js:197 | | keep |++| POST | /api/v1/subscriptions/:id/cancel | server/api/v1.js:202 | | keep |++| GET | /api/v1/transactions | server/api/v1.js:224 | | keep |++| GET | /api/v1/transactions/:id | server/api/v1.js:240 | | keep |++| POST | /api/v1/transfers | server/api/v1.js:121 | | keep |++| POST | /api/v1/transfers/:id/refund | server/api/v1.js:129 | | keep || GET | /audit | server/console/index.js:365 | | keep || GET | /auth/callback | server/console/index.js:184 | | keep || GET | /auth/login | server/console/index.js:177 | | keep |@@@ -1768,7 +1827,7 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /reconciliation | server/console/index.js:324 | | keep || POST | /reconciliation | server/console/index.js:330 | | keep || GET | /reconciliation/:id | server/console/index.js:325 | | keep |--| GET | /robots.txt | server/app.js:85 | | keep |++| GET | /robots.txt | server/app.js:89 | | keep || ALL | /webhooks/:provider | server/api/webhooks.js:24 | | keep |## OpenVibe.Tips@@@ -1780,40 +1839,40 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /:handle/goals | server/web/routes.js:366 | | keep || GET | /:handle/supporters | server/web/routes.js:376 | | keep || POST | /:handle/tip | server/web/routes.js:391 | | keep |--| GET | /api/health | server/app.js:79 | | keep |--| GET | /api/ready | server/app.js:85 | | keep |--| POST | /api/v1/checkout | server/api/v1.js:194 | | keep |--| GET | /api/v1/goals | server/api/v1.js:248 | | keep |--| POST | /api/v1/goals | server/api/v1.js:262 | | keep |--| GET | /api/v1/goals/:id | server/api/v1.js:256 | | keep |--| PATCH | /api/v1/goals/:id | server/api/v1.js:274 | | keep |--| POST | /api/v1/goals/:id/close | server/api/v1.js:275 | | keep |--| GET | /api/v1/interactions | server/api/v1.js:200 | | keep |--| GET | /api/v1/interactions/:id | server/api/v1.js:219 | | keep |--| POST | /api/v1/interactions/:id/${action} | server/api/v1.js:350 | | keep |--| POST | /api/v1/interactions/external | server/api/v1.js:232 | | keep |--| POST | /api/v1/me/erase | server/api/v1.js:125 | | keep |--| GET | /api/v1/me/export | server/api/v1.js:124 | | keep |--| POST | /api/v1/media-requests | server/api/v1.js:197 | | keep |--| GET | /api/v1/moderation | server/api/v1.js:338 | | keep |--| GET | /api/v1/moderation/log | server/api/v1.js:344 | | keep |--| GET | /api/v1/moderators | server/api/v1.js:358 | | keep |--| POST | /api/v1/moderators | server/api/v1.js:363 | | keep |--| POST | /api/v1/moderators/:subject/remove | server/api/v1.js:370 | | keep |--| GET | /api/v1/overlay-configs | server/api/v1.js:301 | | keep |--| POST | /api/v1/overlay-configs | server/api/v1.js:312 | | keep |--| GET | /api/v1/overlay-configs/:id | server/api/v1.js:306 | | keep |--| PATCH | /api/v1/overlay-configs/:id | server/api/v1.js:318 | | keep |--| GET | /api/v1/overlay-tokens | server/api/v1.js:278 | | keep |--| POST | /api/v1/overlay-tokens | server/api/v1.js:283 | | keep |--| POST | /api/v1/overlay-tokens/:id/revoke | server/api/v1.js:294 | | keep |--| POST | /api/v1/paid-messages | server/api/v1.js:195 | | keep |--| GET | /api/v1/profiles/:creator | server/api/v1.js:93 | | keep |--| PATCH | /api/v1/profiles/:creator | server/api/v1.js:127 | | keep |--| GET | /api/v1/profiles/:creator/supporters | server/api/v1.js:106 | | keep |--| GET | /api/v1/profiles/:creator/totals | server/api/v1.js:146 | | keep |--| POST | /api/v1/simulate | server/api/v1.js:377 | | keep |--| POST | /api/v1/tts-requests | server/api/v1.js:196 | | keep |++| GET | /api/health | server/app.js:80 | | keep |++| GET | /api/ready | server/app.js:86 | | keep |++| POST | /api/v1/checkout | server/api/v1.js:209 | | keep |++| GET | /api/v1/goals | server/api/v1.js:264 | | keep |++| POST | /api/v1/goals | server/api/v1.js:278 | | keep |++| GET | /api/v1/goals/:id | server/api/v1.js:272 | | keep |++| PATCH | /api/v1/goals/:id | server/api/v1.js:290 | | keep |++| POST | /api/v1/goals/:id/close | server/api/v1.js:291 | | keep |++| GET | /api/v1/interactions | server/api/v1.js:215 | | keep |++| GET | /api/v1/interactions/:id | server/api/v1.js:234 | | keep |++| POST | /api/v1/interactions/:id/${action} | server/api/v1.js:367 | | keep |++| POST | /api/v1/interactions/external | server/api/v1.js:248 | | keep |++| POST | /api/v1/me/erase | server/api/v1.js:134 | | keep |++| GET | /api/v1/me/export | server/api/v1.js:131 | | keep |++| POST | /api/v1/media-requests | server/api/v1.js:212 | | keep |++| GET | /api/v1/moderation | server/api/v1.js:355 | | keep |++| GET | /api/v1/moderation/log | server/api/v1.js:361 | | keep |++| GET | /api/v1/moderators | server/api/v1.js:375 | | keep |++| POST | /api/v1/moderators | server/api/v1.js:380 | | keep |++| POST | /api/v1/moderators/:subject/remove | server/api/v1.js:387 | | keep |++| GET | /api/v1/overlay-configs | server/api/v1.js:318 | | keep |++| POST | /api/v1/overlay-configs | server/api/v1.js:329 | | keep |++| GET | /api/v1/overlay-configs/:id | server/api/v1.js:323 | | keep |++| PATCH | /api/v1/overlay-configs/:id | server/api/v1.js:335 | | keep |++| GET | /api/v1/overlay-tokens | server/api/v1.js:294 | | keep |++| POST | /api/v1/overlay-tokens | server/api/v1.js:300 | | keep |++| POST | /api/v1/overlay-tokens/:id/revoke | server/api/v1.js:311 | | keep |++| POST | /api/v1/paid-messages | server/api/v1.js:210 | | keep |++| GET | /api/v1/profiles/:creator | server/api/v1.js:100 | | keep |++| PATCH | /api/v1/profiles/:creator | server/api/v1.js:136 | | keep |++| GET | /api/v1/profiles/:creator/supporters | server/api/v1.js:113 | | keep |++| GET | /api/v1/profiles/:creator/totals | server/api/v1.js:155 | | keep |++| POST | /api/v1/simulate | server/api/v1.js:395 | | keep |++| POST | /api/v1/tts-requests | server/api/v1.js:211 | | keep || GET | /auth/callback | server/web/session.js:132 | | keep || POST | /auth/fedcm | server/web/session.js:158 | | keep || GET | /auth/login | server/web/session.js:119 | | keep |@@@ -1845,32 +1904,32 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | / | server/web/routes.js:84 | | keep || GET | /:username | server/web/routes.js:224 | | keep || GET | /:username/plans/:slug | server/web/routes.js:242 | | keep |--| GET | /api/health | server/app.js:87 | | keep |--| GET | /api/ready | server/app.js:89 | | keep |--| POST | /api/v1/checkout | server/api/v1.js:210 | | keep |--| GET | /api/v1/creators/:ref | server/api/v1.js:99 | | keep |--| GET | /api/v1/creators/:ref/card | server/api/v1.js:111 | | keep |--| GET | /api/v1/creators/:ref/members | server/api/v1.js:338 | | keep |--| GET | /api/v1/entitlements/check | server/api/v1.js:276 | | keep |--| POST | /api/v1/entitlements/check | server/api/v1.js:277 | | keep |--| POST | /api/v1/memberships/:creator/cancel | server/api/v1.js:238 | | keep |--| PUT | /api/v1/memberships/:creator/preferences | server/api/v1.js:243 | | keep |--| GET | /api/v1/memberships/:subject | server/api/v1.js:222 | | keep |--| GET | /api/v1/perks | server/api/v1.js:173 | | keep |--| POST | /api/v1/perks | server/api/v1.js:180 | | keep |--| PATCH | /api/v1/perks/:id | server/api/v1.js:187 | | keep |--| GET | /api/v1/plans | server/api/v1.js:118 | | keep |--| POST | /api/v1/plans | server/api/v1.js:139 | | keep |--| GET | /api/v1/plans/:id | server/api/v1.js:132 | | keep |--| PATCH | /api/v1/plans/:id | server/api/v1.js:155 | | keep |--| POST | /api/v1/plans/:id/archive | server/api/v1.js:167 | | keep |--| POST | /api/v1/plans/:id/publish | server/api/v1.js:162 | | keep |--| GET | /api/v1/plans/:id/versions | server/api/v1.js:133 | | keep |--| GET | /api/v1/policies | server/api/v1.js:280 | | keep |--| POST | /api/v1/policies | server/api/v1.js:305 | | keep |--| DELETE | /api/v1/policies/:id | server/api/v1.js:313 | | keep |--| GET | /api/v1/policies/:id | server/api/v1.js:299 | | keep |--| POST | /api/v1/policies/evaluate | server/api/v1.js:319 | | keep |++| GET | /api/health | server/app.js:88 | | keep |++| GET | /api/ready | server/app.js:90 | | keep |++| POST | /api/v1/checkout | server/api/v1.js:220 | | keep |++| GET | /api/v1/creators/:ref | server/api/v1.js:107 | | keep |++| GET | /api/v1/creators/:ref/card | server/api/v1.js:119 | | keep |++| GET | /api/v1/creators/:ref/members | server/api/v1.js:355 | | keep |++| GET | /api/v1/entitlements/check | server/api/v1.js:292 | | keep |++| POST | /api/v1/entitlements/check | server/api/v1.js:293 | | keep |++| POST | /api/v1/memberships/:creator/cancel | server/api/v1.js:249 | | keep |++| PUT | /api/v1/memberships/:creator/preferences | server/api/v1.js:254 | | keep |++| GET | /api/v1/memberships/:subject | server/api/v1.js:232 | | keep |++| GET | /api/v1/perks | server/api/v1.js:181 | | keep |++| POST | /api/v1/perks | server/api/v1.js:188 | | keep |++| PATCH | /api/v1/perks/:id | server/api/v1.js:195 | | keep |++| GET | /api/v1/plans | server/api/v1.js:126 | | keep |++| POST | /api/v1/plans | server/api/v1.js:147 | | keep |++| GET | /api/v1/plans/:id | server/api/v1.js:140 | | keep |++| PATCH | /api/v1/plans/:id | server/api/v1.js:163 | | keep |++| POST | /api/v1/plans/:id/archive | server/api/v1.js:175 | | keep |++| POST | /api/v1/plans/:id/publish | server/api/v1.js:170 | | keep |++| GET | /api/v1/plans/:id/versions | server/api/v1.js:141 | | keep |++| GET | /api/v1/policies | server/api/v1.js:296 | | keep |++| POST | /api/v1/policies | server/api/v1.js:321 | | keep |++| DELETE | /api/v1/policies/:id | server/api/v1.js:329 | | keep |++| GET | /api/v1/policies/:id | server/api/v1.js:315 | | keep |++| POST | /api/v1/policies/evaluate | server/api/v1.js:336 | | keep || GET | /auth/callback | server/web/session.js:132 | | keep || POST | /auth/fedcm | server/web/session.js:158 | | keep || GET | /auth/login | server/web/session.js:119 | | keep |@@@ -1891,7 +1950,7 @@ Owner = the repository whose code answers the route; target = the authority it b| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/app.js:58 | | keep |++| GET | / | server/app.js:60 | | keep || GET | /api/health | server/app.js:35 | | keep || GET | /api/ready | server/app.js:42 | | keep || POST | /api/v1/${op} | server/api/runs.js:120 | | keep |@@@ -1899,9 +1958,15 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /api/v1/${plural}/:key | server/api/admin.js:83 | | keep || POST | /api/v1/${plural}/:key/versions | server/api/admin.js:90 | | keep || POST | /api/v1/${plural}/:key/versions/:version/status | server/api/admin.js:100 | | keep |++| DELETE | /api/v1/attribution-quotas/:attribution | server/api/attribution-quotas.js:63 | | keep |++| GET | /api/v1/attribution-quotas/:attribution | server/api/attribution-quotas.js:60 | | keep |++| PUT | /api/v1/attribution-quotas/:attribution | server/api/attribution-quotas.js:49 | | keep || GET | /api/v1/audit | server/api/admin.js:121 | | keep || DELETE | /api/v1/cache | server/api/admin.js:123 | | keep || GET | /api/v1/cache | server/api/admin.js:122 | | keep |++| DELETE | /api/v1/credentials/:subject | server/credentials.js:152 | | keep |++| GET | /api/v1/credentials/:subject | server/credentials.js:149 | | keep |++| PUT | /api/v1/credentials/:subject | server/credentials.js:142 | | keep || GET | /api/v1/models | server/api/admin.js:68 | | keep || POST | /api/v1/models | server/api/admin.js:69 | | keep || PATCH | /api/v1/models/:provider/:model | server/api/admin.js:70 | | keep |@@@ -1942,92 +2007,92 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /console/runs/:id | server/console/index.js:327 | | keep || POST | /console/runs/:id/cancel | server/console/index.js:335 | | keep || GET | /console/usage | server/console/index.js:357 | | keep |--| GET | /robots.txt | server/app.js:54 | | keep |++| GET | /robots.txt | server/app.js:56 | | keep |## OpenVibe.Search| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/web/page.js:174 | | keep |--| GET | /api/health | server/app.js:41 | | keep |--| GET | /api/ready | server/app.js:48 | | keep |--| DELETE | /api/v1/documents/:owner/:type/:id | server/api/documents.js:80 | | keep |--| GET | /api/v1/documents/:owner/:type/:id | server/api/query.js:223 | | keep |--| PUT | /api/v1/documents/:owner/:type/:id | server/api/documents.js:62 | | keep |--| GET | /api/v1/owners/:owner/documents | server/api/documents.js:93 | | keep |--| GET | /api/v1/owners/:owner/documents/:type/:id | server/api/documents.js:103 | | keep |--| GET | /api/v1/owners/:owner/rejections | server/api/documents.js:118 | | keep |--| GET | /api/v1/owners/:owner/removals | server/api/documents.js:131 | | keep |--| GET | /api/v1/saved-searches | server/api/saved.js:53 | | keep |--| POST | /api/v1/saved-searches | server/api/saved.js:59 | | keep |--| DELETE | /api/v1/saved-searches/:id | server/api/saved.js:102 | | keep |--| GET | /api/v1/saved-searches/:id | server/api/saved.js:94 | | keep |--| GET | /api/v1/saved-searches/:id/results | server/api/saved.js:109 | | keep |--| GET | /api/v1/search | server/api/query.js:194 | | keep |--| GET | /api/v1/suggest | server/api/query.js:206 | | keep |--| GET | /frame-init.js | server/web/page.js:157 | | keep |++| GET | / | server/web/page.js:178 | | keep |++| GET | /api/health | server/app.js:42 | | keep |++| GET | /api/ready | server/app.js:49 | | keep |++| DELETE | /api/v1/documents/:owner/:type/:id | server/api/documents.js:85 | | keep |++| GET | /api/v1/documents/:owner/:type/:id | server/api/query.js:232 | | keep |++| PUT | /api/v1/documents/:owner/:type/:id | server/api/documents.js:67 | | keep |++| GET | /api/v1/owners/:owner/documents | server/api/documents.js:98 | | keep |++| GET | /api/v1/owners/:owner/documents/:type/:id | server/api/documents.js:108 | | keep |++| GET | /api/v1/owners/:owner/rejections | server/api/documents.js:123 | | keep |++| GET | /api/v1/owners/:owner/removals | server/api/documents.js:136 | | keep |++| GET | /api/v1/saved-searches | server/api/saved.js:56 | | keep |++| POST | /api/v1/saved-searches | server/api/saved.js:62 | | keep |++| DELETE | /api/v1/saved-searches/:id | server/api/saved.js:105 | | keep |++| GET | /api/v1/saved-searches/:id | server/api/saved.js:97 | | keep |++| GET | /api/v1/saved-searches/:id/results | server/api/saved.js:112 | | keep |++| GET | /api/v1/search | server/api/query.js:203 | | keep |++| GET | /api/v1/suggest | server/api/query.js:215 | | keep |++| GET | /frame-init.js | server/web/page.js:161 | | keep || POST | /internal/events | server/api/webhook.js:126 | | keep |--| GET | /robots.txt | server/web/page.js:169 | | keep |--| GET | /updates | server/web/page.js:162 | | keep |++| GET | /robots.txt | server/web/page.js:173 | | keep |++| GET | /updates | server/web/page.js:166 | | keep |## OpenVibe.Sources| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/app.js:101 | | keep |--| GET | /api/health | server/app.js:84 | | keep |--| GET | /api/ready | server/app.js:91 | | keep |--| GET | /api/v1/health | server/api/sources.js:78 | | keep |--| GET | /api/v1/items | server/api/items.js:55 | | keep |--| DELETE | /api/v1/items/:id | server/api/items.js:99 | | keep |--| GET | /api/v1/items/:id | server/api/items.js:74 | | keep |--| GET | /api/v1/runs | server/api/sources.js:67 | | keep |--| GET | /api/v1/sources | server/api/sources.js:49 | | keep |--| POST | /api/v1/sources | server/api/sources.js:85 | | keep |--| DELETE | /api/v1/sources/:key | server/api/sources.js:100 | | keep |--| GET | /api/v1/sources/:key | server/api/sources.js:53 | | keep |--| PATCH | /api/v1/sources/:key | server/api/sources.js:92 | | keep |--| POST | /api/v1/sources/:key/fetch | server/api/sources.js:115 | | keep |--| POST | /api/v1/sources/:key/items | server/api/items.js:82 | | keep |--| GET | /api/v1/sources/:key/runs | server/api/sources.js:59 | | keep |++| GET | / | server/app.js:105 | | keep |++| GET | /api/health | server/app.js:85 | | keep |++| GET | /api/ready | server/app.js:92 | | keep |++| GET | /api/v1/health | server/api/sources.js:80 | | keep |++| GET | /api/v1/items | server/api/items.js:57 | | keep |++| DELETE | /api/v1/items/:id | server/api/items.js:101 | | keep |++| GET | /api/v1/items/:id | server/api/items.js:76 | | keep |++| GET | /api/v1/runs | server/api/sources.js:69 | | keep |++| GET | /api/v1/sources | server/api/sources.js:51 | | keep |++| POST | /api/v1/sources | server/api/sources.js:87 | | keep |++| DELETE | /api/v1/sources/:key | server/api/sources.js:102 | | keep |++| GET | /api/v1/sources/:key | server/api/sources.js:55 | | keep |++| PATCH | /api/v1/sources/:key | server/api/sources.js:94 | | keep |++| POST | /api/v1/sources/:key/fetch | server/api/sources.js:117 | | keep |++| POST | /api/v1/sources/:key/items | server/api/items.js:84 | | keep |++| GET | /api/v1/sources/:key/runs | server/api/sources.js:61 | | keep |## OpenVibe.Wiki| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/http/pages.js:98 | | keep |--| GET | /api/health | server/app.js:66 | | keep |--| GET | /api/ready | server/app.js:81 | | keep |--| DELETE | /api/v1/pages/:id | server/http/api.js:164 | | keep |--| GET | /api/v1/pages/:id | server/http/api.js:144 | | keep |--| PATCH | /api/v1/pages/:id | server/http/api.js:156 | | keep |--| GET | /api/v1/pages/:id/diff | server/http/api.js:188 | | keep |--| POST | /api/v1/pages/:id/media | server/http/api.js:226 | | keep |--| POST | /api/v1/pages/:id/media/verify | server/http/api.js:231 | | keep |--| POST | /api/v1/pages/:id/publish | server/http/api.js:208 | | keep |--| POST | /api/v1/pages/:id/revert | server/http/api.js:221 | | keep |--| GET | /api/v1/pages/:id/revisions | server/http/api.js:168 | | keep |--| POST | /api/v1/pages/:id/revisions | server/http/api.js:173 | | keep |--| GET | /api/v1/pages/:id/revisions/:n | server/http/api.js:183 | | keep |--| GET | /api/v1/pages/:id/revisions/:n/citations | server/http/api.js:193 | | keep |--| POST | /api/v1/pages/:id/revisions/:n/citations | server/http/api.js:198 | | keep |--| POST | /api/v1/pages/:id/revisions/:n/review | server/http/api.js:202 | | keep |--| POST | /api/v1/pages/:id/schedule | server/http/api.js:212 | | keep |--| POST | /api/v1/pages/:id/unpublish | server/http/api.js:217 | | keep |--| PUT | /api/v1/pages/:id/watch | server/http/api.js:236 | | keep |--| POST | /api/v1/proposals | server/http/api.js:239 | | keep |--| GET | /api/v1/proposals/:id | server/http/api.js:250 | | keep |--| POST | /api/v1/proposals/:id/review | server/http/api.js:258 | | keep |--| GET | /api/v1/search | server/http/api.js:263 | | keep |--| GET | /api/v1/spaces | server/http/api.js:116 | | keep |--| POST | /api/v1/spaces | server/http/api.js:117 | | keep |--| GET | /api/v1/spaces/:space | server/http/api.js:118 | | keep |--| PATCH | /api/v1/spaces/:space | server/http/api.js:122 | | keep |++| GET | / | server/http/pages.js:119 | | keep |++| GET | /api/health | server/app.js:67 | | keep |++| GET | /api/ready | server/app.js:82 | | keep |++| DELETE | /api/v1/pages/:id | server/http/api.js:179 | | keep |++| GET | /api/v1/pages/:id | server/http/api.js:159 | | keep |++| PATCH | /api/v1/pages/:id | server/http/api.js:171 | | keep |++| GET | /api/v1/pages/:id/diff | server/http/api.js:203 | | keep |++| POST | /api/v1/pages/:id/media | server/http/api.js:241 | | keep |++| POST | /api/v1/pages/:id/media/verify | server/http/api.js:246 | | keep |++| POST | /api/v1/pages/:id/publish | server/http/api.js:223 | | keep |++| POST | /api/v1/pages/:id/revert | server/http/api.js:236 | | keep |++| GET | /api/v1/pages/:id/revisions | server/http/api.js:183 | | keep |++| POST | /api/v1/pages/:id/revisions | server/http/api.js:188 | | keep |++| GET | /api/v1/pages/:id/revisions/:n | server/http/api.js:198 | | keep |++| GET | /api/v1/pages/:id/revisions/:n/citations | server/http/api.js:208 | | keep |++| POST | /api/v1/pages/:id/revisions/:n/citations | server/http/api.js:213 | | keep |++| POST | /api/v1/pages/:id/revisions/:n/review | server/http/api.js:217 | | keep |++| POST | /api/v1/pages/:id/schedule | server/http/api.js:227 | | keep |++| POST | /api/v1/pages/:id/unpublish | server/http/api.js:232 | | keep |++| PUT | /api/v1/pages/:id/watch | server/http/api.js:251 | | keep |++| POST | /api/v1/proposals | server/http/api.js:254 | | keep |++| GET | /api/v1/proposals/:id | server/http/api.js:265 | | keep |++| POST | /api/v1/proposals/:id/review | server/http/api.js:273 | | keep |++| GET | /api/v1/search | server/http/api.js:278 | | keep |++| GET | /api/v1/spaces | server/http/api.js:131 | | keep |++| POST | /api/v1/spaces | server/http/api.js:132 | | keep |++| GET | /api/v1/spaces/:space | server/http/api.js:133 | | keep |++| PATCH | /api/v1/spaces/:space | server/http/api.js:137 | | keep || POST | /api/v1/spaces/:space/import | server/http/api.js:86 | | keep |--| POST | /api/v1/spaces/:space/import | server/http/api.js:133 | | keep |--| POST | /api/v1/spaces/:space/pages | server/http/api.js:125 | | keep |--| GET | /api/v1/spaces/:space/roles | server/http/api.js:123 | | keep |--| PUT | /api/v1/spaces/:space/roles/:subject | server/http/api.js:124 | | keep |++| POST | /api/v1/spaces/:space/import | server/http/api.js:148 | | keep |++| POST | /api/v1/spaces/:space/pages | server/http/api.js:140 | | keep |++| GET | /api/v1/spaces/:space/roles | server/http/api.js:138 | | keep |++| PUT | /api/v1/spaces/:space/roles/:subject | server/http/api.js:139 | | keep || GET | /auth/callback | server/auth/session.js:125 | | keep || POST | /auth/fedcm | server/auth/session.js:150 | | keep || GET | /auth/login | server/auth/session.js:111 | | keep |@@@ -2037,40 +2102,40 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /feed.atom | server/http/machine.js:84 | | keep || GET | /feed.json | server/http/machine.js:89 | | keep || GET | /llms.txt | server/http/machine.js:93 | | keep |--| GET | /new-space | server/http/pages.js:115 | | keep |--| POST | /new-space | server/http/pages.js:119 | | keep |--| POST | /proposals/:id | server/http/pages.js:247 | | keep |--| GET | /recent | server/http/pages.js:108 | | keep |++| GET | /new-space | server/http/pages.js:137 | | keep |++| POST | /new-space | server/http/pages.js:141 | | keep |++| POST | /proposals/:id | server/http/pages.js:269 | | keep |++| GET | /recent | server/http/pages.js:130 | | keep || GET | /robots.txt | server/http/machine.js:24 | | keep |--| GET | /s/:space | server/http/pages.js:131 | | keep |--| GET | /s/:space/import | server/http/pages.js:215 | | keep |--| POST | /s/:space/import | server/http/pages.js:220 | | keep |--| GET | /s/:space/new | server/http/pages.js:158 | | keep |--| POST | /s/:space/new | server/http/pages.js:164 | | keep |--| GET | /s/:space/proposals | server/http/pages.js:240 | | keep |--| GET | /s/:space/settings | server/http/pages.js:183 | | keep |--| POST | /s/:space/settings | server/http/pages.js:190 | | keep |--| GET | /search | server/app.js:108 | | keep |--| GET | /search | server/http/pages.js:109 | | keep |++| GET | /s/:space | server/http/pages.js:153 | | keep |++| GET | /s/:space/import | server/http/pages.js:237 | | keep |++| POST | /s/:space/import | server/http/pages.js:242 | | keep |++| GET | /s/:space/new | server/http/pages.js:180 | | keep |++| POST | /s/:space/new | server/http/pages.js:186 | | keep |++| GET | /s/:space/proposals | server/http/pages.js:262 | | keep |++| GET | /s/:space/settings | server/http/pages.js:205 | | keep |++| POST | /s/:space/settings | server/http/pages.js:212 | | keep |++| GET | /search | server/app.js:112 | | keep |++| GET | /search | server/http/pages.js:131 | | keep || GET | /sitemap.xml | server/http/machine.js:46 | | keep || GET | /sitemaps/pages-:n.xml | server/http/machine.js:53 | | keep || GET | /sitemaps/spaces.xml | server/http/machine.js:52 | | keep |--| GET | /updates | server/http/pages.js:107 | | keep |--| GET | /w/:space/:slug | server/http/pages.js:285 | | keep |--| GET | /w/:space/:slug/compare | server/http/pages.js:349 | | keep |--| GET | /w/:space/:slug/diff/:a/:b | server/http/pages.js:357 | | keep |--| POST | /w/:space/:slug/discuss | server/http/pages.js:516 | | keep |--| GET | /w/:space/:slug/edit | server/http/pages.js:378 | | keep |--| POST | /w/:space/:slug/edit | server/http/pages.js:393 | | keep |--| GET | /w/:space/:slug/history | server/http/pages.js:324 | | keep |--| GET | /w/:space/:slug/publish | server/http/pages.js:441 | | keep |--| GET | /w/:space/:slug/revert | server/http/pages.js:420 | | keep |--| POST | /w/:space/:slug/revert | server/http/pages.js:431 | | keep |--| POST | /w/:space/:slug/review | server/http/pages.js:498 | | keep |--| GET | /w/:space/:slug/settings | server/http/pages.js:450 | | keep |--| POST | /w/:space/:slug/settings | server/http/pages.js:464 | | keep |--| GET | /w/:space/:slug/sources | server/http/pages.js:335 | | keep |--| POST | /w/:space/:slug/watch | server/http/pages.js:508 | | keep |++| GET | /updates | server/http/pages.js:129 | | keep |++| GET | /w/:space/:slug | server/http/pages.js:307 | | keep |++| GET | /w/:space/:slug/compare | server/http/pages.js:371 | | keep |++| GET | /w/:space/:slug/diff/:a/:b | server/http/pages.js:379 | | keep |++| POST | /w/:space/:slug/discuss | server/http/pages.js:538 | | keep |++| GET | /w/:space/:slug/edit | server/http/pages.js:400 | | keep |++| POST | /w/:space/:slug/edit | server/http/pages.js:415 | | keep |++| GET | /w/:space/:slug/history | server/http/pages.js:346 | | keep |++| GET | /w/:space/:slug/publish | server/http/pages.js:463 | | keep |++| GET | /w/:space/:slug/revert | server/http/pages.js:442 | | keep |++| POST | /w/:space/:slug/revert | server/http/pages.js:453 | | keep |++| POST | /w/:space/:slug/review | server/http/pages.js:520 | | keep |++| GET | /w/:space/:slug/settings | server/http/pages.js:472 | | keep |++| POST | /w/:space/:slug/settings | server/http/pages.js:486 | | keep |++| GET | /w/:space/:slug/sources | server/http/pages.js:357 | | keep |++| POST | /w/:space/:slug/watch | server/http/pages.js:530 | | keep |## OpenVibe.Blog@@@ -2079,32 +2144,32 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | / | server/http/public.js:118 | | keep || GET | /@:handle | server/http/public.js:130 | | keep || GET | /@:handle/:slug | server/http/public.js:364 | | keep |--| POST | /@:handle/:slug/comments | server/http/public.js:381 | | keep |++| POST | /@:handle/:slug/comments | server/http/public.js:383 | | keep || GET | /@:handle/${file} | server/http/public.js:156 | | keep || GET | /@:handle/authors/:who | server/http/public.js:227 | | keep || GET | /@:handle/categories/:category | server/http/public.js:203 | | keep || GET | /@:handle/series/:series | server/http/public.js:214 | | keep || GET | /@:handle/tags/:tag | server/http/public.js:188 | | keep || GET | /${file} | server/http/public.js:155 | | keep |--| GET | /api/health | server/app.js:112 | | keep |--| GET | /api/ready | server/app.js:116 | | keep |--| POST | /api/v1/blogs | server/http/api.js:127 | | keep |--| GET | /api/v1/blogs/:handle | server/http/api.js:122 | | keep |--| PATCH | /api/v1/blogs/:handle | server/http/api.js:134 | | keep |--| GET | /api/v1/blogs/:handle/feed | server/http/api.js:221 | | keep |--| GET | /api/v1/blogs/:handle/members | server/http/api.js:152 | | keep |--| DELETE | /api/v1/blogs/:handle/members/:subject | server/http/api.js:166 | | keep |--| PUT | /api/v1/blogs/:handle/members/:subject | server/http/api.js:160 | | keep |--| GET | /api/v1/blogs/:handle/posts | server/http/api.js:172 | | keep |--| POST | /api/v1/blogs/:handle/posts | server/http/api.js:214 | | keep |--| POST | /api/v1/blogs/:handle/posts/ai-draft | server/http/api.js:206 | | keep |--| PUT | /api/v1/blogs/:handle/theme | server/http/api.js:146 | | keep |--| GET | /api/v1/changelog | server/http/api.js:187 | | keep |--| GET | /api/v1/posts/:id | server/http/api.js:232 | | keep |--| GET | /api/v1/posts/:id/diff | server/http/api.js:306 | | keep |--| POST | /api/v1/posts/:id/reviews | server/http/api.js:279 | | keep |--| GET | /api/v1/posts/:id/revisions | server/http/api.js:296 | | keep |--| GET | /api/v1/posts/:id/revisions/:n | server/http/api.js:300 | | keep |++| GET | /api/health | server/app.js:117 | | keep |++| GET | /api/ready | server/app.js:121 | | keep |++| POST | /api/v1/blogs | server/http/api.js:132 | | keep |++| GET | /api/v1/blogs/:handle | server/http/api.js:127 | | keep |++| PATCH | /api/v1/blogs/:handle | server/http/api.js:139 | | keep |++| GET | /api/v1/blogs/:handle/feed | server/http/api.js:226 | | keep |++| GET | /api/v1/blogs/:handle/members | server/http/api.js:157 | | keep |++| DELETE | /api/v1/blogs/:handle/members/:subject | server/http/api.js:171 | | keep |++| PUT | /api/v1/blogs/:handle/members/:subject | server/http/api.js:165 | | keep |++| GET | /api/v1/blogs/:handle/posts | server/http/api.js:177 | | keep |++| POST | /api/v1/blogs/:handle/posts | server/http/api.js:219 | | keep |++| POST | /api/v1/blogs/:handle/posts/ai-draft | server/http/api.js:211 | | keep |++| PUT | /api/v1/blogs/:handle/theme | server/http/api.js:151 | | keep |++| GET | /api/v1/changelog | server/http/api.js:192 | | keep |++| GET | /api/v1/posts/:id | server/http/api.js:237 | | keep |++| GET | /api/v1/posts/:id/diff | server/http/api.js:311 | | keep |++| POST | /api/v1/posts/:id/reviews | server/http/api.js:284 | | keep |++| GET | /api/v1/posts/:id/revisions | server/http/api.js:301 | | keep |++| GET | /api/v1/posts/:id/revisions/:n | server/http/api.js:305 | | keep || GET | /auth/callback | server/auth/sso.js:282 | | keep || POST | /auth/fedcm | server/auth/sso.js:328 | | keep || GET | /auth/login | server/auth/sso.js:260 | | keep |@@@ -2119,22 +2184,27 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /sitemaps/posts.xml | server/http/discovery.js:78 | | keep || GET | /tags/:tag | server/http/public.js:196 | | keep || GET | /updates | server/http/public.js:122 | | keep |--| GET | /write | server/http/editor.js:94 | | keep |--| GET | /write/@:handle | server/http/editor.js:109 | | keep |--| POST | /write/@:handle/ai-draft | server/http/editor.js:125 | | keep |--| POST | /write/@:handle/members | server/http/editor.js:162 | | keep |--| POST | /write/@:handle/members/remove | server/http/editor.js:173 | | keep |--| GET | /write/@:handle/new | server/http/editor.js:117 | | keep |--| POST | /write/@:handle/new | server/http/editor.js:134 | | keep |--| GET | /write/@:handle/settings | server/http/editor.js:142 | | keep |--| POST | /write/@:handle/settings | server/http/editor.js:150 | | keep |--| GET | /write/posts/:id | server/http/editor.js:182 | | keep |--| POST | /write/posts/:id | server/http/editor.js:203 | | keep |--| POST | /write/posts/:id/${name} | server/http/editor.js:212 | | keep |--| POST | /write/posts/:id/media/:aid/remove | server/http/editor.js:242 | | keep |--| GET | /write/posts/:id/preview | server/http/editor.js:260 | | keep |--| GET | /write/posts/:id/revisions | server/http/editor.js:249 | | keep |--| POST | /write/start | server/http/editor.js:101 | | keep |++| GET | /write | server/http/editor.js:106 | | keep |++| GET | /write/@:handle | server/http/editor.js:121 | | keep |++| POST | /write/@:handle/ai-draft | server/http/editor.js:56 | | keep |++| POST | /write/@:handle/ai-draft | server/http/editor.js:137 | | keep |++| POST | /write/@:handle/members | server/http/editor.js:174 | | keep |++| POST | /write/@:handle/members/remove | server/http/editor.js:185 | | keep |++| GET | /write/@:handle/new | server/http/editor.js:129 | | keep |++| POST | /write/@:handle/new | server/http/editor.js:57 | | keep |++| POST | /write/@:handle/new | server/http/editor.js:146 | | keep |++| GET | /write/@:handle/settings | server/http/editor.js:154 | | keep |++| POST | /write/@:handle/settings | server/http/editor.js:58 | | keep |++| POST | /write/@:handle/settings | server/http/editor.js:162 | | keep |++| GET | /write/posts/:id | server/http/editor.js:194 | | keep |++| POST | /write/posts/:id | server/http/editor.js:215 | | keep |++| POST | /write/posts/:id/${name} | server/http/editor.js:224 | | keep |++| POST | /write/posts/:id/delete | server/http/editor.js:62 | | keep |++| POST | /write/posts/:id/media/:aid/remove | server/http/editor.js:254 | | keep |++| GET | /write/posts/:id/preview | server/http/editor.js:272 | | keep |++| GET | /write/posts/:id/revisions | server/http/editor.js:261 | | keep |++| POST | /write/start | server/http/editor.js:55 | | keep |++| POST | /write/start | server/http/editor.js:113 | | keep |## OpenVibe.News@@@ -2142,43 +2212,43 @@ Owner = the repository whose code answers the route; target = the authority it b|---|---|---|---|---|| GET | / | server/http/public.js:98 | | keep || GET | /${f.file} | server/http/public.js:130 | | keep |--| GET | /api/health | server/app.js:107 | | keep |--| GET | /api/ready | server/app.js:111 | | keep |--| GET | /api/v1/clusters | server/http/api.js:219 | | keep |--| GET | /api/v1/clusters/:id | server/http/api.js:224 | | keep |--| POST | /api/v1/clusters/:id/merge | server/http/api.js:235 | | keep |--| POST | /api/v1/clusters/:id/split | server/http/api.js:241 | | keep |--| POST | /api/v1/clusters/audit/:auditId/reverse | server/http/api.js:230 | | keep |--| GET | /api/v1/ingest | server/http/api.js:253 | | keep |--| GET | /api/v1/source-items/:id | server/http/api.js:247 | | keep |--| GET | /api/v1/stories | server/http/api.js:129 | | keep |--| POST | /api/v1/stories | server/http/api.js:152 | | keep |--| GET | /api/v1/stories/:id | server/http/api.js:139 | | keep |--| GET | /api/v1/stories/:id/diff | server/http/api.js:170 | | keep |--| POST | /api/v1/stories/:id/reviews | server/http/api.js:200 | | keep |--| GET | /api/v1/stories/:id/revisions | server/http/api.js:158 | | keep |--| GET | /api/v1/stories/:id/revisions/:n | server/http/api.js:163 | | keep |--| GET | /api/v1/topics | server/http/api.js:118 | | keep |--| POST | /api/v1/topics | server/http/api.js:120 | | keep |++| GET | /api/health | server/app.js:112 | | keep |++| GET | /api/ready | server/app.js:116 | | keep |++| GET | /api/v1/clusters | server/http/api.js:225 | | keep |++| GET | /api/v1/clusters/:id | server/http/api.js:230 | | keep |++| POST | /api/v1/clusters/:id/merge | server/http/api.js:241 | | keep |++| POST | /api/v1/clusters/:id/split | server/http/api.js:247 | | keep |++| POST | /api/v1/clusters/audit/:auditId/reverse | server/http/api.js:236 | | keep |++| GET | /api/v1/ingest | server/http/api.js:259 | | keep |++| GET | /api/v1/source-items/:id | server/http/api.js:253 | | keep |++| GET | /api/v1/stories | server/http/api.js:134 | | keep |++| POST | /api/v1/stories | server/http/api.js:157 | | keep |++| GET | /api/v1/stories/:id | server/http/api.js:144 | | keep |++| GET | /api/v1/stories/:id/diff | server/http/api.js:175 | | keep |++| POST | /api/v1/stories/:id/reviews | server/http/api.js:206 | | keep |++| GET | /api/v1/stories/:id/revisions | server/http/api.js:163 | | keep |++| GET | /api/v1/stories/:id/revisions/:n | server/http/api.js:168 | | keep |++| GET | /api/v1/topics | server/http/api.js:123 | | keep |++| POST | /api/v1/topics | server/http/api.js:125 | | keep || GET | /auth/callback | server/auth/sso.js:282 | | keep || POST | /auth/fedcm | server/auth/sso.js:328 | | keep || GET | /auth/login | server/auth/sso.js:260 | | keep || GET | /auth/logout | server/auth/sso.js:356 | | keep || GET | /auth/me | server/auth/sso.js:380 | | keep || POST | /auth/refresh | server/auth/sso.js:390 | | keep |--| GET | /clusters/:id | server/http/editor.js:105 | | keep |--| POST | /clusters/:id/merge | server/http/editor.js:114 | | keep |--| POST | /clusters/:id/split | server/http/editor.js:119 | | keep |--| POST | /clusters/:id/stories | server/http/editor.js:128 | | keep |--| POST | /clusters/audit/:aid/reverse | server/http/editor.js:124 | | keep |--| GET | /edit | server/http/editor.js:74 | | keep |--| POST | /edit/pull | server/http/editor.js:85 | | keep |--| GET | /edit/stories/:id | server/http/editor.js:142 | | keep |--| POST | /edit/stories/:id/${path} | server/http/editor.js:171 | | keep |--| GET | /edit/stories/:id/diff | server/http/editor.js:165 | | keep |--| GET | /edit/stories/:id/preview | server/http/editor.js:155 | | keep |--| GET | /edit/topics | server/http/editor.js:90 | | keep |--| POST | /edit/topics | server/http/editor.js:91 | | keep |++| GET | /clusters/:id | server/http/editor.js:110 | | keep |++| POST | /clusters/:id/merge | server/http/editor.js:119 | | keep |++| POST | /clusters/:id/split | server/http/editor.js:124 | | keep |++| POST | /clusters/:id/stories | server/http/editor.js:133 | | keep |++| POST | /clusters/audit/:aid/reverse | server/http/editor.js:129 | | keep |++| GET | /edit | server/http/editor.js:79 | | keep |++| POST | /edit/pull | server/http/editor.js:90 | | keep |++| GET | /edit/stories/:id | server/http/editor.js:147 | | keep |++| POST | /edit/stories/:id/${path} | server/http/editor.js:176 | | keep |++| GET | /edit/stories/:id/diff | server/http/editor.js:170 | | keep |++| GET | /edit/stories/:id/preview | server/http/editor.js:160 | | keep |++| GET | /edit/topics | server/http/editor.js:95 | | keep |++| POST | /edit/topics | server/http/editor.js:96 | | keep || POST | /internal/events | server/http/webhook.js:29 | | keep || GET | /llms.txt | server/http/discovery.js:47 | | keep || GET | /robots.txt | server/http/discovery.js:35 | | keep |@@@ -2186,7 +2256,7 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /sitemaps/stories.xml | server/http/discovery.js:76 | | keep || GET | /sitemaps/topics.xml | server/http/discovery.js:80 | | keep || GET | /stories/:slug | server/http/public.js:185 | | keep |--| POST | /stories/:slug/comments | server/http/public.js:201 | | keep |++| POST | /stories/:slug/comments | server/http/public.js:202 | | keep || GET | /topics | server/http/public.js:100 | | keep || GET | /topics/:slug | server/http/public.js:104 | | keep || GET | /topics/:slug/${f.file} | server/http/public.js:131 | | keep |@@@ -2196,158 +2266,158 @@ Owner = the repository whose code answers the route; target = the authority it b| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/http/pages.js:141 | | keep |--| GET | /about | server/http/pages.js:150 | | keep |--| GET | /api/health | server/app.js:83 | | keep |--| GET | /api/ready | server/app.js:103 | | keep |--| GET | /api/v1/corrections | server/http/api.js:152 | | keep |--| PATCH | /api/v1/corrections/:id | server/http/api.js:156 | | keep |--| GET | /api/v1/entities | server/http/api.js:71 | | keep |--| POST | /api/v1/entities | server/http/api.js:91 | | keep |--| DELETE | /api/v1/entities/:ref | server/http/api.js:96 | | keep |--| GET | /api/v1/entities/:ref | server/http/api.js:78 | | keep |--| PATCH | /api/v1/entities/:ref | server/http/api.js:95 | | keep |--| GET | /api/v1/entities/:ref/aggregate | server/http/api.js:85 | | keep |--| POST | /api/v1/entities/:ref/aliases | server/http/api.js:97 | | keep |--| DELETE | /api/v1/entities/:ref/aliases/:id | server/http/api.js:98 | | keep |--| POST | /api/v1/entities/:ref/corrections | server/http/api.js:151 | | keep |--| GET | /api/v1/entities/:ref/history | server/http/api.js:84 | | keep |--| POST | /api/v1/entities/:ref/links | server/http/api.js:99 | | keep |--| DELETE | /api/v1/entities/:ref/links/:id | server/http/api.js:100 | | keep |--| POST | /api/v1/entities/:ref/merge | server/http/api.js:101 | | keep |--| POST | /api/v1/entities/:ref/split | server/http/api.js:105 | | keep |--| POST | /api/v1/entities/:ref/summary/proposals | server/http/api.js:145 | | keep |--| POST | /api/v1/entities/:ref/summary/publish | server/http/api.js:148 | | keep |--| POST | /api/v1/entities/:ref/summary/revisions | server/http/api.js:144 | | keep |--| GET | /api/v1/entities/:ref/summary/revisions/:n | server/http/api.js:146 | | keep |--| POST | /api/v1/entities/:ref/summary/revisions/:n/review | server/http/api.js:147 | | keep |--| POST | /api/v1/entities/:ref/summary/unpublish | server/http/api.js:149 | | keep |--| GET | /api/v1/items | server/http/api.js:111 | | keep |--| GET | /api/v1/items/:id | server/http/api.js:115 | | keep |--| POST | /api/v1/items/:id/resolution | server/http/api.js:122 | | keep |--| POST | /api/v1/resolve | server/http/api.js:77 | | keep |--| POST | /api/v1/signals/import | server/http/api.js:129 | | keep |--| POST | /api/v1/sources/sync | server/http/api.js:136 | | keep |--| POST | /api/v1/trust | server/http/api.js:109 | | keep |++| GET | / | server/http/pages.js:145 | | keep |++| GET | /about | server/http/pages.js:154 | | keep |++| GET | /api/health | server/app.js:84 | | keep |++| GET | /api/ready | server/app.js:104 | | keep |++| GET | /api/v1/corrections | server/http/api.js:158 | | keep |++| PATCH | /api/v1/corrections/:id | server/http/api.js:162 | | keep |++| GET | /api/v1/entities | server/http/api.js:76 | | keep |++| POST | /api/v1/entities | server/http/api.js:97 | | keep |++| DELETE | /api/v1/entities/:ref | server/http/api.js:102 | | keep |++| GET | /api/v1/entities/:ref | server/http/api.js:84 | | keep |++| PATCH | /api/v1/entities/:ref | server/http/api.js:101 | | keep |++| GET | /api/v1/entities/:ref/aggregate | server/http/api.js:91 | | keep |++| POST | /api/v1/entities/:ref/aliases | server/http/api.js:103 | | keep |++| DELETE | /api/v1/entities/:ref/aliases/:id | server/http/api.js:104 | | keep |++| POST | /api/v1/entities/:ref/corrections | server/http/api.js:157 | | keep |++| GET | /api/v1/entities/:ref/history | server/http/api.js:90 | | keep |++| POST | /api/v1/entities/:ref/links | server/http/api.js:105 | | keep |++| DELETE | /api/v1/entities/:ref/links/:id | server/http/api.js:106 | | keep |++| POST | /api/v1/entities/:ref/merge | server/http/api.js:107 | | keep |++| POST | /api/v1/entities/:ref/split | server/http/api.js:111 | | keep |++| POST | /api/v1/entities/:ref/summary/proposals | server/http/api.js:151 | | keep |++| POST | /api/v1/entities/:ref/summary/publish | server/http/api.js:154 | | keep |++| POST | /api/v1/entities/:ref/summary/revisions | server/http/api.js:150 | | keep |++| GET | /api/v1/entities/:ref/summary/revisions/:n | server/http/api.js:152 | | keep |++| POST | /api/v1/entities/:ref/summary/revisions/:n/review | server/http/api.js:153 | | keep |++| POST | /api/v1/entities/:ref/summary/unpublish | server/http/api.js:155 | | keep |++| GET | /api/v1/items | server/http/api.js:117 | | keep |++| GET | /api/v1/items/:id | server/http/api.js:121 | | keep |++| POST | /api/v1/items/:id/resolution | server/http/api.js:128 | | keep |++| POST | /api/v1/resolve | server/http/api.js:83 | | keep |++| POST | /api/v1/signals/import | server/http/api.js:135 | | keep |++| POST | /api/v1/sources/sync | server/http/api.js:142 | | keep |++| POST | /api/v1/trust | server/http/api.js:115 | | keep || GET | /auth/callback | server/auth/session.js:125 | | keep || POST | /auth/fedcm | server/auth/session.js:150 | | keep || GET | /auth/login | server/auth/session.js:111 | | keep || GET | /auth/logout | server/auth/session.js:164 | | keep || GET | /auth/me | server/auth/session.js:180 | | keep || POST | /auth/refresh | server/auth/session.js:186 | | keep |--| GET | /e/:slug | server/http/pages.js:176 | | keep |--| GET | /e/:slug.json | server/http/pages.js:156 | | keep |--| GET | /e/:slug/correct | server/http/pages.js:204 | | keep |--| POST | /e/:slug/correct | server/app.js:125 | | keep |--| POST | /e/:slug/correct | server/http/pages.js:210 | | keep |--| POST | /e/:slug/discuss | server/http/pages.js:224 | | keep |--| GET | /e/:slug/edit | server/http/pages.js:285 | | keep |--| POST | /e/:slug/edit | server/http/pages.js:291 | | keep |--| GET | /e/:slug/history | server/http/pages.js:191 | | keep |--| POST | /e/:slug/merge | server/http/pages.js:339 | | keep |--| POST | /e/:slug/split | server/http/pages.js:348 | | keep |--| POST | /e/:slug/summary | server/http/pages.js:317 | | keep |--| GET | /e/:slug/summary/:n | server/http/pages.js:197 | | keep |--| POST | /e/:slug/summary/:n/review | server/http/pages.js:330 | | keep |--| GET | /editor | server/http/pages.js:242 | | keep |--| POST | /editor/corrections/:id | server/http/pages.js:376 | | keep |--| GET | /editor/entities/new | server/http/pages.js:258 | | keep |--| POST | /editor/entities/new | server/http/pages.js:262 | | keep |--| GET | /editor/items/:id | server/http/pages.js:357 | | keep |--| POST | /editor/items/:id | server/http/pages.js:365 | | keep |--| POST | /editor/sync | server/http/pages.js:250 | | keep |++| GET | /e/:slug | server/http/pages.js:180 | | keep |++| GET | /e/:slug.json | server/http/pages.js:160 | | keep |++| GET | /e/:slug/correct | server/http/pages.js:208 | | keep |++| POST | /e/:slug/correct | server/app.js:129 | | keep |++| POST | /e/:slug/correct | server/http/pages.js:214 | | keep |++| POST | /e/:slug/discuss | server/http/pages.js:228 | | keep |++| GET | /e/:slug/edit | server/http/pages.js:289 | | keep |++| POST | /e/:slug/edit | server/http/pages.js:295 | | keep |++| GET | /e/:slug/history | server/http/pages.js:195 | | keep |++| POST | /e/:slug/merge | server/http/pages.js:343 | | keep |++| POST | /e/:slug/split | server/http/pages.js:352 | | keep |++| POST | /e/:slug/summary | server/http/pages.js:321 | | keep |++| GET | /e/:slug/summary/:n | server/http/pages.js:201 | | keep |++| POST | /e/:slug/summary/:n/review | server/http/pages.js:334 | | keep |++| GET | /editor | server/http/pages.js:246 | | keep |++| POST | /editor/corrections/:id | server/http/pages.js:380 | | keep |++| GET | /editor/entities/new | server/http/pages.js:262 | | keep |++| POST | /editor/entities/new | server/http/pages.js:266 | | keep |++| GET | /editor/items/:id | server/http/pages.js:361 | | keep |++| POST | /editor/items/:id | server/http/pages.js:369 | | keep |++| POST | /editor/sync | server/http/pages.js:254 | | keep || POST | /events | server/http/consumer.js:43 | | keep || GET | /feed.atom | server/http/machine.js:66 | | keep || GET | /feed.json | server/http/machine.js:71 | | keep || GET | /llms.txt | server/http/machine.js:75 | | keep || GET | /robots.txt | server/http/machine.js:23 | | keep |--| GET | /search | server/http/pages.js:151 | | keep |++| GET | /search | server/http/pages.js:155 | | keep || GET | /sitemap.xml | server/http/machine.js:34 | | keep || GET | /sitemaps/entities-:n.xml | server/http/machine.js:45 | | keep || GET | /sitemaps/pages.xml | server/http/machine.js:40 | | keep |--| GET | /updates | server/http/pages.js:149 | | keep |++| GET | /updates | server/http/pages.js:153 | | keep |## OpenVibe.Deals| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/http/pages.js:132 | | keep |--| GET | /api/health | server/app.js:114 | | keep |--| GET | /api/ready | server/app.js:118 | | keep |--| GET | /api/v1/flags | server/http/api.js:144 | | keep |--| POST | /api/v1/flags/:id/resolve | server/http/api.js:150 | | keep |--| GET | /api/v1/offers | server/http/api.js:65 | | keep |--| POST | /api/v1/offers | server/http/api.js:93 | | keep |--| GET | /api/v1/offers/:id | server/http/api.js:73 | | keep |--| PATCH | /api/v1/offers/:id | server/http/api.js:99 | | keep |--| POST | /api/v1/offers/:id/${action} | server/http/api.js:141 | | keep |--| POST | /api/v1/offers/:id/expire | server/http/api.js:107 | | keep |--| POST | /api/v1/offers/:id/flags | server/http/api.js:123 | | keep |--| GET | /api/v1/offers/:id/hotness | server/http/api.js:82 | | keep |--| POST | /api/v1/offers/:id/merge | server/http/api.js:129 | | keep |--| POST | /api/v1/offers/:id/observations | server/http/api.js:101 | | keep |--| POST | /api/v1/offers/:id/unmerge | server/http/api.js:135 | | keep |--| DELETE | /api/v1/offers/:id/vote | server/http/api.js:117 | | keep |--| PUT | /api/v1/offers/:id/vote | server/http/api.js:109 | | keep |--| GET | /api/v1/products/:slug | server/http/api.js:157 | | keep |--| POST | /api/v1/products/resolve | server/http/api.js:167 | | keep |--| GET | /api/v1/stores/:domain | server/http/api.js:181 | | keep |--| GET | /api/v1/watches | server/http/api.js:189 | | keep |--| POST | /api/v1/watches | server/http/api.js:191 | | keep |--| DELETE | /api/v1/watches/:id | server/http/api.js:196 | | keep |--| GET | /atom.xml | server/http/pages.js:424 | | keep |++| GET | / | server/http/pages.js:135 | | keep |++| GET | /api/health | server/app.js:118 | | keep |++| GET | /api/ready | server/app.js:122 | | keep |++| GET | /api/v1/flags | server/http/api.js:148 | | keep |++| POST | /api/v1/flags/:id/resolve | server/http/api.js:154 | | keep |++| GET | /api/v1/offers | server/http/api.js:69 | | keep |++| POST | /api/v1/offers | server/http/api.js:97 | | keep |++| GET | /api/v1/offers/:id | server/http/api.js:77 | | keep |++| PATCH | /api/v1/offers/:id | server/http/api.js:103 | | keep |++| POST | /api/v1/offers/:id/${action} | server/http/api.js:145 | | keep |++| POST | /api/v1/offers/:id/expire | server/http/api.js:111 | | keep |++| POST | /api/v1/offers/:id/flags | server/http/api.js:127 | | keep |++| GET | /api/v1/offers/:id/hotness | server/http/api.js:86 | | keep |++| POST | /api/v1/offers/:id/merge | server/http/api.js:133 | | keep |++| POST | /api/v1/offers/:id/observations | server/http/api.js:105 | | keep |++| POST | /api/v1/offers/:id/unmerge | server/http/api.js:139 | | keep |++| DELETE | /api/v1/offers/:id/vote | server/http/api.js:121 | | keep |++| PUT | /api/v1/offers/:id/vote | server/http/api.js:113 | | keep |++| GET | /api/v1/products/:slug | server/http/api.js:161 | | keep |++| POST | /api/v1/products/resolve | server/http/api.js:171 | | keep |++| GET | /api/v1/stores/:domain | server/http/api.js:185 | | keep |++| GET | /api/v1/watches | server/http/api.js:193 | | keep |++| POST | /api/v1/watches | server/http/api.js:195 | | keep |++| DELETE | /api/v1/watches/:id | server/http/api.js:200 | | keep |++| GET | /atom.xml | server/http/pages.js:427 | | keep || GET | /auth/callback | server/auth/sso.js:282 | | keep || POST | /auth/fedcm | server/auth/sso.js:328 | | keep || GET | /auth/login | server/auth/sso.js:260 | | keep || GET | /auth/logout | server/auth/sso.js:356 | | keep || GET | /auth/me | server/auth/sso.js:380 | | keep || POST | /auth/refresh | server/auth/sso.js:390 | | keep |--| GET | /d/:slug | server/http/pages.js:204 | | keep |--| POST | /d/:slug/comments | server/http/pages.js:235 | | keep |--| POST | /d/:slug/expire | server/http/pages.js:230 | | keep |--| POST | /d/:slug/flag | server/http/pages.js:225 | | keep |--| POST | /d/:slug/observe | server/http/pages.js:220 | | keep |--| POST | /d/:slug/vote | server/http/pages.js:212 | | keep |--| GET | /feed.json | server/http/pages.js:428 | | keep |--| GET | /feed.xml | server/http/pages.js:423 | | keep |++| GET | /d/:slug | server/http/pages.js:207 | | keep |++| POST | /d/:slug/comments | server/http/pages.js:238 | | keep |++| POST | /d/:slug/expire | server/http/pages.js:233 | | keep |++| POST | /d/:slug/flag | server/http/pages.js:228 | | keep |++| POST | /d/:slug/observe | server/http/pages.js:223 | | keep |++| POST | /d/:slug/vote | server/http/pages.js:215 | | keep |++| GET | /feed.json | server/http/pages.js:431 | | keep |++| GET | /feed.xml | server/http/pages.js:426 | | keep || POST | /internal/events | server/http/internal.js:24 | | keep || GET | /llms.txt | server/http/discovery.js:51 | | keep |--| GET | /mod | server/http/pages.js:371 | | keep |--| POST | /mod/flags/:id/:action | server/http/pages.js:398 | | keep |--| POST | /mod/offers/:slug/:action | server/http/pages.js:380 | | keep |--| GET | /new | server/http/pages.js:139 | | keep |--| GET | /p/:slug | server/http/pages.js:252 | | keep |++| GET | /mod | server/http/pages.js:374 | | keep |++| POST | /mod/flags/:id/:action | server/http/pages.js:401 | | keep |++| POST | /mod/offers/:slug/:action | server/http/pages.js:383 | | keep |++| GET | /new | server/http/pages.js:142 | | keep |++| GET | /p/:slug | server/http/pages.js:255 | | keep || GET | /robots.txt | server/http/discovery.js:39 | | keep |--| GET | /s/:domain | server/http/pages.js:275 | | keep |--| GET | /search | server/http/pages.js:293 | | keep |++| GET | /s/:domain | server/http/pages.js:278 | | keep |++| GET | /search | server/http/pages.js:296 | | keep || GET | /sitemap.xml | server/http/discovery.js:69 | | keep || GET | /sitemaps/offers.xml | server/http/discovery.js:76 | | keep || GET | /sitemaps/products.xml | server/http/discovery.js:77 | | keep |--| GET | /submit | server/http/pages.js:307 | | keep |--| POST | /submit | server/http/pages.js:314 | | keep |--| GET | /updates | server/http/pages.js:134 | | keep |--| GET | /watches | server/http/pages.js:341 | | keep |--| POST | /watches | server/http/pages.js:346 | | keep |--| POST | /watches/:id/delete | server/http/pages.js:358 | | keep |++| GET | /submit | server/http/pages.js:310 | | keep |++| POST | /submit | server/http/pages.js:317 | | keep |++| GET | /updates | server/http/pages.js:137 | | keep |++| GET | /watches | server/http/pages.js:344 | | keep |++| POST | /watches | server/http/pages.js:349 | | keep |++| POST | /watches/:id/delete | server/http/pages.js:361 | | keep |## OpenVibe.Coupons| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/http/public.js:105 | | keep |--| GET | /about | server/http/public.js:118 | | keep |--| GET | /api/health | server/app.js:98 | | keep |--| GET | /api/ready | server/app.js:102 | | keep |--| GET | /api/v1/coupons/:id | server/http/api.js:143 | | keep |--| POST | /api/v1/coupons/:id/report | server/http/api.js:152 | | keep |--| POST | /api/v1/coupons/:id/status | server/http/api.js:176 | | keep |--| POST | /api/v1/coupons/submit | server/http/api.js:158 | | keep |--| POST | /api/v1/merchants | server/http/api.js:186 | | keep |--| GET | /api/v1/merchants/:id | server/http/api.js:137 | | keep |--| GET | /api/v1/merchants/:id/coupons | server/http/api.js:131 | | keep |--| POST | /api/v1/merchants/:id/domains | server/http/api.js:196 | | keep |--| POST | /api/v1/merchants/:id/status | server/http/api.js:205 | | keep |--| GET | /api/v1/merchants/resolve | server/http/api.js:115 | | keep |++| GET | / | server/http/public.js:108 | | keep |++| GET | /about | server/http/public.js:121 | | keep |++| GET | /api/health | server/app.js:105 | | keep |++| GET | /api/ready | server/app.js:109 | | keep |++| GET | /api/v1/coupons/:id | server/http/api.js:148 | | keep |++| POST | /api/v1/coupons/:id/report | server/http/api.js:157 | | keep |++| POST | /api/v1/coupons/:id/status | server/http/api.js:181 | | keep |++| POST | /api/v1/coupons/submit | server/http/api.js:163 | | keep |++| POST | /api/v1/merchants | server/http/api.js:191 | | keep |++| GET | /api/v1/merchants/:id | server/http/api.js:142 | | keep |++| GET | /api/v1/merchants/:id/coupons | server/http/api.js:136 | | keep |++| POST | /api/v1/merchants/:id/domains | server/http/api.js:201 | | keep |++| POST | /api/v1/merchants/:id/status | server/http/api.js:210 | | keep |++| GET | /api/v1/merchants/resolve | server/http/api.js:120 | | keep || GET | /atom.xml | server/http/discovery.js:111 | | keep || GET | /auth/callback | server/auth/sso.js:282 | | keep || POST | /auth/fedcm | server/auth/sso.js:328 | | keep |@@@ -2355,31 +2425,31 @@ Owner = the repository whose code answers the route; target = the authority it b| GET | /auth/logout | server/auth/sso.js:356 | | keep || GET | /auth/me | server/auth/sso.js:380 | | keep || POST | /auth/refresh | server/auth/sso.js:390 | | keep |--| GET | /c/:id | server/http/public.js:199 | | keep |--| GET | /c/:id.json | server/http/public.js:189 | | keep |--| POST | /c/:id/report | server/http/public.js:213 | | keep |--| GET | /connect-extension | server/http/public.js:271 | | keep |--| POST | /connect-extension | server/http/public.js:272 | | keep |--| POST | /connect-extension/:id/revoke | server/http/public.js:282 | | keep |++| GET | /c/:id | server/http/public.js:202 | | keep |++| GET | /c/:id.json | server/http/public.js:192 | | keep |++| POST | /c/:id/report | server/http/public.js:216 | | keep |++| GET | /connect-extension | server/http/public.js:274 | | keep |++| POST | /connect-extension | server/http/public.js:275 | | keep |++| POST | /connect-extension/:id/revoke | server/http/public.js:285 | | keep || GET | /feed.json | server/http/discovery.js:117 | | keep || GET | /feed.xml | server/http/discovery.js:110 | | keep || GET | /llms.txt | server/http/discovery.js:50 | | keep |--| GET | /m/:slug | server/http/public.js:151 | | keep |--| GET | /m/:slug.json | server/http/public.js:140 | | keep |++| GET | /m/:slug | server/http/public.js:154 | | keep |++| GET | /m/:slug.json | server/http/public.js:143 | | keep || GET | /m/:slug/feed.xml | server/http/discovery.js:120 | | keep |--| POST | /m/:slug/watch | server/http/public.js:171 | | keep |++| POST | /m/:slug/watch | server/http/public.js:174 | | keep || GET | /robots.txt | server/http/discovery.js:39 | | keep || GET | /sitemap.xml | server/http/discovery.js:70 | | keep || GET | /sitemaps/coupons.xml | server/http/discovery.js:79 | | keep || GET | /sitemaps/merchants.xml | server/http/discovery.js:83 | | keep |--| GET | /staff | server/http/public.js:324 | | keep |--| POST | /staff/coupons/:id/approve | server/http/public.js:337 | | keep |--| POST | /staff/merchants | server/http/public.js:325 | | keep |--| POST | /staff/merchants/:id/status | server/http/public.js:331 | | keep |--| GET | /submit | server/http/public.js:227 | | keep |--| POST | /submit | server/http/public.js:236 | | keep |--| GET | /updates | server/http/public.js:100 | | keep |--| GET | /watching | server/http/public.js:288 | | keep |++| GET | /staff | server/http/public.js:327 | | keep |++| POST | /staff/coupons/:id/approve | server/http/public.js:340 | | keep |++| POST | /staff/merchants | server/http/public.js:328 | | keep |++| POST | /staff/merchants/:id/status | server/http/public.js:334 | | keep |++| GET | /submit | server/http/public.js:230 | | keep |++| POST | /submit | server/http/public.js:239 | | keep |++| GET | /updates | server/http/public.js:103 | | keep |++| GET | /watching | server/http/public.js:291 | | keep |## OpenVibe.Trade@@@ -2398,169 +2468,171 @@ Owner = the repository whose code answers the route; target = the authority it b| Method | Path | Source | Target | Disposition ||---|---|---|---|---|| GET | / | server/http/pages.js:59 | | keep |--| GET | /api/health | server/app.js:102 | | keep |--| GET | /api/ready | server/app.js:106 | | keep |--| GET | /api/v1/apps/:app/releases | server/http/api.js:65 | | keep |--| POST | /api/v1/apps/:app/releases | server/http/api.js:107 | | keep |--| GET | /api/v1/apps/:app/trust | server/http/api.js:70 | | keep |--| GET | /api/v1/docs/versions | server/http/api.js:42 | | keep |--| POST | /api/v1/manifests/validate | server/http/api.js:46 | | keep |--| GET | /api/v1/releases/:id | server/http/api.js:75 | | keep |--| POST | /api/v1/releases/:id/${action} | server/http/api.js:123 | | keep |++| GET | /api/health | server/app.js:112 | | keep |++| GET | /api/ready | server/app.js:116 | | keep |++| GET | /api/v1/apps/:app/releases | server/http/api.js:69 | | keep |++| POST | /api/v1/apps/:app/releases | server/http/api.js:111 | | keep |++| GET | /api/v1/apps/:app/trust | server/http/api.js:74 | | keep |++| GET | /api/v1/docs/versions | server/http/api.js:46 | | keep |++| POST | /api/v1/manifests/validate | server/http/api.js:50 | | keep |++| GET | /api/v1/releases/:id | server/http/api.js:79 | | keep |++| POST | /api/v1/releases/:id/${action} | server/http/api.js:127 | | keep || GET | /apps/:app | server/http/pages.js:181 | | keep || GET | /callback | server/auth/sso.js:187 | | keep |--| GET | /docs | server/http/docs.js:42 | | keep |--| GET | /docs/adr/:id | server/http/docs.js:542 | | keep |--| GET | /docs/api | server/http/docs.js:182 | | keep |--| GET | /docs/api/:service | server/http/docs.js:203 | | keep |--| GET | /docs/api/:service.json | server/http/docs.js:197 | | keep |--| GET | /docs/billing | server/http/docs.js:371 | | keep |--| GET | /docs/capabilities | server/http/docs.js:125 | | keep |--| GET | /docs/capabilities/:id | server/http/docs.js:144 | | keep |--| GET | /docs/contracts | server/http/docs.js:72 | | keep |--| GET | /docs/contracts/:id | server/http/docs.js:91 | | keep |--| GET | /docs/contracts/:id.json | server/http/docs.js:85 | | keep |--| GET | /docs/events | server/http/docs.js:296 | | keep |--| GET | /docs/export | server/http/docs.js:484 | | keep |--| GET | /docs/limits | server/http/docs.js:452 | | keep |--| GET | /docs/sdk | server/http/docs.js:517 | | keep |--| GET | /docs/sdk/:module | server/http/docs.js:529 | | keep |--| GET | /docs/services | server/http/docs.js:307 | | keep |--| GET | /docs/tools | server/http/docs.js:338 | | keep |--| GET | /docs/updates | server/http/docs.js:249 | | keep |++| GET | /docs | server/http/docs.js:43 | | keep |++| GET | /docs/adr/:id | server/http/docs.js:513 | | keep |++| GET | /docs/api | server/http/docs.js:183 | | keep |++| GET | /docs/api/:service | server/http/docs.js:204 | | keep |++| GET | /docs/api/:service.json | server/http/docs.js:198 | | keep |++| GET | /docs/billing | server/http/docs.js:372 | | keep |++| GET | /docs/capabilities | server/http/docs.js:126 | | keep |++| GET | /docs/capabilities/:id | server/http/docs.js:145 | | keep |++| GET | /docs/contracts | server/http/docs.js:73 | | keep |++| GET | /docs/contracts/:id | server/http/docs.js:92 | | keep |++| GET | /docs/contracts/:id.json | server/http/docs.js:86 | | keep |++| GET | /docs/events | server/http/docs.js:297 | | keep |++| GET | /docs/export | server/http/docs.js:455 | | keep |++| GET | /docs/limits | server/http/docs.js:422 | | keep |++| GET | /docs/sdk | server/http/docs.js:488 | | keep |++| GET | /docs/sdk/:module | server/http/docs.js:500 | | keep |++| GET | /docs/services | server/http/docs.js:308 | | keep |++| GET | /docs/tools | server/http/docs.js:339 | | keep |++| GET | /docs/updates | server/http/docs.js:250 | | keep || GET | /login | server/auth/sso.js:178 | | keep || ALL | /logout | server/auth/sso.js:233 | | keep || GET | /logout | server/auth/sso.js:224 | | keep || POST | /logout | server/auth/sso.js:232 | | keep |--| GET | /manifests/validate | server/http/tools.js:172 | | keep |--| POST | /manifests/validate | server/http/tools.js:173 | | keep |++| GET | /manifests/validate | server/http/tools.js:175 | | keep |++| POST | /manifests/validate | server/http/tools.js:176 | | keep || GET | /me | server/auth/sso.js:247 | | keep |--| GET | /oauth | server/http/tools.js:29 | | keep |--| GET | /oauth/test-callback | server/http/tools.js:65 | | keep |++| GET | /oauth | server/http/tools.js:32 | | keep |++| GET | /oauth/test-callback | server/http/tools.js:68 | | keep || GET | /policy | server/http/pages.js:89 | | keep || GET | /policy/${g.slug} | server/http/pages.js:101 | | keep || GET | /policy/compatibility | server/http/pages.js:124 | | keep || GET | /policy/licensing | server/http/pages.js:138 | | keep || GET | /policy/rfc | server/http/pages.js:110 | | keep || GET | /policy/transparency | server/http/pages.js:154 | | keep |--| GET | /projects | server/http/portal.js:110 | | keep |--| POST | /projects | server/http/portal.js:111 | | keep |--| POST | /projects/:id/${action} | server/http/portal.js:671 | | keep |--| GET | /projects/:project | server/http/portal.js:124 | | keep |--| POST | /projects/:project/apps | server/http/portal.js:346 | | keep |--| GET | /projects/:project/apps/:app | server/http/portal.js:389 | | keep |--| POST | /projects/:project/apps/:app/credentials/:credential/revoke | server/http/portal.js:498 | | keep |--| POST | /projects/:project/apps/:app/credentials/rotate | server/http/portal.js:487 | | keep |--| POST | /projects/:project/apps/:app/grants | server/http/portal.js:504 | | keep |--| POST | /projects/:project/apps/:app/grants/:capability/${action} | server/http/portal.js:520 | | keep |--| GET | /projects/:project/apps/:app/playground | server/http/portal.js:575 | | keep |--| POST | /projects/:project/apps/:app/playground/events | server/http/portal.js:577 | | keep |--| POST | /projects/:project/apps/:app/playground/media | server/http/portal.js:590 | | keep |--| POST | /projects/:project/apps/:app/redirects | server/http/portal.js:478 | | keep |--| POST | /projects/:project/apps/:app/releases | server/http/portal.js:631 | | keep |--| GET | /projects/:project/apps/:app/releases/new | server/http/portal.js:630 | | keep |--| POST | /projects/:project/apps/:app/revoke | server/http/portal.js:482 | | keep |--| POST | /projects/:project/archive | server/http/portal.js:230 | | keep |--| GET | /projects/:project/audit | server/http/portal.js:303 | | keep |--| POST | /projects/:project/delete | server/http/portal.js:286 | | keep |--| GET | /projects/:project/export | server/http/portal.js:236 | | keep |--| POST | /projects/:project/export/archive | server/http/portal.js:252 | | keep |--| POST | /projects/:project/members | server/http/portal.js:213 | | keep |--| POST | /projects/:project/members/:subject/remove | server/http/portal.js:223 | | keep |--| POST | /projects/:project/members/:subject/role | server/http/portal.js:218 | | keep |--| GET | /releases | server/http/portal.js:110 | | keep |--| POST | /releases | server/http/portal.js:111 | | keep |++| GET | /projects | server/http/portal.js:117 | | keep |++| POST | /projects | server/http/portal.js:118 | | keep |++| POST | /projects/:id/${action} | server/http/portal.js:697 | | keep |++| GET | /projects/:project | server/http/portal.js:131 | | keep |++| POST | /projects/:project/apps | server/http/portal.js:370 | | keep |++| GET | /projects/:project/apps/:app | server/http/portal.js:413 | | keep |++| POST | /projects/:project/apps/:app/credentials/:credential/revoke | server/http/portal.js:522 | | keep |++| POST | /projects/:project/apps/:app/credentials/rotate | server/http/portal.js:511 | | keep |++| POST | /projects/:project/apps/:app/grants | server/http/portal.js:528 | | keep |++| POST | /projects/:project/apps/:app/grants/:capability/${action} | server/http/portal.js:544 | | keep |++| GET | /projects/:project/apps/:app/playground | server/http/portal.js:599 | | keep |++| POST | /projects/:project/apps/:app/playground/events | server/http/portal.js:601 | | keep |++| POST | /projects/:project/apps/:app/playground/media | server/http/portal.js:614 | | keep |++| POST | /projects/:project/apps/:app/redirects | server/http/portal.js:502 | | keep |++| POST | /projects/:project/apps/:app/releases | server/http/portal.js:655 | | keep |++| GET | /projects/:project/apps/:app/releases/new | server/http/portal.js:654 | | keep |++| POST | /projects/:project/apps/:app/revoke | server/http/portal.js:506 | | keep |++| POST | /projects/:project/archive | server/http/portal.js:237 | | keep |++| GET | /projects/:project/audit | server/http/portal.js:310 | | keep |++| POST | /projects/:project/delete | server/http/portal.js:293 | | keep |++| GET | /projects/:project/export | server/http/portal.js:243 | | keep |++| POST | /projects/:project/export/archive | server/http/portal.js:259 | | keep |++| POST | /projects/:project/members | server/http/portal.js:220 | | keep |++| POST | /projects/:project/members/:subject/remove | server/http/portal.js:230 | | keep |++| POST | /projects/:project/members/:subject/role | server/http/portal.js:225 | | keep |++| GET | /projects/:project/usage | server/http/portal.js:327 | | keep |++| GET | /releases | server/http/portal.js:117 | | keep |++| POST | /releases | server/http/portal.js:118 | | keep || GET | /releases/:id | server/http/pages.js:201 | | keep |--| POST | /releases/:id/${action} | server/http/portal.js:671 | | keep |--| GET | /releases/:project | server/http/portal.js:124 | | keep |--| POST | /releases/:project/apps | server/http/portal.js:346 | | keep |--| GET | /releases/:project/apps/:app | server/http/portal.js:389 | | keep |--| POST | /releases/:project/apps/:app/credentials/:credential/revoke | server/http/portal.js:498 | | keep |--| POST | /releases/:project/apps/:app/credentials/rotate | server/http/portal.js:487 | | keep |--| POST | /releases/:project/apps/:app/grants | server/http/portal.js:504 | | keep |--| POST | /releases/:project/apps/:app/grants/:capability/${action} | server/http/portal.js:520 | | keep |--| GET | /releases/:project/apps/:app/playground | server/http/portal.js:575 | | keep |--| POST | /releases/:project/apps/:app/playground/events | server/http/portal.js:577 | | keep |--| POST | /releases/:project/apps/:app/playground/media | server/http/portal.js:590 | | keep |--| POST | /releases/:project/apps/:app/redirects | server/http/portal.js:478 | | keep |--| POST | /releases/:project/apps/:app/releases | server/http/portal.js:631 | | keep |--| GET | /releases/:project/apps/:app/releases/new | server/http/portal.js:630 | | keep |--| POST | /releases/:project/apps/:app/revoke | server/http/portal.js:482 | | keep |--| POST | /releases/:project/archive | server/http/portal.js:230 | | keep |--| GET | /releases/:project/audit | server/http/portal.js:303 | | keep |--| POST | /releases/:project/delete | server/http/portal.js:286 | | keep |--| GET | /releases/:project/export | server/http/portal.js:236 | | keep |--| POST | /releases/:project/export/archive | server/http/portal.js:252 | | keep |--| POST | /releases/:project/members | server/http/portal.js:213 | | keep |--| POST | /releases/:project/members/:subject/remove | server/http/portal.js:223 | | keep |--| POST | /releases/:project/members/:subject/role | server/http/portal.js:218 | | keep |--| GET | /robots.txt | server/http/pages.js:267 | | keep |--| GET | /sitemap.xml | server/http/pages.js:273 | | keep |++| POST | /releases/:id/${action} | server/http/portal.js:697 | | keep |++| GET | /releases/:project | server/http/portal.js:131 | | keep |++| POST | /releases/:project/apps | server/http/portal.js:370 | | keep |++| GET | /releases/:project/apps/:app | server/http/portal.js:413 | | keep |++| POST | /releases/:project/apps/:app/credentials/:credential/revoke | server/http/portal.js:522 | | keep |++| POST | /releases/:project/apps/:app/credentials/rotate | server/http/portal.js:511 | | keep |++| POST | /releases/:project/apps/:app/grants | server/http/portal.js:528 | | keep |++| POST | /releases/:project/apps/:app/grants/:capability/${action} | server/http/portal.js:544 | | keep |++| GET | /releases/:project/apps/:app/playground | server/http/portal.js:599 | | keep |++| POST | /releases/:project/apps/:app/playground/events | server/http/portal.js:601 | | keep |++| POST | /releases/:project/apps/:app/playground/media | server/http/portal.js:614 | | keep |++| POST | /releases/:project/apps/:app/redirects | server/http/portal.js:502 | | keep |++| POST | /releases/:project/apps/:app/releases | server/http/portal.js:655 | | keep |++| GET | /releases/:project/apps/:app/releases/new | server/http/portal.js:654 | | keep |++| POST | /releases/:project/apps/:app/revoke | server/http/portal.js:506 | | keep |++| POST | /releases/:project/archive | server/http/portal.js:237 | | keep |++| GET | /releases/:project/audit | server/http/portal.js:310 | | keep |++| POST | /releases/:project/delete | server/http/portal.js:293 | | keep |++| GET | /releases/:project/export | server/http/portal.js:243 | | keep |++| POST | /releases/:project/export/archive | server/http/portal.js:259 | | keep |++| POST | /releases/:project/members | server/http/portal.js:220 | | keep |++| POST | /releases/:project/members/:subject/remove | server/http/portal.js:230 | | keep |++| POST | /releases/:project/members/:subject/role | server/http/portal.js:225 | | keep |++| GET | /releases/:project/usage | server/http/portal.js:327 | | keep |++| GET | /robots.txt | server/http/pages.js:268 | | keep |++| GET | /sitemap.xml | server/http/pages.js:274 | | keep || GET | /staff | server/http/pages.js:243 | | keep |--| POST | /staff/trust | server/http/pages.js:256 | | keep |--| GET | /tools/webhooks | server/http/tools.js:143 | | keep |--| POST | /tools/webhooks/sample | server/http/tools.js:149 | | keep |--| POST | /tools/webhooks/verify | server/http/tools.js:144 | | keep |++| POST | /staff/trust | server/http/pages.js:257 | | keep |++| GET | /tools/webhooks | server/http/tools.js:146 | | keep |++| POST | /tools/webhooks/sample | server/http/tools.js:152 | | keep |++| POST | /tools/webhooks/verify | server/http/tools.js:147 | | keep || GET | /updates | server/http/pages.js:88 | | keep |## OpenVibe.Host| Method | Path | Source | Target | Disposition ||---|---|---|---|---|--| GET | / | server/http/dashboard.js:68 | | keep |--| GET | /api/health | server/app.js:131 | | keep |--| GET | /api/ready | server/app.js:137 | | keep |--| DELETE | /api/v1/deploys/:id | server/http/api.js:191 | | keep |--| GET | /api/v1/deploys/:id | server/http/api.js:173 | | keep |--| POST | /api/v1/deploys/:id/activate | server/http/api.js:181 | | keep |--| GET | /api/v1/deploys/:id/log | server/http/api.js:177 | | keep |--| DELETE | /api/v1/domains/:id | server/http/api.js:207 | | keep |--| POST | /api/v1/domains/:id/verify | server/http/api.js:202 | | keep |--| GET | /api/v1/projects | server/http/api.js:61 | | keep |--| POST | /api/v1/projects | server/http/api.js:65 | | keep |--| DELETE | /api/v1/projects/:id | server/http/api.js:74 | | keep |--| GET | /api/v1/projects/:id | server/http/api.js:70 | | keep |--| DELETE | /api/v1/projects/:id/members/:principal | server/http/api.js:92 | | keep |--| PUT | /api/v1/projects/:id/members/:principal | server/http/api.js:87 | | keep |--| GET | /api/v1/projects/:id/quota | server/http/api.js:78 | | keep |--| PUT | /api/v1/projects/:id/quota | server/http/api.js:82 | | keep |--| GET | /api/v1/projects/:id/sites | server/http/api.js:118 | | keep |--| POST | /api/v1/projects/:id/sites | server/http/api.js:122 | | keep |--| DELETE | /api/v1/projects/:id/takedown | server/http/api.js:104 | | keep |--| POST | /api/v1/projects/:id/takedown | server/http/api.js:100 | | keep |--| DELETE | /api/v1/sites/:id | server/http/api.js:131 | | keep |--| GET | /api/v1/sites/:id | server/http/api.js:127 | | keep |--| GET | /api/v1/sites/:id/deploys | server/http/api.js:134 | | keep |--| POST | /api/v1/sites/:id/deploys | server/http/api.js:144 | | keep |--| GET | /api/v1/sites/:id/domains | server/http/api.js:194 | | keep |--| POST | /api/v1/sites/:id/domains | server/http/api.js:198 | | keep |--| POST | /api/v1/sites/:id/rollback | server/http/api.js:186 | | keep |--| DELETE | /api/v1/sites/:id/takedown | server/http/api.js:112 | | keep |--| POST | /api/v1/sites/:id/takedown | server/http/api.js:108 | | keep |++| GET | / | server/http/dashboard.js:69 | | keep |++| GET | /api/health | server/app.js:133 | | keep |++| GET | /api/ready | server/app.js:139 | | keep |++| DELETE | /api/v1/deploys/:id | server/http/api.js:192 | | keep |++| GET | /api/v1/deploys/:id | server/http/api.js:174 | | keep |++| POST | /api/v1/deploys/:id/activate | server/http/api.js:182 | | keep |++| GET | /api/v1/deploys/:id/log | server/http/api.js:178 | | keep |++| DELETE | /api/v1/domains/:id | server/http/api.js:208 | | keep |++| POST | /api/v1/domains/:id/verify | server/http/api.js:203 | | keep |++| GET | /api/v1/projects | server/http/api.js:62 | | keep |++| POST | /api/v1/projects | server/http/api.js:66 | | keep |++| DELETE | /api/v1/projects/:id | server/http/api.js:75 | | keep |++| GET | /api/v1/projects/:id | server/http/api.js:71 | | keep |++| DELETE | /api/v1/projects/:id/members/:principal | server/http/api.js:93 | | keep |++| PUT | /api/v1/projects/:id/members/:principal | server/http/api.js:88 | | keep |++| GET | /api/v1/projects/:id/quota | server/http/api.js:79 | | keep |++| PUT | /api/v1/projects/:id/quota | server/http/api.js:83 | | keep |++| GET | /api/v1/projects/:id/sites | server/http/api.js:119 | | keep |++| POST | /api/v1/projects/:id/sites | server/http/api.js:123 | | keep |++| DELETE | /api/v1/projects/:id/takedown | server/http/api.js:105 | | keep |++| POST | /api/v1/projects/:id/takedown | server/http/api.js:101 | | keep |++| DELETE | /api/v1/sites/:id | server/http/api.js:132 | | keep |++| GET | /api/v1/sites/:id | server/http/api.js:128 | | keep |++| GET | /api/v1/sites/:id/deploys | server/http/api.js:135 | | keep |++| POST | /api/v1/sites/:id/deploys | server/http/api.js:145 | | keep |++| GET | /api/v1/sites/:id/domains | server/http/api.js:195 | | keep |++| POST | /api/v1/sites/:id/domains | server/http/api.js:199 | | keep |++| POST | /api/v1/sites/:id/rollback | server/http/api.js:187 | | keep |++| DELETE | /api/v1/sites/:id/takedown | server/http/api.js:113 | | keep |++| POST | /api/v1/sites/:id/takedown | server/http/api.js:109 | | keep || GET | /auth/callback | server/auth/sso.js:301 | | keep || POST | /auth/fedcm | server/auth/sso.js:347 | | keep || GET | /auth/login | server/auth/sso.js:279 | | keep || GET | /auth/logout | server/auth/sso.js:375 | | keep || GET | /auth/me | server/auth/sso.js:399 | | keep || POST | /auth/refresh | server/auth/sso.js:409 | | keep |--| GET | /deploys/:id | server/http/dashboard.js:95 | | keep |--| POST | /deploys/:id/activate | server/http/dashboard.js:147 | | keep |--| POST | /deploys/:id/delete | server/http/dashboard.js:152 | | keep |--| POST | /domains/:id/delete | server/http/dashboard.js:161 | | keep |--| POST | /domains/:id/verify | server/http/dashboard.js:157 | | keep |++| GET | /deploys/:id | server/http/dashboard.js:96 | | keep |++| POST | /deploys/:id/activate | server/http/dashboard.js:148 | | keep |++| POST | /deploys/:id/delete | server/http/dashboard.js:153 | | keep |++| POST | /domains/:id/delete | server/http/dashboard.js:162 | | keep |++| POST | /domains/:id/verify | server/http/dashboard.js:158 | | keep || GET | /limits.json | server/limits.js:34 | | keep |--| GET | /metrics | server/app.js:138 | | keep |--| POST | /projects | server/http/dashboard.js:104 | | keep |--| GET | /projects/:id | server/http/dashboard.js:75 | | keep |--| POST | /projects/:id/delete | server/http/dashboard.js:126 | | keep |--| POST | /projects/:id/members | server/http/dashboard.js:114 | | keep |--| POST | /projects/:id/members/remove | server/http/dashboard.js:120 | | keep |--| POST | /projects/:id/sites | server/http/dashboard.js:108 | | keep |--| GET | /robots.txt | server/app.js:142 | | keep |--| GET | /sitemap.xml | server/app.js:144 | | keep |--| GET | /sites/:id | server/http/dashboard.js:85 | | keep |--| POST | /sites/:id/delete | server/http/dashboard.js:141 | | keep |--| POST | /sites/:id/deploys | server/http/dashboard.js:168 | | keep |--| POST | /sites/:id/domains | server/http/dashboard.js:133 | | keep |--| POST | /sites/:id/rollback | server/http/dashboard.js:137 | | keep |--| GET | /updates | server/http/dashboard.js:67 | | keep |++| GET | /metrics | server/app.js:140 | | keep |++| POST | /projects | server/http/dashboard.js:105 | | keep |++| GET | /projects/:id | server/http/dashboard.js:76 | | keep |++| POST | /projects/:id/delete | server/http/dashboard.js:127 | | keep |++| POST | /projects/:id/members | server/http/dashboard.js:115 | | keep |++| POST | /projects/:id/members/remove | server/http/dashboard.js:121 | | keep |++| POST | /projects/:id/sites | server/http/dashboard.js:109 | | keep |++| GET | /robots.txt | server/app.js:144 | | keep |++| GET | /sitemap.xml | server/app.js:146 | | keep |++| GET | /sites/:id | server/http/dashboard.js:86 | | keep |++| POST | /sites/:id/delete | server/http/dashboard.js:142 | | keep |++| POST | /sites/:id/deploys | server/http/dashboard.js:169 | | keep |++| POST | /sites/:id/domains | server/http/dashboard.js:134 | | keep |++| POST | /sites/:id/rollback | server/http/dashboard.js:138 | | keep |++| GET | /updates | server/http/dashboard.js:68 | | keep |@@@ -11,7 +11,7 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| OpenRe.Stream | OpenVibe.Network | 2 | bearer, internal-key, oauth-client || OpenVibe.Blog | OpenVibe.Network | 2 | internal-key, oauth-client || OpenVibe.Chat | OpenVibe.Live | 2 | service-token |--| OpenVibe.Chat | OpenVibe.Network | 2 | oauth-client, service-token |++| OpenVibe.Chat | OpenVibe.Network | 3 | none-detected, oauth-client, service-token || OpenVibe.Chat | OpenVibe.Search | 1 | none-detected || OpenVibe.Codes | OpenVibe.Billing | 1 | none-detected || OpenVibe.Codes | OpenVibe.Events | 2 | none-detected |@@@ -27,17 +27,17 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| OpenVibe.Games | OpenVibe.Network | 2 | bearer, oauth-client || OpenVibe.Host | OpenVibe.Network | 2 | internal-key, oauth-client || OpenVibe.Live | OpenRe.Stream | 1 | bearer, oauth-client, service-token |--| OpenVibe.Live | OpenVibe.AI | 1 | none-detected |++| OpenVibe.Live | OpenVibe.AI | 3 | none-detected || OpenVibe.Live | OpenVibe.Billing | 1 | none-detected || OpenVibe.Live | OpenVibe.Chat | 1 | none-detected || OpenVibe.Live | OpenVibe.Community | 4 | none-detected || OpenVibe.Live | OpenVibe.Media | 2 | api-key, bearer, internal-key, oauth-client |--| OpenVibe.Live | OpenVibe.Network | 11 | bearer, hmac, internal-key, none-detected, oauth-client, service-token |++| OpenVibe.Live | OpenVibe.Network | 12 | bearer, hmac, internal-key, none-detected, oauth-client, service-token || OpenVibe.Live | OpenVibe.Search | 2 | bearer, none-detected, oauth-client, service-token || OpenVibe.Live | OpenVibe.Tools | 1 | none-detected || OpenVibe.Live | webhook | 2 | none-detected || OpenVibe.Media | OpenVibe.Live | 1 | none-detected |--| OpenVibe.Media | OpenVibe.Network | 3 | internal-key, oauth-client, service-token |++| OpenVibe.Media | OpenVibe.Network | 4 | bearer, internal-key, oauth-client, service-token || OpenVibe.Media | webhook | 2 | hmac, service-token || OpenVibe.Network | OpenVibe.AI | 1 | bearer, internal-key, service-token || OpenVibe.Network | OpenVibe.Blog | 1 | bearer, internal-key |@@@ -70,18 +70,19 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| Blog/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes || Chat/server/bridge/live-mirror.js:79 | OpenVibe.Live | live.internalUrl | service-token | yes | no || Chat/server/live-context.js:139 | OpenVibe.Live | live.internalUrl | service-token | yes | yes |++| Chat/server/chat/account-data.js:4 | OpenVibe.Network | /internal/events, networkInternalUrl | none-detected | yes | yes || Chat/server/net/service-auth.js:5 | OpenVibe.Network | /oauth/token, networkInternalUrl, /api/.well-known/jwks, networkUrl | oauth-client, service-token | yes | no || Chat/server/prefs/network-modules.js:21 | OpenVibe.Network | networkInternalUrl | service-token | yes | yes |--| Chat/server/chat/routes.js:111 | OpenVibe.Search | searchUrl | none-detected | **no** | no |--| Codes/server/http/docs.js:369 | OpenVibe.Billing | OV_BILLING_INTERNAL_URL, :4600 | none-detected | yes | yes |++| Chat/server/chat/routes.js:121 | OpenVibe.Search | searchUrl | none-detected | **no** | no |++| Codes/server/http/docs.js:370 | OpenVibe.Billing | OV_BILLING_INTERNAL_URL, :4600 | none-detected | yes | yes |++| Codes/server/domain/limits.js:15 | OpenVibe.Events | OV_EVENTS_INTERNAL_URL, :4300 | none-detected | yes | no || Codes/server/domain/project-archive.js:109 | OpenVibe.Events | eventsUrl | none-detected | **no** | yes |--| Codes/server/http/docs.js:421 | OpenVibe.Events | OV_EVENTS_INTERNAL_URL, :4300 | none-detected | yes | yes |--| Codes/server/http/docs.js:420 | OpenVibe.Host | :4910 | none-detected | yes | yes |++| Codes/server/domain/limits.js:14 | OpenVibe.Host | :4910 | none-detected | yes | no |++| Codes/server/domain/limits.js:16 | OpenVibe.Media | OV_MEDIA_INTERNAL_URL, :4100 | none-detected | yes | no || Codes/server/domain/project-archive.js:109 | OpenVibe.Media | mediaUrl | none-detected | **no** | yes |--| Codes/server/http/docs.js:422 | OpenVibe.Media | OV_MEDIA_INTERNAL_URL, :4100 | none-detected | yes | yes || Codes/server/domain/project-archive.js:90 | OpenVibe.Network | networkInternalUrl | none-detected | **no** | yes |--| Codes/server/http/docs.js:250 | OpenVibe.Network | networkUrl | none-detected | yes | yes |--| Codes/server/http/docs.js:336 | OpenVibe.Tools | OV_TOOLS_INTERNAL_URL, :4001 | none-detected | yes | yes |++| Codes/server/http/docs.js:251 | OpenVibe.Network | networkUrl | none-detected | yes | yes |++| Codes/server/http/docs.js:337 | OpenVibe.Tools | OV_TOOLS_INTERNAL_URL, :4001 | none-detected | yes | yes || Community/server/live-client.js:6 | OpenVibe.Live | liveInternalUrl | bearer | yes | no || Community/server/pastes/proxy.js:26 | OpenVibe.Live | liveUrl, liveInternalUrl | bearer | yes | yes || Community/server/live-client.js:86 | OpenVibe.Media | mediaUrl | bearer | yes | no |@@@ -91,12 +92,14 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| Coupons/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes || Deals/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no || Deals/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |--| Games/apps/server/src/net/httpServer.ts:363 | OpenVibe.Network | /api/auth/me, /oauth/token | oauth-client | **no** | yes |++| Games/apps/server/src/net/httpServer.ts:376 | OpenVibe.Network | /api/auth/me, /oauth/token | oauth-client | **no** | yes || Games/apps/server/src/net/networkAuth.ts:3 | OpenVibe.Network | /api/auth/me | bearer | **no** | no || Host/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no || Host/server/auth/sso.js:47 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes || Live/server/openre/openre-client.js:12 | OpenRe.Stream | :4500, OPENRE_URL | bearer, oauth-client, service-token | yes | no |--| Live/server/ai/ai-service.js:40 | OpenVibe.AI | OV_AI_INTERNAL_URL, :4700 | none-detected | yes | yes |++| Live/server/ai/ai-service.js:41 | OpenVibe.AI | OV_AI_INTERNAL_URL, :4700 | none-detected | yes | yes |++| Live/server/ai/byo-credentials.js:17 | OpenVibe.AI | OV_AI_INTERNAL_URL, :4700 | none-detected | yes | yes |++| Live/server/ai/viewer-quota.js:17 | OpenVibe.AI | OV_AI_INTERNAL_URL, :4700 | none-detected | yes | yes || Live/server/monetization/billing-client.js:28 | OpenVibe.Billing | OV_BILLING_INTERNAL_URL, :4600 | none-detected | yes | yes || Live/server/integrations/robotstreamer-service.js:568 | OpenVibe.Chat | chatUrl | none-detected | yes | no || Live/server/comments-client.js:29 | OpenVibe.Community | OV_COMMUNITY_INTERNAL_URL, :4200, OV_COMMUNITY_URL | none-detected | yes | yes |@@@ -105,6 +108,7 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| Live/server/seo/seo.js:160 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | **no** | no || Live/server/config.js:180 | OpenVibe.Media | MEDIA_URL, :4100 | internal-key, oauth-client | yes | no || Live/server/media-client.js:14 | OpenVibe.Media | :4100, MEDIA_URL, /api/v1/${ | api-key, bearer | yes | no |++| Live/server/auth/account-data.js:171 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000 | none-detected | yes | yes || Live/server/chat/chat-server.js:84 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL | internal-key | **no** | no || Live/server/config.js:23 | OpenVibe.Network | :4000, OV_NETWORK_URL | internal-key, oauth-client | yes | no || Live/server/integrations/platform-oauth.js:52 | OpenVibe.Network | /oauth/token | bearer, hmac, oauth-client | **no** | yes |@@@ -123,44 +127,45 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re| Live/server/media-proxy/outcomes.js:78 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | no || Media/server/thumbnails/live-frame-service.js:170 | OpenVibe.Live | :3000 | none-detected | yes | yes || Media/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |++| Media/server/account-data.js:4 | OpenVibe.Network | /internal/events, OV_NETWORK_INTERNAL_URL, :4000, /oauth/token | bearer, oauth-client | yes | no || Media/server/auth.js:32 | OpenVibe.Network | network.url, /api/.well-known/jwks | service-token | yes | yes || Media/server/user-auth.js:49 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes || Media/server/auth.js:473 | webhook | webhook_url (per-app, configured in DB) | service-token | yes | yes || Media/server/webhooks.js:4 | webhook | webhook_url (per-app, configured in DB) | hmac | yes | yes || Network/server/frame/service.js:32 | OpenVibe.AI | aiUrl, OV_AI_INTERNAL_URL, :4700 | internal-key, bearer, service-token | yes | no |--| Network/server/index.js:440 | OpenVibe.Blog | OV_BLOG_INTERNAL_URL, blogUrl, :4810 | internal-key, bearer | **no** | no |--| Network/server/index.js:496 | OpenVibe.Events | eventsUrl, eventsInternalUrl | internal-key, bearer | **no** | no |++| Network/server/index.js:498 | OpenVibe.Blog | OV_BLOG_INTERNAL_URL, blogUrl, :4810 | internal-key, bearer | **no** | no |++| Network/server/index.js:557 | OpenVibe.Events | eventsUrl, eventsInternalUrl | internal-key, bearer | **no** | no || Network/server/admin/analytics-routes.js:24 | OpenVibe.Games | :8000 | internal-key, bearer | yes | no || Network/server/admin/routes.js:74 | OpenVibe.Games | games.internalUrl | internal-key | yes | no |--| Network/server/index.js:245 | OpenVibe.Games | :8000, games.internalUrl | internal-key, bearer | **no** | no |++| Network/server/index.js:247 | OpenVibe.Games | :8000, games.internalUrl | internal-key, bearer | **no** | no || Network/server/admin/analytics-routes.js:22 | OpenVibe.Live | :3000 | internal-key, bearer | yes | no || Network/server/admin/routes.js:72 | OpenVibe.Live | live.internalUrl | internal-key | yes | no || Network/server/frame/service.js:89 | OpenVibe.Live | :3000 | internal-key, bearer, service-token | yes | no |--| Network/server/index.js:241 | OpenVibe.Live | :3000, live.internalUrl, liveUrl | internal-key, bearer | **no** | no |++| Network/server/index.js:243 | OpenVibe.Live | :3000, live.internalUrl, liveUrl | internal-key, bearer | **no** | no || Network/server/profile/avatar.js:64 | OpenVibe.Live | live.internalUrl, :3000 | internal-key | yes | no || Network/server/admin/analytics-routes.js:25 | OpenVibe.Media | :4100 | internal-key, bearer | yes | no || Network/server/admin/routes.js:75 | OpenVibe.Media | media.internalUrl | internal-key | yes | no |--| Network/server/index.js:244 | OpenVibe.Media | :4100, media.internalUrl | internal-key, bearer | **no** | no |++| Network/server/index.js:246 | OpenVibe.Media | :4100, media.internalUrl | internal-key, bearer | **no** | no || Network/server/profile/avatar.js:72 | OpenVibe.Media | media.internalUrl, :4100 | internal-key | yes | no || Network/server/admin/analytics-routes.js:23 | OpenVibe.Tools | :4001 | internal-key, bearer | yes | no || Network/server/admin/routes.js:73 | OpenVibe.Tools | tools.internalUrl | internal-key | yes | no || Network/server/domains/catalog.js:17 | OpenVibe.Tools | OV_TOOLS_INTERNAL_URL, :4001 | none-detected | yes | no |--| Network/server/index.js:243 | OpenVibe.Tools | :4001, tools.internalUrl | internal-key, bearer | **no** | no |++| Network/server/index.js:245 | OpenVibe.Tools | :4001, tools.internalUrl | internal-key, bearer | **no** | no || News/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no || News/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |--| Shared/release-watch.js:12 | OpenVibe.Events | eventsUrl | none-detected | **no** | yes |++| Shared/release-watch.js:9 | OpenVibe.Events | eventsUrl | none-detected | **no** | yes || Shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes || Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no || Shared/footer.js:307 | OpenVibe.Network | /api/auth/me | bearer | **no** | no || Shared/navbar.js:13 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |--| Sites/build.js:100 | OpenVibe.Network | networkUrl | none-detected | **no** | no |++| Sites/build.js:104 | OpenVibe.Network | networkUrl | none-detected | **no** | no || Tips/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no || Tools/apps/gateway/server/index.js:86 | OpenVibe.Community | communityUrl, OV_COMMUNITY_URL | internal-key, bearer | yes | yes |--| Tools/apps/_shared/jobs/index.js:96 | OpenVibe.Events | EVENTS_URL | oauth-client, service-token | yes | no |--| Tools/apps/gateway/server/index.js:505 | OpenVibe.Live | liveUrl | internal-key, bearer | yes | yes |--| Tools/apps/_shared/jobs/index.js:18 | OpenVibe.Media | :4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL | oauth-client, service-token | yes | no |++| Tools/apps/_shared/jobs/index.js:97 | OpenVibe.Events | EVENTS_URL | oauth-client, service-token | yes | no |++| Tools/apps/gateway/server/index.js:522 | OpenVibe.Live | liveUrl | internal-key, bearer | yes | yes |++| Tools/apps/_shared/jobs/index.js:19 | OpenVibe.Media | :4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL | oauth-client, service-token | yes | no || Tools/apps/_shared/guard/tokens.js:25 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl | service-token | yes | yes |--| Tools/apps/_shared/jobs/index.js:20 | OpenVibe.Network | :4000, OV_NETWORK_INTERNAL_URL, /oauth/token | oauth-client, service-token | yes | no |++| Tools/apps/_shared/jobs/index.js:21 | OpenVibe.Network | :4000, OV_NETWORK_INTERNAL_URL, /oauth/token | oauth-client, service-token | yes | no || Tools/apps/food/server/index.js:33 | OpenVibe.Network | OV_NETWORK_URL, OV_NETWORK_INTERNAL_URL, networkUrl, networkInternalUrl, :4000 | none-detected | yes | no || Tools/apps/gateway/server/auth/routes.js:53 | OpenVibe.Network | /oauth/token, /api/.well-known/jwks, networkUrl, networkInternalUrl | oauth-client | yes | yes || Tools/apps/gateway/server/index.js:34 | OpenVibe.Network | /internal/events, networkUrl | internal-key, bearer | yes | yes |@@@ -25,19 +25,19 @@ Deliverable 4, plus the background-job half of the exit criteria.| Repo | Path | Referenced at ||---|---|---|--| OpenVibe.Live | /ws/ | server/index.js:460, server/index.js:470, server/web/page-status.js:186 |--| OpenVibe.Live | /ws/broadcast | server/index.js:1089, server/streaming/broadcast-server.js:187 |--| OpenVibe.Live | /ws/call | server/index.js:1093, server/streaming/call-server.js:98 |--| OpenVibe.Live | /ws/canvas | server/index.js:1095 |--| OpenVibe.Live | /ws/chat | server/chat/chat-server.js:295, server/index.js:1085 |--| OpenVibe.Live | /ws/control | server/controls/control-server.js:46, server/index.js:1091 |--| OpenVibe.Live | /ws/game | server/index.js:1095 |--| OpenVibe.Live | /ws/robotstreamer-publish | server/index.js:1097, server/integrations/robotstreamer-service.js:789 |--| OpenVibe.Live | /ws/vibe-coding/publish | server/index.js:1087, server/vibe-coding/publish-server.js:35 |++| OpenVibe.Live | /ws/ | server/index.js:473, server/index.js:483, server/web/page-status.js:186 |++| OpenVibe.Live | /ws/broadcast | server/index.js:1102, server/streaming/broadcast-server.js:187 |++| OpenVibe.Live | /ws/call | server/index.js:1106, server/streaming/call-server.js:98 |++| OpenVibe.Live | /ws/canvas | server/index.js:1108 |++| OpenVibe.Live | /ws/chat | server/chat/chat-server.js:295, server/index.js:1098 |++| OpenVibe.Live | /ws/control | server/controls/control-server.js:46, server/index.js:1104 |++| OpenVibe.Live | /ws/game | server/index.js:1108 |++| OpenVibe.Live | /ws/robotstreamer-publish | server/index.js:1110, server/integrations/robotstreamer-service.js:789 |++| OpenVibe.Live | /ws/vibe-coding/publish | server/index.js:1100, server/vibe-coding/publish-server.js:35 || OpenVibe.Network | /ws/ | server/deploy/nginx-generator.js:153 |--| OpenVibe.Games | /ws | apps/server/src/main.ts:320 |--| OpenVibe.Chat | /ws/call | server/app.js:244, server/calls/call-server.js:130 |--| OpenVibe.Chat | /ws/chat | server/app.js:245, server/chat/chat-server.js:246 |++| OpenVibe.Games | /ws | apps/server/src/main.ts:382 |++| OpenVibe.Chat | /ws/call | server/app.js:258, server/calls/call-server.js:130 |++| OpenVibe.Chat | /ws/chat | server/app.js:259, server/chat/chat-server.js:246 || OpenVibe.Host | /ws/ | lib/nginx.js:60 |## Non-HTTP protocols@@@ -58,19 +58,19 @@ Owner = the repository whose process runs the job; target = the authority the wo| Repo | Kind | Name | Interval | At | Target | Disposition ||---|---|---|---|---|---|---|--| OpenVibe.Live | setInterval | | 5 min | server/ai/ai-moments-job.js:496 | | keep |--| OpenVibe.Live | setInterval | | ? | server/ai/auto-clip-job.js:354 | | keep |++| OpenVibe.Live | setInterval | | 5 min | server/ai/ai-moments-job.js:470 | | keep |++| OpenVibe.Live | setInterval | | ? | server/ai/auto-clip-job.js:336 | | keep || OpenVibe.Live | setInterval | | 1 min | server/ai/backfill-job.js:160 | | keep |--| OpenVibe.Live | setInterval | | ? | server/ai/chat-ai.js:476 | | keep |--| OpenVibe.Live | setInterval | | 5 min | server/ai/easter-egg-job.js:215 | | keep |--| OpenVibe.Live | setInterval | | ? | server/ai/slogan-job.js:193 | | keep |++| OpenVibe.Live | setInterval | | ? | server/ai/chat-ai.js:395 | | keep |++| OpenVibe.Live | setInterval | | 5 min | server/ai/easter-egg-job.js:201 | | keep |++| OpenVibe.Live | setInterval | | ? | server/ai/slogan-job.js:157 | | keep || OpenVibe.Live | setInterval | | 30 s | server/ai/stream-memory-job.js:241 | | keep || OpenVibe.Live | setInterval | | ? | server/ai/streamer-overview-job.js:40 | | keep || OpenVibe.Live | setInterval | | ? | server/ai/timeline-job.js:205 | OpenVibe.AI | extract || OpenVibe.Live | setInterval | | ? | server/ai/viewers/engine.js:79 | | keep || OpenVibe.Live | setInterval | | ? | server/arena/arena-job.js:33 | | keep || OpenVibe.Live | setInterval | | ? | server/arena/arena-job.js:39 | | keep |--| OpenVibe.Live | setInterval | | ? | server/arena/listener.js:323 | | keep |++| OpenVibe.Live | setInterval | | ? | server/arena/listener.js:292 | | keep || OpenVibe.Live | jobs.every | module-summaries-scan | 0.005 s | server/auth/module-summaries.js:189 | | keep || OpenVibe.Live | jobs.every | module-summaries-refresh | ? | server/auth/module-summaries.js:190 | | keep || OpenVibe.Live | setInterval | | ? | server/chat/chat-remote.js:273 | OpenVibe.Chat | compat |@@@ -83,13 +83,13 @@ Owner = the repository whose process runs the job; target = the authority the wo| OpenVibe.Live | jobs.every | search-documents-refresh | ? | server/events/search-documents.js:129 | | keep || OpenVibe.Live | jobs.every | search-media-scan | 0.005 s | server/events/search-media-documents.js:210 | | keep || OpenVibe.Live | jobs.every | search-media-refresh | ? | server/events/search-media-documents.js:211 | | keep |--| OpenVibe.Live | setInterval | | ? | server/events/stream-events.js:100 | | keep |++| OpenVibe.Live | setInterval | | ? | server/events/stream-events.js:109 | | keep || OpenVibe.Live | setInterval | | 5 min | server/home/routes.js:570 | | keep |--| OpenVibe.Live | setInterval | | ? | server/home/star-job.js:130 | | keep |--| OpenVibe.Live | setInterval | | 360 min | server/index.js:1364 | | keep |--| OpenVibe.Live | setInterval | | 45 s | server/index.js:1381 | | keep |--| OpenVibe.Live | setInterval | | ? | server/index.js:1405 | | keep |--| OpenVibe.Live | setInterval | | ? | server/index.js:1416 | | keep |++| OpenVibe.Live | setInterval | | ? | server/home/star-job.js:124 | | keep |++| OpenVibe.Live | setInterval | | 360 min | server/index.js:1377 | | keep |++| OpenVibe.Live | setInterval | | 45 s | server/index.js:1394 | | keep |++| OpenVibe.Live | setInterval | | ? | server/index.js:1418 | | keep |++| OpenVibe.Live | setInterval | | ? | server/index.js:1429 | | keep || OpenVibe.Live | setInterval | | ? | server/integrations/chat-relay-service.js:615 | OpenVibe.Chat | extract || OpenVibe.Live | setInterval | | 1 s | server/integrations/powerchat-platform.js:296 | OpenVibe.Billing | extract || OpenVibe.Live | setInterval | | ? | server/integrations/powerchat-platform.js:430 | OpenVibe.Billing | extract |@@@ -106,12 +106,12 @@ Owner = the repository whose process runs the job; target = the authority the wo| OpenVibe.Live | setInterval | | 30 s | server/news/news-service.js:94 | | keep || OpenVibe.Live | setInterval | | ? | server/news/sources/base-source.js:28 | | keep || OpenVibe.Live | setInterval | | ? | server/openre/mirror.js:210 | | keep |--| OpenVibe.Live | setInterval | | ? | server/recap/recap.js:246 | | keep |++| OpenVibe.Live | setInterval | | ? | server/recap/recap.js:229 | | keep || OpenVibe.Live | setInterval | | ? | server/streaming/broadcast-server.js:133 | OpenRe.Stream | extract || OpenVibe.Live | setInterval | | ? | server/streaming/call-server.js:64 | OpenVibe.Chat | extract || OpenVibe.Live | setInterval | | 5 min | server/streaming/call-server.js:76 | OpenVibe.Chat | extract || OpenVibe.Live | setInterval | | ? | server/streaming/live-events.js:28 | | keep |--| OpenVibe.Live | setInterval | | ? | server/streaming/rtmp-server.js:191 | OpenRe.Stream | extract |++| OpenVibe.Live | setInterval | | ? | server/streaming/rtmp-server.js:196 | OpenRe.Stream | extract || OpenVibe.Live | setInterval | | ? | server/streaming/whip-handler.js:161 | OpenRe.Stream | extract || OpenVibe.Live | jobs.every | restream-viewer-counts | 1 min | server/utils/jobs.js:12 | OpenRe.Stream | extract || OpenVibe.Live | jobs.singleFlight | auto-clip-backfill | ? | server/utils/jobs.js:13 | | keep |@@@ -121,25 +121,28 @@ Owner = the repository whose process runs the job; target = the authority the wo| OpenVibe.Network | setInterval | | 0.05 s | server/graceful.js:77 | | keep || OpenVibe.Network | setInterval | | ? | server/identity/grants-admin.js:201 | | keep || OpenVibe.Network | setInterval | | ? | server/identity/profile-events.js:104 | | keep |--| OpenVibe.Network | setInterval | | 60 min | server/index.js:790 | | keep |--| OpenVibe.Network | setInterval | | 2 min | server/index.js:793 | | keep |--| OpenVibe.Network | setInterval | | 5 min | server/index.js:807 | | keep |--| OpenVibe.Network | setInterval | | ? | server/index.js:810 | | keep |++| OpenVibe.Network | setInterval | | 60 min | server/index.js:851 | | keep |++| OpenVibe.Network | setInterval | | 2 min | server/index.js:854 | | keep |++| OpenVibe.Network | setInterval | | 5 min | server/index.js:868 | | keep |++| OpenVibe.Network | setInterval | | 6 min | server/index.js:871 | | keep |++| OpenVibe.Network | setInterval | | 1 min | server/index.js:879 | | keep |++| OpenVibe.Network | setInterval | | ? | server/index.js:882 | | keep || OpenVibe.Network | setInterval | | ? | server/registry/deploy-drift.js:88 | | keep || OpenVibe.Network | setInterval | | ? | server/registry/library-tags.js:47 | | keep || OpenVibe.Shared | setInterval | | 15 min | account-switcher.js:624 | | keep || OpenVibe.Shared | setInterval | | ? | analytics/retention.js:230 | | keep || OpenVibe.Shared | setInterval | | ? | analytics/tracker.js:115 | | keep || OpenVibe.Shared | setInterval | | ? | notification-ui.js:557 | | keep |--| OpenVibe.Shared | setInterval | | ? | release-watch.js:265 | | keep |--| OpenVibe.Shared | setInterval | | 10 min | release-watch.js:271 | | keep |++| OpenVibe.Shared | setInterval | | ? | release-watch.js:266 | | keep |++| OpenVibe.Shared | setInterval | | 10 min | release-watch.js:272 | | keep || OpenVibe.Shared | setInterval | | ? | shipped.js:154 | | keep |++| OpenVibe.Shared | setInterval | | ? | web-runtime.js:276 | | keep || OpenVibe.Media | setInterval | | ? | server/auth.js:62 | | keep || OpenVibe.Media | setInterval | | 60 min | server/events.js:68 | | keep || OpenVibe.Media | setInterval | | ? | server/events.js:86 | | keep || OpenVibe.Media | setInterval | | ? | server/events.js:90 | | keep |--| OpenVibe.Media | setInterval | | 720 min | server/index.js:178 | | keep |--| OpenVibe.Media | setInterval | | ? | server/index.js:214 | | keep |++| OpenVibe.Media | setInterval | | 720 min | server/index.js:180 | | keep |++| OpenVibe.Media | setInterval | | ? | server/index.js:216 | | keep || OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:75 | | keep || OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:202 | | keep || OpenVibe.Media | setInterval | | ? | server/objects/owner-subject-job.js:51 | | keep |@@@ -149,12 +152,12 @@ Owner = the repository whose process runs the job; target = the authority the wo| OpenVibe.Media | setInterval | | ? | server/vod/clip-jobs.js:142 | | keep || OpenVibe.Media | setInterval | | ? | server/vod/health-job.js:276 | | keep || OpenVibe.Media | setInterval | | 1 min | server/vod/recorder.js:235 | | keep |--| OpenVibe.Media | setInterval | | ? | server/vod/vod-storage.js:595 | | keep |++| OpenVibe.Media | setInterval | | ? | server/vod/vod-storage.js:627 | | keep || OpenVibe.Tools | setInterval | | 0.05 s | apps/_shared/graceful.js:77 | | keep || OpenVibe.Tools | setInterval | | ? | apps/_shared/guard/index.js:487 | | keep || OpenVibe.Tools | setInterval | | 15 s | apps/_shared/jobs/http.js:270 | | keep |--| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/index.js:123 | | keep |--| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/system.js:660 | | keep |++| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/index.js:124 | | keep |++| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/system.js:674 | | keep || OpenVibe.Tools | setInterval | | ? | apps/_shared/usage.js:105 | | keep || OpenVibe.Tools | setInterval | | ? | apps/audio/server/retention/manager.js:193 | | keep || OpenVibe.Tools | setInterval | | ? | apps/docs/server/retention/manager.js:145 | | keep |@@@ -164,10 +167,10 @@ Owner = the repository whose process runs the job; target = the authority the wo| OpenVibe.Tools | setInterval | | ? | apps/gateway/server/registry/services.js:109 | | keep || OpenVibe.Tools | setInterval | | ? | apps/gateway/server/search-index.js:97 | | keep || OpenVibe.Tools | setInterval | | ? | apps/img/server/retention/manager.js:146 | | keep |--| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:662 | | keep |--| OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:713 | | keep |--| OpenVibe.Tools | setInterval | | 10 min | apps/yt/server/index.js:138 | | keep |--| OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:255 | | keep |++| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:666 | | keep |++| OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:717 | | keep |++| OpenVibe.Tools | setInterval | | 10 min | apps/yt/server/index.js:142 | | keep |++| OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:259 | | keep || OpenVibe.Community | setInterval | | ? | server/events.js:39 | | keep || OpenVibe.Community | setInterval | | 0.05 s | server/graceful.js:77 | | keep || OpenVibe.Community | setInterval | | ? | server/identity/profile-module.js:109 | | keep |@@@ -177,12 +180,13 @@ Owner = the repository whose process runs the job; target = the authority the wo| OpenVibe.Community | setInterval | | ? | server/relay/discord.js:401 | | keep || OpenVibe.Community | setInterval | | ? | server/relay/events-worker.js:137 | | keep || OpenVibe.Community | setInterval | | ? | server/search/documents.js:171 | | keep |--| OpenVibe.Games | setInterval | | 360 min | apps/server/src/main.ts:162 | | keep |--| OpenVibe.Games | setInterval | | ? | apps/server/src/main.ts:350 | | keep |++| OpenVibe.Games | setInterval | | 360 min | apps/server/src/main.ts:190 | | keep |++| OpenVibe.Games | setInterval | | ? | apps/server/src/main.ts:412 | | keep || OpenVibe.Games | setInterval | | ? | apps/server/src/net/editorWs.ts:84 | | keep || OpenVibe.Games | setInterval | | 0.05 s | apps/server/src/net/gracefulStop.ts:54 | | keep || OpenVibe.Events | setInterval | | ? | server/auth.js:85 | | keep || OpenVibe.Events | setInterval | | ? | server/index.js:49 | | keep |++| OpenVibe.Events | setInterval | | ? | server/index.js:69 | | keep || OpenVibe.Events | setInterval | | ? | server/realtime.js:198 | | keep || OpenVibe.Chat | setInterval | | 1 min | server/bridge/live-bridge.js:177 | | keep || OpenVibe.Chat | setInterval | | ? | server/bridge/live-mirror.js:107 | | keep |@@@ -191,8 +195,8 @@ Owner = the repository whose process runs the job; target = the authority the wo| OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:190 | | keep || OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:212 | | keep || OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:217 | | keep |--| OpenVibe.Chat | setInterval | | ? | server/chat/dm-routes.js:56 | | keep |--| OpenVibe.Chat | setInterval | | 360 min | server/events/consumer.js:188 | | keep |++| OpenVibe.Chat | setInterval | | ? | server/chat/dm-routes.js:71 | | keep |++| OpenVibe.Chat | setInterval | | 360 min | server/events/consumer.js:211 | | keep || OpenVibe.Chat | setInterval | | ? | server/events/outbox.js:112 | | keep || OpenVibe.Chat | setInterval | | ? | server/live-context.js:835 | | keep || OpenVibe.Chat | setInterval | | 2 s | server/live-context.js:837 | | keep |@@@ -206,9 +210,9 @@ Owner = the repository whose process runs the job; target = the authority the wo| OpenVibe.Tips | setInterval | | ? | server/network.js:42 | | keep || OpenVibe.VIP | setInterval | | ? | server/index.js:25 | | keep || OpenVibe.VIP | setInterval | | ? | server/network.js:42 | | keep |--| OpenVibe.AI | setInterval | | ? | server/auth.js:70 | | keep |++| OpenVibe.AI | setInterval | | ? | server/auth.js:69 | | keep || OpenVibe.AI | setInterval | | ? | server/events.js:36 | | keep |--| OpenVibe.AI | setInterval | | ? | server/index.js:49 | | keep |++| OpenVibe.AI | setInterval | | ? | server/index.js:51 | | keep || OpenVibe.AI | setInterval | | 5 min | server/user-modules.js:135 | | keep || OpenVibe.Search | setInterval | | ? | server/auth.js:74 | | keep || OpenVibe.Search | setInterval | | ? | server/events/outbox.js:166 | | keep |@@@ -26,6 +26,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenRe.Stream | OV_OAUTH_CLIENT_SECRET | openre.env | server/config.js || OpenVibe.AI | AI_API_KEY | ai.env | (not referenced) || OpenVibe.AI | AI_CONSOLE_SESSION_SECRET | ai.env | (not referenced) |++| OpenVibe.AI | AI_CREDENTIALS_KEY | ai.env | server/config.js || OpenVibe.AI | OV_OAUTH_CLIENT_SECRET | ai.env | server/events.js, server/user-modules.js || OpenVibe.Billing | BILLING_SESSION_SECRET | billing.env | server/config.js || OpenVibe.Billing | CCBILL_WEBHOOK_SECRET | **not set** | server/config.js |@@@ -67,6 +68,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Games | EDITOR_KEY | games.env | apps/server/src/config.ts || OpenVibe.Games | GAMES_EVENTS_SECRET | games.env | apps/server/src/config.ts || OpenVibe.Games | OV_OAUTH_CLIENT_SECRET | games.env | apps/server/src/config.ts |++| OpenVibe.Host | CLOUDFLARE_API_TOKEN | **not set** | lib/dns.js || OpenVibe.Host | HOST_FORM_SECRET | host.env | server/config.js || OpenVibe.Host | OV_OAUTH_CLIENT_SECRET | host.env | server/config.js || OpenVibe.Live | ADMIN_PASSWORD | live.env | server/config.js |@@@ -91,7 +93,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Media | MEDIA_R2_SECRET_ACCESS_KEY | media.env | server/vod/vod-storage.js || OpenVibe.Media | MEDIA_SECRET | **not set** | server/views/service.js || OpenVibe.Media | MEDIA_SIGNING_SECRET | media.env | server/config.js |--| OpenVibe.Media | OV_OAUTH_CLIENT_SECRET | media.env | server/events.js, server/index.js, server/lineage-client.js +2 |++| OpenVibe.Media | OV_OAUTH_CLIENT_SECRET | media.env | server/account-data.js, server/events.js, server/index.js +3 || OpenVibe.Media | VIEW_HASH_SECRET | **not set** | server/views/service.js || OpenVibe.Network | ADMIN_PASSWORD | network.env | server/config.js || OpenVibe.Network | DEV_CREDENTIAL_OVERLAP_S | **not set** | server/config.js |@@@ -123,7 +125,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Tools | OPEN_CHARGE_MAP_KEY | **not set** | apps/maps/server/config.js || OpenVibe.Tools | OV_INTERNAL_KEY | **not set** | apps/_shared/internal-auth.js || OpenVibe.Tools | OV_OAUTH_CLIENT_SECRET | tools.env | apps/_shared/jobs/events.js, apps/_shared/jobs/index.js, apps/_shared/usage.js +3 |--| OpenVibe.Tools | RIDB_API_KEY | **not set** | apps/maps/server/config.js, apps/maps/server/sources/ridb.js |++| OpenVibe.Tools | RIDB_API_KEY | tools.env | apps/maps/server/config.js, apps/maps/server/sources/ridb.js || OpenVibe.Tools | TOOLS_EVENTS_SECRET | tools.env | apps/gateway/server/revocation-events.js || OpenVibe.Trade | OV_OAUTH_CLIENT_SECRET | trade.env | server/config.js || OpenVibe.Trade | TRADE_EVENTS_WEBHOOK_SECRET | **not set** | server/config.js |@@@ -137,7 +139,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| File | Variables ||---|---|--| /etc/openvibe/ai.env | 24 |++| /etc/openvibe/ai.env | 27 || /etc/openvibe/backup.env | 7 || /etc/openvibe/billing.env | 11 || /etc/openvibe/blog.env | 14 |@@@ -151,17 +153,18 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| /etc/openvibe/games.env | 16 || /etc/openvibe/generated-secrets.env | 6 || /etc/openvibe/host.env | 12 |--| /etc/openvibe/live.env | 65 |++| /etc/openvibe/live.env | 67 || /etc/openvibe/media.env | 32 |--| /etc/openvibe/network.env | 25 |++| /etc/openvibe/network.env | 26 || /etc/openvibe/news.env | 13 |--| /etc/openvibe/openre.env | 12 |++| /etc/openvibe/openre.env | 13 |++| /etc/openvibe/probe-merge.env | 2 || /etc/openvibe/probe.env | 2 || /etc/openvibe/reviews.env | 12 || /etc/openvibe/search.env | 9 || /etc/openvibe/sources.env | 7 || /etc/openvibe/tips.env | 12 |--| /etc/openvibe/tools.env | 14 |++| /etc/openvibe/tools.env | 15 || /etc/openvibe/trade.env | 11 || /etc/openvibe/vip.env | 11 || /etc/openvibe/wiki.env | 13 |@@@ -175,7 +178,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenRe.Stream | EVENTS_PUBLISH | | server/config.js || OpenRe.Stream | EVENTS_RELAY_INTERVAL_MS | | server/config.js || OpenRe.Stream | EVENTS_URL | openre.env | server/config.js |--| OpenRe.Stream | HOST | | server/config.js |++| OpenRe.Stream | HOST | openre.env | server/config.js || OpenRe.Stream | MEDIA_APP_ID | openre.env | server/config.js || OpenRe.Stream | MEDIA_URL | openre.env | server/config.js || OpenRe.Stream | MIN_CLIENT_GENERATION | | OpenVibe.Shared/release.js |@@@ -189,6 +192,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenRe.Stream | OPENRE_ENV_FILE | | server/index.js, workers/coordinator.js +3 || OpenRe.Stream | OPENRE_FFMPEG_OPENSSL_PATH | | server/config.js || OpenRe.Stream | OPENRE_FFMPEG_PATH | | server/config.js |++| OpenRe.Stream | OPENRE_LIMITS_HOUR | | server/api/actor-limits.js |++| OpenRe.Stream | OPENRE_LIMITS_MINUTE | | server/api/actor-limits.js || OpenRe.Stream | OPENRE_LINEAGE | | server/lineage.js || OpenRe.Stream | OPENRE_LIVE_ACK_TIMEOUT_MS | | server/config.js || OpenRe.Stream | OPENRE_MAX_DESTINATIONS | | server/config.js |@@@ -248,15 +253,24 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.AI | AI_FETCH_TIMEOUT_MS | | server/config.js || OpenVibe.AI | AI_HTTP_SEAM_URL | | server/config.js || OpenVibe.AI | AI_INPUT_COST_PER_MTOK | ai.env | server/config.js |++| OpenVibe.AI | AI_LOCAL_LLM_MODEL | ai.env | server/config.js |++| OpenVibe.AI | AI_LOCAL_LLM_TIMEOUT_MS | | server/config.js |++| OpenVibe.AI | AI_LOCAL_LLM_URL | ai.env | server/config.js || OpenVibe.AI | AI_MAX_CONCURRENT_RUNS | | server/config.js || OpenVibe.AI | AI_MAX_COST_USD_PER_DAY | ai.env | server/config.js || OpenVibe.AI | AI_MAX_INPUT_BYTES | | server/config.js || OpenVibe.AI | AI_MAX_QUEUED_RUNS | | server/config.js || OpenVibe.AI | AI_MAX_QUEUED_RUNS_PER_CALLER | | server/config.js || OpenVibe.AI | AI_MAX_WAIT_MS | | server/config.js |++| OpenVibe.AI | AI_MEDIA_ANALYSIS_DIR | | server/config.js |++| OpenVibe.AI | AI_MEDIA_ANALYSIS_DISK_RESERVE_BYTES | | server/config.js |++| OpenVibe.AI | AI_MEDIA_ANALYSIS_FETCH_TIMEOUT_MS | | server/config.js |++| OpenVibe.AI | AI_MEDIA_ANALYSIS_MAX_BYTES | | server/config.js |++| OpenVibe.AI | AI_MEDIA_SCENE_THRESHOLD | | server/config.js |++| OpenVibe.AI | AI_MEDIA_STORAGE_HOSTS | | server/config.js |++| OpenVibe.AI | AI_MEDIA_STREAM | | server/config.js |++| OpenVibe.AI | AI_MEDIA_STT_WINDOW_SEC | | server/config.js || OpenVibe.AI | AI_MODEL | ai.env | server/config.js |--| OpenVibe.AI | AI_NS_FALLBACK | | server/config.js |--| OpenVibe.AI | AI_NS_REQUIRED | | server/config.js || OpenVibe.AI | AI_OUTPUT_COST_PER_MTOK | ai.env | server/config.js || OpenVibe.AI | AI_PRICING_JSON | ai.env | server/config.js || OpenVibe.AI | AI_PROVIDER | ai.env | server/config.js |@@@ -274,6 +288,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.AI | BASE_URL | ai.env | server/config.js || OpenVibe.AI | EVENTS_PUBLISH | | server/events.js || OpenVibe.AI | EVENTS_URL | ai.env | server/events.js |++| OpenVibe.AI | FFMPEG_BIN | | server/config.js |++| OpenVibe.AI | FFPROBE_BIN | | server/config.js || OpenVibe.AI | HOST | ai.env | server/config.js || OpenVibe.AI | MIN_CLIENT_GENERATION | | OpenVibe.Shared/release.js || OpenVibe.AI | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |@@@ -306,6 +322,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Billing | BILLING_DB_PATH | | server/config.js || OpenVibe.Billing | BILLING_ESCROW_DAYS | | server/config.js || OpenVibe.Billing | BILLING_JOBS | | server/config.js |++| OpenVibe.Billing | BILLING_LIMITS | | server/config.js |++| OpenVibe.Billing | BILLING_LIMITS_HOUR | | server/config.js |++| OpenVibe.Billing | BILLING_LIMITS_MINUTE | | server/config.js || OpenVibe.Billing | BILLING_MAX_BITS | | server/config.js || OpenVibe.Billing | BILLING_MIN_CASHOUT_BITS | | server/config.js || OpenVibe.Billing | BILLING_MIN_PURCHASE_BITS | | server/config.js |@@@ -357,6 +376,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Blog | BASE_URL | blog.env | server/config.js || OpenVibe.Blog | BLOG_DB_PATH | | server/config.js || OpenVibe.Blog | BLOG_ENTITLEMENTS_PROVIDER | | server/config.js |++| OpenVibe.Blog | BLOG_LIMITS_HOUR | | server/config.js |++| OpenVibe.Blog | BLOG_LIMITS_MINUTE | | server/config.js || OpenVibe.Blog | BLOG_MEDIA_APP | | server/config.js || OpenVibe.Blog | BLOG_MEDIA_VERIFY_INTERVAL_MS | | server/config.js || OpenVibe.Blog | BLOG_OFFICIAL_DESCRIPTION | | server/config.js |@@@ -410,6 +431,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Chat | CHAT_DB_PATH | | server/config.js || OpenVibe.Chat | CHAT_EVENTS_ENDPOINT | | server/config.js || OpenVibe.Chat | CHAT_EVENTS_SUBSCRIBE | | server/config.js |++| OpenVibe.Chat | CHAT_LIMITS_HOUR | | server/config.js |++| OpenVibe.Chat | CHAT_LIMITS_MINUTE | | server/config.js || OpenVibe.Chat | CHAT_OAUTH_REDIRECT_URI | | server/config.js || OpenVibe.Chat | CHAT_PREFS_CACHE_MAX | | server/config.js || OpenVibe.Chat | CHAT_PREFS_ENABLED | | server/config.js |@@@ -463,6 +486,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Codes | CODES_EXPORT_MAX_OBJECTS | | server/config.js || OpenVibe.Codes | CODES_EXPORT_MEDIA_URL | | server/config.js || OpenVibe.Codes | CODES_EXPORT_URL_TTL_S | | server/config.js |++| OpenVibe.Codes | CODES_LIMITS_HOUR | | server/config.js |++| OpenVibe.Codes | CODES_LIMITS_MINUTE | | server/config.js || OpenVibe.Codes | CODES_PLAYGROUND_EVENTS_URL | | server/config.js || OpenVibe.Codes | CODES_PLAYGROUND_MAX_UPLOAD_BYTES | | server/config.js || OpenVibe.Codes | CODES_PLAYGROUND_MEDIA_URL | | server/config.js |@@@ -478,9 +503,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Codes | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js || OpenVibe.Codes | NODE_ENV | | server/config.js || OpenVibe.Codes | OV_BILLING_INTERNAL_URL | | server/http/docs.js |--| OpenVibe.Codes | OV_EVENTS_INTERNAL_URL | | server/config.js, server/http/docs.js |--| OpenVibe.Codes | OV_HOST_INTERNAL_URL | | server/http/docs.js |--| OpenVibe.Codes | OV_MEDIA_INTERNAL_URL | | server/config.js, server/http/docs.js |++| OpenVibe.Codes | OV_EVENTS_INTERNAL_URL | | server/config.js, server/domain/limits.js |++| OpenVibe.Codes | OV_HOST_INTERNAL_URL | | server/domain/limits.js |++| OpenVibe.Codes | OV_MEDIA_INTERNAL_URL | | server/config.js, server/domain/limits.js || OpenVibe.Codes | OV_NETWORK_INTERNAL_URL | codes.env | server/config.js || OpenVibe.Codes | OV_NETWORK_ISSUER | | server/config.js || OpenVibe.Codes | OV_NETWORK_URL | codes.env | server/config.js |@@@ -498,6 +523,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Community | COMMUNITY_DB_PATH | | server/config.js || OpenVibe.Community | COMMUNITY_EVENTS_ENDPOINT | | server/pulse/consumer.js || OpenVibe.Community | COMMUNITY_EVENTS_SUBSCRIBE | | server/pulse/consumer.js |++| OpenVibe.Community | COMMUNITY_LIMITS_HOUR | | server/config.js |++| OpenVibe.Community | COMMUNITY_LIMITS_MINUTE | | server/config.js || OpenVibe.Community | COMMUNITY_PROFILE_MODULE | | server/identity/profile-module.js || OpenVibe.Community | COMMUNITY_SEARCH_DOCUMENTS | | server/search/documents.js || OpenVibe.Community | COOKIE_SECURE | | server/config.js |@@@ -545,6 +572,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Coupons | COUPONS_EXTENSION_ORIGINS | | server/config.js || OpenVibe.Coupons | COUPONS_INSTALL_TTL_DAYS | | server/config.js || OpenVibe.Coupons | COUPONS_INSTALLS_PER_SUBJECT | | server/config.js |++| OpenVibe.Coupons | COUPONS_LIMITS_HOUR | | server/config.js |++| OpenVibe.Coupons | COUPONS_LIMITS_MINUTE | | server/config.js || OpenVibe.Coupons | COUPONS_LOOKUP_ANON_PER_MIN | | server/config.js || OpenVibe.Coupons | COUPONS_LOOKUP_SERVICE_PER_MIN | | server/config.js || OpenVibe.Coupons | COUPONS_REPORTS_PER_DAY | | server/config.js |@@@ -584,6 +613,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Deals | DEALS_IMPORT_MAX_PAGES | | server/config.js || OpenVibe.Deals | DEALS_IMPORT_PAGE_SIZE | | server/config.js || OpenVibe.Deals | DEALS_IMPORT_REFRESH_BATCH | | server/config.js |++| OpenVibe.Deals | DEALS_LIMITS_HOUR | | server/config.js |++| OpenVibe.Deals | DEALS_LIMITS_MINUTE | | server/config.js || OpenVibe.Deals | DEALS_MODERATORS | deals.env | server/config.js || OpenVibe.Deals | DEALS_NEW_ACCOUNT_DAYS | | server/config.js || OpenVibe.Deals | DEALS_NEW_ACCOUNT_WEIGHT | | server/config.js |@@@ -630,6 +661,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Events | EVENTS_DELIVERY_TIMEOUT_MS | | server/config.js || OpenVibe.Events | EVENTS_DLQ_DEGRADED_AT | | server/config.js || OpenVibe.Events | EVENTS_ENDPOINT_HOSTS | | server/config.js |++| OpenVibe.Events | EVENTS_LIMITS | | server/config.js |++| OpenVibe.Events | EVENTS_LIMITS_HOUR | | server/config.js |++| OpenVibe.Events | EVENTS_LIMITS_MINUTE | | server/config.js || OpenVibe.Events | EVENTS_MAX_ATTEMPTS | | server/config.js || OpenVibe.Events | EVENTS_MAX_HOPS | | server/config.js || OpenVibe.Events | EVENTS_MAX_INFLIGHT | | server/config.js |@@@ -639,6 +673,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Events | EVENTS_RECEIPT_RETENTION_DAYS | | server/config.js || OpenVibe.Events | EVENTS_RETENTION_DAYS | | server/config.js || OpenVibe.Events | EVENTS_SOURCE_PREFIXES | | server/config.js |++| OpenVibe.Events | EVENTS_USAGE | | server/config.js |++| OpenVibe.Events | EVENTS_USAGE_FLUSH_MS | | server/config.js || OpenVibe.Events | EVENTS_USER_AUDIENCES | | server/config.js || OpenVibe.Events | EVENTS_WORKER | | server/config.js || OpenVibe.Events | EVENTS_WORKER_INTERVAL_MS | | server/config.js |@@@ -696,6 +732,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Games | EVENTS_PUBLISH | | apps/server/src/config.ts || OpenVibe.Games | EVENTS_URL | games.env | apps/server/src/config.ts || OpenVibe.Games | GAMES_EVENTS_ENDPOINT | | apps/server/src/config.ts |++| OpenVibe.Games | GAMES_LIMITS_HOUR | | apps/server/src/net/actorLimits.ts |++| OpenVibe.Games | GAMES_LIMITS_MINUTE | | apps/server/src/net/actorLimits.ts || OpenVibe.Games | GUEST_IP_BINDING | | apps/server/src/config.ts || OpenVibe.Games | HOST | games.env | apps/server/src/config.ts || OpenVibe.Games | LOG_LEVEL | | apps/server/src/main.ts |@@@ -717,16 +755,21 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Games | STATIC_DIR | games.env | apps/server/src/config.ts || OpenVibe.Host | API_CORS_ORIGINS | | server/config.js || OpenVibe.Host | BASE_URL | host.env | server/config.js |++| OpenVibe.Host | CLOUDFLARE_API_TOKEN_FILE | | lib/dns.js || OpenVibe.Host | COOKIE_SECURE | | server/config.js || OpenVibe.Host | EVENTS_RELAY_INTERVAL_MS | | server/config.js || OpenVibe.Host | EVENTS_URL | host.env | server/config.js |++| OpenVibe.Host | HOME | | lib/dns.js || OpenVibe.Host | HOST | host.env | server/config.js |++| OpenVibe.Host | HOST_ACTOR_LIMITS | | server/http/actor-limits.js || OpenVibe.Host | HOST_CNAME_TARGET | host.env | server/config.js || OpenVibe.Host | HOST_DB_PATH | | server/config.js || OpenVibe.Host | HOST_DNS_SERVERS | | server/config.js || OpenVibe.Host | HOST_DOMAIN_LAPSE_DAYS | | server/config.js || OpenVibe.Host | HOST_DOMAIN_PENDING_DAYS | | server/config.js || OpenVibe.Host | HOST_DOMAIN_RECHECK_MS | | server/config.js |++| OpenVibe.Host | HOST_LIMITS_HOUR | | server/http/actor-limits.js |++| OpenVibe.Host | HOST_LIMITS_MINUTE | | server/http/actor-limits.js || OpenVibe.Host | HOST_MAX_CONCURRENT_UPLOADS | | server/config.js || OpenVibe.Host | HOST_MAX_PROJECTS_PER_OWNER | | server/config.js || OpenVibe.Host | HOST_MAX_UNPACKED_BYTES | | server/config.js |@@@ -750,25 +793,26 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Host | OVHOST_BACKUP_ENV | | lib/offsite.js || OpenVibe.Host | OVHOST_EVENTS_ENV | | lib/announce.js || OpenVibe.Host | OVHOST_INVENTORY | | lib/inventory.js |++| OpenVibe.Host | OVHOST_PROMETHEUS_URL | | lib/alerts.js || OpenVibe.Host | PATH | | lib/executor.js || OpenVibe.Host | PORT | | server/config.js || OpenVibe.Host | RELEASE_AT | | OpenVibe.Shared/release.js || OpenVibe.Host | RELEASE_COMMIT | | OpenVibe.Shared/release.js |--| OpenVibe.Host | SUDO_USER | | lib/commands/drill.js, lib/release-ops.js |++| OpenVibe.Host | SUDO_USER | | lib/cli.js, lib/commands/drill.js +1 || OpenVibe.Host | TRUST_PROXY | host.env | server/config.js |--| OpenVibe.Host | USER | | lib/executor.js |++| OpenVibe.Host | USER | | lib/cli.js, lib/executor.js || OpenVibe.Live | ADMIN_USERNAME | live.env | server/config.js || OpenVibe.Live | AI_HEAR_MAX_SPOOL | | server/ai/stream-audio.js || OpenVibe.Live | AI_HEAR_SEGMENT_SEC | | server/ai/stream-audio.js || OpenVibe.Live | AI_SERVICE | live.env | server/ai/ai-service.js || OpenVibe.Live | AI_VOD_MAX_WINDOWS | | server/ai/media-analysis.js || OpenVibe.Live | ALLOW_P2P_FALLBACK | | server/config.js |++| OpenVibe.Live | ANALYTICS_SOURCE | live.env | server/analytics/network-analytics.js || OpenVibe.Live | BASE_URL | live.env | server/auth/routes.js, server/config.js || OpenVibe.Live | BILLING_AUTHORITY | | server/admin/routes.js, server/chat/live-context-routes.js +2 || OpenVibe.Live | BTTV_CACHE_TTL | | server/config.js || OpenVibe.Live | CALLS_AUTHORITY | live.env | server/streaming/calls-authority.js || OpenVibe.Live | CHAT_AUTHORITY | live.env | server/chat/chat-authority.js |--| OpenVibe.Live | COLD_STORAGE_PATH | | server/config.js || OpenVibe.Live | DATA_DIR | | server/drill.js, server/index.js +1 || OpenVibe.Live | DB_PATH | live.env | server/db/init.js, server/drill.js +2 || OpenVibe.Live | DEBUG_DM_DELIVERY | | server/chat/chat-server.js |@@@ -777,6 +821,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Live | EVENTS_PUBLISH | | server/events/stream-events.js || OpenVibe.Live | EVENTS_URL | live.env | server/events/stream-events.js || OpenVibe.Live | FFZ_CACHE_TTL | | server/config.js |++| OpenVibe.Live | FOLLOWS_AUTHORITY | live.env | server/social/network-follows.js || OpenVibe.Live | GOLIVE_NOTIFY | live.env | server/streaming/golive-notify.js || OpenVibe.Live | HOST | live.env | server/config.js, server/drill.js +1 || OpenVibe.Live | JSMPEG_AUDIO_PORT | live.env | server/config.js |@@@ -786,6 +831,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Live | LISTEN_HOST | | server/config.js || OpenVibe.Live | LISTEN_PID | | server/drill.js, server/index.js || OpenVibe.Live | LIVE_DRILL | | server/drill.js |++| OpenVibe.Live | LIVE_LIMITS_HOUR | | server/net/actor-limits.js |++| OpenVibe.Live | LIVE_LIMITS_MINUTE | | server/net/actor-limits.js || OpenVibe.Live | LIVE_MODULE_SUMMARIES | | server/auth/module-summaries.js || OpenVibe.Live | LIVE_PUBLIC_ORIGIN | | server/auth/module-summaries.js, server/events/search-documents.js +1 || OpenVibe.Live | LIVE_SEARCH_DOCUMENTS | | server/events/search-documents.js, server/events/search-media-documents.js |@@@ -798,7 +845,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Live | MAX_SOUND_SIZE_KB | | server/config.js || OpenVibe.Live | MAX_SOUNDS_PER_CHANNEL | | server/config.js || OpenVibe.Live | MAX_SOUNDS_PER_UPLOADER_PER_CHANNEL | | server/config.js |--| OpenVibe.Live | MAX_VOD_SIZE_MB | | server/config.js, server/media-proxy/vods.js |++| OpenVibe.Live | MAX_VOD_SIZE_MB | | server/media-proxy/vods.js || OpenVibe.Live | MEDIA_APP_ID | live.env | server/config.js, server/media-client.js +1 || OpenVibe.Live | MEDIA_EVENTS_AUTHORITY | live.env | server/media-proxy/outcomes.js || OpenVibe.Live | MEDIA_PUBLIC_URL | live.env | server/config.js, server/media-client.js |@@@ -814,8 +861,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Live | NODE_ENV | live.env | server/comments-client.js, server/config.js +1 || OpenVibe.Live | OPENRE_PUBLIC_URL | live.env | server/openre/openre-client.js || OpenVibe.Live | OPENRE_URL | live.env | server/openre/openre-client.js |--| OpenVibe.Live | OV_AI_INTERNAL_URL | | server/ai/ai-service.js |--| OpenVibe.Live | OV_APP_ROOT | | server/docs/routes.js, server/web/assets.js |++| OpenVibe.Live | OV_AI_INTERNAL_URL | | server/ai/ai-service.js, server/ai/byo-credentials.js +1 |++| OpenVibe.Live | OV_APP_ROOT | | server/docs/routes.js, server/index.js +1 || OpenVibe.Live | OV_BILLING_INTERNAL_URL | | server/monetization/billing-client.js || OpenVibe.Live | OV_BILLING_PUBLIC_URL | | server/monetization/billing-client.js || OpenVibe.Live | OV_BILLING_TIMEOUT_MS | | server/monetization/billing-client.js |@@@ -823,7 +870,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Live | OV_COMMUNITY_INTERNAL_URL | | server/comments-client.js, server/pastes-client.js || OpenVibe.Live | OV_COMMUNITY_URL | live.env | server/ai/ai-moments-job.js, server/comments-client.js +3 || OpenVibe.Live | OV_LIVE_URL | live.env | (not referenced) |--| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/auth/module-summaries.js, server/chat/chat-server.js +7 |++| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/analytics/network-analytics.js, server/auth/account-data.js +11 || 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 +1 || OpenVibe.Live | OV_OAUTH_CLIENT_ID | live.env | server/auth/module-summaries.js, server/auth/routes.js +3 |@@@ -916,9 +963,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Media | NODE_ENV | media.env | server/config.js || OpenVibe.Media | OBJECTS_PATH | | server/config.js || OpenVibe.Media | OV_LIVE_INTERNAL_URL | | server/lineage-client.js |--| OpenVibe.Media | OV_NETWORK_INTERNAL_URL | media.env | server/config.js, server/events.js +2 |++| OpenVibe.Media | OV_NETWORK_INTERNAL_URL | media.env | server/account-data.js, server/config.js +3 || OpenVibe.Media | OV_NETWORK_URL | media.env | server/config.js |--| OpenVibe.Media | OV_OAUTH_CLIENT_ID | media.env | server/events.js, server/index.js +3 |++| OpenVibe.Media | OV_OAUTH_CLIENT_ID | media.env | server/account-data.js, server/events.js +4 || OpenVibe.Media | OV_OAUTH_REDIRECT_URI | | server/index.js || OpenVibe.Media | PASTES_FROZEN_APPS | media.env | server/pastes/routes.js || OpenVibe.Media | PASTES_MOVED_TO | media.env | (not referenced) |@@@ -946,6 +993,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Network | DEV_SANDBOX_ALLOWANCE | | server/config.js || OpenVibe.Network | DEV_SANDBOX_AUDIENCES | | server/config.js || OpenVibe.Network | DEVPATH_RESULT_FILE | | server/status/routes.js |++| OpenVibe.Network | FOLLOWS_AUTHORITY | network.env | server/index.js || OpenVibe.Network | HOST | network.env | server/config.js || OpenVibe.Network | INTERNAL_URL | | server/config.js || OpenVibe.Network | JWT_PUBLIC_KEY | network.env | server/config.js |@@@ -954,10 +1002,13 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Network | MEDIASOUP_ANNOUNCED_IP | | server/domains/dns-check.js || OpenVibe.Network | MIN_CLIENT_GENERATION | | OpenVibe.Shared/release.js || OpenVibe.Network | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |++| OpenVibe.Network | NETWORK_LIMITS_HOUR | | server/auth/actor-limits.js |++| OpenVibe.Network | NETWORK_LIMITS_MINUTE | | server/auth/actor-limits.js || OpenVibe.Network | NODE_ENV | network.env | server/auth/fedcm.js, server/auth/sso-check.js +4 || OpenVibe.Network | NOTIFICATION_EMAIL_CRITICAL_ONLY | network.env | (not referenced) || OpenVibe.Network | NOTIFICATION_MAX_AGE_DAYS | network.env | (not referenced) || OpenVibe.Network | NOTIFICATIONS_ENABLED | network.env | (not referenced) |++| OpenVibe.Network | OPERATOR_ALERT_USERNAMES | | server/operator/alerts.js || OpenVibe.Network | OV_AI_INTERNAL_URL | | server/frame/service.js || OpenVibe.Network | OV_AUDIO_URL | | OpenVibe.Shared/brand.js || OpenVibe.Network | OV_BLOG_INTERNAL_URL | | server/index.js |@@@ -988,7 +1039,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Network | OV_TOOLS_INTERNAL_URL | network.env | server/config.js, server/domains/catalog.js || OpenVibe.Network | OV_TOOLS_URL | network.env | OpenVibe.Shared/brand.js || OpenVibe.Network | OV_YT_URL | | OpenVibe.Shared/brand.js |--| OpenVibe.Network | OWNER_USERNAME | | server/admin/routes.js, server/auth/owner-guard.js +3 |++| OpenVibe.Network | OWNER_USERNAME | | server/admin/routes.js, server/auth/owner-guard.js +6 || OpenVibe.Network | PORT | network.env | server/config.js || OpenVibe.Network | PUBLIC_IP | | server/domains/dns-check.js || OpenVibe.Network | REALTIME_TICKETS | | server/auth/realtime-ticket.js |@@@ -1009,6 +1060,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.News | NEWS_CLUSTER_WINDOW_HOURS | | server/config.js || OpenVibe.News | NEWS_DB_PATH | | server/config.js || OpenVibe.News | NEWS_EDITORS | news.env | server/config.js |++| OpenVibe.News | NEWS_LIMITS_HOUR | | server/config.js |++| OpenVibe.News | NEWS_LIMITS_MINUTE | | server/config.js || OpenVibe.News | NEWS_MIN_INDEPENDENT_SOURCES | | server/config.js || OpenVibe.News | NEWS_PULL_INTERVAL_MS | | server/config.js || OpenVibe.News | NEWS_PULL_MAX_PAGES | | server/config.js |@@@ -1054,6 +1107,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Reviews | REVIEWS_GATE_MIN_SIGNALS | | server/config.js || OpenVibe.Reviews | REVIEWS_GATE_MIN_WORDS | | server/config.js || OpenVibe.Reviews | REVIEWS_IMPORT_QUEUE_INTERVAL_MS | | server/config.js |++| OpenVibe.Reviews | REVIEWS_LIMITS_HOUR | | server/config.js |++| OpenVibe.Reviews | REVIEWS_LIMITS_MINUTE | | server/config.js || OpenVibe.Reviews | REVIEWS_SOURCES_PAGE_SIZE | | server/config.js || OpenVibe.Reviews | REVIEWS_SOURCES_SYNC | | server/config.js || OpenVibe.Reviews | REVIEWS_SOURCES_SYNC_INTERVAL_MS | | server/config.js |@@@ -1083,6 +1138,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Search | SEARCH_EVENT_OWNERS | search.env | server/config.js || OpenVibe.Search | SEARCH_FRESHNESS_HALF_LIFE_DAYS | | server/config.js || OpenVibe.Search | SEARCH_FRESHNESS_WEIGHT | | server/config.js |++| OpenVibe.Search | SEARCH_LIMITS_HOUR | | server/config.js |++| OpenVibe.Search | SEARCH_LIMITS_MINUTE | | server/config.js || OpenVibe.Search | SEARCH_MAX_BODY_BYTES | | server/config.js || OpenVibe.Search | SEARCH_SAVED_MAX_PER_SUBJECT | | server/config.js || OpenVibe.Search | SEARCH_USER_AUDIENCES | | server/config.js |@@@ -1133,6 +1190,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Sources | SOURCES_DB_PATH | | server/config.js || OpenVibe.Sources | SOURCES_FETCH_TIMEOUT_MS | | server/config.js || OpenVibe.Sources | SOURCES_HOST_MIN_INTERVAL_MS | | server/config.js |++| OpenVibe.Sources | SOURCES_LIMITS_HOUR | | server/config.js |++| OpenVibe.Sources | SOURCES_LIMITS_MINUTE | | server/config.js || OpenVibe.Sources | SOURCES_MAX_BACKOFF_MS | | server/config.js || OpenVibe.Sources | SOURCES_MAX_BYTES | | server/config.js || OpenVibe.Sources | SOURCES_MAX_CONCURRENT | | server/config.js |@@@ -1176,6 +1235,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Tips | TIPS_DELIVERY_MAX_ATTEMPTS | | server/config.js || OpenVibe.Tips | TIPS_JOBS | | server/config.js || OpenVibe.Tips | TIPS_JOBS_INTERVAL_MS | | server/config.js |++| OpenVibe.Tips | TIPS_LIMITS_HOUR | | server/config.js |++| OpenVibe.Tips | TIPS_LIMITS_MINUTE | | server/config.js || OpenVibe.Tips | TIPS_MAX_BITS | | server/config.js || OpenVibe.Tips | TIPS_MAX_PENDING_CHECKOUTS | | server/config.js || OpenVibe.Tips | TIPS_MEDIA_HOSTS | | server/config.js |@@@ -1243,6 +1304,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Tools | TOOLS_GUARD | | apps/_shared/guard/index.js || OpenVibe.Tools | TOOLS_GUARD_LIMITS | | apps/_shared/guard/limits.js || OpenVibe.Tools | TOOLS_JOB_RESULTS | tools.env | apps/_shared/jobs/index.js |++| OpenVibe.Tools | TOOLS_LIMITS_HOUR | | apps/_shared/actor-limits.js |++| OpenVibe.Tools | TOOLS_LIMITS_MINUTE | | apps/_shared/actor-limits.js || OpenVibe.Tools | TOOLS_MEDIA_NAMESPACE | | apps/_shared/jobs/index.js || OpenVibe.Tools | TOOLS_REVOCATIONS_DB | | apps/_shared/guard/revocations.js || OpenVibe.Tools | TOOLS_SATELLITE_PORTS | | apps/_shared/tools/satellites.js |@@@ -1277,6 +1340,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Trade | TRADE_EDITORS | trade.env | server/config.js || OpenVibe.Trade | TRADE_FRESHNESS_INTERVAL_MS | | server/config.js || OpenVibe.Trade | TRADE_GATE_MIN_WORDS | | server/config.js |++| OpenVibe.Trade | TRADE_LIMITS_HOUR | | server/config.js |++| OpenVibe.Trade | TRADE_LIMITS_MINUTE | | server/config.js || OpenVibe.Trade | TRADE_PRICE_MAX_AGE_SEC | | server/config.js || OpenVibe.Trade | TRADE_SYNC_INTERVAL_MS | | server/config.js || OpenVibe.Trade | TRADE_SYNC_MAX_PAGES | | server/config.js |@@@ -1311,6 +1376,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.VIP | VIP_CHECKOUT_PROVIDERS | vip.env | server/config.js || OpenVibe.VIP | VIP_DB_PATH | | server/config.js || OpenVibe.VIP | VIP_JOBS | | server/config.js |++| OpenVibe.VIP | VIP_LIMITS_HOUR | | server/config.js |++| OpenVibe.VIP | VIP_LIMITS_MINUTE | | server/config.js || OpenVibe.VIP | VIP_MEMBER_COUNT_TTL_MS | | server/config.js || OpenVibe.VIP | VIP_POWERCHAT_LINK_TEMPLATE | | server/config.js || OpenVibe.VIP | VIP_PROJECTION_GRACE_MS | | server/config.js |@@@ -1336,6 +1403,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Wiki | OV_OAUTH_CLIENT_ID | wiki.env | server/config.js || OpenVibe.Wiki | OV_OAUTH_REDIRECT_URI | | server/config.js || OpenVibe.Wiki | OV_SOURCES_INTERNAL_URL | wiki.env | server/config.js |++| OpenVibe.Wiki | OV_VIP_INTERNAL_URL | | server/config.js |++| OpenVibe.Wiki | OV_VIP_URL | | server/config.js || OpenVibe.Wiki | PORT | | server/config.js || OpenVibe.Wiki | RELEASE_AT | | OpenVibe.Shared/release.js || OpenVibe.Wiki | RELEASE_COMMIT | | OpenVibe.Shared/release.js |@@@ -1345,8 +1414,14 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the| OpenVibe.Wiki | WIKI_GATE_MIN_SOURCES | | server/config.js || OpenVibe.Wiki | WIKI_GATE_MIN_WORDS | | server/config.js || OpenVibe.Wiki | WIKI_GATE_REQUIRE_SOURCES | | server/config.js |++| OpenVibe.Wiki | WIKI_LIMITS_HOUR | | server/config.js |++| OpenVibe.Wiki | WIKI_LIMITS_MINUTE | | server/config.js || OpenVibe.Wiki | WIKI_MEDIA_APP | wiki.env | server/config.js || OpenVibe.Wiki | WIKI_MEDIA_VERIFY_INTERVAL_MS | | server/config.js || OpenVibe.Wiki | WIKI_SCHEDULE_INTERVAL_MS | | server/config.js || OpenVibe.Wiki | WIKI_USER_AUDIENCES | | server/config.js |++| OpenVibe.Wiki | WIKI_VIP_CACHE_DENY_TTL_MS | | server/config.js |++| OpenVibe.Wiki | WIKI_VIP_CACHE_TTL_MS | | server/config.js |++| OpenVibe.Wiki | WIKI_VIP_CACHE_UNAVAILABLE_TTL_MS | | server/config.js |++| OpenVibe.Wiki | WIKI_VIP_TIMEOUT_MS | | server/config.js || OpenVibe.Wiki | WIKI_WORKER_ID | | server/config.js |@@@ -8,21 +8,21 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r| Current owner | Tables | Stay | Staged copy | Moved (mirror left) | To move | Frozen legacy | Investigate ||---|---|---|---|---|---|---|---|--| OpenVibe.Live | 122 | 31 | 2 | 15 | 70 | 6 | 0 |--| OpenVibe.Network | 60 | 57 | 0 | 0 | 3 | 0 | 0 |++| OpenVibe.Live | 126 | 35 | 2 | 15 | 70 | 6 | 0 |++| OpenVibe.Network | 78 | 75 | 0 | 0 | 3 | 0 | 0 || OpenVibe.Shared | 2 | 2 | 0 | 0 | 0 | 0 | 0 |--| OpenVibe.Media | 31 | 26 | 0 | 0 | 0 | 3 | 2 |--| OpenVibe.Tools | 13 | 13 | 0 | 0 | 0 | 0 | 0 |--| OpenVibe.Community | 36 | 35 | 0 | 0 | 0 | 0 | 1 |--| OpenVibe.Games | 14 | 13 | 0 | 0 | 0 | 0 | 1 |++| OpenVibe.Media | 37 | 32 | 0 | 0 | 0 | 3 | 2 |++| OpenVibe.Tools | 14 | 14 | 0 | 0 | 0 | 0 | 0 |++| OpenVibe.Community | 38 | 37 | 0 | 0 | 0 | 0 | 1 |++| OpenVibe.Games | 15 | 14 | 0 | 0 | 0 | 0 | 1 || OpenVibe.Sites | 0 | 0 | 0 | 0 | 0 | 0 | 0 |--| OpenVibe.Events | 7 | 7 | 0 | 0 | 0 | 0 | 0 |--| OpenVibe.Chat | 41 | 35 | 6 | 0 | 0 | 0 | 0 |++| OpenVibe.Events | 8 | 8 | 0 | 0 | 0 | 0 | 0 |++| OpenVibe.Chat | 42 | 36 | 6 | 0 | 0 | 0 | 0 || OpenRe.Stream | 14 | 14 | 0 | 0 | 0 | 0 | 0 || OpenVibe.Billing | 19 | 19 | 0 | 0 | 0 | 0 | 0 || OpenVibe.Tips | 19 | 19 | 0 | 0 | 0 | 0 | 0 || OpenVibe.VIP | 15 | 15 | 0 | 0 | 0 | 0 | 0 |--| OpenVibe.AI | 19 | 19 | 0 | 0 | 0 | 0 | 0 |++| OpenVibe.AI | 20 | 20 | 0 | 0 | 0 | 0 | 0 || OpenVibe.Search | 21 | 21 | 0 | 0 | 0 | 0 | 0 || OpenVibe.Sources | 8 | 8 | 0 | 0 | 0 | 0 | 0 || OpenVibe.Wiki | 22 | 22 | 0 | 0 | 0 | 0 | 0 |@@@ -2,26 +2,53 @@> 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-26 13:29 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.++Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-28 03:25 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.| Severity | Area | Subject | Detail ||---|---|---|---|--| medium | deploy | live | deployed 9f7f36c is 61 commit(s) behind origin/main 8caa540 |++| medium | deploy | ai | deployed 549bed0 is 1 commit(s) behind origin/main 6c8b833 |++| medium | deploy | billing | deployed 80f97aa is 1 commit(s) behind origin/main f24684b |++| medium | deploy | blog | deployed 21d537c is 1 commit(s) behind origin/main 8a7f8eb |++| medium | deploy | chat | deployed 3aab730 is 1 commit(s) behind origin/main d87c8d3 |++| medium | deploy | codes | deployed d78de70 is 1 commit(s) behind origin/main 7d6f65a |++| medium | deploy | community | deployed 52d923a is 1 commit(s) behind origin/main 2da3501 |++| medium | deploy | coupons | deployed 64835d2 is 1 commit(s) behind origin/main b91cd79 |++| medium | deploy | deals | deployed fa0582d is 1 commit(s) behind origin/main 533450f |++| medium | deploy | events | deployed f55f7eb is 1 commit(s) behind origin/main 19919ec |++| medium | deploy | games | deployed 51d8688 is 1 commit(s) behind origin/main eb2d008 |++| medium | deploy | host | deployed 2b63389 is 2 commit(s) behind origin/main 6d2aaaa |++| medium | deploy | live | deployed 9f7f36c is 120 commit(s) behind origin/main 03f49b7 |++| medium | deploy | media | deployed 6248363 is 1 commit(s) behind origin/main 14cac06 |++| medium | deploy | network | deployed ddd87b6 is 1 commit(s) behind origin/main 5a50c12 |++| medium | deploy | news | deployed 8ab47a6 is 1 commit(s) behind origin/main 97dae43 |++| medium | deploy | openre | deployed cf423e3 is 1 commit(s) behind origin/main c77ec2a |++| medium | deploy | reviews | deployed 1cff36b is 1 commit(s) behind origin/main c87b344 |++| medium | deploy | search | deployed 8ed7667 is 1 commit(s) behind origin/main e8511d8 |++| medium | deploy | sites | deployed 32464ec is 1 commit(s) behind origin/main 304e8b1 |++| medium | deploy | sources | deployed 351383e is 1 commit(s) behind origin/main 1670853 |++| medium | deploy | tips | deployed 1e6bfbb is 1 commit(s) behind origin/main 13986b5 |++| medium | deploy | tools | deployed e55469f is 1 commit(s) behind origin/main 4f4ed6e |++| medium | deploy | trade | deployed 4658447 is 1 commit(s) behind origin/main 273bce7 |++| medium | deploy | vip | deployed 0fbcbb5 is 1 commit(s) behind origin/main 95b3e19 |++| medium | deploy | wiki | deployed 32a26ef is 1 commit(s) behind origin/main 3302540 || low | database | /opt/openvibe.blog/data/blog.db | 401 KB, 20 tables, not a database the service opens (services.json): stale file or undeclared copy || low | database | /opt/openvibe.community/data/community.db | 258 KB, 21 tables, not a database the service opens (services.json): stale file or undeclared copy || low | database | /opt/openvibe.games/data/legacy-import/world-before-20260923T184930Z.db | 193 KB, 13 tables, not a database the service opens (services.json): stale file or undeclared copy |--| low | database | /opt/openvibe.live/shared/data/analytics.db | 518.0 MB, 6 tables, not a database the service opens (services.json): stale file or undeclared copy |++| low | database | /opt/openvibe.live/shared/data/analytics.db | 525.4 MB, 6 tables, not a database the service opens (services.json): stale file or undeclared copy || low | database | /opt/openvibe.live/shared/data/backups/analytics-pre-adr021-2026-09-23.db | 1.76 GB copy (backup, import snapshot or rehearsal) kept beside the service data || low | database | /opt/openvibe.live/shared/data/backups/live-20260926-072748.db | 284.0 MB copy (backup, import snapshot or rehearsal) kept beside the service data || low | database | /opt/openvibe.live/shared/data/backups/live-20260926-095352.db | 284.0 MB copy (backup, import snapshot or rehearsal) kept beside the service data || low | database | /opt/openvibe.live/shared/data/backups/live-pre-643a2e6.db | 264.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data |++| low | database | /opt/openvibe.live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db | 284.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data || low | database | /opt/openvibe.live/shared/data/hobo.db | 0 B, zero tables (dead file) || low | database | /opt/openvibe.live/shared/data/live-before-rs-slots-20260924T0153Z.db | 279.2 MB, 151 tables, not a database the service opens (services.json): stale file or undeclared copy |--| low | database | /opt/openvibe.live/shared/data/live.db | 284.1 MB, 161 tables, not a database the service opens (services.json): stale file or undeclared copy |++| low | database | /opt/openvibe.live/shared/data/live.db | 284.7 MB, 162 tables, not a database the service opens (services.json): stale file or undeclared copy || low | database | /opt/openvibe.live/shared/data/openvibe.db | 0 B, zero tables (dead file) || low | database | /opt/openvibe.live/shared/data/rs-companion.db | 8.6 MB, 33 tables, not a database the service opens (services.json): stale file or undeclared copy || low | database | /opt/openvibe.media/data/backups/owner-subject-20260923.media.db | 9.5 MB copy (backup, import snapshot or rehearsal) kept beside the service data || low | database | /opt/openvibe.media/data/reports/h15-repair-applied-20260925.media.db | 11.3 MB, 27 tables, not a database the service opens (services.json): stale file or undeclared copy |++| low | database | /opt/openvibe.network/data/backups/network-pre-creator-analytics-20260926.db | 292.4 MB copy (backup, import snapshot or rehearsal) kept beside the service data |++| low | database | /opt/openvibe.network/data/backups/network-pre-follows-20260926.db | 292.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data || low | database | /opt/openvibe.network/data/network-pre-refresh-hash-2026-09-24.db | 279.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data || low | database | /opt/openvibe.network/data/network-pre-secrets-2026-09-24.db | 279.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data || low | database | /opt/openvibe.tips/data/tips.db | 4 KB, 15 tables, not a database the service opens (services.json): stale file or undeclared copy |@@@ -69,6 +96,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w| low | env | OpenVibe.Examples:OV_CLIENT_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.Examples:OV_WEBHOOK_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.Examples:OV_WEBHOOK_SECRET_PREVIOUS | 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.Host:CLOUDFLARE_API_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:LIVE_EVENTS_SECRET | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |@@@ -87,7 +115,6 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w| low | env | OpenVibe.Tools:NPS_API_KEY | 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.Tools:OPEN_CHARGE_MAP_KEY | 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.Tools:OV_INTERNAL_KEY | 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.Tools:RIDB_API_KEY | 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.Trade:TRADE_EVENTS_WEBHOOK_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 | schema | OpenVibe.Community:token_revocations | in production (community.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) || low | schema | OpenVibe.Games:token_revocations | in production (world.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |@@@ -145,6 +172,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w| info | schema | OpenVibe.Deals:idempotency_receipts | in production (deals.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Deals (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) || info | schema | OpenVibe.Games:event_outbox | in production (world.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Games (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) || info | schema | OpenVibe.Host:event_outbox | in production (host.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Host (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |++| info | schema | OpenVibe.Live:account_data_events | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:ai_chatbot_configs | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:ai_timeline_cache | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:ai_usage | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |@@@ -204,10 +232,12 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w| info | schema | OpenVibe.Live:easter_egg_solves | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:emotes | 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:follow_projection_revisions | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:follows | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:hidden_relay_users | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:ip_log | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:kick_channel_cache | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |++| info | schema | OpenVibe.Live:lineage_unresolved | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:linked_accounts | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:managed_streams | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:media_request_settings | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |@@@ -242,6 +272,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w| info | schema | OpenVibe.Live:stream_timeline_events | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:streamer_overviews | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:streams | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |++| info | schema | OpenVibe.Live:subject_merges | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:subject_projection | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:subscriptions | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:themes | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |@@@ -268,6 +299,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w| info | schema | OpenVibe.Live:vpn_approvals | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Live:watch_time | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Media:event_outbox | in production (media.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Media (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |++| info | schema | OpenVibe.Media:subject_merges | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Network:admin_rate_limits | declared in code but absent from every production database for this service (lazy/unused/legacy migration) || info | schema | OpenVibe.Network:analytics_daily | in production (network.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Network (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) || info | schema | OpenVibe.Network:analytics_day_salts | in production (network.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Network (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) |@@@ -341,8 +373,13 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w| info | schema | OpenVibe.Wiki:wiki_page_revision_purges | in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) || info | schema | OpenVibe.Wiki:wiki_page_revisions | in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) || info | schema | OpenVibe.Wiki:wiki_schedule_jobs | in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) |++| info | units | openvibe-alerts.service | unit not listed in services.json |++| info | units | openvibe-alerts.timer | unit not listed in services.json |++| info | units | openvibe-browsercheck.service | unit not listed in services.json |++| info | units | openvibe-browsercheck.timer | unit not listed in services.json || info | units | openvibe-devpath.service | unit not listed in services.json || info | units | openvibe-devpath.timer | unit not listed in services.json |++| info | units | openvibe-llm.service | unit not listed in services.json || info | units | openvibe-toolsjob.service | unit not listed in services.json || info | units | openvibe-toolsjob.timer | unit not listed in services.json || unknown | host | powerchat.gg, raspi/hobo.tools (LAN) | unreachable from this environment; state not verified |@@@ -10,23 +10,23 @@ Deliverable 8, derived from the [requirement ledger](requirement-ledger.md) (as| D02-D04 | Registry, capabilities, contracts | absent | **partial** | D02 partial, D03 partial, D04 partial | W1, W2 | yes | 1 charter-only repos of 36; Live 14, Network 3, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0 || D05-D06 | Policy, staff, user modules | partial | **partial** | D05 partial, D06 partial | W1, W2 | yes | - || D07-D10 | Themes, notifications, social, analytics | partial | **partial** | D07 partial, D08 partial, D09 partial, D10 partial | W1, W2, Track O | yes | 2 repos carry their own analytics_events |--| D11-D13 | Events, realtime, SDK | absent | **partial** | D11 met, D12 partial, D13 partial | W2, W3 | yes | 107 caller-file/target pairs across 76 files; 12 WebSocket server constructions |++| D11-D13 | Events, realtime, SDK | absent | **partial** | D11 met, D12 partial, D13 partial | W2, W3 | yes | 112 caller-file/target pairs across 82 files; 12 WebSocket server constructions || D14-D16 | Media | partial | **partial** | D14 partial, D15 partial, D16 partial | W4 | yes | 3 Media tables target OpenVibe.Community |--| D17-D20 | Live, OpenRe, channel/VOD lineage | partial | **partial** | D17 partial, D18 blocked on owner, D19 partial, D20 partial | W7 | yes | 14 Live tables target OpenRe.Stream; 19 test files |--| D21-D23 | Chat | partial | **partial** | D21 partial, D22 partial, D23 partial | W6 | yes | 25 Live tables target OpenVibe.Chat; 35 test files |--| D24-D27 | Community | partial | **partial** | D24 partial, D25 met, D26 partial, D27 met | W5 | yes | 33 tables; 4 Live tables target OpenVibe.Community |--| D28-D30 | Billing, Tips, VIP | partial | **blocked on owner** | D28 blocked on owner, D29 blocked on owner, D30 blocked on owner | W8-W10 (ADR-012 first) | yes | 2 Live tables target OpenVibe.Billing; 21 test files |--| D31 | Tools | built | **partial** | D31 partial | W11 | yes | 49 test files |--| D32 | Games | built | **partial** | D32 partial | W12 | yes | 76 test files |--| D33-D34 | Codes, Host | absent | **partial** | D33 partial, D34 partial | W20, W21 | yes | 27 test files; 38 test files |--| D35-D38 | AI, content, sources, search | partial | **partial** | D35 partial, D36 blocked on owner, D37 blocked on owner, D38 blocked on owner | W13-W15 | yes | 14 Live tables target OpenVibe.AI; 20 test files |++| D17-D20 | Live, OpenRe, channel/VOD lineage | partial | **partial** | D17 partial, D18 blocked on owner, D19 partial, D20 partial | W7 | yes | 14 Live tables target OpenRe.Stream; 21 test files |++| D21-D23 | Chat | partial | **partial** | D21 partial, D22 partial, D23 partial | W6 | yes | 25 Live tables target OpenVibe.Chat; 48 test files |++| D24-D27 | Community | partial | **partial** | D24 partial, D25 met, D26 partial, D27 met | W5 | yes | 35 tables; 4 Live tables target OpenVibe.Community |++| D28-D30 | Billing, Tips, VIP | partial | **blocked on owner** | D28 blocked on owner, D29 blocked on owner, D30 blocked on owner | W8-W10 (ADR-012 first) | yes | 2 Live tables target OpenVibe.Billing; 22 test files |++| D31 | Tools | built | **partial** | D31 partial | W11 | yes | 61 test files |++| D32 | Games | built | **partial** | D32 partial | W12 | yes | 82 test files |++| D33-D34 | Codes, Host | absent | **partial** | D33 partial, D34 partial | W20, W21 | yes | 34 test files; 48 test files |++| D35-D38 | AI, content, sources, search | partial | **partial** | D35 partial, D36 blocked on owner, D37 blocked on owner, D38 blocked on owner | W13-W15 | yes | 14 Live tables target OpenVibe.AI; 26 test files || D39 | Mods | absent | **partial** | D39 partial | W12, W21 | yes | - |--| D40 | Open developer services | absent | **partial** | D40 partial | W20, W21 | yes | 40 of 107 call sites authenticate with the shared internal key |++| D40 | Open developer services | absent | **partial** | D40 partial | W20, W21 | yes | 40 of 112 call sites authenticate with the shared internal key || D41 | Independent runtime lifecycle | partial | **partial** | D41 partial | W7, W21 | yes | - |--| D42 | Shared component architecture | partial | **partial** | D42 partial | W2, Track R | yes | 24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0; 0 manifests unpinned or behind: none |++| D42 | Shared component architecture | partial | **partial** | D42 partial | W2, Track R | yes | 25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0; 31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0) || D43 | Safe active-client updates | absent | **partial** | D43 partial | Track R | yes | - || D44 | Crawlable component rendering | built | **partial** | D44 partial | Track R (preserve) | yes | - |--| D45 | Release compatibility and recovery | absent | **partial** | D45 partial | Track R, W22 | yes | 1 service(s) not running origin/main |++| D45 | Release compatibility and recovery | absent | **partial** | D45 partial | Track R, W22 | yes | 25 service(s) not running origin/main || D46 | Update observability and acceptance | absent | **partial** | D46 partial | Track R, Track O | yes | 27 of 27 scanned repos have .github/workflows |Families: 0 met, 21 partial, 0 not met, 1 blocked on owner (of 22). Requirements: 3 met, 36 partial, 0 not met, 7 blocked on owner (of 46); 46 verified. At Wave 0 the same 22 families were 3 built, 11 partial, 8 absent.@@@ -47,7 +47,7 @@ Families: 0 met, 21 partial, 0 not met, 1 blocked on owner (of 22). Requirements- **D32 Games** (partial). D32: The browser Games runtime uses Network identity, a transactional outbox to Events (73 games events in the store), the Contracts mod manifest (mod-manifest.v1.json, ADR-013) and a grant/revoke runtime seam. The Live HoboQuest legacy import is applied: 616 rows archived in legacy_live_rows. In production (2026-09-23 20:20 UTC) there are 0 mods, 0 grants and 0 Media mirrors. Executable (Source/QuickJS) mods are refused until Host Stage C, and Source.OpenVibe.Games has no adapters.- **D33-D34 Codes, Host** (partial). D33: openvibe.codes is the real portal, not a Sites placeholder (release d60f279 at 20:21 UTC). It has docs generated from the pinned contracts and SDK, a credential scope editor with rotate and revoke, Media and Events playgrounds bound to project grants, a webhook tester for signature v2, and project export and delete. Production holds 0 manifests, 0 releases and 0 playground runs. The committed developer-path check (Examples 919d26b) runs only against the SDK mock and has not been run on production. Realtime, Billing-sandbox and Chat-bot playgrounds and usage/trace dashboards do not exist. D34: Stage A (the operator plane) is used in production. A manual `ovhost backup --all --offsite` at 18:47 UTC covered 24 services, including live, media and games, with the off-host copy ok, and openvibe-backup.timer is active (first scheduled run 2026-09-24 03:36 UTC). 20 restore drills are recorded, and the D41 proof passed on production for sources at 20:09 UTC. Stage B (isolated static hosting) is proven in tests only: openvibe.host serves the Sites placeholder, *.openvibe.host answers 404 and there are 0 projects. Stage C has not started, and most services still deploy with their own scripts.- **D35-D38 AI, content, sources, search** (partial). D35: OpenVibe.AI is the AI authority for Live and Network. At 2026-09-23 20:19 UTC it held 421 runs (419 from Live, 2 network.site_copy) and 546 audit rows. The Live import was applied (79,657 ledger rows, 11 holds), and Network no longer falls back to Live's site-copy route (31b234a, 0a115f6). Still missing: 0 citation rows, none of the 19 active routes declares a fallback, captions/whisper and streamers' own keys remain in Live, no product (News, Blog, Wiki and so on) has run a workflow in production, and ai.openvibe.network is a Sites placeholder. D36: Sources has a registry with terms and robots notes, conditional-GET ingestion with provenance and revisions, explicit failure states, robots and SSRF refusal, /metrics and an honest public page. All of this is proven in tests. At 2026-09-23 20:19 UTC all 6 seed sources are disabled, with 0 fetch runs and 0 items, so no real source has ever been ingested. D37: The index-document contract and an event-fed, ACL-filtered SQLite FTS5 Search are tested for leaks, revision order, tombstones and CDN purge. search.openvibe.network has served a public search page since 2026-09-23 (HTML 200 at 20:19 UTC). The production index holds 10 documents, all wiki tombstones (0 public or restricted indexed), so no content document has ever been indexed. The removal purge is inert because CLOUDFLARE_PURGE_TOKEN is not set. D38: The shared runtime (drafts and revisions, scheduling, the SEO/indexability gate, citations, index hooks, authorship) is tested and pinned at v0.2.1 by all seven products. Wiki and Blog are public (no placeholder at 20:19 UTC). Nothing is published yet. Wiki has 10 pages with 0 reviews (all noindex), and Blog has 1 post, a draft. News, Reviews, Deals, Coupons and Trade still serve the Sites placeholder over empty databases (0 stories, entities, offers, coupons and instruments).--- **D39 Mods** (partial). D39: The mod manifest (Contracts mods/mod-manifest.v1, ADR-013 accepted 2026-09-23) and a Games-local registry are tested: grants are the approved subset, installs and grants are audited, and revoking a mod removes its effect on the next tick and across a restart. Only declarative games-content packs run. Executable runtimes are refused, and the CPU budget is metered and audited but not enforced. Network's mods.grant.manage capability is still `planned`, and on 2026-09-23 at 20:22 UTC production world.db held 0 mods, 0 grants and 0 audit rows.++- **D39 Mods** (partial). D39: The mod manifest (Contracts mods/mod-manifest.v1, ADR-013) and the Games registry are tested. Since 2026-09-27 every install is a Network principal mod:<id> whose grants Network holds (mods.grant.manage active; Games asks Network first, and network.mod.grants_changed keeps its copy current). The budget is enforced: 5 reconciles over cpuMs, or 3 minutes over 60 effects a minute, disable only the offending mod. Security tests cover namespace escape, event flood, resource budget and forged ownership. One production install -> grant -> use -> revoke run is recorded. Only declarative games-content packs run; executable runtimes wait for Host Stage C.- **D40 Open developer services** (partial). D40: Tests cover each part: developer projects, sandbox apps, scoped app credentials and grants (Network /api/v1/projects); per-project Media tenants with byte quotas; Events app events with publish-rate and retained-bytes quotas; Tools jobs for app principals; and the SDK clients. The path ran once on production (dev_projects: one project created 2026-09-23 04:30 UTC, now archived). Its committed, repeatable version (Examples 919d26b, npm run developer-path) runs in CI only against the SDK mock and has never run against production. Codes production holds 0 manifests, 0 releases and 0 playground runs.- **D41 Independent runtime lifecycle** (partial). D41: The production ovhost inventory has 25 services. 24 declare a loopback readiness URL. Drain policies and protected-session probes are declared for Live, Media and Events, along with worker units and databases. Deploy and rollback with readiness polling, auto-rollback and --wait-idle are tested. The D41 proof passed on production at 20:09 UTC on 2026-09-23: sources was deployed, rolled back and redeployed, and the 37 other units were identical. Gaps: shutdown deadlines, liveness, startup recovery and rollback conditions are not declared; the proof covers only one low-risk service; and Live still runs the in-place layout, where rollback is refused (C-76).- **D42 Shared component architecture** (partial). D42: openvibe-shared is released by semver tags. v1.4.0 was released at 19:38 UTC on 2026-09-23, and its last 3 CI runs are green. The package has explicit subpath exports and a check that browser files carry no server-only code, and 24 consuming repositories pin a tag (21 of them v1.3.0). The browser files are not versioned per consumer, though: Community, Wiki, Codes and Tools pages load https://openvibe.network/shared/navbar.js with no hash (max-age=300), which is whatever release Network pins. The one-package decision (Shared ADR 0001) is only proposed.@@@ -12,14 +12,14 @@ Deliverable 9. **Not yet reviewed by the production-host owner** (Wave 0 exit cr| H4 | managed_streams.stream_key values still need rotation after a past leak | high | partial | **needed** | Live maintainers (security track S) | W7 (openre.key.rotate) - or earlier as a standalone rotation | The one key committed to a repository (in Live's control-bridge example since ac0d6a47) was rotated on 2026-09-23 and replaced by a placeholder, with the commit allow-listed in the secret scan. The leaked slot keys are rotated per slot at its OpenRe cutover (ADR-009, openre.key.rotate), or by a standalone rotation in Live if the cutover slips. | - || H5 | Multilingual Whisper model missing breaks non-English captions | medium | mitigated | - | Live maintainers | - | Install the model and set WHISPER_MODEL_MULTI in live.env. | WHISPER_MODEL_MULTI is set in live.env || H6 | YouTube refuses the server IP; the yt tool needs a proxy | low | blocked-on-owner | **needed** | Platform operator | W11 | Set YT_PROXY and/or YT_COOKIES_FILE for openvibe-tools-yt. | YT_PROXY unset in tools.env |--| H7 | Workstation root disk near full; headless Chrome can hit ENOSPC | low | open | - | Workstation owner | Track Q | Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB). | workstation / is 97% 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 73% used (at generation time) || H8 | A hardcoded internal secret was previously public | high | partial | **needed** | Platform operator (security track S) | W1 (scoped service principals) / Track S | Removed: the hard-coded openvibe-internal-2026 value and the hard-coded quest secret (register C-59, Live e505868). New services use Network-issued service tokens; Network records every legacy-key call per route (principal_usage) and the key-only routes have removal dates (register C-50..C-57). Remaining: rotate INTERNAL_API_KEY in every env file, then retire the key routes by their dates. | - || H9 | Removed features and copy rules must not be undone | medium | standing-rule | - | Every product wave | all | Product waves check the prohibitions list (roadmap 9.1) before adding copy or campaigns. | - || H10 | Commit identity | medium | partial | **needed** | Every contributor | all | Per-repo git config user.email = [email protected]; every new commit follows it. Older history keeps some assistant trailers. | main history violates the rule in: Live (238 commits with assistant trailers); Network (14 commits with assistant trailers); Media (30 commits with assistant trailers); Tools (9 commits with assistant trailers) |--| H11 | analytics_events grows without pruning | medium | mitigated | - | OpenVibe.Shared maintainers (openvibe-shared/analytics.js) | Track O / ADR-021 - before any schema wave touching Live or Network | ADR-021: no IP, user id or city stored; raw analytics events are pruned after 30 days on a schedule in Live (nightly job), Tools (timer) and Network (openvibe-shared analytics retention.schedulePrune since 9bbd90f), rollups kept. | largest analytics stores: live/shared/data/analytics.db 518.0 MB; network/data/network.db 290.3 MB; tools/apps/audio/data/analytics.db 36.6 MB; tools/apps/text/data/analytics.db 5.8 MB |++| H11 | analytics_events grows without pruning | medium | mitigated | - | OpenVibe.Shared maintainers (openvibe-shared/analytics.js) | Track O / ADR-021 - before any schema wave touching Live or Network | ADR-021: no IP, user id or city stored; raw analytics events are pruned after 30 days on a schedule in Live (nightly job), Tools (timer) and Network (openvibe-shared analytics retention.schedulePrune since 9bbd90f), rollups kept. | largest analytics stores: live/shared/data/analytics.db 525.4 MB; network/data/network.db 302.4 MB; tools/apps/audio/data/analytics.db 36.7 MB; tools/apps/text/data/analytics.db 5.9 MB || H12 | No Cloudflare cache-purge step after deploys | low | blocked-on-owner | **needed** | Platform operator | W21 / Track I | Cache Rules "browser_ttl respect_origin" on every openvibe.* zone and openre.stream (2026-09-23) make the edge follow origin max-age; Search has a purge queue that stays inert until a purge-scoped token exists (CLOUDFLARE_PURGE_TOKEN). | CLOUDFLARE_PURGE_TOKEN unset in search.env |--| H13 | Production drifts from main | medium | open | - | Platform operator | W0 (checklist) / W21 (release manifests) | Deploy or record why each lagging service is held back. | live: deployed 9f7f36c is 61 commit(s) behind origin/main 8caa540 |--| H14 | Dead and backup database files on the production host | low | open | **needed** | Live maintainers | W0 | Confirm no code opens them, then delete the empty files; move copies (backups, import snapshots, rehearsal databases) to /var/backups/openvibe with a retention date. | blog/data/blog.db, community/data/community.db, games/data/legacy-import/world-before-20260923T184930Z.db, live/shared/data/analytics.db, live/shared/data/backups/analytics-pre-adr021-2026-09-23.db, live/shared/data/backups/live-20260926-072748.db, live/shared/data/backups/live-20260926-095352.db, live/shared/data/backups/live-pre-643a2e6.db, live/shared/data/hobo.db, live/shared/data/live-before-rs-slots-20260924T0153Z.db, live/shared/data/live.db, live/shared/data/openvibe.db, live/shared/data/rs-companion.db, media/data/backups/owner-subject-20260923.media.db, media/data/reports/h15-repair-applied-20260925.media.db, network/data/network-pre-refresh-hash-2026-09-24.db, network/data/network-pre-secrets-2026-09-24.db, tips/data/tips.db, tools/apps/audio/data/guard.db, tools/apps/docs/data/guard.db, tools/apps/food/data/guard.db, tools/apps/gateway/data/guard.db, tools/apps/gateway/data/token-revocations.db, tools/apps/img/data/guard.db, tools/apps/maps/data/guard.db, tools/apps/text/data/guard.db, tools/apps/yt/data/guard.db, tools/backups/analytics-2026-09-23/audio.analytics.db, tools/backups/analytics-2026-09-23/docs.analytics.db, tools/backups/analytics-2026-09-23/food.analytics.db, tools/backups/analytics-2026-09-23/img.analytics.db, tools/backups/analytics-2026-09-23/maps.analytics.db, tools/backups/analytics-2026-09-23/text.analytics.db, tools/backups/analytics-2026-09-23/yt.analytics.db, billing/live-snapshot-202609230121.db, chat/live-snap-a.db, chat/live-snap-b.db, chat/live-snapshot-0159.db, chat/rehearsal.db, community/community.pre-c24-20260925T185117Z.db, community/community.pre-c24b-20260925T185400Z.db, community/community.pre-c24c-20260925T185425Z.db, community/community.pre-live-comments-20260923T191345Z.db |++| H13 | Production drifts from main | medium | open | - | Platform operator | W0 (checklist) / W21 (release manifests) | Deploy or record why each lagging service is held back. | ai: deployed 549bed0 is 1 commit(s) behind origin/main 6c8b833; billing: deployed 80f97aa is 1 commit(s) behind origin/main f24684b; blog: deployed 21d537c is 1 commit(s) behind origin/main 8a7f8eb; chat: deployed 3aab730 is 1 commit(s) behind origin/main d87c8d3; codes: deployed d78de70 is 1 commit(s) behind origin/main 7d6f65a; community: deployed 52d923a is 1 commit(s) behind origin/main 2da3501; coupons: deployed 64835d2 is 1 commit(s) behind origin/main b91cd79; deals: deployed fa0582d is 1 commit(s) behind origin/main 533450f; events: deployed f55f7eb is 1 commit(s) behind origin/main 19919ec; games: deployed 51d8688 is 1 commit(s) behind origin/main eb2d008; host: deployed 2b63389 is 2 commit(s) behind origin/main 6d2aaaa; live: deployed 9f7f36c is 120 commit(s) behind origin/main 03f49b7; media: deployed 6248363 is 1 commit(s) behind origin/main 14cac06; network: deployed ddd87b6 is 1 commit(s) behind origin/main 5a50c12; news: deployed 8ab47a6 is 1 commit(s) behind origin/main 97dae43; openre: deployed cf423e3 is 1 commit(s) behind origin/main c77ec2a; reviews: deployed 1cff36b is 1 commit(s) behind origin/main c87b344; search: deployed 8ed7667 is 1 commit(s) behind origin/main e8511d8; sites: deployed 32464ec is 1 commit(s) behind origin/main 304e8b1; sources: deployed 351383e is 1 commit(s) behind origin/main 1670853; tips: deployed 1e6bfbb is 1 commit(s) behind origin/main 13986b5; tools: deployed e55469f is 1 commit(s) behind origin/main 4f4ed6e; trade: deployed 4658447 is 1 commit(s) behind origin/main 273bce7; vip: deployed 0fbcbb5 is 1 commit(s) behind origin/main 95b3e19; wiki: deployed 32a26ef is 1 commit(s) behind origin/main 3302540 |++| H14 | Dead and backup database files on the production host | low | open | **needed** | Live maintainers | W0 | Confirm no code opens them, then delete the empty files; move copies (backups, import snapshots, rehearsal databases) to /var/backups/openvibe with a retention date. | blog/data/blog.db, community/data/community.db, games/data/legacy-import/world-before-20260923T184930Z.db, live/shared/data/analytics.db, live/shared/data/backups/analytics-pre-adr021-2026-09-23.db, live/shared/data/backups/live-20260926-072748.db, live/shared/data/backups/live-20260926-095352.db, live/shared/data/backups/live-pre-643a2e6.db, live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db, live/shared/data/hobo.db, live/shared/data/live-before-rs-slots-20260924T0153Z.db, live/shared/data/live.db, live/shared/data/openvibe.db, live/shared/data/rs-companion.db, media/data/backups/owner-subject-20260923.media.db, media/data/reports/h15-repair-applied-20260925.media.db, network/data/backups/network-pre-creator-analytics-20260926.db, network/data/backups/network-pre-follows-20260926.db, network/data/network-pre-refresh-hash-2026-09-24.db, network/data/network-pre-secrets-2026-09-24.db, tips/data/tips.db, tools/apps/audio/data/guard.db, tools/apps/docs/data/guard.db, tools/apps/food/data/guard.db, tools/apps/gateway/data/guard.db, tools/apps/gateway/data/token-revocations.db, tools/apps/img/data/guard.db, tools/apps/maps/data/guard.db, tools/apps/text/data/guard.db, tools/apps/yt/data/guard.db, tools/backups/analytics-2026-09-23/audio.analytics.db, tools/backups/analytics-2026-09-23/docs.analytics.db, tools/backups/analytics-2026-09-23/food.analytics.db, tools/backups/analytics-2026-09-23/img.analytics.db, tools/backups/analytics-2026-09-23/maps.analytics.db, tools/backups/analytics-2026-09-23/text.analytics.db, tools/backups/analytics-2026-09-23/yt.analytics.db, billing/live-snapshot-202609230121.db, chat/live-snap-a.db, chat/live-snap-b.db, chat/live-snapshot-0159.db, chat/rehearsal.db, community/community.pre-c24-20260925T185117Z.db, community/community.pre-c24b-20260925T185400Z.db, community/community.pre-c24c-20260925T185425Z.db, community/community.pre-live-comments-20260923T191345Z.db || H15 | Media objects with no good copy | medium | blocked-on-owner | **needed** | Media maintainers | W4 (repair) / W22 (DR drills) | Scheduled copy verification now runs inside Media and reports through /api/ready (object_copies); the 6 objects are marked degraded. Each needs a decision: re-upload from a surviving source, or mark it unrecoverable and tell its owner. | - || H16 | Off-host backups are unreadable without the backup key, which lives only on the host | high | blocked-on-owner | **needed** | Production-host owner | W22 | Escrow the key offline (password manager or paper), record its key id (`ovhost offsite check`) next to it, and test a restore from the bucket with the escrowed copy. | openvibe-backup.timer is active/waiting || H17 | Pre-ADR-021 analytics backups still hold IP addresses | medium | open | - | Platform operator | Track O / ADR-021 | Delete after 2026-10-07: /opt/openvibe.live/data/backups/analytics-pre-adr021-2026-09-23.db, /opt/openvibe.tools/backups/analytics-2026-09-23/, and Network data/backups/network.db.pre-adr021-20260923T1634. | - |@@@ -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 `8caa540`, Network `a7b99c7`, Shared `dbf9d39`, Media `b7fbe65`, Tools `168e511`, Community `19441aa`, Games `b207e78`, Sites `3802ee3`, Events `eb98f8c`, Chat `739d3a1`, OpenRe.Stream `b34dcd6`, Billing `180e246`, Tips `1d558c5`, VIP `4ddf723`, AI `c3ee605`, Search `b00aa4c`, Sources `29cd386`, Wiki `38a17bd`, Blog `79e9e15`, News `0860cf2`, Reviews `cfc37ac`, Deals `99bd438`, Coupons `348f585`, Trade `fa38288`, Codes `0bfdf70`, Host `7514789`, Examples `36901ff`. Production snapshot: openvibe-oregon, 2026-09-26.++Source commits: Live `03f49b7`, Network `5a50c12`, Shared `b5a9bd7`, Media `14cac06`, Tools `4f4ed6e`, Community `2da3501`, Games `eb2d008`, Sites `304e8b1`, Events `19919ec`, Chat `d87c8d3`, OpenRe.Stream `c77ec2a`, Billing `f24684b`, Tips `13986b5`, VIP `95b3e19`, AI `6c8b833`, Search `e8511d8`, Sources `1670853`, Wiki `3302540`, Blog `8a7f8eb`, News `97dae43`, Reviews `c87b344`, Deals `533450f`, Coupons `b91cd79`, Trade `273bce7`, Codes `7d6f65a`, Host `6d2aaaa`, Examples `92eb7c3`. Production snapshot: openvibe-oregon, 2026-09-28.## 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) | 604 tables with current/target owner |--| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 2381 routes; 107 cross-service call sites |++| 2 | [02-schema.md](02-schema.md) | 639 tables with current/target owner |++| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 2453 routes; 112 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) | 341 production-vs-repo items |++| 7 | [08-discrepancies.md](08-discrepancies.md) | 378 production-vs-repo items || 8 | [09-d-status.md](09-d-status.md) | D01-D46 family status, derived from the requirement ledger (families: 0 met, 21 partial, 0 not met, 1 blocked on owner) || 9 | [10-hazards.md](10-hazards.md) | 18 hazards with owners, mitigations and waves; 10 need the owner's review || 10 | [requirement-ledger.md](requirement-ledger.md), [requirement-ledger.json](requirement-ledger.json) | D01-D46 with acceptance artifacts (roadmap §22.4/§25): 3 met, 36 partial, 0 not met, 7 blocked on owner |@@@ -24,10 +24,10 @@ Source commits: Live `8caa540`, Network `a7b99c7`, Shared `dbf9d39`, Media `b7fb| | Criterion | Result ||---|---|---|--| pass | Every table has an owner classification | 604 tables classified, 0 unclassified |--| pass | Every route is attributed to a repo and source line, with an owner classification | 2381 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix) |--| pass | Every background job is listed with its location and an owner classification | 175 timers/jobs, 0 unclassified |--| pass | Every cross-service call records caller, callee, auth, timeout and retry | 107 call sites; 39 with no timeout detected |++| pass | Every table has an owner classification | 639 tables classified, 0 unclassified |++| pass | Every route is attributed to a repo and source line, with an owner classification | 2453 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix) |++| pass | Every background job is listed with its location and an owner classification | 179 timers/jobs, 0 unclassified |++| pass | Every cross-service call records caller, callee, auth, timeout and retry | 112 call sites; 39 with no timeout detected || pass | Unknowns are marked unknown, not guessed | 2 unknown items recorded || pass | Every D01-D46 requirement has a status and verified acceptance artifacts (requirement ledger) | 46/46 requirements verified || **open** | Hazard register reviewed by the production-host owner | pending: set reviewedBy in data/hazards.json after review |@@@ -1,6 +1,6 @@{"owner": "OpenVibers",-- "collectedAt": "2026-09-26T13:29:22.404Z",++ "collectedAt": "2026-09-28T03:25:56.178Z","repos": [{"description": "AlexFrison.net",@@@ -24,10 +24,10 @@},{"description": "Ingest and restream: stream definitions, keys, sessions, transport workers, outputs and output health.",-- "diskUsage": 413,++ "diskUsage": 433,"isArchived": false,"name": "OpenRe.Stream",-- "pushedAt": "2026-09-26T13:22:50Z",++ "pushedAt": "2026-09-28T03:20:27Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -40,7 +40,7 @@"port": 4500,"rtmpPort": 1936,"domain": "openre.stream",-- "contracts": "openvibe-contracts v0.33.0 (openvibe-sdk v0.5.0, openvibe-shared v1.5.1)",++ "contracts": "openvibe-contracts v0.49.0 (openvibe-sdk v0.12.0, openvibe-shared v1.22.0)","protocols": {"rtmp": "ingest ported (openre-rtmp-ingest)","restream": "RTMP source to RTMP/RTMPS/SRT destinations ported (openre-restream-worker)",@@@ -58,18 +58,31 @@"openre.output.write"],"capabilitiesRegistered": true,-- "livePatch": "applied in Live f0ca18b and deployed, but inert: live.env has no OPENRE_URL/OPENRE_PUBLIC_URL/OPENRE_EVENTS_SECRET and there is no Events subscription openre.session.* -> Live; 102 of 102 Live slots have ingest_authority=live, so no broadcaster uses OpenRe",++ "livePatch": "applied in Live f0ca18b and deployed; Live wired on 2026-09-23 (OPENRE_URL and the openre.session.* subscription, docs/cutover.md phase A); every Live slot keeps ingest_authority=live until its per-slot cutover (phase B), so no broadcaster uses OpenRe yet","deployed": true,-- "deployment": "Production release e0dc1b46fd99 (2026-09-23 19:23 UTC): API + coordinator on 127.0.0.1:4500, RTMP ingest public on 0.0.0.0:1936 (ingest.openre.stream, DNS-only; reachable from outside), Live wired (OPENRE_URL, openre.session.* subscription), preflight all PASS, restore drill passed. No slot switched yet: every slot is still ingested by Live until the per-slot cutover (docs/cutover.md phase B).",-- "updated": "2026-09-23"++ "deployment": "Deployed with `sudo ovhost deploy openre` (OpenVibe.Host strategy release-layout since the 2026-09-27 cutover; deploy/scripts/deploy.sh is the wrapper and keeps workers/status/prune): API + coordinator on 127.0.0.1:4500, RTMP ingest public on 0.0.0.0:1936 (ingest.openre.stream, DNS-only; reachable from outside since 2026-09-23), Live wired (OPENRE_URL, openre.session.* subscription), preflight all PASS, restore drill passed. No slot switched yet: every slot is still ingested by Live until the per-slot cutover (docs/cutover.md phase B).",++ "updated": "2026-09-28",++ "features": [++ "stream definitions owned by a Network subject, with typed references",++ "ingest keys hashed at rest, shown once, rotation with grace",++ "RTMP ingest workers with generations, leases and drains that survive API deploys",++ "RTMP/RTMPS/SRT restream with output health and a circuit breaker",++ "SSRF-checked destinations with sealed keys",++ "recording requests to OpenVibe.Media",++ "HTTP-FLV playback descriptors",++ "outbox events openre.session.*, openre.output.*, openre.recording.requested, openre.key.rotated",++ "migration from Live without importing old keys",++ "restore-drill read-only mode",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "Providers, models, routing, prompt templates, workflows, runs, citations, cache and quotas for every product.",-- "diskUsage": 526,++ "diskUsage": 1033,"isArchived": false,"name": "OpenVibe.AI",-- "pushedAt": "2026-09-26T13:22:54Z",++ "pushedAt": "2026-09-28T03:20:29Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -80,14 +93,16 @@"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","runtime": "node 22, express, better-sqlite3","port": 4700,-- "domain": "ai.openvibe.network still serves the OpenVibe.Sites placeholder; the service runs on openvibe-ovh (/opt/openvibe.ai, release bdca064, unit openvibe-ai) on 127.0.0.1:4700, loopback only, used by OpenVibe.Live and OpenVibe.Network",-- "contracts": "openvibe-contracts v0.33.0",++ "domain": "ai.openvibe.network still serves the OpenVibe.Sites placeholder; the service runs on openvibe-ovh (/opt/openvibe.ai, unit openvibe-ai) on 127.0.0.1:4700, loopback only, used by OpenVibe.Live and OpenVibe.Network",++ "contracts": "openvibe-contracts v0.75.0","capabilities": ["ai.run.create","ai.run.read","ai.workflow.manage","ai.provider.manage",-- "ai.usage.read"++ "ai.usage.read",++ "ai.credential.manage",++ "ai.quota.attribution.manage"],"capabilitiesRegistered": true,"providers": [@@@ -95,19 +110,34 @@"openai-compatible","anthropic","http-seam",-- "whisper.cpp"++ "whisper.cpp",++ "local llama.cpp server (openvibe-llm.service)"],-- "livePatch": "applied: Live fa22de5 runs AI_SERVICE=remote in production since 2026-09-23 ~15:34 UTC (309 runs by 18:30 UTC across 13 live.* workflows and 1 network.site_copy, 0 failed). Not moved yet: VOD captions/whisper and streamers' own provider keys stay in Live; most Live features are passthrough prompts built by Live; the deployed Network still falls back to Live's /internal/ai/site-copy; scripts/import-from-live.js ran on production at 2026-09-23 18:29 UTC (79,657 ledger rows: 79,647 live.ai_usage, 2 channel_ai_config, 8 site_settings; 11 holds: provider settings and the key stay env references, 1 streamer BYO key stays in Live, 3,021 translations are unrepresentable and stay in Live); every route has fallbacks=[]; 0 citation rows; no /metrics",++ "livePatch": "applied: Live fa22de5 runs AI_SERVICE=remote in production since 2026-09-23 ~15:34 UTC (309 runs by 18:30 UTC across 13 live.* workflows and 1 network.site_copy, 0 failed). As of 2026-09-23, not moved yet: VOD captions/whisper and streamers' own provider keys stayed in Live and most Live features were passthrough prompts built by Live (since 2026-09-27 AI has live.media.transcribe, stored provider keys and versioned templates for most live.* workflows); the deployed Network still falls back to Live's /internal/ai/site-copy; scripts/import-from-live.js ran on production at 2026-09-23 18:29 UTC (79,657 ledger rows: 79,647 live.ai_usage, 2 channel_ai_config, 8 site_settings; 11 holds: provider settings and the key stay env references, 1 streamer BYO key stays in Live, 3,021 translations are unrepresentable and stay in Live); every route has fallbacks=[]; 0 citation rows; no /metrics","deployed": true,-- "updated": "2026-09-23"++ "updated": "2026-09-28",++ "features": [++ "versioned templates, workflows and routing profiles",++ "runs with idempotency, cancel, retry, async polling and restart recovery",++ "provider fallback and circuit breakers",++ "quotas before any provider call, including per-streamer attribution quotas",++ "scoped cache",++ "citations or explicit gaps on every run",++ "people's own provider keys, encrypted at rest",++ "media.analyze: local-first recording analysis with windowed speech-to-text",++ "ai.run.* events through the SDK outbox",++ "ai.preferences and ai.usage_summary user modules",++ "server-rendered operator console for Network staff",++ "Live import"++ ]}},{"description": "The isolated money ledger: providers, receipts, subscriptions, entitlements, refunds and payouts.",-- "diskUsage": 591,++ "diskUsage": 597,"isArchived": false,"name": "OpenVibe.Billing",-- "pushedAt": "2026-09-26T13:22:57Z",++ "pushedAt": "2026-09-28T03:20:31Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -118,17 +148,33 @@"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","adr": "ADR-012","authoritative": false,-- "deployment": "Deployed in shadow on openvibe-ovh: /opt/openvibe.billing (release 421beb4, openvibe-contracts 0.33.0, openvibe-shared 1.5.1), unit openvibe-billing, API on 127.0.0.1:4600 (loopback only; /api/v1 is denied on the public host). Public at https://billing.openvibe.network: the staff console (Network SSO + PKCE, BILLING_STAFF_SUBJECTS = the owner only), /api/health, /api/ready (openvibe-shared/ready shape), /release.json and /webhooks/*. No provider secret is configured, so every provider is off and /webhooks/* answers 404 billing.provider_disabled.",++ "deployed": true,++ "deployment": "Deployed in shadow with `sudo ovhost deploy billing`: /opt/openvibe.billing, unit openvibe-billing, API on 127.0.0.1:4600 (loopback only; /api/v1 is denied on the public host). Public at https://billing.openvibe.network: the staff console (Network SSO + PKCE, BILLING_STAFF_SUBJECTS = the owner only), the billing policy (/policy), /api/health, /api/ready (openvibe-shared/ready shape), /release.json and /webhooks/*. No provider secret is configured, so every provider is off and /webhooks/* answers 404 billing.provider_disabled.",++ "contracts": "openvibe-contracts v0.49.0","notes": "Runtime, journal, adapters, import, reconciliation and the staff console (cashout approve/deny, review queue, reconciliation, freeze, audit log) are built, tested and deployed, with /metrics (loopback only), hourly scheduled reconciliation (GET /api/v1/admin/reconciliations; 16 runs by 2026-09-24 05:06 UTC, ledger-vs-receipt checks), EXTERNAL PowerChat receipts (billing.receipt.external under BILLING_AUTHORITY=billing; recorded only while Live is the authority), overflow guards and IMMEDIATE-transaction settlement. Production holds the shadow import of Live (322 transactions, 996 ledger entries), 0 subscriptions and 0 entitlements; the console has never been used (staff_audit 0). BILLING_AUTHORITY is not set in live.env, so Live stays the money authority. The cutover (README runbook, docs/live-cutover.md) waits on the owner putting the PowerChat secret in billing.env and re-pointing the PowerChat webhook to https://billing.openvibe.network/webhooks/powerchat; a duplicate-webhook proof in production follows it. Live's payouts, refunds and plans have no tables of their own; where they map is docs/live-mapping.md.",-- "updated": "2026-09-24"++ "updated": "2026-09-28",++ "features": [++ "append-only double-entry journal in bits and cents, balanced per currency",++ "provider receipts stored before processing, settled once (PowerChat, Stripe, PayPal, CCBill, NOWPayments adapters)",++ "intents, transfers, refunds, recycle, cashouts with escrow",++ "subscriptions and entitlements",++ "EXTERNAL PowerChat receipts (billing.receipt.external under BILLING_AUTHORITY=billing)",++ "economy freeze",++ "hourly reconciliation, ledger against receipts",++ "staff console: cashouts, review queue, reconciliation, freeze, audit log",++ "public billing policy page",++ "Live shadow import",++ "outbox events billing.*",++ "per-person limits (openvibe-sdk/limits)"++ ]}},{"description": "The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds.",-- "diskUsage": 667,++ "diskUsage": 722,"isArchived": false,"name": "OpenVibe.Blog",-- "pushedAt": "2026-09-26T13:23:02Z",++ "pushedAt": "2026-09-28T03:20:33Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -140,11 +186,12 @@"runtime": "node 22, express 4, better-sqlite3 11","port": 4810,"domain": "openvibe.blog",++ "contracts": "openvibe-contracts v0.53.0","packages": [-- "openvibe-publishing v0.2.1",-- "openvibe-contracts v0.33.0",-- "openvibe-shared v1.5.1",-- "openvibe-sdk v0.5.0"++ "openvibe-publishing v0.4.0",++ "openvibe-contracts v0.53.0",++ "openvibe-shared v1.22.0",++ "openvibe-sdk v0.12.0"],"capabilities": ["blog.blog.create",@@@ -162,21 +209,37 @@],"capabilitiesRegistered": true,"serviceManifestRegistered": true,-- "entitlements": "OpenVibe.VIP in code (policies/evaluate with the blog owner and the blog:gated_post default gate, cached 30 s; teaser and join link otherwise). Not deployed yet, and the Network has not granted blog vip.resource.policy.evaluate: until both, members-only posts admit only the blog's members and staff",-- "seedPost": "draft in production (verbatim quotes; not reviewed by a person); 0 posts published",++ "entitlements": "OpenVibe.VIP in code (policies/evaluate with the blog owner and the blog:gated_post default gate, cached 30 s; teaser and join link otherwise). It needs the Network grant [blog, vip.resource.policy.evaluate, openvibe.vip]; without it, or when VIP is unreachable, members-only posts admit only the blog's members and staff (the gate fails closed)",++ "seedPost": "a draft (verbatim quotes; not reviewed by a person)","deployed": true,-- "deployment": "Public at https://openvibe.blog since 2026-09-23 (~03:00 UTC): /opt/openvibe.blog at e7b4986, unit openvibe-blog on 127.0.0.1:4810 behind the openvibe.blog nginx vhost, principal blog. Production content: 1 blog (official), 1 post, which is a draft, so the public site shows nothing published yet. Restore drill passed 2026-09-23.",++ "deployment": "Public at https://openvibe.blog since 2026-09-23 (~03:00 UTC): deployed with `sudo ovhost deploy blog`, /opt/openvibe.blog, unit openvibe-blog on 127.0.0.1:4810 behind the openvibe.blog nginx vhost, principal blog. The network changelog publishes Patch notes posts on the official blog. Restore drill passed 2026-09-23.","placeholderInSites": false,-- "updated": "2026-09-23",-- "deployedAt": "2026-09-23"++ "updated": "2026-09-28",++ "deployedAt": "2026-09-23",++ "features": [++ "the official blog and a blog for every member, with owners, editors and authors",++ "drafts and immutable revisions with conflict detection, diff and revert",++ "publish, unpublish, soft delete and scheduled publishing",++ "tags, categories, series and 301s on slug changes",++ "Media-backed covers, inline figures and galleries",++ "six theme presets",++ "Community comment threads",++ "AI drafts that need a person's review",++ "members-only posts gated by OpenVibe.VIP (fails closed)",++ "network changelog feed and Patch notes posts",++ "feeds, sitemaps and server-rendered pages useful without JavaScript",++ "/api/v1 by capability",++ "SDK outbox events and Search index documents",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation.",-- "diskUsage": 842,++ "diskUsage": 977,"isArchived": false,"name": "OpenVibe.Chat",-- "pushedAt": "2026-09-26T13:23:06Z",++ "pushedAt": "2026-09-28T03:20:35Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -187,8 +250,8 @@"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","runtime": "node 22, express, ws, better-sqlite3","port": 4400,-- "domain": "openvibe.live (/ws/chat, /api/chat/, /api/dm/, /api/tts/, /api/sounds via an nginx include in openvibe.live's vhost); openvibe.chat is still the OpenVibe.Sites placeholder",-- "contracts": "openvibe-contracts v0.33.0",++ "domain": "openvibe.chat (Chat's own site: global chat, messages, rooms, settings; the service manifest records it live since 2026-09-24) and openvibe.live (/ws/chat, /api/chat/, /api/dm/, /api/tts/, /api/sounds via an nginx include in openvibe.live's vhost)",++ "contracts": "openvibe-contracts v0.71.0","capabilities": ["chat.live_bridge.write","chat.message.send",@@@ -202,31 +265,50 @@"events.subscription.manage","vip.entitlement.check","network.modules.read",-- "network.modules.write"++ "network.modules.write",++ "tools.tool.run",++ "tools.job.read"],"capabilitiesRegistered": true,"events": ["chat.message.created","chat.message.deleted","chat.dm.created",-- "chat.moderation.action"++ "chat.moderation.action",++ "chat.room.message.created",++ "chat.room.message.deleted"],-- "eventsConsumed": "live.release.deployed (the deploy card, folded by subject.id with the bridge's deployNotice: one card per head whichever comes first; register C-84) and network.module.updated (drops a cached chat.preferences copy), POST /internal/events, signature v2, openvibe-sdk inbox; subscriptions created at boot. In code only, not deployed; needs CHAT_EVENTS_SECRET in chat.env and the Network grant chat events.subscription.manage openvibe.events",++ "eventsConsumed": "live.release.deployed, network.module.updated, network.user.token_valid_after, vip.membership.changed, network.block.changed, network.subject.merged, network.account.export_requested and network.account.deleted at POST /internal/events (signature v2, openvibe-sdk inbox); subscriptions created at boot when missing (CHAT_EVENTS_SECRET and the Network grant chat events.subscription.manage openvibe.events)","liveAuthorityFlag": "CHAT_AUTHORITY=chat is set in production live.env since the cutover (2026-09-23 02:03 UTC); Live's chat tables are a read mirror Chat keeps current",-- "vip": "Member badges from OpenVibe.VIP (server/vip/badges.js: entitlements/check with product chat, cached 60 s, never blocks sending, fails closed). In code only, not deployed; needs the Network grant chat vip.entitlement.check openvibe.vip and Live's chat UI to render vip_badge / chat_vip_badge",-- "preferences": "Chat preferences in the Network user module chat.preferences (server/prefs/: GET/PUT /api/chat/preferences with Chat's service token, cached 60 s, If-Match on every write; scripts/migrate-chat-preferences.js moves the choices in Live's user_preferences). In code only, not deployed; needs Network with the chat.preferences handoff and the grants chat network.modules.read/write on chat.preferences, then the migration, then Live's chat.js calling /api/chat/preferences",-- "calls": "Live's call server, call routes and stream hooks ported to server/calls/ with a calls lifecycle table (WS-I task 1). In code only, off (CHAT_CALLS unset); the switch is CHAT_CALLS=1, Live CALLS_AUTHORITY=chat and the nginx include deploy/nginx/calls/openvibe.live-calls.locations.conf (docs/calls-cutover.md)",++ "vip": "Member badges from OpenVibe.VIP (server/vip/badges.js: entitlements/check with product chat, cached 60 s, never blocks sending, fails closed; vip.membership.changed drops the cache). Needs the Network grant chat vip.entitlement.check openvibe.vip",++ "preferences": "Chat preferences in the Network user module chat.preferences, plus chat.tts_defaults, chat.dm_settings and chat.presence_prefs (server/prefs/: /api/chat/preferences and siblings with Chat's service token, cached 60 s, If-Match on every write; scripts/migrate-chat-preferences.js moves the choices in Live's user_preferences). Needs the grants chat network.modules.read/write",++ "calls": "Live's call server, call routes and stream hooks ported to server/calls/ with a calls lifecycle table (WS-I task 1). Off unless CHAT_CALLS=1; the switch is CHAT_CALLS=1, Live CALLS_AUTHORITY=chat and the nginx include deploy/nginx/calls/openvibe.live-calls.locations.conf (docs/calls-cutover.md)","deployed": true,-- "deployment": "openvibe-ovh /opt/openvibe.chat, unit openvibe-chat, 127.0.0.1:4400 (loopback); public only through openvibe.live's nginx include for the chat paths; release 45f2b1f; EVENTS_URL set (chat.message.created reaches OpenVibe.Events); restore drill passed 2026-09-23",-- "updated": "2026-09-23"++ "deployment": "Deployed with `sudo ovhost deploy chat`: /opt/openvibe.chat, unit openvibe-chat, 127.0.0.1:4400 (loopback); public through the openvibe.chat vhost and openvibe.live's nginx include for the chat paths; EVENTS_URL set (chat.message.created reaches OpenVibe.Events); restore drill passed 2026-09-23",++ "updated": "2026-09-28",++ "features": [++ "Live's global, stream and channel chat (authority since 2026-09-23, Live keeps a read mirror)",++ "DMs and group DMs, participants only",++ "rooms: public and private, roles, invitations, slow mode, unread counts",++ "moderation: bans, timeouts, purges, filters, slow, sub-only and member-only modes, audited log access",++ "TTS, sounds and soundboard with persisted queues",++ "calls ported from Live (off until the calls cutover)",++ "openvibe.chat site: global chat, messages, rooms, settings, history download",++ "chat preferences in Network user modules",++ "VIP subscriber badges",++ "network blocks, revocation, account merge, export and deletion from Network events",++ "outbox events and chat.room.message.* on the realtime plane",++ "N-1 compatibility tests",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance.",-- "diskUsage": 706,++ "diskUsage": 814,"isArchived": false,"name": "OpenVibe.Codes",-- "pushedAt": "2026-09-26T13:23:10Z",++ "pushedAt": "2026-09-28T03:20:37Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -238,15 +320,17 @@"runtime": "node 22, express 4, better-sqlite3 11","port": 4900,"domain": "openvibe.codes",++ "contracts": "openvibe-contracts v0.53.0","packages": [-- "openvibe-contracts v0.33.0",-- "openvibe-sdk v0.5.0",-- "openvibe-shared v1.5.1"++ "openvibe-contracts v0.53.0",++ "openvibe-sdk v0.12.0",++ "openvibe-shared v1.22.0"],-- "summary": "Deployed and public since 2026-09-23: https://openvibe.codes is served by this portal (openvibe-ovh, unit openvibe-codes on 127.0.0.1:4900 behind nginx, release a9371c3), and the domain left OpenVibe.Sites. Sign-in uses the registered Network OAuth client `codes` (PKCE S256); the principal `codes` holds events.event.publish and the Events relay is configured. It is barely used yet: production holds 0 manifests, 0 releases and 0 playground runs. The external-developer path (account, project, sandbox app, grants, Media upload, app events) was run once on production on 2026-09-23 with public endpoints and curl, not through these playgrounds; that check is not committed to a repository or CI.",++ "summary": "Deployed and public since 2026-09-23: https://openvibe.codes is served by this portal (deployed with `sudo ovhost deploy codes`, unit openvibe-codes on 127.0.0.1:4900 behind nginx), and the domain left OpenVibe.Sites. Sign-in uses the registered Network OAuth client `codes` (PKCE S256); the principal `codes` holds events.event.publish and the Events relay is configured. On 2026-09-23 production held 0 manifests, 0 releases and 0 playground runs. The external-developer path (account, project, sandbox app, grants, Media upload, app events) was run once on production on 2026-09-23 with public endpoints and curl, not through these playgrounds; that check is not committed to a repository or CI.","works": ["Sign-in with OpenVibe.Network (authorization code + PKCE S256), session tokens in httpOnly cookies","Projects, members, apps, credentials (rotate, revoke), grants (request, approve, deny, revoke), quotas and audit over Network's /api/v1/projects API with the person's own token; Network's errors shown as Network answered them",++ "Per-project usage page (owner, admins, staff): Network's GET /api/v1/projects/:project/usage rendered server-side, with quota headroom, published service limits and sampled failures","Project export (one JSON document: Network's project, members, apps, credential ids and hints, grants, quotas, audit for admin+, plus Codes' releases, manifests, trust and playground runs) and delete (owner: archive in Network first, then drafts and playground runs deleted, public releases revoked). Network has no project erasure endpoint, only archive","Full project archive for the owner and admins (roadmap WS-N task 9): one zip with the metadata document (audit included), the release manifests (the project's modules), Media objects (listed with public or 1-hour signed download URLs) and namespaces, and the app events Events still keeps, for production and sandbox; read with Network's read-only export tokens (POST /api/v1/projects/:project/export-tokens, 5 minutes, audited). All or nothing when a service fails; at most CODES_EXPORT_MAX_OBJECTS / CODES_EXPORT_MAX_EVENTS per environment, stated in manifest.json when reached","Client secrets shown once, in the create/rotate response only, with no-store; never stored or logged (tested)",@@@ -262,7 +346,7 @@],"notYet": ["The playgrounds have never been used on production (0 playground runs); the one production end-to-end run used curl, and it is not a committed, repeatable check",-- "No usage, trace or error dashboards: no service reports per-project usage yet; quotas show recorded limits only",++ "Usage covers only what services report in their hourly *.usage.recorded rollups (Network adds them up per day; the current hour is not counted); no trace or error dashboards beyond the sampled failures","Billing sandbox, Chat bot and Realtime playgrounds; CLI and scaffolding; templates","Consent screen for third-party production apps (a Network gap)","No JSON-LD or llms.txt on the public pages",@@@ -272,25 +356,82 @@"serviceManifestRegistered": true,"deployed": true,"placeholderInSites": false,-- "updated": "2026-09-23"++ "updated": "2026-09-28",++ "features": [++ "developer portal over Network's projects, apps, credentials, grants, quotas and audit",++ "per-project usage page from Network's rollups",++ "project export (JSON) and full archive (zip)",++ "secrets shown once, never stored or logged",++ "scope editor offering only grantable capabilities",++ "docs generated from the pinned contracts and SDK",++ "OAuth helper and webhook tester (signature v1 and v2)",++ "grant-respecting Media and Events playgrounds",++ "app and mod manifest validation and release metadata with codes.app.* events",++ "ADR-013 trust tiers",++ "policy and governance pages (governance drafts pending owner review)",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "",-- "diskUsage": 1474,++ "diskUsage": 1778,"isArchived": false,"name": "OpenVibe.Community",-- "pushedAt": "2026-09-26T13:23:14Z",++ "pushedAt": "2026-09-28T03:20:39Z","visibility": "PUBLIC","defaultBranch": "main",-- "status": null++ "status": {++ "repository": "OpenVibers/OpenVibe.Community",++ "stage": "alpha",++ "code": true,++ "wave": "W5",++ "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",++ "runtime": "node 22, express, better-sqlite3",++ "port": 4200,++ "domain": "openvibe.community",++ "contracts": "openvibe-contracts v0.71.0",++ "capabilities": [++ "community.paste.create",++ "community.paste.write",++ "community.paste.moderate",++ "community.post.create",++ "community.comment.write",++ "community.comment.moderate",++ "community.pulse.write",++ "community.space.read",++ "community.space.manage",++ "community.thread.read",++ "community.vote.set",++ "community.pulse.read"++ ],++ "capabilitiesRegistered": true,++ "pastesAuthority": "community in production since 2026-09-22 (~23:35 UTC); live is the rollback mode",++ "deployed": true,++ "deployment": "Public at https://openvibe.community: deployed with `sudo ovhost deploy community`, /opt/openvibe.community, unit openvibe-community on 127.0.0.1:4200 behind the openvibe.community nginx vhost, principal community. The paste import brought 889 + 2 pastes, 60 comments and 48 likes (5 rows held). The Discord relay is off. Restore drill passed 2026-09-23.",++ "features": [++ "pastes: code, text and screenshots, with versions, likes, comments, forks and burn-after-read",++ "typed comment threads embedded by other products",++ "forum: spaces, threads, posts, categories and votes",++ "members-only spaces and threads gated by OpenVibe.VIP",++ "a space's chat room on OpenVibe.Chat",++ "Pulse: the network's public activity from Events",++ "Discord relay (off in production)",++ "server-rendered pages with full SEO",++ "Search documents and community.* events",++ "revocation, blocks, account merge, export and deletion from Network events",++ "N-1 compatibility tests",++ "per-actor limits (openvibe-sdk/limits)"++ ],++ "updated": "2026-09-28"++ }},{"description": "Machine-readable contracts for the whole OpenVibe network.",-- "diskUsage": 2738,++ "diskUsage": 3315,"isArchived": false,"name": "OpenVibe.Contracts",-- "pushedAt": "2026-09-26T13:03:25Z",++ "pushedAt": "2026-09-28T03:22:17Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -302,15 +443,29 @@"OpenVibe.Network"],"plan": "OpenVibe Development Roadmap (combined), Wave 1; implementation plan rev 3 section 3.1",-- "updated": "2026-09-24"++ "deployed": false,++ "deployment": "none of its own: a library and artifact repository published as release tags; services pin a tag and deploy it with their own releases",++ "contracts": "openvibe-contracts v0.75.0 (this package; the newest tag)",++ "features": [++ "540 JSON Schemas with valid and invalid fixtures",++ "31 service manifests with lifecycle declarations",++ "205 capability manifests and the staff capability map",++ "13 user-module namespace manifests",++ "validate, ids, http (problem+json, trace and idempotency middleware), capabilities.check and serviceAuth",++ "openvibe-contracts-check for service CI",++ "generated TypeScript types, JSON Schema bundle and per-service OpenAPI 3.1",++ "compatibility check against the previous tag (scripts/compat.js)",++ "documentation-currency check (scripts/docs-currency.js)"++ ],++ "updated": "2026-09-28"}},{"description": "Coupon codes with merchant matching, restrictions, expiry and real-people validity reports.",-- "diskUsage": 408,++ "diskUsage": 462,"isArchived": false,"name": "OpenVibe.Coupons",-- "pushedAt": "2026-09-26T13:23:18Z",++ "pushedAt": "2026-09-28T03:20:43Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -322,11 +477,12 @@"runtime": "node 22, express 4, better-sqlite3 11","port": 4850,"domain": "openvibe.coupons",++ "contracts": "openvibe-contracts v0.53.0","packages": [-- "openvibe-publishing v0.2.1",-- "openvibe-contracts v0.33.0",-- "openvibe-shared v1.5.1",-- "openvibe-sdk v0.5.0"++ "openvibe-publishing v0.4.0",++ "openvibe-contracts v0.53.0",++ "openvibe-shared v1.22.0",++ "openvibe-sdk v0.12.0"],"capabilities": ["coupons.coupon.submit",@@@ -346,17 +502,28 @@"notifications": "watches are recorded; no notification is sent: OpenVibe.Network has no notification consumer yet","client": "OpenVibers/OpenVibe.Extensions browser/ (not published to any store; the Coupons API it calls is not public yet)","deployed": true,-- "deployment": "openvibe-ovh, unit openvibe-coupons, 127.0.0.1:4850 loopback only (release 54df411; the later 9b9549e changes only the repo's nginx reference file); /api/ready 200 with every check ok; Network OAuth client coupons and its grants exist; production database holds 0 coupons. Deployed internally, not launched: openvibe.coupons still serves the OpenVibe.Sites placeholder until a person verifies a coupons source's terms and enables it in Sources",++ "deployment": "Deployed with `sudo ovhost deploy coupons`: unit openvibe-coupons, 127.0.0.1:4850 loopback only; Network OAuth client coupons and its grants exist; on 2026-09-23 /api/ready answered 200 and the production database held 0 coupons. Deployed internally, not launched: openvibe.coupons still serves the OpenVibe.Sites placeholder until a person verifies a coupons source's terms and enables it in Sources","placeholderInSites": true,-- "updated": "2026-09-23"++ "updated": "2026-09-28",++ "features": [++ "merchants with normalized domain rules (public-suffix subset, path rules)",++ "codes with restrictions, known or unknown expiry and evidence",++ "validity reports by people, one per person per day, with confidence and decay",++ "expired codes leave API, pages, feeds, sitemaps and Search at the instant of expiry",++ "server-rendered pages useful without JavaScript",++ "/api/v1 by capability and browser-helper install tokens",++ "OpenVibe.Sources coupons import with holds",++ "SDK outbox events and Search index documents",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "Deals submitted and voted on by the community, with source, price and freshness always shown.",-- "diskUsage": 445,++ "diskUsage": 493,"isArchived": false,"name": "OpenVibe.Deals",-- "pushedAt": "2026-09-26T13:23:22Z",++ "pushedAt": "2026-09-28T03:20:45Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -368,11 +535,12 @@"runtime": "node 22, express 4, better-sqlite3 11","port": 4840,"domain": "openvibe.deals",++ "contracts": "openvibe-contracts v0.53.0","packages": [-- "openvibe-publishing v0.2.1",-- "openvibe-contracts v0.33.0",-- "openvibe-shared v1.5.1",-- "openvibe-sdk v0.5.0"++ "openvibe-publishing v0.4.0",++ "openvibe-contracts v0.53.0",++ "openvibe-shared v1.22.0",++ "openvibe-sdk v0.12.0"],"capabilities": ["deals.offer.submit",@@@ -394,17 +562,31 @@"sourcesImport": "code and tests; the sources.item.read grant exists in production, but no deals-category source is enabled in OpenVibe.Sources (the seeded dealnews-daily is disabled), so nothing has been imported","watchNotifications": "deals.watch.matched events only; OpenVibe.Network's notification consumer does not exist yet","deployed": true,-- "deployment": "openvibe-ovh, unit openvibe-deals, 127.0.0.1:4840 loopback only (release e72aeec); /api/ready 200 with every check ok; Network OAuth client deals and its grants exist; production database holds 0 offers. Deployed internally, not launched: openvibe.deals still serves the OpenVibe.Sites placeholder until a person verifies a deals source's terms and enables it in Sources",++ "deployment": "Deployed with `sudo ovhost deploy deals`: unit openvibe-deals, 127.0.0.1:4840 loopback only; Network OAuth client deals and its grants exist; on 2026-09-23 /api/ready answered 200 and the production database held 0 offers. Deployed internally, not launched: openvibe.deals still serves the OpenVibe.Sites placeholder until a person verifies a deals source's terms and enables it in Sources","placeholderInSites": true,-- "updated": "2026-09-23"++ "updated": "2026-09-28",++ "features": [++ "offers with timestamped price observations shown \"as of\" and stale labels",++ "unknown prices stay unknown in pages, JSON, JSON-LD, feeds and Search",++ "server-authoritative votes and deterministic hotness (hot@1)",++ "duplicate merge and unmerge without losing votes or history",++ "watches and saved searches (deals.watch.matched events; no delivery yet)",++ "vote abuse controls and moderation queue",++ "OpenVibe.Sources deals import with review",++ "Community comment threads",++ "server-rendered pages, feeds and sitemaps useful without JavaScript",++ "/api/v1 by capability",++ "SDK outbox events and Search index documents",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "Durable events, subscriptions, delivery, retry, dead letters and replay for the network.",-- "diskUsage": 388,++ "diskUsage": 550,"isArchived": false,"name": "OpenVibe.Events",-- "pushedAt": "2026-09-26T13:23:26Z",++ "pushedAt": "2026-09-28T03:20:47Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -416,7 +598,7 @@"runtime": "node 22, express, better-sqlite3","port": 4300,"domain": "events.openvibe.network",-- "contracts": "openvibe-contracts v0.28.0",++ "contracts": "openvibe-contracts v0.63.0","capabilities": ["events.event.publish","events.subscription.manage",@@@ -428,8 +610,19 @@],"capabilitiesRegistered": true,"deployed": true,-- "deployment": "openvibe-ovh /opt/openvibe.events, unit openvibe-events, 127.0.0.1:4300; public at https://events.openvibe.network (realtime SSE, health, token-guarded /api/v1/events, /api/v1/subscriptions, /api/v1/checkpoints; /api/v1/deliveries host-local); release 5def126; real traffic since 2026-09-23 (Live, Media, Chat, Games, Network and OpenRe publish; 8 subscriptions, held by Search, Tips, VIP, News and Reviews); restore drill passed 2026-09-23",-- "updated": "2026-09-23"++ "deployment": "Deployed with `sudo ovhost deploy events`: /opt/openvibe.events, unit openvibe-events, 127.0.0.1:4300; public at https://events.openvibe.network (realtime SSE, health, token-guarded /api/v1/events, /api/v1/subscriptions, /api/v1/checkpoints; /api/v1/deliveries host-local); real traffic since 2026-09-23 (Live, Media, Chat, Games, Network and OpenRe publish; on 2026-09-23 8 subscriptions, held by Search, Tips, VIP, News and Reviews); restore drill passed 2026-09-23",++ "updated": "2026-09-28",++ "features": [++ "durable event store with the canonical envelope",++ "subscriptions with signed webhook delivery (v1 and v2), retry, dead letters and replay",++ "priority classes and backpressure",++ "pull consumers with cursors and checkpoints",++ "realtime SSE with cursor resume, gap reports and Network tickets",++ "developer-app publish, read and subscribe with sandbox separation, SSRF-guarded webhooks and project quotas",++ "hourly project usage rollups (events.usage.recorded)",++ "redaction tombstones",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{@@@ -437,7 +630,7 @@"diskUsage": 320,"isArchived": false,"name": "OpenVibe.Examples",-- "pushedAt": "2026-09-26T11:53:18Z",++ "pushedAt": "2026-09-28T03:20:49Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -446,8 +639,18 @@"code": true,"wave": "W20","version": "0.3.0",-- "sdk": "openvibe-sdk v0.4.0",-- "contracts": "openvibe-contracts v0.28.0 (mod-manifest example)",++ "sdk": "openvibe-sdk v0.11.0",++ "contracts": "openvibe-contracts v0.49.0 (mod-manifest example)",++ "deployed": false,++ "deployment": "none: a repository with CI, not a runtime and not a published package",++ "features": [++ "nine copyable examples: browser app, Node server app, Media uploader, event subscriber, webhook consumer, tool job, OAuth app, chat bot, mod manifest",++ "smoke tests against openvibe-sdk/testing's mock platform, offline",++ "create-openvibe-app scaffolder",++ "npm run e2e against the real platform (on demand)",++ "developer path check (mock in CI, real on demand)",++ "public-surface check: no loopback keys, internal routes or secret values"++ ],"ci": "every example's smoke test runs on Node 22.22.1 against openvibe-sdk/testing's mock platform (developer-app rules for Events, Media and Tools as in production) plus a local Chat WebSocket mock; none reaches the network; a second job runs the developer path check (scripts/developer-path.js) against the same mock platform","e2e": "npm run e2e runs media-uploader, event-subscriber (pull) and tool-job against the real platform with a sandbox app's OV_CLIENT_ID/OV_CLIENT_SECRET/OV_PROJECT_ID; on demand only, not in CI or npm test; not run against production as part of this release","platform": "sandbox developer path (projects, sandbox grants, app tokens for openvibe.media/events/tools, Media project tenant, Events app.<project_key>.* events, Tools jobs, CORS-open discovery) verified in production on 2026-09-23 by the platform's W20 exit check (a curl script against the public endpoints); that check is now committed as npm run developer-path (SDK and examples, plus credential rotation, revocation and archive), which runs in CI against the mock platform and on demand against production (credentials from env only; refuses in CI against production); not yet run against production",@@@ -459,7 +662,7 @@"mod publishing is first-party"],"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026), §15.1, §18.9; roadmap Wave 20, §30, ADR-014",-- "updated": "2026-09-23"++ "updated": "2026-09-28"}},{@@@ -511,20 +714,50 @@},{"description": "",-- "diskUsage": 5417,++ "diskUsage": 5596,"isArchived": false,"name": "OpenVibe.Games",-- "pushedAt": "2026-09-26T12:39:26Z",++ "pushedAt": "2026-09-28T03:20:51Z","visibility": "PUBLIC","defaultBranch": "main",-- "status": null++ "status": {++ "repository": "OpenVibers/OpenVibe.Games",++ "stage": "stable",++ "code": true,++ "product": "Scraplandia",++ "runtime": "node 22, TypeScript (tsx), pnpm workspace; Babylon.js + Havok; better-sqlite3",++ "port": 8000,++ "domain": "openvibe.games, play.openvibe.games",++ "contracts": "openvibe-contracts v0.71.0 (apps/server/package.json)",++ "capabilities": [++ "games.mod.manage",++ "games.mod.read",++ "games.world.announce",++ "games.prop.place"++ ],++ "deployed": true,++ "deployment": "Public at https://openvibe.games and https://play.openvibe.games: deployed with `sudo ovhost deploy games` (OpenVibe.Host strategy pnpm-build since the 2026-09-27 cutover; deploy/scripts/deploy.sh is the wrapper), unit openvibe-games on 127.0.0.1:8000, env /etc/openvibe/games.env, principal games.",++ "features": [++ "authoritative multiplayer physics sandbox (Havok on the server)",++ "Source-style movement, physgun building, gathering, crafting, skills",++ "persistent world, characters and props in SQLite",++ "map editor with assets mirrored to OpenVibe.Media",++ "declarative mods (games-content@1) with per-install grants and audit",++ "players keyed by Network subjects",++ "games.* events through a transactional outbox",++ "games.progress.summary user module",++ "the OpenVibe Frame from its own pinned copy",++ "per-actor limits on capability-boundary writes (openvibe-sdk/limits)"++ ],++ "updated": "2026-09-28"++ }},{"description": "The network's deployment/control plane first; then isolated hosting for community sites, bots and mods.",-- "diskUsage": 950,++ "diskUsage": 1384,"isArchived": false,"name": "OpenVibe.Host",-- "pushedAt": "2026-09-26T13:23:30Z",++ "pushedAt": "2026-09-28T03:22:19Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -537,10 +770,11 @@"port": 4910,"domain": "openvibe.host","tenantDomain": "*.openvibe.host",++ "contracts": "openvibe-contracts v0.66.0","packages": [-- "openvibe-contracts v0.33.0 (host.* capabilities and manifest released in v0.24.0; v0.32.0 adds the takedown routes to host.site.manage)",-- "openvibe-sdk v0.5.0",-- "openvibe-shared v1.5.1"++ "openvibe-contracts v0.66.0 (host.* capabilities and manifest released in v0.24.0; v0.32.0 adds the takedown routes to host.site.manage)",++ "openvibe-sdk v0.12.0",++ "openvibe-shared v1.22.0"],"capabilities": ["host.site.manage",@@@ -557,7 +791,7 @@"host.release.published"],"stages": {-- "A": "alpha: ovhost CLI installed on the production host 2026-09-23 (/usr/local/bin/ovhost, inventory /etc/openvibe/host.json); status/validate/backup/drill used there (19 restore drills passed 2026-09-23, docs/restore-drills.md); no service deploy has moved to it yet; the D41 deploy-and-rollback proof (scripts/d41-proof.sh) is written and tested, not run",++ "A": "alpha: ovhost CLI installed on the production host 2026-09-23 (/usr/local/bin/ovhost, inventory /etc/openvibe/host.json); every service deploys with `sudo ovhost deploy <svc>` since the 2026-09-27 cutover (roadmap WS-N task 11: Live, Tools, Sites, Games and OpenRe through the release-layout, multi-app, static-build and pnpm-build strategies); nightly backups, restore drills (19 passed 2026-09-23, docs/restore-drills.md), release notifications, incidents and maintenance, the alerts relay; the D41 deploy-and-rollback proof (scripts/d41-proof.sh) is written and tested","B": "alpha: running on the host on loopback :4910 (2026-09-23 audit), not launched; launch-rule items met in code and tests, launch steps in docs/launch.md, threat review in docs/threat-review.md","C": "not started (deliberately: blocked until isolation and metering are proven)"},@@@ -567,47 +801,179 @@"deployed": "loopback only, not launched","placeholderInSites": true,"adoptedByServices": [],-- "updated": "2026-09-23",++ "updated": "2026-09-28","capabilitiesNote": "released in openvibe-contracts v0.24.0; v0.32.0 adds the four takedown routes to host.site.manage.implementedBy",-- "launchReady": true++ "launchReady": true,++ "features": [++ "ovhost: inventory, validate, plan, deploy with automatic rollback, rollback, status, releases",++ "deploy strategies: git-checkout, multi-app, static-build, pnpm-build, release-layout",++ "protected-session probes and drain policies (--wait-idle)",++ "certificate inventory and transactional nginx vhost install",++ "scheduled SQLite backups with retention and encrypted off-host copies",++ "restore drills",++ "release notifications (host.release.published), incidents, maintenance windows and freezes",++ "Prometheus alerts relay to Network",++ "browser check and release-lifecycle acceptance suite",++ "Stage B: tenant static sites with immutable deploys, activation, rollback, custom domains, quotas and takedowns (not launched)",++ "per-actor limits on Stage B writes (openvibe-sdk/limits)"++ ]}},{"description": "",-- "diskUsage": 8126,++ "diskUsage": 9109,"isArchived": false,"name": "OpenVibe.Live",-- "pushedAt": "2026-09-26T13:24:25Z",++ "pushedAt": "2026-09-28T03:25:00Z","visibility": "PUBLIC","defaultBranch": "main",-- "status": null++ "status": {++ "repository": "OpenVibers/OpenVibe.Live",++ "stage": "stable",++ "code": true,++ "runtime": "node 22, express, better-sqlite3, node-media-server, mediasoup; no build step",++ "port": 3000,++ "domain": "openvibe.live (www, ingest, whip)",++ "contracts": "openvibe-contracts v0.71.0",++ "sdk": "openvibe-sdk v0.12.0",++ "capabilities": [++ "live.chat_context.read",++ "live.chat_effects.write",++ "live.chat_mirror.write",++ "live.follower.read",++ "live.lineage.resolve",++ "live.tips_delivery.write",++ "live.channel.read",++ "live.stream.read",++ "live.discovery.read",++ "live.owner.resolve"++ ],++ "deployed": true,++ "deployment": "Production release layout /opt/openvibe.live (current -> releases/<time>-<sha>), unit openvibe-live.service on the systemd socket 127.0.0.1:3000, deployed with `sudo ovhost deploy live --wait-idle`.",++ "features": [++ "RTMP, WHIP, WebRTC and JSMPEG ingest; viewer playback; the broadcast page",++ "channels, go-live, stream keys, managed streams, restreaming (managed ingest on OpenRe.Stream)",++ "the watch page and its chat surface (messages stored by OpenVibe.Chat), TTS, sounds, emotes, overlays",++ "VODs and clips recorded and stored by OpenVibe.Media; pastes and comments on OpenVibe.Community",++ "AI viewers, stream memories, overviews, moments, recaps, translation: every prompt an OpenVibe.AI template; VOD and clip transcripts by window on OpenVibe.AI",++ "streamers' own AI keys stored encrypted in OpenVibe.AI; per-streamer daily AI budgets as AI quotas",++ "channel points and Vibes; the Arena (Battle Cam); after-show recaps; the Star of OpenVibe",++ "per-actor limits on API writes; account export and deletion contributions; follows on OpenVibe.Network"++ ],++ "updated": "2026-09-28"++ }},{"description": "",-- "diskUsage": 1696,++ "diskUsage": 2022,"isArchived": false,"name": "OpenVibe.Media",-- "pushedAt": "2026-09-26T13:23:33Z",++ "pushedAt": "2026-09-28T03:20:55Z","visibility": "PUBLIC","defaultBranch": "main",-- "status": null++ "status": {++ "repository": "OpenVibers/OpenVibe.Media",++ "stage": "beta",++ "code": true,++ "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",++ "runtime": "node 22, express, better-sqlite3, ffmpeg",++ "port": 4100,++ "domain": "openvibe.media",++ "contracts": "openvibe-contracts v0.71.0",++ "capabilities": [++ "media.object.upload",++ "media.object.read",++ "media.object.list",++ "media.object.delete",++ "media.upload.create",++ "media.derivative.create",++ "media.derivative.read",++ "media.lifecycle.read",++ "media.lifecycle.transition"++ ],++ "capabilitiesRegistered": true,++ "pastes": "OpenVibe.Community is the paste authority since 2026-09-22 (PASTES_FROZEN_APPS=live, PASTES_MOVED_TO); the paste routes stay as the rollback path",++ "deployed": true,++ "deployment": "Public at https://openvibe.media: deployed with `sudo ovhost deploy media` (restart refused while a VOD records; --wait-idle), /opt/openvibe.media, unit openvibe-media on 127.0.0.1:4100 behind the openvibe.media nginx vhost, principal media.",++ "features": [++ "VOD recording (RTMP pull, RTP ingest), chunk ingest and finalize",++ "clip cutting",++ "storage tiering local, Backblaze B2, Cloudflare R2 with copy verification and a disk guardian",++ "canonical object model (/api/v2) with namespaces, holds, derivatives and lifecycle",++ "media jobs with leases, retries and proposals",++ "multi-tenant apps and developer-project tenants (sandbox separated)",++ "public serving with presigned URLs; signed access for private and sandbox items",++ "the object explorer (/me) and operator views",++ "media.* events through the SDK outbox, webhooks during the transition",++ "restore-drill mode and N-1 compatibility tests",++ "per-actor limits (openvibe-sdk/limits)"++ ],++ "updated": "2026-09-28"++ }},{"description": "",-- "diskUsage": 2413,++ "diskUsage": 3416,"isArchived": false,"name": "OpenVibe.Network",-- "pushedAt": "2026-09-26T13:27:42Z",++ "pushedAt": "2026-09-28T03:20:56Z","visibility": "PUBLIC","defaultBranch": "main",-- "status": null++ "status": {++ "repository": "OpenVibers/OpenVibe.Network",++ "stage": "stable",++ "code": true,++ "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",++ "runtime": "node 22, express, better-sqlite3",++ "port": 4000,++ "domain": "openvibe.network (with auth., api., admin., my. and themes.openvibe.network in its manifest)",++ "contracts": "openvibe-contracts v0.75.0",++ "capabilities": [++ "identity.subject.resolve",++ "mods.grant.manage",++ "network.account.deletion.confirm",++ "network.account.export.contribute",++ "network.analytics.creator.read",++ "network.blocks.read",++ "network.coins.credit",++ "network.coins.debit",++ "network.coins.transfer",++ "network.follows.read",++ "network.follows.write",++ "network.integration.github.read",++ "network.modules.read",++ "network.modules.write",++ "network.notifications.push",++ "network.operator.alert",++ "network.project.manage",++ "network.project.read",++ "network.staff.read",++ "network.status.incident"++ ],++ "capabilitiesRegistered": true,++ "deployed": true,++ "deployment": "Public at https://openvibe.network: deployed with `sudo ovhost deploy network --install-units` (deploy/scripts/deploy.sh is the wrapper), /opt/openvibe.network, unit openvibe-network on 127.0.0.1:4000, env /etc/openvibe/network.env.",++ "features": [++ "SSO identity provider: OAuth2 code flow with PKCE, OIDC, FedCM, rotating refresh tokens",++ "canonical subjects, anonymous users, multi-account switching, account merge, export and deletion",++ "service principals and grants; developer projects, apps, credentials, grants, quotas and usage",++ "notifications (realtime through Events), email and web push",++ "themes and preferences, user modules, platform blocks, follow graph, creator analytics",++ "OpenCoins wallet",++ "service registry, public discovery and the status page with incidents",++ "operator alerts relay target and admin panel",++ "serves /shared/* from its pinned openvibe-shared",++ "per-actor limits (openvibe-sdk/limits)"++ ],++ "updated": "2026-09-28"++ }},{"description": "Source-backed stories: clustered coverage, cited summaries, perspectives and timelines.",-- "diskUsage": 447,++ "diskUsage": 466,"isArchived": false,"name": "OpenVibe.News",-- "pushedAt": "2026-09-26T13:23:41Z",++ "pushedAt": "2026-09-28T03:20:58Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -619,11 +985,12 @@"runtime": "node 22, express 4, better-sqlite3 11","port": 4820,"domain": "openvibe.news",++ "contracts": "openvibe-contracts v0.49.0","packages": [-- "openvibe-publishing v0.2.1",-- "openvibe-contracts v0.33.0",-- "openvibe-shared v1.5.1",-- "openvibe-sdk v0.5.0"++ "openvibe-publishing v0.4.0",++ "openvibe-contracts v0.49.0",++ "openvibe-shared v1.22.0",++ "openvibe-sdk v0.12.0"],"capabilities": ["news.story.create",@@@ -644,17 +1011,32 @@"ai": "optional seam (news.summarize_story, news.compare_perspectives) tested against a mock; not configured in production (OV_AI_INTERNAL_URL unset); OpenVibe.AI output only ever lands as a draft that needs a person's review","seed": "topics only (12 in production); no stories, source items or clusters","deployed": true,-- "deployment": "openvibe-ovh, unit openvibe-news, 127.0.0.1:4820 loopback only (release 1802e7d); /api/ready 200; production database holds 12 topics and 0 stories. Deployed internally, not launched: openvibe.news still serves the OpenVibe.Sites placeholder until a person verifies a news source's terms, enables it in Sources, and an editor publishes a reviewed story",++ "deployment": "Deployed with `sudo ovhost deploy news`: unit openvibe-news, 127.0.0.1:4820 loopback only; on 2026-09-23 /api/ready answered 200 and the production database held 12 topics and 0 stories. Deployed internally, not launched: openvibe.news still serves the OpenVibe.Sites placeholder until a person verifies a news source's terms, enables it in Sources, and an editor publishes a reviewed story","placeholderInSites": true,-- "updated": "2026-09-23"++ "updated": "2026-09-28",++ "features": [++ "Sources ingestion by Events subscription and cursor pull, with dedupe",++ "failed ingestion recorded, never fabricated",++ "deterministic, explained clusters with audited merge and split",++ "stories whose paragraphs cite Sources items; no publish without sources",++ "revisions, corrections, timelines, perspectives and final retractions",++ "independent-source index gate",++ "licensing limits on stored and shown text",++ "Community comment threads by reference",++ "optional OpenVibe.AI drafts that need a person's review",++ "server-rendered editorial and public pages useful without JavaScript",++ "/api/v1 by capability",++ "SDK outbox events and Search index documents",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "Shared publishing packages (drafts, revisions, citations, SEO gate, feeds, structured data) for Wiki, Blog, News, Reviews, Deals, Coupons and Trade. Packages only, no authority.",-- "diskUsage": 247,++ "diskUsage": 248,"isArchived": false,"name": "OpenVibe.Publishing",-- "pushedAt": "2026-09-26T13:23:45Z",++ "pushedAt": "2026-09-28T03:21:00Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -664,7 +1046,7 @@"wave": "W15","kind": "packages","package": "openvibe-publishing",-- "version": "0.2.1",++ "version": "0.4.0","plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","runtime": null,"port": null,@@@ -680,22 +1062,38 @@"seo","authorship","index-hooks",++ "ai","ssr"],"consumers": [-- "OpenVibe.Wiki (v0.2.1; public at https://openvibe.wiki)",-- "OpenVibe.Blog (v0.2.1; public at https://openvibe.blog)",-- "OpenVibe.News (v0.2.1; deployed loopback-only, not launched)",-- "OpenVibe.Reviews (v0.2.1; deployed loopback-only, not launched)",-- "OpenVibe.Deals (v0.2.1; deployed loopback-only, not launched)",-- "OpenVibe.Coupons (v0.2.1; deployed loopback-only, not launched)",-- "OpenVibe.Trade (v0.2.1; deployed loopback-only, not launched)"++ "OpenVibe.Wiki (v0.4.0; public at https://openvibe.wiki)",++ "OpenVibe.Blog (v0.4.0; public at https://openvibe.blog)",++ "OpenVibe.News (v0.4.0; deployed loopback-only, not launched)",++ "OpenVibe.Reviews (v0.4.0; deployed loopback-only, not launched)",++ "OpenVibe.Deals (v0.4.0; deployed loopback-only, not launched)",++ "OpenVibe.Coupons (v0.4.0; deployed loopback-only, not launched)",++ "OpenVibe.Trade (v0.4.0; deployed loopback-only, not launched)"],"plannedConsumers": [],"exitProof": "examples/two-products + test/two-products.test.js",-- "contracts": "openvibe-contracts v0.33.0: emits search.index-document@1 and events.event-envelope@1 (validated in tests)",++ "contracts": "openvibe-contracts v0.49.0 (devDependency): emits search.index-document@1 and events.event-envelope@1 (validated in tests)","released": true,-- "updated": "2026-09-23"++ "deployed": false,++ "deployment": "none: a package released as git tags; products pin the tag and deploy it with their own releases",++ "features": [++ "revisions with optimistic concurrency, diff and revert",++ "idempotent lease-based scheduling",++ "taxonomy with hierarchical categories",++ "append-only citations",++ "Media attachment references with honest broken states",++ "Community discussion references",++ "deterministic indexability gate, redirects, sitemaps and feeds",++ "authorship and AI disclosure, held until a person's review",++ "OpenVibe.AI draft client",++ "Search index documents, tombstones and publication events",++ "auto-escaping SSR and a safe Markdown subset"++ ],++ "updated": "2026-09-28"}},{@@@ -718,10 +1116,10 @@},{"description": "Review signals gathered across sources with provenance, entity resolution and honest aggregates.",-- "diskUsage": 503,++ "diskUsage": 501,"isArchived": false,"name": "OpenVibe.Reviews",-- "pushedAt": "2026-09-26T13:23:49Z",++ "pushedAt": "2026-09-28T03:21:02Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -733,11 +1131,11 @@"runtime": "node 22, express, better-sqlite3","port": 4830,"domain": "openvibe.reviews",-- "contracts": "openvibe-contracts v0.33.0",++ "contracts": "openvibe-contracts v0.49.0","packages": [-- "openvibe-publishing v0.2.1",-- "openvibe-shared v1.5.1",-- "openvibe-sdk v0.5.0"++ "openvibe-publishing v0.4.0",++ "openvibe-shared v1.22.0",++ "openvibe-sdk v0.12.0"],"capabilities": ["reviews.entity.resolve",@@@ -751,19 +1149,33 @@],"capabilitiesRegistered": true,"deployed": true,-- "deployment": "openvibe-ovh, unit openvibe-reviews, 127.0.0.1:4830 loopback only (release 3151c05); /api/ready 200; Events subscription sources.item.* in place; production database holds 0 entities and 0 signals. Deployed internally, not launched: openvibe.reviews still serves the OpenVibe.Sites placeholder until a person verifies a review source's terms and enables it in Sources, and an editor publishes (REVIEWS_EDITORS holds the owner only)",++ "deployment": "Deployed with `sudo ovhost deploy reviews`: unit openvibe-reviews, 127.0.0.1:4830 loopback only; Events subscription sources.item.* in place; on 2026-09-23 /api/ready answered 200 and the production database held 0 entities and 0 signals. Deployed internally, not launched: openvibe.reviews still serves the OpenVibe.Sites placeholder until a person verifies a review source's terms and enables it in Sources, and an editor publishes (REVIEWS_EDITORS holds the owner only)","onOpenVibeSites": true,"seed": "none: no entities, signals, summaries or ratings are seeded","dataSource": "OpenVibe.Sources category reviews; no review source is enabled there yet (all 6 Sources seeds are disabled)",-- "updated": "2026-09-23"++ "updated": "2026-09-28",++ "features": [++ "signals from OpenVibe.Sources by cursor pull and signed webhook, with provenance",++ "deterministic entity resolution; a name alone never resolves",++ "aggregates only from existing signals, with revisions",++ "exact merge and split round trips, audited",++ "editor trust decisions shown with reasons",++ "summaries written or approved by a person; AI drafts never yield a rating",++ "public corrections as new revisions",++ "Community discussion threads by reference",++ "server-rendered pages and editor workflows useful without JavaScript",++ "/api/v1 by capability",++ "SDK outbox events and Search index documents",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "Supported browser and server clients for the OpenVibe platform.",-- "diskUsage": 657,++ "diskUsage": 706,"isArchived": false,"name": "OpenVibe.SDK",-- "pushedAt": "2026-09-25T22:31:12Z",++ "pushedAt": "2026-09-28T03:23:32Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -771,17 +1183,33 @@"stage": "alpha","code": true,"wave": "W2",-- "version": "0.6.0",++ "version": "0.12.0","plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026), §3.2; roadmap §30",-- "updated": "2026-09-23"++ "deployed": false,++ "deployment": "none: a package released as git tags; services and apps pin a tag",++ "contracts": "openvibe-contracts v0.49.0 (devDependency; runtime contracts range >=0.5.0 <1.0.0)",++ "features": [++ "core client: retries, timeouts, problem+json errors, trace propagation",++ "auth: service and app tokens, PKCE, offline verification, revocation cutoffs",++ "registry discovery and contracts version checks",++ "events: publish, pull, app events, webhook verification (v2), outbox and inbox",++ "realtime SSE",++ "media files and objects v2",++ "community, search, chat, ai, jobs, tools, projects, modules, identity and vip clients",++ "per-actor limiter for services (openvibe-sdk/limits)",++ "the OpenVibe Frame for any app",++ "mock platform for tests (openvibe-sdk/testing)",++ "ESM entries, TypeScript types and a browser bundle"++ ],++ "updated": "2026-09-28"}},{"description": "Permission-aware, event-fed search index for the network: canonical index documents, ACL-filtered queries, deletion propagation.",-- "diskUsage": 278,++ "diskUsage": 318,"isArchived": false,"name": "OpenVibe.Search",-- "pushedAt": "2026-09-26T13:23:54Z",++ "pushedAt": "2026-09-28T03:21:06Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -792,11 +1220,12 @@"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","runtime": "node 22, express, better-sqlite3 (FTS5)","port": 4710,-- "domain": "search.openvibe.network (vhost in deploy/nginx, not installed: until it is, the name falls through to the admin.openvibe.network placeholder; README \"Public host\")",-- "contracts": "openvibe-contracts v0.33.0",++ "domain": "search.openvibe.network (vhost in deploy/nginx; the service manifest records the search page and query API as public since 2026-09-23)",++ "contracts": "openvibe-contracts v0.49.0","capabilities": ["search.document.write",-- "search.query.delegate"++ "search.query.delegate",++ "search.query.run"],"capabilitiesRegistered": true,"contractsProposed": [@@@ -804,7 +1233,7 @@],"engine": "sqlite-fts5 (docs/adr-engine.md)","deployed": true,-- "deployment": "Deployed internally, not launched: /opt/openvibe.search at 5a7e59b, unit openvibe-search, 127.0.0.1:4710 only, principal search, Events subscription *.index_document.*, accepted event owners sources, wiki, blog, news, reviews, trade, deals, coupons. Production index: 10 documents, all tombstones (wiki), 0 public. Restore drill passed 2026-09-23.",++ "deployment": "Deployed with `sudo ovhost deploy search`: /opt/openvibe.search, unit openvibe-search, 127.0.0.1:4710, principal search, Events subscription *.index_document.*, accepted event owners sources, wiki, blog, news, reviews, trade, deals, coupons. On 2026-09-23 the production index held 10 documents, all tombstones (wiki), 0 public. Restore drill passed 2026-09-23.","indexedProducers": ["wiki (tombstones only so far)"],@@@ -816,17 +1245,18 @@"saved searches (notifications wait for Network notifications)","server-rendered search page","owner removal feed",-- "Cloudflare purge queue (inert until CLOUDFLARE_PURGE_TOKEN is set)"++ "Cloudflare purge queue (inert until CLOUDFLARE_PURGE_TOKEN is set)",++ "per-actor limits (openvibe-sdk/limits)"],-- "updated": "2026-09-23"++ "updated": "2026-09-28"}},{"description": "Versioned UI, chrome, SEO, legal and release-client packages every OpenVibe site renders.",-- "diskUsage": 843,++ "diskUsage": 1084,"isArchived": false,"name": "OpenVibe.Shared",-- "pushedAt": "2026-09-26T13:06:00Z",++ "pushedAt": "2026-09-28T03:21:08Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -835,27 +1265,74 @@"code": true,"wave": "W2","package": "openvibe-shared",-- "version": "1.8.0",++ "version": "1.23.1","plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",-- "updated": "2026-09-24"++ "deployed": false,++ "deployment": "none of its own: a package released as git tags; OpenVibe.Network serves /shared/* from its pinned tag, and a site can serve its own pinned copy (openvibe-shared/serve)",++ "contracts": "openvibe-contracts v0.61.0 (devDependency: the release manifest contract)",++ "features": [++ "the OpenVibe Frame: navbar, footer, panels, account switcher, notification UI with realtime",++ "themes, design tokens and icons",++ "release manifest, in-place updates in open tabs and update metrics",++ "web runtime (feature loader)",++ "shipped pill, recent list and /updates log",++ "server helpers: ready, metrics, trace, egress, config, analytics, legal, SEO, frame SSR",++ "browser harness and perf budgets for tests"++ ],++ "updated": "2026-09-28"}},{"description": "Static front pages for OpenVibe domains that are not full apps yet",-- "diskUsage": 741,++ "diskUsage": 967,"isArchived": false,"name": "OpenVibe.Sites",-- "pushedAt": "2026-09-26T13:23:57Z",++ "pushedAt": "2026-09-28T03:21:10Z","visibility": "PUBLIC","defaultBranch": "main",-- "status": null++ "status": {++ "repository": "OpenVibers/OpenVibe.Sites",++ "stage": "stable",++ "code": true,++ "kind": "static site generator",++ "domains": [++ "openvibe.news",++ "openvibe.reviews",++ "openvibe.tips",++ "openvibe.vip",++ "openvibe.trade",++ "openvibe.host",++ "openvibe.deals",++ "openvibe.coupons",++ "openre.stream",++ "auth.openvibe.network",++ "api.openvibe.network",++ "admin.openvibe.network",++ "themes.openvibe.network",++ "ai.openvibe.network",++ "realtime.openvibe.network (closed notice)",++ "status.openvibe.network (status notice)"++ ],++ "contracts": "none: package.json pins no openvibe-contracts (openvibe-shared v1.23.0 only)",++ "deployed": true,++ "deployment": "Deployed with `sudo ovhost deploy sites --restart` (OpenVibe.Host strategy static-build since the 2026-09-27 cutover): /opt/openvibe.sites, nginx serves dist/<domain>/ through deploy/nginx/<domain>.conf; no unit, no port, no env file",++ "features": [++ "one catalog and one template for every placeholder and notice page",++ "labels built from facts.json (each repository's STATUS.json and Network's registry), never a hand-kept list",++ "the pinned OpenVibe Frame served from dist/_shared/",++ "full SEO: canonical, Open Graph, Twitter, JSON-LD, robots, sitemap, manifest",++ "404 pages and generated nginx vhosts",++ "a release.json per domain and host.release.published on deploy"++ ],++ "updated": "2026-09-28"++ }},{"description": "Source registry and ingestion workers for the network: provenance, terms, rate limits, explicit failure states.",-- "diskUsage": 299,++ "diskUsage": 309,"isArchived": false,"name": "OpenVibe.Sources",-- "pushedAt": "2026-09-26T13:24:02Z",++ "pushedAt": "2026-09-28T03:21:12Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -866,8 +1343,8 @@"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","runtime": "node 22, express, better-sqlite3, fast-xml-parser","port": 4720,-- "domain": "sources.openvibe.network (vhost in deploy/nginx, not installed: until it is, the name falls through to the admin.openvibe.network placeholder; once installed it answers an internal-service page, health and JSON 404s, API loopback-only; README \"Public host\")",-- "contracts": "openvibe-contracts v0.33.0",++ "domain": "sources.openvibe.network (vhost in deploy/nginx: an internal-service page, health and JSON 404s; the API is loopback-only; README \"Public host\")",++ "contracts": "openvibe-contracts v0.49.0","capabilities": ["sources.source.read","sources.item.read",@@@ -889,16 +1366,28 @@"seededSources": 6,"enabledSources": 0,"deployed": true,-- "deployment": "Deployed internally, not launched: /opt/openvibe.sources at f727a40 since 2026-09-23 (origin 60a920d adds only an nginx file), unit openvibe-sources, 127.0.0.1:4720 only, principal sources. All 6 seeds disabled; 0 fetch runs and 0 items in production. Restore drill passed 2026-09-23.",-- "updated": "2026-09-23"++ "deployment": "Deployed with `sudo ovhost deploy sources`: /opt/openvibe.sources, unit openvibe-sources, 127.0.0.1:4720, principal sources. All 6 seeds disabled; on 2026-09-23 production had 0 fetch runs and 0 items. Restore drill passed 2026-09-23.",++ "features": [++ "source registry with terms, robots and licence notes",++ "rss, atom, sitemap, jsonld, api and manual adapters",++ "polite scheduler: robots.txt, per-host spacing, conditional GET, backoff",++ "SSRF-guarded fetcher",++ "failed fetches recorded, never fabricated",++ "item revisions and sticky removals with provenance",++ "cursor item API by capability",++ "transactional outbox to Events",++ "staff-only index documents for Search",++ "per-actor limits (openvibe-sdk/limits)"++ ],++ "updated": "2026-09-28"}},{"description": "Creator support: tips, goals, paid messages, TTS and media requests, overlays.",-- "diskUsage": 496,++ "diskUsage": 563,"isArchived": false,"name": "OpenVibe.Tips",-- "pushedAt": "2026-09-26T13:24:05Z",++ "pushedAt": "2026-09-28T03:21:14Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -909,27 +1398,85 @@"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","adr": "ADR-012","authoritative": false,-- "deployment": "Deployed internally, not launched: openvibe-ovh /opt/openvibe.tips (release 3fb582e, openvibe-contracts 0.33.0, openvibe-sdk 0.5.0, openvibe-shared 1.5.1), unit openvibe-tips, 127.0.0.1:4610 loopback only; https://openvibe.tips still serves the OpenVibe.Sites placeholder. Principal tips; Events subscriptions billing.transaction.* and billing.receipt.* -> /internal/events (secret rotated 2026-09-24); TIPS_CHAT_ADAPTER is empty (no chat side effects).",-- "notes": "Runtime, API, SSR pages, overlays, the Billing settlement consumer, events outbox, Live import and reconciliation are built, tested and deployed, together with /metrics (loopback only), truthful /api/ready (Billing and Events checks), supporter privacy (anonymous, hidden amount, private message), goal and supporter-page settings, export and erasure (tips.interaction.erased), and moderation (word filter, hide/show, invited moderators, tips.interaction.moderated). Capabilities (17 tips.*) and payload schemas are in openvibe-contracts. Production holds the Live import (3 import runs, the last 2026-09-23 18:31 UTC: 139 interactions, 4 goals, 143 migration maps); 0 creator profiles and 0 overlay tokens (nobody has set up the product). No billing.* event has arrived: Billing runs in shadow. A written internal threat review (docs/threat-review.md) with its fixes and test/security.test.js. Not done: an independent security review; the openvibe.tips launch. Live stays the place tips happen until the Billing cutover (blocked on the owner re-pointing the PowerChat webhook) and the launch rule in README.md holds.",-- "updated": "2026-09-24"++ "deployed": true,++ "deployment": "Deployed internally, not launched: deployed with `sudo ovhost deploy tips`, /opt/openvibe.tips, unit openvibe-tips, 127.0.0.1:4610 loopback only; https://openvibe.tips still serves the OpenVibe.Sites placeholder. Principal tips; Events subscriptions billing.transaction.* and billing.receipt.* -> /internal/events (secret rotated 2026-09-24); TIPS_CHAT_ADAPTER is empty (no chat side effects).",++ "contracts": "openvibe-contracts v0.49.0",++ "notes": "Runtime, API, SSR pages, overlays, the Billing settlement consumer, events outbox, Live import and reconciliation are built, tested and deployed, together with /metrics (loopback only), truthful /api/ready (Billing and Events checks), supporter privacy (anonymous, hidden amount, private message), goal and supporter-page settings, export and erasure (tips.interaction.erased), moderation (word filter, hide/show, invited moderators, tips.interaction.moderated) and per-actor limits. Capabilities (18 tips.*) and payload schemas are in openvibe-contracts. On 2026-09-24 production held the Live import (3 import runs, the last 2026-09-23 18:31 UTC: 139 interactions, 4 goals, 143 migration maps); 0 creator profiles and 0 overlay tokens (nobody had set up the product). No billing.* event had arrived: Billing runs in shadow. A written internal threat review (docs/threat-review.md) with its fixes and test/security.test.js. Not done: an independent security review; the openvibe.tips launch. Live stays the place tips happen until the Billing cutover (blocked on the owner re-pointing the PowerChat webhook) and the launch rule in README.md holds.",++ "updated": "2026-09-28",++ "features": [++ "tips, paid messages, TTS and media requests settled by OpenVibe.Billing (never Tips' own money)",++ "goals counted from settled payments only",++ "overlays with revocable scoped tokens and replay without recharging",++ "EXTERNAL PowerChat tips from billing.receipt.external",++ "supporter privacy, export and erasure",++ "moderation: word filter, hide and show, invited moderators",++ "Live chat delivery adapter",++ "Live import and reconciliation against Billing",++ "server-rendered creator pages useful without JavaScript",++ "/api/v1 by capability",++ "SDK outbox and inbox",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "",-- "diskUsage": 3267,++ "diskUsage": 2632,"isArchived": false,"name": "OpenVibe.Tools",-- "pushedAt": "2026-09-26T13:24:09Z",++ "pushedAt": "2026-09-28T03:21:16Z","visibility": "PUBLIC","defaultBranch": "main",-- "status": null++ "status": {++ "repository": "OpenVibers/OpenVibe.Tools",++ "stage": "stable",++ "code": true,++ "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",++ "runtime": "node 22, express, better-sqlite3; eight apps (gateway, maps, food, img, yt, audio, text, docs)",++ "port": 4001,++ "ports": {++ "gateway": 4001,++ "maps": 4010,++ "food": 4011,++ "img": 4012,++ "yt": 4013,++ "audio": 4014,++ "text": 4015,++ "docs": 4016++ },++ "domain": "openvibe.tools and *.openvibe.tools",++ "contracts": "openvibe-contracts v0.63.0 (each app's package.json; the root package.json pins none)",++ "capabilities": [++ "tools.job.create",++ "tools.job.read",++ "tools.job.cancel",++ "tools.tool.read",++ "tools.tool.run",++ "tools.net.probe"++ ],++ "capabilitiesRegistered": true,++ "deployed": true,++ "deployment": "Public at https://openvibe.tools: deployed with `sudo ovhost deploy tools` (OpenVibe.Host strategy multi-app since the 2026-09-27 cutover; deploy/scripts/deploy.sh is the wrapper), /opt/openvibe.tools, units openvibe-tools (gateway, 127.0.0.1:4001) and openvibe-tools-<app> per satellite, env /etc/openvibe/tools.env.",++ "features": [++ "tool registry with descriptors, canonical hosts, aliases and owner-attached custom domains",++ "server-rendered catalog and tool pages with full SEO",++ "public registry API (tools.tool.read) and run API (tools.tool.run)",++ "jobs runtime for img, audio and docs with SSE progress and Media results",++ "net and dev tools on the gateway; maps, food, img, yt, audio, text and docs satellites",++ "guard: callers, tiered quotas, upload sniffing, SSRF-safe egress, abuse log",++ "tools.* events and Search documents",++ "analytics within ADR-021",++ "per-actor limits (openvibe-sdk/limits)"++ ],++ "updated": "2026-09-28"++ }},{"description": "Informational watchlists, sourced market context and alerts. No custody, no order execution.",-- "diskUsage": 399,++ "diskUsage": 418,"isArchived": false,"name": "OpenVibe.Trade",-- "pushedAt": "2026-09-26T13:24:13Z",++ "pushedAt": "2026-09-28T03:21:18Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -942,11 +1489,12 @@"port": 4860,"domain": "openvibe.trade","scope": "informational only (ADR-025): no custody, no order execution, no escrow, no listings between users, no personalised advice",++ "contracts": "openvibe-contracts v0.49.0","packages": [-- "openvibe-contracts v0.33.0",-- "openvibe-publishing v0.2.1",-- "openvibe-shared v1.5.1",-- "openvibe-sdk v0.5.0"++ "openvibe-contracts v0.49.0",++ "openvibe-publishing v0.4.0",++ "openvibe-shared v1.22.0",++ "openvibe-sdk v0.12.0"],"capabilities": ["trade.instrument.resolve",@@@ -967,17 +1515,31 @@"marketDataFeeds": "none configured: the only seeded trade source in OpenVibe.Sources (SEC EDGAR XBRL filings RSS) is disabled there, and it carries filings, not prices; no observation exists until a source states one","seed": "none (tests create their own instruments; production holds 0 instruments and 0 observations)","deployed": true,-- "deployment": "openvibe-ovh, unit openvibe-trade, 127.0.0.1:4860 loopback only (release 9a55644); /api/ready 200 with status degraded [freshness], which is honest: no feed is configured; Network OAuth client trade and its grants exist; no Events subscription; production database holds 0 instruments and 0 observations. Deployed internally, not launched: openvibe.trade still serves the OpenVibe.Sites placeholder until a person verifies the SEC XBRL terms and enables sec-xbrl-filings in Sources, a licensed market data feed exists, and editors add instruments",++ "deployment": "Deployed with `sudo ovhost deploy trade`: unit openvibe-trade, 127.0.0.1:4860 loopback only; on 2026-09-23 /api/ready answered 200 with status degraded [freshness], which is honest: no feed is configured; Network OAuth client trade and its grants exist; no Events subscription; production database held 0 instruments and 0 observations. Deployed internally, not launched: openvibe.trade still serves the OpenVibe.Sites placeholder until a person verifies the SEC XBRL terms and enables sec-xbrl-filings in Sources, a licensed market data feed exists, and editors add instruments","placeholderInSites": true,-- "updated": "2026-09-23"++ "updated": "2026-09-28",++ "features": [++ "informational only: a route-inventory test refuses any execution, custody or advice endpoint",++ "instruments with exact, deterministic resolution (CIK, ticker, name)",++ "observations with required timestamps; no observation, no number",++ "per-source freshness with stale badges and transition events",++ "SEC EDGAR filings from Sources matched to instruments",++ "private watchlists",++ "threshold, filing-type and new-document alerts (trade.alert.triggered)",++ "cited editor context; AI drafts need approval; advice refused",++ "server-rendered pages useful without JavaScript",++ "/api/v1 by capability",++ "SDK outbox events and Search index documents",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "Memberships: plans, perks and benefits recognised across every OpenVibe site.",-- "diskUsage": 440,++ "diskUsage": 510,"isArchived": false,"name": "OpenVibe.VIP",-- "pushedAt": "2026-09-26T13:24:17Z",++ "pushedAt": "2026-09-28T03:21:20Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -985,7 +1547,8 @@"stage": "alpha","code": true,"deployed": true,-- "deployment": "Deployed internally, not launched: openvibe-ovh /opt/openvibe.vip (release a675577, openvibe-contracts 0.33.0, openvibe-sdk 0.5.0, openvibe-shared 1.5.1), unit openvibe-vip, 127.0.0.1:4620 loopback only; https://openvibe.vip still serves the OpenVibe.Sites placeholder. Principal vip; three Events subscriptions for Billing's events (secret rotated 2026-09-24); checkout closed (VIP_CHECKOUT_PROVIDERS empty). Production holds the Live import: 44 creators, 43 plans (one per creator), 0 memberships while Billing runs in shadow.",++ "deployment": "Deployed internally, not launched: deployed with `sudo ovhost deploy vip`, /opt/openvibe.vip, unit openvibe-vip, 127.0.0.1:4620 loopback only; https://openvibe.vip still serves the OpenVibe.Sites placeholder. Principal vip; three Events subscriptions for Billing's events (secret rotated 2026-09-24); checkout closed (VIP_CHECKOUT_PROVIDERS empty). On 2026-09-24 production held the Live import: 44 creators, 43 plans (one per creator), 0 memberships while Billing runs in shadow.",++ "contracts": "openvibe-contracts v0.49.0","plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","roadmap": "Wave 10","works": [@@@ -993,15 +1556,16 @@"entitlement projection fed by Billing events (signed webhook + openvibe-sdk inbox) with valid_until, grace and a direct Billing fallback; 'unknown' never authorizes","checkout hand-off and cancellation through OpenVibe.Billing; the membership is filed under the plan version chosen","API /api/v1 for service and user tokens; consumer client openvibe-vip/client that fails closed, with createVipCache (the product cache and its convergence bound, test/convergence.test.js)",-- "the product's default gate (evaluate fallback, honouring product bindings such as blog gated_post) and entitlements/check product perks (Chat's badge); Chat, Community and Blog consume them in code (not deployed, grants pending)",++ "the product's default gate (evaluate fallback, honouring product bindings such as blog gated_post) and entitlements/check product perks (Chat's badge); Chat, Community, Blog and Wiki consume them in code","server-rendered creator plan pages, terms history, member status and creator dashboard with the shared chrome","outbox events vip.plan.published and vip.membership.changed (openvibe-sdk)","import of Live's subscription offering, memberships from Billing entitlements",-- "14 vip.* capabilities, the service manifest and its events registered in openvibe-contracts v0.19.0","deployed on the host (loopback only) with truthful /api/ready and /metrics; restore drill passed on the host 2026-09-23 05:23 UTC","reusable membership card (GET /embed/:username/card.json, GET /api/v1/creators/:ref/card), badge (/embed/:username/badge.svg) and embeddable widget (/embed/:username/widget): public data only, no cookies, the widget's CSP frame-ancestors configurable (VIP_WIDGET_FRAME_ANCESTORS), member count from Billing that the creator can hide (not deployed yet)","the Live subscription import has run: 43 plans and plan versions, 44 creators, 87 migration maps (production, 2026-09-23)",-- "Chat (subscriber badge, vip.entitlement.check), Community (members-only spaces and threads) and Blog (members-only posts) call VIP in production (vip.resource.policy.evaluate grants for Community and Blog)"++ "Chat (subscriber badge, vip.entitlement.check), Community (members-only spaces and threads) and Blog (members-only posts) call VIP in production (vip.resource.policy.evaluate grants for Community and Blog)",++ "14 vip.* capabilities, the service manifest and its events registered in openvibe-contracts v0.19.0 (this repository pins v0.49.0)",++ "per-actor limits on /api/v1 (openvibe-sdk/limits)"],"not_yet": ["not launched: openvibe.vip is still an OpenVibe.Sites placeholder and the service answers on loopback only",@@@ -1009,15 +1573,27 @@"Billing sells one channel subscription per member and creator: one purchasable plan per creator, no tiers, no network membership product","revocations reach Chat and Community through vip.membership.changed subscriptions (2026-09-24); Blog and Live still converge by the cache TTL (30-60 s)"],-- "updated": "2026-09-24"++ "updated": "2026-09-28",++ "features": [++ "plans with immutable versions, perks and product bindings",++ "entitlement projection from Billing events with valid_until, grace and a Billing fallback; unknown never authorizes",++ "checkout and cancel through OpenVibe.Billing",++ "gated-resource policy evaluation for products (fails closed)",++ "openvibe-vip/client with the product cache and its convergence bound",++ "creator plan pages, terms history, member status and creator dashboard",++ "public membership card, badge and embeddable widget",++ "Live subscription import",++ "SDK outbox events vip.plan.published and vip.membership.changed",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{"description": "Wiki spaces with page trees, revisions, citations, media and discussion — editable together, source-backed.",-- "diskUsage": 598,++ "diskUsage": 754,"isArchived": false,"name": "OpenVibe.Wiki",-- "pushedAt": "2026-09-26T13:24:21Z",++ "pushedAt": "2026-09-28T03:21:22Z","visibility": "PUBLIC","defaultBranch": "main","status": {@@@ -1029,11 +1605,11 @@"runtime": "node 22, express, better-sqlite3","port": 4800,"domain": "openvibe.wiki",-- "contracts": "openvibe-contracts v0.33.0",++ "contracts": "openvibe-contracts v0.64.0","packages": [-- "openvibe-publishing v0.2.1",-- "openvibe-shared v1.5.1",-- "openvibe-sdk v0.5.0"++ "openvibe-publishing v0.4.0",++ "openvibe-shared v1.22.0",++ "openvibe-sdk v0.12.0"],"capabilities": ["wiki.space.create",@@@ -1047,11 +1623,25 @@],"capabilitiesRegistered": true,"deployed": true,-- "deployment": "Public at https://openvibe.wiki since 2026-09-23 (~03:00 UTC): /opt/openvibe.wiki at c1e6ff5, unit openvibe-wiki on 127.0.0.1:4800 behind the openvibe.wiki nginx vhost, principal wiki. Production content: 1 space, the 10 seed pages (1 revision each), 0 person reviews, so every page is noindex and nothing public is in Search yet. Restore drill passed 2026-09-23.",++ "deployment": "Public at https://openvibe.wiki since 2026-09-23 (~03:00 UTC): deployed with `sudo ovhost deploy wiki`, /opt/openvibe.wiki, unit openvibe-wiki on 127.0.0.1:4800 behind the openvibe.wiki nginx vhost, principal wiki. On 2026-09-23 production held 1 space and the 10 seed pages (1 revision each), 0 person reviews, so every page was noindex and nothing public was in Search. Restore drill passed 2026-09-23.","onOpenVibeSites": false,"seed": "official space \"openvibe\" (10 pages summarised with AI assistance from the repositories' README/STATUS files, cited; noindex until a person reviews each; 0 of 10 reviewed as of 2026-09-23)",-- "updated": "2026-09-23",-- "deployedAt": "2026-09-23"++ "updated": "2026-09-28",++ "deployedAt": "2026-09-23",++ "features": [++ "spaces with page trees and roles",++ "immutable revisions with diff, revert and scheduled publication",++ "citations and infobox values bound to the revision that used them",++ "public, signed-in, VIP (OpenVibe.VIP), private and members-only visibility",++ "Media attachments with a broken-asset state",++ "Community discussion threads by reference",++ "AI proposals that need a person's approval",++ "space import bundles (owners only)",++ "feeds, sitemaps and server-rendered pages useful without JavaScript",++ "/api/v1 by capability",++ "SDK outbox events and Search index documents",++ "per-actor limits (openvibe-sdk/limits)"++ ]}},{@@@ -600,6 +600,38 @@"disposition": "keep","wave": "W9","note": "Live's side of Tips delivery idempotency (Idempotency-Key -> stored response, pruned after 7 days); Live renders the delivery."++ },++ {++ "repo": "OpenVibe.Live",++ "match": "^account_data_events$",++ "target": "keep",++ "disposition": "keep",++ "wave": "-",++ "note": "server/auth/account-data.js: which network.account.export_requested / deleted events Live has answered (ADR-033), so a redelivery is applied once."++ },++ {++ "repo": "OpenVibe.Live",++ "match": "^subject_merges$",++ "target": "keep",++ "disposition": "keep",++ "wave": "-",++ "note": "server/auth/subject-merge.js: the network.subject.merged events Live has applied (ADR-029), once each."++ },++ {++ "repo": "OpenVibe.Live",++ "match": "^follow_projection_revisions$",++ "target": "keep",++ "disposition": "projection",++ "wave": "-",++ "note": "server/social/network-follows.js: the per-pair revision of Live's follows projection of Network's graph (ADR-030); an older network.follow.* event changes nothing."++ },++ {++ "repo": "OpenVibe.Live",++ "match": "^lineage_unresolved$",++ "target": "keep",++ "disposition": "keep",++ "wave": "-",++ "note": "server/lineage/unresolved.js: media and session references the lineage resolver could not resolve yet, for the operator view (WS-H task 8)."}],"_routeDispositions": {@@@ -1,61 +1,61 @@{"host": "openvibe-oregon",-- "collectedAt": "2026-09-26T13:29:03.103Z",++ "collectedAt": "2026-09-28T03:25:35.860Z","deployments": {"ai": {"path": "/opt/openvibe.ai",-- "sha": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",-- "committedAt": "2026-09-26T06:09:19-07:00"++ "sha": "549bed09452233c6b21d529ab905a7bd8fbad4da",++ "committedAt": "2026-09-27T19:43:37-07:00"},"billing": {"path": "/opt/openvibe.billing",-- "sha": "180e246a3a344c062f1c7435303f4aa748f17046",-- "committedAt": "2026-09-26T06:09:39-07:00"++ "sha": "80f97aabbecb0fcb81842480166533ff0452c8a5",++ "committedAt": "2026-09-27T19:45:09-07:00"},"blog": {"path": "/opt/openvibe.blog",-- "sha": "79e9e153ca1308311993a31295fd471a8becaf8d",-- "committedAt": "2026-09-26T06:09:58-07:00"++ "sha": "21d537c6e6b90712512916e4d7377d581ee2f646",++ "committedAt": "2026-09-27T18:49:25-07:00"},"chat": {"path": "/opt/openvibe.chat",-- "sha": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",-- "committedAt": "2026-09-26T06:12:38-07:00"++ "sha": "3aab730c5105594523ed58ab0643c6eedc6b5214",++ "committedAt": "2026-09-27T19:10:37-07:00"},"codes": {"path": "/opt/openvibe.codes",-- "sha": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",-- "committedAt": "2026-09-26T06:13:08-07:00"++ "sha": "d78de7052c08dc38c6e2c400a0b63a1b00793f1f",++ "committedAt": "2026-09-27T18:55:28-07:00"},"community": {"path": "/opt/openvibe.community",-- "sha": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",-- "committedAt": "2026-09-26T06:13:46-07:00"++ "sha": "52d923a941f659ccfc7cb442efb2b10349663175",++ "committedAt": "2026-09-27T18:07:00-07:00"},"coupons": {"path": "/opt/openvibe.coupons",-- "sha": "348f585cd6549a5c506171fba0fc2c5462dede32",-- "committedAt": "2026-09-26T06:13:57-07:00"++ "sha": "64835d2a1c926e89116a35218d7a2d081f38b67a",++ "committedAt": "2026-09-27T19:02:19-07:00"},"deals": {"path": "/opt/openvibe.deals",-- "sha": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",-- "committedAt": "2026-09-26T06:14:11-07:00"++ "sha": "fa0582d267ef61e7b141299008d6239dd34f49ce",++ "committedAt": "2026-09-27T18:58:50-07:00"},"events": {"path": "/opt/openvibe.events",-- "sha": "eb98f8cad2a738fec45f1c10e373081532c83e91",-- "committedAt": "2026-09-26T06:14:37-07:00"++ "sha": "f55f7eb601be58220089c197f7dd2178b46d8d15",++ "committedAt": "2026-09-27T19:55:58-07:00"},"games": {"path": "/opt/openvibe.games",-- "sha": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",-- "committedAt": "2026-09-26T05:39:23-07:00"++ "sha": "51d86883a1dc1fb4098866fd2426516e09e05335",++ "committedAt": "2026-09-27T19:29:46-07:00"},"host": {"path": "/opt/openvibe.host",-- "sha": "75147890e32dd63fd1363f843c87415f90d5b2dd",-- "committedAt": "2026-09-26T06:15:11-07:00"++ "sha": "2b633899f41b559586e3d6c234925d498c7bf2cd",++ "committedAt": "2026-09-27T19:35:46-07:00"},"live": {"path": "/opt/openvibe.live",@@@ -64,70 +64,70 @@},"media": {"path": "/opt/openvibe.media",-- "sha": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",-- "committedAt": "2026-09-26T06:16:26-07:00"++ "sha": "62483631db9b9c120662abf2b21d4cff0a2bdc80",++ "committedAt": "2026-09-27T19:50:40-07:00"},"network": {"path": "/opt/openvibe.network",-- "sha": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",-- "committedAt": "2026-09-26T06:27:40-07:00"++ "sha": "ddd87b6844fad1f0f878ed574ce0e2c990e5e695",++ "committedAt": "2026-09-27T19:26:13-07:00"},"news": {"path": "/opt/openvibe.news",-- "sha": "0860cf20dd3d8e8032caad300e0ce90497195b96",-- "committedAt": "2026-09-26T06:17:45-07:00"++ "sha": "8ab47a6a78168e1b25ac07c01aeb3a0bb743bbb9",++ "committedAt": "2026-09-27T19:20:19-07:00"},"reviews": {"path": "/opt/openvibe.reviews",-- "sha": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",-- "committedAt": "2026-09-26T06:18:06-07:00"++ "sha": "1cff36b8b9d385c4effb323f0506ede106b18d22",++ "committedAt": "2026-09-27T19:23:25-07:00"},"search": {"path": "/opt/openvibe.search",-- "sha": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",-- "committedAt": "2026-09-26T06:18:19-07:00"++ "sha": "8ed7667ff1e383271ddcc67c709be1bf5e1ba43d",++ "committedAt": "2026-09-27T17:59:00-07:00"},"sites": {"path": "/opt/openvibe.sites",-- "sha": "3802ee3d9ada9b8490134ece350420e627866a8c",-- "committedAt": "2026-09-26T06:18:20-07:00"++ "sha": "32464ecd99ae34236fdb12039fa904f010941ff4",++ "committedAt": "2026-09-27T14:01:00-07:00"},"sources": {"path": "/opt/openvibe.sources",-- "sha": "29cd386241c44456ffcebf70b6be287fa9a08aaa",-- "committedAt": "2026-09-26T06:18:36-07:00"++ "sha": "351383e8111395668a16f66b11d659549c6483fb",++ "committedAt": "2026-09-27T19:29:11-07:00"},"tips": {"path": "/opt/openvibe.tips",-- "sha": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",-- "committedAt": "2026-09-26T06:18:52-07:00"++ "sha": "1e6bfbb8294c9401c46c066457b165c24bc90d02",++ "committedAt": "2026-09-27T18:11:05-07:00"},"tools": {"path": "/opt/openvibe.tools",-- "sha": "168e5110d062f076c2c4afe88e3fc3c53ab44613",-- "committedAt": "2026-09-26T06:20:57-07:00"++ "sha": "e55469f2bf9ede55f08b5fb58951a00d375595b9",++ "committedAt": "2026-09-27T19:38:13-07:00"},"trade": {"path": "/opt/openvibe.trade",-- "sha": "fa382881cd92ee90b6329699d7d79129e32a6325",-- "committedAt": "2026-09-26T06:21:08-07:00"++ "sha": "4658447782c7d259e59d8c1060fd05c60cf66574",++ "committedAt": "2026-09-27T19:26:12-07:00"},"vip": {"path": "/opt/openvibe.vip",-- "sha": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",-- "committedAt": "2026-09-26T06:21:19-07:00"++ "sha": "0fbcbb53802d2bd4e4dc6e393465a1fce1fc75a9",++ "committedAt": "2026-09-27T18:14:01-07:00"},"wiki": {"path": "/opt/openvibe.wiki",-- "sha": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",-- "committedAt": "2026-09-26T06:21:43-07:00"++ "sha": "32a26ef43c5f4ac2c02c813f0ba68fda5f8cd5cf",++ "committedAt": "2026-09-27T18:44:27-07:00"},"openre": {"path": "/opt/openre.stream","layout": "release",-- "release": "b34dcd688867",-- "sha": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",-- "committedAt": "2026-09-26T06:08:48-07:00"++ "release": "cf423e377878",++ "sha": "cf423e377878eb60e449205a670130e6febb6b07",++ "committedAt": "2026-09-27T19:32:33-07:00"}},"units": [@@@ -161,6 +161,18 @@"active": "active","sub": "running"},++ {++ "unit": "openvibe-alerts.service",++ "load": "loaded",++ "active": "inactive",++ "sub": "dead"++ },++ {++ "unit": "openvibe-alerts.timer",++ "load": "loaded",++ "active": "active",++ "sub": "waiting"++ },{"unit": "openvibe-backup.service","load": "loaded",@@@ -185,6 +197,18 @@"active": "active","sub": "running"},++ {++ "unit": "openvibe-browsercheck.service",++ "load": "loaded",++ "active": "inactive",++ "sub": "dead"++ },++ {++ "unit": "openvibe-browsercheck.timer",++ "load": "loaded",++ "active": "active",++ "sub": "waiting"++ },{"unit": "openvibe-chat.service","load": "loaded",@@@ -257,6 +281,12 @@"active": "active","sub": "running"},++ {++ "unit": "openvibe-llm.service",++ "load": "loaded",++ "active": "active",++ "sub": "running"++ },{"unit": "openvibe-media.service","load": "loaded",@@@ -456,9 +486,10 @@},{"file": "/opt/openvibe.games/data/world.db",-- "bytes": 507904,++ "bytes": 610304,"owner": "ubuntu","tables": [++ "account_data_events","constraints","event_outbox","guest_ips",@@@ -477,7 +508,7 @@},{"file": "/opt/openvibe.live/shared/data/analytics.db",-- "bytes": 518029312,++ "bytes": 525406208,"owner": "ubuntu","tables": ["analytics_daily",@@@ -989,6 +1020,175 @@"watch_time"]},++ {++ "file": "/opt/openvibe.live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db",++ "bytes": 284688384,++ "owner": "ubuntu",++ "tables": [++ "account_data_events",++ "ai_chatbot_configs",++ "ai_timeline_cache",++ "ai_usage",++ "ai_viewer_log",++ "ai_viewer_threads",++ "anon_ip_mappings",++ "api_keys",++ "api_tokens",++ "app_state",++ "approved_ips",++ "arena_achievements",++ "arena_battles",++ "arena_beef_hype",++ "arena_beef_sides",++ "arena_beefs",++ "arena_events",++ "arena_mic_moments",++ "arena_profiles",++ "arena_talk",++ "arena_talk_hype",++ "arena_talk_session_hype",++ "arena_talk_session_topics",++ "arena_talk_sessions",++ "arena_talk_topics",++ "arena_tier_paid",++ "arena_topic_hype",++ "arena_topic_members",++ "arena_topic_moments",++ "arena_topic_progress",++ "arena_topic_sides",++ "arena_topic_threads",++ "arena_topics",++ "arena_trash_levels",++ "arena_viewer_clout",++ "arena_votes",++ "arena_xp_log",++ "bans",++ "camera_presets",++ "camera_profiles",++ "cameras",++ "canvas_actions",++ "canvas_bans",++ "canvas_region_locks",++ "canvas_settings",++ "canvas_snapshots",++ "canvas_tiles",++ "canvas_user_overrides",++ "channel_ai_bots",++ "channel_ai_config",++ "channel_moderation_settings",++ "channel_moderators",++ "channel_points",++ "channel_points_log",++ "channel_sounds",++ "channels",++ "chat_ai_summaries",++ "chat_bridge_outbox",++ "chat_dual_read_stats",++ "chat_messages",++ "chat_staged_outbox",++ "chat_timeline_events",++ "chatter_profiles",++ "chatter_subjects",++ "chatter_xp_log",++ "clip_ai_state",++ "clips",++ "coin_redemptions",++ "coin_rewards",++ "coin_transactions",++ "comment_thread_refs",++ "comments",++ "content_views",++ "control_config_buttons",++ "control_configs",++ "control_whitelist",++ "dm_blocks",++ "dm_conversations",++ "dm_messages",++ "dm_participants",++ "donation_goals",++ "easter_egg_solves",++ "emotes",++ "event_outbox",++ "follows",++ "game_achievements",++ "game_bank",++ "game_battle_stats",++ "game_daily_quest_claims",++ "game_daily_quest_progress",++ "game_dungeon_runs",++ "game_effects",++ "game_farm_plots",++ "game_fish_collection",++ "game_inventory",++ "game_leaderboard",++ "game_players",++ "game_recipes",++ "game_structures",++ "game_world_state",++ "hidden_relay_users",++ "idempotency_receipts",++ "ip_log",++ "kick_channel_cache",++ "linked_accounts",++ "managed_streams",++ "media_request_settings",++ "media_requests",++ "moderation_actions",++ "moderation_events_backfill",++ "module_summary_pushes",++ "news_settings",++ "openre_sessions",++ "paste_comments",++ "paste_likes",++ "pastes",++ "payment_orders",++ "pending_ip_messages",++ "platform_connections",++ "powerchat_connections",++ "powerchat_webhook_deliveries",++ "promo_claims",++ "relay_users",++ "restream_destinations",++ "robotstreamer_integrations",++ "schema_migrations",++ "search_doc_pushes",++ "search_media_pushes",++ "site_settings",++ "stream_analytics",++ "stream_controls",++ "stream_first_chats",++ "stream_memories",++ "stream_recaps",++ "stream_timeline_events",++ "streamer_overviews",++ "streams",++ "subject_projection",++ "subscriptions",++ "tag_guardian_defeats",++ "themes",++ "token_revocations",++ "transactions",++ "translations",++ "tts_voice_overrides",++ "user_cosmetics",++ "user_equipped",++ "user_equipped_tag",++ "user_preferences",++ "user_tags",++ "user_themes",++ "username_history",++ "users",++ "verification_keys",++ "vibe_coding_events",++ "vibe_coding_sessions",++ "viewer_samples",++ "viewer_snapshots",++ "vod_ai_state",++ "vods",++ "vpn_approvals",++ "watch_time"++ ]++ },{"file": "/opt/openvibe.live/shared/data/hobo.db","bytes": 0,@@@ -1155,9 +1355,10 @@},{"file": "/opt/openvibe.live/shared/data/live.db",-- "bytes": 284057600,++ "bytes": 284700672,"owner": "ubuntu","tables": [++ "account_data_events","ai_chatbot_configs","ai_timeline_cache","ai_usage",@@@ -1399,9 +1600,10 @@},{"file": "/opt/openvibe.media/data/media.db",-- "bytes": 11538432,++ "bytes": 11735040,"owner": "ubuntu","tables": [++ "account_data_events","apps","assets","clips",@@@ -1417,6 +1619,10 @@"media_locations","media_namespaces","media_object_changes",++ "media_object_tier_decisions",++ "media_object_view_salts",++ "media_object_viewer_days",++ "media_object_views_daily","media_objects","media_quota_reservations","media_relationships",@@@ -1469,6 +1675,149 @@"vods"]},++ {++ "file": "/opt/openvibe.network/data/backups/network-pre-creator-analytics-20260926.db",++ "bytes": 292413440,++ "owner": "ubuntu",++ "tables": [++ "analytics_daily",++ "analytics_day_salts",++ "analytics_events",++ "analytics_hourly",++ "analytics_rate_tracking",++ "analytics_visitor_days",++ "anon_ip_log",++ "anon_users",++ "audit_log",++ "coin_transactions",++ "creator_streams",++ "dev_apps",++ "dev_audit",++ "dev_auth_codes",++ "dev_credentials",++ "dev_grants",++ "dev_project_members",++ "dev_projects",++ "dev_quotas",++ "dev_usage_daily",++ "dev_usage_errors",++ "dev_usage_windows",++ "email_delivery_log",++ "email_verification_tokens",++ "follow_import_holds",++ "follows",++ "frame_cache",++ "frame_hits",++ "identity_legacy_map",++ "ip_log",++ "linked_accounts",++ "moderation_audit",++ "network_event_inbox",++ "network_event_outbox",++ "notification_preferences",++ "notifications",++ "oauth_clients",++ "oauth_codes",++ "oauth_tokens",++ "operator_alerts",++ "password_reset_tokens",++ "principal_grant_changes",++ "principal_grants",++ "principal_usage",++ "push_subscriptions",++ "site_settings",++ "status_incident_updates",++ "status_incidents",++ "stream_live_announcements",++ "themes",++ "tool_domains",++ "url_registry",++ "user_blocks",++ "user_effects",++ "user_follows",++ "user_history",++ "user_module_retirements",++ "user_module_revisions",++ "user_modules",++ "user_preferences",++ "user_profile_changes",++ "user_sessions",++ "username_history",++ "users",++ "verification_keys",++ "wallets"++ ]++ },++ {++ "file": "/opt/openvibe.network/data/backups/network-pre-follows-20260926.db",++ "bytes": 292061184,++ "owner": "ubuntu",++ "tables": [++ "analytics_daily",++ "analytics_day_salts",++ "analytics_events",++ "analytics_hourly",++ "analytics_rate_tracking",++ "analytics_visitor_days",++ "anon_ip_log",++ "anon_users",++ "audit_log",++ "coin_transactions",++ "dev_apps",++ "dev_audit",++ "dev_auth_codes",++ "dev_credentials",++ "dev_grants",++ "dev_project_members",++ "dev_projects",++ "dev_quotas",++ "dev_usage_daily",++ "dev_usage_errors",++ "dev_usage_windows",++ "email_delivery_log",++ "email_verification_tokens",++ "follow_import_holds",++ "follows",++ "frame_cache",++ "frame_hits",++ "identity_legacy_map",++ "ip_log",++ "linked_accounts",++ "moderation_audit",++ "network_event_inbox",++ "network_event_outbox",++ "notification_preferences",++ "notifications",++ "oauth_clients",++ "oauth_codes",++ "oauth_tokens",++ "operator_alerts",++ "password_reset_tokens",++ "principal_grant_changes",++ "principal_grants",++ "principal_usage",++ "push_subscriptions",++ "site_settings",++ "stream_live_announcements",++ "themes",++ "tool_domains",++ "url_registry",++ "user_blocks",++ "user_effects",++ "user_follows",++ "user_history",++ "user_module_retirements",++ "user_module_revisions",++ "user_modules",++ "user_preferences",++ "user_profile_changes",++ "user_sessions",++ "username_history",++ "users",++ "verification_keys",++ "wallets"++ ]++ },{"file": "/opt/openvibe.network/data/network-pre-refresh-hash-2026-09-24.db","bytes": 279113728,@@@ -1589,9 +1938,15 @@},{"file": "/opt/openvibe.network/data/network.db",-- "bytes": 290332672,++ "bytes": 302370816,"owner": "ubuntu","tables": [++ "account_deletion_confirmations",++ "account_deletions",++ "account_export_parts",++ "account_exports",++ "account_merge_intents",++ "account_merges","analytics_daily","analytics_day_salts","analytics_events",@@@ -1602,6 +1957,7 @@"anon_users","audit_log","coin_transactions",++ "creator_streams","dev_apps","dev_audit","dev_auth_codes",@@@ -1610,14 +1966,20 @@"dev_project_members","dev_projects","dev_quotas",++ "dev_usage_daily",++ "dev_usage_errors",++ "dev_usage_windows","email_delivery_log","email_verification_tokens",++ "follow_import_holds","follows","frame_cache","frame_hits","identity_legacy_map","ip_log","linked_accounts",++ "mod_principal_grants",++ "mod_principals","moderation_audit","network_event_inbox","network_event_outbox",@@@ -1626,18 +1988,23 @@"oauth_clients","oauth_codes","oauth_tokens",++ "operator_alerts","password_reset_tokens","principal_grant_changes","principal_grants","principal_usage","push_subscriptions","site_settings",++ "status_incident_updates",++ "status_incidents","stream_live_announcements",++ "subject_aliases","themes","tool_domains","url_registry","user_blocks","user_effects",++ "user_follows","user_history","user_module_retirements","user_module_revisions",@@@ -1675,7 +2042,7 @@},{"file": "/opt/openvibe.tools/apps/audio/data/analytics.db",-- "bytes": 36556800,++ "bytes": 36667392,"owner": "ubuntu","tables": ["analytics_daily",@@@ -1698,18 +2065,19 @@},{"file": "/opt/openvibe.tools/apps/audio/data/jobs.db",-- "bytes": 73728,++ "bytes": 81920,"owner": "ubuntu","tables": ["event_outbox","tool_job_events","tool_job_references",++ "tool_job_usage","tool_jobs"]},{"file": "/opt/openvibe.tools/apps/docs/data/analytics.db",-- "bytes": 1081344,++ "bytes": 1114112,"owner": "ubuntu","tables": ["analytics_daily",@@@ -1732,18 +2100,19 @@},{"file": "/opt/openvibe.tools/apps/docs/data/jobs.db",-- "bytes": 65536,++ "bytes": 81920,"owner": "ubuntu","tables": ["event_outbox","tool_job_events","tool_job_references",++ "tool_job_usage","tool_jobs"]},{"file": "/opt/openvibe.tools/apps/food/data/analytics.db",-- "bytes": 331776,++ "bytes": 344064,"owner": "ubuntu","tables": ["analytics_daily",@@@ -1784,7 +2153,7 @@},{"file": "/opt/openvibe.tools/apps/img/data/analytics.db",-- "bytes": 4677632,++ "bytes": 4775936,"owner": "ubuntu","tables": ["analytics_daily",@@@ -1807,18 +2176,19 @@},{"file": "/opt/openvibe.tools/apps/img/data/jobs.db",-- "bytes": 245760,++ "bytes": 327680,"owner": "ubuntu","tables": ["event_outbox","tool_job_events","tool_job_references",++ "tool_job_usage","tool_jobs"]},{"file": "/opt/openvibe.tools/apps/maps/data/analytics.db",-- "bytes": 389120,++ "bytes": 401408,"owner": "ubuntu","tables": ["analytics_daily",@@@ -1841,7 +2211,7 @@},{"file": "/opt/openvibe.tools/apps/text/data/analytics.db",-- "bytes": 5791744,++ "bytes": 5865472,"owner": "ubuntu","tables": ["analytics_daily",@@@ -1864,7 +2234,7 @@},{"file": "/opt/openvibe.tools/apps/yt/data/analytics.db",-- "bytes": 630784,++ "bytes": 647168,"owner": "ubuntu","tables": ["analytics_daily",@@@ -1999,7 +2369,7 @@},{"file": "/var/lib/openvibe-ai/ai.db",-- "bytes": 62640128,++ "bytes": 115773440,"owner": "ubuntu","tables": ["ai_module_pushes",@@@ -2017,6 +2387,7 @@"requests","routes","runs",++ "subject_credentials","templates","usage_counters","usage_daily",@@@ -2025,7 +2396,7 @@},{"file": "/var/lib/openvibe-billing/billing.db",-- "bytes": 745472,++ "bytes": 831488,"owner": "ubuntu","tables": ["account_balances",@@@ -2204,7 +2575,7 @@},{"file": "/var/lib/openvibe-blog/blog.db",-- "bytes": 1527808,++ "bytes": 1863680,"owner": "ubuntu","tables": ["blog_feed_settings",@@@ -2235,9 +2606,10 @@},{"file": "/var/lib/openvibe-chat/chat.db",-- "bytes": 25276416,++ "bytes": 25325568,"owner": "ubuntu","tables": [++ "account_data_events","audio_requests","bridge_applied","bridge_refs",@@@ -2783,7 +3155,7 @@},{"file": "/var/lib/openvibe-codes/codes.db",-- "bytes": 102400,++ "bytes": 110592,"owner": "ubuntu","tables": ["event_outbox",@@@ -2797,9 +3169,10 @@},{"file": "/var/lib/openvibe-community/community.db",-- "bytes": 4419584,++ "bytes": 5300224,"owner": "ubuntu","tables": [++ "account_data_events","attachments","categories","comment_threads",@@@ -2807,6 +3180,7 @@"comments","community_event_inbox","event_outbox",++ "game_progress","import_hold","legacy_id_map","migration_runs",@@@ -3020,10 +3394,11 @@},{"file": "/var/lib/openvibe-events/events.db",-- "bytes": 17305600,++ "bytes": 23531520,"owner": "ubuntu","tables": ["app_revocations",++ "app_usage","consumer_checkpoints","deliveries","events",@@@ -3053,7 +3428,7 @@},{"file": "/var/lib/openvibe-news/news.db",-- "bytes": 446464,++ "bytes": 507904,"owner": "ubuntu","tables": ["event_outbox",@@@ -3113,7 +3488,7 @@},{"file": "/var/lib/openvibe-search/search.db",-- "bytes": 12021760,++ "bytes": 13271040,"owner": "ubuntu","tables": ["cdn_purges",@@@ -3228,7 +3603,7 @@},{"file": "/var/lib/openvibe-wiki/wiki.db",-- "bytes": 401408,++ "bytes": 409600,"owner": "ubuntu","tables": ["wiki_ai_proposals",@@@ -3261,8 +3636,11 @@"AI_API_KEY","AI_BASE_URL","AI_CONSOLE_SESSION_SECRET",++ "AI_CREDENTIALS_KEY","AI_ENABLED","AI_INPUT_COST_PER_MTOK",++ "AI_LOCAL_LLM_MODEL",++ "AI_LOCAL_LLM_URL","AI_MAX_COST_USD_PER_DAY","AI_MODEL","AI_OUTPUT_COST_PER_MTOK",@@@ -3450,6 +3828,7 @@"ADMIN_PASSWORD","ADMIN_USERNAME","AI_SERVICE",++ "ANALYTICS_SOURCE","BASE_URL","CALLS_AUTHORITY","CHAT_AUTHORITY",@@@ -3457,6 +3836,7 @@"EMOTES_PATH","ESCROW_HOLD_DAYS","EVENTS_URL",++ "FOLLOWS_AUTHORITY","GOLIVE_NOTIFY","HOST","INTERNAL_API_KEY",@@@ -3552,6 +3932,7 @@"ADMIN_USERNAME","BASE_URL","DB_PATH",++ "FOLLOWS_AUTHORITY","HOST","INTERNAL_API_KEY","JWT_PRIVATE_KEY",@@@ -3591,6 +3972,7 @@],"openre.env": ["EVENTS_URL",++ "HOST","MEDIA_API_KEY","MEDIA_APP_ID","MEDIA_URL",@@@ -3603,6 +3985,10 @@"OV_OAUTH_CLIENT_ID","OV_OAUTH_CLIENT_SECRET"],++ "probe-merge.env": [++ "PROBE_MERGE_FOLD_PW",++ "PROBE_MERGE_KEEP_PW"++ ],"probe.env": ["OV_OAUTH_CLIENT_ID","OV_OAUTH_CLIENT_SECRET"@@@ -3667,6 +4053,7 @@"OV_NETWORK_URL","OV_OAUTH_CLIENT_ID","OV_OAUTH_CLIENT_SECRET",++ "RIDB_API_KEY","SEARCH_URL","TOOLS_EVENTS_SECRET","TOOLS_JOB_RESULTS"@@@ -2163,10 +2163,10 @@{"id": "D39","title": "Mods",-- "owner": "OpenVibe.Games (registry, grants and runtime today); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Network (planned mod grants); OpenVibe.Host (Stage C sandbox)",++ "owner": "OpenVibe.Games (registry, runtime, the hot path's copy of grants); OpenVibe.Network (mod principals and grants, mods.grant.manage); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Host (Stage C sandbox)","target": "mod manifests, capabilities, quotas, runtime adapters","status": "partial",-- "summary": "The mod manifest (Contracts mods/mod-manifest.v1, ADR-013 accepted 2026-09-23) and a Games-local registry are tested: grants are the approved subset, installs and grants are audited, and revoking a mod removes its effect on the next tick and across a restart. Only declarative games-content packs run. Executable runtimes are refused, and the CPU budget is metered and audited but not enforced. Network's mods.grant.manage capability is still `planned`, and on 2026-09-23 at 20:22 UTC production world.db held 0 mods, 0 grants and 0 audit rows.",++ "summary": "The mod manifest (Contracts mods/mod-manifest.v1, ADR-013) and the Games registry are tested. Since 2026-09-27 every install is a Network principal mod:<id> whose grants Network holds (mods.grant.manage active; Games asks Network first, and network.mod.grants_changed keeps its copy current). The budget is enforced: 5 reconciles over cpuMs, or 3 minutes over 60 effects a minute, disable only the offending mod. Security tests cover namespace escape, event flood, resource budget and forged ownership. One production install -> grant -> use -> revoke run is recorded. Only declarative games-content packs run; executable runtimes wait for Host Stage C.","artifacts": [{"kind": "test",@@@ -2193,23 +2193,40 @@"kind": "doc","repo": "OpenVibe.Contracts","path": "manifests/capabilities/mods.grant.manage.json",-- "contains": "Until Network implements it, each runtime keeps the approved subset itself",-- "proves": "Network-side mod principals and grants are not implemented: the status is planned and implementedBy is empty."++ "contains": "\"status\": \"active\"",++ "proves": "Network implements mod principals and grants: the capability is active."++ },++ {++ "kind": "test",++ "repo": "OpenVibe.Network",++ "path": "test/mod-principals.test.js",++ "contains": "another runtime can neither register nor change it",++ "proves": "An install registers mod:<id> with the approved subset of what its manifest requests; the registering runtime owns it; staff changes carry a reason and an audit row; every change is announced with the complete approved set."++ },++ {++ "kind": "test",++ "repo": "OpenVibe.Games",++ "path": "apps/server/src/mods/security.test.ts",++ "contains": "forged ownership",++ "proves": "Namespace escape, event flood, resource budget and forged ownership: a flooding or over-budget mod is disabled while the others run; props are always the mod's."++ },++ {++ "kind": "test",++ "repo": "OpenVibe.Games",++ "path": "apps/server/src/mods/networkGrants.test.ts",++ "contains": "installs with what Network approved",++ "proves": "The mods API asks Network first and applies only its answer; an older grants_changed revision changes nothing."},{"kind": "prod",-- "check": "ssh openvibe-ovh 'db=/opt/openvibe.games/data/world.db; sudo -n -u \"$(stat -c %U $db)\" sqlite3 -readonly $db \"SELECT count(*) FROM mods\"' (also mod_grants, mod_audit); curl -s http://127.0.0.1:8000/api/v1/mods",-- "observed": "mods 0, mod_grants 0, mod_audit 0; /api/v1/mods -> {\"mods\":[]}",-- "at": "2026-09-23T20:22Z",-- "proves": "No mod has ever been installed, granted, used or revoked in production."++ "check": "ssh openvibe-ovh: sudo sh -c '. /etc/openvibe/probe.env; cd /opt/openvibe.games && node --import tsx apps/server/scripts/modLifecycleProof.ts'",++ "observed": "install 201 -> grant 200 -> use (prop placed) -> revoke 200 -> retract; the Network principal ended revoked with three network.mod.grants_changed events",++ "at": "2026-09-27T23:45Z",++ "proves": "One production install -> grant -> use -> revoke run with audit rows."}],"remaining": [-- "Network-side mod principals and grants (capability mods.grant.manage, still planned with implementedBy []): an install should create a mod:<id> principal whose grants Network checks, as ADR-013 decides",-- "Quotas: the manifest's resource budget is only metered and audited in Games (runtime.ts budget_exceeded, with no test). Still to do: enforce it, prove that a budget breach terminates only the offending mod, and add an event-flood throttle, each with tests (roadmap §20 Mods)",-- "Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C",-- "The §20 Mods acceptance tests still missing: namespace escape denied, and no forged Billing or Media ownership",-- "One production install -> grant -> use -> revoke run with audit rows (production has 0 mods)"++ "Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C"],"blockedOn": null,"ownerReview": false@@@ -1,36 +1,36 @@{"generatedFrom": {-- "OpenVibe.Live": "8caa540466f9af86247febdbba1339b68919a42f",-- "OpenVibe.Network": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",-- "OpenVibe.Shared": "dbf9d39750e9f0dd0f19d8571d278eb303f3b83f",-- "OpenVibe.Media": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",-- "OpenVibe.Tools": "168e5110d062f076c2c4afe88e3fc3c53ab44613",-- "OpenVibe.Community": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",-- "OpenVibe.Games": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",-- "OpenVibe.Sites": "3802ee3d9ada9b8490134ece350420e627866a8c",-- "OpenVibe.Events": "eb98f8cad2a738fec45f1c10e373081532c83e91",-- "OpenVibe.Chat": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",-- "OpenRe.Stream": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",-- "OpenVibe.Billing": "180e246a3a344c062f1c7435303f4aa748f17046",-- "OpenVibe.Tips": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",-- "OpenVibe.VIP": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",-- "OpenVibe.AI": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",-- "OpenVibe.Search": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",-- "OpenVibe.Sources": "29cd386241c44456ffcebf70b6be287fa9a08aaa",-- "OpenVibe.Wiki": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",-- "OpenVibe.Blog": "79e9e153ca1308311993a31295fd471a8becaf8d",-- "OpenVibe.News": "0860cf20dd3d8e8032caad300e0ce90497195b96",-- "OpenVibe.Reviews": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",-- "OpenVibe.Deals": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",-- "OpenVibe.Coupons": "348f585cd6549a5c506171fba0fc2c5462dede32",-- "OpenVibe.Trade": "fa382881cd92ee90b6329699d7d79129e32a6325",-- "OpenVibe.Codes": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",-- "OpenVibe.Host": "75147890e32dd63fd1363f843c87415f90d5b2dd",-- "OpenVibe.Examples": "36901ffc052752754608df8764a9f2942069da9a"++ "OpenVibe.Live": "03f49b7716b7cee1cce8a44e7155aeb96a67d004",++ "OpenVibe.Network": "5a50c12a83f6501aacd663f15d3c06c718a4c83a",++ "OpenVibe.Shared": "b5a9bd77171fcf75f42ff33fe86b7ad06baac1c8",++ "OpenVibe.Media": "14cac06886649848c332cfa564aa6b3594ea09bc",++ "OpenVibe.Tools": "4f4ed6e8f3f3c8e1a83dd644dd3c0659a7bccce4",++ "OpenVibe.Community": "2da3501e28457fa4978c0bc4a1b3bfc9188b77b9",++ "OpenVibe.Games": "eb2d00880d3231b2c68cb1753b4542044edef1e5",++ "OpenVibe.Sites": "304e8b12b535f4b562f23027ae84f1a5d515cc6c",++ "OpenVibe.Events": "19919ece79707eed051c3f18ab37b7fdb6d939a6",++ "OpenVibe.Chat": "d87c8d3c906ad52ef8bf123ce60373fdefcf09e6",++ "OpenRe.Stream": "c77ec2a9a1e350fb4ae1c646ec74693fae4f2fa3",++ "OpenVibe.Billing": "f24684bb84ec1670bd08670891e6742fa433a548",++ "OpenVibe.Tips": "13986b59e697d12a328a4f12e993295445ca40be",++ "OpenVibe.VIP": "95b3e196daa152c2e7f8e940a1f02b7fe32706ba",++ "OpenVibe.AI": "6c8b8338be936cbd3a6f50dee3f790807f145a0e",++ "OpenVibe.Search": "e8511d849720534a9ffcd54b052663111e5b1e6f",++ "OpenVibe.Sources": "167085388a637eed3f0d47b3c6eabb8c9d00814d",++ "OpenVibe.Wiki": "3302540e8b5fdf3c07db9fce688be2f4ab8b847b",++ "OpenVibe.Blog": "8a7f8ebe862b0e1c0bb119ee96c42f38fc0e5321",++ "OpenVibe.News": "97dae43a2d41c5528bbb4c93ff2ea7ea456203dd",++ "OpenVibe.Reviews": "c87b34440b0d50bc2cdf6c136775002ed9080c1e",++ "OpenVibe.Deals": "533450f9cc4a358ba50f353f06826ec3611b4ddc",++ "OpenVibe.Coupons": "b91cd795e8ee4a3e49317a6e3cb000fa92da9325",++ "OpenVibe.Trade": "273bce7b1b8771037bc2a660fa8784dc1aa049a7",++ "OpenVibe.Codes": "7d6f65ac198d95f70ac840c24d03d1407affb7a9",++ "OpenVibe.Host": "6d2aaaa630e29d2bfd261a7f75cbbbaa2b8c1d46",++ "OpenVibe.Examples": "92eb7c3b0f50fea9f76086ed3eeda3664de93494"},"prodSnapshot": {"host": "openvibe-oregon",-- "collectedAt": "2026-09-26T13:29:03.103Z"++ "collectedAt": "2026-09-28T03:25:35.860Z"},"repos": [{@@@ -38,18 +38,18 @@"service": "live","present": true,"git": {-- "head": "8caa540466f9af86247febdbba1339b68919a42f",++ "head": "03f49b7716b7cee1cce8a44e7155aeb96a67d004","branch": "main",-- "originMain": "8caa540466f9af86247febdbba1339b68919a42f",-- "committedAt": "2026-09-26T06:22:32-07:00"++ "originMain": "03f49b7716b7cee1cce8a44e7155aeb96a67d004",++ "committedAt": "2026-09-27T20:24:58-07:00"},-- "sourceFiles": 210,-- "loc": 74897,++ "sourceFiles": 221,++ "loc": 75126,"tables": [{"table": "arena_profiles","file": "server/arena/arena-service.js",-- "line": 83,++ "line": 82,"via": "repo"},{@@@ -88,6 +88,12 @@"line": 54,"via": "repo"},++ {++ "table": "account_data_events",++ "file": "server/auth/account-data.js",++ "line": 51,++ "via": "repo"++ },{"table": "module_summary_pushes","file": "server/auth/module-summaries.js",@@@ -100,6 +106,12 @@"line": 19,"via": "repo"},++ {++ "table": "subject_merges",++ "file": "server/auth/subject-merge.js",++ "line": 25,++ "via": "repo"++ },{"table": "subject_projection","file": "server/auth/subject-projection.js",@@@ -295,235 +307,235 @@{"table": "app_state","file": "server/db/database.js",-- "line": 1196,++ "line": 1191,"via": "repo"},{"table": "stream_memories","file": "server/db/database.js",-- "line": 1210,++ "line": 1205,"via": "repo"},{"table": "stream_timeline_events","file": "server/db/database.js",-- "line": 1259,++ "line": 1254,"via": "repo"},{"table": "ai_usage","file": "server/db/database.js",-- "line": 1284,++ "line": 1279,"via": "repo"},{"table": "streamer_overviews","file": "server/db/database.js",-- "line": 1304,++ "line": 1299,"via": "repo"},{"table": "ai_timeline_cache","file": "server/db/database.js",-- "line": 1326,++ "line": 1321,"via": "repo"},{"table": "chat_ai_summaries","file": "server/db/database.js",-- "line": 1338,++ "line": 1333,"via": "repo"},{"table": "chat_timeline_events","file": "server/db/database.js",-- "line": 1358,++ "line": 1353,"via": "repo"},{"table": "easter_egg_solves","file": "server/db/database.js",-- "line": 1370,++ "line": 1365,"via": "repo"},{"table": "tts_voice_overrides","file": "server/db/database.js",-- "line": 1382,++ "line": 1377,"via": "repo"},{"table": "relay_users","file": "server/db/database.js",-- "line": 1495,++ "line": 1490,"via": "repo"},{"table": "payment_orders","file": "server/db/database.js",-- "line": 1590,++ "line": 1585,"via": "repo"},{"table": "channel_moderators","file": "server/db/database.js",-- "line": 1623,++ "line": 1618,"via": "repo"},{"table": "channel_moderation_settings","file": "server/db/database.js",-- "line": 1640,++ "line": 1635,"via": "repo"},{"table": "emotes_new","file": "server/db/database.js",-- "line": 1713,++ "line": 1708,"via": "repo"},{"table": "channel_sounds","file": "server/db/database.js",-- "line": 1745,++ "line": 1740,"via": "repo"},{"table": "channel_sounds_new","file": "server/db/database.js",-- "line": 1769,++ "line": 1764,"via": "repo"},{"table": "ai_chatbot_configs","file": "server/db/database.js",-- "line": 1807,++ "line": 1802,"via": "repo"},{"table": "channel_ai_bots","file": "server/db/database.js",-- "line": 1832,++ "line": 1827,"via": "repo"},{"table": "channel_ai_config","file": "server/db/database.js",-- "line": 1856,++ "line": 1851,"via": "repo"},{"table": "ai_viewer_threads","file": "server/db/database.js",-- "line": 1877,++ "line": 1874,"via": "repo"},{"table": "ai_viewer_log","file": "server/db/database.js",-- "line": 1891,++ "line": 1888,"via": "repo"},{"table": "moderation_actions","file": "server/db/database.js",-- "line": 1924,++ "line": 1921,"via": "repo"},{"table": "pastes","file": "server/db/database.js",-- "line": 1943,++ "line": 1940,"via": "repo"},{"table": "paste_likes","file": "server/db/database.js",-- "line": 1980,++ "line": 1977,"via": "repo"},{"table": "paste_comments","file": "server/db/database.js",-- "line": 2012,++ "line": 2009,"via": "repo"},{"table": "stream_first_chats","file": "server/db/database.js",-- "line": 2044,++ "line": 2041,"via": "repo"},{"table": "ip_log","file": "server/db/database.js",-- "line": 2055,++ "line": 2052,"via": "repo"},{"table": "approved_ips","file": "server/db/database.js",-- "line": 2079,++ "line": 2076,"via": "repo"},{"table": "pending_ip_messages","file": "server/db/database.js",-- "line": 2096,++ "line": 2093,"via": "repo"},{"table": "hidden_relay_users","file": "server/db/database.js",-- "line": 2116,++ "line": 2113,"via": "repo"},{"table": "control_whitelist","file": "server/db/database.js",-- "line": 2274,++ "line": 2271,"via": "repo"},{"table": "control_configs","file": "server/db/database.js",-- "line": 2289,++ "line": 2286,"via": "repo"},{"table": "control_config_buttons","file": "server/db/database.js",-- "line": 2303,++ "line": 2300,"via": "repo"},{"table": "stream_controls_new","file": "server/db/database.js",-- "line": 2382,++ "line": 2379,"via": "repo"},{"table": "managed_streams","file": "server/db/database.js",-- "line": 2417,++ "line": 2414,"via": "repo"},{"table": "vibe_coding_sessions","file": "server/db/database.js",-- "line": 2639,++ "line": 2636,"via": "repo"},{"table": "vibe_coding_events","file": "server/db/database.js",-- "line": 2674,++ "line": 2671,"via": "repo"},{"table": "viewer_samples","file": "server/db/database.js",-- "line": 3861,++ "line": 3868,"via": "repo"},{@@@ -805,7 +817,13 @@{"table": "translations","file": "server/i18n/translate.js",-- "line": 147,++ "line": 148,++ "via": "repo"++ },++ {++ "table": "lineage_unresolved",++ "file": "server/lineage/unresolved.js",++ "line": 26,"via": "repo"},{@@@ -850,6 +868,12 @@"line": 27,"via": "repo"},++ {++ "table": "follow_projection_revisions",++ "file": "server/social/network-follows.js",++ "line": 63,++ "via": "repo"++ },{"table": "tips_deliveries","file": "server/tips/delivery-routes.js",@@@ -874,7 +898,7 @@"method": "GET","path": "/api/admin/admins","file": "server/admin/routes.js",-- "line": 841,++ "line": 848,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -884,7 +908,7 @@"method": "POST","path": "/api/admin/admins","file": "server/admin/routes.js",-- "line": 851,++ "line": 858,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -894,7 +918,7 @@"method": "DELETE","path": "/api/admin/admins/:id","file": "server/admin/routes.js",-- "line": 870,++ "line": 877,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -904,7 +928,7 @@"method": "GET","path": "/api/admin/ai/explorer/:userId","file": "server/admin/routes.js",-- "line": 582,++ "line": 589,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -914,7 +938,7 @@"method": "GET","path": "/api/admin/ai/overviews","file": "server/admin/routes.js",-- "line": 619,++ "line": 626,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -924,7 +948,7 @@"method": "GET","path": "/api/admin/ai/status","file": "server/admin/routes.js",-- "line": 571,++ "line": 578,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -934,7 +958,7 @@"method": "POST","path": "/api/admin/ai/streamer/:userId/overview","file": "server/admin/routes.js",-- "line": 628,++ "line": 635,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -944,7 +968,7 @@"method": "GET","path": "/api/admin/ai/usage","file": "server/admin/routes.js",-- "line": 524,++ "line": 531,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -954,7 +978,7 @@"method": "POST","path": "/api/admin/ai/viewers/:userId/:action","file": "server/admin/routes.js",-- "line": 552,++ "line": 559,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -964,7 +988,7 @@"method": "GET","path": "/api/admin/ai/viewers/:userId/log","file": "server/admin/routes.js",-- "line": 562,++ "line": 569,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -974,7 +998,7 @@"method": "GET","path": "/api/admin/ai/viewers/status","file": "server/admin/routes.js",-- "line": 534,++ "line": 541,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -984,7 +1008,7 @@"method": "GET","path": "/api/admin/analytics","file": "server/index.js",-- "line": 732,++ "line": 745,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -994,7 +1018,7 @@"method": "GET","path": "/api/admin/analytics/bots","file": "server/index.js",-- "line": 741,++ "line": 754,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1004,7 +1028,7 @@"method": "GET","path": "/api/admin/bans","file": "server/admin/routes.js",-- "line": 431,++ "line": 438,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1014,7 +1038,7 @@"method": "POST","path": "/api/admin/broadcast","file": "server/index.js",-- "line": 853,++ "line": 866,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1024,7 +1048,7 @@"method": "PUT","path": "/api/admin/channels/:id/force-nsfw","file": "server/admin/routes.js",-- "line": 372,++ "line": 379,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1034,7 +1058,7 @@"method": "GET","path": "/api/admin/config","file": "server/admin/routes.js",-- "line": 755,++ "line": 762,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1044,7 +1068,7 @@"method": "GET","path": "/api/admin/config/:namespace","file": "server/admin/routes.js",-- "line": 756,++ "line": 763,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1054,7 +1078,7 @@"method": "GET","path": "/api/admin/config/:namespace/history","file": "server/admin/routes.js",-- "line": 757,++ "line": 764,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1064,7 +1088,7 @@"method": "POST","path": "/api/admin/config/:namespace/rollback","file": "server/admin/routes.js",-- "line": 758,++ "line": 765,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1074,7 +1098,17 @@"method": "GET","path": "/api/admin/diagnostics","file": "server/admin/routes.js",-- "line": 55,++ "line": 62,++ "target": "OpenVibe.Live",++ "disposition": "keep",++ "wave": "-",++ "note": "Live product surface. AI features call OpenVibe.AI (AI_SERVICE=remote); coins/cosmetics are loyalty and cosmetic entitlements (ADR-012); /api/media is the chat media-request queue."++ },++ {++ "method": "GET",++ "path": "/api/admin/lineage/unresolved",++ "file": "server/admin/routes.js",++ "line": 56,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1084,7 +1118,7 @@"method": "DELETE","path": "/api/admin/media-tools/cookies","file": "server/admin/routes.js",-- "line": 1296,++ "line": 1302,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1094,7 +1128,7 @@"method": "PUT","path": "/api/admin/media-tools/cookies","file": "server/admin/routes.js",-- "line": 1215,++ "line": 1221,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1104,7 +1138,7 @@"method": "POST","path": "/api/admin/media-tools/cookies/check","file": "server/admin/routes.js",-- "line": 1274,++ "line": 1280,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1114,7 +1148,7 @@"method": "DELETE","path": "/api/admin/media-tools/extra-args","file": "server/admin/routes.js",-- "line": 1329,++ "line": 1335,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1124,7 +1158,7 @@"method": "PUT","path": "/api/admin/media-tools/extra-args","file": "server/admin/routes.js",-- "line": 1310,++ "line": 1316,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1134,7 +1168,7 @@"method": "GET","path": "/api/admin/media-tools/status","file": "server/admin/routes.js",-- "line": 1170,++ "line": 1176,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1144,7 +1178,7 @@"method": "POST","path": "/api/admin/media-tools/test","file": "server/admin/routes.js",-- "line": 1340,++ "line": 1346,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1154,7 +1188,7 @@"method": "GET","path": "/api/admin/moderators","file": "server/admin/routes.js",-- "line": 776,++ "line": 783,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1164,7 +1198,7 @@"method": "POST","path": "/api/admin/moderators","file": "server/admin/routes.js",-- "line": 788,++ "line": 795,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1174,7 +1208,7 @@"method": "DELETE","path": "/api/admin/moderators/:id","file": "server/admin/routes.js",-- "line": 815,++ "line": 822,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1184,7 +1218,7 @@"method": "GET","path": "/api/admin/money","file": "server/admin/routes.js",-- "line": 485,++ "line": 492,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1194,7 +1228,7 @@"method": "POST","path": "/api/admin/money/actions/:id/resolve","file": "server/admin/routes.js",-- "line": 499,++ "line": 506,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1204,7 +1238,7 @@"method": "POST","path": "/api/admin/money/freeze","file": "server/admin/routes.js",-- "line": 493,++ "line": 500,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1234,7 +1268,7 @@"method": "GET","path": "/api/admin/settings","file": "server/admin/routes.js",-- "line": 512,++ "line": 519,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1244,7 +1278,7 @@"method": "PUT","path": "/api/admin/settings","file": "server/admin/routes.js",-- "line": 647,++ "line": 654,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1254,7 +1288,7 @@"method": "DELETE","path": "/api/admin/settings/:key","file": "server/admin/routes.js",-- "line": 732,++ "line": 739,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1264,7 +1298,7 @@"method": "PUT","path": "/api/admin/settings/:key","file": "server/admin/routes.js",-- "line": 712,++ "line": 719,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1274,7 +1308,7 @@"method": "GET","path": "/api/admin/stats","file": "server/admin/routes.js",-- "line": 67,++ "line": 74,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1284,7 +1318,7 @@"method": "GET","path": "/api/admin/storage","file": "server/admin/routes.js",-- "line": 1014,++ "line": 1021,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1294,7 +1328,7 @@"method": "DELETE","path": "/api/admin/storage/clips/bulk","file": "server/admin/routes.js",-- "line": 1120,++ "line": 1127,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1304,7 +1338,7 @@"method": "GET","path": "/api/admin/storage/vods","file": "server/admin/routes.js",-- "line": 1070,++ "line": 1077,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1314,7 +1348,7 @@"method": "DELETE","path": "/api/admin/storage/vods/bulk","file": "server/admin/routes.js",-- "line": 1089,++ "line": 1096,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1324,7 +1358,7 @@"method": "GET","path": "/api/admin/streams","file": "server/admin/routes.js",-- "line": 307,++ "line": 314,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1334,7 +1368,7 @@"method": "DELETE","path": "/api/admin/streams/:id","file": "server/admin/routes.js",-- "line": 326,++ "line": 333,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1344,7 +1378,7 @@"method": "PUT","path": "/api/admin/streams/:id/nsfw","file": "server/admin/routes.js",-- "line": 420,++ "line": 427,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1354,7 +1388,7 @@"method": "GET","path": "/api/admin/users","file": "server/admin/routes.js",-- "line": 121,++ "line": 128,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1364,7 +1398,7 @@"method": "PUT","path": "/api/admin/users/:id","file": "server/admin/routes.js",-- "line": 160,++ "line": 167,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1374,7 +1408,7 @@"method": "DELETE","path": "/api/admin/users/:id/ban","file": "server/admin/routes.js",-- "line": 288,++ "line": 295,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1384,7 +1418,7 @@"method": "POST","path": "/api/admin/users/:id/ban","file": "server/admin/routes.js",-- "line": 250,++ "line": 257,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1394,7 +1428,7 @@"method": "PUT","path": "/api/admin/users/:id/force-vod-recording","file": "server/admin/routes.js",-- "line": 389,++ "line": 396,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1404,7 +1438,7 @@"method": "GET","path": "/api/admin/verification-keys","file": "server/admin/routes.js",-- "line": 892,++ "line": 899,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1414,7 +1448,7 @@"method": "POST","path": "/api/admin/verification-keys","file": "server/admin/routes.js",-- "line": 902,++ "line": 909,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1424,7 +1458,7 @@"method": "DELETE","path": "/api/admin/verification-keys/:id","file": "server/admin/routes.js",-- "line": 945,++ "line": 952,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1434,7 +1468,7 @@"method": "GET","path": "/api/admin/vpn-queue","file": "server/admin/routes.js",-- "line": 447,++ "line": 454,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1444,7 +1478,7 @@"method": "PUT","path": "/api/admin/vpn-queue/:id","file": "server/admin/routes.js",-- "line": 463,++ "line": 470,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1454,7 +1488,7 @@"method": "POST","path": "/api/ai-viewers/${cmd}","file": "server/ai/viewers/routes.js",-- "line": 117,++ "line": 118,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1464,7 +1498,7 @@"method": "DELETE","path": "/api/ai-viewers/bots/:id","file": "server/ai/viewers/routes.js",-- "line": 220,++ "line": 238,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1474,7 +1508,7 @@"method": "PATCH","path": "/api/ai-viewers/bots/:id","file": "server/ai/viewers/routes.js",-- "line": 185,++ "line": 203,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1484,7 +1518,7 @@"method": "POST","path": "/api/ai-viewers/bots/:id/clear-memory","file": "server/ai/viewers/routes.js",-- "line": 209,++ "line": 227,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1494,7 +1528,7 @@"method": "POST","path": "/api/ai-viewers/bots/:id/mute","file": "server/ai/viewers/routes.js",-- "line": 122,++ "line": 123,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1504,7 +1538,7 @@"method": "POST","path": "/api/ai-viewers/bots/:id/unmute","file": "server/ai/viewers/routes.js",-- "line": 123,++ "line": 124,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1514,7 +1548,7 @@"method": "POST","path": "/api/ai-viewers/byo/test","file": "server/ai/viewers/routes.js",-- "line": 124,++ "line": 125,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1524,7 +1558,7 @@"method": "POST","path": "/api/ai-viewers/clone","file": "server/ai/viewers/routes.js",-- "line": 233,++ "line": 251,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1534,7 +1568,7 @@"method": "GET","path": "/api/ai-viewers/config","file": "server/ai/viewers/routes.js",-- "line": 82,++ "line": 83,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1544,7 +1578,7 @@"method": "PUT","path": "/api/ai-viewers/config","file": "server/ai/viewers/routes.js",-- "line": 134,++ "line": 145,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1554,7 +1588,7 @@"method": "GET","path": "/api/ai-viewers/log","file": "server/ai/viewers/routes.js",-- "line": 106,++ "line": 107,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1564,7 +1598,7 @@"method": "POST","path": "/api/ai-viewers/preview","file": "server/ai/viewers/routes.js",-- "line": 282,++ "line": 300,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1574,7 +1608,7 @@"method": "GET","path": "/api/ai-viewers/roster","file": "server/ai/viewers/routes.js",-- "line": 167,++ "line": 185,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1584,7 +1618,7 @@"method": "GET","path": "/api/ai-viewers/status","file": "server/ai/viewers/routes.js",-- "line": 99,++ "line": 100,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1594,7 +1628,7 @@"method": "GET","path": "/api/ai-viewers/threads","file": "server/ai/viewers/routes.js",-- "line": 112,++ "line": 113,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1614,7 +1648,7 @@"method": "GET","path": "/api/analytics/channel/:username/dashboard","file": "server/streaming/analytics-routes.js",-- "line": 157,++ "line": 158,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1624,7 +1658,7 @@"method": "GET","path": "/api/analytics/channel/:username/streams","file": "server/streaming/analytics-routes.js",-- "line": 58,++ "line": 59,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -1634,7 +1668,7 @@"method": "GET","path": "/api/analytics/stream/:id","file": "server/streaming/analytics-routes.js",-- "line": 97,++ "line": 98,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -2134,7 +2168,7 @@"method": "GET","path": "/api/chat-ai/live-captions/:username","file": "server/ai/chat-ai-routes.js",-- "line": 236,++ "line": 235,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -2164,7 +2198,7 @@"method": "GET","path": "/api/chat-ai/timeline/:username","file": "server/ai/chat-ai-routes.js",-- "line": 174,++ "line": 173,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -2174,7 +2208,7 @@"method": "GET","path": "/api/chat-ai/transcript/:streamId","file": "server/ai/chat-ai-routes.js",-- "line": 335,++ "line": 334,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -2194,7 +2228,7 @@"method": "GET","path": "/api/chat-ai/vod-transcripts","file": "server/ai/chat-ai-routes.js",-- "line": 273,++ "line": 272,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -2414,7 +2448,7 @@"method": "GET","path": "/api/clips","file": "server/media-proxy/clips.js",-- "line": 181,++ "line": 182,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2424,7 +2458,7 @@"method": "DELETE","path": "/api/clips/:id","file": "server/media-proxy/clips.js",-- "line": 358,++ "line": 359,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2434,7 +2468,7 @@"method": "GET","path": "/api/clips/:id","file": "server/media-proxy/clips.js",-- "line": 210,++ "line": 211,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2444,7 +2478,7 @@"method": "GET","path": "/api/clips/:id/job","file": "server/media-proxy/clips.js",-- "line": 396,++ "line": 397,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2454,7 +2488,7 @@"method": "POST","path": "/api/clips/:id/recut","file": "server/media-proxy/clips.js",-- "line": 377,++ "line": 378,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2464,7 +2498,7 @@"method": "PUT","path": "/api/clips/:id/title","file": "server/media-proxy/clips.js",-- "line": 292,++ "line": 293,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2474,7 +2508,7 @@"method": "PUT","path": "/api/clips/:id/visibility","file": "server/media-proxy/clips.js",-- "line": 309,++ "line": 310,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2484,7 +2518,7 @@"method": "POST","path": "/api/clips/bulk","file": "server/media-proxy/clips.js",-- "line": 333,++ "line": 334,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2494,7 +2528,7 @@"method": "GET","path": "/api/clips/mine","file": "server/media-proxy/clips.js",-- "line": 123,++ "line": 124,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2504,7 +2538,7 @@"method": "GET","path": "/api/clips/my-stream","file": "server/media-proxy/clips.js",-- "line": 141,++ "line": 142,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2514,7 +2548,7 @@"method": "GET","path": "/api/clips/settings/channel","file": "server/media-proxy/clips.js",-- "line": 159,++ "line": 160,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -2524,7 +2558,7 @@"method": "PUT","path": "/api/clips/settings/channel","file": "server/media-proxy/clips.js",-- "line": 168,++ "line": 169,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -3094,7 +3128,7 @@"method": "POST","path": "/api/csp-report","file": "server/index.js",-- "line": 874,++ "line": 887,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -3594,7 +3628,7 @@"method": "GET","path": "/api/health","file": "server/index.js",-- "line": 751,++ "line": 764,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -3744,7 +3778,7 @@"method": "GET","path": "/api/live-events","file": "server/index.js",-- "line": 670,++ "line": 683,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -4784,7 +4818,7 @@"method": "GET","path": "/api/ready","file": "server/index.js",-- "line": 792,++ "line": 805,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5154,7 +5188,7 @@"method": "GET","path": "/api/streams","file": "server/streaming/routes.js",-- "line": 1129,++ "line": 1140,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5164,7 +5198,7 @@"method": "POST","path": "/api/streams","file": "server/streaming/routes.js",-- "line": 1960,++ "line": 1971,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5174,7 +5208,7 @@"method": "DELETE","path": "/api/streams/:id","file": "server/streaming/routes.js",-- "line": 2155,++ "line": 2166,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5184,7 +5218,7 @@"method": "GET","path": "/api/streams/:id","file": "server/streaming/routes.js",-- "line": 1912,++ "line": 1923,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5194,7 +5228,7 @@"method": "PUT","path": "/api/streams/:id","file": "server/streaming/routes.js",-- "line": 2104,++ "line": 2115,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5204,7 +5238,7 @@"method": "GET","path": "/api/streams/:id/call","file": "server/streaming/routes.js",-- "line": 2474,++ "line": 2491,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5214,7 +5248,7 @@"method": "PUT","path": "/api/streams/:id/call","file": "server/streaming/routes.js",-- "line": 2435,++ "line": 2452,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5224,7 +5258,7 @@"method": "GET","path": "/api/streams/:id/endpoint","file": "server/streaming/routes.js",-- "line": 2202,++ "line": 2213,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5234,7 +5268,7 @@"method": "POST","path": "/api/streams/:id/follow","file": "server/streaming/routes.js",-- "line": 2343,++ "line": 2354,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5244,7 +5278,7 @@"method": "POST","path": "/api/streams/:id/heartbeat","file": "server/streaming/routes.js",-- "line": 2300,++ "line": 2311,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5254,7 +5288,7 @@"method": "GET","path": "/api/streams/:id/rtmp-status","file": "server/streaming/routes.js",-- "line": 2318,++ "line": 2329,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5264,7 +5298,7 @@"method": "GET","path": "/api/streams/broadcast-settings","file": "server/streaming/routes.js",-- "line": 1429,++ "line": 1440,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5274,7 +5308,7 @@"method": "PUT","path": "/api/streams/broadcast-settings","file": "server/streaming/routes.js",-- "line": 1446,++ "line": 1457,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5344,7 +5378,17 @@"method": "POST","path": "/api/streams/channel/:username/follow","file": "server/streaming/routes.js",-- "line": 2388,++ "line": 2402,++ "target": "OpenVibe.Live",++ "disposition": "keep",++ "wave": "-",++ "note": "Live product surface. AI features call OpenVibe.AI (AI_SERVICE=remote); coins/cosmetics are loyalty and cosmetic entitlements (ADR-012); /api/media is the chat media-request queue."++ },++ {++ "method": "GET",++ "path": "/api/streams/channel/:username/game",++ "file": "server/streaming/routes.js",++ "line": 1020,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5374,7 +5418,7 @@"method": "GET","path": "/api/streams/channel/:username/resolve/:ref","file": "server/streaming/routes.js",-- "line": 1468,++ "line": 1479,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5384,7 +5428,7 @@"method": "GET","path": "/api/streams/channel/:username/weather","file": "server/streaming/routes.js",-- "line": 1018,++ "line": 1029,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5404,7 +5448,7 @@"method": "POST","path": "/api/streams/diag-log","file": "server/streaming/routes.js",-- "line": 2293,++ "line": 2304,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5424,7 +5468,7 @@"method": "GET","path": "/api/streams/managed","file": "server/streaming/routes.js",-- "line": 1630,++ "line": 1641,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5434,7 +5478,7 @@"method": "POST","path": "/api/streams/managed","file": "server/streaming/routes.js",-- "line": 1642,++ "line": 1653,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5444,7 +5488,7 @@"method": "DELETE","path": "/api/streams/managed/:id","file": "server/streaming/routes.js",-- "line": 1856,++ "line": 1867,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5454,7 +5498,7 @@"method": "PUT","path": "/api/streams/managed/:id","file": "server/streaming/routes.js",-- "line": 1696,++ "line": 1707,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5464,7 +5508,7 @@"method": "POST","path": "/api/streams/managed/:id/regenerate-key","file": "server/streaming/routes.js",-- "line": 1881,++ "line": 1892,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5474,7 +5518,7 @@"method": "GET","path": "/api/streams/managed/:managedStreamId/history","file": "server/streaming/routes.js",-- "line": 1502,++ "line": 1513,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5484,7 +5528,7 @@"method": "GET","path": "/api/streams/managed/:managedStreamId/profile","file": "server/streaming/routes.js",-- "line": 1523,++ "line": 1534,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5494,7 +5538,7 @@"method": "GET","path": "/api/streams/mine","file": "server/streaming/routes.js",-- "line": 1165,++ "line": 1176,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5514,7 +5558,7 @@"method": "GET","path": "/api/streams/recent","file": "server/streaming/routes.js",-- "line": 1177,++ "line": 1188,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5524,7 +5568,7 @@"method": "GET","path": "/api/streams/recent-vods","file": "server/streaming/routes.js",-- "line": 1248,++ "line": 1259,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5534,7 +5578,7 @@"method": "GET","path": "/api/streams/recently-online","file": "server/streaming/routes.js",-- "line": 1194,++ "line": 1205,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5544,7 +5588,7 @@"method": "GET","path": "/api/streams/rtmp-proxy/:streamId.flv","file": "server/streaming/routes.js",-- "line": 2495,++ "line": 2512,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5554,7 +5598,7 @@"method": "GET","path": "/api/streams/setup-progress","file": "server/streaming/routes.js",-- "line": 1575,++ "line": 1586,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5564,7 +5608,7 @@"method": "GET","path": "/api/streams/voice-channels","file": "server/streaming/routes.js",-- "line": 1278,++ "line": 1289,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5574,7 +5618,7 @@"method": "POST","path": "/api/streams/voice-channels","file": "server/streaming/routes.js",-- "line": 1299,++ "line": 1310,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5584,7 +5628,7 @@"method": "DELETE","path": "/api/streams/voice-channels/:channelId","file": "server/streaming/routes.js",-- "line": 1311,++ "line": 1322,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5594,7 +5638,7 @@"method": "GET","path": "/api/streams/voice-channels/:channelId","file": "server/streaming/routes.js",-- "line": 1288,++ "line": 1299,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5604,7 +5648,7 @@"method": "POST","path": "/api/streams/voice-channels/call-user","file": "server/streaming/routes.js",-- "line": 1323,++ "line": 1334,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5614,7 +5658,7 @@"method": "POST","path": "/api/streams/voice-channels/call-user/respond","file": "server/streaming/routes.js",-- "line": 1392,++ "line": 1403,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5824,7 +5868,7 @@"method": "GET","path": "/api/updates","file": "server/index.js",-- "line": 840,++ "line": 853,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -5874,7 +5918,7 @@"method": "GET","path": "/api/vods","file": "server/media-proxy/vods.js",-- "line": 303,++ "line": 308,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5884,7 +5928,7 @@"method": "DELETE","path": "/api/vods/:id","file": "server/media-proxy/vods.js",-- "line": 566,++ "line": 571,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5894,7 +5938,7 @@"method": "GET","path": "/api/vods/:id","file": "server/media-proxy/vods.js",-- "line": 460,++ "line": 465,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5904,7 +5948,7 @@"method": "PUT","path": "/api/vods/:id","file": "server/media-proxy/vods.js",-- "line": 521,++ "line": 526,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5914,7 +5958,7 @@"method": "GET","path": "/api/vods/:id/context","file": "server/media-proxy/vods.js",-- "line": 401,++ "line": 406,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5934,7 +5978,7 @@"method": "GET","path": "/api/vods/:id/memories","file": "server/media-proxy/vods.js",-- "line": 377,++ "line": 382,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5944,7 +5988,7 @@"method": "POST","path": "/api/vods/:id/publish","file": "server/media-proxy/vods.js",-- "line": 578,++ "line": 583,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5954,7 +5998,7 @@"method": "POST","path": "/api/vods/bulk","file": "server/media-proxy/vods.js",-- "line": 538,++ "line": 543,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5964,7 +6008,7 @@"method": "POST","path": "/api/vods/bulk-delete-old","file": "server/media-proxy/vods.js",-- "line": 333,++ "line": 338,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5974,7 +6018,7 @@"method": "POST","path": "/api/vods/clips","file": "server/media-proxy/vods.js",-- "line": 638,++ "line": 643,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5984,7 +6028,7 @@"method": "POST","path": "/api/vods/clips/:id/trim","file": "server/media-proxy/vods.js",-- "line": 792,++ "line": 797,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -5994,7 +6038,7 @@"method": "GET","path": "/api/vods/clips/stream/:streamId","file": "server/media-proxy/vods.js",-- "line": 781,++ "line": 786,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -6004,7 +6048,7 @@"method": "GET","path": "/api/vods/file/:filename","file": "server/media-proxy/vods.js",-- "line": 594,++ "line": 599,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -6014,7 +6058,7 @@"method": "GET","path": "/api/vods/mine","file": "server/media-proxy/vods.js",-- "line": 321,++ "line": 326,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -6054,7 +6098,7 @@"method": "POST","path": "/api/vods/upload","file": "server/media-proxy/vods.js",-- "line": 600,++ "line": 605,"target": "OpenVibe.Media","disposition": "adapter","wave": "W4",@@@ -6064,7 +6108,7 @@"method": "GET","path": "/banned","file": "server/index.js",-- "line": 1012,++ "line": 1025,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -6074,7 +6118,7 @@"method": "POST","path": "/banned/continue","file": "server/index.js",-- "line": 982,++ "line": 995,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -6084,7 +6128,7 @@"method": "GET","path": "/canvas","file": "server/index.js",-- "line": 705,++ "line": 718,"target": "OpenVibe.Games","disposition": "compat","wave": "W12",@@@ -6094,7 +6138,7 @@"method": "GET","path": "/data/pastes/screenshots/:filename","file": "server/index.js",-- "line": 638,++ "line": 651,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -6104,7 +6148,7 @@"method": "GET","path": "/dmca","file": "server/index.js",-- "line": 921,++ "line": 934,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -6144,7 +6188,7 @@"method": "GET","path": "/game","file": "server/index.js",-- "line": 704,++ "line": 717,"target": "OpenVibe.Games","disposition": "compat","wave": "W12",@@@ -6154,7 +6198,7 @@"method": "GET","path": "/internal/analytics-summary","file": "server/index.js",-- "line": 599,++ "line": 612,"target": "OpenVibe.Live","disposition": "keep","wave": "W3",@@@ -7084,7 +7128,7 @@"method": "GET","path": "/internal/lineage/resolve","file": "server/lineage/routes.js",-- "line": 33,++ "line": 36,"target": "OpenVibe.Live","disposition": "keep","wave": "W3",@@@ -7094,7 +7138,7 @@"method": "POST","path": "/internal/lineage/resolve","file": "server/lineage/routes.js",-- "line": 34,++ "line": 37,"target": "OpenVibe.Live","disposition": "keep","wave": "W3",@@@ -7104,7 +7148,7 @@"method": "POST","path": "/internal/media-events","file": "server/index.js",-- "line": 589,++ "line": 602,"target": "OpenVibe.Live","disposition": "keep","wave": "W3",@@@ -7114,7 +7158,7 @@"method": "POST","path": "/internal/media-webhook","file": "server/index.js",-- "line": 587,++ "line": 600,"target": "OpenVibe.Events","disposition": "compat","wave": "W3",@@@ -7124,7 +7168,7 @@"method": "POST","path": "/internal/network-events","file": "server/index.js",-- "line": 591,++ "line": 604,"target": "OpenVibe.Live","disposition": "keep","wave": "W3",@@@ -7134,7 +7178,7 @@"method": "POST","path": "/internal/openre-events","file": "server/index.js",-- "line": 594,++ "line": 607,"target": "OpenVibe.Live","disposition": "keep","wave": "W3",@@@ -7184,7 +7228,7 @@"method": "GET","path": "/media/:username","file": "server/index.js",-- "line": 912,++ "line": 925,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -7194,7 +7238,7 @@"method": "GET","path": "/obs/chat/:username","file": "server/index.js",-- "line": 900,++ "line": 913,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -7204,7 +7248,7 @@"method": "GET","path": "/openvibe-sw.js","file": "server/index.js",-- "line": 488,++ "line": 501,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -7214,7 +7258,7 @@"method": "GET","path": "/overlay/chat/:username","file": "server/index.js",-- "line": 908,++ "line": 921,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -7224,7 +7268,7 @@"method": "GET","path": "/overlay/chat/:username/:slotIdOrSlug","file": "server/index.js",-- "line": 905,++ "line": 918,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -7244,7 +7288,7 @@"method": "GET","path": "/p/:slug/raw","file": "server/index.js",-- "line": 650,++ "line": 663,"target": "OpenVibe.Community","disposition": "adapter","wave": "W5 (done)",@@@ -7254,7 +7298,7 @@"method": "GET","path": "/p/:slug/screenshot","file": "server/index.js",-- "line": 646,++ "line": 659,"target": "OpenVibe.Community","disposition": "adapter","wave": "W5 (done)",@@@ -7264,7 +7308,7 @@"method": "GET","path": "/privacy","file": "server/index.js",-- "line": 930,++ "line": 943,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -7284,7 +7328,7 @@"method": "GET","path": "/terms","file": "server/index.js",-- "line": 927,++ "line": 940,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -7294,7 +7338,7 @@"method": "GET","path": "/tos","file": "server/index.js",-- "line": 924,++ "line": 937,"target": "OpenVibe.Live","disposition": "keep","wave": "-",@@@ -7304,7 +7348,7 @@"method": "POST","path": "/whip/:streamId","file": "server/index.js",-- "line": 939,++ "line": 952,"target": "OpenRe.Stream","disposition": "extract","wave": "W7",@@@ -7314,7 +7358,7 @@"method": "DELETE","path": "/whip/:streamId/:resourceId","file": "server/index.js",-- "line": 941,++ "line": 954,"target": "OpenRe.Stream","disposition": "extract","wave": "W7",@@@ -7324,7 +7368,7 @@"method": "PATCH","path": "/whip/:streamId/:resourceId","file": "server/index.js",-- "line": 940,++ "line": 953,"target": "OpenRe.Stream","disposition": "extract","wave": "W7",@@@ -7380,52 +7424,52 @@{"path": "/ws/","file": "server/index.js",-- "line": 460++ "line": 473},{"path": "/ws/","file": "server/index.js",-- "line": 470++ "line": 483},{"path": "/ws/chat","file": "server/index.js",-- "line": 1085++ "line": 1098},{"path": "/ws/vibe-coding/publish","file": "server/index.js",-- "line": 1087++ "line": 1100},{"path": "/ws/broadcast","file": "server/index.js",-- "line": 1089++ "line": 1102},{"path": "/ws/control","file": "server/index.js",-- "line": 1091++ "line": 1104},{"path": "/ws/call","file": "server/index.js",-- "line": 1093++ "line": 1106},{"path": "/ws/game","file": "server/index.js",-- "line": 1095++ "line": 1108},{"path": "/ws/canvas","file": "server/index.js",-- "line": 1095++ "line": 1108},{"path": "/ws/robotstreamer-publish","file": "server/index.js",-- "line": 1097++ "line": 1110},{"path": "/ws/robotstreamer-publish",@@@ -7472,7 +7516,9 @@"server/ai/ai-service.js"],"OV_AI_INTERNAL_URL": [-- "server/ai/ai-service.js"++ "server/ai/ai-service.js",++ "server/ai/byo-credentials.js",++ "server/ai/viewer-quota.js"],"YAMNET_MODEL": ["server/ai/audio-events.js"@@@ -7519,6 +7565,24 @@"WHISPER_MAX_CONCURRENT": ["server/ai/transcribe.js"],++ "OV_NETWORK_INTERNAL_URL": [++ "server/analytics/network-analytics.js",++ "server/auth/account-data.js",++ "server/auth/game-summary.js",++ "server/auth/module-summaries.js",++ "server/chat/chat-server.js",++ "server/events/stream-events.js",++ "server/monetization/billing-client.js",++ "server/monetization/wallet-client.js",++ "server/net/network-principal.js",++ "server/openre/openre-client.js",++ "server/pastes-client.js",++ "server/social/network-follows.js",++ "server/utils/notify.js"++ ],++ "ANALYTICS_SOURCE": [++ "server/analytics/network-analytics.js"++ ],"JWT_SECRET": ["server/arena/arena-service.js","server/config.js",@@@ -7533,17 +7597,6 @@"OV_NETWORK_PUBLIC_KEY": ["server/auth/auth.js"],-- "OV_NETWORK_INTERNAL_URL": [-- "server/auth/module-summaries.js",-- "server/chat/chat-server.js",-- "server/events/stream-events.js",-- "server/monetization/billing-client.js",-- "server/monetization/wallet-client.js",-- "server/net/network-principal.js",-- "server/openre/openre-client.js",-- "server/pastes-client.js",-- "server/utils/notify.js"-- ],"OV_OAUTH_CLIENT_ID": ["server/auth/module-summaries.js","server/auth/routes.js",@@@ -7712,13 +7765,6 @@"ESCROW_HOLD_DAYS": ["server/config.js"],-- "COLD_STORAGE_PATH": [-- "server/config.js"-- ],-- "MAX_VOD_SIZE_MB": [-- "server/config.js",-- "server/media-proxy/vods.js"-- ],"MAX_EMOTE_SIZE_KB": ["server/config.js"],@@@ -7772,6 +7818,7 @@],"OV_APP_ROOT": ["server/docs/routes.js",++ "server/index.js","server/web/assets.js"],"LIVE_DRILL": [@@@ -7847,6 +7894,9 @@"OPS_ALERT_WEBHOOK_URL": ["server/media-proxy/outcomes.js"],++ "MAX_VOD_SIZE_MB": [++ "server/media-proxy/vods.js"++ ],"MEDIA_WEBHOOK_SECRET": ["server/media-proxy/webhook.js"],@@@ -7874,6 +7924,12 @@"LEGACY_QUEST_API_URL": ["server/monetization/cosmetics.js"],++ "LIVE_LIMITS_MINUTE": [++ "server/net/actor-limits.js"++ ],++ "LIVE_LIMITS_HOUR": [++ "server/net/actor-limits.js"++ ],"OPENRE_EVENTS_SECRET": ["server/openre/mirror.js","server/openre/routes.js"@@@ -7894,6 +7950,9 @@"server/seo/seo.js","server/web/paste-handover.js"],++ "FOLLOWS_AUTHORITY": [++ "server/social/network-follows.js"++ ],"CALLS_AUTHORITY": ["server/streaming/calls-authority.js"],@@@ -7922,11 +7981,80 @@"refs": [{"via": "OV_AI_INTERNAL_URL",-- "line": 40++ "line": 41},{"via": ":4700",-- "line": 40++ "line": 41++ }++ ]++ }++ ],++ "auth": [++ "none-detected"++ ],++ "timeout": true,++ "retry": true++ },++ {++ "file": "server/ai/byo-credentials.js",++ "targets": [++ {++ "service": "ai",++ "refs": [++ {++ "via": "OV_AI_INTERNAL_URL",++ "line": 17++ },++ {++ "via": ":4700",++ "line": 17++ }++ ]++ }++ ],++ "auth": [++ "none-detected"++ ],++ "timeout": true,++ "retry": true++ },++ {++ "file": "server/ai/viewer-quota.js",++ "targets": [++ {++ "service": "ai",++ "refs": [++ {++ "via": "OV_AI_INTERNAL_URL",++ "line": 17++ },++ {++ "via": ":4700",++ "line": 17++ }++ ]++ }++ ],++ "auth": [++ "none-detected"++ ],++ "timeout": true,++ "retry": true++ },++ {++ "file": "server/auth/account-data.js",++ "targets": [++ {++ "service": "network",++ "refs": [++ {++ "via": "OV_NETWORK_INTERNAL_URL",++ "line": 171++ },++ {++ "via": ":4000",++ "line": 171}]}@@@ -8540,7 +8668,7 @@"kind": "setInterval","name": null,"intervalMs": 300000,-- "line": 496,++ "line": 470,"file": "server/ai/ai-moments-job.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8551,7 +8679,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 354,++ "line": 336,"file": "server/ai/auto-clip-job.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8573,7 +8701,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 476,++ "line": 395,"file": "server/ai/chat-ai.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8584,7 +8712,7 @@"kind": "setInterval","name": null,"intervalMs": 300000,-- "line": 215,++ "line": 201,"file": "server/ai/easter-egg-job.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8595,7 +8723,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 193,++ "line": 157,"file": "server/ai/slogan-job.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8672,7 +8800,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 323,++ "line": 292,"file": "server/arena/listener.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8815,7 +8943,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 100,++ "line": 109,"file": "server/events/stream-events.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8837,7 +8965,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 130,++ "line": 124,"file": "server/home/star-job.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8848,7 +8976,7 @@"kind": "setInterval","name": null,"intervalMs": 21600000,-- "line": 1364,++ "line": 1377,"file": "server/index.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8859,7 +8987,7 @@"kind": "setInterval","name": null,"intervalMs": 45000,-- "line": 1381,++ "line": 1394,"file": "server/index.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8870,7 +8998,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 1405,++ "line": 1418,"file": "server/index.js","target": "OpenVibe.Live","disposition": "keep",@@@ -8881,7 +9009,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 1416,++ "line": 1429,"file": "server/index.js","target": "OpenVibe.Live","disposition": "keep",@@@ -9068,7 +9196,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 246,++ "line": 229,"file": "server/recap/recap.js","target": "OpenVibe.Live","disposition": "keep",@@@ -9123,7 +9251,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 191,++ "line": 196,"file": "server/streaming/rtmp-server.js","target": "OpenRe.Stream","disposition": "extract",@@@ -9166,7 +9294,7 @@],"contractTodos": 14,"unresolvedMounts": [],-- "testFiles": 126,++ "testFiles": 158,"ci": true},{@@@ -9174,13 +9302,13 @@"service": "network","present": true,"git": {-- "head": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",++ "head": "5a50c12a83f6501aacd663f15d3c06c718a4c83a","branch": "main",-- "originMain": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",-- "committedAt": "2026-09-26T06:27:40-07:00"++ "originMain": "5a50c12a83f6501aacd663f15d3c06c718a4c83a",++ "committedAt": "2026-09-27T20:18:27-07:00"},-- "sourceFiles": 93,-- "loc": 18495,++ "sourceFiles": 103,++ "loc": 21114,"tables": [{"table": "moderation_audit",@@@ -9188,6 +9316,12 @@"line": 36,"via": "repo"},++ {++ "table": "creator_streams",++ "file": "server/analytics/creators.js",++ "line": 27,++ "via": "repo"++ },{"table": "admin_rate_limits","file": "server/auth/admin-limits.js",@@@ -9392,6 +9526,24 @@"line": 124,"via": "repo"},++ {++ "table": "dev_usage_windows",++ "file": "server/developer/usage.js",++ "line": 50,++ "via": "repo"++ },++ {++ "table": "dev_usage_daily",++ "file": "server/developer/usage.js",++ "line": 69,++ "via": "repo"++ },++ {++ "table": "dev_usage_errors",++ "file": "server/developer/usage.js",++ "line": 84,++ "via": "repo"++ },{"table": "tool_domains","file": "server/domains/routes.js",@@@ -9416,18 +9568,84 @@"line": 26,"via": "repo"},++ {++ "table": "account_exports",++ "file": "server/identity/account-data.js",++ "line": 56,++ "via": "repo"++ },++ {++ "table": "account_export_parts",++ "file": "server/identity/account-data.js",++ "line": 71,++ "via": "repo"++ },++ {++ "table": "account_deletions",++ "file": "server/identity/account-data.js",++ "line": 80,++ "via": "repo"++ },++ {++ "table": "account_deletion_confirmations",++ "file": "server/identity/account-data.js",++ "line": 94,++ "via": "repo"++ },++ {++ "table": "subject_aliases",++ "file": "server/identity/account-merge.js",++ "line": 48,++ "via": "repo"++ },++ {++ "table": "account_merges",++ "file": "server/identity/account-merge.js",++ "line": 56,++ "via": "repo"++ },++ {++ "table": "account_merge_intents",++ "file": "server/identity/account-merge.js",++ "line": 71,++ "via": "repo"++ },{"table": "user_blocks","file": "server/identity/blocks.js","line": 41,"via": "repo"},++ {++ "table": "user_follows",++ "file": "server/identity/follows.js",++ "line": 42,++ "via": "repo"++ },++ {++ "table": "follow_import_holds",++ "file": "server/identity/follows.js",++ "line": 57,++ "via": "repo"++ },{"table": "principal_grant_changes","file": "server/identity/grants-admin.js","line": 38,"via": "repo"},++ {++ "table": "mod_principals",++ "file": "server/identity/mod-principals.js",++ "line": 33,++ "via": "repo"++ },++ {++ "table": "mod_principal_grants",++ "file": "server/identity/mod-principals.js",++ "line": 49,++ "via": "repo"++ },{"table": "user_modules","file": "server/identity/modules.js",@@@ -9449,13 +9667,13 @@{"table": "principal_grants","file": "server/identity/principals.js",-- "line": 217,++ "line": 246,"via": "repo"},{"table": "principal_usage","file": "server/identity/principals.js",-- "line": 227,++ "line": 256,"via": "repo"},{@@@ -9482,6 +9700,24 @@"line": 31,"via": "repo"},++ {++ "table": "operator_alerts",++ "file": "server/operator/alerts.js",++ "line": 25,++ "via": "repo"++ },++ {++ "table": "status_incidents",++ "file": "server/status/incidents.js",++ "line": 30,++ "via": "repo"++ },++ {++ "table": "status_incident_updates",++ "file": "server/status/incidents.js",++ "line": 43,++ "via": "repo"++ },{"table": "url_registry","file": "server/url-registry.js",@@@ -9522,6 +9758,26 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "GET",++ "path": "/",++ "file": "server/identity/account-data.js",++ "line": 554,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/",++ "file": "server/identity/account-merge.js",++ "line": 316,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "GET","path": "/",@@@ -9532,11 +9788,21 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "POST",++ "path": "/",++ "file": "server/identity/account-merge.js",++ "line": 304,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "POST","path": "/","file": "server/notifications/events-consumer.js",-- "line": 248,++ "line": 264,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -9552,6 +9818,16 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "POST",++ "path": "/:id/cancel",++ "file": "server/identity/account-data.js",++ "line": 565,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "POST","path": "/:id/dismiss",@@@ -9586,7 +9862,27 @@"method": "GET","path": "/.well-known/web-identity","file": "server/index.js",-- "line": 694,++ "line": 755,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/account-deletions/:id/confirmations",++ "file": "server/identity/account-data.js",++ "line": 547,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/account-exports/:id/parts",++ "file": "server/identity/account-data.js",++ "line": 539,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -9606,7 +9902,7 @@"method": "GET","path": "/api/.well-known/jwks","file": "server/index.js",-- "line": 442,++ "line": 500,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -9782,6 +10078,86 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "GET",++ "path": "/api/admin/mods",++ "file": "server/identity/mod-principals.js",++ "line": 178,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/admin/mods",++ "file": "server/identity/mod-principals.js",++ "line": 197,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/api/admin/mods",++ "file": "server/identity/mod-principals.js",++ "line": 184,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/admin/mods/:id",++ "file": "server/identity/mod-principals.js",++ "line": 183,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/api/admin/mods/:id/grants",++ "file": "server/identity/mod-principals.js",++ "line": 185,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/api/admin/mods/:id/grants",++ "file": "server/identity/mod-principals.js",++ "line": 201,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/api/admin/mods/:id/revoke",++ "file": "server/identity/mod-principals.js",++ "line": 186,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/api/admin/mods/:id/revoke",++ "file": "server/identity/mod-principals.js",++ "line": 210,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "GET","path": "/api/admin/operator-checklist",@@@ -9796,7 +10172,7 @@"method": "GET","path": "/api/admin/ssh-info","file": "server/index.js",-- "line": 566,++ "line": 627,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -9916,7 +10292,7 @@"method": "GET","path": "/api/auth/anon-identities","file": "server/auth/routes.js",-- "line": 667,++ "line": 679,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -9926,7 +10302,7 @@"method": "POST","path": "/api/auth/anon-session","file": "server/auth/routes.js",-- "line": 538,++ "line": 550,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -9936,7 +10312,7 @@"method": "GET","path": "/api/auth/anon/:token","file": "server/auth/routes.js",-- "line": 608,++ "line": 620,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -9946,7 +10322,7 @@"method": "POST","path": "/api/auth/anon/:token/link","file": "server/auth/routes.js",-- "line": 645,++ "line": 657,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -9956,7 +10332,7 @@"method": "PUT","path": "/api/auth/anon/:token/preferences","file": "server/auth/routes.js",-- "line": 622,++ "line": 634,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -9966,7 +10342,7 @@"method": "POST","path": "/api/auth/change-password","file": "server/auth/routes.js",-- "line": 431,++ "line": 443,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10046,7 +10422,7 @@"method": "POST","path": "/api/auth/forgot-password","file": "server/auth/routes.js",-- "line": 213,++ "line": 225,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10056,7 +10432,7 @@"method": "POST","path": "/api/auth/login","file": "server/auth/routes.js",-- "line": 190,++ "line": 199,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10066,7 +10442,7 @@"method": "POST","path": "/api/auth/logout","file": "server/auth/routes.js",-- "line": 532,++ "line": 544,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10076,7 +10452,7 @@"method": "GET","path": "/api/auth/me","file": "server/auth/routes.js",-- "line": 370,++ "line": 382,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10086,7 +10462,7 @@"method": "PUT","path": "/api/auth/profile","file": "server/auth/routes.js",-- "line": 381,++ "line": 393,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10096,7 +10472,7 @@"method": "POST","path": "/api/auth/refresh","file": "server/auth/routes.js",-- "line": 305,++ "line": 317,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10106,7 +10482,7 @@"method": "POST","path": "/api/auth/register","file": "server/auth/routes.js",-- "line": 93,++ "line": 102,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10116,7 +10492,7 @@"method": "POST","path": "/api/auth/reset-password","file": "server/auth/routes.js",-- "line": 261,++ "line": 273,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10126,7 +10502,7 @@"method": "GET","path": "/api/auth/reset-password/validate","file": "server/auth/routes.js",-- "line": 245,++ "line": 257,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10136,7 +10512,7 @@"method": "DELETE","path": "/api/auth/sessions","file": "server/auth/routes.js",-- "line": 750,++ "line": 762,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10146,7 +10522,7 @@"method": "GET","path": "/api/auth/sessions","file": "server/auth/routes.js",-- "line": 705,++ "line": 717,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10156,7 +10532,7 @@"method": "POST","path": "/api/auth/sessions","file": "server/auth/routes.js",-- "line": 718,++ "line": 730,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10166,7 +10542,7 @@"method": "DELETE","path": "/api/auth/sessions/:id","file": "server/auth/routes.js",-- "line": 740,++ "line": 752,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10176,7 +10552,7 @@"method": "POST","path": "/api/auth/sign-out-everywhere","file": "server/auth/routes.js",-- "line": 520,++ "line": 532,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10186,7 +10562,7 @@"method": "GET","path": "/api/auth/users/:id/card","file": "server/auth/routes.js",-- "line": 765,++ "line": 777,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10196,7 +10572,7 @@"method": "DELETE","path": "/api/auth/users/:id/follow","file": "server/auth/routes.js",-- "line": 848,++ "line": 860,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10206,7 +10582,7 @@"method": "POST","path": "/api/auth/users/:id/follow","file": "server/auth/routes.js",-- "line": 817,++ "line": 829,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10216,7 +10592,7 @@"method": "GET","path": "/api/brand","file": "server/index.js",-- "line": 468,++ "line": 529,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10226,7 +10602,7 @@"method": "GET","path": "/api/catalog.json","file": "server/index.js",-- "line": 532,++ "line": 593,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10346,7 +10722,7 @@"method": "GET","path": "/api/health","file": "server/index.js",-- "line": 454,++ "line": 515,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10406,7 +10782,7 @@"method": "GET","path": "/api/modules","file": "server/identity/modules.js",-- "line": 327,++ "line": 345,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10416,7 +10792,7 @@"method": "DELETE","path": "/api/modules/:ns","file": "server/identity/modules.js",-- "line": 352,++ "line": 370,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10426,7 +10802,7 @@"method": "GET","path": "/api/modules/:ns","file": "server/identity/modules.js",-- "line": 335,++ "line": 353,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10436,7 +10812,7 @@"method": "PUT","path": "/api/modules/:ns","file": "server/identity/modules.js",-- "line": 343,++ "line": 361,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10446,7 +10822,7 @@"method": "GET","path": "/api/modules/:ns/public/:subject","file": "server/identity/modules.js",-- "line": 319,++ "line": 337,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10456,7 +10832,7 @@"method": "DELETE","path": "/api/modules/modules/:ns/:subject","file": "server/identity/modules.js",-- "line": 390,++ "line": 408,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10466,7 +10842,7 @@"method": "GET","path": "/api/modules/modules/:ns/:subject","file": "server/identity/modules.js",-- "line": 367,++ "line": 385,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10476,7 +10852,7 @@"method": "PUT","path": "/api/modules/modules/:ns/:subject","file": "server/identity/modules.js",-- "line": 379,++ "line": 397,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10566,7 +10942,7 @@"method": "GET","path": "/api/ready","file": "server/index.js",-- "line": 464,++ "line": 525,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10576,7 +10952,7 @@"method": "GET","path": "/api/sso/targets","file": "server/index.js",-- "line": 514,++ "line": 575,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10702,6 +11078,86 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "GET",++ "path": "/api/v1/creators/:creator/analytics",++ "file": "server/analytics/creators.js",++ "line": 121,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/follows",++ "file": "server/identity/follows.js",++ "line": 262,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "DELETE",++ "path": "/api/v1/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 278,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "DELETE",++ "path": "/api/v1/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 337,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 291,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "PUT",++ "path": "/api/v1/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 268,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "PUT",++ "path": "/api/v1/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 324,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/follows/:type/:target/followers",++ "file": "server/identity/follows.js",++ "line": 304,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "GET","path": "/api/v1/me/blocks",@@@ -10732,11 +11188,81 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "GET",++ "path": "/api/v1/me/follows",++ "file": "server/identity/follows.js",++ "line": 262,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "DELETE",++ "path": "/api/v1/me/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 278,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "DELETE",++ "path": "/api/v1/me/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 337,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/me/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 291,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "PUT",++ "path": "/api/v1/me/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 268,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "PUT",++ "path": "/api/v1/me/follows/:type/:target",++ "file": "server/identity/follows.js",++ "line": 324,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/me/follows/:type/:target/followers",++ "file": "server/identity/follows.js",++ "line": 304,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "GET","path": "/api/v1/projects","file": "server/developer/routes.js",-- "line": 86,++ "line": 89,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10746,7 +11272,7 @@"method": "POST","path": "/api/v1/projects","file": "server/developer/routes.js",-- "line": 85,++ "line": 88,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10756,7 +11282,7 @@"method": "GET","path": "/api/v1/projects/:project","file": "server/developer/routes.js",-- "line": 87,++ "line": 90,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10766,7 +11292,7 @@"method": "PATCH","path": "/api/v1/projects/:project","file": "server/developer/routes.js",-- "line": 91,++ "line": 94,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10776,7 +11302,7 @@"method": "PUT","path": "/api/v1/projects/:project/allowance","file": "server/developer/routes.js",-- "line": 93,++ "line": 96,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10786,7 +11312,7 @@"method": "GET","path": "/api/v1/projects/:project/apps","file": "server/developer/routes.js",-- "line": 101,++ "line": 104,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10796,7 +11322,7 @@"method": "POST","path": "/api/v1/projects/:project/apps","file": "server/developer/routes.js",-- "line": 102,++ "line": 105,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10806,7 +11332,7 @@"method": "DELETE","path": "/api/v1/projects/:project/apps/:app","file": "server/developer/routes.js",-- "line": 105,++ "line": 108,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10816,7 +11342,7 @@"method": "GET","path": "/api/v1/projects/:project/apps/:app","file": "server/developer/routes.js",-- "line": 103,++ "line": 106,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10826,7 +11352,7 @@"method": "PATCH","path": "/api/v1/projects/:project/apps/:app","file": "server/developer/routes.js",-- "line": 104,++ "line": 107,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10836,7 +11362,7 @@"method": "GET","path": "/api/v1/projects/:project/apps/:app/credentials","file": "server/developer/routes.js",-- "line": 107,++ "line": 110,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10846,7 +11372,7 @@"method": "POST","path": "/api/v1/projects/:project/apps/:app/credentials/:credential/revoke","file": "server/developer/routes.js",-- "line": 109,++ "line": 112,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10856,7 +11382,7 @@"method": "POST","path": "/api/v1/projects/:project/apps/:app/credentials/rotate","file": "server/developer/routes.js",-- "line": 108,++ "line": 111,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10866,7 +11392,7 @@"method": "GET","path": "/api/v1/projects/:project/apps/:app/grants","file": "server/developer/routes.js",-- "line": 111,++ "line": 114,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10876,7 +11402,7 @@"method": "POST","path": "/api/v1/projects/:project/apps/:app/grants","file": "server/developer/routes.js",-- "line": 112,++ "line": 115,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10886,7 +11412,7 @@"method": "DELETE","path": "/api/v1/projects/:project/apps/:app/grants/:capability","file": "server/developer/routes.js",-- "line": 115,++ "line": 118,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10896,7 +11422,7 @@"method": "POST","path": "/api/v1/projects/:project/apps/:app/grants/:capability/approve","file": "server/developer/routes.js",-- "line": 113,++ "line": 116,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10906,7 +11432,7 @@"method": "POST","path": "/api/v1/projects/:project/apps/:app/grants/:capability/deny","file": "server/developer/routes.js",-- "line": 114,++ "line": 117,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10916,7 +11442,7 @@"method": "POST","path": "/api/v1/projects/:project/archive","file": "server/developer/routes.js",-- "line": 92,++ "line": 95,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10926,7 +11452,7 @@"method": "GET","path": "/api/v1/projects/:project/audit","file": "server/developer/routes.js",-- "line": 121,++ "line": 130,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10936,7 +11462,7 @@"method": "PUT","path": "/api/v1/projects/:project/environment-policy","file": "server/developer/routes.js",-- "line": 94,++ "line": 97,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10946,7 +11472,7 @@"method": "POST","path": "/api/v1/projects/:project/export-tokens","file": "server/developer/routes.js",-- "line": 127,++ "line": 136,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10956,7 +11482,7 @@"method": "GET","path": "/api/v1/projects/:project/members","file": "server/developer/routes.js",-- "line": 96,++ "line": 99,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10966,7 +11492,7 @@"method": "POST","path": "/api/v1/projects/:project/members","file": "server/developer/routes.js",-- "line": 97,++ "line": 100,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10976,7 +11502,7 @@"method": "DELETE","path": "/api/v1/projects/:project/members/:subject","file": "server/developer/routes.js",-- "line": 99,++ "line": 102,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10986,7 +11512,7 @@"method": "PATCH","path": "/api/v1/projects/:project/members/:subject","file": "server/developer/routes.js",-- "line": 98,++ "line": 101,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -10996,7 +11522,7 @@"method": "GET","path": "/api/v1/projects/:project/quotas","file": "server/developer/routes.js",-- "line": 117,++ "line": 120,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11006,7 +11532,7 @@"method": "DELETE","path": "/api/v1/projects/:project/quotas/:capability","file": "server/developer/routes.js",-- "line": 119,++ "line": 122,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11016,7 +11542,17 @@"method": "PUT","path": "/api/v1/projects/:project/quotas/:capability","file": "server/developer/routes.js",-- "line": 118,++ "line": 121,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/projects/:project/usage",++ "file": "server/developer/routes.js",++ "line": 125,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11026,7 +11562,7 @@"method": "GET","path": "/api/v1/projects/catalog","file": "server/developer/routes.js",-- "line": 79,++ "line": 82,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11236,7 +11772,37 @@"method": "GET","path": "/api/v1/status","file": "server/status/routes.js",-- "line": 228,++ "line": 242,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/status/incidents",++ "file": "server/status/incidents.js",++ "line": 128,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/api/v1/status/incidents",++ "file": "server/status/incidents.js",++ "line": 153,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/api/v1/status/incidents/:id/updates",++ "file": "server/status/incidents.js",++ "line": 154,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11246,7 +11812,7 @@"method": "GET","path": "/api/v1/status/slo","file": "server/status/routes.js",-- "line": 245,++ "line": 259,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11256,7 +11822,7 @@"method": "GET","path": "/api/v1/users/names/:name","file": "server/index.js",-- "line": 396,++ "line": 404,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11276,7 +11842,7 @@"method": "GET","path": "/audit","file": "server/admin/routes.js",-- "line": 870,++ "line": 872,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11336,7 +11902,7 @@"method": "POST","path": "/broadcast","file": "server/admin/routes.js",-- "line": 794,++ "line": 796,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11396,7 +11962,7 @@"method": "GET","path": "/config","file": "server/admin/routes.js",-- "line": 379,++ "line": 380,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11426,7 +11992,7 @@"method": "GET","path": "/config/:namespace","file": "server/admin/routes.js",-- "line": 380,++ "line": 381,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11436,7 +12002,7 @@"method": "GET","path": "/config/:namespace/history","file": "server/admin/routes.js",-- "line": 381,++ "line": 382,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11446,7 +12012,37 @@"method": "POST","path": "/config/:namespace/rollback","file": "server/admin/routes.js",-- "line": 382,++ "line": 383,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "DELETE",++ "path": "/deletion",++ "file": "server/identity/account-data.js",++ "line": 531,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/deletion",++ "file": "server/identity/account-data.js",++ "line": 520,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/deletion",++ "file": "server/identity/account-data.js",++ "line": 525,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11522,6 +12118,46 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "GET",++ "path": "/export",++ "file": "server/identity/account-data.js",++ "line": 498,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/export",++ "file": "server/identity/account-data.js",++ "line": 490,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/export/:id",++ "file": "server/identity/account-data.js",++ "line": 503,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/export/:id/download",++ "file": "server/identity/account-data.js",++ "line": 509,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "GET","path": "/fedcm/accounts",@@@ -11576,7 +12212,7 @@"method": "GET","path": "/health","file": "server/admin/routes.js",-- "line": 839,++ "line": 841,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11596,7 +12232,7 @@"method": "GET","path": "/internal/anon-admin","file": "server/internal/routes.js",-- "line": 661,++ "line": 685,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11606,7 +12242,7 @@"method": "GET","path": "/internal/anon-list","file": "server/internal/routes.js",-- "line": 710,++ "line": 734,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11616,7 +12252,7 @@"method": "POST","path": "/internal/audit","file": "server/internal/routes.js",-- "line": 224,++ "line": 226,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11626,7 +12262,7 @@"method": "GET","path": "/internal/blocks","file": "server/index.js",-- "line": 408,++ "line": 452,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11636,7 +12272,7 @@"method": "POST","path": "/internal/coins/credit","file": "server/internal/routes.js",-- "line": 316,++ "line": 322,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11646,7 +12282,7 @@"method": "POST","path": "/internal/coins/debit","file": "server/internal/routes.js",-- "line": 328,++ "line": 334,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11656,7 +12292,7 @@"method": "GET","path": "/internal/coins/stats","file": "server/internal/routes.js",-- "line": 275,++ "line": 281,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11666,7 +12302,7 @@"method": "POST","path": "/internal/coins/transfer","file": "server/internal/routes.js",-- "line": 341,++ "line": 347,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11676,7 +12312,7 @@"method": "POST","path": "/internal/events/stream-live","file": "server/internal/routes.js",-- "line": 359,++ "line": 365,"target": "OpenVibe.Events","disposition": "compat","wave": "W3",@@@ -11696,7 +12332,7 @@"method": "POST","path": "/internal/identity/legacy-map","file": "server/internal/routes.js",-- "line": 84,++ "line": 86,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11716,7 +12352,7 @@"method": "GET","path": "/internal/identity/resolve","file": "server/internal/routes.js",-- "line": 80,++ "line": 82,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11736,7 +12372,7 @@"method": "POST","path": "/internal/identity/resolve-batch","file": "server/internal/routes.js",-- "line": 81,++ "line": 83,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11746,7 +12382,7 @@"method": "GET","path": "/internal/integrations/github-token","file": "server/index.js",-- "line": 404,++ "line": 412,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11756,7 +12392,7 @@"method": "POST","path": "/internal/issue-token","file": "server/internal/routes.js",-- "line": 551,++ "line": 575,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11766,7 +12402,87 @@"method": "POST","path": "/internal/link-account","file": "server/internal/routes.js",-- "line": 166,++ "line": 168,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1",++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."++ },++ {++ "method": "GET",++ "path": "/internal/mods",++ "file": "server/identity/mod-principals.js",++ "line": 178,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1",++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."++ },++ {++ "method": "GET",++ "path": "/internal/mods",++ "file": "server/identity/mod-principals.js",++ "line": 197,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1",++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."++ },++ {++ "method": "POST",++ "path": "/internal/mods",++ "file": "server/identity/mod-principals.js",++ "line": 184,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1",++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."++ },++ {++ "method": "GET",++ "path": "/internal/mods/:id",++ "file": "server/identity/mod-principals.js",++ "line": 183,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1",++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."++ },++ {++ "method": "POST",++ "path": "/internal/mods/:id/grants",++ "file": "server/identity/mod-principals.js",++ "line": 185,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1",++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."++ },++ {++ "method": "POST",++ "path": "/internal/mods/:id/grants",++ "file": "server/identity/mod-principals.js",++ "line": 201,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1",++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."++ },++ {++ "method": "POST",++ "path": "/internal/mods/:id/revoke",++ "file": "server/identity/mod-principals.js",++ "line": 186,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1",++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."++ },++ {++ "method": "POST",++ "path": "/internal/mods/:id/revoke",++ "file": "server/identity/mod-principals.js",++ "line": 210,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11776,7 +12492,7 @@"method": "POST","path": "/internal/notifications/mark-read","file": "server/internal/routes.js",-- "line": 512,++ "line": 536,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11786,7 +12502,7 @@"method": "POST","path": "/internal/notifications/push","file": "server/internal/routes.js",-- "line": 454,++ "line": 460,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11796,7 +12512,7 @@"method": "POST","path": "/internal/notifications/push-bulk","file": "server/internal/routes.js",-- "line": 474,++ "line": 480,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11806,7 +12522,7 @@"method": "POST","path": "/internal/notifications/resolve-users","file": "server/internal/routes.js",-- "line": 531,++ "line": 555,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11816,7 +12532,17 @@"method": "GET","path": "/internal/notifications/unread/:userId","file": "server/internal/routes.js",-- "line": 497,++ "line": 521,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "W1",++ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."++ },++ {++ "method": "POST",++ "path": "/internal/operator/alerts",++ "file": "server/internal/routes.js",++ "line": 505,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11826,7 +12552,7 @@"method": "POST","path": "/internal/resolve-anon","file": "server/internal/routes.js",-- "line": 582,++ "line": 606,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11836,7 +12562,7 @@"method": "GET","path": "/internal/stats","file": "server/internal/routes.js",-- "line": 233,++ "line": 235,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11846,7 +12572,7 @@"method": "GET","path": "/internal/url-registry/resolved","file": "server/internal/routes.js",-- "line": 244,++ "line": 247,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11856,7 +12582,7 @@"method": "POST","path": "/internal/user-avatar","file": "server/internal/routes.js",-- "line": 209,++ "line": 211,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11866,7 +12592,7 @@"method": "GET","path": "/internal/users/:id","file": "server/internal/routes.js",-- "line": 116,++ "line": 118,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11876,7 +12602,7 @@"method": "GET","path": "/internal/users/:id/linked-accounts","file": "server/internal/routes.js",-- "line": 217,++ "line": 219,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11886,7 +12612,7 @@"method": "GET","path": "/internal/users/:id/theme","file": "server/internal/routes.js",-- "line": 153,++ "line": 155,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11896,7 +12622,7 @@"method": "POST","path": "/internal/users/bulk","file": "server/internal/routes.js",-- "line": 138,++ "line": 140,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11906,7 +12632,7 @@"method": "GET","path": "/internal/users/by-username/:username","file": "server/internal/routes.js",-- "line": 127,++ "line": 129,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11916,7 +12642,7 @@"method": "POST","path": "/internal/verify-token","file": "server/internal/routes.js",-- "line": 92,++ "line": 94,"target": "OpenVibe.Network","disposition": "keep","wave": "W1",@@@ -11926,7 +12652,7 @@"method": "GET","path": "/llms.txt","file": "server/index.js",-- "line": 672,++ "line": 733,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11952,11 +12678,41 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "POST",++ "path": "/merge",++ "file": "server/identity/account-merge.js",++ "line": 293,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/merge/intents",++ "file": "server/identity/account-merge.js",++ "line": 289,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/merges",++ "file": "server/identity/account-merge.js",++ "line": 296,++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "GET","path": "/net-config","file": "server/admin/routes.js",-- "line": 980,++ "line": 982,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -11966,7 +12722,7 @@"method": "PUT","path": "/net-config","file": "server/admin/routes.js",-- "line": 999,++ "line": 1001,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12036,7 +12792,7 @@"method": "GET","path": "/oauth/.well-known/openid-configuration","file": "server/auth/oauth-routes.js",-- "line": 421,++ "line": 422,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12086,7 +12842,7 @@"method": "GET","path": "/oauth/userinfo","file": "server/auth/oauth-routes.js",-- "line": 425,++ "line": 426,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12096,7 +12852,7 @@"method": "POST","path": "/oauth/userinfo","file": "server/auth/oauth-routes.js",-- "line": 426,++ "line": 427,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12106,7 +12862,7 @@"method": "GET","path": "/openvibe-sw.js","file": "server/index.js",-- "line": 717,++ "line": 778,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12206,7 +12962,7 @@"method": "POST","path": "/reset-db","file": "server/admin/routes.js",-- "line": 518,++ "line": 520,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12246,7 +13002,7 @@"method": "PUT","path": "/settings","file": "server/admin/routes.js",-- "line": 340,++ "line": 341,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12256,7 +13012,7 @@"method": "GET","path": "/sso/check","file": "server/index.js",-- "line": 701,++ "line": 762,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12276,7 +13032,7 @@"method": "GET","path": "/status","file": "server/status/routes.js",-- "line": 248,++ "line": 262,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12306,7 +13062,7 @@"method": "GET","path": "/tos","file": "server/index.js",-- "line": 528,++ "line": 589,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12346,7 +13102,7 @@"method": "GET","path": "/url-registry","file": "server/admin/routes.js",-- "line": 398,++ "line": 399,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12356,7 +13112,7 @@"method": "PUT","path": "/url-registry","file": "server/admin/routes.js",-- "line": 425,++ "line": 427,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12366,7 +13122,7 @@"method": "DELETE","path": "/url-registry/:key","file": "server/admin/routes.js",-- "line": 468,++ "line": 470,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12376,7 +13132,7 @@"method": "PUT","path": "/url-registry/:key","file": "server/admin/routes.js",-- "line": 446,++ "line": 448,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12386,7 +13142,7 @@"method": "POST","path": "/url-registry/:key/reset","file": "server/admin/routes.js",-- "line": 503,++ "line": 505,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12396,7 +13152,7 @@"method": "POST","path": "/url-registry/refresh-all","file": "server/admin/routes.js",-- "line": 483,++ "line": 485,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12416,7 +13172,7 @@"method": "GET","path": "/users","file": "server/admin/routes.js",-- "line": 580,++ "line": 582,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12426,7 +13182,7 @@"method": "PUT","path": "/users/:id/ban","file": "server/admin/routes.js",-- "line": 733,++ "line": 735,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12436,7 +13192,7 @@"method": "PUT","path": "/users/:id/email","file": "server/admin/routes.js",-- "line": 612,++ "line": 614,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12446,7 +13202,7 @@"method": "PUT","path": "/users/:id/role","file": "server/admin/routes.js",-- "line": 710,++ "line": 712,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12456,7 +13212,7 @@"method": "POST","path": "/users/:id/send-reset","file": "server/admin/routes.js",-- "line": 651,++ "line": 653,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12466,7 +13222,7 @@"method": "POST","path": "/users/:id/sign-out","file": "server/admin/routes.js",-- "line": 776,++ "line": 778,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12476,7 +13232,7 @@"method": "PUT","path": "/users/:id/username","file": "server/admin/routes.js",-- "line": 762,++ "line": 764,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12486,7 +13242,7 @@"method": "POST","path": "/users/grant-admin","file": "server/admin/routes.js",-- "line": 545,++ "line": 547,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12496,7 +13252,7 @@"method": "GET","path": "/verification-keys","file": "server/admin/routes.js",-- "line": 897,++ "line": 899,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12506,7 +13262,7 @@"method": "POST","path": "/verification-keys","file": "server/admin/routes.js",-- "line": 906,++ "line": 908,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12516,7 +13272,7 @@"method": "DELETE","path": "/verification-keys/:id","file": "server/admin/routes.js",-- "line": 954,++ "line": 956,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12526,7 +13282,7 @@"method": "GET","path": "/verify-email","file": "server/index.js",-- "line": 684,++ "line": 745,"target": "OpenVibe.Network","disposition": "keep","wave": "-",@@@ -12554,7 +13310,16 @@"server/auth/owner-guard.js","server/auth/routes.js","server/deploy/routes.js",-- "server/index.js"++ "server/identity/account-data.js",++ "server/identity/account-merge.js",++ "server/index.js",++ "server/operator/alerts.js"++ ],++ "NETWORK_LIMITS_MINUTE": [++ "server/auth/actor-limits.js"++ ],++ "NETWORK_LIMITS_HOUR": [++ "server/auth/actor-limits.js"],"NODE_ENV": ["server/auth/fedcm.js",@@@ -12685,6 +13450,9 @@"OV_AI_INTERNAL_URL": ["server/frame/service.js"],++ "FOLLOWS_AUTHORITY": [++ "server/index.js"++ ],"OV_EVENTS_PUBLIC_URL": ["server/index.js"],@@@ -12702,6 +13470,9 @@"SSH_PROJECTS_ROOT": ["server/index.js"],++ "OPERATOR_ALERT_USERNAMES": [++ "server/operator/alerts.js"++ ],"DEVPATH_RESULT_FILE": ["server/status/routes.js"],@@@ -12951,23 +13722,23 @@"refs": [{"via": ":3000",-- "line": 241++ "line": 243},{"via": "live.internalUrl",-- "line": 311++ "line": 313},{"via": "liveUrl",-- "line": 370++ "line": 375},{"via": "live.internalUrl",-- "line": 370++ "line": 375},{"via": "live.internalUrl",-- "line": 599++ "line": 660}]},@@@ -12976,11 +13747,11 @@"refs": [{"via": ":4001",-- "line": 243++ "line": 245},{"via": "tools.internalUrl",-- "line": 312++ "line": 314}]},@@@ -12989,11 +13760,11 @@"refs": [{"via": ":4100",-- "line": 244++ "line": 246},{"via": "media.internalUrl",-- "line": 314++ "line": 316}]},@@@ -13002,11 +13773,11 @@"refs": [{"via": ":8000",-- "line": 245++ "line": 247},{"via": "games.internalUrl",-- "line": 313++ "line": 315}]},@@@ -13015,15 +13786,15 @@"refs": [{"via": "OV_BLOG_INTERNAL_URL",-- "line": 440++ "line": 498},{"via": "blogUrl",-- "line": 440++ "line": 498},{"via": ":4810",-- "line": 440++ "line": 498}]},@@@ -13032,19 +13803,19 @@"refs": [{"via": "eventsUrl",-- "line": 496++ "line": 557},{"via": "eventsInternalUrl",-- "line": 496++ "line": 557},{"via": "eventsUrl",-- "line": 583++ "line": 644},{"via": "eventsInternalUrl",-- "line": 583++ "line": 644}]}@@@ -13164,7 +13935,7 @@"kind": "setInterval","name": null,"intervalMs": 3600000,-- "line": 790,++ "line": 851,"file": "server/index.js","target": "OpenVibe.Network","disposition": "keep",@@@ -13175,7 +13946,7 @@"kind": "setInterval","name": null,"intervalMs": 120000,-- "line": 793,++ "line": 854,"file": "server/index.js","target": "OpenVibe.Network","disposition": "keep",@@@ -13186,7 +13957,29 @@"kind": "setInterval","name": null,"intervalMs": 300000,-- "line": 807,++ "line": 868,++ "file": "server/index.js",++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "Runs in, and for, the service that owns it."++ },++ {++ "kind": "setInterval",++ "name": null,++ "intervalMs": 360000,++ "line": 871,++ "file": "server/index.js",++ "target": "OpenVibe.Network",++ "disposition": "keep",++ "wave": "-",++ "note": "Runs in, and for, the service that owns it."++ },++ {++ "kind": "setInterval",++ "name": null,++ "intervalMs": 60000,++ "line": 879,"file": "server/index.js","target": "OpenVibe.Network","disposition": "keep",@@@ -13197,7 +13990,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 810,++ "line": 882,"file": "server/index.js","target": "OpenVibe.Network","disposition": "keep",@@@ -13229,7 +14022,7 @@],"contractTodos": 3,"unresolvedMounts": [],-- "testFiles": 60,++ "testFiles": 77,"ci": true},{@@@ -13237,13 +14030,13 @@"service": "shared","present": true,"git": {-- "head": "dbf9d39750e9f0dd0f19d8571d278eb303f3b83f",++ "head": "b5a9bd77171fcf75f42ff33fe86b7ad06baac1c8","branch": "main",-- "originMain": "dbf9d39750e9f0dd0f19d8571d278eb303f3b83f",-- "committedAt": "2026-09-26T06:05:39-07:00"++ "originMain": "b5a9bd77171fcf75f42ff33fe86b7ad06baac1c8",++ "committedAt": "2026-09-27T20:13:02-07:00"},-- "sourceFiles": 57,-- "loc": 15053,++ "sourceFiles": 58,++ "loc": 15503,"tables": [{"table": "config_snapshots",@@@ -13480,7 +14273,7 @@"refs": [{"via": "eventsUrl",-- "line": 12++ "line": 9},{"via": "eventsUrl",@@@ -13557,7 +14350,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 265,++ "line": 266,"file": "release-watch.js","target": "OpenVibe.Shared","disposition": "keep",@@@ -13568,7 +14361,7 @@"kind": "setInterval","name": null,"intervalMs": 600000,-- "line": 271,++ "line": 272,"file": "release-watch.js","target": "OpenVibe.Shared","disposition": "keep",@@@ -13585,11 +14378,22 @@"disposition": "keep","wave": "-","note": "Runs in, and for, the service that owns it."++ },++ {++ "kind": "setInterval",++ "name": null,++ "intervalMs": null,++ "line": 276,++ "file": "web-runtime.js",++ "target": "OpenVibe.Shared",++ "disposition": "keep",++ "wave": "-",++ "note": "Runs in, and for, the service that owns it."}],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 34,++ "testFiles": 39,"ci": true},{@@@ -13597,14 +14401,20 @@"service": "media","present": true,"git": {-- "head": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",++ "head": "14cac06886649848c332cfa564aa6b3594ea09bc","branch": "main",-- "originMain": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",-- "committedAt": "2026-09-26T06:16:26-07:00"++ "originMain": "14cac06886649848c332cfa564aa6b3594ea09bc",++ "committedAt": "2026-09-27T20:17:24-07:00"},-- "sourceFiles": 73,-- "loc": 19538,++ "sourceFiles": 79,++ "loc": 20861,"tables": [++ {++ "table": "account_data_events",++ "file": "server/account-data.js",++ "line": 32,++ "via": "repo"++ },{"table": "apps","file": "server/db/schema.sql",@@@ -13737,22 +14547,52 @@"line": 413,"via": "repo"},++ {++ "table": "media_object_view_salts",++ "file": "server/db/schema.sql",++ "line": 435,++ "via": "repo"++ },++ {++ "table": "media_object_viewer_days",++ "file": "server/db/schema.sql",++ "line": 440,++ "via": "repo"++ },++ {++ "table": "media_object_views_daily",++ "file": "server/db/schema.sql",++ "line": 446,++ "via": "repo"++ },++ {++ "table": "media_object_tier_decisions",++ "file": "server/db/schema.sql",++ "line": 458,++ "via": "repo"++ },{"table": "media_object_changes","file": "server/db/schema.sql",-- "line": 436,++ "line": 480,"via": "repo"},{"table": "media_verifications","file": "server/db/schema.sql",-- "line": 448,++ "line": 492,"via": "repo"},{"table": "media_verify_runs","file": "server/db/schema.sql",-- "line": 460,++ "line": 504,++ "via": "repo"++ },++ {++ "table": "subject_merges",++ "file": "server/subject-merge.js",++ "line": 13,"via": "repo"},{@@@ -13779,7 +14619,7 @@"method": "GET","path": "/api/ready","file": "server/observability.js",-- "line": 153,++ "line": 156,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13789,7 +14629,7 @@"method": "GET","path": "/api/v1/:app/admin/storage","file": "server/admin/routes.js",-- "line": 87,++ "line": 102,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13799,7 +14639,7 @@"method": "GET","path": "/api/v1/:app/admin/storage/buckets","file": "server/admin/routes.js",-- "line": 639,++ "line": 692,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13809,7 +14649,7 @@"method": "GET","path": "/api/v1/:app/admin/storage/holds","file": "server/admin/routes.js",-- "line": 537,++ "line": 590,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13819,7 +14659,7 @@"method": "POST","path": "/api/v1/:app/admin/storage/holds","file": "server/admin/routes.js",-- "line": 558,++ "line": 611,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13829,7 +14669,7 @@"method": "DELETE","path": "/api/v1/:app/admin/storage/holds/:holdId","file": "server/admin/routes.js",-- "line": 598,++ "line": 651,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13839,7 +14679,7 @@"method": "POST","path": "/api/v1/:app/admin/storage/holds/:holdId/release","file": "server/admin/routes.js",-- "line": 597,++ "line": 650,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13849,7 +14689,7 @@"method": "GET","path": "/api/v1/:app/admin/storage/ops","file": "server/admin/routes.js",-- "line": 613,++ "line": 666,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13859,7 +14699,7 @@"method": "POST","path": "/api/v1/:app/admin/storage/ops/recompute","file": "server/admin/routes.js",-- "line": 624,++ "line": 677,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13869,7 +14709,7 @@"method": "GET","path": "/api/v1/:app/admin/storage/tiers","file": "server/admin/routes.js",-- "line": 273,++ "line": 288,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13879,7 +14719,7 @@"method": "POST","path": "/api/v1/:app/admin/storage/tiers/bulk-move","file": "server/admin/routes.js",-- "line": 465,++ "line": 518,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13889,7 +14729,7 @@"method": "GET","path": "/api/v1/:app/admin/storage/tiers/decisions","file": "server/admin/routes.js",-- "line": 394,++ "line": 410,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13899,7 +14739,27 @@"method": "POST","path": "/api/v1/:app/admin/storage/tiers/move","file": "server/admin/routes.js",-- "line": 447,++ "line": 500,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/:app/admin/storage/tiers/objects/decisions",++ "file": "server/admin/routes.js",++ "line": 458,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/:app/admin/storage/tiers/objects/policy",++ "file": "server/admin/routes.js",++ "line": 439,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13909,7 +14769,7 @@"method": "GET","path": "/api/v1/:app/admin/storage/tiers/policy","file": "server/admin/routes.js",-- "line": 367,++ "line": 383,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13919,7 +14779,7 @@"method": "PUT","path": "/api/v1/:app/admin/storage/tiers/settings","file": "server/admin/routes.js",-- "line": 323,++ "line": 338,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13929,7 +14789,7 @@"method": "POST","path": "/api/v1/:app/admin/storage/tiers/sweep","file": "server/admin/routes.js",-- "line": 419,++ "line": 472,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13939,7 +14799,7 @@"method": "GET","path": "/api/v1/:app/admin/storage/vods","file": "server/admin/routes.js",-- "line": 142,++ "line": 157,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13949,7 +14809,7 @@"method": "DELETE","path": "/api/v1/:app/admin/storage/vods/bulk","file": "server/admin/routes.js",-- "line": 214,++ "line": 229,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13989,7 +14849,7 @@"method": "GET","path": "/api/v1/:app/clips","file": "server/vod/clips-routes.js",-- "line": 288,++ "line": 302,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -13999,7 +14859,7 @@"method": "POST","path": "/api/v1/:app/clips","file": "server/vod/clips-routes.js",-- "line": 124,++ "line": 138,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14009,7 +14869,7 @@"method": "DELETE","path": "/api/v1/:app/clips/:id","file": "server/vod/clips-routes.js",-- "line": 380,++ "line": 403,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14019,7 +14879,7 @@"method": "GET","path": "/api/v1/:app/clips/:id","file": "server/vod/clips-routes.js",-- "line": 317,++ "line": 340,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14029,7 +14889,7 @@"method": "PUT","path": "/api/v1/:app/clips/:id","file": "server/vod/clips-routes.js",-- "line": 357,++ "line": 380,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14039,7 +14899,17 @@"method": "POST","path": "/api/v1/:app/clips/:id/recut","file": "server/vod/clips-routes.js",-- "line": 340,++ "line": 363,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/:app/clips/:id/signed-url",++ "file": "server/vod/clips-routes.js",++ "line": 332,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14049,7 +14919,7 @@"method": "GET","path": "/api/v1/:app/files","file": "server/files/routes.js",-- "line": 152,++ "line": 155,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14059,7 +14929,7 @@"method": "POST","path": "/api/v1/:app/files","file": "server/files/routes.js",-- "line": 88,++ "line": 91,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14069,7 +14939,7 @@"method": "DELETE","path": "/api/v1/:app/files/:key","file": "server/files/routes.js",-- "line": 180,++ "line": 184,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14079,7 +14949,7 @@"method": "GET","path": "/api/v1/:app/files/:key","file": "server/files/routes.js",-- "line": 169,++ "line": 172,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14269,7 +15139,7 @@"method": "GET","path": "/api/v1/:app/stats","file": "server/index.js",-- "line": 156,++ "line": 158,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14279,7 +15149,7 @@"method": "GET","path": "/api/v1/:app/stats/series/:metric","file": "server/index.js",-- "line": 166,++ "line": 168,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14319,7 +15189,7 @@"method": "GET","path": "/api/v1/:app/vods","file": "server/vod/routes.js",-- "line": 272,++ "line": 273,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14329,7 +15199,7 @@"method": "POST","path": "/api/v1/:app/vods","file": "server/vod/routes.js",-- "line": 95,++ "line": 98,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14339,7 +15209,7 @@"method": "DELETE","path": "/api/v1/:app/vods/:id","file": "server/vod/routes.js",-- "line": 370,++ "line": 383,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14349,7 +15219,7 @@"method": "GET","path": "/api/v1/:app/vods/:id","file": "server/vod/routes.js",-- "line": 313,++ "line": 326,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14359,7 +15229,7 @@"method": "PUT","path": "/api/v1/:app/vods/:id","file": "server/vod/routes.js",-- "line": 345,++ "line": 358,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14369,7 +15239,7 @@"method": "POST","path": "/api/v1/:app/vods/:id/chunks","file": "server/vod/routes.js",-- "line": 161,++ "line": 164,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14379,7 +15249,7 @@"method": "POST","path": "/api/v1/:app/vods/:id/complete","file": "server/vod/routes.js",-- "line": 265,++ "line": 266,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14389,7 +15259,7 @@"method": "POST","path": "/api/v1/:app/vods/:id/finalize","file": "server/vod/routes.js",-- "line": 266,++ "line": 267,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14399,7 +15269,7 @@"method": "POST","path": "/api/v1/:app/vods/:id/ingest/rtmp","file": "server/vod/routes.js",-- "line": 118,++ "line": 121,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14409,7 +15279,7 @@"method": "POST","path": "/api/v1/:app/vods/:id/ingest/rtp/start","file": "server/vod/routes.js",-- "line": 132,++ "line": 135,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14419,7 +15289,17 @@"method": "POST","path": "/api/v1/:app/vods/:id/ingest/rtp/stop","file": "server/vod/routes.js",-- "line": 146,++ "line": 149,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/:app/vods/:id/signed-url",++ "file": "server/vod/routes.js",++ "line": 317,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14429,7 +15309,7 @@"method": "GET","path": "/api/v1/:app/vods/latest-thumbs","file": "server/vod/routes.js",-- "line": 302,++ "line": 303,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14439,7 +15319,7 @@"method": "GET","path": "/api/v2/:app/jobs","file": "server/jobs/routes.js",-- "line": 74,++ "line": 78,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14449,7 +15329,7 @@"method": "POST","path": "/api/v2/:app/jobs","file": "server/jobs/routes.js",-- "line": 87,++ "line": 91,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14459,7 +15339,7 @@"method": "DELETE","path": "/api/v2/:app/jobs/:jobId","file": "server/jobs/routes.js",-- "line": 147,++ "line": 153,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14469,7 +15349,7 @@"method": "GET","path": "/api/v2/:app/jobs/:jobId","file": "server/jobs/routes.js",-- "line": 120,++ "line": 124,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14479,7 +15359,7 @@"method": "POST","path": "/api/v2/:app/jobs/:jobId/approve","file": "server/jobs/routes.js",-- "line": 125,++ "line": 129,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14489,7 +15369,7 @@"method": "POST","path": "/api/v2/:app/jobs/:jobId/cancel","file": "server/jobs/routes.js",-- "line": 146,++ "line": 152,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14499,7 +15379,7 @@"method": "GET","path": "/api/v2/:app/namespaces","file": "server/objects/namespace-routes.js",-- "line": 32,++ "line": 34,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14509,7 +15389,7 @@"method": "GET","path": "/api/v2/:app/namespaces/:namespace","file": "server/objects/namespace-routes.js",-- "line": 42,++ "line": 44,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14519,7 +15399,7 @@"method": "GET","path": "/api/v2/:app/objects","file": "server/objects/routes.js",-- "line": 556,++ "line": 564,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14529,7 +15409,7 @@"method": "POST","path": "/api/v2/:app/objects","file": "server/objects/routes.js",-- "line": 291,++ "line": 296,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14539,7 +15419,7 @@"method": "DELETE","path": "/api/v2/:app/objects/:id","file": "server/objects/routes.js",-- "line": 609,++ "line": 618,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14549,7 +15429,7 @@"method": "GET","path": "/api/v2/:app/objects/:id","file": "server/objects/routes.js",-- "line": 604,++ "line": 612,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14559,7 +15439,7 @@"method": "GET","path": "/api/v2/:app/objects/:id","file": "server/objects/routes.js",-- "line": 700,++ "line": 718,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14569,7 +15449,7 @@"method": "POST","path": "/api/v2/:app/objects/:id/complete","file": "server/objects/routes.js",-- "line": 425,++ "line": 431,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14579,7 +15459,7 @@"method": "PUT","path": "/api/v2/:app/objects/:id/content","file": "server/index.js",-- "line": 63,++ "line": 65,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14589,7 +15469,7 @@"method": "GET","path": "/api/v2/:app/objects/:id/download","file": "server/objects/routes.js",-- "line": 641,++ "line": 650,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14599,7 +15479,7 @@"method": "GET","path": "/api/v2/:app/objects/:id/holds","file": "server/objects/routes.js",-- "line": 660,++ "line": 669,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14609,7 +15489,7 @@"method": "POST","path": "/api/v2/:app/objects/:id/holds","file": "server/objects/routes.js",-- "line": 672,++ "line": 688,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14619,7 +15499,7 @@"method": "DELETE","path": "/api/v2/:app/objects/:id/holds/:holdId","file": "server/objects/routes.js",-- "line": 684,++ "line": 701,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14629,7 +15509,7 @@"method": "POST","path": "/api/v2/:app/objects/:id/multipart","file": "server/objects/routes.js",-- "line": 468,++ "line": 474,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14639,7 +15519,7 @@"method": "DELETE","path": "/api/v2/:app/objects/:id/multipart/:uploadId","file": "server/objects/routes.js",-- "line": 545,++ "line": 553,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14649,7 +15529,7 @@"method": "GET","path": "/api/v2/:app/objects/:id/multipart/:uploadId","file": "server/objects/routes.js",-- "line": 499,++ "line": 505,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14659,7 +15539,7 @@"method": "POST","path": "/api/v2/:app/objects/:id/multipart/:uploadId/complete","file": "server/objects/routes.js",-- "line": 508,++ "line": 515,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14669,7 +15549,7 @@"method": "PUT","path": "/api/v2/:app/objects/:id/multipart/:uploadId/parts/:n","file": "server/index.js",-- "line": 64,++ "line": 66,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14679,7 +15559,7 @@"method": "POST","path": "/api/v2/:app/objects/:id/restore","file": "server/objects/routes.js",-- "line": 627,++ "line": 636,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14689,7 +15569,7 @@"method": "POST","path": "/api/v2/:app/objects/:id/upload-url","file": "server/objects/routes.js",-- "line": 441,++ "line": 447,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14699,7 +15579,7 @@"method": "GET","path": "/api/v2/me","file": "server/me/routes.js",-- "line": 202,++ "line": 206,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14709,7 +15589,7 @@"method": "GET","path": "/api/v2/me/app.js","file": "server/me/routes.js",-- "line": 185,++ "line": 189,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14719,7 +15599,7 @@"method": "GET","path": "/api/v2/me/objects","file": "server/me/routes.js",-- "line": 125,++ "line": 128,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14729,7 +15609,7 @@"method": "GET","path": "/api/v2/me/objects/:id","file": "server/me/routes.js",-- "line": 137,++ "line": 140,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14739,7 +15619,7 @@"method": "GET","path": "/api/v2/me/objects/:id","file": "server/me/routes.js",-- "line": 217,++ "line": 221,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14749,7 +15629,7 @@"method": "GET","path": "/api/v2/me/ops","file": "server/me/routes.js",-- "line": 154,++ "line": 157,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14759,7 +15639,7 @@"method": "GET","path": "/api/v2/me/ops","file": "server/me/routes.js",-- "line": 224,++ "line": 228,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14769,7 +15649,7 @@"method": "POST","path": "/api/v2/me/ops/recompute","file": "server/me/routes.js",-- "line": 167,++ "line": 171,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14779,7 +15659,7 @@"method": "POST","path": "/api/v2/me/ops/recompute","file": "server/me/routes.js",-- "line": 234,++ "line": 238,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14789,7 +15669,7 @@"method": "GET","path": "/api/v2/me/usage","file": "server/me/routes.js",-- "line": 144,++ "line": 147,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14859,7 +15739,7 @@"method": "GET","path": "/healthz","file": "server/index.js",-- "line": 133,++ "line": 135,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14869,7 +15749,7 @@"method": "POST","path": "/internal/avatar-ingest","file": "server/index.js",-- "line": 97,++ "line": 99,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14879,7 +15759,7 @@"method": "POST","path": "/internal/events","file": "server/index.js",-- "line": 67,++ "line": 69,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14889,7 +15769,7 @@"method": "GET","path": "/limits.json","file": "server/limits.js",-- "line": 43,++ "line": 42,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14899,7 +15779,7 @@"method": "GET","path": "/manifest.webmanifest","file": "server/index.js",-- "line": 85,++ "line": 87,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14909,7 +15789,7 @@"method": "GET","path": "/me","file": "server/me/routes.js",-- "line": 202,++ "line": 206,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14919,7 +15799,7 @@"method": "GET","path": "/me/app.js","file": "server/me/routes.js",-- "line": 185,++ "line": 189,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14929,7 +15809,7 @@"method": "GET","path": "/me/objects","file": "server/me/routes.js",-- "line": 125,++ "line": 128,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14939,7 +15819,7 @@"method": "GET","path": "/me/objects/:id","file": "server/me/routes.js",-- "line": 137,++ "line": 140,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14949,7 +15829,7 @@"method": "GET","path": "/me/objects/:id","file": "server/me/routes.js",-- "line": 217,++ "line": 221,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14959,7 +15839,7 @@"method": "GET","path": "/me/ops","file": "server/me/routes.js",-- "line": 154,++ "line": 157,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14969,7 +15849,7 @@"method": "GET","path": "/me/ops","file": "server/me/routes.js",-- "line": 224,++ "line": 228,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14979,7 +15859,7 @@"method": "POST","path": "/me/ops/recompute","file": "server/me/routes.js",-- "line": 167,++ "line": 171,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14989,7 +15869,7 @@"method": "POST","path": "/me/ops/recompute","file": "server/me/routes.js",-- "line": 234,++ "line": 238,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -14999,7 +15879,7 @@"method": "GET","path": "/me/usage","file": "server/me/routes.js",-- "line": 144,++ "line": 147,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15009,7 +15889,7 @@"method": "GET","path": "/o","file": "server/objects/routes.js",-- "line": 556,++ "line": 564,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15019,7 +15899,7 @@"method": "POST","path": "/o","file": "server/objects/routes.js",-- "line": 291,++ "line": 296,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15029,7 +15909,7 @@"method": "DELETE","path": "/o/:id","file": "server/objects/routes.js",-- "line": 609,++ "line": 618,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15039,7 +15919,7 @@"method": "GET","path": "/o/:id","file": "server/objects/routes.js",-- "line": 604,++ "line": 612,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15049,7 +15929,7 @@"method": "GET","path": "/o/:id","file": "server/objects/routes.js",-- "line": 700,++ "line": 718,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15059,7 +15939,7 @@"method": "POST","path": "/o/:id/complete","file": "server/objects/routes.js",-- "line": 425,++ "line": 431,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15069,7 +15949,7 @@"method": "GET","path": "/o/:id/download","file": "server/objects/routes.js",-- "line": 641,++ "line": 650,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15079,7 +15959,7 @@"method": "GET","path": "/o/:id/holds","file": "server/objects/routes.js",-- "line": 660,++ "line": 669,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15089,7 +15969,7 @@"method": "POST","path": "/o/:id/holds","file": "server/objects/routes.js",-- "line": 672,++ "line": 688,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15099,7 +15979,7 @@"method": "DELETE","path": "/o/:id/holds/:holdId","file": "server/objects/routes.js",-- "line": 684,++ "line": 701,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15109,7 +15989,7 @@"method": "POST","path": "/o/:id/multipart","file": "server/objects/routes.js",-- "line": 468,++ "line": 474,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15119,7 +15999,7 @@"method": "DELETE","path": "/o/:id/multipart/:uploadId","file": "server/objects/routes.js",-- "line": 545,++ "line": 553,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15129,7 +16009,7 @@"method": "GET","path": "/o/:id/multipart/:uploadId","file": "server/objects/routes.js",-- "line": 499,++ "line": 505,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15139,7 +16019,7 @@"method": "POST","path": "/o/:id/multipart/:uploadId/complete","file": "server/objects/routes.js",-- "line": 508,++ "line": 515,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15149,7 +16029,7 @@"method": "POST","path": "/o/:id/restore","file": "server/objects/routes.js",-- "line": 627,++ "line": 636,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15159,7 +16039,7 @@"method": "POST","path": "/o/:id/upload-url","file": "server/objects/routes.js",-- "line": 441,++ "line": 447,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15169,7 +16049,7 @@"method": "GET","path": "/tos","file": "server/index.js",-- "line": 80,++ "line": 82,"target": "OpenVibe.Media","disposition": "keep","wave": "-",@@@ -15181,6 +16061,29 @@"paths": []},"env": {++ "OV_OAUTH_CLIENT_SECRET": [++ "server/account-data.js",++ "server/events.js",++ "server/index.js",++ "server/lineage-client.js",++ "server/objects/owner-subject.js",++ "server/revocations.js"++ ],++ "OV_NETWORK_INTERNAL_URL": [++ "server/account-data.js",++ "server/config.js",++ "server/events.js",++ "server/lineage-client.js",++ "server/revocations.js"++ ],++ "OV_OAUTH_CLIENT_ID": [++ "server/account-data.js",++ "server/events.js",++ "server/index.js",++ "server/lineage-client.js",++ "server/objects/owner-subject.js",++ "server/revocations.js"++ ],"HOST": ["server/config.js","server/drill.js",@@@ -15242,12 +16145,6 @@"OV_NETWORK_URL": ["server/config.js"],-- "OV_NETWORK_INTERNAL_URL": [-- "server/config.js",-- "server/events.js",-- "server/lineage-client.js",-- "server/revocations.js"-- ],"INTERNAL_API_KEY": ["server/config.js","server/views/service.js"@@@ -15269,20 +16166,6 @@"server/events.js","server/revocations.js"],-- "OV_OAUTH_CLIENT_SECRET": [-- "server/events.js",-- "server/index.js",-- "server/lineage-client.js",-- "server/objects/owner-subject.js",-- "server/revocations.js"-- ],-- "OV_OAUTH_CLIENT_ID": [-- "server/events.js",-- "server/index.js",-- "server/lineage-client.js",-- "server/objects/owner-subject.js",-- "server/revocations.js"-- ],"EVENTS_PUBLISH": ["server/events.js"],@@@ -15387,6 +16270,38 @@]},"outbound": [++ {++ "file": "server/account-data.js",++ "targets": [++ {++ "service": "network",++ "refs": [++ {++ "via": "/internal/events",++ "line": 4++ },++ {++ "via": "OV_NETWORK_INTERNAL_URL",++ "line": 116++ },++ {++ "via": ":4000",++ "line": 116++ },++ {++ "via": "/oauth/token",++ "line": 119++ }++ ]++ }++ ],++ "auth": [++ "bearer",++ "oauth-client"++ ],++ "timeout": true,++ "retry": false++ },{"file": "server/auth.js","targets": [@@@ -15618,7 +16533,7 @@"kind": "setInterval","name": null,"intervalMs": 43200000,-- "line": 178,++ "line": 180,"file": "server/index.js","target": "OpenVibe.Media","disposition": "keep",@@@ -15629,7 +16544,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 214,++ "line": 216,"file": "server/index.js","target": "OpenVibe.Media","disposition": "keep",@@@ -15739,7 +16654,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 595,++ "line": 627,"file": "server/vod/vod-storage.js","target": "OpenVibe.Media","disposition": "keep",@@@ -15749,7 +16664,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 56,++ "testFiles": 67,"ci": true},{@@@ -15757,13 +16672,13 @@"service": "tools","present": true,"git": {-- "head": "168e5110d062f076c2c4afe88e3fc3c53ab44613",++ "head": "4f4ed6e8f3f3c8e1a83dd644dd3c0659a7bccce4","branch": "main",-- "originMain": "168e5110d062f076c2c4afe88e3fc3c53ab44613",-- "committedAt": "2026-09-26T06:20:57-07:00"++ "originMain": "4f4ed6e8f3f3c8e1a83dd644dd3c0659a7bccce4",++ "committedAt": "2026-09-27T20:19:31-07:00"},-- "sourceFiles": 173,-- "loc": 30080,++ "sourceFiles": 176,++ "loc": 30522,"tables": [{"table": "guard_salt",@@@ -15800,6 +16715,12 @@"file": "apps/_shared/jobs/store.js","line": 55,"via": "repo"++ },++ {++ "table": "tool_job_usage",++ "file": "apps/_shared/jobs/usage.js",++ "line": 36,++ "via": "repo"}],"routes": [@@@ -15817,7 +16738,7 @@"method": "GET","path": "/","file": "apps/text/server/index.js",-- "line": 155,++ "line": 159,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15847,7 +16768,7 @@"method": "GET","path": "/api/brand","file": "apps/gateway/server/index.js",-- "line": 309,++ "line": 317,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15867,7 +16788,7 @@"method": "GET","path": "/api/context","file": "apps/audio/server/index.js",-- "line": 165,++ "line": 169,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15877,7 +16798,7 @@"method": "GET","path": "/api/context","file": "apps/docs/server/index.js",-- "line": 194,++ "line": 198,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15887,7 +16808,7 @@"method": "GET","path": "/api/context","file": "apps/img/server/index.js",-- "line": 188,++ "line": 192,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15897,7 +16818,7 @@"method": "POST","path": "/api/download","file": "apps/yt/server/index.js",-- "line": 174,++ "line": 178,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15907,7 +16828,7 @@"method": "DELETE","path": "/api/download/:id","file": "apps/yt/server/index.js",-- "line": 261,++ "line": 265,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15917,7 +16838,7 @@"method": "GET","path": "/api/download/:id","file": "apps/audio/server/index.js",-- "line": 298,++ "line": 302,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15927,7 +16848,7 @@"method": "GET","path": "/api/download/:id","file": "apps/docs/server/index.js",-- "line": 349,++ "line": 353,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15937,7 +16858,7 @@"method": "GET","path": "/api/download/:id","file": "apps/img/server/index.js",-- "line": 291,++ "line": 295,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15947,7 +16868,7 @@"method": "GET","path": "/api/download/:id","file": "apps/yt/server/index.js",-- "line": 268,++ "line": 272,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15957,7 +16878,7 @@"method": "GET","path": "/api/food-banks","file": "apps/food/server/index.js",-- "line": 137,++ "line": 141,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15967,7 +16888,7 @@"method": "GET","path": "/api/food-banks","file": "apps/maps/server/index.js",-- "line": 431,++ "line": 435,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15977,7 +16898,7 @@"method": "GET","path": "/api/foods","file": "apps/food/server/index.js",-- "line": 139,++ "line": 143,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15987,7 +16908,7 @@"method": "GET","path": "/api/foods","file": "apps/maps/server/index.js",-- "line": 452,++ "line": 456,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -15997,7 +16918,7 @@"method": "GET","path": "/api/geocode","file": "apps/food/server/index.js",-- "line": 141,++ "line": 145,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16007,7 +16928,7 @@"method": "GET","path": "/api/geocode","file": "apps/maps/server/index.js",-- "line": 153,++ "line": 157,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16017,7 +16938,7 @@"method": "GET","path": "/api/health","file": "apps/audio/server/index.js",-- "line": 158,++ "line": 162,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16027,7 +16948,7 @@"method": "GET","path": "/api/health","file": "apps/docs/server/index.js",-- "line": 187,++ "line": 191,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16037,7 +16958,7 @@"method": "GET","path": "/api/health","file": "apps/gateway/server/index.js",-- "line": 305,++ "line": 313,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16047,7 +16968,7 @@"method": "GET","path": "/api/health","file": "apps/img/server/index.js",-- "line": 181,++ "line": 185,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16057,7 +16978,7 @@"method": "GET","path": "/api/health","file": "apps/text/server/index.js",-- "line": 128,++ "line": 132,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16067,7 +16988,7 @@"method": "GET","path": "/api/health","file": "apps/yt/server/index.js",-- "line": 149,++ "line": 153,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16077,7 +16998,7 @@"method": "POST","path": "/api/info","file": "apps/docs/server/index.js",-- "line": 218,++ "line": 222,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16087,7 +17008,7 @@"method": "POST","path": "/api/info","file": "apps/yt/server/index.js",-- "line": 156,++ "line": 160,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16097,7 +17018,7 @@"method": "GET","path": "/api/internal/analytics","file": "apps/audio/server/index.js",-- "line": 347,++ "line": 351,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16107,7 +17028,7 @@"method": "GET","path": "/api/internal/analytics","file": "apps/docs/server/index.js",-- "line": 367,++ "line": 371,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16117,7 +17038,7 @@"method": "GET","path": "/api/internal/analytics","file": "apps/food/server/index.js",-- "line": 144,++ "line": 148,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16127,7 +17048,7 @@"method": "GET","path": "/api/internal/analytics","file": "apps/gateway/server/index.js",-- "line": 392,++ "line": 409,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16137,7 +17058,7 @@"method": "GET","path": "/api/internal/analytics","file": "apps/img/server/index.js",-- "line": 309,++ "line": 313,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16147,7 +17068,7 @@"method": "GET","path": "/api/internal/analytics","file": "apps/maps/server/index.js",-- "line": 474,++ "line": 478,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16157,7 +17078,7 @@"method": "GET","path": "/api/internal/analytics","file": "apps/text/server/index.js",-- "line": 116,++ "line": 120,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16167,7 +17088,7 @@"method": "GET","path": "/api/internal/analytics","file": "apps/yt/server/index.js",-- "line": 282,++ "line": 286,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16177,7 +17098,7 @@"method": "GET","path": "/api/internal/analytics/bots","file": "apps/audio/server/index.js",-- "line": 352,++ "line": 356,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16187,7 +17108,7 @@"method": "GET","path": "/api/internal/analytics/bots","file": "apps/docs/server/index.js",-- "line": 372,++ "line": 376,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16197,7 +17118,7 @@"method": "GET","path": "/api/internal/analytics/bots","file": "apps/food/server/index.js",-- "line": 149,++ "line": 153,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16207,7 +17128,7 @@"method": "GET","path": "/api/internal/analytics/bots","file": "apps/img/server/index.js",-- "line": 314,++ "line": 318,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16217,7 +17138,7 @@"method": "GET","path": "/api/internal/analytics/bots","file": "apps/maps/server/index.js",-- "line": 479,++ "line": 483,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16227,7 +17148,7 @@"method": "GET","path": "/api/internal/analytics/bots","file": "apps/text/server/index.js",-- "line": 121,++ "line": 125,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16237,7 +17158,7 @@"method": "GET","path": "/api/internal/analytics/bots","file": "apps/yt/server/index.js",-- "line": 287,++ "line": 291,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16257,7 +17178,7 @@"method": "GET","path": "/api/meal-plan","file": "apps/food/server/index.js",-- "line": 140,++ "line": 144,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16267,7 +17188,7 @@"method": "GET","path": "/api/meal-plan","file": "apps/maps/server/index.js",-- "line": 462,++ "line": 466,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16277,7 +17198,7 @@"method": "GET","path": "/api/preview/:id","file": "apps/audio/server/index.js",-- "line": 316,++ "line": 320,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16287,7 +17208,7 @@"method": "POST","path": "/api/probe","file": "apps/audio/server/index.js",-- "line": 189,++ "line": 193,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16307,7 +17228,7 @@"method": "POST","path": "/api/process","file": "apps/audio/server/index.js",-- "line": 202,++ "line": 206,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16317,7 +17238,7 @@"method": "POST","path": "/api/process","file": "apps/docs/server/index.js",-- "line": 230,++ "line": 234,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16327,7 +17248,7 @@"method": "POST","path": "/api/process","file": "apps/img/server/index.js",-- "line": 214,++ "line": 218,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16337,7 +17258,7 @@"method": "POST","path": "/api/process/direct","file": "apps/img/server/index.js",-- "line": 241,++ "line": 245,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16347,7 +17268,7 @@"method": "POST","path": "/api/process/multi","file": "apps/audio/server/index.js",-- "line": 243,++ "line": 247,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16357,7 +17278,7 @@"method": "POST","path": "/api/process/multi","file": "apps/docs/server/index.js",-- "line": 277,++ "line": 281,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16387,7 +17308,7 @@"method": "GET","path": "/api/search","file": "apps/maps/server/index.js",-- "line": 260,++ "line": 264,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16397,7 +17318,7 @@"method": "GET","path": "/api/search/stream","file": "apps/maps/server/index.js",-- "line": 305,++ "line": 309,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16407,7 +17328,7 @@"method": "GET","path": "/api/status/:id","file": "apps/yt/server/index.js",-- "line": 194,++ "line": 198,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16417,7 +17338,7 @@"method": "GET","path": "/api/status/:id/stream","file": "apps/yt/server/index.js",-- "line": 210,++ "line": 214,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16427,7 +17348,7 @@"method": "GET","path": "/api/stores","file": "apps/food/server/index.js",-- "line": 138,++ "line": 142,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16437,7 +17358,7 @@"method": "GET","path": "/api/stores","file": "apps/maps/server/index.js",-- "line": 442,++ "line": 446,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16447,7 +17368,7 @@"method": "GET","path": "/api/terrain","file": "apps/maps/server/index.js",-- "line": 421,++ "line": 425,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16457,7 +17378,7 @@"method": "GET","path": "/api/tools","file": "apps/audio/server/index.js",-- "line": 184,++ "line": 188,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16467,7 +17388,7 @@"method": "GET","path": "/api/tools","file": "apps/docs/server/index.js",-- "line": 213,++ "line": 217,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16477,7 +17398,7 @@"method": "GET","path": "/api/tools","file": "apps/img/server/index.js",-- "line": 209,++ "line": 213,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16567,7 +17488,7 @@"method": "GET","path": "/api/v1/me/recent-tools","file": "apps/gateway/server/index.js",-- "line": 203,++ "line": 207,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16583,11 +17504,21 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "POST",++ "path": "/api/v1/tools/:id/run",++ "file": "apps/gateway/server/index.js",++ "line": 266,++ "target": "OpenVibe.Tools",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "GET","path": "/api/weather","file": "apps/maps/server/index.js",-- "line": 405,++ "line": 409,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16797,7 +17728,7 @@"method": "GET","path": "/openvibe-sw.js","file": "apps/gateway/server/index.js",-- "line": 459,++ "line": 476,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16897,7 +17828,7 @@"method": "GET","path": "/sitemap.xml","file": "apps/text/server/index.js",-- "line": 149,++ "line": 153,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -16967,7 +17898,7 @@"method": "GET","path": "/tos","file": "apps/gateway/server/index.js",-- "line": 417,++ "line": 434,"target": "OpenVibe.Tools","disposition": "keep","wave": "-",@@@ -17049,6 +17980,12 @@"paths": []},"env": {++ "TOOLS_LIMITS_MINUTE": [++ "apps/_shared/actor-limits.js"++ ],++ "TOOLS_LIMITS_HOUR": [++ "apps/_shared/actor-limits.js"++ ],"NODE_ENV": ["apps/_shared/guard/caller.js","apps/_shared/guard/index.js",@@@ -17402,43 +18339,43 @@"refs": [{"via": ":4100",-- "line": 18++ "line": 19},{"via": "OV_MEDIA_INTERNAL_URL",-- "line": 54++ "line": 55},{"via": "MEDIA_URL",-- "line": 54++ "line": 55},{"via": ":4100",-- "line": 54++ "line": 55},{"via": "mediaOrigin",-- "line": 62++ "line": 63},{"via": "OV_MEDIA_URL",-- "line": 63++ "line": 64},{"via": "OV_MEDIA_INTERNAL_URL",-- "line": 143++ "line": 144},{"via": "MEDIA_URL",-- "line": 143++ "line": 144},{"via": ":4100",-- "line": 143++ "line": 144},{"via": "mediaOrigin",-- "line": 157++ "line": 158}]},@@@ -17447,19 +18384,19 @@"refs": [{"via": ":4000",-- "line": 20++ "line": 21},{"via": "OV_NETWORK_INTERNAL_URL",-- "line": 45++ "line": 46},{"via": ":4000",-- "line": 45++ "line": 46},{"via": "/oauth/token",-- "line": 47++ "line": 48}]},@@@ -17468,7 +18405,7 @@"refs": [{"via": "EVENTS_URL",-- "line": 96++ "line": 97}]}@@@ -17590,7 +18527,7 @@},{"via": "networkUrl",-- "line": 504++ "line": 521}]},@@@ -17603,11 +18540,11 @@},{"via": "communityUrl",-- "line": 318++ "line": 326},{"via": "OV_COMMUNITY_URL",-- "line": 440++ "line": 457}]},@@@ -17616,7 +18553,7 @@"refs": [{"via": "liveUrl",-- "line": 505++ "line": 522}]}@@@ -17796,7 +18733,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 123,++ "line": 124,"file": "apps/_shared/jobs/index.js","target": "OpenVibe.Tools","disposition": "keep",@@@ -17807,7 +18744,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 660,++ "line": 674,"file": "apps/_shared/jobs/system.js","target": "OpenVibe.Tools","disposition": "keep",@@@ -17917,7 +18854,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 662,++ "line": 666,"file": "apps/yt/server/downloader.js","target": "OpenVibe.Tools","disposition": "keep",@@@ -17928,7 +18865,7 @@"kind": "setInterval","name": null,"intervalMs": 5000,-- "line": 713,++ "line": 717,"file": "apps/yt/server/downloader.js","target": "OpenVibe.Tools","disposition": "keep",@@@ -17939,7 +18876,7 @@"kind": "setInterval","name": null,"intervalMs": 600000,-- "line": 138,++ "line": 142,"file": "apps/yt/server/index.js","target": "OpenVibe.Tools","disposition": "keep",@@@ -17950,7 +18887,7 @@"kind": "setInterval","name": null,"intervalMs": 500,-- "line": 255,++ "line": 259,"file": "apps/yt/server/index.js","target": "OpenVibe.Tools","disposition": "keep",@@@ -17960,7 +18897,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 49,++ "testFiles": 61,"ci": true},{@@@ -17968,13 +18905,13 @@"service": "community","present": true,"git": {-- "head": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",++ "head": "2da3501e28457fa4978c0bc4a1b3bfc9188b77b9","branch": "main",-- "originMain": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",-- "committedAt": "2026-09-26T06:13:46-07:00"++ "originMain": "2da3501e28457fa4978c0bc4a1b3bfc9188b77b9",++ "committedAt": "2026-09-27T20:14:58-07:00"},-- "sourceFiles": 63,-- "loc": 11502,++ "sourceFiles": 66,++ "loc": 12037,"tables": [{"table": "pastes",@@@ -18144,16 +19081,28 @@"line": 408,"via": "repo"},++ {++ "table": "game_progress",++ "file": "server/db.js",++ "line": 424,++ "via": "repo"++ },{"table": "import_hold","file": "server/db.js",-- "line": 425,++ "line": 431,"via": "repo"},{"table": "relay_deliveries_v2","file": "server/db.js",-- "line": 554,++ "line": 560,++ "via": "repo"++ },++ {++ "table": "account_data_events",++ "file": "server/identity/account-data.js",++ "line": 32,"via": "repo"},{@@@ -18180,7 +19129,7 @@"method": "GET","path": "/","file": "server/app.js",-- "line": 252,++ "line": 259,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18190,7 +19139,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 217,++ "line": 224,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18200,7 +19149,7 @@"method": "GET","path": "/api/pastes","file": "server/pastes/api.js",-- "line": 105,++ "line": 111,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18210,7 +19159,7 @@"method": "POST","path": "/api/pastes","file": "server/pastes/api.js",-- "line": 109,++ "line": 115,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18220,7 +19169,7 @@"method": "DELETE","path": "/api/pastes/:slug","file": "server/pastes/api.js",-- "line": 127,++ "line": 134,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18230,7 +19179,7 @@"method": "GET","path": "/api/pastes/:slug","file": "server/pastes/api.js",-- "line": 125,++ "line": 132,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18240,7 +19189,7 @@"method": "PUT","path": "/api/pastes/:slug","file": "server/pastes/api.js",-- "line": 126,++ "line": 133,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18250,7 +19199,7 @@"method": "POST","path": "/api/pastes/:slug/ai","file": "server/pastes/api.js",-- "line": 130,++ "line": 138,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18260,7 +19209,7 @@"method": "POST","path": "/api/pastes/:slug/censor","file": "server/pastes/api.js",-- "line": 129,++ "line": 136,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18270,7 +19219,7 @@"method": "GET","path": "/api/pastes/:slug/comments","file": "server/pastes/api.js",-- "line": 139,++ "line": 147,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18280,7 +19229,7 @@"method": "POST","path": "/api/pastes/:slug/comments","file": "server/pastes/api.js",-- "line": 140,++ "line": 148,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18290,7 +19239,7 @@"method": "DELETE","path": "/api/pastes/:slug/comments/:commentId","file": "server/pastes/api.js",-- "line": 143,++ "line": 151,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18300,7 +19249,7 @@"method": "POST","path": "/api/pastes/:slug/copy","file": "server/pastes/api.js",-- "line": 137,++ "line": 145,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18310,7 +19259,7 @@"method": "POST","path": "/api/pastes/:slug/fork","file": "server/pastes/api.js",-- "line": 135,++ "line": 143,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18320,7 +19269,7 @@"method": "POST","path": "/api/pastes/:slug/like","file": "server/pastes/api.js",-- "line": 136,++ "line": 144,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18330,7 +19279,7 @@"method": "GET","path": "/api/pastes/:slug/raw","file": "server/pastes/api.js",-- "line": 132,++ "line": 140,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18340,7 +19289,7 @@"method": "POST","path": "/api/pastes/:slug/set-avatar","file": "server/pastes/api.js",-- "line": 146,++ "line": 154,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18350,7 +19299,7 @@"method": "GET","path": "/api/pastes/:slug/versions","file": "server/pastes/api.js",-- "line": 133,++ "line": 141,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18360,7 +19309,7 @@"method": "DELETE","path": "/api/pastes/admin/forks","file": "server/pastes/api.js",-- "line": 116,++ "line": 122,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18370,7 +19319,7 @@"method": "GET","path": "/api/pastes/admin/forks","file": "server/pastes/api.js",-- "line": 115,++ "line": 121,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18380,7 +19329,7 @@"method": "GET","path": "/api/pastes/admin/stats","file": "server/pastes/api.js",-- "line": 114,++ "line": 120,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18390,7 +19339,7 @@"method": "POST","path": "/api/pastes/bulk","file": "server/pastes/api.js",-- "line": 117,++ "line": 123,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18400,7 +19349,7 @@"method": "GET","path": "/api/pastes/by-user/:username","file": "server/pastes/api.js",-- "line": 122,++ "line": 129,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18410,7 +19359,7 @@"method": "GET","path": "/api/pastes/config","file": "server/pastes/api.js",-- "line": 112,++ "line": 118,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18420,7 +19369,7 @@"method": "POST","path": "/api/pastes/screenshot","file": "server/pastes/api.js",-- "line": 119,++ "line": 126,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18430,7 +19379,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 224,++ "line": 231,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18440,7 +19389,7 @@"method": "DELETE","path": "/api/v1/comments/:commentId","file": "server/comments/api.js",-- "line": 45,++ "line": 51,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18450,7 +19399,7 @@"method": "GET","path": "/api/v1/comments/:commentId","file": "server/comments/api.js",-- "line": 43,++ "line": 49,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18460,7 +19409,7 @@"method": "PATCH","path": "/api/v1/comments/:commentId","file": "server/comments/api.js",-- "line": 44,++ "line": 50,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18470,7 +19419,7 @@"method": "POST","path": "/api/v1/comments/:commentId/votes","file": "server/comments/api.js",-- "line": 46,++ "line": 52,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18480,7 +19429,7 @@"method": "GET","path": "/api/v1/comments/threads/:id","file": "server/comments/api.js",-- "line": 39,++ "line": 45,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18490,7 +19439,7 @@"method": "POST","path": "/api/v1/comments/threads/:id/comments","file": "server/comments/api.js",-- "line": 40,++ "line": 46,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18500,7 +19449,7 @@"method": "PUT","path": "/api/v1/comments/threads/:id/visibility","file": "server/comments/api.js",-- "line": 42,++ "line": 48,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18510,7 +19459,7 @@"method": "POST","path": "/api/v1/comments/threads/resolve","file": "server/comments/api.js",-- "line": 37,++ "line": 43,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18520,7 +19469,7 @@"method": "GET","path": "/api/v1/posts","file": "server/forum/api.js",-- "line": 57,++ "line": 63,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18530,7 +19479,7 @@"method": "GET","path": "/api/v1/posts","file": "server/forum/api.js",-- "line": 110,++ "line": 121,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18540,7 +19489,7 @@"method": "POST","path": "/api/v1/posts","file": "server/forum/api.js",-- "line": 58,++ "line": 64,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18550,7 +19499,7 @@"method": "PUT","path": "/api/v1/posts/:group","file": "server/forum/api.js",-- "line": 111,++ "line": 122,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18560,7 +19509,7 @@"method": "DELETE","path": "/api/v1/posts/:id","file": "server/forum/api.js",-- "line": 98,++ "line": 107,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18570,7 +19519,7 @@"method": "PUT","path": "/api/v1/posts/:id","file": "server/forum/api.js",-- "line": 96,++ "line": 105,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18580,7 +19529,7 @@"method": "POST","path": "/api/v1/posts/:id/reactions","file": "server/forum/api.js",-- "line": 97,++ "line": 106,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18590,7 +19539,7 @@"method": "GET","path": "/api/v1/posts/:id/versions","file": "server/forum/api.js",-- "line": 99,++ "line": 108,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18600,7 +19549,7 @@"method": "GET","path": "/api/v1/posts/:space","file": "server/forum/api.js",-- "line": 60,++ "line": 66,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18610,7 +19559,7 @@"method": "POST","path": "/api/v1/posts/:space/attachments","file": "server/forum/api.js",-- "line": 68,++ "line": 75,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18620,7 +19569,7 @@"method": "GET","path": "/api/v1/posts/:space/categories","file": "server/forum/api.js",-- "line": 62,++ "line": 68,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18630,7 +19579,7 @@"method": "DELETE","path": "/api/v1/posts/:space/categories/:category","file": "server/forum/api.js",-- "line": 70,++ "line": 77,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18640,7 +19589,7 @@"method": "PUT","path": "/api/v1/posts/:space/categories/:category","file": "server/forum/api.js",-- "line": 69,++ "line": 76,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18650,7 +19599,7 @@"method": "DELETE","path": "/api/v1/posts/:space/chat-room","file": "server/forum/api.js",-- "line": 84,++ "line": 91,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18660,7 +19609,7 @@"method": "PUT","path": "/api/v1/posts/:space/chat-room","file": "server/forum/api.js",-- "line": 83,++ "line": 90,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18670,7 +19619,7 @@"method": "PUT","path": "/api/v1/posts/:space/members-only","file": "server/forum/api.js",-- "line": 81,++ "line": 88,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18680,7 +19629,7 @@"method": "PUT","path": "/api/v1/posts/:space/settings","file": "server/forum/api.js",-- "line": 59,++ "line": 65,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18690,7 +19639,7 @@"method": "GET","path": "/api/v1/posts/:space/threads","file": "server/forum/api.js",-- "line": 61,++ "line": 67,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18700,7 +19649,7 @@"method": "POST","path": "/api/v1/posts/:space/threads","file": "server/forum/api.js",-- "line": 74,++ "line": 81,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18710,7 +19659,7 @@"method": "DELETE","path": "/api/v1/posts/:space/threads/:slug","file": "server/forum/api.js",-- "line": 76,++ "line": 83,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18720,7 +19669,7 @@"method": "GET","path": "/api/v1/posts/:space/threads/:slug","file": "server/forum/api.js",-- "line": 75,++ "line": 82,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18730,7 +19679,7 @@"method": "PUT","path": "/api/v1/posts/:space/threads/:slug/category","file": "server/forum/api.js",-- "line": 71,++ "line": 78,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18740,7 +19689,7 @@"method": "POST","path": "/api/v1/posts/:space/threads/:slug/crosspost","file": "server/forum/api.js",-- "line": 73,++ "line": 80,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18750,7 +19699,7 @@"method": "PUT","path": "/api/v1/posts/:space/threads/:slug/members-only","file": "server/forum/api.js",-- "line": 80,++ "line": 87,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18760,7 +19709,7 @@"method": "POST","path": "/api/v1/posts/:space/threads/:slug/posts","file": "server/forum/api.js",-- "line": 77,++ "line": 84,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18770,7 +19719,7 @@"method": "PUT","path": "/api/v1/posts/:space/threads/:slug/state","file": "server/forum/api.js",-- "line": 79,++ "line": 86,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18780,7 +19729,7 @@"method": "PUT","path": "/api/v1/posts/:space/threads/:slug/status","file": "server/forum/api.js",-- "line": 72,++ "line": 79,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18790,7 +19739,7 @@"method": "POST","path": "/api/v1/posts/:space/threads/:slug/votes","file": "server/forum/api.js",-- "line": 78,++ "line": 85,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18800,7 +19749,7 @@"method": "GET","path": "/api/v1/pulse","file": "server/pulse/api.js",-- "line": 27,++ "line": 31,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18810,7 +19759,7 @@"method": "POST","path": "/api/v1/pulse/items","file": "server/pulse/api.js",-- "line": 28,++ "line": 32,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18820,7 +19769,7 @@"method": "DELETE","path": "/api/v1/pulse/items/:service/:type/:id","file": "server/pulse/api.js",-- "line": 29,++ "line": 33,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18830,7 +19779,7 @@"method": "GET","path": "/api/v1/relay/deliveries","file": "server/relay/api.js",-- "line": 54,++ "line": 58,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18840,7 +19789,7 @@"method": "POST","path": "/api/v1/relay/deliveries/:id/drop","file": "server/relay/api.js",-- "line": 63,++ "line": 67,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18850,7 +19799,7 @@"method": "POST","path": "/api/v1/relay/deliveries/:id/retry","file": "server/relay/api.js",-- "line": 59,++ "line": 63,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18860,7 +19809,7 @@"method": "GET","path": "/api/v1/relay/inbound","file": "server/relay/api.js",-- "line": 67,++ "line": 71,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18870,7 +19819,7 @@"method": "POST","path": "/api/v1/relay/inbound/:id/dismiss","file": "server/relay/api.js",-- "line": 70,++ "line": 74,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18880,7 +19829,7 @@"method": "GET","path": "/api/v1/relay/mappings","file": "server/relay/api.js",-- "line": 74,++ "line": 78,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18890,7 +19839,7 @@"method": "POST","path": "/api/v1/relay/mappings","file": "server/relay/api.js",-- "line": 75,++ "line": 79,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18900,7 +19849,7 @@"method": "PUT","path": "/api/v1/relay/mappings/:id","file": "server/relay/api.js",-- "line": 85,++ "line": 89,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18910,7 +19859,7 @@"method": "GET","path": "/api/v1/relay/status","file": "server/relay/api.js",-- "line": 53,++ "line": 57,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18920,7 +19869,7 @@"method": "GET","path": "/api/v1/space-groups","file": "server/forum/api.js",-- "line": 57,++ "line": 63,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18930,7 +19879,7 @@"method": "GET","path": "/api/v1/space-groups","file": "server/forum/api.js",-- "line": 110,++ "line": 121,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18940,7 +19889,7 @@"method": "POST","path": "/api/v1/space-groups","file": "server/forum/api.js",-- "line": 58,++ "line": 64,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18950,7 +19899,7 @@"method": "PUT","path": "/api/v1/space-groups/:group","file": "server/forum/api.js",-- "line": 111,++ "line": 122,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18960,7 +19909,7 @@"method": "DELETE","path": "/api/v1/space-groups/:id","file": "server/forum/api.js",-- "line": 98,++ "line": 107,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18970,7 +19919,7 @@"method": "PUT","path": "/api/v1/space-groups/:id","file": "server/forum/api.js",-- "line": 96,++ "line": 105,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18980,7 +19929,7 @@"method": "POST","path": "/api/v1/space-groups/:id/reactions","file": "server/forum/api.js",-- "line": 97,++ "line": 106,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -18990,7 +19939,7 @@"method": "GET","path": "/api/v1/space-groups/:id/versions","file": "server/forum/api.js",-- "line": 99,++ "line": 108,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19000,7 +19949,7 @@"method": "GET","path": "/api/v1/space-groups/:space","file": "server/forum/api.js",-- "line": 60,++ "line": 66,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19010,7 +19959,7 @@"method": "POST","path": "/api/v1/space-groups/:space/attachments","file": "server/forum/api.js",-- "line": 68,++ "line": 75,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19020,7 +19969,7 @@"method": "GET","path": "/api/v1/space-groups/:space/categories","file": "server/forum/api.js",-- "line": 62,++ "line": 68,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19030,7 +19979,7 @@"method": "DELETE","path": "/api/v1/space-groups/:space/categories/:category","file": "server/forum/api.js",-- "line": 70,++ "line": 77,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19040,7 +19989,7 @@"method": "PUT","path": "/api/v1/space-groups/:space/categories/:category","file": "server/forum/api.js",-- "line": 69,++ "line": 76,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19050,7 +19999,7 @@"method": "DELETE","path": "/api/v1/space-groups/:space/chat-room","file": "server/forum/api.js",-- "line": 84,++ "line": 91,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19060,7 +20009,7 @@"method": "PUT","path": "/api/v1/space-groups/:space/chat-room","file": "server/forum/api.js",-- "line": 83,++ "line": 90,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19070,7 +20019,7 @@"method": "PUT","path": "/api/v1/space-groups/:space/members-only","file": "server/forum/api.js",-- "line": 81,++ "line": 88,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19080,7 +20029,7 @@"method": "PUT","path": "/api/v1/space-groups/:space/settings","file": "server/forum/api.js",-- "line": 59,++ "line": 65,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19090,7 +20039,7 @@"method": "GET","path": "/api/v1/space-groups/:space/threads","file": "server/forum/api.js",-- "line": 61,++ "line": 67,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19100,7 +20049,7 @@"method": "POST","path": "/api/v1/space-groups/:space/threads","file": "server/forum/api.js",-- "line": 74,++ "line": 81,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19110,7 +20059,7 @@"method": "DELETE","path": "/api/v1/space-groups/:space/threads/:slug","file": "server/forum/api.js",-- "line": 76,++ "line": 83,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19120,7 +20069,7 @@"method": "GET","path": "/api/v1/space-groups/:space/threads/:slug","file": "server/forum/api.js",-- "line": 75,++ "line": 82,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19130,7 +20079,7 @@"method": "PUT","path": "/api/v1/space-groups/:space/threads/:slug/category","file": "server/forum/api.js",-- "line": 71,++ "line": 78,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19140,7 +20089,7 @@"method": "POST","path": "/api/v1/space-groups/:space/threads/:slug/crosspost","file": "server/forum/api.js",-- "line": 73,++ "line": 80,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19150,7 +20099,7 @@"method": "PUT","path": "/api/v1/space-groups/:space/threads/:slug/members-only","file": "server/forum/api.js",-- "line": 80,++ "line": 87,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19160,7 +20109,7 @@"method": "POST","path": "/api/v1/space-groups/:space/threads/:slug/posts","file": "server/forum/api.js",-- "line": 77,++ "line": 84,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19170,7 +20119,7 @@"method": "PUT","path": "/api/v1/space-groups/:space/threads/:slug/state","file": "server/forum/api.js",-- "line": 79,++ "line": 86,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19180,7 +20129,7 @@"method": "PUT","path": "/api/v1/space-groups/:space/threads/:slug/status","file": "server/forum/api.js",-- "line": 72,++ "line": 79,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19190,7 +20139,7 @@"method": "POST","path": "/api/v1/space-groups/:space/threads/:slug/votes","file": "server/forum/api.js",-- "line": 78,++ "line": 85,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19200,7 +20149,7 @@"method": "GET","path": "/api/v1/spaces","file": "server/forum/api.js",-- "line": 57,++ "line": 63,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19210,7 +20159,7 @@"method": "GET","path": "/api/v1/spaces","file": "server/forum/api.js",-- "line": 110,++ "line": 121,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19220,7 +20169,7 @@"method": "POST","path": "/api/v1/spaces","file": "server/forum/api.js",-- "line": 58,++ "line": 64,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19230,7 +20179,7 @@"method": "PUT","path": "/api/v1/spaces/:group","file": "server/forum/api.js",-- "line": 111,++ "line": 122,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19240,7 +20189,7 @@"method": "DELETE","path": "/api/v1/spaces/:id","file": "server/forum/api.js",-- "line": 98,++ "line": 107,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19250,7 +20199,7 @@"method": "PUT","path": "/api/v1/spaces/:id","file": "server/forum/api.js",-- "line": 96,++ "line": 105,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19260,7 +20209,7 @@"method": "POST","path": "/api/v1/spaces/:id/reactions","file": "server/forum/api.js",-- "line": 97,++ "line": 106,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19270,7 +20219,7 @@"method": "GET","path": "/api/v1/spaces/:id/versions","file": "server/forum/api.js",-- "line": 99,++ "line": 108,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19280,7 +20229,7 @@"method": "GET","path": "/api/v1/spaces/:space","file": "server/forum/api.js",-- "line": 60,++ "line": 66,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19290,7 +20239,7 @@"method": "POST","path": "/api/v1/spaces/:space/attachments","file": "server/forum/api.js",-- "line": 68,++ "line": 75,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19300,7 +20249,7 @@"method": "GET","path": "/api/v1/spaces/:space/categories","file": "server/forum/api.js",-- "line": 62,++ "line": 68,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19310,7 +20259,7 @@"method": "DELETE","path": "/api/v1/spaces/:space/categories/:category","file": "server/forum/api.js",-- "line": 70,++ "line": 77,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19320,7 +20269,7 @@"method": "PUT","path": "/api/v1/spaces/:space/categories/:category","file": "server/forum/api.js",-- "line": 69,++ "line": 76,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19330,7 +20279,7 @@"method": "DELETE","path": "/api/v1/spaces/:space/chat-room","file": "server/forum/api.js",-- "line": 84,++ "line": 91,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19340,7 +20289,7 @@"method": "PUT","path": "/api/v1/spaces/:space/chat-room","file": "server/forum/api.js",-- "line": 83,++ "line": 90,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19350,7 +20299,7 @@"method": "PUT","path": "/api/v1/spaces/:space/members-only","file": "server/forum/api.js",-- "line": 81,++ "line": 88,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19360,7 +20309,7 @@"method": "PUT","path": "/api/v1/spaces/:space/settings","file": "server/forum/api.js",-- "line": 59,++ "line": 65,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19370,7 +20319,7 @@"method": "GET","path": "/api/v1/spaces/:space/threads","file": "server/forum/api.js",-- "line": 61,++ "line": 67,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19380,7 +20329,7 @@"method": "POST","path": "/api/v1/spaces/:space/threads","file": "server/forum/api.js",-- "line": 74,++ "line": 81,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19390,7 +20339,7 @@"method": "DELETE","path": "/api/v1/spaces/:space/threads/:slug","file": "server/forum/api.js",-- "line": 76,++ "line": 83,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19400,7 +20349,7 @@"method": "GET","path": "/api/v1/spaces/:space/threads/:slug","file": "server/forum/api.js",-- "line": 75,++ "line": 82,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19410,7 +20359,7 @@"method": "PUT","path": "/api/v1/spaces/:space/threads/:slug/category","file": "server/forum/api.js",-- "line": 71,++ "line": 78,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19420,7 +20369,7 @@"method": "POST","path": "/api/v1/spaces/:space/threads/:slug/crosspost","file": "server/forum/api.js",-- "line": 73,++ "line": 80,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19430,7 +20379,7 @@"method": "PUT","path": "/api/v1/spaces/:space/threads/:slug/members-only","file": "server/forum/api.js",-- "line": 80,++ "line": 87,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19440,7 +20389,7 @@"method": "POST","path": "/api/v1/spaces/:space/threads/:slug/posts","file": "server/forum/api.js",-- "line": 77,++ "line": 84,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19450,7 +20399,7 @@"method": "PUT","path": "/api/v1/spaces/:space/threads/:slug/state","file": "server/forum/api.js",-- "line": 79,++ "line": 86,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19460,7 +20409,7 @@"method": "PUT","path": "/api/v1/spaces/:space/threads/:slug/status","file": "server/forum/api.js",-- "line": 72,++ "line": 79,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19470,7 +20419,7 @@"method": "POST","path": "/api/v1/spaces/:space/threads/:slug/votes","file": "server/forum/api.js",-- "line": 78,++ "line": 85,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19520,7 +20469,7 @@"method": "GET","path": "/feed.xml","file": "server/app.js",-- "line": 244,++ "line": 251,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19530,7 +20479,7 @@"method": "POST","path": "/internal/events","file": "server/pulse/consumer.js",-- "line": 74,++ "line": 109,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19540,7 +20489,7 @@"method": "GET","path": "/llms.txt","file": "server/app.js",-- "line": 242,++ "line": 249,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19580,7 +20529,7 @@"method": "GET","path": "/my","file": "server/app.js",-- "line": 388,++ "line": 399,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19590,7 +20539,7 @@"method": "GET","path": "/new","file": "server/app.js",-- "line": 339,++ "line": 350,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19600,7 +20549,7 @@"method": "POST","path": "/new","file": "server/app.js",-- "line": 350,++ "line": 361,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19610,7 +20559,7 @@"method": "GET","path": "/p/:slug","file": "server/app.js",-- "line": 284,++ "line": 291,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19620,7 +20569,7 @@"method": "GET","path": "/p/:slug/download","file": "server/app.js",-- "line": 327,++ "line": 338,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19630,7 +20579,7 @@"method": "GET","path": "/p/:slug/raw","file": "server/app.js",-- "line": 303,++ "line": 310,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19640,7 +20589,7 @@"method": "GET","path": "/p/:slug/raw","file": "server/app.js",-- "line": 323,++ "line": 334,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19650,7 +20599,7 @@"method": "GET","path": "/p/:slug/screenshot","file": "server/app.js",-- "line": 316,++ "line": 323,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19660,7 +20609,7 @@"method": "GET","path": "/p/:slug/screenshot","file": "server/app.js",-- "line": 324,++ "line": 335,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19670,7 +20619,7 @@"method": "GET","path": "/pastes","file": "server/app.js",-- "line": 276,++ "line": 283,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19680,7 +20629,7 @@"method": "GET","path": "/pastes/:slug","file": "server/app.js",-- "line": 282,++ "line": 289,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19690,7 +20639,7 @@"method": "GET","path": "/pulse","file": "server/app.js",-- "line": 380,++ "line": 391,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19710,7 +20659,7 @@"method": "GET","path": "/robots.txt","file": "server/app.js",-- "line": 241,++ "line": 248,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19940,7 +20889,7 @@"method": "GET","path": "/search","file": "server/app.js",-- "line": 261,++ "line": 268,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19950,7 +20899,7 @@"method": "GET","path": "/sitemap.xml","file": "server/app.js",-- "line": 243,++ "line": 250,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19960,7 +20909,7 @@"method": "GET","path": "/tos","file": "server/app.js",-- "line": 114,++ "line": 115,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -19970,7 +20919,7 @@"method": "GET","path": "/updates","file": "server/app.js",-- "line": 257,++ "line": 264,"target": "OpenVibe.Community","disposition": "keep","wave": "-",@@@ -20001,6 +20950,12 @@"TRUST_PROXY": ["server/config.js"],++ "COMMUNITY_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "COMMUNITY_LIMITS_HOUR": [++ "server/config.js"++ ],"OV_NETWORK_URL": ["server/config.js"],@@@ -20401,7 +21356,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 48,++ "testFiles": 61,"ci": true},{@@@ -20409,14 +21364,20 @@"service": "games","present": true,"git": {-- "head": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",++ "head": "eb2d00880d3231b2c68cb1753b4542044edef1e5","branch": "main",-- "originMain": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",-- "committedAt": "2026-09-26T05:39:23-07:00"++ "originMain": "eb2d00880d3231b2c68cb1753b4542044edef1e5",++ "committedAt": "2026-09-27T20:16:07-07:00"},-- "sourceFiles": 122,-- "loc": 23563,++ "sourceFiles": 126,++ "loc": 24425,"tables": [++ {++ "table": "account_data_events",++ "file": "apps/server/src/platform/accountData.ts",++ "line": 47,++ "via": "repo"++ },{"table": "world_entities","file": "packages/persistence/src/sqlite/sqliteStore.ts",@@@ -20513,7 +21474,7 @@"method": "ANY","path": "/","file": "apps/server/src/net/httpServer.ts",-- "line": 672,++ "line": 685,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20523,7 +21484,7 @@"method": "ANY","path": "/api","file": "apps/server/src/net/httpServer.ts",-- "line": 634,++ "line": 647,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20533,7 +21494,7 @@"method": "ANY","path": "/api/*","file": "apps/server/src/net/httpServer.ts",-- "line": 634,++ "line": 647,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20543,7 +21504,7 @@"method": "ANY","path": "/api/characters","file": "apps/server/src/net/httpServer.ts",-- "line": 330,++ "line": 343,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20553,7 +21514,7 @@"method": "POST","path": "/api/map","file": "apps/server/src/net/httpServer.ts",-- "line": 178,++ "line": 181,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20563,7 +21524,7 @@"method": "POST","path": "/api/map-assets","file": "apps/server/src/net/httpServer.ts",-- "line": 248,++ "line": 256,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20573,7 +21534,7 @@"method": "POST","path": "/api/texture","file": "apps/server/src/net/httpServer.ts",-- "line": 248,++ "line": 256,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20583,7 +21544,7 @@"method": "ANY","path": "/auth/*","file": "apps/server/src/net/httpServer.ts",-- "line": 350,++ "line": 363,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20593,7 +21554,7 @@"method": "ANY","path": "/auth/callback","file": "apps/server/src/net/httpServer.ts",-- "line": 416,++ "line": 429,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20603,7 +21564,7 @@"method": "ANY","path": "/auth/fedcm","file": "apps/server/src/net/httpServer.ts",-- "line": 502,++ "line": 515,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20613,7 +21574,7 @@"method": "ANY","path": "/auth/login","file": "apps/server/src/net/httpServer.ts",-- "line": 365,++ "line": 378,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20623,7 +21584,7 @@"method": "ANY","path": "/auth/logout","file": "apps/server/src/net/httpServer.ts",-- "line": 578,++ "line": 591,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20633,7 +21594,7 @@"method": "ANY","path": "/auth/me","file": "apps/server/src/net/httpServer.ts",-- "line": 595,++ "line": 608,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20643,7 +21604,7 @@"method": "ANY","path": "/canvas","file": "apps/server/src/net/httpServer.ts",-- "line": 666,++ "line": 679,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20653,7 +21614,7 @@"method": "ANY","path": "/editor","file": "apps/server/src/net/httpServer.ts",-- "line": 678,++ "line": 691,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20663,7 +21624,7 @@"method": "ANY","path": "/editor.html","file": "apps/server/src/net/httpServer.ts",-- "line": 646,++ "line": 659,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20673,7 +21634,7 @@"method": "ANY","path": "/editor/","file": "apps/server/src/net/httpServer.ts",-- "line": 658,++ "line": 671,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20683,7 +21644,7 @@"method": "ANY","path": "/game","file": "apps/server/src/net/httpServer.ts",-- "line": 666,++ "line": 679,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20693,7 +21654,7 @@"method": "ANY","path": "/game","file": "apps/server/src/net/httpServer.ts",-- "line": 667,++ "line": 680,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20703,7 +21664,7 @@"method": "ANY","path": "/healthz","file": "apps/server/src/net/httpServer.ts",-- "line": 613,++ "line": 626,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20713,7 +21674,7 @@"method": "ANY","path": "/map-assets/*","file": "apps/server/src/net/httpServer.ts",-- "line": 304,++ "line": 317,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20723,7 +21684,7 @@"method": "ANY","path": "/map.json","file": "apps/server/src/net/httpServer.ts",-- "line": 165,++ "line": 168,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20733,7 +21694,7 @@"method": "ANY","path": "/metrics","file": "apps/server/src/net/httpServer.ts",-- "line": 618,++ "line": 631,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20743,7 +21704,7 @@"method": "ANY","path": "/play","file": "apps/server/src/net/httpServer.ts",-- "line": 653,++ "line": 666,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20753,7 +21714,7 @@"method": "ANY","path": "/play","file": "apps/server/src/net/httpServer.ts",-- "line": 676,++ "line": 689,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20763,7 +21724,7 @@"method": "ANY","path": "/play.html","file": "apps/server/src/net/httpServer.ts",-- "line": 646,++ "line": 659,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20773,7 +21734,7 @@"method": "ANY","path": "/play.html","file": "apps/server/src/net/httpServer.ts",-- "line": 648,++ "line": 661,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20783,7 +21744,7 @@"method": "ANY","path": "/play/","file": "apps/server/src/net/httpServer.ts",-- "line": 653,++ "line": 666,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20793,7 +21754,7 @@"method": "ANY","path": "/play/","file": "apps/server/src/net/httpServer.ts",-- "line": 658,++ "line": 671,"target": "OpenVibe.Games","disposition": "keep","wave": "-",@@@ -20815,7 +21776,7 @@{"path": "/ws","file": "apps/server/src/main.ts",-- "line": 320++ "line": 382}]},@@@ -20886,6 +21847,12 @@"LOG_LEVEL": ["apps/server/src/main.ts"],++ "GAMES_LIMITS_MINUTE": [++ "apps/server/src/net/actorLimits.ts"++ ],++ "GAMES_LIMITS_HOUR": [++ "apps/server/src/net/actorLimits.ts"++ ],"RELEASE_SHA": ["apps/server/src/observability/release.ts"],@@@ -20902,19 +21869,19 @@"refs": [{"via": "/api/auth/me",-- "line": 363++ "line": 376},{"via": "/api/auth/me",-- "line": 395++ "line": 408},{"via": "/oauth/token",-- "line": 460++ "line": 473},{"via": "/oauth/token",-- "line": 539++ "line": 552}]}@@@ -20962,7 +21929,7 @@"kind": "setInterval","name": null,"intervalMs": 21600000,-- "line": 162,++ "line": 190,"file": "apps/server/src/main.ts","target": "OpenVibe.Games","disposition": "keep",@@@ -20973,7 +21940,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 350,++ "line": 412,"file": "apps/server/src/main.ts","target": "OpenVibe.Games","disposition": "keep",@@@ -21005,7 +21972,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 76,++ "testFiles": 82,"ci": true},{@@@ -21013,13 +21980,13 @@"service": "sites","present": true,"git": {-- "head": "3802ee3d9ada9b8490134ece350420e627866a8c",++ "head": "304e8b12b535f4b562f23027ae84f1a5d515cc6c","branch": "main",-- "originMain": "3802ee3d9ada9b8490134ece350420e627866a8c",-- "committedAt": "2026-09-26T06:18:20-07:00"++ "originMain": "304e8b12b535f4b562f23027ae84f1a5d515cc6c",++ "committedAt": "2026-09-27T20:13:57-07:00"},"sourceFiles": 1,-- "loc": 540,++ "loc": 555,"tables": [],"routes": [],"ws": {@@@ -21036,79 +22003,63 @@"refs": [{"via": "networkUrl",-- "line": 100++ "line": 104},{"via": "networkUrl",-- "line": 111++ "line": 115},{"via": "networkUrl",-- "line": 111++ "line": 115},{"via": "networkUrl",-- "line": 112-- },-- {-- "via": "networkUrl",-- "line": 112-- },-- {-- "via": "networkUrl",-- "line": 114++ "line": 116},{"via": "networkUrl",-- "line": 145++ "line": 116},{"via": "networkUrl",-- "line": 216++ "line": 118},{"via": "networkUrl",-- "line": 217++ "line": 220},{"via": "networkUrl",-- "line": 266++ "line": 221},{"via": "networkUrl",-- "line": 267++ "line": 275},{"via": "networkUrl",-- "line": 268++ "line": 275},{"via": "networkUrl",-- "line": 271++ "line": 276},{"via": "networkUrl",-- "line": 271++ "line": 276},{"via": "networkUrl",-- "line": 272++ "line": 287},{"via": "networkUrl",-- "line": 272++ "line": 322},{"via": "networkUrl",-- "line": 283-- },-- {-- "via": "networkUrl",-- "line": 318-- },-- {-- "via": "networkUrl",-- "line": 501++ "line": 514}]}@@@ -21123,7 +22074,7 @@"jobs": [],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 1,++ "testFiles": 2,"ci": true},{@@@ -21131,54 +22082,60 @@"service": "events","present": true,"git": {-- "head": "eb98f8cad2a738fec45f1c10e373081532c83e91",++ "head": "19919ece79707eed051c3f18ab37b7fdb6d939a6","branch": "main",-- "originMain": "eb98f8cad2a738fec45f1c10e373081532c83e91",-- "committedAt": "2026-09-26T06:14:37-07:00"++ "originMain": "19919ece79707eed051c3f18ab37b7fdb6d939a6",++ "committedAt": "2026-09-27T20:03:54-07:00"},-- "sourceFiles": 18,-- "loc": 3024,++ "sourceFiles": 20,++ "loc": 3357,"tables": [{"table": "sequences","file": "server/store.js",-- "line": 20,++ "line": 21,"via": "repo"},{"table": "events","file": "server/store.js",-- "line": 24,++ "line": 25,"via": "repo"},{"table": "subscriptions","file": "server/store.js",-- "line": 48,++ "line": 49,"via": "repo"},{"table": "deliveries","file": "server/store.js",-- "line": 61,++ "line": 62,"via": "repo"},{"table": "consumer_checkpoints","file": "server/store.js",-- "line": 79,++ "line": 80,"via": "repo"},{"table": "app_revocations","file": "server/store.js",-- "line": 90,++ "line": 91,"via": "repo"},{"table": "idempotency_receipts","file": "server/store.js",-- "line": 99,++ "line": 100,++ "via": "repo"++ },++ {++ "table": "app_usage",++ "file": "server/usage.js",++ "line": 40,"via": "repo"}],@@@ -21187,7 +22144,7 @@"method": "GET","path": "/","file": "server/app.js",-- "line": 76,++ "line": 80,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21197,7 +22154,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 39,++ "line": 40,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21207,7 +22164,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 70,++ "line": 71,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21217,7 +22174,7 @@"method": "GET","path": "/api/v1/checkpoints","file": "server/api/read.js",-- "line": 94,++ "line": 98,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21227,7 +22184,7 @@"method": "PUT","path": "/api/v1/checkpoints","file": "server/api/read.js",-- "line": 103,++ "line": 107,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21237,7 +22194,7 @@"method": "GET","path": "/api/v1/deliveries","file": "server/api/read.js",-- "line": 114,++ "line": 118,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21247,7 +22204,7 @@"method": "POST","path": "/api/v1/deliveries/replay","file": "server/api/read.js",-- "line": 139,++ "line": 145,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21257,7 +22214,7 @@"method": "GET","path": "/api/v1/events","file": "server/api/read.js",-- "line": 58,++ "line": 62,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21267,7 +22224,7 @@"method": "POST","path": "/api/v1/events","file": "server/api/publish.js",-- "line": 80,++ "line": 99,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21277,7 +22234,7 @@"method": "GET","path": "/api/v1/events/:id","file": "server/api/read.js",-- "line": 85,++ "line": 89,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21287,7 +22244,7 @@"method": "GET","path": "/api/v1/subscriptions","file": "server/api/subscriptions.js",-- "line": 133,++ "line": 142,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21297,7 +22254,7 @@"method": "POST","path": "/api/v1/subscriptions","file": "server/api/subscriptions.js",-- "line": 74,++ "line": 83,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21307,7 +22264,7 @@"method": "GET","path": "/api/v1/subscriptions/:id","file": "server/api/subscriptions.js",-- "line": 137,++ "line": 146,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21317,7 +22274,7 @@"method": "POST","path": "/api/v1/subscriptions/:id/${action}","file": "server/api/subscriptions.js",-- "line": 162,++ "line": 172,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21327,7 +22284,7 @@"method": "POST","path": "/api/v1/subscriptions/:id/rotate-secret","file": "server/api/subscriptions.js",-- "line": 145,++ "line": 154,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21357,7 +22314,7 @@"method": "GET","path": "/realtime/stream","file": "server/app.js",-- "line": 35,++ "line": 36,"target": "OpenVibe.Events","disposition": "keep","wave": "-",@@@ -21471,6 +22428,21 @@"EVENTS_APP_SANDBOX_RETENTION_DAYS": ["server/config.js"],++ "EVENTS_LIMITS": [++ "server/config.js"++ ],++ "EVENTS_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "EVENTS_LIMITS_HOUR": [++ "server/config.js"++ ],++ "EVENTS_USAGE": [++ "server/config.js"++ ],++ "EVENTS_USAGE_FLUSH_MS": [++ "server/config.js"++ ],"REALTIME_MAX_CONNECTIONS": ["server/config.js"],@@@ -21529,6 +22501,17 @@"wave": "-","note": "Runs in, and for, the service that owns it."},++ {++ "kind": "setInterval",++ "name": null,++ "intervalMs": null,++ "line": 69,++ "file": "server/index.js",++ "target": "OpenVibe.Events",++ "disposition": "keep",++ "wave": "-",++ "note": "Runs in, and for, the service that owns it."++ },{"kind": "setInterval","name": null,@@@ -21543,7 +22526,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 14,++ "testFiles": 22,"ci": true},{@@@ -21551,13 +22534,13 @@"service": "chat","present": true,"git": {-- "head": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",++ "head": "d87c8d3c906ad52ef8bf123ce60373fdefcf09e6","branch": "main",-- "originMain": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",-- "committedAt": "2026-09-26T06:12:38-07:00"++ "originMain": "d87c8d3c906ad52ef8bf123ce60373fdefcf09e6",++ "committedAt": "2026-09-27T20:03:11-07:00"},-- "sourceFiles": 50,-- "loc": 16372,++ "sourceFiles": 53,++ "loc": 16898,"tables": [{"table": "token_revocations",@@@ -21565,6 +22548,12 @@"line": 19,"via": "repo"},++ {++ "table": "account_data_events",++ "file": "server/chat/account-data.js",++ "line": 39,++ "via": "repo"++ },{"table": "network_blocks","file": "server/chat/network-blocks.js",@@@ -21811,7 +22800,7 @@"method": "GET","path": "/","file": "server/prefs/routes.js",-- "line": 35,++ "line": 40,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21831,7 +22820,7 @@"method": "POST","path": "/","file": "server/events/consumer.js",-- "line": 143,++ "line": 151,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21841,7 +22830,27 @@"method": "PUT","path": "/","file": "server/prefs/routes.js",-- "line": 38,++ "line": 43,++ "target": "OpenVibe.Chat",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/:id/call",++ "file": "server/calls/routes.js",++ "line": 263,++ "target": "OpenVibe.Chat",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "PUT",++ "path": "/:id/call",++ "file": "server/calls/routes.js",++ "line": 231,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21851,7 +22860,7 @@"method": "GET","path": "/api/chat/:streamId/history","file": "server/chat/routes.js",-- "line": 538,++ "line": 550,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21861,7 +22870,7 @@"method": "GET","path": "/api/chat/:streamId/replay","file": "server/chat/routes.js",-- "line": 516,++ "line": 528,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21871,7 +22880,7 @@"method": "GET","path": "/api/chat/:streamId/users","file": "server/chat/routes.js",-- "line": 681,++ "line": 693,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21881,7 +22890,7 @@"method": "GET","path": "/api/chat/admin/logs","file": "server/chat/routes.js",-- "line": 777,++ "line": 793,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21891,7 +22900,7 @@"method": "GET","path": "/api/chat/admin/logs/export","file": "server/chat/routes.js",-- "line": 821,++ "line": 837,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21901,7 +22910,7 @@"method": "DELETE","path": "/api/chat/admin/purge","file": "server/chat/routes.js",-- "line": 722,++ "line": 738,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21911,7 +22920,7 @@"method": "POST","path": "/api/chat/admin/purge/preview","file": "server/chat/routes.js",-- "line": 690,++ "line": 706,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21921,7 +22930,7 @@"method": "GET","path": "/api/chat/anon/:anonId","file": "server/chat/routes.js",-- "line": 443,++ "line": 455,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21931,7 +22940,7 @@"method": "GET","path": "/api/chat/anon/:anonId/logs","file": "server/chat/routes.js",-- "line": 457,++ "line": 469,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21941,7 +22950,7 @@"method": "GET","path": "/api/chat/channel/:userId/history","file": "server/chat/routes.js",-- "line": 642,++ "line": 654,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21951,7 +22960,7 @@"method": "GET","path": "/api/chat/filters/friendly","file": "server/chat/routes.js",-- "line": 489,++ "line": 501,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21961,7 +22970,7 @@"method": "GET","path": "/api/chat/gif/providers","file": "server/chat/routes.js",-- "line": 164,++ "line": 174,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21971,7 +22980,7 @@"method": "GET","path": "/api/chat/gif/search","file": "server/chat/routes.js",-- "line": 202,++ "line": 212,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21981,7 +22990,7 @@"method": "GET","path": "/api/chat/gif/trending","file": "server/chat/routes.js",-- "line": 175,++ "line": 185,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -21991,7 +23000,7 @@"method": "GET","path": "/api/chat/global/history","file": "server/chat/routes.js",-- "line": 495,++ "line": 507,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22011,7 +23020,7 @@"method": "GET","path": "/api/chat/me/export","file": "server/chat/routes.js",-- "line": 869,++ "line": 885,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22021,7 +23030,7 @@"method": "GET","path": "/api/chat/online","file": "server/chat/routes.js",-- "line": 670,++ "line": 682,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22031,7 +23040,7 @@"method": "GET","path": "/api/chat/relay-user/:platform/:username","file": "server/chat/routes.js",-- "line": 433,++ "line": 445,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22041,7 +23050,7 @@"method": "GET","path": "/api/chat/relay-user/:platform/:username/logs","file": "server/chat/routes.js",-- "line": 473,++ "line": 485,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22051,7 +23060,7 @@"method": "GET","path": "/api/chat/rooms","file": "server/rooms/routes.js",-- "line": 65,++ "line": 80,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22061,7 +23070,7 @@"method": "POST","path": "/api/chat/rooms","file": "server/rooms/routes.js",-- "line": 69,++ "line": 84,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22071,7 +23080,7 @@"method": "GET","path": "/api/chat/rooms/:slug","file": "server/rooms/routes.js",-- "line": 73,++ "line": 88,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22081,7 +23090,7 @@"method": "PATCH","path": "/api/chat/rooms/:slug","file": "server/rooms/routes.js",-- "line": 83,++ "line": 98,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22091,7 +23100,7 @@"method": "GET","path": "/api/chat/rooms/:slug/attachments","file": "server/rooms/routes.js",-- "line": 155,++ "line": 170,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22101,7 +23110,7 @@"method": "POST","path": "/api/chat/rooms/:slug/attachments","file": "server/rooms/routes.js",-- "line": 161,++ "line": 176,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22111,7 +23120,7 @@"method": "DELETE","path": "/api/chat/rooms/:slug/attachments/:service/:resource","file": "server/rooms/routes.js",-- "line": 170,++ "line": 185,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22121,7 +23130,7 @@"method": "POST","path": "/api/chat/rooms/:slug/join","file": "server/rooms/routes.js",-- "line": 114,++ "line": 129,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22131,7 +23140,7 @@"method": "POST","path": "/api/chat/rooms/:slug/leave","file": "server/rooms/routes.js",-- "line": 120,++ "line": 135,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22141,7 +23150,7 @@"method": "GET","path": "/api/chat/rooms/:slug/members","file": "server/rooms/routes.js",-- "line": 135,++ "line": 150,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22151,7 +23160,7 @@"method": "POST","path": "/api/chat/rooms/:slug/members","file": "server/rooms/routes.js",-- "line": 141,++ "line": 156,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22161,7 +23170,7 @@"method": "GET","path": "/api/chat/rooms/:slug/messages","file": "server/rooms/routes.js",-- "line": 88,++ "line": 103,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22171,7 +23180,7 @@"method": "POST","path": "/api/chat/rooms/:slug/messages","file": "server/rooms/routes.js",-- "line": 96,++ "line": 111,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22181,7 +23190,7 @@"method": "DELETE","path": "/api/chat/rooms/:slug/messages/:id","file": "server/rooms/routes.js",-- "line": 105,++ "line": 120,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22191,7 +23200,7 @@"method": "POST","path": "/api/chat/rooms/:slug/read","file": "server/rooms/routes.js",-- "line": 130,++ "line": 145,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22201,7 +23210,7 @@"method": "GET","path": "/api/chat/search","file": "server/chat/routes.js",-- "line": 372,++ "line": 384,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22211,7 +23220,7 @@"method": "POST","path": "/api/chat/send","file": "server/chat/routes.js",-- "line": 267,++ "line": 279,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22221,7 +23230,7 @@"method": "GET","path": "/api/chat/user/:userId/history","file": "server/chat/routes.js",-- "line": 399,++ "line": 411,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22231,7 +23240,7 @@"method": "GET","path": "/api/chat/user/:username/profile","file": "server/chat/routes.js",-- "line": 420,++ "line": 432,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22241,7 +23250,7 @@"method": "GET","path": "/api/dm/blocks","file": "server/chat/dm-routes.js",-- "line": 418,++ "line": 433,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22251,7 +23260,7 @@"method": "DELETE","path": "/api/dm/blocks/:userId","file": "server/chat/dm-routes.js",-- "line": 406,++ "line": 421,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22261,7 +23270,7 @@"method": "POST","path": "/api/dm/blocks/:userId","file": "server/chat/dm-routes.js",-- "line": 391,++ "line": 406,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22271,7 +23280,7 @@"method": "GET","path": "/api/dm/blocks/check/:userId","file": "server/chat/dm-routes.js",-- "line": 428,++ "line": 443,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22281,7 +23290,7 @@"method": "GET","path": "/api/dm/conversations","file": "server/chat/dm-routes.js",-- "line": 66,++ "line": 81,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22291,7 +23300,7 @@"method": "POST","path": "/api/dm/conversations","file": "server/chat/dm-routes.js",-- "line": 81,++ "line": 96,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22301,7 +23310,7 @@"method": "GET","path": "/api/dm/conversations/:id","file": "server/chat/dm-routes.js",-- "line": 145,++ "line": 160,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22311,7 +23320,7 @@"method": "PATCH","path": "/api/dm/conversations/:id","file": "server/chat/dm-routes.js",-- "line": 348,++ "line": 363,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22321,7 +23330,7 @@"method": "GET","path": "/api/dm/conversations/:id/messages","file": "server/chat/dm-routes.js",-- "line": 162,++ "line": 177,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22331,7 +23340,7 @@"method": "POST","path": "/api/dm/conversations/:id/messages","file": "server/chat/dm-routes.js",-- "line": 180,++ "line": 195,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22341,7 +23350,7 @@"method": "DELETE","path": "/api/dm/conversations/:id/messages/:msgId","file": "server/chat/dm-routes.js",-- "line": 438,++ "line": 453,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22351,7 +23360,7 @@"method": "POST","path": "/api/dm/conversations/:id/participants","file": "server/chat/dm-routes.js",-- "line": 270,++ "line": 285,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22361,7 +23370,7 @@"method": "DELETE","path": "/api/dm/conversations/:id/participants/:userId","file": "server/chat/dm-routes.js",-- "line": 327,++ "line": 342,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22371,7 +23380,7 @@"method": "POST","path": "/api/dm/conversations/:id/read","file": "server/chat/dm-routes.js",-- "line": 249,++ "line": 264,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22381,7 +23390,7 @@"method": "GET","path": "/api/dm/unread","file": "server/chat/dm-routes.js",-- "line": 367,++ "line": 382,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22391,7 +23400,7 @@"method": "GET","path": "/api/dm/users/search","file": "server/chat/dm-routes.js",-- "line": 377,++ "line": 392,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22401,7 +23410,7 @@"method": "POST","path": "/api/sounds","file": "server/chat/sounds-routes.js",-- "line": 165,++ "line": 173,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22411,7 +23420,7 @@"method": "DELETE","path": "/api/sounds/:id","file": "server/chat/sounds-routes.js",-- "line": 307,++ "line": 315,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22421,7 +23430,7 @@"method": "DELETE","path": "/api/sounds/alert/:kind","file": "server/chat/sounds-routes.js",-- "line": 464,++ "line": 472,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22431,7 +23440,7 @@"method": "POST","path": "/api/sounds/alert/:kind","file": "server/chat/sounds-routes.js",-- "line": 425,++ "line": 433,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22441,7 +23450,7 @@"method": "GET","path": "/api/sounds/alert/mine","file": "server/chat/sounds-routes.js",-- "line": 414,++ "line": 422,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22451,7 +23460,7 @@"method": "GET","path": "/api/sounds/all/:streamId","file": "server/chat/sounds-routes.js",-- "line": 154,++ "line": 162,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22461,7 +23470,7 @@"method": "GET","path": "/api/sounds/channel/:userId","file": "server/chat/sounds-routes.js",-- "line": 143,++ "line": 151,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22471,7 +23480,7 @@"method": "PATCH","path": "/api/sounds/command","file": "server/chat/sounds-routes.js",-- "line": 334,++ "line": 342,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22481,87 +23490,7 @@"method": "GET","path": "/api/sounds/file/:filename","file": "server/chat/sounds-routes.js",-- "line": 392,-- "target": "OpenVibe.Chat",-- "disposition": "keep",-- "wave": "-",-- "note": "The service is the authority for its own API and pages."-- },-- {-- "method": "GET",-- "path": "/api/streams/:id/call",-- "file": "server/calls/routes.js",-- "line": 253,-- "target": "OpenVibe.Chat",-- "disposition": "keep",-- "wave": "-",-- "note": "The service is the authority for its own API and pages."-- },-- {-- "method": "PUT",-- "path": "/api/streams/:id/call",-- "file": "server/calls/routes.js",-- "line": 221,-- "target": "OpenVibe.Chat",-- "disposition": "keep",-- "wave": "-",-- "note": "The service is the authority for its own API and pages."-- },-- {-- "method": "GET",-- "path": "/api/streams/voice-channels",-- "file": "server/calls/routes.js",-- "line": 37,-- "target": "OpenVibe.Chat",-- "disposition": "keep",-- "wave": "-",-- "note": "The service is the authority for its own API and pages."-- },-- {-- "method": "POST",-- "path": "/api/streams/voice-channels",-- "file": "server/calls/routes.js",-- "line": 58,-- "target": "OpenVibe.Chat",-- "disposition": "keep",-- "wave": "-",-- "note": "The service is the authority for its own API and pages."-- },-- {-- "method": "DELETE",-- "path": "/api/streams/voice-channels/:channelId",-- "file": "server/calls/routes.js",-- "line": 70,-- "target": "OpenVibe.Chat",-- "disposition": "keep",-- "wave": "-",-- "note": "The service is the authority for its own API and pages."-- },-- {-- "method": "GET",-- "path": "/api/streams/voice-channels/:channelId",-- "file": "server/calls/routes.js",-- "line": 47,-- "target": "OpenVibe.Chat",-- "disposition": "keep",-- "wave": "-",-- "note": "The service is the authority for its own API and pages."-- },-- {-- "method": "POST",-- "path": "/api/streams/voice-channels/call-user",-- "file": "server/calls/routes.js",-- "line": 108,-- "target": "OpenVibe.Chat",-- "disposition": "keep",-- "wave": "-",-- "note": "The service is the authority for its own API and pages."-- },-- {-- "method": "POST",-- "path": "/api/streams/voice-channels/call-user/respond",-- "file": "server/calls/routes.js",-- "line": 171,++ "line": 400,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22571,7 +23500,7 @@"method": "GET","path": "/api/tts/admin/settings","file": "server/chat/tts-routes.js",-- "line": 112,++ "line": 113,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22581,7 +23510,7 @@"method": "PUT","path": "/api/tts/admin/settings","file": "server/chat/tts-routes.js",-- "line": 130,++ "line": 132,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22591,7 +23520,7 @@"method": "POST","path": "/api/tts/admin/test","file": "server/chat/tts-routes.js",-- "line": 162,++ "line": 165,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22601,7 +23530,7 @@"method": "GET","path": "/api/tts/audio/:file","file": "server/chat/tts-routes.js",-- "line": 260,++ "line": 267,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22611,7 +23540,7 @@"method": "GET","path": "/api/tts/queue","file": "server/chat/tts-routes.js",-- "line": 217,++ "line": 220,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22621,7 +23550,7 @@"method": "POST","path": "/api/tts/queue/:id/report","file": "server/chat/tts-routes.js",-- "line": 247,++ "line": 254,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22631,7 +23560,7 @@"method": "POST","path": "/api/tts/queue/clear","file": "server/chat/tts-routes.js",-- "line": 237,++ "line": 244,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22641,7 +23570,7 @@"method": "POST","path": "/api/tts/queue/skip","file": "server/chat/tts-routes.js",-- "line": 225,++ "line": 232,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22651,7 +23580,7 @@"method": "GET","path": "/api/tts/settings","file": "server/chat/tts-routes.js",-- "line": 90,++ "line": 91,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -22661,7 +23590,7 @@"method": "GET","path": "/api/tts/voices","file": "server/chat/tts-routes.js",-- "line": 80,++ "line": 81,"target": "OpenVibe.Chat","disposition": "keep","wave": "-",@@@ -23016,6 +23945,66 @@"disposition": "keep","wave": "-","note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/voice-channels",++ "file": "server/calls/routes.js",++ "line": 47,++ "target": "OpenVibe.Chat",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/voice-channels",++ "file": "server/calls/routes.js",++ "line": 68,++ "target": "OpenVibe.Chat",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "DELETE",++ "path": "/voice-channels/:channelId",++ "file": "server/calls/routes.js",++ "line": 80,++ "target": "OpenVibe.Chat",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/voice-channels/:channelId",++ "file": "server/calls/routes.js",++ "line": 57,++ "target": "OpenVibe.Chat",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/voice-channels/call-user",++ "file": "server/calls/routes.js",++ "line": 118,++ "target": "OpenVibe.Chat",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/voice-channels/call-user/respond",++ "file": "server/calls/routes.js",++ "line": 181,++ "target": "OpenVibe.Chat",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."}],"ws": {@@@ -23033,12 +24022,12 @@{"path": "/ws/call","file": "server/app.js",-- "line": 244++ "line": 258},{"path": "/ws/chat","file": "server/app.js",-- "line": 245++ "line": 259},{"path": "/ws/call",@@@ -23083,6 +24072,12 @@"ALLOWED_ORIGINS": ["server/config.js"],++ "CHAT_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "CHAT_LIMITS_HOUR": [++ "server/config.js"++ ],"CHAT_DB_PATH": ["server/config.js"],@@@ -23248,6 +24243,29 @@"timeout": true,"retry": false},++ {++ "file": "server/chat/account-data.js",++ "targets": [++ {++ "service": "network",++ "refs": [++ {++ "via": "/internal/events",++ "line": 4++ },++ {++ "via": "networkInternalUrl",++ "line": 164++ }++ ]++ }++ ],++ "auth": [++ "none-detected"++ ],++ "timeout": true,++ "retry": true++ },{"file": "server/chat/routes.js","targets": [@@@ -23256,15 +24274,15 @@"refs": [{"via": "searchUrl",-- "line": 111++ "line": 121},{"via": "searchUrl",-- "line": 117++ "line": 127},{"via": "searchUrl",-- "line": 212++ "line": 222}]}@@@ -23440,7 +24458,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 56,++ "line": 71,"file": "server/chat/dm-routes.js","target": "OpenVibe.Chat","disposition": "keep",@@@ -23451,7 +24469,7 @@"kind": "setInterval","name": null,"intervalMs": 21600000,-- "line": 188,++ "line": 211,"file": "server/events/consumer.js","target": "OpenVibe.Chat","disposition": "keep",@@@ -23494,7 +24512,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 35,++ "testFiles": 48,"ci": true},{@@@ -23502,13 +24520,13 @@"service": "openre","present": true,"git": {-- "head": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",++ "head": "c77ec2a9a1e350fb4ae1c646ec74693fae4f2fa3","branch": "main",-- "originMain": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",-- "committedAt": "2026-09-26T06:08:48-07:00"++ "originMain": "c77ec2a9a1e350fb4ae1c646ec74693fae4f2fa3",++ "committedAt": "2026-09-27T20:06:06-07:00"},-- "sourceFiles": 35,-- "loc": 4753,++ "sourceFiles": 36,++ "loc": 4806,"tables": [{"table": "stream_definitions",@@@ -23754,7 +24772,7 @@"method": "GET","path": "/play/:file","file": "server/app.js",-- "line": 90,++ "line": 92,"target": "OpenRe.Stream","disposition": "keep","wave": "-",@@@ -23764,7 +24782,7 @@"method": "GET","path": "/robots.txt","file": "server/app.js",-- "line": 108,++ "line": 110,"target": "OpenRe.Stream","disposition": "keep","wave": "-",@@@ -23976,6 +24994,12 @@"paths": []},"env": {++ "OPENRE_LIMITS_MINUTE": [++ "server/api/actor-limits.js"++ ],++ "OPENRE_LIMITS_HOUR": [++ "server/api/actor-limits.js"++ ],"RELEASE_COMMIT": ["server/app.js","OpenVibe.Shared/release.js"@@@ -24253,7 +25277,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 19,++ "testFiles": 21,"ci": true},{@@@ -24261,13 +25285,13 @@"service": "billing","present": true,"git": {-- "head": "180e246a3a344c062f1c7435303f4aa748f17046",++ "head": "f24684bb84ec1670bd08670891e6742fa433a548","branch": "main",-- "originMain": "180e246a3a344c062f1c7435303f4aa748f17046",-- "committedAt": "2026-09-26T06:09:39-07:00"++ "originMain": "f24684bb84ec1670bd08670891e6742fa433a548",++ "committedAt": "2026-09-27T20:08:06-07:00"},-- "sourceFiles": 37,-- "loc": 5325,++ "sourceFiles": 38,++ "loc": 5452,"tables": [{"table": "accounts",@@@ -24399,7 +25423,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 64,++ "line": 66,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24409,7 +25433,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 79,++ "line": 81,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24419,7 +25443,7 @@"method": "POST","path": "/api/v1/admin/adjustments","file": "server/api/v1.js",-- "line": 286,++ "line": 292,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24429,7 +25453,7 @@"method": "GET","path": "/api/v1/admin/freeze","file": "server/api/v1.js",-- "line": 242,++ "line": 248,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24439,7 +25463,7 @@"method": "POST","path": "/api/v1/admin/freeze","file": "server/api/v1.js",-- "line": 243,++ "line": 249,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24449,7 +25473,7 @@"method": "GET","path": "/api/v1/admin/import-holds","file": "server/api/v1.js",-- "line": 301,++ "line": 307,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24459,7 +25483,7 @@"method": "GET","path": "/api/v1/admin/provider-accounts","file": "server/api/v1.js",-- "line": 275,++ "line": 281,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24469,7 +25493,7 @@"method": "POST","path": "/api/v1/admin/provider-accounts","file": "server/api/v1.js",-- "line": 279,++ "line": 285,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24479,7 +25503,7 @@"method": "GET","path": "/api/v1/admin/provider-events","file": "server/api/v1.js",-- "line": 291,++ "line": 297,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24489,7 +25513,7 @@"method": "POST","path": "/api/v1/admin/provider-events/:id/reprocess","file": "server/api/v1.js",-- "line": 296,++ "line": 302,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24499,7 +25523,7 @@"method": "GET","path": "/api/v1/admin/reconcile","file": "server/api/v1.js",-- "line": 251,++ "line": 257,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24509,7 +25533,7 @@"method": "GET","path": "/api/v1/admin/reconciliations","file": "server/api/v1.js",-- "line": 256,++ "line": 262,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24519,7 +25543,7 @@"method": "GET","path": "/api/v1/admin/reconciliations/:id","file": "server/api/v1.js",-- "line": 267,++ "line": 273,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24529,7 +25553,7 @@"method": "POST","path": "/api/v1/admin/sweep","file": "server/api/v1.js",-- "line": 300,++ "line": 306,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24539,7 +25563,7 @@"method": "GET","path": "/api/v1/balances/:subject","file": "server/api/v1.js",-- "line": 216,++ "line": 222,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24549,7 +25573,7 @@"method": "GET","path": "/api/v1/cashouts","file": "server/api/v1.js",-- "line": 143,++ "line": 149,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24559,7 +25583,7 @@"method": "POST","path": "/api/v1/cashouts","file": "server/api/v1.js",-- "line": 138,++ "line": 144,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24569,7 +25593,7 @@"method": "GET","path": "/api/v1/cashouts/:id","file": "server/api/v1.js",-- "line": 147,++ "line": 153,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24579,7 +25603,7 @@"method": "POST","path": "/api/v1/cashouts/:id/approve","file": "server/api/v1.js",-- "line": 152,++ "line": 158,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24589,7 +25613,7 @@"method": "POST","path": "/api/v1/cashouts/:id/deny","file": "server/api/v1.js",-- "line": 157,++ "line": 163,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24599,7 +25623,7 @@"method": "GET","path": "/api/v1/entitlements/:subject","file": "server/api/v1.js",-- "line": 200,++ "line": 206,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24609,7 +25633,7 @@"method": "POST","path": "/api/v1/intents","file": "server/api/v1.js",-- "line": 64,++ "line": 70,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24619,7 +25643,7 @@"method": "GET","path": "/api/v1/intents/:id","file": "server/api/v1.js",-- "line": 87,++ "line": 93,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24629,7 +25653,7 @@"method": "POST","path": "/api/v1/intents/:id/capture","file": "server/api/v1.js",-- "line": 92,++ "line": 98,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24639,7 +25663,7 @@"method": "POST","path": "/api/v1/purchases/settle","file": "server/api/v1.js",-- "line": 103,++ "line": 109,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24649,7 +25673,7 @@"method": "GET","path": "/api/v1/rates","file": "server/api/v1.js",-- "line": 52,++ "line": 58,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24659,7 +25683,7 @@"method": "POST","path": "/api/v1/recycle","file": "server/api/v1.js",-- "line": 130,++ "line": 136,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24669,7 +25693,7 @@"method": "GET","path": "/api/v1/subscriptions","file": "server/api/v1.js",-- "line": 183,++ "line": 189,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24679,7 +25703,7 @@"method": "POST","path": "/api/v1/subscriptions","file": "server/api/v1.js",-- "line": 163,++ "line": 169,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24689,7 +25713,7 @@"method": "GET","path": "/api/v1/subscriptions/:id","file": "server/api/v1.js",-- "line": 191,++ "line": 197,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24699,7 +25723,7 @@"method": "POST","path": "/api/v1/subscriptions/:id/cancel","file": "server/api/v1.js",-- "line": 196,++ "line": 202,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24709,7 +25733,7 @@"method": "GET","path": "/api/v1/transactions","file": "server/api/v1.js",-- "line": 218,++ "line": 224,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24719,7 +25743,7 @@"method": "GET","path": "/api/v1/transactions/:id","file": "server/api/v1.js",-- "line": 234,++ "line": 240,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24729,7 +25753,7 @@"method": "POST","path": "/api/v1/transfers","file": "server/api/v1.js",-- "line": 115,++ "line": 121,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24739,7 +25763,7 @@"method": "POST","path": "/api/v1/transfers/:id/refund","file": "server/api/v1.js",-- "line": 123,++ "line": 129,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24929,7 +25953,7 @@"method": "GET","path": "/robots.txt","file": "server/app.js",-- "line": 85,++ "line": 89,"target": "OpenVibe.Billing","disposition": "keep","wave": "-",@@@ -24990,6 +26014,15 @@"BILLING_AUDIENCE": ["server/config.js"],++ "BILLING_LIMITS": [++ "server/config.js"++ ],++ "BILLING_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "BILLING_LIMITS_HOUR": [++ "server/config.js"++ ],"OV_OAUTH_CLIENT_ID": ["server/config.js"],@@@ -25179,7 +26212,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 21,++ "testFiles": 22,"ci": true},{@@@ -25187,13 +26220,13 @@"service": "tips","present": true,"git": {-- "head": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",++ "head": "13986b59e697d12a328a4f12e993295445ca40be","branch": "main",-- "originMain": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",-- "committedAt": "2026-09-26T06:18:52-07:00"++ "originMain": "13986b59e697d12a328a4f12e993295445ca40be",++ "committedAt": "2026-09-27T20:01:20-07:00"},-- "sourceFiles": 29,-- "loc": 5267,++ "sourceFiles": 30,++ "loc": 5346,"tables": [{"table": "settings",@@@ -25353,7 +26386,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 79,++ "line": 80,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25363,7 +26396,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 85,++ "line": 86,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25373,7 +26406,7 @@"method": "POST","path": "/api/v1/checkout","file": "server/api/v1.js",-- "line": 194,++ "line": 209,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25383,7 +26416,7 @@"method": "GET","path": "/api/v1/goals","file": "server/api/v1.js",-- "line": 248,++ "line": 264,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25393,7 +26426,7 @@"method": "POST","path": "/api/v1/goals","file": "server/api/v1.js",-- "line": 262,++ "line": 278,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25403,7 +26436,7 @@"method": "GET","path": "/api/v1/goals/:id","file": "server/api/v1.js",-- "line": 256,++ "line": 272,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25413,7 +26446,7 @@"method": "PATCH","path": "/api/v1/goals/:id","file": "server/api/v1.js",-- "line": 274,++ "line": 290,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25423,7 +26456,7 @@"method": "POST","path": "/api/v1/goals/:id/close","file": "server/api/v1.js",-- "line": 275,++ "line": 291,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25433,7 +26466,7 @@"method": "GET","path": "/api/v1/interactions","file": "server/api/v1.js",-- "line": 200,++ "line": 215,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25443,7 +26476,7 @@"method": "GET","path": "/api/v1/interactions/:id","file": "server/api/v1.js",-- "line": 219,++ "line": 234,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25453,7 +26486,7 @@"method": "POST","path": "/api/v1/interactions/:id/${action}","file": "server/api/v1.js",-- "line": 350,++ "line": 367,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25463,7 +26496,7 @@"method": "POST","path": "/api/v1/interactions/external","file": "server/api/v1.js",-- "line": 232,++ "line": 248,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25473,7 +26506,7 @@"method": "POST","path": "/api/v1/me/erase","file": "server/api/v1.js",-- "line": 125,++ "line": 134,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25483,7 +26516,7 @@"method": "GET","path": "/api/v1/me/export","file": "server/api/v1.js",-- "line": 124,++ "line": 131,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25493,7 +26526,7 @@"method": "POST","path": "/api/v1/media-requests","file": "server/api/v1.js",-- "line": 197,++ "line": 212,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25503,7 +26536,7 @@"method": "GET","path": "/api/v1/moderation","file": "server/api/v1.js",-- "line": 338,++ "line": 355,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25513,7 +26546,7 @@"method": "GET","path": "/api/v1/moderation/log","file": "server/api/v1.js",-- "line": 344,++ "line": 361,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25523,7 +26556,7 @@"method": "GET","path": "/api/v1/moderators","file": "server/api/v1.js",-- "line": 358,++ "line": 375,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25533,7 +26566,7 @@"method": "POST","path": "/api/v1/moderators","file": "server/api/v1.js",-- "line": 363,++ "line": 380,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25543,7 +26576,7 @@"method": "POST","path": "/api/v1/moderators/:subject/remove","file": "server/api/v1.js",-- "line": 370,++ "line": 387,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25553,7 +26586,7 @@"method": "GET","path": "/api/v1/overlay-configs","file": "server/api/v1.js",-- "line": 301,++ "line": 318,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25563,7 +26596,7 @@"method": "POST","path": "/api/v1/overlay-configs","file": "server/api/v1.js",-- "line": 312,++ "line": 329,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25573,7 +26606,7 @@"method": "GET","path": "/api/v1/overlay-configs/:id","file": "server/api/v1.js",-- "line": 306,++ "line": 323,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25583,7 +26616,7 @@"method": "PATCH","path": "/api/v1/overlay-configs/:id","file": "server/api/v1.js",-- "line": 318,++ "line": 335,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25593,7 +26626,7 @@"method": "GET","path": "/api/v1/overlay-tokens","file": "server/api/v1.js",-- "line": 278,++ "line": 294,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25603,7 +26636,7 @@"method": "POST","path": "/api/v1/overlay-tokens","file": "server/api/v1.js",-- "line": 283,++ "line": 300,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25613,7 +26646,7 @@"method": "POST","path": "/api/v1/overlay-tokens/:id/revoke","file": "server/api/v1.js",-- "line": 294,++ "line": 311,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25623,7 +26656,7 @@"method": "POST","path": "/api/v1/paid-messages","file": "server/api/v1.js",-- "line": 195,++ "line": 210,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25633,7 +26666,7 @@"method": "GET","path": "/api/v1/profiles/:creator","file": "server/api/v1.js",-- "line": 93,++ "line": 100,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25643,7 +26676,7 @@"method": "PATCH","path": "/api/v1/profiles/:creator","file": "server/api/v1.js",-- "line": 127,++ "line": 136,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25653,7 +26686,7 @@"method": "GET","path": "/api/v1/profiles/:creator/supporters","file": "server/api/v1.js",-- "line": 106,++ "line": 113,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25663,7 +26696,7 @@"method": "GET","path": "/api/v1/profiles/:creator/totals","file": "server/api/v1.js",-- "line": 146,++ "line": 155,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25673,7 +26706,7 @@"method": "POST","path": "/api/v1/simulate","file": "server/api/v1.js",-- "line": 377,++ "line": 395,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -25683,7 +26716,7 @@"method": "POST","path": "/api/v1/tts-requests","file": "server/api/v1.js",-- "line": 196,++ "line": 211,"target": "OpenVibe.Tips","disposition": "keep","wave": "-",@@@ -26042,6 +27075,12 @@"TIPS_MAX_PENDING_CHECKOUTS": ["server/config.js"],++ "TIPS_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "TIPS_LIMITS_HOUR": [++ "server/config.js"++ ],"TIPS_JOBS": ["server/config.js"],@@@ -26138,7 +27177,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 16,++ "testFiles": 17,"ci": true},{@@@ -26146,13 +27185,13 @@"service": "vip","present": true,"git": {-- "head": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",++ "head": "95b3e196daa152c2e7f8e940a1f02b7fe32706ba","branch": "main",-- "originMain": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",-- "committedAt": "2026-09-26T06:21:19-07:00"++ "originMain": "95b3e196daa152c2e7f8e940a1f02b7fe32706ba",++ "committedAt": "2026-09-27T20:01:51-07:00"},-- "sourceFiles": 29,-- "loc": 4211,++ "sourceFiles": 30,++ "loc": 4293,"tables": [{"table": "settings",@@@ -26268,7 +27307,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 87,++ "line": 88,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26278,7 +27317,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 89,++ "line": 90,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26288,7 +27327,7 @@"method": "POST","path": "/api/v1/checkout","file": "server/api/v1.js",-- "line": 210,++ "line": 220,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26298,7 +27337,7 @@"method": "GET","path": "/api/v1/creators/:ref","file": "server/api/v1.js",-- "line": 99,++ "line": 107,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26308,7 +27347,7 @@"method": "GET","path": "/api/v1/creators/:ref/card","file": "server/api/v1.js",-- "line": 111,++ "line": 119,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26318,7 +27357,7 @@"method": "GET","path": "/api/v1/creators/:ref/members","file": "server/api/v1.js",-- "line": 338,++ "line": 355,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26328,7 +27367,7 @@"method": "GET","path": "/api/v1/entitlements/check","file": "server/api/v1.js",-- "line": 276,++ "line": 292,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26338,7 +27377,7 @@"method": "POST","path": "/api/v1/entitlements/check","file": "server/api/v1.js",-- "line": 277,++ "line": 293,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26348,7 +27387,7 @@"method": "POST","path": "/api/v1/memberships/:creator/cancel","file": "server/api/v1.js",-- "line": 238,++ "line": 249,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26358,7 +27397,7 @@"method": "PUT","path": "/api/v1/memberships/:creator/preferences","file": "server/api/v1.js",-- "line": 243,++ "line": 254,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26368,7 +27407,7 @@"method": "GET","path": "/api/v1/memberships/:subject","file": "server/api/v1.js",-- "line": 222,++ "line": 232,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26378,7 +27417,7 @@"method": "GET","path": "/api/v1/perks","file": "server/api/v1.js",-- "line": 173,++ "line": 181,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26388,7 +27427,7 @@"method": "POST","path": "/api/v1/perks","file": "server/api/v1.js",-- "line": 180,++ "line": 188,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26398,7 +27437,7 @@"method": "PATCH","path": "/api/v1/perks/:id","file": "server/api/v1.js",-- "line": 187,++ "line": 195,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26408,7 +27447,7 @@"method": "GET","path": "/api/v1/plans","file": "server/api/v1.js",-- "line": 118,++ "line": 126,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26418,7 +27457,7 @@"method": "POST","path": "/api/v1/plans","file": "server/api/v1.js",-- "line": 139,++ "line": 147,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26428,7 +27467,7 @@"method": "GET","path": "/api/v1/plans/:id","file": "server/api/v1.js",-- "line": 132,++ "line": 140,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26438,7 +27477,7 @@"method": "PATCH","path": "/api/v1/plans/:id","file": "server/api/v1.js",-- "line": 155,++ "line": 163,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26448,7 +27487,7 @@"method": "POST","path": "/api/v1/plans/:id/archive","file": "server/api/v1.js",-- "line": 167,++ "line": 175,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26458,7 +27497,7 @@"method": "POST","path": "/api/v1/plans/:id/publish","file": "server/api/v1.js",-- "line": 162,++ "line": 170,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26468,7 +27507,7 @@"method": "GET","path": "/api/v1/plans/:id/versions","file": "server/api/v1.js",-- "line": 133,++ "line": 141,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26478,7 +27517,7 @@"method": "GET","path": "/api/v1/policies","file": "server/api/v1.js",-- "line": 280,++ "line": 296,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26488,7 +27527,7 @@"method": "POST","path": "/api/v1/policies","file": "server/api/v1.js",-- "line": 305,++ "line": 321,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26498,7 +27537,7 @@"method": "DELETE","path": "/api/v1/policies/:id","file": "server/api/v1.js",-- "line": 313,++ "line": 329,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26508,7 +27547,7 @@"method": "GET","path": "/api/v1/policies/:id","file": "server/api/v1.js",-- "line": 299,++ "line": 315,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26518,7 +27557,7 @@"method": "POST","path": "/api/v1/policies/evaluate","file": "server/api/v1.js",-- "line": 319,++ "line": 336,"target": "OpenVibe.VIP","disposition": "keep","wave": "-",@@@ -26779,6 +27818,12 @@"VIP_MEMBER_COUNT_TTL_MS": ["server/config.js"],++ "VIP_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "VIP_LIMITS_HOUR": [++ "server/config.js"++ ],"MIN_CLIENT_RELEASE": ["OpenVibe.Shared/release.js"],@@@ -26852,7 +27897,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 13,++ "testFiles": 14,"ci": true},{@@@ -26860,14 +27905,20 @@"service": "ai","present": true,"git": {-- "head": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",++ "head": "6c8b8338be936cbd3a6f50dee3f790807f145a0e","branch": "main",-- "originMain": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",-- "committedAt": "2026-09-26T06:09:19-07:00"++ "originMain": "6c8b8338be936cbd3a6f50dee3f790807f145a0e",++ "committedAt": "2026-09-27T20:07:22-07:00"},-- "sourceFiles": 38,-- "loc": 6339,++ "sourceFiles": 44,++ "loc": 7919,"tables": [++ {++ "table": "subject_credentials",++ "file": "server/credentials.js",++ "line": 27,++ "via": "repo"++ },{"table": "providers","file": "server/db.js",@@@ -26982,7 +28033,7 @@"method": "GET","path": "/","file": "server/app.js",-- "line": 58,++ "line": 60,"target": "OpenVibe.AI","disposition": "keep","wave": "-",@@@ -27058,6 +28109,36 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "DELETE",++ "path": "/api/v1/attribution-quotas/:attribution",++ "file": "server/api/attribution-quotas.js",++ "line": 63,++ "target": "OpenVibe.AI",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/attribution-quotas/:attribution",++ "file": "server/api/attribution-quotas.js",++ "line": 60,++ "target": "OpenVibe.AI",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "PUT",++ "path": "/api/v1/attribution-quotas/:attribution",++ "file": "server/api/attribution-quotas.js",++ "line": 49,++ "target": "OpenVibe.AI",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "GET","path": "/api/v1/audit",@@@ -27088,6 +28169,36 @@"wave": "-","note": "The service is the authority for its own API and pages."},++ {++ "method": "DELETE",++ "path": "/api/v1/credentials/:subject",++ "file": "server/credentials.js",++ "line": 152,++ "target": "OpenVibe.AI",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/api/v1/credentials/:subject",++ "file": "server/credentials.js",++ "line": 149,++ "target": "OpenVibe.AI",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "PUT",++ "path": "/api/v1/credentials/:subject",++ "file": "server/credentials.js",++ "line": 142,++ "target": "OpenVibe.AI",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },{"method": "GET","path": "/api/v1/models",@@@ -27492,7 +28603,7 @@"method": "GET","path": "/robots.txt","file": "server/app.js",-- "line": 54,++ "line": 56,"target": "OpenVibe.AI","disposition": "keep","wave": "-",@@@ -27535,13 +28646,10 @@"OV_NETWORK_ISSUER": ["server/config.js"],-- "OV_NETWORK_PUBLIC_KEY": [-- "server/config.js"-- ],-- "AI_NS_REQUIRED": [++ "AI_CREDENTIALS_KEY": ["server/config.js"],-- "AI_NS_FALLBACK": [++ "OV_NETWORK_PUBLIC_KEY": ["server/config.js"],"AI_DB_PATH": [@@@ -27579,6 +28687,42 @@"AI_HTTP_SEAM_URL": ["server/config.js"],++ "AI_LOCAL_LLM_URL": [++ "server/config.js"++ ],++ "AI_LOCAL_LLM_MODEL": [++ "server/config.js"++ ],++ "AI_LOCAL_LLM_TIMEOUT_MS": [++ "server/config.js"++ ],++ "AI_MEDIA_ANALYSIS_DIR": [++ "server/config.js"++ ],++ "AI_MEDIA_ANALYSIS_MAX_BYTES": [++ "server/config.js"++ ],++ "AI_MEDIA_ANALYSIS_DISK_RESERVE_BYTES": [++ "server/config.js"++ ],++ "AI_MEDIA_ANALYSIS_FETCH_TIMEOUT_MS": [++ "server/config.js"++ ],++ "AI_MEDIA_SCENE_THRESHOLD": [++ "server/config.js"++ ],++ "AI_MEDIA_STT_WINDOW_SEC": [++ "server/config.js"++ ],++ "AI_MEDIA_STREAM": [++ "server/config.js"++ ],++ "FFMPEG_BIN": [++ "server/config.js"++ ],++ "FFPROBE_BIN": [++ "server/config.js"++ ],"AI_STUB_FALLBACK": ["server/config.js"],@@@ -27675,6 +28819,9 @@"AI_FETCH_ALLOW_HOSTS": ["server/config.js"],++ "AI_MEDIA_STORAGE_HOSTS": [++ "server/config.js"++ ],"AI_FETCH_MAX_BYTES": ["server/config.js"],@@@ -27725,7 +28872,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 70,++ "line": 69,"file": "server/auth.js","target": "OpenVibe.AI","disposition": "keep",@@@ -27747,7 +28894,7 @@"kind": "setInterval","name": null,"intervalMs": null,-- "line": 49,++ "line": 51,"file": "server/index.js","target": "OpenVibe.AI","disposition": "keep",@@@ -27768,7 +28915,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 20,++ "testFiles": 26,"ci": true},{@@@ -27776,13 +28923,13 @@"service": "search","present": true,"git": {-- "head": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",++ "head": "e8511d849720534a9ffcd54b052663111e5b1e6f","branch": "main",-- "originMain": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",-- "committedAt": "2026-09-26T06:18:19-07:00"++ "originMain": "e8511d849720534a9ffcd54b052663111e5b1e6f",++ "committedAt": "2026-09-27T19:55:17-07:00"},-- "sourceFiles": 17,-- "loc": 2787,++ "sourceFiles": 18,++ "loc": 2868,"tables": [{"table": "documents",@@@ -27856,7 +29003,7 @@"method": "GET","path": "/","file": "server/web/page.js",-- "line": 174,++ "line": 178,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27866,7 +29013,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 41,++ "line": 42,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27876,7 +29023,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 48,++ "line": 49,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27886,7 +29033,7 @@"method": "DELETE","path": "/api/v1/documents/:owner/:type/:id","file": "server/api/documents.js",-- "line": 80,++ "line": 85,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27896,7 +29043,7 @@"method": "GET","path": "/api/v1/documents/:owner/:type/:id","file": "server/api/query.js",-- "line": 223,++ "line": 232,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27906,7 +29053,7 @@"method": "PUT","path": "/api/v1/documents/:owner/:type/:id","file": "server/api/documents.js",-- "line": 62,++ "line": 67,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27916,7 +29063,7 @@"method": "GET","path": "/api/v1/owners/:owner/documents","file": "server/api/documents.js",-- "line": 93,++ "line": 98,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27926,7 +29073,7 @@"method": "GET","path": "/api/v1/owners/:owner/documents/:type/:id","file": "server/api/documents.js",-- "line": 103,++ "line": 108,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27936,7 +29083,7 @@"method": "GET","path": "/api/v1/owners/:owner/rejections","file": "server/api/documents.js",-- "line": 118,++ "line": 123,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27946,7 +29093,7 @@"method": "GET","path": "/api/v1/owners/:owner/removals","file": "server/api/documents.js",-- "line": 131,++ "line": 136,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27956,7 +29103,7 @@"method": "GET","path": "/api/v1/saved-searches","file": "server/api/saved.js",-- "line": 53,++ "line": 56,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27966,7 +29113,7 @@"method": "POST","path": "/api/v1/saved-searches","file": "server/api/saved.js",-- "line": 59,++ "line": 62,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27976,7 +29123,7 @@"method": "DELETE","path": "/api/v1/saved-searches/:id","file": "server/api/saved.js",-- "line": 102,++ "line": 105,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27986,7 +29133,7 @@"method": "GET","path": "/api/v1/saved-searches/:id","file": "server/api/saved.js",-- "line": 94,++ "line": 97,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -27996,7 +29143,7 @@"method": "GET","path": "/api/v1/saved-searches/:id/results","file": "server/api/saved.js",-- "line": 109,++ "line": 112,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -28006,7 +29153,7 @@"method": "GET","path": "/api/v1/search","file": "server/api/query.js",-- "line": 194,++ "line": 203,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -28016,7 +29163,7 @@"method": "GET","path": "/api/v1/suggest","file": "server/api/query.js",-- "line": 206,++ "line": 215,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -28026,7 +29173,7 @@"method": "GET","path": "/frame-init.js","file": "server/web/page.js",-- "line": 157,++ "line": 161,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -28046,7 +29193,7 @@"method": "GET","path": "/robots.txt","file": "server/web/page.js",-- "line": 169,++ "line": 173,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -28056,7 +29203,7 @@"method": "GET","path": "/updates","file": "server/web/page.js",-- "line": 162,++ "line": 166,"target": "OpenVibe.Search","disposition": "keep","wave": "-",@@@ -28128,6 +29275,12 @@"SEARCH_SAVED_MAX_PER_SUBJECT": ["server/config.js"],++ "SEARCH_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "SEARCH_LIMITS_HOUR": [++ "server/config.js"++ ],"CLOUDFLARE_PURGE_TOKEN": ["server/config.js"],@@@ -28208,7 +29361,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 13,++ "testFiles": 14,"ci": true},{@@@ -28216,13 +29369,13 @@"service": "sources","present": true,"git": {-- "head": "29cd386241c44456ffcebf70b6be287fa9a08aaa",++ "head": "167085388a637eed3f0d47b3c6eabb8c9d00814d","branch": "main",-- "originMain": "29cd386241c44456ffcebf70b6be287fa9a08aaa",-- "committedAt": "2026-09-26T06:18:36-07:00"++ "originMain": "167085388a637eed3f0d47b3c6eabb8c9d00814d",++ "committedAt": "2026-09-27T19:55:56-07:00"},-- "sourceFiles": 23,-- "loc": 2980,++ "sourceFiles": 24,++ "loc": 3100,"tables": [{"table": "sources",@@@ -28278,7 +29431,7 @@"method": "GET","path": "/","file": "server/app.js",-- "line": 101,++ "line": 105,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28288,7 +29441,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 84,++ "line": 85,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28298,7 +29451,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 91,++ "line": 92,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28308,7 +29461,7 @@"method": "GET","path": "/api/v1/health","file": "server/api/sources.js",-- "line": 78,++ "line": 80,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28318,7 +29471,7 @@"method": "GET","path": "/api/v1/items","file": "server/api/items.js",-- "line": 55,++ "line": 57,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28328,7 +29481,7 @@"method": "DELETE","path": "/api/v1/items/:id","file": "server/api/items.js",-- "line": 99,++ "line": 101,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28338,7 +29491,7 @@"method": "GET","path": "/api/v1/items/:id","file": "server/api/items.js",-- "line": 74,++ "line": 76,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28348,7 +29501,7 @@"method": "GET","path": "/api/v1/runs","file": "server/api/sources.js",-- "line": 67,++ "line": 69,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28358,7 +29511,7 @@"method": "GET","path": "/api/v1/sources","file": "server/api/sources.js",-- "line": 49,++ "line": 51,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28368,7 +29521,7 @@"method": "POST","path": "/api/v1/sources","file": "server/api/sources.js",-- "line": 85,++ "line": 87,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28378,7 +29531,7 @@"method": "DELETE","path": "/api/v1/sources/:key","file": "server/api/sources.js",-- "line": 100,++ "line": 102,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28388,7 +29541,7 @@"method": "GET","path": "/api/v1/sources/:key","file": "server/api/sources.js",-- "line": 53,++ "line": 55,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28398,7 +29551,7 @@"method": "PATCH","path": "/api/v1/sources/:key","file": "server/api/sources.js",-- "line": 92,++ "line": 94,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28408,7 +29561,7 @@"method": "POST","path": "/api/v1/sources/:key/fetch","file": "server/api/sources.js",-- "line": 115,++ "line": 117,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28418,7 +29571,7 @@"method": "POST","path": "/api/v1/sources/:key/items","file": "server/api/items.js",-- "line": 82,++ "line": 84,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28428,7 +29581,7 @@"method": "GET","path": "/api/v1/sources/:key/runs","file": "server/api/sources.js",-- "line": 59,++ "line": 61,"target": "OpenVibe.Sources","disposition": "keep","wave": "-",@@@ -28464,6 +29617,12 @@"OV_NETWORK_PUBLIC_KEY": ["server/config.js"],++ "SOURCES_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "SOURCES_LIMITS_HOUR": [++ "server/config.js"++ ],"OV_OAUTH_CLIENT_ID": ["server/config.js"],@@@ -28586,7 +29745,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 10,++ "testFiles": 13,"ci": true},{@@@ -28594,13 +29753,13 @@"service": "wiki","present": true,"git": {-- "head": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",++ "head": "3302540e8b5fdf3c07db9fce688be2f4ab8b847b","branch": "main",-- "originMain": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",-- "committedAt": "2026-09-26T06:21:43-07:00"++ "originMain": "3302540e8b5fdf3c07db9fce688be2f4ab8b847b",++ "committedAt": "2026-09-27T20:00:00-07:00"},-- "sourceFiles": 21,-- "loc": 4421,++ "sourceFiles": 23,++ "loc": 4751,"tables": [{"table": "wiki_spaces",@@@ -28668,7 +29827,7 @@"method": "GET","path": "/","file": "server/http/pages.js",-- "line": 98,++ "line": 119,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28678,7 +29837,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 66,++ "line": 67,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28688,7 +29847,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 81,++ "line": 82,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28698,7 +29857,7 @@"method": "DELETE","path": "/api/v1/pages/:id","file": "server/http/api.js",-- "line": 164,++ "line": 179,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28708,7 +29867,7 @@"method": "GET","path": "/api/v1/pages/:id","file": "server/http/api.js",-- "line": 144,++ "line": 159,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28718,7 +29877,7 @@"method": "PATCH","path": "/api/v1/pages/:id","file": "server/http/api.js",-- "line": 156,++ "line": 171,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28728,7 +29887,7 @@"method": "GET","path": "/api/v1/pages/:id/diff","file": "server/http/api.js",-- "line": 188,++ "line": 203,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28738,7 +29897,7 @@"method": "POST","path": "/api/v1/pages/:id/media","file": "server/http/api.js",-- "line": 226,++ "line": 241,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28748,7 +29907,7 @@"method": "POST","path": "/api/v1/pages/:id/media/verify","file": "server/http/api.js",-- "line": 231,++ "line": 246,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28758,7 +29917,7 @@"method": "POST","path": "/api/v1/pages/:id/publish","file": "server/http/api.js",-- "line": 208,++ "line": 223,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28768,7 +29927,7 @@"method": "POST","path": "/api/v1/pages/:id/revert","file": "server/http/api.js",-- "line": 221,++ "line": 236,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28778,7 +29937,7 @@"method": "GET","path": "/api/v1/pages/:id/revisions","file": "server/http/api.js",-- "line": 168,++ "line": 183,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28788,7 +29947,7 @@"method": "POST","path": "/api/v1/pages/:id/revisions","file": "server/http/api.js",-- "line": 173,++ "line": 188,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28798,7 +29957,7 @@"method": "GET","path": "/api/v1/pages/:id/revisions/:n","file": "server/http/api.js",-- "line": 183,++ "line": 198,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28808,7 +29967,7 @@"method": "GET","path": "/api/v1/pages/:id/revisions/:n/citations","file": "server/http/api.js",-- "line": 193,++ "line": 208,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28818,7 +29977,7 @@"method": "POST","path": "/api/v1/pages/:id/revisions/:n/citations","file": "server/http/api.js",-- "line": 198,++ "line": 213,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28828,7 +29987,7 @@"method": "POST","path": "/api/v1/pages/:id/revisions/:n/review","file": "server/http/api.js",-- "line": 202,++ "line": 217,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28838,7 +29997,7 @@"method": "POST","path": "/api/v1/pages/:id/schedule","file": "server/http/api.js",-- "line": 212,++ "line": 227,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28848,7 +30007,7 @@"method": "POST","path": "/api/v1/pages/:id/unpublish","file": "server/http/api.js",-- "line": 217,++ "line": 232,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28858,7 +30017,7 @@"method": "PUT","path": "/api/v1/pages/:id/watch","file": "server/http/api.js",-- "line": 236,++ "line": 251,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28868,7 +30027,7 @@"method": "POST","path": "/api/v1/proposals","file": "server/http/api.js",-- "line": 239,++ "line": 254,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28878,7 +30037,7 @@"method": "GET","path": "/api/v1/proposals/:id","file": "server/http/api.js",-- "line": 250,++ "line": 265,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28888,7 +30047,7 @@"method": "POST","path": "/api/v1/proposals/:id/review","file": "server/http/api.js",-- "line": 258,++ "line": 273,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28898,7 +30057,7 @@"method": "GET","path": "/api/v1/search","file": "server/http/api.js",-- "line": 263,++ "line": 278,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28908,7 +30067,7 @@"method": "GET","path": "/api/v1/spaces","file": "server/http/api.js",-- "line": 116,++ "line": 131,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28918,7 +30077,7 @@"method": "POST","path": "/api/v1/spaces","file": "server/http/api.js",-- "line": 117,++ "line": 132,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28928,7 +30087,7 @@"method": "GET","path": "/api/v1/spaces/:space","file": "server/http/api.js",-- "line": 118,++ "line": 133,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28938,7 +30097,7 @@"method": "PATCH","path": "/api/v1/spaces/:space","file": "server/http/api.js",-- "line": 122,++ "line": 137,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28958,7 +30117,7 @@"method": "POST","path": "/api/v1/spaces/:space/import","file": "server/http/api.js",-- "line": 133,++ "line": 148,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28968,7 +30127,7 @@"method": "POST","path": "/api/v1/spaces/:space/pages","file": "server/http/api.js",-- "line": 125,++ "line": 140,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28978,7 +30137,7 @@"method": "GET","path": "/api/v1/spaces/:space/roles","file": "server/http/api.js",-- "line": 123,++ "line": 138,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -28988,7 +30147,7 @@"method": "PUT","path": "/api/v1/spaces/:space/roles/:subject","file": "server/http/api.js",-- "line": 124,++ "line": 139,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29088,7 +30247,7 @@"method": "GET","path": "/new-space","file": "server/http/pages.js",-- "line": 115,++ "line": 137,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29098,7 +30257,7 @@"method": "POST","path": "/new-space","file": "server/http/pages.js",-- "line": 119,++ "line": 141,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29108,7 +30267,7 @@"method": "POST","path": "/proposals/:id","file": "server/http/pages.js",-- "line": 247,++ "line": 269,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29118,7 +30277,7 @@"method": "GET","path": "/recent","file": "server/http/pages.js",-- "line": 108,++ "line": 130,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29138,7 +30297,7 @@"method": "GET","path": "/s/:space","file": "server/http/pages.js",-- "line": 131,++ "line": 153,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29148,7 +30307,7 @@"method": "GET","path": "/s/:space/import","file": "server/http/pages.js",-- "line": 215,++ "line": 237,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29158,7 +30317,7 @@"method": "POST","path": "/s/:space/import","file": "server/http/pages.js",-- "line": 220,++ "line": 242,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29168,7 +30327,7 @@"method": "GET","path": "/s/:space/new","file": "server/http/pages.js",-- "line": 158,++ "line": 180,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29178,7 +30337,7 @@"method": "POST","path": "/s/:space/new","file": "server/http/pages.js",-- "line": 164,++ "line": 186,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29188,7 +30347,7 @@"method": "GET","path": "/s/:space/proposals","file": "server/http/pages.js",-- "line": 240,++ "line": 262,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29198,7 +30357,7 @@"method": "GET","path": "/s/:space/settings","file": "server/http/pages.js",-- "line": 183,++ "line": 205,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29208,7 +30367,7 @@"method": "POST","path": "/s/:space/settings","file": "server/http/pages.js",-- "line": 190,++ "line": 212,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29218,7 +30377,7 @@"method": "GET","path": "/search","file": "server/app.js",-- "line": 108,++ "line": 112,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29228,7 +30387,7 @@"method": "GET","path": "/search","file": "server/http/pages.js",-- "line": 109,++ "line": 131,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29268,7 +30427,7 @@"method": "GET","path": "/updates","file": "server/http/pages.js",-- "line": 107,++ "line": 129,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29278,7 +30437,7 @@"method": "GET","path": "/w/:space/:slug","file": "server/http/pages.js",-- "line": 285,++ "line": 307,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29288,7 +30447,7 @@"method": "GET","path": "/w/:space/:slug/compare","file": "server/http/pages.js",-- "line": 349,++ "line": 371,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29298,7 +30457,7 @@"method": "GET","path": "/w/:space/:slug/diff/:a/:b","file": "server/http/pages.js",-- "line": 357,++ "line": 379,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29308,7 +30467,7 @@"method": "POST","path": "/w/:space/:slug/discuss","file": "server/http/pages.js",-- "line": 516,++ "line": 538,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29318,7 +30477,7 @@"method": "GET","path": "/w/:space/:slug/edit","file": "server/http/pages.js",-- "line": 378,++ "line": 400,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29328,7 +30487,7 @@"method": "POST","path": "/w/:space/:slug/edit","file": "server/http/pages.js",-- "line": 393,++ "line": 415,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29338,7 +30497,7 @@"method": "GET","path": "/w/:space/:slug/history","file": "server/http/pages.js",-- "line": 324,++ "line": 346,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29348,7 +30507,7 @@"method": "GET","path": "/w/:space/:slug/publish","file": "server/http/pages.js",-- "line": 441,++ "line": 463,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29358,7 +30517,7 @@"method": "GET","path": "/w/:space/:slug/revert","file": "server/http/pages.js",-- "line": 420,++ "line": 442,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29368,7 +30527,7 @@"method": "POST","path": "/w/:space/:slug/revert","file": "server/http/pages.js",-- "line": 431,++ "line": 453,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29378,7 +30537,7 @@"method": "POST","path": "/w/:space/:slug/review","file": "server/http/pages.js",-- "line": 498,++ "line": 520,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29388,7 +30547,7 @@"method": "GET","path": "/w/:space/:slug/settings","file": "server/http/pages.js",-- "line": 450,++ "line": 472,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29398,7 +30557,7 @@"method": "POST","path": "/w/:space/:slug/settings","file": "server/http/pages.js",-- "line": 464,++ "line": 486,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29408,7 +30567,7 @@"method": "GET","path": "/w/:space/:slug/sources","file": "server/http/pages.js",-- "line": 335,++ "line": 357,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29418,7 +30577,7 @@"method": "POST","path": "/w/:space/:slug/watch","file": "server/http/pages.js",-- "line": 508,++ "line": 530,"target": "OpenVibe.Wiki","disposition": "keep","wave": "-",@@@ -29448,6 +30607,12 @@"TRUST_PROXY": ["server/config.js"],++ "WIKI_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "WIKI_LIMITS_HOUR": [++ "server/config.js"++ ],"WIKI_DB_PATH": ["server/config.js"],@@@ -29502,6 +30667,24 @@"WIKI_MEDIA_VERIFY_INTERVAL_MS": ["server/config.js"],++ "OV_VIP_INTERNAL_URL": [++ "server/config.js"++ ],++ "OV_VIP_URL": [++ "server/config.js"++ ],++ "WIKI_VIP_TIMEOUT_MS": [++ "server/config.js"++ ],++ "WIKI_VIP_CACHE_TTL_MS": [++ "server/config.js"++ ],++ "WIKI_VIP_CACHE_DENY_TTL_MS": [++ "server/config.js"++ ],++ "WIKI_VIP_CACHE_UNAVAILABLE_TTL_MS": [++ "server/config.js"++ ],"WIKI_SCHEDULE_INTERVAL_MS": ["server/config.js"],@@@ -29571,7 +30754,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 28,++ "testFiles": 35,"ci": true},{@@@ -29579,13 +30762,13 @@"service": "blog","present": true,"git": {-- "head": "79e9e153ca1308311993a31295fd471a8becaf8d",++ "head": "8a7f8ebe862b0e1c0bb119ee96c42f38fc0e5321","branch": "main",-- "originMain": "79e9e153ca1308311993a31295fd471a8becaf8d",-- "committedAt": "2026-09-26T06:09:58-07:00"++ "originMain": "8a7f8ebe862b0e1c0bb119ee96c42f38fc0e5321",++ "committedAt": "2026-09-27T19:58:44-07:00"},-- "sourceFiles": 33,-- "loc": 5037,++ "sourceFiles": 34,++ "loc": 5185,"tables": [{"table": "changelog_state",@@@ -29683,7 +30866,7 @@"method": "POST","path": "/@:handle/:slug/comments","file": "server/http/public.js",-- "line": 381,++ "line": 383,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29753,7 +30936,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 112,++ "line": 117,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29763,7 +30946,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 116,++ "line": 121,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29773,7 +30956,7 @@"method": "POST","path": "/api/v1/blogs","file": "server/http/api.js",-- "line": 127,++ "line": 132,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29783,7 +30966,7 @@"method": "GET","path": "/api/v1/blogs/:handle","file": "server/http/api.js",-- "line": 122,++ "line": 127,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29793,7 +30976,7 @@"method": "PATCH","path": "/api/v1/blogs/:handle","file": "server/http/api.js",-- "line": 134,++ "line": 139,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29803,7 +30986,7 @@"method": "GET","path": "/api/v1/blogs/:handle/feed","file": "server/http/api.js",-- "line": 221,++ "line": 226,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29813,7 +30996,7 @@"method": "GET","path": "/api/v1/blogs/:handle/members","file": "server/http/api.js",-- "line": 152,++ "line": 157,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29823,7 +31006,7 @@"method": "DELETE","path": "/api/v1/blogs/:handle/members/:subject","file": "server/http/api.js",-- "line": 166,++ "line": 171,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29833,7 +31016,7 @@"method": "PUT","path": "/api/v1/blogs/:handle/members/:subject","file": "server/http/api.js",-- "line": 160,++ "line": 165,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29843,7 +31026,7 @@"method": "GET","path": "/api/v1/blogs/:handle/posts","file": "server/http/api.js",-- "line": 172,++ "line": 177,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29853,7 +31036,7 @@"method": "POST","path": "/api/v1/blogs/:handle/posts","file": "server/http/api.js",-- "line": 214,++ "line": 219,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29863,7 +31046,7 @@"method": "POST","path": "/api/v1/blogs/:handle/posts/ai-draft","file": "server/http/api.js",-- "line": 206,++ "line": 211,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29873,7 +31056,7 @@"method": "PUT","path": "/api/v1/blogs/:handle/theme","file": "server/http/api.js",-- "line": 146,++ "line": 151,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29883,7 +31066,7 @@"method": "GET","path": "/api/v1/changelog","file": "server/http/api.js",-- "line": 187,++ "line": 192,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29893,7 +31076,7 @@"method": "GET","path": "/api/v1/posts/:id","file": "server/http/api.js",-- "line": 232,++ "line": 237,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29903,7 +31086,7 @@"method": "GET","path": "/api/v1/posts/:id/diff","file": "server/http/api.js",-- "line": 306,++ "line": 311,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29913,7 +31096,7 @@"method": "POST","path": "/api/v1/posts/:id/reviews","file": "server/http/api.js",-- "line": 279,++ "line": 284,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29923,7 +31106,7 @@"method": "GET","path": "/api/v1/posts/:id/revisions","file": "server/http/api.js",-- "line": 296,++ "line": 301,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -29933,7 +31116,7 @@"method": "GET","path": "/api/v1/posts/:id/revisions/:n","file": "server/http/api.js",-- "line": 300,++ "line": 305,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30083,7 +31266,7 @@"method": "GET","path": "/write","file": "server/http/editor.js",-- "line": 94,++ "line": 106,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30093,7 +31276,7 @@"method": "GET","path": "/write/@:handle","file": "server/http/editor.js",-- "line": 109,++ "line": 121,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30103,7 +31286,17 @@"method": "POST","path": "/write/@:handle/ai-draft","file": "server/http/editor.js",-- "line": 125,++ "line": 56,++ "target": "OpenVibe.Blog",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/write/@:handle/ai-draft",++ "file": "server/http/editor.js",++ "line": 137,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30113,7 +31306,7 @@"method": "POST","path": "/write/@:handle/members","file": "server/http/editor.js",-- "line": 162,++ "line": 174,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30123,7 +31316,7 @@"method": "POST","path": "/write/@:handle/members/remove","file": "server/http/editor.js",-- "line": 173,++ "line": 185,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30133,7 +31326,7 @@"method": "GET","path": "/write/@:handle/new","file": "server/http/editor.js",-- "line": 117,++ "line": 129,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30143,7 +31336,17 @@"method": "POST","path": "/write/@:handle/new","file": "server/http/editor.js",-- "line": 134,++ "line": 57,++ "target": "OpenVibe.Blog",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/write/@:handle/new",++ "file": "server/http/editor.js",++ "line": 146,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30153,7 +31356,7 @@"method": "GET","path": "/write/@:handle/settings","file": "server/http/editor.js",-- "line": 142,++ "line": 154,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30163,7 +31366,17 @@"method": "POST","path": "/write/@:handle/settings","file": "server/http/editor.js",-- "line": 150,++ "line": 58,++ "target": "OpenVibe.Blog",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/write/@:handle/settings",++ "file": "server/http/editor.js",++ "line": 162,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30173,7 +31386,7 @@"method": "GET","path": "/write/posts/:id","file": "server/http/editor.js",-- "line": 182,++ "line": 194,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30183,7 +31396,7 @@"method": "POST","path": "/write/posts/:id","file": "server/http/editor.js",-- "line": 203,++ "line": 215,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30193,7 +31406,17 @@"method": "POST","path": "/write/posts/:id/${name}","file": "server/http/editor.js",-- "line": 212,++ "line": 224,++ "target": "OpenVibe.Blog",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/write/posts/:id/delete",++ "file": "server/http/editor.js",++ "line": 62,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30203,7 +31426,7 @@"method": "POST","path": "/write/posts/:id/media/:aid/remove","file": "server/http/editor.js",-- "line": 242,++ "line": 254,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30213,7 +31436,7 @@"method": "GET","path": "/write/posts/:id/preview","file": "server/http/editor.js",-- "line": 260,++ "line": 272,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30223,7 +31446,7 @@"method": "GET","path": "/write/posts/:id/revisions","file": "server/http/editor.js",-- "line": 249,++ "line": 261,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30233,7 +31456,17 @@"method": "POST","path": "/write/start","file": "server/http/editor.js",-- "line": 101,++ "line": 55,++ "target": "OpenVibe.Blog",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "POST",++ "path": "/write/start",++ "file": "server/http/editor.js",++ "line": 113,"target": "OpenVibe.Blog","disposition": "keep","wave": "-",@@@ -30260,6 +31493,12 @@"TRUST_PROXY": ["server/config.js"],++ "BLOG_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "BLOG_LIMITS_HOUR": [++ "server/config.js"++ ],"BLOG_DB_PATH": ["server/config.js"],@@@ -30532,7 +31771,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 23,++ "testFiles": 29,"ci": true},{@@@ -30540,13 +31779,13 @@"service": "news","present": true,"git": {-- "head": "0860cf20dd3d8e8032caad300e0ce90497195b96",++ "head": "97dae43a2d41c5528bbb4c93ff2ea7ea456203dd","branch": "main",-- "originMain": "0860cf20dd3d8e8032caad300e0ce90497195b96",-- "committedAt": "2026-09-26T06:17:45-07:00"++ "originMain": "97dae43a2d41c5528bbb4c93ff2ea7ea456203dd",++ "committedAt": "2026-09-27T19:57:37-07:00"},-- "sourceFiles": 33,-- "loc": 5103,++ "sourceFiles": 34,++ "loc": 5251,"tables": [{"table": "news_topics",@@@ -30652,7 +31891,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 107,++ "line": 112,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30662,7 +31901,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 111,++ "line": 116,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30672,7 +31911,7 @@"method": "GET","path": "/api/v1/clusters","file": "server/http/api.js",-- "line": 219,++ "line": 225,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30682,7 +31921,7 @@"method": "GET","path": "/api/v1/clusters/:id","file": "server/http/api.js",-- "line": 224,++ "line": 230,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30692,7 +31931,7 @@"method": "POST","path": "/api/v1/clusters/:id/merge","file": "server/http/api.js",-- "line": 235,++ "line": 241,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30702,7 +31941,7 @@"method": "POST","path": "/api/v1/clusters/:id/split","file": "server/http/api.js",-- "line": 241,++ "line": 247,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30712,7 +31951,7 @@"method": "POST","path": "/api/v1/clusters/audit/:auditId/reverse","file": "server/http/api.js",-- "line": 230,++ "line": 236,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30722,7 +31961,7 @@"method": "GET","path": "/api/v1/ingest","file": "server/http/api.js",-- "line": 253,++ "line": 259,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30732,7 +31971,7 @@"method": "GET","path": "/api/v1/source-items/:id","file": "server/http/api.js",-- "line": 247,++ "line": 253,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30742,7 +31981,7 @@"method": "GET","path": "/api/v1/stories","file": "server/http/api.js",-- "line": 129,++ "line": 134,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30752,7 +31991,7 @@"method": "POST","path": "/api/v1/stories","file": "server/http/api.js",-- "line": 152,++ "line": 157,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30762,7 +32001,7 @@"method": "GET","path": "/api/v1/stories/:id","file": "server/http/api.js",-- "line": 139,++ "line": 144,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30772,7 +32011,7 @@"method": "GET","path": "/api/v1/stories/:id/diff","file": "server/http/api.js",-- "line": 170,++ "line": 175,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30782,7 +32021,7 @@"method": "POST","path": "/api/v1/stories/:id/reviews","file": "server/http/api.js",-- "line": 200,++ "line": 206,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30792,7 +32031,7 @@"method": "GET","path": "/api/v1/stories/:id/revisions","file": "server/http/api.js",-- "line": 158,++ "line": 163,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30802,7 +32041,7 @@"method": "GET","path": "/api/v1/stories/:id/revisions/:n","file": "server/http/api.js",-- "line": 163,++ "line": 168,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30812,7 +32051,7 @@"method": "GET","path": "/api/v1/topics","file": "server/http/api.js",-- "line": 118,++ "line": 123,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30822,7 +32061,7 @@"method": "POST","path": "/api/v1/topics","file": "server/http/api.js",-- "line": 120,++ "line": 125,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30892,7 +32131,7 @@"method": "GET","path": "/clusters/:id","file": "server/http/editor.js",-- "line": 105,++ "line": 110,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30902,7 +32141,7 @@"method": "POST","path": "/clusters/:id/merge","file": "server/http/editor.js",-- "line": 114,++ "line": 119,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30912,7 +32151,7 @@"method": "POST","path": "/clusters/:id/split","file": "server/http/editor.js",-- "line": 119,++ "line": 124,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30922,7 +32161,7 @@"method": "POST","path": "/clusters/:id/stories","file": "server/http/editor.js",-- "line": 128,++ "line": 133,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30932,7 +32171,7 @@"method": "POST","path": "/clusters/audit/:aid/reverse","file": "server/http/editor.js",-- "line": 124,++ "line": 129,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30942,7 +32181,7 @@"method": "GET","path": "/edit","file": "server/http/editor.js",-- "line": 74,++ "line": 79,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30952,7 +32191,7 @@"method": "POST","path": "/edit/pull","file": "server/http/editor.js",-- "line": 85,++ "line": 90,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30962,7 +32201,7 @@"method": "GET","path": "/edit/stories/:id","file": "server/http/editor.js",-- "line": 142,++ "line": 147,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30972,7 +32211,7 @@"method": "POST","path": "/edit/stories/:id/${path}","file": "server/http/editor.js",-- "line": 171,++ "line": 176,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30982,7 +32221,7 @@"method": "GET","path": "/edit/stories/:id/diff","file": "server/http/editor.js",-- "line": 165,++ "line": 170,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -30992,7 +32231,7 @@"method": "GET","path": "/edit/stories/:id/preview","file": "server/http/editor.js",-- "line": 155,++ "line": 160,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -31002,7 +32241,7 @@"method": "GET","path": "/edit/topics","file": "server/http/editor.js",-- "line": 90,++ "line": 95,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -31012,7 +32251,7 @@"method": "POST","path": "/edit/topics","file": "server/http/editor.js",-- "line": 91,++ "line": 96,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -31092,7 +32331,7 @@"method": "POST","path": "/stories/:slug/comments","file": "server/http/public.js",-- "line": 201,++ "line": 202,"target": "OpenVibe.News","disposition": "keep","wave": "-",@@@ -31159,6 +32398,12 @@"TRUST_PROXY": ["server/config.js"],++ "NEWS_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "NEWS_LIMITS_HOUR": [++ "server/config.js"++ ],"NEWS_DB_PATH": ["server/config.js"],@@@ -31358,7 +32603,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 18,++ "testFiles": 19,"ci": true},{@@@ -31366,13 +32611,13 @@"service": "reviews","present": true,"git": {-- "head": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",++ "head": "c87b34440b0d50bc2cdf6c136775002ed9080c1e","branch": "main",-- "originMain": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",-- "committedAt": "2026-09-26T06:18:06-07:00"++ "originMain": "c87b34440b0d50bc2cdf6c136775002ed9080c1e",++ "committedAt": "2026-09-27T19:59:21-07:00"},-- "sourceFiles": 22,-- "loc": 4649,++ "sourceFiles": 23,++ "loc": 4792,"tables": [{"table": "review_entities",@@@ -31464,7 +32709,7 @@"method": "GET","path": "/","file": "server/http/pages.js",-- "line": 141,++ "line": 145,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31474,7 +32719,7 @@"method": "GET","path": "/about","file": "server/http/pages.js",-- "line": 150,++ "line": 154,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31484,7 +32729,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 83,++ "line": 84,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31494,7 +32739,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 103,++ "line": 104,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31504,7 +32749,7 @@"method": "GET","path": "/api/v1/corrections","file": "server/http/api.js",-- "line": 152,++ "line": 158,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31514,7 +32759,7 @@"method": "PATCH","path": "/api/v1/corrections/:id","file": "server/http/api.js",-- "line": 156,++ "line": 162,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31524,7 +32769,7 @@"method": "GET","path": "/api/v1/entities","file": "server/http/api.js",-- "line": 71,++ "line": 76,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31534,7 +32779,7 @@"method": "POST","path": "/api/v1/entities","file": "server/http/api.js",-- "line": 91,++ "line": 97,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31544,7 +32789,7 @@"method": "DELETE","path": "/api/v1/entities/:ref","file": "server/http/api.js",-- "line": 96,++ "line": 102,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31554,7 +32799,7 @@"method": "GET","path": "/api/v1/entities/:ref","file": "server/http/api.js",-- "line": 78,++ "line": 84,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31564,7 +32809,7 @@"method": "PATCH","path": "/api/v1/entities/:ref","file": "server/http/api.js",-- "line": 95,++ "line": 101,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31574,7 +32819,7 @@"method": "GET","path": "/api/v1/entities/:ref/aggregate","file": "server/http/api.js",-- "line": 85,++ "line": 91,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31584,7 +32829,7 @@"method": "POST","path": "/api/v1/entities/:ref/aliases","file": "server/http/api.js",-- "line": 97,++ "line": 103,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31594,7 +32839,7 @@"method": "DELETE","path": "/api/v1/entities/:ref/aliases/:id","file": "server/http/api.js",-- "line": 98,++ "line": 104,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31604,7 +32849,7 @@"method": "POST","path": "/api/v1/entities/:ref/corrections","file": "server/http/api.js",-- "line": 151,++ "line": 157,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31614,7 +32859,7 @@"method": "GET","path": "/api/v1/entities/:ref/history","file": "server/http/api.js",-- "line": 84,++ "line": 90,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31624,7 +32869,7 @@"method": "POST","path": "/api/v1/entities/:ref/links","file": "server/http/api.js",-- "line": 99,++ "line": 105,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31634,7 +32879,7 @@"method": "DELETE","path": "/api/v1/entities/:ref/links/:id","file": "server/http/api.js",-- "line": 100,++ "line": 106,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31644,7 +32889,7 @@"method": "POST","path": "/api/v1/entities/:ref/merge","file": "server/http/api.js",-- "line": 101,++ "line": 107,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31654,7 +32899,7 @@"method": "POST","path": "/api/v1/entities/:ref/split","file": "server/http/api.js",-- "line": 105,++ "line": 111,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31664,7 +32909,7 @@"method": "POST","path": "/api/v1/entities/:ref/summary/proposals","file": "server/http/api.js",-- "line": 145,++ "line": 151,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31674,7 +32919,7 @@"method": "POST","path": "/api/v1/entities/:ref/summary/publish","file": "server/http/api.js",-- "line": 148,++ "line": 154,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31684,7 +32929,7 @@"method": "POST","path": "/api/v1/entities/:ref/summary/revisions","file": "server/http/api.js",-- "line": 144,++ "line": 150,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31694,7 +32939,7 @@"method": "GET","path": "/api/v1/entities/:ref/summary/revisions/:n","file": "server/http/api.js",-- "line": 146,++ "line": 152,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31704,7 +32949,7 @@"method": "POST","path": "/api/v1/entities/:ref/summary/revisions/:n/review","file": "server/http/api.js",-- "line": 147,++ "line": 153,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31714,7 +32959,7 @@"method": "POST","path": "/api/v1/entities/:ref/summary/unpublish","file": "server/http/api.js",-- "line": 149,++ "line": 155,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31724,7 +32969,7 @@"method": "GET","path": "/api/v1/items","file": "server/http/api.js",-- "line": 111,++ "line": 117,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31734,7 +32979,7 @@"method": "GET","path": "/api/v1/items/:id","file": "server/http/api.js",-- "line": 115,++ "line": 121,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31744,7 +32989,7 @@"method": "POST","path": "/api/v1/items/:id/resolution","file": "server/http/api.js",-- "line": 122,++ "line": 128,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31754,7 +32999,7 @@"method": "POST","path": "/api/v1/resolve","file": "server/http/api.js",-- "line": 77,++ "line": 83,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31764,7 +33009,7 @@"method": "POST","path": "/api/v1/signals/import","file": "server/http/api.js",-- "line": 129,++ "line": 135,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31774,7 +33019,7 @@"method": "POST","path": "/api/v1/sources/sync","file": "server/http/api.js",-- "line": 136,++ "line": 142,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31784,7 +33029,7 @@"method": "POST","path": "/api/v1/trust","file": "server/http/api.js",-- "line": 109,++ "line": 115,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31854,7 +33099,7 @@"method": "GET","path": "/e/:slug","file": "server/http/pages.js",-- "line": 176,++ "line": 180,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31864,7 +33109,7 @@"method": "GET","path": "/e/:slug.json","file": "server/http/pages.js",-- "line": 156,++ "line": 160,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31874,7 +33119,7 @@"method": "GET","path": "/e/:slug/correct","file": "server/http/pages.js",-- "line": 204,++ "line": 208,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31884,7 +33129,7 @@"method": "POST","path": "/e/:slug/correct","file": "server/app.js",-- "line": 125,++ "line": 129,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31894,7 +33139,7 @@"method": "POST","path": "/e/:slug/correct","file": "server/http/pages.js",-- "line": 210,++ "line": 214,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31904,7 +33149,7 @@"method": "POST","path": "/e/:slug/discuss","file": "server/http/pages.js",-- "line": 224,++ "line": 228,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31914,7 +33159,7 @@"method": "GET","path": "/e/:slug/edit","file": "server/http/pages.js",-- "line": 285,++ "line": 289,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31924,7 +33169,7 @@"method": "POST","path": "/e/:slug/edit","file": "server/http/pages.js",-- "line": 291,++ "line": 295,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31934,7 +33179,7 @@"method": "GET","path": "/e/:slug/history","file": "server/http/pages.js",-- "line": 191,++ "line": 195,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31944,7 +33189,7 @@"method": "POST","path": "/e/:slug/merge","file": "server/http/pages.js",-- "line": 339,++ "line": 343,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31954,7 +33199,7 @@"method": "POST","path": "/e/:slug/split","file": "server/http/pages.js",-- "line": 348,++ "line": 352,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31964,7 +33209,7 @@"method": "POST","path": "/e/:slug/summary","file": "server/http/pages.js",-- "line": 317,++ "line": 321,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31974,7 +33219,7 @@"method": "GET","path": "/e/:slug/summary/:n","file": "server/http/pages.js",-- "line": 197,++ "line": 201,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31984,7 +33229,7 @@"method": "POST","path": "/e/:slug/summary/:n/review","file": "server/http/pages.js",-- "line": 330,++ "line": 334,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -31994,7 +33239,7 @@"method": "GET","path": "/editor","file": "server/http/pages.js",-- "line": 242,++ "line": 246,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -32004,7 +33249,7 @@"method": "POST","path": "/editor/corrections/:id","file": "server/http/pages.js",-- "line": 376,++ "line": 380,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -32014,7 +33259,7 @@"method": "GET","path": "/editor/entities/new","file": "server/http/pages.js",-- "line": 258,++ "line": 262,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -32024,7 +33269,7 @@"method": "POST","path": "/editor/entities/new","file": "server/http/pages.js",-- "line": 262,++ "line": 266,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -32034,7 +33279,7 @@"method": "GET","path": "/editor/items/:id","file": "server/http/pages.js",-- "line": 357,++ "line": 361,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -32044,7 +33289,7 @@"method": "POST","path": "/editor/items/:id","file": "server/http/pages.js",-- "line": 365,++ "line": 369,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -32054,7 +33299,7 @@"method": "POST","path": "/editor/sync","file": "server/http/pages.js",-- "line": 250,++ "line": 254,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -32114,7 +33359,7 @@"method": "GET","path": "/search","file": "server/http/pages.js",-- "line": 151,++ "line": 155,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -32154,7 +33399,7 @@"method": "GET","path": "/updates","file": "server/http/pages.js",-- "line": 149,++ "line": 153,"target": "OpenVibe.Reviews","disposition": "keep","wave": "-",@@@ -32184,6 +33429,12 @@"TRUST_PROXY": ["server/config.js"],++ "REVIEWS_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "REVIEWS_LIMITS_HOUR": [++ "server/config.js"++ ],"REVIEWS_DB_PATH": ["server/config.js"],@@@ -32293,7 +33544,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 16,++ "testFiles": 17,"ci": true},{@@@ -32301,13 +33552,13 @@"service": "deals","present": true,"git": {-- "head": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",++ "head": "533450f9cc4a358ba50f353f06826ec3611b4ddc","branch": "main",-- "originMain": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",-- "committedAt": "2026-09-26T06:14:11-07:00"++ "originMain": "533450f9cc4a358ba50f353f06826ec3611b4ddc",++ "committedAt": "2026-09-27T19:57:12-07:00"},-- "sourceFiles": 35,-- "loc": 4845,++ "sourceFiles": 36,++ "loc": 4980,"tables": [{"table": "deal_stores",@@@ -32405,7 +33656,7 @@"method": "GET","path": "/","file": "server/http/pages.js",-- "line": 132,++ "line": 135,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32415,7 +33666,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 114,++ "line": 118,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32425,7 +33676,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 118,++ "line": 122,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32435,7 +33686,7 @@"method": "GET","path": "/api/v1/flags","file": "server/http/api.js",-- "line": 144,++ "line": 148,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32445,7 +33696,7 @@"method": "POST","path": "/api/v1/flags/:id/resolve","file": "server/http/api.js",-- "line": 150,++ "line": 154,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32455,7 +33706,7 @@"method": "GET","path": "/api/v1/offers","file": "server/http/api.js",-- "line": 65,++ "line": 69,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32465,7 +33716,7 @@"method": "POST","path": "/api/v1/offers","file": "server/http/api.js",-- "line": 93,++ "line": 97,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32475,7 +33726,7 @@"method": "GET","path": "/api/v1/offers/:id","file": "server/http/api.js",-- "line": 73,++ "line": 77,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32485,7 +33736,7 @@"method": "PATCH","path": "/api/v1/offers/:id","file": "server/http/api.js",-- "line": 99,++ "line": 103,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32495,7 +33746,7 @@"method": "POST","path": "/api/v1/offers/:id/${action}","file": "server/http/api.js",-- "line": 141,++ "line": 145,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32505,7 +33756,7 @@"method": "POST","path": "/api/v1/offers/:id/expire","file": "server/http/api.js",-- "line": 107,++ "line": 111,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32515,7 +33766,7 @@"method": "POST","path": "/api/v1/offers/:id/flags","file": "server/http/api.js",-- "line": 123,++ "line": 127,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32525,7 +33776,7 @@"method": "GET","path": "/api/v1/offers/:id/hotness","file": "server/http/api.js",-- "line": 82,++ "line": 86,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32535,7 +33786,7 @@"method": "POST","path": "/api/v1/offers/:id/merge","file": "server/http/api.js",-- "line": 129,++ "line": 133,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32545,7 +33796,7 @@"method": "POST","path": "/api/v1/offers/:id/observations","file": "server/http/api.js",-- "line": 101,++ "line": 105,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32555,7 +33806,7 @@"method": "POST","path": "/api/v1/offers/:id/unmerge","file": "server/http/api.js",-- "line": 135,++ "line": 139,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32565,7 +33816,7 @@"method": "DELETE","path": "/api/v1/offers/:id/vote","file": "server/http/api.js",-- "line": 117,++ "line": 121,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32575,7 +33826,7 @@"method": "PUT","path": "/api/v1/offers/:id/vote","file": "server/http/api.js",-- "line": 109,++ "line": 113,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32585,7 +33836,7 @@"method": "GET","path": "/api/v1/products/:slug","file": "server/http/api.js",-- "line": 157,++ "line": 161,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32595,7 +33846,7 @@"method": "POST","path": "/api/v1/products/resolve","file": "server/http/api.js",-- "line": 167,++ "line": 171,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32605,7 +33856,7 @@"method": "GET","path": "/api/v1/stores/:domain","file": "server/http/api.js",-- "line": 181,++ "line": 185,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32615,7 +33866,7 @@"method": "GET","path": "/api/v1/watches","file": "server/http/api.js",-- "line": 189,++ "line": 193,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32625,7 +33876,7 @@"method": "POST","path": "/api/v1/watches","file": "server/http/api.js",-- "line": 191,++ "line": 195,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32635,7 +33886,7 @@"method": "DELETE","path": "/api/v1/watches/:id","file": "server/http/api.js",-- "line": 196,++ "line": 200,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32645,7 +33896,7 @@"method": "GET","path": "/atom.xml","file": "server/http/pages.js",-- "line": 424,++ "line": 427,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32715,7 +33966,7 @@"method": "GET","path": "/d/:slug","file": "server/http/pages.js",-- "line": 204,++ "line": 207,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32725,7 +33976,7 @@"method": "POST","path": "/d/:slug/comments","file": "server/http/pages.js",-- "line": 235,++ "line": 238,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32735,7 +33986,7 @@"method": "POST","path": "/d/:slug/expire","file": "server/http/pages.js",-- "line": 230,++ "line": 233,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32745,7 +33996,7 @@"method": "POST","path": "/d/:slug/flag","file": "server/http/pages.js",-- "line": 225,++ "line": 228,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32755,7 +34006,7 @@"method": "POST","path": "/d/:slug/observe","file": "server/http/pages.js",-- "line": 220,++ "line": 223,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32765,7 +34016,7 @@"method": "POST","path": "/d/:slug/vote","file": "server/http/pages.js",-- "line": 212,++ "line": 215,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32775,7 +34026,7 @@"method": "GET","path": "/feed.json","file": "server/http/pages.js",-- "line": 428,++ "line": 431,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32785,7 +34036,7 @@"method": "GET","path": "/feed.xml","file": "server/http/pages.js",-- "line": 423,++ "line": 426,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32815,7 +34066,7 @@"method": "GET","path": "/mod","file": "server/http/pages.js",-- "line": 371,++ "line": 374,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32825,7 +34076,7 @@"method": "POST","path": "/mod/flags/:id/:action","file": "server/http/pages.js",-- "line": 398,++ "line": 401,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32835,7 +34086,7 @@"method": "POST","path": "/mod/offers/:slug/:action","file": "server/http/pages.js",-- "line": 380,++ "line": 383,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32845,7 +34096,7 @@"method": "GET","path": "/new","file": "server/http/pages.js",-- "line": 139,++ "line": 142,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32855,7 +34106,7 @@"method": "GET","path": "/p/:slug","file": "server/http/pages.js",-- "line": 252,++ "line": 255,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32875,7 +34126,7 @@"method": "GET","path": "/s/:domain","file": "server/http/pages.js",-- "line": 275,++ "line": 278,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32885,7 +34136,7 @@"method": "GET","path": "/search","file": "server/http/pages.js",-- "line": 293,++ "line": 296,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32925,7 +34176,7 @@"method": "GET","path": "/submit","file": "server/http/pages.js",-- "line": 307,++ "line": 310,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32935,7 +34186,7 @@"method": "POST","path": "/submit","file": "server/http/pages.js",-- "line": 314,++ "line": 317,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32945,7 +34196,7 @@"method": "GET","path": "/updates","file": "server/http/pages.js",-- "line": 134,++ "line": 137,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32955,7 +34206,7 @@"method": "GET","path": "/watches","file": "server/http/pages.js",-- "line": 341,++ "line": 344,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32965,7 +34216,7 @@"method": "POST","path": "/watches","file": "server/http/pages.js",-- "line": 346,++ "line": 349,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -32975,7 +34226,7 @@"method": "POST","path": "/watches/:id/delete","file": "server/http/pages.js",-- "line": 358,++ "line": 361,"target": "OpenVibe.Deals","disposition": "keep","wave": "-",@@@ -33002,6 +34253,12 @@"TRUST_PROXY": ["server/config.js"],++ "DEALS_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "DEALS_LIMITS_HOUR": [++ "server/config.js"++ ],"DEALS_DB_PATH": ["server/config.js"],@@@ -33237,7 +34494,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 16,++ "testFiles": 17,"ci": true},{@@@ -33245,13 +34502,13 @@"service": "coupons","present": true,"git": {-- "head": "348f585cd6549a5c506171fba0fc2c5462dede32",++ "head": "b91cd795e8ee4a3e49317a6e3cb000fa92da9325","branch": "main",-- "originMain": "348f585cd6549a5c506171fba0fc2c5462dede32",-- "committedAt": "2026-09-26T06:13:57-07:00"++ "originMain": "b91cd795e8ee4a3e49317a6e3cb000fa92da9325",++ "committedAt": "2026-09-27T19:56:35-07:00"},-- "sourceFiles": 28,-- "loc": 4155,++ "sourceFiles": 29,++ "loc": 4289,"tables": [{"table": "coupon_merchants",@@@ -33331,7 +34588,7 @@"method": "GET","path": "/","file": "server/http/public.js",-- "line": 105,++ "line": 108,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33341,7 +34598,7 @@"method": "GET","path": "/about","file": "server/http/public.js",-- "line": 118,++ "line": 121,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33351,7 +34608,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 98,++ "line": 105,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33361,7 +34618,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 102,++ "line": 109,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33371,7 +34628,7 @@"method": "GET","path": "/api/v1/coupons/:id","file": "server/http/api.js",-- "line": 143,++ "line": 148,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33381,7 +34638,7 @@"method": "POST","path": "/api/v1/coupons/:id/report","file": "server/http/api.js",-- "line": 152,++ "line": 157,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33391,7 +34648,7 @@"method": "POST","path": "/api/v1/coupons/:id/status","file": "server/http/api.js",-- "line": 176,++ "line": 181,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33401,7 +34658,7 @@"method": "POST","path": "/api/v1/coupons/submit","file": "server/http/api.js",-- "line": 158,++ "line": 163,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33411,7 +34668,7 @@"method": "POST","path": "/api/v1/merchants","file": "server/http/api.js",-- "line": 186,++ "line": 191,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33421,7 +34678,7 @@"method": "GET","path": "/api/v1/merchants/:id","file": "server/http/api.js",-- "line": 137,++ "line": 142,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33431,7 +34688,7 @@"method": "GET","path": "/api/v1/merchants/:id/coupons","file": "server/http/api.js",-- "line": 131,++ "line": 136,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33441,7 +34698,7 @@"method": "POST","path": "/api/v1/merchants/:id/domains","file": "server/http/api.js",-- "line": 196,++ "line": 201,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33451,7 +34708,7 @@"method": "POST","path": "/api/v1/merchants/:id/status","file": "server/http/api.js",-- "line": 205,++ "line": 210,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33461,7 +34718,7 @@"method": "GET","path": "/api/v1/merchants/resolve","file": "server/http/api.js",-- "line": 115,++ "line": 120,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33541,7 +34798,7 @@"method": "GET","path": "/c/:id","file": "server/http/public.js",-- "line": 199,++ "line": 202,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33551,7 +34808,7 @@"method": "GET","path": "/c/:id.json","file": "server/http/public.js",-- "line": 189,++ "line": 192,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33561,7 +34818,7 @@"method": "POST","path": "/c/:id/report","file": "server/http/public.js",-- "line": 213,++ "line": 216,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33571,7 +34828,7 @@"method": "GET","path": "/connect-extension","file": "server/http/public.js",-- "line": 271,++ "line": 274,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33581,7 +34838,7 @@"method": "POST","path": "/connect-extension","file": "server/http/public.js",-- "line": 272,++ "line": 275,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33591,7 +34848,7 @@"method": "POST","path": "/connect-extension/:id/revoke","file": "server/http/public.js",-- "line": 282,++ "line": 285,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33631,7 +34888,7 @@"method": "GET","path": "/m/:slug","file": "server/http/public.js",-- "line": 151,++ "line": 154,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33641,7 +34898,7 @@"method": "GET","path": "/m/:slug.json","file": "server/http/public.js",-- "line": 140,++ "line": 143,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33661,7 +34918,7 @@"method": "POST","path": "/m/:slug/watch","file": "server/http/public.js",-- "line": 171,++ "line": 174,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33711,7 +34968,7 @@"method": "GET","path": "/staff","file": "server/http/public.js",-- "line": 324,++ "line": 327,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33721,7 +34978,7 @@"method": "POST","path": "/staff/coupons/:id/approve","file": "server/http/public.js",-- "line": 337,++ "line": 340,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33731,7 +34988,7 @@"method": "POST","path": "/staff/merchants","file": "server/http/public.js",-- "line": 325,++ "line": 328,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33741,7 +34998,7 @@"method": "POST","path": "/staff/merchants/:id/status","file": "server/http/public.js",-- "line": 331,++ "line": 334,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33751,7 +35008,7 @@"method": "GET","path": "/submit","file": "server/http/public.js",-- "line": 227,++ "line": 230,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33761,7 +35018,7 @@"method": "POST","path": "/submit","file": "server/http/public.js",-- "line": 236,++ "line": 239,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33771,7 +35028,7 @@"method": "GET","path": "/updates","file": "server/http/public.js",-- "line": 100,++ "line": 103,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33781,7 +35038,7 @@"method": "GET","path": "/watching","file": "server/http/public.js",-- "line": 288,++ "line": 291,"target": "OpenVibe.Coupons","disposition": "keep","wave": "-",@@@ -33808,6 +35065,12 @@"TRUST_PROXY": ["server/config.js"],++ "COUPONS_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "COUPONS_LIMITS_HOUR": [++ "server/config.js"++ ],"COUPONS_DB_PATH": ["server/config.js"],@@@ -34024,7 +35287,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 15,++ "testFiles": 16,"ci": true},{@@@ -34032,13 +35295,13 @@"service": "trade","present": true,"git": {-- "head": "fa382881cd92ee90b6329699d7d79129e32a6325",++ "head": "273bce7b1b8771037bc2a660fa8784dc1aa049a7","branch": "main",-- "originMain": "fa382881cd92ee90b6329699d7d79129e32a6325",-- "committedAt": "2026-09-26T06:21:08-07:00"++ "originMain": "273bce7b1b8771037bc2a660fa8784dc1aa049a7",++ "committedAt": "2026-09-27T19:58:02-07:00"},-- "sourceFiles": 36,-- "loc": 4431,++ "sourceFiles": 37,++ "loc": 4562,"tables": [{"table": "trade_instruments",@@@ -34193,6 +35456,12 @@"TRUST_PROXY": ["server/config.js"],++ "TRADE_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "TRADE_LIMITS_HOUR": [++ "server/config.js"++ ],"TRADE_DB_PATH": ["server/config.js"],@@@ -34391,7 +35660,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 15,++ "testFiles": 16,"ci": true},{@@@ -34399,13 +35668,13 @@"service": "codes","present": true,"git": {-- "head": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",++ "head": "7d6f65ac198d95f70ac840c24d03d1407affb7a9","branch": "main",-- "originMain": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",-- "committedAt": "2026-09-26T06:13:08-07:00"++ "originMain": "7d6f65ac198d95f70ac840c24d03d1407affb7a9",++ "committedAt": "2026-09-27T20:00:39-07:00"},-- "sourceFiles": 29,-- "loc": 4803,++ "sourceFiles": 32,++ "loc": 5091,"tables": [{"table": "manifests",@@@ -34465,7 +35734,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 102,++ "line": 112,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34475,7 +35744,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 106,++ "line": 116,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34485,7 +35754,7 @@"method": "GET","path": "/api/v1/apps/:app/releases","file": "server/http/api.js",-- "line": 65,++ "line": 69,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34495,7 +35764,7 @@"method": "POST","path": "/api/v1/apps/:app/releases","file": "server/http/api.js",-- "line": 107,++ "line": 111,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34505,7 +35774,7 @@"method": "GET","path": "/api/v1/apps/:app/trust","file": "server/http/api.js",-- "line": 70,++ "line": 74,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34515,7 +35784,7 @@"method": "GET","path": "/api/v1/docs/versions","file": "server/http/api.js",-- "line": 42,++ "line": 46,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34525,7 +35794,7 @@"method": "POST","path": "/api/v1/manifests/validate","file": "server/http/api.js",-- "line": 46,++ "line": 50,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34535,7 +35804,7 @@"method": "GET","path": "/api/v1/releases/:id","file": "server/http/api.js",-- "line": 75,++ "line": 79,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34545,7 +35814,7 @@"method": "POST","path": "/api/v1/releases/:id/${action}","file": "server/http/api.js",-- "line": 123,++ "line": 127,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34575,7 +35844,7 @@"method": "GET","path": "/docs","file": "server/http/docs.js",-- "line": 42,++ "line": 43,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34585,7 +35854,7 @@"method": "GET","path": "/docs/adr/:id","file": "server/http/docs.js",-- "line": 542,++ "line": 513,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34595,7 +35864,7 @@"method": "GET","path": "/docs/api","file": "server/http/docs.js",-- "line": 182,++ "line": 183,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34605,7 +35874,7 @@"method": "GET","path": "/docs/api/:service","file": "server/http/docs.js",-- "line": 203,++ "line": 204,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34615,7 +35884,7 @@"method": "GET","path": "/docs/api/:service.json","file": "server/http/docs.js",-- "line": 197,++ "line": 198,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34625,7 +35894,7 @@"method": "GET","path": "/docs/billing","file": "server/http/docs.js",-- "line": 371,++ "line": 372,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34635,7 +35904,7 @@"method": "GET","path": "/docs/capabilities","file": "server/http/docs.js",-- "line": 125,++ "line": 126,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34645,7 +35914,7 @@"method": "GET","path": "/docs/capabilities/:id","file": "server/http/docs.js",-- "line": 144,++ "line": 145,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34655,7 +35924,7 @@"method": "GET","path": "/docs/contracts","file": "server/http/docs.js",-- "line": 72,++ "line": 73,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34665,7 +35934,7 @@"method": "GET","path": "/docs/contracts/:id","file": "server/http/docs.js",-- "line": 91,++ "line": 92,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34675,7 +35944,7 @@"method": "GET","path": "/docs/contracts/:id.json","file": "server/http/docs.js",-- "line": 85,++ "line": 86,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34685,7 +35954,7 @@"method": "GET","path": "/docs/events","file": "server/http/docs.js",-- "line": 296,++ "line": 297,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34695,7 +35964,7 @@"method": "GET","path": "/docs/export","file": "server/http/docs.js",-- "line": 484,++ "line": 455,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34705,7 +35974,7 @@"method": "GET","path": "/docs/limits","file": "server/http/docs.js",-- "line": 452,++ "line": 422,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34715,7 +35984,7 @@"method": "GET","path": "/docs/sdk","file": "server/http/docs.js",-- "line": 517,++ "line": 488,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34725,7 +35994,7 @@"method": "GET","path": "/docs/sdk/:module","file": "server/http/docs.js",-- "line": 529,++ "line": 500,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34735,7 +36004,7 @@"method": "GET","path": "/docs/services","file": "server/http/docs.js",-- "line": 307,++ "line": 308,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34745,7 +36014,7 @@"method": "GET","path": "/docs/tools","file": "server/http/docs.js",-- "line": 338,++ "line": 339,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34755,7 +36024,7 @@"method": "GET","path": "/docs/updates","file": "server/http/docs.js",-- "line": 249,++ "line": 250,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34805,7 +36074,7 @@"method": "GET","path": "/manifests/validate","file": "server/http/tools.js",-- "line": 172,++ "line": 175,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34815,7 +36084,7 @@"method": "POST","path": "/manifests/validate","file": "server/http/tools.js",-- "line": 173,++ "line": 176,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34835,7 +36104,7 @@"method": "GET","path": "/oauth","file": "server/http/tools.js",-- "line": 29,++ "line": 32,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34845,7 +36114,7 @@"method": "GET","path": "/oauth/test-callback","file": "server/http/tools.js",-- "line": 65,++ "line": 68,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34915,7 +36184,7 @@"method": "GET","path": "/projects","file": "server/http/portal.js",-- "line": 110,++ "line": 117,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34925,7 +36194,7 @@"method": "POST","path": "/projects","file": "server/http/portal.js",-- "line": 111,++ "line": 118,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34935,7 +36204,7 @@"method": "POST","path": "/projects/:id/${action}","file": "server/http/portal.js",-- "line": 671,++ "line": 697,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34945,7 +36214,7 @@"method": "GET","path": "/projects/:project","file": "server/http/portal.js",-- "line": 124,++ "line": 131,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34955,7 +36224,7 @@"method": "POST","path": "/projects/:project/apps","file": "server/http/portal.js",-- "line": 346,++ "line": 370,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34965,7 +36234,7 @@"method": "GET","path": "/projects/:project/apps/:app","file": "server/http/portal.js",-- "line": 389,++ "line": 413,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34975,7 +36244,7 @@"method": "POST","path": "/projects/:project/apps/:app/credentials/:credential/revoke","file": "server/http/portal.js",-- "line": 498,++ "line": 522,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34985,7 +36254,7 @@"method": "POST","path": "/projects/:project/apps/:app/credentials/rotate","file": "server/http/portal.js",-- "line": 487,++ "line": 511,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -34995,7 +36264,7 @@"method": "POST","path": "/projects/:project/apps/:app/grants","file": "server/http/portal.js",-- "line": 504,++ "line": 528,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35005,7 +36274,7 @@"method": "POST","path": "/projects/:project/apps/:app/grants/:capability/${action}","file": "server/http/portal.js",-- "line": 520,++ "line": 544,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35015,7 +36284,7 @@"method": "GET","path": "/projects/:project/apps/:app/playground","file": "server/http/portal.js",-- "line": 575,++ "line": 599,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35025,7 +36294,7 @@"method": "POST","path": "/projects/:project/apps/:app/playground/events","file": "server/http/portal.js",-- "line": 577,++ "line": 601,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35035,7 +36304,7 @@"method": "POST","path": "/projects/:project/apps/:app/playground/media","file": "server/http/portal.js",-- "line": 590,++ "line": 614,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35045,7 +36314,7 @@"method": "POST","path": "/projects/:project/apps/:app/redirects","file": "server/http/portal.js",-- "line": 478,++ "line": 502,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35055,7 +36324,7 @@"method": "POST","path": "/projects/:project/apps/:app/releases","file": "server/http/portal.js",-- "line": 631,++ "line": 655,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35065,7 +36334,7 @@"method": "GET","path": "/projects/:project/apps/:app/releases/new","file": "server/http/portal.js",-- "line": 630,++ "line": 654,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35075,7 +36344,7 @@"method": "POST","path": "/projects/:project/apps/:app/revoke","file": "server/http/portal.js",-- "line": 482,++ "line": 506,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35085,7 +36354,7 @@"method": "POST","path": "/projects/:project/archive","file": "server/http/portal.js",-- "line": 230,++ "line": 237,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35095,7 +36364,7 @@"method": "GET","path": "/projects/:project/audit","file": "server/http/portal.js",-- "line": 303,++ "line": 310,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35105,7 +36374,7 @@"method": "POST","path": "/projects/:project/delete","file": "server/http/portal.js",-- "line": 286,++ "line": 293,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35115,7 +36384,7 @@"method": "GET","path": "/projects/:project/export","file": "server/http/portal.js",-- "line": 236,++ "line": 243,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35125,7 +36394,7 @@"method": "POST","path": "/projects/:project/export/archive","file": "server/http/portal.js",-- "line": 252,++ "line": 259,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35135,7 +36404,7 @@"method": "POST","path": "/projects/:project/members","file": "server/http/portal.js",-- "line": 213,++ "line": 220,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35145,7 +36414,7 @@"method": "POST","path": "/projects/:project/members/:subject/remove","file": "server/http/portal.js",-- "line": 223,++ "line": 230,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35155,7 +36424,17 @@"method": "POST","path": "/projects/:project/members/:subject/role","file": "server/http/portal.js",-- "line": 218,++ "line": 225,++ "target": "OpenVibe.Codes",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/projects/:project/usage",++ "file": "server/http/portal.js",++ "line": 327,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35165,7 +36444,7 @@"method": "GET","path": "/releases","file": "server/http/portal.js",-- "line": 110,++ "line": 117,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35175,7 +36454,7 @@"method": "POST","path": "/releases","file": "server/http/portal.js",-- "line": 111,++ "line": 118,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35195,7 +36474,7 @@"method": "POST","path": "/releases/:id/${action}","file": "server/http/portal.js",-- "line": 671,++ "line": 697,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35205,7 +36484,7 @@"method": "GET","path": "/releases/:project","file": "server/http/portal.js",-- "line": 124,++ "line": 131,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35215,7 +36494,7 @@"method": "POST","path": "/releases/:project/apps","file": "server/http/portal.js",-- "line": 346,++ "line": 370,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35225,7 +36504,7 @@"method": "GET","path": "/releases/:project/apps/:app","file": "server/http/portal.js",-- "line": 389,++ "line": 413,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35235,7 +36514,7 @@"method": "POST","path": "/releases/:project/apps/:app/credentials/:credential/revoke","file": "server/http/portal.js",-- "line": 498,++ "line": 522,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35245,7 +36524,7 @@"method": "POST","path": "/releases/:project/apps/:app/credentials/rotate","file": "server/http/portal.js",-- "line": 487,++ "line": 511,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35255,7 +36534,7 @@"method": "POST","path": "/releases/:project/apps/:app/grants","file": "server/http/portal.js",-- "line": 504,++ "line": 528,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35265,7 +36544,7 @@"method": "POST","path": "/releases/:project/apps/:app/grants/:capability/${action}","file": "server/http/portal.js",-- "line": 520,++ "line": 544,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35275,7 +36554,7 @@"method": "GET","path": "/releases/:project/apps/:app/playground","file": "server/http/portal.js",-- "line": 575,++ "line": 599,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35285,7 +36564,7 @@"method": "POST","path": "/releases/:project/apps/:app/playground/events","file": "server/http/portal.js",-- "line": 577,++ "line": 601,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35295,7 +36574,7 @@"method": "POST","path": "/releases/:project/apps/:app/playground/media","file": "server/http/portal.js",-- "line": 590,++ "line": 614,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35305,7 +36584,7 @@"method": "POST","path": "/releases/:project/apps/:app/redirects","file": "server/http/portal.js",-- "line": 478,++ "line": 502,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35315,7 +36594,7 @@"method": "POST","path": "/releases/:project/apps/:app/releases","file": "server/http/portal.js",-- "line": 631,++ "line": 655,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35325,7 +36604,7 @@"method": "GET","path": "/releases/:project/apps/:app/releases/new","file": "server/http/portal.js",-- "line": 630,++ "line": 654,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35335,7 +36614,7 @@"method": "POST","path": "/releases/:project/apps/:app/revoke","file": "server/http/portal.js",-- "line": 482,++ "line": 506,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35345,7 +36624,7 @@"method": "POST","path": "/releases/:project/archive","file": "server/http/portal.js",-- "line": 230,++ "line": 237,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35355,7 +36634,7 @@"method": "GET","path": "/releases/:project/audit","file": "server/http/portal.js",-- "line": 303,++ "line": 310,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35365,7 +36644,7 @@"method": "POST","path": "/releases/:project/delete","file": "server/http/portal.js",-- "line": 286,++ "line": 293,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35375,7 +36654,7 @@"method": "GET","path": "/releases/:project/export","file": "server/http/portal.js",-- "line": 236,++ "line": 243,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35385,7 +36664,7 @@"method": "POST","path": "/releases/:project/export/archive","file": "server/http/portal.js",-- "line": 252,++ "line": 259,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35395,7 +36674,7 @@"method": "POST","path": "/releases/:project/members","file": "server/http/portal.js",-- "line": 213,++ "line": 220,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35405,7 +36684,7 @@"method": "POST","path": "/releases/:project/members/:subject/remove","file": "server/http/portal.js",-- "line": 223,++ "line": 230,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35415,7 +36694,17 @@"method": "POST","path": "/releases/:project/members/:subject/role","file": "server/http/portal.js",-- "line": 218,++ "line": 225,++ "target": "OpenVibe.Codes",++ "disposition": "keep",++ "wave": "-",++ "note": "The service is the authority for its own API and pages."++ },++ {++ "method": "GET",++ "path": "/releases/:project/usage",++ "file": "server/http/portal.js",++ "line": 327,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35425,7 +36714,7 @@"method": "GET","path": "/robots.txt","file": "server/http/pages.js",-- "line": 267,++ "line": 268,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35435,7 +36724,7 @@"method": "GET","path": "/sitemap.xml","file": "server/http/pages.js",-- "line": 273,++ "line": 274,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35455,7 +36744,7 @@"method": "POST","path": "/staff/trust","file": "server/http/pages.js",-- "line": 256,++ "line": 257,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35465,7 +36754,7 @@"method": "GET","path": "/tools/webhooks","file": "server/http/tools.js",-- "line": 143,++ "line": 146,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35475,7 +36764,7 @@"method": "POST","path": "/tools/webhooks/sample","file": "server/http/tools.js",-- "line": 149,++ "line": 152,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35485,7 +36774,7 @@"method": "POST","path": "/tools/webhooks/verify","file": "server/http/tools.js",-- "line": 144,++ "line": 147,"target": "OpenVibe.Codes","disposition": "keep","wave": "-",@@@ -35528,6 +36817,12 @@"TRUST_PROXY": ["server/config.js"],++ "CODES_LIMITS_MINUTE": [++ "server/config.js"++ ],++ "CODES_LIMITS_HOUR": [++ "server/config.js"++ ],"CODES_DB_PATH": ["server/config.js"],@@@ -35575,14 +36870,14 @@],"OV_MEDIA_INTERNAL_URL": ["server/config.js",-- "server/http/docs.js"++ "server/domain/limits.js"],"CODES_EXPORT_EVENTS_URL": ["server/config.js"],"OV_EVENTS_INTERNAL_URL": ["server/config.js",-- "server/http/docs.js"++ "server/domain/limits.js"],"CODES_EXPORT_MAX_OBJECTS": ["server/config.js"@@@ -35602,15 +36897,15 @@"EVENTS_RELAY_INTERVAL_MS": ["server/config.js"],++ "OV_HOST_INTERNAL_URL": [++ "server/domain/limits.js"++ ],"OV_TOOLS_INTERNAL_URL": ["server/http/docs.js"],"OV_BILLING_INTERNAL_URL": ["server/http/docs.js"],-- "OV_HOST_INTERNAL_URL": [-- "server/http/docs.js"-- ],"OV_CLIENT_SECRET": ["server/http/portal.js"],@@@ -35628,6 +36923,51 @@]},"outbound": [++ {++ "file": "server/domain/limits.js",++ "targets": [++ {++ "service": "host",++ "refs": [++ {++ "via": ":4910",++ "line": 14++ }++ ]++ },++ {++ "service": "events",++ "refs": [++ {++ "via": "OV_EVENTS_INTERNAL_URL",++ "line": 15++ },++ {++ "via": ":4300",++ "line": 15++ }++ ]++ },++ {++ "service": "media",++ "refs": [++ {++ "via": "OV_MEDIA_INTERNAL_URL",++ "line": 16++ },++ {++ "via": ":4100",++ "line": 16++ }++ ]++ }++ ],++ "auth": [++ "none-detected"++ ],++ "timeout": true,++ "retry": false++ },{"file": "server/domain/project-archive.js","targets": [@@@ -35673,7 +37013,7 @@"refs": [{"via": "networkUrl",-- "line": 250++ "line": 251}]},@@@ -35682,11 +37022,11 @@"refs": [{"via": "OV_TOOLS_INTERNAL_URL",-- "line": 336++ "line": 337},{"via": ":4001",-- "line": 336++ "line": 337}]},@@@ -35695,46 +37035,11 @@"refs": [{"via": "OV_BILLING_INTERNAL_URL",-- "line": 369++ "line": 370},{"via": ":4600",-- "line": 369-- }-- ]-- },-- {-- "service": "host",-- "refs": [-- {-- "via": ":4910",-- "line": 420-- }-- ]-- },-- {-- "service": "events",-- "refs": [-- {-- "via": "OV_EVENTS_INTERNAL_URL",-- "line": 421-- },-- {-- "via": ":4300",-- "line": 421-- }-- ]-- },-- {-- "service": "media",-- "refs": [-- {-- "via": "OV_MEDIA_INTERNAL_URL",-- "line": 422-- },-- {-- "via": ":4100",-- "line": 422++ "line": 370}]}@@@ -35749,7 +37054,7 @@"jobs": [],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 27,++ "testFiles": 34,"ci": true},{@@@ -35757,13 +37062,13 @@"service": "host","present": true,"git": {-- "head": "75147890e32dd63fd1363f843c87415f90d5b2dd",++ "head": "6d2aaaa630e29d2bfd261a7f75cbbbaa2b8c1d46","branch": "main",-- "originMain": "75147890e32dd63fd1363f843c87415f90d5b2dd",-- "committedAt": "2026-09-26T06:15:11-07:00"++ "originMain": "6d2aaaa630e29d2bfd261a7f75cbbbaa2b8c1d46",++ "committedAt": "2026-09-27T20:22:17-07:00"},-- "sourceFiles": 60,-- "loc": 9185,++ "sourceFiles": 68,++ "loc": 11899,"tables": [{"table": "host_projects",@@@ -35837,7 +37142,7 @@"method": "GET","path": "/","file": "server/http/dashboard.js",-- "line": 68,++ "line": 69,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35847,7 +37152,7 @@"method": "GET","path": "/api/health","file": "server/app.js",-- "line": 131,++ "line": 133,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35857,7 +37162,7 @@"method": "GET","path": "/api/ready","file": "server/app.js",-- "line": 137,++ "line": 139,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35867,7 +37172,7 @@"method": "DELETE","path": "/api/v1/deploys/:id","file": "server/http/api.js",-- "line": 191,++ "line": 192,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35877,7 +37182,7 @@"method": "GET","path": "/api/v1/deploys/:id","file": "server/http/api.js",-- "line": 173,++ "line": 174,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35887,7 +37192,7 @@"method": "POST","path": "/api/v1/deploys/:id/activate","file": "server/http/api.js",-- "line": 181,++ "line": 182,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35897,7 +37202,7 @@"method": "GET","path": "/api/v1/deploys/:id/log","file": "server/http/api.js",-- "line": 177,++ "line": 178,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35907,7 +37212,7 @@"method": "DELETE","path": "/api/v1/domains/:id","file": "server/http/api.js",-- "line": 207,++ "line": 208,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35917,7 +37222,7 @@"method": "POST","path": "/api/v1/domains/:id/verify","file": "server/http/api.js",-- "line": 202,++ "line": 203,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35927,7 +37232,7 @@"method": "GET","path": "/api/v1/projects","file": "server/http/api.js",-- "line": 61,++ "line": 62,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35937,7 +37242,7 @@"method": "POST","path": "/api/v1/projects","file": "server/http/api.js",-- "line": 65,++ "line": 66,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35947,7 +37252,7 @@"method": "DELETE","path": "/api/v1/projects/:id","file": "server/http/api.js",-- "line": 74,++ "line": 75,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35957,7 +37262,7 @@"method": "GET","path": "/api/v1/projects/:id","file": "server/http/api.js",-- "line": 70,++ "line": 71,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35967,7 +37272,7 @@"method": "DELETE","path": "/api/v1/projects/:id/members/:principal","file": "server/http/api.js",-- "line": 92,++ "line": 93,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35977,7 +37282,7 @@"method": "PUT","path": "/api/v1/projects/:id/members/:principal","file": "server/http/api.js",-- "line": 87,++ "line": 88,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35987,7 +37292,7 @@"method": "GET","path": "/api/v1/projects/:id/quota","file": "server/http/api.js",-- "line": 78,++ "line": 79,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -35997,7 +37302,7 @@"method": "PUT","path": "/api/v1/projects/:id/quota","file": "server/http/api.js",-- "line": 82,++ "line": 83,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36007,7 +37312,7 @@"method": "GET","path": "/api/v1/projects/:id/sites","file": "server/http/api.js",-- "line": 118,++ "line": 119,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36017,7 +37322,7 @@"method": "POST","path": "/api/v1/projects/:id/sites","file": "server/http/api.js",-- "line": 122,++ "line": 123,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36027,7 +37332,7 @@"method": "DELETE","path": "/api/v1/projects/:id/takedown","file": "server/http/api.js",-- "line": 104,++ "line": 105,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36037,7 +37342,7 @@"method": "POST","path": "/api/v1/projects/:id/takedown","file": "server/http/api.js",-- "line": 100,++ "line": 101,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36047,7 +37352,7 @@"method": "DELETE","path": "/api/v1/sites/:id","file": "server/http/api.js",-- "line": 131,++ "line": 132,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36057,7 +37362,7 @@"method": "GET","path": "/api/v1/sites/:id","file": "server/http/api.js",-- "line": 127,++ "line": 128,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36067,7 +37372,7 @@"method": "GET","path": "/api/v1/sites/:id/deploys","file": "server/http/api.js",-- "line": 134,++ "line": 135,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36077,7 +37382,7 @@"method": "POST","path": "/api/v1/sites/:id/deploys","file": "server/http/api.js",-- "line": 144,++ "line": 145,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36087,7 +37392,7 @@"method": "GET","path": "/api/v1/sites/:id/domains","file": "server/http/api.js",-- "line": 194,++ "line": 195,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36097,7 +37402,7 @@"method": "POST","path": "/api/v1/sites/:id/domains","file": "server/http/api.js",-- "line": 198,++ "line": 199,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36107,7 +37412,7 @@"method": "POST","path": "/api/v1/sites/:id/rollback","file": "server/http/api.js",-- "line": 186,++ "line": 187,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36117,7 +37422,7 @@"method": "DELETE","path": "/api/v1/sites/:id/takedown","file": "server/http/api.js",-- "line": 112,++ "line": 113,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36127,7 +37432,7 @@"method": "POST","path": "/api/v1/sites/:id/takedown","file": "server/http/api.js",-- "line": 108,++ "line": 109,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36197,7 +37502,7 @@"method": "GET","path": "/deploys/:id","file": "server/http/dashboard.js",-- "line": 95,++ "line": 96,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36207,7 +37512,7 @@"method": "POST","path": "/deploys/:id/activate","file": "server/http/dashboard.js",-- "line": 147,++ "line": 148,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36217,7 +37522,7 @@"method": "POST","path": "/deploys/:id/delete","file": "server/http/dashboard.js",-- "line": 152,++ "line": 153,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36227,7 +37532,7 @@"method": "POST","path": "/domains/:id/delete","file": "server/http/dashboard.js",-- "line": 161,++ "line": 162,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36237,7 +37542,7 @@"method": "POST","path": "/domains/:id/verify","file": "server/http/dashboard.js",-- "line": 157,++ "line": 158,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36257,7 +37562,7 @@"method": "GET","path": "/metrics","file": "server/app.js",-- "line": 138,++ "line": 140,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36267,7 +37572,7 @@"method": "POST","path": "/projects","file": "server/http/dashboard.js",-- "line": 104,++ "line": 105,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36277,7 +37582,7 @@"method": "GET","path": "/projects/:id","file": "server/http/dashboard.js",-- "line": 75,++ "line": 76,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36287,7 +37592,7 @@"method": "POST","path": "/projects/:id/delete","file": "server/http/dashboard.js",-- "line": 126,++ "line": 127,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36297,7 +37602,7 @@"method": "POST","path": "/projects/:id/members","file": "server/http/dashboard.js",-- "line": 114,++ "line": 115,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36307,7 +37612,7 @@"method": "POST","path": "/projects/:id/members/remove","file": "server/http/dashboard.js",-- "line": 120,++ "line": 121,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36317,7 +37622,7 @@"method": "POST","path": "/projects/:id/sites","file": "server/http/dashboard.js",-- "line": 108,++ "line": 109,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36327,7 +37632,7 @@"method": "GET","path": "/robots.txt","file": "server/app.js",-- "line": 142,++ "line": 144,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36337,7 +37642,7 @@"method": "GET","path": "/sitemap.xml","file": "server/app.js",-- "line": 144,++ "line": 146,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36347,7 +37652,7 @@"method": "GET","path": "/sites/:id","file": "server/http/dashboard.js",-- "line": 85,++ "line": 86,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36357,7 +37662,7 @@"method": "POST","path": "/sites/:id/delete","file": "server/http/dashboard.js",-- "line": 141,++ "line": 142,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36367,7 +37672,7 @@"method": "POST","path": "/sites/:id/deploys","file": "server/http/dashboard.js",-- "line": 168,++ "line": 169,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36377,7 +37682,7 @@"method": "POST","path": "/sites/:id/domains","file": "server/http/dashboard.js",-- "line": 133,++ "line": 134,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36387,7 +37692,7 @@"method": "POST","path": "/sites/:id/rollback","file": "server/http/dashboard.js",-- "line": 137,++ "line": 138,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36397,7 +37702,7 @@"method": "GET","path": "/updates","file": "server/http/dashboard.js",-- "line": 67,++ "line": 68,"target": "OpenVibe.Host","disposition": "keep","wave": "-",@@@ -36517,16 +37822,39 @@"API_CORS_ORIGINS": ["server/config.js"],++ "HOST_ACTOR_LIMITS": [++ "server/http/actor-limits.js"++ ],++ "HOST_LIMITS_MINUTE": [++ "server/http/actor-limits.js"++ ],++ "HOST_LIMITS_HOUR": [++ "server/http/actor-limits.js"++ ],++ "OVHOST_PROMETHEUS_URL": [++ "lib/alerts.js"++ ],"OVHOST_EVENTS_ENV": ["lib/announce.js"],"SUDO_USER": [++ "lib/cli.js","lib/commands/drill.js","lib/release-ops.js"],"USER": [++ "lib/cli.js","lib/executor.js"],++ "CLOUDFLARE_API_TOKEN_FILE": [++ "lib/dns.js"++ ],++ "HOME": [++ "lib/dns.js"++ ],++ "CLOUDFLARE_API_TOKEN": [++ "lib/dns.js"++ ],"PATH": ["lib/executor.js"],@@@ -36657,7 +37985,7 @@],"contractTodos": 0,"unresolvedMounts": [],-- "testFiles": 38,++ "testFiles": 48,"ci": true},{@@@ -36665,10 +37993,10 @@"service": "examples","present": true,"git": {-- "head": "36901ffc052752754608df8764a9f2942069da9a",++ "head": "92eb7c3b0f50fea9f76086ed3eeda3664de93494","branch": "main",-- "originMain": "36901ffc052752754608df8764a9f2942069da9a",-- "committedAt": "2026-09-26T04:53:16-07:00"++ "originMain": "92eb7c3b0f50fea9f76086ed3eeda3664de93494",++ "committedAt": "2026-09-27T20:10:31-07:00"},"sourceFiles": 11,"loc": 1604,@@@ -36834,187 +38162,193 @@"repo": "OpenRe.Stream","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.AI","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Billing","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Blog","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Chat","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Codes","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Community","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Coupons","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Deals","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Events","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"++ },++ {++ "repo": "OpenVibe.Games",++ "manifest": "apps/server/package.json",++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Host","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Live","manifest": "package.json",-- "spec": "v1.22.0",++ "spec": "v1.23.1","state": "current"},{"repo": "OpenVibe.Media","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Network","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.News","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Reviews","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Search","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Sites","manifest": "package.json",-- "spec": "v1.22.0",-- "state": "current"++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Sources","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Tips","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Tools","manifest": "apps/audio/package.json",-- "spec": "v1.22.0",-- "state": "current"++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Tools","manifest": "apps/docs/package.json",-- "spec": "v1.22.0",-- "state": "current"++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Tools","manifest": "apps/food/package.json",-- "spec": "v1.22.0",-- "state": "current"++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Tools","manifest": "apps/gateway/package.json",-- "spec": "v1.22.0",-- "state": "current"++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Tools","manifest": "apps/img/package.json",-- "spec": "v1.22.0",-- "state": "current"++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Tools","manifest": "apps/maps/package.json",-- "spec": "v1.22.0",-- "state": "current"++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Tools","manifest": "apps/text/package.json",-- "spec": "v1.22.0",-- "state": "current"++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Tools","manifest": "apps/yt/package.json",-- "spec": "v1.22.0",-- "state": "current"++ "spec": "v1.23.0",++ "state": "behind"},{"repo": "OpenVibe.Trade","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.VIP","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"},{"repo": "OpenVibe.Wiki","manifest": "package.json","spec": "v1.22.0",-- "state": "current"++ "state": "behind"}],"ownership": [@@@ -37478,6 +38812,22 @@"wave": "W13","note": "Provider/model/route registry, templates, workflows, runs, cache, quotas, audit, imports."},++ {++ "repo": "OpenVibe.AI",++ "table": "subject_credentials",++ "declaredAt": [++ "server/credentials.js:27"++ ],++ "prodDbs": [++ "ai.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.AI",++ "disposition": "keep",++ "wave": "W13",++ "note": "Provider/model/route registry, templates, workflows, runs, cache, quotas, audit, imports."++ },{"repo": "OpenVibe.AI","table": "templates",@@@ -38202,6 +39552,22 @@"wave": "W16","note": "Blogs, posts, terms (plus openvibe-publishing stores)."},++ {++ "repo": "OpenVibe.Chat",++ "table": "account_data_events",++ "declaredAt": [++ "server/chat/account-data.js:39"++ ],++ "prodDbs": [++ "chat.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Chat",++ "disposition": "keep",++ "wave": "W6",++ "note": "Chat authority tables (table_authority=chat), bridge/mirror outboxes and import bookkeeping."++ },{"repo": "OpenVibe.Chat","table": "audio_requests",@@@ -38982,6 +40348,22 @@"wave": "W20","note": "Developer manifests, releases, trust, playground runs."},++ {++ "repo": "OpenVibe.Community",++ "table": "account_data_events",++ "declaredAt": [++ "server/identity/account-data.js:32"++ ],++ "prodDbs": [++ "community.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "W5",++ "note": ""++ },{"repo": "OpenVibe.Community","table": "attachments",@@@ -39090,11 +40472,27 @@"wave": "W3","note": "Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers."},++ {++ "repo": "OpenVibe.Community",++ "table": "game_progress",++ "declaredAt": [++ "server/db.js:424"++ ],++ "prodDbs": [++ "community.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Community",++ "disposition": "keep",++ "wave": "W5",++ "note": ""++ },{"repo": "OpenVibe.Community","table": "import_hold","declaredAt": [-- "server/db.js:425"++ "server/db.js:431"],"prodDbs": ["community.db"@@@ -39364,7 +40762,7 @@"repo": "OpenVibe.Community","table": "relay_deliveries_v2","declaredAt": [-- "server/db.js:554"++ "server/db.js:560"],"prodDbs": [],"inCode": true,@@@ -40068,7 +41466,23 @@"repo": "OpenVibe.Events","table": "app_revocations","declaredAt": [-- "server/store.js:90"++ "server/store.js:91"++ ],++ "prodDbs": [++ "events.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Events",++ "disposition": "keep",++ "wave": "W3",++ "note": "Event store, subscriptions, deliveries, checkpoints, idempotency receipts."++ },++ {++ "repo": "OpenVibe.Events",++ "table": "app_usage",++ "declaredAt": [++ "server/usage.js:40"],"prodDbs": ["events.db"@@@ -40084,7 +41498,7 @@"repo": "OpenVibe.Events","table": "consumer_checkpoints","declaredAt": [-- "server/store.js:79"++ "server/store.js:80"],"prodDbs": ["events.db"@@@ -40100,7 +41514,7 @@"repo": "OpenVibe.Events","table": "deliveries","declaredAt": [-- "server/store.js:61"++ "server/store.js:62"],"prodDbs": ["events.db"@@@ -40116,7 +41530,7 @@"repo": "OpenVibe.Events","table": "events","declaredAt": [-- "server/store.js:24"++ "server/store.js:25"],"prodDbs": ["events.db"@@@ -40132,7 +41546,7 @@"repo": "OpenVibe.Events","table": "idempotency_receipts","declaredAt": [-- "server/store.js:99"++ "server/store.js:100"],"prodDbs": ["events.db"@@@ -40148,7 +41562,7 @@"repo": "OpenVibe.Events","table": "sequences","declaredAt": [-- "server/store.js:20"++ "server/store.js:21"],"prodDbs": ["events.db"@@@ -40164,7 +41578,7 @@"repo": "OpenVibe.Events","table": "subscriptions","declaredAt": [-- "server/store.js:48"++ "server/store.js:49"],"prodDbs": ["events.db"@@@ -40190,6 +41604,22 @@"wave": "W20","note": "Example application storage; not deployed."},++ {++ "repo": "OpenVibe.Games",++ "table": "account_data_events",++ "declaredAt": [++ "apps/server/src/platform/accountData.ts:47"++ ],++ "prodDbs": [++ "world.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Games",++ "disposition": "keep",++ "wave": "W12",++ "note": "Authoritative game state."++ },{"repo": "OpenVibe.Games","table": "constraints",@@@ -40603,11 +42033,25 @@"wave": "W21","note": "Host Stage B projects, sites, deploys, domains."},++ {++ "repo": "OpenVibe.Live",++ "table": "account_data_events",++ "declaredAt": [++ "server/auth/account-data.js:51"++ ],++ "prodDbs": [],++ "inCode": true,++ "inProd": false,++ "target": "OpenVibe.Live",++ "disposition": "keep",++ "wave": "-",++ "note": "server/auth/account-data.js: which network.account.export_requested / deleted events Live has answered (ADR-033), so a redelivery is applied once."++ },{"repo": "OpenVibe.Live","table": "ai_chatbot_configs","declaredAt": [-- "server/db/database.js:1807"++ "server/db/database.js:1802"],"prodDbs": [],"inCode": true,@@@ -40621,7 +42065,7 @@"repo": "OpenVibe.Live","table": "ai_timeline_cache","declaredAt": [-- "server/db/database.js:1326"++ "server/db/database.js:1321"],"prodDbs": [],"inCode": true,@@@ -40635,7 +42079,7 @@"repo": "OpenVibe.Live","table": "ai_usage","declaredAt": [-- "server/db/database.js:1284"++ "server/db/database.js:1279"],"prodDbs": [],"inCode": true,@@@ -40649,7 +42093,7 @@"repo": "OpenVibe.Live","table": "ai_viewer_log","declaredAt": [-- "server/db/database.js:1891"++ "server/db/database.js:1888"],"prodDbs": [],"inCode": true,@@@ -40663,7 +42107,7 @@"repo": "OpenVibe.Live","table": "ai_viewer_threads","declaredAt": [-- "server/db/database.js:1877"++ "server/db/database.js:1874"],"prodDbs": [],"inCode": true,@@@ -40719,7 +42163,7 @@"repo": "OpenVibe.Live","table": "app_state","declaredAt": [-- "server/db/database.js:1196"++ "server/db/database.js:1191"],"prodDbs": [],"inCode": true,@@@ -40733,7 +42177,7 @@"repo": "OpenVibe.Live","table": "approved_ips","declaredAt": [-- "server/db/database.js:2079"++ "server/db/database.js:2076"],"prodDbs": [],"inCode": true,@@@ -40803,7 +42247,7 @@"repo": "OpenVibe.Live","table": "arena_profiles","declaredAt": [-- "server/arena/arena-service.js:83"++ "server/arena/arena-service.js:82"],"prodDbs": [],"inCode": true,@@@ -40915,7 +42359,7 @@"repo": "OpenVibe.Live","table": "channel_ai_bots","declaredAt": [-- "server/db/database.js:1832"++ "server/db/database.js:1827"],"prodDbs": [],"inCode": true,@@@ -40929,7 +42373,7 @@"repo": "OpenVibe.Live","table": "channel_ai_config","declaredAt": [-- "server/db/database.js:1856"++ "server/db/database.js:1851"],"prodDbs": [],"inCode": true,@@@ -40943,7 +42387,7 @@"repo": "OpenVibe.Live","table": "channel_moderation_settings","declaredAt": [-- "server/db/database.js:1640",++ "server/db/database.js:1635","server/db/schema.sql:514"],"prodDbs": [],@@@ -40958,7 +42402,7 @@"repo": "OpenVibe.Live","table": "channel_moderators","declaredAt": [-- "server/db/database.js:1623",++ "server/db/database.js:1618","server/db/schema.sql:499"],"prodDbs": [],@@@ -41001,7 +42445,7 @@"repo": "OpenVibe.Live","table": "channel_sounds","declaredAt": [-- "server/db/database.js:1745",++ "server/db/database.js:1740","server/db/schema.sql:626"],"prodDbs": [],@@@ -41016,7 +42460,7 @@"repo": "OpenVibe.Live","table": "channel_sounds_new","declaredAt": [-- "server/db/database.js:1769"++ "server/db/database.js:1764"],"prodDbs": [],"inCode": true,@@@ -41044,7 +42488,7 @@"repo": "OpenVibe.Live","table": "chat_ai_summaries","declaredAt": [-- "server/db/database.js:1338"++ "server/db/database.js:1333"],"prodDbs": [],"inCode": true,@@@ -41128,7 +42572,7 @@"repo": "OpenVibe.Live","table": "chat_timeline_events","declaredAt": [-- "server/db/database.js:1358"++ "server/db/database.js:1353"],"prodDbs": [],"inCode": true,@@@ -41283,7 +42727,7 @@"repo": "OpenVibe.Live","table": "control_config_buttons","declaredAt": [-- "server/db/database.js:2303"++ "server/db/database.js:2300"],"prodDbs": [],"inCode": true,@@@ -41297,7 +42741,7 @@"repo": "OpenVibe.Live","table": "control_configs","declaredAt": [-- "server/db/database.js:2289"++ "server/db/database.js:2286"],"prodDbs": [],"inCode": true,@@@ -41311,7 +42755,7 @@"repo": "OpenVibe.Live","table": "control_whitelist","declaredAt": [-- "server/db/database.js:2274"++ "server/db/database.js:2271"],"prodDbs": [],"inCode": true,@@@ -41395,7 +42839,7 @@"repo": "OpenVibe.Live","table": "easter_egg_solves","declaredAt": [-- "server/db/database.js:1370"++ "server/db/database.js:1365"],"prodDbs": [],"inCode": true,@@@ -41423,7 +42867,7 @@"repo": "OpenVibe.Live","table": "emotes_new","declaredAt": [-- "server/db/database.js:1713"++ "server/db/database.js:1708"],"prodDbs": [],"inCode": true,@@@ -41433,6 +42877,20 @@"wave": "W6 (remainder)","note": "Still written by Live: Chat holds staged copies (table_authority=live) of moderators, moderation settings, emotes, user tags and the chat AI tables; media requests were not moved."},++ {++ "repo": "OpenVibe.Live",++ "table": "follow_projection_revisions",++ "declaredAt": [++ "server/social/network-follows.js:63"++ ],++ "prodDbs": [],++ "inCode": true,++ "inProd": false,++ "target": "OpenVibe.Live",++ "disposition": "projection",++ "wave": "-",++ "note": "server/social/network-follows.js: the per-pair revision of Live's follows projection of Network's graph (ADR-030); an older network.follow.* event changes nothing."++ },{"repo": "OpenVibe.Live","table": "follows",@@@ -41451,7 +42909,7 @@"repo": "OpenVibe.Live","table": "hidden_relay_users","declaredAt": [-- "server/db/database.js:2116"++ "server/db/database.js:2113"],"prodDbs": [],"inCode": true,@@@ -41465,7 +42923,7 @@"repo": "OpenVibe.Live","table": "ip_log","declaredAt": [-- "server/db/database.js:2055"++ "server/db/database.js:2052"],"prodDbs": [],"inCode": true,@@@ -41489,6 +42947,20 @@"wave": "W7","note": "Stream definitions/keys, outputs, restream and control presets. managed_streams.stream_key rotation is open (hazard H4)."},++ {++ "repo": "OpenVibe.Live",++ "table": "lineage_unresolved",++ "declaredAt": [++ "server/lineage/unresolved.js:26"++ ],++ "prodDbs": [],++ "inCode": true,++ "inProd": false,++ "target": "OpenVibe.Live",++ "disposition": "keep",++ "wave": "-",++ "note": "server/lineage/unresolved.js: media and session references the lineage resolver could not resolve yet, for the operator view (WS-H task 8)."++ },{"repo": "OpenVibe.Live","table": "linked_accounts",@@@ -41507,7 +42979,7 @@"repo": "OpenVibe.Live","table": "managed_streams","declaredAt": [-- "server/db/database.js:2417",++ "server/db/database.js:2414","server/db/schema.sql:78"],"prodDbs": [],@@@ -41552,7 +43024,7 @@"repo": "OpenVibe.Live","table": "moderation_actions","declaredAt": [-- "server/db/database.js:1924"++ "server/db/database.js:1921"],"prodDbs": [],"inCode": true,@@@ -41622,7 +43094,7 @@"repo": "OpenVibe.Live","table": "paste_comments","declaredAt": [-- "server/db/database.js:2012"++ "server/db/database.js:2009"],"prodDbs": [],"inCode": true,@@@ -41636,7 +43108,7 @@"repo": "OpenVibe.Live","table": "paste_likes","declaredAt": [-- "server/db/database.js:1980"++ "server/db/database.js:1977"],"prodDbs": [],"inCode": true,@@@ -41650,7 +43122,7 @@"repo": "OpenVibe.Live","table": "pastes","declaredAt": [-- "server/db/database.js:1943"++ "server/db/database.js:1940"],"prodDbs": [],"inCode": true,@@@ -41664,7 +43136,7 @@"repo": "OpenVibe.Live","table": "payment_orders","declaredAt": [-- "server/db/database.js:1590"++ "server/db/database.js:1585"],"prodDbs": [],"inCode": true,@@@ -41678,7 +43150,7 @@"repo": "OpenVibe.Live","table": "pending_ip_messages","declaredAt": [-- "server/db/database.js:2096"++ "server/db/database.js:2093"],"prodDbs": [],"inCode": true,@@@ -41734,7 +43206,7 @@"repo": "OpenVibe.Live","table": "relay_users","declaredAt": [-- "server/db/database.js:1495"++ "server/db/database.js:1490"],"prodDbs": [],"inCode": true,@@@ -41876,7 +43348,7 @@"repo": "OpenVibe.Live","table": "stream_controls_new","declaredAt": [-- "server/db/database.js:2382"++ "server/db/database.js:2379"],"prodDbs": [],"inCode": true,@@@ -41890,7 +43362,7 @@"repo": "OpenVibe.Live","table": "stream_first_chats","declaredAt": [-- "server/db/database.js:2044"++ "server/db/database.js:2041"],"prodDbs": [],"inCode": true,@@@ -41904,7 +43376,7 @@"repo": "OpenVibe.Live","table": "stream_memories","declaredAt": [-- "server/db/database.js:1210"++ "server/db/database.js:1205"],"prodDbs": [],"inCode": true,@@@ -41932,7 +43404,7 @@"repo": "OpenVibe.Live","table": "stream_timeline_events","declaredAt": [-- "server/db/database.js:1259"++ "server/db/database.js:1254"],"prodDbs": [],"inCode": true,@@@ -41946,7 +43418,7 @@"repo": "OpenVibe.Live","table": "streamer_overviews","declaredAt": [-- "server/db/database.js:1304"++ "server/db/database.js:1299"],"prodDbs": [],"inCode": true,@@@ -41970,6 +43442,20 @@"wave": "-","note": "Live product data and read models."},++ {++ "repo": "OpenVibe.Live",++ "table": "subject_merges",++ "declaredAt": [++ "server/auth/subject-merge.js:25"++ ],++ "prodDbs": [],++ "inCode": true,++ "inProd": false,++ "target": "OpenVibe.Live",++ "disposition": "keep",++ "wave": "-",++ "note": "server/auth/subject-merge.js: the network.subject.merged events Live has applied (ADR-029), once each."++ },{"repo": "OpenVibe.Live","table": "subject_projection",@@@ -42059,7 +43545,7 @@"table": "translations","declaredAt": ["server/db/database.js:513",-- "server/i18n/translate.js:147"++ "server/i18n/translate.js:148"],"prodDbs": [],"inCode": true,@@@ -42073,7 +43559,7 @@"repo": "OpenVibe.Live","table": "tts_voice_overrides","declaredAt": [-- "server/db/database.js:1382"++ "server/db/database.js:1377"],"prodDbs": [],"inCode": true,@@@ -42216,7 +43702,7 @@"repo": "OpenVibe.Live","table": "vibe_coding_events","declaredAt": [-- "server/db/database.js:2674",++ "server/db/database.js:2671","server/db/schema.sql:198"],"prodDbs": [],@@@ -42231,7 +43717,7 @@"repo": "OpenVibe.Live","table": "vibe_coding_sessions","declaredAt": [-- "server/db/database.js:2639",++ "server/db/database.js:2636","server/db/schema.sql:170"],"prodDbs": [],@@@ -42246,7 +43732,7 @@"repo": "OpenVibe.Live","table": "viewer_samples","declaredAt": [-- "server/db/database.js:3861"++ "server/db/database.js:3868"],"prodDbs": [],"inCode": true,@@@ -42326,6 +43812,22 @@"wave": "-","note": "Live product data and read models."},++ {++ "repo": "OpenVibe.Media",++ "table": "account_data_events",++ "declaredAt": [++ "server/account-data.js:32"++ ],++ "prodDbs": [++ "media.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "W4 (object model)",++ "note": "Becomes projections over media_objects/media_locations."++ },{"repo": "OpenVibe.Media","table": "apps",@@@ -42552,7 +44054,71 @@"repo": "OpenVibe.Media","table": "media_object_changes","declaredAt": [-- "server/db/schema.sql:436"++ "server/db/schema.sql:480"++ ],++ "prodDbs": [++ "media.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "W4 (object model)",++ "note": "Becomes projections over media_objects/media_locations."++ },++ {++ "repo": "OpenVibe.Media",++ "table": "media_object_tier_decisions",++ "declaredAt": [++ "server/db/schema.sql:458"++ ],++ "prodDbs": [++ "media.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "W4 (object model)",++ "note": "Becomes projections over media_objects/media_locations."++ },++ {++ "repo": "OpenVibe.Media",++ "table": "media_object_view_salts",++ "declaredAt": [++ "server/db/schema.sql:435"++ ],++ "prodDbs": [++ "media.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "W4 (object model)",++ "note": "Becomes projections over media_objects/media_locations."++ },++ {++ "repo": "OpenVibe.Media",++ "table": "media_object_viewer_days",++ "declaredAt": [++ "server/db/schema.sql:440"++ ],++ "prodDbs": [++ "media.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "W4 (object model)",++ "note": "Becomes projections over media_objects/media_locations."++ },++ {++ "repo": "OpenVibe.Media",++ "table": "media_object_views_daily",++ "declaredAt": [++ "server/db/schema.sql:446"],"prodDbs": ["media.db"@@@ -42696,7 +44262,7 @@"repo": "OpenVibe.Media","table": "media_verifications","declaredAt": [-- "server/db/schema.sql:448"++ "server/db/schema.sql:492"],"prodDbs": ["media.db"@@@ -42712,7 +44278,7 @@"repo": "OpenVibe.Media","table": "media_verify_runs","declaredAt": [-- "server/db/schema.sql:460"++ "server/db/schema.sql:504"],"prodDbs": ["media.db"@@@ -42786,6 +44352,20 @@"wave": "W0","note": "Exists in a production database but no CREATE TABLE in the repo."},++ {++ "repo": "OpenVibe.Media",++ "table": "subject_merges",++ "declaredAt": [++ "server/subject-merge.js:13"++ ],++ "prodDbs": [],++ "inCode": true,++ "inProd": false,++ "target": "OpenVibe.Media",++ "disposition": "keep",++ "wave": "W4 (object model)",++ "note": "Becomes projections over media_objects/media_locations."++ },{"repo": "OpenVibe.Media","table": "token_revocations",@@@ -42816,6 +44396,102 @@"wave": "W4 (object model)","note": "Becomes projections over media_objects/media_locations."},++ {++ "repo": "OpenVibe.Network",++ "table": "account_deletion_confirmations",++ "declaredAt": [++ "server/identity/account-data.js:94"++ ],++ "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": "account_deletions",++ "declaredAt": [++ "server/identity/account-data.js:80"++ ],++ "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": "account_export_parts",++ "declaredAt": [++ "server/identity/account-data.js:71"++ ],++ "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": "account_exports",++ "declaredAt": [++ "server/identity/account-data.js:56"++ ],++ "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": "account_merge_intents",++ "declaredAt": [++ "server/identity/account-merge.js:71"++ ],++ "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": "account_merges",++ "declaredAt": [++ "server/identity/account-merge.js:56"++ ],++ "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": "admin_rate_limits",@@@ -43006,6 +44682,22 @@"wave": "-","note": "openvibe-shared/config.js: each service's own revisioned settings (keys and snapshots for rollback)."},++ {++ "repo": "OpenVibe.Network",++ "table": "creator_streams",++ "declaredAt": [++ "server/analytics/creators.js:27"++ ],++ "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": "dev_apps",@@@ -43134,6 +44826,54 @@"wave": "W1 (module split)","note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."},++ {++ "repo": "OpenVibe.Network",++ "table": "dev_usage_daily",++ "declaredAt": [++ "server/developer/usage.js:69"++ ],++ "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": "dev_usage_errors",++ "declaredAt": [++ "server/developer/usage.js:84"++ ],++ "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": "dev_usage_windows",++ "declaredAt": [++ "server/developer/usage.js:50"++ ],++ "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": "email_delivery_log",@@@ -43166,6 +44906,22 @@"wave": "W1 (module split)","note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."},++ {++ "repo": "OpenVibe.Network",++ "table": "follow_import_holds",++ "declaredAt": [++ "server/identity/follows.js:57"++ ],++ "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": "follows",@@@ -43262,6 +45018,38 @@"wave": "W1 (module split)","note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."},++ {++ "repo": "OpenVibe.Network",++ "table": "mod_principal_grants",++ "declaredAt": [++ "server/identity/mod-principals.js:49"++ ],++ "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": "mod_principals",++ "declaredAt": [++ "server/identity/mod-principals.js:33"++ ],++ "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": "moderation_audit",@@@ -43386,6 +45174,22 @@"wave": "W1 (module split)","note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."},++ {++ "repo": "OpenVibe.Network",++ "table": "operator_alerts",++ "declaredAt": [++ "server/operator/alerts.js:25"++ ],++ "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": "password_reset_tokens",@@@ -43422,7 +45226,7 @@"repo": "OpenVibe.Network","table": "principal_grants","declaredAt": [-- "server/identity/principals.js:217"++ "server/identity/principals.js:246"],"prodDbs": ["network.db"@@@ -43438,7 +45242,7 @@"repo": "OpenVibe.Network","table": "principal_usage","declaredAt": [-- "server/identity/principals.js:227"++ "server/identity/principals.js:256"],"prodDbs": ["network.db"@@@ -43482,6 +45286,38 @@"wave": "-","note": "Service-local config/bookkeeping."},++ {++ "repo": "OpenVibe.Network",++ "table": "status_incident_updates",++ "declaredAt": [++ "server/status/incidents.js:43"++ ],++ "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": "status_incidents",++ "declaredAt": [++ "server/status/incidents.js:30"++ ],++ "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": "stream_live_announcements",@@@ -43498,6 +45334,22 @@"wave": "W3","note": "Go-live fanout rate state; durable delivery moves to Events."},++ {++ "repo": "OpenVibe.Network",++ "table": "subject_aliases",++ "declaredAt": [++ "server/identity/account-merge.js:48"++ ],++ "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": "themes",@@@ -43579,6 +45431,22 @@"wave": "W1 (module split)","note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."},++ {++ "repo": "OpenVibe.Network",++ "table": "user_follows",++ "declaredAt": [++ "server/identity/follows.js:42"++ ],++ "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_history",@@@ -45397,6 +47265,22 @@"wave": "-","note": ""},++ {++ "repo": "OpenVibe.Tools",++ "table": "tool_job_usage",++ "declaredAt": [++ "apps/_shared/jobs/usage.js:36"++ ],++ "prodDbs": [++ "jobs.db"++ ],++ "inCode": true,++ "inProd": true,++ "target": "OpenVibe.Tools",++ "disposition": "keep",++ "wave": "-",++ "note": ""++ },{"repo": "OpenVibe.Tools","table": "tool_jobs",@@@ -46297,6 +48181,16 @@"timeout": true,"retry": true},++ {++ "caller": "OpenVibe.Chat",++ "file": "server/chat/account-data.js",++ "target": "OpenVibe.Network",++ "via": "/internal/events, networkInternalUrl",++ "lines": "4,164",++ "auth": "none-detected",++ "timeout": true,++ "retry": true++ },{"caller": "OpenVibe.Chat","file": "server/net/service-auth.js",@@@ -46322,7 +48216,7 @@"file": "server/chat/routes.js","target": "OpenVibe.Search","via": "searchUrl",-- "lines": "111,117,212",++ "lines": "121,127,222","auth": "none-detected","timeout": false,"retry": false@@@ -46332,11 +48226,21 @@"file": "server/http/docs.js","target": "OpenVibe.Billing","via": "OV_BILLING_INTERNAL_URL, :4600",-- "lines": "369,369",++ "lines": "370,370","auth": "none-detected","timeout": true,"retry": true},++ {++ "caller": "OpenVibe.Codes",++ "file": "server/domain/limits.js",++ "target": "OpenVibe.Events",++ "via": "OV_EVENTS_INTERNAL_URL, :4300",++ "lines": "15,15",++ "auth": "none-detected",++ "timeout": true,++ "retry": false++ },{"caller": "OpenVibe.Codes","file": "server/domain/project-archive.js",@@@ -46349,23 +48253,23 @@},{"caller": "OpenVibe.Codes",-- "file": "server/http/docs.js",-- "target": "OpenVibe.Events",-- "via": "OV_EVENTS_INTERNAL_URL, :4300",-- "lines": "421,421",++ "file": "server/domain/limits.js",++ "target": "OpenVibe.Host",++ "via": ":4910",++ "lines": "14","auth": "none-detected","timeout": true,-- "retry": true++ "retry": false},{"caller": "OpenVibe.Codes",-- "file": "server/http/docs.js",-- "target": "OpenVibe.Host",-- "via": ":4910",-- "lines": "420",++ "file": "server/domain/limits.js",++ "target": "OpenVibe.Media",++ "via": "OV_MEDIA_INTERNAL_URL, :4100",++ "lines": "16,16","auth": "none-detected","timeout": true,-- "retry": true++ "retry": false},{"caller": "OpenVibe.Codes",@@@ -46377,16 +48281,6 @@"timeout": false,"retry": true},-- {-- "caller": "OpenVibe.Codes",-- "file": "server/http/docs.js",-- "target": "OpenVibe.Media",-- "via": "OV_MEDIA_INTERNAL_URL, :4100",-- "lines": "422,422",-- "auth": "none-detected",-- "timeout": true,-- "retry": true-- },{"caller": "OpenVibe.Codes","file": "server/domain/project-archive.js",@@@ -46402,7 +48296,7 @@"file": "server/http/docs.js","target": "OpenVibe.Network","via": "networkUrl",-- "lines": "250",++ "lines": "251","auth": "none-detected","timeout": true,"retry": true@@@ -46412,7 +48306,7 @@"file": "server/http/docs.js","target": "OpenVibe.Tools","via": "OV_TOOLS_INTERNAL_URL, :4001",-- "lines": "336,336",++ "lines": "337,337","auth": "none-detected","timeout": true,"retry": true@@@ -46512,7 +48406,7 @@"file": "apps/server/src/net/httpServer.ts","target": "OpenVibe.Network","via": "/api/auth/me, /oauth/token",-- "lines": "363,395,460,539",++ "lines": "376,408,473,552","auth": "oauth-client","timeout": false,"retry": true@@@ -46562,7 +48456,27 @@"file": "server/ai/ai-service.js","target": "OpenVibe.AI","via": "OV_AI_INTERNAL_URL, :4700",-- "lines": "40,40",++ "lines": "41,41",++ "auth": "none-detected",++ "timeout": true,++ "retry": true++ },++ {++ "caller": "OpenVibe.Live",++ "file": "server/ai/byo-credentials.js",++ "target": "OpenVibe.AI",++ "via": "OV_AI_INTERNAL_URL, :4700",++ "lines": "17,17",++ "auth": "none-detected",++ "timeout": true,++ "retry": true++ },++ {++ "caller": "OpenVibe.Live",++ "file": "server/ai/viewer-quota.js",++ "target": "OpenVibe.AI",++ "via": "OV_AI_INTERNAL_URL, :4700",++ "lines": "17,17","auth": "none-detected","timeout": true,"retry": true@@@ -46647,6 +48561,16 @@"timeout": true,"retry": false},++ {++ "caller": "OpenVibe.Live",++ "file": "server/auth/account-data.js",++ "target": "OpenVibe.Network",++ "via": "OV_NETWORK_INTERNAL_URL, :4000",++ "lines": "171,171",++ "auth": "none-detected",++ "timeout": true,++ "retry": true++ },{"caller": "OpenVibe.Live","file": "server/chat/chat-server.js",@@@ -46827,6 +48751,16 @@"timeout": false,"retry": false},++ {++ "caller": "OpenVibe.Media",++ "file": "server/account-data.js",++ "target": "OpenVibe.Network",++ "via": "/internal/events, OV_NETWORK_INTERNAL_URL, :4000, /oauth/token",++ "lines": "4,116,116,119",++ "auth": "bearer, oauth-client",++ "timeout": true,++ "retry": false++ },{"caller": "OpenVibe.Media","file": "server/auth.js",@@@ -46882,7 +48816,7 @@"file": "server/index.js","target": "OpenVibe.Blog","via": "OV_BLOG_INTERNAL_URL, blogUrl, :4810",-- "lines": "440,440,440",++ "lines": "498,498,498","auth": "internal-key, bearer","timeout": false,"retry": false@@@ -46892,7 +48826,7 @@"file": "server/index.js","target": "OpenVibe.Events","via": "eventsUrl, eventsInternalUrl",-- "lines": "496,496,583,583",++ "lines": "557,557,644,644","auth": "internal-key, bearer","timeout": false,"retry": false@@@ -46922,7 +48856,7 @@"file": "server/index.js","target": "OpenVibe.Games","via": ":8000, games.internalUrl",-- "lines": "245,313",++ "lines": "247,315","auth": "internal-key, bearer","timeout": false,"retry": false@@@ -46962,7 +48896,7 @@"file": "server/index.js","target": "OpenVibe.Live","via": ":3000, live.internalUrl, liveUrl",-- "lines": "241,311,370,370,599",++ "lines": "243,313,375,375,660","auth": "internal-key, bearer","timeout": false,"retry": false@@@ -47002,7 +48936,7 @@"file": "server/index.js","target": "OpenVibe.Media","via": ":4100, media.internalUrl",-- "lines": "244,314",++ "lines": "246,316","auth": "internal-key, bearer","timeout": false,"retry": false@@@ -47052,7 +48986,7 @@"file": "server/index.js","target": "OpenVibe.Tools","via": ":4001, tools.internalUrl",-- "lines": "243,312",++ "lines": "245,314","auth": "internal-key, bearer","timeout": false,"retry": false@@@ -47082,7 +49016,7 @@"file": "release-watch.js","target": "OpenVibe.Events","via": "eventsUrl",-- "lines": "12,189,190,190,197",++ "lines": "9,189,190,190,197","auth": "none-detected","timeout": false,"retry": true@@@ -47132,7 +49066,7 @@"file": "build.js","target": "OpenVibe.Network","via": "networkUrl",-- "lines": "100,111,111,112,112,114,145,216,217,266,267,268,271,271,272,272,283,318,501",++ "lines": "104,115,115,116,116,118,220,221,275,275,276,276,287,322,514","auth": "none-detected","timeout": false,"retry": false@@@ -47152,7 +49086,7 @@"file": "apps/gateway/server/index.js","target": "OpenVibe.Community","via": "communityUrl, OV_COMMUNITY_URL",-- "lines": "86,318,440",++ "lines": "86,326,457","auth": "internal-key, bearer","timeout": true,"retry": true@@@ -47162,7 +49096,7 @@"file": "apps/_shared/jobs/index.js","target": "OpenVibe.Events","via": "EVENTS_URL",-- "lines": "96",++ "lines": "97","auth": "oauth-client, service-token","timeout": true,"retry": false@@@ -47172,7 +49106,7 @@"file": "apps/gateway/server/index.js","target": "OpenVibe.Live","via": "liveUrl",-- "lines": "505",++ "lines": "522","auth": "internal-key, bearer","timeout": true,"retry": true@@@ -47182,7 +49116,7 @@"file": "apps/_shared/jobs/index.js","target": "OpenVibe.Media","via": ":4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL",-- "lines": "18,54,54,54,62,63,143,143,143,157",++ "lines": "19,55,55,55,63,64,144,144,144,158","auth": "oauth-client, service-token","timeout": true,"retry": false@@@ -47202,7 +49136,7 @@"file": "apps/_shared/jobs/index.js","target": "OpenVibe.Network","via": ":4000, OV_NETWORK_INTERNAL_URL, /oauth/token",-- "lines": "20,45,45,47",++ "lines": "21,46,46,48","auth": "oauth-client, service-token","timeout": true,"retry": false@@@ -47232,7 +49166,7 @@"file": "apps/gateway/server/index.js","target": "OpenVibe.Network","via": "/internal/events, networkUrl",-- "lines": "34,63,504",++ "lines": "34,63,521","auth": "internal-key, bearer","timeout": true,"retry": true@@@ -47361,7 +49295,7 @@"files": ["server/config.js"],-- "prod": null++ "prod": "openre.env"},{"repo": "OpenRe.Stream",@@@ -47493,6 +49427,24 @@],"prod": null},++ {++ "repo": "OpenRe.Stream",++ "name": "OPENRE_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/api/actor-limits.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenRe.Stream",++ "name": "OPENRE_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/api/actor-limits.js"++ ],++ "prod": null++ },{"repo": "OpenRe.Stream","name": "OPENRE_LINEAGE",@@@ -47951,6 +49903,15 @@],"prod": null},++ {++ "repo": "OpenVibe.AI",++ "name": "AI_CREDENTIALS_KEY",++ "secret": true,++ "files": [++ "server/config.js"++ ],++ "prod": "ai.env"++ },{"repo": "OpenVibe.AI","name": "AI_DB_PATH",@@@ -48068,6 +50029,33 @@],"prod": "ai.env"},++ {++ "repo": "OpenVibe.AI",++ "name": "AI_LOCAL_LLM_MODEL",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": "ai.env"++ },++ {++ "repo": "OpenVibe.AI",++ "name": "AI_LOCAL_LLM_TIMEOUT_MS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.AI",++ "name": "AI_LOCAL_LLM_URL",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": "ai.env"++ },{"repo": "OpenVibe.AI","name": "AI_MAX_CONCURRENT_RUNS",@@@ -48124,16 +50112,61 @@},{"repo": "OpenVibe.AI",-- "name": "AI_MODEL",++ "name": "AI_MEDIA_ANALYSIS_DIR","secret": false,"files": ["server/config.js"],-- "prod": "ai.env"++ "prod": null++ },++ {++ "repo": "OpenVibe.AI",++ "name": "AI_MEDIA_ANALYSIS_DISK_RESERVE_BYTES",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.AI",++ "name": "AI_MEDIA_ANALYSIS_FETCH_TIMEOUT_MS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.AI",++ "name": "AI_MEDIA_ANALYSIS_MAX_BYTES",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.AI",++ "name": "AI_MEDIA_SCENE_THRESHOLD",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.AI",++ "name": "AI_MEDIA_STORAGE_HOSTS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null},{"repo": "OpenVibe.AI",-- "name": "AI_NS_FALLBACK",++ "name": "AI_MEDIA_STREAM","secret": false,"files": ["server/config.js"@@@ -48142,13 +50175,22 @@},{"repo": "OpenVibe.AI",-- "name": "AI_NS_REQUIRED",++ "name": "AI_MEDIA_STT_WINDOW_SEC","secret": false,"files": ["server/config.js"],"prod": null},++ {++ "repo": "OpenVibe.AI",++ "name": "AI_MODEL",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": "ai.env"++ },{"repo": "OpenVibe.AI","name": "AI_OUTPUT_COST_PER_MTOK",@@@ -48302,6 +50344,24 @@],"prod": "ai.env"},++ {++ "repo": "OpenVibe.AI",++ "name": "FFMPEG_BIN",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.AI",++ "name": "FFPROBE_BIN",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.AI","name": "HOST",@@@ -48603,6 +50663,33 @@],"prod": null},++ {++ "repo": "OpenVibe.Billing",++ "name": "BILLING_LIMITS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Billing",++ "name": "BILLING_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Billing",++ "name": "BILLING_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Billing","name": "BILLING_MAX_BITS",@@@ -49152,6 +51239,24 @@],"prod": "blog.env"},++ {++ "repo": "OpenVibe.Blog",++ "name": "BLOG_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Blog",++ "name": "BLOG_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Blog","name": "BLOG_MEDIA_APP",@@@ -49656,6 +51761,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Chat",++ "name": "CHAT_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Chat",++ "name": "CHAT_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Chat","name": "CHAT_OAUTH_REDIRECT_URI",@@@ -50169,6 +52292,24 @@],"prod": "codes.env"},++ {++ "repo": "OpenVibe.Codes",++ "name": "CODES_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Codes",++ "name": "CODES_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Codes","name": "CODES_PLAYGROUND_EVENTS_URL",@@@ -50319,7 +52460,7 @@"secret": false,"files": ["server/config.js",-- "server/http/docs.js"++ "server/domain/limits.js"],"prod": null},@@@ -50328,7 +52469,7 @@"name": "OV_HOST_INTERNAL_URL","secret": false,"files": [-- "server/http/docs.js"++ "server/domain/limits.js"],"prod": null},@@@ -50338,7 +52479,7 @@"secret": false,"files": ["server/config.js",-- "server/http/docs.js"++ "server/domain/limits.js"],"prod": null},@@@ -50514,6 +52655,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Community",++ "name": "COMMUNITY_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Community",++ "name": "COMMUNITY_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Community","name": "COMMUNITY_PROFILE_MODULE",@@@ -50984,6 +53143,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Coupons",++ "name": "COUPONS_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Coupons",++ "name": "COUPONS_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Coupons","name": "COUPONS_LOOKUP_ANON_PER_MIN",@@@ -51389,6 +53566,24 @@],"prod": "deals.env"},++ {++ "repo": "OpenVibe.Deals",++ "name": "DEALS_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Deals",++ "name": "DEALS_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Deals","name": "DEALS_MODERATORS",@@@ -51812,6 +54007,33 @@],"prod": null},++ {++ "repo": "OpenVibe.Events",++ "name": "EVENTS_LIMITS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Events",++ "name": "EVENTS_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Events",++ "name": "EVENTS_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Events","name": "EVENTS_MAX_ATTEMPTS",@@@ -51893,6 +54115,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Events",++ "name": "EVENTS_USAGE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Events",++ "name": "EVENTS_USAGE_FLUSH_MS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Events","name": "EVENTS_USER_AUDIENCES",@@@ -52499,6 +54739,24 @@],"prod": "games.env"},++ {++ "repo": "OpenVibe.Games",++ "name": "GAMES_LIMITS_HOUR",++ "secret": false,++ "files": [++ "apps/server/src/net/actorLimits.ts"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Games",++ "name": "GAMES_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "apps/server/src/net/actorLimits.ts"++ ],++ "prod": null++ },{"repo": "OpenVibe.Games","name": "GUEST_IP_BINDING",@@@ -52694,6 +54952,24 @@],"prod": "host.env"},++ {++ "repo": "OpenVibe.Host",++ "name": "CLOUDFLARE_API_TOKEN",++ "secret": true,++ "files": [++ "lib/dns.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Host",++ "name": "CLOUDFLARE_API_TOKEN_FILE",++ "secret": false,++ "files": [++ "lib/dns.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Host","name": "COOKIE_SECURE",@@@ -52721,6 +54997,15 @@],"prod": "host.env"},++ {++ "repo": "OpenVibe.Host",++ "name": "HOME",++ "secret": false,++ "files": [++ "lib/dns.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Host","name": "HOST",@@@ -52730,6 +55015,15 @@],"prod": "host.env"},++ {++ "repo": "OpenVibe.Host",++ "name": "HOST_ACTOR_LIMITS",++ "secret": false,++ "files": [++ "server/http/actor-limits.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Host","name": "HOST_CNAME_TARGET",@@@ -52793,6 +55087,24 @@],"prod": "host.env"},++ {++ "repo": "OpenVibe.Host",++ "name": "HOST_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/http/actor-limits.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Host",++ "name": "HOST_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/http/actor-limits.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Host","name": "HOST_MAX_CONCURRENT_UPLOADS",@@@ -53009,6 +55321,15 @@],"prod": null},++ {++ "repo": "OpenVibe.Host",++ "name": "OVHOST_PROMETHEUS_URL",++ "secret": false,++ "files": [++ "lib/alerts.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Host","name": "PATH",@@@ -53050,6 +55371,7 @@"name": "SUDO_USER","secret": false,"files": [++ "lib/cli.js","lib/commands/drill.js","lib/release-ops.js"],@@@ -53069,6 +55391,7 @@"name": "USER","secret": false,"files": [++ "lib/cli.js","lib/executor.js"],"prod": null@@@ -53136,6 +55459,15 @@],"prod": null},++ {++ "repo": "OpenVibe.Live",++ "name": "ANALYTICS_SOURCE",++ "secret": false,++ "files": [++ "server/analytics/network-analytics.js"++ ],++ "prod": "live.env"++ },{"repo": "OpenVibe.Live","name": "BASE_URL",@@@ -53185,15 +55517,6 @@],"prod": "live.env"},-- {-- "repo": "OpenVibe.Live",-- "name": "COLD_STORAGE_PATH",-- "secret": false,-- "files": [-- "server/config.js"-- ],-- "prod": null-- },{"repo": "OpenVibe.Live","name": "DATA_DIR",@@@ -53270,6 +55593,15 @@],"prod": null},++ {++ "repo": "OpenVibe.Live",++ "name": "FOLLOWS_AUTHORITY",++ "secret": false,++ "files": [++ "server/social/network-follows.js"++ ],++ "prod": "live.env"++ },{"repo": "OpenVibe.Live","name": "GH_TOKEN",@@@ -53408,6 +55740,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Live",++ "name": "LIVE_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/net/actor-limits.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Live",++ "name": "LIVE_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/net/actor-limits.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Live","name": "LIVE_MODULE_SUMMARIES",@@@ -53524,7 +55874,6 @@"name": "MAX_VOD_SIZE_MB","secret": false,"files": [-- "server/config.js","server/media-proxy/vods.js"],"prod": null@@@ -53722,7 +56071,9 @@"name": "OV_AI_INTERNAL_URL","secret": false,"files": [-- "server/ai/ai-service.js"++ "server/ai/ai-service.js",++ "server/ai/byo-credentials.js",++ "server/ai/viewer-quota.js"],"prod": null},@@@ -53732,6 +56083,7 @@"secret": false,"files": ["server/docs/routes.js",++ "server/index.js","server/web/assets.js"],"prod": null@@@ -53822,6 +56174,9 @@"name": "OV_NETWORK_INTERNAL_URL","secret": false,"files": [++ "server/analytics/network-analytics.js",++ "server/auth/account-data.js",++ "server/auth/game-summary.js","server/auth/module-summaries.js","server/chat/chat-server.js","server/events/stream-events.js",@@@ -53830,6 +56185,7 @@"server/net/network-principal.js","server/openre/openre-client.js","server/pastes-client.js",++ "server/social/network-follows.js","server/utils/notify.js"],"prod": "live.env"@@@ -54776,6 +57132,7 @@"name": "OV_NETWORK_INTERNAL_URL","secret": false,"files": [++ "server/account-data.js","server/config.js","server/events.js","server/lineage-client.js",@@@ -54797,6 +57154,7 @@"name": "OV_OAUTH_CLIENT_ID","secret": false,"files": [++ "server/account-data.js","server/events.js","server/index.js","server/lineage-client.js",@@@ -54810,6 +57168,7 @@"name": "OV_OAUTH_CLIENT_SECRET","secret": true,"files": [++ "server/account-data.js","server/events.js","server/index.js","server/lineage-client.js",@@@ -55092,6 +57451,15 @@],"prod": null},++ {++ "repo": "OpenVibe.Network",++ "name": "FOLLOWS_AUTHORITY",++ "secret": false,++ "files": [++ "server/index.js"++ ],++ "prod": "network.env"++ },{"repo": "OpenVibe.Network","name": "GITHUB_TOKEN",@@@ -55203,6 +57571,24 @@],"prod": "network.env"},++ {++ "repo": "OpenVibe.Network",++ "name": "NETWORK_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/auth/actor-limits.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Network",++ "name": "NETWORK_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/auth/actor-limits.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Network","name": "NODE_ENV",@@@ -55241,6 +57627,15 @@"prod": "network.env","unreferenced": true},++ {++ "repo": "OpenVibe.Network",++ "name": "OPERATOR_ALERT_USERNAMES",++ "secret": false,++ "files": [++ "server/operator/alerts.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Network","name": "OV_AI_INTERNAL_URL",@@@ -55540,7 +57935,10 @@"server/auth/owner-guard.js","server/auth/routes.js","server/deploy/routes.js",-- "server/index.js"++ "server/identity/account-data.js",++ "server/identity/account-merge.js",++ "server/index.js",++ "server/operator/alerts.js"],"prod": null},@@@ -55767,6 +58165,24 @@],"prod": "news.env"},++ {++ "repo": "OpenVibe.News",++ "name": "NEWS_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.News",++ "name": "NEWS_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.News","name": "NEWS_MIN_INDEPENDENT_SOURCES",@@@ -56199,6 +58615,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Reviews",++ "name": "REVIEWS_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Reviews",++ "name": "REVIEWS_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Reviews","name": "REVIEWS_SOURCES_PAGE_SIZE",@@@ -56487,6 +58921,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Search",++ "name": "SEARCH_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Search",++ "name": "SEARCH_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Search","name": "SEARCH_MAX_BODY_BYTES",@@@ -56955,6 +59407,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Sources",++ "name": "SOURCES_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Sources",++ "name": "SOURCES_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Sources","name": "SOURCES_MAX_BACKOFF_MS",@@@ -57369,6 +59839,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Tips",++ "name": "TIPS_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Tips",++ "name": "TIPS_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Tips","name": "TIPS_MAX_BITS",@@@ -58066,7 +60554,7 @@"apps/maps/server/config.js","apps/maps/server/sources/ridb.js"],-- "prod": null++ "prod": "tools.env"},{"repo": "OpenVibe.Tools",@@@ -58122,6 +60610,24 @@],"prod": "tools.env"},++ {++ "repo": "OpenVibe.Tools",++ "name": "TOOLS_LIMITS_HOUR",++ "secret": false,++ "files": [++ "apps/_shared/actor-limits.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Tools",++ "name": "TOOLS_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "apps/_shared/actor-limits.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Tools","name": "TOOLS_MEDIA_NAMESPACE",@@@ -58460,6 +60966,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Trade",++ "name": "TRADE_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Trade",++ "name": "TRADE_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Trade","name": "TRADE_PRICE_MAX_AGE_SEC",@@@ -58793,6 +61317,24 @@],"prod": null},++ {++ "repo": "OpenVibe.VIP",++ "name": "VIP_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.VIP",++ "name": "VIP_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.VIP","name": "VIP_MEMBER_COUNT_TTL_MS",@@@ -59027,6 +61569,24 @@],"prod": "wiki.env"},++ {++ "repo": "OpenVibe.Wiki",++ "name": "OV_VIP_INTERNAL_URL",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Wiki",++ "name": "OV_VIP_URL",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Wiki","name": "PORT",@@@ -59108,6 +61668,24 @@],"prod": null},++ {++ "repo": "OpenVibe.Wiki",++ "name": "WIKI_LIMITS_HOUR",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Wiki",++ "name": "WIKI_LIMITS_MINUTE",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Wiki","name": "WIKI_MEDIA_APP",@@@ -59144,6 +61722,42 @@],"prod": null},++ {++ "repo": "OpenVibe.Wiki",++ "name": "WIKI_VIP_CACHE_DENY_TTL_MS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Wiki",++ "name": "WIKI_VIP_CACHE_TTL_MS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Wiki",++ "name": "WIKI_VIP_CACHE_UNAVAILABLE_TTL_MS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },++ {++ "repo": "OpenVibe.Wiki",++ "name": "WIKI_VIP_TIMEOUT_MS",++ "secret": false,++ "files": [++ "server/config.js"++ ],++ "prod": null++ },{"repo": "OpenVibe.Wiki","name": "WIKI_WORKER_ID",@@@ -59155,11 +61769,155 @@}],"discrepancies": [++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "ai",++ "detail": "deployed 549bed0 is 1 commit(s) behind origin/main 6c8b833"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "billing",++ "detail": "deployed 80f97aa is 1 commit(s) behind origin/main f24684b"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "blog",++ "detail": "deployed 21d537c is 1 commit(s) behind origin/main 8a7f8eb"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "chat",++ "detail": "deployed 3aab730 is 1 commit(s) behind origin/main d87c8d3"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "codes",++ "detail": "deployed d78de70 is 1 commit(s) behind origin/main 7d6f65a"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "community",++ "detail": "deployed 52d923a is 1 commit(s) behind origin/main 2da3501"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "coupons",++ "detail": "deployed 64835d2 is 1 commit(s) behind origin/main b91cd79"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "deals",++ "detail": "deployed fa0582d is 1 commit(s) behind origin/main 533450f"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "events",++ "detail": "deployed f55f7eb is 1 commit(s) behind origin/main 19919ec"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "games",++ "detail": "deployed 51d8688 is 1 commit(s) behind origin/main eb2d008"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "host",++ "detail": "deployed 2b63389 is 2 commit(s) behind origin/main 6d2aaaa"++ },{"severity": "medium","area": "deploy","subject": "live",-- "detail": "deployed 9f7f36c is 61 commit(s) behind origin/main 8caa540"++ "detail": "deployed 9f7f36c is 120 commit(s) behind origin/main 03f49b7"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "media",++ "detail": "deployed 6248363 is 1 commit(s) behind origin/main 14cac06"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "network",++ "detail": "deployed ddd87b6 is 1 commit(s) behind origin/main 5a50c12"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "news",++ "detail": "deployed 8ab47a6 is 1 commit(s) behind origin/main 97dae43"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "openre",++ "detail": "deployed cf423e3 is 1 commit(s) behind origin/main c77ec2a"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "reviews",++ "detail": "deployed 1cff36b is 1 commit(s) behind origin/main c87b344"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "search",++ "detail": "deployed 8ed7667 is 1 commit(s) behind origin/main e8511d8"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "sites",++ "detail": "deployed 32464ec is 1 commit(s) behind origin/main 304e8b1"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "sources",++ "detail": "deployed 351383e is 1 commit(s) behind origin/main 1670853"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "tips",++ "detail": "deployed 1e6bfbb is 1 commit(s) behind origin/main 13986b5"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "tools",++ "detail": "deployed e55469f is 1 commit(s) behind origin/main 4f4ed6e"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "trade",++ "detail": "deployed 4658447 is 1 commit(s) behind origin/main 273bce7"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "vip",++ "detail": "deployed 0fbcbb5 is 1 commit(s) behind origin/main 95b3e19"++ },++ {++ "severity": "medium",++ "area": "deploy",++ "subject": "wiki",++ "detail": "deployed 32a26ef is 1 commit(s) behind origin/main 3302540"},{"severity": "low",@@@ -59183,7 +61941,7 @@"severity": "low","area": "database","subject": "/opt/openvibe.live/shared/data/analytics.db",-- "detail": "518.0 MB, 6 tables, not a database the service opens (services.json): stale file or undeclared copy"++ "detail": "525.4 MB, 6 tables, not a database the service opens (services.json): stale file or undeclared copy"},{"severity": "low",@@@ -59209,6 +61967,12 @@"subject": "/opt/openvibe.live/shared/data/backups/live-pre-643a2e6.db","detail": "264.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data"},++ {++ "severity": "low",++ "area": "database",++ "subject": "/opt/openvibe.live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db",++ "detail": "284.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data"++ },{"severity": "low","area": "database",@@@ -59225,7 +61989,7 @@"severity": "low","area": "database","subject": "/opt/openvibe.live/shared/data/live.db",-- "detail": "284.1 MB, 161 tables, not a database the service opens (services.json): stale file or undeclared copy"++ "detail": "284.7 MB, 162 tables, not a database the service opens (services.json): stale file or undeclared copy"},{"severity": "low",@@@ -59251,6 +62015,18 @@"subject": "/opt/openvibe.media/data/reports/h15-repair-applied-20260925.media.db","detail": "11.3 MB, 27 tables, not a database the service opens (services.json): stale file or undeclared copy"},++ {++ "severity": "low",++ "area": "database",++ "subject": "/opt/openvibe.network/data/backups/network-pre-creator-analytics-20260926.db",++ "detail": "292.4 MB copy (backup, import snapshot or rehearsal) kept beside the service data"++ },++ {++ "severity": "low",++ "area": "database",++ "subject": "/opt/openvibe.network/data/backups/network-pre-follows-20260926.db",++ "detail": "292.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data"++ },{"severity": "low","area": "database",@@@ -59533,6 +62309,12 @@"subject": "OpenVibe.Examples:OV_WEBHOOK_SECRET_PREVIOUS","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.Host:CLOUDFLARE_API_TOKEN",++ "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",@@@ -59641,12 +62423,6 @@"subject": "OpenVibe.Tools:OV_INTERNAL_KEY","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.Tools:RIDB_API_KEY",-- "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",@@@ -59989,6 +62765,12 @@"subject": "OpenVibe.Host:event_outbox","detail": "in production (host.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Host (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.)"},++ {++ "severity": "info",++ "area": "schema",++ "subject": "OpenVibe.Live:account_data_events",++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"++ },{"severity": "info","area": "schema",@@@ -60343,6 +63125,12 @@"subject": "OpenVibe.Live:emotes_new","detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"},++ {++ "severity": "info",++ "area": "schema",++ "subject": "OpenVibe.Live:follow_projection_revisions",++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"++ },{"severity": "info","area": "schema",@@@ -60367,6 +63155,12 @@"subject": "OpenVibe.Live:kick_channel_cache","detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"},++ {++ "severity": "info",++ "area": "schema",++ "subject": "OpenVibe.Live:lineage_unresolved",++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"++ },{"severity": "info","area": "schema",@@@ -60571,6 +63365,12 @@"subject": "OpenVibe.Live:streams","detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"},++ {++ "severity": "info",++ "area": "schema",++ "subject": "OpenVibe.Live:subject_merges",++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"++ },{"severity": "info","area": "schema",@@@ -60727,6 +63527,12 @@"subject": "OpenVibe.Media:event_outbox","detail": "in production (media.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Media (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.)"},++ {++ "severity": "info",++ "area": "schema",++ "subject": "OpenVibe.Media:subject_merges",++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"++ },{"severity": "info","area": "schema",@@@ -61165,6 +63971,30 @@"subject": "OpenVibe.Wiki:wiki_schedule_jobs","detail": "in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).)"},++ {++ "severity": "info",++ "area": "units",++ "subject": "openvibe-alerts.service",++ "detail": "unit not listed in services.json"++ },++ {++ "severity": "info",++ "area": "units",++ "subject": "openvibe-alerts.timer",++ "detail": "unit not listed in services.json"++ },++ {++ "severity": "info",++ "area": "units",++ "subject": "openvibe-browsercheck.service",++ "detail": "unit not listed in services.json"++ },++ {++ "severity": "info",++ "area": "units",++ "subject": "openvibe-browsercheck.timer",++ "detail": "unit not listed in services.json"++ },{"severity": "info","area": "units",@@@ -61177,6 +64007,12 @@"subject": "openvibe-devpath.timer","detail": "unit not listed in services.json"},++ {++ "severity": "info",++ "area": "units",++ "subject": "openvibe-llm.service",++ "detail": "unit not listed in services.json"++ },{"severity": "info","area": "units",@@@ -61205,20 +64041,20 @@"metrics": {"github.charters": "1 charter-only repos of 36","contract.todo-markers": "Live 14, Network 3, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0",-- "outbound.call-sites": "107 caller-file/target pairs across 76 files",-- "outbound.internal-key": "40 of 107 call sites authenticate with the shared internal key",++ "outbound.call-sites": "112 caller-file/target pairs across 82 files",++ "outbound.internal-key": "40 of 112 call sites authenticate with the shared internal key","ws.servers": "12 WebSocket server constructions","tables.analytics-copies": "2 repos carry their own analytics_events",-- "shared.pins": "24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0",-- "shared.drift": "0 manifests unpinned or behind: none",++ "shared.pins": "25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0",++ "shared.drift": "31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0)","ci.repos": "27 of 27 scanned repos have .github/workflows",-- "deploy.drift": "1 service(s) not running origin/main",-- "tests.OpenVibe.Live": "126 test files",-- "tables.OpenVibe.Live": "122 tables",++ "deploy.drift": "25 service(s) not running origin/main",++ "tests.OpenVibe.Live": "158 test files",++ "tables.OpenVibe.Live": "126 tables",++ "tables.OpenVibe.Live.target:OpenVibe.Live": "35 Live tables target OpenVibe.Live","tables.OpenVibe.Live.target:OpenVibe.AI": "14 Live tables target OpenVibe.AI","tables.OpenVibe.Live.target:OpenVibe.Network (policy)": "5 Live tables target OpenVibe.Network (policy)","tables.OpenVibe.Live.target:OpenVibe.Network (principals) / OpenVibe.Codes": "2 Live tables target OpenVibe.Network (principals) / OpenVibe.Codes",-- "tables.OpenVibe.Live.target:OpenVibe.Live": "31 Live tables target OpenVibe.Live","tables.OpenVibe.Live.target:OpenRe.Stream": "14 Live tables target OpenRe.Stream","tables.OpenVibe.Live.target:OpenVibe.Chat": "25 Live tables target OpenVibe.Chat","tables.OpenVibe.Live.target:OpenVibe.Billing (loyalty ledger)": "9 Live tables target OpenVibe.Billing (loyalty ledger)",@@@ -61229,84 +64065,84 @@"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": "60 test files",-- "tables.OpenVibe.Network": "52 tables",-- "tables.OpenVibe.Network.target:OpenVibe.Network": "57 Network tables target OpenVibe.Network",++ "tests.OpenVibe.Network": "77 test files",++ "tables.OpenVibe.Network": "70 tables",++ "tables.OpenVibe.Network.target:OpenVibe.Network": "75 Network tables target OpenVibe.Network","tables.OpenVibe.Network.target:OpenVibe.Billing (loyalty ledger)": "2 Network tables target OpenVibe.Billing (loyalty ledger)","tables.OpenVibe.Network.target:OpenVibe.Events": "1 Network tables target OpenVibe.Events",-- "tests.OpenVibe.Shared": "34 test files",++ "tests.OpenVibe.Shared": "39 test files","tables.OpenVibe.Shared": "2 tables","tables.OpenVibe.Shared.target:OpenVibe.Shared": "2 Shared tables target OpenVibe.Shared",-- "tests.OpenVibe.Media": "56 test files",-- "tables.OpenVibe.Media": "28 tables",-- "tables.OpenVibe.Media.target:OpenVibe.Media": "26 Media tables target OpenVibe.Media",++ "tests.OpenVibe.Media": "67 test files",++ "tables.OpenVibe.Media": "34 tables",++ "tables.OpenVibe.Media.target:OpenVibe.Media": "32 Media tables target OpenVibe.Media","tables.OpenVibe.Media.target:OpenVibe.Community": "3 Media tables target OpenVibe.Community","tables.OpenVibe.Media.target:?": "2 Media tables target ?",-- "tests.OpenVibe.Tools": "49 test files",-- "tables.OpenVibe.Tools": "6 tables",-- "tables.OpenVibe.Tools.target:OpenVibe.Tools": "13 Tools tables target OpenVibe.Tools",-- "tests.OpenVibe.Community": "48 test files",-- "tables.OpenVibe.Community": "33 tables",-- "tables.OpenVibe.Community.target:OpenVibe.Community": "35 Community tables target OpenVibe.Community",++ "tests.OpenVibe.Tools": "61 test files",++ "tables.OpenVibe.Tools": "7 tables",++ "tables.OpenVibe.Tools.target:OpenVibe.Tools": "14 Tools tables target OpenVibe.Tools",++ "tests.OpenVibe.Community": "61 test files",++ "tables.OpenVibe.Community": "35 tables",++ "tables.OpenVibe.Community.target:OpenVibe.Community": "37 Community tables target OpenVibe.Community","tables.OpenVibe.Community.target:?": "1 Community tables target ?",-- "tests.OpenVibe.Games": "76 test files",-- "tables.OpenVibe.Games": "12 tables",-- "tables.OpenVibe.Games.target:OpenVibe.Games": "13 Games tables target OpenVibe.Games",++ "tests.OpenVibe.Games": "82 test files",++ "tables.OpenVibe.Games": "13 tables",++ "tables.OpenVibe.Games.target:OpenVibe.Games": "14 Games tables target OpenVibe.Games","tables.OpenVibe.Games.target:?": "1 Games tables target ?",-- "tests.OpenVibe.Sites": "1 test files",++ "tests.OpenVibe.Sites": "2 test files","tables.OpenVibe.Sites": "0 tables",-- "tests.OpenVibe.Events": "14 test files",-- "tables.OpenVibe.Events": "7 tables",-- "tables.OpenVibe.Events.target:OpenVibe.Events": "7 Events tables target OpenVibe.Events",-- "tests.OpenVibe.Chat": "35 test files",-- "tables.OpenVibe.Chat": "41 tables",-- "tables.OpenVibe.Chat.target:OpenVibe.Chat": "41 Chat tables target OpenVibe.Chat",-- "tests.OpenRe.Stream": "19 test files",++ "tests.OpenVibe.Events": "22 test files",++ "tables.OpenVibe.Events": "8 tables",++ "tables.OpenVibe.Events.target:OpenVibe.Events": "8 Events tables target OpenVibe.Events",++ "tests.OpenVibe.Chat": "48 test files",++ "tables.OpenVibe.Chat": "42 tables",++ "tables.OpenVibe.Chat.target:OpenVibe.Chat": "42 Chat tables target OpenVibe.Chat",++ "tests.OpenRe.Stream": "21 test files","tables.OpenRe.Stream": "13 tables","tables.OpenRe.Stream.target:OpenRe.Stream": "14 OpenRe.Stream tables target OpenRe.Stream",-- "tests.OpenVibe.Billing": "21 test files",++ "tests.OpenVibe.Billing": "22 test files","tables.OpenVibe.Billing": "19 tables","tables.OpenVibe.Billing.target:OpenVibe.Billing": "19 Billing tables target OpenVibe.Billing",-- "tests.OpenVibe.Tips": "16 test files",++ "tests.OpenVibe.Tips": "17 test files","tables.OpenVibe.Tips": "17 tables","tables.OpenVibe.Tips.target:OpenVibe.Tips": "19 Tips tables target OpenVibe.Tips",-- "tests.OpenVibe.VIP": "13 test files",++ "tests.OpenVibe.VIP": "14 test files","tables.OpenVibe.VIP": "13 tables","tables.OpenVibe.VIP.target:OpenVibe.VIP": "15 VIP tables target OpenVibe.VIP",-- "tests.OpenVibe.AI": "20 test files",-- "tables.OpenVibe.AI": "18 tables",-- "tables.OpenVibe.AI.target:OpenVibe.AI": "19 AI tables target OpenVibe.AI",-- "tests.OpenVibe.Search": "13 test files",++ "tests.OpenVibe.AI": "26 test files",++ "tables.OpenVibe.AI": "19 tables",++ "tables.OpenVibe.AI.target:OpenVibe.AI": "20 AI tables target OpenVibe.AI",++ "tests.OpenVibe.Search": "14 test files","tables.OpenVibe.Search": "11 tables","tables.OpenVibe.Search.target:OpenVibe.Search": "21 Search tables target OpenVibe.Search",-- "tests.OpenVibe.Sources": "10 test files",++ "tests.OpenVibe.Sources": "13 test files","tables.OpenVibe.Sources": "8 tables","tables.OpenVibe.Sources.target:OpenVibe.Sources": "8 Sources tables target OpenVibe.Sources",-- "tests.OpenVibe.Wiki": "28 test files",++ "tests.OpenVibe.Wiki": "35 test files","tables.OpenVibe.Wiki": "10 tables","tables.OpenVibe.Wiki.target:OpenVibe.Wiki": "22 Wiki tables target OpenVibe.Wiki",-- "tests.OpenVibe.Blog": "23 test files",++ "tests.OpenVibe.Blog": "29 test files","tables.OpenVibe.Blog": "10 tables","tables.OpenVibe.Blog.target:OpenVibe.Blog": "24 Blog tables target OpenVibe.Blog",-- "tests.OpenVibe.News": "18 test files",++ "tests.OpenVibe.News": "19 test files","tables.OpenVibe.News": "13 tables","tables.OpenVibe.News.target:OpenVibe.News": "23 News tables target OpenVibe.News",-- "tests.OpenVibe.Reviews": "16 test files",++ "tests.OpenVibe.Reviews": "17 test files","tables.OpenVibe.Reviews": "14 tables","tables.OpenVibe.Reviews.target:OpenVibe.Reviews": "23 Reviews tables target OpenVibe.Reviews",-- "tests.OpenVibe.Deals": "16 test files",++ "tests.OpenVibe.Deals": "17 test files","tables.OpenVibe.Deals": "15 tables","tables.OpenVibe.Deals.target:OpenVibe.Deals": "19 Deals tables target OpenVibe.Deals",-- "tests.OpenVibe.Coupons": "15 test files",++ "tests.OpenVibe.Coupons": "16 test files","tables.OpenVibe.Coupons": "12 tables","tables.OpenVibe.Coupons.target:OpenVibe.Coupons": "14 Coupons tables target OpenVibe.Coupons",-- "tests.OpenVibe.Trade": "15 test files",++ "tests.OpenVibe.Trade": "16 test files","tables.OpenVibe.Trade": "10 tables","tables.OpenVibe.Trade.target:OpenVibe.Trade": "17 Trade tables target OpenVibe.Trade",-- "tests.OpenVibe.Codes": "27 test files",++ "tests.OpenVibe.Codes": "34 test files","tables.OpenVibe.Codes": "7 tables","tables.OpenVibe.Codes.target:OpenVibe.Codes": "8 Codes tables target OpenVibe.Codes",-- "tests.OpenVibe.Host": "38 test files",++ "tests.OpenVibe.Host": "48 test files","tables.OpenVibe.Host": "11 tables","tables.OpenVibe.Host.target:OpenVibe.Host": "12 Host tables target OpenVibe.Host","tests.OpenVibe.Examples": "16 test files",@@@ -61413,7 +64249,7 @@"metrics": [{"key": "outbound.call-sites",-- "value": "107 caller-file/target pairs across 76 files"++ "value": "112 caller-file/target pairs across 82 files"},{"key": "ws.servers",@@@ -61469,7 +64305,7 @@},{"key": "tests.OpenRe.Stream",-- "value": "19 test files"++ "value": "21 test files"}],"members": [@@@ -61499,7 +64335,7 @@},{"key": "tests.OpenVibe.Chat",-- "value": "35 test files"++ "value": "48 test files"}],"members": [@@@ -61523,7 +64359,7 @@"metrics": [{"key": "tables.OpenVibe.Community",-- "value": "33 tables"++ "value": "35 tables"},{"key": "tables.OpenVibe.Live.target:OpenVibe.Community",@@@ -61557,7 +64393,7 @@},{"key": "tests.OpenVibe.Billing",-- "value": "21 test files"++ "value": "22 test files"}],"members": [@@@ -61581,7 +64417,7 @@"metrics": [{"key": "tests.OpenVibe.Tools",-- "value": "49 test files"++ "value": "61 test files"}],"members": [@@@ -61601,7 +64437,7 @@"metrics": [{"key": "tests.OpenVibe.Games",-- "value": "76 test files"++ "value": "82 test files"}],"members": [@@@ -61621,11 +64457,11 @@"metrics": [{"key": "tests.OpenVibe.Codes",-- "value": "27 test files"++ "value": "34 test files"},{"key": "tests.OpenVibe.Host",-- "value": "38 test files"++ "value": "48 test files"}],"members": [@@@ -61651,7 +64487,7 @@},{"key": "tests.OpenVibe.AI",-- "value": "20 test files"++ "value": "26 test files"}],"members": [@@@ -61692,7 +64528,7 @@"metrics": [{"key": "outbound.internal-key",-- "value": "40 of 107 call sites authenticate with the shared internal key"++ "value": "40 of 112 call sites authenticate with the shared internal key"}],"members": [@@@ -61727,11 +64563,11 @@"metrics": [{"key": "shared.pins",-- "value": "24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0"++ "value": "25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0"},{"key": "shared.drift",-- "value": "0 manifests unpinned or behind: none"++ "value": "31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0)"}],"members": [@@@ -61781,7 +64617,7 @@"metrics": [{"key": "deploy.drift",-- "value": "1 service(s) not running origin/main"++ "value": "25 service(s) not running origin/main"}],"members": [@@@ -61914,7 +64750,7 @@"status": "open","check": "workstation-disk","ownerReview": false,-- "checkResult": "workstation / is 97% used (at generation time)"++ "checkResult": "workstation / is 73% used (at generation time)"},{"id": "H8",@@@ -61970,7 +64806,7 @@"check": "db-size","evidence": "2026-09-23: Live analytics.db 1.7 GB -> about 500 MB and network.db 731 -> 276 MB after the prune and VACUUM. The pre-ADR-021 backups that still hold IPs are hazard H17.","ownerReview": false,-- "checkResult": "largest analytics stores: live/shared/data/analytics.db 518.0 MB; network/data/network.db 290.3 MB; tools/apps/audio/data/analytics.db 36.6 MB; tools/apps/text/data/analytics.db 5.8 MB"++ "checkResult": "largest analytics stores: live/shared/data/analytics.db 525.4 MB; network/data/network.db 302.4 MB; tools/apps/audio/data/analytics.db 36.7 MB; tools/apps/text/data/analytics.db 5.9 MB"},{"id": "H12",@@@ -61999,7 +64835,7 @@"status": "open","check": "deploy-drift","ownerReview": false,-- "checkResult": "live: deployed 9f7f36c is 61 commit(s) behind origin/main 8caa540"++ "checkResult": "ai: deployed 549bed0 is 1 commit(s) behind origin/main 6c8b833; billing: deployed 80f97aa is 1 commit(s) behind origin/main f24684b; blog: deployed 21d537c is 1 commit(s) behind origin/main 8a7f8eb; chat: deployed 3aab730 is 1 commit(s) behind origin/main d87c8d3; codes: deployed d78de70 is 1 commit(s) behind origin/main 7d6f65a; community: deployed 52d923a is 1 commit(s) behind origin/main 2da3501; coupons: deployed 64835d2 is 1 commit(s) behind origin/main b91cd79; deals: deployed fa0582d is 1 commit(s) behind origin/main 533450f; events: deployed f55f7eb is 1 commit(s) behind origin/main 19919ec; games: deployed 51d8688 is 1 commit(s) behind origin/main eb2d008; host: deployed 2b63389 is 2 commit(s) behind origin/main 6d2aaaa; live: deployed 9f7f36c is 120 commit(s) behind origin/main 03f49b7; media: deployed 6248363 is 1 commit(s) behind origin/main 14cac06; network: deployed ddd87b6 is 1 commit(s) behind origin/main 5a50c12; news: deployed 8ab47a6 is 1 commit(s) behind origin/main 97dae43; openre: deployed cf423e3 is 1 commit(s) behind origin/main c77ec2a; reviews: deployed 1cff36b is 1 commit(s) behind origin/main c87b344; search: deployed 8ed7667 is 1 commit(s) behind origin/main e8511d8; sites: deployed 32464ec is 1 commit(s) behind origin/main 304e8b1; sources: deployed 351383e is 1 commit(s) behind origin/main 1670853; tips: deployed 1e6bfbb is 1 commit(s) behind origin/main 13986b5; tools: deployed e55469f is 1 commit(s) behind origin/main 4f4ed6e; trade: deployed 4658447 is 1 commit(s) behind origin/main 273bce7; vip: deployed 0fbcbb5 is 1 commit(s) behind origin/main 95b3e19; wiki: deployed 32a26ef is 1 commit(s) behind origin/main 3302540"},{"id": "H14",@@@ -62013,7 +64849,7 @@"status": "open","check": "dead-dbs","ownerReview": "Approve deleting the zero-table files and moving or deleting the import snapshots and backups listed by the check.",-- "checkResult": "blog/data/blog.db, community/data/community.db, games/data/legacy-import/world-before-20260923T184930Z.db, live/shared/data/analytics.db, live/shared/data/backups/analytics-pre-adr021-2026-09-23.db, live/shared/data/backups/live-20260926-072748.db, live/shared/data/backups/live-20260926-095352.db, live/shared/data/backups/live-pre-643a2e6.db, live/shared/data/hobo.db, live/shared/data/live-before-rs-slots-20260924T0153Z.db, live/shared/data/live.db, live/shared/data/openvibe.db, live/shared/data/rs-companion.db, media/data/backups/owner-subject-20260923.media.db, media/data/reports/h15-repair-applied-20260925.media.db, network/data/network-pre-refresh-hash-2026-09-24.db, network/data/network-pre-secrets-2026-09-24.db, tips/data/tips.db, tools/apps/audio/data/guard.db, tools/apps/docs/data/guard.db, tools/apps/food/data/guard.db, tools/apps/gateway/data/guard.db, tools/apps/gateway/data/token-revocations.db, tools/apps/img/data/guard.db, tools/apps/maps/data/guard.db, tools/apps/text/data/guard.db, tools/apps/yt/data/guard.db, tools/backups/analytics-2026-09-23/audio.analytics.db, tools/backups/analytics-2026-09-23/docs.analytics.db, tools/backups/analytics-2026-09-23/food.analytics.db, tools/backups/analytics-2026-09-23/img.analytics.db, tools/backups/analytics-2026-09-23/maps.analytics.db, tools/backups/analytics-2026-09-23/text.analytics.db, tools/backups/analytics-2026-09-23/yt.analytics.db, billing/live-snapshot-202609230121.db, chat/live-snap-a.db, chat/live-snap-b.db, chat/live-snapshot-0159.db, chat/rehearsal.db, community/community.pre-c24-20260925T185117Z.db, community/community.pre-c24b-20260925T185400Z.db, community/community.pre-c24c-20260925T185425Z.db, community/community.pre-live-comments-20260923T191345Z.db"++ "checkResult": "blog/data/blog.db, community/data/community.db, games/data/legacy-import/world-before-20260923T184930Z.db, live/shared/data/analytics.db, live/shared/data/backups/analytics-pre-adr021-2026-09-23.db, live/shared/data/backups/live-20260926-072748.db, live/shared/data/backups/live-20260926-095352.db, live/shared/data/backups/live-pre-643a2e6.db, live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db, live/shared/data/hobo.db, live/shared/data/live-before-rs-slots-20260924T0153Z.db, live/shared/data/live.db, live/shared/data/openvibe.db, live/shared/data/rs-companion.db, media/data/backups/owner-subject-20260923.media.db, media/data/reports/h15-repair-applied-20260925.media.db, network/data/backups/network-pre-creator-analytics-20260926.db, network/data/backups/network-pre-follows-20260926.db, network/data/network-pre-refresh-hash-2026-09-24.db, network/data/network-pre-secrets-2026-09-24.db, tips/data/tips.db, tools/apps/audio/data/guard.db, tools/apps/docs/data/guard.db, tools/apps/food/data/guard.db, tools/apps/gateway/data/guard.db, tools/apps/gateway/data/token-revocations.db, tools/apps/img/data/guard.db, tools/apps/maps/data/guard.db, tools/apps/text/data/guard.db, tools/apps/yt/data/guard.db, tools/backups/analytics-2026-09-23/audio.analytics.db, tools/backups/analytics-2026-09-23/docs.analytics.db, tools/backups/analytics-2026-09-23/food.analytics.db, tools/backups/analytics-2026-09-23/img.analytics.db, tools/backups/analytics-2026-09-23/maps.analytics.db, tools/backups/analytics-2026-09-23/text.analytics.db, tools/backups/analytics-2026-09-23/yt.analytics.db, billing/live-snapshot-202609230121.db, chat/live-snap-a.db, chat/live-snap-b.db, chat/live-snapshot-0159.db, chat/rehearsal.db, community/community.pre-c24-20260925T185117Z.db, community/community.pre-c24b-20260925T185400Z.db, community/community.pre-c24c-20260925T185425Z.db, community/community.pre-live-comments-20260923T191345Z.db"},{"id": "H15",@@@ -62078,25 +64914,25 @@"id": "EC1","text": "Every table has an owner classification","pass": true,-- "detail": "604 tables classified, 0 unclassified"++ "detail": "639 tables classified, 0 unclassified"},{"id": "EC2","text": "Every route is attributed to a repo and source line, with an owner classification","pass": true,-- "detail": "2381 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"++ "detail": "2453 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"},{"id": "EC3","text": "Every background job is listed with its location and an owner classification","pass": true,-- "detail": "175 timers/jobs, 0 unclassified"++ "detail": "179 timers/jobs, 0 unclassified"},{"id": "EC4","text": "Every cross-service call records caller, callee, auth, timeout and retry","pass": true,-- "detail": "107 call sites; 39 with no timeout detected"++ "detail": "112 call sites; 39 with no timeout detected"},{"id": "EC5",@@@ -2,37 +2,37 @@"_about": "Generated from data/requirement-ledger.json by scripts/roadmap-baseline/generate.js. Umbrella-level ledger (roadmap §22.4/§25): one row per D01-D46 requirement, every artifact re-verified against the scanned origin/main checkouts and prod-snapshot.json. Do not edit; edit the data file and regenerate.","asOf": "2026-09-23T20:30Z","generatedFrom": {-- "OpenVibe.Live": "8caa540466f9af86247febdbba1339b68919a42f",-- "OpenVibe.Network": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",-- "OpenVibe.Shared": "dbf9d39750e9f0dd0f19d8571d278eb303f3b83f",-- "OpenVibe.Media": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",-- "OpenVibe.Tools": "168e5110d062f076c2c4afe88e3fc3c53ab44613",-- "OpenVibe.Community": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",-- "OpenVibe.Games": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",-- "OpenVibe.Sites": "3802ee3d9ada9b8490134ece350420e627866a8c",-- "OpenVibe.Events": "eb98f8cad2a738fec45f1c10e373081532c83e91",-- "OpenVibe.Chat": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",-- "OpenRe.Stream": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",-- "OpenVibe.Billing": "180e246a3a344c062f1c7435303f4aa748f17046",-- "OpenVibe.Tips": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",-- "OpenVibe.VIP": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",-- "OpenVibe.AI": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",-- "OpenVibe.Search": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",-- "OpenVibe.Sources": "29cd386241c44456ffcebf70b6be287fa9a08aaa",-- "OpenVibe.Wiki": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",-- "OpenVibe.Blog": "79e9e153ca1308311993a31295fd471a8becaf8d",-- "OpenVibe.News": "0860cf20dd3d8e8032caad300e0ce90497195b96",-- "OpenVibe.Reviews": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",-- "OpenVibe.Deals": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",-- "OpenVibe.Coupons": "348f585cd6549a5c506171fba0fc2c5462dede32",-- "OpenVibe.Trade": "fa382881cd92ee90b6329699d7d79129e32a6325",-- "OpenVibe.Codes": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",-- "OpenVibe.Host": "75147890e32dd63fd1363f843c87415f90d5b2dd",-- "OpenVibe.Examples": "36901ffc052752754608df8764a9f2942069da9a"++ "OpenVibe.Live": "03f49b7716b7cee1cce8a44e7155aeb96a67d004",++ "OpenVibe.Network": "5a50c12a83f6501aacd663f15d3c06c718a4c83a",++ "OpenVibe.Shared": "b5a9bd77171fcf75f42ff33fe86b7ad06baac1c8",++ "OpenVibe.Media": "14cac06886649848c332cfa564aa6b3594ea09bc",++ "OpenVibe.Tools": "4f4ed6e8f3f3c8e1a83dd644dd3c0659a7bccce4",++ "OpenVibe.Community": "2da3501e28457fa4978c0bc4a1b3bfc9188b77b9",++ "OpenVibe.Games": "eb2d00880d3231b2c68cb1753b4542044edef1e5",++ "OpenVibe.Sites": "304e8b12b535f4b562f23027ae84f1a5d515cc6c",++ "OpenVibe.Events": "19919ece79707eed051c3f18ab37b7fdb6d939a6",++ "OpenVibe.Chat": "d87c8d3c906ad52ef8bf123ce60373fdefcf09e6",++ "OpenRe.Stream": "c77ec2a9a1e350fb4ae1c646ec74693fae4f2fa3",++ "OpenVibe.Billing": "f24684bb84ec1670bd08670891e6742fa433a548",++ "OpenVibe.Tips": "13986b59e697d12a328a4f12e993295445ca40be",++ "OpenVibe.VIP": "95b3e196daa152c2e7f8e940a1f02b7fe32706ba",++ "OpenVibe.AI": "6c8b8338be936cbd3a6f50dee3f790807f145a0e",++ "OpenVibe.Search": "e8511d849720534a9ffcd54b052663111e5b1e6f",++ "OpenVibe.Sources": "167085388a637eed3f0d47b3c6eabb8c9d00814d",++ "OpenVibe.Wiki": "3302540e8b5fdf3c07db9fce688be2f4ab8b847b",++ "OpenVibe.Blog": "8a7f8ebe862b0e1c0bb119ee96c42f38fc0e5321",++ "OpenVibe.News": "97dae43a2d41c5528bbb4c93ff2ea7ea456203dd",++ "OpenVibe.Reviews": "c87b34440b0d50bc2cdf6c136775002ed9080c1e",++ "OpenVibe.Deals": "533450f9cc4a358ba50f353f06826ec3611b4ddc",++ "OpenVibe.Coupons": "b91cd795e8ee4a3e49317a6e3cb000fa92da9325",++ "OpenVibe.Trade": "273bce7b1b8771037bc2a660fa8784dc1aa049a7",++ "OpenVibe.Codes": "7d6f65ac198d95f70ac840c24d03d1407affb7a9",++ "OpenVibe.Host": "6d2aaaa630e29d2bfd261a7f75cbbbaa2b8c1d46",++ "OpenVibe.Examples": "92eb7c3b0f50fea9f76086ed3eeda3664de93494"},"prodSnapshot": {"host": "openvibe-oregon",-- "collectedAt": "2026-09-26T13:29:03.103Z"++ "collectedAt": "2026-09-28T03:25:35.860Z"},"statuses": {"met": "the §15.0 required target is demonstrated by current evidence: a test that exercises it, and production evidence where the target is a production authority or state.",@@@ -149,7 +149,7 @@"metrics": [{"key": "outbound.call-sites",-- "value": "107 caller-file/target pairs across 76 files"++ "value": "112 caller-file/target pairs across 82 files"},{"key": "ws.servers",@@@ -196,7 +196,7 @@},{"key": "tests.OpenRe.Stream",-- "value": "19 test files"++ "value": "21 test files"}]},@@@ -219,7 +219,7 @@},{"key": "tests.OpenVibe.Chat",-- "value": "35 test files"++ "value": "48 test files"}]},@@@ -239,7 +239,7 @@"metrics": [{"key": "tables.OpenVibe.Community",-- "value": "33 tables"++ "value": "35 tables"},{"key": "tables.OpenVibe.Live.target:OpenVibe.Community",@@@ -266,7 +266,7 @@},{"key": "tests.OpenVibe.Billing",-- "value": "21 test files"++ "value": "22 test files"}]},@@@ -283,7 +283,7 @@"metrics": [{"key": "tests.OpenVibe.Tools",-- "value": "49 test files"++ "value": "61 test files"}]},@@@ -300,7 +300,7 @@"metrics": [{"key": "tests.OpenVibe.Games",-- "value": "76 test files"++ "value": "82 test files"}]},@@@ -318,11 +318,11 @@"metrics": [{"key": "tests.OpenVibe.Codes",-- "value": "27 test files"++ "value": "34 test files"},{"key": "tests.OpenVibe.Host",-- "value": "38 test files"++ "value": "48 test files"}]},@@@ -346,7 +346,7 @@},{"key": "tests.OpenVibe.AI",-- "value": "20 test files"++ "value": "26 test files"}]},@@@ -375,7 +375,7 @@"metrics": [{"key": "outbound.internal-key",-- "value": "40 of 107 call sites authenticate with the shared internal key"++ "value": "40 of 112 call sites authenticate with the shared internal key"}]},@@@ -404,11 +404,11 @@"metrics": [{"key": "shared.pins",-- "value": "24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0"++ "value": "25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0"},{"key": "shared.drift",-- "value": "0 manifests unpinned or behind: none"++ "value": "31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0)"}]},@@@ -449,7 +449,7 @@"metrics": [{"key": "deploy.drift",-- "value": "1 service(s) not running origin/main"++ "value": "25 service(s) not running origin/main"}]},@@@ -2678,10 +2678,10 @@{"id": "D39","title": "Mods",-- "owner": "OpenVibe.Games (registry, grants and runtime today); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Network (planned mod grants); OpenVibe.Host (Stage C sandbox)",++ "owner": "OpenVibe.Games (registry, runtime, the hot path's copy of grants); OpenVibe.Network (mod principals and grants, mods.grant.manage); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Host (Stage C sandbox)","target": "mod manifests, capabilities, quotas, runtime adapters","status": "partial",-- "summary": "The mod manifest (Contracts mods/mod-manifest.v1, ADR-013 accepted 2026-09-23) and a Games-local registry are tested: grants are the approved subset, installs and grants are audited, and revoking a mod removes its effect on the next tick and across a restart. Only declarative games-content packs run. Executable runtimes are refused, and the CPU budget is metered and audited but not enforced. Network's mods.grant.manage capability is still `planned`, and on 2026-09-23 at 20:22 UTC production world.db held 0 mods, 0 grants and 0 audit rows.",++ "summary": "The mod manifest (Contracts mods/mod-manifest.v1, ADR-013) and the Games registry are tested. Since 2026-09-27 every install is a Network principal mod:<id> whose grants Network holds (mods.grant.manage active; Games asks Network first, and network.mod.grants_changed keeps its copy current). The budget is enforced: 5 reconciles over cpuMs, or 3 minutes over 60 effects a minute, disable only the offending mod. Security tests cover namespace escape, event flood, resource budget and forged ownership. One production install -> grant -> use -> revoke run is recorded. Only declarative games-content packs run; executable runtimes wait for Host Stage C.","artifacts": [{"kind": "test",@@@ -2711,25 +2711,45 @@"kind": "doc","repo": "OpenVibe.Contracts","path": "manifests/capabilities/mods.grant.manage.json",-- "contains": "Until Network implements it, each runtime keeps the approved subset itself",-- "proves": "Network-side mod principals and grants are not implemented: the status is planned and implementedBy is empty.",++ "contains": "\"status\": \"active\"",++ "proves": "Network implements mod principals and grants: the capability is active.",++ "ok": true++ },++ {++ "kind": "test",++ "repo": "OpenVibe.Network",++ "path": "test/mod-principals.test.js",++ "contains": "another runtime can neither register nor change it",++ "proves": "An install registers mod:<id> with the approved subset of what its manifest requests; the registering runtime owns it; staff changes carry a reason and an audit row; every change is announced with the complete approved set.",++ "ok": true++ },++ {++ "kind": "test",++ "repo": "OpenVibe.Games",++ "path": "apps/server/src/mods/security.test.ts",++ "contains": "forged ownership",++ "proves": "Namespace escape, event flood, resource budget and forged ownership: a flooding or over-budget mod is disabled while the others run; props are always the mod's.",++ "ok": true++ },++ {++ "kind": "test",++ "repo": "OpenVibe.Games",++ "path": "apps/server/src/mods/networkGrants.test.ts",++ "contains": "installs with what Network approved",++ "proves": "The mods API asks Network first and applies only its answer; an older grants_changed revision changes nothing.","ok": true},{"kind": "prod",-- "check": "ssh openvibe-ovh 'db=/opt/openvibe.games/data/world.db; sudo -n -u \"$(stat -c %U $db)\" sqlite3 -readonly $db \"SELECT count(*) FROM mods\"' (also mod_grants, mod_audit); curl -s http://127.0.0.1:8000/api/v1/mods",-- "observed": "mods 0, mod_grants 0, mod_audit 0; /api/v1/mods -> {\"mods\":[]}",-- "at": "2026-09-23T20:22Z",-- "proves": "No mod has ever been installed, granted, used or revoked in production.",++ "check": "ssh openvibe-ovh: sudo sh -c '. /etc/openvibe/probe.env; cd /opt/openvibe.games && node --import tsx apps/server/scripts/modLifecycleProof.ts'",++ "observed": "install 201 -> grant 200 -> use (prop placed) -> revoke 200 -> retract; the Network principal ended revoked with three network.mod.grants_changed events",++ "at": "2026-09-27T23:45Z",++ "proves": "One production install -> grant -> use -> revoke run with audit rows.","ok": true}],"remaining": [-- "Network-side mod principals and grants (capability mods.grant.manage, still planned with implementedBy []): an install should create a mod:<id> principal whose grants Network checks, as ADR-013 decides",-- "Quotas: the manifest's resource budget is only metered and audited in Games (runtime.ts budget_exceeded, with no test). Still to do: enforce it, prove that a budget breach terminates only the offending mod, and add an event-flood throttle, each with tests (roadmap §20 Mods)",-- "Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C",-- "The §20 Mods acceptance tests still missing: namespace escape denied, and no forged Billing or Media ownership",-- "One production install -> grant -> use -> revoke run with audit rows (production has 0 mods)"++ "Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C"],"blockedOn": null,"ownerReview": false,@@@ -2,7 +2,7 @@> Generated by `scripts/roadmap-baseline/generate.js`. Do not edit by hand; edit `data/*.json` or the extractor and regenerate.--Roadmap §22.4 and §25: every D01-D46 requirement linked to the acceptance artifact that proves it. As of 2026-09-23T20:30Z; repositories scanned at origin/main (README), production snapshot 2026-09-26 13:29 UTC.++Roadmap §22.4 and §25: every D01-D46 requirement linked to the acceptance artifact that proves it. As of 2026-09-23T20:30Z; repositories scanned at origin/main (README), production snapshot 2026-09-28 03:25 UTC.This is the umbrella layer. §25.2 also asks for an atomic, source-level ledger (`docs/implementation/requirements-ledger.yaml`, one entry per field, route family, event, capability, journey and failure state); that ledger does not exist yet, and no row here may be read as closing the requirements beneath it.@@@ -70,7 +70,7 @@ Every run re-verifies each artifact: a test, doc or drill file must exist at ori| [D36](#d36) | Sources | **blocked on owner** | OpenVibe.Sources (loopback :4720, deployed 2e986af) | 5/5 | Enable at least one owner-verified source per category and observe real fetch runs and items with provenance in production || [D37](#d37) | Search/SEO | **blocked on owner** | OpenVibe.Search (deployed a707e38; public page at search.openvibe.network); OpenVibe.Contracts (search/index-document.v1.json) | 5/5 | Index real content: once wiki pages are reviewed or the blog post is published, re-send the upserts and verify they land (only tombstones so far) || [D38](#d38) | Publishing | **blocked on owner** | OpenVibe.Publishing (openvibe-publishing v0.2.1); consumers OpenVibe.Wiki, Blog, News, Reviews, Deals, Coupons, Trade | 5/5 | Publish the first real content: reviewed wiki pages and the Blog seed post, then verify that the published revision, search document, feed, sitemap and SSR page converge (roadmap §20.1) |--| [D39](#d39) | Mods | **partial** | OpenVibe.Games (registry, grants and runtime today); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Network (planned mod grants); OpenVibe.Host (Stage C sandbox) | 5/5 | Network-side mod principals and grants (capability mods.grant.manage, still planned with implementedBy []): an install should create a mod:<id> principal whose grants Network checks, as ADR-013 decides |++| [D39](#d39) | Mods | **partial** | OpenVibe.Games (registry, runtime, the hot path's copy of grants); OpenVibe.Network (mod principals and grants, mods.grant.manage); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Host (Stage C sandbox) | 8/8 | Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C || [D40](#d40) | Developer services | **partial** | OpenVibe.Network (projects, apps, credentials, grants, quota records); OpenVibe.Media, OpenVibe.Events, OpenVibe.Tools (tenant storage, app events, jobs); OpenVibe.SDK; OpenVibe.Codes (portal); OpenVibe.Examples | 6/6 | Run the committed developer path (OpenVibe.Examples npm run developer-path) against production and record the result || [D41](#d41) | Runtime lifecycle | **partial** | OpenVibe.Host (ovhost inventory, deploy, rollback, drain); each service (readiness endpoint) | 5/5 | Declare the rest of the §15.18 lifecycle for each deployable unit: liveness, shutdown deadline, startup recovery, rollback conditions, supported contract ranges, and leases or fencing for competing workers. The inventory has only ready, drain policy, protected probe, workerUnits and databases || [D42](#d42) | Shared components | **partial** | OpenVibe.Shared (package); OpenVibe.Network (serves /shared/*); every consuming product | 5/5 | Serve shared browser files immutably for each consumer. Community, Wiki, Codes and Tools reference unversioned https://openvibe.network/shared/*.js, which serves Network's pinned release, not their own pin. Use the content-hash ?v= or a site-local copy, as Live does |@@@ -344,7 +344,7 @@ Remaining:### D11-D13 Events, realtime, SDK: partial--Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W2, W3. Measured this run: 107 caller-file/target pairs across 76 files; 12 WebSocket server constructions.++Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W2, W3. Measured this run: 112 caller-file/target pairs across 82 files; 12 WebSocket server constructions.#### D11@@@ -477,7 +477,7 @@ Blocked on the owner: Owner decision on the 6 ready objects with no good copy (s### D17-D20 Live, OpenRe, channel/VOD lineage: partial--Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W7. Measured this run: 14 Live tables target OpenRe.Stream; 19 test files.++Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W7. Measured this run: 14 Live tables target OpenRe.Stream; 21 test files.#### D17@@@ -570,7 +570,7 @@ Remaining:### D21-D23 Chat: partial--Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W6. Measured this run: 25 Live tables target OpenVibe.Chat; 35 test files.++Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W6. Measured this run: 25 Live tables target OpenVibe.Chat; 48 test files.#### D21@@@ -636,7 +636,7 @@ Remaining:### D24-D27 Community: partial--Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W5. Measured this run: 33 tables; 4 Live tables target OpenVibe.Community.++Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W5. Measured this run: 35 tables; 4 Live tables target OpenVibe.Community.#### D24@@@ -712,7 +712,7 @@ Acceptance artifacts:### D28-D30 Billing, Tips, VIP: blocked on owner--Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W8-W10 (ADR-012 first). Measured this run: 2 Live tables target OpenVibe.Billing; 21 test files.++Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W8-W10 (ADR-012 first). Measured this run: 2 Live tables target OpenVibe.Billing; 22 test files.#### D28@@@ -788,7 +788,7 @@ Blocked on the owner: Owner: the Billing cutover prerequisites: the PowerChat we### D31 Tools: partial--Roadmap §3.2 (W0, 2026-09-22): built. Waves: W11. Measured this run: 49 test files.++Roadmap §3.2 (W0, 2026-09-22): built. Waves: W11. Measured this run: 61 test files.#### D31@@@ -816,7 +816,7 @@ Blocked on the owner: Owner: supply YT_PROXY or YT_COOKIES_FILE for the YouTube### D32 Games: partial--Roadmap §3.2 (W0, 2026-09-22): built. Waves: W12. Measured this run: 76 test files.++Roadmap §3.2 (W0, 2026-09-22): built. Waves: W12. Measured this run: 82 test files.#### D32@@@ -844,7 +844,7 @@ Blocked on the owner: Owner: accept ADR-013's trust-tier names (unreviewed/revie### D33-D34 Codes, Host: partial--Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 27 test files; 38 test files.++Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 34 test files; 48 test files.#### D33@@@ -897,7 +897,7 @@ Blocked on the owner: Owner: confirm /etc/openvibe/backup.key is escrowed off th### D35-D38 AI, content, sources, search: partial--Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W13-W15. Measured this run: 14 Live tables target OpenVibe.AI; 20 test files.++Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W13-W15. Measured this run: 14 Live tables target OpenVibe.AI; 26 test files.#### D35@@@ -998,29 +998,28 @@ Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W12, W21.#### D39--**Mods: partial**. Owner today: OpenVibe.Games (registry, grants and runtime today); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Network (planned mod grants); OpenVibe.Host (Stage C sandbox). Target (§15.0): mod manifests, capabilities, quotas, runtime adapters.++**Mods: partial**. Owner today: OpenVibe.Games (registry, runtime, the hot path's copy of grants); OpenVibe.Network (mod principals and grants, mods.grant.manage); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Host (Stage C sandbox). Target (§15.0): mod manifests, capabilities, quotas, runtime adapters.--The mod manifest (Contracts mods/mod-manifest.v1, ADR-013 accepted 2026-09-23) and a Games-local registry are tested: grants are the approved subset, installs and grants are audited, and revoking a mod removes its effect on the next tick and across a restart. Only declarative games-content packs run. Executable runtimes are refused, and the CPU budget is metered and audited but not enforced. Network's mods.grant.manage capability is still `planned`, and on 2026-09-23 at 20:22 UTC production world.db held 0 mods, 0 grants and 0 audit rows.++The mod manifest (Contracts mods/mod-manifest.v1, ADR-013) and the Games registry are tested. Since 2026-09-27 every install is a Network principal mod:<id> whose grants Network holds (mods.grant.manage active; Games asks Network first, and network.mod.grants_changed keeps its copy current). The budget is enforced: 5 reconciles over cpuMs, or 3 minutes over 60 effects a minute, disable only the offending mod. Security tests cover namespace escape, event flood, resource budget and forged ownership. One production install -> grant -> use -> revoke run is recorded. Only declarative games-content packs run; executable runtimes wait for Host Stage C.Acceptance artifacts:- test: Games/apps/server/src/mods/runtime.test.ts ("a denied capability cannot be reached: the binding throws and the host is never called") - A capability the mod was not granted cannot be reached through the Games runtime seam (ADR-013 acceptance 1)..- test: Games/apps/server/src/mods/runtime.test.ts ("revocation survives a restart: the next boot retracts what the old process left") - A revoked mod stops affecting the world on the next tick and stays revoked after a restart. The same file tests that a trust tier never stands in for a grant and that executable runtimes are refused..- doc: Contracts/docs/adr/ADR-013-mod-manifest.md ("**Manifest in Contracts:** a mod is described by `mods/mod-manifest.v1`") - The accepted manifest carries the target runtime, the requested capabilities, a resource budget and a compatibility range. Grants belong in Network and the sandbox in Host..--- doc: Contracts/manifests/capabilities/mods.grant.manage.json ("Until Network implements it, each runtime keeps the approved subset itself") - Network-side mod principals and grants are not implemented: the status is planned and implementedBy is empty..--- prod: `ssh openvibe-ovh 'db=/opt/openvibe.games/data/world.db; sudo -n -u "$(stat -c %U $db)" sqlite3 -readonly $db "SELECT count(*) FROM mods"' (also mod_grants, mod_audit); curl -s http://127.0.0.1:8000/api/v1/mods` (2026-09-23 20:22) - No mod has ever been installed, granted, used or revoked in production.. Observed: mods 0, mod_grants 0, mod_audit 0; /api/v1/mods -> {"mods":[]}.++- doc: Contracts/manifests/capabilities/mods.grant.manage.json (""status": "active"") - Network implements mod principals and grants: the capability is active..++- test: Network/test/mod-principals.test.js ("another runtime can neither register nor change it") - An install registers mod:<id> with the approved subset of what its manifest requests; the registering runtime owns it; staff changes carry a reason and an audit row; every change is announced with the complete approved set..++- test: Games/apps/server/src/mods/security.test.ts ("forged ownership") - Namespace escape, event flood, resource budget and forged ownership: a flooding or over-budget mod is disabled while the others run; props are always the mod's..++- test: Games/apps/server/src/mods/networkGrants.test.ts ("installs with what Network approved") - The mods API asks Network first and applies only its answer; an older grants_changed revision changes nothing..++- prod: `ssh openvibe-ovh: sudo sh -c '. /etc/openvibe/probe.env; cd /opt/openvibe.games && node --import tsx apps/server/scripts/modLifecycleProof.ts'` (2026-09-27 23:45) - One production install -> grant -> use -> revoke run with audit rows.. Observed: install 201 -> grant 200 -> use (prop placed) -> revoke 200 -> retract; the Network principal ended revoked with three network.mod.grants_changed events.Remaining:--- Network-side mod principals and grants (capability mods.grant.manage, still planned with implementedBy []): an install should create a mod:<id> principal whose grants Network checks, as ADR-013 decides--- Quotas: the manifest's resource budget is only metered and audited in Games (runtime.ts budget_exceeded, with no test). Still to do: enforce it, prove that a budget breach terminates only the offending mod, and add an event-flood throttle, each with tests (roadmap §20 Mods)- Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C--- The §20 Mods acceptance tests still missing: namespace escape denied, and no forged Billing or Media ownership--- One production install -> grant -> use -> revoke run with audit rows (production has 0 mods)### D40 Open developer services: partial--Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 40 of 107 call sites authenticate with the shared internal key.++Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 40 of 112 call sites authenticate with the shared internal key.#### D40@@@ -1075,7 +1074,7 @@ Blocked on the owner: Open 1936/tcp at the host firewall and at the provider edg### D42 Shared component architecture: partial--Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W2, Track R. Measured this run: 24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0; 0 manifests unpinned or behind: none.++Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W2, Track R. Measured this run: 25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0; 31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0).#### D42@@@ -1156,7 +1155,7 @@ Remaining:### D45 Release compatibility and recovery: partial--Roadmap §3.2 (W0, 2026-09-22): absent. Waves: Track R, W22. Measured this run: 1 service(s) not running origin/main.++Roadmap §3.2 (W0, 2026-09-22): absent. Waves: Track R, W22. Measured this run: 25 service(s) not running origin/main.#### D45
@@ -8,64 +8,64 @@ Deliverable 1: runtimes, ports, units, env files and repository state.
@@ -8,64 +8,64 @@ 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 | a7b99c7 | data/network.db |
+| network | OpenVibe.Network | live | http 4000 | openvibe-network.service | /etc/openvibe/network.env | ddd87b6 | 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 | 9f7f36c | data/live.db, data/analytics.db, data/rs-companion.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 | 9f7f36c | data/live.db, data/analytics.db, data/rs-companion.db |
-| media | OpenVibe.Media | live | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | b7fbe65 | 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 | 168e511 | apps/<app>/data/analytics.db, apps/<app>/data/jobs.db |
-| games | OpenVibe.Games | live | http 8000 | openvibe-games.service | /etc/openvibe/games.env | b207e78 | data/world.db |
-| community | OpenVibe.Community | live | http 4200 | openvibe-community.service | /etc/openvibe/community.env | 19441aa | /var/lib/openvibe-community/community.db |
-| sites | OpenVibe.Sites | placeholder-host | | - | - | 3802ee3 | none |
-| events | OpenVibe.Events | live | http 4300 | openvibe-events.service | /etc/openvibe/events.env | eb98f8c | /var/lib/openvibe-events/events.db |
-| chat | OpenVibe.Chat | live | http 4400 | openvibe-chat.service | /etc/openvibe/chat.env | 739d3a1 | /var/lib/openvibe-chat/chat.db |
-| openre | OpenRe.Stream | shadow | http 4500, rtmp 1936 | openre-api.service, openre-session-coordinator.service, [email protected], [email protected] | /etc/openvibe/openre.env | b34dcd6 | /var/lib/openre/openre.db |
-| billing | OpenVibe.Billing | shadow | http 4600 | openvibe-billing.service | /etc/openvibe/billing.env | 180e246 | /var/lib/openvibe-billing/billing.db |
-| tips | OpenVibe.Tips | loopback | http 4610 | openvibe-tips.service | /etc/openvibe/tips.env | 1d558c5 | /var/lib/openvibe-tips/tips.db |
-| vip | OpenVibe.VIP | loopback | http 4620 | openvibe-vip.service | /etc/openvibe/vip.env | 4ddf723 | /var/lib/openvibe-vip/vip.db |
-| ai | OpenVibe.AI | live-internal | http 4700 | openvibe-ai.service | /etc/openvibe/ai.env | c3ee605 | /var/lib/openvibe-ai/ai.db |
-| search | OpenVibe.Search | live | http 4710 | openvibe-search.service | /etc/openvibe/search.env | b00aa4c | /var/lib/openvibe-search/search.db |
-| sources | OpenVibe.Sources | loopback | http 4720 | openvibe-sources.service | /etc/openvibe/sources.env | 29cd386 | /var/lib/openvibe-sources/sources.db |
-| wiki | OpenVibe.Wiki | live | http 4800 | openvibe-wiki.service | /etc/openvibe/wiki.env | 38a17bd | /var/lib/openvibe-wiki/wiki.db |
-| blog | OpenVibe.Blog | live | http 4810 | openvibe-blog.service | /etc/openvibe/blog.env | 79e9e15 | /var/lib/openvibe-blog/blog.db |
-| news | OpenVibe.News | loopback | http 4820 | openvibe-news.service | /etc/openvibe/news.env | 0860cf2 | /var/lib/openvibe-news/news.db |
-| reviews | OpenVibe.Reviews | loopback | http 4830 | openvibe-reviews.service | /etc/openvibe/reviews.env | cfc37ac | /var/lib/openvibe-reviews/reviews.db |
-| deals | OpenVibe.Deals | loopback | http 4840 | openvibe-deals.service | /etc/openvibe/deals.env | 99bd438 | /var/lib/openvibe-deals/deals.db |
-| coupons | OpenVibe.Coupons | loopback | http 4850 | openvibe-coupons.service | /etc/openvibe/coupons.env | 348f585 | /var/lib/openvibe-coupons/coupons.db |
-| trade | OpenVibe.Trade | loopback | http 4860 | openvibe-trade.service | /etc/openvibe/trade.env | fa38288 | /var/lib/openvibe-trade/trade.db |
-| codes | OpenVibe.Codes | live | http 4900 | openvibe-codes.service | /etc/openvibe/codes.env | 0bfdf70 | /var/lib/openvibe-codes/codes.db |
-| host | OpenVibe.Host | loopback | http 4910 | openvibe-host.service, openvibe-backup.timer, openvibe-backup.service | /etc/openvibe/host.env | 7514789 | /var/lib/openvibe-host-api/host.db |
+| media | OpenVibe.Media | live | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | 6248363 | 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 | e55469f | apps/<app>/data/analytics.db, apps/<app>/data/jobs.db |
+| games | OpenVibe.Games | live | http 8000 | openvibe-games.service | /etc/openvibe/games.env | 51d8688 | data/world.db |
+| community | OpenVibe.Community | live | http 4200 | openvibe-community.service | /etc/openvibe/community.env | 52d923a | /var/lib/openvibe-community/community.db |
+| sites | OpenVibe.Sites | placeholder-host | | - | - | 32464ec | none |
+| events | OpenVibe.Events | live | http 4300 | openvibe-events.service | /etc/openvibe/events.env | f55f7eb | /var/lib/openvibe-events/events.db |
+| chat | OpenVibe.Chat | live | http 4400 | openvibe-chat.service | /etc/openvibe/chat.env | 3aab730 | /var/lib/openvibe-chat/chat.db |
+| openre | OpenRe.Stream | shadow | http 4500, rtmp 1936 | openre-api.service, openre-session-coordinator.service, [email protected], [email protected] | /etc/openvibe/openre.env | cf423e3 | /var/lib/openre/openre.db |
+| billing | OpenVibe.Billing | shadow | http 4600 | openvibe-billing.service | /etc/openvibe/billing.env | 80f97aa | /var/lib/openvibe-billing/billing.db |
+| tips | OpenVibe.Tips | loopback | http 4610 | openvibe-tips.service | /etc/openvibe/tips.env | 1e6bfbb | /var/lib/openvibe-tips/tips.db |
+| vip | OpenVibe.VIP | loopback | http 4620 | openvibe-vip.service | /etc/openvibe/vip.env | 0fbcbb5 | /var/lib/openvibe-vip/vip.db |
+| ai | OpenVibe.AI | live-internal | http 4700 | openvibe-ai.service | /etc/openvibe/ai.env | 549bed0 | /var/lib/openvibe-ai/ai.db |
+| search | OpenVibe.Search | live | http 4710 | openvibe-search.service | /etc/openvibe/search.env | 8ed7667 | /var/lib/openvibe-search/search.db |
+| sources | OpenVibe.Sources | loopback | http 4720 | openvibe-sources.service | /etc/openvibe/sources.env | 351383e | /var/lib/openvibe-sources/sources.db |
+| wiki | OpenVibe.Wiki | live | http 4800 | openvibe-wiki.service | /etc/openvibe/wiki.env | 32a26ef | /var/lib/openvibe-wiki/wiki.db |
+| blog | OpenVibe.Blog | live | http 4810 | openvibe-blog.service | /etc/openvibe/blog.env | 21d537c | /var/lib/openvibe-blog/blog.db |
+| news | OpenVibe.News | loopback | http 4820 | openvibe-news.service | /etc/openvibe/news.env | 8ab47a6 | /var/lib/openvibe-news/news.db |
+| reviews | OpenVibe.Reviews | loopback | http 4830 | openvibe-reviews.service | /etc/openvibe/reviews.env | 1cff36b | /var/lib/openvibe-reviews/reviews.db |
+| deals | OpenVibe.Deals | loopback | http 4840 | openvibe-deals.service | /etc/openvibe/deals.env | fa0582d | /var/lib/openvibe-deals/deals.db |
+| coupons | OpenVibe.Coupons | loopback | http 4850 | openvibe-coupons.service | /etc/openvibe/coupons.env | 64835d2 | /var/lib/openvibe-coupons/coupons.db |
+| trade | OpenVibe.Trade | loopback | http 4860 | openvibe-trade.service | /etc/openvibe/trade.env | 4658447 | /var/lib/openvibe-trade/trade.db |
+| codes | OpenVibe.Codes | live | http 4900 | openvibe-codes.service | /etc/openvibe/codes.env | d78de70 | /var/lib/openvibe-codes/codes.db |
+| host | OpenVibe.Host | loopback | http 4910 | openvibe-host.service, openvibe-backup.timer, openvibe-backup.service | /etc/openvibe/host.env | 2b63389 | /var/lib/openvibe-host-api/host.db |
| examples | OpenVibe.Examples | sample | | - | - | - | none |
| examples | OpenVibe.Examples | sample | | - | - | - | 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 | 8caa540 | 8caa540 | 210 | 74897 | 126 | yes | 646 | 122 | 8 | 57 | 14 |
-| OpenVibe.Network | a7b99c7 | a7b99c7 | 93 | 18495 | 60 | yes | 303 | 52 | 0 | 12 | 3 |
-| OpenVibe.Shared | dbf9d39 | dbf9d39 | 57 | 15053 | 34 | yes | 2 | 2 | 0 | 7 | 0 |
-| OpenVibe.Media | b7fbe65 | b7fbe65 | 73 | 19538 | 56 | yes | 140 | 28 | 0 | 16 | 0 |
-| OpenVibe.Tools | 168e511 | 168e511 | 173 | 30080 | 49 | yes | 124 | 6 | 0 | 18 | 0 |
-| OpenVibe.Community | 19441aa | 19441aa | 63 | 11502 | 48 | yes | 180 | 33 | 0 | 9 | 0 |
-| OpenVibe.Games | b207e78 | b207e78 | 122 | 23563 | 76 | yes | 29 | 12 | 2 | 4 | 0 |
-| OpenVibe.Sites | 3802ee3 | 3802ee3 | 1 | 540 | 1 | yes | 0 | 0 | 0 | 0 | 0 |
-| OpenVibe.Events | eb98f8c | eb98f8c | 18 | 3024 | 14 | yes | 18 | 7 | 0 | 3 | 0 |
-| OpenVibe.Chat | 739d3a1 | 739d3a1 | 50 | 16372 | 35 | yes | 121 | 41 | 2 | 12 | 0 |
-| OpenRe.Stream | b34dcd6 | b34dcd6 | 35 | 4753 | 19 | yes | 38 | 13 | 0 | 2 | 0 |
-| OpenVibe.Billing | 180e246 | 180e246 | 37 | 5325 | 21 | yes | 56 | 19 | 0 | 3 | 0 |
-| OpenVibe.Tips | 1d558c5 | 1d558c5 | 29 | 5267 | 16 | yes | 62 | 17 | 0 | 3 | 0 |
-| OpenVibe.VIP | 4ddf723 | 4ddf723 | 29 | 4211 | 13 | yes | 44 | 13 | 0 | 2 | 0 |
-| OpenVibe.AI | c3ee605 | c3ee605 | 38 | 6339 | 20 | yes | 52 | 18 | 0 | 4 | 0 |
-| OpenVibe.Search | b00aa4c | b00aa4c | 17 | 2787 | 13 | yes | 21 | 11 | 0 | 4 | 0 |
-| OpenVibe.Sources | 29cd386 | 29cd386 | 23 | 2980 | 10 | yes | 16 | 8 | 0 | 4 | 0 |
-| OpenVibe.Wiki | 38a17bd | 38a17bd | 21 | 4421 | 28 | yes | 76 | 10 | 0 | 3 | 0 |
-| OpenVibe.Blog | 79e9e15 | 79e9e15 | 33 | 5037 | 23 | yes | 59 | 10 | 0 | 3 | 0 |
-| OpenVibe.News | 0860cf2 | 0860cf2 | 33 | 5103 | 18 | yes | 51 | 13 | 0 | 1 | 0 |
-| OpenVibe.Reviews | cfc37ac | cfc37ac | 22 | 4649 | 16 | yes | 70 | 14 | 0 | 2 | 0 |
-| OpenVibe.Deals | 99bd438 | 99bd438 | 35 | 4845 | 16 | yes | 58 | 15 | 0 | 1 | 0 |
-| OpenVibe.Coupons | 348f585 | 348f585 | 28 | 4155 | 15 | yes | 46 | 12 | 0 | 2 | 0 |
-| OpenVibe.Trade | fa38288 | fa38288 | 36 | 4431 | 15 | yes | 7 | 10 | 0 | 2 | 0 |
-| OpenVibe.Codes | 0bfdf70 | 0bfdf70 | 29 | 4803 | 27 | yes | 105 | 7 | 0 | 0 | 0 |
-| OpenVibe.Host | 7514789 | 7514789 | 60 | 9185 | 38 | yes | 57 | 11 | 0 | 1 | 0 |
-| OpenVibe.Examples | 36901ff | 36901ff | 11 | 1604 | 16 | yes | 0 | 1 | 0 | 0 | 0 |
+| OpenVibe.Live | 03f49b7 | 03f49b7 | 221 | 75126 | 158 | yes | 648 | 126 | 8 | 57 | 14 |
+| OpenVibe.Network | 5a50c12 | 5a50c12 | 103 | 21114 | 77 | yes | 355 | 70 | 0 | 14 | 3 |
+| OpenVibe.Shared | b5a9bd7 | b5a9bd7 | 58 | 15503 | 39 | yes | 2 | 2 | 0 | 8 | 0 |
+| OpenVibe.Media | 14cac06 | 14cac06 | 79 | 20861 | 67 | yes | 144 | 34 | 0 | 16 | 0 |
+| OpenVibe.Tools | 4f4ed6e | 4f4ed6e | 176 | 30522 | 61 | yes | 125 | 7 | 0 | 18 | 0 |
+| OpenVibe.Community | 2da3501 | 2da3501 | 66 | 12037 | 61 | yes | 180 | 35 | 0 | 9 | 0 |
+| OpenVibe.Games | eb2d008 | eb2d008 | 126 | 24425 | 82 | yes | 29 | 13 | 2 | 4 | 0 |
+| OpenVibe.Sites | 304e8b1 | 304e8b1 | 1 | 555 | 2 | yes | 0 | 0 | 0 | 0 | 0 |
+| OpenVibe.Events | 19919ec | 19919ec | 20 | 3357 | 22 | yes | 18 | 8 | 0 | 4 | 0 |
+| OpenVibe.Chat | d87c8d3 | d87c8d3 | 53 | 16898 | 48 | yes | 121 | 42 | 2 | 12 | 0 |
+| OpenRe.Stream | c77ec2a | c77ec2a | 36 | 4806 | 21 | yes | 38 | 13 | 0 | 2 | 0 |
+| OpenVibe.Billing | f24684b | f24684b | 38 | 5452 | 22 | yes | 56 | 19 | 0 | 3 | 0 |
+| OpenVibe.Tips | 13986b5 | 13986b5 | 30 | 5346 | 17 | yes | 62 | 17 | 0 | 3 | 0 |
+| OpenVibe.VIP | 95b3e19 | 95b3e19 | 30 | 4293 | 14 | yes | 44 | 13 | 0 | 2 | 0 |
+| OpenVibe.AI | 6c8b833 | 6c8b833 | 44 | 7919 | 26 | yes | 58 | 19 | 0 | 4 | 0 |
+| OpenVibe.Search | e8511d8 | e8511d8 | 18 | 2868 | 14 | yes | 21 | 11 | 0 | 4 | 0 |
+| OpenVibe.Sources | 1670853 | 1670853 | 24 | 3100 | 13 | yes | 16 | 8 | 0 | 4 | 0 |
+| OpenVibe.Wiki | 3302540 | 3302540 | 23 | 4751 | 35 | yes | 76 | 10 | 0 | 3 | 0 |
+| OpenVibe.Blog | 8a7f8eb | 8a7f8eb | 34 | 5185 | 29 | yes | 64 | 10 | 0 | 3 | 0 |
+| OpenVibe.News | 97dae43 | 97dae43 | 34 | 5251 | 19 | yes | 51 | 13 | 0 | 1 | 0 |
+| OpenVibe.Reviews | c87b344 | c87b344 | 23 | 4792 | 17 | yes | 70 | 14 | 0 | 2 | 0 |
+| OpenVibe.Deals | 533450f | 533450f | 36 | 4980 | 17 | yes | 58 | 15 | 0 | 1 | 0 |
+| OpenVibe.Coupons | b91cd79 | b91cd79 | 29 | 4289 | 16 | yes | 46 | 12 | 0 | 2 | 0 |
+| OpenVibe.Trade | 273bce7 | 273bce7 | 37 | 4562 | 16 | yes | 7 | 10 | 0 | 2 | 0 |
+| OpenVibe.Codes | 7d6f65a | 7d6f65a | 32 | 5091 | 34 | yes | 107 | 7 | 0 | 0 | 0 |
+| OpenVibe.Host | 6d2aaaa | 6d2aaaa | 68 | 11899 | 48 | yes | 57 | 11 | 0 | 1 | 0 |
+| OpenVibe.Examples | 92eb7c3 | 92eb7c3 | 11 | 1604 | 16 | yes | 0 | 1 | 0 | 0 | 0 |
LOC counts non-test source files in the scanned directories only (`server/`, `apps/`, `packages/`), not frontend assets.
LOC counts non-test source files in the scanned directories only (`server/`, `apps/`, `packages/`), not frontend assets.
@@ -76,39 +76,39 @@ LOC counts non-test source files in the scanned directories only (`server/`, `ap
@@ -76,39 +76,39 @@ LOC counts non-test source files in the scanned directories only (`server/`, `ap
|---|---|---|---|---|---|
|---|---|---|---|---|---|
| AFResume | PUBLIC | - | 2026-09-26 | 23430 KB | AlexFrison.net |
| AFResume | PUBLIC | - | 2026-09-26 | 23430 KB | AlexFrison.net |
| BreakRoomSimulator | PUBLIC | - | 2026-09-21 | 2517 KB | Simulator.Rest - The most realistic break room simulator to ever exist |
| BreakRoomSimulator | PUBLIC | - | 2026-09-21 | 2517 KB | Simulator.Rest - The most realistic break room simulator to ever exist |
-| OpenRe.Stream | PUBLIC | alpha | 2026-09-26 | 413 KB | Ingest and restream: stream definitions, keys, sessions, transport workers, outputs and output health. |
-| OpenVibe.AI | PUBLIC | alpha | 2026-09-26 | 526 KB | Providers, models, routing, prompt templates, workflows, runs, citations, cache and quotas for every product. |
-| OpenVibe.Billing | PUBLIC | alpha | 2026-09-26 | 591 KB | The isolated money ledger: providers, receipts, subscriptions, entitlements, refunds and payouts. |
-| OpenVibe.Blog | PUBLIC | alpha | 2026-09-26 | 667 KB | The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds. |
-| OpenVibe.Chat | PUBLIC | alpha | 2026-09-26 | 842 KB | Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation. |
-| OpenVibe.Codes | PUBLIC | alpha | 2026-09-26 | 706 KB | The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance. |
-| OpenVibe.Community | PUBLIC | - | 2026-09-26 | 1474 KB | |
-| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-26 | 2738 KB | Machine-readable contracts for the whole OpenVibe network. |
-| OpenVibe.Coupons | PUBLIC | alpha | 2026-09-26 | 408 KB | Coupon codes with merchant matching, restrictions, expiry and real-people validity reports. |
-| OpenVibe.Deals | PUBLIC | alpha | 2026-09-26 | 445 KB | Deals submitted and voted on by the community, with source, price and freshness always shown. |
-| OpenVibe.Events | PUBLIC | alpha | 2026-09-26 | 388 KB | Durable events, subscriptions, delivery, retry, dead letters and replay for the network. |
-| OpenVibe.Examples | PUBLIC | alpha | 2026-09-26 | 320 KB | Executable public integration examples, tested in CI against the platform. |
+| OpenRe.Stream | PUBLIC | alpha | 2026-09-28 | 433 KB | Ingest and restream: stream definitions, keys, sessions, transport workers, outputs and output health. |
+| OpenVibe.AI | PUBLIC | alpha | 2026-09-28 | 1033 KB | Providers, models, routing, prompt templates, workflows, runs, citations, cache and quotas for every product. |
+| OpenVibe.Billing | PUBLIC | alpha | 2026-09-28 | 597 KB | The isolated money ledger: providers, receipts, subscriptions, entitlements, refunds and payouts. |
+| OpenVibe.Blog | PUBLIC | alpha | 2026-09-28 | 722 KB | The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds. |
+| OpenVibe.Chat | PUBLIC | alpha | 2026-09-28 | 977 KB | Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation. |
+| OpenVibe.Codes | PUBLIC | alpha | 2026-09-28 | 814 KB | The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance. |
+| OpenVibe.Community | PUBLIC | alpha | 2026-09-28 | 1778 KB | |
+| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-28 | 3315 KB | Machine-readable contracts for the whole OpenVibe network. |
+| OpenVibe.Coupons | PUBLIC | alpha | 2026-09-28 | 462 KB | Coupon codes with merchant matching, restrictions, expiry and real-people validity reports. |
+| OpenVibe.Deals | PUBLIC | alpha | 2026-09-28 | 493 KB | Deals submitted and voted on by the community, with source, price and freshness always shown. |
+| OpenVibe.Events | PUBLIC | alpha | 2026-09-28 | 550 KB | Durable events, subscriptions, delivery, retry, dead letters and replay for the network. |
+| OpenVibe.Examples | PUBLIC | alpha | 2026-09-28 | 320 KB | Executable public integration examples, tested in CI against the platform. |
| OpenVibe.Extensions | PUBLIC | alpha | 2026-09-25 | 58 KB | First-party client surfaces for the network: the browser helper built on Coupons' public API with scoped, revocable credentials; later the kiosk/hardware companions and any desktop client (ADR-023). |
| OpenVibe.Extensions | PUBLIC | alpha | 2026-09-25 | 58 KB | First-party client surfaces for the network: the browser helper built on Coupons' public API with scoped, revocable credentials; later the kiosk/hardware companions and any desktop client (ADR-023). |
-| OpenVibe.Games | PUBLIC | - | 2026-09-26 | 5417 KB | |
-| OpenVibe.Host | PUBLIC | alpha | 2026-09-26 | 950 KB | The network's deployment/control plane first; then isolated hosting for community sites, bots and mods. |
-| OpenVibe.Live | PUBLIC | - | 2026-09-26 | 8126 KB | |
-| OpenVibe.Media | PUBLIC | - | 2026-09-26 | 1696 KB | |
-| OpenVibe.Network | PUBLIC | - | 2026-09-26 | 2413 KB | |
-| OpenVibe.News | PUBLIC | alpha | 2026-09-26 | 447 KB | Source-backed stories: clustered coverage, cited summaries, perspectives and timelines. |
-| OpenVibe.Publishing | PUBLIC | alpha | 2026-09-26 | 247 KB | Shared publishing packages (drafts, revisions, citations, SEO gate, feeds, structured data) for Wiki, Blog, News, Reviews, Deals, Coupons and Trade. Packages only, no authority. |
+| OpenVibe.Games | PUBLIC | stable | 2026-09-28 | 5596 KB | |
+| OpenVibe.Host | PUBLIC | alpha | 2026-09-28 | 1384 KB | The network's deployment/control plane first; then isolated hosting for community sites, bots and mods. |
+| OpenVibe.Live | PUBLIC | stable | 2026-09-28 | 9109 KB | |
+| OpenVibe.Media | PUBLIC | beta | 2026-09-28 | 2022 KB | |
+| OpenVibe.Network | PUBLIC | stable | 2026-09-28 | 3416 KB | |
+| OpenVibe.News | PUBLIC | alpha | 2026-09-28 | 466 KB | Source-backed stories: clustered coverage, cited summaries, perspectives and timelines. |
+| OpenVibe.Publishing | PUBLIC | alpha | 2026-09-28 | 248 KB | Shared publishing packages (drafts, revisions, citations, SEO gate, feeds, structured data) for Wiki, Blog, News, Reviews, Deals, Coupons and Trade. Packages only, no authority. |
| OpenVibe.Realtime | PUBLIC | closed (no code) | 2026-09-25 | 16 KB | Archived: browser realtime runs in OpenVibe.Events (/realtime/stream). Decision record for ADR-005. |
| OpenVibe.Realtime | PUBLIC | closed (no code) | 2026-09-25 | 16 KB | Archived: browser realtime runs in OpenVibe.Events (/realtime/stream). Decision record for ADR-005. |
-| OpenVibe.Reviews | PUBLIC | alpha | 2026-09-26 | 503 KB | Review signals gathered across sources with provenance, entity resolution and honest aggregates. |
-| OpenVibe.SDK | PUBLIC | alpha | 2026-09-25 | 657 KB | Supported browser and server clients for the OpenVibe platform. |
-| OpenVibe.Search | PUBLIC | alpha | 2026-09-26 | 278 KB | Permission-aware, event-fed search index for the network: canonical index documents, ACL-filtered queries, deletion propagation. |
-| OpenVibe.Shared | PUBLIC | alpha | 2026-09-26 | 843 KB | Versioned UI, chrome, SEO, legal and release-client packages every OpenVibe site renders. |
-| OpenVibe.Sites | PUBLIC | - | 2026-09-26 | 741 KB | Static front pages for OpenVibe domains that are not full apps yet |
-| OpenVibe.Sources | PUBLIC | alpha | 2026-09-26 | 299 KB | Source registry and ingestion workers for the network: provenance, terms, rate limits, explicit failure states. |
-| OpenVibe.Tips | PUBLIC | alpha | 2026-09-26 | 496 KB | Creator support: tips, goals, paid messages, TTS and media requests, overlays. |
-| OpenVibe.Tools | PUBLIC | - | 2026-09-26 | 3267 KB | |
-| OpenVibe.Trade | PUBLIC | alpha | 2026-09-26 | 399 KB | Informational watchlists, sourced market context and alerts. No custody, no order execution. |
-| OpenVibe.VIP | PUBLIC | alpha | 2026-09-26 | 440 KB | Memberships: plans, perks and benefits recognised across every OpenVibe site. |
-| OpenVibe.Wiki | PUBLIC | alpha | 2026-09-26 | 598 KB | Wiki spaces with page trees, revisions, citations, media and discussion — editable together, source-backed. |
+| OpenVibe.Reviews | PUBLIC | alpha | 2026-09-28 | 501 KB | Review signals gathered across sources with provenance, entity resolution and honest aggregates. |
+| OpenVibe.SDK | PUBLIC | alpha | 2026-09-28 | 706 KB | Supported browser and server clients for the OpenVibe platform. |
+| OpenVibe.Search | PUBLIC | alpha | 2026-09-28 | 318 KB | Permission-aware, event-fed search index for the network: canonical index documents, ACL-filtered queries, deletion propagation. |
+| OpenVibe.Shared | PUBLIC | alpha | 2026-09-28 | 1084 KB | Versioned UI, chrome, SEO, legal and release-client packages every OpenVibe site renders. |
+| OpenVibe.Sites | PUBLIC | stable | 2026-09-28 | 967 KB | Static front pages for OpenVibe domains that are not full apps yet |
+| OpenVibe.Sources | PUBLIC | alpha | 2026-09-28 | 309 KB | Source registry and ingestion workers for the network: provenance, terms, rate limits, explicit failure states. |
+| OpenVibe.Tips | PUBLIC | alpha | 2026-09-28 | 563 KB | Creator support: tips, goals, paid messages, TTS and media requests, overlays. |
+| OpenVibe.Tools | PUBLIC | stable | 2026-09-28 | 2632 KB | |
+| OpenVibe.Trade | PUBLIC | alpha | 2026-09-28 | 418 KB | Informational watchlists, sourced market context and alerts. No custody, no order execution. |
+| OpenVibe.VIP | PUBLIC | alpha | 2026-09-28 | 510 KB | Memberships: plans, perks and benefits recognised across every OpenVibe site. |
+| OpenVibe.Wiki | PUBLIC | alpha | 2026-09-28 | 754 KB | Wiki spaces with page trees, revisions, citations, media and discussion — editable together, source-backed. |
| powerchat-devapp-demo | PUBLIC | - | 2026-09-23 | 200 KB | |
| powerchat-devapp-demo | PUBLIC | - | 2026-09-23 | 200 KB | |
| Source.OpenVibe.Games | PUBLIC | - | 2026-09-21 | 20385 KB | OpenVibe: Source Game |
| Source.OpenVibe.Games | PUBLIC | - | 2026-09-21 | 20385 KB | OpenVibe: Source Game |
-Collected 2026-09-26 via `gh repo list OpenVibers`.
+Collected 2026-09-28 via `gh repo list OpenVibers`.
@@ -11,42 +11,45 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -11,42 +11,45 @@ Deliverable 2: every table declared in code or present in production, with curre
| /opt/openvibe.blog/data/blog.db | 401 KB | 20 |
| /opt/openvibe.blog/data/blog.db | 401 KB | 20 |
| /opt/openvibe.community/data/community.db | 258 KB | 21 |
| /opt/openvibe.community/data/community.db | 258 KB | 21 |
| /opt/openvibe.games/data/legacy-import/world-before-20260923T184930Z.db | 193 KB | 13 |
| /opt/openvibe.games/data/legacy-import/world-before-20260923T184930Z.db | 193 KB | 13 |
-| /opt/openvibe.games/data/world.db | 508 KB | 14 |
-| /opt/openvibe.live/shared/data/analytics.db | 518.0 MB | 6 |
+| /opt/openvibe.games/data/world.db | 610 KB | 15 |
+| /opt/openvibe.live/shared/data/analytics.db | 525.4 MB | 6 |
| /opt/openvibe.live/shared/data/backups/analytics-pre-adr021-2026-09-23.db | 1.76 GB | 6 |
| /opt/openvibe.live/shared/data/backups/analytics-pre-adr021-2026-09-23.db | 1.76 GB | 6 |
| /opt/openvibe.live/shared/data/backups/live-20260926-072748.db | 284.0 MB | 161 |
| /opt/openvibe.live/shared/data/backups/live-20260926-072748.db | 284.0 MB | 161 |
| /opt/openvibe.live/shared/data/backups/live-20260926-095352.db | 284.0 MB | 161 |
| /opt/openvibe.live/shared/data/backups/live-20260926-095352.db | 284.0 MB | 161 |
| /opt/openvibe.live/shared/data/backups/live-pre-643a2e6.db | 264.7 MB | 145 |
| /opt/openvibe.live/shared/data/backups/live-pre-643a2e6.db | 264.7 MB | 145 |
+| /opt/openvibe.live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db | 284.7 MB | 162 |
| /opt/openvibe.live/shared/data/hobo.db | 0 B | 0 |
| /opt/openvibe.live/shared/data/hobo.db | 0 B | 0 |
| /opt/openvibe.live/shared/data/live-before-rs-slots-20260924T0153Z.db | 279.2 MB | 151 |
| /opt/openvibe.live/shared/data/live-before-rs-slots-20260924T0153Z.db | 279.2 MB | 151 |
-| /opt/openvibe.live/shared/data/live.db | 284.1 MB | 161 |
+| /opt/openvibe.live/shared/data/live.db | 284.7 MB | 162 |
| /opt/openvibe.live/shared/data/openvibe.db | 0 B | 0 |
| /opt/openvibe.live/shared/data/openvibe.db | 0 B | 0 |
| /opt/openvibe.live/shared/data/rs-companion.db | 8.6 MB | 33 |
| /opt/openvibe.live/shared/data/rs-companion.db | 8.6 MB | 33 |
| /opt/openvibe.media/data/backups/owner-subject-20260923.media.db | 9.5 MB | 23 |
| /opt/openvibe.media/data/backups/owner-subject-20260923.media.db | 9.5 MB | 23 |
-| /opt/openvibe.media/data/media.db | 11.5 MB | 31 |
+| /opt/openvibe.media/data/media.db | 11.7 MB | 36 |
| /opt/openvibe.media/data/reports/h15-repair-applied-20260925.media.db | 11.3 MB | 27 |
| /opt/openvibe.media/data/reports/h15-repair-applied-20260925.media.db | 11.3 MB | 27 |
+| /opt/openvibe.network/data/backups/network-pre-creator-analytics-20260926.db | 292.4 MB | 66 |
+| /opt/openvibe.network/data/backups/network-pre-follows-20260926.db | 292.1 MB | 63 |
| /opt/openvibe.network/data/network-pre-refresh-hash-2026-09-24.db | 279.1 MB | 52 |
| /opt/openvibe.network/data/network-pre-refresh-hash-2026-09-24.db | 279.1 MB | 52 |
| /opt/openvibe.network/data/network-pre-secrets-2026-09-24.db | 279.1 MB | 52 |
| /opt/openvibe.network/data/network-pre-secrets-2026-09-24.db | 279.1 MB | 52 |
-| /opt/openvibe.network/data/network.db | 290.3 MB | 57 |
+| /opt/openvibe.network/data/network.db | 302.4 MB | 75 |
| /opt/openvibe.tips/data/tips.db | 4 KB | 15 |
| /opt/openvibe.tips/data/tips.db | 4 KB | 15 |
-| /opt/openvibe.tools/apps/audio/data/analytics.db | 36.6 MB | 6 |
+| /opt/openvibe.tools/apps/audio/data/analytics.db | 36.7 MB | 6 |
| /opt/openvibe.tools/apps/audio/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/audio/data/guard.db | 37 KB | 3 |
-| /opt/openvibe.tools/apps/audio/data/jobs.db | 74 KB | 4 |
+| /opt/openvibe.tools/apps/audio/data/jobs.db | 82 KB | 5 |
| /opt/openvibe.tools/apps/docs/data/analytics.db | 1.1 MB | 6 |
| /opt/openvibe.tools/apps/docs/data/analytics.db | 1.1 MB | 6 |
| /opt/openvibe.tools/apps/docs/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/docs/data/guard.db | 37 KB | 3 |
-| /opt/openvibe.tools/apps/docs/data/jobs.db | 66 KB | 4 |
-| /opt/openvibe.tools/apps/food/data/analytics.db | 332 KB | 6 |
+| /opt/openvibe.tools/apps/docs/data/jobs.db | 82 KB | 5 |
+| /opt/openvibe.tools/apps/food/data/analytics.db | 344 KB | 6 |
| /opt/openvibe.tools/apps/food/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/food/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/gateway/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/gateway/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/gateway/data/token-revocations.db | 12 KB | 1 |
| /opt/openvibe.tools/apps/gateway/data/token-revocations.db | 12 KB | 1 |
-| /opt/openvibe.tools/apps/img/data/analytics.db | 4.7 MB | 6 |
+| /opt/openvibe.tools/apps/img/data/analytics.db | 4.8 MB | 6 |
| /opt/openvibe.tools/apps/img/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/img/data/guard.db | 37 KB | 3 |
-| /opt/openvibe.tools/apps/img/data/jobs.db | 246 KB | 4 |
-| /opt/openvibe.tools/apps/maps/data/analytics.db | 389 KB | 6 |
+| /opt/openvibe.tools/apps/img/data/jobs.db | 328 KB | 5 |
+| /opt/openvibe.tools/apps/maps/data/analytics.db | 401 KB | 6 |
| /opt/openvibe.tools/apps/maps/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/maps/data/guard.db | 37 KB | 3 |
-| /opt/openvibe.tools/apps/text/data/analytics.db | 5.8 MB | 6 |
+| /opt/openvibe.tools/apps/text/data/analytics.db | 5.9 MB | 6 |
| /opt/openvibe.tools/apps/text/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/text/data/guard.db | 37 KB | 3 |
-| /opt/openvibe.tools/apps/yt/data/analytics.db | 631 KB | 6 |
+| /opt/openvibe.tools/apps/yt/data/analytics.db | 647 KB | 6 |
| /opt/openvibe.tools/apps/yt/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/apps/yt/data/guard.db | 37 KB | 3 |
| /opt/openvibe.tools/backups/analytics-2026-09-23/audio.analytics.db | 60.3 MB | 6 |
| /opt/openvibe.tools/backups/analytics-2026-09-23/audio.analytics.db | 60.3 MB | 6 |
| /opt/openvibe.tools/backups/analytics-2026-09-23/docs.analytics.db | 1.7 MB | 6 |
| /opt/openvibe.tools/backups/analytics-2026-09-23/docs.analytics.db | 1.7 MB | 6 |
@@ -56,53 +59,54 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -56,53 +59,54 @@ Deliverable 2: every table declared in code or present in production, with curre
| /opt/openvibe.tools/backups/analytics-2026-09-23/text.analytics.db | 9.5 MB | 6 |
| /opt/openvibe.tools/backups/analytics-2026-09-23/text.analytics.db | 9.5 MB | 6 |
| /opt/openvibe.tools/backups/analytics-2026-09-23/yt.analytics.db | 975 KB | 6 |
| /opt/openvibe.tools/backups/analytics-2026-09-23/yt.analytics.db | 975 KB | 6 |
| /var/lib/openre/openre.db | 209 KB | 14 |
| /var/lib/openre/openre.db | 209 KB | 14 |
-| /var/lib/openvibe-ai/ai.db | 62.6 MB | 19 |
-| /var/lib/openvibe-billing/billing.db | 745 KB | 19 |
+| /var/lib/openvibe-ai/ai.db | 115.8 MB | 20 |
+| /var/lib/openvibe-billing/billing.db | 831 KB | 19 |
| /var/lib/openvibe-billing/live-snapshot-202609230121.db | 279.2 MB | 146 |
| /var/lib/openvibe-billing/live-snapshot-202609230121.db | 279.2 MB | 146 |
-| /var/lib/openvibe-blog/blog.db | 1.5 MB | 24 |
-| /var/lib/openvibe-chat/chat.db | 25.3 MB | 41 |
+| /var/lib/openvibe-blog/blog.db | 1.9 MB | 24 |
+| /var/lib/openvibe-chat/chat.db | 25.3 MB | 42 |
| /var/lib/openvibe-chat/live-snap-a.db | 279.2 MB | 147 |
| /var/lib/openvibe-chat/live-snap-a.db | 279.2 MB | 147 |
| /var/lib/openvibe-chat/live-snap-b.db | 279.2 MB | 148 |
| /var/lib/openvibe-chat/live-snap-b.db | 279.2 MB | 148 |
| /var/lib/openvibe-chat/live-snapshot-0159.db | 279.2 MB | 147 |
| /var/lib/openvibe-chat/live-snapshot-0159.db | 279.2 MB | 147 |
| /var/lib/openvibe-chat/rehearsal.db | 360 KB | 30 |
| /var/lib/openvibe-chat/rehearsal.db | 360 KB | 30 |
-| /var/lib/openvibe-codes/codes.db | 102 KB | 7 |
-| /var/lib/openvibe-community/community.db | 4.4 MB | 34 |
+| /var/lib/openvibe-codes/codes.db | 111 KB | 7 |
+| /var/lib/openvibe-community/community.db | 5.3 MB | 36 |
| /var/lib/openvibe-community/community.pre-c24-20260925T185117Z.db | 2.2 MB | 29 |
| /var/lib/openvibe-community/community.pre-c24-20260925T185117Z.db | 2.2 MB | 29 |
| /var/lib/openvibe-community/community.pre-c24b-20260925T185400Z.db | 2.2 MB | 29 |
| /var/lib/openvibe-community/community.pre-c24b-20260925T185400Z.db | 2.2 MB | 29 |
| /var/lib/openvibe-community/community.pre-c24c-20260925T185425Z.db | 2.2 MB | 29 |
| /var/lib/openvibe-community/community.pre-c24c-20260925T185425Z.db | 2.2 MB | 29 |
| /var/lib/openvibe-community/community.pre-live-comments-20260923T191345Z.db | 2.0 MB | 20 |
| /var/lib/openvibe-community/community.pre-live-comments-20260923T191345Z.db | 2.0 MB | 20 |
| /var/lib/openvibe-coupons/coupons.db | 197 KB | 14 |
| /var/lib/openvibe-coupons/coupons.db | 197 KB | 14 |
| /var/lib/openvibe-deals/deals.db | 266 KB | 19 |
| /var/lib/openvibe-deals/deals.db | 266 KB | 19 |
-| /var/lib/openvibe-events/events.db | 17.3 MB | 7 |
+| /var/lib/openvibe-events/events.db | 23.5 MB | 8 |
| /var/lib/openvibe-host-api/host.db | 160 KB | 12 |
| /var/lib/openvibe-host-api/host.db | 160 KB | 12 |
-| /var/lib/openvibe-news/news.db | 446 KB | 23 |
+| /var/lib/openvibe-news/news.db | 508 KB | 23 |
| /var/lib/openvibe-reviews/reviews.db | 311 KB | 23 |
| /var/lib/openvibe-reviews/reviews.db | 311 KB | 23 |
-| /var/lib/openvibe-search/search.db | 12.0 MB | 21 |
+| /var/lib/openvibe-search/search.db | 13.3 MB | 21 |
| /var/lib/openvibe-sources/sources.db | 106 KB | 8 |
| /var/lib/openvibe-sources/sources.db | 106 KB | 8 |
| /var/lib/openvibe-tips/tips.db | 422 KB | 19 |
| /var/lib/openvibe-tips/tips.db | 422 KB | 19 |
| /var/lib/openvibe-trade/trade.db | 229 KB | 17 |
| /var/lib/openvibe-trade/trade.db | 229 KB | 17 |
| /var/lib/openvibe-vip/vip.db | 344 KB | 15 |
| /var/lib/openvibe-vip/vip.db | 344 KB | 15 |
-| /var/lib/openvibe-wiki/wiki.db | 401 KB | 22 |
+| /var/lib/openvibe-wiki/wiki.db | 410 KB | 22 |
-## OpenVibe.Live (122)
+## OpenVibe.Live (126)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
-| ai_chatbot_configs | server/db/database.js:1807 | no | OpenVibe.AI | extract | W13 |
-| ai_timeline_cache | server/db/database.js:1326 | no | OpenVibe.AI | extract | W13 |
-| ai_usage | server/db/database.js:1284 | no | OpenVibe.AI | extract | W13 |
-| ai_viewer_log | server/db/database.js:1891 | no | OpenVibe.AI | extract | W13 |
-| ai_viewer_threads | server/db/database.js:1877 | no | OpenVibe.AI | extract | W13 |
+| account_data_events | server/auth/account-data.js:51 | no | OpenVibe.Live | keep | - |
+| ai_chatbot_configs | server/db/database.js:1802 | no | OpenVibe.AI | extract | W13 |
+| ai_timeline_cache | server/db/database.js:1321 | no | OpenVibe.AI | extract | W13 |
+| ai_usage | server/db/database.js:1279 | no | OpenVibe.AI | extract | W13 |
+| ai_viewer_log | server/db/database.js:1888 | no | OpenVibe.AI | extract | W13 |
+| ai_viewer_threads | server/db/database.js:1874 | no | OpenVibe.AI | extract | W13 |
| anon_ip_mappings | server/db/database.js:964 | no | OpenVibe.Network (policy) | extract | W1 |
| anon_ip_mappings | server/db/database.js:964 | no | OpenVibe.Network (policy) | extract | W1 |
| api_keys | server/db/schema.sql:391 | no | OpenVibe.Network (principals) / OpenVibe.Codes | extract | W1/W20 |
| api_keys | server/db/schema.sql:391 | no | OpenVibe.Network (principals) / OpenVibe.Codes | extract | W1/W20 |
| api_tokens | server/db/schema.sql:404 | no | OpenVibe.Network (principals) / OpenVibe.Codes | extract | W1/W20 |
| api_tokens | server/db/schema.sql:404 | no | OpenVibe.Network (principals) / OpenVibe.Codes | extract | W1/W20 |
-| app_state | server/db/database.js:1196 | no | OpenVibe.Live | keep | - |
-| approved_ips | server/db/database.js:2079 | no | OpenVibe.Network (policy) | extract | W1 |
+| app_state | server/db/database.js:1191 | no | OpenVibe.Live | keep | - |
+| approved_ips | server/db/database.js:2076 | no | OpenVibe.Network (policy) | extract | W1 |
| arena_beef_hype | server/arena/beef.js:58 | no | OpenVibe.Live | keep | - |
| arena_beef_hype | server/arena/beef.js:58 | no | OpenVibe.Live | keep | - |
| arena_beef_sides | server/arena/beef.js:68 | no | OpenVibe.Live | keep | - |
| arena_beef_sides | server/arena/beef.js:68 | no | OpenVibe.Live | keep | - |
| arena_beefs | server/arena/beef.js:34 | no | OpenVibe.Live | keep | - |
| arena_beefs | server/arena/beef.js:34 | no | OpenVibe.Live | keep | - |
| arena_mic_moments | server/arena/mic.js:54 | no | OpenVibe.Live | keep | - |
| arena_mic_moments | server/arena/mic.js:54 | no | OpenVibe.Live | keep | - |
-| arena_profiles | server/arena/arena-service.js:83 | no | OpenVibe.Live | keep | - |
+| arena_profiles | server/arena/arena-service.js:82 | no | OpenVibe.Live | keep | - |
| arena_trash_levels | server/arena/mic.js:31 | no | OpenVibe.Live | keep | - |
| arena_trash_levels | server/arena/mic.js:31 | no | OpenVibe.Live | keep | - |
| arena_xp_log | server/arena/mic.js:45 | no | OpenVibe.Live | keep | - |
| arena_xp_log | server/arena/mic.js:45 | no | OpenVibe.Live | keep | - |
| bans | server/db/schema.sql:418 | no | OpenVibe.Network (policy) | extract | W1 |
| bans | server/db/schema.sql:418 | no | OpenVibe.Network (policy) | extract | W1 |
@@ -110,22 +114,22 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -110,22 +114,22 @@ Deliverable 2: every table declared in code or present in production, with curre
| camera_presets | server/db/schema.sql:359 | no | OpenRe.Stream | extract | W7 |
| camera_presets | server/db/schema.sql:359 | no | OpenRe.Stream | extract | W7 |
| camera_profiles | server/db/schema.sql:339 | no | OpenRe.Stream | extract | W7 |
| camera_profiles | server/db/schema.sql:339 | no | OpenRe.Stream | extract | W7 |
| cameras | server/db/schema.sql:133 | no | OpenRe.Stream | extract | W7 |
| cameras | server/db/schema.sql:133 | no | OpenRe.Stream | extract | W7 |
-| channel_ai_bots | server/db/database.js:1832 | no | OpenVibe.AI | extract | W13 |
-| channel_ai_config | server/db/database.js:1856 | no | OpenVibe.AI | extract | W13 |
-| channel_moderation_settings | server/db/database.js:1640, server/db/schema.sql:514 | no | OpenVibe.Chat | extract | W6 (remainder) |
-| channel_moderators | server/db/database.js:1623, server/db/schema.sql:499 | no | OpenVibe.Chat | extract | W6 (remainder) |
+| channel_ai_bots | server/db/database.js:1827 | no | OpenVibe.AI | extract | W13 |
+| channel_ai_config | server/db/database.js:1851 | no | OpenVibe.AI | extract | W13 |
+| channel_moderation_settings | server/db/database.js:1635, server/db/schema.sql:514 | no | OpenVibe.Chat | extract | W6 (remainder) |
+| channel_moderators | server/db/database.js:1618, server/db/schema.sql:499 | no | OpenVibe.Chat | extract | W6 (remainder) |
| channel_points | server/db/database.js:770 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| channel_points | server/db/database.js:770 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| channel_points_log | server/db/database.js:780 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| channel_points_log | server/db/database.js:780 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
-| channel_sounds | server/db/database.js:1745, server/db/schema.sql:626 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
-| channel_sounds_new | server/db/database.js:1769 | no | OpenVibe.Chat | extract | W6 (remainder) |
+| channel_sounds | server/db/database.js:1740, server/db/schema.sql:626 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
+| channel_sounds_new | server/db/database.js:1764 | no | OpenVibe.Chat | extract | W6 (remainder) |
| channels | server/db/schema.sql:26 | no | OpenVibe.Live | keep | - |
| channels | server/db/schema.sql:26 | no | OpenVibe.Live | keep | - |
-| chat_ai_summaries | server/db/database.js:1338 | no | OpenVibe.Chat | extract | W6 (remainder) |
+| chat_ai_summaries | server/db/database.js:1333 | no | OpenVibe.Chat | extract | W6 (remainder) |
| chat_bridge_outbox | server/chat/chat-remote.js:94 | no | OpenVibe.Live | keep | W6 (compat) |
| chat_bridge_outbox | server/chat/chat-remote.js:94 | no | OpenVibe.Live | keep | W6 (compat) |
| chat_dual_read_stats | server/chat/chat-tables-sync.js:53 | no | OpenVibe.Chat | staged | C-04 |
| chat_dual_read_stats | server/chat/chat-tables-sync.js:53 | no | OpenVibe.Chat | staged | C-04 |
| chat_messages | server/db/schema.sql:148 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| chat_messages | server/db/schema.sql:148 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| chat_messages_new | server/db/database.js:422 | no | OpenVibe.Chat | extract | W6 (remainder) |
| chat_messages_new | server/db/database.js:422 | no | OpenVibe.Chat | extract | W6 (remainder) |
| chat_staged_outbox | server/chat/chat-tables-sync.js:46 | no | OpenVibe.Chat | staged | C-04 |
| chat_staged_outbox | server/chat/chat-tables-sync.js:46 | no | OpenVibe.Chat | staged | C-04 |
-| chat_timeline_events | server/db/database.js:1358 | no | OpenVibe.Chat | extract | W6 (remainder) |
+| chat_timeline_events | server/db/database.js:1353 | no | OpenVibe.Chat | extract | W6 (remainder) |
| clip_ai_state | server/db/database.js:275 | no | OpenVibe.AI | extract | W13 |
| clip_ai_state | server/db/database.js:275 | no | OpenVibe.AI | extract | W13 |
| clips | server/db/schema.sql:307 | no | OpenVibe.Media | frozen-legacy | W4 |
| clips | server/db/schema.sql:307 | no | OpenVibe.Media | frozen-legacy | W4 |
| coin_redemptions | server/db/schema.sql:690 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| coin_redemptions | server/db/schema.sql:690 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
@@ -136,39 +140,41 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -136,39 +140,41 @@ Deliverable 2: every table declared in code or present in production, with curre
| config_keys | OpenVibe.Shared/config.js:252 | no | OpenVibe.Live | keep | - |
| config_keys | OpenVibe.Shared/config.js:252 | no | OpenVibe.Live | keep | - |
| config_snapshots | OpenVibe.Shared/config.js:231 | no | OpenVibe.Live | keep | - |
| config_snapshots | OpenVibe.Shared/config.js:231 | no | OpenVibe.Live | keep | - |
| content_views | server/db/schema.sql:328 | no | OpenVibe.Live | keep | - |
| content_views | server/db/schema.sql:328 | no | OpenVibe.Live | keep | - |
-| control_config_buttons | server/db/database.js:2303 | no | OpenRe.Stream | extract | W7 |
-| control_configs | server/db/database.js:2289 | no | OpenRe.Stream | extract | W7 |
-| control_whitelist | server/db/database.js:2274 | no | OpenRe.Stream | extract | W7 |
+| control_config_buttons | server/db/database.js:2300 | no | OpenRe.Stream | extract | W7 |
+| control_configs | server/db/database.js:2286 | no | OpenRe.Stream | extract | W7 |
+| control_whitelist | server/db/database.js:2271 | no | OpenRe.Stream | extract | W7 |
| dm_blocks | server/chat/dm.js:57 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| dm_blocks | server/chat/dm.js:57 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| dm_conversations | server/chat/dm.js:21 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| dm_conversations | server/chat/dm.js:21 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| dm_messages | server/chat/dm.js:42 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| dm_messages | server/chat/dm.js:42 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| dm_participants | server/chat/dm.js:31 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| dm_participants | server/chat/dm.js:31 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| donation_goals | server/db/schema.sql:264 | no | OpenVibe.Tips | extract | W9 |
| donation_goals | server/db/schema.sql:264 | no | OpenVibe.Tips | extract | W9 |
-| easter_egg_solves | server/db/database.js:1370 | no | OpenVibe.AI | extract | W13 |
+| easter_egg_solves | server/db/database.js:1365 | no | OpenVibe.AI | extract | W13 |
| emotes | server/db/schema.sql:604 | no | OpenVibe.Chat | extract | W6 (remainder) |
| emotes | server/db/schema.sql:604 | no | OpenVibe.Chat | extract | W6 (remainder) |
-| emotes_new | server/db/database.js:1713 | no | OpenVibe.Chat | extract | W6 (remainder) |
+| emotes_new | server/db/database.js:1708 | no | OpenVibe.Chat | extract | W6 (remainder) |
+| follow_projection_revisions | server/social/network-follows.js:63 | no | OpenVibe.Live | projection | - |
| follows | server/db/schema.sql:221 | no | OpenVibe.Network | extract | W1 |
| follows | server/db/schema.sql:221 | no | OpenVibe.Network | extract | W1 |
-| hidden_relay_users | server/db/database.js:2116 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
-| ip_log | server/db/database.js:2055 | no | OpenVibe.Network (policy) | extract | W1 |
+| hidden_relay_users | server/db/database.js:2113 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
+| ip_log | server/db/database.js:2052 | no | OpenVibe.Network (policy) | extract | W1 |
| kick_channel_cache | server/db/database.js:797 | no | OpenRe.Stream | extract | W7 |
| kick_channel_cache | server/db/database.js:797 | no | OpenRe.Stream | extract | W7 |
+| lineage_unresolved | server/lineage/unresolved.js:26 | no | OpenVibe.Live | keep | - |
| linked_accounts | server/db/database.js:387 | no | OpenVibe.Network | extract | W1 |
| linked_accounts | server/db/database.js:387 | no | OpenVibe.Network | extract | W1 |
-| managed_streams | server/db/database.js:2417, server/db/schema.sql:78 | no | OpenRe.Stream | extract | W7 |
+| managed_streams | server/db/database.js:2414, server/db/schema.sql:78 | no | OpenRe.Stream | extract | W7 |
| media_request_settings | server/db/database.js:892, server/db/schema.sql:723 | no | OpenVibe.Chat | extract | W6 (remainder) |
| media_request_settings | server/db/database.js:892, server/db/schema.sql:723 | no | OpenVibe.Chat | extract | W6 (remainder) |
| media_requests | server/db/database.js:906, server/db/schema.sql:740 | no | OpenVibe.Chat | extract | W6 (remainder) |
| media_requests | server/db/database.js:906, server/db/schema.sql:740 | no | OpenVibe.Chat | extract | W6 (remainder) |
-| moderation_actions | server/db/database.js:1924 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
+| moderation_actions | server/db/database.js:1921 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| module_summary_pushes | server/auth/module-summaries.js:34 | no | OpenVibe.Live | keep | - |
| module_summary_pushes | server/auth/module-summaries.js:34 | no | OpenVibe.Live | keep | - |
| news_settings | server/news/news-service.js:47 | no | OpenVibe.Live | keep | - |
| news_settings | server/news/news-service.js:47 | no | OpenVibe.Live | keep | - |
| opencoin_admin_grants | server/monetization/opencoins.js:330 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| opencoin_admin_grants | server/monetization/opencoins.js:330 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| openre_sessions | server/openre/schema.js:21 | no | OpenVibe.Live | keep | W7 |
| openre_sessions | server/openre/schema.js:21 | no | OpenVibe.Live | keep | W7 |
-| paste_comments | server/db/database.js:2012 | no | OpenVibe.Community | frozen-legacy | W5 |
-| paste_likes | server/db/database.js:1980 | no | OpenVibe.Community | frozen-legacy | W5 |
-| pastes | server/db/database.js:1943 | no | OpenVibe.Community | frozen-legacy | W5 |
-| payment_orders | server/db/database.js:1590 | no | OpenVibe.Billing | extract | W8 (after ADR-012) |
-| pending_ip_messages | server/db/database.js:2096 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
+| paste_comments | server/db/database.js:2009 | no | OpenVibe.Community | frozen-legacy | W5 |
+| paste_likes | server/db/database.js:1977 | no | OpenVibe.Community | frozen-legacy | W5 |
+| pastes | server/db/database.js:1940 | no | OpenVibe.Community | frozen-legacy | W5 |
+| payment_orders | server/db/database.js:1585 | no | OpenVibe.Billing | extract | W8 (after ADR-012) |
+| pending_ip_messages | server/db/database.js:2093 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| platform_connections | server/db/database.js:719 | no | OpenRe.Stream | extract | W7 |
| platform_connections | server/db/database.js:719 | no | OpenRe.Stream | extract | W7 |
| powerchat_connections | server/db/database.js:741 | no | OpenVibe.Live | keep | W3 (deliveries -> Events) |
| powerchat_connections | server/db/database.js:741 | no | OpenVibe.Live | keep | W3 (deliveries -> Events) |
| powerchat_webhook_deliveries | server/db/database.js:758 | no | OpenVibe.Live | keep | W3 (deliveries -> Events) |
| powerchat_webhook_deliveries | server/db/database.js:758 | no | OpenVibe.Live | keep | W3 (deliveries -> Events) |
-| relay_users | server/db/database.js:1495 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
+| relay_users | server/db/database.js:1490 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| restream_destinations | server/db/database.js:701 | no | OpenRe.Stream | extract | W7 |
| restream_destinations | server/db/database.js:701 | no | OpenRe.Stream | extract | W7 |
| robotstreamer_integrations | server/db/database.js:615, server/db/schema.sql:58 | no | OpenRe.Stream | extract | W7 |
| robotstreamer_integrations | server/db/database.js:615, server/db/schema.sql:58 | no | OpenRe.Stream | extract | W7 |
| robotstreamer_integrations_new | server/db/database.js:666 | no | OpenRe.Stream | extract | W7 |
| robotstreamer_integrations_new | server/db/database.js:666 | no | OpenRe.Stream | extract | W7 |
@@ -178,21 +184,22 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -178,21 +184,22 @@ Deliverable 2: every table declared in code or present in production, with curre
| site_settings | server/db/database.js:356, server/db/schema.sql:557 | no | OpenVibe.Live | keep | - |
| site_settings | server/db/database.js:356, server/db/schema.sql:557 | no | OpenVibe.Live | keep | - |
| stream_analytics | server/db/schema.sql:811 | no | OpenVibe.Live | keep | - |
| stream_analytics | server/db/schema.sql:811 | no | OpenVibe.Live | keep | - |
| stream_controls | server/db/schema.sql:372 | no | OpenRe.Stream | extract | W7 |
| stream_controls | server/db/schema.sql:372 | no | OpenRe.Stream | extract | W7 |
-| stream_controls_new | server/db/database.js:2382 | no | OpenRe.Stream | extract | W7 |
-| stream_first_chats | server/db/database.js:2044 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
-| stream_memories | server/db/database.js:1210 | no | OpenVibe.AI | extract | W13 |
+| stream_controls_new | server/db/database.js:2379 | no | OpenRe.Stream | extract | W7 |
+| stream_first_chats | server/db/database.js:2041 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
+| stream_memories | server/db/database.js:1205 | no | OpenVibe.AI | extract | W13 |
| stream_recaps | server/recap/recap.js:27 | no | OpenVibe.AI | extract | W13 |
| stream_recaps | server/recap/recap.js:27 | no | OpenVibe.AI | extract | W13 |
-| stream_timeline_events | server/db/database.js:1259 | no | OpenVibe.Live | keep | - |
-| streamer_overviews | server/db/database.js:1304 | no | OpenVibe.AI | extract | W13 |
+| stream_timeline_events | server/db/database.js:1254 | no | OpenVibe.Live | keep | - |
+| streamer_overviews | server/db/database.js:1299 | no | OpenVibe.AI | extract | W13 |
| streams | server/db/schema.sql:103 | no | OpenVibe.Live | keep | - |
| streams | server/db/schema.sql:103 | no | OpenVibe.Live | keep | - |
+| subject_merges | server/auth/subject-merge.js:25 | no | OpenVibe.Live | keep | - |
| subject_projection | server/auth/subject-projection.js:52 | no | OpenVibe.Network | mirror | WS-B task 2 |
| subject_projection | server/auth/subject-projection.js:52 | no | OpenVibe.Network | mirror | WS-B task 2 |
| subscriptions | server/db/schema.sql:234 | no | OpenVibe.Billing + OpenVibe.VIP | extract | W8/W10 |
| subscriptions | server/db/schema.sql:234 | no | OpenVibe.Billing + OpenVibe.VIP | extract | W8/W10 |
| themes | server/db/schema.sql:446 | no | OpenVibe.Network | extract | W1 |
| themes | server/db/schema.sql:446 | no | OpenVibe.Network | extract | W1 |
| tips_deliveries | server/tips/delivery-routes.js:39 | no | OpenVibe.Live | keep | W9 |
| tips_deliveries | server/tips/delivery-routes.js:39 | no | OpenVibe.Live | keep | W9 |
| token_revocations | server/auth/revocations.js:19 | no | OpenVibe.Network | mirror | W1 |
| token_revocations | server/auth/revocations.js:19 | no | OpenVibe.Network | mirror | W1 |
| transactions | server/db/schema.sql:247 | no | OpenVibe.Billing | extract | W8 (after ADR-012) |
| transactions | server/db/schema.sql:247 | no | OpenVibe.Billing | extract | W8 (after ADR-012) |
-| translations | server/db/database.js:513, server/i18n/translate.js:147 | no | OpenVibe.AI | extract | W13 |
-| tts_voice_overrides | server/db/database.js:1382 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
+| translations | server/db/database.js:513, server/i18n/translate.js:148 | no | OpenVibe.AI | extract | W13 |
+| tts_voice_overrides | server/db/database.js:1377 | no | OpenVibe.Chat | mirror | W6 (done 2026-09-23) |
| user_cosmetics | server/db/schema.sql:775, server/monetization/cosmetics.js:111 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| user_cosmetics | server/db/schema.sql:775, server/monetization/cosmetics.js:111 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| user_equipped | server/db/schema.sql:787, server/monetization/cosmetics.js:120 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| user_equipped | server/db/schema.sql:787, server/monetization/cosmetics.js:120 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| user_equipped_tag | server/chat/tags.js:61 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| user_equipped_tag | server/chat/tags.js:61 | no | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
@@ -202,19 +209,25 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -202,19 +209,25 @@ Deliverable 2: every table declared in code or present in production, with curre
| username_history | server/auth/usernames.js:24 | no | OpenVibe.Network | mirror | WS-B |
| username_history | server/auth/usernames.js:24 | no | OpenVibe.Network | mirror | WS-B |
| users | server/db/schema.sql:5 | no | OpenVibe.Network | extract | W1 |
| users | server/db/schema.sql:5 | no | OpenVibe.Network | extract | W1 |
| verification_keys | server/db/database.js:367, server/db/schema.sql:568 | no | OpenVibe.Network | extract | W1 |
| verification_keys | server/db/database.js:367, server/db/schema.sql:568 | no | OpenVibe.Network | extract | W1 |
-| vibe_coding_events | server/db/database.js:2674, server/db/schema.sql:198 | no | OpenVibe.Codes | extract | W20 |
-| vibe_coding_sessions | server/db/database.js:2639, server/db/schema.sql:170 | no | OpenVibe.Codes | extract | W20 |
-| viewer_samples | server/db/database.js:3861 | no | OpenVibe.Live | keep | - |
+| vibe_coding_events | server/db/database.js:2671, server/db/schema.sql:198 | no | OpenVibe.Codes | extract | W20 |
+| vibe_coding_sessions | server/db/database.js:2636, server/db/schema.sql:170 | no | OpenVibe.Codes | extract | W20 |
+| viewer_samples | server/db/database.js:3868 | no | OpenVibe.Live | keep | - |
| viewer_snapshots | server/db/schema.sql:800 | no | OpenVibe.Live | keep | - |
| viewer_snapshots | server/db/schema.sql:800 | no | OpenVibe.Live | keep | - |
| vod_ai_state | server/db/database.js:266 | no | OpenVibe.AI | extract | W13 |
| vod_ai_state | server/db/database.js:266 | no | OpenVibe.AI | extract | W13 |
| vods | server/db/schema.sql:280 | no | OpenVibe.Media | frozen-legacy | W4 |
| vods | server/db/schema.sql:280 | no | OpenVibe.Media | frozen-legacy | W4 |
| vpn_approvals | server/db/schema.sql:434 | no | OpenVibe.Network (policy) | extract | W1 |
| vpn_approvals | server/db/schema.sql:434 | no | OpenVibe.Network (policy) | extract | W1 |
| watch_time | server/db/schema.sql:707 | no | OpenVibe.Live | keep | - |
| watch_time | server/db/schema.sql:707 | no | OpenVibe.Live | keep | - |
-## OpenVibe.Network (60)
+## OpenVibe.Network (78)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
+| account_deletion_confirmations | server/identity/account-data.js:94 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| account_deletions | server/identity/account-data.js:80 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| account_export_parts | server/identity/account-data.js:71 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| account_exports | server/identity/account-data.js:56 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| account_merge_intents | server/identity/account-merge.js:71 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| account_merges | server/identity/account-merge.js:56 | network.db | OpenVibe.Network | keep | W1 (module split) |
| admin_rate_limits | server/auth/admin-limits.js:24 | no | OpenVibe.Network | keep | W1 (module split) |
| admin_rate_limits | server/auth/admin-limits.js:24 | no | OpenVibe.Network | keep | W1 (module split) |
| analytics_daily | (prod only) | network.db | OpenVibe.Network | keep | Track O / ADR-021 |
| analytics_daily | (prod only) | network.db | OpenVibe.Network | keep | Track O / ADR-021 |
| analytics_day_salts | (prod only) | network.db | OpenVibe.Network | keep | Track O / ADR-021 |
| analytics_day_salts | (prod only) | network.db | OpenVibe.Network | keep | Track O / ADR-021 |
@@ -228,6 +241,7 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -228,6 +241,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| coin_transactions | server/db/database.js:327 | network.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| coin_transactions | server/db/database.js:327 | network.db | OpenVibe.Billing (loyalty ledger) | extract | W8 (after ADR-012) |
| config_keys | OpenVibe.Shared/config.js:252 | no | OpenVibe.Network | keep | - |
| config_keys | OpenVibe.Shared/config.js:252 | no | OpenVibe.Network | keep | - |
| config_snapshots | OpenVibe.Shared/config.js:231 | no | OpenVibe.Network | keep | - |
| config_snapshots | OpenVibe.Shared/config.js:231 | no | OpenVibe.Network | keep | - |
+| creator_streams | server/analytics/creators.js:27 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_apps | server/developer/store.js:66 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_apps | server/developer/store.js:66 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_audit | server/developer/store.js:124 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_audit | server/developer/store.js:124 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_auth_codes | server/developer/store.js:114 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_auth_codes | server/developer/store.js:114 | network.db | OpenVibe.Network | keep | W1 (module split) |
@@ -236,14 +250,20 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -236,14 +250,20 @@ Deliverable 2: every table declared in code or present in production, with curre
| dev_project_members | server/developer/store.js:57 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_project_members | server/developer/store.js:57 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_projects | server/developer/store.js:45 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_projects | server/developer/store.js:45 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_quotas | server/developer/store.js:104 | network.db | OpenVibe.Network | keep | W1 (module split) |
| dev_quotas | server/developer/store.js:104 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| dev_usage_daily | server/developer/usage.js:69 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| dev_usage_errors | server/developer/usage.js:84 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| dev_usage_windows | server/developer/usage.js:50 | network.db | OpenVibe.Network | keep | W1 (module split) |
| email_delivery_log | server/db/database.js:222 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) |
| email_delivery_log | server/db/database.js:222 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) |
| email_verification_tokens | server/db/database.js:438 | network.db | OpenVibe.Network | keep | W1 (module split) |
| email_verification_tokens | server/db/database.js:438 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| follow_import_holds | server/identity/follows.js:57 | network.db | OpenVibe.Network | keep | W1 (module split) |
| follows | server/db/database.js:306 | network.db | OpenVibe.Network | keep | W1 (module split) |
| follows | server/db/database.js:306 | network.db | OpenVibe.Network | keep | W1 (module split) |
| frame_cache | server/frame/service.js:68 | network.db | OpenVibe.Network | keep | W1 (module split) |
| frame_cache | server/frame/service.js:68 | network.db | OpenVibe.Network | keep | W1 (module split) |
| frame_hits | server/frame/service.js:70 | network.db | OpenVibe.Network | keep | W1 (module split) |
| frame_hits | server/frame/service.js:70 | network.db | OpenVibe.Network | keep | W1 (module split) |
| identity_legacy_map | server/identity/subjects.js:25 | network.db | OpenVibe.Network | keep | W1 (module split) |
| identity_legacy_map | server/identity/subjects.js:25 | network.db | OpenVibe.Network | keep | W1 (module split) |
| ip_log | server/db/database.js:145 | network.db | OpenVibe.Network | keep | W1 (module split) |
| ip_log | server/db/database.js:145 | network.db | OpenVibe.Network | keep | W1 (module split) |
| linked_accounts | server/db/database.js:124 | network.db | OpenVibe.Network | keep | W1 (module split) |
| linked_accounts | server/db/database.js:124 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| mod_principal_grants | server/identity/mod-principals.js:49 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| mod_principals | server/identity/mod-principals.js:33 | network.db | OpenVibe.Network | keep | W1 (module split) |
| moderation_audit | server/admin/moderation-audit.js:36 | network.db | OpenVibe.Network | keep | W1 (module split) |
| moderation_audit | server/admin/moderation-audit.js:36 | network.db | OpenVibe.Network | keep | W1 (module split) |
| network_event_inbox | (prod only) | network.db | OpenVibe.Network | keep | W3 |
| network_event_inbox | (prod only) | network.db | OpenVibe.Network | keep | W3 |
| network_event_outbox | (prod only) | network.db | OpenVibe.Network | keep | W3 |
| network_event_outbox | (prod only) | network.db | OpenVibe.Network | keep | W3 |
@@ -252,18 +272,23 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -252,18 +272,23 @@ Deliverable 2: every table declared in code or present in production, with curre
| oauth_clients | server/db/database.js:54 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_clients | server/db/database.js:54 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_codes | server/db/database.js:64 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_codes | server/db/database.js:64 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_tokens | server/db/database.js:78 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_tokens | server/db/database.js:78 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| operator_alerts | server/operator/alerts.js:25 | network.db | OpenVibe.Network | keep | W1 (module split) |
| password_reset_tokens | server/db/database.js:241 | network.db | OpenVibe.Network | keep | W1 (module split) |
| password_reset_tokens | server/db/database.js:241 | network.db | OpenVibe.Network | keep | W1 (module split) |
| principal_grant_changes | server/identity/grants-admin.js:38 | network.db | OpenVibe.Network | keep | W1 (module split) |
| principal_grant_changes | server/identity/grants-admin.js:38 | network.db | OpenVibe.Network | keep | W1 (module split) |
-| principal_grants | server/identity/principals.js:217 | network.db | OpenVibe.Network | keep | W1 (module split) |
-| principal_usage | server/identity/principals.js:227 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| principal_grants | server/identity/principals.js:246 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| principal_usage | server/identity/principals.js:256 | network.db | OpenVibe.Network | keep | W1 (module split) |
| push_subscriptions | server/db/database.js:380 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) |
| push_subscriptions | server/db/database.js:380 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) |
| site_settings | server/db/database.js:158 | network.db | OpenVibe.Network | keep | - |
| site_settings | server/db/database.js:158 | network.db | OpenVibe.Network | keep | - |
+| status_incident_updates | server/status/incidents.js:43 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| status_incidents | server/status/incidents.js:30 | network.db | OpenVibe.Network | keep | W1 (module split) |
| stream_live_announcements | server/notifications/stream-live.js:31 | network.db | OpenVibe.Events | extract | W3 |
| stream_live_announcements | server/notifications/stream-live.js:31 | network.db | OpenVibe.Events | extract | W3 |
+| subject_aliases | server/identity/account-merge.js:48 | network.db | OpenVibe.Network | keep | W1 (module split) |
| themes | server/db/database.js:103 | network.db | OpenVibe.Network | keep | W1 (module split) |
| themes | server/db/database.js:103 | 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:165, server/url-registry.js:7 | network.db | OpenVibe.Network | keep | W1 (module split) |
| url_registry | server/db/database.js:165, server/url-registry.js:7 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_blocks | server/identity/blocks.js:41 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_blocks | server/identity/blocks.js:41 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_effects | server/db/database.js:295 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_effects | server/db/database.js:295 | network.db | OpenVibe.Network | keep | W1 (module split) |
+| user_follows | server/identity/follows.js:42 | 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_module_retirements | server/identity/modules.js:91 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_module_retirements | server/identity/modules.js:91 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_module_revisions | server/identity/modules.js:84 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_module_revisions | server/identity/modules.js:84 | network.db | OpenVibe.Network | keep | W1 (module split) |
@@ -283,10 +308,11 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -283,10 +308,11 @@ Deliverable 2: every table declared in code or present in production, with curre
| config_keys | config.js:252 | no | OpenVibe.Shared | keep | - |
| config_keys | config.js:252 | no | OpenVibe.Shared | keep | - |
| config_snapshots | config.js:231 | no | OpenVibe.Shared | keep | - |
| config_snapshots | config.js:231 | no | OpenVibe.Shared | keep | - |
-## OpenVibe.Media (31)
+## OpenVibe.Media (37)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
+| account_data_events | server/account-data.js:32 | media.db | OpenVibe.Media | keep | W4 (object model) |
| apps | server/db/schema.sql:8 | media.db | OpenVibe.Media | keep | W4 (object model) |
| apps | server/db/schema.sql:8 | media.db | OpenVibe.Media | keep | W4 (object model) |
| assets | server/db/schema.sql:194 | media.db | OpenVibe.Media | keep | W4 (object model) |
| assets | server/db/schema.sql:194 | media.db | OpenVibe.Media | keep | W4 (object model) |
| clips | server/db/schema.sql:65 | media.db | OpenVibe.Media | keep | W4 (object model) |
| clips | server/db/schema.sql:65 | media.db | OpenVibe.Media | keep | W4 (object model) |
@@ -301,7 +327,11 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -301,7 +327,11 @@ Deliverable 2: every table declared in code or present in production, with curre
| media_jobs | server/db/schema.sql:323 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_jobs | server/db/schema.sql:323 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_locations | server/db/schema.sql:283 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_locations | server/db/schema.sql:283 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_namespaces | server/db/schema.sql:249 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_namespaces | server/db/schema.sql:249 | media.db | OpenVibe.Media | keep | W4 (object model) |
-| media_object_changes | server/db/schema.sql:436 | media.db | OpenVibe.Media | keep | W4 (object model) |
+| media_object_changes | server/db/schema.sql:480 | media.db | OpenVibe.Media | keep | W4 (object model) |
+| media_object_tier_decisions | server/db/schema.sql:458 | media.db | OpenVibe.Media | keep | W4 (object model) |
+| media_object_view_salts | server/db/schema.sql:435 | media.db | OpenVibe.Media | keep | W4 (object model) |
+| media_object_viewer_days | server/db/schema.sql:440 | media.db | OpenVibe.Media | keep | W4 (object model) |
+| media_object_views_daily | server/db/schema.sql:446 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_objects | server/db/schema.sql:215 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_objects | server/db/schema.sql:215 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_quota_reservations | server/db/schema.sql:270 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_quota_reservations | server/db/schema.sql:270 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_relationships | server/db/schema.sql:299 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_relationships | server/db/schema.sql:299 | media.db | OpenVibe.Media | keep | W4 (object model) |
@@ -310,16 +340,17 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -310,16 +340,17 @@ Deliverable 2: every table declared in code or present in production, with curre
| media_upload_parts | server/db/schema.sql:371 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_upload_parts | server/db/schema.sql:371 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_uploads | server/db/schema.sql:355 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_uploads | server/db/schema.sql:355 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_variants | server/db/schema.sql:310 | media.db | OpenVibe.Media | keep | W4 (object model) |
| media_variants | server/db/schema.sql:310 | media.db | OpenVibe.Media | keep | W4 (object model) |
-| media_verifications | server/db/schema.sql:448 | media.db | OpenVibe.Media | keep | W4 (object model) |
-| media_verify_runs | server/db/schema.sql:460 | media.db | OpenVibe.Media | keep | W4 (object model) |
+| media_verifications | server/db/schema.sql:492 | media.db | OpenVibe.Media | keep | W4 (object model) |
+| media_verify_runs | server/db/schema.sql:504 | media.db | OpenVibe.Media | keep | W4 (object model) |
| paste_comments | server/db/schema.sql:150 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
| paste_comments | server/db/schema.sql:150 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
| paste_likes | server/db/schema.sql:142 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
| paste_likes | server/db/schema.sql:142 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
| pastes | server/db/schema.sql:108 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
| pastes | server/db/schema.sql:108 | media.db | OpenVibe.Community | frozen-legacy | W5 (done 2026-09-22) |
| search_doc_pushes | (prod only) | media.db | ? | investigate | W0 |
| search_doc_pushes | (prod only) | media.db | ? | investigate | W0 |
+| subject_merges | server/subject-merge.js:13 | no | OpenVibe.Media | keep | W4 (object model) |
| token_revocations | (prod only) | media.db | ? | investigate | W0 |
| token_revocations | (prod only) | media.db | ? | investigate | W0 |
| vods | server/db/schema.sql:22 | media.db | OpenVibe.Media | keep | W4 (object model) |
| vods | server/db/schema.sql:22 | media.db | OpenVibe.Media | keep | W4 (object model) |
-## OpenVibe.Tools (13)
+## OpenVibe.Tools (14)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
@@ -335,12 +366,14 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -335,12 +366,14 @@ Deliverable 2: every table declared in code or present in production, with curre
| guard_salt | apps/_shared/guard/store.js:27 | no | OpenVibe.Tools | keep | - |
| guard_salt | apps/_shared/guard/store.js:27 | no | OpenVibe.Tools | keep | - |
| tool_job_events | apps/_shared/jobs/store.js:47 | jobs.db | OpenVibe.Tools | keep | - |
| tool_job_events | apps/_shared/jobs/store.js:47 | jobs.db | OpenVibe.Tools | keep | - |
| tool_job_references | apps/_shared/jobs/store.js:55 | jobs.db | OpenVibe.Tools | keep | - |
| tool_job_references | apps/_shared/jobs/store.js:55 | jobs.db | OpenVibe.Tools | keep | - |
+| tool_job_usage | apps/_shared/jobs/usage.js:36 | jobs.db | OpenVibe.Tools | keep | - |
| tool_jobs | apps/_shared/jobs/store.js:17 | jobs.db | OpenVibe.Tools | keep | - |
| tool_jobs | apps/_shared/jobs/store.js:17 | jobs.db | OpenVibe.Tools | keep | - |
-## OpenVibe.Community (36)
+## OpenVibe.Community (38)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
+| account_data_events | server/identity/account-data.js:32 | community.db | OpenVibe.Community | keep | W5 |
| attachments | server/db.js:267 | community.db | OpenVibe.Community | keep | W5 |
| attachments | server/db.js:267 | community.db | OpenVibe.Community | keep | W5 |
| categories | server/db.js:308 | community.db | OpenVibe.Community | keep | W5 |
| categories | server/db.js:308 | community.db | OpenVibe.Community | keep | W5 |
| comment_threads | server/db.js:150 | community.db | OpenVibe.Community | keep | W5 |
| comment_threads | server/db.js:150 | community.db | OpenVibe.Community | keep | W5 |
@@ -348,7 +381,8 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -348,7 +381,8 @@ Deliverable 2: every table declared in code or present in production, with curre
| comments | server/db.js:165 | community.db | OpenVibe.Community | keep | W5 |
| comments | server/db.js:165 | community.db | OpenVibe.Community | keep | W5 |
| community_event_inbox | (prod only) | community.db | OpenVibe.Community | keep | W3 |
| community_event_inbox | (prod only) | community.db | OpenVibe.Community | keep | W3 |
| event_outbox | (prod only) | community.db | OpenVibe.Community | keep | W3 |
| event_outbox | (prod only) | community.db | OpenVibe.Community | keep | W3 |
-| import_hold | server/db.js:425 | community.db | OpenVibe.Community | keep | W5 |
+| game_progress | server/db.js:424 | community.db | OpenVibe.Community | keep | W5 |
+| import_hold | server/db.js:431 | community.db | OpenVibe.Community | keep | W5 |
| legacy_id_map | server/db.js:138 | community.db | OpenVibe.Community | keep | W5 |
| legacy_id_map | server/db.js:138 | community.db | OpenVibe.Community | keep | W5 |
| migration_runs | server/db.js:130 | community.db | OpenVibe.Community | keep | W5 |
| migration_runs | server/db.js:130 | community.db | OpenVibe.Community | keep | W5 |
| network_blocks | server/identity/blocks.js:20 | no | OpenVibe.Community | keep | W5 |
| network_blocks | server/identity/blocks.js:20 | no | OpenVibe.Community | keep | W5 |
@@ -365,7 +399,7 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -365,7 +399,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| pulse_items | server/db.js:408 | community.db | OpenVibe.Community | keep | W5 |
| pulse_items | server/db.js:408 | community.db | OpenVibe.Community | keep | W5 |
| relay_cursors | server/db.js:385 | community.db | OpenVibe.Community | keep | W5 |
| relay_cursors | server/db.js:385 | community.db | OpenVibe.Community | keep | W5 |
| relay_deliveries | server/db.js:353 | community.db | OpenVibe.Community | keep | W5 |
| relay_deliveries | server/db.js:353 | community.db | OpenVibe.Community | keep | W5 |
-| relay_deliveries_v2 | server/db.js:554 | no | OpenVibe.Community | keep | W5 |
+| relay_deliveries_v2 | server/db.js:560 | no | OpenVibe.Community | keep | W5 |
| relay_inbound_failures | server/db.js:394 | community.db | OpenVibe.Community | keep | W5 |
| relay_inbound_failures | server/db.js:394 | community.db | OpenVibe.Community | keep | W5 |
| relay_mappings | server/db.js:338 | community.db | OpenVibe.Community | keep | W5 |
| relay_mappings | server/db.js:338 | community.db | OpenVibe.Community | keep | W5 |
| relay_message_map | server/db.js:363 | community.db | OpenVibe.Community | keep | W5 |
| relay_message_map | server/db.js:363 | community.db | OpenVibe.Community | keep | W5 |
@@ -378,10 +412,11 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -378,10 +412,11 @@ Deliverable 2: every table declared in code or present in production, with curre
| threads | server/db.js:213 | community.db | OpenVibe.Community | keep | W5 |
| threads | server/db.js:213 | community.db | OpenVibe.Community | keep | W5 |
| token_revocations | (prod only) | community.db | ? | investigate | W0 |
| token_revocations | (prod only) | community.db | ? | investigate | W0 |
-## OpenVibe.Games (14)
+## OpenVibe.Games (15)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
+| account_data_events | apps/server/src/platform/accountData.ts:47 | world.db | OpenVibe.Games | keep | W12 |
| constraints | packages/persistence/src/sqlite/sqliteStore.ts:70, packages/persistence/src/sqlite/sqliteStore.ts:184 | world.db | OpenVibe.Games | keep | W12 |
| constraints | packages/persistence/src/sqlite/sqliteStore.ts:70, packages/persistence/src/sqlite/sqliteStore.ts:184 | world.db | OpenVibe.Games | keep | W12 |
| event_outbox | (prod only) | world.db | OpenVibe.Games | keep | W3 |
| event_outbox | (prod only) | world.db | OpenVibe.Games | keep | W3 |
| guest_ips | packages/persistence/src/sqlite/sqliteStore.ts:78, packages/persistence/src/sqlite/sqliteStore.ts:229 | world.db | OpenVibe.Games | keep | W12 |
| guest_ips | packages/persistence/src/sqlite/sqliteStore.ts:78, packages/persistence/src/sqlite/sqliteStore.ts:229 | world.db | OpenVibe.Games | keep | W12 |
@@ -401,22 +436,24 @@ Deliverable 2: every table declared in code or present in production, with curre
@@ -401,22 +436,24 @@ Deliverable 2: every table declared in code or present in production, with curre
No tables.
No tables.
-## OpenVibe.Events (7)
+## OpenVibe.Events (8)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
-| app_revocations | server/store.js:90 | events.db | OpenVibe.Events | keep | W3 |
-| consumer_checkpoints | server/store.js:79 | events.db | OpenVibe.Events | keep | W3 |
-| deliveries | server/store.js:61 | events.db | OpenVibe.Events | keep | W3 |
-| events | server/store.js:24 | events.db | OpenVibe.Events | keep | W3 |
-| idempotency_receipts | server/store.js:99 | events.db | OpenVibe.Events | keep | W3 |
-| sequences | server/store.js:20 | events.db | OpenVibe.Events | keep | W3 |
-| subscriptions | server/store.js:48 | events.db | OpenVibe.Events | keep | W3 |
+| app_revocations | server/store.js:91 | events.db | OpenVibe.Events | keep | W3 |
+| app_usage | server/usage.js:40 | events.db | OpenVibe.Events | keep | W3 |
+| consumer_checkpoints | server/store.js:80 | events.db | OpenVibe.Events | keep | W3 |
+| deliveries | server/store.js:62 | events.db | OpenVibe.Events | keep | W3 |
+| events | server/store.js:25 | events.db | OpenVibe.Events | keep | W3 |
+| idempotency_receipts | server/store.js:100 | events.db | OpenVibe.Events | keep | W3 |
+| sequences | server/store.js:21 | events.db | OpenVibe.Events | keep | W3 |
+| subscriptions | server/store.js:49 | events.db | OpenVibe.Events | keep | W3 |
-## OpenVibe.Chat (41)
+## OpenVibe.Chat (42)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
+| account_data_events | server/chat/account-data.js:39 | chat.db | OpenVibe.Chat | keep | W6 |
| audio_requests | server/db/schema.sql:409 | chat.db | OpenVibe.Chat | keep | W6 |
| audio_requests | server/db/schema.sql:409 | chat.db | OpenVibe.Chat | keep | W6 |
| bridge_applied | server/db/schema.sql:399 | chat.db | OpenVibe.Chat | keep | W6 |
| bridge_applied | server/db/schema.sql:399 | chat.db | OpenVibe.Chat | keep | W6 |
| bridge_refs | server/db/schema.sql:436 | chat.db | OpenVibe.Chat | keep | W6 |
| bridge_refs | server/db/schema.sql:436 | chat.db | OpenVibe.Chat | keep | W6 |
@@ -546,7 +583,7 @@ No tables.
@@ -546,7 +583,7 @@ No tables.
| vip_plans | server/db.js:51 | vip.db | OpenVibe.VIP | keep | W10 |
| vip_plans | server/db.js:51 | vip.db | OpenVibe.VIP | keep | W10 |
| vip_product_bindings | server/db.js:122 | vip.db | OpenVibe.VIP | keep | W10 |
| vip_product_bindings | server/db.js:122 | vip.db | OpenVibe.VIP | keep | W10 |
-## OpenVibe.AI (19)
+## OpenVibe.AI (20)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
|---|---|---|---|---|---|
@@ -565,6 +602,7 @@ No tables.
@@ -565,6 +602,7 @@ No tables.
| requests | server/db.js:167 | ai.db | OpenVibe.AI | keep | W13 |
| requests | server/db.js:167 | ai.db | OpenVibe.AI | keep | W13 |
| routes | server/db.js:69 | ai.db | OpenVibe.AI | keep | W13 |
| routes | server/db.js:69 | ai.db | OpenVibe.AI | keep | W13 |
| runs | server/db.js:121 | ai.db | OpenVibe.AI | keep | W13 |
| runs | server/db.js:121 | ai.db | OpenVibe.AI | keep | W13 |
+| subject_credentials | server/credentials.js:27 | ai.db | OpenVibe.AI | keep | W13 |
| templates | server/db.js:85 | ai.db | OpenVibe.AI | keep | W13 |
| templates | server/db.js:85 | ai.db | OpenVibe.AI | keep | W13 |
| usage_counters | server/db.js:248 | ai.db | OpenVibe.AI | keep | W13 |
| usage_counters | server/db.js:248 | ai.db | OpenVibe.AI | keep | W13 |
| usage_daily | server/db.js:259 | ai.db | OpenVibe.AI | keep | W13 |
| usage_daily | server/db.js:259 | ai.db | OpenVibe.AI | keep | W13 |
@@ -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/* | Stay | Elsewhere or moving |
| Repo | Routes | GET | POST | PUT/PATCH | DELETE | Other | /internal/* | Stay | Elsewhere or moving |
|---|---|---|---|---|---|---|---|---|---|
|---|---|---|---|---|---|---|---|---|---|
-| OpenVibe.Live | 646 | 322 | 225 | 50 | 48 | 1 | 102 | 359 | 287 |
-| OpenVibe.Network | 303 | 147 | 99 | 35 | 22 | 0 | 33 | 302 | 1 |
+| OpenVibe.Live | 648 | 324 | 225 | 50 | 48 | 1 | 102 | 361 | 287 |
+| OpenVibe.Network | 355 | 169 | 120 | 39 | 27 | 0 | 42 | 354 | 1 |
| OpenVibe.Shared | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 0 |
| OpenVibe.Shared | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 0 |
-| OpenVibe.Media | 140 | 66 | 52 | 6 | 16 | 0 | 2 | 122 | 18 |
-| OpenVibe.Tools | 124 | 101 | 17 | 1 | 4 | 1 | 1 | 124 | 0 |
+| OpenVibe.Media | 144 | 70 | 52 | 6 | 16 | 0 | 2 | 126 | 18 |
+| OpenVibe.Tools | 125 | 101 | 18 | 1 | 4 | 1 | 1 | 125 | 0 |
| OpenVibe.Community | 180 | 71 | 58 | 34 | 17 | 0 | 1 | 180 | 0 |
| OpenVibe.Community | 180 | 71 | 58 | 34 | 17 | 0 | 1 | 180 | 0 |
| OpenVibe.Games | 29 | 0 | 3 | 0 | 0 | 26 | 0 | 29 | 0 |
| OpenVibe.Games | 29 | 0 | 3 | 0 | 0 | 26 | 0 | 29 | 0 |
| OpenVibe.Events | 18 | 11 | 6 | 1 | 0 | 0 | 1 | 18 | 0 |
| OpenVibe.Events | 18 | 11 | 6 | 1 | 0 | 0 | 1 | 18 | 0 |
@@ -21,17 +21,17 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
@@ -21,17 +21,17 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| OpenVibe.Billing | 56 | 33 | 22 | 0 | 0 | 1 | 0 | 56 | 0 |
| OpenVibe.Billing | 56 | 33 | 22 | 0 | 0 | 1 | 0 | 56 | 0 |
| OpenVibe.Tips | 62 | 37 | 22 | 3 | 0 | 0 | 0 | 62 | 0 |
| OpenVibe.Tips | 62 | 37 | 22 | 3 | 0 | 0 | 0 | 62 | 0 |
| OpenVibe.VIP | 44 | 28 | 12 | 3 | 1 | 0 | 0 | 44 | 0 |
| OpenVibe.VIP | 44 | 28 | 12 | 3 | 1 | 0 | 0 | 44 | 0 |
-| OpenVibe.AI | 52 | 30 | 19 | 2 | 1 | 0 | 0 | 52 | 0 |
+| OpenVibe.AI | 58 | 32 | 19 | 4 | 3 | 0 | 0 | 58 | 0 |
| OpenVibe.Search | 21 | 16 | 2 | 1 | 2 | 0 | 1 | 21 | 0 |
| OpenVibe.Search | 21 | 16 | 2 | 1 | 2 | 0 | 1 | 21 | 0 |
| OpenVibe.Sources | 16 | 10 | 3 | 1 | 2 | 0 | 0 | 16 | 0 |
| OpenVibe.Sources | 16 | 10 | 3 | 1 | 2 | 0 | 0 | 16 | 0 |
| OpenVibe.Wiki | 76 | 43 | 28 | 4 | 1 | 0 | 0 | 76 | 0 |
| OpenVibe.Wiki | 76 | 43 | 28 | 4 | 1 | 0 | 0 | 76 | 0 |
-| OpenVibe.Blog | 59 | 39 | 16 | 3 | 1 | 0 | 0 | 59 | 0 |
+| OpenVibe.Blog | 64 | 39 | 21 | 3 | 1 | 0 | 0 | 64 | 0 |
| OpenVibe.News | 51 | 34 | 17 | 0 | 0 | 0 | 1 | 51 | 0 |
| OpenVibe.News | 51 | 34 | 17 | 0 | 0 | 0 | 1 | 51 | 0 |
| OpenVibe.Reviews | 70 | 34 | 31 | 2 | 3 | 0 | 0 | 70 | 0 |
| OpenVibe.Reviews | 70 | 34 | 31 | 2 | 3 | 0 | 0 | 70 | 0 |
| OpenVibe.Deals | 58 | 31 | 23 | 2 | 2 | 0 | 1 | 58 | 0 |
| OpenVibe.Deals | 58 | 31 | 23 | 2 | 2 | 0 | 1 | 58 | 0 |
| OpenVibe.Coupons | 46 | 30 | 16 | 0 | 0 | 0 | 0 | 46 | 0 |
| OpenVibe.Coupons | 46 | 30 | 16 | 0 | 0 | 0 | 0 | 46 | 0 |
| OpenVibe.Trade | 7 | 4 | 3 | 0 | 0 | 0 | 1 | 7 | 0 |
| OpenVibe.Trade | 7 | 4 | 3 | 0 | 0 | 0 | 1 | 7 | 0 |
-| OpenVibe.Codes | 105 | 60 | 44 | 0 | 0 | 1 | 0 | 105 | 0 |
+| OpenVibe.Codes | 107 | 62 | 44 | 0 | 0 | 1 | 0 | 107 | 0 |
| OpenVibe.Host | 57 | 24 | 24 | 2 | 7 | 0 | 0 | 57 | 0 |
| OpenVibe.Host | 57 | 24 | 24 | 2 | 7 | 0 | 0 | 57 | 0 |
## Route authority
## Route authority
@@ -63,83 +63,84 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -63,83 +63,84 @@ Owner = the repository whose code answers the route; target = the authority it b
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | /api/admin/admins | server/admin/routes.js:841 | | keep |
-| POST | /api/admin/admins | server/admin/routes.js:851 | | keep |
-| DELETE | /api/admin/admins/:id | server/admin/routes.js:870 | | keep |
-| GET | /api/admin/ai/explorer/:userId | server/admin/routes.js:582 | | keep |
-| GET | /api/admin/ai/overviews | server/admin/routes.js:619 | | keep |
-| GET | /api/admin/ai/status | server/admin/routes.js:571 | | keep |
-| POST | /api/admin/ai/streamer/:userId/overview | server/admin/routes.js:628 | | keep |
-| GET | /api/admin/ai/usage | server/admin/routes.js:524 | | keep |
-| POST | /api/admin/ai/viewers/:userId/:action | server/admin/routes.js:552 | | keep |
-| GET | /api/admin/ai/viewers/:userId/log | server/admin/routes.js:562 | | keep |
-| GET | /api/admin/ai/viewers/status | server/admin/routes.js:534 | | keep |
-| GET | /api/admin/analytics | server/index.js:732 | | keep |
-| GET | /api/admin/analytics/bots | server/index.js:741 | | keep |
-| GET | /api/admin/bans | server/admin/routes.js:431 | | keep |
-| POST | /api/admin/broadcast | server/index.js:853 | | keep |
-| PUT | /api/admin/channels/:id/force-nsfw | server/admin/routes.js:372 | | keep |
-| GET | /api/admin/config | server/admin/routes.js:755 | | keep |
-| GET | /api/admin/config/:namespace | server/admin/routes.js:756 | | keep |
-| GET | /api/admin/config/:namespace/history | server/admin/routes.js:757 | | keep |
-| POST | /api/admin/config/:namespace/rollback | server/admin/routes.js:758 | | keep |
-| GET | /api/admin/diagnostics | server/admin/routes.js:55 | | keep |
-| DELETE | /api/admin/media-tools/cookies | server/admin/routes.js:1296 | | keep |
-| PUT | /api/admin/media-tools/cookies | server/admin/routes.js:1215 | | keep |
-| POST | /api/admin/media-tools/cookies/check | server/admin/routes.js:1274 | | keep |
-| DELETE | /api/admin/media-tools/extra-args | server/admin/routes.js:1329 | | keep |
-| PUT | /api/admin/media-tools/extra-args | server/admin/routes.js:1310 | | keep |
-| GET | /api/admin/media-tools/status | server/admin/routes.js:1170 | | keep |
-| POST | /api/admin/media-tools/test | server/admin/routes.js:1340 | | keep |
-| GET | /api/admin/moderators | server/admin/routes.js:776 | | keep |
-| POST | /api/admin/moderators | server/admin/routes.js:788 | | keep |
-| DELETE | /api/admin/moderators/:id | server/admin/routes.js:815 | | keep |
-| GET | /api/admin/money | server/admin/routes.js:485 | | keep |
-| POST | /api/admin/money/actions/:id/resolve | server/admin/routes.js:499 | | keep |
-| POST | /api/admin/money/freeze | server/admin/routes.js:493 | | keep |
+| GET | /api/admin/admins | server/admin/routes.js:848 | | keep |
+| POST | /api/admin/admins | server/admin/routes.js:858 | | keep |
+| DELETE | /api/admin/admins/:id | server/admin/routes.js:877 | | keep |
+| GET | /api/admin/ai/explorer/:userId | server/admin/routes.js:589 | | keep |
+| GET | /api/admin/ai/overviews | server/admin/routes.js:626 | | keep |
+| GET | /api/admin/ai/status | server/admin/routes.js:578 | | keep |
+| POST | /api/admin/ai/streamer/:userId/overview | server/admin/routes.js:635 | | keep |
+| GET | /api/admin/ai/usage | server/admin/routes.js:531 | | keep |
+| POST | /api/admin/ai/viewers/:userId/:action | server/admin/routes.js:559 | | keep |
+| GET | /api/admin/ai/viewers/:userId/log | server/admin/routes.js:569 | | keep |
+| GET | /api/admin/ai/viewers/status | server/admin/routes.js:541 | | keep |
+| GET | /api/admin/analytics | server/index.js:745 | | keep |
+| GET | /api/admin/analytics/bots | server/index.js:754 | | keep |
+| GET | /api/admin/bans | server/admin/routes.js:438 | | keep |
+| POST | /api/admin/broadcast | server/index.js:866 | | keep |
+| PUT | /api/admin/channels/:id/force-nsfw | server/admin/routes.js:379 | | keep |
+| GET | /api/admin/config | server/admin/routes.js:762 | | keep |
+| GET | /api/admin/config/:namespace | server/admin/routes.js:763 | | keep |
+| GET | /api/admin/config/:namespace/history | server/admin/routes.js:764 | | keep |
+| POST | /api/admin/config/:namespace/rollback | server/admin/routes.js:765 | | keep |
+| GET | /api/admin/diagnostics | server/admin/routes.js:62 | | keep |
+| GET | /api/admin/lineage/unresolved | server/admin/routes.js:56 | | keep |
+| DELETE | /api/admin/media-tools/cookies | server/admin/routes.js:1302 | | keep |
+| PUT | /api/admin/media-tools/cookies | server/admin/routes.js:1221 | | keep |
+| POST | /api/admin/media-tools/cookies/check | server/admin/routes.js:1280 | | keep |
+| DELETE | /api/admin/media-tools/extra-args | server/admin/routes.js:1335 | | keep |
+| PUT | /api/admin/media-tools/extra-args | server/admin/routes.js:1316 | | keep |
+| GET | /api/admin/media-tools/status | server/admin/routes.js:1176 | | keep |
+| POST | /api/admin/media-tools/test | server/admin/routes.js:1346 | | keep |
+| GET | /api/admin/moderators | server/admin/routes.js:783 | | keep |
+| POST | /api/admin/moderators | server/admin/routes.js:795 | | keep |
+| DELETE | /api/admin/moderators/:id | server/admin/routes.js:822 | | keep |
+| GET | /api/admin/money | server/admin/routes.js:492 | | keep |
+| POST | /api/admin/money/actions/:id/resolve | server/admin/routes.js:506 | | keep |
+| POST | /api/admin/money/freeze | server/admin/routes.js:500 | | keep |
| PUT | /api/admin/openre/managed/:id/ingest-authority | server/openre/routes.js:35 | | keep |
| PUT | /api/admin/openre/managed/:id/ingest-authority | server/openre/routes.js:35 | | keep |
| GET | /api/admin/openre/status | server/openre/routes.js:18 | | keep |
| GET | /api/admin/openre/status | server/openre/routes.js:18 | | keep |
-| GET | /api/admin/settings | server/admin/routes.js:512 | | keep |
-| PUT | /api/admin/settings | server/admin/routes.js:647 | | keep |
-| DELETE | /api/admin/settings/:key | server/admin/routes.js:732 | | keep |
-| PUT | /api/admin/settings/:key | server/admin/routes.js:712 | | keep |
-| GET | /api/admin/stats | server/admin/routes.js:67 | | keep |
-| GET | /api/admin/storage | server/admin/routes.js:1014 | | keep |
-| DELETE | /api/admin/storage/clips/bulk | server/admin/routes.js:1120 | | keep |
-| GET | /api/admin/storage/vods | server/admin/routes.js:1070 | | keep |
-| DELETE | /api/admin/storage/vods/bulk | server/admin/routes.js:1089 | | keep |
-| GET | /api/admin/streams | server/admin/routes.js:307 | | keep |
-| DELETE | /api/admin/streams/:id | server/admin/routes.js:326 | | keep |
-| PUT | /api/admin/streams/:id/nsfw | server/admin/routes.js:420 | | keep |
-| GET | /api/admin/users | server/admin/routes.js:121 | | keep |
-| PUT | /api/admin/users/:id | server/admin/routes.js:160 | | keep |
-| DELETE | /api/admin/users/:id/ban | server/admin/routes.js:288 | | keep |
-| POST | /api/admin/users/:id/ban | server/admin/routes.js:250 | | keep |
-| PUT | /api/admin/users/:id/force-vod-recording | server/admin/routes.js:389 | | keep |
-| GET | /api/admin/verification-keys | server/admin/routes.js:892 | | keep |
-| POST | /api/admin/verification-keys | server/admin/routes.js:902 | | keep |
-| DELETE | /api/admin/verification-keys/:id | server/admin/routes.js:945 | | keep |
-| GET | /api/admin/vpn-queue | server/admin/routes.js:447 | | keep |
-| PUT | /api/admin/vpn-queue/:id | server/admin/routes.js:463 | | keep |
-| POST | /api/ai-viewers/${cmd} | server/ai/viewers/routes.js:117 | | keep |
-| DELETE | /api/ai-viewers/bots/:id | server/ai/viewers/routes.js:220 | | keep |
-| PATCH | /api/ai-viewers/bots/:id | server/ai/viewers/routes.js:185 | | keep |
-| POST | /api/ai-viewers/bots/:id/clear-memory | server/ai/viewers/routes.js:209 | | keep |
-| POST | /api/ai-viewers/bots/:id/mute | server/ai/viewers/routes.js:122 | | keep |
-| POST | /api/ai-viewers/bots/:id/unmute | server/ai/viewers/routes.js:123 | | keep |
-| POST | /api/ai-viewers/byo/test | server/ai/viewers/routes.js:124 | | keep |
-| POST | /api/ai-viewers/clone | server/ai/viewers/routes.js:233 | | keep |
-| GET | /api/ai-viewers/config | server/ai/viewers/routes.js:82 | | keep |
-| PUT | /api/ai-viewers/config | server/ai/viewers/routes.js:134 | | keep |
-| GET | /api/ai-viewers/log | server/ai/viewers/routes.js:106 | | keep |
-| POST | /api/ai-viewers/preview | server/ai/viewers/routes.js:282 | | keep |
-| GET | /api/ai-viewers/roster | server/ai/viewers/routes.js:167 | | keep |
-| GET | /api/ai-viewers/status | server/ai/viewers/routes.js:99 | | keep |
-| GET | /api/ai-viewers/threads | server/ai/viewers/routes.js:112 | | keep |
+| GET | /api/admin/settings | server/admin/routes.js:519 | | keep |
+| PUT | /api/admin/settings | server/admin/routes.js:654 | | keep |
+| DELETE | /api/admin/settings/:key | server/admin/routes.js:739 | | keep |
+| PUT | /api/admin/settings/:key | server/admin/routes.js:719 | | keep |
+| GET | /api/admin/stats | server/admin/routes.js:74 | | keep |
+| GET | /api/admin/storage | server/admin/routes.js:1021 | | keep |
+| DELETE | /api/admin/storage/clips/bulk | server/admin/routes.js:1127 | | keep |
+| GET | /api/admin/storage/vods | server/admin/routes.js:1077 | | keep |
+| DELETE | /api/admin/storage/vods/bulk | server/admin/routes.js:1096 | | keep |
+| GET | /api/admin/streams | server/admin/routes.js:314 | | keep |
+| DELETE | /api/admin/streams/:id | server/admin/routes.js:333 | | keep |
+| PUT | /api/admin/streams/:id/nsfw | server/admin/routes.js:427 | | keep |
+| GET | /api/admin/users | server/admin/routes.js:128 | | keep |
+| PUT | /api/admin/users/:id | server/admin/routes.js:167 | | keep |
+| DELETE | /api/admin/users/:id/ban | server/admin/routes.js:295 | | keep |
+| POST | /api/admin/users/:id/ban | server/admin/routes.js:257 | | keep |
+| PUT | /api/admin/users/:id/force-vod-recording | server/admin/routes.js:396 | | keep |
+| GET | /api/admin/verification-keys | server/admin/routes.js:899 | | keep |
+| POST | /api/admin/verification-keys | server/admin/routes.js:909 | | keep |
+| DELETE | /api/admin/verification-keys/:id | server/admin/routes.js:952 | | keep |
+| GET | /api/admin/vpn-queue | server/admin/routes.js:454 | | keep |
+| PUT | /api/admin/vpn-queue/:id | server/admin/routes.js:470 | | keep |
+| POST | /api/ai-viewers/${cmd} | server/ai/viewers/routes.js:118 | | keep |
+| DELETE | /api/ai-viewers/bots/:id | server/ai/viewers/routes.js:238 | | keep |
+| PATCH | /api/ai-viewers/bots/:id | server/ai/viewers/routes.js:203 | | keep |
+| POST | /api/ai-viewers/bots/:id/clear-memory | server/ai/viewers/routes.js:227 | | keep |
+| POST | /api/ai-viewers/bots/:id/mute | server/ai/viewers/routes.js:123 | | keep |
+| POST | /api/ai-viewers/bots/:id/unmute | server/ai/viewers/routes.js:124 | | keep |
+| POST | /api/ai-viewers/byo/test | server/ai/viewers/routes.js:125 | | keep |
+| POST | /api/ai-viewers/clone | server/ai/viewers/routes.js:251 | | keep |
+| GET | /api/ai-viewers/config | server/ai/viewers/routes.js:83 | | keep |
+| PUT | /api/ai-viewers/config | server/ai/viewers/routes.js:145 | | keep |
+| GET | /api/ai-viewers/log | server/ai/viewers/routes.js:107 | | keep |
+| POST | /api/ai-viewers/preview | server/ai/viewers/routes.js:300 | | keep |
+| GET | /api/ai-viewers/roster | server/ai/viewers/routes.js:185 | | keep |
+| GET | /api/ai-viewers/status | server/ai/viewers/routes.js:100 | | keep |
+| GET | /api/ai-viewers/threads | server/ai/viewers/routes.js:113 | | keep |
| GET | /api/analytics/channel/:username | server/streaming/analytics-routes.js:23 | | keep |
| GET | /api/analytics/channel/:username | server/streaming/analytics-routes.js:23 | | keep |
-| GET | /api/analytics/channel/:username/dashboard | server/streaming/analytics-routes.js:157 | | keep |
-| GET | /api/analytics/channel/:username/streams | server/streaming/analytics-routes.js:58 | | keep |
-| GET | /api/analytics/stream/:id | server/streaming/analytics-routes.js:97 | | keep |
+| GET | /api/analytics/channel/:username/dashboard | server/streaming/analytics-routes.js:158 | | keep |
+| GET | /api/analytics/channel/:username/streams | server/streaming/analytics-routes.js:59 | | keep |
+| GET | /api/analytics/stream/:id | server/streaming/analytics-routes.js:98 | | keep |
| POST | /api/arena/backfill | server/arena/routes.js:80 | | keep |
| POST | /api/arena/backfill | server/arena/routes.js:80 | | keep |
| GET | /api/arena/beefs | server/arena/routes.js:112 | | keep |
| GET | /api/arena/beefs | server/arena/routes.js:112 | | keep |
| GET | /api/arena/beefs/:id | server/arena/routes.js:113 | | keep |
| GET | /api/arena/beefs/:id | server/arena/routes.js:113 | | keep |
@@ -189,13 +190,13 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -189,13 +190,13 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/channels/moderation/mine | server/admin/channel-mod-routes.js:51 | OpenVibe.Chat | extract |
| GET | /api/channels/moderation/mine | server/admin/channel-mod-routes.js:51 | OpenVibe.Chat | extract |
| GET | /api/chat-ai/anon/:anonId | server/ai/chat-ai-routes.js:83 | | keep |
| GET | /api/chat-ai/anon/:anonId | server/ai/chat-ai-routes.js:83 | | keep |
| GET | /api/chat-ai/global | server/ai/chat-ai-routes.js:14 | | keep |
| GET | /api/chat-ai/global | server/ai/chat-ai-routes.js:14 | | keep |
-| GET | /api/chat-ai/live-captions/:username | server/ai/chat-ai-routes.js:236 | | keep |
+| GET | /api/chat-ai/live-captions/:username | server/ai/chat-ai-routes.js:235 | | keep |
| GET | /api/chat-ai/relay/:platform/:username | server/ai/chat-ai-routes.js:95 | | keep |
| GET | /api/chat-ai/relay/:platform/:username | server/ai/chat-ai-routes.js:95 | | keep |
| GET | /api/chat-ai/timeline | server/ai/chat-ai-routes.js:24 | | keep |
| GET | /api/chat-ai/timeline | server/ai/chat-ai-routes.js:24 | | keep |
-| GET | /api/chat-ai/timeline/:username | server/ai/chat-ai-routes.js:174 | | keep |
-| GET | /api/chat-ai/transcript/:streamId | server/ai/chat-ai-routes.js:335 | | keep |
+| GET | /api/chat-ai/timeline/:username | server/ai/chat-ai-routes.js:173 | | keep |
+| GET | /api/chat-ai/transcript/:streamId | server/ai/chat-ai-routes.js:334 | | keep |
| GET | /api/chat-ai/user/:id | server/ai/chat-ai-routes.js:39 | | keep |
| GET | /api/chat-ai/user/:id | server/ai/chat-ai-routes.js:39 | | keep |
-| GET | /api/chat-ai/vod-transcripts | server/ai/chat-ai-routes.js:273 | | keep |
+| GET | /api/chat-ai/vod-transcripts | server/ai/chat-ai-routes.js:272 | | keep |
| GET | /api/chat/:streamId/history | server/chat/routes.js:489 | OpenVibe.Chat | shadowed |
| GET | /api/chat/:streamId/history | server/chat/routes.js:489 | OpenVibe.Chat | shadowed |
| GET | /api/chat/:streamId/replay | server/chat/routes.js:467 | OpenVibe.Chat | shadowed |
| GET | /api/chat/:streamId/replay | server/chat/routes.js:467 | OpenVibe.Chat | shadowed |
| GET | /api/chat/:streamId/users | server/chat/routes.js:613 | OpenVibe.Chat | shadowed |
| GET | /api/chat/:streamId/users | server/chat/routes.js:613 | OpenVibe.Chat | shadowed |
@@ -217,18 +218,18 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -217,18 +218,18 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/chat/send | server/chat/routes.js:209 | OpenVibe.Chat | shadowed |
| POST | /api/chat/send | server/chat/routes.js:209 | OpenVibe.Chat | shadowed |
| GET | /api/chat/user/:userId/history | server/chat/routes.js:341 | OpenVibe.Chat | shadowed |
| GET | /api/chat/user/:userId/history | server/chat/routes.js:341 | OpenVibe.Chat | shadowed |
| GET | /api/chat/user/:username/profile | server/chat/routes.js:360 | OpenVibe.Chat | shadowed |
| GET | /api/chat/user/:username/profile | server/chat/routes.js:360 | OpenVibe.Chat | shadowed |
-| GET | /api/clips | server/media-proxy/clips.js:181 | OpenVibe.Media | adapter |
-| DELETE | /api/clips/:id | server/media-proxy/clips.js:358 | OpenVibe.Media | adapter |
-| GET | /api/clips/:id | server/media-proxy/clips.js:210 | OpenVibe.Media | adapter |
-| GET | /api/clips/:id/job | server/media-proxy/clips.js:396 | OpenVibe.Media | adapter |
-| POST | /api/clips/:id/recut | server/media-proxy/clips.js:377 | OpenVibe.Media | adapter |
-| PUT | /api/clips/:id/title | server/media-proxy/clips.js:292 | OpenVibe.Media | adapter |
-| PUT | /api/clips/:id/visibility | server/media-proxy/clips.js:309 | OpenVibe.Media | adapter |
-| POST | /api/clips/bulk | server/media-proxy/clips.js:333 | OpenVibe.Media | adapter |
-| GET | /api/clips/mine | server/media-proxy/clips.js:123 | OpenVibe.Media | adapter |
-| GET | /api/clips/my-stream | server/media-proxy/clips.js:141 | OpenVibe.Media | adapter |
-| GET | /api/clips/settings/channel | server/media-proxy/clips.js:159 | OpenVibe.Media | adapter |
-| PUT | /api/clips/settings/channel | server/media-proxy/clips.js:168 | OpenVibe.Media | adapter |
+| GET | /api/clips | server/media-proxy/clips.js:182 | OpenVibe.Media | adapter |
+| DELETE | /api/clips/:id | server/media-proxy/clips.js:359 | OpenVibe.Media | adapter |
+| GET | /api/clips/:id | server/media-proxy/clips.js:211 | OpenVibe.Media | adapter |
+| GET | /api/clips/:id/job | server/media-proxy/clips.js:397 | OpenVibe.Media | adapter |
+| POST | /api/clips/:id/recut | server/media-proxy/clips.js:378 | OpenVibe.Media | adapter |
+| PUT | /api/clips/:id/title | server/media-proxy/clips.js:293 | OpenVibe.Media | adapter |
+| PUT | /api/clips/:id/visibility | server/media-proxy/clips.js:310 | OpenVibe.Media | adapter |
+| POST | /api/clips/bulk | server/media-proxy/clips.js:334 | OpenVibe.Media | adapter |
+| GET | /api/clips/mine | server/media-proxy/clips.js:124 | OpenVibe.Media | adapter |
+| GET | /api/clips/my-stream | server/media-proxy/clips.js:142 | OpenVibe.Media | adapter |
+| GET | /api/clips/settings/channel | server/media-proxy/clips.js:160 | OpenVibe.Media | adapter |
+| PUT | /api/clips/settings/channel | server/media-proxy/clips.js:169 | OpenVibe.Media | adapter |
| POST | /api/coins/admin/grant | server/monetization/coins-routes.js:316 | | keep |
| POST | /api/coins/admin/grant | server/monetization/coins-routes.js:316 | | keep |
| GET | /api/coins/balance | server/monetization/coins-routes.js:26 | | keep |
| GET | /api/coins/balance | server/monetization/coins-routes.js:26 | | keep |
| POST | /api/coins/bonus | server/monetization/coins-routes.js:70 | | keep |
| POST | /api/coins/bonus | server/monetization/coins-routes.js:70 | | keep |
@@ -285,7 +286,7 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -285,7 +286,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/cosmetics/internal-unlock | server/monetization/cosmetics-routes.js:87 | | keep |
| POST | /api/cosmetics/internal-unlock | server/monetization/cosmetics-routes.js:87 | | keep |
| GET | /api/cosmetics/inventory | server/monetization/cosmetics-routes.js:32 | | keep |
| GET | /api/cosmetics/inventory | server/monetization/cosmetics-routes.js:32 | | keep |
| POST | /api/cosmetics/unequip | server/monetization/cosmetics-routes.js:55 | | keep |
| POST | /api/cosmetics/unequip | server/monetization/cosmetics-routes.js:55 | | keep |
-| POST | /api/csp-report | server/index.js:874 | | keep |
+| POST | /api/csp-report | server/index.js:887 | | keep |
| GET | /api/dm/blocks | server/chat/dm-routes.js:402 | OpenVibe.Chat | shadowed |
| GET | /api/dm/blocks | server/chat/dm-routes.js:402 | OpenVibe.Chat | shadowed |
| DELETE | /api/dm/blocks/:userId | server/chat/dm-routes.js:390 | OpenVibe.Chat | shadowed |
| DELETE | /api/dm/blocks/:userId | server/chat/dm-routes.js:390 | OpenVibe.Chat | shadowed |
| POST | /api/dm/blocks/:userId | server/chat/dm-routes.js:375 | OpenVibe.Chat | shadowed |
| POST | /api/dm/blocks/:userId | server/chat/dm-routes.js:375 | OpenVibe.Chat | shadowed |
@@ -335,7 +336,7 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -335,7 +336,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/funds/leaderboard/:streamId | server/monetization/routes.js:233 | OpenVibe.Tips | extract |
| GET | /api/funds/leaderboard/:streamId | server/monetization/routes.js:233 | OpenVibe.Tips | extract |
| POST | /api/funds/purchase | server/monetization/routes.js:42 | OpenVibe.Tips | extract |
| POST | /api/funds/purchase | server/monetization/routes.js:42 | OpenVibe.Tips | extract |
| POST | /api/funds/recycle | server/monetization/routes.js:206 | OpenVibe.Tips | extract |
| POST | /api/funds/recycle | server/monetization/routes.js:206 | OpenVibe.Tips | extract |
-| GET | /api/health | server/index.js:751 | | keep |
+| GET | /api/health | server/index.js:764 | | keep |
| GET | /api/home/digest | server/home/routes.js:444 | | keep |
| GET | /api/home/digest | server/home/routes.js:444 | | keep |
| GET | /api/home/discover | server/home/routes.js:494 | | keep |
| GET | /api/home/discover | server/home/routes.js:494 | | keep |
| GET | /api/home/featured | server/home/routes.js:231 | | keep |
| GET | /api/home/featured | server/home/routes.js:231 | | keep |
@@ -350,7 +351,7 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -350,7 +351,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/img-proxy | server/media/external-image-proxy.js:31 | | keep |
| GET | /api/img-proxy | server/media/external-image-proxy.js:31 | | keep |
| GET | /api/kiosk/favicon | server/kiosk/routes.js:150 | | keep |
| GET | /api/kiosk/favicon | server/kiosk/routes.js:150 | | keep |
| GET | /api/kiosk/site | server/kiosk/routes.js:99 | | keep |
| GET | /api/kiosk/site | server/kiosk/routes.js:99 | | keep |
-| GET | /api/live-events | server/index.js:670 | | keep |
+| GET | /api/live-events | server/index.js:683 | | keep |
| POST | /api/media/advance | server/media/routes.js:267 | | keep |
| POST | /api/media/advance | server/media/routes.js:267 | | keep |
| GET | /api/media/channel/:username | server/media/routes.js:52 | | keep |
| GET | /api/media/channel/:username | server/media/routes.js:52 | | keep |
| GET | /api/media/downloader/status | server/media/routes.js:418 | | keep |
| GET | /api/media/downloader/status | server/media/routes.js:418 | | keep |
@@ -454,7 +455,7 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -454,7 +455,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/powerchat/test-tip | server/integrations/powerchat-routes.js:350 | OpenVibe.Billing | extract |
| POST | /api/powerchat/test-tip | server/integrations/powerchat-routes.js:350 | OpenVibe.Billing | extract |
| GET | /api/powerchat/tip-link | server/integrations/powerchat-routes.js:291 | OpenVibe.Billing | extract |
| GET | /api/powerchat/tip-link | server/integrations/powerchat-routes.js:291 | OpenVibe.Billing | extract |
| POST | /api/powerchat/webhook | server/integrations/powerchat-routes.js:442 | OpenVibe.Billing | extract |
| POST | /api/powerchat/webhook | server/integrations/powerchat-routes.js:442 | OpenVibe.Billing | extract |
-| GET | /api/ready | server/index.js:792 | | keep |
+| GET | /api/ready | server/index.js:805 | | keep |
| GET | /api/recap/:streamId | server/recap/routes.js:22 | | keep |
| GET | /api/recap/:streamId | server/recap/routes.js:22 | | keep |
| POST | /api/recap/:streamId/regenerate | server/recap/routes.js:44 | | keep |
| POST | /api/recap/:streamId/regenerate | server/recap/routes.js:44 | | keep |
| GET | /api/recap/channel/:username | server/recap/routes.js:15 | | keep |
| GET | /api/recap/channel/:username | server/recap/routes.js:15 | | keep |
@@ -491,53 +492,54 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -491,53 +492,54 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/sounds/channel/:userId | server/chat/sounds-routes.js:125 | OpenVibe.Chat | shadowed |
| GET | /api/sounds/channel/:userId | server/chat/sounds-routes.js:125 | OpenVibe.Chat | shadowed |
| PATCH | /api/sounds/command | server/chat/sounds-routes.js:313 | OpenVibe.Chat | shadowed |
| PATCH | /api/sounds/command | server/chat/sounds-routes.js:313 | OpenVibe.Chat | shadowed |
| GET | /api/sounds/file/:filename | server/chat/sounds-routes.js:371 | OpenVibe.Chat | shadowed |
| GET | /api/sounds/file/:filename | server/chat/sounds-routes.js:371 | OpenVibe.Chat | shadowed |
-| GET | /api/streams | server/streaming/routes.js:1129 | | keep |
-| POST | /api/streams | server/streaming/routes.js:1960 | | keep |
-| DELETE | /api/streams/:id | server/streaming/routes.js:2155 | | keep |
-| GET | /api/streams/:id | server/streaming/routes.js:1912 | | keep |
-| PUT | /api/streams/:id | server/streaming/routes.js:2104 | | keep |
-| GET | /api/streams/:id/call | server/streaming/routes.js:2474 | | keep |
-| PUT | /api/streams/:id/call | server/streaming/routes.js:2435 | | keep |
-| GET | /api/streams/:id/endpoint | server/streaming/routes.js:2202 | | keep |
-| POST | /api/streams/:id/follow | server/streaming/routes.js:2343 | | keep |
-| POST | /api/streams/:id/heartbeat | server/streaming/routes.js:2300 | | keep |
-| GET | /api/streams/:id/rtmp-status | server/streaming/routes.js:2318 | | keep |
-| GET | /api/streams/broadcast-settings | server/streaming/routes.js:1429 | | keep |
-| PUT | /api/streams/broadcast-settings | server/streaming/routes.js:1446 | | keep |
+| GET | /api/streams | server/streaming/routes.js:1140 | | keep |
+| POST | /api/streams | server/streaming/routes.js:1971 | | keep |
+| DELETE | /api/streams/:id | server/streaming/routes.js:2166 | | keep |
+| GET | /api/streams/:id | server/streaming/routes.js:1923 | | keep |
+| PUT | /api/streams/:id | server/streaming/routes.js:2115 | | keep |
+| GET | /api/streams/:id/call | server/streaming/routes.js:2491 | | keep |
+| PUT | /api/streams/:id/call | server/streaming/routes.js:2452 | | keep |
+| GET | /api/streams/:id/endpoint | server/streaming/routes.js:2213 | | keep |
+| POST | /api/streams/:id/follow | server/streaming/routes.js:2354 | | keep |
+| POST | /api/streams/:id/heartbeat | server/streaming/routes.js:2311 | | keep |
+| GET | /api/streams/:id/rtmp-status | server/streaming/routes.js:2329 | | keep |
+| GET | /api/streams/broadcast-settings | server/streaming/routes.js:1440 | | keep |
+| PUT | /api/streams/broadcast-settings | server/streaming/routes.js:1457 | | keep |
| GET | /api/streams/channel | server/streaming/routes.js:677 | | keep |
| GET | /api/streams/channel | server/streaming/routes.js:677 | | keep |
| PUT | /api/streams/channel | server/streaming/routes.js:689 | | keep |
| PUT | /api/streams/channel | server/streaming/routes.js:689 | | keep |
| GET | /api/streams/channel/:username | server/streaming/routes.js:221 | | keep |
| GET | /api/streams/channel/:username | server/streaming/routes.js:221 | | keep |
| PUT | /api/streams/channel/:username/about | server/streaming/routes.js:808 | | keep |
| PUT | /api/streams/channel/:username/about | server/streaming/routes.js:808 | | keep |
| GET | /api/streams/channel/:username/bio-en | server/streaming/routes.js:789 | | keep |
| GET | /api/streams/channel/:username/bio-en | server/streaming/routes.js:789 | | keep |
| GET | /api/streams/channel/:username/clips-taken | server/streaming/routes.js:595 | | keep |
| GET | /api/streams/channel/:username/clips-taken | server/streaming/routes.js:595 | | keep |
-| POST | /api/streams/channel/:username/follow | server/streaming/routes.js:2388 | | keep |
+| POST | /api/streams/channel/:username/follow | server/streaming/routes.js:2402 | | keep |
+| GET | /api/streams/channel/:username/game | server/streaming/routes.js:1020 | | keep |
| GET | /api/streams/channel/:username/live | server/streaming/routes.js:639 | | keep |
| GET | /api/streams/channel/:username/live | server/streaming/routes.js:639 | | keep |
| GET | /api/streams/channel/:username/popular | server/streaming/routes.js:569 | | keep |
| GET | /api/streams/channel/:username/popular | server/streaming/routes.js:569 | | keep |
-| GET | /api/streams/channel/:username/resolve/:ref | server/streaming/routes.js:1468 | | keep |
-| GET | /api/streams/channel/:username/weather | server/streaming/routes.js:1018 | | keep |
+| GET | /api/streams/channel/:username/resolve/:ref | server/streaming/routes.js:1479 | | keep |
+| GET | /api/streams/channel/:username/weather | server/streaming/routes.js:1029 | | keep |
| POST | /api/streams/channel/offline-screen | server/streaming/routes.js:914 | | keep |
| POST | /api/streams/channel/offline-screen | server/streaming/routes.js:914 | | keep |
-| POST | /api/streams/diag-log | server/streaming/routes.js:2293 | | keep |
+| POST | /api/streams/diag-log | server/streaming/routes.js:2304 | | keep |
| POST | /api/streams/goal-media | server/streaming/routes.js:879 | | keep |
| POST | /api/streams/goal-media | server/streaming/routes.js:879 | | keep |
-| GET | /api/streams/managed | server/streaming/routes.js:1630 | | keep |
-| POST | /api/streams/managed | server/streaming/routes.js:1642 | | keep |
-| DELETE | /api/streams/managed/:id | server/streaming/routes.js:1856 | | keep |
-| PUT | /api/streams/managed/:id | server/streaming/routes.js:1696 | | keep |
-| POST | /api/streams/managed/:id/regenerate-key | server/streaming/routes.js:1881 | | keep |
-| GET | /api/streams/managed/:managedStreamId/history | server/streaming/routes.js:1502 | | keep |
-| GET | /api/streams/managed/:managedStreamId/profile | server/streaming/routes.js:1523 | | keep |
-| GET | /api/streams/mine | server/streaming/routes.js:1165 | | keep |
+| GET | /api/streams/managed | server/streaming/routes.js:1641 | | keep |
+| POST | /api/streams/managed | server/streaming/routes.js:1653 | | keep |
+| DELETE | /api/streams/managed/:id | server/streaming/routes.js:1867 | | keep |
+| PUT | /api/streams/managed/:id | server/streaming/routes.js:1707 | | keep |
+| POST | /api/streams/managed/:id/regenerate-key | server/streaming/routes.js:1892 | | keep |
+| GET | /api/streams/managed/:managedStreamId/history | server/streaming/routes.js:1513 | | keep |
+| GET | /api/streams/managed/:managedStreamId/profile | server/streaming/routes.js:1534 | | keep |
+| GET | /api/streams/mine | server/streaming/routes.js:1176 | | keep |
| POST | /api/streams/panel-image | server/streaming/routes.js:857 | | keep |
| POST | /api/streams/panel-image | server/streaming/routes.js:857 | | keep |
-| GET | /api/streams/recent | server/streaming/routes.js:1177 | | keep |
-| GET | /api/streams/recent-vods | server/streaming/routes.js:1248 | | keep |
-| GET | /api/streams/recently-online | server/streaming/routes.js:1194 | | keep |
-| GET | /api/streams/rtmp-proxy/:streamId.flv | server/streaming/routes.js:2495 | | keep |
-| GET | /api/streams/setup-progress | server/streaming/routes.js:1575 | | keep |
-| GET | /api/streams/voice-channels | server/streaming/routes.js:1278 | | keep |
-| POST | /api/streams/voice-channels | server/streaming/routes.js:1299 | | keep |
-| DELETE | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1311 | | keep |
-| GET | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1288 | | keep |
-| POST | /api/streams/voice-channels/call-user | server/streaming/routes.js:1323 | | keep |
-| POST | /api/streams/voice-channels/call-user/respond | server/streaming/routes.js:1392 | | keep |
+| GET | /api/streams/recent | server/streaming/routes.js:1188 | | keep |
+| GET | /api/streams/recent-vods | server/streaming/routes.js:1259 | | keep |
+| GET | /api/streams/recently-online | server/streaming/routes.js:1205 | | keep |
+| GET | /api/streams/rtmp-proxy/:streamId.flv | server/streaming/routes.js:2512 | | keep |
+| GET | /api/streams/setup-progress | server/streaming/routes.js:1586 | | keep |
+| GET | /api/streams/voice-channels | server/streaming/routes.js:1289 | | keep |
+| POST | /api/streams/voice-channels | server/streaming/routes.js:1310 | | keep |
+| DELETE | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1322 | | keep |
+| GET | /api/streams/voice-channels/:channelId | server/streaming/routes.js:1299 | | keep |
+| POST | /api/streams/voice-channels/call-user | server/streaming/routes.js:1334 | | keep |
+| POST | /api/streams/voice-channels/call-user/respond | server/streaming/routes.js:1403 | | keep |
| GET | /api/themes | server/themes/routes.js:21 | OpenVibe.Network | extract |
| GET | /api/themes | server/themes/routes.js:21 | OpenVibe.Network | extract |
| POST | /api/themes | server/themes/routes.js:109 | OpenVibe.Network | extract |
| POST | /api/themes | server/themes/routes.js:109 | OpenVibe.Network | extract |
| DELETE | /api/themes/:id | server/themes/routes.js:148 | OpenVibe.Network | extract |
| DELETE | /api/themes/:id | server/themes/routes.js:148 | OpenVibe.Network | extract |
@@ -558,40 +560,40 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -558,40 +560,40 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/tts/audio/:file | server/chat/tts-routes.js:125 | OpenVibe.Chat | shadowed |
| GET | /api/tts/audio/:file | server/chat/tts-routes.js:125 | OpenVibe.Chat | shadowed |
| GET | /api/tts/settings | server/chat/tts-routes.js:43 | OpenVibe.Chat | shadowed |
| GET | /api/tts/settings | server/chat/tts-routes.js:43 | OpenVibe.Chat | shadowed |
| GET | /api/tts/voices | server/chat/tts-routes.js:33 | OpenVibe.Chat | shadowed |
| GET | /api/tts/voices | server/chat/tts-routes.js:33 | OpenVibe.Chat | shadowed |
-| GET | /api/updates | server/index.js:840 | | keep |
+| GET | /api/updates | server/index.js:853 | | keep |
| GET | /api/vibe-coding/channel/:username/:slotIdOrSlug/events | server/vibe-coding/routes.js:17 | OpenVibe.Codes | extract |
| GET | /api/vibe-coding/channel/:username/:slotIdOrSlug/events | server/vibe-coding/routes.js:17 | OpenVibe.Codes | extract |
| GET | /api/vibe-coding/managed/:managedStreamId/events | server/vibe-coding/routes.js:47 | OpenVibe.Codes | extract |
| GET | /api/vibe-coding/managed/:managedStreamId/events | server/vibe-coding/routes.js:47 | OpenVibe.Codes | extract |
| GET | /api/vibe-coding/managed/:managedStreamId/settings | server/vibe-coding/routes.js:74 | OpenVibe.Codes | extract |
| GET | /api/vibe-coding/managed/:managedStreamId/settings | server/vibe-coding/routes.js:74 | OpenVibe.Codes | extract |
| PUT | /api/vibe-coding/managed/:managedStreamId/settings | server/vibe-coding/routes.js:91 | OpenVibe.Codes | extract |
| PUT | /api/vibe-coding/managed/:managedStreamId/settings | server/vibe-coding/routes.js:91 | OpenVibe.Codes | extract |
-| GET | /api/vods | server/media-proxy/vods.js:303 | OpenVibe.Media | adapter |
-| DELETE | /api/vods/:id | server/media-proxy/vods.js:566 | OpenVibe.Media | adapter |
-| GET | /api/vods/:id | server/media-proxy/vods.js:460 | OpenVibe.Media | adapter |
-| PUT | /api/vods/:id | server/media-proxy/vods.js:521 | OpenVibe.Media | adapter |
-| GET | /api/vods/:id/context | server/media-proxy/vods.js:401 | OpenVibe.Media | adapter |
+| GET | /api/vods | server/media-proxy/vods.js:308 | OpenVibe.Media | adapter |
+| DELETE | /api/vods/:id | server/media-proxy/vods.js:571 | OpenVibe.Media | adapter |
+| GET | /api/vods/:id | server/media-proxy/vods.js:465 | OpenVibe.Media | adapter |
+| PUT | /api/vods/:id | server/media-proxy/vods.js:526 | OpenVibe.Media | adapter |
+| GET | /api/vods/:id/context | server/media-proxy/vods.js:406 | OpenVibe.Media | adapter |
| GET | /api/vods/:id/live-info | server/media-proxy/vods.js:282 | OpenVibe.Media | adapter |
| GET | /api/vods/:id/live-info | server/media-proxy/vods.js:282 | OpenVibe.Media | adapter |
-| GET | /api/vods/:id/memories | server/media-proxy/vods.js:377 | OpenVibe.Media | adapter |
-| POST | /api/vods/:id/publish | server/media-proxy/vods.js:578 | OpenVibe.Media | adapter |
-| POST | /api/vods/bulk | server/media-proxy/vods.js:538 | OpenVibe.Media | adapter |
-| POST | /api/vods/bulk-delete-old | server/media-proxy/vods.js:333 | OpenVibe.Media | adapter |
-| POST | /api/vods/clips | server/media-proxy/vods.js:638 | OpenVibe.Media | adapter |
-| POST | /api/vods/clips/:id/trim | server/media-proxy/vods.js:792 | OpenVibe.Media | adapter |
-| GET | /api/vods/clips/stream/:streamId | server/media-proxy/vods.js:781 | OpenVibe.Media | adapter |
-| GET | /api/vods/file/:filename | server/media-proxy/vods.js:594 | OpenVibe.Media | adapter |
-| GET | /api/vods/mine | server/media-proxy/vods.js:321 | OpenVibe.Media | adapter |
+| GET | /api/vods/:id/memories | server/media-proxy/vods.js:382 | OpenVibe.Media | adapter |
+| POST | /api/vods/:id/publish | server/media-proxy/vods.js:583 | OpenVibe.Media | adapter |
+| POST | /api/vods/bulk | server/media-proxy/vods.js:543 | OpenVibe.Media | adapter |
+| POST | /api/vods/bulk-delete-old | server/media-proxy/vods.js:338 | OpenVibe.Media | adapter |
+| POST | /api/vods/clips | server/media-proxy/vods.js:643 | OpenVibe.Media | adapter |
+| POST | /api/vods/clips/:id/trim | server/media-proxy/vods.js:797 | OpenVibe.Media | adapter |
+| GET | /api/vods/clips/stream/:streamId | server/media-proxy/vods.js:786 | OpenVibe.Media | adapter |
+| GET | /api/vods/file/:filename | server/media-proxy/vods.js:599 | OpenVibe.Media | adapter |
+| GET | /api/vods/mine | server/media-proxy/vods.js:326 | OpenVibe.Media | adapter |
| POST | /api/vods/stream/:streamId/chunk | server/media-proxy/vods.js:183 | OpenVibe.Media | adapter |
| POST | /api/vods/stream/:streamId/chunk | server/media-proxy/vods.js:183 | OpenVibe.Media | adapter |
| POST | /api/vods/stream/:streamId/finalize | server/media-proxy/vods.js:237 | OpenVibe.Media | adapter |
| POST | /api/vods/stream/:streamId/finalize | server/media-proxy/vods.js:237 | OpenVibe.Media | adapter |
| GET | /api/vods/stream/:streamId/live | server/media-proxy/vods.js:257 | OpenVibe.Media | adapter |
| GET | /api/vods/stream/:streamId/live | server/media-proxy/vods.js:257 | OpenVibe.Media | adapter |
-| POST | /api/vods/upload | server/media-proxy/vods.js:600 | OpenVibe.Media | adapter |
-| GET | /banned | server/index.js:1012 | | keep |
-| POST | /banned/continue | server/index.js:982 | | keep |
-| GET | /canvas | server/index.js:705 | OpenVibe.Games | compat |
-| GET | /data/pastes/screenshots/:filename | server/index.js:638 | | keep |
-| GET | /dmca | server/index.js:921 | | keep |
+| POST | /api/vods/upload | server/media-proxy/vods.js:605 | OpenVibe.Media | adapter |
+| GET | /banned | server/index.js:1025 | | keep |
+| POST | /banned/continue | server/index.js:995 | | keep |
+| GET | /canvas | server/index.js:718 | OpenVibe.Games | compat |
+| GET | /data/pastes/screenshots/:filename | server/index.js:651 | | keep |
+| GET | /dmca | server/index.js:934 | | keep |
| GET | /docs | server/docs/routes.js:315 | | keep |
| GET | /docs | server/docs/routes.js:315 | | keep |
| GET | /docs/:name | server/docs/routes.js:317 | | keep |
| GET | /docs/:name | server/docs/routes.js:317 | | keep |
| GET | /docs/:name.md | server/docs/routes.js:316 | | keep |
| GET | /docs/:name.md | server/docs/routes.js:316 | | keep |
-| GET | /game | server/index.js:704 | OpenVibe.Games | compat |
-| GET | /internal/analytics-summary | server/index.js:599 | | keep |
+| GET | /game | server/index.js:717 | OpenVibe.Games | compat |
+| GET | /internal/analytics-summary | server/index.js:612 | | keep |
| POST | /internal/chat-context/ai/mod-command | server/chat/live-context-routes.js:466 | | keep |
| POST | /internal/chat-context/ai/mod-command | server/chat/live-context-routes.js:466 | | keep |
| POST | /internal/chat-context/alert-sound | server/chat/live-context-routes.js:382 | | keep |
| POST | /internal/chat-context/alert-sound | server/chat/live-context-routes.js:382 | | keep |
| POST | /internal/chat-context/anon | server/chat/live-context-routes.js:280 | | keep |
| POST | /internal/chat-context/anon | server/chat/live-context-routes.js:280 | | keep |
@@ -684,31 +686,31 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -684,31 +686,31 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /internal/chat-tables/:table | server/internal/routes.js:43 | | keep |
| POST | /internal/chat-tables/:table | server/internal/routes.js:43 | | keep |
| POST | /internal/chat-tables/relay | server/internal/routes.js:36 | | keep |
| POST | /internal/chat-tables/relay | server/internal/routes.js:36 | | keep |
| GET | /internal/followers | server/streaming/followers-internal.js:12 | | keep |
| GET | /internal/followers | server/streaming/followers-internal.js:12 | | keep |
-| GET | /internal/lineage/resolve | server/lineage/routes.js:33 | | keep |
-| POST | /internal/lineage/resolve | server/lineage/routes.js:34 | | keep |
-| POST | /internal/media-events | server/index.js:589 | | keep |
-| POST | /internal/media-webhook | server/index.js:587 | OpenVibe.Events | compat |
-| POST | /internal/network-events | server/index.js:591 | | keep |
-| POST | /internal/openre-events | server/index.js:594 | | keep |
+| GET | /internal/lineage/resolve | server/lineage/routes.js:36 | | keep |
+| POST | /internal/lineage/resolve | server/lineage/routes.js:37 | | keep |
+| POST | /internal/media-events | server/index.js:602 | | keep |
+| POST | /internal/media-webhook | server/index.js:600 | OpenVibe.Events | compat |
+| POST | /internal/network-events | server/index.js:604 | | keep |
+| POST | /internal/openre-events | server/index.js:607 | | keep |
| POST | /internal/tips/deliveries | server/tips/delivery-routes.js:104 | | keep |
| POST | /internal/tips/deliveries | server/tips/delivery-routes.js:104 | | keep |
| POST | /internal/url-registry/refresh | server/internal/routes.js:64 | OpenVibe.Network | compat |
| POST | /internal/url-registry/refresh | server/internal/routes.js:64 | OpenVibe.Network | compat |
| POST | /internal/user-avatar | server/internal/routes.js:82 | OpenVibe.Network | compat |
| POST | /internal/user-avatar | server/internal/routes.js:82 | OpenVibe.Network | compat |
| GET | /llms.txt | server/seo/seo.js:1175 | | keep |
| GET | /llms.txt | server/seo/seo.js:1175 | | keep |
-| GET | /media/:username | server/index.js:912 | | keep |
-| GET | /obs/chat/:username | server/index.js:900 | | keep |
-| GET | /openvibe-sw.js | server/index.js:488 | | keep |
-| GET | /overlay/chat/:username | server/index.js:908 | | keep |
-| GET | /overlay/chat/:username/:slotIdOrSlug | server/index.js:905 | | keep |
+| GET | /media/:username | server/index.js:925 | | keep |
+| GET | /obs/chat/:username | server/index.js:913 | | keep |
+| GET | /openvibe-sw.js | server/index.js:501 | | keep |
+| GET | /overlay/chat/:username | server/index.js:921 | | keep |
+| GET | /overlay/chat/:username/:slotIdOrSlug | server/index.js:918 | | keep |
| GET | /p/:slug | server/web/paste-handover.js:32 | OpenVibe.Community | adapter |
| GET | /p/:slug | server/web/paste-handover.js:32 | OpenVibe.Community | adapter |
-| GET | /p/:slug/raw | server/index.js:650 | OpenVibe.Community | adapter |
-| GET | /p/:slug/screenshot | server/index.js:646 | OpenVibe.Community | adapter |
-| GET | /privacy | server/index.js:930 | | keep |
+| GET | /p/:slug/raw | server/index.js:663 | OpenVibe.Community | adapter |
+| GET | /p/:slug/screenshot | server/index.js:659 | OpenVibe.Community | adapter |
+| GET | /privacy | server/index.js:943 | | keep |
| GET | /sitemap.xml | server/seo/seo.js:1174 | | keep |
| GET | /sitemap.xml | server/seo/seo.js:1174 | | keep |
-| GET | /terms | server/index.js:927 | | keep |
-| GET | /tos | server/index.js:924 | | keep |
-| POST | /whip/:streamId | server/index.js:939 | OpenRe.Stream | extract |
-| DELETE | /whip/:streamId/:resourceId | server/index.js:941 | OpenRe.Stream | extract |
-| PATCH | /whip/:streamId/:resourceId | server/index.js:940 | OpenRe.Stream | extract |
+| GET | /terms | server/index.js:940 | | keep |
+| GET | /tos | server/index.js:937 | | keep |
+| POST | /whip/:streamId | server/index.js:952 | OpenRe.Stream | extract |
+| DELETE | /whip/:streamId/:resourceId | server/index.js:954 | OpenRe.Stream | extract |
+| PATCH | /whip/:streamId/:resourceId | server/index.js:953 | OpenRe.Stream | extract |
## OpenVibe.Network
## OpenVibe.Network
@@ -716,15 +718,21 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -716,15 +718,21 @@ Owner = the repository whose code answers the route; target = the authority it b
|---|---|---|---|---|
|---|---|---|---|---|
| DELETE | / | server/notifications/routes.js:111 | | keep |
| DELETE | / | server/notifications/routes.js:111 | | keep |
| GET | / | server/discord/routes.js:18 | | keep |
| GET | / | server/discord/routes.js:18 | | keep |
+| GET | / | server/identity/account-data.js:554 | | keep |
+| GET | / | server/identity/account-merge.js:316 | | keep |
| GET | / | server/notifications/routes.js:16 | | keep |
| GET | / | server/notifications/routes.js:16 | | keep |
-| POST | / | server/notifications/events-consumer.js:248 | | keep |
+| POST | / | server/identity/account-merge.js:304 | | keep |
+| POST | / | server/notifications/events-consumer.js:264 | | keep |
| PUT | / | server/discord/routes.js:37 | | keep |
| PUT | / | server/discord/routes.js:37 | | keep |
+| POST | /:id/cancel | server/identity/account-data.js:565 | | keep |
| POST | /:id/dismiss | server/notifications/routes.js:100 | | keep |
| POST | /:id/dismiss | server/notifications/routes.js:100 | | keep |
| POST | /:id/read | server/notifications/routes.js:67 | | keep |
| POST | /:id/read | server/notifications/routes.js:67 | | keep |
| GET | /.well-known/openvibe | server/registry/ecosystem.js:317 | | keep |
| GET | /.well-known/openvibe | server/registry/ecosystem.js:317 | | keep |
-| GET | /.well-known/web-identity | server/index.js:694 | | keep |
+| GET | /.well-known/web-identity | server/index.js:755 | | keep |
+| POST | /account-deletions/:id/confirmations | server/identity/account-data.js:547 | | keep |
+| POST | /account-exports/:id/parts | server/identity/account-data.js:539 | | keep |
| POST | /admin | server/setup/routes.js:114 | | keep |
| POST | /admin | server/setup/routes.js:114 | | keep |
-| GET | /api/.well-known/jwks | server/index.js:442 | | keep |
+| GET | /api/.well-known/jwks | server/index.js:500 | | keep |
| GET | /api/admin/domains | server/domains/routes.js:176 | | keep |
| GET | /api/admin/domains | server/domains/routes.js:176 | | keep |
| GET | /api/admin/domains | server/domains/routes.js:197 | | keep |
| GET | /api/admin/domains | server/domains/routes.js:197 | | keep |
| POST | /api/admin/domains | server/domains/routes.js:224 | | keep |
| POST | /api/admin/domains | server/domains/routes.js:224 | | keep |
@@ -742,8 +750,16 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -742,8 +750,16 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/admin/integrations/github | server/integrations/github.js:50 | | keep |
| GET | /api/admin/integrations/github | server/integrations/github.js:50 | | keep |
| PUT | /api/admin/integrations/github | server/integrations/github.js:51 | | keep |
| PUT | /api/admin/integrations/github | server/integrations/github.js:51 | | keep |
| POST | /api/admin/integrations/github/test | server/integrations/github.js:65 | | keep |
| POST | /api/admin/integrations/github/test | server/integrations/github.js:65 | | keep |
+| GET | /api/admin/mods | server/identity/mod-principals.js:178 | | keep |
+| GET | /api/admin/mods | server/identity/mod-principals.js:197 | | keep |
+| POST | /api/admin/mods | server/identity/mod-principals.js:184 | | keep |
+| GET | /api/admin/mods/:id | server/identity/mod-principals.js:183 | | keep |
+| POST | /api/admin/mods/:id/grants | server/identity/mod-principals.js:185 | | keep |
+| POST | /api/admin/mods/:id/grants | server/identity/mod-principals.js:201 | | keep |
+| POST | /api/admin/mods/:id/revoke | server/identity/mod-principals.js:186 | | keep |
+| POST | /api/admin/mods/:id/revoke | server/identity/mod-principals.js:210 | | keep |
| GET | /api/admin/operator-checklist | server/admin/operator-checklist.js:70 | | keep |
| GET | /api/admin/operator-checklist | server/admin/operator-checklist.js:70 | | keep |
-| GET | /api/admin/ssh-info | server/index.js:566 | | keep |
+| GET | /api/admin/ssh-info | server/index.js:627 | | keep |
| GET | /api/admin/themes | server/themes/routes.js:64 | | keep |
| GET | /api/admin/themes | server/themes/routes.js:64 | | keep |
| GET | /api/admin/themes | server/themes/routes.js:233 | | keep |
| GET | /api/admin/themes | server/themes/routes.js:233 | | keep |
| POST | /api/admin/themes | server/themes/routes.js:217 | | keep |
| POST | /api/admin/themes | server/themes/routes.js:217 | | keep |
@@ -755,12 +771,12 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -755,12 +771,12 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/admin/themes/me/active | server/themes/routes.js:98 | | keep |
| GET | /api/admin/themes/me/active | server/themes/routes.js:98 | | keep |
| PUT | /api/admin/themes/me/display | server/themes/routes.js:123 | | keep |
| PUT | /api/admin/themes/me/display | server/themes/routes.js:123 | | keep |
| GET | /api/admin/themes/me/submissions | server/themes/routes.js:133 | | keep |
| GET | /api/admin/themes/me/submissions | server/themes/routes.js:133 | | keep |
-| GET | /api/auth/anon-identities | server/auth/routes.js:667 | | keep |
-| POST | /api/auth/anon-session | server/auth/routes.js:538 | | keep |
-| GET | /api/auth/anon/:token | server/auth/routes.js:608 | | keep |
-| POST | /api/auth/anon/:token/link | server/auth/routes.js:645 | | keep |
-| PUT | /api/auth/anon/:token/preferences | server/auth/routes.js:622 | | keep |
-| POST | /api/auth/change-password | server/auth/routes.js:431 | | keep |
+| GET | /api/auth/anon-identities | server/auth/routes.js:679 | | keep |
+| POST | /api/auth/anon-session | server/auth/routes.js:550 | | keep |
+| GET | /api/auth/anon/:token | server/auth/routes.js:620 | | keep |
+| POST | /api/auth/anon/:token/link | server/auth/routes.js:657 | | keep |
+| PUT | /api/auth/anon/:token/preferences | server/auth/routes.js:634 | | keep |
+| POST | /api/auth/change-password | server/auth/routes.js:443 | | keep |
| GET | /api/auth/discord/callback | server/auth/discord-link.js:61 | | keep |
| GET | /api/auth/discord/callback | server/auth/discord-link.js:61 | | keep |
| DELETE | /api/auth/discord/link | server/auth/discord-link.js:158 | | keep |
| DELETE | /api/auth/discord/link | server/auth/discord-link.js:158 | | keep |
| GET | /api/auth/discord/link | server/auth/discord-link.js:31 | | keep |
| GET | /api/auth/discord/link | server/auth/discord-link.js:31 | | keep |
@@ -768,25 +784,25 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -768,25 +784,25 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/auth/email/send-verification | server/auth/email-verify.js:99 | | keep |
| POST | /api/auth/email/send-verification | server/auth/email-verify.js:99 | | keep |
| GET | /api/auth/email/status | server/auth/email-verify.js:83 | | keep |
| GET | /api/auth/email/status | server/auth/email-verify.js:83 | | keep |
| POST | /api/auth/email/verify | server/auth/email-verify.js:122 | | keep |
| POST | /api/auth/email/verify | server/auth/email-verify.js:122 | | keep |
-| POST | /api/auth/forgot-password | server/auth/routes.js:213 | | keep |
-| POST | /api/auth/login | server/auth/routes.js:190 | | keep |
-| POST | /api/auth/logout | server/auth/routes.js:532 | | keep |
-| GET | /api/auth/me | server/auth/routes.js:370 | | keep |
-| PUT | /api/auth/profile | server/auth/routes.js:381 | | keep |
-| POST | /api/auth/refresh | server/auth/routes.js:305 | | keep |
-| POST | /api/auth/register | server/auth/routes.js:93 | | keep |
-| POST | /api/auth/reset-password | server/auth/routes.js:261 | | keep |
-| GET | /api/auth/reset-password/validate | server/auth/routes.js:245 | | keep |
-| DELETE | /api/auth/sessions | server/auth/routes.js:750 | | keep |
-| GET | /api/auth/sessions | server/auth/routes.js:705 | | keep |
-| POST | /api/auth/sessions | server/auth/routes.js:718 | | keep |
-| DELETE | /api/auth/sessions/:id | server/auth/routes.js:740 | | keep |
-| POST | /api/auth/sign-out-everywhere | server/auth/routes.js:520 | | keep |
-| GET | /api/auth/users/:id/card | server/auth/routes.js:765 | | keep |
-| DELETE | /api/auth/users/:id/follow | server/auth/routes.js:848 | | keep |
-| POST | /api/auth/users/:id/follow | server/auth/routes.js:817 | | keep |
-| GET | /api/brand | server/index.js:468 | | keep |
-| GET | /api/catalog.json | server/index.js:532 | | keep |
+| POST | /api/auth/forgot-password | server/auth/routes.js:225 | | keep |
+| POST | /api/auth/login | server/auth/routes.js:199 | | keep |
+| POST | /api/auth/logout | server/auth/routes.js:544 | | keep |
+| GET | /api/auth/me | server/auth/routes.js:382 | | keep |
+| PUT | /api/auth/profile | server/auth/routes.js:393 | | keep |
+| POST | /api/auth/refresh | server/auth/routes.js:317 | | keep |
+| POST | /api/auth/register | server/auth/routes.js:102 | | keep |
+| POST | /api/auth/reset-password | server/auth/routes.js:273 | | keep |
+| GET | /api/auth/reset-password/validate | server/auth/routes.js:257 | | keep |
+| DELETE | /api/auth/sessions | server/auth/routes.js:762 | | keep |
+| GET | /api/auth/sessions | server/auth/routes.js:717 | | keep |
+| POST | /api/auth/sessions | server/auth/routes.js:730 | | keep |
+| DELETE | /api/auth/sessions/:id | server/auth/routes.js:752 | | keep |
+| POST | /api/auth/sign-out-everywhere | server/auth/routes.js:532 | | keep |
+| GET | /api/auth/users/:id/card | server/auth/routes.js:777 | | keep |
+| DELETE | /api/auth/users/:id/follow | server/auth/routes.js:860 | | keep |
+| POST | /api/auth/users/:id/follow | server/auth/routes.js:829 | | keep |
+| GET | /api/brand | server/index.js:529 | | keep |
+| GET | /api/catalog.json | server/index.js:593 | | keep |
| GET | /api/chrome | server/frame/service.js:178 | | keep |
| GET | /api/chrome | server/frame/service.js:178 | | keep |
| POST | /api/chrome/hit | server/frame/service.js:191 | | keep |
| POST | /api/chrome/hit | server/frame/service.js:191 | | keep |
| GET | /api/domains | server/domains/routes.js:176 | | keep |
| GET | /api/domains | server/domains/routes.js:176 | | keep |
@@ -798,20 +814,20 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -798,20 +814,20 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/domains/check | server/domains/routes.js:217 | | keep |
| POST | /api/domains/check | server/domains/routes.js:217 | | keep |
| GET | /api/frame | server/frame/service.js:178 | | keep |
| GET | /api/frame | server/frame/service.js:178 | | keep |
| POST | /api/frame/hit | server/frame/service.js:191 | | keep |
| POST | /api/frame/hit | server/frame/service.js:191 | | keep |
-| GET | /api/health | server/index.js:454 | | keep |
+| GET | /api/health | server/index.js:515 | | keep |
| DELETE | /api/history | server/history/routes.js:143 | | keep |
| DELETE | /api/history | server/history/routes.js:143 | | keep |
| GET | /api/history | server/history/routes.js:92 | | keep |
| GET | /api/history | server/history/routes.js:92 | | keep |
| POST | /api/history | server/history/routes.js:108 | | keep |
| POST | /api/history | server/history/routes.js:108 | | keep |
| DELETE | /api/history/:id | server/history/routes.js:148 | | keep |
| DELETE | /api/history/:id | server/history/routes.js:148 | | keep |
| PUT | /api/history/settings | server/history/routes.js:137 | | keep |
| PUT | /api/history/settings | server/history/routes.js:137 | | keep |
-| GET | /api/modules | server/identity/modules.js:327 | | keep |
-| DELETE | /api/modules/:ns | server/identity/modules.js:352 | | keep |
-| GET | /api/modules/:ns | server/identity/modules.js:335 | | keep |
-| PUT | /api/modules/:ns | server/identity/modules.js:343 | | keep |
-| GET | /api/modules/:ns/public/:subject | server/identity/modules.js:319 | | keep |
-| DELETE | /api/modules/modules/:ns/:subject | server/identity/modules.js:390 | | keep |
-| GET | /api/modules/modules/:ns/:subject | server/identity/modules.js:367 | | keep |
-| PUT | /api/modules/modules/:ns/:subject | server/identity/modules.js:379 | | keep |
+| GET | /api/modules | server/identity/modules.js:345 | | keep |
+| DELETE | /api/modules/:ns | server/identity/modules.js:370 | | keep |
+| GET | /api/modules/:ns | server/identity/modules.js:353 | | keep |
+| PUT | /api/modules/:ns | server/identity/modules.js:361 | | keep |
+| GET | /api/modules/:ns/public/:subject | server/identity/modules.js:337 | | keep |
+| DELETE | /api/modules/modules/:ns/:subject | server/identity/modules.js:408 | | keep |
+| GET | /api/modules/modules/:ns/:subject | server/identity/modules.js:385 | | keep |
+| PUT | /api/modules/modules/:ns/:subject | server/identity/modules.js:397 | | keep |
| DELETE | /api/profile/avatar | server/profile/avatar.js:107 | | keep |
| DELETE | /api/profile/avatar | server/profile/avatar.js:107 | | keep |
| PUT | /api/profile/avatar | server/profile/avatar.js:96 | | keep |
| PUT | /api/profile/avatar | server/profile/avatar.js:96 | | keep |
| GET | /api/profile/avatar/:username | server/profile/avatar.js:110 | | keep |
| GET | /api/profile/avatar/:username | server/profile/avatar.js:110 | | keep |
@@ -820,8 +836,8 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -820,8 +836,8 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /api/push/subscribe | server/push/routes.js:17 | | keep |
| POST | /api/push/subscribe | server/push/routes.js:17 | | keep |
| POST | /api/push/unsubscribe | server/push/routes.js:29 | | keep |
| POST | /api/push/unsubscribe | server/push/routes.js:29 | | keep |
| GET | /api/push/vapid-key | server/push/routes.js:10 | | keep |
| GET | /api/push/vapid-key | server/push/routes.js:10 | | keep |
-| GET | /api/ready | server/index.js:464 | | keep |
-| GET | /api/sso/targets | server/index.js:514 | | keep |
+| GET | /api/ready | server/index.js:525 | | keep |
+| GET | /api/sso/targets | server/index.js:575 | | keep |
| GET | /api/themes | server/themes/routes.js:64 | | keep |
| GET | /api/themes | server/themes/routes.js:64 | | keep |
| GET | /api/themes | server/themes/routes.js:233 | | keep |
| GET | /api/themes | server/themes/routes.js:233 | | keep |
| POST | /api/themes | server/themes/routes.js:217 | | keep |
| POST | /api/themes | server/themes/routes.js:217 | | keep |
@@ -834,39 +850,55 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -834,39 +850,55 @@ Owner = the repository whose code answers the route; target = the authority it b
| PUT | /api/themes/me/display | server/themes/routes.js:123 | | keep |
| PUT | /api/themes/me/display | server/themes/routes.js:123 | | keep |
| GET | /api/themes/me/submissions | server/themes/routes.js:133 | | keep |
| GET | /api/themes/me/submissions | server/themes/routes.js:133 | | keep |
| GET | /api/v1/changelog | server/updates/routes.js:51 | | keep |
| GET | /api/v1/changelog | server/updates/routes.js:51 | | keep |
+| GET | /api/v1/creators/:creator/analytics | server/analytics/creators.js:121 | | keep |
+| GET | /api/v1/follows | server/identity/follows.js:262 | | keep |
+| DELETE | /api/v1/follows/:type/:target | server/identity/follows.js:278 | | keep |
+| DELETE | /api/v1/follows/:type/:target | server/identity/follows.js:337 | | keep |
+| GET | /api/v1/follows/:type/:target | server/identity/follows.js:291 | | keep |
+| PUT | /api/v1/follows/:type/:target | server/identity/follows.js:268 | | keep |
+| PUT | /api/v1/follows/:type/:target | server/identity/follows.js:324 | | keep |
+| GET | /api/v1/follows/:type/:target/followers | server/identity/follows.js:304 | | keep |
| GET | /api/v1/me/blocks | server/identity/blocks.js:159 | | keep |
| GET | /api/v1/me/blocks | server/identity/blocks.js:159 | | keep |
| DELETE | /api/v1/me/blocks/:target | server/identity/blocks.js:175 | | keep |
| DELETE | /api/v1/me/blocks/:target | server/identity/blocks.js:175 | | keep |
| PUT | /api/v1/me/blocks/:target | server/identity/blocks.js:164 | | keep |
| PUT | /api/v1/me/blocks/:target | server/identity/blocks.js:164 | | keep |
-| GET | /api/v1/projects | server/developer/routes.js:86 | | keep |
-| POST | /api/v1/projects | server/developer/routes.js:85 | | keep |
-| GET | /api/v1/projects/:project | server/developer/routes.js:87 | | keep |
-| PATCH | /api/v1/projects/:project | server/developer/routes.js:91 | | keep |
-| PUT | /api/v1/projects/:project/allowance | server/developer/routes.js:93 | | keep |
-| GET | /api/v1/projects/:project/apps | server/developer/routes.js:101 | | keep |
-| POST | /api/v1/projects/:project/apps | server/developer/routes.js:102 | | keep |
-| DELETE | /api/v1/projects/:project/apps/:app | server/developer/routes.js:105 | | keep |
-| GET | /api/v1/projects/:project/apps/:app | server/developer/routes.js:103 | | keep |
-| PATCH | /api/v1/projects/:project/apps/:app | server/developer/routes.js:104 | | keep |
-| GET | /api/v1/projects/:project/apps/:app/credentials | server/developer/routes.js:107 | | keep |
-| POST | /api/v1/projects/:project/apps/:app/credentials/:credential/revoke | server/developer/routes.js:109 | | keep |
-| POST | /api/v1/projects/:project/apps/:app/credentials/rotate | server/developer/routes.js:108 | | keep |
-| GET | /api/v1/projects/:project/apps/:app/grants | server/developer/routes.js:111 | | keep |
-| POST | /api/v1/projects/:project/apps/:app/grants | server/developer/routes.js:112 | | keep |
-| DELETE | /api/v1/projects/:project/apps/:app/grants/:capability | server/developer/routes.js:115 | | keep |
-| POST | /api/v1/projects/:project/apps/:app/grants/:capability/approve | server/developer/routes.js:113 | | keep |
-| POST | /api/v1/projects/:project/apps/:app/grants/:capability/deny | server/developer/routes.js:114 | | keep |
-| POST | /api/v1/projects/:project/archive | server/developer/routes.js:92 | | keep |
-| GET | /api/v1/projects/:project/audit | server/developer/routes.js:121 | | keep |
-| PUT | /api/v1/projects/:project/environment-policy | server/developer/routes.js:94 | | keep |
-| POST | /api/v1/projects/:project/export-tokens | server/developer/routes.js:127 | | keep |
-| GET | /api/v1/projects/:project/members | server/developer/routes.js:96 | | keep |
-| POST | /api/v1/projects/:project/members | server/developer/routes.js:97 | | keep |
-| DELETE | /api/v1/projects/:project/members/:subject | server/developer/routes.js:99 | | keep |
-| PATCH | /api/v1/projects/:project/members/:subject | server/developer/routes.js:98 | | keep |
-| GET | /api/v1/projects/:project/quotas | server/developer/routes.js:117 | | keep |
-| DELETE | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:119 | | keep |
-| PUT | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:118 | | keep |
-| GET | /api/v1/projects/catalog | server/developer/routes.js:79 | | keep |
+| GET | /api/v1/me/follows | server/identity/follows.js:262 | | keep |
+| DELETE | /api/v1/me/follows/:type/:target | server/identity/follows.js:278 | | keep |
+| DELETE | /api/v1/me/follows/:type/:target | server/identity/follows.js:337 | | keep |
+| GET | /api/v1/me/follows/:type/:target | server/identity/follows.js:291 | | keep |
+| PUT | /api/v1/me/follows/:type/:target | server/identity/follows.js:268 | | keep |
+| PUT | /api/v1/me/follows/:type/:target | server/identity/follows.js:324 | | keep |
+| GET | /api/v1/me/follows/:type/:target/followers | server/identity/follows.js:304 | | keep |
+| GET | /api/v1/projects | server/developer/routes.js:89 | | keep |
+| POST | /api/v1/projects | server/developer/routes.js:88 | | keep |
+| GET | /api/v1/projects/:project | server/developer/routes.js:90 | | keep |
+| PATCH | /api/v1/projects/:project | server/developer/routes.js:94 | | keep |
+| PUT | /api/v1/projects/:project/allowance | server/developer/routes.js:96 | | keep |
+| GET | /api/v1/projects/:project/apps | server/developer/routes.js:104 | | keep |
+| POST | /api/v1/projects/:project/apps | server/developer/routes.js:105 | | keep |
+| DELETE | /api/v1/projects/:project/apps/:app | server/developer/routes.js:108 | | keep |
+| GET | /api/v1/projects/:project/apps/:app | server/developer/routes.js:106 | | keep |
+| PATCH | /api/v1/projects/:project/apps/:app | server/developer/routes.js:107 | | keep |
+| GET | /api/v1/projects/:project/apps/:app/credentials | server/developer/routes.js:110 | | keep |
+| POST | /api/v1/projects/:project/apps/:app/credentials/:credential/revoke | server/developer/routes.js:112 | | keep |
+| POST | /api/v1/projects/:project/apps/:app/credentials/rotate | server/developer/routes.js:111 | | keep |
+| GET | /api/v1/projects/:project/apps/:app/grants | server/developer/routes.js:114 | | keep |
+| POST | /api/v1/projects/:project/apps/:app/grants | server/developer/routes.js:115 | | keep |
+| DELETE | /api/v1/projects/:project/apps/:app/grants/:capability | server/developer/routes.js:118 | | keep |
+| POST | /api/v1/projects/:project/apps/:app/grants/:capability/approve | server/developer/routes.js:116 | | keep |
+| POST | /api/v1/projects/:project/apps/:app/grants/:capability/deny | server/developer/routes.js:117 | | keep |
+| POST | /api/v1/projects/:project/archive | server/developer/routes.js:95 | | keep |
+| GET | /api/v1/projects/:project/audit | server/developer/routes.js:130 | | keep |
+| PUT | /api/v1/projects/:project/environment-policy | server/developer/routes.js:97 | | keep |
+| POST | /api/v1/projects/:project/export-tokens | server/developer/routes.js:136 | | keep |
+| GET | /api/v1/projects/:project/members | server/developer/routes.js:99 | | keep |
+| POST | /api/v1/projects/:project/members | server/developer/routes.js:100 | | keep |
+| DELETE | /api/v1/projects/:project/members/:subject | server/developer/routes.js:102 | | keep |
+| PATCH | /api/v1/projects/:project/members/:subject | server/developer/routes.js:101 | | keep |
+| GET | /api/v1/projects/:project/quotas | server/developer/routes.js:120 | | keep |
+| DELETE | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:122 | | keep |
+| PUT | /api/v1/projects/:project/quotas/:capability | server/developer/routes.js:121 | | keep |
+| GET | /api/v1/projects/:project/usage | server/developer/routes.js:125 | | keep |
+| GET | /api/v1/projects/catalog | server/developer/routes.js:82 | | keep |
| POST | /api/v1/realtime/ticket | server/auth/realtime-ticket.js:63 | | keep |
| POST | /api/v1/realtime/ticket | server/auth/realtime-ticket.js:63 | | keep |
| GET | /api/v1/registry | server/registry/ecosystem.js:318 | | keep |
| GET | /api/v1/registry | server/registry/ecosystem.js:318 | | keep |
| GET | /api/v1/registry/capabilities | server/registry/ecosystem.js:343 | | keep |
| GET | /api/v1/registry/capabilities | server/registry/ecosystem.js:343 | | keep |
@@ -887,28 +919,34 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -887,28 +919,34 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/v1/staff/capabilities | server/admin/staff-api.js:34 | | keep |
| GET | /api/v1/staff/capabilities | server/admin/staff-api.js:34 | | keep |
| GET | /api/v1/staff/moderation-audit | server/admin/moderation-audit.js:140 | | keep |
| GET | /api/v1/staff/moderation-audit | server/admin/moderation-audit.js:140 | | keep |
| GET | /api/v1/staff/moderators | server/admin/staff-api.js:45 | | keep |
| GET | /api/v1/staff/moderators | server/admin/staff-api.js:45 | | keep |
-| GET | /api/v1/status | server/status/routes.js:228 | | keep |
-| GET | /api/v1/status/slo | server/status/routes.js:245 | | keep |
-| GET | /api/v1/users/names/:name | server/index.js:396 | | keep |
+| GET | /api/v1/status | server/status/routes.js:242 | | keep |
+| GET | /api/v1/status/incidents | server/status/incidents.js:128 | | keep |
+| POST | /api/v1/status/incidents | server/status/incidents.js:153 | | keep |
+| POST | /api/v1/status/incidents/:id/updates | server/status/incidents.js:154 | | keep |
+| GET | /api/v1/status/slo | server/status/routes.js:259 | | keep |
+| GET | /api/v1/users/names/:name | server/index.js:404 | | keep |
| POST | /api/webhooks/resend | server/notifications/resend-webhook.js:26 | | keep |
| POST | /api/webhooks/resend | server/notifications/resend-webhook.js:26 | | keep |
-| GET | /audit | server/admin/routes.js:870 | | keep |
+| GET | /audit | server/admin/routes.js:872 | | keep |
| DELETE | /avatar | server/profile/avatar.js:107 | | keep |
| DELETE | /avatar | server/profile/avatar.js:107 | | keep |
| PUT | /avatar | server/profile/avatar.js:96 | | keep |
| PUT | /avatar | server/profile/avatar.js:96 | | keep |
| GET | /avatar/:username | server/profile/avatar.js:110 | | keep |
| GET | /avatar/:username | server/profile/avatar.js:110 | | keep |
| POST | /bootstrap | server/setup/routes.js:99 | | keep |
| POST | /bootstrap | server/setup/routes.js:99 | | keep |
| GET | /bots | server/admin/analytics-routes.js:255 | | keep |
| GET | /bots | server/admin/analytics-routes.js:255 | | keep |
-| POST | /broadcast | server/admin/routes.js:794 | | keep |
+| POST | /broadcast | server/admin/routes.js:796 | | keep |
| GET | /certs | server/deploy/routes.js:139 | | keep |
| GET | /certs | server/deploy/routes.js:139 | | keep |
| POST | /certs/issue-cloudflare | server/deploy/routes.js:164 | | keep |
| POST | /certs/issue-cloudflare | server/deploy/routes.js:164 | | keep |
| POST | /certs/issue-manual | server/deploy/routes.js:236 | | keep |
| POST | /certs/issue-manual | server/deploy/routes.js:236 | | keep |
| POST | /certs/manual-info | server/deploy/routes.js:215 | | keep |
| POST | /certs/manual-info | server/deploy/routes.js:215 | | keep |
| POST | /certs/renew | server/deploy/routes.js:281 | | keep |
| POST | /certs/renew | server/deploy/routes.js:281 | | keep |
-| GET | /config | server/admin/routes.js:379 | | keep |
+| GET | /config | server/admin/routes.js:380 | | keep |
| GET | /config | server/deploy/routes.js:81 | | keep |
| GET | /config | server/deploy/routes.js:81 | | keep |
| PUT | /config | server/deploy/routes.js:95 | | keep |
| PUT | /config | server/deploy/routes.js:95 | | keep |
-| GET | /config/:namespace | server/admin/routes.js:380 | | keep |
-| GET | /config/:namespace/history | server/admin/routes.js:381 | | keep |
-| POST | /config/:namespace/rollback | server/admin/routes.js:382 | | keep |
+| GET | /config/:namespace | server/admin/routes.js:381 | | keep |
+| GET | /config/:namespace/history | server/admin/routes.js:382 | | keep |
+| POST | /config/:namespace/rollback | server/admin/routes.js:383 | | keep |
+| DELETE | /deletion | server/identity/account-data.js:531 | | keep |
+| GET | /deletion | server/identity/account-data.js:520 | | keep |
+| POST | /deletion | server/identity/account-data.js:525 | | keep |
| POST | /deploy | server/setup/routes.js:239 | | keep |
| POST | /deploy | server/setup/routes.js:239 | | keep |
| GET | /deploy-status | server/setup/routes.js:309 | | keep |
| GET | /deploy-status | server/setup/routes.js:309 | | keep |
| GET | /domains | server/deploy/routes.js:406 | | keep |
| GET | /domains | server/deploy/routes.js:406 | | keep |
@@ -916,65 +954,81 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -916,65 +954,81 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /email | server/admin/routes.js:229 | | keep |
| GET | /email | server/admin/routes.js:229 | | keep |
| PUT | /email | server/admin/routes.js:239 | | keep |
| PUT | /email | server/admin/routes.js:239 | | keep |
| POST | /email/test | server/admin/routes.js:281 | | keep |
| POST | /email/test | server/admin/routes.js:281 | | keep |
+| GET | /export | server/identity/account-data.js:498 | | keep |
+| POST | /export | server/identity/account-data.js:490 | | keep |
+| GET | /export/:id | server/identity/account-data.js:503 | | keep |
+| GET | /export/:id/download | server/identity/account-data.js:509 | | keep |
| GET | /fedcm/accounts | server/auth/fedcm.js:111 | | keep |
| GET | /fedcm/accounts | server/auth/fedcm.js:111 | | keep |
| POST | /fedcm/assertion | server/auth/fedcm.js:125 | | keep |
| POST | /fedcm/assertion | server/auth/fedcm.js:125 | | keep |
| GET | /fedcm/client-metadata | server/auth/fedcm.js:120 | | keep |
| GET | /fedcm/client-metadata | server/auth/fedcm.js:120 | | keep |
| GET | /fedcm/config.json | server/auth/fedcm.js:97 | | keep |
| GET | /fedcm/config.json | server/auth/fedcm.js:97 | | keep |
| POST | /fedcm/disconnect | server/auth/fedcm.js:142 | | keep |
| POST | /fedcm/disconnect | server/auth/fedcm.js:142 | | keep |
-| GET | /health | server/admin/routes.js:839 | | keep |
+| GET | /health | server/admin/routes.js:841 | | keep |
| POST | /identity | server/setup/routes.js:152 | | keep |
| POST | /identity | server/setup/routes.js:152 | | keep |
-| GET | /internal/anon-admin | server/internal/routes.js:661 | | keep |
-| GET | /internal/anon-list | server/internal/routes.js:710 | | keep |
-| POST | /internal/audit | server/internal/routes.js:224 | | keep |
-| GET | /internal/blocks | server/index.js:408 | | keep |
-| POST | /internal/coins/credit | server/internal/routes.js:316 | | keep |
-| POST | /internal/coins/debit | server/internal/routes.js:328 | | keep |
-| GET | /internal/coins/stats | server/internal/routes.js:275 | | keep |
-| POST | /internal/coins/transfer | server/internal/routes.js:341 | | keep |
-| POST | /internal/events/stream-live | server/internal/routes.js:359 | OpenVibe.Events | compat |
+| GET | /internal/anon-admin | server/internal/routes.js:685 | | keep |
+| GET | /internal/anon-list | server/internal/routes.js:734 | | keep |
+| POST | /internal/audit | server/internal/routes.js:226 | | keep |
+| GET | /internal/blocks | server/index.js:452 | | keep |
+| POST | /internal/coins/credit | server/internal/routes.js:322 | | keep |
+| POST | /internal/coins/debit | server/internal/routes.js:334 | | keep |
+| GET | /internal/coins/stats | server/internal/routes.js:281 | | keep |
+| POST | /internal/coins/transfer | server/internal/routes.js:347 | | keep |
+| POST | /internal/events/stream-live | server/internal/routes.js:365 | OpenVibe.Events | compat |
| POST | /internal/identity/legacy-map | server/identity/internal-routes.js:52 | | keep |
| POST | /internal/identity/legacy-map | server/identity/internal-routes.js:52 | | keep |
-| POST | /internal/identity/legacy-map | server/internal/routes.js:84 | | keep |
+| POST | /internal/identity/legacy-map | server/internal/routes.js:86 | | keep |
| GET | /internal/identity/resolve | server/identity/internal-routes.js:18 | | keep |
| GET | /internal/identity/resolve | server/identity/internal-routes.js:18 | | keep |
-| GET | /internal/identity/resolve | server/internal/routes.js:80 | | keep |
+| GET | /internal/identity/resolve | server/internal/routes.js:82 | | keep |
| POST | /internal/identity/resolve-batch | server/identity/internal-routes.js:35 | | keep |
| POST | /internal/identity/resolve-batch | server/identity/internal-routes.js:35 | | keep |
-| POST | /internal/identity/resolve-batch | server/internal/routes.js:81 | | keep |
-| GET | /internal/integrations/github-token | server/index.js:404 | | keep |
-| POST | /internal/issue-token | server/internal/routes.js:551 | | keep |
-| POST | /internal/link-account | server/internal/routes.js:166 | | keep |
-| POST | /internal/notifications/mark-read | server/internal/routes.js:512 | | keep |
-| POST | /internal/notifications/push | server/internal/routes.js:454 | | keep |
-| POST | /internal/notifications/push-bulk | server/internal/routes.js:474 | | keep |
-| POST | /internal/notifications/resolve-users | server/internal/routes.js:531 | | keep |
-| GET | /internal/notifications/unread/:userId | server/internal/routes.js:497 | | keep |
-| POST | /internal/resolve-anon | server/internal/routes.js:582 | | keep |
-| GET | /internal/stats | server/internal/routes.js:233 | | keep |
-| GET | /internal/url-registry/resolved | server/internal/routes.js:244 | | keep |
-| POST | /internal/user-avatar | server/internal/routes.js:209 | | keep |
-| GET | /internal/users/:id | server/internal/routes.js:116 | | keep |
-| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:217 | | keep |
-| GET | /internal/users/:id/theme | server/internal/routes.js:153 | | keep |
-| POST | /internal/users/bulk | server/internal/routes.js:138 | | keep |
-| GET | /internal/users/by-username/:username | server/internal/routes.js:127 | | keep |
-| POST | /internal/verify-token | server/internal/routes.js:92 | | keep |
-| GET | /llms.txt | server/index.js:672 | | keep |
+| POST | /internal/identity/resolve-batch | server/internal/routes.js:83 | | keep |
+| GET | /internal/integrations/github-token | server/index.js:412 | | keep |
+| POST | /internal/issue-token | server/internal/routes.js:575 | | keep |
+| POST | /internal/link-account | server/internal/routes.js:168 | | keep |
+| GET | /internal/mods | server/identity/mod-principals.js:178 | | keep |
+| GET | /internal/mods | server/identity/mod-principals.js:197 | | keep |
+| POST | /internal/mods | server/identity/mod-principals.js:184 | | keep |
+| GET | /internal/mods/:id | server/identity/mod-principals.js:183 | | keep |
+| POST | /internal/mods/:id/grants | server/identity/mod-principals.js:185 | | keep |
+| POST | /internal/mods/:id/grants | server/identity/mod-principals.js:201 | | keep |
+| POST | /internal/mods/:id/revoke | server/identity/mod-principals.js:186 | | keep |
+| POST | /internal/mods/:id/revoke | server/identity/mod-principals.js:210 | | keep |
+| POST | /internal/notifications/mark-read | server/internal/routes.js:536 | | keep |
+| POST | /internal/notifications/push | server/internal/routes.js:460 | | keep |
+| POST | /internal/notifications/push-bulk | server/internal/routes.js:480 | | keep |
+| POST | /internal/notifications/resolve-users | server/internal/routes.js:555 | | keep |
+| GET | /internal/notifications/unread/:userId | server/internal/routes.js:521 | | keep |
+| POST | /internal/operator/alerts | server/internal/routes.js:505 | | keep |
+| POST | /internal/resolve-anon | server/internal/routes.js:606 | | keep |
+| GET | /internal/stats | server/internal/routes.js:235 | | keep |
+| GET | /internal/url-registry/resolved | server/internal/routes.js:247 | | keep |
+| POST | /internal/user-avatar | server/internal/routes.js:211 | | keep |
+| GET | /internal/users/:id | server/internal/routes.js:118 | | keep |
+| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:219 | | keep |
+| GET | /internal/users/:id/theme | server/internal/routes.js:155 | | keep |
+| POST | /internal/users/bulk | server/internal/routes.js:140 | | keep |
+| GET | /internal/users/by-username/:username | server/internal/routes.js:129 | | keep |
+| POST | /internal/verify-token | server/internal/routes.js:94 | | keep |
+| GET | /llms.txt | server/index.js:733 | | keep |
| GET | /me | server/coins/routes.js:18 | | keep |
| GET | /me | server/coins/routes.js:18 | | keep |
| GET | /me/history | server/coins/routes.js:24 | | keep |
| GET | /me/history | server/coins/routes.js:24 | | keep |
-| GET | /net-config | server/admin/routes.js:980 | | keep |
-| PUT | /net-config | server/admin/routes.js:999 | | keep |
+| POST | /merge | server/identity/account-merge.js:293 | | keep |
+| POST | /merge/intents | server/identity/account-merge.js:289 | | keep |
+| GET | /merges | server/identity/account-merge.js:296 | | keep |
+| GET | /net-config | server/admin/routes.js:982 | | keep |
+| PUT | /net-config | server/admin/routes.js:1001 | | keep |
| GET | /newest | server/notifications/routes.js:57 | | keep |
| GET | /newest | server/notifications/routes.js:57 | | keep |
| POST | /nginx/apply | server/deploy/routes.js:343 | | keep |
| POST | /nginx/apply | server/deploy/routes.js:343 | | keep |
| GET | /nginx/preview | server/deploy/routes.js:296 | | keep |
| GET | /nginx/preview | server/deploy/routes.js:296 | | keep |
| GET | /nginx/preview/:serviceId | server/deploy/routes.js:314 | | keep |
| GET | /nginx/preview/:serviceId | server/deploy/routes.js:314 | | keep |
| POST | /nginx/reload | server/deploy/routes.js:382 | | keep |
| POST | /nginx/reload | server/deploy/routes.js:382 | | keep |
| POST | /nginx/validate | server/deploy/routes.js:330 | | keep |
| POST | /nginx/validate | server/deploy/routes.js:330 | | keep |
-| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:421 | | keep |
+| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:422 | | keep |
| GET | /oauth/authorize | server/auth/oauth-routes.js:56 | | keep |
| GET | /oauth/authorize | server/auth/oauth-routes.js:56 | | keep |
| GET | /oauth/client-info | server/auth/oauth-routes.js:130 | | keep |
| GET | /oauth/client-info | server/auth/oauth-routes.js:130 | | keep |
| POST | /oauth/confirm | server/auth/oauth-routes.js:155 | | keep |
| POST | /oauth/confirm | server/auth/oauth-routes.js:155 | | keep |
| POST | /oauth/token | server/auth/oauth-routes.js:215 | | keep |
| POST | /oauth/token | server/auth/oauth-routes.js:215 | | keep |
-| GET | /oauth/userinfo | server/auth/oauth-routes.js:425 | | keep |
-| POST | /oauth/userinfo | server/auth/oauth-routes.js:426 | | keep |
-| GET | /openvibe-sw.js | server/index.js:717 | | keep |
+| GET | /oauth/userinfo | server/auth/oauth-routes.js:426 | | keep |
+| POST | /oauth/userinfo | server/auth/oauth-routes.js:427 | | keep |
+| GET | /openvibe-sw.js | server/index.js:778 | | keep |
| GET | /overview | server/admin/analytics-routes.js:75 | | keep |
| GET | /overview | server/admin/analytics-routes.js:75 | | keep |
| GET | /preferences | server/notifications/routes.js:121 | | keep |
| GET | /preferences | server/notifications/routes.js:121 | | keep |
| PUT | /preferences | server/notifications/routes.js:132 | | keep |
| PUT | /preferences | server/notifications/routes.js:132 | | keep |
@@ -984,39 +1038,39 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -984,39 +1038,39 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /read-batch | server/notifications/routes.js:78 | | keep |
| POST | /read-batch | server/notifications/routes.js:78 | | keep |
| GET | /realtime | server/admin/analytics-routes.js:285 | | keep |
| GET | /realtime | server/admin/analytics-routes.js:285 | | keep |
| POST | /reinit | server/discord/routes.js:111 | | keep |
| POST | /reinit | server/discord/routes.js:111 | | keep |
-| POST | /reset-db | server/admin/routes.js:518 | | keep |
+| POST | /reset-db | server/admin/routes.js:520 | | keep |
| GET | /secrets | server/admin/routes.js:298 | | keep |
| GET | /secrets | server/admin/routes.js:298 | | keep |
| GET | /service/:name | server/admin/analytics-routes.js:224 | | keep |
| GET | /service/:name | server/admin/analytics-routes.js:224 | | keep |
| GET | /settings | server/admin/routes.js:303 | | keep |
| GET | /settings | server/admin/routes.js:303 | | keep |
-| PUT | /settings | server/admin/routes.js:340 | | keep |
-| GET | /sso/check | server/index.js:701 | | keep |
+| PUT | /settings | server/admin/routes.js:341 | | keep |
+| GET | /sso/check | server/index.js:762 | | keep |
| GET | /status | server/setup/routes.js:91 | | keep |
| GET | /status | server/setup/routes.js:91 | | keep |
-| GET | /status | server/status/routes.js:248 | | keep |
+| GET | /status | server/status/routes.js:262 | | keep |
| POST | /test | server/discord/routes.js:92 | | keep |
| POST | /test | server/discord/routes.js:92 | | keep |
| POST | /test-live | server/discord/routes.js:102 | | keep |
| POST | /test-live | server/discord/routes.js:102 | | keep |
-| GET | /tos | server/index.js:528 | | keep |
+| GET | /tos | server/index.js:589 | | keep |
| GET | /unread-by-category | server/notifications/routes.js:47 | | keep |
| GET | /unread-by-category | server/notifications/routes.js:47 | | keep |
| GET | /unread-count | server/notifications/routes.js:37 | | keep |
| GET | /unread-count | server/notifications/routes.js:37 | | keep |
| GET | /updates | server/updates/routes.js:59 | | keep |
| GET | /updates | server/updates/routes.js:59 | | keep |
-| GET | /url-registry | server/admin/routes.js:398 | | keep |
-| PUT | /url-registry | server/admin/routes.js:425 | | keep |
-| DELETE | /url-registry/:key | server/admin/routes.js:468 | | keep |
-| PUT | /url-registry/:key | server/admin/routes.js:446 | | keep |
-| POST | /url-registry/:key/reset | server/admin/routes.js:503 | | keep |
-| POST | /url-registry/refresh-all | server/admin/routes.js:483 | | keep |
+| GET | /url-registry | server/admin/routes.js:399 | | keep |
+| PUT | /url-registry | server/admin/routes.js:427 | | keep |
+| DELETE | /url-registry/:key | server/admin/routes.js:470 | | keep |
+| PUT | /url-registry/:key | server/admin/routes.js:448 | | keep |
+| POST | /url-registry/:key/reset | server/admin/routes.js:505 | | keep |
+| POST | /url-registry/refresh-all | server/admin/routes.js:485 | | keep |
| POST | /urls | server/setup/routes.js:193 | | keep |
| POST | /urls | server/setup/routes.js:193 | | keep |
-| GET | /users | server/admin/routes.js:580 | | keep |
-| PUT | /users/:id/ban | server/admin/routes.js:733 | | keep |
-| PUT | /users/:id/email | server/admin/routes.js:612 | | keep |
-| PUT | /users/:id/role | server/admin/routes.js:710 | | keep |
-| POST | /users/:id/send-reset | server/admin/routes.js:651 | | keep |
-| POST | /users/:id/sign-out | server/admin/routes.js:776 | | keep |
-| PUT | /users/:id/username | server/admin/routes.js:762 | | keep |
-| POST | /users/grant-admin | server/admin/routes.js:545 | | keep |
-| GET | /verification-keys | server/admin/routes.js:897 | | keep |
-| POST | /verification-keys | server/admin/routes.js:906 | | keep |
-| DELETE | /verification-keys/:id | server/admin/routes.js:954 | | keep |
-| GET | /verify-email | server/index.js:684 | | keep |
+| GET | /users | server/admin/routes.js:582 | | keep |
+| PUT | /users/:id/ban | server/admin/routes.js:735 | | keep |
+| PUT | /users/:id/email | server/admin/routes.js:614 | | keep |
+| PUT | /users/:id/role | server/admin/routes.js:712 | | keep |
+| POST | /users/:id/send-reset | server/admin/routes.js:653 | | keep |
+| POST | /users/:id/sign-out | server/admin/routes.js:778 | | keep |
+| PUT | /users/:id/username | server/admin/routes.js:764 | | keep |
+| POST | /users/grant-admin | server/admin/routes.js:547 | | keep |
+| GET | /verification-keys | server/admin/routes.js:899 | | keep |
+| POST | /verification-keys | server/admin/routes.js:908 | | keep |
+| DELETE | /verification-keys/:id | server/admin/routes.js:956 | | keep |
+| GET | /verify-email | server/index.js:745 | | keep |
## OpenVibe.Shared
## OpenVibe.Shared
@@ -1029,37 +1083,40 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1029,37 +1083,40 @@ Owner = the repository whose code answers the route; target = the authority it b
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | /api/ready | server/observability.js:153 | | keep |
-| GET | /api/v1/:app/admin/storage | server/admin/routes.js:87 | | keep |
-| GET | /api/v1/:app/admin/storage/buckets | server/admin/routes.js:639 | | keep |
-| GET | /api/v1/:app/admin/storage/holds | server/admin/routes.js:537 | | keep |
-| POST | /api/v1/:app/admin/storage/holds | server/admin/routes.js:558 | | keep |
-| DELETE | /api/v1/:app/admin/storage/holds/:holdId | server/admin/routes.js:598 | | keep |
-| POST | /api/v1/:app/admin/storage/holds/:holdId/release | server/admin/routes.js:597 | | keep |
-| GET | /api/v1/:app/admin/storage/ops | server/admin/routes.js:613 | | keep |
-| POST | /api/v1/:app/admin/storage/ops/recompute | server/admin/routes.js:624 | | keep |
-| GET | /api/v1/:app/admin/storage/tiers | server/admin/routes.js:273 | | keep |
-| POST | /api/v1/:app/admin/storage/tiers/bulk-move | server/admin/routes.js:465 | | keep |
-| GET | /api/v1/:app/admin/storage/tiers/decisions | server/admin/routes.js:394 | | keep |
-| POST | /api/v1/:app/admin/storage/tiers/move | server/admin/routes.js:447 | | keep |
-| GET | /api/v1/:app/admin/storage/tiers/policy | server/admin/routes.js:367 | | keep |
-| PUT | /api/v1/:app/admin/storage/tiers/settings | server/admin/routes.js:323 | | keep |
-| POST | /api/v1/:app/admin/storage/tiers/sweep | server/admin/routes.js:419 | | keep |
-| GET | /api/v1/:app/admin/storage/vods | server/admin/routes.js:142 | | keep |
-| DELETE | /api/v1/:app/admin/storage/vods/bulk | server/admin/routes.js:214 | | keep |
+| GET | /api/ready | server/observability.js:156 | | keep |
+| GET | /api/v1/:app/admin/storage | server/admin/routes.js:102 | | keep |
+| GET | /api/v1/:app/admin/storage/buckets | server/admin/routes.js:692 | | keep |
+| GET | /api/v1/:app/admin/storage/holds | server/admin/routes.js:590 | | keep |
+| POST | /api/v1/:app/admin/storage/holds | server/admin/routes.js:611 | | keep |
+| DELETE | /api/v1/:app/admin/storage/holds/:holdId | server/admin/routes.js:651 | | keep |
+| POST | /api/v1/:app/admin/storage/holds/:holdId/release | server/admin/routes.js:650 | | keep |
+| GET | /api/v1/:app/admin/storage/ops | server/admin/routes.js:666 | | keep |
+| POST | /api/v1/:app/admin/storage/ops/recompute | server/admin/routes.js:677 | | keep |
+| GET | /api/v1/:app/admin/storage/tiers | server/admin/routes.js:288 | | keep |
+| POST | /api/v1/:app/admin/storage/tiers/bulk-move | server/admin/routes.js:518 | | keep |
+| GET | /api/v1/:app/admin/storage/tiers/decisions | server/admin/routes.js:410 | | keep |
+| POST | /api/v1/:app/admin/storage/tiers/move | server/admin/routes.js:500 | | keep |
+| GET | /api/v1/:app/admin/storage/tiers/objects/decisions | server/admin/routes.js:458 | | keep |
+| GET | /api/v1/:app/admin/storage/tiers/objects/policy | server/admin/routes.js:439 | | keep |
+| GET | /api/v1/:app/admin/storage/tiers/policy | server/admin/routes.js:383 | | keep |
+| PUT | /api/v1/:app/admin/storage/tiers/settings | server/admin/routes.js:338 | | keep |
+| POST | /api/v1/:app/admin/storage/tiers/sweep | server/admin/routes.js:472 | | keep |
+| GET | /api/v1/:app/admin/storage/vods | server/admin/routes.js:157 | | keep |
+| DELETE | /api/v1/:app/admin/storage/vods/bulk | server/admin/routes.js:229 | | keep |
| GET | /api/v1/:app/assets | server/assets/routes.js:72 | | keep |
| GET | /api/v1/:app/assets | server/assets/routes.js:72 | | keep |
| POST | /api/v1/:app/assets | server/assets/routes.js:39 | | keep |
| POST | /api/v1/:app/assets | server/assets/routes.js:39 | | keep |
| DELETE | /api/v1/:app/assets/:id | server/assets/routes.js:84 | | keep |
| DELETE | /api/v1/:app/assets/:id | server/assets/routes.js:84 | | keep |
-| GET | /api/v1/:app/clips | server/vod/clips-routes.js:288 | | keep |
-| POST | /api/v1/:app/clips | server/vod/clips-routes.js:124 | | keep |
-| DELETE | /api/v1/:app/clips/:id | server/vod/clips-routes.js:380 | | keep |
-| GET | /api/v1/:app/clips/:id | server/vod/clips-routes.js:317 | | keep |
-| PUT | /api/v1/:app/clips/:id | server/vod/clips-routes.js:357 | | keep |
-| POST | /api/v1/:app/clips/:id/recut | server/vod/clips-routes.js:340 | | keep |
-| GET | /api/v1/:app/files | server/files/routes.js:152 | | keep |
-| POST | /api/v1/:app/files | server/files/routes.js:88 | | keep |
-| DELETE | /api/v1/:app/files/:key | server/files/routes.js:180 | | keep |
-| GET | /api/v1/:app/files/:key | server/files/routes.js:169 | | keep |
+| GET | /api/v1/:app/clips | server/vod/clips-routes.js:302 | | keep |
+| POST | /api/v1/:app/clips | server/vod/clips-routes.js:138 | | keep |
+| DELETE | /api/v1/:app/clips/:id | server/vod/clips-routes.js:403 | | keep |
+| GET | /api/v1/:app/clips/:id | server/vod/clips-routes.js:340 | | keep |
+| PUT | /api/v1/:app/clips/:id | server/vod/clips-routes.js:380 | | keep |
+| POST | /api/v1/:app/clips/:id/recut | server/vod/clips-routes.js:363 | | keep |
+| GET | /api/v1/:app/clips/:id/signed-url | server/vod/clips-routes.js:332 | | keep |
+| GET | /api/v1/:app/files | server/files/routes.js:155 | | keep |
+| POST | /api/v1/:app/files | server/files/routes.js:91 | | keep |
+| DELETE | /api/v1/:app/files/:key | server/files/routes.js:184 | | keep |
+| GET | /api/v1/:app/files/:key | server/files/routes.js:172 | | keep |
| GET | /api/v1/:app/pastes | server/pastes/routes.js:260 | OpenVibe.Community | frozen-legacy |
| GET | /api/v1/:app/pastes | server/pastes/routes.js:260 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes | server/pastes/routes.js:477 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes | server/pastes/routes.js:477 | OpenVibe.Community | frozen-legacy |
| DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:633 | OpenVibe.Community | frozen-legacy |
| DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:633 | OpenVibe.Community | frozen-legacy |
@@ -1078,170 +1135,171 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1078,170 +1135,171 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:341 | OpenVibe.Community | frozen-legacy |
| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:341 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:384 | OpenVibe.Community | frozen-legacy |
| POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:384 | OpenVibe.Community | frozen-legacy |
| GET | /api/v1/:app/pastes/config | server/pastes/routes.js:319 | OpenVibe.Community | frozen-legacy |
| GET | /api/v1/:app/pastes/config | server/pastes/routes.js:319 | OpenVibe.Community | frozen-legacy |
-| GET | /api/v1/:app/stats | server/index.js:156 | | keep |
-| GET | /api/v1/:app/stats/series/:metric | server/index.js:166 | | keep |
+| GET | /api/v1/:app/stats | server/index.js:158 | | keep |
+| GET | /api/v1/:app/stats/series/:metric | server/index.js:168 | | keep |
| POST | /api/v1/:app/thumbnails/:kind/:id | server/thumbnails/routes.js:42 | | keep |
| POST | /api/v1/:app/thumbnails/:kind/:id | server/thumbnails/routes.js:42 | | keep |
| GET | /api/v1/:app/views | server/views/routes.js:39 | | keep |
| GET | /api/v1/:app/views | server/views/routes.js:39 | | keep |
| POST | /api/v1/:app/views | server/views/routes.js:24 | | keep |
| POST | /api/v1/:app/views | server/views/routes.js:24 | | keep |
-| GET | /api/v1/:app/vods | server/vod/routes.js:272 | | keep |
-| POST | /api/v1/:app/vods | server/vod/routes.js:95 | | keep |
-| DELETE | /api/v1/:app/vods/:id | server/vod/routes.js:370 | | keep |
-| GET | /api/v1/:app/vods/:id | server/vod/routes.js:313 | | keep |
-| PUT | /api/v1/:app/vods/:id | server/vod/routes.js:345 | | keep |
-| POST | /api/v1/:app/vods/:id/chunks | server/vod/routes.js:161 | | keep |
-| POST | /api/v1/:app/vods/:id/complete | server/vod/routes.js:265 | | keep |
-| POST | /api/v1/:app/vods/:id/finalize | server/vod/routes.js:266 | | keep |
-| POST | /api/v1/:app/vods/:id/ingest/rtmp | server/vod/routes.js:118 | | keep |
-| POST | /api/v1/:app/vods/:id/ingest/rtp/start | server/vod/routes.js:132 | | keep |
-| POST | /api/v1/:app/vods/:id/ingest/rtp/stop | server/vod/routes.js:146 | | keep |
-| GET | /api/v1/:app/vods/latest-thumbs | server/vod/routes.js:302 | | keep |
-| GET | /api/v2/:app/jobs | server/jobs/routes.js:74 | | keep |
-| POST | /api/v2/:app/jobs | server/jobs/routes.js:87 | | keep |
-| DELETE | /api/v2/:app/jobs/:jobId | server/jobs/routes.js:147 | | keep |
-| GET | /api/v2/:app/jobs/:jobId | server/jobs/routes.js:120 | | keep |
-| POST | /api/v2/:app/jobs/:jobId/approve | server/jobs/routes.js:125 | | keep |
-| POST | /api/v2/:app/jobs/:jobId/cancel | server/jobs/routes.js:146 | | keep |
-| GET | /api/v2/:app/namespaces | server/objects/namespace-routes.js:32 | | keep |
-| GET | /api/v2/:app/namespaces/:namespace | server/objects/namespace-routes.js:42 | | keep |
-| GET | /api/v2/:app/objects | server/objects/routes.js:556 | | keep |
-| POST | /api/v2/:app/objects | server/objects/routes.js:291 | | keep |
-| DELETE | /api/v2/:app/objects/:id | server/objects/routes.js:609 | | keep |
-| GET | /api/v2/:app/objects/:id | server/objects/routes.js:604 | | keep |
-| GET | /api/v2/:app/objects/:id | server/objects/routes.js:700 | | keep |
-| POST | /api/v2/:app/objects/:id/complete | server/objects/routes.js:425 | | keep |
-| PUT | /api/v2/:app/objects/:id/content | server/index.js:63 | | keep |
-| GET | /api/v2/:app/objects/:id/download | server/objects/routes.js:641 | | keep |
-| GET | /api/v2/:app/objects/:id/holds | server/objects/routes.js:660 | | keep |
-| POST | /api/v2/:app/objects/:id/holds | server/objects/routes.js:672 | | keep |
-| DELETE | /api/v2/:app/objects/:id/holds/:holdId | server/objects/routes.js:684 | | keep |
-| POST | /api/v2/:app/objects/:id/multipart | server/objects/routes.js:468 | | keep |
-| DELETE | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:545 | | keep |
-| GET | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:499 | | keep |
-| POST | /api/v2/:app/objects/:id/multipart/:uploadId/complete | server/objects/routes.js:508 | | keep |
-| PUT | /api/v2/:app/objects/:id/multipart/:uploadId/parts/:n | server/index.js:64 | | keep |
-| POST | /api/v2/:app/objects/:id/restore | server/objects/routes.js:627 | | keep |
-| POST | /api/v2/:app/objects/:id/upload-url | server/objects/routes.js:441 | | keep |
-| GET | /api/v2/me | server/me/routes.js:202 | | keep |
-| GET | /api/v2/me/app.js | server/me/routes.js:185 | | keep |
-| GET | /api/v2/me/objects | server/me/routes.js:125 | | keep |
-| GET | /api/v2/me/objects/:id | server/me/routes.js:137 | | keep |
-| GET | /api/v2/me/objects/:id | server/me/routes.js:217 | | keep |
-| GET | /api/v2/me/ops | server/me/routes.js:154 | | keep |
-| GET | /api/v2/me/ops | server/me/routes.js:224 | | keep |
-| POST | /api/v2/me/ops/recompute | server/me/routes.js:167 | | keep |
-| POST | /api/v2/me/ops/recompute | server/me/routes.js:234 | | keep |
-| GET | /api/v2/me/usage | server/me/routes.js:144 | | keep |
+| GET | /api/v1/:app/vods | server/vod/routes.js:273 | | keep |
+| POST | /api/v1/:app/vods | server/vod/routes.js:98 | | keep |
+| DELETE | /api/v1/:app/vods/:id | server/vod/routes.js:383 | | keep |
+| GET | /api/v1/:app/vods/:id | server/vod/routes.js:326 | | keep |
+| PUT | /api/v1/:app/vods/:id | server/vod/routes.js:358 | | keep |
+| POST | /api/v1/:app/vods/:id/chunks | server/vod/routes.js:164 | | keep |
+| POST | /api/v1/:app/vods/:id/complete | server/vod/routes.js:266 | | keep |
+| POST | /api/v1/:app/vods/:id/finalize | server/vod/routes.js:267 | | keep |
+| POST | /api/v1/:app/vods/:id/ingest/rtmp | server/vod/routes.js:121 | | keep |
+| POST | /api/v1/:app/vods/:id/ingest/rtp/start | server/vod/routes.js:135 | | keep |
+| POST | /api/v1/:app/vods/:id/ingest/rtp/stop | server/vod/routes.js:149 | | keep |
+| GET | /api/v1/:app/vods/:id/signed-url | server/vod/routes.js:317 | | keep |
+| GET | /api/v1/:app/vods/latest-thumbs | server/vod/routes.js:303 | | keep |
+| GET | /api/v2/:app/jobs | server/jobs/routes.js:78 | | keep |
+| POST | /api/v2/:app/jobs | server/jobs/routes.js:91 | | keep |
+| DELETE | /api/v2/:app/jobs/:jobId | server/jobs/routes.js:153 | | keep |
+| GET | /api/v2/:app/jobs/:jobId | server/jobs/routes.js:124 | | keep |
+| POST | /api/v2/:app/jobs/:jobId/approve | server/jobs/routes.js:129 | | keep |
+| POST | /api/v2/:app/jobs/:jobId/cancel | server/jobs/routes.js:152 | | keep |
+| GET | /api/v2/:app/namespaces | server/objects/namespace-routes.js:34 | | keep |
+| GET | /api/v2/:app/namespaces/:namespace | server/objects/namespace-routes.js:44 | | keep |
+| GET | /api/v2/:app/objects | server/objects/routes.js:564 | | keep |
+| POST | /api/v2/:app/objects | server/objects/routes.js:296 | | keep |
+| DELETE | /api/v2/:app/objects/:id | server/objects/routes.js:618 | | keep |
+| GET | /api/v2/:app/objects/:id | server/objects/routes.js:612 | | keep |
+| GET | /api/v2/:app/objects/:id | server/objects/routes.js:718 | | keep |
+| POST | /api/v2/:app/objects/:id/complete | server/objects/routes.js:431 | | keep |
+| PUT | /api/v2/:app/objects/:id/content | server/index.js:65 | | keep |
+| GET | /api/v2/:app/objects/:id/download | server/objects/routes.js:650 | | keep |
+| GET | /api/v2/:app/objects/:id/holds | server/objects/routes.js:669 | | keep |
+| POST | /api/v2/:app/objects/:id/holds | server/objects/routes.js:688 | | keep |
+| DELETE | /api/v2/:app/objects/:id/holds/:holdId | server/objects/routes.js:701 | | keep |
+| POST | /api/v2/:app/objects/:id/multipart | server/objects/routes.js:474 | | keep |
+| DELETE | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:553 | | keep |
+| GET | /api/v2/:app/objects/:id/multipart/:uploadId | server/objects/routes.js:505 | | keep |
+| POST | /api/v2/:app/objects/:id/multipart/:uploadId/complete | server/objects/routes.js:515 | | keep |
+| PUT | /api/v2/:app/objects/:id/multipart/:uploadId/parts/:n | server/index.js:66 | | keep |
+| POST | /api/v2/:app/objects/:id/restore | server/objects/routes.js:636 | | keep |
+| POST | /api/v2/:app/objects/:id/upload-url | server/objects/routes.js:447 | | keep |
+| GET | /api/v2/me | server/me/routes.js:206 | | keep |
+| GET | /api/v2/me/app.js | server/me/routes.js:189 | | keep |
+| GET | /api/v2/me/objects | server/me/routes.js:128 | | keep |
+| GET | /api/v2/me/objects/:id | server/me/routes.js:140 | | keep |
+| GET | /api/v2/me/objects/:id | server/me/routes.js:221 | | keep |
+| GET | /api/v2/me/ops | server/me/routes.js:157 | | keep |
+| GET | /api/v2/me/ops | server/me/routes.js:228 | | keep |
+| POST | /api/v2/me/ops/recompute | server/me/routes.js:171 | | keep |
+| POST | /api/v2/me/ops/recompute | server/me/routes.js:238 | | keep |
+| GET | /api/v2/me/usage | server/me/routes.js:147 | | keep |
| GET | /auth/callback | server/user-auth.js:288 | | keep |
| GET | /auth/callback | server/user-auth.js:288 | | keep |
| POST | /auth/fedcm | server/user-auth.js:334 | | keep |
| POST | /auth/fedcm | server/user-auth.js:334 | | keep |
| GET | /auth/login | server/user-auth.js:266 | | keep |
| GET | /auth/login | server/user-auth.js:266 | | keep |
| GET | /auth/logout | server/user-auth.js:362 | | keep |
| GET | /auth/logout | server/user-auth.js:362 | | keep |
| GET | /auth/me | server/user-auth.js:386 | | keep |
| GET | /auth/me | server/user-auth.js:386 | | keep |
| POST | /auth/refresh | server/user-auth.js:399 | | keep |
| POST | /auth/refresh | server/user-auth.js:399 | | keep |
-| GET | /healthz | server/index.js:133 | | keep |
-| POST | /internal/avatar-ingest | server/index.js:97 | | keep |
-| POST | /internal/events | server/index.js:67 | | keep |
-| GET | /limits.json | server/limits.js:43 | | keep |
-| GET | /manifest.webmanifest | server/index.js:85 | | keep |
-| GET | /me | server/me/routes.js:202 | | keep |
-| GET | /me/app.js | server/me/routes.js:185 | | keep |
-| GET | /me/objects | server/me/routes.js:125 | | keep |
-| GET | /me/objects/:id | server/me/routes.js:137 | | keep |
-| GET | /me/objects/:id | server/me/routes.js:217 | | keep |
-| GET | /me/ops | server/me/routes.js:154 | | keep |
-| GET | /me/ops | server/me/routes.js:224 | | keep |
-| POST | /me/ops/recompute | server/me/routes.js:167 | | keep |
-| POST | /me/ops/recompute | server/me/routes.js:234 | | keep |
-| GET | /me/usage | server/me/routes.js:144 | | keep |
-| GET | /o | server/objects/routes.js:556 | | keep |
-| POST | /o | server/objects/routes.js:291 | | keep |
-| DELETE | /o/:id | server/objects/routes.js:609 | | keep |
-| GET | /o/:id | server/objects/routes.js:604 | | keep |
-| GET | /o/:id | server/objects/routes.js:700 | | keep |
-| POST | /o/:id/complete | server/objects/routes.js:425 | | keep |
-| GET | /o/:id/download | server/objects/routes.js:641 | | keep |
-| GET | /o/:id/holds | server/objects/routes.js:660 | | keep |
-| POST | /o/:id/holds | server/objects/routes.js:672 | | keep |
-| DELETE | /o/:id/holds/:holdId | server/objects/routes.js:684 | | keep |
-| POST | /o/:id/multipart | server/objects/routes.js:468 | | keep |
-| DELETE | /o/:id/multipart/:uploadId | server/objects/routes.js:545 | | keep |
-| GET | /o/:id/multipart/:uploadId | server/objects/routes.js:499 | | keep |
-| POST | /o/:id/multipart/:uploadId/complete | server/objects/routes.js:508 | | keep |
-| POST | /o/:id/restore | server/objects/routes.js:627 | | keep |
-| POST | /o/:id/upload-url | server/objects/routes.js:441 | | keep |
-| GET | /tos | server/index.js:80 | | keep |
+| GET | /healthz | server/index.js:135 | | keep |
+| POST | /internal/avatar-ingest | server/index.js:99 | | keep |
+| POST | /internal/events | server/index.js:69 | | keep |
+| GET | /limits.json | server/limits.js:42 | | keep |
+| GET | /manifest.webmanifest | server/index.js:87 | | keep |
+| GET | /me | server/me/routes.js:206 | | keep |
+| GET | /me/app.js | server/me/routes.js:189 | | keep |
+| GET | /me/objects | server/me/routes.js:128 | | keep |
+| GET | /me/objects/:id | server/me/routes.js:140 | | keep |
+| GET | /me/objects/:id | server/me/routes.js:221 | | keep |
+| GET | /me/ops | server/me/routes.js:157 | | keep |
+| GET | /me/ops | server/me/routes.js:228 | | keep |
+| POST | /me/ops/recompute | server/me/routes.js:171 | | keep |
+| POST | /me/ops/recompute | server/me/routes.js:238 | | keep |
+| GET | /me/usage | server/me/routes.js:147 | | keep |
+| GET | /o | server/objects/routes.js:564 | | keep |
+| POST | /o | server/objects/routes.js:296 | | keep |
+| DELETE | /o/:id | server/objects/routes.js:618 | | keep |
+| GET | /o/:id | server/objects/routes.js:612 | | keep |
+| GET | /o/:id | server/objects/routes.js:718 | | keep |
+| POST | /o/:id/complete | server/objects/routes.js:431 | | keep |
+| GET | /o/:id/download | server/objects/routes.js:650 | | keep |
+| GET | /o/:id/holds | server/objects/routes.js:669 | | keep |
+| POST | /o/:id/holds | server/objects/routes.js:688 | | keep |
+| DELETE | /o/:id/holds/:holdId | server/objects/routes.js:701 | | keep |
+| POST | /o/:id/multipart | server/objects/routes.js:474 | | keep |
+| DELETE | /o/:id/multipart/:uploadId | server/objects/routes.js:553 | | keep |
+| GET | /o/:id/multipart/:uploadId | server/objects/routes.js:505 | | keep |
+| POST | /o/:id/multipart/:uploadId/complete | server/objects/routes.js:515 | | keep |
+| POST | /o/:id/restore | server/objects/routes.js:636 | | keep |
+| POST | /o/:id/upload-url | server/objects/routes.js:447 | | keep |
+| GET | /tos | server/index.js:82 | | keep |
## OpenVibe.Tools
## OpenVibe.Tools
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
| GET | / | apps/gateway/server/pages/site.js:309 | | keep |
| GET | / | apps/gateway/server/pages/site.js:309 | | keep |
-| GET | / | apps/text/server/index.js:155 | | keep |
+| GET | / | apps/text/server/index.js:159 | | keep |
| GET | /:slug | apps/gateway/server/pages/site.js:317 | | keep |
| GET | /:slug | apps/gateway/server/pages/site.js:317 | | keep |
| GET | /all-tools | apps/gateway/server/pages/site.js:310 | | keep |
| GET | /all-tools | apps/gateway/server/pages/site.js:310 | | keep |
-| GET | /api/brand | apps/gateway/server/index.js:309 | | keep |
+| GET | /api/brand | apps/gateway/server/index.js:317 | | keep |
| GET | /api/catalog.json | apps/gateway/server/pages/site.js:308 | | keep |
| GET | /api/catalog.json | apps/gateway/server/pages/site.js:308 | | keep |
-| GET | /api/context | apps/audio/server/index.js:165 | | keep |
-| GET | /api/context | apps/docs/server/index.js:194 | | keep |
-| GET | /api/context | apps/img/server/index.js:188 | | keep |
-| POST | /api/download | apps/yt/server/index.js:174 | | keep |
-| DELETE | /api/download/:id | apps/yt/server/index.js:261 | | keep |
-| GET | /api/download/:id | apps/audio/server/index.js:298 | | keep |
-| GET | /api/download/:id | apps/docs/server/index.js:349 | | keep |
-| GET | /api/download/:id | apps/img/server/index.js:291 | | keep |
-| GET | /api/download/:id | apps/yt/server/index.js:268 | | keep |
-| GET | /api/food-banks | apps/food/server/index.js:137 | | keep |
-| GET | /api/food-banks | apps/maps/server/index.js:431 | | keep |
-| GET | /api/foods | apps/food/server/index.js:139 | | keep |
-| GET | /api/foods | apps/maps/server/index.js:452 | | keep |
-| GET | /api/geocode | apps/food/server/index.js:141 | | keep |
-| GET | /api/geocode | apps/maps/server/index.js:153 | | keep |
-| GET | /api/health | apps/audio/server/index.js:158 | | keep |
-| GET | /api/health | apps/docs/server/index.js:187 | | keep |
-| GET | /api/health | apps/gateway/server/index.js:305 | | keep |
-| GET | /api/health | apps/img/server/index.js:181 | | keep |
-| GET | /api/health | apps/text/server/index.js:128 | | keep |
-| GET | /api/health | apps/yt/server/index.js:149 | | keep |
-| POST | /api/info | apps/docs/server/index.js:218 | | keep |
-| POST | /api/info | apps/yt/server/index.js:156 | | keep |
-| GET | /api/internal/analytics | apps/audio/server/index.js:347 | | keep |
-| GET | /api/internal/analytics | apps/docs/server/index.js:367 | | keep |
-| GET | /api/internal/analytics | apps/food/server/index.js:144 | | keep |
-| GET | /api/internal/analytics | apps/gateway/server/index.js:392 | | keep |
-| GET | /api/internal/analytics | apps/img/server/index.js:309 | | keep |
-| GET | /api/internal/analytics | apps/maps/server/index.js:474 | | keep |
-| GET | /api/internal/analytics | apps/text/server/index.js:116 | | keep |
-| GET | /api/internal/analytics | apps/yt/server/index.js:282 | | keep |
-| GET | /api/internal/analytics/bots | apps/audio/server/index.js:352 | | keep |
-| GET | /api/internal/analytics/bots | apps/docs/server/index.js:372 | | keep |
-| GET | /api/internal/analytics/bots | apps/food/server/index.js:149 | | keep |
-| GET | /api/internal/analytics/bots | apps/img/server/index.js:314 | | keep |
-| GET | /api/internal/analytics/bots | apps/maps/server/index.js:479 | | keep |
-| GET | /api/internal/analytics/bots | apps/text/server/index.js:121 | | keep |
-| GET | /api/internal/analytics/bots | apps/yt/server/index.js:287 | | keep |
+| GET | /api/context | apps/audio/server/index.js:169 | | keep |
+| GET | /api/context | apps/docs/server/index.js:198 | | keep |
+| GET | /api/context | apps/img/server/index.js:192 | | keep |
+| POST | /api/download | apps/yt/server/index.js:178 | | keep |
+| DELETE | /api/download/:id | apps/yt/server/index.js:265 | | keep |
+| GET | /api/download/:id | apps/audio/server/index.js:302 | | keep |
+| GET | /api/download/:id | apps/docs/server/index.js:353 | | keep |
+| GET | /api/download/:id | apps/img/server/index.js:295 | | keep |
+| GET | /api/download/:id | apps/yt/server/index.js:272 | | keep |
+| GET | /api/food-banks | apps/food/server/index.js:141 | | keep |
+| GET | /api/food-banks | apps/maps/server/index.js:435 | | keep |
+| GET | /api/foods | apps/food/server/index.js:143 | | keep |
+| GET | /api/foods | apps/maps/server/index.js:456 | | keep |
+| GET | /api/geocode | apps/food/server/index.js:145 | | keep |
+| GET | /api/geocode | apps/maps/server/index.js:157 | | keep |
+| GET | /api/health | apps/audio/server/index.js:162 | | keep |
+| GET | /api/health | apps/docs/server/index.js:191 | | keep |
+| GET | /api/health | apps/gateway/server/index.js:313 | | keep |
+| GET | /api/health | apps/img/server/index.js:185 | | keep |
+| GET | /api/health | apps/text/server/index.js:132 | | keep |
+| GET | /api/health | apps/yt/server/index.js:153 | | keep |
+| POST | /api/info | apps/docs/server/index.js:222 | | keep |
+| POST | /api/info | apps/yt/server/index.js:160 | | keep |
+| GET | /api/internal/analytics | apps/audio/server/index.js:351 | | keep |
+| GET | /api/internal/analytics | apps/docs/server/index.js:371 | | keep |
+| GET | /api/internal/analytics | apps/food/server/index.js:148 | | keep |
+| GET | /api/internal/analytics | apps/gateway/server/index.js:409 | | keep |
+| GET | /api/internal/analytics | apps/img/server/index.js:313 | | keep |
+| GET | /api/internal/analytics | apps/maps/server/index.js:478 | | keep |
+| GET | /api/internal/analytics | apps/text/server/index.js:120 | | keep |
+| GET | /api/internal/analytics | apps/yt/server/index.js:286 | | keep |
+| GET | /api/internal/analytics/bots | apps/audio/server/index.js:356 | | keep |
+| GET | /api/internal/analytics/bots | apps/docs/server/index.js:376 | | keep |
+| GET | /api/internal/analytics/bots | apps/food/server/index.js:153 | | keep |
+| GET | /api/internal/analytics/bots | apps/img/server/index.js:318 | | keep |
+| GET | /api/internal/analytics/bots | apps/maps/server/index.js:483 | | keep |
+| GET | /api/internal/analytics/bots | apps/text/server/index.js:125 | | keep |
+| GET | /api/internal/analytics/bots | apps/yt/server/index.js:291 | | keep |
| GET | /api/internal/jobs/:id | apps/_shared/jobs/http.js:112 | | keep |
| GET | /api/internal/jobs/:id | apps/_shared/jobs/http.js:112 | | keep |
-| GET | /api/meal-plan | apps/food/server/index.js:140 | | keep |
-| GET | /api/meal-plan | apps/maps/server/index.js:462 | | keep |
-| GET | /api/preview/:id | apps/audio/server/index.js:316 | | keep |
-| POST | /api/probe | apps/audio/server/index.js:189 | | keep |
+| GET | /api/meal-plan | apps/food/server/index.js:144 | | keep |
+| GET | /api/meal-plan | apps/maps/server/index.js:466 | | keep |
+| GET | /api/preview/:id | apps/audio/server/index.js:320 | | keep |
+| POST | /api/probe | apps/audio/server/index.js:193 | | keep |
| POST | /api/process | apps/_shared/guard/index.js:12 | | keep |
| POST | /api/process | apps/_shared/guard/index.js:12 | | keep |
-| POST | /api/process | apps/audio/server/index.js:202 | | keep |
-| POST | /api/process | apps/docs/server/index.js:230 | | keep |
-| POST | /api/process | apps/img/server/index.js:214 | | keep |
-| POST | /api/process/direct | apps/img/server/index.js:241 | | keep |
-| POST | /api/process/multi | apps/audio/server/index.js:243 | | keep |
-| POST | /api/process/multi | apps/docs/server/index.js:277 | | keep |
+| POST | /api/process | apps/audio/server/index.js:206 | | keep |
+| POST | /api/process | apps/docs/server/index.js:234 | | keep |
+| POST | /api/process | apps/img/server/index.js:218 | | keep |
+| POST | /api/process/direct | apps/img/server/index.js:245 | | keep |
+| POST | /api/process/multi | apps/audio/server/index.js:247 | | keep |
+| POST | /api/process/multi | apps/docs/server/index.js:281 | | keep |
| GET | /api/ready | apps/_shared/observe.js:73 | | keep |
| GET | /api/ready | apps/_shared/observe.js:73 | | keep |
| GET | /api/ready | apps/gateway/server/index.js:133 | | keep |
| GET | /api/ready | apps/gateway/server/index.js:133 | | keep |
-| GET | /api/search | apps/maps/server/index.js:260 | | keep |
-| GET | /api/search/stream | apps/maps/server/index.js:305 | | keep |
-| GET | /api/status/:id | apps/yt/server/index.js:194 | | keep |
-| GET | /api/status/:id/stream | apps/yt/server/index.js:210 | | keep |
-| GET | /api/stores | apps/food/server/index.js:138 | | keep |
-| GET | /api/stores | apps/maps/server/index.js:442 | | keep |
-| GET | /api/terrain | apps/maps/server/index.js:421 | | keep |
-| GET | /api/tools | apps/audio/server/index.js:184 | | keep |
-| GET | /api/tools | apps/docs/server/index.js:213 | | keep |
-| GET | /api/tools | apps/img/server/index.js:209 | | keep |
+| GET | /api/search | apps/maps/server/index.js:264 | | keep |
+| GET | /api/search/stream | apps/maps/server/index.js:309 | | keep |
+| GET | /api/status/:id | apps/yt/server/index.js:198 | | keep |
+| GET | /api/status/:id/stream | apps/yt/server/index.js:214 | | keep |
+| GET | /api/stores | apps/food/server/index.js:142 | | keep |
+| GET | /api/stores | apps/maps/server/index.js:446 | | keep |
+| GET | /api/terrain | apps/maps/server/index.js:425 | | keep |
+| GET | /api/tools | apps/audio/server/index.js:188 | | keep |
+| GET | /api/tools | apps/docs/server/index.js:217 | | keep |
+| GET | /api/tools | apps/img/server/index.js:213 | | keep |
| POST | /api/v1/jobs | apps/_shared/jobs/http.js:147 | | keep |
| POST | /api/v1/jobs | apps/_shared/jobs/http.js:147 | | keep |
| DELETE | /api/v1/jobs/:id | apps/_shared/jobs/http.js:194 | | keep |
| DELETE | /api/v1/jobs/:id | apps/_shared/jobs/http.js:194 | | keep |
| GET | /api/v1/jobs/:id | apps/_shared/jobs/http.js:188 | | keep |
| GET | /api/v1/jobs/:id | apps/_shared/jobs/http.js:188 | | keep |
@@ -1250,9 +1308,10 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1250,9 +1308,10 @@ Owner = the repository whose code answers the route; target = the authority it b
| DELETE | /api/v1/jobs/:id/references/:ref | apps/_shared/jobs/http.js:236 | | keep |
| DELETE | /api/v1/jobs/:id/references/:ref | apps/_shared/jobs/http.js:236 | | keep |
| PUT | /api/v1/jobs/:id/references/:ref | apps/_shared/jobs/http.js:235 | | keep |
| PUT | /api/v1/jobs/:id/references/:ref | apps/_shared/jobs/http.js:235 | | keep |
| POST | /api/v1/jobs/:id/retry | apps/_shared/jobs/http.js:204 | | keep |
| POST | /api/v1/jobs/:id/retry | apps/_shared/jobs/http.js:204 | | keep |
-| GET | /api/v1/me/recent-tools | apps/gateway/server/index.js:203 | | keep |
+| GET | /api/v1/me/recent-tools | apps/gateway/server/index.js:207 | | keep |
| GET | /api/v1/openapi.json | apps/gateway/server/pages/site.js:304 | | keep |
| GET | /api/v1/openapi.json | apps/gateway/server/pages/site.js:304 | | keep |
-| GET | /api/weather | apps/maps/server/index.js:405 | | keep |
+| POST | /api/v1/tools/:id/run | apps/gateway/server/index.js:266 | | keep |
+| GET | /api/weather | apps/maps/server/index.js:409 | | keep |
| GET | /auth/fedcm/callback | apps/gateway/server/auth/routes.js:331 | | keep |
| GET | /auth/fedcm/callback | apps/gateway/server/auth/routes.js:331 | | keep |
| POST | /auth/fedcm/fedcm | apps/gateway/server/auth/routes.js:381 | | keep |
| POST | /auth/fedcm/fedcm | apps/gateway/server/auth/routes.js:381 | | keep |
| GET | /auth/fedcm/login | apps/gateway/server/auth/routes.js:303 | | keep |
| GET | /auth/fedcm/login | apps/gateway/server/auth/routes.js:303 | | keep |
@@ -1273,7 +1332,7 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1273,7 +1332,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /lookup/:target? | apps/gateway/server/net/routes.js:802 | | keep |
| GET | /lookup/:target? | apps/gateway/server/net/routes.js:802 | | keep |
| GET | /myip | apps/gateway/server/net/routes.js:293 | | keep |
| GET | /myip | apps/gateway/server/net/routes.js:293 | | keep |
| GET | /opengraph | apps/gateway/server/dev/routes.js:87 | | keep |
| GET | /opengraph | apps/gateway/server/dev/routes.js:87 | | keep |
-| GET | /openvibe-sw.js | apps/gateway/server/index.js:459 | | keep |
+| GET | /openvibe-sw.js | apps/gateway/server/index.js:476 | | keep |
| GET | /ping/:target? | apps/gateway/server/net/routes.js:765 | | keep |
| GET | /ping/:target? | apps/gateway/server/net/routes.js:765 | | keep |
| GET | /port/:target? | apps/gateway/server/net/routes.js:736 | | keep |
| GET | /port/:target? | apps/gateway/server/net/routes.js:736 | | keep |
| GET | /rdap/:target? | apps/gateway/server/net/routes.js:515 | | keep |
| GET | /rdap/:target? | apps/gateway/server/net/routes.js:515 | | keep |
@@ -1283,14 +1342,14 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1283,14 +1342,14 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /robots/:target? | apps/gateway/server/net/routes.js:948 | | keep |
| GET | /robots/:target? | apps/gateway/server/net/routes.js:948 | | keep |
| GET | /search | apps/gateway/server/pages/site.js:311 | | keep |
| GET | /search | apps/gateway/server/pages/site.js:311 | | keep |
| GET | /sitemap.xml | apps/gateway/server/pages/site.js:313 | | keep |
| GET | /sitemap.xml | apps/gateway/server/pages/site.js:313 | | keep |
-| GET | /sitemap.xml | apps/text/server/index.js:149 | | keep |
+| GET | /sitemap.xml | apps/text/server/index.js:153 | | keep |
| GET | /sitemap/:target? | apps/gateway/server/net/routes.js:949 | | keep |
| GET | /sitemap/:target? | apps/gateway/server/net/routes.js:949 | | keep |
| GET | /smtp/:target? | apps/gateway/server/net/routes.js:951 | | keep |
| GET | /smtp/:target? | apps/gateway/server/net/routes.js:951 | | keep |
| GET | /ssl/:target? | apps/gateway/server/net/routes.js:560 | | keep |
| GET | /ssl/:target? | apps/gateway/server/net/routes.js:560 | | keep |
| GET | /tool/:id | apps/gateway/server/pages/site.js:312 | | keep |
| GET | /tool/:id | apps/gateway/server/pages/site.js:312 | | keep |
| GET | /tools | apps/gateway/server/dev/routes.js:75 | | keep |
| GET | /tools | apps/gateway/server/dev/routes.js:75 | | keep |
| GET | /tools | apps/gateway/server/net/routes.js:283 | | keep |
| GET | /tools | apps/gateway/server/net/routes.js:283 | | keep |
-| GET | /tos | apps/gateway/server/index.js:417 | | keep |
+| GET | /tos | apps/gateway/server/index.js:434 | | keep |
| GET | /updates | apps/gateway/server/pages/site.js:307 | | keep |
| GET | /updates | apps/gateway/server/pages/site.js:307 | | keep |
| GET | /uptime/:target? | apps/gateway/server/net/routes.js:950 | | keep |
| GET | /uptime/:target? | apps/gateway/server/net/routes.js:950 | | keep |
| POST | /webhook/bins | apps/gateway/server/dev/routes.js:165 | | keep |
| POST | /webhook/bins | apps/gateway/server/dev/routes.js:165 | | keep |
@@ -1303,160 +1362,160 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1303,160 +1362,160 @@ Owner = the repository whose code answers the route; target = the authority it b
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/app.js:252 | | keep |
-| GET | /api/health | server/app.js:217 | | keep |
-| GET | /api/pastes | server/pastes/api.js:105 | | keep |
-| POST | /api/pastes | server/pastes/api.js:109 | | keep |
-| DELETE | /api/pastes/:slug | server/pastes/api.js:127 | | keep |
-| GET | /api/pastes/:slug | server/pastes/api.js:125 | | keep |
-| PUT | /api/pastes/:slug | server/pastes/api.js:126 | | keep |
-| POST | /api/pastes/:slug/ai | server/pastes/api.js:130 | | keep |
-| POST | /api/pastes/:slug/censor | server/pastes/api.js:129 | | keep |
-| GET | /api/pastes/:slug/comments | server/pastes/api.js:139 | | keep |
-| POST | /api/pastes/:slug/comments | server/pastes/api.js:140 | | keep |
-| DELETE | /api/pastes/:slug/comments/:commentId | server/pastes/api.js:143 | | keep |
-| POST | /api/pastes/:slug/copy | server/pastes/api.js:137 | | keep |
-| POST | /api/pastes/:slug/fork | server/pastes/api.js:135 | | keep |
-| POST | /api/pastes/:slug/like | server/pastes/api.js:136 | | keep |
-| GET | /api/pastes/:slug/raw | server/pastes/api.js:132 | | keep |
-| POST | /api/pastes/:slug/set-avatar | server/pastes/api.js:146 | | keep |
-| GET | /api/pastes/:slug/versions | server/pastes/api.js:133 | | keep |
-| DELETE | /api/pastes/admin/forks | server/pastes/api.js:116 | | keep |
-| GET | /api/pastes/admin/forks | server/pastes/api.js:115 | | keep |
-| GET | /api/pastes/admin/stats | server/pastes/api.js:114 | | keep |
-| POST | /api/pastes/bulk | server/pastes/api.js:117 | | keep |
-| GET | /api/pastes/by-user/:username | server/pastes/api.js:122 | | keep |
-| GET | /api/pastes/config | server/pastes/api.js:112 | | keep |
-| POST | /api/pastes/screenshot | server/pastes/api.js:119 | | keep |
-| GET | /api/ready | server/app.js:224 | | keep |
-| DELETE | /api/v1/comments/:commentId | server/comments/api.js:45 | | keep |
-| GET | /api/v1/comments/:commentId | server/comments/api.js:43 | | keep |
-| PATCH | /api/v1/comments/:commentId | server/comments/api.js:44 | | keep |
-| POST | /api/v1/comments/:commentId/votes | server/comments/api.js:46 | | keep |
-| GET | /api/v1/comments/threads/:id | server/comments/api.js:39 | | keep |
-| POST | /api/v1/comments/threads/:id/comments | server/comments/api.js:40 | | keep |
-| PUT | /api/v1/comments/threads/:id/visibility | server/comments/api.js:42 | | keep |
-| POST | /api/v1/comments/threads/resolve | server/comments/api.js:37 | | keep |
-| GET | /api/v1/posts | server/forum/api.js:57 | | keep |
-| GET | /api/v1/posts | server/forum/api.js:110 | | keep |
-| POST | /api/v1/posts | server/forum/api.js:58 | | keep |
-| PUT | /api/v1/posts/:group | server/forum/api.js:111 | | keep |
-| DELETE | /api/v1/posts/:id | server/forum/api.js:98 | | keep |
-| PUT | /api/v1/posts/:id | server/forum/api.js:96 | | keep |
-| POST | /api/v1/posts/:id/reactions | server/forum/api.js:97 | | keep |
-| GET | /api/v1/posts/:id/versions | server/forum/api.js:99 | | keep |
-| GET | /api/v1/posts/:space | server/forum/api.js:60 | | keep |
-| POST | /api/v1/posts/:space/attachments | server/forum/api.js:68 | | keep |
-| GET | /api/v1/posts/:space/categories | server/forum/api.js:62 | | keep |
-| DELETE | /api/v1/posts/:space/categories/:category | server/forum/api.js:70 | | keep |
-| PUT | /api/v1/posts/:space/categories/:category | server/forum/api.js:69 | | keep |
-| DELETE | /api/v1/posts/:space/chat-room | server/forum/api.js:84 | | keep |
-| PUT | /api/v1/posts/:space/chat-room | server/forum/api.js:83 | | keep |
-| PUT | /api/v1/posts/:space/members-only | server/forum/api.js:81 | | keep |
-| PUT | /api/v1/posts/:space/settings | server/forum/api.js:59 | | keep |
-| GET | /api/v1/posts/:space/threads | server/forum/api.js:61 | | keep |
-| POST | /api/v1/posts/:space/threads | server/forum/api.js:74 | | keep |
-| DELETE | /api/v1/posts/:space/threads/:slug | server/forum/api.js:76 | | keep |
-| GET | /api/v1/posts/:space/threads/:slug | server/forum/api.js:75 | | keep |
-| PUT | /api/v1/posts/:space/threads/:slug/category | server/forum/api.js:71 | | keep |
-| POST | /api/v1/posts/:space/threads/:slug/crosspost | server/forum/api.js:73 | | keep |
-| PUT | /api/v1/posts/:space/threads/:slug/members-only | server/forum/api.js:80 | | keep |
-| POST | /api/v1/posts/:space/threads/:slug/posts | server/forum/api.js:77 | | keep |
-| PUT | /api/v1/posts/:space/threads/:slug/state | server/forum/api.js:79 | | keep |
-| PUT | /api/v1/posts/:space/threads/:slug/status | server/forum/api.js:72 | | keep |
-| POST | /api/v1/posts/:space/threads/:slug/votes | server/forum/api.js:78 | | keep |
-| GET | /api/v1/pulse | server/pulse/api.js:27 | | keep |
-| POST | /api/v1/pulse/items | server/pulse/api.js:28 | | keep |
-| DELETE | /api/v1/pulse/items/:service/:type/:id | server/pulse/api.js:29 | | keep |
-| GET | /api/v1/relay/deliveries | server/relay/api.js:54 | | keep |
-| POST | /api/v1/relay/deliveries/:id/drop | server/relay/api.js:63 | | keep |
-| POST | /api/v1/relay/deliveries/:id/retry | server/relay/api.js:59 | | keep |
-| GET | /api/v1/relay/inbound | server/relay/api.js:67 | | keep |
-| POST | /api/v1/relay/inbound/:id/dismiss | server/relay/api.js:70 | | keep |
-| GET | /api/v1/relay/mappings | server/relay/api.js:74 | | keep |
-| POST | /api/v1/relay/mappings | server/relay/api.js:75 | | keep |
-| PUT | /api/v1/relay/mappings/:id | server/relay/api.js:85 | | keep |
-| GET | /api/v1/relay/status | server/relay/api.js:53 | | keep |
-| GET | /api/v1/space-groups | server/forum/api.js:57 | | keep |
-| GET | /api/v1/space-groups | server/forum/api.js:110 | | keep |
-| POST | /api/v1/space-groups | server/forum/api.js:58 | | keep |
-| PUT | /api/v1/space-groups/:group | server/forum/api.js:111 | | keep |
-| DELETE | /api/v1/space-groups/:id | server/forum/api.js:98 | | keep |
-| PUT | /api/v1/space-groups/:id | server/forum/api.js:96 | | keep |
-| POST | /api/v1/space-groups/:id/reactions | server/forum/api.js:97 | | keep |
-| GET | /api/v1/space-groups/:id/versions | server/forum/api.js:99 | | keep |
-| GET | /api/v1/space-groups/:space | server/forum/api.js:60 | | keep |
-| POST | /api/v1/space-groups/:space/attachments | server/forum/api.js:68 | | keep |
-| GET | /api/v1/space-groups/:space/categories | server/forum/api.js:62 | | keep |
-| DELETE | /api/v1/space-groups/:space/categories/:category | server/forum/api.js:70 | | keep |
-| PUT | /api/v1/space-groups/:space/categories/:category | server/forum/api.js:69 | | keep |
-| DELETE | /api/v1/space-groups/:space/chat-room | server/forum/api.js:84 | | keep |
-| PUT | /api/v1/space-groups/:space/chat-room | server/forum/api.js:83 | | keep |
-| PUT | /api/v1/space-groups/:space/members-only | server/forum/api.js:81 | | keep |
-| PUT | /api/v1/space-groups/:space/settings | server/forum/api.js:59 | | keep |
-| GET | /api/v1/space-groups/:space/threads | server/forum/api.js:61 | | keep |
-| POST | /api/v1/space-groups/:space/threads | server/forum/api.js:74 | | keep |
-| DELETE | /api/v1/space-groups/:space/threads/:slug | server/forum/api.js:76 | | keep |
-| GET | /api/v1/space-groups/:space/threads/:slug | server/forum/api.js:75 | | keep |
-| PUT | /api/v1/space-groups/:space/threads/:slug/category | server/forum/api.js:71 | | keep |
-| POST | /api/v1/space-groups/:space/threads/:slug/crosspost | server/forum/api.js:73 | | keep |
-| PUT | /api/v1/space-groups/:space/threads/:slug/members-only | server/forum/api.js:80 | | keep |
-| POST | /api/v1/space-groups/:space/threads/:slug/posts | server/forum/api.js:77 | | keep |
-| PUT | /api/v1/space-groups/:space/threads/:slug/state | server/forum/api.js:79 | | keep |
-| PUT | /api/v1/space-groups/:space/threads/:slug/status | server/forum/api.js:72 | | keep |
-| POST | /api/v1/space-groups/:space/threads/:slug/votes | server/forum/api.js:78 | | keep |
-| GET | /api/v1/spaces | server/forum/api.js:57 | | keep |
-| GET | /api/v1/spaces | server/forum/api.js:110 | | keep |
-| POST | /api/v1/spaces | server/forum/api.js:58 | | keep |
-| PUT | /api/v1/spaces/:group | server/forum/api.js:111 | | keep |
-| DELETE | /api/v1/spaces/:id | server/forum/api.js:98 | | keep |
-| PUT | /api/v1/spaces/:id | server/forum/api.js:96 | | keep |
-| POST | /api/v1/spaces/:id/reactions | server/forum/api.js:97 | | keep |
-| GET | /api/v1/spaces/:id/versions | server/forum/api.js:99 | | keep |
-| GET | /api/v1/spaces/:space | server/forum/api.js:60 | | keep |
-| POST | /api/v1/spaces/:space/attachments | server/forum/api.js:68 | | keep |
-| GET | /api/v1/spaces/:space/categories | server/forum/api.js:62 | | keep |
-| DELETE | /api/v1/spaces/:space/categories/:category | server/forum/api.js:70 | | keep |
-| PUT | /api/v1/spaces/:space/categories/:category | server/forum/api.js:69 | | keep |
-| DELETE | /api/v1/spaces/:space/chat-room | server/forum/api.js:84 | | keep |
-| PUT | /api/v1/spaces/:space/chat-room | server/forum/api.js:83 | | keep |
-| PUT | /api/v1/spaces/:space/members-only | server/forum/api.js:81 | | keep |
-| PUT | /api/v1/spaces/:space/settings | server/forum/api.js:59 | | keep |
-| GET | /api/v1/spaces/:space/threads | server/forum/api.js:61 | | keep |
-| POST | /api/v1/spaces/:space/threads | server/forum/api.js:74 | | keep |
-| DELETE | /api/v1/spaces/:space/threads/:slug | server/forum/api.js:76 | | keep |
-| GET | /api/v1/spaces/:space/threads/:slug | server/forum/api.js:75 | | keep |
-| PUT | /api/v1/spaces/:space/threads/:slug/category | server/forum/api.js:71 | | keep |
-| POST | /api/v1/spaces/:space/threads/:slug/crosspost | server/forum/api.js:73 | | keep |
-| PUT | /api/v1/spaces/:space/threads/:slug/members-only | server/forum/api.js:80 | | keep |
-| POST | /api/v1/spaces/:space/threads/:slug/posts | server/forum/api.js:77 | | keep |
-| PUT | /api/v1/spaces/:space/threads/:slug/state | server/forum/api.js:79 | | keep |
-| PUT | /api/v1/spaces/:space/threads/:slug/status | server/forum/api.js:72 | | keep |
-| POST | /api/v1/spaces/:space/threads/:slug/votes | server/forum/api.js:78 | | keep |
+| GET | / | server/app.js:259 | | keep |
+| GET | /api/health | server/app.js:224 | | keep |
+| GET | /api/pastes | server/pastes/api.js:111 | | keep |
+| POST | /api/pastes | server/pastes/api.js:115 | | keep |
+| DELETE | /api/pastes/:slug | server/pastes/api.js:134 | | keep |
+| GET | /api/pastes/:slug | server/pastes/api.js:132 | | keep |
+| PUT | /api/pastes/:slug | server/pastes/api.js:133 | | keep |
+| POST | /api/pastes/:slug/ai | server/pastes/api.js:138 | | keep |
+| POST | /api/pastes/:slug/censor | server/pastes/api.js:136 | | keep |
+| GET | /api/pastes/:slug/comments | server/pastes/api.js:147 | | keep |
+| POST | /api/pastes/:slug/comments | server/pastes/api.js:148 | | keep |
+| DELETE | /api/pastes/:slug/comments/:commentId | server/pastes/api.js:151 | | keep |
+| POST | /api/pastes/:slug/copy | server/pastes/api.js:145 | | keep |
+| POST | /api/pastes/:slug/fork | server/pastes/api.js:143 | | keep |
+| POST | /api/pastes/:slug/like | server/pastes/api.js:144 | | keep |
+| GET | /api/pastes/:slug/raw | server/pastes/api.js:140 | | keep |
+| POST | /api/pastes/:slug/set-avatar | server/pastes/api.js:154 | | keep |
+| GET | /api/pastes/:slug/versions | server/pastes/api.js:141 | | keep |
+| DELETE | /api/pastes/admin/forks | server/pastes/api.js:122 | | keep |
+| GET | /api/pastes/admin/forks | server/pastes/api.js:121 | | keep |
+| GET | /api/pastes/admin/stats | server/pastes/api.js:120 | | keep |
+| POST | /api/pastes/bulk | server/pastes/api.js:123 | | keep |
+| GET | /api/pastes/by-user/:username | server/pastes/api.js:129 | | keep |
+| GET | /api/pastes/config | server/pastes/api.js:118 | | keep |
+| POST | /api/pastes/screenshot | server/pastes/api.js:126 | | keep |
+| GET | /api/ready | server/app.js:231 | | keep |
+| DELETE | /api/v1/comments/:commentId | server/comments/api.js:51 | | keep |
+| GET | /api/v1/comments/:commentId | server/comments/api.js:49 | | keep |
+| PATCH | /api/v1/comments/:commentId | server/comments/api.js:50 | | keep |
+| POST | /api/v1/comments/:commentId/votes | server/comments/api.js:52 | | keep |
+| GET | /api/v1/comments/threads/:id | server/comments/api.js:45 | | keep |
+| POST | /api/v1/comments/threads/:id/comments | server/comments/api.js:46 | | keep |
+| PUT | /api/v1/comments/threads/:id/visibility | server/comments/api.js:48 | | keep |
+| POST | /api/v1/comments/threads/resolve | server/comments/api.js:43 | | keep |
+| GET | /api/v1/posts | server/forum/api.js:63 | | keep |
+| GET | /api/v1/posts | server/forum/api.js:121 | | keep |
+| POST | /api/v1/posts | server/forum/api.js:64 | | keep |
+| PUT | /api/v1/posts/:group | server/forum/api.js:122 | | keep |
+| DELETE | /api/v1/posts/:id | server/forum/api.js:107 | | keep |
+| PUT | /api/v1/posts/:id | server/forum/api.js:105 | | keep |
+| POST | /api/v1/posts/:id/reactions | server/forum/api.js:106 | | keep |
+| GET | /api/v1/posts/:id/versions | server/forum/api.js:108 | | keep |
+| GET | /api/v1/posts/:space | server/forum/api.js:66 | | keep |
+| POST | /api/v1/posts/:space/attachments | server/forum/api.js:75 | | keep |
+| GET | /api/v1/posts/:space/categories | server/forum/api.js:68 | | keep |
+| DELETE | /api/v1/posts/:space/categories/:category | server/forum/api.js:77 | | keep |
+| PUT | /api/v1/posts/:space/categories/:category | server/forum/api.js:76 | | keep |
+| DELETE | /api/v1/posts/:space/chat-room | server/forum/api.js:91 | | keep |
+| PUT | /api/v1/posts/:space/chat-room | server/forum/api.js:90 | | keep |
+| PUT | /api/v1/posts/:space/members-only | server/forum/api.js:88 | | keep |
+| PUT | /api/v1/posts/:space/settings | server/forum/api.js:65 | | keep |
+| GET | /api/v1/posts/:space/threads | server/forum/api.js:67 | | keep |
+| POST | /api/v1/posts/:space/threads | server/forum/api.js:81 | | keep |
+| DELETE | /api/v1/posts/:space/threads/:slug | server/forum/api.js:83 | | keep |
+| GET | /api/v1/posts/:space/threads/:slug | server/forum/api.js:82 | | keep |
+| PUT | /api/v1/posts/:space/threads/:slug/category | server/forum/api.js:78 | | keep |
+| POST | /api/v1/posts/:space/threads/:slug/crosspost | server/forum/api.js:80 | | keep |
+| PUT | /api/v1/posts/:space/threads/:slug/members-only | server/forum/api.js:87 | | keep |
+| POST | /api/v1/posts/:space/threads/:slug/posts | server/forum/api.js:84 | | keep |
+| PUT | /api/v1/posts/:space/threads/:slug/state | server/forum/api.js:86 | | keep |
+| PUT | /api/v1/posts/:space/threads/:slug/status | server/forum/api.js:79 | | keep |
+| POST | /api/v1/posts/:space/threads/:slug/votes | server/forum/api.js:85 | | keep |
+| GET | /api/v1/pulse | server/pulse/api.js:31 | | keep |
+| POST | /api/v1/pulse/items | server/pulse/api.js:32 | | keep |
+| DELETE | /api/v1/pulse/items/:service/:type/:id | server/pulse/api.js:33 | | keep |
+| GET | /api/v1/relay/deliveries | server/relay/api.js:58 | | keep |
+| POST | /api/v1/relay/deliveries/:id/drop | server/relay/api.js:67 | | keep |
+| POST | /api/v1/relay/deliveries/:id/retry | server/relay/api.js:63 | | keep |
+| GET | /api/v1/relay/inbound | server/relay/api.js:71 | | keep |
+| POST | /api/v1/relay/inbound/:id/dismiss | server/relay/api.js:74 | | keep |
+| GET | /api/v1/relay/mappings | server/relay/api.js:78 | | keep |
+| POST | /api/v1/relay/mappings | server/relay/api.js:79 | | keep |
+| PUT | /api/v1/relay/mappings/:id | server/relay/api.js:89 | | keep |
+| GET | /api/v1/relay/status | server/relay/api.js:57 | | keep |
+| GET | /api/v1/space-groups | server/forum/api.js:63 | | keep |
+| GET | /api/v1/space-groups | server/forum/api.js:121 | | keep |
+| POST | /api/v1/space-groups | server/forum/api.js:64 | | keep |
+| PUT | /api/v1/space-groups/:group | server/forum/api.js:122 | | keep |
+| DELETE | /api/v1/space-groups/:id | server/forum/api.js:107 | | keep |
+| PUT | /api/v1/space-groups/:id | server/forum/api.js:105 | | keep |
+| POST | /api/v1/space-groups/:id/reactions | server/forum/api.js:106 | | keep |
+| GET | /api/v1/space-groups/:id/versions | server/forum/api.js:108 | | keep |
+| GET | /api/v1/space-groups/:space | server/forum/api.js:66 | | keep |
+| POST | /api/v1/space-groups/:space/attachments | server/forum/api.js:75 | | keep |
+| GET | /api/v1/space-groups/:space/categories | server/forum/api.js:68 | | keep |
+| DELETE | /api/v1/space-groups/:space/categories/:category | server/forum/api.js:77 | | keep |
+| PUT | /api/v1/space-groups/:space/categories/:category | server/forum/api.js:76 | | keep |
+| DELETE | /api/v1/space-groups/:space/chat-room | server/forum/api.js:91 | | keep |
+| PUT | /api/v1/space-groups/:space/chat-room | server/forum/api.js:90 | | keep |
+| PUT | /api/v1/space-groups/:space/members-only | server/forum/api.js:88 | | keep |
+| PUT | /api/v1/space-groups/:space/settings | server/forum/api.js:65 | | keep |
+| GET | /api/v1/space-groups/:space/threads | server/forum/api.js:67 | | keep |
+| POST | /api/v1/space-groups/:space/threads | server/forum/api.js:81 | | keep |
+| DELETE | /api/v1/space-groups/:space/threads/:slug | server/forum/api.js:83 | | keep |
+| GET | /api/v1/space-groups/:space/threads/:slug | server/forum/api.js:82 | | keep |
+| PUT | /api/v1/space-groups/:space/threads/:slug/category | server/forum/api.js:78 | | keep |
+| POST | /api/v1/space-groups/:space/threads/:slug/crosspost | server/forum/api.js:80 | | keep |
+| PUT | /api/v1/space-groups/:space/threads/:slug/members-only | server/forum/api.js:87 | | keep |
+| POST | /api/v1/space-groups/:space/threads/:slug/posts | server/forum/api.js:84 | | keep |
+| PUT | /api/v1/space-groups/:space/threads/:slug/state | server/forum/api.js:86 | | keep |
+| PUT | /api/v1/space-groups/:space/threads/:slug/status | server/forum/api.js:79 | | keep |
+| POST | /api/v1/space-groups/:space/threads/:slug/votes | server/forum/api.js:85 | | keep |
+| GET | /api/v1/spaces | server/forum/api.js:63 | | keep |
+| GET | /api/v1/spaces | server/forum/api.js:121 | | keep |
+| POST | /api/v1/spaces | server/forum/api.js:64 | | keep |
+| PUT | /api/v1/spaces/:group | server/forum/api.js:122 | | keep |
+| DELETE | /api/v1/spaces/:id | server/forum/api.js:107 | | keep |
+| PUT | /api/v1/spaces/:id | server/forum/api.js:105 | | keep |
+| POST | /api/v1/spaces/:id/reactions | server/forum/api.js:106 | | keep |
+| GET | /api/v1/spaces/:id/versions | server/forum/api.js:108 | | keep |
+| GET | /api/v1/spaces/:space | server/forum/api.js:66 | | keep |
+| POST | /api/v1/spaces/:space/attachments | server/forum/api.js:75 | | keep |
+| GET | /api/v1/spaces/:space/categories | server/forum/api.js:68 | | keep |
+| DELETE | /api/v1/spaces/:space/categories/:category | server/forum/api.js:77 | | keep |
+| PUT | /api/v1/spaces/:space/categories/:category | server/forum/api.js:76 | | keep |
+| DELETE | /api/v1/spaces/:space/chat-room | server/forum/api.js:91 | | keep |
+| PUT | /api/v1/spaces/:space/chat-room | server/forum/api.js:90 | | keep |
+| PUT | /api/v1/spaces/:space/members-only | server/forum/api.js:88 | | keep |
+| PUT | /api/v1/spaces/:space/settings | server/forum/api.js:65 | | keep |
+| GET | /api/v1/spaces/:space/threads | server/forum/api.js:67 | | keep |
+| POST | /api/v1/spaces/:space/threads | server/forum/api.js:81 | | keep |
+| DELETE | /api/v1/spaces/:space/threads/:slug | server/forum/api.js:83 | | keep |
+| GET | /api/v1/spaces/:space/threads/:slug | server/forum/api.js:82 | | keep |
+| PUT | /api/v1/spaces/:space/threads/:slug/category | server/forum/api.js:78 | | keep |
+| POST | /api/v1/spaces/:space/threads/:slug/crosspost | server/forum/api.js:80 | | keep |
+| PUT | /api/v1/spaces/:space/threads/:slug/members-only | server/forum/api.js:87 | | keep |
+| POST | /api/v1/spaces/:space/threads/:slug/posts | server/forum/api.js:84 | | keep |
+| PUT | /api/v1/spaces/:space/threads/:slug/state | server/forum/api.js:86 | | keep |
+| PUT | /api/v1/spaces/:space/threads/:slug/status | server/forum/api.js:79 | | keep |
+| POST | /api/v1/spaces/:space/threads/:slug/votes | server/forum/api.js:85 | | keep |
| GET | /c/:accessId | server/comments/routes.js:43 | | keep |
| GET | /c/:accessId | server/comments/routes.js:43 | | keep |
| POST | /c/:accessId | server/comments/routes.js:50 | | keep |
| POST | /c/:accessId | server/comments/routes.js:50 | | keep |
| GET | /callback | server/auth/routes.js:292 | | keep |
| GET | /callback | server/auth/routes.js:292 | | keep |
| POST | /fedcm | server/auth/routes.js:338 | | keep |
| POST | /fedcm | server/auth/routes.js:338 | | keep |
-| GET | /feed.xml | server/app.js:244 | | keep |
-| POST | /internal/events | server/pulse/consumer.js:74 | | keep |
-| GET | /llms.txt | server/app.js:242 | | keep |
+| GET | /feed.xml | server/app.js:251 | | keep |
+| POST | /internal/events | server/pulse/consumer.js:109 | | keep |
+| GET | /llms.txt | server/app.js:249 | | keep |
| GET | /login | server/auth/routes.js:270 | | keep |
| GET | /login | server/auth/routes.js:270 | | keep |
| GET | /logout | server/auth/routes.js:366 | | keep |
| GET | /logout | server/auth/routes.js:366 | | keep |
| GET | /me | server/auth/routes.js:390 | | keep |
| GET | /me | server/auth/routes.js:390 | | keep |
-| GET | /my | server/app.js:388 | | keep |
-| GET | /new | server/app.js:339 | | keep |
-| POST | /new | server/app.js:350 | | keep |
-| GET | /p/:slug | server/app.js:284 | | keep |
-| GET | /p/:slug/download | server/app.js:327 | | keep |
-| GET | /p/:slug/raw | server/app.js:303 | | keep |
-| GET | /p/:slug/raw | server/app.js:323 | | keep |
-| GET | /p/:slug/screenshot | server/app.js:316 | | keep |
-| GET | /p/:slug/screenshot | server/app.js:324 | | keep |
-| GET | /pastes | server/app.js:276 | | keep |
-| GET | /pastes/:slug | server/app.js:282 | | keep |
-| GET | /pulse | server/app.js:380 | | keep |
+| GET | /my | server/app.js:399 | | keep |
+| GET | /new | server/app.js:350 | | keep |
+| POST | /new | server/app.js:361 | | keep |
+| GET | /p/:slug | server/app.js:291 | | keep |
+| GET | /p/:slug/download | server/app.js:338 | | keep |
+| GET | /p/:slug/raw | server/app.js:310 | | keep |
+| GET | /p/:slug/raw | server/app.js:334 | | keep |
+| GET | /p/:slug/screenshot | server/app.js:323 | | keep |
+| GET | /p/:slug/screenshot | server/app.js:335 | | keep |
+| GET | /pastes | server/app.js:283 | | keep |
+| GET | /pastes/:slug | server/app.js:289 | | keep |
+| GET | /pulse | server/app.js:391 | | keep |
| POST | /refresh | server/auth/routes.js:403 | | keep |
| POST | /refresh | server/auth/routes.js:403 | | keep |
-| GET | /robots.txt | server/app.js:241 | | keep |
+| GET | /robots.txt | server/app.js:248 | | keep |
| GET | /s | server/forum/routes.js:72 | | keep |
| GET | /s | server/forum/routes.js:72 | | keep |
| GET | /s/:space | server/forum/routes.js:116 | | keep |
| GET | /s/:space | server/forum/routes.js:116 | | keep |
| POST | /s/:space/chat-room | server/forum/routes.js:252 | | keep |
| POST | /s/:space/chat-room | server/forum/routes.js:252 | | keep |
@@ -1479,158 +1538,152 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1479,158 +1538,152 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /s/feed.xml | server/forum/routes.js:106 | | keep |
| GET | /s/feed.xml | server/forum/routes.js:106 | | keep |
| GET | /s/new-space | server/forum/routes.js:77 | | keep |
| GET | /s/new-space | server/forum/routes.js:77 | | keep |
| POST | /s/new-space | server/forum/routes.js:84 | | keep |
| POST | /s/new-space | server/forum/routes.js:84 | | keep |
-| GET | /search | server/app.js:261 | | keep |
-| GET | /sitemap.xml | server/app.js:243 | | keep |
-| GET | /tos | server/app.js:114 | | keep |
-| GET | /updates | server/app.js:257 | | keep |
+| GET | /search | server/app.js:268 | | keep |
+| GET | /sitemap.xml | server/app.js:250 | | keep |
+| GET | /tos | server/app.js:115 | | keep |
+| GET | /updates | server/app.js:264 | | keep |
## OpenVibe.Games
## OpenVibe.Games
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| ANY | / | apps/server/src/net/httpServer.ts:672 | | keep |
-| ANY | /api | apps/server/src/net/httpServer.ts:634 | | keep |
-| ANY | /api/* | apps/server/src/net/httpServer.ts:634 | | keep |
-| ANY | /api/characters | apps/server/src/net/httpServer.ts:330 | | keep |
-| POST | /api/map | apps/server/src/net/httpServer.ts:178 | | keep |
-| POST | /api/map-assets | apps/server/src/net/httpServer.ts:248 | | keep |
-| POST | /api/texture | apps/server/src/net/httpServer.ts:248 | | keep |
-| ANY | /auth/* | apps/server/src/net/httpServer.ts:350 | | keep |
-| ANY | /auth/callback | apps/server/src/net/httpServer.ts:416 | | keep |
-| ANY | /auth/fedcm | apps/server/src/net/httpServer.ts:502 | | keep |
-| ANY | /auth/login | apps/server/src/net/httpServer.ts:365 | | keep |
-| ANY | /auth/logout | apps/server/src/net/httpServer.ts:578 | | keep |
-| ANY | /auth/me | apps/server/src/net/httpServer.ts:595 | | keep |
-| ANY | /canvas | apps/server/src/net/httpServer.ts:666 | | keep |
-| ANY | /editor | apps/server/src/net/httpServer.ts:678 | | keep |
-| ANY | /editor.html | apps/server/src/net/httpServer.ts:646 | | keep |
-| ANY | /editor/ | apps/server/src/net/httpServer.ts:658 | | keep |
-| ANY | /game | apps/server/src/net/httpServer.ts:666 | | keep |
-| ANY | /game | apps/server/src/net/httpServer.ts:667 | | keep |
-| ANY | /healthz | apps/server/src/net/httpServer.ts:613 | | keep |
-| ANY | /map-assets/* | apps/server/src/net/httpServer.ts:304 | | keep |
-| ANY | /map.json | apps/server/src/net/httpServer.ts:165 | | keep |
-| ANY | /metrics | apps/server/src/net/httpServer.ts:618 | | keep |
-| ANY | /play | apps/server/src/net/httpServer.ts:653 | | keep |
-| ANY | /play | apps/server/src/net/httpServer.ts:676 | | keep |
-| ANY | /play.html | apps/server/src/net/httpServer.ts:646 | | keep |
-| ANY | /play.html | apps/server/src/net/httpServer.ts:648 | | keep |
-| ANY | /play/ | apps/server/src/net/httpServer.ts:653 | | keep |
-| ANY | /play/ | apps/server/src/net/httpServer.ts:658 | | keep |
+| ANY | / | apps/server/src/net/httpServer.ts:685 | | keep |
+| ANY | /api | apps/server/src/net/httpServer.ts:647 | | keep |
+| ANY | /api/* | apps/server/src/net/httpServer.ts:647 | | keep |
+| ANY | /api/characters | apps/server/src/net/httpServer.ts:343 | | keep |
+| POST | /api/map | apps/server/src/net/httpServer.ts:181 | | keep |
+| POST | /api/map-assets | apps/server/src/net/httpServer.ts:256 | | keep |
+| POST | /api/texture | apps/server/src/net/httpServer.ts:256 | | keep |
+| ANY | /auth/* | apps/server/src/net/httpServer.ts:363 | | keep |
+| ANY | /auth/callback | apps/server/src/net/httpServer.ts:429 | | keep |
+| ANY | /auth/fedcm | apps/server/src/net/httpServer.ts:515 | | keep |
+| ANY | /auth/login | apps/server/src/net/httpServer.ts:378 | | keep |
+| ANY | /auth/logout | apps/server/src/net/httpServer.ts:591 | | keep |
+| ANY | /auth/me | apps/server/src/net/httpServer.ts:608 | | keep |
+| ANY | /canvas | apps/server/src/net/httpServer.ts:679 | | keep |
+| ANY | /editor | apps/server/src/net/httpServer.ts:691 | | keep |
+| ANY | /editor.html | apps/server/src/net/httpServer.ts:659 | | keep |
+| ANY | /editor/ | apps/server/src/net/httpServer.ts:671 | | keep |
+| ANY | /game | apps/server/src/net/httpServer.ts:679 | | keep |
+| ANY | /game | apps/server/src/net/httpServer.ts:680 | | keep |
+| ANY | /healthz | apps/server/src/net/httpServer.ts:626 | | keep |
+| ANY | /map-assets/* | apps/server/src/net/httpServer.ts:317 | | keep |
+| ANY | /map.json | apps/server/src/net/httpServer.ts:168 | | keep |
+| ANY | /metrics | apps/server/src/net/httpServer.ts:631 | | keep |
+| ANY | /play | apps/server/src/net/httpServer.ts:666 | | keep |
+| ANY | /play | apps/server/src/net/httpServer.ts:689 | | keep |
+| ANY | /play.html | apps/server/src/net/httpServer.ts:659 | | keep |
+| ANY | /play.html | apps/server/src/net/httpServer.ts:661 | | keep |
+| ANY | /play/ | apps/server/src/net/httpServer.ts:666 | | keep |
+| ANY | /play/ | apps/server/src/net/httpServer.ts:671 | | keep |
## OpenVibe.Events
## OpenVibe.Events
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/app.js:76 | | keep |
-| GET | /api/health | server/app.js:39 | | keep |
-| GET | /api/ready | server/app.js:70 | | keep |
-| GET | /api/v1/checkpoints | server/api/read.js:94 | | keep |
-| PUT | /api/v1/checkpoints | server/api/read.js:103 | | keep |
-| GET | /api/v1/deliveries | server/api/read.js:114 | | keep |
-| POST | /api/v1/deliveries/replay | server/api/read.js:139 | | keep |
-| GET | /api/v1/events | server/api/read.js:58 | | keep |
-| POST | /api/v1/events | server/api/publish.js:80 | | keep |
-| GET | /api/v1/events/:id | server/api/read.js:85 | | keep |
-| GET | /api/v1/subscriptions | server/api/subscriptions.js:133 | | keep |
-| POST | /api/v1/subscriptions | server/api/subscriptions.js:74 | | keep |
-| GET | /api/v1/subscriptions/:id | server/api/subscriptions.js:137 | | keep |
-| POST | /api/v1/subscriptions/:id/${action} | server/api/subscriptions.js:162 | | keep |
-| POST | /api/v1/subscriptions/:id/rotate-secret | server/api/subscriptions.js:145 | | keep |
+| GET | / | server/app.js:80 | | keep |
+| GET | /api/health | server/app.js:40 | | keep |
+| GET | /api/ready | server/app.js:71 | | keep |
+| GET | /api/v1/checkpoints | server/api/read.js:98 | | keep |
+| PUT | /api/v1/checkpoints | server/api/read.js:107 | | keep |
+| GET | /api/v1/deliveries | server/api/read.js:118 | | keep |
+| POST | /api/v1/deliveries/replay | server/api/read.js:145 | | keep |
+| GET | /api/v1/events | server/api/read.js:62 | | keep |
+| POST | /api/v1/events | server/api/publish.js:99 | | keep |
+| GET | /api/v1/events/:id | server/api/read.js:89 | | keep |
+| GET | /api/v1/subscriptions | server/api/subscriptions.js:142 | | keep |
+| POST | /api/v1/subscriptions | server/api/subscriptions.js:83 | | keep |
+| GET | /api/v1/subscriptions/:id | server/api/subscriptions.js:146 | | keep |
+| POST | /api/v1/subscriptions/:id/${action} | server/api/subscriptions.js:172 | | keep |
+| POST | /api/v1/subscriptions/:id/rotate-secret | server/api/subscriptions.js:154 | | keep |
| POST | /internal/events | lib/client.js:18 | | keep |
| POST | /internal/events | lib/client.js:18 | | keep |
| GET | /limits.json | server/limits.js:41 | | keep |
| GET | /limits.json | server/limits.js:41 | | keep |
-| GET | /realtime/stream | server/app.js:35 | | keep |
+| GET | /realtime/stream | server/app.js:36 | | keep |
## OpenVibe.Chat
## OpenVibe.Chat
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/prefs/routes.js:35 | | keep |
+| GET | / | server/prefs/routes.js:40 | | keep |
| GET | / | server/web/pages.js:144 | | keep |
| GET | / | server/web/pages.js:144 | | keep |
-| POST | / | server/events/consumer.js:143 | | keep |
-| PUT | / | server/prefs/routes.js:38 | | keep |
-| GET | /api/chat/:streamId/history | server/chat/routes.js:538 | | keep |
-| GET | /api/chat/:streamId/replay | server/chat/routes.js:516 | | keep |
-| GET | /api/chat/:streamId/users | server/chat/routes.js:681 | | keep |
-| GET | /api/chat/admin/logs | server/chat/routes.js:777 | | keep |
-| GET | /api/chat/admin/logs/export | server/chat/routes.js:821 | | keep |
-| DELETE | /api/chat/admin/purge | server/chat/routes.js:722 | | keep |
-| POST | /api/chat/admin/purge/preview | server/chat/routes.js:690 | | keep |
-| GET | /api/chat/anon/:anonId | server/chat/routes.js:443 | | keep |
-| GET | /api/chat/anon/:anonId/logs | server/chat/routes.js:457 | | keep |
-| GET | /api/chat/channel/:userId/history | server/chat/routes.js:642 | | keep |
-| GET | /api/chat/filters/friendly | server/chat/routes.js:489 | | keep |
-| GET | /api/chat/gif/providers | server/chat/routes.js:164 | | keep |
-| GET | /api/chat/gif/search | server/chat/routes.js:202 | | keep |
-| GET | /api/chat/gif/trending | server/chat/routes.js:175 | | keep |
-| GET | /api/chat/global/history | server/chat/routes.js:495 | | keep |
+| POST | / | server/events/consumer.js:151 | | keep |
+| PUT | / | server/prefs/routes.js:43 | | keep |
+| GET | /:id/call | server/calls/routes.js:263 | | keep |
+| PUT | /:id/call | server/calls/routes.js:231 | | keep |
+| GET | /api/chat/:streamId/history | server/chat/routes.js:550 | | keep |
+| GET | /api/chat/:streamId/replay | server/chat/routes.js:528 | | keep |
+| GET | /api/chat/:streamId/users | server/chat/routes.js:693 | | keep |
+| GET | /api/chat/admin/logs | server/chat/routes.js:793 | | keep |
+| GET | /api/chat/admin/logs/export | server/chat/routes.js:837 | | keep |
+| DELETE | /api/chat/admin/purge | server/chat/routes.js:738 | | keep |
+| POST | /api/chat/admin/purge/preview | server/chat/routes.js:706 | | keep |
+| GET | /api/chat/anon/:anonId | server/chat/routes.js:455 | | keep |
+| GET | /api/chat/anon/:anonId/logs | server/chat/routes.js:469 | | keep |
+| GET | /api/chat/channel/:userId/history | server/chat/routes.js:654 | | keep |
+| GET | /api/chat/filters/friendly | server/chat/routes.js:501 | | keep |
+| GET | /api/chat/gif/providers | server/chat/routes.js:174 | | keep |
+| GET | /api/chat/gif/search | server/chat/routes.js:212 | | keep |
+| GET | /api/chat/gif/trending | server/chat/routes.js:185 | | keep |
+| GET | /api/chat/global/history | server/chat/routes.js:507 | | keep |
| GET | /api/chat/ice-servers | server/net/turn.js:65 | | keep |
| GET | /api/chat/ice-servers | server/net/turn.js:65 | | keep |
-| GET | /api/chat/me/export | server/chat/routes.js:869 | | keep |
-| GET | /api/chat/online | server/chat/routes.js:670 | | keep |
-| GET | /api/chat/relay-user/:platform/:username | server/chat/routes.js:433 | | keep |
-| GET | /api/chat/relay-user/:platform/:username/logs | server/chat/routes.js:473 | | keep |
-| GET | /api/chat/rooms | server/rooms/routes.js:65 | | keep |
-| POST | /api/chat/rooms | server/rooms/routes.js:69 | | keep |
-| GET | /api/chat/rooms/:slug | server/rooms/routes.js:73 | | keep |
-| PATCH | /api/chat/rooms/:slug | server/rooms/routes.js:83 | | keep |
-| GET | /api/chat/rooms/:slug/attachments | server/rooms/routes.js:155 | | keep |
-| POST | /api/chat/rooms/:slug/attachments | server/rooms/routes.js:161 | | keep |
-| DELETE | /api/chat/rooms/:slug/attachments/:service/:resource | server/rooms/routes.js:170 | | keep |
-| POST | /api/chat/rooms/:slug/join | server/rooms/routes.js:114 | | keep |
-| POST | /api/chat/rooms/:slug/leave | server/rooms/routes.js:120 | | keep |
-| GET | /api/chat/rooms/:slug/members | server/rooms/routes.js:135 | | keep |
-| POST | /api/chat/rooms/:slug/members | server/rooms/routes.js:141 | | keep |
-| GET | /api/chat/rooms/:slug/messages | server/rooms/routes.js:88 | | keep |
-| POST | /api/chat/rooms/:slug/messages | server/rooms/routes.js:96 | | keep |
-| DELETE | /api/chat/rooms/:slug/messages/:id | server/rooms/routes.js:105 | | keep |
-| POST | /api/chat/rooms/:slug/read | server/rooms/routes.js:130 | | keep |
-| GET | /api/chat/search | server/chat/routes.js:372 | | keep |
-| POST | /api/chat/send | server/chat/routes.js:267 | | keep |
-| GET | /api/chat/user/:userId/history | server/chat/routes.js:399 | | keep |
-| GET | /api/chat/user/:username/profile | server/chat/routes.js:420 | | keep |
-| GET | /api/dm/blocks | server/chat/dm-routes.js:418 | | keep |
-| DELETE | /api/dm/blocks/:userId | server/chat/dm-routes.js:406 | | keep |
-| POST | /api/dm/blocks/:userId | server/chat/dm-routes.js:391 | | keep |
-| GET | /api/dm/blocks/check/:userId | server/chat/dm-routes.js:428 | | keep |
-| GET | /api/dm/conversations | server/chat/dm-routes.js:66 | | keep |
-| POST | /api/dm/conversations | server/chat/dm-routes.js:81 | | keep |
-| GET | /api/dm/conversations/:id | server/chat/dm-routes.js:145 | | keep |
-| PATCH | /api/dm/conversations/:id | server/chat/dm-routes.js:348 | | keep |
-| GET | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:162 | | keep |
-| POST | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:180 | | keep |
-| DELETE | /api/dm/conversations/:id/messages/:msgId | server/chat/dm-routes.js:438 | | keep |
-| POST | /api/dm/conversations/:id/participants | server/chat/dm-routes.js:270 | | keep |
-| DELETE | /api/dm/conversations/:id/participants/:userId | server/chat/dm-routes.js:327 | | keep |
-| POST | /api/dm/conversations/:id/read | server/chat/dm-routes.js:249 | | keep |
-| GET | /api/dm/unread | server/chat/dm-routes.js:367 | | keep |
-| GET | /api/dm/users/search | server/chat/dm-routes.js:377 | | keep |
-| POST | /api/sounds | server/chat/sounds-routes.js:165 | | keep |
-| DELETE | /api/sounds/:id | server/chat/sounds-routes.js:307 | | keep |
-| DELETE | /api/sounds/alert/:kind | server/chat/sounds-routes.js:464 | | keep |
-| POST | /api/sounds/alert/:kind | server/chat/sounds-routes.js:425 | | keep |
-| GET | /api/sounds/alert/mine | server/chat/sounds-routes.js:414 | | keep |
-| GET | /api/sounds/all/:streamId | server/chat/sounds-routes.js:154 | | keep |
-| GET | /api/sounds/channel/:userId | server/chat/sounds-routes.js:143 | | keep |
-| PATCH | /api/sounds/command | server/chat/sounds-routes.js:334 | | keep |
-| GET | /api/sounds/file/:filename | server/chat/sounds-routes.js:392 | | keep |
-| GET | /api/streams/:id/call | server/calls/routes.js:253 | | keep |
-| PUT | /api/streams/:id/call | server/calls/routes.js:221 | | keep |
-| GET | /api/streams/voice-channels | server/calls/routes.js:37 | | keep |
-| POST | /api/streams/voice-channels | server/calls/routes.js:58 | | keep |
-| DELETE | /api/streams/voice-channels/:channelId | server/calls/routes.js:70 | | keep |
-| GET | /api/streams/voice-channels/:channelId | server/calls/routes.js:47 | | keep |
-| POST | /api/streams/voice-channels/call-user | server/calls/routes.js:108 | | keep |
-| POST | /api/streams/voice-channels/call-user/respond | server/calls/routes.js:171 | | keep |
-| GET | /api/tts/admin/settings | server/chat/tts-routes.js:112 | | keep |
-| PUT | /api/tts/admin/settings | server/chat/tts-routes.js:130 | | keep |
-| POST | /api/tts/admin/test | server/chat/tts-routes.js:162 | | keep |
-| GET | /api/tts/audio/:file | server/chat/tts-routes.js:260 | | keep |
-| GET | /api/tts/queue | server/chat/tts-routes.js:217 | | keep |
-| POST | /api/tts/queue/:id/report | server/chat/tts-routes.js:247 | | keep |
-| POST | /api/tts/queue/clear | server/chat/tts-routes.js:237 | | keep |
-| POST | /api/tts/queue/skip | server/chat/tts-routes.js:225 | | keep |
-| GET | /api/tts/settings | server/chat/tts-routes.js:90 | | keep |
-| GET | /api/tts/voices | server/chat/tts-routes.js:80 | | keep |
+| GET | /api/chat/me/export | server/chat/routes.js:885 | | keep |
+| GET | /api/chat/online | server/chat/routes.js:682 | | keep |
+| GET | /api/chat/relay-user/:platform/:username | server/chat/routes.js:445 | | keep |
+| GET | /api/chat/relay-user/:platform/:username/logs | server/chat/routes.js:485 | | keep |
+| GET | /api/chat/rooms | server/rooms/routes.js:80 | | keep |
+| POST | /api/chat/rooms | server/rooms/routes.js:84 | | keep |
+| GET | /api/chat/rooms/:slug | server/rooms/routes.js:88 | | keep |
+| PATCH | /api/chat/rooms/:slug | server/rooms/routes.js:98 | | keep |
+| GET | /api/chat/rooms/:slug/attachments | server/rooms/routes.js:170 | | keep |
+| POST | /api/chat/rooms/:slug/attachments | server/rooms/routes.js:176 | | keep |
+| DELETE | /api/chat/rooms/:slug/attachments/:service/:resource | server/rooms/routes.js:185 | | keep |
+| POST | /api/chat/rooms/:slug/join | server/rooms/routes.js:129 | | keep |
+| POST | /api/chat/rooms/:slug/leave | server/rooms/routes.js:135 | | keep |
+| GET | /api/chat/rooms/:slug/members | server/rooms/routes.js:150 | | keep |
+| POST | /api/chat/rooms/:slug/members | server/rooms/routes.js:156 | | keep |
+| GET | /api/chat/rooms/:slug/messages | server/rooms/routes.js:103 | | keep |
+| POST | /api/chat/rooms/:slug/messages | server/rooms/routes.js:111 | | keep |
+| DELETE | /api/chat/rooms/:slug/messages/:id | server/rooms/routes.js:120 | | keep |
+| POST | /api/chat/rooms/:slug/read | server/rooms/routes.js:145 | | keep |
+| GET | /api/chat/search | server/chat/routes.js:384 | | keep |
+| POST | /api/chat/send | server/chat/routes.js:279 | | keep |
+| GET | /api/chat/user/:userId/history | server/chat/routes.js:411 | | keep |
+| GET | /api/chat/user/:username/profile | server/chat/routes.js:432 | | keep |
+| GET | /api/dm/blocks | server/chat/dm-routes.js:433 | | keep |
+| DELETE | /api/dm/blocks/:userId | server/chat/dm-routes.js:421 | | keep |
+| POST | /api/dm/blocks/:userId | server/chat/dm-routes.js:406 | | keep |
+| GET | /api/dm/blocks/check/:userId | server/chat/dm-routes.js:443 | | keep |
+| GET | /api/dm/conversations | server/chat/dm-routes.js:81 | | keep |
+| POST | /api/dm/conversations | server/chat/dm-routes.js:96 | | keep |
+| GET | /api/dm/conversations/:id | server/chat/dm-routes.js:160 | | keep |
+| PATCH | /api/dm/conversations/:id | server/chat/dm-routes.js:363 | | keep |
+| GET | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:177 | | keep |
+| POST | /api/dm/conversations/:id/messages | server/chat/dm-routes.js:195 | | keep |
+| DELETE | /api/dm/conversations/:id/messages/:msgId | server/chat/dm-routes.js:453 | | keep |
+| POST | /api/dm/conversations/:id/participants | server/chat/dm-routes.js:285 | | keep |
+| DELETE | /api/dm/conversations/:id/participants/:userId | server/chat/dm-routes.js:342 | | keep |
+| POST | /api/dm/conversations/:id/read | server/chat/dm-routes.js:264 | | keep |
+| GET | /api/dm/unread | server/chat/dm-routes.js:382 | | keep |
+| GET | /api/dm/users/search | server/chat/dm-routes.js:392 | | keep |
+| POST | /api/sounds | server/chat/sounds-routes.js:173 | | keep |
+| DELETE | /api/sounds/:id | server/chat/sounds-routes.js:315 | | keep |
+| DELETE | /api/sounds/alert/:kind | server/chat/sounds-routes.js:472 | | keep |
+| POST | /api/sounds/alert/:kind | server/chat/sounds-routes.js:433 | | keep |
+| GET | /api/sounds/alert/mine | server/chat/sounds-routes.js:422 | | keep |
+| GET | /api/sounds/all/:streamId | server/chat/sounds-routes.js:162 | | keep |
+| GET | /api/sounds/channel/:userId | server/chat/sounds-routes.js:151 | | keep |
+| PATCH | /api/sounds/command | server/chat/sounds-routes.js:342 | | keep |
+| GET | /api/sounds/file/:filename | server/chat/sounds-routes.js:400 | | keep |
+| GET | /api/tts/admin/settings | server/chat/tts-routes.js:113 | | keep |
+| PUT | /api/tts/admin/settings | server/chat/tts-routes.js:132 | | keep |
+| POST | /api/tts/admin/test | server/chat/tts-routes.js:165 | | keep |
+| GET | /api/tts/audio/:file | server/chat/tts-routes.js:267 | | keep |
+| GET | /api/tts/queue | server/chat/tts-routes.js:220 | | keep |
+| POST | /api/tts/queue/:id/report | server/chat/tts-routes.js:254 | | keep |
+| POST | /api/tts/queue/clear | server/chat/tts-routes.js:244 | | keep |
+| POST | /api/tts/queue/skip | server/chat/tts-routes.js:232 | | keep |
+| GET | /api/tts/settings | server/chat/tts-routes.js:91 | | keep |
+| GET | /api/tts/voices | server/chat/tts-routes.js:81 | | keep |
| GET | /auth/callback | server/web/session.js:125 | | keep |
| GET | /auth/callback | server/web/session.js:125 | | keep |
| POST | /auth/fedcm | server/web/session.js:150 | | keep |
| POST | /auth/fedcm | server/web/session.js:150 | | keep |
| GET | /auth/login | server/web/session.js:111 | | keep |
| GET | /auth/login | server/web/session.js:111 | | keep |
@@ -1666,6 +1719,12 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1666,6 +1719,12 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /settings | server/web/pages.js:329 | | keep |
| POST | /settings | server/web/pages.js:329 | | keep |
| GET | /sitemap.xml | server/web/pages.js:600 | | keep |
| GET | /sitemap.xml | server/web/pages.js:600 | | keep |
| GET | /updates | server/web/pages.js:594 | | keep |
| GET | /updates | server/web/pages.js:594 | | keep |
+| GET | /voice-channels | server/calls/routes.js:47 | | keep |
+| POST | /voice-channels | server/calls/routes.js:68 | | keep |
+| DELETE | /voice-channels/:channelId | server/calls/routes.js:80 | | keep |
+| GET | /voice-channels/:channelId | server/calls/routes.js:57 | | keep |
+| POST | /voice-channels/call-user | server/calls/routes.js:118 | | keep |
+| POST | /voice-channels/call-user/respond | server/calls/routes.js:181 | | keep |
## OpenRe.Stream
## OpenRe.Stream
@@ -1687,8 +1746,8 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1687,8 +1746,8 @@ Owner = the repository whose code answers the route; target = the authority it b
| POST | /destinations/:id/stop | server/api/v1.js:250 | | keep |
| POST | /destinations/:id/stop | server/api/v1.js:250 | | keep |
| POST | /destinations/:id/test | server/api/v1.js:237 | | keep |
| POST | /destinations/:id/test | server/api/v1.js:237 | | keep |
| GET | /outputs/:id/logs | server/api/v1.js:305 | | keep |
| GET | /outputs/:id/logs | server/api/v1.js:305 | | keep |
-| GET | /play/:file | server/app.js:90 | | keep |
-| GET | /robots.txt | server/app.js:108 | | keep |
+| GET | /play/:file | server/app.js:92 | | keep |
+| GET | /robots.txt | server/app.js:110 | | keep |
| GET | /sessions | server/api/v1.js:262 | | keep |
| GET | /sessions | server/api/v1.js:262 | | keep |
| GET | /sessions | server/ui/routes.js:295 | | keep |
| GET | /sessions | server/ui/routes.js:295 | | keep |
| GET | /sessions/:id | server/api/v1.js:283 | | keep |
| GET | /sessions/:id | server/api/v1.js:283 | | keep |
@@ -1715,41 +1774,41 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1715,41 +1774,41 @@ Owner = the repository whose code answers the route; target = the authority it b
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
| GET | / | server/console/index.js:225 | | keep |
| GET | / | server/console/index.js:225 | | keep |
-| GET | /api/health | server/app.js:64 | | keep |
-| GET | /api/ready | server/app.js:79 | | keep |
-| POST | /api/v1/admin/adjustments | server/api/v1.js:286 | | keep |
-| GET | /api/v1/admin/freeze | server/api/v1.js:242 | | keep |
-| POST | /api/v1/admin/freeze | server/api/v1.js:243 | | keep |
-| GET | /api/v1/admin/import-holds | server/api/v1.js:301 | | keep |
-| GET | /api/v1/admin/provider-accounts | server/api/v1.js:275 | | keep |
-| POST | /api/v1/admin/provider-accounts | server/api/v1.js:279 | | keep |
-| GET | /api/v1/admin/provider-events | server/api/v1.js:291 | | keep |
-| POST | /api/v1/admin/provider-events/:id/reprocess | server/api/v1.js:296 | | keep |
-| GET | /api/v1/admin/reconcile | server/api/v1.js:251 | | keep |
-| GET | /api/v1/admin/reconciliations | server/api/v1.js:256 | | keep |
-| GET | /api/v1/admin/reconciliations/:id | server/api/v1.js:267 | | keep |
-| POST | /api/v1/admin/sweep | server/api/v1.js:300 | | keep |
-| GET | /api/v1/balances/:subject | server/api/v1.js:216 | | keep |
-| GET | /api/v1/cashouts | server/api/v1.js:143 | | keep |
-| POST | /api/v1/cashouts | server/api/v1.js:138 | | keep |
-| GET | /api/v1/cashouts/:id | server/api/v1.js:147 | | keep |
-| POST | /api/v1/cashouts/:id/approve | server/api/v1.js:152 | | keep |
-| POST | /api/v1/cashouts/:id/deny | server/api/v1.js:157 | | keep |
-| GET | /api/v1/entitlements/:subject | server/api/v1.js:200 | | keep |
-| POST | /api/v1/intents | server/api/v1.js:64 | | keep |
-| GET | /api/v1/intents/:id | server/api/v1.js:87 | | keep |
-| POST | /api/v1/intents/:id/capture | server/api/v1.js:92 | | keep |
-| POST | /api/v1/purchases/settle | server/api/v1.js:103 | | keep |
-| GET | /api/v1/rates | server/api/v1.js:52 | | keep |
-| POST | /api/v1/recycle | server/api/v1.js:130 | | keep |
-| GET | /api/v1/subscriptions | server/api/v1.js:183 | | keep |
-| POST | /api/v1/subscriptions | server/api/v1.js:163 | | keep |
-| GET | /api/v1/subscriptions/:id | server/api/v1.js:191 | | keep |
-| POST | /api/v1/subscriptions/:id/cancel | server/api/v1.js:196 | | keep |
-| GET | /api/v1/transactions | server/api/v1.js:218 | | keep |
-| GET | /api/v1/transactions/:id | server/api/v1.js:234 | | keep |
-| POST | /api/v1/transfers | server/api/v1.js:115 | | keep |
-| POST | /api/v1/transfers/:id/refund | server/api/v1.js:123 | | keep |
+| GET | /api/health | server/app.js:66 | | keep |
+| GET | /api/ready | server/app.js:81 | | keep |
+| POST | /api/v1/admin/adjustments | server/api/v1.js:292 | | keep |
+| GET | /api/v1/admin/freeze | server/api/v1.js:248 | | keep |
+| POST | /api/v1/admin/freeze | server/api/v1.js:249 | | keep |
+| GET | /api/v1/admin/import-holds | server/api/v1.js:307 | | keep |
+| GET | /api/v1/admin/provider-accounts | server/api/v1.js:281 | | keep |
+| POST | /api/v1/admin/provider-accounts | server/api/v1.js:285 | | keep |
+| GET | /api/v1/admin/provider-events | server/api/v1.js:297 | | keep |
+| POST | /api/v1/admin/provider-events/:id/reprocess | server/api/v1.js:302 | | keep |
+| GET | /api/v1/admin/reconcile | server/api/v1.js:257 | | keep |
+| GET | /api/v1/admin/reconciliations | server/api/v1.js:262 | | keep |
+| GET | /api/v1/admin/reconciliations/:id | server/api/v1.js:273 | | keep |
+| POST | /api/v1/admin/sweep | server/api/v1.js:306 | | keep |
+| GET | /api/v1/balances/:subject | server/api/v1.js:222 | | keep |
+| GET | /api/v1/cashouts | server/api/v1.js:149 | | keep |
+| POST | /api/v1/cashouts | server/api/v1.js:144 | | keep |
+| GET | /api/v1/cashouts/:id | server/api/v1.js:153 | | keep |
+| POST | /api/v1/cashouts/:id/approve | server/api/v1.js:158 | | keep |
+| POST | /api/v1/cashouts/:id/deny | server/api/v1.js:163 | | keep |
+| GET | /api/v1/entitlements/:subject | server/api/v1.js:206 | | keep |
+| POST | /api/v1/intents | server/api/v1.js:70 | | keep |
+| GET | /api/v1/intents/:id | server/api/v1.js:93 | | keep |
+| POST | /api/v1/intents/:id/capture | server/api/v1.js:98 | | keep |
+| POST | /api/v1/purchases/settle | server/api/v1.js:109 | | keep |
+| GET | /api/v1/rates | server/api/v1.js:58 | | keep |
+| POST | /api/v1/recycle | server/api/v1.js:136 | | keep |
+| GET | /api/v1/subscriptions | server/api/v1.js:189 | | keep |
+| POST | /api/v1/subscriptions | server/api/v1.js:169 | | keep |
+| GET | /api/v1/subscriptions/:id | server/api/v1.js:197 | | keep |
+| POST | /api/v1/subscriptions/:id/cancel | server/api/v1.js:202 | | keep |
+| GET | /api/v1/transactions | server/api/v1.js:224 | | keep |
+| GET | /api/v1/transactions/:id | server/api/v1.js:240 | | keep |
+| POST | /api/v1/transfers | server/api/v1.js:121 | | keep |
+| POST | /api/v1/transfers/:id/refund | server/api/v1.js:129 | | keep |
| GET | /audit | server/console/index.js:365 | | keep |
| GET | /audit | server/console/index.js:365 | | keep |
| GET | /auth/callback | server/console/index.js:184 | | keep |
| GET | /auth/callback | server/console/index.js:184 | | keep |
| GET | /auth/login | server/console/index.js:177 | | keep |
| GET | /auth/login | server/console/index.js:177 | | keep |
@@ -1768,7 +1827,7 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1768,7 +1827,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /reconciliation | server/console/index.js:324 | | keep |
| GET | /reconciliation | server/console/index.js:324 | | keep |
| POST | /reconciliation | server/console/index.js:330 | | keep |
| POST | /reconciliation | server/console/index.js:330 | | keep |
| GET | /reconciliation/:id | server/console/index.js:325 | | keep |
| GET | /reconciliation/:id | server/console/index.js:325 | | keep |
-| GET | /robots.txt | server/app.js:85 | | keep |
+| GET | /robots.txt | server/app.js:89 | | keep |
| ALL | /webhooks/:provider | server/api/webhooks.js:24 | | keep |
| ALL | /webhooks/:provider | server/api/webhooks.js:24 | | keep |
## OpenVibe.Tips
## OpenVibe.Tips
@@ -1780,40 +1839,40 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1780,40 +1839,40 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /:handle/goals | server/web/routes.js:366 | | keep |
| GET | /:handle/goals | server/web/routes.js:366 | | keep |
| GET | /:handle/supporters | server/web/routes.js:376 | | keep |
| GET | /:handle/supporters | server/web/routes.js:376 | | keep |
| POST | /:handle/tip | server/web/routes.js:391 | | keep |
| POST | /:handle/tip | server/web/routes.js:391 | | keep |
-| GET | /api/health | server/app.js:79 | | keep |
-| GET | /api/ready | server/app.js:85 | | keep |
-| POST | /api/v1/checkout | server/api/v1.js:194 | | keep |
-| GET | /api/v1/goals | server/api/v1.js:248 | | keep |
-| POST | /api/v1/goals | server/api/v1.js:262 | | keep |
-| GET | /api/v1/goals/:id | server/api/v1.js:256 | | keep |
-| PATCH | /api/v1/goals/:id | server/api/v1.js:274 | | keep |
-| POST | /api/v1/goals/:id/close | server/api/v1.js:275 | | keep |
-| GET | /api/v1/interactions | server/api/v1.js:200 | | keep |
-| GET | /api/v1/interactions/:id | server/api/v1.js:219 | | keep |
-| POST | /api/v1/interactions/:id/${action} | server/api/v1.js:350 | | keep |
-| POST | /api/v1/interactions/external | server/api/v1.js:232 | | keep |
-| POST | /api/v1/me/erase | server/api/v1.js:125 | | keep |
-| GET | /api/v1/me/export | server/api/v1.js:124 | | keep |
-| POST | /api/v1/media-requests | server/api/v1.js:197 | | keep |
-| GET | /api/v1/moderation | server/api/v1.js:338 | | keep |
-| GET | /api/v1/moderation/log | server/api/v1.js:344 | | keep |
-| GET | /api/v1/moderators | server/api/v1.js:358 | | keep |
-| POST | /api/v1/moderators | server/api/v1.js:363 | | keep |
-| POST | /api/v1/moderators/:subject/remove | server/api/v1.js:370 | | keep |
-| GET | /api/v1/overlay-configs | server/api/v1.js:301 | | keep |
-| POST | /api/v1/overlay-configs | server/api/v1.js:312 | | keep |
-| GET | /api/v1/overlay-configs/:id | server/api/v1.js:306 | | keep |
-| PATCH | /api/v1/overlay-configs/:id | server/api/v1.js:318 | | keep |
-| GET | /api/v1/overlay-tokens | server/api/v1.js:278 | | keep |
-| POST | /api/v1/overlay-tokens | server/api/v1.js:283 | | keep |
-| POST | /api/v1/overlay-tokens/:id/revoke | server/api/v1.js:294 | | keep |
-| POST | /api/v1/paid-messages | server/api/v1.js:195 | | keep |
-| GET | /api/v1/profiles/:creator | server/api/v1.js:93 | | keep |
-| PATCH | /api/v1/profiles/:creator | server/api/v1.js:127 | | keep |
-| GET | /api/v1/profiles/:creator/supporters | server/api/v1.js:106 | | keep |
-| GET | /api/v1/profiles/:creator/totals | server/api/v1.js:146 | | keep |
-| POST | /api/v1/simulate | server/api/v1.js:377 | | keep |
-| POST | /api/v1/tts-requests | server/api/v1.js:196 | | keep |
+| GET | /api/health | server/app.js:80 | | keep |
+| GET | /api/ready | server/app.js:86 | | keep |
+| POST | /api/v1/checkout | server/api/v1.js:209 | | keep |
+| GET | /api/v1/goals | server/api/v1.js:264 | | keep |
+| POST | /api/v1/goals | server/api/v1.js:278 | | keep |
+| GET | /api/v1/goals/:id | server/api/v1.js:272 | | keep |
+| PATCH | /api/v1/goals/:id | server/api/v1.js:290 | | keep |
+| POST | /api/v1/goals/:id/close | server/api/v1.js:291 | | keep |
+| GET | /api/v1/interactions | server/api/v1.js:215 | | keep |
+| GET | /api/v1/interactions/:id | server/api/v1.js:234 | | keep |
+| POST | /api/v1/interactions/:id/${action} | server/api/v1.js:367 | | keep |
+| POST | /api/v1/interactions/external | server/api/v1.js:248 | | keep |
+| POST | /api/v1/me/erase | server/api/v1.js:134 | | keep |
+| GET | /api/v1/me/export | server/api/v1.js:131 | | keep |
+| POST | /api/v1/media-requests | server/api/v1.js:212 | | keep |
+| GET | /api/v1/moderation | server/api/v1.js:355 | | keep |
+| GET | /api/v1/moderation/log | server/api/v1.js:361 | | keep |
+| GET | /api/v1/moderators | server/api/v1.js:375 | | keep |
+| POST | /api/v1/moderators | server/api/v1.js:380 | | keep |
+| POST | /api/v1/moderators/:subject/remove | server/api/v1.js:387 | | keep |
+| GET | /api/v1/overlay-configs | server/api/v1.js:318 | | keep |
+| POST | /api/v1/overlay-configs | server/api/v1.js:329 | | keep |
+| GET | /api/v1/overlay-configs/:id | server/api/v1.js:323 | | keep |
+| PATCH | /api/v1/overlay-configs/:id | server/api/v1.js:335 | | keep |
+| GET | /api/v1/overlay-tokens | server/api/v1.js:294 | | keep |
+| POST | /api/v1/overlay-tokens | server/api/v1.js:300 | | keep |
+| POST | /api/v1/overlay-tokens/:id/revoke | server/api/v1.js:311 | | keep |
+| POST | /api/v1/paid-messages | server/api/v1.js:210 | | keep |
+| GET | /api/v1/profiles/:creator | server/api/v1.js:100 | | keep |
+| PATCH | /api/v1/profiles/:creator | server/api/v1.js:136 | | keep |
+| GET | /api/v1/profiles/:creator/supporters | server/api/v1.js:113 | | keep |
+| GET | /api/v1/profiles/:creator/totals | server/api/v1.js:155 | | keep |
+| POST | /api/v1/simulate | server/api/v1.js:395 | | keep |
+| POST | /api/v1/tts-requests | server/api/v1.js:211 | | keep |
| GET | /auth/callback | server/web/session.js:132 | | keep |
| GET | /auth/callback | server/web/session.js:132 | | keep |
| POST | /auth/fedcm | server/web/session.js:158 | | keep |
| POST | /auth/fedcm | server/web/session.js:158 | | keep |
| GET | /auth/login | server/web/session.js:119 | | keep |
| GET | /auth/login | server/web/session.js:119 | | keep |
@@ -1845,32 +1904,32 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1845,32 +1904,32 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | / | server/web/routes.js:84 | | keep |
| GET | / | server/web/routes.js:84 | | keep |
| GET | /:username | server/web/routes.js:224 | | keep |
| GET | /:username | server/web/routes.js:224 | | keep |
| GET | /:username/plans/:slug | server/web/routes.js:242 | | keep |
| GET | /:username/plans/:slug | server/web/routes.js:242 | | keep |
-| GET | /api/health | server/app.js:87 | | keep |
-| GET | /api/ready | server/app.js:89 | | keep |
-| POST | /api/v1/checkout | server/api/v1.js:210 | | keep |
-| GET | /api/v1/creators/:ref | server/api/v1.js:99 | | keep |
-| GET | /api/v1/creators/:ref/card | server/api/v1.js:111 | | keep |
-| GET | /api/v1/creators/:ref/members | server/api/v1.js:338 | | keep |
-| GET | /api/v1/entitlements/check | server/api/v1.js:276 | | keep |
-| POST | /api/v1/entitlements/check | server/api/v1.js:277 | | keep |
-| POST | /api/v1/memberships/:creator/cancel | server/api/v1.js:238 | | keep |
-| PUT | /api/v1/memberships/:creator/preferences | server/api/v1.js:243 | | keep |
-| GET | /api/v1/memberships/:subject | server/api/v1.js:222 | | keep |
-| GET | /api/v1/perks | server/api/v1.js:173 | | keep |
-| POST | /api/v1/perks | server/api/v1.js:180 | | keep |
-| PATCH | /api/v1/perks/:id | server/api/v1.js:187 | | keep |
-| GET | /api/v1/plans | server/api/v1.js:118 | | keep |
-| POST | /api/v1/plans | server/api/v1.js:139 | | keep |
-| GET | /api/v1/plans/:id | server/api/v1.js:132 | | keep |
-| PATCH | /api/v1/plans/:id | server/api/v1.js:155 | | keep |
-| POST | /api/v1/plans/:id/archive | server/api/v1.js:167 | | keep |
-| POST | /api/v1/plans/:id/publish | server/api/v1.js:162 | | keep |
-| GET | /api/v1/plans/:id/versions | server/api/v1.js:133 | | keep |
-| GET | /api/v1/policies | server/api/v1.js:280 | | keep |
-| POST | /api/v1/policies | server/api/v1.js:305 | | keep |
-| DELETE | /api/v1/policies/:id | server/api/v1.js:313 | | keep |
-| GET | /api/v1/policies/:id | server/api/v1.js:299 | | keep |
-| POST | /api/v1/policies/evaluate | server/api/v1.js:319 | | keep |
+| GET | /api/health | server/app.js:88 | | keep |
+| GET | /api/ready | server/app.js:90 | | keep |
+| POST | /api/v1/checkout | server/api/v1.js:220 | | keep |
+| GET | /api/v1/creators/:ref | server/api/v1.js:107 | | keep |
+| GET | /api/v1/creators/:ref/card | server/api/v1.js:119 | | keep |
+| GET | /api/v1/creators/:ref/members | server/api/v1.js:355 | | keep |
+| GET | /api/v1/entitlements/check | server/api/v1.js:292 | | keep |
+| POST | /api/v1/entitlements/check | server/api/v1.js:293 | | keep |
+| POST | /api/v1/memberships/:creator/cancel | server/api/v1.js:249 | | keep |
+| PUT | /api/v1/memberships/:creator/preferences | server/api/v1.js:254 | | keep |
+| GET | /api/v1/memberships/:subject | server/api/v1.js:232 | | keep |
+| GET | /api/v1/perks | server/api/v1.js:181 | | keep |
+| POST | /api/v1/perks | server/api/v1.js:188 | | keep |
+| PATCH | /api/v1/perks/:id | server/api/v1.js:195 | | keep |
+| GET | /api/v1/plans | server/api/v1.js:126 | | keep |
+| POST | /api/v1/plans | server/api/v1.js:147 | | keep |
+| GET | /api/v1/plans/:id | server/api/v1.js:140 | | keep |
+| PATCH | /api/v1/plans/:id | server/api/v1.js:163 | | keep |
+| POST | /api/v1/plans/:id/archive | server/api/v1.js:175 | | keep |
+| POST | /api/v1/plans/:id/publish | server/api/v1.js:170 | | keep |
+| GET | /api/v1/plans/:id/versions | server/api/v1.js:141 | | keep |
+| GET | /api/v1/policies | server/api/v1.js:296 | | keep |
+| POST | /api/v1/policies | server/api/v1.js:321 | | keep |
+| DELETE | /api/v1/policies/:id | server/api/v1.js:329 | | keep |
+| GET | /api/v1/policies/:id | server/api/v1.js:315 | | keep |
+| POST | /api/v1/policies/evaluate | server/api/v1.js:336 | | keep |
| GET | /auth/callback | server/web/session.js:132 | | keep |
| GET | /auth/callback | server/web/session.js:132 | | keep |
| POST | /auth/fedcm | server/web/session.js:158 | | keep |
| POST | /auth/fedcm | server/web/session.js:158 | | keep |
| GET | /auth/login | server/web/session.js:119 | | keep |
| GET | /auth/login | server/web/session.js:119 | | keep |
@@ -1891,7 +1950,7 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1891,7 +1950,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/app.js:58 | | keep |
+| GET | / | server/app.js:60 | | keep |
| GET | /api/health | server/app.js:35 | | keep |
| GET | /api/health | server/app.js:35 | | keep |
| GET | /api/ready | server/app.js:42 | | keep |
| GET | /api/ready | server/app.js:42 | | keep |
| POST | /api/v1/${op} | server/api/runs.js:120 | | keep |
| POST | /api/v1/${op} | server/api/runs.js:120 | | keep |
@@ -1899,9 +1958,15 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1899,9 +1958,15 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /api/v1/${plural}/:key | server/api/admin.js:83 | | keep |
| GET | /api/v1/${plural}/:key | server/api/admin.js:83 | | keep |
| POST | /api/v1/${plural}/:key/versions | server/api/admin.js:90 | | keep |
| POST | /api/v1/${plural}/:key/versions | server/api/admin.js:90 | | keep |
| POST | /api/v1/${plural}/:key/versions/:version/status | server/api/admin.js:100 | | keep |
| POST | /api/v1/${plural}/:key/versions/:version/status | server/api/admin.js:100 | | keep |
+| DELETE | /api/v1/attribution-quotas/:attribution | server/api/attribution-quotas.js:63 | | keep |
+| GET | /api/v1/attribution-quotas/:attribution | server/api/attribution-quotas.js:60 | | keep |
+| PUT | /api/v1/attribution-quotas/:attribution | server/api/attribution-quotas.js:49 | | keep |
| GET | /api/v1/audit | server/api/admin.js:121 | | keep |
| GET | /api/v1/audit | server/api/admin.js:121 | | keep |
| DELETE | /api/v1/cache | server/api/admin.js:123 | | keep |
| DELETE | /api/v1/cache | server/api/admin.js:123 | | keep |
| GET | /api/v1/cache | server/api/admin.js:122 | | keep |
| GET | /api/v1/cache | server/api/admin.js:122 | | keep |
+| DELETE | /api/v1/credentials/:subject | server/credentials.js:152 | | keep |
+| GET | /api/v1/credentials/:subject | server/credentials.js:149 | | keep |
+| PUT | /api/v1/credentials/:subject | server/credentials.js:142 | | keep |
| GET | /api/v1/models | server/api/admin.js:68 | | keep |
| GET | /api/v1/models | server/api/admin.js:68 | | keep |
| POST | /api/v1/models | server/api/admin.js:69 | | keep |
| POST | /api/v1/models | server/api/admin.js:69 | | keep |
| PATCH | /api/v1/models/:provider/:model | server/api/admin.js:70 | | keep |
| PATCH | /api/v1/models/:provider/:model | server/api/admin.js:70 | | keep |
@@ -1942,92 +2007,92 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -1942,92 +2007,92 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /console/runs/:id | server/console/index.js:327 | | keep |
| GET | /console/runs/:id | server/console/index.js:327 | | keep |
| POST | /console/runs/:id/cancel | server/console/index.js:335 | | keep |
| POST | /console/runs/:id/cancel | server/console/index.js:335 | | keep |
| GET | /console/usage | server/console/index.js:357 | | keep |
| GET | /console/usage | server/console/index.js:357 | | keep |
-| GET | /robots.txt | server/app.js:54 | | keep |
+| GET | /robots.txt | server/app.js:56 | | keep |
## OpenVibe.Search
## OpenVibe.Search
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/web/page.js:174 | | keep |
-| GET | /api/health | server/app.js:41 | | keep |
-| GET | /api/ready | server/app.js:48 | | keep |
-| DELETE | /api/v1/documents/:owner/:type/:id | server/api/documents.js:80 | | keep |
-| GET | /api/v1/documents/:owner/:type/:id | server/api/query.js:223 | | keep |
-| PUT | /api/v1/documents/:owner/:type/:id | server/api/documents.js:62 | | keep |
-| GET | /api/v1/owners/:owner/documents | server/api/documents.js:93 | | keep |
-| GET | /api/v1/owners/:owner/documents/:type/:id | server/api/documents.js:103 | | keep |
-| GET | /api/v1/owners/:owner/rejections | server/api/documents.js:118 | | keep |
-| GET | /api/v1/owners/:owner/removals | server/api/documents.js:131 | | keep |
-| GET | /api/v1/saved-searches | server/api/saved.js:53 | | keep |
-| POST | /api/v1/saved-searches | server/api/saved.js:59 | | keep |
-| DELETE | /api/v1/saved-searches/:id | server/api/saved.js:102 | | keep |
-| GET | /api/v1/saved-searches/:id | server/api/saved.js:94 | | keep |
-| GET | /api/v1/saved-searches/:id/results | server/api/saved.js:109 | | keep |
-| GET | /api/v1/search | server/api/query.js:194 | | keep |
-| GET | /api/v1/suggest | server/api/query.js:206 | | keep |
-| GET | /frame-init.js | server/web/page.js:157 | | keep |
+| GET | / | server/web/page.js:178 | | keep |
+| GET | /api/health | server/app.js:42 | | keep |
+| GET | /api/ready | server/app.js:49 | | keep |
+| DELETE | /api/v1/documents/:owner/:type/:id | server/api/documents.js:85 | | keep |
+| GET | /api/v1/documents/:owner/:type/:id | server/api/query.js:232 | | keep |
+| PUT | /api/v1/documents/:owner/:type/:id | server/api/documents.js:67 | | keep |
+| GET | /api/v1/owners/:owner/documents | server/api/documents.js:98 | | keep |
+| GET | /api/v1/owners/:owner/documents/:type/:id | server/api/documents.js:108 | | keep |
+| GET | /api/v1/owners/:owner/rejections | server/api/documents.js:123 | | keep |
+| GET | /api/v1/owners/:owner/removals | server/api/documents.js:136 | | keep |
+| GET | /api/v1/saved-searches | server/api/saved.js:56 | | keep |
+| POST | /api/v1/saved-searches | server/api/saved.js:62 | | keep |
+| DELETE | /api/v1/saved-searches/:id | server/api/saved.js:105 | | keep |
+| GET | /api/v1/saved-searches/:id | server/api/saved.js:97 | | keep |
+| GET | /api/v1/saved-searches/:id/results | server/api/saved.js:112 | | keep |
+| GET | /api/v1/search | server/api/query.js:203 | | keep |
+| GET | /api/v1/suggest | server/api/query.js:215 | | keep |
+| GET | /frame-init.js | server/web/page.js:161 | | keep |
| POST | /internal/events | server/api/webhook.js:126 | | keep |
| POST | /internal/events | server/api/webhook.js:126 | | keep |
-| GET | /robots.txt | server/web/page.js:169 | | keep |
-| GET | /updates | server/web/page.js:162 | | keep |
+| GET | /robots.txt | server/web/page.js:173 | | keep |
+| GET | /updates | server/web/page.js:166 | | keep |
## OpenVibe.Sources
## OpenVibe.Sources
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/app.js:101 | | keep |
-| GET | /api/health | server/app.js:84 | | keep |
-| GET | /api/ready | server/app.js:91 | | keep |
-| GET | /api/v1/health | server/api/sources.js:78 | | keep |
-| GET | /api/v1/items | server/api/items.js:55 | | keep |
-| DELETE | /api/v1/items/:id | server/api/items.js:99 | | keep |
-| GET | /api/v1/items/:id | server/api/items.js:74 | | keep |
-| GET | /api/v1/runs | server/api/sources.js:67 | | keep |
-| GET | /api/v1/sources | server/api/sources.js:49 | | keep |
-| POST | /api/v1/sources | server/api/sources.js:85 | | keep |
-| DELETE | /api/v1/sources/:key | server/api/sources.js:100 | | keep |
-| GET | /api/v1/sources/:key | server/api/sources.js:53 | | keep |
-| PATCH | /api/v1/sources/:key | server/api/sources.js:92 | | keep |
-| POST | /api/v1/sources/:key/fetch | server/api/sources.js:115 | | keep |
-| POST | /api/v1/sources/:key/items | server/api/items.js:82 | | keep |
-| GET | /api/v1/sources/:key/runs | server/api/sources.js:59 | | keep |
+| GET | / | server/app.js:105 | | keep |
+| GET | /api/health | server/app.js:85 | | keep |
+| GET | /api/ready | server/app.js:92 | | keep |
+| GET | /api/v1/health | server/api/sources.js:80 | | keep |
+| GET | /api/v1/items | server/api/items.js:57 | | keep |
+| DELETE | /api/v1/items/:id | server/api/items.js:101 | | keep |
+| GET | /api/v1/items/:id | server/api/items.js:76 | | keep |
+| GET | /api/v1/runs | server/api/sources.js:69 | | keep |
+| GET | /api/v1/sources | server/api/sources.js:51 | | keep |
+| POST | /api/v1/sources | server/api/sources.js:87 | | keep |
+| DELETE | /api/v1/sources/:key | server/api/sources.js:102 | | keep |
+| GET | /api/v1/sources/:key | server/api/sources.js:55 | | keep |
+| PATCH | /api/v1/sources/:key | server/api/sources.js:94 | | keep |
+| POST | /api/v1/sources/:key/fetch | server/api/sources.js:117 | | keep |
+| POST | /api/v1/sources/:key/items | server/api/items.js:84 | | keep |
+| GET | /api/v1/sources/:key/runs | server/api/sources.js:61 | | keep |
## OpenVibe.Wiki
## OpenVibe.Wiki
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/http/pages.js:98 | | keep |
-| GET | /api/health | server/app.js:66 | | keep |
-| GET | /api/ready | server/app.js:81 | | keep |
-| DELETE | /api/v1/pages/:id | server/http/api.js:164 | | keep |
-| GET | /api/v1/pages/:id | server/http/api.js:144 | | keep |
-| PATCH | /api/v1/pages/:id | server/http/api.js:156 | | keep |
-| GET | /api/v1/pages/:id/diff | server/http/api.js:188 | | keep |
-| POST | /api/v1/pages/:id/media | server/http/api.js:226 | | keep |
-| POST | /api/v1/pages/:id/media/verify | server/http/api.js:231 | | keep |
-| POST | /api/v1/pages/:id/publish | server/http/api.js:208 | | keep |
-| POST | /api/v1/pages/:id/revert | server/http/api.js:221 | | keep |
-| GET | /api/v1/pages/:id/revisions | server/http/api.js:168 | | keep |
-| POST | /api/v1/pages/:id/revisions | server/http/api.js:173 | | keep |
-| GET | /api/v1/pages/:id/revisions/:n | server/http/api.js:183 | | keep |
-| GET | /api/v1/pages/:id/revisions/:n/citations | server/http/api.js:193 | | keep |
-| POST | /api/v1/pages/:id/revisions/:n/citations | server/http/api.js:198 | | keep |
-| POST | /api/v1/pages/:id/revisions/:n/review | server/http/api.js:202 | | keep |
-| POST | /api/v1/pages/:id/schedule | server/http/api.js:212 | | keep |
-| POST | /api/v1/pages/:id/unpublish | server/http/api.js:217 | | keep |
-| PUT | /api/v1/pages/:id/watch | server/http/api.js:236 | | keep |
-| POST | /api/v1/proposals | server/http/api.js:239 | | keep |
-| GET | /api/v1/proposals/:id | server/http/api.js:250 | | keep |
-| POST | /api/v1/proposals/:id/review | server/http/api.js:258 | | keep |
-| GET | /api/v1/search | server/http/api.js:263 | | keep |
-| GET | /api/v1/spaces | server/http/api.js:116 | | keep |
-| POST | /api/v1/spaces | server/http/api.js:117 | | keep |
-| GET | /api/v1/spaces/:space | server/http/api.js:118 | | keep |
-| PATCH | /api/v1/spaces/:space | server/http/api.js:122 | | keep |
+| GET | / | server/http/pages.js:119 | | keep |
+| GET | /api/health | server/app.js:67 | | keep |
+| GET | /api/ready | server/app.js:82 | | keep |
+| DELETE | /api/v1/pages/:id | server/http/api.js:179 | | keep |
+| GET | /api/v1/pages/:id | server/http/api.js:159 | | keep |
+| PATCH | /api/v1/pages/:id | server/http/api.js:171 | | keep |
+| GET | /api/v1/pages/:id/diff | server/http/api.js:203 | | keep |
+| POST | /api/v1/pages/:id/media | server/http/api.js:241 | | keep |
+| POST | /api/v1/pages/:id/media/verify | server/http/api.js:246 | | keep |
+| POST | /api/v1/pages/:id/publish | server/http/api.js:223 | | keep |
+| POST | /api/v1/pages/:id/revert | server/http/api.js:236 | | keep |
+| GET | /api/v1/pages/:id/revisions | server/http/api.js:183 | | keep |
+| POST | /api/v1/pages/:id/revisions | server/http/api.js:188 | | keep |
+| GET | /api/v1/pages/:id/revisions/:n | server/http/api.js:198 | | keep |
+| GET | /api/v1/pages/:id/revisions/:n/citations | server/http/api.js:208 | | keep |
+| POST | /api/v1/pages/:id/revisions/:n/citations | server/http/api.js:213 | | keep |
+| POST | /api/v1/pages/:id/revisions/:n/review | server/http/api.js:217 | | keep |
+| POST | /api/v1/pages/:id/schedule | server/http/api.js:227 | | keep |
+| POST | /api/v1/pages/:id/unpublish | server/http/api.js:232 | | keep |
+| PUT | /api/v1/pages/:id/watch | server/http/api.js:251 | | keep |
+| POST | /api/v1/proposals | server/http/api.js:254 | | keep |
+| GET | /api/v1/proposals/:id | server/http/api.js:265 | | keep |
+| POST | /api/v1/proposals/:id/review | server/http/api.js:273 | | keep |
+| GET | /api/v1/search | server/http/api.js:278 | | keep |
+| GET | /api/v1/spaces | server/http/api.js:131 | | keep |
+| POST | /api/v1/spaces | server/http/api.js:132 | | keep |
+| GET | /api/v1/spaces/:space | server/http/api.js:133 | | keep |
+| PATCH | /api/v1/spaces/:space | server/http/api.js:137 | | keep |
| POST | /api/v1/spaces/:space/import | server/http/api.js:86 | | keep |
| POST | /api/v1/spaces/:space/import | server/http/api.js:86 | | keep |
-| POST | /api/v1/spaces/:space/import | server/http/api.js:133 | | keep |
-| POST | /api/v1/spaces/:space/pages | server/http/api.js:125 | | keep |
-| GET | /api/v1/spaces/:space/roles | server/http/api.js:123 | | keep |
-| PUT | /api/v1/spaces/:space/roles/:subject | server/http/api.js:124 | | keep |
+| POST | /api/v1/spaces/:space/import | server/http/api.js:148 | | keep |
+| POST | /api/v1/spaces/:space/pages | server/http/api.js:140 | | keep |
+| GET | /api/v1/spaces/:space/roles | server/http/api.js:138 | | keep |
+| PUT | /api/v1/spaces/:space/roles/:subject | server/http/api.js:139 | | keep |
| GET | /auth/callback | server/auth/session.js:125 | | keep |
| GET | /auth/callback | server/auth/session.js:125 | | keep |
| POST | /auth/fedcm | server/auth/session.js:150 | | keep |
| POST | /auth/fedcm | server/auth/session.js:150 | | keep |
| GET | /auth/login | server/auth/session.js:111 | | keep |
| GET | /auth/login | server/auth/session.js:111 | | keep |
@@ -2037,40 +2102,40 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -2037,40 +2102,40 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /feed.atom | server/http/machine.js:84 | | keep |
| GET | /feed.atom | server/http/machine.js:84 | | keep |
| GET | /feed.json | server/http/machine.js:89 | | keep |
| GET | /feed.json | server/http/machine.js:89 | | keep |
| GET | /llms.txt | server/http/machine.js:93 | | keep |
| GET | /llms.txt | server/http/machine.js:93 | | keep |
-| GET | /new-space | server/http/pages.js:115 | | keep |
-| POST | /new-space | server/http/pages.js:119 | | keep |
-| POST | /proposals/:id | server/http/pages.js:247 | | keep |
-| GET | /recent | server/http/pages.js:108 | | keep |
+| GET | /new-space | server/http/pages.js:137 | | keep |
+| POST | /new-space | server/http/pages.js:141 | | keep |
+| POST | /proposals/:id | server/http/pages.js:269 | | keep |
+| GET | /recent | server/http/pages.js:130 | | keep |
| GET | /robots.txt | server/http/machine.js:24 | | keep |
| GET | /robots.txt | server/http/machine.js:24 | | keep |
-| GET | /s/:space | server/http/pages.js:131 | | keep |
-| GET | /s/:space/import | server/http/pages.js:215 | | keep |
-| POST | /s/:space/import | server/http/pages.js:220 | | keep |
-| GET | /s/:space/new | server/http/pages.js:158 | | keep |
-| POST | /s/:space/new | server/http/pages.js:164 | | keep |
-| GET | /s/:space/proposals | server/http/pages.js:240 | | keep |
-| GET | /s/:space/settings | server/http/pages.js:183 | | keep |
-| POST | /s/:space/settings | server/http/pages.js:190 | | keep |
-| GET | /search | server/app.js:108 | | keep |
-| GET | /search | server/http/pages.js:109 | | keep |
+| GET | /s/:space | server/http/pages.js:153 | | keep |
+| GET | /s/:space/import | server/http/pages.js:237 | | keep |
+| POST | /s/:space/import | server/http/pages.js:242 | | keep |
+| GET | /s/:space/new | server/http/pages.js:180 | | keep |
+| POST | /s/:space/new | server/http/pages.js:186 | | keep |
+| GET | /s/:space/proposals | server/http/pages.js:262 | | keep |
+| GET | /s/:space/settings | server/http/pages.js:205 | | keep |
+| POST | /s/:space/settings | server/http/pages.js:212 | | keep |
+| GET | /search | server/app.js:112 | | keep |
+| GET | /search | server/http/pages.js:131 | | keep |
| GET | /sitemap.xml | server/http/machine.js:46 | | keep |
| GET | /sitemap.xml | server/http/machine.js:46 | | keep |
| GET | /sitemaps/pages-:n.xml | server/http/machine.js:53 | | keep |
| GET | /sitemaps/pages-:n.xml | server/http/machine.js:53 | | keep |
| GET | /sitemaps/spaces.xml | server/http/machine.js:52 | | keep |
| GET | /sitemaps/spaces.xml | server/http/machine.js:52 | | keep |
-| GET | /updates | server/http/pages.js:107 | | keep |
-| GET | /w/:space/:slug | server/http/pages.js:285 | | keep |
-| GET | /w/:space/:slug/compare | server/http/pages.js:349 | | keep |
-| GET | /w/:space/:slug/diff/:a/:b | server/http/pages.js:357 | | keep |
-| POST | /w/:space/:slug/discuss | server/http/pages.js:516 | | keep |
-| GET | /w/:space/:slug/edit | server/http/pages.js:378 | | keep |
-| POST | /w/:space/:slug/edit | server/http/pages.js:393 | | keep |
-| GET | /w/:space/:slug/history | server/http/pages.js:324 | | keep |
-| GET | /w/:space/:slug/publish | server/http/pages.js:441 | | keep |
-| GET | /w/:space/:slug/revert | server/http/pages.js:420 | | keep |
-| POST | /w/:space/:slug/revert | server/http/pages.js:431 | | keep |
-| POST | /w/:space/:slug/review | server/http/pages.js:498 | | keep |
-| GET | /w/:space/:slug/settings | server/http/pages.js:450 | | keep |
-| POST | /w/:space/:slug/settings | server/http/pages.js:464 | | keep |
-| GET | /w/:space/:slug/sources | server/http/pages.js:335 | | keep |
-| POST | /w/:space/:slug/watch | server/http/pages.js:508 | | keep |
+| GET | /updates | server/http/pages.js:129 | | keep |
+| GET | /w/:space/:slug | server/http/pages.js:307 | | keep |
+| GET | /w/:space/:slug/compare | server/http/pages.js:371 | | keep |
+| GET | /w/:space/:slug/diff/:a/:b | server/http/pages.js:379 | | keep |
+| POST | /w/:space/:slug/discuss | server/http/pages.js:538 | | keep |
+| GET | /w/:space/:slug/edit | server/http/pages.js:400 | | keep |
+| POST | /w/:space/:slug/edit | server/http/pages.js:415 | | keep |
+| GET | /w/:space/:slug/history | server/http/pages.js:346 | | keep |
+| GET | /w/:space/:slug/publish | server/http/pages.js:463 | | keep |
+| GET | /w/:space/:slug/revert | server/http/pages.js:442 | | keep |
+| POST | /w/:space/:slug/revert | server/http/pages.js:453 | | keep |
+| POST | /w/:space/:slug/review | server/http/pages.js:520 | | keep |
+| GET | /w/:space/:slug/settings | server/http/pages.js:472 | | keep |
+| POST | /w/:space/:slug/settings | server/http/pages.js:486 | | keep |
+| GET | /w/:space/:slug/sources | server/http/pages.js:357 | | keep |
+| POST | /w/:space/:slug/watch | server/http/pages.js:530 | | keep |
## OpenVibe.Blog
## OpenVibe.Blog
@@ -2079,32 +2144,32 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -2079,32 +2144,32 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | / | server/http/public.js:118 | | keep |
| GET | / | server/http/public.js:118 | | keep |
| GET | /@:handle | server/http/public.js:130 | | keep |
| GET | /@:handle | server/http/public.js:130 | | keep |
| GET | /@:handle/:slug | server/http/public.js:364 | | keep |
| GET | /@:handle/:slug | server/http/public.js:364 | | keep |
-| POST | /@:handle/:slug/comments | server/http/public.js:381 | | keep |
+| POST | /@:handle/:slug/comments | server/http/public.js:383 | | keep |
| GET | /@:handle/${file} | server/http/public.js:156 | | keep |
| GET | /@:handle/${file} | server/http/public.js:156 | | keep |
| GET | /@:handle/authors/:who | server/http/public.js:227 | | keep |
| GET | /@:handle/authors/:who | server/http/public.js:227 | | keep |
| GET | /@:handle/categories/:category | server/http/public.js:203 | | keep |
| GET | /@:handle/categories/:category | server/http/public.js:203 | | keep |
| GET | /@:handle/series/:series | server/http/public.js:214 | | keep |
| GET | /@:handle/series/:series | server/http/public.js:214 | | keep |
| GET | /@:handle/tags/:tag | server/http/public.js:188 | | keep |
| GET | /@:handle/tags/:tag | server/http/public.js:188 | | keep |
| GET | /${file} | server/http/public.js:155 | | keep |
| GET | /${file} | server/http/public.js:155 | | keep |
-| GET | /api/health | server/app.js:112 | | keep |
-| GET | /api/ready | server/app.js:116 | | keep |
-| POST | /api/v1/blogs | server/http/api.js:127 | | keep |
-| GET | /api/v1/blogs/:handle | server/http/api.js:122 | | keep |
-| PATCH | /api/v1/blogs/:handle | server/http/api.js:134 | | keep |
-| GET | /api/v1/blogs/:handle/feed | server/http/api.js:221 | | keep |
-| GET | /api/v1/blogs/:handle/members | server/http/api.js:152 | | keep |
-| DELETE | /api/v1/blogs/:handle/members/:subject | server/http/api.js:166 | | keep |
-| PUT | /api/v1/blogs/:handle/members/:subject | server/http/api.js:160 | | keep |
-| GET | /api/v1/blogs/:handle/posts | server/http/api.js:172 | | keep |
-| POST | /api/v1/blogs/:handle/posts | server/http/api.js:214 | | keep |
-| POST | /api/v1/blogs/:handle/posts/ai-draft | server/http/api.js:206 | | keep |
-| PUT | /api/v1/blogs/:handle/theme | server/http/api.js:146 | | keep |
-| GET | /api/v1/changelog | server/http/api.js:187 | | keep |
-| GET | /api/v1/posts/:id | server/http/api.js:232 | | keep |
-| GET | /api/v1/posts/:id/diff | server/http/api.js:306 | | keep |
-| POST | /api/v1/posts/:id/reviews | server/http/api.js:279 | | keep |
-| GET | /api/v1/posts/:id/revisions | server/http/api.js:296 | | keep |
-| GET | /api/v1/posts/:id/revisions/:n | server/http/api.js:300 | | keep |
+| GET | /api/health | server/app.js:117 | | keep |
+| GET | /api/ready | server/app.js:121 | | keep |
+| POST | /api/v1/blogs | server/http/api.js:132 | | keep |
+| GET | /api/v1/blogs/:handle | server/http/api.js:127 | | keep |
+| PATCH | /api/v1/blogs/:handle | server/http/api.js:139 | | keep |
+| GET | /api/v1/blogs/:handle/feed | server/http/api.js:226 | | keep |
+| GET | /api/v1/blogs/:handle/members | server/http/api.js:157 | | keep |
+| DELETE | /api/v1/blogs/:handle/members/:subject | server/http/api.js:171 | | keep |
+| PUT | /api/v1/blogs/:handle/members/:subject | server/http/api.js:165 | | keep |
+| GET | /api/v1/blogs/:handle/posts | server/http/api.js:177 | | keep |
+| POST | /api/v1/blogs/:handle/posts | server/http/api.js:219 | | keep |
+| POST | /api/v1/blogs/:handle/posts/ai-draft | server/http/api.js:211 | | keep |
+| PUT | /api/v1/blogs/:handle/theme | server/http/api.js:151 | | keep |
+| GET | /api/v1/changelog | server/http/api.js:192 | | keep |
+| GET | /api/v1/posts/:id | server/http/api.js:237 | | keep |
+| GET | /api/v1/posts/:id/diff | server/http/api.js:311 | | keep |
+| POST | /api/v1/posts/:id/reviews | server/http/api.js:284 | | keep |
+| GET | /api/v1/posts/:id/revisions | server/http/api.js:301 | | keep |
+| GET | /api/v1/posts/:id/revisions/:n | server/http/api.js:305 | | keep |
| GET | /auth/callback | server/auth/sso.js:282 | | keep |
| GET | /auth/callback | server/auth/sso.js:282 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:328 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:328 | | keep |
| GET | /auth/login | server/auth/sso.js:260 | | keep |
| GET | /auth/login | server/auth/sso.js:260 | | keep |
@@ -2119,22 +2184,27 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -2119,22 +2184,27 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /sitemaps/posts.xml | server/http/discovery.js:78 | | keep |
| GET | /sitemaps/posts.xml | server/http/discovery.js:78 | | keep |
| GET | /tags/:tag | server/http/public.js:196 | | keep |
| GET | /tags/:tag | server/http/public.js:196 | | keep |
| GET | /updates | server/http/public.js:122 | | keep |
| GET | /updates | server/http/public.js:122 | | keep |
-| GET | /write | server/http/editor.js:94 | | keep |
-| GET | /write/@:handle | server/http/editor.js:109 | | keep |
-| POST | /write/@:handle/ai-draft | server/http/editor.js:125 | | keep |
-| POST | /write/@:handle/members | server/http/editor.js:162 | | keep |
-| POST | /write/@:handle/members/remove | server/http/editor.js:173 | | keep |
-| GET | /write/@:handle/new | server/http/editor.js:117 | | keep |
-| POST | /write/@:handle/new | server/http/editor.js:134 | | keep |
-| GET | /write/@:handle/settings | server/http/editor.js:142 | | keep |
-| POST | /write/@:handle/settings | server/http/editor.js:150 | | keep |
-| GET | /write/posts/:id | server/http/editor.js:182 | | keep |
-| POST | /write/posts/:id | server/http/editor.js:203 | | keep |
-| POST | /write/posts/:id/${name} | server/http/editor.js:212 | | keep |
-| POST | /write/posts/:id/media/:aid/remove | server/http/editor.js:242 | | keep |
-| GET | /write/posts/:id/preview | server/http/editor.js:260 | | keep |
-| GET | /write/posts/:id/revisions | server/http/editor.js:249 | | keep |
-| POST | /write/start | server/http/editor.js:101 | | keep |
+| GET | /write | server/http/editor.js:106 | | keep |
+| GET | /write/@:handle | server/http/editor.js:121 | | keep |
+| POST | /write/@:handle/ai-draft | server/http/editor.js:56 | | keep |
+| POST | /write/@:handle/ai-draft | server/http/editor.js:137 | | keep |
+| POST | /write/@:handle/members | server/http/editor.js:174 | | keep |
+| POST | /write/@:handle/members/remove | server/http/editor.js:185 | | keep |
+| GET | /write/@:handle/new | server/http/editor.js:129 | | keep |
+| POST | /write/@:handle/new | server/http/editor.js:57 | | keep |
+| POST | /write/@:handle/new | server/http/editor.js:146 | | keep |
+| GET | /write/@:handle/settings | server/http/editor.js:154 | | keep |
+| POST | /write/@:handle/settings | server/http/editor.js:58 | | keep |
+| POST | /write/@:handle/settings | server/http/editor.js:162 | | keep |
+| GET | /write/posts/:id | server/http/editor.js:194 | | keep |
+| POST | /write/posts/:id | server/http/editor.js:215 | | keep |
+| POST | /write/posts/:id/${name} | server/http/editor.js:224 | | keep |
+| POST | /write/posts/:id/delete | server/http/editor.js:62 | | keep |
+| POST | /write/posts/:id/media/:aid/remove | server/http/editor.js:254 | | keep |
+| GET | /write/posts/:id/preview | server/http/editor.js:272 | | keep |
+| GET | /write/posts/:id/revisions | server/http/editor.js:261 | | keep |
+| POST | /write/start | server/http/editor.js:55 | | keep |
+| POST | /write/start | server/http/editor.js:113 | | keep |
## OpenVibe.News
## OpenVibe.News
@@ -2142,43 +2212,43 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -2142,43 +2212,43 @@ Owner = the repository whose code answers the route; target = the authority it b
|---|---|---|---|---|
|---|---|---|---|---|
| GET | / | server/http/public.js:98 | | keep |
| GET | / | server/http/public.js:98 | | keep |
| GET | /${f.file} | server/http/public.js:130 | | keep |
| GET | /${f.file} | server/http/public.js:130 | | keep |
-| GET | /api/health | server/app.js:107 | | keep |
-| GET | /api/ready | server/app.js:111 | | keep |
-| GET | /api/v1/clusters | server/http/api.js:219 | | keep |
-| GET | /api/v1/clusters/:id | server/http/api.js:224 | | keep |
-| POST | /api/v1/clusters/:id/merge | server/http/api.js:235 | | keep |
-| POST | /api/v1/clusters/:id/split | server/http/api.js:241 | | keep |
-| POST | /api/v1/clusters/audit/:auditId/reverse | server/http/api.js:230 | | keep |
-| GET | /api/v1/ingest | server/http/api.js:253 | | keep |
-| GET | /api/v1/source-items/:id | server/http/api.js:247 | | keep |
-| GET | /api/v1/stories | server/http/api.js:129 | | keep |
-| POST | /api/v1/stories | server/http/api.js:152 | | keep |
-| GET | /api/v1/stories/:id | server/http/api.js:139 | | keep |
-| GET | /api/v1/stories/:id/diff | server/http/api.js:170 | | keep |
-| POST | /api/v1/stories/:id/reviews | server/http/api.js:200 | | keep |
-| GET | /api/v1/stories/:id/revisions | server/http/api.js:158 | | keep |
-| GET | /api/v1/stories/:id/revisions/:n | server/http/api.js:163 | | keep |
-| GET | /api/v1/topics | server/http/api.js:118 | | keep |
-| POST | /api/v1/topics | server/http/api.js:120 | | keep |
+| GET | /api/health | server/app.js:112 | | keep |
+| GET | /api/ready | server/app.js:116 | | keep |
+| GET | /api/v1/clusters | server/http/api.js:225 | | keep |
+| GET | /api/v1/clusters/:id | server/http/api.js:230 | | keep |
+| POST | /api/v1/clusters/:id/merge | server/http/api.js:241 | | keep |
+| POST | /api/v1/clusters/:id/split | server/http/api.js:247 | | keep |
+| POST | /api/v1/clusters/audit/:auditId/reverse | server/http/api.js:236 | | keep |
+| GET | /api/v1/ingest | server/http/api.js:259 | | keep |
+| GET | /api/v1/source-items/:id | server/http/api.js:253 | | keep |
+| GET | /api/v1/stories | server/http/api.js:134 | | keep |
+| POST | /api/v1/stories | server/http/api.js:157 | | keep |
+| GET | /api/v1/stories/:id | server/http/api.js:144 | | keep |
+| GET | /api/v1/stories/:id/diff | server/http/api.js:175 | | keep |
+| POST | /api/v1/stories/:id/reviews | server/http/api.js:206 | | keep |
+| GET | /api/v1/stories/:id/revisions | server/http/api.js:163 | | keep |
+| GET | /api/v1/stories/:id/revisions/:n | server/http/api.js:168 | | keep |
+| GET | /api/v1/topics | server/http/api.js:123 | | keep |
+| POST | /api/v1/topics | server/http/api.js:125 | | keep |
| GET | /auth/callback | server/auth/sso.js:282 | | keep |
| GET | /auth/callback | server/auth/sso.js:282 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:328 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:328 | | keep |
| GET | /auth/login | server/auth/sso.js:260 | | keep |
| GET | /auth/login | server/auth/sso.js:260 | | keep |
| GET | /auth/logout | server/auth/sso.js:356 | | keep |
| GET | /auth/logout | server/auth/sso.js:356 | | keep |
| GET | /auth/me | server/auth/sso.js:380 | | keep |
| GET | /auth/me | server/auth/sso.js:380 | | keep |
| POST | /auth/refresh | server/auth/sso.js:390 | | keep |
| POST | /auth/refresh | server/auth/sso.js:390 | | keep |
-| GET | /clusters/:id | server/http/editor.js:105 | | keep |
-| POST | /clusters/:id/merge | server/http/editor.js:114 | | keep |
-| POST | /clusters/:id/split | server/http/editor.js:119 | | keep |
-| POST | /clusters/:id/stories | server/http/editor.js:128 | | keep |
-| POST | /clusters/audit/:aid/reverse | server/http/editor.js:124 | | keep |
-| GET | /edit | server/http/editor.js:74 | | keep |
-| POST | /edit/pull | server/http/editor.js:85 | | keep |
-| GET | /edit/stories/:id | server/http/editor.js:142 | | keep |
-| POST | /edit/stories/:id/${path} | server/http/editor.js:171 | | keep |
-| GET | /edit/stories/:id/diff | server/http/editor.js:165 | | keep |
-| GET | /edit/stories/:id/preview | server/http/editor.js:155 | | keep |
-| GET | /edit/topics | server/http/editor.js:90 | | keep |
-| POST | /edit/topics | server/http/editor.js:91 | | keep |
+| GET | /clusters/:id | server/http/editor.js:110 | | keep |
+| POST | /clusters/:id/merge | server/http/editor.js:119 | | keep |
+| POST | /clusters/:id/split | server/http/editor.js:124 | | keep |
+| POST | /clusters/:id/stories | server/http/editor.js:133 | | keep |
+| POST | /clusters/audit/:aid/reverse | server/http/editor.js:129 | | keep |
+| GET | /edit | server/http/editor.js:79 | | keep |
+| POST | /edit/pull | server/http/editor.js:90 | | keep |
+| GET | /edit/stories/:id | server/http/editor.js:147 | | keep |
+| POST | /edit/stories/:id/${path} | server/http/editor.js:176 | | keep |
+| GET | /edit/stories/:id/diff | server/http/editor.js:170 | | keep |
+| GET | /edit/stories/:id/preview | server/http/editor.js:160 | | keep |
+| GET | /edit/topics | server/http/editor.js:95 | | keep |
+| POST | /edit/topics | server/http/editor.js:96 | | keep |
| POST | /internal/events | server/http/webhook.js:29 | | keep |
| POST | /internal/events | server/http/webhook.js:29 | | keep |
| GET | /llms.txt | server/http/discovery.js:47 | | keep |
| GET | /llms.txt | server/http/discovery.js:47 | | keep |
| GET | /robots.txt | server/http/discovery.js:35 | | keep |
| GET | /robots.txt | server/http/discovery.js:35 | | keep |
@@ -2186,7 +2256,7 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -2186,7 +2256,7 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /sitemaps/stories.xml | server/http/discovery.js:76 | | keep |
| GET | /sitemaps/stories.xml | server/http/discovery.js:76 | | keep |
| GET | /sitemaps/topics.xml | server/http/discovery.js:80 | | keep |
| GET | /sitemaps/topics.xml | server/http/discovery.js:80 | | keep |
| GET | /stories/:slug | server/http/public.js:185 | | keep |
| GET | /stories/:slug | server/http/public.js:185 | | keep |
-| POST | /stories/:slug/comments | server/http/public.js:201 | | keep |
+| POST | /stories/:slug/comments | server/http/public.js:202 | | keep |
| GET | /topics | server/http/public.js:100 | | keep |
| GET | /topics | server/http/public.js:100 | | keep |
| GET | /topics/:slug | server/http/public.js:104 | | keep |
| GET | /topics/:slug | server/http/public.js:104 | | keep |
| GET | /topics/:slug/${f.file} | server/http/public.js:131 | | keep |
| GET | /topics/:slug/${f.file} | server/http/public.js:131 | | keep |
@@ -2196,158 +2266,158 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -2196,158 +2266,158 @@ Owner = the repository whose code answers the route; target = the authority it b
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/http/pages.js:141 | | keep |
-| GET | /about | server/http/pages.js:150 | | keep |
-| GET | /api/health | server/app.js:83 | | keep |
-| GET | /api/ready | server/app.js:103 | | keep |
-| GET | /api/v1/corrections | server/http/api.js:152 | | keep |
-| PATCH | /api/v1/corrections/:id | server/http/api.js:156 | | keep |
-| GET | /api/v1/entities | server/http/api.js:71 | | keep |
-| POST | /api/v1/entities | server/http/api.js:91 | | keep |
-| DELETE | /api/v1/entities/:ref | server/http/api.js:96 | | keep |
-| GET | /api/v1/entities/:ref | server/http/api.js:78 | | keep |
-| PATCH | /api/v1/entities/:ref | server/http/api.js:95 | | keep |
-| GET | /api/v1/entities/:ref/aggregate | server/http/api.js:85 | | keep |
-| POST | /api/v1/entities/:ref/aliases | server/http/api.js:97 | | keep |
-| DELETE | /api/v1/entities/:ref/aliases/:id | server/http/api.js:98 | | keep |
-| POST | /api/v1/entities/:ref/corrections | server/http/api.js:151 | | keep |
-| GET | /api/v1/entities/:ref/history | server/http/api.js:84 | | keep |
-| POST | /api/v1/entities/:ref/links | server/http/api.js:99 | | keep |
-| DELETE | /api/v1/entities/:ref/links/:id | server/http/api.js:100 | | keep |
-| POST | /api/v1/entities/:ref/merge | server/http/api.js:101 | | keep |
-| POST | /api/v1/entities/:ref/split | server/http/api.js:105 | | keep |
-| POST | /api/v1/entities/:ref/summary/proposals | server/http/api.js:145 | | keep |
-| POST | /api/v1/entities/:ref/summary/publish | server/http/api.js:148 | | keep |
-| POST | /api/v1/entities/:ref/summary/revisions | server/http/api.js:144 | | keep |
-| GET | /api/v1/entities/:ref/summary/revisions/:n | server/http/api.js:146 | | keep |
-| POST | /api/v1/entities/:ref/summary/revisions/:n/review | server/http/api.js:147 | | keep |
-| POST | /api/v1/entities/:ref/summary/unpublish | server/http/api.js:149 | | keep |
-| GET | /api/v1/items | server/http/api.js:111 | | keep |
-| GET | /api/v1/items/:id | server/http/api.js:115 | | keep |
-| POST | /api/v1/items/:id/resolution | server/http/api.js:122 | | keep |
-| POST | /api/v1/resolve | server/http/api.js:77 | | keep |
-| POST | /api/v1/signals/import | server/http/api.js:129 | | keep |
-| POST | /api/v1/sources/sync | server/http/api.js:136 | | keep |
-| POST | /api/v1/trust | server/http/api.js:109 | | keep |
+| GET | / | server/http/pages.js:145 | | keep |
+| GET | /about | server/http/pages.js:154 | | keep |
+| GET | /api/health | server/app.js:84 | | keep |
+| GET | /api/ready | server/app.js:104 | | keep |
+| GET | /api/v1/corrections | server/http/api.js:158 | | keep |
+| PATCH | /api/v1/corrections/:id | server/http/api.js:162 | | keep |
+| GET | /api/v1/entities | server/http/api.js:76 | | keep |
+| POST | /api/v1/entities | server/http/api.js:97 | | keep |
+| DELETE | /api/v1/entities/:ref | server/http/api.js:102 | | keep |
+| GET | /api/v1/entities/:ref | server/http/api.js:84 | | keep |
+| PATCH | /api/v1/entities/:ref | server/http/api.js:101 | | keep |
+| GET | /api/v1/entities/:ref/aggregate | server/http/api.js:91 | | keep |
+| POST | /api/v1/entities/:ref/aliases | server/http/api.js:103 | | keep |
+| DELETE | /api/v1/entities/:ref/aliases/:id | server/http/api.js:104 | | keep |
+| POST | /api/v1/entities/:ref/corrections | server/http/api.js:157 | | keep |
+| GET | /api/v1/entities/:ref/history | server/http/api.js:90 | | keep |
+| POST | /api/v1/entities/:ref/links | server/http/api.js:105 | | keep |
+| DELETE | /api/v1/entities/:ref/links/:id | server/http/api.js:106 | | keep |
+| POST | /api/v1/entities/:ref/merge | server/http/api.js:107 | | keep |
+| POST | /api/v1/entities/:ref/split | server/http/api.js:111 | | keep |
+| POST | /api/v1/entities/:ref/summary/proposals | server/http/api.js:151 | | keep |
+| POST | /api/v1/entities/:ref/summary/publish | server/http/api.js:154 | | keep |
+| POST | /api/v1/entities/:ref/summary/revisions | server/http/api.js:150 | | keep |
+| GET | /api/v1/entities/:ref/summary/revisions/:n | server/http/api.js:152 | | keep |
+| POST | /api/v1/entities/:ref/summary/revisions/:n/review | server/http/api.js:153 | | keep |
+| POST | /api/v1/entities/:ref/summary/unpublish | server/http/api.js:155 | | keep |
+| GET | /api/v1/items | server/http/api.js:117 | | keep |
+| GET | /api/v1/items/:id | server/http/api.js:121 | | keep |
+| POST | /api/v1/items/:id/resolution | server/http/api.js:128 | | keep |
+| POST | /api/v1/resolve | server/http/api.js:83 | | keep |
+| POST | /api/v1/signals/import | server/http/api.js:135 | | keep |
+| POST | /api/v1/sources/sync | server/http/api.js:142 | | keep |
+| POST | /api/v1/trust | server/http/api.js:115 | | keep |
| GET | /auth/callback | server/auth/session.js:125 | | keep |
| GET | /auth/callback | server/auth/session.js:125 | | keep |
| POST | /auth/fedcm | server/auth/session.js:150 | | keep |
| POST | /auth/fedcm | server/auth/session.js:150 | | keep |
| GET | /auth/login | server/auth/session.js:111 | | keep |
| GET | /auth/login | server/auth/session.js:111 | | keep |
| GET | /auth/logout | server/auth/session.js:164 | | keep |
| GET | /auth/logout | server/auth/session.js:164 | | keep |
| GET | /auth/me | server/auth/session.js:180 | | keep |
| GET | /auth/me | server/auth/session.js:180 | | keep |
| POST | /auth/refresh | server/auth/session.js:186 | | keep |
| POST | /auth/refresh | server/auth/session.js:186 | | keep |
-| GET | /e/:slug | server/http/pages.js:176 | | keep |
-| GET | /e/:slug.json | server/http/pages.js:156 | | keep |
-| GET | /e/:slug/correct | server/http/pages.js:204 | | keep |
-| POST | /e/:slug/correct | server/app.js:125 | | keep |
-| POST | /e/:slug/correct | server/http/pages.js:210 | | keep |
-| POST | /e/:slug/discuss | server/http/pages.js:224 | | keep |
-| GET | /e/:slug/edit | server/http/pages.js:285 | | keep |
-| POST | /e/:slug/edit | server/http/pages.js:291 | | keep |
-| GET | /e/:slug/history | server/http/pages.js:191 | | keep |
-| POST | /e/:slug/merge | server/http/pages.js:339 | | keep |
-| POST | /e/:slug/split | server/http/pages.js:348 | | keep |
-| POST | /e/:slug/summary | server/http/pages.js:317 | | keep |
-| GET | /e/:slug/summary/:n | server/http/pages.js:197 | | keep |
-| POST | /e/:slug/summary/:n/review | server/http/pages.js:330 | | keep |
-| GET | /editor | server/http/pages.js:242 | | keep |
-| POST | /editor/corrections/:id | server/http/pages.js:376 | | keep |
-| GET | /editor/entities/new | server/http/pages.js:258 | | keep |
-| POST | /editor/entities/new | server/http/pages.js:262 | | keep |
-| GET | /editor/items/:id | server/http/pages.js:357 | | keep |
-| POST | /editor/items/:id | server/http/pages.js:365 | | keep |
-| POST | /editor/sync | server/http/pages.js:250 | | keep |
+| GET | /e/:slug | server/http/pages.js:180 | | keep |
+| GET | /e/:slug.json | server/http/pages.js:160 | | keep |
+| GET | /e/:slug/correct | server/http/pages.js:208 | | keep |
+| POST | /e/:slug/correct | server/app.js:129 | | keep |
+| POST | /e/:slug/correct | server/http/pages.js:214 | | keep |
+| POST | /e/:slug/discuss | server/http/pages.js:228 | | keep |
+| GET | /e/:slug/edit | server/http/pages.js:289 | | keep |
+| POST | /e/:slug/edit | server/http/pages.js:295 | | keep |
+| GET | /e/:slug/history | server/http/pages.js:195 | | keep |
+| POST | /e/:slug/merge | server/http/pages.js:343 | | keep |
+| POST | /e/:slug/split | server/http/pages.js:352 | | keep |
+| POST | /e/:slug/summary | server/http/pages.js:321 | | keep |
+| GET | /e/:slug/summary/:n | server/http/pages.js:201 | | keep |
+| POST | /e/:slug/summary/:n/review | server/http/pages.js:334 | | keep |
+| GET | /editor | server/http/pages.js:246 | | keep |
+| POST | /editor/corrections/:id | server/http/pages.js:380 | | keep |
+| GET | /editor/entities/new | server/http/pages.js:262 | | keep |
+| POST | /editor/entities/new | server/http/pages.js:266 | | keep |
+| GET | /editor/items/:id | server/http/pages.js:361 | | keep |
+| POST | /editor/items/:id | server/http/pages.js:369 | | keep |
+| POST | /editor/sync | server/http/pages.js:254 | | keep |
| POST | /events | server/http/consumer.js:43 | | keep |
| POST | /events | server/http/consumer.js:43 | | keep |
| GET | /feed.atom | server/http/machine.js:66 | | keep |
| GET | /feed.atom | server/http/machine.js:66 | | keep |
| GET | /feed.json | server/http/machine.js:71 | | keep |
| GET | /feed.json | server/http/machine.js:71 | | keep |
| GET | /llms.txt | server/http/machine.js:75 | | keep |
| GET | /llms.txt | server/http/machine.js:75 | | keep |
| GET | /robots.txt | server/http/machine.js:23 | | keep |
| GET | /robots.txt | server/http/machine.js:23 | | keep |
-| GET | /search | server/http/pages.js:151 | | keep |
+| GET | /search | server/http/pages.js:155 | | keep |
| GET | /sitemap.xml | server/http/machine.js:34 | | keep |
| GET | /sitemap.xml | server/http/machine.js:34 | | keep |
| GET | /sitemaps/entities-:n.xml | server/http/machine.js:45 | | keep |
| GET | /sitemaps/entities-:n.xml | server/http/machine.js:45 | | keep |
| GET | /sitemaps/pages.xml | server/http/machine.js:40 | | keep |
| GET | /sitemaps/pages.xml | server/http/machine.js:40 | | keep |
-| GET | /updates | server/http/pages.js:149 | | keep |
+| GET | /updates | server/http/pages.js:153 | | keep |
## OpenVibe.Deals
## OpenVibe.Deals
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/http/pages.js:132 | | keep |
-| GET | /api/health | server/app.js:114 | | keep |
-| GET | /api/ready | server/app.js:118 | | keep |
-| GET | /api/v1/flags | server/http/api.js:144 | | keep |
-| POST | /api/v1/flags/:id/resolve | server/http/api.js:150 | | keep |
-| GET | /api/v1/offers | server/http/api.js:65 | | keep |
-| POST | /api/v1/offers | server/http/api.js:93 | | keep |
-| GET | /api/v1/offers/:id | server/http/api.js:73 | | keep |
-| PATCH | /api/v1/offers/:id | server/http/api.js:99 | | keep |
-| POST | /api/v1/offers/:id/${action} | server/http/api.js:141 | | keep |
-| POST | /api/v1/offers/:id/expire | server/http/api.js:107 | | keep |
-| POST | /api/v1/offers/:id/flags | server/http/api.js:123 | | keep |
-| GET | /api/v1/offers/:id/hotness | server/http/api.js:82 | | keep |
-| POST | /api/v1/offers/:id/merge | server/http/api.js:129 | | keep |
-| POST | /api/v1/offers/:id/observations | server/http/api.js:101 | | keep |
-| POST | /api/v1/offers/:id/unmerge | server/http/api.js:135 | | keep |
-| DELETE | /api/v1/offers/:id/vote | server/http/api.js:117 | | keep |
-| PUT | /api/v1/offers/:id/vote | server/http/api.js:109 | | keep |
-| GET | /api/v1/products/:slug | server/http/api.js:157 | | keep |
-| POST | /api/v1/products/resolve | server/http/api.js:167 | | keep |
-| GET | /api/v1/stores/:domain | server/http/api.js:181 | | keep |
-| GET | /api/v1/watches | server/http/api.js:189 | | keep |
-| POST | /api/v1/watches | server/http/api.js:191 | | keep |
-| DELETE | /api/v1/watches/:id | server/http/api.js:196 | | keep |
-| GET | /atom.xml | server/http/pages.js:424 | | keep |
+| GET | / | server/http/pages.js:135 | | keep |
+| GET | /api/health | server/app.js:118 | | keep |
+| GET | /api/ready | server/app.js:122 | | keep |
+| GET | /api/v1/flags | server/http/api.js:148 | | keep |
+| POST | /api/v1/flags/:id/resolve | server/http/api.js:154 | | keep |
+| GET | /api/v1/offers | server/http/api.js:69 | | keep |
+| POST | /api/v1/offers | server/http/api.js:97 | | keep |
+| GET | /api/v1/offers/:id | server/http/api.js:77 | | keep |
+| PATCH | /api/v1/offers/:id | server/http/api.js:103 | | keep |
+| POST | /api/v1/offers/:id/${action} | server/http/api.js:145 | | keep |
+| POST | /api/v1/offers/:id/expire | server/http/api.js:111 | | keep |
+| POST | /api/v1/offers/:id/flags | server/http/api.js:127 | | keep |
+| GET | /api/v1/offers/:id/hotness | server/http/api.js:86 | | keep |
+| POST | /api/v1/offers/:id/merge | server/http/api.js:133 | | keep |
+| POST | /api/v1/offers/:id/observations | server/http/api.js:105 | | keep |
+| POST | /api/v1/offers/:id/unmerge | server/http/api.js:139 | | keep |
+| DELETE | /api/v1/offers/:id/vote | server/http/api.js:121 | | keep |
+| PUT | /api/v1/offers/:id/vote | server/http/api.js:113 | | keep |
+| GET | /api/v1/products/:slug | server/http/api.js:161 | | keep |
+| POST | /api/v1/products/resolve | server/http/api.js:171 | | keep |
+| GET | /api/v1/stores/:domain | server/http/api.js:185 | | keep |
+| GET | /api/v1/watches | server/http/api.js:193 | | keep |
+| POST | /api/v1/watches | server/http/api.js:195 | | keep |
+| DELETE | /api/v1/watches/:id | server/http/api.js:200 | | keep |
+| GET | /atom.xml | server/http/pages.js:427 | | keep |
| GET | /auth/callback | server/auth/sso.js:282 | | keep |
| GET | /auth/callback | server/auth/sso.js:282 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:328 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:328 | | keep |
| GET | /auth/login | server/auth/sso.js:260 | | keep |
| GET | /auth/login | server/auth/sso.js:260 | | keep |
| GET | /auth/logout | server/auth/sso.js:356 | | keep |
| GET | /auth/logout | server/auth/sso.js:356 | | keep |
| GET | /auth/me | server/auth/sso.js:380 | | keep |
| GET | /auth/me | server/auth/sso.js:380 | | keep |
| POST | /auth/refresh | server/auth/sso.js:390 | | keep |
| POST | /auth/refresh | server/auth/sso.js:390 | | keep |
-| GET | /d/:slug | server/http/pages.js:204 | | keep |
-| POST | /d/:slug/comments | server/http/pages.js:235 | | keep |
-| POST | /d/:slug/expire | server/http/pages.js:230 | | keep |
-| POST | /d/:slug/flag | server/http/pages.js:225 | | keep |
-| POST | /d/:slug/observe | server/http/pages.js:220 | | keep |
-| POST | /d/:slug/vote | server/http/pages.js:212 | | keep |
-| GET | /feed.json | server/http/pages.js:428 | | keep |
-| GET | /feed.xml | server/http/pages.js:423 | | keep |
+| GET | /d/:slug | server/http/pages.js:207 | | keep |
+| POST | /d/:slug/comments | server/http/pages.js:238 | | keep |
+| POST | /d/:slug/expire | server/http/pages.js:233 | | keep |
+| POST | /d/:slug/flag | server/http/pages.js:228 | | keep |
+| POST | /d/:slug/observe | server/http/pages.js:223 | | keep |
+| POST | /d/:slug/vote | server/http/pages.js:215 | | keep |
+| GET | /feed.json | server/http/pages.js:431 | | keep |
+| GET | /feed.xml | server/http/pages.js:426 | | keep |
| POST | /internal/events | server/http/internal.js:24 | | keep |
| POST | /internal/events | server/http/internal.js:24 | | keep |
| GET | /llms.txt | server/http/discovery.js:51 | | keep |
| GET | /llms.txt | server/http/discovery.js:51 | | keep |
-| GET | /mod | server/http/pages.js:371 | | keep |
-| POST | /mod/flags/:id/:action | server/http/pages.js:398 | | keep |
-| POST | /mod/offers/:slug/:action | server/http/pages.js:380 | | keep |
-| GET | /new | server/http/pages.js:139 | | keep |
-| GET | /p/:slug | server/http/pages.js:252 | | keep |
+| GET | /mod | server/http/pages.js:374 | | keep |
+| POST | /mod/flags/:id/:action | server/http/pages.js:401 | | keep |
+| POST | /mod/offers/:slug/:action | server/http/pages.js:383 | | keep |
+| GET | /new | server/http/pages.js:142 | | keep |
+| GET | /p/:slug | server/http/pages.js:255 | | keep |
| GET | /robots.txt | server/http/discovery.js:39 | | keep |
| GET | /robots.txt | server/http/discovery.js:39 | | keep |
-| GET | /s/:domain | server/http/pages.js:275 | | keep |
-| GET | /search | server/http/pages.js:293 | | keep |
+| GET | /s/:domain | server/http/pages.js:278 | | keep |
+| GET | /search | server/http/pages.js:296 | | keep |
| GET | /sitemap.xml | server/http/discovery.js:69 | | keep |
| GET | /sitemap.xml | server/http/discovery.js:69 | | keep |
| GET | /sitemaps/offers.xml | server/http/discovery.js:76 | | keep |
| GET | /sitemaps/offers.xml | server/http/discovery.js:76 | | keep |
| GET | /sitemaps/products.xml | server/http/discovery.js:77 | | keep |
| GET | /sitemaps/products.xml | server/http/discovery.js:77 | | keep |
-| GET | /submit | server/http/pages.js:307 | | keep |
-| POST | /submit | server/http/pages.js:314 | | keep |
-| GET | /updates | server/http/pages.js:134 | | keep |
-| GET | /watches | server/http/pages.js:341 | | keep |
-| POST | /watches | server/http/pages.js:346 | | keep |
-| POST | /watches/:id/delete | server/http/pages.js:358 | | keep |
+| GET | /submit | server/http/pages.js:310 | | keep |
+| POST | /submit | server/http/pages.js:317 | | keep |
+| GET | /updates | server/http/pages.js:137 | | keep |
+| GET | /watches | server/http/pages.js:344 | | keep |
+| POST | /watches | server/http/pages.js:349 | | keep |
+| POST | /watches/:id/delete | server/http/pages.js:361 | | keep |
## OpenVibe.Coupons
## OpenVibe.Coupons
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/http/public.js:105 | | keep |
-| GET | /about | server/http/public.js:118 | | keep |
-| GET | /api/health | server/app.js:98 | | keep |
-| GET | /api/ready | server/app.js:102 | | keep |
-| GET | /api/v1/coupons/:id | server/http/api.js:143 | | keep |
-| POST | /api/v1/coupons/:id/report | server/http/api.js:152 | | keep |
-| POST | /api/v1/coupons/:id/status | server/http/api.js:176 | | keep |
-| POST | /api/v1/coupons/submit | server/http/api.js:158 | | keep |
-| POST | /api/v1/merchants | server/http/api.js:186 | | keep |
-| GET | /api/v1/merchants/:id | server/http/api.js:137 | | keep |
-| GET | /api/v1/merchants/:id/coupons | server/http/api.js:131 | | keep |
-| POST | /api/v1/merchants/:id/domains | server/http/api.js:196 | | keep |
-| POST | /api/v1/merchants/:id/status | server/http/api.js:205 | | keep |
-| GET | /api/v1/merchants/resolve | server/http/api.js:115 | | keep |
+| GET | / | server/http/public.js:108 | | keep |
+| GET | /about | server/http/public.js:121 | | keep |
+| GET | /api/health | server/app.js:105 | | keep |
+| GET | /api/ready | server/app.js:109 | | keep |
+| GET | /api/v1/coupons/:id | server/http/api.js:148 | | keep |
+| POST | /api/v1/coupons/:id/report | server/http/api.js:157 | | keep |
+| POST | /api/v1/coupons/:id/status | server/http/api.js:181 | | keep |
+| POST | /api/v1/coupons/submit | server/http/api.js:163 | | keep |
+| POST | /api/v1/merchants | server/http/api.js:191 | | keep |
+| GET | /api/v1/merchants/:id | server/http/api.js:142 | | keep |
+| GET | /api/v1/merchants/:id/coupons | server/http/api.js:136 | | keep |
+| POST | /api/v1/merchants/:id/domains | server/http/api.js:201 | | keep |
+| POST | /api/v1/merchants/:id/status | server/http/api.js:210 | | keep |
+| GET | /api/v1/merchants/resolve | server/http/api.js:120 | | keep |
| GET | /atom.xml | server/http/discovery.js:111 | | keep |
| GET | /atom.xml | server/http/discovery.js:111 | | keep |
| GET | /auth/callback | server/auth/sso.js:282 | | keep |
| GET | /auth/callback | server/auth/sso.js:282 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:328 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:328 | | keep |
@@ -2355,31 +2425,31 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -2355,31 +2425,31 @@ Owner = the repository whose code answers the route; target = the authority it b
| GET | /auth/logout | server/auth/sso.js:356 | | keep |
| GET | /auth/logout | server/auth/sso.js:356 | | keep |
| GET | /auth/me | server/auth/sso.js:380 | | keep |
| GET | /auth/me | server/auth/sso.js:380 | | keep |
| POST | /auth/refresh | server/auth/sso.js:390 | | keep |
| POST | /auth/refresh | server/auth/sso.js:390 | | keep |
-| GET | /c/:id | server/http/public.js:199 | | keep |
-| GET | /c/:id.json | server/http/public.js:189 | | keep |
-| POST | /c/:id/report | server/http/public.js:213 | | keep |
-| GET | /connect-extension | server/http/public.js:271 | | keep |
-| POST | /connect-extension | server/http/public.js:272 | | keep |
-| POST | /connect-extension/:id/revoke | server/http/public.js:282 | | keep |
+| GET | /c/:id | server/http/public.js:202 | | keep |
+| GET | /c/:id.json | server/http/public.js:192 | | keep |
+| POST | /c/:id/report | server/http/public.js:216 | | keep |
+| GET | /connect-extension | server/http/public.js:274 | | keep |
+| POST | /connect-extension | server/http/public.js:275 | | keep |
+| POST | /connect-extension/:id/revoke | server/http/public.js:285 | | keep |
| GET | /feed.json | server/http/discovery.js:117 | | keep |
| GET | /feed.json | server/http/discovery.js:117 | | keep |
| GET | /feed.xml | server/http/discovery.js:110 | | keep |
| GET | /feed.xml | server/http/discovery.js:110 | | keep |
| GET | /llms.txt | server/http/discovery.js:50 | | keep |
| GET | /llms.txt | server/http/discovery.js:50 | | keep |
-| GET | /m/:slug | server/http/public.js:151 | | keep |
-| GET | /m/:slug.json | server/http/public.js:140 | | keep |
+| GET | /m/:slug | server/http/public.js:154 | | keep |
+| GET | /m/:slug.json | server/http/public.js:143 | | keep |
| GET | /m/:slug/feed.xml | server/http/discovery.js:120 | | keep |
| GET | /m/:slug/feed.xml | server/http/discovery.js:120 | | keep |
-| POST | /m/:slug/watch | server/http/public.js:171 | | keep |
+| POST | /m/:slug/watch | server/http/public.js:174 | | keep |
| GET | /robots.txt | server/http/discovery.js:39 | | keep |
| GET | /robots.txt | server/http/discovery.js:39 | | keep |
| GET | /sitemap.xml | server/http/discovery.js:70 | | keep |
| GET | /sitemap.xml | server/http/discovery.js:70 | | keep |
| GET | /sitemaps/coupons.xml | server/http/discovery.js:79 | | keep |
| GET | /sitemaps/coupons.xml | server/http/discovery.js:79 | | keep |
| GET | /sitemaps/merchants.xml | server/http/discovery.js:83 | | keep |
| GET | /sitemaps/merchants.xml | server/http/discovery.js:83 | | keep |
-| GET | /staff | server/http/public.js:324 | | keep |
-| POST | /staff/coupons/:id/approve | server/http/public.js:337 | | keep |
-| POST | /staff/merchants | server/http/public.js:325 | | keep |
-| POST | /staff/merchants/:id/status | server/http/public.js:331 | | keep |
-| GET | /submit | server/http/public.js:227 | | keep |
-| POST | /submit | server/http/public.js:236 | | keep |
-| GET | /updates | server/http/public.js:100 | | keep |
-| GET | /watching | server/http/public.js:288 | | keep |
+| GET | /staff | server/http/public.js:327 | | keep |
+| POST | /staff/coupons/:id/approve | server/http/public.js:340 | | keep |
+| POST | /staff/merchants | server/http/public.js:328 | | keep |
+| POST | /staff/merchants/:id/status | server/http/public.js:334 | | keep |
+| GET | /submit | server/http/public.js:230 | | keep |
+| POST | /submit | server/http/public.js:239 | | keep |
+| GET | /updates | server/http/public.js:103 | | keep |
+| GET | /watching | server/http/public.js:291 | | keep |
## OpenVibe.Trade
## OpenVibe.Trade
@@ -2398,169 +2468,171 @@ Owner = the repository whose code answers the route; target = the authority it b
@@ -2398,169 +2468,171 @@ Owner = the repository whose code answers the route; target = the authority it b
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
| GET | / | server/http/pages.js:59 | | keep |
| GET | / | server/http/pages.js:59 | | keep |
-| GET | /api/health | server/app.js:102 | | keep |
-| GET | /api/ready | server/app.js:106 | | keep |
-| GET | /api/v1/apps/:app/releases | server/http/api.js:65 | | keep |
-| POST | /api/v1/apps/:app/releases | server/http/api.js:107 | | keep |
-| GET | /api/v1/apps/:app/trust | server/http/api.js:70 | | keep |
-| GET | /api/v1/docs/versions | server/http/api.js:42 | | keep |
-| POST | /api/v1/manifests/validate | server/http/api.js:46 | | keep |
-| GET | /api/v1/releases/:id | server/http/api.js:75 | | keep |
-| POST | /api/v1/releases/:id/${action} | server/http/api.js:123 | | keep |
+| GET | /api/health | server/app.js:112 | | keep |
+| GET | /api/ready | server/app.js:116 | | keep |
+| GET | /api/v1/apps/:app/releases | server/http/api.js:69 | | keep |
+| POST | /api/v1/apps/:app/releases | server/http/api.js:111 | | keep |
+| GET | /api/v1/apps/:app/trust | server/http/api.js:74 | | keep |
+| GET | /api/v1/docs/versions | server/http/api.js:46 | | keep |
+| POST | /api/v1/manifests/validate | server/http/api.js:50 | | keep |
+| GET | /api/v1/releases/:id | server/http/api.js:79 | | keep |
+| POST | /api/v1/releases/:id/${action} | server/http/api.js:127 | | keep |
| GET | /apps/:app | server/http/pages.js:181 | | keep |
| GET | /apps/:app | server/http/pages.js:181 | | keep |
| GET | /callback | server/auth/sso.js:187 | | keep |
| GET | /callback | server/auth/sso.js:187 | | keep |
-| GET | /docs | server/http/docs.js:42 | | keep |
-| GET | /docs/adr/:id | server/http/docs.js:542 | | keep |
-| GET | /docs/api | server/http/docs.js:182 | | keep |
-| GET | /docs/api/:service | server/http/docs.js:203 | | keep |
-| GET | /docs/api/:service.json | server/http/docs.js:197 | | keep |
-| GET | /docs/billing | server/http/docs.js:371 | | keep |
-| GET | /docs/capabilities | server/http/docs.js:125 | | keep |
-| GET | /docs/capabilities/:id | server/http/docs.js:144 | | keep |
-| GET | /docs/contracts | server/http/docs.js:72 | | keep |
-| GET | /docs/contracts/:id | server/http/docs.js:91 | | keep |
-| GET | /docs/contracts/:id.json | server/http/docs.js:85 | | keep |
-| GET | /docs/events | server/http/docs.js:296 | | keep |
-| GET | /docs/export | server/http/docs.js:484 | | keep |
-| GET | /docs/limits | server/http/docs.js:452 | | keep |
-| GET | /docs/sdk | server/http/docs.js:517 | | keep |
-| GET | /docs/sdk/:module | server/http/docs.js:529 | | keep |
-| GET | /docs/services | server/http/docs.js:307 | | keep |
-| GET | /docs/tools | server/http/docs.js:338 | | keep |
-| GET | /docs/updates | server/http/docs.js:249 | | keep |
+| GET | /docs | server/http/docs.js:43 | | keep |
+| GET | /docs/adr/:id | server/http/docs.js:513 | | keep |
+| GET | /docs/api | server/http/docs.js:183 | | keep |
+| GET | /docs/api/:service | server/http/docs.js:204 | | keep |
+| GET | /docs/api/:service.json | server/http/docs.js:198 | | keep |
+| GET | /docs/billing | server/http/docs.js:372 | | keep |
+| GET | /docs/capabilities | server/http/docs.js:126 | | keep |
+| GET | /docs/capabilities/:id | server/http/docs.js:145 | | keep |
+| GET | /docs/contracts | server/http/docs.js:73 | | keep |
+| GET | /docs/contracts/:id | server/http/docs.js:92 | | keep |
+| GET | /docs/contracts/:id.json | server/http/docs.js:86 | | keep |
+| GET | /docs/events | server/http/docs.js:297 | | keep |
+| GET | /docs/export | server/http/docs.js:455 | | keep |
+| GET | /docs/limits | server/http/docs.js:422 | | keep |
+| GET | /docs/sdk | server/http/docs.js:488 | | keep |
+| GET | /docs/sdk/:module | server/http/docs.js:500 | | keep |
+| GET | /docs/services | server/http/docs.js:308 | | keep |
+| GET | /docs/tools | server/http/docs.js:339 | | keep |
+| GET | /docs/updates | server/http/docs.js:250 | | keep |
| GET | /login | server/auth/sso.js:178 | | keep |
| GET | /login | server/auth/sso.js:178 | | keep |
| ALL | /logout | server/auth/sso.js:233 | | keep |
| ALL | /logout | server/auth/sso.js:233 | | keep |
| GET | /logout | server/auth/sso.js:224 | | keep |
| GET | /logout | server/auth/sso.js:224 | | keep |
| POST | /logout | server/auth/sso.js:232 | | keep |
| POST | /logout | server/auth/sso.js:232 | | keep |
-| GET | /manifests/validate | server/http/tools.js:172 | | keep |
-| POST | /manifests/validate | server/http/tools.js:173 | | keep |
+| GET | /manifests/validate | server/http/tools.js:175 | | keep |
+| POST | /manifests/validate | server/http/tools.js:176 | | keep |
| GET | /me | server/auth/sso.js:247 | | keep |
| GET | /me | server/auth/sso.js:247 | | keep |
-| GET | /oauth | server/http/tools.js:29 | | keep |
-| GET | /oauth/test-callback | server/http/tools.js:65 | | keep |
+| GET | /oauth | server/http/tools.js:32 | | keep |
+| GET | /oauth/test-callback | server/http/tools.js:68 | | keep |
| GET | /policy | server/http/pages.js:89 | | keep |
| GET | /policy | server/http/pages.js:89 | | keep |
| GET | /policy/${g.slug} | server/http/pages.js:101 | | keep |
| GET | /policy/${g.slug} | server/http/pages.js:101 | | keep |
| GET | /policy/compatibility | server/http/pages.js:124 | | keep |
| GET | /policy/compatibility | server/http/pages.js:124 | | keep |
| GET | /policy/licensing | server/http/pages.js:138 | | keep |
| GET | /policy/licensing | server/http/pages.js:138 | | keep |
| GET | /policy/rfc | server/http/pages.js:110 | | keep |
| GET | /policy/rfc | server/http/pages.js:110 | | keep |
| GET | /policy/transparency | server/http/pages.js:154 | | keep |
| GET | /policy/transparency | server/http/pages.js:154 | | keep |
-| GET | /projects | server/http/portal.js:110 | | keep |
-| POST | /projects | server/http/portal.js:111 | | keep |
-| POST | /projects/:id/${action} | server/http/portal.js:671 | | keep |
-| GET | /projects/:project | server/http/portal.js:124 | | keep |
-| POST | /projects/:project/apps | server/http/portal.js:346 | | keep |
-| GET | /projects/:project/apps/:app | server/http/portal.js:389 | | keep |
-| POST | /projects/:project/apps/:app/credentials/:credential/revoke | server/http/portal.js:498 | | keep |
-| POST | /projects/:project/apps/:app/credentials/rotate | server/http/portal.js:487 | | keep |
-| POST | /projects/:project/apps/:app/grants | server/http/portal.js:504 | | keep |
-| POST | /projects/:project/apps/:app/grants/:capability/${action} | server/http/portal.js:520 | | keep |
-| GET | /projects/:project/apps/:app/playground | server/http/portal.js:575 | | keep |
-| POST | /projects/:project/apps/:app/playground/events | server/http/portal.js:577 | | keep |
-| POST | /projects/:project/apps/:app/playground/media | server/http/portal.js:590 | | keep |
-| POST | /projects/:project/apps/:app/redirects | server/http/portal.js:478 | | keep |
-| POST | /projects/:project/apps/:app/releases | server/http/portal.js:631 | | keep |
-| GET | /projects/:project/apps/:app/releases/new | server/http/portal.js:630 | | keep |
-| POST | /projects/:project/apps/:app/revoke | server/http/portal.js:482 | | keep |
-| POST | /projects/:project/archive | server/http/portal.js:230 | | keep |
-| GET | /projects/:project/audit | server/http/portal.js:303 | | keep |
-| POST | /projects/:project/delete | server/http/portal.js:286 | | keep |
-| GET | /projects/:project/export | server/http/portal.js:236 | | keep |
-| POST | /projects/:project/export/archive | server/http/portal.js:252 | | keep |
-| POST | /projects/:project/members | server/http/portal.js:213 | | keep |
-| POST | /projects/:project/members/:subject/remove | server/http/portal.js:223 | | keep |
-| POST | /projects/:project/members/:subject/role | server/http/portal.js:218 | | keep |
-| GET | /releases | server/http/portal.js:110 | | keep |
-| POST | /releases | server/http/portal.js:111 | | keep |
+| GET | /projects | server/http/portal.js:117 | | keep |
+| POST | /projects | server/http/portal.js:118 | | keep |
+| POST | /projects/:id/${action} | server/http/portal.js:697 | | keep |
+| GET | /projects/:project | server/http/portal.js:131 | | keep |
+| POST | /projects/:project/apps | server/http/portal.js:370 | | keep |
+| GET | /projects/:project/apps/:app | server/http/portal.js:413 | | keep |
+| POST | /projects/:project/apps/:app/credentials/:credential/revoke | server/http/portal.js:522 | | keep |
+| POST | /projects/:project/apps/:app/credentials/rotate | server/http/portal.js:511 | | keep |
+| POST | /projects/:project/apps/:app/grants | server/http/portal.js:528 | | keep |
+| POST | /projects/:project/apps/:app/grants/:capability/${action} | server/http/portal.js:544 | | keep |
+| GET | /projects/:project/apps/:app/playground | server/http/portal.js:599 | | keep |
+| POST | /projects/:project/apps/:app/playground/events | server/http/portal.js:601 | | keep |
+| POST | /projects/:project/apps/:app/playground/media | server/http/portal.js:614 | | keep |
+| POST | /projects/:project/apps/:app/redirects | server/http/portal.js:502 | | keep |
+| POST | /projects/:project/apps/:app/releases | server/http/portal.js:655 | | keep |
+| GET | /projects/:project/apps/:app/releases/new | server/http/portal.js:654 | | keep |
+| POST | /projects/:project/apps/:app/revoke | server/http/portal.js:506 | | keep |
+| POST | /projects/:project/archive | server/http/portal.js:237 | | keep |
+| GET | /projects/:project/audit | server/http/portal.js:310 | | keep |
+| POST | /projects/:project/delete | server/http/portal.js:293 | | keep |
+| GET | /projects/:project/export | server/http/portal.js:243 | | keep |
+| POST | /projects/:project/export/archive | server/http/portal.js:259 | | keep |
+| POST | /projects/:project/members | server/http/portal.js:220 | | keep |
+| POST | /projects/:project/members/:subject/remove | server/http/portal.js:230 | | keep |
+| POST | /projects/:project/members/:subject/role | server/http/portal.js:225 | | keep |
+| GET | /projects/:project/usage | server/http/portal.js:327 | | keep |
+| GET | /releases | server/http/portal.js:117 | | keep |
+| POST | /releases | server/http/portal.js:118 | | keep |
| GET | /releases/:id | server/http/pages.js:201 | | keep |
| GET | /releases/:id | server/http/pages.js:201 | | keep |
-| POST | /releases/:id/${action} | server/http/portal.js:671 | | keep |
-| GET | /releases/:project | server/http/portal.js:124 | | keep |
-| POST | /releases/:project/apps | server/http/portal.js:346 | | keep |
-| GET | /releases/:project/apps/:app | server/http/portal.js:389 | | keep |
-| POST | /releases/:project/apps/:app/credentials/:credential/revoke | server/http/portal.js:498 | | keep |
-| POST | /releases/:project/apps/:app/credentials/rotate | server/http/portal.js:487 | | keep |
-| POST | /releases/:project/apps/:app/grants | server/http/portal.js:504 | | keep |
-| POST | /releases/:project/apps/:app/grants/:capability/${action} | server/http/portal.js:520 | | keep |
-| GET | /releases/:project/apps/:app/playground | server/http/portal.js:575 | | keep |
-| POST | /releases/:project/apps/:app/playground/events | server/http/portal.js:577 | | keep |
-| POST | /releases/:project/apps/:app/playground/media | server/http/portal.js:590 | | keep |
-| POST | /releases/:project/apps/:app/redirects | server/http/portal.js:478 | | keep |
-| POST | /releases/:project/apps/:app/releases | server/http/portal.js:631 | | keep |
-| GET | /releases/:project/apps/:app/releases/new | server/http/portal.js:630 | | keep |
-| POST | /releases/:project/apps/:app/revoke | server/http/portal.js:482 | | keep |
-| POST | /releases/:project/archive | server/http/portal.js:230 | | keep |
-| GET | /releases/:project/audit | server/http/portal.js:303 | | keep |
-| POST | /releases/:project/delete | server/http/portal.js:286 | | keep |
-| GET | /releases/:project/export | server/http/portal.js:236 | | keep |
-| POST | /releases/:project/export/archive | server/http/portal.js:252 | | keep |
-| POST | /releases/:project/members | server/http/portal.js:213 | | keep |
-| POST | /releases/:project/members/:subject/remove | server/http/portal.js:223 | | keep |
-| POST | /releases/:project/members/:subject/role | server/http/portal.js:218 | | keep |
-| GET | /robots.txt | server/http/pages.js:267 | | keep |
-| GET | /sitemap.xml | server/http/pages.js:273 | | keep |
+| POST | /releases/:id/${action} | server/http/portal.js:697 | | keep |
+| GET | /releases/:project | server/http/portal.js:131 | | keep |
+| POST | /releases/:project/apps | server/http/portal.js:370 | | keep |
+| GET | /releases/:project/apps/:app | server/http/portal.js:413 | | keep |
+| POST | /releases/:project/apps/:app/credentials/:credential/revoke | server/http/portal.js:522 | | keep |
+| POST | /releases/:project/apps/:app/credentials/rotate | server/http/portal.js:511 | | keep |
+| POST | /releases/:project/apps/:app/grants | server/http/portal.js:528 | | keep |
+| POST | /releases/:project/apps/:app/grants/:capability/${action} | server/http/portal.js:544 | | keep |
+| GET | /releases/:project/apps/:app/playground | server/http/portal.js:599 | | keep |
+| POST | /releases/:project/apps/:app/playground/events | server/http/portal.js:601 | | keep |
+| POST | /releases/:project/apps/:app/playground/media | server/http/portal.js:614 | | keep |
+| POST | /releases/:project/apps/:app/redirects | server/http/portal.js:502 | | keep |
+| POST | /releases/:project/apps/:app/releases | server/http/portal.js:655 | | keep |
+| GET | /releases/:project/apps/:app/releases/new | server/http/portal.js:654 | | keep |
+| POST | /releases/:project/apps/:app/revoke | server/http/portal.js:506 | | keep |
+| POST | /releases/:project/archive | server/http/portal.js:237 | | keep |
+| GET | /releases/:project/audit | server/http/portal.js:310 | | keep |
+| POST | /releases/:project/delete | server/http/portal.js:293 | | keep |
+| GET | /releases/:project/export | server/http/portal.js:243 | | keep |
+| POST | /releases/:project/export/archive | server/http/portal.js:259 | | keep |
+| POST | /releases/:project/members | server/http/portal.js:220 | | keep |
+| POST | /releases/:project/members/:subject/remove | server/http/portal.js:230 | | keep |
+| POST | /releases/:project/members/:subject/role | server/http/portal.js:225 | | keep |
+| GET | /releases/:project/usage | server/http/portal.js:327 | | keep |
+| GET | /robots.txt | server/http/pages.js:268 | | keep |
+| GET | /sitemap.xml | server/http/pages.js:274 | | keep |
| GET | /staff | server/http/pages.js:243 | | keep |
| GET | /staff | server/http/pages.js:243 | | keep |
-| POST | /staff/trust | server/http/pages.js:256 | | keep |
-| GET | /tools/webhooks | server/http/tools.js:143 | | keep |
-| POST | /tools/webhooks/sample | server/http/tools.js:149 | | keep |
-| POST | /tools/webhooks/verify | server/http/tools.js:144 | | keep |
+| POST | /staff/trust | server/http/pages.js:257 | | keep |
+| GET | /tools/webhooks | server/http/tools.js:146 | | keep |
+| POST | /tools/webhooks/sample | server/http/tools.js:152 | | keep |
+| POST | /tools/webhooks/verify | server/http/tools.js:147 | | keep |
| GET | /updates | server/http/pages.js:88 | | keep |
| GET | /updates | server/http/pages.js:88 | | keep |
## OpenVibe.Host
## OpenVibe.Host
| Method | Path | Source | Target | Disposition |
| Method | Path | Source | Target | Disposition |
|---|---|---|---|---|
|---|---|---|---|---|
-| GET | / | server/http/dashboard.js:68 | | keep |
-| GET | /api/health | server/app.js:131 | | keep |
-| GET | /api/ready | server/app.js:137 | | keep |
-| DELETE | /api/v1/deploys/:id | server/http/api.js:191 | | keep |
-| GET | /api/v1/deploys/:id | server/http/api.js:173 | | keep |
-| POST | /api/v1/deploys/:id/activate | server/http/api.js:181 | | keep |
-| GET | /api/v1/deploys/:id/log | server/http/api.js:177 | | keep |
-| DELETE | /api/v1/domains/:id | server/http/api.js:207 | | keep |
-| POST | /api/v1/domains/:id/verify | server/http/api.js:202 | | keep |
-| GET | /api/v1/projects | server/http/api.js:61 | | keep |
-| POST | /api/v1/projects | server/http/api.js:65 | | keep |
-| DELETE | /api/v1/projects/:id | server/http/api.js:74 | | keep |
-| GET | /api/v1/projects/:id | server/http/api.js:70 | | keep |
-| DELETE | /api/v1/projects/:id/members/:principal | server/http/api.js:92 | | keep |
-| PUT | /api/v1/projects/:id/members/:principal | server/http/api.js:87 | | keep |
-| GET | /api/v1/projects/:id/quota | server/http/api.js:78 | | keep |
-| PUT | /api/v1/projects/:id/quota | server/http/api.js:82 | | keep |
-| GET | /api/v1/projects/:id/sites | server/http/api.js:118 | | keep |
-| POST | /api/v1/projects/:id/sites | server/http/api.js:122 | | keep |
-| DELETE | /api/v1/projects/:id/takedown | server/http/api.js:104 | | keep |
-| POST | /api/v1/projects/:id/takedown | server/http/api.js:100 | | keep |
-| DELETE | /api/v1/sites/:id | server/http/api.js:131 | | keep |
-| GET | /api/v1/sites/:id | server/http/api.js:127 | | keep |
-| GET | /api/v1/sites/:id/deploys | server/http/api.js:134 | | keep |
-| POST | /api/v1/sites/:id/deploys | server/http/api.js:144 | | keep |
-| GET | /api/v1/sites/:id/domains | server/http/api.js:194 | | keep |
-| POST | /api/v1/sites/:id/domains | server/http/api.js:198 | | keep |
-| POST | /api/v1/sites/:id/rollback | server/http/api.js:186 | | keep |
-| DELETE | /api/v1/sites/:id/takedown | server/http/api.js:112 | | keep |
-| POST | /api/v1/sites/:id/takedown | server/http/api.js:108 | | keep |
+| GET | / | server/http/dashboard.js:69 | | keep |
+| GET | /api/health | server/app.js:133 | | keep |
+| GET | /api/ready | server/app.js:139 | | keep |
+| DELETE | /api/v1/deploys/:id | server/http/api.js:192 | | keep |
+| GET | /api/v1/deploys/:id | server/http/api.js:174 | | keep |
+| POST | /api/v1/deploys/:id/activate | server/http/api.js:182 | | keep |
+| GET | /api/v1/deploys/:id/log | server/http/api.js:178 | | keep |
+| DELETE | /api/v1/domains/:id | server/http/api.js:208 | | keep |
+| POST | /api/v1/domains/:id/verify | server/http/api.js:203 | | keep |
+| GET | /api/v1/projects | server/http/api.js:62 | | keep |
+| POST | /api/v1/projects | server/http/api.js:66 | | keep |
+| DELETE | /api/v1/projects/:id | server/http/api.js:75 | | keep |
+| GET | /api/v1/projects/:id | server/http/api.js:71 | | keep |
+| DELETE | /api/v1/projects/:id/members/:principal | server/http/api.js:93 | | keep |
+| PUT | /api/v1/projects/:id/members/:principal | server/http/api.js:88 | | keep |
+| GET | /api/v1/projects/:id/quota | server/http/api.js:79 | | keep |
+| PUT | /api/v1/projects/:id/quota | server/http/api.js:83 | | keep |
+| GET | /api/v1/projects/:id/sites | server/http/api.js:119 | | keep |
+| POST | /api/v1/projects/:id/sites | server/http/api.js:123 | | keep |
+| DELETE | /api/v1/projects/:id/takedown | server/http/api.js:105 | | keep |
+| POST | /api/v1/projects/:id/takedown | server/http/api.js:101 | | keep |
+| DELETE | /api/v1/sites/:id | server/http/api.js:132 | | keep |
+| GET | /api/v1/sites/:id | server/http/api.js:128 | | keep |
+| GET | /api/v1/sites/:id/deploys | server/http/api.js:135 | | keep |
+| POST | /api/v1/sites/:id/deploys | server/http/api.js:145 | | keep |
+| GET | /api/v1/sites/:id/domains | server/http/api.js:195 | | keep |
+| POST | /api/v1/sites/:id/domains | server/http/api.js:199 | | keep |
+| POST | /api/v1/sites/:id/rollback | server/http/api.js:187 | | keep |
+| DELETE | /api/v1/sites/:id/takedown | server/http/api.js:113 | | keep |
+| POST | /api/v1/sites/:id/takedown | server/http/api.js:109 | | keep |
| GET | /auth/callback | server/auth/sso.js:301 | | keep |
| GET | /auth/callback | server/auth/sso.js:301 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:347 | | keep |
| POST | /auth/fedcm | server/auth/sso.js:347 | | keep |
| GET | /auth/login | server/auth/sso.js:279 | | keep |
| GET | /auth/login | server/auth/sso.js:279 | | keep |
| GET | /auth/logout | server/auth/sso.js:375 | | keep |
| GET | /auth/logout | server/auth/sso.js:375 | | keep |
| GET | /auth/me | server/auth/sso.js:399 | | keep |
| GET | /auth/me | server/auth/sso.js:399 | | keep |
| POST | /auth/refresh | server/auth/sso.js:409 | | keep |
| POST | /auth/refresh | server/auth/sso.js:409 | | keep |
-| GET | /deploys/:id | server/http/dashboard.js:95 | | keep |
-| POST | /deploys/:id/activate | server/http/dashboard.js:147 | | keep |
-| POST | /deploys/:id/delete | server/http/dashboard.js:152 | | keep |
-| POST | /domains/:id/delete | server/http/dashboard.js:161 | | keep |
-| POST | /domains/:id/verify | server/http/dashboard.js:157 | | keep |
+| GET | /deploys/:id | server/http/dashboard.js:96 | | keep |
+| POST | /deploys/:id/activate | server/http/dashboard.js:148 | | keep |
+| POST | /deploys/:id/delete | server/http/dashboard.js:153 | | keep |
+| POST | /domains/:id/delete | server/http/dashboard.js:162 | | keep |
+| POST | /domains/:id/verify | server/http/dashboard.js:158 | | keep |
| GET | /limits.json | server/limits.js:34 | | keep |
| GET | /limits.json | server/limits.js:34 | | keep |
-| GET | /metrics | server/app.js:138 | | keep |
-| POST | /projects | server/http/dashboard.js:104 | | keep |
-| GET | /projects/:id | server/http/dashboard.js:75 | | keep |
-| POST | /projects/:id/delete | server/http/dashboard.js:126 | | keep |
-| POST | /projects/:id/members | server/http/dashboard.js:114 | | keep |
-| POST | /projects/:id/members/remove | server/http/dashboard.js:120 | | keep |
-| POST | /projects/:id/sites | server/http/dashboard.js:108 | | keep |
-| GET | /robots.txt | server/app.js:142 | | keep |
-| GET | /sitemap.xml | server/app.js:144 | | keep |
-| GET | /sites/:id | server/http/dashboard.js:85 | | keep |
-| POST | /sites/:id/delete | server/http/dashboard.js:141 | | keep |
-| POST | /sites/:id/deploys | server/http/dashboard.js:168 | | keep |
-| POST | /sites/:id/domains | server/http/dashboard.js:133 | | keep |
-| POST | /sites/:id/rollback | server/http/dashboard.js:137 | | keep |
-| GET | /updates | server/http/dashboard.js:67 | | keep |
+| GET | /metrics | server/app.js:140 | | keep |
+| POST | /projects | server/http/dashboard.js:105 | | keep |
+| GET | /projects/:id | server/http/dashboard.js:76 | | keep |
+| POST | /projects/:id/delete | server/http/dashboard.js:127 | | keep |
+| POST | /projects/:id/members | server/http/dashboard.js:115 | | keep |
+| POST | /projects/:id/members/remove | server/http/dashboard.js:121 | | keep |
+| POST | /projects/:id/sites | server/http/dashboard.js:109 | | keep |
+| GET | /robots.txt | server/app.js:144 | | keep |
+| GET | /sitemap.xml | server/app.js:146 | | keep |
+| GET | /sites/:id | server/http/dashboard.js:86 | | keep |
+| POST | /sites/:id/delete | server/http/dashboard.js:142 | | keep |
+| POST | /sites/:id/deploys | server/http/dashboard.js:169 | | keep |
+| POST | /sites/:id/domains | server/http/dashboard.js:134 | | keep |
+| POST | /sites/:id/rollback | server/http/dashboard.js:138 | | keep |
+| GET | /updates | server/http/dashboard.js:68 | | keep |
@@ -11,7 +11,7 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -11,7 +11,7 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| OpenRe.Stream | OpenVibe.Network | 2 | bearer, internal-key, oauth-client |
| OpenRe.Stream | OpenVibe.Network | 2 | bearer, internal-key, oauth-client |
| OpenVibe.Blog | OpenVibe.Network | 2 | internal-key, oauth-client |
| OpenVibe.Blog | OpenVibe.Network | 2 | internal-key, oauth-client |
| OpenVibe.Chat | OpenVibe.Live | 2 | service-token |
| OpenVibe.Chat | OpenVibe.Live | 2 | service-token |
-| OpenVibe.Chat | OpenVibe.Network | 2 | oauth-client, service-token |
+| OpenVibe.Chat | OpenVibe.Network | 3 | none-detected, oauth-client, service-token |
| OpenVibe.Chat | OpenVibe.Search | 1 | none-detected |
| OpenVibe.Chat | OpenVibe.Search | 1 | none-detected |
| OpenVibe.Codes | OpenVibe.Billing | 1 | none-detected |
| OpenVibe.Codes | OpenVibe.Billing | 1 | none-detected |
| OpenVibe.Codes | OpenVibe.Events | 2 | none-detected |
| OpenVibe.Codes | OpenVibe.Events | 2 | none-detected |
@@ -27,17 +27,17 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -27,17 +27,17 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| OpenVibe.Games | OpenVibe.Network | 2 | bearer, oauth-client |
| OpenVibe.Games | OpenVibe.Network | 2 | bearer, oauth-client |
| OpenVibe.Host | OpenVibe.Network | 2 | internal-key, oauth-client |
| OpenVibe.Host | OpenVibe.Network | 2 | internal-key, oauth-client |
| OpenVibe.Live | OpenRe.Stream | 1 | bearer, oauth-client, service-token |
| OpenVibe.Live | OpenRe.Stream | 1 | bearer, oauth-client, service-token |
-| OpenVibe.Live | OpenVibe.AI | 1 | none-detected |
+| OpenVibe.Live | OpenVibe.AI | 3 | none-detected |
| OpenVibe.Live | OpenVibe.Billing | 1 | none-detected |
| OpenVibe.Live | OpenVibe.Billing | 1 | none-detected |
| OpenVibe.Live | OpenVibe.Chat | 1 | none-detected |
| OpenVibe.Live | OpenVibe.Chat | 1 | none-detected |
| OpenVibe.Live | OpenVibe.Community | 4 | none-detected |
| OpenVibe.Live | OpenVibe.Community | 4 | none-detected |
| OpenVibe.Live | OpenVibe.Media | 2 | api-key, bearer, internal-key, oauth-client |
| OpenVibe.Live | OpenVibe.Media | 2 | api-key, bearer, internal-key, oauth-client |
-| OpenVibe.Live | OpenVibe.Network | 11 | bearer, hmac, internal-key, none-detected, oauth-client, service-token |
+| OpenVibe.Live | OpenVibe.Network | 12 | bearer, hmac, internal-key, none-detected, oauth-client, service-token |
| OpenVibe.Live | OpenVibe.Search | 2 | bearer, none-detected, oauth-client, service-token |
| OpenVibe.Live | OpenVibe.Search | 2 | bearer, none-detected, oauth-client, service-token |
| OpenVibe.Live | OpenVibe.Tools | 1 | none-detected |
| OpenVibe.Live | OpenVibe.Tools | 1 | none-detected |
| OpenVibe.Live | webhook | 2 | none-detected |
| OpenVibe.Live | webhook | 2 | none-detected |
| OpenVibe.Media | OpenVibe.Live | 1 | none-detected |
| OpenVibe.Media | OpenVibe.Live | 1 | none-detected |
-| OpenVibe.Media | OpenVibe.Network | 3 | internal-key, oauth-client, service-token |
+| OpenVibe.Media | OpenVibe.Network | 4 | bearer, internal-key, oauth-client, service-token |
| OpenVibe.Media | webhook | 2 | hmac, service-token |
| OpenVibe.Media | webhook | 2 | hmac, service-token |
| OpenVibe.Network | OpenVibe.AI | 1 | bearer, internal-key, service-token |
| OpenVibe.Network | OpenVibe.AI | 1 | bearer, internal-key, service-token |
| OpenVibe.Network | OpenVibe.Blog | 1 | bearer, internal-key |
| OpenVibe.Network | OpenVibe.Blog | 1 | bearer, internal-key |
@@ -70,18 +70,19 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -70,18 +70,19 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Blog/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Blog/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Chat/server/bridge/live-mirror.js:79 | OpenVibe.Live | live.internalUrl | service-token | yes | no |
| Chat/server/bridge/live-mirror.js:79 | OpenVibe.Live | live.internalUrl | service-token | yes | no |
| Chat/server/live-context.js:139 | OpenVibe.Live | live.internalUrl | service-token | yes | yes |
| Chat/server/live-context.js:139 | OpenVibe.Live | live.internalUrl | service-token | yes | yes |
+| Chat/server/chat/account-data.js:4 | OpenVibe.Network | /internal/events, networkInternalUrl | none-detected | yes | yes |
| Chat/server/net/service-auth.js:5 | OpenVibe.Network | /oauth/token, networkInternalUrl, /api/.well-known/jwks, networkUrl | oauth-client, service-token | yes | no |
| Chat/server/net/service-auth.js:5 | OpenVibe.Network | /oauth/token, networkInternalUrl, /api/.well-known/jwks, networkUrl | oauth-client, service-token | yes | no |
| Chat/server/prefs/network-modules.js:21 | OpenVibe.Network | networkInternalUrl | service-token | yes | yes |
| Chat/server/prefs/network-modules.js:21 | OpenVibe.Network | networkInternalUrl | service-token | yes | yes |
-| Chat/server/chat/routes.js:111 | OpenVibe.Search | searchUrl | none-detected | **no** | no |
-| Codes/server/http/docs.js:369 | OpenVibe.Billing | OV_BILLING_INTERNAL_URL, :4600 | none-detected | yes | yes |
+| Chat/server/chat/routes.js:121 | OpenVibe.Search | searchUrl | none-detected | **no** | no |
+| Codes/server/http/docs.js:370 | OpenVibe.Billing | OV_BILLING_INTERNAL_URL, :4600 | none-detected | yes | yes |
+| Codes/server/domain/limits.js:15 | OpenVibe.Events | OV_EVENTS_INTERNAL_URL, :4300 | none-detected | yes | no |
| Codes/server/domain/project-archive.js:109 | OpenVibe.Events | eventsUrl | none-detected | **no** | yes |
| Codes/server/domain/project-archive.js:109 | OpenVibe.Events | eventsUrl | none-detected | **no** | yes |
-| Codes/server/http/docs.js:421 | OpenVibe.Events | OV_EVENTS_INTERNAL_URL, :4300 | none-detected | yes | yes |
-| Codes/server/http/docs.js:420 | OpenVibe.Host | :4910 | none-detected | yes | yes |
+| Codes/server/domain/limits.js:14 | OpenVibe.Host | :4910 | none-detected | yes | no |
+| Codes/server/domain/limits.js:16 | OpenVibe.Media | OV_MEDIA_INTERNAL_URL, :4100 | none-detected | yes | no |
| Codes/server/domain/project-archive.js:109 | OpenVibe.Media | mediaUrl | none-detected | **no** | yes |
| Codes/server/domain/project-archive.js:109 | OpenVibe.Media | mediaUrl | none-detected | **no** | yes |
-| Codes/server/http/docs.js:422 | OpenVibe.Media | OV_MEDIA_INTERNAL_URL, :4100 | none-detected | yes | yes |
| Codes/server/domain/project-archive.js:90 | OpenVibe.Network | networkInternalUrl | none-detected | **no** | yes |
| Codes/server/domain/project-archive.js:90 | OpenVibe.Network | networkInternalUrl | none-detected | **no** | yes |
-| Codes/server/http/docs.js:250 | OpenVibe.Network | networkUrl | none-detected | yes | yes |
-| Codes/server/http/docs.js:336 | OpenVibe.Tools | OV_TOOLS_INTERNAL_URL, :4001 | none-detected | yes | yes |
+| Codes/server/http/docs.js:251 | OpenVibe.Network | networkUrl | none-detected | yes | yes |
+| Codes/server/http/docs.js:337 | OpenVibe.Tools | OV_TOOLS_INTERNAL_URL, :4001 | none-detected | yes | yes |
| Community/server/live-client.js:6 | OpenVibe.Live | liveInternalUrl | bearer | yes | no |
| Community/server/live-client.js:6 | OpenVibe.Live | liveInternalUrl | bearer | yes | no |
| Community/server/pastes/proxy.js:26 | OpenVibe.Live | liveUrl, liveInternalUrl | bearer | yes | yes |
| Community/server/pastes/proxy.js:26 | OpenVibe.Live | liveUrl, liveInternalUrl | bearer | yes | yes |
| Community/server/live-client.js:86 | OpenVibe.Media | mediaUrl | bearer | yes | no |
| Community/server/live-client.js:86 | OpenVibe.Media | mediaUrl | bearer | yes | no |
@@ -91,12 +92,14 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -91,12 +92,14 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Coupons/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Coupons/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Deals/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Deals/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Deals/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Deals/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
-| Games/apps/server/src/net/httpServer.ts:363 | OpenVibe.Network | /api/auth/me, /oauth/token | oauth-client | **no** | yes |
+| Games/apps/server/src/net/httpServer.ts:376 | 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 |
| Host/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Host/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Host/server/auth/sso.js:47 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Host/server/auth/sso.js:47 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Live/server/openre/openre-client.js:12 | OpenRe.Stream | :4500, OPENRE_URL | bearer, oauth-client, service-token | yes | no |
| Live/server/openre/openre-client.js:12 | OpenRe.Stream | :4500, OPENRE_URL | bearer, oauth-client, service-token | yes | no |
-| Live/server/ai/ai-service.js:40 | OpenVibe.AI | OV_AI_INTERNAL_URL, :4700 | none-detected | yes | yes |
+| Live/server/ai/ai-service.js:41 | OpenVibe.AI | OV_AI_INTERNAL_URL, :4700 | none-detected | yes | yes |
+| Live/server/ai/byo-credentials.js:17 | OpenVibe.AI | OV_AI_INTERNAL_URL, :4700 | none-detected | yes | yes |
+| Live/server/ai/viewer-quota.js:17 | OpenVibe.AI | OV_AI_INTERNAL_URL, :4700 | none-detected | yes | yes |
| Live/server/monetization/billing-client.js:28 | OpenVibe.Billing | OV_BILLING_INTERNAL_URL, :4600 | none-detected | yes | yes |
| Live/server/monetization/billing-client.js:28 | OpenVibe.Billing | OV_BILLING_INTERNAL_URL, :4600 | none-detected | yes | yes |
| Live/server/integrations/robotstreamer-service.js:568 | OpenVibe.Chat | chatUrl | none-detected | yes | no |
| Live/server/integrations/robotstreamer-service.js:568 | OpenVibe.Chat | chatUrl | none-detected | yes | no |
| Live/server/comments-client.js:29 | OpenVibe.Community | OV_COMMUNITY_INTERNAL_URL, :4200, OV_COMMUNITY_URL | none-detected | yes | yes |
| Live/server/comments-client.js:29 | OpenVibe.Community | OV_COMMUNITY_INTERNAL_URL, :4200, OV_COMMUNITY_URL | none-detected | yes | yes |
@@ -105,6 +108,7 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -105,6 +108,7 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Live/server/seo/seo.js:160 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | **no** | no |
| Live/server/seo/seo.js:160 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | **no** | no |
| Live/server/config.js:180 | OpenVibe.Media | MEDIA_URL, :4100 | internal-key, oauth-client | yes | no |
| Live/server/config.js:180 | OpenVibe.Media | MEDIA_URL, :4100 | internal-key, oauth-client | 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 |
+| Live/server/auth/account-data.js:171 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000 | none-detected | yes | yes |
| Live/server/chat/chat-server.js:84 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL | internal-key | **no** | no |
| Live/server/chat/chat-server.js:84 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL | internal-key | **no** | no |
| Live/server/config.js:23 | OpenVibe.Network | :4000, OV_NETWORK_URL | internal-key, oauth-client | yes | no |
| Live/server/config.js:23 | OpenVibe.Network | :4000, OV_NETWORK_URL | internal-key, oauth-client | 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 |
@@ -123,44 +127,45 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
@@ -123,44 +127,45 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Live/server/media-proxy/outcomes.js:78 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | no |
| Live/server/media-proxy/outcomes.js:78 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | no |
| Media/server/thumbnails/live-frame-service.js:170 | OpenVibe.Live | :3000 | none-detected | yes | yes |
| Media/server/thumbnails/live-frame-service.js:170 | OpenVibe.Live | :3000 | none-detected | yes | yes |
| Media/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Media/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
+| Media/server/account-data.js:4 | OpenVibe.Network | /internal/events, OV_NETWORK_INTERNAL_URL, :4000, /oauth/token | bearer, oauth-client | yes | no |
| Media/server/auth.js:32 | OpenVibe.Network | network.url, /api/.well-known/jwks | service-token | yes | yes |
| Media/server/auth.js:32 | OpenVibe.Network | network.url, /api/.well-known/jwks | service-token | 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/server/auth.js:473 | webhook | webhook_url (per-app, configured in DB) | service-token | yes | yes |
| Media/server/auth.js:473 | webhook | webhook_url (per-app, configured in DB) | service-token | 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/frame/service.js:32 | OpenVibe.AI | aiUrl, OV_AI_INTERNAL_URL, :4700 | internal-key, bearer, service-token | yes | no |
| Network/server/frame/service.js:32 | OpenVibe.AI | aiUrl, OV_AI_INTERNAL_URL, :4700 | internal-key, bearer, service-token | yes | no |
-| Network/server/index.js:440 | OpenVibe.Blog | OV_BLOG_INTERNAL_URL, blogUrl, :4810 | internal-key, bearer | **no** | no |
-| Network/server/index.js:496 | OpenVibe.Events | eventsUrl, eventsInternalUrl | internal-key, bearer | **no** | no |
+| Network/server/index.js:498 | OpenVibe.Blog | OV_BLOG_INTERNAL_URL, blogUrl, :4810 | internal-key, bearer | **no** | no |
+| Network/server/index.js:557 | OpenVibe.Events | eventsUrl, eventsInternalUrl | internal-key, bearer | **no** | no |
| Network/server/admin/analytics-routes.js:24 | OpenVibe.Games | :8000 | internal-key, bearer | yes | no |
| Network/server/admin/analytics-routes.js:24 | OpenVibe.Games | :8000 | internal-key, bearer | yes | no |
| Network/server/admin/routes.js:74 | OpenVibe.Games | games.internalUrl | internal-key | yes | no |
| Network/server/admin/routes.js:74 | OpenVibe.Games | games.internalUrl | internal-key | yes | no |
-| Network/server/index.js:245 | OpenVibe.Games | :8000, games.internalUrl | internal-key, bearer | **no** | no |
+| Network/server/index.js:247 | OpenVibe.Games | :8000, games.internalUrl | internal-key, bearer | **no** | no |
| Network/server/admin/analytics-routes.js:22 | OpenVibe.Live | :3000 | internal-key, bearer | yes | no |
| Network/server/admin/analytics-routes.js:22 | OpenVibe.Live | :3000 | internal-key, bearer | yes | no |
| Network/server/admin/routes.js:72 | OpenVibe.Live | live.internalUrl | internal-key | yes | no |
| Network/server/admin/routes.js:72 | OpenVibe.Live | live.internalUrl | internal-key | yes | no |
| Network/server/frame/service.js:89 | OpenVibe.Live | :3000 | internal-key, bearer, service-token | yes | no |
| Network/server/frame/service.js:89 | OpenVibe.Live | :3000 | internal-key, bearer, service-token | yes | no |
-| Network/server/index.js:241 | OpenVibe.Live | :3000, live.internalUrl, liveUrl | internal-key, bearer | **no** | no |
+| Network/server/index.js:243 | OpenVibe.Live | :3000, live.internalUrl, liveUrl | internal-key, bearer | **no** | no |
| Network/server/profile/avatar.js:64 | OpenVibe.Live | live.internalUrl, :3000 | internal-key | yes | no |
| Network/server/profile/avatar.js:64 | OpenVibe.Live | live.internalUrl, :3000 | internal-key | yes | no |
| Network/server/admin/analytics-routes.js:25 | OpenVibe.Media | :4100 | internal-key, bearer | yes | no |
| Network/server/admin/analytics-routes.js:25 | OpenVibe.Media | :4100 | internal-key, bearer | yes | no |
| Network/server/admin/routes.js:75 | OpenVibe.Media | media.internalUrl | internal-key | yes | no |
| Network/server/admin/routes.js:75 | OpenVibe.Media | media.internalUrl | internal-key | yes | no |
-| Network/server/index.js:244 | OpenVibe.Media | :4100, media.internalUrl | internal-key, bearer | **no** | no |
+| Network/server/index.js:246 | OpenVibe.Media | :4100, media.internalUrl | internal-key, bearer | **no** | no |
| Network/server/profile/avatar.js:72 | OpenVibe.Media | media.internalUrl, :4100 | internal-key | yes | no |
| Network/server/profile/avatar.js:72 | OpenVibe.Media | media.internalUrl, :4100 | internal-key | yes | no |
| Network/server/admin/analytics-routes.js:23 | OpenVibe.Tools | :4001 | internal-key, bearer | yes | no |
| Network/server/admin/analytics-routes.js:23 | OpenVibe.Tools | :4001 | internal-key, bearer | yes | no |
| Network/server/admin/routes.js:73 | OpenVibe.Tools | tools.internalUrl | internal-key | yes | no |
| Network/server/admin/routes.js:73 | OpenVibe.Tools | tools.internalUrl | internal-key | yes | no |
| Network/server/domains/catalog.js:17 | OpenVibe.Tools | OV_TOOLS_INTERNAL_URL, :4001 | none-detected | yes | no |
| Network/server/domains/catalog.js:17 | OpenVibe.Tools | OV_TOOLS_INTERNAL_URL, :4001 | none-detected | yes | no |
-| Network/server/index.js:243 | OpenVibe.Tools | :4001, tools.internalUrl | internal-key, bearer | **no** | no |
+| Network/server/index.js:245 | OpenVibe.Tools | :4001, tools.internalUrl | internal-key, bearer | **no** | no |
| News/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| News/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| News/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| News/server/auth/sso.js:39 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
-| Shared/release-watch.js:12 | OpenVibe.Events | eventsUrl | none-detected | **no** | yes |
+| Shared/release-watch.js:9 | OpenVibe.Events | eventsUrl | none-detected | **no** | yes |
| Shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Shared/footer.js:307 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Shared/footer.js:307 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Shared/navbar.js:13 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Shared/navbar.js:13 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
-| Sites/build.js:100 | OpenVibe.Network | networkUrl | none-detected | **no** | no |
+| Sites/build.js:104 | OpenVibe.Network | networkUrl | none-detected | **no** | no |
| Tips/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Tips/OpenVibe.Shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Tools/apps/gateway/server/index.js:86 | OpenVibe.Community | communityUrl, OV_COMMUNITY_URL | internal-key, bearer | yes | yes |
| Tools/apps/gateway/server/index.js:86 | OpenVibe.Community | communityUrl, OV_COMMUNITY_URL | internal-key, bearer | yes | yes |
-| Tools/apps/_shared/jobs/index.js:96 | OpenVibe.Events | EVENTS_URL | oauth-client, service-token | yes | no |
-| Tools/apps/gateway/server/index.js:505 | OpenVibe.Live | liveUrl | internal-key, bearer | yes | yes |
-| Tools/apps/_shared/jobs/index.js:18 | OpenVibe.Media | :4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL | oauth-client, service-token | yes | no |
+| Tools/apps/_shared/jobs/index.js:97 | OpenVibe.Events | EVENTS_URL | oauth-client, service-token | yes | no |
+| Tools/apps/gateway/server/index.js:522 | OpenVibe.Live | liveUrl | internal-key, bearer | yes | yes |
+| Tools/apps/_shared/jobs/index.js:19 | OpenVibe.Media | :4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL | oauth-client, service-token | yes | no |
| Tools/apps/_shared/guard/tokens.js:25 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl | service-token | yes | yes |
| Tools/apps/_shared/guard/tokens.js:25 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl | service-token | yes | yes |
-| Tools/apps/_shared/jobs/index.js:20 | OpenVibe.Network | :4000, OV_NETWORK_INTERNAL_URL, /oauth/token | oauth-client, service-token | yes | no |
+| Tools/apps/_shared/jobs/index.js:21 | OpenVibe.Network | :4000, OV_NETWORK_INTERNAL_URL, /oauth/token | oauth-client, service-token | yes | no |
| Tools/apps/food/server/index.js:33 | OpenVibe.Network | OV_NETWORK_URL, OV_NETWORK_INTERNAL_URL, networkUrl, networkInternalUrl, :4000 | none-detected | yes | no |
| Tools/apps/food/server/index.js:33 | OpenVibe.Network | OV_NETWORK_URL, OV_NETWORK_INTERNAL_URL, networkUrl, networkInternalUrl, :4000 | none-detected | yes | no |
| Tools/apps/gateway/server/auth/routes.js:53 | OpenVibe.Network | /oauth/token, /api/.well-known/jwks, networkUrl, networkInternalUrl | oauth-client | yes | yes |
| Tools/apps/gateway/server/auth/routes.js:53 | OpenVibe.Network | /oauth/token, /api/.well-known/jwks, networkUrl, networkInternalUrl | oauth-client | yes | yes |
| Tools/apps/gateway/server/index.js:34 | OpenVibe.Network | /internal/events, networkUrl | internal-key, bearer | yes | yes |
| Tools/apps/gateway/server/index.js:34 | OpenVibe.Network | /internal/events, networkUrl | internal-key, bearer | yes | yes |
@@ -25,19 +25,19 @@ Deliverable 4, plus the background-job half of the exit criteria.
@@ -25,19 +25,19 @@ Deliverable 4, plus the background-job half of the exit criteria.
| Repo | Path | Referenced at |
| Repo | Path | Referenced at |
|---|---|---|
|---|---|---|
-| OpenVibe.Live | /ws/ | server/index.js:460, server/index.js:470, server/web/page-status.js:186 |
-| OpenVibe.Live | /ws/broadcast | server/index.js:1089, server/streaming/broadcast-server.js:187 |
-| OpenVibe.Live | /ws/call | server/index.js:1093, server/streaming/call-server.js:98 |
-| OpenVibe.Live | /ws/canvas | server/index.js:1095 |
-| OpenVibe.Live | /ws/chat | server/chat/chat-server.js:295, server/index.js:1085 |
-| OpenVibe.Live | /ws/control | server/controls/control-server.js:46, server/index.js:1091 |
-| OpenVibe.Live | /ws/game | server/index.js:1095 |
-| OpenVibe.Live | /ws/robotstreamer-publish | server/index.js:1097, server/integrations/robotstreamer-service.js:789 |
-| OpenVibe.Live | /ws/vibe-coding/publish | server/index.js:1087, server/vibe-coding/publish-server.js:35 |
+| OpenVibe.Live | /ws/ | server/index.js:473, server/index.js:483, server/web/page-status.js:186 |
+| OpenVibe.Live | /ws/broadcast | server/index.js:1102, server/streaming/broadcast-server.js:187 |
+| OpenVibe.Live | /ws/call | server/index.js:1106, server/streaming/call-server.js:98 |
+| OpenVibe.Live | /ws/canvas | server/index.js:1108 |
+| OpenVibe.Live | /ws/chat | server/chat/chat-server.js:295, server/index.js:1098 |
+| OpenVibe.Live | /ws/control | server/controls/control-server.js:46, server/index.js:1104 |
+| OpenVibe.Live | /ws/game | server/index.js:1108 |
+| OpenVibe.Live | /ws/robotstreamer-publish | server/index.js:1110, server/integrations/robotstreamer-service.js:789 |
+| OpenVibe.Live | /ws/vibe-coding/publish | server/index.js:1100, server/vibe-coding/publish-server.js:35 |
| OpenVibe.Network | /ws/ | server/deploy/nginx-generator.js:153 |
| OpenVibe.Network | /ws/ | server/deploy/nginx-generator.js:153 |
-| OpenVibe.Games | /ws | apps/server/src/main.ts:320 |
-| OpenVibe.Chat | /ws/call | server/app.js:244, server/calls/call-server.js:130 |
-| OpenVibe.Chat | /ws/chat | server/app.js:245, server/chat/chat-server.js:246 |
+| OpenVibe.Games | /ws | apps/server/src/main.ts:382 |
+| OpenVibe.Chat | /ws/call | server/app.js:258, server/calls/call-server.js:130 |
+| OpenVibe.Chat | /ws/chat | server/app.js:259, server/chat/chat-server.js:246 |
| OpenVibe.Host | /ws/ | lib/nginx.js:60 |
| OpenVibe.Host | /ws/ | lib/nginx.js:60 |
## Non-HTTP protocols
## Non-HTTP protocols
@@ -58,19 +58,19 @@ Owner = the repository whose process runs the job; target = the authority the wo
@@ -58,19 +58,19 @@ Owner = the repository whose process runs the job; target = the authority the wo
| Repo | Kind | Name | Interval | At | Target | Disposition |
| Repo | Kind | Name | Interval | At | Target | Disposition |
|---|---|---|---|---|---|---|
|---|---|---|---|---|---|---|
-| OpenVibe.Live | setInterval | | 5 min | server/ai/ai-moments-job.js:496 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/ai/auto-clip-job.js:354 | | keep |
+| OpenVibe.Live | setInterval | | 5 min | server/ai/ai-moments-job.js:470 | | keep |
+| OpenVibe.Live | setInterval | | ? | server/ai/auto-clip-job.js:336 | | keep |
| OpenVibe.Live | setInterval | | 1 min | server/ai/backfill-job.js:160 | | keep |
| OpenVibe.Live | setInterval | | 1 min | server/ai/backfill-job.js:160 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/ai/chat-ai.js:476 | | keep |
-| OpenVibe.Live | setInterval | | 5 min | server/ai/easter-egg-job.js:215 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/ai/slogan-job.js:193 | | keep |
+| OpenVibe.Live | setInterval | | ? | server/ai/chat-ai.js:395 | | keep |
+| OpenVibe.Live | setInterval | | 5 min | server/ai/easter-egg-job.js:201 | | keep |
+| OpenVibe.Live | setInterval | | ? | server/ai/slogan-job.js:157 | | keep |
| OpenVibe.Live | setInterval | | 30 s | server/ai/stream-memory-job.js:241 | | keep |
| OpenVibe.Live | setInterval | | 30 s | server/ai/stream-memory-job.js:241 | | keep |
| OpenVibe.Live | setInterval | | ? | server/ai/streamer-overview-job.js:40 | | keep |
| OpenVibe.Live | setInterval | | ? | server/ai/streamer-overview-job.js:40 | | keep |
| OpenVibe.Live | setInterval | | ? | server/ai/timeline-job.js:205 | OpenVibe.AI | extract |
| OpenVibe.Live | setInterval | | ? | server/ai/timeline-job.js:205 | OpenVibe.AI | extract |
| OpenVibe.Live | setInterval | | ? | server/ai/viewers/engine.js:79 | | keep |
| OpenVibe.Live | setInterval | | ? | server/ai/viewers/engine.js:79 | | keep |
| OpenVibe.Live | setInterval | | ? | server/arena/arena-job.js:33 | | keep |
| OpenVibe.Live | setInterval | | ? | server/arena/arena-job.js:33 | | keep |
| OpenVibe.Live | setInterval | | ? | server/arena/arena-job.js:39 | | keep |
| OpenVibe.Live | setInterval | | ? | server/arena/arena-job.js:39 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/arena/listener.js:323 | | keep |
+| OpenVibe.Live | setInterval | | ? | server/arena/listener.js:292 | | keep |
| OpenVibe.Live | jobs.every | module-summaries-scan | 0.005 s | server/auth/module-summaries.js:189 | | keep |
| OpenVibe.Live | jobs.every | module-summaries-scan | 0.005 s | server/auth/module-summaries.js:189 | | keep |
| OpenVibe.Live | jobs.every | module-summaries-refresh | ? | server/auth/module-summaries.js:190 | | keep |
| OpenVibe.Live | jobs.every | module-summaries-refresh | ? | server/auth/module-summaries.js:190 | | keep |
| OpenVibe.Live | setInterval | | ? | server/chat/chat-remote.js:273 | OpenVibe.Chat | compat |
| OpenVibe.Live | setInterval | | ? | server/chat/chat-remote.js:273 | OpenVibe.Chat | compat |
@@ -83,13 +83,13 @@ Owner = the repository whose process runs the job; target = the authority the wo
@@ -83,13 +83,13 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Live | jobs.every | search-documents-refresh | ? | server/events/search-documents.js:129 | | keep |
| OpenVibe.Live | jobs.every | search-documents-refresh | ? | server/events/search-documents.js:129 | | keep |
| OpenVibe.Live | jobs.every | search-media-scan | 0.005 s | server/events/search-media-documents.js:210 | | keep |
| OpenVibe.Live | jobs.every | search-media-scan | 0.005 s | server/events/search-media-documents.js:210 | | keep |
| OpenVibe.Live | jobs.every | search-media-refresh | ? | server/events/search-media-documents.js:211 | | keep |
| OpenVibe.Live | jobs.every | search-media-refresh | ? | server/events/search-media-documents.js:211 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/events/stream-events.js:100 | | keep |
+| OpenVibe.Live | setInterval | | ? | server/events/stream-events.js:109 | | keep |
| OpenVibe.Live | setInterval | | 5 min | server/home/routes.js:570 | | keep |
| OpenVibe.Live | setInterval | | 5 min | server/home/routes.js:570 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/home/star-job.js:130 | | keep |
-| OpenVibe.Live | setInterval | | 360 min | server/index.js:1364 | | keep |
-| OpenVibe.Live | setInterval | | 45 s | server/index.js:1381 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/index.js:1405 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/index.js:1416 | | keep |
+| OpenVibe.Live | setInterval | | ? | server/home/star-job.js:124 | | keep |
+| OpenVibe.Live | setInterval | | 360 min | server/index.js:1377 | | keep |
+| OpenVibe.Live | setInterval | | 45 s | server/index.js:1394 | | keep |
+| OpenVibe.Live | setInterval | | ? | server/index.js:1418 | | keep |
+| OpenVibe.Live | setInterval | | ? | server/index.js:1429 | | keep |
| OpenVibe.Live | setInterval | | ? | server/integrations/chat-relay-service.js:615 | OpenVibe.Chat | extract |
| OpenVibe.Live | setInterval | | ? | server/integrations/chat-relay-service.js:615 | OpenVibe.Chat | extract |
| OpenVibe.Live | setInterval | | 1 s | server/integrations/powerchat-platform.js:296 | OpenVibe.Billing | extract |
| OpenVibe.Live | setInterval | | 1 s | server/integrations/powerchat-platform.js:296 | OpenVibe.Billing | extract |
| OpenVibe.Live | setInterval | | ? | server/integrations/powerchat-platform.js:430 | OpenVibe.Billing | extract |
| OpenVibe.Live | setInterval | | ? | server/integrations/powerchat-platform.js:430 | OpenVibe.Billing | extract |
@@ -106,12 +106,12 @@ Owner = the repository whose process runs the job; target = the authority the wo
@@ -106,12 +106,12 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Live | setInterval | | 30 s | server/news/news-service.js:94 | | keep |
| OpenVibe.Live | setInterval | | 30 s | server/news/news-service.js:94 | | keep |
| OpenVibe.Live | setInterval | | ? | server/news/sources/base-source.js:28 | | keep |
| OpenVibe.Live | setInterval | | ? | server/news/sources/base-source.js:28 | | keep |
| OpenVibe.Live | setInterval | | ? | server/openre/mirror.js:210 | | keep |
| OpenVibe.Live | setInterval | | ? | server/openre/mirror.js:210 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/recap/recap.js:246 | | keep |
+| OpenVibe.Live | setInterval | | ? | server/recap/recap.js:229 | | keep |
| OpenVibe.Live | setInterval | | ? | server/streaming/broadcast-server.js:133 | OpenRe.Stream | extract |
| OpenVibe.Live | setInterval | | ? | server/streaming/broadcast-server.js:133 | OpenRe.Stream | extract |
| OpenVibe.Live | setInterval | | ? | server/streaming/call-server.js:64 | OpenVibe.Chat | extract |
| OpenVibe.Live | setInterval | | ? | server/streaming/call-server.js:64 | OpenVibe.Chat | extract |
| OpenVibe.Live | setInterval | | 5 min | server/streaming/call-server.js:76 | OpenVibe.Chat | extract |
| OpenVibe.Live | setInterval | | 5 min | server/streaming/call-server.js:76 | OpenVibe.Chat | extract |
| OpenVibe.Live | setInterval | | ? | server/streaming/live-events.js:28 | | keep |
| OpenVibe.Live | setInterval | | ? | server/streaming/live-events.js:28 | | keep |
-| OpenVibe.Live | setInterval | | ? | server/streaming/rtmp-server.js:191 | OpenRe.Stream | extract |
+| OpenVibe.Live | setInterval | | ? | server/streaming/rtmp-server.js:196 | OpenRe.Stream | extract |
| OpenVibe.Live | setInterval | | ? | server/streaming/whip-handler.js:161 | OpenRe.Stream | extract |
| OpenVibe.Live | setInterval | | ? | server/streaming/whip-handler.js:161 | OpenRe.Stream | extract |
| OpenVibe.Live | jobs.every | restream-viewer-counts | 1 min | server/utils/jobs.js:12 | OpenRe.Stream | extract |
| OpenVibe.Live | jobs.every | restream-viewer-counts | 1 min | server/utils/jobs.js:12 | OpenRe.Stream | extract |
| OpenVibe.Live | jobs.singleFlight | auto-clip-backfill | ? | server/utils/jobs.js:13 | | keep |
| OpenVibe.Live | jobs.singleFlight | auto-clip-backfill | ? | server/utils/jobs.js:13 | | keep |
@@ -121,25 +121,28 @@ Owner = the repository whose process runs the job; target = the authority the wo
@@ -121,25 +121,28 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Network | setInterval | | 0.05 s | server/graceful.js:77 | | keep |
| OpenVibe.Network | setInterval | | 0.05 s | server/graceful.js:77 | | keep |
| OpenVibe.Network | setInterval | | ? | server/identity/grants-admin.js:201 | | keep |
| OpenVibe.Network | setInterval | | ? | server/identity/grants-admin.js:201 | | keep |
| OpenVibe.Network | setInterval | | ? | server/identity/profile-events.js:104 | | keep |
| OpenVibe.Network | setInterval | | ? | server/identity/profile-events.js:104 | | keep |
-| OpenVibe.Network | setInterval | | 60 min | server/index.js:790 | | keep |
-| OpenVibe.Network | setInterval | | 2 min | server/index.js:793 | | keep |
-| OpenVibe.Network | setInterval | | 5 min | server/index.js:807 | | keep |
-| OpenVibe.Network | setInterval | | ? | server/index.js:810 | | keep |
+| OpenVibe.Network | setInterval | | 60 min | server/index.js:851 | | keep |
+| OpenVibe.Network | setInterval | | 2 min | server/index.js:854 | | keep |
+| OpenVibe.Network | setInterval | | 5 min | server/index.js:868 | | keep |
+| OpenVibe.Network | setInterval | | 6 min | server/index.js:871 | | keep |
+| OpenVibe.Network | setInterval | | 1 min | server/index.js:879 | | keep |
+| OpenVibe.Network | setInterval | | ? | server/index.js:882 | | keep |
| OpenVibe.Network | setInterval | | ? | server/registry/deploy-drift.js:88 | | keep |
| OpenVibe.Network | setInterval | | ? | server/registry/deploy-drift.js:88 | | keep |
| OpenVibe.Network | setInterval | | ? | server/registry/library-tags.js:47 | | keep |
| OpenVibe.Network | setInterval | | ? | server/registry/library-tags.js:47 | | keep |
| OpenVibe.Shared | setInterval | | 15 min | account-switcher.js:624 | | keep |
| OpenVibe.Shared | setInterval | | 15 min | account-switcher.js:624 | | keep |
| OpenVibe.Shared | setInterval | | ? | analytics/retention.js:230 | | keep |
| OpenVibe.Shared | setInterval | | ? | analytics/retention.js:230 | | keep |
| OpenVibe.Shared | setInterval | | ? | analytics/tracker.js:115 | | keep |
| OpenVibe.Shared | setInterval | | ? | analytics/tracker.js:115 | | keep |
| OpenVibe.Shared | setInterval | | ? | notification-ui.js:557 | | keep |
| OpenVibe.Shared | setInterval | | ? | notification-ui.js:557 | | keep |
-| OpenVibe.Shared | setInterval | | ? | release-watch.js:265 | | keep |
-| OpenVibe.Shared | setInterval | | 10 min | release-watch.js:271 | | keep |
+| OpenVibe.Shared | setInterval | | ? | release-watch.js:266 | | keep |
+| OpenVibe.Shared | setInterval | | 10 min | release-watch.js:272 | | keep |
| OpenVibe.Shared | setInterval | | ? | shipped.js:154 | | keep |
| OpenVibe.Shared | setInterval | | ? | shipped.js:154 | | keep |
+| OpenVibe.Shared | setInterval | | ? | web-runtime.js:276 | | keep |
| OpenVibe.Media | setInterval | | ? | server/auth.js:62 | | keep |
| OpenVibe.Media | setInterval | | ? | server/auth.js:62 | | keep |
| OpenVibe.Media | setInterval | | 60 min | server/events.js:68 | | keep |
| OpenVibe.Media | setInterval | | 60 min | server/events.js:68 | | keep |
| OpenVibe.Media | setInterval | | ? | server/events.js:86 | | keep |
| OpenVibe.Media | setInterval | | ? | server/events.js:86 | | keep |
| OpenVibe.Media | setInterval | | ? | server/events.js:90 | | keep |
| OpenVibe.Media | setInterval | | ? | server/events.js:90 | | keep |
-| OpenVibe.Media | setInterval | | 720 min | server/index.js:178 | | keep |
-| OpenVibe.Media | setInterval | | ? | server/index.js:214 | | keep |
+| OpenVibe.Media | setInterval | | 720 min | server/index.js:180 | | keep |
+| OpenVibe.Media | setInterval | | ? | server/index.js:216 | | keep |
| OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:75 | | keep |
| OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:75 | | keep |
| OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:202 | | keep |
| OpenVibe.Media | setInterval | | ? | server/jobs/worker.js:202 | | keep |
| OpenVibe.Media | setInterval | | ? | server/objects/owner-subject-job.js:51 | | keep |
| OpenVibe.Media | setInterval | | ? | server/objects/owner-subject-job.js:51 | | keep |
@@ -149,12 +152,12 @@ Owner = the repository whose process runs the job; target = the authority the wo
@@ -149,12 +152,12 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Media | setInterval | | ? | server/vod/clip-jobs.js:142 | | keep |
| OpenVibe.Media | setInterval | | ? | server/vod/clip-jobs.js:142 | | keep |
| OpenVibe.Media | setInterval | | ? | server/vod/health-job.js:276 | | keep |
| OpenVibe.Media | setInterval | | ? | server/vod/health-job.js:276 | | keep |
| OpenVibe.Media | setInterval | | 1 min | server/vod/recorder.js:235 | | keep |
| OpenVibe.Media | setInterval | | 1 min | server/vod/recorder.js:235 | | keep |
-| OpenVibe.Media | setInterval | | ? | server/vod/vod-storage.js:595 | | keep |
+| OpenVibe.Media | setInterval | | ? | server/vod/vod-storage.js:627 | | keep |
| OpenVibe.Tools | setInterval | | 0.05 s | apps/_shared/graceful.js:77 | | keep |
| OpenVibe.Tools | setInterval | | 0.05 s | apps/_shared/graceful.js:77 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/_shared/guard/index.js:487 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/_shared/guard/index.js:487 | | keep |
| OpenVibe.Tools | setInterval | | 15 s | apps/_shared/jobs/http.js:270 | | keep |
| OpenVibe.Tools | setInterval | | 15 s | apps/_shared/jobs/http.js:270 | | keep |
-| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/index.js:123 | | keep |
-| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/system.js:660 | | keep |
+| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/index.js:124 | | keep |
+| OpenVibe.Tools | setInterval | | ? | apps/_shared/jobs/system.js:674 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/_shared/usage.js:105 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/_shared/usage.js:105 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/audio/server/retention/manager.js:193 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/audio/server/retention/manager.js:193 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/docs/server/retention/manager.js:145 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/docs/server/retention/manager.js:145 | | keep |
@@ -164,10 +167,10 @@ Owner = the repository whose process runs the job; target = the authority the wo
@@ -164,10 +167,10 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Tools | setInterval | | ? | apps/gateway/server/registry/services.js:109 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/gateway/server/registry/services.js:109 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/gateway/server/search-index.js:97 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/gateway/server/search-index.js:97 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/img/server/retention/manager.js:146 | | keep |
| OpenVibe.Tools | setInterval | | ? | apps/img/server/retention/manager.js:146 | | keep |
-| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:662 | | keep |
-| OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:713 | | keep |
-| OpenVibe.Tools | setInterval | | 10 min | apps/yt/server/index.js:138 | | keep |
-| OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:255 | | keep |
+| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:666 | | keep |
+| OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:717 | | keep |
+| OpenVibe.Tools | setInterval | | 10 min | apps/yt/server/index.js:142 | | keep |
+| OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:259 | | keep |
| OpenVibe.Community | setInterval | | ? | server/events.js:39 | | keep |
| OpenVibe.Community | setInterval | | ? | server/events.js:39 | | keep |
| OpenVibe.Community | setInterval | | 0.05 s | server/graceful.js:77 | | keep |
| OpenVibe.Community | setInterval | | 0.05 s | server/graceful.js:77 | | keep |
| OpenVibe.Community | setInterval | | ? | server/identity/profile-module.js:109 | | keep |
| OpenVibe.Community | setInterval | | ? | server/identity/profile-module.js:109 | | keep |
@@ -177,12 +180,13 @@ Owner = the repository whose process runs the job; target = the authority the wo
@@ -177,12 +180,13 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Community | setInterval | | ? | server/relay/discord.js:401 | | keep |
| OpenVibe.Community | setInterval | | ? | server/relay/discord.js:401 | | keep |
| OpenVibe.Community | setInterval | | ? | server/relay/events-worker.js:137 | | keep |
| OpenVibe.Community | setInterval | | ? | server/relay/events-worker.js:137 | | keep |
| OpenVibe.Community | setInterval | | ? | server/search/documents.js:171 | | keep |
| OpenVibe.Community | setInterval | | ? | server/search/documents.js:171 | | keep |
-| OpenVibe.Games | setInterval | | 360 min | apps/server/src/main.ts:162 | | keep |
-| OpenVibe.Games | setInterval | | ? | apps/server/src/main.ts:350 | | keep |
+| OpenVibe.Games | setInterval | | 360 min | apps/server/src/main.ts:190 | | keep |
+| OpenVibe.Games | setInterval | | ? | apps/server/src/main.ts:412 | | keep |
| OpenVibe.Games | setInterval | | ? | apps/server/src/net/editorWs.ts:84 | | keep |
| OpenVibe.Games | setInterval | | ? | apps/server/src/net/editorWs.ts:84 | | keep |
| OpenVibe.Games | setInterval | | 0.05 s | apps/server/src/net/gracefulStop.ts:54 | | keep |
| OpenVibe.Games | setInterval | | 0.05 s | apps/server/src/net/gracefulStop.ts:54 | | keep |
| OpenVibe.Events | setInterval | | ? | server/auth.js:85 | | keep |
| OpenVibe.Events | setInterval | | ? | server/auth.js:85 | | keep |
| OpenVibe.Events | setInterval | | ? | server/index.js:49 | | keep |
| OpenVibe.Events | setInterval | | ? | server/index.js:49 | | keep |
+| OpenVibe.Events | setInterval | | ? | server/index.js:69 | | keep |
| OpenVibe.Events | setInterval | | ? | server/realtime.js:198 | | keep |
| OpenVibe.Events | setInterval | | ? | server/realtime.js:198 | | keep |
| OpenVibe.Chat | setInterval | | 1 min | server/bridge/live-bridge.js:177 | | keep |
| OpenVibe.Chat | setInterval | | 1 min | server/bridge/live-bridge.js:177 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/bridge/live-mirror.js:107 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/bridge/live-mirror.js:107 | | keep |
@@ -191,8 +195,8 @@ Owner = the repository whose process runs the job; target = the authority the wo
@@ -191,8 +195,8 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:190 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:190 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:212 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:212 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:217 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/chat/chat-server.js:217 | | keep |
-| OpenVibe.Chat | setInterval | | ? | server/chat/dm-routes.js:56 | | keep |
-| OpenVibe.Chat | setInterval | | 360 min | server/events/consumer.js:188 | | keep |
+| OpenVibe.Chat | setInterval | | ? | server/chat/dm-routes.js:71 | | keep |
+| OpenVibe.Chat | setInterval | | 360 min | server/events/consumer.js:211 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/events/outbox.js:112 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/events/outbox.js:112 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/live-context.js:835 | | keep |
| OpenVibe.Chat | setInterval | | ? | server/live-context.js:835 | | keep |
| OpenVibe.Chat | setInterval | | 2 s | server/live-context.js:837 | | keep |
| OpenVibe.Chat | setInterval | | 2 s | server/live-context.js:837 | | keep |
@@ -206,9 +210,9 @@ Owner = the repository whose process runs the job; target = the authority the wo
@@ -206,9 +210,9 @@ Owner = the repository whose process runs the job; target = the authority the wo
| OpenVibe.Tips | setInterval | | ? | server/network.js:42 | | keep |
| OpenVibe.Tips | setInterval | | ? | server/network.js:42 | | keep |
| OpenVibe.VIP | setInterval | | ? | server/index.js:25 | | keep |
| OpenVibe.VIP | setInterval | | ? | server/index.js:25 | | keep |
| OpenVibe.VIP | setInterval | | ? | server/network.js:42 | | keep |
| OpenVibe.VIP | setInterval | | ? | server/network.js:42 | | keep |
-| OpenVibe.AI | setInterval | | ? | server/auth.js:70 | | keep |
+| OpenVibe.AI | setInterval | | ? | server/auth.js:69 | | keep |
| OpenVibe.AI | setInterval | | ? | server/events.js:36 | | keep |
| OpenVibe.AI | setInterval | | ? | server/events.js:36 | | keep |
-| OpenVibe.AI | setInterval | | ? | server/index.js:49 | | keep |
+| OpenVibe.AI | setInterval | | ? | server/index.js:51 | | keep |
| OpenVibe.AI | setInterval | | 5 min | server/user-modules.js:135 | | keep |
| OpenVibe.AI | setInterval | | 5 min | server/user-modules.js:135 | | keep |
| OpenVibe.Search | setInterval | | ? | server/auth.js:74 | | keep |
| OpenVibe.Search | setInterval | | ? | server/auth.js:74 | | keep |
| OpenVibe.Search | setInterval | | ? | server/events/outbox.js:166 | | keep |
| OpenVibe.Search | setInterval | | ? | server/events/outbox.js:166 | | keep |
@@ -26,6 +26,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -26,6 +26,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenRe.Stream | OV_OAUTH_CLIENT_SECRET | openre.env | server/config.js |
| OpenRe.Stream | OV_OAUTH_CLIENT_SECRET | openre.env | server/config.js |
| OpenVibe.AI | AI_API_KEY | ai.env | (not referenced) |
| OpenVibe.AI | AI_API_KEY | ai.env | (not referenced) |
| OpenVibe.AI | AI_CONSOLE_SESSION_SECRET | ai.env | (not referenced) |
| OpenVibe.AI | AI_CONSOLE_SESSION_SECRET | ai.env | (not referenced) |
+| OpenVibe.AI | AI_CREDENTIALS_KEY | ai.env | server/config.js |
| OpenVibe.AI | OV_OAUTH_CLIENT_SECRET | ai.env | server/events.js, server/user-modules.js |
| OpenVibe.AI | OV_OAUTH_CLIENT_SECRET | ai.env | server/events.js, server/user-modules.js |
| OpenVibe.Billing | BILLING_SESSION_SECRET | billing.env | server/config.js |
| OpenVibe.Billing | BILLING_SESSION_SECRET | billing.env | server/config.js |
| OpenVibe.Billing | CCBILL_WEBHOOK_SECRET | **not set** | server/config.js |
| OpenVibe.Billing | CCBILL_WEBHOOK_SECRET | **not set** | server/config.js |
@@ -67,6 +68,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -67,6 +68,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Games | EDITOR_KEY | games.env | apps/server/src/config.ts |
| OpenVibe.Games | EDITOR_KEY | games.env | apps/server/src/config.ts |
| OpenVibe.Games | GAMES_EVENTS_SECRET | games.env | apps/server/src/config.ts |
| OpenVibe.Games | GAMES_EVENTS_SECRET | 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.Host | CLOUDFLARE_API_TOKEN | **not set** | lib/dns.js |
| OpenVibe.Host | HOST_FORM_SECRET | host.env | server/config.js |
| OpenVibe.Host | HOST_FORM_SECRET | host.env | server/config.js |
| OpenVibe.Host | OV_OAUTH_CLIENT_SECRET | host.env | server/config.js |
| OpenVibe.Host | OV_OAUTH_CLIENT_SECRET | host.env | server/config.js |
| OpenVibe.Live | ADMIN_PASSWORD | live.env | server/config.js |
| OpenVibe.Live | ADMIN_PASSWORD | live.env | server/config.js |
@@ -91,7 +93,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -91,7 +93,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Media | MEDIA_R2_SECRET_ACCESS_KEY | media.env | server/vod/vod-storage.js |
| OpenVibe.Media | MEDIA_R2_SECRET_ACCESS_KEY | media.env | server/vod/vod-storage.js |
| OpenVibe.Media | MEDIA_SECRET | **not set** | server/views/service.js |
| OpenVibe.Media | MEDIA_SECRET | **not set** | server/views/service.js |
| OpenVibe.Media | MEDIA_SIGNING_SECRET | media.env | server/config.js |
| OpenVibe.Media | MEDIA_SIGNING_SECRET | media.env | server/config.js |
-| OpenVibe.Media | OV_OAUTH_CLIENT_SECRET | media.env | server/events.js, server/index.js, server/lineage-client.js +2 |
+| OpenVibe.Media | OV_OAUTH_CLIENT_SECRET | media.env | server/account-data.js, server/events.js, server/index.js +3 |
| OpenVibe.Media | VIEW_HASH_SECRET | **not set** | server/views/service.js |
| OpenVibe.Media | VIEW_HASH_SECRET | **not set** | server/views/service.js |
| OpenVibe.Network | ADMIN_PASSWORD | network.env | server/config.js |
| OpenVibe.Network | ADMIN_PASSWORD | network.env | server/config.js |
| OpenVibe.Network | DEV_CREDENTIAL_OVERLAP_S | **not set** | server/config.js |
| OpenVibe.Network | DEV_CREDENTIAL_OVERLAP_S | **not set** | server/config.js |
@@ -123,7 +125,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -123,7 +125,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Tools | OPEN_CHARGE_MAP_KEY | **not set** | apps/maps/server/config.js |
| OpenVibe.Tools | OPEN_CHARGE_MAP_KEY | **not set** | apps/maps/server/config.js |
| OpenVibe.Tools | OV_INTERNAL_KEY | **not set** | apps/_shared/internal-auth.js |
| OpenVibe.Tools | OV_INTERNAL_KEY | **not set** | apps/_shared/internal-auth.js |
| OpenVibe.Tools | OV_OAUTH_CLIENT_SECRET | tools.env | apps/_shared/jobs/events.js, apps/_shared/jobs/index.js, apps/_shared/usage.js +3 |
| OpenVibe.Tools | OV_OAUTH_CLIENT_SECRET | tools.env | apps/_shared/jobs/events.js, apps/_shared/jobs/index.js, apps/_shared/usage.js +3 |
-| OpenVibe.Tools | RIDB_API_KEY | **not set** | apps/maps/server/config.js, apps/maps/server/sources/ridb.js |
+| OpenVibe.Tools | RIDB_API_KEY | tools.env | apps/maps/server/config.js, apps/maps/server/sources/ridb.js |
| OpenVibe.Tools | TOOLS_EVENTS_SECRET | tools.env | apps/gateway/server/revocation-events.js |
| OpenVibe.Tools | TOOLS_EVENTS_SECRET | tools.env | apps/gateway/server/revocation-events.js |
| OpenVibe.Trade | OV_OAUTH_CLIENT_SECRET | trade.env | server/config.js |
| OpenVibe.Trade | OV_OAUTH_CLIENT_SECRET | trade.env | server/config.js |
| OpenVibe.Trade | TRADE_EVENTS_WEBHOOK_SECRET | **not set** | server/config.js |
| OpenVibe.Trade | TRADE_EVENTS_WEBHOOK_SECRET | **not set** | server/config.js |
@@ -137,7 +139,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -137,7 +139,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| File | Variables |
| File | Variables |
|---|---|
|---|---|
-| /etc/openvibe/ai.env | 24 |
+| /etc/openvibe/ai.env | 27 |
| /etc/openvibe/backup.env | 7 |
| /etc/openvibe/backup.env | 7 |
| /etc/openvibe/billing.env | 11 |
| /etc/openvibe/billing.env | 11 |
| /etc/openvibe/blog.env | 14 |
| /etc/openvibe/blog.env | 14 |
@@ -151,17 +153,18 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -151,17 +153,18 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| /etc/openvibe/games.env | 16 |
| /etc/openvibe/games.env | 16 |
| /etc/openvibe/generated-secrets.env | 6 |
| /etc/openvibe/generated-secrets.env | 6 |
| /etc/openvibe/host.env | 12 |
| /etc/openvibe/host.env | 12 |
-| /etc/openvibe/live.env | 65 |
+| /etc/openvibe/live.env | 67 |
| /etc/openvibe/media.env | 32 |
| /etc/openvibe/media.env | 32 |
-| /etc/openvibe/network.env | 25 |
+| /etc/openvibe/network.env | 26 |
| /etc/openvibe/news.env | 13 |
| /etc/openvibe/news.env | 13 |
-| /etc/openvibe/openre.env | 12 |
+| /etc/openvibe/openre.env | 13 |
+| /etc/openvibe/probe-merge.env | 2 |
| /etc/openvibe/probe.env | 2 |
| /etc/openvibe/probe.env | 2 |
| /etc/openvibe/reviews.env | 12 |
| /etc/openvibe/reviews.env | 12 |
| /etc/openvibe/search.env | 9 |
| /etc/openvibe/search.env | 9 |
| /etc/openvibe/sources.env | 7 |
| /etc/openvibe/sources.env | 7 |
| /etc/openvibe/tips.env | 12 |
| /etc/openvibe/tips.env | 12 |
-| /etc/openvibe/tools.env | 14 |
+| /etc/openvibe/tools.env | 15 |
| /etc/openvibe/trade.env | 11 |
| /etc/openvibe/trade.env | 11 |
| /etc/openvibe/vip.env | 11 |
| /etc/openvibe/vip.env | 11 |
| /etc/openvibe/wiki.env | 13 |
| /etc/openvibe/wiki.env | 13 |
@@ -175,7 +178,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -175,7 +178,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenRe.Stream | EVENTS_PUBLISH | | server/config.js |
| OpenRe.Stream | EVENTS_PUBLISH | | server/config.js |
| OpenRe.Stream | EVENTS_RELAY_INTERVAL_MS | | server/config.js |
| OpenRe.Stream | EVENTS_RELAY_INTERVAL_MS | | server/config.js |
| OpenRe.Stream | EVENTS_URL | openre.env | server/config.js |
| OpenRe.Stream | EVENTS_URL | openre.env | server/config.js |
-| OpenRe.Stream | HOST | | server/config.js |
+| OpenRe.Stream | HOST | openre.env | server/config.js |
| OpenRe.Stream | MEDIA_APP_ID | openre.env | server/config.js |
| OpenRe.Stream | MEDIA_APP_ID | openre.env | server/config.js |
| OpenRe.Stream | MEDIA_URL | openre.env | server/config.js |
| OpenRe.Stream | MEDIA_URL | openre.env | server/config.js |
| OpenRe.Stream | MIN_CLIENT_GENERATION | | OpenVibe.Shared/release.js |
| OpenRe.Stream | MIN_CLIENT_GENERATION | | OpenVibe.Shared/release.js |
@@ -189,6 +192,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -189,6 +192,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenRe.Stream | OPENRE_ENV_FILE | | server/index.js, workers/coordinator.js +3 |
| OpenRe.Stream | OPENRE_ENV_FILE | | server/index.js, workers/coordinator.js +3 |
| OpenRe.Stream | OPENRE_FFMPEG_OPENSSL_PATH | | server/config.js |
| OpenRe.Stream | OPENRE_FFMPEG_OPENSSL_PATH | | server/config.js |
| OpenRe.Stream | OPENRE_FFMPEG_PATH | | server/config.js |
| OpenRe.Stream | OPENRE_FFMPEG_PATH | | server/config.js |
+| OpenRe.Stream | OPENRE_LIMITS_HOUR | | server/api/actor-limits.js |
+| OpenRe.Stream | OPENRE_LIMITS_MINUTE | | server/api/actor-limits.js |
| OpenRe.Stream | OPENRE_LINEAGE | | server/lineage.js |
| OpenRe.Stream | OPENRE_LINEAGE | | server/lineage.js |
| OpenRe.Stream | OPENRE_LIVE_ACK_TIMEOUT_MS | | server/config.js |
| OpenRe.Stream | OPENRE_LIVE_ACK_TIMEOUT_MS | | server/config.js |
| OpenRe.Stream | OPENRE_MAX_DESTINATIONS | | server/config.js |
| OpenRe.Stream | OPENRE_MAX_DESTINATIONS | | server/config.js |
@@ -248,15 +253,24 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -248,15 +253,24 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.AI | AI_FETCH_TIMEOUT_MS | | server/config.js |
| OpenVibe.AI | AI_FETCH_TIMEOUT_MS | | server/config.js |
| OpenVibe.AI | AI_HTTP_SEAM_URL | | server/config.js |
| OpenVibe.AI | AI_HTTP_SEAM_URL | | server/config.js |
| OpenVibe.AI | AI_INPUT_COST_PER_MTOK | ai.env | server/config.js |
| OpenVibe.AI | AI_INPUT_COST_PER_MTOK | ai.env | server/config.js |
+| OpenVibe.AI | AI_LOCAL_LLM_MODEL | ai.env | server/config.js |
+| OpenVibe.AI | AI_LOCAL_LLM_TIMEOUT_MS | | server/config.js |
+| OpenVibe.AI | AI_LOCAL_LLM_URL | ai.env | server/config.js |
| OpenVibe.AI | AI_MAX_CONCURRENT_RUNS | | server/config.js |
| OpenVibe.AI | AI_MAX_CONCURRENT_RUNS | | server/config.js |
| OpenVibe.AI | AI_MAX_COST_USD_PER_DAY | ai.env | server/config.js |
| OpenVibe.AI | AI_MAX_COST_USD_PER_DAY | ai.env | server/config.js |
| OpenVibe.AI | AI_MAX_INPUT_BYTES | | server/config.js |
| OpenVibe.AI | AI_MAX_INPUT_BYTES | | server/config.js |
| OpenVibe.AI | AI_MAX_QUEUED_RUNS | | server/config.js |
| OpenVibe.AI | AI_MAX_QUEUED_RUNS | | server/config.js |
| OpenVibe.AI | AI_MAX_QUEUED_RUNS_PER_CALLER | | server/config.js |
| OpenVibe.AI | AI_MAX_QUEUED_RUNS_PER_CALLER | | server/config.js |
| OpenVibe.AI | AI_MAX_WAIT_MS | | server/config.js |
| OpenVibe.AI | AI_MAX_WAIT_MS | | server/config.js |
+| OpenVibe.AI | AI_MEDIA_ANALYSIS_DIR | | server/config.js |
+| OpenVibe.AI | AI_MEDIA_ANALYSIS_DISK_RESERVE_BYTES | | server/config.js |
+| OpenVibe.AI | AI_MEDIA_ANALYSIS_FETCH_TIMEOUT_MS | | server/config.js |
+| OpenVibe.AI | AI_MEDIA_ANALYSIS_MAX_BYTES | | server/config.js |
+| OpenVibe.AI | AI_MEDIA_SCENE_THRESHOLD | | server/config.js |
+| OpenVibe.AI | AI_MEDIA_STORAGE_HOSTS | | server/config.js |
+| OpenVibe.AI | AI_MEDIA_STREAM | | server/config.js |
+| OpenVibe.AI | AI_MEDIA_STT_WINDOW_SEC | | server/config.js |
| OpenVibe.AI | AI_MODEL | ai.env | server/config.js |
| OpenVibe.AI | AI_MODEL | ai.env | server/config.js |
-| OpenVibe.AI | AI_NS_FALLBACK | | server/config.js |
-| OpenVibe.AI | AI_NS_REQUIRED | | server/config.js |
| OpenVibe.AI | AI_OUTPUT_COST_PER_MTOK | ai.env | server/config.js |
| OpenVibe.AI | AI_OUTPUT_COST_PER_MTOK | ai.env | server/config.js |
| OpenVibe.AI | AI_PRICING_JSON | ai.env | server/config.js |
| OpenVibe.AI | AI_PRICING_JSON | ai.env | server/config.js |
| OpenVibe.AI | AI_PROVIDER | ai.env | server/config.js |
| OpenVibe.AI | AI_PROVIDER | ai.env | server/config.js |
@@ -274,6 +288,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -274,6 +288,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.AI | BASE_URL | ai.env | server/config.js |
| OpenVibe.AI | BASE_URL | ai.env | server/config.js |
| OpenVibe.AI | EVENTS_PUBLISH | | server/events.js |
| OpenVibe.AI | EVENTS_PUBLISH | | server/events.js |
| OpenVibe.AI | EVENTS_URL | ai.env | server/events.js |
| OpenVibe.AI | EVENTS_URL | ai.env | server/events.js |
+| OpenVibe.AI | FFMPEG_BIN | | server/config.js |
+| OpenVibe.AI | FFPROBE_BIN | | server/config.js |
| OpenVibe.AI | HOST | ai.env | server/config.js |
| OpenVibe.AI | HOST | ai.env | server/config.js |
| OpenVibe.AI | MIN_CLIENT_GENERATION | | OpenVibe.Shared/release.js |
| OpenVibe.AI | MIN_CLIENT_GENERATION | | OpenVibe.Shared/release.js |
| OpenVibe.AI | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |
| OpenVibe.AI | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |
@@ -306,6 +322,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -306,6 +322,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Billing | BILLING_DB_PATH | | server/config.js |
| OpenVibe.Billing | BILLING_DB_PATH | | server/config.js |
| OpenVibe.Billing | BILLING_ESCROW_DAYS | | server/config.js |
| OpenVibe.Billing | BILLING_ESCROW_DAYS | | server/config.js |
| OpenVibe.Billing | BILLING_JOBS | | server/config.js |
| OpenVibe.Billing | BILLING_JOBS | | server/config.js |
+| OpenVibe.Billing | BILLING_LIMITS | | server/config.js |
+| OpenVibe.Billing | BILLING_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Billing | BILLING_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Billing | BILLING_MAX_BITS | | server/config.js |
| OpenVibe.Billing | BILLING_MAX_BITS | | server/config.js |
| OpenVibe.Billing | BILLING_MIN_CASHOUT_BITS | | server/config.js |
| OpenVibe.Billing | BILLING_MIN_CASHOUT_BITS | | server/config.js |
| OpenVibe.Billing | BILLING_MIN_PURCHASE_BITS | | server/config.js |
| OpenVibe.Billing | BILLING_MIN_PURCHASE_BITS | | server/config.js |
@@ -357,6 +376,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -357,6 +376,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Blog | BASE_URL | blog.env | server/config.js |
| OpenVibe.Blog | BASE_URL | blog.env | server/config.js |
| OpenVibe.Blog | BLOG_DB_PATH | | server/config.js |
| OpenVibe.Blog | BLOG_DB_PATH | | server/config.js |
| OpenVibe.Blog | BLOG_ENTITLEMENTS_PROVIDER | | server/config.js |
| OpenVibe.Blog | BLOG_ENTITLEMENTS_PROVIDER | | server/config.js |
+| OpenVibe.Blog | BLOG_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Blog | BLOG_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Blog | BLOG_MEDIA_APP | | server/config.js |
| OpenVibe.Blog | BLOG_MEDIA_APP | | server/config.js |
| OpenVibe.Blog | BLOG_MEDIA_VERIFY_INTERVAL_MS | | server/config.js |
| OpenVibe.Blog | BLOG_MEDIA_VERIFY_INTERVAL_MS | | server/config.js |
| OpenVibe.Blog | BLOG_OFFICIAL_DESCRIPTION | | server/config.js |
| OpenVibe.Blog | BLOG_OFFICIAL_DESCRIPTION | | server/config.js |
@@ -410,6 +431,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -410,6 +431,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Chat | CHAT_DB_PATH | | server/config.js |
| OpenVibe.Chat | CHAT_DB_PATH | | server/config.js |
| OpenVibe.Chat | CHAT_EVENTS_ENDPOINT | | server/config.js |
| OpenVibe.Chat | CHAT_EVENTS_ENDPOINT | | server/config.js |
| OpenVibe.Chat | CHAT_EVENTS_SUBSCRIBE | | server/config.js |
| OpenVibe.Chat | CHAT_EVENTS_SUBSCRIBE | | server/config.js |
+| OpenVibe.Chat | CHAT_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Chat | CHAT_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Chat | CHAT_OAUTH_REDIRECT_URI | | server/config.js |
| OpenVibe.Chat | CHAT_OAUTH_REDIRECT_URI | | server/config.js |
| OpenVibe.Chat | CHAT_PREFS_CACHE_MAX | | server/config.js |
| OpenVibe.Chat | CHAT_PREFS_CACHE_MAX | | server/config.js |
| OpenVibe.Chat | CHAT_PREFS_ENABLED | | server/config.js |
| OpenVibe.Chat | CHAT_PREFS_ENABLED | | server/config.js |
@@ -463,6 +486,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -463,6 +486,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Codes | CODES_EXPORT_MAX_OBJECTS | | server/config.js |
| OpenVibe.Codes | CODES_EXPORT_MAX_OBJECTS | | server/config.js |
| OpenVibe.Codes | CODES_EXPORT_MEDIA_URL | | server/config.js |
| OpenVibe.Codes | CODES_EXPORT_MEDIA_URL | | server/config.js |
| OpenVibe.Codes | CODES_EXPORT_URL_TTL_S | | server/config.js |
| OpenVibe.Codes | CODES_EXPORT_URL_TTL_S | | server/config.js |
+| OpenVibe.Codes | CODES_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Codes | CODES_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Codes | CODES_PLAYGROUND_EVENTS_URL | | server/config.js |
| OpenVibe.Codes | CODES_PLAYGROUND_EVENTS_URL | | server/config.js |
| OpenVibe.Codes | CODES_PLAYGROUND_MAX_UPLOAD_BYTES | | server/config.js |
| OpenVibe.Codes | CODES_PLAYGROUND_MAX_UPLOAD_BYTES | | server/config.js |
| OpenVibe.Codes | CODES_PLAYGROUND_MEDIA_URL | | server/config.js |
| OpenVibe.Codes | CODES_PLAYGROUND_MEDIA_URL | | server/config.js |
@@ -478,9 +503,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -478,9 +503,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Codes | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |
| OpenVibe.Codes | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |
| OpenVibe.Codes | NODE_ENV | | server/config.js |
| OpenVibe.Codes | NODE_ENV | | server/config.js |
| OpenVibe.Codes | OV_BILLING_INTERNAL_URL | | server/http/docs.js |
| OpenVibe.Codes | OV_BILLING_INTERNAL_URL | | server/http/docs.js |
-| OpenVibe.Codes | OV_EVENTS_INTERNAL_URL | | server/config.js, server/http/docs.js |
-| OpenVibe.Codes | OV_HOST_INTERNAL_URL | | server/http/docs.js |
-| OpenVibe.Codes | OV_MEDIA_INTERNAL_URL | | server/config.js, server/http/docs.js |
+| OpenVibe.Codes | OV_EVENTS_INTERNAL_URL | | server/config.js, server/domain/limits.js |
+| OpenVibe.Codes | OV_HOST_INTERNAL_URL | | server/domain/limits.js |
+| OpenVibe.Codes | OV_MEDIA_INTERNAL_URL | | server/config.js, server/domain/limits.js |
| OpenVibe.Codes | OV_NETWORK_INTERNAL_URL | codes.env | server/config.js |
| OpenVibe.Codes | OV_NETWORK_INTERNAL_URL | codes.env | server/config.js |
| OpenVibe.Codes | OV_NETWORK_ISSUER | | server/config.js |
| OpenVibe.Codes | OV_NETWORK_ISSUER | | server/config.js |
| OpenVibe.Codes | OV_NETWORK_URL | codes.env | server/config.js |
| OpenVibe.Codes | OV_NETWORK_URL | codes.env | server/config.js |
@@ -498,6 +523,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -498,6 +523,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Community | COMMUNITY_DB_PATH | | server/config.js |
| OpenVibe.Community | COMMUNITY_DB_PATH | | server/config.js |
| OpenVibe.Community | COMMUNITY_EVENTS_ENDPOINT | | server/pulse/consumer.js |
| OpenVibe.Community | COMMUNITY_EVENTS_ENDPOINT | | server/pulse/consumer.js |
| OpenVibe.Community | COMMUNITY_EVENTS_SUBSCRIBE | | server/pulse/consumer.js |
| OpenVibe.Community | COMMUNITY_EVENTS_SUBSCRIBE | | server/pulse/consumer.js |
+| OpenVibe.Community | COMMUNITY_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Community | COMMUNITY_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Community | COMMUNITY_PROFILE_MODULE | | server/identity/profile-module.js |
| OpenVibe.Community | COMMUNITY_PROFILE_MODULE | | server/identity/profile-module.js |
| OpenVibe.Community | COMMUNITY_SEARCH_DOCUMENTS | | server/search/documents.js |
| OpenVibe.Community | COMMUNITY_SEARCH_DOCUMENTS | | server/search/documents.js |
| OpenVibe.Community | COOKIE_SECURE | | server/config.js |
| OpenVibe.Community | COOKIE_SECURE | | server/config.js |
@@ -545,6 +572,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -545,6 +572,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Coupons | COUPONS_EXTENSION_ORIGINS | | server/config.js |
| OpenVibe.Coupons | COUPONS_EXTENSION_ORIGINS | | server/config.js |
| OpenVibe.Coupons | COUPONS_INSTALL_TTL_DAYS | | server/config.js |
| OpenVibe.Coupons | COUPONS_INSTALL_TTL_DAYS | | server/config.js |
| OpenVibe.Coupons | COUPONS_INSTALLS_PER_SUBJECT | | server/config.js |
| OpenVibe.Coupons | COUPONS_INSTALLS_PER_SUBJECT | | server/config.js |
+| OpenVibe.Coupons | COUPONS_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Coupons | COUPONS_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Coupons | COUPONS_LOOKUP_ANON_PER_MIN | | server/config.js |
| OpenVibe.Coupons | COUPONS_LOOKUP_ANON_PER_MIN | | server/config.js |
| OpenVibe.Coupons | COUPONS_LOOKUP_SERVICE_PER_MIN | | server/config.js |
| OpenVibe.Coupons | COUPONS_LOOKUP_SERVICE_PER_MIN | | server/config.js |
| OpenVibe.Coupons | COUPONS_REPORTS_PER_DAY | | server/config.js |
| OpenVibe.Coupons | COUPONS_REPORTS_PER_DAY | | server/config.js |
@@ -584,6 +613,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -584,6 +613,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Deals | DEALS_IMPORT_MAX_PAGES | | server/config.js |
| OpenVibe.Deals | DEALS_IMPORT_MAX_PAGES | | server/config.js |
| OpenVibe.Deals | DEALS_IMPORT_PAGE_SIZE | | server/config.js |
| OpenVibe.Deals | DEALS_IMPORT_PAGE_SIZE | | server/config.js |
| OpenVibe.Deals | DEALS_IMPORT_REFRESH_BATCH | | server/config.js |
| OpenVibe.Deals | DEALS_IMPORT_REFRESH_BATCH | | server/config.js |
+| OpenVibe.Deals | DEALS_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Deals | DEALS_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Deals | DEALS_MODERATORS | deals.env | server/config.js |
| OpenVibe.Deals | DEALS_MODERATORS | deals.env | server/config.js |
| OpenVibe.Deals | DEALS_NEW_ACCOUNT_DAYS | | server/config.js |
| OpenVibe.Deals | DEALS_NEW_ACCOUNT_DAYS | | server/config.js |
| OpenVibe.Deals | DEALS_NEW_ACCOUNT_WEIGHT | | server/config.js |
| OpenVibe.Deals | DEALS_NEW_ACCOUNT_WEIGHT | | server/config.js |
@@ -630,6 +661,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -630,6 +661,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Events | EVENTS_DELIVERY_TIMEOUT_MS | | server/config.js |
| OpenVibe.Events | EVENTS_DELIVERY_TIMEOUT_MS | | server/config.js |
| OpenVibe.Events | EVENTS_DLQ_DEGRADED_AT | | server/config.js |
| OpenVibe.Events | EVENTS_DLQ_DEGRADED_AT | | server/config.js |
| OpenVibe.Events | EVENTS_ENDPOINT_HOSTS | | server/config.js |
| OpenVibe.Events | EVENTS_ENDPOINT_HOSTS | | server/config.js |
+| OpenVibe.Events | EVENTS_LIMITS | | server/config.js |
+| OpenVibe.Events | EVENTS_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Events | EVENTS_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Events | EVENTS_MAX_ATTEMPTS | | server/config.js |
| OpenVibe.Events | EVENTS_MAX_ATTEMPTS | | server/config.js |
| OpenVibe.Events | EVENTS_MAX_HOPS | | server/config.js |
| OpenVibe.Events | EVENTS_MAX_HOPS | | server/config.js |
| OpenVibe.Events | EVENTS_MAX_INFLIGHT | | server/config.js |
| OpenVibe.Events | EVENTS_MAX_INFLIGHT | | server/config.js |
@@ -639,6 +673,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -639,6 +673,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Events | EVENTS_RECEIPT_RETENTION_DAYS | | server/config.js |
| OpenVibe.Events | EVENTS_RECEIPT_RETENTION_DAYS | | server/config.js |
| OpenVibe.Events | EVENTS_RETENTION_DAYS | | server/config.js |
| OpenVibe.Events | EVENTS_RETENTION_DAYS | | server/config.js |
| OpenVibe.Events | EVENTS_SOURCE_PREFIXES | | server/config.js |
| OpenVibe.Events | EVENTS_SOURCE_PREFIXES | | server/config.js |
+| OpenVibe.Events | EVENTS_USAGE | | server/config.js |
+| OpenVibe.Events | EVENTS_USAGE_FLUSH_MS | | server/config.js |
| OpenVibe.Events | EVENTS_USER_AUDIENCES | | server/config.js |
| OpenVibe.Events | EVENTS_USER_AUDIENCES | | server/config.js |
| OpenVibe.Events | EVENTS_WORKER | | server/config.js |
| OpenVibe.Events | EVENTS_WORKER | | server/config.js |
| OpenVibe.Events | EVENTS_WORKER_INTERVAL_MS | | server/config.js |
| OpenVibe.Events | EVENTS_WORKER_INTERVAL_MS | | server/config.js |
@@ -696,6 +732,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -696,6 +732,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Games | EVENTS_PUBLISH | | apps/server/src/config.ts |
| OpenVibe.Games | EVENTS_PUBLISH | | apps/server/src/config.ts |
| OpenVibe.Games | EVENTS_URL | games.env | apps/server/src/config.ts |
| OpenVibe.Games | EVENTS_URL | games.env | apps/server/src/config.ts |
| OpenVibe.Games | GAMES_EVENTS_ENDPOINT | | apps/server/src/config.ts |
| OpenVibe.Games | GAMES_EVENTS_ENDPOINT | | apps/server/src/config.ts |
+| OpenVibe.Games | GAMES_LIMITS_HOUR | | apps/server/src/net/actorLimits.ts |
+| OpenVibe.Games | GAMES_LIMITS_MINUTE | | apps/server/src/net/actorLimits.ts |
| OpenVibe.Games | GUEST_IP_BINDING | | apps/server/src/config.ts |
| OpenVibe.Games | GUEST_IP_BINDING | | apps/server/src/config.ts |
| OpenVibe.Games | HOST | games.env | apps/server/src/config.ts |
| OpenVibe.Games | HOST | games.env | apps/server/src/config.ts |
| OpenVibe.Games | LOG_LEVEL | | apps/server/src/main.ts |
| OpenVibe.Games | LOG_LEVEL | | apps/server/src/main.ts |
@@ -717,16 +755,21 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -717,16 +755,21 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Games | STATIC_DIR | games.env | apps/server/src/config.ts |
| OpenVibe.Games | STATIC_DIR | games.env | apps/server/src/config.ts |
| OpenVibe.Host | API_CORS_ORIGINS | | server/config.js |
| OpenVibe.Host | API_CORS_ORIGINS | | server/config.js |
| OpenVibe.Host | BASE_URL | host.env | server/config.js |
| OpenVibe.Host | BASE_URL | host.env | server/config.js |
+| OpenVibe.Host | CLOUDFLARE_API_TOKEN_FILE | | lib/dns.js |
| OpenVibe.Host | COOKIE_SECURE | | server/config.js |
| OpenVibe.Host | COOKIE_SECURE | | server/config.js |
| OpenVibe.Host | EVENTS_RELAY_INTERVAL_MS | | server/config.js |
| OpenVibe.Host | EVENTS_RELAY_INTERVAL_MS | | server/config.js |
| OpenVibe.Host | EVENTS_URL | host.env | server/config.js |
| OpenVibe.Host | EVENTS_URL | host.env | server/config.js |
+| OpenVibe.Host | HOME | | lib/dns.js |
| OpenVibe.Host | HOST | host.env | server/config.js |
| OpenVibe.Host | HOST | host.env | server/config.js |
+| OpenVibe.Host | HOST_ACTOR_LIMITS | | server/http/actor-limits.js |
| OpenVibe.Host | HOST_CNAME_TARGET | host.env | server/config.js |
| OpenVibe.Host | HOST_CNAME_TARGET | host.env | server/config.js |
| OpenVibe.Host | HOST_DB_PATH | | server/config.js |
| OpenVibe.Host | HOST_DB_PATH | | server/config.js |
| OpenVibe.Host | HOST_DNS_SERVERS | | server/config.js |
| OpenVibe.Host | HOST_DNS_SERVERS | | server/config.js |
| OpenVibe.Host | HOST_DOMAIN_LAPSE_DAYS | | server/config.js |
| OpenVibe.Host | HOST_DOMAIN_LAPSE_DAYS | | server/config.js |
| OpenVibe.Host | HOST_DOMAIN_PENDING_DAYS | | server/config.js |
| OpenVibe.Host | HOST_DOMAIN_PENDING_DAYS | | server/config.js |
| OpenVibe.Host | HOST_DOMAIN_RECHECK_MS | | server/config.js |
| OpenVibe.Host | HOST_DOMAIN_RECHECK_MS | | server/config.js |
+| OpenVibe.Host | HOST_LIMITS_HOUR | | server/http/actor-limits.js |
+| OpenVibe.Host | HOST_LIMITS_MINUTE | | server/http/actor-limits.js |
| OpenVibe.Host | HOST_MAX_CONCURRENT_UPLOADS | | server/config.js |
| OpenVibe.Host | HOST_MAX_CONCURRENT_UPLOADS | | server/config.js |
| OpenVibe.Host | HOST_MAX_PROJECTS_PER_OWNER | | server/config.js |
| OpenVibe.Host | HOST_MAX_PROJECTS_PER_OWNER | | server/config.js |
| OpenVibe.Host | HOST_MAX_UNPACKED_BYTES | | server/config.js |
| OpenVibe.Host | HOST_MAX_UNPACKED_BYTES | | server/config.js |
@@ -750,25 +793,26 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -750,25 +793,26 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Host | OVHOST_BACKUP_ENV | | lib/offsite.js |
| OpenVibe.Host | OVHOST_BACKUP_ENV | | lib/offsite.js |
| OpenVibe.Host | OVHOST_EVENTS_ENV | | lib/announce.js |
| OpenVibe.Host | OVHOST_EVENTS_ENV | | lib/announce.js |
| OpenVibe.Host | OVHOST_INVENTORY | | lib/inventory.js |
| OpenVibe.Host | OVHOST_INVENTORY | | lib/inventory.js |
+| OpenVibe.Host | OVHOST_PROMETHEUS_URL | | lib/alerts.js |
| OpenVibe.Host | PATH | | lib/executor.js |
| OpenVibe.Host | PATH | | lib/executor.js |
| OpenVibe.Host | PORT | | server/config.js |
| OpenVibe.Host | PORT | | server/config.js |
| OpenVibe.Host | RELEASE_AT | | OpenVibe.Shared/release.js |
| OpenVibe.Host | RELEASE_AT | | OpenVibe.Shared/release.js |
| OpenVibe.Host | RELEASE_COMMIT | | OpenVibe.Shared/release.js |
| OpenVibe.Host | RELEASE_COMMIT | | OpenVibe.Shared/release.js |
-| OpenVibe.Host | SUDO_USER | | lib/commands/drill.js, lib/release-ops.js |
+| OpenVibe.Host | SUDO_USER | | lib/cli.js, lib/commands/drill.js +1 |
| OpenVibe.Host | TRUST_PROXY | host.env | server/config.js |
| OpenVibe.Host | TRUST_PROXY | host.env | server/config.js |
-| OpenVibe.Host | USER | | lib/executor.js |
+| OpenVibe.Host | USER | | lib/cli.js, lib/executor.js |
| OpenVibe.Live | ADMIN_USERNAME | live.env | server/config.js |
| OpenVibe.Live | ADMIN_USERNAME | live.env | server/config.js |
| OpenVibe.Live | AI_HEAR_MAX_SPOOL | | server/ai/stream-audio.js |
| OpenVibe.Live | AI_HEAR_MAX_SPOOL | | server/ai/stream-audio.js |
| OpenVibe.Live | AI_HEAR_SEGMENT_SEC | | server/ai/stream-audio.js |
| OpenVibe.Live | AI_HEAR_SEGMENT_SEC | | server/ai/stream-audio.js |
| OpenVibe.Live | AI_SERVICE | live.env | server/ai/ai-service.js |
| OpenVibe.Live | AI_SERVICE | live.env | server/ai/ai-service.js |
| OpenVibe.Live | AI_VOD_MAX_WINDOWS | | server/ai/media-analysis.js |
| OpenVibe.Live | AI_VOD_MAX_WINDOWS | | server/ai/media-analysis.js |
| OpenVibe.Live | ALLOW_P2P_FALLBACK | | server/config.js |
| OpenVibe.Live | ALLOW_P2P_FALLBACK | | server/config.js |
+| OpenVibe.Live | ANALYTICS_SOURCE | live.env | server/analytics/network-analytics.js |
| OpenVibe.Live | BASE_URL | live.env | server/auth/routes.js, server/config.js |
| OpenVibe.Live | BASE_URL | live.env | server/auth/routes.js, server/config.js |
| OpenVibe.Live | BILLING_AUTHORITY | | server/admin/routes.js, server/chat/live-context-routes.js +2 |
| OpenVibe.Live | BILLING_AUTHORITY | | server/admin/routes.js, server/chat/live-context-routes.js +2 |
| OpenVibe.Live | BTTV_CACHE_TTL | | server/config.js |
| OpenVibe.Live | BTTV_CACHE_TTL | | server/config.js |
| OpenVibe.Live | CALLS_AUTHORITY | live.env | server/streaming/calls-authority.js |
| OpenVibe.Live | CALLS_AUTHORITY | live.env | server/streaming/calls-authority.js |
| OpenVibe.Live | CHAT_AUTHORITY | live.env | server/chat/chat-authority.js |
| OpenVibe.Live | CHAT_AUTHORITY | live.env | server/chat/chat-authority.js |
-| OpenVibe.Live | COLD_STORAGE_PATH | | server/config.js |
| OpenVibe.Live | DATA_DIR | | server/drill.js, server/index.js +1 |
| OpenVibe.Live | DATA_DIR | | server/drill.js, server/index.js +1 |
| OpenVibe.Live | DB_PATH | live.env | server/db/init.js, server/drill.js +2 |
| OpenVibe.Live | DB_PATH | live.env | server/db/init.js, server/drill.js +2 |
| OpenVibe.Live | DEBUG_DM_DELIVERY | | server/chat/chat-server.js |
| OpenVibe.Live | DEBUG_DM_DELIVERY | | server/chat/chat-server.js |
@@ -777,6 +821,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -777,6 +821,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | EVENTS_PUBLISH | | server/events/stream-events.js |
| OpenVibe.Live | EVENTS_PUBLISH | | server/events/stream-events.js |
| OpenVibe.Live | EVENTS_URL | live.env | server/events/stream-events.js |
| OpenVibe.Live | EVENTS_URL | live.env | server/events/stream-events.js |
| OpenVibe.Live | FFZ_CACHE_TTL | | server/config.js |
| OpenVibe.Live | FFZ_CACHE_TTL | | server/config.js |
+| OpenVibe.Live | FOLLOWS_AUTHORITY | live.env | server/social/network-follows.js |
| OpenVibe.Live | GOLIVE_NOTIFY | live.env | server/streaming/golive-notify.js |
| OpenVibe.Live | GOLIVE_NOTIFY | live.env | server/streaming/golive-notify.js |
| OpenVibe.Live | HOST | live.env | server/config.js, server/drill.js +1 |
| OpenVibe.Live | HOST | live.env | server/config.js, server/drill.js +1 |
| OpenVibe.Live | JSMPEG_AUDIO_PORT | live.env | server/config.js |
| OpenVibe.Live | JSMPEG_AUDIO_PORT | live.env | server/config.js |
@@ -786,6 +831,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -786,6 +831,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | LISTEN_HOST | | server/config.js |
| OpenVibe.Live | LISTEN_HOST | | server/config.js |
| OpenVibe.Live | LISTEN_PID | | server/drill.js, server/index.js |
| OpenVibe.Live | LISTEN_PID | | server/drill.js, server/index.js |
| OpenVibe.Live | LIVE_DRILL | | server/drill.js |
| OpenVibe.Live | LIVE_DRILL | | server/drill.js |
+| OpenVibe.Live | LIVE_LIMITS_HOUR | | server/net/actor-limits.js |
+| OpenVibe.Live | LIVE_LIMITS_MINUTE | | server/net/actor-limits.js |
| OpenVibe.Live | LIVE_MODULE_SUMMARIES | | server/auth/module-summaries.js |
| OpenVibe.Live | LIVE_MODULE_SUMMARIES | | server/auth/module-summaries.js |
| OpenVibe.Live | LIVE_PUBLIC_ORIGIN | | server/auth/module-summaries.js, server/events/search-documents.js +1 |
| OpenVibe.Live | LIVE_PUBLIC_ORIGIN | | server/auth/module-summaries.js, server/events/search-documents.js +1 |
| OpenVibe.Live | LIVE_SEARCH_DOCUMENTS | | server/events/search-documents.js, server/events/search-media-documents.js |
| OpenVibe.Live | LIVE_SEARCH_DOCUMENTS | | server/events/search-documents.js, server/events/search-media-documents.js |
@@ -798,7 +845,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -798,7 +845,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | MAX_SOUND_SIZE_KB | | server/config.js |
| OpenVibe.Live | MAX_SOUND_SIZE_KB | | server/config.js |
| OpenVibe.Live | MAX_SOUNDS_PER_CHANNEL | | server/config.js |
| OpenVibe.Live | MAX_SOUNDS_PER_CHANNEL | | server/config.js |
| OpenVibe.Live | MAX_SOUNDS_PER_UPLOADER_PER_CHANNEL | | server/config.js |
| OpenVibe.Live | MAX_SOUNDS_PER_UPLOADER_PER_CHANNEL | | server/config.js |
-| OpenVibe.Live | MAX_VOD_SIZE_MB | | server/config.js, server/media-proxy/vods.js |
+| OpenVibe.Live | MAX_VOD_SIZE_MB | | server/media-proxy/vods.js |
| OpenVibe.Live | MEDIA_APP_ID | live.env | server/config.js, server/media-client.js +1 |
| OpenVibe.Live | MEDIA_APP_ID | live.env | server/config.js, server/media-client.js +1 |
| OpenVibe.Live | MEDIA_EVENTS_AUTHORITY | live.env | server/media-proxy/outcomes.js |
| OpenVibe.Live | MEDIA_EVENTS_AUTHORITY | live.env | server/media-proxy/outcomes.js |
| OpenVibe.Live | MEDIA_PUBLIC_URL | live.env | server/config.js, server/media-client.js |
| OpenVibe.Live | MEDIA_PUBLIC_URL | live.env | server/config.js, server/media-client.js |
@@ -814,8 +861,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -814,8 +861,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | NODE_ENV | live.env | server/comments-client.js, server/config.js +1 |
| OpenVibe.Live | NODE_ENV | live.env | server/comments-client.js, server/config.js +1 |
| OpenVibe.Live | OPENRE_PUBLIC_URL | live.env | server/openre/openre-client.js |
| OpenVibe.Live | OPENRE_PUBLIC_URL | live.env | server/openre/openre-client.js |
| OpenVibe.Live | OPENRE_URL | live.env | server/openre/openre-client.js |
| OpenVibe.Live | OPENRE_URL | live.env | server/openre/openre-client.js |
-| OpenVibe.Live | OV_AI_INTERNAL_URL | | server/ai/ai-service.js |
-| OpenVibe.Live | OV_APP_ROOT | | server/docs/routes.js, server/web/assets.js |
+| OpenVibe.Live | OV_AI_INTERNAL_URL | | server/ai/ai-service.js, server/ai/byo-credentials.js +1 |
+| OpenVibe.Live | OV_APP_ROOT | | server/docs/routes.js, server/index.js +1 |
| OpenVibe.Live | OV_BILLING_INTERNAL_URL | | server/monetization/billing-client.js |
| OpenVibe.Live | OV_BILLING_INTERNAL_URL | | server/monetization/billing-client.js |
| OpenVibe.Live | OV_BILLING_PUBLIC_URL | | server/monetization/billing-client.js |
| OpenVibe.Live | OV_BILLING_PUBLIC_URL | | server/monetization/billing-client.js |
| OpenVibe.Live | OV_BILLING_TIMEOUT_MS | | server/monetization/billing-client.js |
| OpenVibe.Live | OV_BILLING_TIMEOUT_MS | | server/monetization/billing-client.js |
@@ -823,7 +870,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -823,7 +870,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | OV_COMMUNITY_INTERNAL_URL | | server/comments-client.js, server/pastes-client.js |
| OpenVibe.Live | OV_COMMUNITY_INTERNAL_URL | | server/comments-client.js, server/pastes-client.js |
| OpenVibe.Live | OV_COMMUNITY_URL | live.env | server/ai/ai-moments-job.js, server/comments-client.js +3 |
| OpenVibe.Live | OV_COMMUNITY_URL | live.env | server/ai/ai-moments-job.js, server/comments-client.js +3 |
| OpenVibe.Live | OV_LIVE_URL | live.env | (not referenced) |
| OpenVibe.Live | OV_LIVE_URL | live.env | (not referenced) |
-| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/auth/module-summaries.js, server/chat/chat-server.js +7 |
+| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/analytics/network-analytics.js, server/auth/account-data.js +11 |
| 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 +1 |
| OpenVibe.Live | OV_NETWORK_URL | live.env | server/auth/auth.js, server/config.js +1 |
| OpenVibe.Live | OV_OAUTH_CLIENT_ID | live.env | server/auth/module-summaries.js, server/auth/routes.js +3 |
| OpenVibe.Live | OV_OAUTH_CLIENT_ID | live.env | server/auth/module-summaries.js, server/auth/routes.js +3 |
@@ -916,9 +963,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -916,9 +963,9 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Media | NODE_ENV | media.env | server/config.js |
| OpenVibe.Media | NODE_ENV | media.env | server/config.js |
| OpenVibe.Media | OBJECTS_PATH | | server/config.js |
| OpenVibe.Media | OBJECTS_PATH | | server/config.js |
| OpenVibe.Media | OV_LIVE_INTERNAL_URL | | server/lineage-client.js |
| OpenVibe.Media | OV_LIVE_INTERNAL_URL | | server/lineage-client.js |
-| OpenVibe.Media | OV_NETWORK_INTERNAL_URL | media.env | server/config.js, server/events.js +2 |
+| OpenVibe.Media | OV_NETWORK_INTERNAL_URL | media.env | server/account-data.js, server/config.js +3 |
| OpenVibe.Media | OV_NETWORK_URL | media.env | server/config.js |
| OpenVibe.Media | OV_NETWORK_URL | media.env | server/config.js |
-| OpenVibe.Media | OV_OAUTH_CLIENT_ID | media.env | server/events.js, server/index.js +3 |
+| OpenVibe.Media | OV_OAUTH_CLIENT_ID | media.env | server/account-data.js, server/events.js +4 |
| OpenVibe.Media | OV_OAUTH_REDIRECT_URI | | server/index.js |
| OpenVibe.Media | OV_OAUTH_REDIRECT_URI | | server/index.js |
| OpenVibe.Media | PASTES_FROZEN_APPS | media.env | server/pastes/routes.js |
| OpenVibe.Media | PASTES_FROZEN_APPS | media.env | server/pastes/routes.js |
| OpenVibe.Media | PASTES_MOVED_TO | media.env | (not referenced) |
| OpenVibe.Media | PASTES_MOVED_TO | media.env | (not referenced) |
@@ -946,6 +993,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -946,6 +993,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Network | DEV_SANDBOX_ALLOWANCE | | server/config.js |
| OpenVibe.Network | DEV_SANDBOX_ALLOWANCE | | server/config.js |
| OpenVibe.Network | DEV_SANDBOX_AUDIENCES | | server/config.js |
| OpenVibe.Network | DEV_SANDBOX_AUDIENCES | | server/config.js |
| OpenVibe.Network | DEVPATH_RESULT_FILE | | server/status/routes.js |
| OpenVibe.Network | DEVPATH_RESULT_FILE | | server/status/routes.js |
+| OpenVibe.Network | FOLLOWS_AUTHORITY | network.env | server/index.js |
| OpenVibe.Network | HOST | network.env | server/config.js |
| OpenVibe.Network | HOST | network.env | server/config.js |
| OpenVibe.Network | INTERNAL_URL | | server/config.js |
| OpenVibe.Network | INTERNAL_URL | | server/config.js |
| OpenVibe.Network | JWT_PUBLIC_KEY | network.env | server/config.js |
| OpenVibe.Network | JWT_PUBLIC_KEY | network.env | server/config.js |
@@ -954,10 +1002,13 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -954,10 +1002,13 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Network | MEDIASOUP_ANNOUNCED_IP | | server/domains/dns-check.js |
| OpenVibe.Network | MEDIASOUP_ANNOUNCED_IP | | server/domains/dns-check.js |
| OpenVibe.Network | MIN_CLIENT_GENERATION | | OpenVibe.Shared/release.js |
| OpenVibe.Network | MIN_CLIENT_GENERATION | | OpenVibe.Shared/release.js |
| OpenVibe.Network | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |
| OpenVibe.Network | MIN_CLIENT_RELEASE | | OpenVibe.Shared/release.js |
+| OpenVibe.Network | NETWORK_LIMITS_HOUR | | server/auth/actor-limits.js |
+| OpenVibe.Network | NETWORK_LIMITS_MINUTE | | server/auth/actor-limits.js |
| OpenVibe.Network | NODE_ENV | network.env | server/auth/fedcm.js, server/auth/sso-check.js +4 |
| OpenVibe.Network | NODE_ENV | network.env | server/auth/fedcm.js, server/auth/sso-check.js +4 |
| OpenVibe.Network | NOTIFICATION_EMAIL_CRITICAL_ONLY | network.env | (not referenced) |
| OpenVibe.Network | NOTIFICATION_EMAIL_CRITICAL_ONLY | network.env | (not referenced) |
| OpenVibe.Network | NOTIFICATION_MAX_AGE_DAYS | network.env | (not referenced) |
| OpenVibe.Network | NOTIFICATION_MAX_AGE_DAYS | network.env | (not referenced) |
| OpenVibe.Network | NOTIFICATIONS_ENABLED | network.env | (not referenced) |
| OpenVibe.Network | NOTIFICATIONS_ENABLED | network.env | (not referenced) |
+| OpenVibe.Network | OPERATOR_ALERT_USERNAMES | | server/operator/alerts.js |
| OpenVibe.Network | OV_AI_INTERNAL_URL | | server/frame/service.js |
| OpenVibe.Network | OV_AI_INTERNAL_URL | | server/frame/service.js |
| OpenVibe.Network | OV_AUDIO_URL | | OpenVibe.Shared/brand.js |
| OpenVibe.Network | OV_AUDIO_URL | | OpenVibe.Shared/brand.js |
| OpenVibe.Network | OV_BLOG_INTERNAL_URL | | server/index.js |
| OpenVibe.Network | OV_BLOG_INTERNAL_URL | | server/index.js |
@@ -988,7 +1039,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -988,7 +1039,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Network | OV_TOOLS_INTERNAL_URL | network.env | server/config.js, server/domains/catalog.js |
| OpenVibe.Network | OV_TOOLS_INTERNAL_URL | network.env | server/config.js, server/domains/catalog.js |
| OpenVibe.Network | OV_TOOLS_URL | network.env | OpenVibe.Shared/brand.js |
| OpenVibe.Network | OV_TOOLS_URL | network.env | OpenVibe.Shared/brand.js |
| OpenVibe.Network | OV_YT_URL | | OpenVibe.Shared/brand.js |
| OpenVibe.Network | OV_YT_URL | | OpenVibe.Shared/brand.js |
-| OpenVibe.Network | OWNER_USERNAME | | server/admin/routes.js, server/auth/owner-guard.js +3 |
+| OpenVibe.Network | OWNER_USERNAME | | server/admin/routes.js, server/auth/owner-guard.js +6 |
| OpenVibe.Network | PORT | network.env | server/config.js |
| OpenVibe.Network | PORT | network.env | server/config.js |
| OpenVibe.Network | PUBLIC_IP | | server/domains/dns-check.js |
| OpenVibe.Network | PUBLIC_IP | | server/domains/dns-check.js |
| OpenVibe.Network | REALTIME_TICKETS | | server/auth/realtime-ticket.js |
| OpenVibe.Network | REALTIME_TICKETS | | server/auth/realtime-ticket.js |
@@ -1009,6 +1060,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1009,6 +1060,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.News | NEWS_CLUSTER_WINDOW_HOURS | | server/config.js |
| OpenVibe.News | NEWS_CLUSTER_WINDOW_HOURS | | server/config.js |
| OpenVibe.News | NEWS_DB_PATH | | server/config.js |
| OpenVibe.News | NEWS_DB_PATH | | server/config.js |
| OpenVibe.News | NEWS_EDITORS | news.env | server/config.js |
| OpenVibe.News | NEWS_EDITORS | news.env | server/config.js |
+| OpenVibe.News | NEWS_LIMITS_HOUR | | server/config.js |
+| OpenVibe.News | NEWS_LIMITS_MINUTE | | server/config.js |
| OpenVibe.News | NEWS_MIN_INDEPENDENT_SOURCES | | server/config.js |
| OpenVibe.News | NEWS_MIN_INDEPENDENT_SOURCES | | server/config.js |
| OpenVibe.News | NEWS_PULL_INTERVAL_MS | | server/config.js |
| OpenVibe.News | NEWS_PULL_INTERVAL_MS | | server/config.js |
| OpenVibe.News | NEWS_PULL_MAX_PAGES | | server/config.js |
| OpenVibe.News | NEWS_PULL_MAX_PAGES | | server/config.js |
@@ -1054,6 +1107,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1054,6 +1107,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Reviews | REVIEWS_GATE_MIN_SIGNALS | | server/config.js |
| OpenVibe.Reviews | REVIEWS_GATE_MIN_SIGNALS | | server/config.js |
| OpenVibe.Reviews | REVIEWS_GATE_MIN_WORDS | | server/config.js |
| OpenVibe.Reviews | REVIEWS_GATE_MIN_WORDS | | server/config.js |
| OpenVibe.Reviews | REVIEWS_IMPORT_QUEUE_INTERVAL_MS | | server/config.js |
| OpenVibe.Reviews | REVIEWS_IMPORT_QUEUE_INTERVAL_MS | | server/config.js |
+| OpenVibe.Reviews | REVIEWS_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Reviews | REVIEWS_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Reviews | REVIEWS_SOURCES_PAGE_SIZE | | server/config.js |
| OpenVibe.Reviews | REVIEWS_SOURCES_PAGE_SIZE | | server/config.js |
| OpenVibe.Reviews | REVIEWS_SOURCES_SYNC | | server/config.js |
| OpenVibe.Reviews | REVIEWS_SOURCES_SYNC | | server/config.js |
| OpenVibe.Reviews | REVIEWS_SOURCES_SYNC_INTERVAL_MS | | server/config.js |
| OpenVibe.Reviews | REVIEWS_SOURCES_SYNC_INTERVAL_MS | | server/config.js |
@@ -1083,6 +1138,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1083,6 +1138,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Search | SEARCH_EVENT_OWNERS | search.env | server/config.js |
| OpenVibe.Search | SEARCH_EVENT_OWNERS | search.env | server/config.js |
| OpenVibe.Search | SEARCH_FRESHNESS_HALF_LIFE_DAYS | | server/config.js |
| OpenVibe.Search | SEARCH_FRESHNESS_HALF_LIFE_DAYS | | server/config.js |
| OpenVibe.Search | SEARCH_FRESHNESS_WEIGHT | | server/config.js |
| OpenVibe.Search | SEARCH_FRESHNESS_WEIGHT | | server/config.js |
+| OpenVibe.Search | SEARCH_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Search | SEARCH_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Search | SEARCH_MAX_BODY_BYTES | | server/config.js |
| OpenVibe.Search | SEARCH_MAX_BODY_BYTES | | server/config.js |
| OpenVibe.Search | SEARCH_SAVED_MAX_PER_SUBJECT | | server/config.js |
| OpenVibe.Search | SEARCH_SAVED_MAX_PER_SUBJECT | | server/config.js |
| OpenVibe.Search | SEARCH_USER_AUDIENCES | | server/config.js |
| OpenVibe.Search | SEARCH_USER_AUDIENCES | | server/config.js |
@@ -1133,6 +1190,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1133,6 +1190,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Sources | SOURCES_DB_PATH | | server/config.js |
| OpenVibe.Sources | SOURCES_DB_PATH | | server/config.js |
| OpenVibe.Sources | SOURCES_FETCH_TIMEOUT_MS | | server/config.js |
| OpenVibe.Sources | SOURCES_FETCH_TIMEOUT_MS | | server/config.js |
| OpenVibe.Sources | SOURCES_HOST_MIN_INTERVAL_MS | | server/config.js |
| OpenVibe.Sources | SOURCES_HOST_MIN_INTERVAL_MS | | server/config.js |
+| OpenVibe.Sources | SOURCES_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Sources | SOURCES_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Sources | SOURCES_MAX_BACKOFF_MS | | server/config.js |
| OpenVibe.Sources | SOURCES_MAX_BACKOFF_MS | | server/config.js |
| OpenVibe.Sources | SOURCES_MAX_BYTES | | server/config.js |
| OpenVibe.Sources | SOURCES_MAX_BYTES | | server/config.js |
| OpenVibe.Sources | SOURCES_MAX_CONCURRENT | | server/config.js |
| OpenVibe.Sources | SOURCES_MAX_CONCURRENT | | server/config.js |
@@ -1176,6 +1235,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1176,6 +1235,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Tips | TIPS_DELIVERY_MAX_ATTEMPTS | | server/config.js |
| OpenVibe.Tips | TIPS_DELIVERY_MAX_ATTEMPTS | | server/config.js |
| OpenVibe.Tips | TIPS_JOBS | | server/config.js |
| OpenVibe.Tips | TIPS_JOBS | | server/config.js |
| OpenVibe.Tips | TIPS_JOBS_INTERVAL_MS | | server/config.js |
| OpenVibe.Tips | TIPS_JOBS_INTERVAL_MS | | server/config.js |
+| OpenVibe.Tips | TIPS_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Tips | TIPS_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Tips | TIPS_MAX_BITS | | server/config.js |
| OpenVibe.Tips | TIPS_MAX_BITS | | server/config.js |
| OpenVibe.Tips | TIPS_MAX_PENDING_CHECKOUTS | | server/config.js |
| OpenVibe.Tips | TIPS_MAX_PENDING_CHECKOUTS | | server/config.js |
| OpenVibe.Tips | TIPS_MEDIA_HOSTS | | server/config.js |
| OpenVibe.Tips | TIPS_MEDIA_HOSTS | | server/config.js |
@@ -1243,6 +1304,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1243,6 +1304,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Tools | TOOLS_GUARD | | apps/_shared/guard/index.js |
| OpenVibe.Tools | TOOLS_GUARD | | apps/_shared/guard/index.js |
| OpenVibe.Tools | TOOLS_GUARD_LIMITS | | apps/_shared/guard/limits.js |
| OpenVibe.Tools | TOOLS_GUARD_LIMITS | | apps/_shared/guard/limits.js |
| OpenVibe.Tools | TOOLS_JOB_RESULTS | tools.env | apps/_shared/jobs/index.js |
| OpenVibe.Tools | TOOLS_JOB_RESULTS | tools.env | apps/_shared/jobs/index.js |
+| OpenVibe.Tools | TOOLS_LIMITS_HOUR | | apps/_shared/actor-limits.js |
+| OpenVibe.Tools | TOOLS_LIMITS_MINUTE | | apps/_shared/actor-limits.js |
| OpenVibe.Tools | TOOLS_MEDIA_NAMESPACE | | apps/_shared/jobs/index.js |
| OpenVibe.Tools | TOOLS_MEDIA_NAMESPACE | | apps/_shared/jobs/index.js |
| OpenVibe.Tools | TOOLS_REVOCATIONS_DB | | apps/_shared/guard/revocations.js |
| OpenVibe.Tools | TOOLS_REVOCATIONS_DB | | apps/_shared/guard/revocations.js |
| OpenVibe.Tools | TOOLS_SATELLITE_PORTS | | apps/_shared/tools/satellites.js |
| OpenVibe.Tools | TOOLS_SATELLITE_PORTS | | apps/_shared/tools/satellites.js |
@@ -1277,6 +1340,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1277,6 +1340,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Trade | TRADE_EDITORS | trade.env | server/config.js |
| OpenVibe.Trade | TRADE_EDITORS | trade.env | server/config.js |
| OpenVibe.Trade | TRADE_FRESHNESS_INTERVAL_MS | | server/config.js |
| OpenVibe.Trade | TRADE_FRESHNESS_INTERVAL_MS | | server/config.js |
| OpenVibe.Trade | TRADE_GATE_MIN_WORDS | | server/config.js |
| OpenVibe.Trade | TRADE_GATE_MIN_WORDS | | server/config.js |
+| OpenVibe.Trade | TRADE_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Trade | TRADE_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Trade | TRADE_PRICE_MAX_AGE_SEC | | server/config.js |
| OpenVibe.Trade | TRADE_PRICE_MAX_AGE_SEC | | server/config.js |
| OpenVibe.Trade | TRADE_SYNC_INTERVAL_MS | | server/config.js |
| OpenVibe.Trade | TRADE_SYNC_INTERVAL_MS | | server/config.js |
| OpenVibe.Trade | TRADE_SYNC_MAX_PAGES | | server/config.js |
| OpenVibe.Trade | TRADE_SYNC_MAX_PAGES | | server/config.js |
@@ -1311,6 +1376,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1311,6 +1376,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.VIP | VIP_CHECKOUT_PROVIDERS | vip.env | server/config.js |
| OpenVibe.VIP | VIP_CHECKOUT_PROVIDERS | vip.env | server/config.js |
| OpenVibe.VIP | VIP_DB_PATH | | server/config.js |
| OpenVibe.VIP | VIP_DB_PATH | | server/config.js |
| OpenVibe.VIP | VIP_JOBS | | server/config.js |
| OpenVibe.VIP | VIP_JOBS | | server/config.js |
+| OpenVibe.VIP | VIP_LIMITS_HOUR | | server/config.js |
+| OpenVibe.VIP | VIP_LIMITS_MINUTE | | server/config.js |
| OpenVibe.VIP | VIP_MEMBER_COUNT_TTL_MS | | server/config.js |
| OpenVibe.VIP | VIP_MEMBER_COUNT_TTL_MS | | server/config.js |
| OpenVibe.VIP | VIP_POWERCHAT_LINK_TEMPLATE | | server/config.js |
| OpenVibe.VIP | VIP_POWERCHAT_LINK_TEMPLATE | | server/config.js |
| OpenVibe.VIP | VIP_PROJECTION_GRACE_MS | | server/config.js |
| OpenVibe.VIP | VIP_PROJECTION_GRACE_MS | | server/config.js |
@@ -1336,6 +1403,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1336,6 +1403,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Wiki | OV_OAUTH_CLIENT_ID | wiki.env | server/config.js |
| OpenVibe.Wiki | OV_OAUTH_CLIENT_ID | wiki.env | server/config.js |
| OpenVibe.Wiki | OV_OAUTH_REDIRECT_URI | | server/config.js |
| OpenVibe.Wiki | OV_OAUTH_REDIRECT_URI | | server/config.js |
| OpenVibe.Wiki | OV_SOURCES_INTERNAL_URL | wiki.env | server/config.js |
| OpenVibe.Wiki | OV_SOURCES_INTERNAL_URL | wiki.env | server/config.js |
+| OpenVibe.Wiki | OV_VIP_INTERNAL_URL | | server/config.js |
+| OpenVibe.Wiki | OV_VIP_URL | | server/config.js |
| OpenVibe.Wiki | PORT | | server/config.js |
| OpenVibe.Wiki | PORT | | server/config.js |
| OpenVibe.Wiki | RELEASE_AT | | OpenVibe.Shared/release.js |
| OpenVibe.Wiki | RELEASE_AT | | OpenVibe.Shared/release.js |
| OpenVibe.Wiki | RELEASE_COMMIT | | OpenVibe.Shared/release.js |
| OpenVibe.Wiki | RELEASE_COMMIT | | OpenVibe.Shared/release.js |
@@ -1345,8 +1414,14 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
@@ -1345,8 +1414,14 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Wiki | WIKI_GATE_MIN_SOURCES | | server/config.js |
| OpenVibe.Wiki | WIKI_GATE_MIN_SOURCES | | server/config.js |
| OpenVibe.Wiki | WIKI_GATE_MIN_WORDS | | server/config.js |
| OpenVibe.Wiki | WIKI_GATE_MIN_WORDS | | server/config.js |
| OpenVibe.Wiki | WIKI_GATE_REQUIRE_SOURCES | | server/config.js |
| OpenVibe.Wiki | WIKI_GATE_REQUIRE_SOURCES | | server/config.js |
+| OpenVibe.Wiki | WIKI_LIMITS_HOUR | | server/config.js |
+| OpenVibe.Wiki | WIKI_LIMITS_MINUTE | | server/config.js |
| OpenVibe.Wiki | WIKI_MEDIA_APP | wiki.env | server/config.js |
| OpenVibe.Wiki | WIKI_MEDIA_APP | wiki.env | server/config.js |
| OpenVibe.Wiki | WIKI_MEDIA_VERIFY_INTERVAL_MS | | server/config.js |
| OpenVibe.Wiki | WIKI_MEDIA_VERIFY_INTERVAL_MS | | server/config.js |
| OpenVibe.Wiki | WIKI_SCHEDULE_INTERVAL_MS | | server/config.js |
| OpenVibe.Wiki | WIKI_SCHEDULE_INTERVAL_MS | | server/config.js |
| OpenVibe.Wiki | WIKI_USER_AUDIENCES | | server/config.js |
| OpenVibe.Wiki | WIKI_USER_AUDIENCES | | server/config.js |
+| OpenVibe.Wiki | WIKI_VIP_CACHE_DENY_TTL_MS | | server/config.js |
+| OpenVibe.Wiki | WIKI_VIP_CACHE_TTL_MS | | server/config.js |
+| OpenVibe.Wiki | WIKI_VIP_CACHE_UNAVAILABLE_TTL_MS | | server/config.js |
+| OpenVibe.Wiki | WIKI_VIP_TIMEOUT_MS | | server/config.js |
| OpenVibe.Wiki | WIKI_WORKER_ID | | server/config.js |
| OpenVibe.Wiki | WIKI_WORKER_ID | | server/config.js |
@@ -8,21 +8,21 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r
@@ -8,21 +8,21 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r
| Current owner | Tables | Stay | Staged copy | Moved (mirror left) | To move | Frozen legacy | Investigate |
| Current owner | Tables | Stay | Staged copy | Moved (mirror left) | To move | Frozen legacy | Investigate |
|---|---|---|---|---|---|---|---|
|---|---|---|---|---|---|---|---|
-| OpenVibe.Live | 122 | 31 | 2 | 15 | 70 | 6 | 0 |
-| OpenVibe.Network | 60 | 57 | 0 | 0 | 3 | 0 | 0 |
+| OpenVibe.Live | 126 | 35 | 2 | 15 | 70 | 6 | 0 |
+| OpenVibe.Network | 78 | 75 | 0 | 0 | 3 | 0 | 0 |
| OpenVibe.Shared | 2 | 2 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Shared | 2 | 2 | 0 | 0 | 0 | 0 | 0 |
-| OpenVibe.Media | 31 | 26 | 0 | 0 | 0 | 3 | 2 |
-| OpenVibe.Tools | 13 | 13 | 0 | 0 | 0 | 0 | 0 |
-| OpenVibe.Community | 36 | 35 | 0 | 0 | 0 | 0 | 1 |
-| OpenVibe.Games | 14 | 13 | 0 | 0 | 0 | 0 | 1 |
+| OpenVibe.Media | 37 | 32 | 0 | 0 | 0 | 3 | 2 |
+| OpenVibe.Tools | 14 | 14 | 0 | 0 | 0 | 0 | 0 |
+| OpenVibe.Community | 38 | 37 | 0 | 0 | 0 | 0 | 1 |
+| OpenVibe.Games | 15 | 14 | 0 | 0 | 0 | 0 | 1 |
| OpenVibe.Sites | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Sites | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-| OpenVibe.Events | 7 | 7 | 0 | 0 | 0 | 0 | 0 |
-| OpenVibe.Chat | 41 | 35 | 6 | 0 | 0 | 0 | 0 |
+| OpenVibe.Events | 8 | 8 | 0 | 0 | 0 | 0 | 0 |
+| OpenVibe.Chat | 42 | 36 | 6 | 0 | 0 | 0 | 0 |
| OpenRe.Stream | 14 | 14 | 0 | 0 | 0 | 0 | 0 |
| OpenRe.Stream | 14 | 14 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Billing | 19 | 19 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Billing | 19 | 19 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Tips | 19 | 19 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Tips | 19 | 19 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.VIP | 15 | 15 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.VIP | 15 | 15 | 0 | 0 | 0 | 0 | 0 |
-| OpenVibe.AI | 19 | 19 | 0 | 0 | 0 | 0 | 0 |
+| OpenVibe.AI | 20 | 20 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Search | 21 | 21 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Search | 21 | 21 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Sources | 8 | 8 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Sources | 8 | 8 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Wiki | 22 | 22 | 0 | 0 | 0 | 0 | 0 |
| OpenVibe.Wiki | 22 | 22 | 0 | 0 | 0 | 0 | 0 |
@@ -2,26 +2,53 @@
@@ -2,26 +2,53 @@
> 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-26 13:29 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.
+Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-28 03:25 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.
| Severity | Area | Subject | Detail |
| Severity | Area | Subject | Detail |
|---|---|---|---|
|---|---|---|---|
-| medium | deploy | live | deployed 9f7f36c is 61 commit(s) behind origin/main 8caa540 |
+| medium | deploy | ai | deployed 549bed0 is 1 commit(s) behind origin/main 6c8b833 |
+| medium | deploy | billing | deployed 80f97aa is 1 commit(s) behind origin/main f24684b |
+| medium | deploy | blog | deployed 21d537c is 1 commit(s) behind origin/main 8a7f8eb |
+| medium | deploy | chat | deployed 3aab730 is 1 commit(s) behind origin/main d87c8d3 |
+| medium | deploy | codes | deployed d78de70 is 1 commit(s) behind origin/main 7d6f65a |
+| medium | deploy | community | deployed 52d923a is 1 commit(s) behind origin/main 2da3501 |
+| medium | deploy | coupons | deployed 64835d2 is 1 commit(s) behind origin/main b91cd79 |
+| medium | deploy | deals | deployed fa0582d is 1 commit(s) behind origin/main 533450f |
+| medium | deploy | events | deployed f55f7eb is 1 commit(s) behind origin/main 19919ec |
+| medium | deploy | games | deployed 51d8688 is 1 commit(s) behind origin/main eb2d008 |
+| medium | deploy | host | deployed 2b63389 is 2 commit(s) behind origin/main 6d2aaaa |
+| medium | deploy | live | deployed 9f7f36c is 120 commit(s) behind origin/main 03f49b7 |
+| medium | deploy | media | deployed 6248363 is 1 commit(s) behind origin/main 14cac06 |
+| medium | deploy | network | deployed ddd87b6 is 1 commit(s) behind origin/main 5a50c12 |
+| medium | deploy | news | deployed 8ab47a6 is 1 commit(s) behind origin/main 97dae43 |
+| medium | deploy | openre | deployed cf423e3 is 1 commit(s) behind origin/main c77ec2a |
+| medium | deploy | reviews | deployed 1cff36b is 1 commit(s) behind origin/main c87b344 |
+| medium | deploy | search | deployed 8ed7667 is 1 commit(s) behind origin/main e8511d8 |
+| medium | deploy | sites | deployed 32464ec is 1 commit(s) behind origin/main 304e8b1 |
+| medium | deploy | sources | deployed 351383e is 1 commit(s) behind origin/main 1670853 |
+| medium | deploy | tips | deployed 1e6bfbb is 1 commit(s) behind origin/main 13986b5 |
+| medium | deploy | tools | deployed e55469f is 1 commit(s) behind origin/main 4f4ed6e |
+| medium | deploy | trade | deployed 4658447 is 1 commit(s) behind origin/main 273bce7 |
+| medium | deploy | vip | deployed 0fbcbb5 is 1 commit(s) behind origin/main 95b3e19 |
+| medium | deploy | wiki | deployed 32a26ef is 1 commit(s) behind origin/main 3302540 |
| low | database | /opt/openvibe.blog/data/blog.db | 401 KB, 20 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.blog/data/blog.db | 401 KB, 20 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.community/data/community.db | 258 KB, 21 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.community/data/community.db | 258 KB, 21 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.games/data/legacy-import/world-before-20260923T184930Z.db | 193 KB, 13 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.games/data/legacy-import/world-before-20260923T184930Z.db | 193 KB, 13 tables, not a database the service opens (services.json): stale file or undeclared copy |
-| low | database | /opt/openvibe.live/shared/data/analytics.db | 518.0 MB, 6 tables, not a database the service opens (services.json): stale file or undeclared copy |
+| low | database | /opt/openvibe.live/shared/data/analytics.db | 525.4 MB, 6 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.live/shared/data/backups/analytics-pre-adr021-2026-09-23.db | 1.76 GB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.live/shared/data/backups/analytics-pre-adr021-2026-09-23.db | 1.76 GB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.live/shared/data/backups/live-20260926-072748.db | 284.0 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.live/shared/data/backups/live-20260926-072748.db | 284.0 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.live/shared/data/backups/live-20260926-095352.db | 284.0 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.live/shared/data/backups/live-20260926-095352.db | 284.0 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.live/shared/data/backups/live-pre-643a2e6.db | 264.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.live/shared/data/backups/live-pre-643a2e6.db | 264.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
+| low | database | /opt/openvibe.live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db | 284.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.live/shared/data/hobo.db | 0 B, zero tables (dead file) |
| low | database | /opt/openvibe.live/shared/data/hobo.db | 0 B, zero tables (dead file) |
| low | database | /opt/openvibe.live/shared/data/live-before-rs-slots-20260924T0153Z.db | 279.2 MB, 151 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.live/shared/data/live-before-rs-slots-20260924T0153Z.db | 279.2 MB, 151 tables, not a database the service opens (services.json): stale file or undeclared copy |
-| low | database | /opt/openvibe.live/shared/data/live.db | 284.1 MB, 161 tables, not a database the service opens (services.json): stale file or undeclared copy |
+| low | database | /opt/openvibe.live/shared/data/live.db | 284.7 MB, 162 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.live/shared/data/openvibe.db | 0 B, zero tables (dead file) |
| low | database | /opt/openvibe.live/shared/data/openvibe.db | 0 B, zero tables (dead file) |
| low | database | /opt/openvibe.live/shared/data/rs-companion.db | 8.6 MB, 33 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.live/shared/data/rs-companion.db | 8.6 MB, 33 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.media/data/backups/owner-subject-20260923.media.db | 9.5 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.media/data/backups/owner-subject-20260923.media.db | 9.5 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.media/data/reports/h15-repair-applied-20260925.media.db | 11.3 MB, 27 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.media/data/reports/h15-repair-applied-20260925.media.db | 11.3 MB, 27 tables, not a database the service opens (services.json): stale file or undeclared copy |
+| low | database | /opt/openvibe.network/data/backups/network-pre-creator-analytics-20260926.db | 292.4 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
+| low | database | /opt/openvibe.network/data/backups/network-pre-follows-20260926.db | 292.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.network/data/network-pre-refresh-hash-2026-09-24.db | 279.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.network/data/network-pre-refresh-hash-2026-09-24.db | 279.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.network/data/network-pre-secrets-2026-09-24.db | 279.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.network/data/network-pre-secrets-2026-09-24.db | 279.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data |
| low | database | /opt/openvibe.tips/data/tips.db | 4 KB, 15 tables, not a database the service opens (services.json): stale file or undeclared copy |
| low | database | /opt/openvibe.tips/data/tips.db | 4 KB, 15 tables, not a database the service opens (services.json): stale file or undeclared copy |
@@ -69,6 +96,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
@@ -69,6 +96,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
| low | env | OpenVibe.Examples:OV_CLIENT_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.Examples:OV_CLIENT_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.Examples:OV_WEBHOOK_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.Examples:OV_WEBHOOK_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.Examples:OV_WEBHOOK_SECRET_PREVIOUS | 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.Examples:OV_WEBHOOK_SECRET_PREVIOUS | 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.Host:CLOUDFLARE_API_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: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:LIVE_EVENTS_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:LIVE_EVENTS_SECRET | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
@@ -87,7 +115,6 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
@@ -87,7 +115,6 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
| low | env | OpenVibe.Tools:NPS_API_KEY | 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.Tools:NPS_API_KEY | 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.Tools:OPEN_CHARGE_MAP_KEY | 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.Tools:OPEN_CHARGE_MAP_KEY | 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.Tools:OV_INTERNAL_KEY | 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.Tools:OV_INTERNAL_KEY | 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.Tools:RIDB_API_KEY | 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.Trade:TRADE_EVENTS_WEBHOOK_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.Trade:TRADE_EVENTS_WEBHOOK_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 | schema | OpenVibe.Community:token_revocations | in production (community.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
| low | schema | OpenVibe.Community:token_revocations | in production (community.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
| low | schema | OpenVibe.Games:token_revocations | in production (world.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
| low | schema | OpenVibe.Games:token_revocations | in production (world.db) but no CREATE TABLE in the repo; classified investigate -> ? (Exists in a production database but no CREATE TABLE in the repo.) |
@@ -145,6 +172,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
@@ -145,6 +172,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
| info | schema | OpenVibe.Deals:idempotency_receipts | in production (deals.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Deals (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
| info | schema | OpenVibe.Deals:idempotency_receipts | in production (deals.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Deals (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
| info | schema | OpenVibe.Games:event_outbox | in production (world.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Games (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
| info | schema | OpenVibe.Games:event_outbox | in production (world.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Games (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
| info | schema | OpenVibe.Host:event_outbox | in production (host.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Host (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
| info | schema | OpenVibe.Host:event_outbox | in production (host.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Host (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
+| info | schema | OpenVibe.Live:account_data_events | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:ai_chatbot_configs | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:ai_chatbot_configs | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:ai_timeline_cache | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:ai_timeline_cache | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:ai_usage | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:ai_usage | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
@@ -204,10 +232,12 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
@@ -204,10 +232,12 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
| info | schema | OpenVibe.Live:easter_egg_solves | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:easter_egg_solves | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:emotes | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:emotes | 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) |
+| info | schema | OpenVibe.Live:follow_projection_revisions | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:follows | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:follows | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:hidden_relay_users | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:hidden_relay_users | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:ip_log | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:ip_log | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:kick_channel_cache | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:kick_channel_cache | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
+| info | schema | OpenVibe.Live:lineage_unresolved | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:linked_accounts | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:linked_accounts | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:managed_streams | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:managed_streams | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:media_request_settings | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:media_request_settings | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
@@ -242,6 +272,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
@@ -242,6 +272,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
| info | schema | OpenVibe.Live:stream_timeline_events | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:stream_timeline_events | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:streamer_overviews | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:streamer_overviews | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:streams | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:streams | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
+| info | schema | OpenVibe.Live:subject_merges | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:subject_projection | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:subject_projection | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:subscriptions | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:subscriptions | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:themes | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:themes | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
@@ -268,6 +299,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
@@ -268,6 +299,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
| info | schema | OpenVibe.Live:vpn_approvals | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:vpn_approvals | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:watch_time | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:watch_time | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Media:event_outbox | in production (media.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Media (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
| info | schema | OpenVibe.Media:event_outbox | in production (media.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Media (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.) |
+| info | schema | OpenVibe.Media:subject_merges | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Network:admin_rate_limits | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Network:admin_rate_limits | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Network:analytics_daily | in production (network.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Network (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) |
| info | schema | OpenVibe.Network:analytics_daily | in production (network.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Network (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) |
| info | schema | OpenVibe.Network:analytics_day_salts | in production (network.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Network (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) |
| info | schema | OpenVibe.Network:analytics_day_salts | in production (network.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Network (Per-site analytics from openvibe-shared/analytics.js; ADR-021 (2026-09-23): no IP, user id or city stored, raw rows pruned (hazard H11).) |
@@ -341,8 +373,13 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
@@ -341,8 +373,13 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-26 13:29 UTC compared w
| info | schema | OpenVibe.Wiki:wiki_page_revision_purges | in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) |
| info | schema | OpenVibe.Wiki:wiki_page_revision_purges | in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) |
| info | schema | OpenVibe.Wiki:wiki_page_revisions | in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) |
| info | schema | OpenVibe.Wiki:wiki_page_revisions | in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) |
| info | schema | OpenVibe.Wiki:wiki_schedule_jobs | in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) |
| info | schema | OpenVibe.Wiki:wiki_schedule_jobs | in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).) |
+| info | units | openvibe-alerts.service | unit not listed in services.json |
+| info | units | openvibe-alerts.timer | unit not listed in services.json |
+| info | units | openvibe-browsercheck.service | unit not listed in services.json |
+| info | units | openvibe-browsercheck.timer | unit not listed in services.json |
| info | units | openvibe-devpath.service | unit not listed in services.json |
| info | units | openvibe-devpath.service | unit not listed in services.json |
| info | units | openvibe-devpath.timer | unit not listed in services.json |
| info | units | openvibe-devpath.timer | unit not listed in services.json |
+| info | units | openvibe-llm.service | unit not listed in services.json |
| info | units | openvibe-toolsjob.service | unit not listed in services.json |
| info | units | openvibe-toolsjob.service | unit not listed in services.json |
| info | units | openvibe-toolsjob.timer | unit not listed in services.json |
| info | units | openvibe-toolsjob.timer | unit not listed in services.json |
| unknown | host | powerchat.gg, raspi/hobo.tools (LAN) | unreachable from this environment; state not verified |
| unknown | host | powerchat.gg, raspi/hobo.tools (LAN) | unreachable from this environment; state not verified |
@@ -10,23 +10,23 @@ Deliverable 8, derived from the [requirement ledger](requirement-ledger.md) (as
@@ -10,23 +10,23 @@ Deliverable 8, derived from the [requirement ledger](requirement-ledger.md) (as
| D02-D04 | Registry, capabilities, contracts | absent | **partial** | D02 partial, D03 partial, D04 partial | W1, W2 | yes | 1 charter-only repos of 36; Live 14, Network 3, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0 |
| D02-D04 | Registry, capabilities, contracts | absent | **partial** | D02 partial, D03 partial, D04 partial | W1, W2 | yes | 1 charter-only repos of 36; Live 14, Network 3, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0 |
| D05-D06 | Policy, staff, user modules | partial | **partial** | D05 partial, D06 partial | W1, W2 | yes | - |
| D05-D06 | Policy, staff, user modules | partial | **partial** | D05 partial, D06 partial | W1, W2 | yes | - |
| D07-D10 | Themes, notifications, social, analytics | partial | **partial** | D07 partial, D08 partial, D09 partial, D10 partial | W1, W2, Track O | yes | 2 repos carry their own analytics_events |
| D07-D10 | Themes, notifications, social, analytics | partial | **partial** | D07 partial, D08 partial, D09 partial, D10 partial | W1, W2, Track O | yes | 2 repos carry their own analytics_events |
-| D11-D13 | Events, realtime, SDK | absent | **partial** | D11 met, D12 partial, D13 partial | W2, W3 | yes | 107 caller-file/target pairs across 76 files; 12 WebSocket server constructions |
+| D11-D13 | Events, realtime, SDK | absent | **partial** | D11 met, D12 partial, D13 partial | W2, W3 | yes | 112 caller-file/target pairs across 82 files; 12 WebSocket server constructions |
| D14-D16 | Media | partial | **partial** | D14 partial, D15 partial, D16 partial | W4 | yes | 3 Media tables target OpenVibe.Community |
| D14-D16 | Media | partial | **partial** | D14 partial, D15 partial, D16 partial | W4 | yes | 3 Media tables target OpenVibe.Community |
-| D17-D20 | Live, OpenRe, channel/VOD lineage | partial | **partial** | D17 partial, D18 blocked on owner, D19 partial, D20 partial | W7 | yes | 14 Live tables target OpenRe.Stream; 19 test files |
-| D21-D23 | Chat | partial | **partial** | D21 partial, D22 partial, D23 partial | W6 | yes | 25 Live tables target OpenVibe.Chat; 35 test files |
-| D24-D27 | Community | partial | **partial** | D24 partial, D25 met, D26 partial, D27 met | W5 | yes | 33 tables; 4 Live tables target OpenVibe.Community |
-| D28-D30 | Billing, Tips, VIP | partial | **blocked on owner** | D28 blocked on owner, D29 blocked on owner, D30 blocked on owner | W8-W10 (ADR-012 first) | yes | 2 Live tables target OpenVibe.Billing; 21 test files |
-| D31 | Tools | built | **partial** | D31 partial | W11 | yes | 49 test files |
-| D32 | Games | built | **partial** | D32 partial | W12 | yes | 76 test files |
-| D33-D34 | Codes, Host | absent | **partial** | D33 partial, D34 partial | W20, W21 | yes | 27 test files; 38 test files |
-| D35-D38 | AI, content, sources, search | partial | **partial** | D35 partial, D36 blocked on owner, D37 blocked on owner, D38 blocked on owner | W13-W15 | yes | 14 Live tables target OpenVibe.AI; 20 test files |
+| D17-D20 | Live, OpenRe, channel/VOD lineage | partial | **partial** | D17 partial, D18 blocked on owner, D19 partial, D20 partial | W7 | yes | 14 Live tables target OpenRe.Stream; 21 test files |
+| D21-D23 | Chat | partial | **partial** | D21 partial, D22 partial, D23 partial | W6 | yes | 25 Live tables target OpenVibe.Chat; 48 test files |
+| D24-D27 | Community | partial | **partial** | D24 partial, D25 met, D26 partial, D27 met | W5 | yes | 35 tables; 4 Live tables target OpenVibe.Community |
+| D28-D30 | Billing, Tips, VIP | partial | **blocked on owner** | D28 blocked on owner, D29 blocked on owner, D30 blocked on owner | W8-W10 (ADR-012 first) | yes | 2 Live tables target OpenVibe.Billing; 22 test files |
+| D31 | Tools | built | **partial** | D31 partial | W11 | yes | 61 test files |
+| D32 | Games | built | **partial** | D32 partial | W12 | yes | 82 test files |
+| D33-D34 | Codes, Host | absent | **partial** | D33 partial, D34 partial | W20, W21 | yes | 34 test files; 48 test files |
+| D35-D38 | AI, content, sources, search | partial | **partial** | D35 partial, D36 blocked on owner, D37 blocked on owner, D38 blocked on owner | W13-W15 | yes | 14 Live tables target OpenVibe.AI; 26 test files |
| D39 | Mods | absent | **partial** | D39 partial | W12, W21 | yes | - |
| D39 | Mods | absent | **partial** | D39 partial | W12, W21 | yes | - |
-| D40 | Open developer services | absent | **partial** | D40 partial | W20, W21 | yes | 40 of 107 call sites authenticate with the shared internal key |
+| D40 | Open developer services | absent | **partial** | D40 partial | W20, W21 | yes | 40 of 112 call sites authenticate with the shared internal key |
| D41 | Independent runtime lifecycle | partial | **partial** | D41 partial | W7, W21 | yes | - |
| D41 | Independent runtime lifecycle | partial | **partial** | D41 partial | W7, W21 | yes | - |
-| D42 | Shared component architecture | partial | **partial** | D42 partial | W2, Track R | yes | 24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0; 0 manifests unpinned or behind: none |
+| D42 | Shared component architecture | partial | **partial** | D42 partial | W2, Track R | yes | 25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0; 31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0) |
| D43 | Safe active-client updates | absent | **partial** | D43 partial | Track R | yes | - |
| D43 | Safe active-client updates | absent | **partial** | D43 partial | Track R | yes | - |
| D44 | Crawlable component rendering | built | **partial** | D44 partial | Track R (preserve) | yes | - |
| D44 | Crawlable component rendering | built | **partial** | D44 partial | Track R (preserve) | yes | - |
-| D45 | Release compatibility and recovery | absent | **partial** | D45 partial | Track R, W22 | yes | 1 service(s) not running origin/main |
+| D45 | Release compatibility and recovery | absent | **partial** | D45 partial | Track R, W22 | yes | 25 service(s) not running origin/main |
| D46 | Update observability and acceptance | absent | **partial** | D46 partial | Track R, Track O | yes | 27 of 27 scanned repos have .github/workflows |
| D46 | Update observability and acceptance | absent | **partial** | D46 partial | Track R, Track O | yes | 27 of 27 scanned repos have .github/workflows |
Families: 0 met, 21 partial, 0 not met, 1 blocked on owner (of 22). Requirements: 3 met, 36 partial, 0 not met, 7 blocked on owner (of 46); 46 verified. At Wave 0 the same 22 families were 3 built, 11 partial, 8 absent.
Families: 0 met, 21 partial, 0 not met, 1 blocked on owner (of 22). Requirements: 3 met, 36 partial, 0 not met, 7 blocked on owner (of 46); 46 verified. At Wave 0 the same 22 families were 3 built, 11 partial, 8 absent.
@@ -47,7 +47,7 @@ Families: 0 met, 21 partial, 0 not met, 1 blocked on owner (of 22). Requirements
@@ -47,7 +47,7 @@ Families: 0 met, 21 partial, 0 not met, 1 blocked on owner (of 22). Requirements
- **D32 Games** (partial). D32: The browser Games runtime uses Network identity, a transactional outbox to Events (73 games events in the store), the Contracts mod manifest (mod-manifest.v1.json, ADR-013) and a grant/revoke runtime seam. The Live HoboQuest legacy import is applied: 616 rows archived in legacy_live_rows. In production (2026-09-23 20:20 UTC) there are 0 mods, 0 grants and 0 Media mirrors. Executable (Source/QuickJS) mods are refused until Host Stage C, and Source.OpenVibe.Games has no adapters.
- **D32 Games** (partial). D32: The browser Games runtime uses Network identity, a transactional outbox to Events (73 games events in the store), the Contracts mod manifest (mod-manifest.v1.json, ADR-013) and a grant/revoke runtime seam. The Live HoboQuest legacy import is applied: 616 rows archived in legacy_live_rows. In production (2026-09-23 20:20 UTC) there are 0 mods, 0 grants and 0 Media mirrors. Executable (Source/QuickJS) mods are refused until Host Stage C, and Source.OpenVibe.Games has no adapters.
- **D33-D34 Codes, Host** (partial). D33: openvibe.codes is the real portal, not a Sites placeholder (release d60f279 at 20:21 UTC). It has docs generated from the pinned contracts and SDK, a credential scope editor with rotate and revoke, Media and Events playgrounds bound to project grants, a webhook tester for signature v2, and project export and delete. Production holds 0 manifests, 0 releases and 0 playground runs. The committed developer-path check (Examples 919d26b) runs only against the SDK mock and has not been run on production. Realtime, Billing-sandbox and Chat-bot playgrounds and usage/trace dashboards do not exist. D34: Stage A (the operator plane) is used in production. A manual `ovhost backup --all --offsite` at 18:47 UTC covered 24 services, including live, media and games, with the off-host copy ok, and openvibe-backup.timer is active (first scheduled run 2026-09-24 03:36 UTC). 20 restore drills are recorded, and the D41 proof passed on production for sources at 20:09 UTC. Stage B (isolated static hosting) is proven in tests only: openvibe.host serves the Sites placeholder, *.openvibe.host answers 404 and there are 0 projects. Stage C has not started, and most services still deploy with their own scripts.
- **D33-D34 Codes, Host** (partial). D33: openvibe.codes is the real portal, not a Sites placeholder (release d60f279 at 20:21 UTC). It has docs generated from the pinned contracts and SDK, a credential scope editor with rotate and revoke, Media and Events playgrounds bound to project grants, a webhook tester for signature v2, and project export and delete. Production holds 0 manifests, 0 releases and 0 playground runs. The committed developer-path check (Examples 919d26b) runs only against the SDK mock and has not been run on production. Realtime, Billing-sandbox and Chat-bot playgrounds and usage/trace dashboards do not exist. D34: Stage A (the operator plane) is used in production. A manual `ovhost backup --all --offsite` at 18:47 UTC covered 24 services, including live, media and games, with the off-host copy ok, and openvibe-backup.timer is active (first scheduled run 2026-09-24 03:36 UTC). 20 restore drills are recorded, and the D41 proof passed on production for sources at 20:09 UTC. Stage B (isolated static hosting) is proven in tests only: openvibe.host serves the Sites placeholder, *.openvibe.host answers 404 and there are 0 projects. Stage C has not started, and most services still deploy with their own scripts.
- **D35-D38 AI, content, sources, search** (partial). D35: OpenVibe.AI is the AI authority for Live and Network. At 2026-09-23 20:19 UTC it held 421 runs (419 from Live, 2 network.site_copy) and 546 audit rows. The Live import was applied (79,657 ledger rows, 11 holds), and Network no longer falls back to Live's site-copy route (31b234a, 0a115f6). Still missing: 0 citation rows, none of the 19 active routes declares a fallback, captions/whisper and streamers' own keys remain in Live, no product (News, Blog, Wiki and so on) has run a workflow in production, and ai.openvibe.network is a Sites placeholder. D36: Sources has a registry with terms and robots notes, conditional-GET ingestion with provenance and revisions, explicit failure states, robots and SSRF refusal, /metrics and an honest public page. All of this is proven in tests. At 2026-09-23 20:19 UTC all 6 seed sources are disabled, with 0 fetch runs and 0 items, so no real source has ever been ingested. D37: The index-document contract and an event-fed, ACL-filtered SQLite FTS5 Search are tested for leaks, revision order, tombstones and CDN purge. search.openvibe.network has served a public search page since 2026-09-23 (HTML 200 at 20:19 UTC). The production index holds 10 documents, all wiki tombstones (0 public or restricted indexed), so no content document has ever been indexed. The removal purge is inert because CLOUDFLARE_PURGE_TOKEN is not set. D38: The shared runtime (drafts and revisions, scheduling, the SEO/indexability gate, citations, index hooks, authorship) is tested and pinned at v0.2.1 by all seven products. Wiki and Blog are public (no placeholder at 20:19 UTC). Nothing is published yet. Wiki has 10 pages with 0 reviews (all noindex), and Blog has 1 post, a draft. News, Reviews, Deals, Coupons and Trade still serve the Sites placeholder over empty databases (0 stories, entities, offers, coupons and instruments).
- **D35-D38 AI, content, sources, search** (partial). D35: OpenVibe.AI is the AI authority for Live and Network. At 2026-09-23 20:19 UTC it held 421 runs (419 from Live, 2 network.site_copy) and 546 audit rows. The Live import was applied (79,657 ledger rows, 11 holds), and Network no longer falls back to Live's site-copy route (31b234a, 0a115f6). Still missing: 0 citation rows, none of the 19 active routes declares a fallback, captions/whisper and streamers' own keys remain in Live, no product (News, Blog, Wiki and so on) has run a workflow in production, and ai.openvibe.network is a Sites placeholder. D36: Sources has a registry with terms and robots notes, conditional-GET ingestion with provenance and revisions, explicit failure states, robots and SSRF refusal, /metrics and an honest public page. All of this is proven in tests. At 2026-09-23 20:19 UTC all 6 seed sources are disabled, with 0 fetch runs and 0 items, so no real source has ever been ingested. D37: The index-document contract and an event-fed, ACL-filtered SQLite FTS5 Search are tested for leaks, revision order, tombstones and CDN purge. search.openvibe.network has served a public search page since 2026-09-23 (HTML 200 at 20:19 UTC). The production index holds 10 documents, all wiki tombstones (0 public or restricted indexed), so no content document has ever been indexed. The removal purge is inert because CLOUDFLARE_PURGE_TOKEN is not set. D38: The shared runtime (drafts and revisions, scheduling, the SEO/indexability gate, citations, index hooks, authorship) is tested and pinned at v0.2.1 by all seven products. Wiki and Blog are public (no placeholder at 20:19 UTC). Nothing is published yet. Wiki has 10 pages with 0 reviews (all noindex), and Blog has 1 post, a draft. News, Reviews, Deals, Coupons and Trade still serve the Sites placeholder over empty databases (0 stories, entities, offers, coupons and instruments).
-- **D39 Mods** (partial). D39: The mod manifest (Contracts mods/mod-manifest.v1, ADR-013 accepted 2026-09-23) and a Games-local registry are tested: grants are the approved subset, installs and grants are audited, and revoking a mod removes its effect on the next tick and across a restart. Only declarative games-content packs run. Executable runtimes are refused, and the CPU budget is metered and audited but not enforced. Network's mods.grant.manage capability is still `planned`, and on 2026-09-23 at 20:22 UTC production world.db held 0 mods, 0 grants and 0 audit rows.
+- **D39 Mods** (partial). D39: The mod manifest (Contracts mods/mod-manifest.v1, ADR-013) and the Games registry are tested. Since 2026-09-27 every install is a Network principal mod:<id> whose grants Network holds (mods.grant.manage active; Games asks Network first, and network.mod.grants_changed keeps its copy current). The budget is enforced: 5 reconciles over cpuMs, or 3 minutes over 60 effects a minute, disable only the offending mod. Security tests cover namespace escape, event flood, resource budget and forged ownership. One production install -> grant -> use -> revoke run is recorded. Only declarative games-content packs run; executable runtimes wait for Host Stage C.
- **D40 Open developer services** (partial). D40: Tests cover each part: developer projects, sandbox apps, scoped app credentials and grants (Network /api/v1/projects); per-project Media tenants with byte quotas; Events app events with publish-rate and retained-bytes quotas; Tools jobs for app principals; and the SDK clients. The path ran once on production (dev_projects: one project created 2026-09-23 04:30 UTC, now archived). Its committed, repeatable version (Examples 919d26b, npm run developer-path) runs in CI only against the SDK mock and has never run against production. Codes production holds 0 manifests, 0 releases and 0 playground runs.
- **D40 Open developer services** (partial). D40: Tests cover each part: developer projects, sandbox apps, scoped app credentials and grants (Network /api/v1/projects); per-project Media tenants with byte quotas; Events app events with publish-rate and retained-bytes quotas; Tools jobs for app principals; and the SDK clients. The path ran once on production (dev_projects: one project created 2026-09-23 04:30 UTC, now archived). Its committed, repeatable version (Examples 919d26b, npm run developer-path) runs in CI only against the SDK mock and has never run against production. Codes production holds 0 manifests, 0 releases and 0 playground runs.
- **D41 Independent runtime lifecycle** (partial). D41: The production ovhost inventory has 25 services. 24 declare a loopback readiness URL. Drain policies and protected-session probes are declared for Live, Media and Events, along with worker units and databases. Deploy and rollback with readiness polling, auto-rollback and --wait-idle are tested. The D41 proof passed on production at 20:09 UTC on 2026-09-23: sources was deployed, rolled back and redeployed, and the 37 other units were identical. Gaps: shutdown deadlines, liveness, startup recovery and rollback conditions are not declared; the proof covers only one low-risk service; and Live still runs the in-place layout, where rollback is refused (C-76).
- **D41 Independent runtime lifecycle** (partial). D41: The production ovhost inventory has 25 services. 24 declare a loopback readiness URL. Drain policies and protected-session probes are declared for Live, Media and Events, along with worker units and databases. Deploy and rollback with readiness polling, auto-rollback and --wait-idle are tested. The D41 proof passed on production at 20:09 UTC on 2026-09-23: sources was deployed, rolled back and redeployed, and the 37 other units were identical. Gaps: shutdown deadlines, liveness, startup recovery and rollback conditions are not declared; the proof covers only one low-risk service; and Live still runs the in-place layout, where rollback is refused (C-76).
- **D42 Shared component architecture** (partial). D42: openvibe-shared is released by semver tags. v1.4.0 was released at 19:38 UTC on 2026-09-23, and its last 3 CI runs are green. The package has explicit subpath exports and a check that browser files carry no server-only code, and 24 consuming repositories pin a tag (21 of them v1.3.0). The browser files are not versioned per consumer, though: Community, Wiki, Codes and Tools pages load https://openvibe.network/shared/navbar.js with no hash (max-age=300), which is whatever release Network pins. The one-package decision (Shared ADR 0001) is only proposed.
- **D42 Shared component architecture** (partial). D42: openvibe-shared is released by semver tags. v1.4.0 was released at 19:38 UTC on 2026-09-23, and its last 3 CI runs are green. The package has explicit subpath exports and a check that browser files carry no server-only code, and 24 consuming repositories pin a tag (21 of them v1.3.0). The browser files are not versioned per consumer, though: Community, Wiki, Codes and Tools pages load https://openvibe.network/shared/navbar.js with no hash (max-age=300), which is whatever release Network pins. The one-package decision (Shared ADR 0001) is only proposed.
@@ -12,14 +12,14 @@ Deliverable 9. **Not yet reviewed by the production-host owner** (Wave 0 exit cr
@@ -12,14 +12,14 @@ Deliverable 9. **Not yet reviewed by the production-host owner** (Wave 0 exit cr
| H4 | managed_streams.stream_key values still need rotation after a past leak | high | partial | **needed** | Live maintainers (security track S) | W7 (openre.key.rotate) - or earlier as a standalone rotation | The one key committed to a repository (in Live's control-bridge example since ac0d6a47) was rotated on 2026-09-23 and replaced by a placeholder, with the commit allow-listed in the secret scan. The leaked slot keys are rotated per slot at its OpenRe cutover (ADR-009, openre.key.rotate), or by a standalone rotation in Live if the cutover slips. | - |
| H4 | managed_streams.stream_key values still need rotation after a past leak | high | partial | **needed** | Live maintainers (security track S) | W7 (openre.key.rotate) - or earlier as a standalone rotation | The one key committed to a repository (in Live's control-bridge example since ac0d6a47) was rotated on 2026-09-23 and replaced by a placeholder, with the commit allow-listed in the secret scan. The leaked slot keys are rotated per slot at its OpenRe cutover (ADR-009, openre.key.rotate), or by a standalone rotation in Live if the cutover slips. | - |
| H5 | Multilingual Whisper model missing breaks non-English captions | medium | mitigated | - | Live maintainers | - | Install the model and set WHISPER_MODEL_MULTI in live.env. | WHISPER_MODEL_MULTI is set in live.env |
| H5 | Multilingual Whisper model missing breaks non-English captions | medium | mitigated | - | Live maintainers | - | Install the model and set WHISPER_MODEL_MULTI in live.env. | WHISPER_MODEL_MULTI is set in live.env |
| H6 | YouTube refuses the server IP; the yt tool needs a proxy | low | blocked-on-owner | **needed** | Platform operator | W11 | Set YT_PROXY and/or YT_COOKIES_FILE for openvibe-tools-yt. | YT_PROXY unset in tools.env |
| H6 | YouTube refuses the server IP; the yt tool needs a proxy | low | blocked-on-owner | **needed** | Platform operator | W11 | Set YT_PROXY and/or YT_COOKIES_FILE for openvibe-tools-yt. | YT_PROXY unset in tools.env |
-| H7 | Workstation root disk near full; headless Chrome can hit ENOSPC | low | open | - | Workstation owner | Track Q | Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB). | workstation / is 97% 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 73% used (at generation time) |
| H8 | A hardcoded internal secret was previously public | high | partial | **needed** | Platform operator (security track S) | W1 (scoped service principals) / Track S | Removed: the hard-coded openvibe-internal-2026 value and the hard-coded quest secret (register C-59, Live e505868). New services use Network-issued service tokens; Network records every legacy-key call per route (principal_usage) and the key-only routes have removal dates (register C-50..C-57). Remaining: rotate INTERNAL_API_KEY in every env file, then retire the key routes by their dates. | - |
| H8 | A hardcoded internal secret was previously public | high | partial | **needed** | Platform operator (security track S) | W1 (scoped service principals) / Track S | Removed: the hard-coded openvibe-internal-2026 value and the hard-coded quest secret (register C-59, Live e505868). New services use Network-issued service tokens; Network records every legacy-key call per route (principal_usage) and the key-only routes have removal dates (register C-50..C-57). Remaining: rotate INTERNAL_API_KEY in every env file, then retire the key routes by their dates. | - |
| H9 | Removed features and copy rules must not be undone | medium | standing-rule | - | Every product wave | all | Product waves check the prohibitions list (roadmap 9.1) before adding copy or campaigns. | - |
| H9 | Removed features and copy rules must not be undone | medium | standing-rule | - | Every product wave | all | Product waves check the prohibitions list (roadmap 9.1) before adding copy or campaigns. | - |
| H10 | Commit identity | medium | partial | **needed** | Every contributor | all | Per-repo git config user.email = [email protected]; every new commit follows it. Older history keeps some assistant trailers. | main history violates the rule in: Live (238 commits with assistant trailers); Network (14 commits with assistant trailers); Media (30 commits with assistant trailers); Tools (9 commits with assistant trailers) |
| H10 | Commit identity | medium | partial | **needed** | Every contributor | all | Per-repo git config user.email = [email protected]; every new commit follows it. Older history keeps some assistant trailers. | main history violates the rule in: Live (238 commits with assistant trailers); Network (14 commits with assistant trailers); Media (30 commits with assistant trailers); Tools (9 commits with assistant trailers) |
-| H11 | analytics_events grows without pruning | medium | mitigated | - | OpenVibe.Shared maintainers (openvibe-shared/analytics.js) | Track O / ADR-021 - before any schema wave touching Live or Network | ADR-021: no IP, user id or city stored; raw analytics events are pruned after 30 days on a schedule in Live (nightly job), Tools (timer) and Network (openvibe-shared analytics retention.schedulePrune since 9bbd90f), rollups kept. | largest analytics stores: live/shared/data/analytics.db 518.0 MB; network/data/network.db 290.3 MB; tools/apps/audio/data/analytics.db 36.6 MB; tools/apps/text/data/analytics.db 5.8 MB |
+| H11 | analytics_events grows without pruning | medium | mitigated | - | OpenVibe.Shared maintainers (openvibe-shared/analytics.js) | Track O / ADR-021 - before any schema wave touching Live or Network | ADR-021: no IP, user id or city stored; raw analytics events are pruned after 30 days on a schedule in Live (nightly job), Tools (timer) and Network (openvibe-shared analytics retention.schedulePrune since 9bbd90f), rollups kept. | largest analytics stores: live/shared/data/analytics.db 525.4 MB; network/data/network.db 302.4 MB; tools/apps/audio/data/analytics.db 36.7 MB; tools/apps/text/data/analytics.db 5.9 MB |
| H12 | No Cloudflare cache-purge step after deploys | low | blocked-on-owner | **needed** | Platform operator | W21 / Track I | Cache Rules "browser_ttl respect_origin" on every openvibe.* zone and openre.stream (2026-09-23) make the edge follow origin max-age; Search has a purge queue that stays inert until a purge-scoped token exists (CLOUDFLARE_PURGE_TOKEN). | CLOUDFLARE_PURGE_TOKEN unset in search.env |
| H12 | No Cloudflare cache-purge step after deploys | low | blocked-on-owner | **needed** | Platform operator | W21 / Track I | Cache Rules "browser_ttl respect_origin" on every openvibe.* zone and openre.stream (2026-09-23) make the edge follow origin max-age; Search has a purge queue that stays inert until a purge-scoped token exists (CLOUDFLARE_PURGE_TOKEN). | CLOUDFLARE_PURGE_TOKEN unset in search.env |
-| H13 | Production drifts from main | medium | open | - | Platform operator | W0 (checklist) / W21 (release manifests) | Deploy or record why each lagging service is held back. | live: deployed 9f7f36c is 61 commit(s) behind origin/main 8caa540 |
-| H14 | Dead and backup database files on the production host | low | open | **needed** | Live maintainers | W0 | Confirm no code opens them, then delete the empty files; move copies (backups, import snapshots, rehearsal databases) to /var/backups/openvibe with a retention date. | blog/data/blog.db, community/data/community.db, games/data/legacy-import/world-before-20260923T184930Z.db, live/shared/data/analytics.db, live/shared/data/backups/analytics-pre-adr021-2026-09-23.db, live/shared/data/backups/live-20260926-072748.db, live/shared/data/backups/live-20260926-095352.db, live/shared/data/backups/live-pre-643a2e6.db, live/shared/data/hobo.db, live/shared/data/live-before-rs-slots-20260924T0153Z.db, live/shared/data/live.db, live/shared/data/openvibe.db, live/shared/data/rs-companion.db, media/data/backups/owner-subject-20260923.media.db, media/data/reports/h15-repair-applied-20260925.media.db, network/data/network-pre-refresh-hash-2026-09-24.db, network/data/network-pre-secrets-2026-09-24.db, tips/data/tips.db, tools/apps/audio/data/guard.db, tools/apps/docs/data/guard.db, tools/apps/food/data/guard.db, tools/apps/gateway/data/guard.db, tools/apps/gateway/data/token-revocations.db, tools/apps/img/data/guard.db, tools/apps/maps/data/guard.db, tools/apps/text/data/guard.db, tools/apps/yt/data/guard.db, tools/backups/analytics-2026-09-23/audio.analytics.db, tools/backups/analytics-2026-09-23/docs.analytics.db, tools/backups/analytics-2026-09-23/food.analytics.db, tools/backups/analytics-2026-09-23/img.analytics.db, tools/backups/analytics-2026-09-23/maps.analytics.db, tools/backups/analytics-2026-09-23/text.analytics.db, tools/backups/analytics-2026-09-23/yt.analytics.db, billing/live-snapshot-202609230121.db, chat/live-snap-a.db, chat/live-snap-b.db, chat/live-snapshot-0159.db, chat/rehearsal.db, community/community.pre-c24-20260925T185117Z.db, community/community.pre-c24b-20260925T185400Z.db, community/community.pre-c24c-20260925T185425Z.db, community/community.pre-live-comments-20260923T191345Z.db |
+| H13 | Production drifts from main | medium | open | - | Platform operator | W0 (checklist) / W21 (release manifests) | Deploy or record why each lagging service is held back. | ai: deployed 549bed0 is 1 commit(s) behind origin/main 6c8b833; billing: deployed 80f97aa is 1 commit(s) behind origin/main f24684b; blog: deployed 21d537c is 1 commit(s) behind origin/main 8a7f8eb; chat: deployed 3aab730 is 1 commit(s) behind origin/main d87c8d3; codes: deployed d78de70 is 1 commit(s) behind origin/main 7d6f65a; community: deployed 52d923a is 1 commit(s) behind origin/main 2da3501; coupons: deployed 64835d2 is 1 commit(s) behind origin/main b91cd79; deals: deployed fa0582d is 1 commit(s) behind origin/main 533450f; events: deployed f55f7eb is 1 commit(s) behind origin/main 19919ec; games: deployed 51d8688 is 1 commit(s) behind origin/main eb2d008; host: deployed 2b63389 is 2 commit(s) behind origin/main 6d2aaaa; live: deployed 9f7f36c is 120 commit(s) behind origin/main 03f49b7; media: deployed 6248363 is 1 commit(s) behind origin/main 14cac06; network: deployed ddd87b6 is 1 commit(s) behind origin/main 5a50c12; news: deployed 8ab47a6 is 1 commit(s) behind origin/main 97dae43; openre: deployed cf423e3 is 1 commit(s) behind origin/main c77ec2a; reviews: deployed 1cff36b is 1 commit(s) behind origin/main c87b344; search: deployed 8ed7667 is 1 commit(s) behind origin/main e8511d8; sites: deployed 32464ec is 1 commit(s) behind origin/main 304e8b1; sources: deployed 351383e is 1 commit(s) behind origin/main 1670853; tips: deployed 1e6bfbb is 1 commit(s) behind origin/main 13986b5; tools: deployed e55469f is 1 commit(s) behind origin/main 4f4ed6e; trade: deployed 4658447 is 1 commit(s) behind origin/main 273bce7; vip: deployed 0fbcbb5 is 1 commit(s) behind origin/main 95b3e19; wiki: deployed 32a26ef is 1 commit(s) behind origin/main 3302540 |
+| H14 | Dead and backup database files on the production host | low | open | **needed** | Live maintainers | W0 | Confirm no code opens them, then delete the empty files; move copies (backups, import snapshots, rehearsal databases) to /var/backups/openvibe with a retention date. | blog/data/blog.db, community/data/community.db, games/data/legacy-import/world-before-20260923T184930Z.db, live/shared/data/analytics.db, live/shared/data/backups/analytics-pre-adr021-2026-09-23.db, live/shared/data/backups/live-20260926-072748.db, live/shared/data/backups/live-20260926-095352.db, live/shared/data/backups/live-pre-643a2e6.db, live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db, live/shared/data/hobo.db, live/shared/data/live-before-rs-slots-20260924T0153Z.db, live/shared/data/live.db, live/shared/data/openvibe.db, live/shared/data/rs-companion.db, media/data/backups/owner-subject-20260923.media.db, media/data/reports/h15-repair-applied-20260925.media.db, network/data/backups/network-pre-creator-analytics-20260926.db, network/data/backups/network-pre-follows-20260926.db, network/data/network-pre-refresh-hash-2026-09-24.db, network/data/network-pre-secrets-2026-09-24.db, tips/data/tips.db, tools/apps/audio/data/guard.db, tools/apps/docs/data/guard.db, tools/apps/food/data/guard.db, tools/apps/gateway/data/guard.db, tools/apps/gateway/data/token-revocations.db, tools/apps/img/data/guard.db, tools/apps/maps/data/guard.db, tools/apps/text/data/guard.db, tools/apps/yt/data/guard.db, tools/backups/analytics-2026-09-23/audio.analytics.db, tools/backups/analytics-2026-09-23/docs.analytics.db, tools/backups/analytics-2026-09-23/food.analytics.db, tools/backups/analytics-2026-09-23/img.analytics.db, tools/backups/analytics-2026-09-23/maps.analytics.db, tools/backups/analytics-2026-09-23/text.analytics.db, tools/backups/analytics-2026-09-23/yt.analytics.db, billing/live-snapshot-202609230121.db, chat/live-snap-a.db, chat/live-snap-b.db, chat/live-snapshot-0159.db, chat/rehearsal.db, community/community.pre-c24-20260925T185117Z.db, community/community.pre-c24b-20260925T185400Z.db, community/community.pre-c24c-20260925T185425Z.db, community/community.pre-live-comments-20260923T191345Z.db |
| H15 | Media objects with no good copy | medium | blocked-on-owner | **needed** | Media maintainers | W4 (repair) / W22 (DR drills) | Scheduled copy verification now runs inside Media and reports through /api/ready (object_copies); the 6 objects are marked degraded. Each needs a decision: re-upload from a surviving source, or mark it unrecoverable and tell its owner. | - |
| H15 | Media objects with no good copy | medium | blocked-on-owner | **needed** | Media maintainers | W4 (repair) / W22 (DR drills) | Scheduled copy verification now runs inside Media and reports through /api/ready (object_copies); the 6 objects are marked degraded. Each needs a decision: re-upload from a surviving source, or mark it unrecoverable and tell its owner. | - |
| H16 | Off-host backups are unreadable without the backup key, which lives only on the host | high | blocked-on-owner | **needed** | Production-host owner | W22 | Escrow the key offline (password manager or paper), record its key id (`ovhost offsite check`) next to it, and test a restore from the bucket with the escrowed copy. | openvibe-backup.timer is active/waiting |
| H16 | Off-host backups are unreadable without the backup key, which lives only on the host | high | blocked-on-owner | **needed** | Production-host owner | W22 | Escrow the key offline (password manager or paper), record its key id (`ovhost offsite check`) next to it, and test a restore from the bucket with the escrowed copy. | openvibe-backup.timer is active/waiting |
| H17 | Pre-ADR-021 analytics backups still hold IP addresses | medium | open | - | Platform operator | Track O / ADR-021 | Delete after 2026-10-07: /opt/openvibe.live/data/backups/analytics-pre-adr021-2026-09-23.db, /opt/openvibe.tools/backups/analytics-2026-09-23/, and Network data/backups/network.db.pre-adr021-20260923T1634. | - |
| H17 | Pre-ADR-021 analytics backups still hold IP addresses | medium | open | - | Platform operator | Track O / ADR-021 | Delete after 2026-10-07: /opt/openvibe.live/data/backups/analytics-pre-adr021-2026-09-23.db, /opt/openvibe.tools/backups/analytics-2026-09-23/, and Network data/backups/network.db.pre-adr021-20260923T1634. | - |
@@ -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 `8caa540`, Network `a7b99c7`, Shared `dbf9d39`, Media `b7fbe65`, Tools `168e511`, Community `19441aa`, Games `b207e78`, Sites `3802ee3`, Events `eb98f8c`, Chat `739d3a1`, OpenRe.Stream `b34dcd6`, Billing `180e246`, Tips `1d558c5`, VIP `4ddf723`, AI `c3ee605`, Search `b00aa4c`, Sources `29cd386`, Wiki `38a17bd`, Blog `79e9e15`, News `0860cf2`, Reviews `cfc37ac`, Deals `99bd438`, Coupons `348f585`, Trade `fa38288`, Codes `0bfdf70`, Host `7514789`, Examples `36901ff`. Production snapshot: openvibe-oregon, 2026-09-26.
+Source commits: Live `03f49b7`, Network `5a50c12`, Shared `b5a9bd7`, Media `14cac06`, Tools `4f4ed6e`, Community `2da3501`, Games `eb2d008`, Sites `304e8b1`, Events `19919ec`, Chat `d87c8d3`, OpenRe.Stream `c77ec2a`, Billing `f24684b`, Tips `13986b5`, VIP `95b3e19`, AI `6c8b833`, Search `e8511d8`, Sources `1670853`, Wiki `3302540`, Blog `8a7f8eb`, News `97dae43`, Reviews `c87b344`, Deals `533450f`, Coupons `b91cd79`, Trade `273bce7`, Codes `7d6f65a`, Host `6d2aaaa`, Examples `92eb7c3`. Production snapshot: openvibe-oregon, 2026-09-28.
## 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) | 604 tables with current/target owner |
-| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 2381 routes; 107 cross-service call sites |
+| 2 | [02-schema.md](02-schema.md) | 639 tables with current/target owner |
+| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 2453 routes; 112 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) | 341 production-vs-repo items |
+| 7 | [08-discrepancies.md](08-discrepancies.md) | 378 production-vs-repo items |
| 8 | [09-d-status.md](09-d-status.md) | D01-D46 family status, derived from the requirement ledger (families: 0 met, 21 partial, 0 not met, 1 blocked on owner) |
| 8 | [09-d-status.md](09-d-status.md) | D01-D46 family status, derived from the requirement ledger (families: 0 met, 21 partial, 0 not met, 1 blocked on owner) |
| 9 | [10-hazards.md](10-hazards.md) | 18 hazards with owners, mitigations and waves; 10 need the owner's review |
| 9 | [10-hazards.md](10-hazards.md) | 18 hazards with owners, mitigations and waves; 10 need the owner's review |
| 10 | [requirement-ledger.md](requirement-ledger.md), [requirement-ledger.json](requirement-ledger.json) | D01-D46 with acceptance artifacts (roadmap §22.4/§25): 3 met, 36 partial, 0 not met, 7 blocked on owner |
| 10 | [requirement-ledger.md](requirement-ledger.md), [requirement-ledger.json](requirement-ledger.json) | D01-D46 with acceptance artifacts (roadmap §22.4/§25): 3 met, 36 partial, 0 not met, 7 blocked on owner |
@@ -24,10 +24,10 @@ Source commits: Live `8caa540`, Network `a7b99c7`, Shared `dbf9d39`, Media `b7fb
@@ -24,10 +24,10 @@ Source commits: Live `8caa540`, Network `a7b99c7`, Shared `dbf9d39`, Media `b7fb
| | Criterion | Result |
| | Criterion | Result |
|---|---|---|
|---|---|---|
-| pass | Every table has an owner classification | 604 tables classified, 0 unclassified |
-| pass | Every route is attributed to a repo and source line, with an owner classification | 2381 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix) |
-| pass | Every background job is listed with its location and an owner classification | 175 timers/jobs, 0 unclassified |
-| pass | Every cross-service call records caller, callee, auth, timeout and retry | 107 call sites; 39 with no timeout detected |
+| pass | Every table has an owner classification | 639 tables classified, 0 unclassified |
+| pass | Every route is attributed to a repo and source line, with an owner classification | 2453 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix) |
+| pass | Every background job is listed with its location and an owner classification | 179 timers/jobs, 0 unclassified |
+| pass | Every cross-service call records caller, callee, auth, timeout and retry | 112 call sites; 39 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 | Every D01-D46 requirement has a status and verified acceptance artifacts (requirement ledger) | 46/46 requirements verified |
| pass | Every D01-D46 requirement has a status and verified acceptance artifacts (requirement ledger) | 46/46 requirements verified |
| **open** | Hazard register reviewed by the production-host owner | pending: set reviewedBy in data/hazards.json after review |
| **open** | Hazard register reviewed by the production-host owner | pending: set reviewedBy in data/hazards.json after review |
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"owner": "OpenVibers",
"owner": "OpenVibers",
- "collectedAt": "2026-09-26T13:29:22.404Z",
+ "collectedAt": "2026-09-28T03:25:56.178Z",
"repos": [
"repos": [
{
{
"description": "AlexFrison.net",
"description": "AlexFrison.net",
@@ -24,10 +24,10 @@
@@ -24,10 +24,10 @@
},
},
{
{
"description": "Ingest and restream: stream definitions, keys, sessions, transport workers, outputs and output health.",
"description": "Ingest and restream: stream definitions, keys, sessions, transport workers, outputs and output health.",
- "diskUsage": 413,
+ "diskUsage": 433,
"isArchived": false,
"isArchived": false,
"name": "OpenRe.Stream",
"name": "OpenRe.Stream",
- "pushedAt": "2026-09-26T13:22:50Z",
+ "pushedAt": "2026-09-28T03:20:27Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -40,7 +40,7 @@
@@ -40,7 +40,7 @@
"port": 4500,
"port": 4500,
"rtmpPort": 1936,
"rtmpPort": 1936,
"domain": "openre.stream",
"domain": "openre.stream",
- "contracts": "openvibe-contracts v0.33.0 (openvibe-sdk v0.5.0, openvibe-shared v1.5.1)",
+ "contracts": "openvibe-contracts v0.49.0 (openvibe-sdk v0.12.0, openvibe-shared v1.22.0)",
"protocols": {
"protocols": {
"rtmp": "ingest ported (openre-rtmp-ingest)",
"rtmp": "ingest ported (openre-rtmp-ingest)",
"restream": "RTMP source to RTMP/RTMPS/SRT destinations ported (openre-restream-worker)",
"restream": "RTMP source to RTMP/RTMPS/SRT destinations ported (openre-restream-worker)",
@@ -58,18 +58,31 @@
@@ -58,18 +58,31 @@
"openre.output.write"
"openre.output.write"
],
],
"capabilitiesRegistered": true,
"capabilitiesRegistered": true,
- "livePatch": "applied in Live f0ca18b and deployed, but inert: live.env has no OPENRE_URL/OPENRE_PUBLIC_URL/OPENRE_EVENTS_SECRET and there is no Events subscription openre.session.* -> Live; 102 of 102 Live slots have ingest_authority=live, so no broadcaster uses OpenRe",
+ "livePatch": "applied in Live f0ca18b and deployed; Live wired on 2026-09-23 (OPENRE_URL and the openre.session.* subscription, docs/cutover.md phase A); every Live slot keeps ingest_authority=live until its per-slot cutover (phase B), so no broadcaster uses OpenRe yet",
"deployed": true,
"deployed": true,
- "deployment": "Production release e0dc1b46fd99 (2026-09-23 19:23 UTC): API + coordinator on 127.0.0.1:4500, RTMP ingest public on 0.0.0.0:1936 (ingest.openre.stream, DNS-only; reachable from outside), Live wired (OPENRE_URL, openre.session.* subscription), preflight all PASS, restore drill passed. No slot switched yet: every slot is still ingested by Live until the per-slot cutover (docs/cutover.md phase B).",
- "updated": "2026-09-23"
+ "deployment": "Deployed with `sudo ovhost deploy openre` (OpenVibe.Host strategy release-layout since the 2026-09-27 cutover; deploy/scripts/deploy.sh is the wrapper and keeps workers/status/prune): API + coordinator on 127.0.0.1:4500, RTMP ingest public on 0.0.0.0:1936 (ingest.openre.stream, DNS-only; reachable from outside since 2026-09-23), Live wired (OPENRE_URL, openre.session.* subscription), preflight all PASS, restore drill passed. No slot switched yet: every slot is still ingested by Live until the per-slot cutover (docs/cutover.md phase B).",
+ "updated": "2026-09-28",
+ "features": [
+ "stream definitions owned by a Network subject, with typed references",
+ "ingest keys hashed at rest, shown once, rotation with grace",
+ "RTMP ingest workers with generations, leases and drains that survive API deploys",
+ "RTMP/RTMPS/SRT restream with output health and a circuit breaker",
+ "SSRF-checked destinations with sealed keys",
+ "recording requests to OpenVibe.Media",
+ "HTTP-FLV playback descriptors",
+ "outbox events openre.session.*, openre.output.*, openre.recording.requested, openre.key.rotated",
+ "migration from Live without importing old keys",
+ "restore-drill read-only mode",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "Providers, models, routing, prompt templates, workflows, runs, citations, cache and quotas for every product.",
"description": "Providers, models, routing, prompt templates, workflows, runs, citations, cache and quotas for every product.",
- "diskUsage": 526,
+ "diskUsage": 1033,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.AI",
"name": "OpenVibe.AI",
- "pushedAt": "2026-09-26T13:22:54Z",
+ "pushedAt": "2026-09-28T03:20:29Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -80,14 +93,16 @@
@@ -80,14 +93,16 @@
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"runtime": "node 22, express, better-sqlite3",
"runtime": "node 22, express, better-sqlite3",
"port": 4700,
"port": 4700,
- "domain": "ai.openvibe.network still serves the OpenVibe.Sites placeholder; the service runs on openvibe-ovh (/opt/openvibe.ai, release bdca064, unit openvibe-ai) on 127.0.0.1:4700, loopback only, used by OpenVibe.Live and OpenVibe.Network",
- "contracts": "openvibe-contracts v0.33.0",
+ "domain": "ai.openvibe.network still serves the OpenVibe.Sites placeholder; the service runs on openvibe-ovh (/opt/openvibe.ai, unit openvibe-ai) on 127.0.0.1:4700, loopback only, used by OpenVibe.Live and OpenVibe.Network",
+ "contracts": "openvibe-contracts v0.75.0",
"capabilities": [
"capabilities": [
"ai.run.create",
"ai.run.create",
"ai.run.read",
"ai.run.read",
"ai.workflow.manage",
"ai.workflow.manage",
"ai.provider.manage",
"ai.provider.manage",
- "ai.usage.read"
+ "ai.usage.read",
+ "ai.credential.manage",
+ "ai.quota.attribution.manage"
],
],
"capabilitiesRegistered": true,
"capabilitiesRegistered": true,
"providers": [
"providers": [
@@ -95,19 +110,34 @@
@@ -95,19 +110,34 @@
"openai-compatible",
"openai-compatible",
"anthropic",
"anthropic",
"http-seam",
"http-seam",
- "whisper.cpp"
+ "whisper.cpp",
+ "local llama.cpp server (openvibe-llm.service)"
],
],
- "livePatch": "applied: Live fa22de5 runs AI_SERVICE=remote in production since 2026-09-23 ~15:34 UTC (309 runs by 18:30 UTC across 13 live.* workflows and 1 network.site_copy, 0 failed). Not moved yet: VOD captions/whisper and streamers' own provider keys stay in Live; most Live features are passthrough prompts built by Live; the deployed Network still falls back to Live's /internal/ai/site-copy; scripts/import-from-live.js ran on production at 2026-09-23 18:29 UTC (79,657 ledger rows: 79,647 live.ai_usage, 2 channel_ai_config, 8 site_settings; 11 holds: provider settings and the key stay env references, 1 streamer BYO key stays in Live, 3,021 translations are unrepresentable and stay in Live); every route has fallbacks=[]; 0 citation rows; no /metrics",
+ "livePatch": "applied: Live fa22de5 runs AI_SERVICE=remote in production since 2026-09-23 ~15:34 UTC (309 runs by 18:30 UTC across 13 live.* workflows and 1 network.site_copy, 0 failed). As of 2026-09-23, not moved yet: VOD captions/whisper and streamers' own provider keys stayed in Live and most Live features were passthrough prompts built by Live (since 2026-09-27 AI has live.media.transcribe, stored provider keys and versioned templates for most live.* workflows); the deployed Network still falls back to Live's /internal/ai/site-copy; scripts/import-from-live.js ran on production at 2026-09-23 18:29 UTC (79,657 ledger rows: 79,647 live.ai_usage, 2 channel_ai_config, 8 site_settings; 11 holds: provider settings and the key stay env references, 1 streamer BYO key stays in Live, 3,021 translations are unrepresentable and stay in Live); every route has fallbacks=[]; 0 citation rows; no /metrics",
"deployed": true,
"deployed": true,
- "updated": "2026-09-23"
+ "updated": "2026-09-28",
+ "features": [
+ "versioned templates, workflows and routing profiles",
+ "runs with idempotency, cancel, retry, async polling and restart recovery",
+ "provider fallback and circuit breakers",
+ "quotas before any provider call, including per-streamer attribution quotas",
+ "scoped cache",
+ "citations or explicit gaps on every run",
+ "people's own provider keys, encrypted at rest",
+ "media.analyze: local-first recording analysis with windowed speech-to-text",
+ "ai.run.* events through the SDK outbox",
+ "ai.preferences and ai.usage_summary user modules",
+ "server-rendered operator console for Network staff",
+ "Live import"
+ ]
}
}
},
},
{
{
"description": "The isolated money ledger: providers, receipts, subscriptions, entitlements, refunds and payouts.",
"description": "The isolated money ledger: providers, receipts, subscriptions, entitlements, refunds and payouts.",
- "diskUsage": 591,
+ "diskUsage": 597,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Billing",
"name": "OpenVibe.Billing",
- "pushedAt": "2026-09-26T13:22:57Z",
+ "pushedAt": "2026-09-28T03:20:31Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -118,17 +148,33 @@
@@ -118,17 +148,33 @@
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"adr": "ADR-012",
"adr": "ADR-012",
"authoritative": false,
"authoritative": false,
- "deployment": "Deployed in shadow on openvibe-ovh: /opt/openvibe.billing (release 421beb4, openvibe-contracts 0.33.0, openvibe-shared 1.5.1), unit openvibe-billing, API on 127.0.0.1:4600 (loopback only; /api/v1 is denied on the public host). Public at https://billing.openvibe.network: the staff console (Network SSO + PKCE, BILLING_STAFF_SUBJECTS = the owner only), /api/health, /api/ready (openvibe-shared/ready shape), /release.json and /webhooks/*. No provider secret is configured, so every provider is off and /webhooks/* answers 404 billing.provider_disabled.",
+ "deployed": true,
+ "deployment": "Deployed in shadow with `sudo ovhost deploy billing`: /opt/openvibe.billing, unit openvibe-billing, API on 127.0.0.1:4600 (loopback only; /api/v1 is denied on the public host). Public at https://billing.openvibe.network: the staff console (Network SSO + PKCE, BILLING_STAFF_SUBJECTS = the owner only), the billing policy (/policy), /api/health, /api/ready (openvibe-shared/ready shape), /release.json and /webhooks/*. No provider secret is configured, so every provider is off and /webhooks/* answers 404 billing.provider_disabled.",
+ "contracts": "openvibe-contracts v0.49.0",
"notes": "Runtime, journal, adapters, import, reconciliation and the staff console (cashout approve/deny, review queue, reconciliation, freeze, audit log) are built, tested and deployed, with /metrics (loopback only), hourly scheduled reconciliation (GET /api/v1/admin/reconciliations; 16 runs by 2026-09-24 05:06 UTC, ledger-vs-receipt checks), EXTERNAL PowerChat receipts (billing.receipt.external under BILLING_AUTHORITY=billing; recorded only while Live is the authority), overflow guards and IMMEDIATE-transaction settlement. Production holds the shadow import of Live (322 transactions, 996 ledger entries), 0 subscriptions and 0 entitlements; the console has never been used (staff_audit 0). BILLING_AUTHORITY is not set in live.env, so Live stays the money authority. The cutover (README runbook, docs/live-cutover.md) waits on the owner putting the PowerChat secret in billing.env and re-pointing the PowerChat webhook to https://billing.openvibe.network/webhooks/powerchat; a duplicate-webhook proof in production follows it. Live's payouts, refunds and plans have no tables of their own; where they map is docs/live-mapping.md.",
"notes": "Runtime, journal, adapters, import, reconciliation and the staff console (cashout approve/deny, review queue, reconciliation, freeze, audit log) are built, tested and deployed, with /metrics (loopback only), hourly scheduled reconciliation (GET /api/v1/admin/reconciliations; 16 runs by 2026-09-24 05:06 UTC, ledger-vs-receipt checks), EXTERNAL PowerChat receipts (billing.receipt.external under BILLING_AUTHORITY=billing; recorded only while Live is the authority), overflow guards and IMMEDIATE-transaction settlement. Production holds the shadow import of Live (322 transactions, 996 ledger entries), 0 subscriptions and 0 entitlements; the console has never been used (staff_audit 0). BILLING_AUTHORITY is not set in live.env, so Live stays the money authority. The cutover (README runbook, docs/live-cutover.md) waits on the owner putting the PowerChat secret in billing.env and re-pointing the PowerChat webhook to https://billing.openvibe.network/webhooks/powerchat; a duplicate-webhook proof in production follows it. Live's payouts, refunds and plans have no tables of their own; where they map is docs/live-mapping.md.",
- "updated": "2026-09-24"
+ "updated": "2026-09-28",
+ "features": [
+ "append-only double-entry journal in bits and cents, balanced per currency",
+ "provider receipts stored before processing, settled once (PowerChat, Stripe, PayPal, CCBill, NOWPayments adapters)",
+ "intents, transfers, refunds, recycle, cashouts with escrow",
+ "subscriptions and entitlements",
+ "EXTERNAL PowerChat receipts (billing.receipt.external under BILLING_AUTHORITY=billing)",
+ "economy freeze",
+ "hourly reconciliation, ledger against receipts",
+ "staff console: cashouts, review queue, reconciliation, freeze, audit log",
+ "public billing policy page",
+ "Live shadow import",
+ "outbox events billing.*",
+ "per-person limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds.",
"description": "The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds.",
- "diskUsage": 667,
+ "diskUsage": 722,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Blog",
"name": "OpenVibe.Blog",
- "pushedAt": "2026-09-26T13:23:02Z",
+ "pushedAt": "2026-09-28T03:20:33Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -140,11 +186,12 @@
@@ -140,11 +186,12 @@
"runtime": "node 22, express 4, better-sqlite3 11",
"runtime": "node 22, express 4, better-sqlite3 11",
"port": 4810,
"port": 4810,
"domain": "openvibe.blog",
"domain": "openvibe.blog",
+ "contracts": "openvibe-contracts v0.53.0",
"packages": [
"packages": [
- "openvibe-publishing v0.2.1",
- "openvibe-contracts v0.33.0",
- "openvibe-shared v1.5.1",
- "openvibe-sdk v0.5.0"
+ "openvibe-publishing v0.4.0",
+ "openvibe-contracts v0.53.0",
+ "openvibe-shared v1.22.0",
+ "openvibe-sdk v0.12.0"
],
],
"capabilities": [
"capabilities": [
"blog.blog.create",
"blog.blog.create",
@@ -162,21 +209,37 @@
@@ -162,21 +209,37 @@
],
],
"capabilitiesRegistered": true,
"capabilitiesRegistered": true,
"serviceManifestRegistered": true,
"serviceManifestRegistered": true,
- "entitlements": "OpenVibe.VIP in code (policies/evaluate with the blog owner and the blog:gated_post default gate, cached 30 s; teaser and join link otherwise). Not deployed yet, and the Network has not granted blog vip.resource.policy.evaluate: until both, members-only posts admit only the blog's members and staff",
- "seedPost": "draft in production (verbatim quotes; not reviewed by a person); 0 posts published",
+ "entitlements": "OpenVibe.VIP in code (policies/evaluate with the blog owner and the blog:gated_post default gate, cached 30 s; teaser and join link otherwise). It needs the Network grant [blog, vip.resource.policy.evaluate, openvibe.vip]; without it, or when VIP is unreachable, members-only posts admit only the blog's members and staff (the gate fails closed)",
+ "seedPost": "a draft (verbatim quotes; not reviewed by a person)",
"deployed": true,
"deployed": true,
- "deployment": "Public at https://openvibe.blog since 2026-09-23 (~03:00 UTC): /opt/openvibe.blog at e7b4986, unit openvibe-blog on 127.0.0.1:4810 behind the openvibe.blog nginx vhost, principal blog. Production content: 1 blog (official), 1 post, which is a draft, so the public site shows nothing published yet. Restore drill passed 2026-09-23.",
+ "deployment": "Public at https://openvibe.blog since 2026-09-23 (~03:00 UTC): deployed with `sudo ovhost deploy blog`, /opt/openvibe.blog, unit openvibe-blog on 127.0.0.1:4810 behind the openvibe.blog nginx vhost, principal blog. The network changelog publishes Patch notes posts on the official blog. Restore drill passed 2026-09-23.",
"placeholderInSites": false,
"placeholderInSites": false,
- "updated": "2026-09-23",
- "deployedAt": "2026-09-23"
+ "updated": "2026-09-28",
+ "deployedAt": "2026-09-23",
+ "features": [
+ "the official blog and a blog for every member, with owners, editors and authors",
+ "drafts and immutable revisions with conflict detection, diff and revert",
+ "publish, unpublish, soft delete and scheduled publishing",
+ "tags, categories, series and 301s on slug changes",
+ "Media-backed covers, inline figures and galleries",
+ "six theme presets",
+ "Community comment threads",
+ "AI drafts that need a person's review",
+ "members-only posts gated by OpenVibe.VIP (fails closed)",
+ "network changelog feed and Patch notes posts",
+ "feeds, sitemaps and server-rendered pages useful without JavaScript",
+ "/api/v1 by capability",
+ "SDK outbox events and Search index documents",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation.",
"description": "Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation.",
- "diskUsage": 842,
+ "diskUsage": 977,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Chat",
"name": "OpenVibe.Chat",
- "pushedAt": "2026-09-26T13:23:06Z",
+ "pushedAt": "2026-09-28T03:20:35Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -187,8 +250,8 @@
@@ -187,8 +250,8 @@
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"runtime": "node 22, express, ws, better-sqlite3",
"runtime": "node 22, express, ws, better-sqlite3",
"port": 4400,
"port": 4400,
- "domain": "openvibe.live (/ws/chat, /api/chat/, /api/dm/, /api/tts/, /api/sounds via an nginx include in openvibe.live's vhost); openvibe.chat is still the OpenVibe.Sites placeholder",
- "contracts": "openvibe-contracts v0.33.0",
+ "domain": "openvibe.chat (Chat's own site: global chat, messages, rooms, settings; the service manifest records it live since 2026-09-24) and openvibe.live (/ws/chat, /api/chat/, /api/dm/, /api/tts/, /api/sounds via an nginx include in openvibe.live's vhost)",
+ "contracts": "openvibe-contracts v0.71.0",
"capabilities": [
"capabilities": [
"chat.live_bridge.write",
"chat.live_bridge.write",
"chat.message.send",
"chat.message.send",
@@ -202,31 +265,50 @@
@@ -202,31 +265,50 @@
"events.subscription.manage",
"events.subscription.manage",
"vip.entitlement.check",
"vip.entitlement.check",
"network.modules.read",
"network.modules.read",
- "network.modules.write"
+ "network.modules.write",
+ "tools.tool.run",
+ "tools.job.read"
],
],
"capabilitiesRegistered": true,
"capabilitiesRegistered": true,
"events": [
"events": [
"chat.message.created",
"chat.message.created",
"chat.message.deleted",
"chat.message.deleted",
"chat.dm.created",
"chat.dm.created",
- "chat.moderation.action"
+ "chat.moderation.action",
+ "chat.room.message.created",
+ "chat.room.message.deleted"
],
],
- "eventsConsumed": "live.release.deployed (the deploy card, folded by subject.id with the bridge's deployNotice: one card per head whichever comes first; register C-84) and network.module.updated (drops a cached chat.preferences copy), POST /internal/events, signature v2, openvibe-sdk inbox; subscriptions created at boot. In code only, not deployed; needs CHAT_EVENTS_SECRET in chat.env and the Network grant chat events.subscription.manage openvibe.events",
+ "eventsConsumed": "live.release.deployed, network.module.updated, network.user.token_valid_after, vip.membership.changed, network.block.changed, network.subject.merged, network.account.export_requested and network.account.deleted at POST /internal/events (signature v2, openvibe-sdk inbox); subscriptions created at boot when missing (CHAT_EVENTS_SECRET and the Network grant chat events.subscription.manage openvibe.events)",
"liveAuthorityFlag": "CHAT_AUTHORITY=chat is set in production live.env since the cutover (2026-09-23 02:03 UTC); Live's chat tables are a read mirror Chat keeps current",
"liveAuthorityFlag": "CHAT_AUTHORITY=chat is set in production live.env since the cutover (2026-09-23 02:03 UTC); Live's chat tables are a read mirror Chat keeps current",
- "vip": "Member badges from OpenVibe.VIP (server/vip/badges.js: entitlements/check with product chat, cached 60 s, never blocks sending, fails closed). In code only, not deployed; needs the Network grant chat vip.entitlement.check openvibe.vip and Live's chat UI to render vip_badge / chat_vip_badge",
- "preferences": "Chat preferences in the Network user module chat.preferences (server/prefs/: GET/PUT /api/chat/preferences with Chat's service token, cached 60 s, If-Match on every write; scripts/migrate-chat-preferences.js moves the choices in Live's user_preferences). In code only, not deployed; needs Network with the chat.preferences handoff and the grants chat network.modules.read/write on chat.preferences, then the migration, then Live's chat.js calling /api/chat/preferences",
- "calls": "Live's call server, call routes and stream hooks ported to server/calls/ with a calls lifecycle table (WS-I task 1). In code only, off (CHAT_CALLS unset); the switch is CHAT_CALLS=1, Live CALLS_AUTHORITY=chat and the nginx include deploy/nginx/calls/openvibe.live-calls.locations.conf (docs/calls-cutover.md)",
+ "vip": "Member badges from OpenVibe.VIP (server/vip/badges.js: entitlements/check with product chat, cached 60 s, never blocks sending, fails closed; vip.membership.changed drops the cache). Needs the Network grant chat vip.entitlement.check openvibe.vip",
+ "preferences": "Chat preferences in the Network user module chat.preferences, plus chat.tts_defaults, chat.dm_settings and chat.presence_prefs (server/prefs/: /api/chat/preferences and siblings with Chat's service token, cached 60 s, If-Match on every write; scripts/migrate-chat-preferences.js moves the choices in Live's user_preferences). Needs the grants chat network.modules.read/write",
+ "calls": "Live's call server, call routes and stream hooks ported to server/calls/ with a calls lifecycle table (WS-I task 1). Off unless CHAT_CALLS=1; the switch is CHAT_CALLS=1, Live CALLS_AUTHORITY=chat and the nginx include deploy/nginx/calls/openvibe.live-calls.locations.conf (docs/calls-cutover.md)",
"deployed": true,
"deployed": true,
- "deployment": "openvibe-ovh /opt/openvibe.chat, unit openvibe-chat, 127.0.0.1:4400 (loopback); public only through openvibe.live's nginx include for the chat paths; release 45f2b1f; EVENTS_URL set (chat.message.created reaches OpenVibe.Events); restore drill passed 2026-09-23",
- "updated": "2026-09-23"
+ "deployment": "Deployed with `sudo ovhost deploy chat`: /opt/openvibe.chat, unit openvibe-chat, 127.0.0.1:4400 (loopback); public through the openvibe.chat vhost and openvibe.live's nginx include for the chat paths; EVENTS_URL set (chat.message.created reaches OpenVibe.Events); restore drill passed 2026-09-23",
+ "updated": "2026-09-28",
+ "features": [
+ "Live's global, stream and channel chat (authority since 2026-09-23, Live keeps a read mirror)",
+ "DMs and group DMs, participants only",
+ "rooms: public and private, roles, invitations, slow mode, unread counts",
+ "moderation: bans, timeouts, purges, filters, slow, sub-only and member-only modes, audited log access",
+ "TTS, sounds and soundboard with persisted queues",
+ "calls ported from Live (off until the calls cutover)",
+ "openvibe.chat site: global chat, messages, rooms, settings, history download",
+ "chat preferences in Network user modules",
+ "VIP subscriber badges",
+ "network blocks, revocation, account merge, export and deletion from Network events",
+ "outbox events and chat.room.message.* on the realtime plane",
+ "N-1 compatibility tests",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance.",
"description": "The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance.",
- "diskUsage": 706,
+ "diskUsage": 814,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Codes",
"name": "OpenVibe.Codes",
- "pushedAt": "2026-09-26T13:23:10Z",
+ "pushedAt": "2026-09-28T03:20:37Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -238,15 +320,17 @@
@@ -238,15 +320,17 @@
"runtime": "node 22, express 4, better-sqlite3 11",
"runtime": "node 22, express 4, better-sqlite3 11",
"port": 4900,
"port": 4900,
"domain": "openvibe.codes",
"domain": "openvibe.codes",
+ "contracts": "openvibe-contracts v0.53.0",
"packages": [
"packages": [
- "openvibe-contracts v0.33.0",
- "openvibe-sdk v0.5.0",
- "openvibe-shared v1.5.1"
+ "openvibe-contracts v0.53.0",
+ "openvibe-sdk v0.12.0",
+ "openvibe-shared v1.22.0"
],
],
- "summary": "Deployed and public since 2026-09-23: https://openvibe.codes is served by this portal (openvibe-ovh, unit openvibe-codes on 127.0.0.1:4900 behind nginx, release a9371c3), and the domain left OpenVibe.Sites. Sign-in uses the registered Network OAuth client `codes` (PKCE S256); the principal `codes` holds events.event.publish and the Events relay is configured. It is barely used yet: production holds 0 manifests, 0 releases and 0 playground runs. The external-developer path (account, project, sandbox app, grants, Media upload, app events) was run once on production on 2026-09-23 with public endpoints and curl, not through these playgrounds; that check is not committed to a repository or CI.",
+ "summary": "Deployed and public since 2026-09-23: https://openvibe.codes is served by this portal (deployed with `sudo ovhost deploy codes`, unit openvibe-codes on 127.0.0.1:4900 behind nginx), and the domain left OpenVibe.Sites. Sign-in uses the registered Network OAuth client `codes` (PKCE S256); the principal `codes` holds events.event.publish and the Events relay is configured. On 2026-09-23 production held 0 manifests, 0 releases and 0 playground runs. The external-developer path (account, project, sandbox app, grants, Media upload, app events) was run once on production on 2026-09-23 with public endpoints and curl, not through these playgrounds; that check is not committed to a repository or CI.",
"works": [
"works": [
"Sign-in with OpenVibe.Network (authorization code + PKCE S256), session tokens in httpOnly cookies",
"Sign-in with OpenVibe.Network (authorization code + PKCE S256), session tokens in httpOnly cookies",
"Projects, members, apps, credentials (rotate, revoke), grants (request, approve, deny, revoke), quotas and audit over Network's /api/v1/projects API with the person's own token; Network's errors shown as Network answered them",
"Projects, members, apps, credentials (rotate, revoke), grants (request, approve, deny, revoke), quotas and audit over Network's /api/v1/projects API with the person's own token; Network's errors shown as Network answered them",
+ "Per-project usage page (owner, admins, staff): Network's GET /api/v1/projects/:project/usage rendered server-side, with quota headroom, published service limits and sampled failures",
"Project export (one JSON document: Network's project, members, apps, credential ids and hints, grants, quotas, audit for admin+, plus Codes' releases, manifests, trust and playground runs) and delete (owner: archive in Network first, then drafts and playground runs deleted, public releases revoked). Network has no project erasure endpoint, only archive",
"Project export (one JSON document: Network's project, members, apps, credential ids and hints, grants, quotas, audit for admin+, plus Codes' releases, manifests, trust and playground runs) and delete (owner: archive in Network first, then drafts and playground runs deleted, public releases revoked). Network has no project erasure endpoint, only archive",
"Full project archive for the owner and admins (roadmap WS-N task 9): one zip with the metadata document (audit included), the release manifests (the project's modules), Media objects (listed with public or 1-hour signed download URLs) and namespaces, and the app events Events still keeps, for production and sandbox; read with Network's read-only export tokens (POST /api/v1/projects/:project/export-tokens, 5 minutes, audited). All or nothing when a service fails; at most CODES_EXPORT_MAX_OBJECTS / CODES_EXPORT_MAX_EVENTS per environment, stated in manifest.json when reached",
"Full project archive for the owner and admins (roadmap WS-N task 9): one zip with the metadata document (audit included), the release manifests (the project's modules), Media objects (listed with public or 1-hour signed download URLs) and namespaces, and the app events Events still keeps, for production and sandbox; read with Network's read-only export tokens (POST /api/v1/projects/:project/export-tokens, 5 minutes, audited). All or nothing when a service fails; at most CODES_EXPORT_MAX_OBJECTS / CODES_EXPORT_MAX_EVENTS per environment, stated in manifest.json when reached",
"Client secrets shown once, in the create/rotate response only, with no-store; never stored or logged (tested)",
"Client secrets shown once, in the create/rotate response only, with no-store; never stored or logged (tested)",
@@ -262,7 +346,7 @@
@@ -262,7 +346,7 @@
],
],
"notYet": [
"notYet": [
"The playgrounds have never been used on production (0 playground runs); the one production end-to-end run used curl, and it is not a committed, repeatable check",
"The playgrounds have never been used on production (0 playground runs); the one production end-to-end run used curl, and it is not a committed, repeatable check",
- "No usage, trace or error dashboards: no service reports per-project usage yet; quotas show recorded limits only",
+ "Usage covers only what services report in their hourly *.usage.recorded rollups (Network adds them up per day; the current hour is not counted); no trace or error dashboards beyond the sampled failures",
"Billing sandbox, Chat bot and Realtime playgrounds; CLI and scaffolding; templates",
"Billing sandbox, Chat bot and Realtime playgrounds; CLI and scaffolding; templates",
"Consent screen for third-party production apps (a Network gap)",
"Consent screen for third-party production apps (a Network gap)",
"No JSON-LD or llms.txt on the public pages",
"No JSON-LD or llms.txt on the public pages",
@@ -272,25 +356,82 @@
@@ -272,25 +356,82 @@
"serviceManifestRegistered": true,
"serviceManifestRegistered": true,
"deployed": true,
"deployed": true,
"placeholderInSites": false,
"placeholderInSites": false,
- "updated": "2026-09-23"
+ "updated": "2026-09-28",
+ "features": [
+ "developer portal over Network's projects, apps, credentials, grants, quotas and audit",
+ "per-project usage page from Network's rollups",
+ "project export (JSON) and full archive (zip)",
+ "secrets shown once, never stored or logged",
+ "scope editor offering only grantable capabilities",
+ "docs generated from the pinned contracts and SDK",
+ "OAuth helper and webhook tester (signature v1 and v2)",
+ "grant-respecting Media and Events playgrounds",
+ "app and mod manifest validation and release metadata with codes.app.* events",
+ "ADR-013 trust tiers",
+ "policy and governance pages (governance drafts pending owner review)",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "",
"description": "",
- "diskUsage": 1474,
+ "diskUsage": 1778,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Community",
"name": "OpenVibe.Community",
- "pushedAt": "2026-09-26T13:23:14Z",
+ "pushedAt": "2026-09-28T03:20:39Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
- "status": null
+ "status": {
+ "repository": "OpenVibers/OpenVibe.Community",
+ "stage": "alpha",
+ "code": true,
+ "wave": "W5",
+ "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
+ "runtime": "node 22, express, better-sqlite3",
+ "port": 4200,
+ "domain": "openvibe.community",
+ "contracts": "openvibe-contracts v0.71.0",
+ "capabilities": [
+ "community.paste.create",
+ "community.paste.write",
+ "community.paste.moderate",
+ "community.post.create",
+ "community.comment.write",
+ "community.comment.moderate",
+ "community.pulse.write",
+ "community.space.read",
+ "community.space.manage",
+ "community.thread.read",
+ "community.vote.set",
+ "community.pulse.read"
+ ],
+ "capabilitiesRegistered": true,
+ "pastesAuthority": "community in production since 2026-09-22 (~23:35 UTC); live is the rollback mode",
+ "deployed": true,
+ "deployment": "Public at https://openvibe.community: deployed with `sudo ovhost deploy community`, /opt/openvibe.community, unit openvibe-community on 127.0.0.1:4200 behind the openvibe.community nginx vhost, principal community. The paste import brought 889 + 2 pastes, 60 comments and 48 likes (5 rows held). The Discord relay is off. Restore drill passed 2026-09-23.",
+ "features": [
+ "pastes: code, text and screenshots, with versions, likes, comments, forks and burn-after-read",
+ "typed comment threads embedded by other products",
+ "forum: spaces, threads, posts, categories and votes",
+ "members-only spaces and threads gated by OpenVibe.VIP",
+ "a space's chat room on OpenVibe.Chat",
+ "Pulse: the network's public activity from Events",
+ "Discord relay (off in production)",
+ "server-rendered pages with full SEO",
+ "Search documents and community.* events",
+ "revocation, blocks, account merge, export and deletion from Network events",
+ "N-1 compatibility tests",
+ "per-actor limits (openvibe-sdk/limits)"
+ ],
+ "updated": "2026-09-28"
+ }
},
},
{
{
"description": "Machine-readable contracts for the whole OpenVibe network.",
"description": "Machine-readable contracts for the whole OpenVibe network.",
- "diskUsage": 2738,
+ "diskUsage": 3315,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Contracts",
"name": "OpenVibe.Contracts",
- "pushedAt": "2026-09-26T13:03:25Z",
+ "pushedAt": "2026-09-28T03:22:17Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -302,15 +443,29 @@
@@ -302,15 +443,29 @@
"OpenVibe.Network"
"OpenVibe.Network"
],
],
"plan": "OpenVibe Development Roadmap (combined), Wave 1; implementation plan rev 3 section 3.1",
"plan": "OpenVibe Development Roadmap (combined), Wave 1; implementation plan rev 3 section 3.1",
- "updated": "2026-09-24"
+ "deployed": false,
+ "deployment": "none of its own: a library and artifact repository published as release tags; services pin a tag and deploy it with their own releases",
+ "contracts": "openvibe-contracts v0.75.0 (this package; the newest tag)",
+ "features": [
+ "540 JSON Schemas with valid and invalid fixtures",
+ "31 service manifests with lifecycle declarations",
+ "205 capability manifests and the staff capability map",
+ "13 user-module namespace manifests",
+ "validate, ids, http (problem+json, trace and idempotency middleware), capabilities.check and serviceAuth",
+ "openvibe-contracts-check for service CI",
+ "generated TypeScript types, JSON Schema bundle and per-service OpenAPI 3.1",
+ "compatibility check against the previous tag (scripts/compat.js)",
+ "documentation-currency check (scripts/docs-currency.js)"
+ ],
+ "updated": "2026-09-28"
}
}
},
},
{
{
"description": "Coupon codes with merchant matching, restrictions, expiry and real-people validity reports.",
"description": "Coupon codes with merchant matching, restrictions, expiry and real-people validity reports.",
- "diskUsage": 408,
+ "diskUsage": 462,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Coupons",
"name": "OpenVibe.Coupons",
- "pushedAt": "2026-09-26T13:23:18Z",
+ "pushedAt": "2026-09-28T03:20:43Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -322,11 +477,12 @@
@@ -322,11 +477,12 @@
"runtime": "node 22, express 4, better-sqlite3 11",
"runtime": "node 22, express 4, better-sqlite3 11",
"port": 4850,
"port": 4850,
"domain": "openvibe.coupons",
"domain": "openvibe.coupons",
+ "contracts": "openvibe-contracts v0.53.0",
"packages": [
"packages": [
- "openvibe-publishing v0.2.1",
- "openvibe-contracts v0.33.0",
- "openvibe-shared v1.5.1",
- "openvibe-sdk v0.5.0"
+ "openvibe-publishing v0.4.0",
+ "openvibe-contracts v0.53.0",
+ "openvibe-shared v1.22.0",
+ "openvibe-sdk v0.12.0"
],
],
"capabilities": [
"capabilities": [
"coupons.coupon.submit",
"coupons.coupon.submit",
@@ -346,17 +502,28 @@
@@ -346,17 +502,28 @@
"notifications": "watches are recorded; no notification is sent: OpenVibe.Network has no notification consumer yet",
"notifications": "watches are recorded; no notification is sent: OpenVibe.Network has no notification consumer yet",
"client": "OpenVibers/OpenVibe.Extensions browser/ (not published to any store; the Coupons API it calls is not public yet)",
"client": "OpenVibers/OpenVibe.Extensions browser/ (not published to any store; the Coupons API it calls is not public yet)",
"deployed": true,
"deployed": true,
- "deployment": "openvibe-ovh, unit openvibe-coupons, 127.0.0.1:4850 loopback only (release 54df411; the later 9b9549e changes only the repo's nginx reference file); /api/ready 200 with every check ok; Network OAuth client coupons and its grants exist; production database holds 0 coupons. Deployed internally, not launched: openvibe.coupons still serves the OpenVibe.Sites placeholder until a person verifies a coupons source's terms and enables it in Sources",
+ "deployment": "Deployed with `sudo ovhost deploy coupons`: unit openvibe-coupons, 127.0.0.1:4850 loopback only; Network OAuth client coupons and its grants exist; on 2026-09-23 /api/ready answered 200 and the production database held 0 coupons. Deployed internally, not launched: openvibe.coupons still serves the OpenVibe.Sites placeholder until a person verifies a coupons source's terms and enables it in Sources",
"placeholderInSites": true,
"placeholderInSites": true,
- "updated": "2026-09-23"
+ "updated": "2026-09-28",
+ "features": [
+ "merchants with normalized domain rules (public-suffix subset, path rules)",
+ "codes with restrictions, known or unknown expiry and evidence",
+ "validity reports by people, one per person per day, with confidence and decay",
+ "expired codes leave API, pages, feeds, sitemaps and Search at the instant of expiry",
+ "server-rendered pages useful without JavaScript",
+ "/api/v1 by capability and browser-helper install tokens",
+ "OpenVibe.Sources coupons import with holds",
+ "SDK outbox events and Search index documents",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "Deals submitted and voted on by the community, with source, price and freshness always shown.",
"description": "Deals submitted and voted on by the community, with source, price and freshness always shown.",
- "diskUsage": 445,
+ "diskUsage": 493,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Deals",
"name": "OpenVibe.Deals",
- "pushedAt": "2026-09-26T13:23:22Z",
+ "pushedAt": "2026-09-28T03:20:45Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -368,11 +535,12 @@
@@ -368,11 +535,12 @@
"runtime": "node 22, express 4, better-sqlite3 11",
"runtime": "node 22, express 4, better-sqlite3 11",
"port": 4840,
"port": 4840,
"domain": "openvibe.deals",
"domain": "openvibe.deals",
+ "contracts": "openvibe-contracts v0.53.0",
"packages": [
"packages": [
- "openvibe-publishing v0.2.1",
- "openvibe-contracts v0.33.0",
- "openvibe-shared v1.5.1",
- "openvibe-sdk v0.5.0"
+ "openvibe-publishing v0.4.0",
+ "openvibe-contracts v0.53.0",
+ "openvibe-shared v1.22.0",
+ "openvibe-sdk v0.12.0"
],
],
"capabilities": [
"capabilities": [
"deals.offer.submit",
"deals.offer.submit",
@@ -394,17 +562,31 @@
@@ -394,17 +562,31 @@
"sourcesImport": "code and tests; the sources.item.read grant exists in production, but no deals-category source is enabled in OpenVibe.Sources (the seeded dealnews-daily is disabled), so nothing has been imported",
"sourcesImport": "code and tests; the sources.item.read grant exists in production, but no deals-category source is enabled in OpenVibe.Sources (the seeded dealnews-daily is disabled), so nothing has been imported",
"watchNotifications": "deals.watch.matched events only; OpenVibe.Network's notification consumer does not exist yet",
"watchNotifications": "deals.watch.matched events only; OpenVibe.Network's notification consumer does not exist yet",
"deployed": true,
"deployed": true,
- "deployment": "openvibe-ovh, unit openvibe-deals, 127.0.0.1:4840 loopback only (release e72aeec); /api/ready 200 with every check ok; Network OAuth client deals and its grants exist; production database holds 0 offers. Deployed internally, not launched: openvibe.deals still serves the OpenVibe.Sites placeholder until a person verifies a deals source's terms and enables it in Sources",
+ "deployment": "Deployed with `sudo ovhost deploy deals`: unit openvibe-deals, 127.0.0.1:4840 loopback only; Network OAuth client deals and its grants exist; on 2026-09-23 /api/ready answered 200 and the production database held 0 offers. Deployed internally, not launched: openvibe.deals still serves the OpenVibe.Sites placeholder until a person verifies a deals source's terms and enables it in Sources",
"placeholderInSites": true,
"placeholderInSites": true,
- "updated": "2026-09-23"
+ "updated": "2026-09-28",
+ "features": [
+ "offers with timestamped price observations shown \"as of\" and stale labels",
+ "unknown prices stay unknown in pages, JSON, JSON-LD, feeds and Search",
+ "server-authoritative votes and deterministic hotness (hot@1)",
+ "duplicate merge and unmerge without losing votes or history",
+ "watches and saved searches (deals.watch.matched events; no delivery yet)",
+ "vote abuse controls and moderation queue",
+ "OpenVibe.Sources deals import with review",
+ "Community comment threads",
+ "server-rendered pages, feeds and sitemaps useful without JavaScript",
+ "/api/v1 by capability",
+ "SDK outbox events and Search index documents",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "Durable events, subscriptions, delivery, retry, dead letters and replay for the network.",
"description": "Durable events, subscriptions, delivery, retry, dead letters and replay for the network.",
- "diskUsage": 388,
+ "diskUsage": 550,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Events",
"name": "OpenVibe.Events",
- "pushedAt": "2026-09-26T13:23:26Z",
+ "pushedAt": "2026-09-28T03:20:47Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -416,7 +598,7 @@
@@ -416,7 +598,7 @@
"runtime": "node 22, express, better-sqlite3",
"runtime": "node 22, express, better-sqlite3",
"port": 4300,
"port": 4300,
"domain": "events.openvibe.network",
"domain": "events.openvibe.network",
- "contracts": "openvibe-contracts v0.28.0",
+ "contracts": "openvibe-contracts v0.63.0",
"capabilities": [
"capabilities": [
"events.event.publish",
"events.event.publish",
"events.subscription.manage",
"events.subscription.manage",
@@ -428,8 +610,19 @@
@@ -428,8 +610,19 @@
],
],
"capabilitiesRegistered": true,
"capabilitiesRegistered": true,
"deployed": true,
"deployed": true,
- "deployment": "openvibe-ovh /opt/openvibe.events, unit openvibe-events, 127.0.0.1:4300; public at https://events.openvibe.network (realtime SSE, health, token-guarded /api/v1/events, /api/v1/subscriptions, /api/v1/checkpoints; /api/v1/deliveries host-local); release 5def126; real traffic since 2026-09-23 (Live, Media, Chat, Games, Network and OpenRe publish; 8 subscriptions, held by Search, Tips, VIP, News and Reviews); restore drill passed 2026-09-23",
- "updated": "2026-09-23"
+ "deployment": "Deployed with `sudo ovhost deploy events`: /opt/openvibe.events, unit openvibe-events, 127.0.0.1:4300; public at https://events.openvibe.network (realtime SSE, health, token-guarded /api/v1/events, /api/v1/subscriptions, /api/v1/checkpoints; /api/v1/deliveries host-local); real traffic since 2026-09-23 (Live, Media, Chat, Games, Network and OpenRe publish; on 2026-09-23 8 subscriptions, held by Search, Tips, VIP, News and Reviews); restore drill passed 2026-09-23",
+ "updated": "2026-09-28",
+ "features": [
+ "durable event store with the canonical envelope",
+ "subscriptions with signed webhook delivery (v1 and v2), retry, dead letters and replay",
+ "priority classes and backpressure",
+ "pull consumers with cursors and checkpoints",
+ "realtime SSE with cursor resume, gap reports and Network tickets",
+ "developer-app publish, read and subscribe with sandbox separation, SSRF-guarded webhooks and project quotas",
+ "hourly project usage rollups (events.usage.recorded)",
+ "redaction tombstones",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
@@ -437,7 +630,7 @@
@@ -437,7 +630,7 @@
"diskUsage": 320,
"diskUsage": 320,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Examples",
"name": "OpenVibe.Examples",
- "pushedAt": "2026-09-26T11:53:18Z",
+ "pushedAt": "2026-09-28T03:20:49Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -446,8 +639,18 @@
@@ -446,8 +639,18 @@
"code": true,
"code": true,
"wave": "W20",
"wave": "W20",
"version": "0.3.0",
"version": "0.3.0",
- "sdk": "openvibe-sdk v0.4.0",
- "contracts": "openvibe-contracts v0.28.0 (mod-manifest example)",
+ "sdk": "openvibe-sdk v0.11.0",
+ "contracts": "openvibe-contracts v0.49.0 (mod-manifest example)",
+ "deployed": false,
+ "deployment": "none: a repository with CI, not a runtime and not a published package",
+ "features": [
+ "nine copyable examples: browser app, Node server app, Media uploader, event subscriber, webhook consumer, tool job, OAuth app, chat bot, mod manifest",
+ "smoke tests against openvibe-sdk/testing's mock platform, offline",
+ "create-openvibe-app scaffolder",
+ "npm run e2e against the real platform (on demand)",
+ "developer path check (mock in CI, real on demand)",
+ "public-surface check: no loopback keys, internal routes or secret values"
+ ],
"ci": "every example's smoke test runs on Node 22.22.1 against openvibe-sdk/testing's mock platform (developer-app rules for Events, Media and Tools as in production) plus a local Chat WebSocket mock; none reaches the network; a second job runs the developer path check (scripts/developer-path.js) against the same mock platform",
"ci": "every example's smoke test runs on Node 22.22.1 against openvibe-sdk/testing's mock platform (developer-app rules for Events, Media and Tools as in production) plus a local Chat WebSocket mock; none reaches the network; a second job runs the developer path check (scripts/developer-path.js) against the same mock platform",
"e2e": "npm run e2e runs media-uploader, event-subscriber (pull) and tool-job against the real platform with a sandbox app's OV_CLIENT_ID/OV_CLIENT_SECRET/OV_PROJECT_ID; on demand only, not in CI or npm test; not run against production as part of this release",
"e2e": "npm run e2e runs media-uploader, event-subscriber (pull) and tool-job against the real platform with a sandbox app's OV_CLIENT_ID/OV_CLIENT_SECRET/OV_PROJECT_ID; on demand only, not in CI or npm test; not run against production as part of this release",
"platform": "sandbox developer path (projects, sandbox grants, app tokens for openvibe.media/events/tools, Media project tenant, Events app.<project_key>.* events, Tools jobs, CORS-open discovery) verified in production on 2026-09-23 by the platform's W20 exit check (a curl script against the public endpoints); that check is now committed as npm run developer-path (SDK and examples, plus credential rotation, revocation and archive), which runs in CI against the mock platform and on demand against production (credentials from env only; refuses in CI against production); not yet run against production",
"platform": "sandbox developer path (projects, sandbox grants, app tokens for openvibe.media/events/tools, Media project tenant, Events app.<project_key>.* events, Tools jobs, CORS-open discovery) verified in production on 2026-09-23 by the platform's W20 exit check (a curl script against the public endpoints); that check is now committed as npm run developer-path (SDK and examples, plus credential rotation, revocation and archive), which runs in CI against the mock platform and on demand against production (credentials from env only; refuses in CI against production); not yet run against production",
@@ -459,7 +662,7 @@
@@ -459,7 +662,7 @@
"mod publishing is first-party"
"mod publishing is first-party"
],
],
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026), §15.1, §18.9; roadmap Wave 20, §30, ADR-014",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026), §15.1, §18.9; roadmap Wave 20, §30, ADR-014",
- "updated": "2026-09-23"
+ "updated": "2026-09-28"
}
}
},
},
{
{
@@ -511,20 +714,50 @@
@@ -511,20 +714,50 @@
},
},
{
{
"description": "",
"description": "",
- "diskUsage": 5417,
+ "diskUsage": 5596,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Games",
"name": "OpenVibe.Games",
- "pushedAt": "2026-09-26T12:39:26Z",
+ "pushedAt": "2026-09-28T03:20:51Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
- "status": null
+ "status": {
+ "repository": "OpenVibers/OpenVibe.Games",
+ "stage": "stable",
+ "code": true,
+ "product": "Scraplandia",
+ "runtime": "node 22, TypeScript (tsx), pnpm workspace; Babylon.js + Havok; better-sqlite3",
+ "port": 8000,
+ "domain": "openvibe.games, play.openvibe.games",
+ "contracts": "openvibe-contracts v0.71.0 (apps/server/package.json)",
+ "capabilities": [
+ "games.mod.manage",
+ "games.mod.read",
+ "games.world.announce",
+ "games.prop.place"
+ ],
+ "deployed": true,
+ "deployment": "Public at https://openvibe.games and https://play.openvibe.games: deployed with `sudo ovhost deploy games` (OpenVibe.Host strategy pnpm-build since the 2026-09-27 cutover; deploy/scripts/deploy.sh is the wrapper), unit openvibe-games on 127.0.0.1:8000, env /etc/openvibe/games.env, principal games.",
+ "features": [
+ "authoritative multiplayer physics sandbox (Havok on the server)",
+ "Source-style movement, physgun building, gathering, crafting, skills",
+ "persistent world, characters and props in SQLite",
+ "map editor with assets mirrored to OpenVibe.Media",
+ "declarative mods (games-content@1) with per-install grants and audit",
+ "players keyed by Network subjects",
+ "games.* events through a transactional outbox",
+ "games.progress.summary user module",
+ "the OpenVibe Frame from its own pinned copy",
+ "per-actor limits on capability-boundary writes (openvibe-sdk/limits)"
+ ],
+ "updated": "2026-09-28"
+ }
},
},
{
{
"description": "The network's deployment/control plane first; then isolated hosting for community sites, bots and mods.",
"description": "The network's deployment/control plane first; then isolated hosting for community sites, bots and mods.",
- "diskUsage": 950,
+ "diskUsage": 1384,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Host",
"name": "OpenVibe.Host",
- "pushedAt": "2026-09-26T13:23:30Z",
+ "pushedAt": "2026-09-28T03:22:19Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -537,10 +770,11 @@
@@ -537,10 +770,11 @@
"port": 4910,
"port": 4910,
"domain": "openvibe.host",
"domain": "openvibe.host",
"tenantDomain": "*.openvibe.host",
"tenantDomain": "*.openvibe.host",
+ "contracts": "openvibe-contracts v0.66.0",
"packages": [
"packages": [
- "openvibe-contracts v0.33.0 (host.* capabilities and manifest released in v0.24.0; v0.32.0 adds the takedown routes to host.site.manage)",
- "openvibe-sdk v0.5.0",
- "openvibe-shared v1.5.1"
+ "openvibe-contracts v0.66.0 (host.* capabilities and manifest released in v0.24.0; v0.32.0 adds the takedown routes to host.site.manage)",
+ "openvibe-sdk v0.12.0",
+ "openvibe-shared v1.22.0"
],
],
"capabilities": [
"capabilities": [
"host.site.manage",
"host.site.manage",
@@ -557,7 +791,7 @@
@@ -557,7 +791,7 @@
"host.release.published"
"host.release.published"
],
],
"stages": {
"stages": {
- "A": "alpha: ovhost CLI installed on the production host 2026-09-23 (/usr/local/bin/ovhost, inventory /etc/openvibe/host.json); status/validate/backup/drill used there (19 restore drills passed 2026-09-23, docs/restore-drills.md); no service deploy has moved to it yet; the D41 deploy-and-rollback proof (scripts/d41-proof.sh) is written and tested, not run",
+ "A": "alpha: ovhost CLI installed on the production host 2026-09-23 (/usr/local/bin/ovhost, inventory /etc/openvibe/host.json); every service deploys with `sudo ovhost deploy <svc>` since the 2026-09-27 cutover (roadmap WS-N task 11: Live, Tools, Sites, Games and OpenRe through the release-layout, multi-app, static-build and pnpm-build strategies); nightly backups, restore drills (19 passed 2026-09-23, docs/restore-drills.md), release notifications, incidents and maintenance, the alerts relay; the D41 deploy-and-rollback proof (scripts/d41-proof.sh) is written and tested",
"B": "alpha: running on the host on loopback :4910 (2026-09-23 audit), not launched; launch-rule items met in code and tests, launch steps in docs/launch.md, threat review in docs/threat-review.md",
"B": "alpha: running on the host on loopback :4910 (2026-09-23 audit), not launched; launch-rule items met in code and tests, launch steps in docs/launch.md, threat review in docs/threat-review.md",
"C": "not started (deliberately: blocked until isolation and metering are proven)"
"C": "not started (deliberately: blocked until isolation and metering are proven)"
},
},
@@ -567,47 +801,179 @@
@@ -567,47 +801,179 @@
"deployed": "loopback only, not launched",
"deployed": "loopback only, not launched",
"placeholderInSites": true,
"placeholderInSites": true,
"adoptedByServices": [],
"adoptedByServices": [],
- "updated": "2026-09-23",
+ "updated": "2026-09-28",
"capabilitiesNote": "released in openvibe-contracts v0.24.0; v0.32.0 adds the four takedown routes to host.site.manage.implementedBy",
"capabilitiesNote": "released in openvibe-contracts v0.24.0; v0.32.0 adds the four takedown routes to host.site.manage.implementedBy",
- "launchReady": true
+ "launchReady": true,
+ "features": [
+ "ovhost: inventory, validate, plan, deploy with automatic rollback, rollback, status, releases",
+ "deploy strategies: git-checkout, multi-app, static-build, pnpm-build, release-layout",
+ "protected-session probes and drain policies (--wait-idle)",
+ "certificate inventory and transactional nginx vhost install",
+ "scheduled SQLite backups with retention and encrypted off-host copies",
+ "restore drills",
+ "release notifications (host.release.published), incidents, maintenance windows and freezes",
+ "Prometheus alerts relay to Network",
+ "browser check and release-lifecycle acceptance suite",
+ "Stage B: tenant static sites with immutable deploys, activation, rollback, custom domains, quotas and takedowns (not launched)",
+ "per-actor limits on Stage B writes (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "",
"description": "",
- "diskUsage": 8126,
+ "diskUsage": 9109,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Live",
"name": "OpenVibe.Live",
- "pushedAt": "2026-09-26T13:24:25Z",
+ "pushedAt": "2026-09-28T03:25:00Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
- "status": null
+ "status": {
+ "repository": "OpenVibers/OpenVibe.Live",
+ "stage": "stable",
+ "code": true,
+ "runtime": "node 22, express, better-sqlite3, node-media-server, mediasoup; no build step",
+ "port": 3000,
+ "domain": "openvibe.live (www, ingest, whip)",
+ "contracts": "openvibe-contracts v0.71.0",
+ "sdk": "openvibe-sdk v0.12.0",
+ "capabilities": [
+ "live.chat_context.read",
+ "live.chat_effects.write",
+ "live.chat_mirror.write",
+ "live.follower.read",
+ "live.lineage.resolve",
+ "live.tips_delivery.write",
+ "live.channel.read",
+ "live.stream.read",
+ "live.discovery.read",
+ "live.owner.resolve"
+ ],
+ "deployed": true,
+ "deployment": "Production release layout /opt/openvibe.live (current -> releases/<time>-<sha>), unit openvibe-live.service on the systemd socket 127.0.0.1:3000, deployed with `sudo ovhost deploy live --wait-idle`.",
+ "features": [
+ "RTMP, WHIP, WebRTC and JSMPEG ingest; viewer playback; the broadcast page",
+ "channels, go-live, stream keys, managed streams, restreaming (managed ingest on OpenRe.Stream)",
+ "the watch page and its chat surface (messages stored by OpenVibe.Chat), TTS, sounds, emotes, overlays",
+ "VODs and clips recorded and stored by OpenVibe.Media; pastes and comments on OpenVibe.Community",
+ "AI viewers, stream memories, overviews, moments, recaps, translation: every prompt an OpenVibe.AI template; VOD and clip transcripts by window on OpenVibe.AI",
+ "streamers' own AI keys stored encrypted in OpenVibe.AI; per-streamer daily AI budgets as AI quotas",
+ "channel points and Vibes; the Arena (Battle Cam); after-show recaps; the Star of OpenVibe",
+ "per-actor limits on API writes; account export and deletion contributions; follows on OpenVibe.Network"
+ ],
+ "updated": "2026-09-28"
+ }
},
},
{
{
"description": "",
"description": "",
- "diskUsage": 1696,
+ "diskUsage": 2022,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Media",
"name": "OpenVibe.Media",
- "pushedAt": "2026-09-26T13:23:33Z",
+ "pushedAt": "2026-09-28T03:20:55Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
- "status": null
+ "status": {
+ "repository": "OpenVibers/OpenVibe.Media",
+ "stage": "beta",
+ "code": true,
+ "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
+ "runtime": "node 22, express, better-sqlite3, ffmpeg",
+ "port": 4100,
+ "domain": "openvibe.media",
+ "contracts": "openvibe-contracts v0.71.0",
+ "capabilities": [
+ "media.object.upload",
+ "media.object.read",
+ "media.object.list",
+ "media.object.delete",
+ "media.upload.create",
+ "media.derivative.create",
+ "media.derivative.read",
+ "media.lifecycle.read",
+ "media.lifecycle.transition"
+ ],
+ "capabilitiesRegistered": true,
+ "pastes": "OpenVibe.Community is the paste authority since 2026-09-22 (PASTES_FROZEN_APPS=live, PASTES_MOVED_TO); the paste routes stay as the rollback path",
+ "deployed": true,
+ "deployment": "Public at https://openvibe.media: deployed with `sudo ovhost deploy media` (restart refused while a VOD records; --wait-idle), /opt/openvibe.media, unit openvibe-media on 127.0.0.1:4100 behind the openvibe.media nginx vhost, principal media.",
+ "features": [
+ "VOD recording (RTMP pull, RTP ingest), chunk ingest and finalize",
+ "clip cutting",
+ "storage tiering local, Backblaze B2, Cloudflare R2 with copy verification and a disk guardian",
+ "canonical object model (/api/v2) with namespaces, holds, derivatives and lifecycle",
+ "media jobs with leases, retries and proposals",
+ "multi-tenant apps and developer-project tenants (sandbox separated)",
+ "public serving with presigned URLs; signed access for private and sandbox items",
+ "the object explorer (/me) and operator views",
+ "media.* events through the SDK outbox, webhooks during the transition",
+ "restore-drill mode and N-1 compatibility tests",
+ "per-actor limits (openvibe-sdk/limits)"
+ ],
+ "updated": "2026-09-28"
+ }
},
},
{
{
"description": "",
"description": "",
- "diskUsage": 2413,
+ "diskUsage": 3416,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Network",
"name": "OpenVibe.Network",
- "pushedAt": "2026-09-26T13:27:42Z",
+ "pushedAt": "2026-09-28T03:20:56Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
- "status": null
+ "status": {
+ "repository": "OpenVibers/OpenVibe.Network",
+ "stage": "stable",
+ "code": true,
+ "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
+ "runtime": "node 22, express, better-sqlite3",
+ "port": 4000,
+ "domain": "openvibe.network (with auth., api., admin., my. and themes.openvibe.network in its manifest)",
+ "contracts": "openvibe-contracts v0.75.0",
+ "capabilities": [
+ "identity.subject.resolve",
+ "mods.grant.manage",
+ "network.account.deletion.confirm",
+ "network.account.export.contribute",
+ "network.analytics.creator.read",
+ "network.blocks.read",
+ "network.coins.credit",
+ "network.coins.debit",
+ "network.coins.transfer",
+ "network.follows.read",
+ "network.follows.write",
+ "network.integration.github.read",
+ "network.modules.read",
+ "network.modules.write",
+ "network.notifications.push",
+ "network.operator.alert",
+ "network.project.manage",
+ "network.project.read",
+ "network.staff.read",
+ "network.status.incident"
+ ],
+ "capabilitiesRegistered": true,
+ "deployed": true,
+ "deployment": "Public at https://openvibe.network: deployed with `sudo ovhost deploy network --install-units` (deploy/scripts/deploy.sh is the wrapper), /opt/openvibe.network, unit openvibe-network on 127.0.0.1:4000, env /etc/openvibe/network.env.",
+ "features": [
+ "SSO identity provider: OAuth2 code flow with PKCE, OIDC, FedCM, rotating refresh tokens",
+ "canonical subjects, anonymous users, multi-account switching, account merge, export and deletion",
+ "service principals and grants; developer projects, apps, credentials, grants, quotas and usage",
+ "notifications (realtime through Events), email and web push",
+ "themes and preferences, user modules, platform blocks, follow graph, creator analytics",
+ "OpenCoins wallet",
+ "service registry, public discovery and the status page with incidents",
+ "operator alerts relay target and admin panel",
+ "serves /shared/* from its pinned openvibe-shared",
+ "per-actor limits (openvibe-sdk/limits)"
+ ],
+ "updated": "2026-09-28"
+ }
},
},
{
{
"description": "Source-backed stories: clustered coverage, cited summaries, perspectives and timelines.",
"description": "Source-backed stories: clustered coverage, cited summaries, perspectives and timelines.",
- "diskUsage": 447,
+ "diskUsage": 466,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.News",
"name": "OpenVibe.News",
- "pushedAt": "2026-09-26T13:23:41Z",
+ "pushedAt": "2026-09-28T03:20:58Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -619,11 +985,12 @@
@@ -619,11 +985,12 @@
"runtime": "node 22, express 4, better-sqlite3 11",
"runtime": "node 22, express 4, better-sqlite3 11",
"port": 4820,
"port": 4820,
"domain": "openvibe.news",
"domain": "openvibe.news",
+ "contracts": "openvibe-contracts v0.49.0",
"packages": [
"packages": [
- "openvibe-publishing v0.2.1",
- "openvibe-contracts v0.33.0",
- "openvibe-shared v1.5.1",
- "openvibe-sdk v0.5.0"
+ "openvibe-publishing v0.4.0",
+ "openvibe-contracts v0.49.0",
+ "openvibe-shared v1.22.0",
+ "openvibe-sdk v0.12.0"
],
],
"capabilities": [
"capabilities": [
"news.story.create",
"news.story.create",
@@ -644,17 +1011,32 @@
@@ -644,17 +1011,32 @@
"ai": "optional seam (news.summarize_story, news.compare_perspectives) tested against a mock; not configured in production (OV_AI_INTERNAL_URL unset); OpenVibe.AI output only ever lands as a draft that needs a person's review",
"ai": "optional seam (news.summarize_story, news.compare_perspectives) tested against a mock; not configured in production (OV_AI_INTERNAL_URL unset); OpenVibe.AI output only ever lands as a draft that needs a person's review",
"seed": "topics only (12 in production); no stories, source items or clusters",
"seed": "topics only (12 in production); no stories, source items or clusters",
"deployed": true,
"deployed": true,
- "deployment": "openvibe-ovh, unit openvibe-news, 127.0.0.1:4820 loopback only (release 1802e7d); /api/ready 200; production database holds 12 topics and 0 stories. Deployed internally, not launched: openvibe.news still serves the OpenVibe.Sites placeholder until a person verifies a news source's terms, enables it in Sources, and an editor publishes a reviewed story",
+ "deployment": "Deployed with `sudo ovhost deploy news`: unit openvibe-news, 127.0.0.1:4820 loopback only; on 2026-09-23 /api/ready answered 200 and the production database held 12 topics and 0 stories. Deployed internally, not launched: openvibe.news still serves the OpenVibe.Sites placeholder until a person verifies a news source's terms, enables it in Sources, and an editor publishes a reviewed story",
"placeholderInSites": true,
"placeholderInSites": true,
- "updated": "2026-09-23"
+ "updated": "2026-09-28",
+ "features": [
+ "Sources ingestion by Events subscription and cursor pull, with dedupe",
+ "failed ingestion recorded, never fabricated",
+ "deterministic, explained clusters with audited merge and split",
+ "stories whose paragraphs cite Sources items; no publish without sources",
+ "revisions, corrections, timelines, perspectives and final retractions",
+ "independent-source index gate",
+ "licensing limits on stored and shown text",
+ "Community comment threads by reference",
+ "optional OpenVibe.AI drafts that need a person's review",
+ "server-rendered editorial and public pages useful without JavaScript",
+ "/api/v1 by capability",
+ "SDK outbox events and Search index documents",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "Shared publishing packages (drafts, revisions, citations, SEO gate, feeds, structured data) for Wiki, Blog, News, Reviews, Deals, Coupons and Trade. Packages only, no authority.",
"description": "Shared publishing packages (drafts, revisions, citations, SEO gate, feeds, structured data) for Wiki, Blog, News, Reviews, Deals, Coupons and Trade. Packages only, no authority.",
- "diskUsage": 247,
+ "diskUsage": 248,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Publishing",
"name": "OpenVibe.Publishing",
- "pushedAt": "2026-09-26T13:23:45Z",
+ "pushedAt": "2026-09-28T03:21:00Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -664,7 +1046,7 @@
@@ -664,7 +1046,7 @@
"wave": "W15",
"wave": "W15",
"kind": "packages",
"kind": "packages",
"package": "openvibe-publishing",
"package": "openvibe-publishing",
- "version": "0.2.1",
+ "version": "0.4.0",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"runtime": null,
"runtime": null,
"port": null,
"port": null,
@@ -680,22 +1062,38 @@
@@ -680,22 +1062,38 @@
"seo",
"seo",
"authorship",
"authorship",
"index-hooks",
"index-hooks",
+ "ai",
"ssr"
"ssr"
],
],
"consumers": [
"consumers": [
- "OpenVibe.Wiki (v0.2.1; public at https://openvibe.wiki)",
- "OpenVibe.Blog (v0.2.1; public at https://openvibe.blog)",
- "OpenVibe.News (v0.2.1; deployed loopback-only, not launched)",
- "OpenVibe.Reviews (v0.2.1; deployed loopback-only, not launched)",
- "OpenVibe.Deals (v0.2.1; deployed loopback-only, not launched)",
- "OpenVibe.Coupons (v0.2.1; deployed loopback-only, not launched)",
- "OpenVibe.Trade (v0.2.1; deployed loopback-only, not launched)"
+ "OpenVibe.Wiki (v0.4.0; public at https://openvibe.wiki)",
+ "OpenVibe.Blog (v0.4.0; public at https://openvibe.blog)",
+ "OpenVibe.News (v0.4.0; deployed loopback-only, not launched)",
+ "OpenVibe.Reviews (v0.4.0; deployed loopback-only, not launched)",
+ "OpenVibe.Deals (v0.4.0; deployed loopback-only, not launched)",
+ "OpenVibe.Coupons (v0.4.0; deployed loopback-only, not launched)",
+ "OpenVibe.Trade (v0.4.0; deployed loopback-only, not launched)"
],
],
"plannedConsumers": [],
"plannedConsumers": [],
"exitProof": "examples/two-products + test/two-products.test.js",
"exitProof": "examples/two-products + test/two-products.test.js",
- "contracts": "openvibe-contracts v0.33.0: emits search.index-document@1 and events.event-envelope@1 (validated in tests)",
+ "contracts": "openvibe-contracts v0.49.0 (devDependency): emits search.index-document@1 and events.event-envelope@1 (validated in tests)",
"released": true,
"released": true,
- "updated": "2026-09-23"
+ "deployed": false,
+ "deployment": "none: a package released as git tags; products pin the tag and deploy it with their own releases",
+ "features": [
+ "revisions with optimistic concurrency, diff and revert",
+ "idempotent lease-based scheduling",
+ "taxonomy with hierarchical categories",
+ "append-only citations",
+ "Media attachment references with honest broken states",
+ "Community discussion references",
+ "deterministic indexability gate, redirects, sitemaps and feeds",
+ "authorship and AI disclosure, held until a person's review",
+ "OpenVibe.AI draft client",
+ "Search index documents, tombstones and publication events",
+ "auto-escaping SSR and a safe Markdown subset"
+ ],
+ "updated": "2026-09-28"
}
}
},
},
{
{
@@ -718,10 +1116,10 @@
@@ -718,10 +1116,10 @@
},
},
{
{
"description": "Review signals gathered across sources with provenance, entity resolution and honest aggregates.",
"description": "Review signals gathered across sources with provenance, entity resolution and honest aggregates.",
- "diskUsage": 503,
+ "diskUsage": 501,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Reviews",
"name": "OpenVibe.Reviews",
- "pushedAt": "2026-09-26T13:23:49Z",
+ "pushedAt": "2026-09-28T03:21:02Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -733,11 +1131,11 @@
@@ -733,11 +1131,11 @@
"runtime": "node 22, express, better-sqlite3",
"runtime": "node 22, express, better-sqlite3",
"port": 4830,
"port": 4830,
"domain": "openvibe.reviews",
"domain": "openvibe.reviews",
- "contracts": "openvibe-contracts v0.33.0",
+ "contracts": "openvibe-contracts v0.49.0",
"packages": [
"packages": [
- "openvibe-publishing v0.2.1",
- "openvibe-shared v1.5.1",
- "openvibe-sdk v0.5.0"
+ "openvibe-publishing v0.4.0",
+ "openvibe-shared v1.22.0",
+ "openvibe-sdk v0.12.0"
],
],
"capabilities": [
"capabilities": [
"reviews.entity.resolve",
"reviews.entity.resolve",
@@ -751,19 +1149,33 @@
@@ -751,19 +1149,33 @@
],
],
"capabilitiesRegistered": true,
"capabilitiesRegistered": true,
"deployed": true,
"deployed": true,
- "deployment": "openvibe-ovh, unit openvibe-reviews, 127.0.0.1:4830 loopback only (release 3151c05); /api/ready 200; Events subscription sources.item.* in place; production database holds 0 entities and 0 signals. Deployed internally, not launched: openvibe.reviews still serves the OpenVibe.Sites placeholder until a person verifies a review source's terms and enables it in Sources, and an editor publishes (REVIEWS_EDITORS holds the owner only)",
+ "deployment": "Deployed with `sudo ovhost deploy reviews`: unit openvibe-reviews, 127.0.0.1:4830 loopback only; Events subscription sources.item.* in place; on 2026-09-23 /api/ready answered 200 and the production database held 0 entities and 0 signals. Deployed internally, not launched: openvibe.reviews still serves the OpenVibe.Sites placeholder until a person verifies a review source's terms and enables it in Sources, and an editor publishes (REVIEWS_EDITORS holds the owner only)",
"onOpenVibeSites": true,
"onOpenVibeSites": true,
"seed": "none: no entities, signals, summaries or ratings are seeded",
"seed": "none: no entities, signals, summaries or ratings are seeded",
"dataSource": "OpenVibe.Sources category reviews; no review source is enabled there yet (all 6 Sources seeds are disabled)",
"dataSource": "OpenVibe.Sources category reviews; no review source is enabled there yet (all 6 Sources seeds are disabled)",
- "updated": "2026-09-23"
+ "updated": "2026-09-28",
+ "features": [
+ "signals from OpenVibe.Sources by cursor pull and signed webhook, with provenance",
+ "deterministic entity resolution; a name alone never resolves",
+ "aggregates only from existing signals, with revisions",
+ "exact merge and split round trips, audited",
+ "editor trust decisions shown with reasons",
+ "summaries written or approved by a person; AI drafts never yield a rating",
+ "public corrections as new revisions",
+ "Community discussion threads by reference",
+ "server-rendered pages and editor workflows useful without JavaScript",
+ "/api/v1 by capability",
+ "SDK outbox events and Search index documents",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "Supported browser and server clients for the OpenVibe platform.",
"description": "Supported browser and server clients for the OpenVibe platform.",
- "diskUsage": 657,
+ "diskUsage": 706,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.SDK",
"name": "OpenVibe.SDK",
- "pushedAt": "2026-09-25T22:31:12Z",
+ "pushedAt": "2026-09-28T03:23:32Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -771,17 +1183,33 @@
@@ -771,17 +1183,33 @@
"stage": "alpha",
"stage": "alpha",
"code": true,
"code": true,
"wave": "W2",
"wave": "W2",
- "version": "0.6.0",
+ "version": "0.12.0",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026), §3.2; roadmap §30",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026), §3.2; roadmap §30",
- "updated": "2026-09-23"
+ "deployed": false,
+ "deployment": "none: a package released as git tags; services and apps pin a tag",
+ "contracts": "openvibe-contracts v0.49.0 (devDependency; runtime contracts range >=0.5.0 <1.0.0)",
+ "features": [
+ "core client: retries, timeouts, problem+json errors, trace propagation",
+ "auth: service and app tokens, PKCE, offline verification, revocation cutoffs",
+ "registry discovery and contracts version checks",
+ "events: publish, pull, app events, webhook verification (v2), outbox and inbox",
+ "realtime SSE",
+ "media files and objects v2",
+ "community, search, chat, ai, jobs, tools, projects, modules, identity and vip clients",
+ "per-actor limiter for services (openvibe-sdk/limits)",
+ "the OpenVibe Frame for any app",
+ "mock platform for tests (openvibe-sdk/testing)",
+ "ESM entries, TypeScript types and a browser bundle"
+ ],
+ "updated": "2026-09-28"
}
}
},
},
{
{
"description": "Permission-aware, event-fed search index for the network: canonical index documents, ACL-filtered queries, deletion propagation.",
"description": "Permission-aware, event-fed search index for the network: canonical index documents, ACL-filtered queries, deletion propagation.",
- "diskUsage": 278,
+ "diskUsage": 318,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Search",
"name": "OpenVibe.Search",
- "pushedAt": "2026-09-26T13:23:54Z",
+ "pushedAt": "2026-09-28T03:21:06Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -792,11 +1220,12 @@
@@ -792,11 +1220,12 @@
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"runtime": "node 22, express, better-sqlite3 (FTS5)",
"runtime": "node 22, express, better-sqlite3 (FTS5)",
"port": 4710,
"port": 4710,
- "domain": "search.openvibe.network (vhost in deploy/nginx, not installed: until it is, the name falls through to the admin.openvibe.network placeholder; README \"Public host\")",
- "contracts": "openvibe-contracts v0.33.0",
+ "domain": "search.openvibe.network (vhost in deploy/nginx; the service manifest records the search page and query API as public since 2026-09-23)",
+ "contracts": "openvibe-contracts v0.49.0",
"capabilities": [
"capabilities": [
"search.document.write",
"search.document.write",
- "search.query.delegate"
+ "search.query.delegate",
+ "search.query.run"
],
],
"capabilitiesRegistered": true,
"capabilitiesRegistered": true,
"contractsProposed": [
"contractsProposed": [
@@ -804,7 +1233,7 @@
@@ -804,7 +1233,7 @@
],
],
"engine": "sqlite-fts5 (docs/adr-engine.md)",
"engine": "sqlite-fts5 (docs/adr-engine.md)",
"deployed": true,
"deployed": true,
- "deployment": "Deployed internally, not launched: /opt/openvibe.search at 5a7e59b, unit openvibe-search, 127.0.0.1:4710 only, principal search, Events subscription *.index_document.*, accepted event owners sources, wiki, blog, news, reviews, trade, deals, coupons. Production index: 10 documents, all tombstones (wiki), 0 public. Restore drill passed 2026-09-23.",
+ "deployment": "Deployed with `sudo ovhost deploy search`: /opt/openvibe.search, unit openvibe-search, 127.0.0.1:4710, principal search, Events subscription *.index_document.*, accepted event owners sources, wiki, blog, news, reviews, trade, deals, coupons. On 2026-09-23 the production index held 10 documents, all tombstones (wiki), 0 public. Restore drill passed 2026-09-23.",
"indexedProducers": [
"indexedProducers": [
"wiki (tombstones only so far)"
"wiki (tombstones only so far)"
],
],
@@ -816,17 +1245,18 @@
@@ -816,17 +1245,18 @@
"saved searches (notifications wait for Network notifications)",
"saved searches (notifications wait for Network notifications)",
"server-rendered search page",
"server-rendered search page",
"owner removal feed",
"owner removal feed",
- "Cloudflare purge queue (inert until CLOUDFLARE_PURGE_TOKEN is set)"
+ "Cloudflare purge queue (inert until CLOUDFLARE_PURGE_TOKEN is set)",
+ "per-actor limits (openvibe-sdk/limits)"
],
],
- "updated": "2026-09-23"
+ "updated": "2026-09-28"
}
}
},
},
{
{
"description": "Versioned UI, chrome, SEO, legal and release-client packages every OpenVibe site renders.",
"description": "Versioned UI, chrome, SEO, legal and release-client packages every OpenVibe site renders.",
- "diskUsage": 843,
+ "diskUsage": 1084,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Shared",
"name": "OpenVibe.Shared",
- "pushedAt": "2026-09-26T13:06:00Z",
+ "pushedAt": "2026-09-28T03:21:08Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -835,27 +1265,74 @@
@@ -835,27 +1265,74 @@
"code": true,
"code": true,
"wave": "W2",
"wave": "W2",
"package": "openvibe-shared",
"package": "openvibe-shared",
- "version": "1.8.0",
+ "version": "1.23.1",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
- "updated": "2026-09-24"
+ "deployed": false,
+ "deployment": "none of its own: a package released as git tags; OpenVibe.Network serves /shared/* from its pinned tag, and a site can serve its own pinned copy (openvibe-shared/serve)",
+ "contracts": "openvibe-contracts v0.61.0 (devDependency: the release manifest contract)",
+ "features": [
+ "the OpenVibe Frame: navbar, footer, panels, account switcher, notification UI with realtime",
+ "themes, design tokens and icons",
+ "release manifest, in-place updates in open tabs and update metrics",
+ "web runtime (feature loader)",
+ "shipped pill, recent list and /updates log",
+ "server helpers: ready, metrics, trace, egress, config, analytics, legal, SEO, frame SSR",
+ "browser harness and perf budgets for tests"
+ ],
+ "updated": "2026-09-28"
}
}
},
},
{
{
"description": "Static front pages for OpenVibe domains that are not full apps yet",
"description": "Static front pages for OpenVibe domains that are not full apps yet",
- "diskUsage": 741,
+ "diskUsage": 967,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Sites",
"name": "OpenVibe.Sites",
- "pushedAt": "2026-09-26T13:23:57Z",
+ "pushedAt": "2026-09-28T03:21:10Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
- "status": null
+ "status": {
+ "repository": "OpenVibers/OpenVibe.Sites",
+ "stage": "stable",
+ "code": true,
+ "kind": "static site generator",
+ "domains": [
+ "openvibe.news",
+ "openvibe.reviews",
+ "openvibe.tips",
+ "openvibe.vip",
+ "openvibe.trade",
+ "openvibe.host",
+ "openvibe.deals",
+ "openvibe.coupons",
+ "openre.stream",
+ "auth.openvibe.network",
+ "api.openvibe.network",
+ "admin.openvibe.network",
+ "themes.openvibe.network",
+ "ai.openvibe.network",
+ "realtime.openvibe.network (closed notice)",
+ "status.openvibe.network (status notice)"
+ ],
+ "contracts": "none: package.json pins no openvibe-contracts (openvibe-shared v1.23.0 only)",
+ "deployed": true,
+ "deployment": "Deployed with `sudo ovhost deploy sites --restart` (OpenVibe.Host strategy static-build since the 2026-09-27 cutover): /opt/openvibe.sites, nginx serves dist/<domain>/ through deploy/nginx/<domain>.conf; no unit, no port, no env file",
+ "features": [
+ "one catalog and one template for every placeholder and notice page",
+ "labels built from facts.json (each repository's STATUS.json and Network's registry), never a hand-kept list",
+ "the pinned OpenVibe Frame served from dist/_shared/",
+ "full SEO: canonical, Open Graph, Twitter, JSON-LD, robots, sitemap, manifest",
+ "404 pages and generated nginx vhosts",
+ "a release.json per domain and host.release.published on deploy"
+ ],
+ "updated": "2026-09-28"
+ }
},
},
{
{
"description": "Source registry and ingestion workers for the network: provenance, terms, rate limits, explicit failure states.",
"description": "Source registry and ingestion workers for the network: provenance, terms, rate limits, explicit failure states.",
- "diskUsage": 299,
+ "diskUsage": 309,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Sources",
"name": "OpenVibe.Sources",
- "pushedAt": "2026-09-26T13:24:02Z",
+ "pushedAt": "2026-09-28T03:21:12Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -866,8 +1343,8 @@
@@ -866,8 +1343,8 @@
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"runtime": "node 22, express, better-sqlite3, fast-xml-parser",
"runtime": "node 22, express, better-sqlite3, fast-xml-parser",
"port": 4720,
"port": 4720,
- "domain": "sources.openvibe.network (vhost in deploy/nginx, not installed: until it is, the name falls through to the admin.openvibe.network placeholder; once installed it answers an internal-service page, health and JSON 404s, API loopback-only; README \"Public host\")",
- "contracts": "openvibe-contracts v0.33.0",
+ "domain": "sources.openvibe.network (vhost in deploy/nginx: an internal-service page, health and JSON 404s; the API is loopback-only; README \"Public host\")",
+ "contracts": "openvibe-contracts v0.49.0",
"capabilities": [
"capabilities": [
"sources.source.read",
"sources.source.read",
"sources.item.read",
"sources.item.read",
@@ -889,16 +1366,28 @@
@@ -889,16 +1366,28 @@
"seededSources": 6,
"seededSources": 6,
"enabledSources": 0,
"enabledSources": 0,
"deployed": true,
"deployed": true,
- "deployment": "Deployed internally, not launched: /opt/openvibe.sources at f727a40 since 2026-09-23 (origin 60a920d adds only an nginx file), unit openvibe-sources, 127.0.0.1:4720 only, principal sources. All 6 seeds disabled; 0 fetch runs and 0 items in production. Restore drill passed 2026-09-23.",
- "updated": "2026-09-23"
+ "deployment": "Deployed with `sudo ovhost deploy sources`: /opt/openvibe.sources, unit openvibe-sources, 127.0.0.1:4720, principal sources. All 6 seeds disabled; on 2026-09-23 production had 0 fetch runs and 0 items. Restore drill passed 2026-09-23.",
+ "features": [
+ "source registry with terms, robots and licence notes",
+ "rss, atom, sitemap, jsonld, api and manual adapters",
+ "polite scheduler: robots.txt, per-host spacing, conditional GET, backoff",
+ "SSRF-guarded fetcher",
+ "failed fetches recorded, never fabricated",
+ "item revisions and sticky removals with provenance",
+ "cursor item API by capability",
+ "transactional outbox to Events",
+ "staff-only index documents for Search",
+ "per-actor limits (openvibe-sdk/limits)"
+ ],
+ "updated": "2026-09-28"
}
}
},
},
{
{
"description": "Creator support: tips, goals, paid messages, TTS and media requests, overlays.",
"description": "Creator support: tips, goals, paid messages, TTS and media requests, overlays.",
- "diskUsage": 496,
+ "diskUsage": 563,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Tips",
"name": "OpenVibe.Tips",
- "pushedAt": "2026-09-26T13:24:05Z",
+ "pushedAt": "2026-09-28T03:21:14Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -909,27 +1398,85 @@
@@ -909,27 +1398,85 @@
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"adr": "ADR-012",
"adr": "ADR-012",
"authoritative": false,
"authoritative": false,
- "deployment": "Deployed internally, not launched: openvibe-ovh /opt/openvibe.tips (release 3fb582e, openvibe-contracts 0.33.0, openvibe-sdk 0.5.0, openvibe-shared 1.5.1), unit openvibe-tips, 127.0.0.1:4610 loopback only; https://openvibe.tips still serves the OpenVibe.Sites placeholder. Principal tips; Events subscriptions billing.transaction.* and billing.receipt.* -> /internal/events (secret rotated 2026-09-24); TIPS_CHAT_ADAPTER is empty (no chat side effects).",
- "notes": "Runtime, API, SSR pages, overlays, the Billing settlement consumer, events outbox, Live import and reconciliation are built, tested and deployed, together with /metrics (loopback only), truthful /api/ready (Billing and Events checks), supporter privacy (anonymous, hidden amount, private message), goal and supporter-page settings, export and erasure (tips.interaction.erased), and moderation (word filter, hide/show, invited moderators, tips.interaction.moderated). Capabilities (17 tips.*) and payload schemas are in openvibe-contracts. Production holds the Live import (3 import runs, the last 2026-09-23 18:31 UTC: 139 interactions, 4 goals, 143 migration maps); 0 creator profiles and 0 overlay tokens (nobody has set up the product). No billing.* event has arrived: Billing runs in shadow. A written internal threat review (docs/threat-review.md) with its fixes and test/security.test.js. Not done: an independent security review; the openvibe.tips launch. Live stays the place tips happen until the Billing cutover (blocked on the owner re-pointing the PowerChat webhook) and the launch rule in README.md holds.",
- "updated": "2026-09-24"
+ "deployed": true,
+ "deployment": "Deployed internally, not launched: deployed with `sudo ovhost deploy tips`, /opt/openvibe.tips, unit openvibe-tips, 127.0.0.1:4610 loopback only; https://openvibe.tips still serves the OpenVibe.Sites placeholder. Principal tips; Events subscriptions billing.transaction.* and billing.receipt.* -> /internal/events (secret rotated 2026-09-24); TIPS_CHAT_ADAPTER is empty (no chat side effects).",
+ "contracts": "openvibe-contracts v0.49.0",
+ "notes": "Runtime, API, SSR pages, overlays, the Billing settlement consumer, events outbox, Live import and reconciliation are built, tested and deployed, together with /metrics (loopback only), truthful /api/ready (Billing and Events checks), supporter privacy (anonymous, hidden amount, private message), goal and supporter-page settings, export and erasure (tips.interaction.erased), moderation (word filter, hide/show, invited moderators, tips.interaction.moderated) and per-actor limits. Capabilities (18 tips.*) and payload schemas are in openvibe-contracts. On 2026-09-24 production held the Live import (3 import runs, the last 2026-09-23 18:31 UTC: 139 interactions, 4 goals, 143 migration maps); 0 creator profiles and 0 overlay tokens (nobody had set up the product). No billing.* event had arrived: Billing runs in shadow. A written internal threat review (docs/threat-review.md) with its fixes and test/security.test.js. Not done: an independent security review; the openvibe.tips launch. Live stays the place tips happen until the Billing cutover (blocked on the owner re-pointing the PowerChat webhook) and the launch rule in README.md holds.",
+ "updated": "2026-09-28",
+ "features": [
+ "tips, paid messages, TTS and media requests settled by OpenVibe.Billing (never Tips' own money)",
+ "goals counted from settled payments only",
+ "overlays with revocable scoped tokens and replay without recharging",
+ "EXTERNAL PowerChat tips from billing.receipt.external",
+ "supporter privacy, export and erasure",
+ "moderation: word filter, hide and show, invited moderators",
+ "Live chat delivery adapter",
+ "Live import and reconciliation against Billing",
+ "server-rendered creator pages useful without JavaScript",
+ "/api/v1 by capability",
+ "SDK outbox and inbox",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "",
"description": "",
- "diskUsage": 3267,
+ "diskUsage": 2632,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Tools",
"name": "OpenVibe.Tools",
- "pushedAt": "2026-09-26T13:24:09Z",
+ "pushedAt": "2026-09-28T03:21:16Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
- "status": null
+ "status": {
+ "repository": "OpenVibers/OpenVibe.Tools",
+ "stage": "stable",
+ "code": true,
+ "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
+ "runtime": "node 22, express, better-sqlite3; eight apps (gateway, maps, food, img, yt, audio, text, docs)",
+ "port": 4001,
+ "ports": {
+ "gateway": 4001,
+ "maps": 4010,
+ "food": 4011,
+ "img": 4012,
+ "yt": 4013,
+ "audio": 4014,
+ "text": 4015,
+ "docs": 4016
+ },
+ "domain": "openvibe.tools and *.openvibe.tools",
+ "contracts": "openvibe-contracts v0.63.0 (each app's package.json; the root package.json pins none)",
+ "capabilities": [
+ "tools.job.create",
+ "tools.job.read",
+ "tools.job.cancel",
+ "tools.tool.read",
+ "tools.tool.run",
+ "tools.net.probe"
+ ],
+ "capabilitiesRegistered": true,
+ "deployed": true,
+ "deployment": "Public at https://openvibe.tools: deployed with `sudo ovhost deploy tools` (OpenVibe.Host strategy multi-app since the 2026-09-27 cutover; deploy/scripts/deploy.sh is the wrapper), /opt/openvibe.tools, units openvibe-tools (gateway, 127.0.0.1:4001) and openvibe-tools-<app> per satellite, env /etc/openvibe/tools.env.",
+ "features": [
+ "tool registry with descriptors, canonical hosts, aliases and owner-attached custom domains",
+ "server-rendered catalog and tool pages with full SEO",
+ "public registry API (tools.tool.read) and run API (tools.tool.run)",
+ "jobs runtime for img, audio and docs with SSE progress and Media results",
+ "net and dev tools on the gateway; maps, food, img, yt, audio, text and docs satellites",
+ "guard: callers, tiered quotas, upload sniffing, SSRF-safe egress, abuse log",
+ "tools.* events and Search documents",
+ "analytics within ADR-021",
+ "per-actor limits (openvibe-sdk/limits)"
+ ],
+ "updated": "2026-09-28"
+ }
},
},
{
{
"description": "Informational watchlists, sourced market context and alerts. No custody, no order execution.",
"description": "Informational watchlists, sourced market context and alerts. No custody, no order execution.",
- "diskUsage": 399,
+ "diskUsage": 418,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Trade",
"name": "OpenVibe.Trade",
- "pushedAt": "2026-09-26T13:24:13Z",
+ "pushedAt": "2026-09-28T03:21:18Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -942,11 +1489,12 @@
@@ -942,11 +1489,12 @@
"port": 4860,
"port": 4860,
"domain": "openvibe.trade",
"domain": "openvibe.trade",
"scope": "informational only (ADR-025): no custody, no order execution, no escrow, no listings between users, no personalised advice",
"scope": "informational only (ADR-025): no custody, no order execution, no escrow, no listings between users, no personalised advice",
+ "contracts": "openvibe-contracts v0.49.0",
"packages": [
"packages": [
- "openvibe-contracts v0.33.0",
- "openvibe-publishing v0.2.1",
- "openvibe-shared v1.5.1",
- "openvibe-sdk v0.5.0"
+ "openvibe-contracts v0.49.0",
+ "openvibe-publishing v0.4.0",
+ "openvibe-shared v1.22.0",
+ "openvibe-sdk v0.12.0"
],
],
"capabilities": [
"capabilities": [
"trade.instrument.resolve",
"trade.instrument.resolve",
@@ -967,17 +1515,31 @@
@@ -967,17 +1515,31 @@
"marketDataFeeds": "none configured: the only seeded trade source in OpenVibe.Sources (SEC EDGAR XBRL filings RSS) is disabled there, and it carries filings, not prices; no observation exists until a source states one",
"marketDataFeeds": "none configured: the only seeded trade source in OpenVibe.Sources (SEC EDGAR XBRL filings RSS) is disabled there, and it carries filings, not prices; no observation exists until a source states one",
"seed": "none (tests create their own instruments; production holds 0 instruments and 0 observations)",
"seed": "none (tests create their own instruments; production holds 0 instruments and 0 observations)",
"deployed": true,
"deployed": true,
- "deployment": "openvibe-ovh, unit openvibe-trade, 127.0.0.1:4860 loopback only (release 9a55644); /api/ready 200 with status degraded [freshness], which is honest: no feed is configured; Network OAuth client trade and its grants exist; no Events subscription; production database holds 0 instruments and 0 observations. Deployed internally, not launched: openvibe.trade still serves the OpenVibe.Sites placeholder until a person verifies the SEC XBRL terms and enables sec-xbrl-filings in Sources, a licensed market data feed exists, and editors add instruments",
+ "deployment": "Deployed with `sudo ovhost deploy trade`: unit openvibe-trade, 127.0.0.1:4860 loopback only; on 2026-09-23 /api/ready answered 200 with status degraded [freshness], which is honest: no feed is configured; Network OAuth client trade and its grants exist; no Events subscription; production database held 0 instruments and 0 observations. Deployed internally, not launched: openvibe.trade still serves the OpenVibe.Sites placeholder until a person verifies the SEC XBRL terms and enables sec-xbrl-filings in Sources, a licensed market data feed exists, and editors add instruments",
"placeholderInSites": true,
"placeholderInSites": true,
- "updated": "2026-09-23"
+ "updated": "2026-09-28",
+ "features": [
+ "informational only: a route-inventory test refuses any execution, custody or advice endpoint",
+ "instruments with exact, deterministic resolution (CIK, ticker, name)",
+ "observations with required timestamps; no observation, no number",
+ "per-source freshness with stale badges and transition events",
+ "SEC EDGAR filings from Sources matched to instruments",
+ "private watchlists",
+ "threshold, filing-type and new-document alerts (trade.alert.triggered)",
+ "cited editor context; AI drafts need approval; advice refused",
+ "server-rendered pages useful without JavaScript",
+ "/api/v1 by capability",
+ "SDK outbox events and Search index documents",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "Memberships: plans, perks and benefits recognised across every OpenVibe site.",
"description": "Memberships: plans, perks and benefits recognised across every OpenVibe site.",
- "diskUsage": 440,
+ "diskUsage": 510,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.VIP",
"name": "OpenVibe.VIP",
- "pushedAt": "2026-09-26T13:24:17Z",
+ "pushedAt": "2026-09-28T03:21:20Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -985,7 +1547,8 @@
@@ -985,7 +1547,8 @@
"stage": "alpha",
"stage": "alpha",
"code": true,
"code": true,
"deployed": true,
"deployed": true,
- "deployment": "Deployed internally, not launched: openvibe-ovh /opt/openvibe.vip (release a675577, openvibe-contracts 0.33.0, openvibe-sdk 0.5.0, openvibe-shared 1.5.1), unit openvibe-vip, 127.0.0.1:4620 loopback only; https://openvibe.vip still serves the OpenVibe.Sites placeholder. Principal vip; three Events subscriptions for Billing's events (secret rotated 2026-09-24); checkout closed (VIP_CHECKOUT_PROVIDERS empty). Production holds the Live import: 44 creators, 43 plans (one per creator), 0 memberships while Billing runs in shadow.",
+ "deployment": "Deployed internally, not launched: deployed with `sudo ovhost deploy vip`, /opt/openvibe.vip, unit openvibe-vip, 127.0.0.1:4620 loopback only; https://openvibe.vip still serves the OpenVibe.Sites placeholder. Principal vip; three Events subscriptions for Billing's events (secret rotated 2026-09-24); checkout closed (VIP_CHECKOUT_PROVIDERS empty). On 2026-09-24 production held the Live import: 44 creators, 43 plans (one per creator), 0 memberships while Billing runs in shadow.",
+ "contracts": "openvibe-contracts v0.49.0",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"roadmap": "Wave 10",
"roadmap": "Wave 10",
"works": [
"works": [
@@ -993,15 +1556,16 @@
@@ -993,15 +1556,16 @@
"entitlement projection fed by Billing events (signed webhook + openvibe-sdk inbox) with valid_until, grace and a direct Billing fallback; 'unknown' never authorizes",
"entitlement projection fed by Billing events (signed webhook + openvibe-sdk inbox) with valid_until, grace and a direct Billing fallback; 'unknown' never authorizes",
"checkout hand-off and cancellation through OpenVibe.Billing; the membership is filed under the plan version chosen",
"checkout hand-off and cancellation through OpenVibe.Billing; the membership is filed under the plan version chosen",
"API /api/v1 for service and user tokens; consumer client openvibe-vip/client that fails closed, with createVipCache (the product cache and its convergence bound, test/convergence.test.js)",
"API /api/v1 for service and user tokens; consumer client openvibe-vip/client that fails closed, with createVipCache (the product cache and its convergence bound, test/convergence.test.js)",
- "the product's default gate (evaluate fallback, honouring product bindings such as blog gated_post) and entitlements/check product perks (Chat's badge); Chat, Community and Blog consume them in code (not deployed, grants pending)",
+ "the product's default gate (evaluate fallback, honouring product bindings such as blog gated_post) and entitlements/check product perks (Chat's badge); Chat, Community, Blog and Wiki consume them in code",
"server-rendered creator plan pages, terms history, member status and creator dashboard with the shared chrome",
"server-rendered creator plan pages, terms history, member status and creator dashboard with the shared chrome",
"outbox events vip.plan.published and vip.membership.changed (openvibe-sdk)",
"outbox events vip.plan.published and vip.membership.changed (openvibe-sdk)",
"import of Live's subscription offering, memberships from Billing entitlements",
"import of Live's subscription offering, memberships from Billing entitlements",
- "14 vip.* capabilities, the service manifest and its events registered in openvibe-contracts v0.19.0",
"deployed on the host (loopback only) with truthful /api/ready and /metrics; restore drill passed on the host 2026-09-23 05:23 UTC",
"deployed on the host (loopback only) with truthful /api/ready and /metrics; restore drill passed on the host 2026-09-23 05:23 UTC",
"reusable membership card (GET /embed/:username/card.json, GET /api/v1/creators/:ref/card), badge (/embed/:username/badge.svg) and embeddable widget (/embed/:username/widget): public data only, no cookies, the widget's CSP frame-ancestors configurable (VIP_WIDGET_FRAME_ANCESTORS), member count from Billing that the creator can hide (not deployed yet)",
"reusable membership card (GET /embed/:username/card.json, GET /api/v1/creators/:ref/card), badge (/embed/:username/badge.svg) and embeddable widget (/embed/:username/widget): public data only, no cookies, the widget's CSP frame-ancestors configurable (VIP_WIDGET_FRAME_ANCESTORS), member count from Billing that the creator can hide (not deployed yet)",
"the Live subscription import has run: 43 plans and plan versions, 44 creators, 87 migration maps (production, 2026-09-23)",
"the Live subscription import has run: 43 plans and plan versions, 44 creators, 87 migration maps (production, 2026-09-23)",
- "Chat (subscriber badge, vip.entitlement.check), Community (members-only spaces and threads) and Blog (members-only posts) call VIP in production (vip.resource.policy.evaluate grants for Community and Blog)"
+ "Chat (subscriber badge, vip.entitlement.check), Community (members-only spaces and threads) and Blog (members-only posts) call VIP in production (vip.resource.policy.evaluate grants for Community and Blog)",
+ "14 vip.* capabilities, the service manifest and its events registered in openvibe-contracts v0.19.0 (this repository pins v0.49.0)",
+ "per-actor limits on /api/v1 (openvibe-sdk/limits)"
],
],
"not_yet": [
"not_yet": [
"not launched: openvibe.vip is still an OpenVibe.Sites placeholder and the service answers on loopback only",
"not launched: openvibe.vip is still an OpenVibe.Sites placeholder and the service answers on loopback only",
@@ -1009,15 +1573,27 @@
@@ -1009,15 +1573,27 @@
"Billing sells one channel subscription per member and creator: one purchasable plan per creator, no tiers, no network membership product",
"Billing sells one channel subscription per member and creator: one purchasable plan per creator, no tiers, no network membership product",
"revocations reach Chat and Community through vip.membership.changed subscriptions (2026-09-24); Blog and Live still converge by the cache TTL (30-60 s)"
"revocations reach Chat and Community through vip.membership.changed subscriptions (2026-09-24); Blog and Live still converge by the cache TTL (30-60 s)"
],
],
- "updated": "2026-09-24"
+ "updated": "2026-09-28",
+ "features": [
+ "plans with immutable versions, perks and product bindings",
+ "entitlement projection from Billing events with valid_until, grace and a Billing fallback; unknown never authorizes",
+ "checkout and cancel through OpenVibe.Billing",
+ "gated-resource policy evaluation for products (fails closed)",
+ "openvibe-vip/client with the product cache and its convergence bound",
+ "creator plan pages, terms history, member status and creator dashboard",
+ "public membership card, badge and embeddable widget",
+ "Live subscription import",
+ "SDK outbox events vip.plan.published and vip.membership.changed",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
"description": "Wiki spaces with page trees, revisions, citations, media and discussion — editable together, source-backed.",
"description": "Wiki spaces with page trees, revisions, citations, media and discussion — editable together, source-backed.",
- "diskUsage": 598,
+ "diskUsage": 754,
"isArchived": false,
"isArchived": false,
"name": "OpenVibe.Wiki",
"name": "OpenVibe.Wiki",
- "pushedAt": "2026-09-26T13:24:21Z",
+ "pushedAt": "2026-09-28T03:21:22Z",
"visibility": "PUBLIC",
"visibility": "PUBLIC",
"defaultBranch": "main",
"defaultBranch": "main",
"status": {
"status": {
@@ -1029,11 +1605,11 @@
@@ -1029,11 +1605,11 @@
"runtime": "node 22, express, better-sqlite3",
"runtime": "node 22, express, better-sqlite3",
"port": 4800,
"port": 4800,
"domain": "openvibe.wiki",
"domain": "openvibe.wiki",
- "contracts": "openvibe-contracts v0.33.0",
+ "contracts": "openvibe-contracts v0.64.0",
"packages": [
"packages": [
- "openvibe-publishing v0.2.1",
- "openvibe-shared v1.5.1",
- "openvibe-sdk v0.5.0"
+ "openvibe-publishing v0.4.0",
+ "openvibe-shared v1.22.0",
+ "openvibe-sdk v0.12.0"
],
],
"capabilities": [
"capabilities": [
"wiki.space.create",
"wiki.space.create",
@@ -1047,11 +1623,25 @@
@@ -1047,11 +1623,25 @@
],
],
"capabilitiesRegistered": true,
"capabilitiesRegistered": true,
"deployed": true,
"deployed": true,
- "deployment": "Public at https://openvibe.wiki since 2026-09-23 (~03:00 UTC): /opt/openvibe.wiki at c1e6ff5, unit openvibe-wiki on 127.0.0.1:4800 behind the openvibe.wiki nginx vhost, principal wiki. Production content: 1 space, the 10 seed pages (1 revision each), 0 person reviews, so every page is noindex and nothing public is in Search yet. Restore drill passed 2026-09-23.",
+ "deployment": "Public at https://openvibe.wiki since 2026-09-23 (~03:00 UTC): deployed with `sudo ovhost deploy wiki`, /opt/openvibe.wiki, unit openvibe-wiki on 127.0.0.1:4800 behind the openvibe.wiki nginx vhost, principal wiki. On 2026-09-23 production held 1 space and the 10 seed pages (1 revision each), 0 person reviews, so every page was noindex and nothing public was in Search. Restore drill passed 2026-09-23.",
"onOpenVibeSites": false,
"onOpenVibeSites": false,
"seed": "official space \"openvibe\" (10 pages summarised with AI assistance from the repositories' README/STATUS files, cited; noindex until a person reviews each; 0 of 10 reviewed as of 2026-09-23)",
"seed": "official space \"openvibe\" (10 pages summarised with AI assistance from the repositories' README/STATUS files, cited; noindex until a person reviews each; 0 of 10 reviewed as of 2026-09-23)",
- "updated": "2026-09-23",
- "deployedAt": "2026-09-23"
+ "updated": "2026-09-28",
+ "deployedAt": "2026-09-23",
+ "features": [
+ "spaces with page trees and roles",
+ "immutable revisions with diff, revert and scheduled publication",
+ "citations and infobox values bound to the revision that used them",
+ "public, signed-in, VIP (OpenVibe.VIP), private and members-only visibility",
+ "Media attachments with a broken-asset state",
+ "Community discussion threads by reference",
+ "AI proposals that need a person's approval",
+ "space import bundles (owners only)",
+ "feeds, sitemaps and server-rendered pages useful without JavaScript",
+ "/api/v1 by capability",
+ "SDK outbox events and Search index documents",
+ "per-actor limits (openvibe-sdk/limits)"
+ ]
}
}
},
},
{
{
@@ -600,6 +600,38 @@
@@ -600,6 +600,38 @@
"disposition": "keep",
"disposition": "keep",
"wave": "W9",
"wave": "W9",
"note": "Live's side of Tips delivery idempotency (Idempotency-Key -> stored response, pruned after 7 days); Live renders the delivery."
"note": "Live's side of Tips delivery idempotency (Idempotency-Key -> stored response, pruned after 7 days); Live renders the delivery."
+ },
+ {
+ "repo": "OpenVibe.Live",
+ "match": "^account_data_events$",
+ "target": "keep",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "server/auth/account-data.js: which network.account.export_requested / deleted events Live has answered (ADR-033), so a redelivery is applied once."
+ },
+ {
+ "repo": "OpenVibe.Live",
+ "match": "^subject_merges$",
+ "target": "keep",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "server/auth/subject-merge.js: the network.subject.merged events Live has applied (ADR-029), once each."
+ },
+ {
+ "repo": "OpenVibe.Live",
+ "match": "^follow_projection_revisions$",
+ "target": "keep",
+ "disposition": "projection",
+ "wave": "-",
+ "note": "server/social/network-follows.js: the per-pair revision of Live's follows projection of Network's graph (ADR-030); an older network.follow.* event changes nothing."
+ },
+ {
+ "repo": "OpenVibe.Live",
+ "match": "^lineage_unresolved$",
+ "target": "keep",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "server/lineage/unresolved.js: media and session references the lineage resolver could not resolve yet, for the operator view (WS-H task 8)."
}
}
],
],
"_routeDispositions": {
"_routeDispositions": {
@@ -1,61 +1,61 @@
@@ -1,61 +1,61 @@
{
{
"host": "openvibe-oregon",
"host": "openvibe-oregon",
- "collectedAt": "2026-09-26T13:29:03.103Z",
+ "collectedAt": "2026-09-28T03:25:35.860Z",
"deployments": {
"deployments": {
"ai": {
"ai": {
"path": "/opt/openvibe.ai",
"path": "/opt/openvibe.ai",
- "sha": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",
- "committedAt": "2026-09-26T06:09:19-07:00"
+ "sha": "549bed09452233c6b21d529ab905a7bd8fbad4da",
+ "committedAt": "2026-09-27T19:43:37-07:00"
},
},
"billing": {
"billing": {
"path": "/opt/openvibe.billing",
"path": "/opt/openvibe.billing",
- "sha": "180e246a3a344c062f1c7435303f4aa748f17046",
- "committedAt": "2026-09-26T06:09:39-07:00"
+ "sha": "80f97aabbecb0fcb81842480166533ff0452c8a5",
+ "committedAt": "2026-09-27T19:45:09-07:00"
},
},
"blog": {
"blog": {
"path": "/opt/openvibe.blog",
"path": "/opt/openvibe.blog",
- "sha": "79e9e153ca1308311993a31295fd471a8becaf8d",
- "committedAt": "2026-09-26T06:09:58-07:00"
+ "sha": "21d537c6e6b90712512916e4d7377d581ee2f646",
+ "committedAt": "2026-09-27T18:49:25-07:00"
},
},
"chat": {
"chat": {
"path": "/opt/openvibe.chat",
"path": "/opt/openvibe.chat",
- "sha": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",
- "committedAt": "2026-09-26T06:12:38-07:00"
+ "sha": "3aab730c5105594523ed58ab0643c6eedc6b5214",
+ "committedAt": "2026-09-27T19:10:37-07:00"
},
},
"codes": {
"codes": {
"path": "/opt/openvibe.codes",
"path": "/opt/openvibe.codes",
- "sha": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",
- "committedAt": "2026-09-26T06:13:08-07:00"
+ "sha": "d78de7052c08dc38c6e2c400a0b63a1b00793f1f",
+ "committedAt": "2026-09-27T18:55:28-07:00"
},
},
"community": {
"community": {
"path": "/opt/openvibe.community",
"path": "/opt/openvibe.community",
- "sha": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",
- "committedAt": "2026-09-26T06:13:46-07:00"
+ "sha": "52d923a941f659ccfc7cb442efb2b10349663175",
+ "committedAt": "2026-09-27T18:07:00-07:00"
},
},
"coupons": {
"coupons": {
"path": "/opt/openvibe.coupons",
"path": "/opt/openvibe.coupons",
- "sha": "348f585cd6549a5c506171fba0fc2c5462dede32",
- "committedAt": "2026-09-26T06:13:57-07:00"
+ "sha": "64835d2a1c926e89116a35218d7a2d081f38b67a",
+ "committedAt": "2026-09-27T19:02:19-07:00"
},
},
"deals": {
"deals": {
"path": "/opt/openvibe.deals",
"path": "/opt/openvibe.deals",
- "sha": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",
- "committedAt": "2026-09-26T06:14:11-07:00"
+ "sha": "fa0582d267ef61e7b141299008d6239dd34f49ce",
+ "committedAt": "2026-09-27T18:58:50-07:00"
},
},
"events": {
"events": {
"path": "/opt/openvibe.events",
"path": "/opt/openvibe.events",
- "sha": "eb98f8cad2a738fec45f1c10e373081532c83e91",
- "committedAt": "2026-09-26T06:14:37-07:00"
+ "sha": "f55f7eb601be58220089c197f7dd2178b46d8d15",
+ "committedAt": "2026-09-27T19:55:58-07:00"
},
},
"games": {
"games": {
"path": "/opt/openvibe.games",
"path": "/opt/openvibe.games",
- "sha": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",
- "committedAt": "2026-09-26T05:39:23-07:00"
+ "sha": "51d86883a1dc1fb4098866fd2426516e09e05335",
+ "committedAt": "2026-09-27T19:29:46-07:00"
},
},
"host": {
"host": {
"path": "/opt/openvibe.host",
"path": "/opt/openvibe.host",
- "sha": "75147890e32dd63fd1363f843c87415f90d5b2dd",
- "committedAt": "2026-09-26T06:15:11-07:00"
+ "sha": "2b633899f41b559586e3d6c234925d498c7bf2cd",
+ "committedAt": "2026-09-27T19:35:46-07:00"
},
},
"live": {
"live": {
"path": "/opt/openvibe.live",
"path": "/opt/openvibe.live",
@@ -64,70 +64,70 @@
@@ -64,70 +64,70 @@
},
},
"media": {
"media": {
"path": "/opt/openvibe.media",
"path": "/opt/openvibe.media",
- "sha": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",
- "committedAt": "2026-09-26T06:16:26-07:00"
+ "sha": "62483631db9b9c120662abf2b21d4cff0a2bdc80",
+ "committedAt": "2026-09-27T19:50:40-07:00"
},
},
"network": {
"network": {
"path": "/opt/openvibe.network",
"path": "/opt/openvibe.network",
- "sha": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",
- "committedAt": "2026-09-26T06:27:40-07:00"
+ "sha": "ddd87b6844fad1f0f878ed574ce0e2c990e5e695",
+ "committedAt": "2026-09-27T19:26:13-07:00"
},
},
"news": {
"news": {
"path": "/opt/openvibe.news",
"path": "/opt/openvibe.news",
- "sha": "0860cf20dd3d8e8032caad300e0ce90497195b96",
- "committedAt": "2026-09-26T06:17:45-07:00"
+ "sha": "8ab47a6a78168e1b25ac07c01aeb3a0bb743bbb9",
+ "committedAt": "2026-09-27T19:20:19-07:00"
},
},
"reviews": {
"reviews": {
"path": "/opt/openvibe.reviews",
"path": "/opt/openvibe.reviews",
- "sha": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",
- "committedAt": "2026-09-26T06:18:06-07:00"
+ "sha": "1cff36b8b9d385c4effb323f0506ede106b18d22",
+ "committedAt": "2026-09-27T19:23:25-07:00"
},
},
"search": {
"search": {
"path": "/opt/openvibe.search",
"path": "/opt/openvibe.search",
- "sha": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",
- "committedAt": "2026-09-26T06:18:19-07:00"
+ "sha": "8ed7667ff1e383271ddcc67c709be1bf5e1ba43d",
+ "committedAt": "2026-09-27T17:59:00-07:00"
},
},
"sites": {
"sites": {
"path": "/opt/openvibe.sites",
"path": "/opt/openvibe.sites",
- "sha": "3802ee3d9ada9b8490134ece350420e627866a8c",
- "committedAt": "2026-09-26T06:18:20-07:00"
+ "sha": "32464ecd99ae34236fdb12039fa904f010941ff4",
+ "committedAt": "2026-09-27T14:01:00-07:00"
},
},
"sources": {
"sources": {
"path": "/opt/openvibe.sources",
"path": "/opt/openvibe.sources",
- "sha": "29cd386241c44456ffcebf70b6be287fa9a08aaa",
- "committedAt": "2026-09-26T06:18:36-07:00"
+ "sha": "351383e8111395668a16f66b11d659549c6483fb",
+ "committedAt": "2026-09-27T19:29:11-07:00"
},
},
"tips": {
"tips": {
"path": "/opt/openvibe.tips",
"path": "/opt/openvibe.tips",
- "sha": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",
- "committedAt": "2026-09-26T06:18:52-07:00"
+ "sha": "1e6bfbb8294c9401c46c066457b165c24bc90d02",
+ "committedAt": "2026-09-27T18:11:05-07:00"
},
},
"tools": {
"tools": {
"path": "/opt/openvibe.tools",
"path": "/opt/openvibe.tools",
- "sha": "168e5110d062f076c2c4afe88e3fc3c53ab44613",
- "committedAt": "2026-09-26T06:20:57-07:00"
+ "sha": "e55469f2bf9ede55f08b5fb58951a00d375595b9",
+ "committedAt": "2026-09-27T19:38:13-07:00"
},
},
"trade": {
"trade": {
"path": "/opt/openvibe.trade",
"path": "/opt/openvibe.trade",
- "sha": "fa382881cd92ee90b6329699d7d79129e32a6325",
- "committedAt": "2026-09-26T06:21:08-07:00"
+ "sha": "4658447782c7d259e59d8c1060fd05c60cf66574",
+ "committedAt": "2026-09-27T19:26:12-07:00"
},
},
"vip": {
"vip": {
"path": "/opt/openvibe.vip",
"path": "/opt/openvibe.vip",
- "sha": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",
- "committedAt": "2026-09-26T06:21:19-07:00"
+ "sha": "0fbcbb53802d2bd4e4dc6e393465a1fce1fc75a9",
+ "committedAt": "2026-09-27T18:14:01-07:00"
},
},
"wiki": {
"wiki": {
"path": "/opt/openvibe.wiki",
"path": "/opt/openvibe.wiki",
- "sha": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",
- "committedAt": "2026-09-26T06:21:43-07:00"
+ "sha": "32a26ef43c5f4ac2c02c813f0ba68fda5f8cd5cf",
+ "committedAt": "2026-09-27T18:44:27-07:00"
},
},
"openre": {
"openre": {
"path": "/opt/openre.stream",
"path": "/opt/openre.stream",
"layout": "release",
"layout": "release",
- "release": "b34dcd688867",
- "sha": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",
- "committedAt": "2026-09-26T06:08:48-07:00"
+ "release": "cf423e377878",
+ "sha": "cf423e377878eb60e449205a670130e6febb6b07",
+ "committedAt": "2026-09-27T19:32:33-07:00"
}
}
},
},
"units": [
"units": [
@@ -161,6 +161,18 @@
@@ -161,6 +161,18 @@
"active": "active",
"active": "active",
"sub": "running"
"sub": "running"
},
},
+ {
+ "unit": "openvibe-alerts.service",
+ "load": "loaded",
+ "active": "inactive",
+ "sub": "dead"
+ },
+ {
+ "unit": "openvibe-alerts.timer",
+ "load": "loaded",
+ "active": "active",
+ "sub": "waiting"
+ },
{
{
"unit": "openvibe-backup.service",
"unit": "openvibe-backup.service",
"load": "loaded",
"load": "loaded",
@@ -185,6 +197,18 @@
@@ -185,6 +197,18 @@
"active": "active",
"active": "active",
"sub": "running"
"sub": "running"
},
},
+ {
+ "unit": "openvibe-browsercheck.service",
+ "load": "loaded",
+ "active": "inactive",
+ "sub": "dead"
+ },
+ {
+ "unit": "openvibe-browsercheck.timer",
+ "load": "loaded",
+ "active": "active",
+ "sub": "waiting"
+ },
{
{
"unit": "openvibe-chat.service",
"unit": "openvibe-chat.service",
"load": "loaded",
"load": "loaded",
@@ -257,6 +281,12 @@
@@ -257,6 +281,12 @@
"active": "active",
"active": "active",
"sub": "running"
"sub": "running"
},
},
+ {
+ "unit": "openvibe-llm.service",
+ "load": "loaded",
+ "active": "active",
+ "sub": "running"
+ },
{
{
"unit": "openvibe-media.service",
"unit": "openvibe-media.service",
"load": "loaded",
"load": "loaded",
@@ -456,9 +486,10 @@
@@ -456,9 +486,10 @@
},
},
{
{
"file": "/opt/openvibe.games/data/world.db",
"file": "/opt/openvibe.games/data/world.db",
- "bytes": 507904,
+ "bytes": 610304,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
+ "account_data_events",
"constraints",
"constraints",
"event_outbox",
"event_outbox",
"guest_ips",
"guest_ips",
@@ -477,7 +508,7 @@
@@ -477,7 +508,7 @@
},
},
{
{
"file": "/opt/openvibe.live/shared/data/analytics.db",
"file": "/opt/openvibe.live/shared/data/analytics.db",
- "bytes": 518029312,
+ "bytes": 525406208,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"analytics_daily",
"analytics_daily",
@@ -989,6 +1020,175 @@
@@ -989,6 +1020,175 @@
"watch_time"
"watch_time"
]
]
},
},
+ {
+ "file": "/opt/openvibe.live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db",
+ "bytes": 284688384,
+ "owner": "ubuntu",
+ "tables": [
+ "account_data_events",
+ "ai_chatbot_configs",
+ "ai_timeline_cache",
+ "ai_usage",
+ "ai_viewer_log",
+ "ai_viewer_threads",
+ "anon_ip_mappings",
+ "api_keys",
+ "api_tokens",
+ "app_state",
+ "approved_ips",
+ "arena_achievements",
+ "arena_battles",
+ "arena_beef_hype",
+ "arena_beef_sides",
+ "arena_beefs",
+ "arena_events",
+ "arena_mic_moments",
+ "arena_profiles",
+ "arena_talk",
+ "arena_talk_hype",
+ "arena_talk_session_hype",
+ "arena_talk_session_topics",
+ "arena_talk_sessions",
+ "arena_talk_topics",
+ "arena_tier_paid",
+ "arena_topic_hype",
+ "arena_topic_members",
+ "arena_topic_moments",
+ "arena_topic_progress",
+ "arena_topic_sides",
+ "arena_topic_threads",
+ "arena_topics",
+ "arena_trash_levels",
+ "arena_viewer_clout",
+ "arena_votes",
+ "arena_xp_log",
+ "bans",
+ "camera_presets",
+ "camera_profiles",
+ "cameras",
+ "canvas_actions",
+ "canvas_bans",
+ "canvas_region_locks",
+ "canvas_settings",
+ "canvas_snapshots",
+ "canvas_tiles",
+ "canvas_user_overrides",
+ "channel_ai_bots",
+ "channel_ai_config",
+ "channel_moderation_settings",
+ "channel_moderators",
+ "channel_points",
+ "channel_points_log",
+ "channel_sounds",
+ "channels",
+ "chat_ai_summaries",
+ "chat_bridge_outbox",
+ "chat_dual_read_stats",
+ "chat_messages",
+ "chat_staged_outbox",
+ "chat_timeline_events",
+ "chatter_profiles",
+ "chatter_subjects",
+ "chatter_xp_log",
+ "clip_ai_state",
+ "clips",
+ "coin_redemptions",
+ "coin_rewards",
+ "coin_transactions",
+ "comment_thread_refs",
+ "comments",
+ "content_views",
+ "control_config_buttons",
+ "control_configs",
+ "control_whitelist",
+ "dm_blocks",
+ "dm_conversations",
+ "dm_messages",
+ "dm_participants",
+ "donation_goals",
+ "easter_egg_solves",
+ "emotes",
+ "event_outbox",
+ "follows",
+ "game_achievements",
+ "game_bank",
+ "game_battle_stats",
+ "game_daily_quest_claims",
+ "game_daily_quest_progress",
+ "game_dungeon_runs",
+ "game_effects",
+ "game_farm_plots",
+ "game_fish_collection",
+ "game_inventory",
+ "game_leaderboard",
+ "game_players",
+ "game_recipes",
+ "game_structures",
+ "game_world_state",
+ "hidden_relay_users",
+ "idempotency_receipts",
+ "ip_log",
+ "kick_channel_cache",
+ "linked_accounts",
+ "managed_streams",
+ "media_request_settings",
+ "media_requests",
+ "moderation_actions",
+ "moderation_events_backfill",
+ "module_summary_pushes",
+ "news_settings",
+ "openre_sessions",
+ "paste_comments",
+ "paste_likes",
+ "pastes",
+ "payment_orders",
+ "pending_ip_messages",
+ "platform_connections",
+ "powerchat_connections",
+ "powerchat_webhook_deliveries",
+ "promo_claims",
+ "relay_users",
+ "restream_destinations",
+ "robotstreamer_integrations",
+ "schema_migrations",
+ "search_doc_pushes",
+ "search_media_pushes",
+ "site_settings",
+ "stream_analytics",
+ "stream_controls",
+ "stream_first_chats",
+ "stream_memories",
+ "stream_recaps",
+ "stream_timeline_events",
+ "streamer_overviews",
+ "streams",
+ "subject_projection",
+ "subscriptions",
+ "tag_guardian_defeats",
+ "themes",
+ "token_revocations",
+ "transactions",
+ "translations",
+ "tts_voice_overrides",
+ "user_cosmetics",
+ "user_equipped",
+ "user_equipped_tag",
+ "user_preferences",
+ "user_tags",
+ "user_themes",
+ "username_history",
+ "users",
+ "verification_keys",
+ "vibe_coding_events",
+ "vibe_coding_sessions",
+ "viewer_samples",
+ "viewer_snapshots",
+ "vod_ai_state",
+ "vods",
+ "vpn_approvals",
+ "watch_time"
+ ]
+ },
{
{
"file": "/opt/openvibe.live/shared/data/hobo.db",
"file": "/opt/openvibe.live/shared/data/hobo.db",
"bytes": 0,
"bytes": 0,
@@ -1155,9 +1355,10 @@
@@ -1155,9 +1355,10 @@
},
},
{
{
"file": "/opt/openvibe.live/shared/data/live.db",
"file": "/opt/openvibe.live/shared/data/live.db",
- "bytes": 284057600,
+ "bytes": 284700672,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
+ "account_data_events",
"ai_chatbot_configs",
"ai_chatbot_configs",
"ai_timeline_cache",
"ai_timeline_cache",
"ai_usage",
"ai_usage",
@@ -1399,9 +1600,10 @@
@@ -1399,9 +1600,10 @@
},
},
{
{
"file": "/opt/openvibe.media/data/media.db",
"file": "/opt/openvibe.media/data/media.db",
- "bytes": 11538432,
+ "bytes": 11735040,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
+ "account_data_events",
"apps",
"apps",
"assets",
"assets",
"clips",
"clips",
@@ -1417,6 +1619,10 @@
@@ -1417,6 +1619,10 @@
"media_locations",
"media_locations",
"media_namespaces",
"media_namespaces",
"media_object_changes",
"media_object_changes",
+ "media_object_tier_decisions",
+ "media_object_view_salts",
+ "media_object_viewer_days",
+ "media_object_views_daily",
"media_objects",
"media_objects",
"media_quota_reservations",
"media_quota_reservations",
"media_relationships",
"media_relationships",
@@ -1469,6 +1675,149 @@
@@ -1469,6 +1675,149 @@
"vods"
"vods"
]
]
},
},
+ {
+ "file": "/opt/openvibe.network/data/backups/network-pre-creator-analytics-20260926.db",
+ "bytes": 292413440,
+ "owner": "ubuntu",
+ "tables": [
+ "analytics_daily",
+ "analytics_day_salts",
+ "analytics_events",
+ "analytics_hourly",
+ "analytics_rate_tracking",
+ "analytics_visitor_days",
+ "anon_ip_log",
+ "anon_users",
+ "audit_log",
+ "coin_transactions",
+ "creator_streams",
+ "dev_apps",
+ "dev_audit",
+ "dev_auth_codes",
+ "dev_credentials",
+ "dev_grants",
+ "dev_project_members",
+ "dev_projects",
+ "dev_quotas",
+ "dev_usage_daily",
+ "dev_usage_errors",
+ "dev_usage_windows",
+ "email_delivery_log",
+ "email_verification_tokens",
+ "follow_import_holds",
+ "follows",
+ "frame_cache",
+ "frame_hits",
+ "identity_legacy_map",
+ "ip_log",
+ "linked_accounts",
+ "moderation_audit",
+ "network_event_inbox",
+ "network_event_outbox",
+ "notification_preferences",
+ "notifications",
+ "oauth_clients",
+ "oauth_codes",
+ "oauth_tokens",
+ "operator_alerts",
+ "password_reset_tokens",
+ "principal_grant_changes",
+ "principal_grants",
+ "principal_usage",
+ "push_subscriptions",
+ "site_settings",
+ "status_incident_updates",
+ "status_incidents",
+ "stream_live_announcements",
+ "themes",
+ "tool_domains",
+ "url_registry",
+ "user_blocks",
+ "user_effects",
+ "user_follows",
+ "user_history",
+ "user_module_retirements",
+ "user_module_revisions",
+ "user_modules",
+ "user_preferences",
+ "user_profile_changes",
+ "user_sessions",
+ "username_history",
+ "users",
+ "verification_keys",
+ "wallets"
+ ]
+ },
+ {
+ "file": "/opt/openvibe.network/data/backups/network-pre-follows-20260926.db",
+ "bytes": 292061184,
+ "owner": "ubuntu",
+ "tables": [
+ "analytics_daily",
+ "analytics_day_salts",
+ "analytics_events",
+ "analytics_hourly",
+ "analytics_rate_tracking",
+ "analytics_visitor_days",
+ "anon_ip_log",
+ "anon_users",
+ "audit_log",
+ "coin_transactions",
+ "dev_apps",
+ "dev_audit",
+ "dev_auth_codes",
+ "dev_credentials",
+ "dev_grants",
+ "dev_project_members",
+ "dev_projects",
+ "dev_quotas",
+ "dev_usage_daily",
+ "dev_usage_errors",
+ "dev_usage_windows",
+ "email_delivery_log",
+ "email_verification_tokens",
+ "follow_import_holds",
+ "follows",
+ "frame_cache",
+ "frame_hits",
+ "identity_legacy_map",
+ "ip_log",
+ "linked_accounts",
+ "moderation_audit",
+ "network_event_inbox",
+ "network_event_outbox",
+ "notification_preferences",
+ "notifications",
+ "oauth_clients",
+ "oauth_codes",
+ "oauth_tokens",
+ "operator_alerts",
+ "password_reset_tokens",
+ "principal_grant_changes",
+ "principal_grants",
+ "principal_usage",
+ "push_subscriptions",
+ "site_settings",
+ "stream_live_announcements",
+ "themes",
+ "tool_domains",
+ "url_registry",
+ "user_blocks",
+ "user_effects",
+ "user_follows",
+ "user_history",
+ "user_module_retirements",
+ "user_module_revisions",
+ "user_modules",
+ "user_preferences",
+ "user_profile_changes",
+ "user_sessions",
+ "username_history",
+ "users",
+ "verification_keys",
+ "wallets"
+ ]
+ },
{
{
"file": "/opt/openvibe.network/data/network-pre-refresh-hash-2026-09-24.db",
"file": "/opt/openvibe.network/data/network-pre-refresh-hash-2026-09-24.db",
"bytes": 279113728,
"bytes": 279113728,
@@ -1589,9 +1938,15 @@
@@ -1589,9 +1938,15 @@
},
},
{
{
"file": "/opt/openvibe.network/data/network.db",
"file": "/opt/openvibe.network/data/network.db",
- "bytes": 290332672,
+ "bytes": 302370816,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
+ "account_deletion_confirmations",
+ "account_deletions",
+ "account_export_parts",
+ "account_exports",
+ "account_merge_intents",
+ "account_merges",
"analytics_daily",
"analytics_daily",
"analytics_day_salts",
"analytics_day_salts",
"analytics_events",
"analytics_events",
@@ -1602,6 +1957,7 @@
@@ -1602,6 +1957,7 @@
"anon_users",
"anon_users",
"audit_log",
"audit_log",
"coin_transactions",
"coin_transactions",
+ "creator_streams",
"dev_apps",
"dev_apps",
"dev_audit",
"dev_audit",
"dev_auth_codes",
"dev_auth_codes",
@@ -1610,14 +1966,20 @@
@@ -1610,14 +1966,20 @@
"dev_project_members",
"dev_project_members",
"dev_projects",
"dev_projects",
"dev_quotas",
"dev_quotas",
+ "dev_usage_daily",
+ "dev_usage_errors",
+ "dev_usage_windows",
"email_delivery_log",
"email_delivery_log",
"email_verification_tokens",
"email_verification_tokens",
+ "follow_import_holds",
"follows",
"follows",
"frame_cache",
"frame_cache",
"frame_hits",
"frame_hits",
"identity_legacy_map",
"identity_legacy_map",
"ip_log",
"ip_log",
"linked_accounts",
"linked_accounts",
+ "mod_principal_grants",
+ "mod_principals",
"moderation_audit",
"moderation_audit",
"network_event_inbox",
"network_event_inbox",
"network_event_outbox",
"network_event_outbox",
@@ -1626,18 +1988,23 @@
@@ -1626,18 +1988,23 @@
"oauth_clients",
"oauth_clients",
"oauth_codes",
"oauth_codes",
"oauth_tokens",
"oauth_tokens",
+ "operator_alerts",
"password_reset_tokens",
"password_reset_tokens",
"principal_grant_changes",
"principal_grant_changes",
"principal_grants",
"principal_grants",
"principal_usage",
"principal_usage",
"push_subscriptions",
"push_subscriptions",
"site_settings",
"site_settings",
+ "status_incident_updates",
+ "status_incidents",
"stream_live_announcements",
"stream_live_announcements",
+ "subject_aliases",
"themes",
"themes",
"tool_domains",
"tool_domains",
"url_registry",
"url_registry",
"user_blocks",
"user_blocks",
"user_effects",
"user_effects",
+ "user_follows",
"user_history",
"user_history",
"user_module_retirements",
"user_module_retirements",
"user_module_revisions",
"user_module_revisions",
@@ -1675,7 +2042,7 @@
@@ -1675,7 +2042,7 @@
},
},
{
{
"file": "/opt/openvibe.tools/apps/audio/data/analytics.db",
"file": "/opt/openvibe.tools/apps/audio/data/analytics.db",
- "bytes": 36556800,
+ "bytes": 36667392,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"analytics_daily",
"analytics_daily",
@@ -1698,18 +2065,19 @@
@@ -1698,18 +2065,19 @@
},
},
{
{
"file": "/opt/openvibe.tools/apps/audio/data/jobs.db",
"file": "/opt/openvibe.tools/apps/audio/data/jobs.db",
- "bytes": 73728,
+ "bytes": 81920,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"event_outbox",
"event_outbox",
"tool_job_events",
"tool_job_events",
"tool_job_references",
"tool_job_references",
+ "tool_job_usage",
"tool_jobs"
"tool_jobs"
]
]
},
},
{
{
"file": "/opt/openvibe.tools/apps/docs/data/analytics.db",
"file": "/opt/openvibe.tools/apps/docs/data/analytics.db",
- "bytes": 1081344,
+ "bytes": 1114112,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"analytics_daily",
"analytics_daily",
@@ -1732,18 +2100,19 @@
@@ -1732,18 +2100,19 @@
},
},
{
{
"file": "/opt/openvibe.tools/apps/docs/data/jobs.db",
"file": "/opt/openvibe.tools/apps/docs/data/jobs.db",
- "bytes": 65536,
+ "bytes": 81920,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"event_outbox",
"event_outbox",
"tool_job_events",
"tool_job_events",
"tool_job_references",
"tool_job_references",
+ "tool_job_usage",
"tool_jobs"
"tool_jobs"
]
]
},
},
{
{
"file": "/opt/openvibe.tools/apps/food/data/analytics.db",
"file": "/opt/openvibe.tools/apps/food/data/analytics.db",
- "bytes": 331776,
+ "bytes": 344064,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"analytics_daily",
"analytics_daily",
@@ -1784,7 +2153,7 @@
@@ -1784,7 +2153,7 @@
},
},
{
{
"file": "/opt/openvibe.tools/apps/img/data/analytics.db",
"file": "/opt/openvibe.tools/apps/img/data/analytics.db",
- "bytes": 4677632,
+ "bytes": 4775936,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"analytics_daily",
"analytics_daily",
@@ -1807,18 +2176,19 @@
@@ -1807,18 +2176,19 @@
},
},
{
{
"file": "/opt/openvibe.tools/apps/img/data/jobs.db",
"file": "/opt/openvibe.tools/apps/img/data/jobs.db",
- "bytes": 245760,
+ "bytes": 327680,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"event_outbox",
"event_outbox",
"tool_job_events",
"tool_job_events",
"tool_job_references",
"tool_job_references",
+ "tool_job_usage",
"tool_jobs"
"tool_jobs"
]
]
},
},
{
{
"file": "/opt/openvibe.tools/apps/maps/data/analytics.db",
"file": "/opt/openvibe.tools/apps/maps/data/analytics.db",
- "bytes": 389120,
+ "bytes": 401408,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"analytics_daily",
"analytics_daily",
@@ -1841,7 +2211,7 @@
@@ -1841,7 +2211,7 @@
},
},
{
{
"file": "/opt/openvibe.tools/apps/text/data/analytics.db",
"file": "/opt/openvibe.tools/apps/text/data/analytics.db",
- "bytes": 5791744,
+ "bytes": 5865472,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"analytics_daily",
"analytics_daily",
@@ -1864,7 +2234,7 @@
@@ -1864,7 +2234,7 @@
},
},
{
{
"file": "/opt/openvibe.tools/apps/yt/data/analytics.db",
"file": "/opt/openvibe.tools/apps/yt/data/analytics.db",
- "bytes": 630784,
+ "bytes": 647168,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"analytics_daily",
"analytics_daily",
@@ -1999,7 +2369,7 @@
@@ -1999,7 +2369,7 @@
},
},
{
{
"file": "/var/lib/openvibe-ai/ai.db",
"file": "/var/lib/openvibe-ai/ai.db",
- "bytes": 62640128,
+ "bytes": 115773440,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"ai_module_pushes",
"ai_module_pushes",
@@ -2017,6 +2387,7 @@
@@ -2017,6 +2387,7 @@
"requests",
"requests",
"routes",
"routes",
"runs",
"runs",
+ "subject_credentials",
"templates",
"templates",
"usage_counters",
"usage_counters",
"usage_daily",
"usage_daily",
@@ -2025,7 +2396,7 @@
@@ -2025,7 +2396,7 @@
},
},
{
{
"file": "/var/lib/openvibe-billing/billing.db",
"file": "/var/lib/openvibe-billing/billing.db",
- "bytes": 745472,
+ "bytes": 831488,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"account_balances",
"account_balances",
@@ -2204,7 +2575,7 @@
@@ -2204,7 +2575,7 @@
},
},
{
{
"file": "/var/lib/openvibe-blog/blog.db",
"file": "/var/lib/openvibe-blog/blog.db",
- "bytes": 1527808,
+ "bytes": 1863680,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"blog_feed_settings",
"blog_feed_settings",
@@ -2235,9 +2606,10 @@
@@ -2235,9 +2606,10 @@
},
},
{
{
"file": "/var/lib/openvibe-chat/chat.db",
"file": "/var/lib/openvibe-chat/chat.db",
- "bytes": 25276416,
+ "bytes": 25325568,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
+ "account_data_events",
"audio_requests",
"audio_requests",
"bridge_applied",
"bridge_applied",
"bridge_refs",
"bridge_refs",
@@ -2783,7 +3155,7 @@
@@ -2783,7 +3155,7 @@
},
},
{
{
"file": "/var/lib/openvibe-codes/codes.db",
"file": "/var/lib/openvibe-codes/codes.db",
- "bytes": 102400,
+ "bytes": 110592,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"event_outbox",
"event_outbox",
@@ -2797,9 +3169,10 @@
@@ -2797,9 +3169,10 @@
},
},
{
{
"file": "/var/lib/openvibe-community/community.db",
"file": "/var/lib/openvibe-community/community.db",
- "bytes": 4419584,
+ "bytes": 5300224,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
+ "account_data_events",
"attachments",
"attachments",
"categories",
"categories",
"comment_threads",
"comment_threads",
@@ -2807,6 +3180,7 @@
@@ -2807,6 +3180,7 @@
"comments",
"comments",
"community_event_inbox",
"community_event_inbox",
"event_outbox",
"event_outbox",
+ "game_progress",
"import_hold",
"import_hold",
"legacy_id_map",
"legacy_id_map",
"migration_runs",
"migration_runs",
@@ -3020,10 +3394,11 @@
@@ -3020,10 +3394,11 @@
},
},
{
{
"file": "/var/lib/openvibe-events/events.db",
"file": "/var/lib/openvibe-events/events.db",
- "bytes": 17305600,
+ "bytes": 23531520,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"app_revocations",
"app_revocations",
+ "app_usage",
"consumer_checkpoints",
"consumer_checkpoints",
"deliveries",
"deliveries",
"events",
"events",
@@ -3053,7 +3428,7 @@
@@ -3053,7 +3428,7 @@
},
},
{
{
"file": "/var/lib/openvibe-news/news.db",
"file": "/var/lib/openvibe-news/news.db",
- "bytes": 446464,
+ "bytes": 507904,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"event_outbox",
"event_outbox",
@@ -3113,7 +3488,7 @@
@@ -3113,7 +3488,7 @@
},
},
{
{
"file": "/var/lib/openvibe-search/search.db",
"file": "/var/lib/openvibe-search/search.db",
- "bytes": 12021760,
+ "bytes": 13271040,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"cdn_purges",
"cdn_purges",
@@ -3228,7 +3603,7 @@
@@ -3228,7 +3603,7 @@
},
},
{
{
"file": "/var/lib/openvibe-wiki/wiki.db",
"file": "/var/lib/openvibe-wiki/wiki.db",
- "bytes": 401408,
+ "bytes": 409600,
"owner": "ubuntu",
"owner": "ubuntu",
"tables": [
"tables": [
"wiki_ai_proposals",
"wiki_ai_proposals",
@@ -3261,8 +3636,11 @@
@@ -3261,8 +3636,11 @@
"AI_API_KEY",
"AI_API_KEY",
"AI_BASE_URL",
"AI_BASE_URL",
"AI_CONSOLE_SESSION_SECRET",
"AI_CONSOLE_SESSION_SECRET",
+ "AI_CREDENTIALS_KEY",
"AI_ENABLED",
"AI_ENABLED",
"AI_INPUT_COST_PER_MTOK",
"AI_INPUT_COST_PER_MTOK",
+ "AI_LOCAL_LLM_MODEL",
+ "AI_LOCAL_LLM_URL",
"AI_MAX_COST_USD_PER_DAY",
"AI_MAX_COST_USD_PER_DAY",
"AI_MODEL",
"AI_MODEL",
"AI_OUTPUT_COST_PER_MTOK",
"AI_OUTPUT_COST_PER_MTOK",
@@ -3450,6 +3828,7 @@
@@ -3450,6 +3828,7 @@
"ADMIN_PASSWORD",
"ADMIN_PASSWORD",
"ADMIN_USERNAME",
"ADMIN_USERNAME",
"AI_SERVICE",
"AI_SERVICE",
+ "ANALYTICS_SOURCE",
"BASE_URL",
"BASE_URL",
"CALLS_AUTHORITY",
"CALLS_AUTHORITY",
"CHAT_AUTHORITY",
"CHAT_AUTHORITY",
@@ -3457,6 +3836,7 @@
@@ -3457,6 +3836,7 @@
"EMOTES_PATH",
"EMOTES_PATH",
"ESCROW_HOLD_DAYS",
"ESCROW_HOLD_DAYS",
"EVENTS_URL",
"EVENTS_URL",
+ "FOLLOWS_AUTHORITY",
"GOLIVE_NOTIFY",
"GOLIVE_NOTIFY",
"HOST",
"HOST",
"INTERNAL_API_KEY",
"INTERNAL_API_KEY",
@@ -3552,6 +3932,7 @@
@@ -3552,6 +3932,7 @@
"ADMIN_USERNAME",
"ADMIN_USERNAME",
"BASE_URL",
"BASE_URL",
"DB_PATH",
"DB_PATH",
+ "FOLLOWS_AUTHORITY",
"HOST",
"HOST",
"INTERNAL_API_KEY",
"INTERNAL_API_KEY",
"JWT_PRIVATE_KEY",
"JWT_PRIVATE_KEY",
@@ -3591,6 +3972,7 @@
@@ -3591,6 +3972,7 @@
],
],
"openre.env": [
"openre.env": [
"EVENTS_URL",
"EVENTS_URL",
+ "HOST",
"MEDIA_API_KEY",
"MEDIA_API_KEY",
"MEDIA_APP_ID",
"MEDIA_APP_ID",
"MEDIA_URL",
"MEDIA_URL",
@@ -3603,6 +3985,10 @@
@@ -3603,6 +3985,10 @@
"OV_OAUTH_CLIENT_ID",
"OV_OAUTH_CLIENT_ID",
"OV_OAUTH_CLIENT_SECRET"
"OV_OAUTH_CLIENT_SECRET"
],
],
+ "probe-merge.env": [
+ "PROBE_MERGE_FOLD_PW",
+ "PROBE_MERGE_KEEP_PW"
+ ],
"probe.env": [
"probe.env": [
"OV_OAUTH_CLIENT_ID",
"OV_OAUTH_CLIENT_ID",
"OV_OAUTH_CLIENT_SECRET"
"OV_OAUTH_CLIENT_SECRET"
@@ -3667,6 +4053,7 @@
@@ -3667,6 +4053,7 @@
"OV_NETWORK_URL",
"OV_NETWORK_URL",
"OV_OAUTH_CLIENT_ID",
"OV_OAUTH_CLIENT_ID",
"OV_OAUTH_CLIENT_SECRET",
"OV_OAUTH_CLIENT_SECRET",
+ "RIDB_API_KEY",
"SEARCH_URL",
"SEARCH_URL",
"TOOLS_EVENTS_SECRET",
"TOOLS_EVENTS_SECRET",
"TOOLS_JOB_RESULTS"
"TOOLS_JOB_RESULTS"
@@ -2163,10 +2163,10 @@
@@ -2163,10 +2163,10 @@
{
{
"id": "D39",
"id": "D39",
"title": "Mods",
"title": "Mods",
- "owner": "OpenVibe.Games (registry, grants and runtime today); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Network (planned mod grants); OpenVibe.Host (Stage C sandbox)",
+ "owner": "OpenVibe.Games (registry, runtime, the hot path's copy of grants); OpenVibe.Network (mod principals and grants, mods.grant.manage); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Host (Stage C sandbox)",
"target": "mod manifests, capabilities, quotas, runtime adapters",
"target": "mod manifests, capabilities, quotas, runtime adapters",
"status": "partial",
"status": "partial",
- "summary": "The mod manifest (Contracts mods/mod-manifest.v1, ADR-013 accepted 2026-09-23) and a Games-local registry are tested: grants are the approved subset, installs and grants are audited, and revoking a mod removes its effect on the next tick and across a restart. Only declarative games-content packs run. Executable runtimes are refused, and the CPU budget is metered and audited but not enforced. Network's mods.grant.manage capability is still `planned`, and on 2026-09-23 at 20:22 UTC production world.db held 0 mods, 0 grants and 0 audit rows.",
+ "summary": "The mod manifest (Contracts mods/mod-manifest.v1, ADR-013) and the Games registry are tested. Since 2026-09-27 every install is a Network principal mod:<id> whose grants Network holds (mods.grant.manage active; Games asks Network first, and network.mod.grants_changed keeps its copy current). The budget is enforced: 5 reconciles over cpuMs, or 3 minutes over 60 effects a minute, disable only the offending mod. Security tests cover namespace escape, event flood, resource budget and forged ownership. One production install -> grant -> use -> revoke run is recorded. Only declarative games-content packs run; executable runtimes wait for Host Stage C.",
"artifacts": [
"artifacts": [
{
{
"kind": "test",
"kind": "test",
@@ -2193,23 +2193,40 @@
@@ -2193,23 +2193,40 @@
"kind": "doc",
"kind": "doc",
"repo": "OpenVibe.Contracts",
"repo": "OpenVibe.Contracts",
"path": "manifests/capabilities/mods.grant.manage.json",
"path": "manifests/capabilities/mods.grant.manage.json",
- "contains": "Until Network implements it, each runtime keeps the approved subset itself",
- "proves": "Network-side mod principals and grants are not implemented: the status is planned and implementedBy is empty."
+ "contains": "\"status\": \"active\"",
+ "proves": "Network implements mod principals and grants: the capability is active."
+ },
+ {
+ "kind": "test",
+ "repo": "OpenVibe.Network",
+ "path": "test/mod-principals.test.js",
+ "contains": "another runtime can neither register nor change it",
+ "proves": "An install registers mod:<id> with the approved subset of what its manifest requests; the registering runtime owns it; staff changes carry a reason and an audit row; every change is announced with the complete approved set."
+ },
+ {
+ "kind": "test",
+ "repo": "OpenVibe.Games",
+ "path": "apps/server/src/mods/security.test.ts",
+ "contains": "forged ownership",
+ "proves": "Namespace escape, event flood, resource budget and forged ownership: a flooding or over-budget mod is disabled while the others run; props are always the mod's."
+ },
+ {
+ "kind": "test",
+ "repo": "OpenVibe.Games",
+ "path": "apps/server/src/mods/networkGrants.test.ts",
+ "contains": "installs with what Network approved",
+ "proves": "The mods API asks Network first and applies only its answer; an older grants_changed revision changes nothing."
},
},
{
{
"kind": "prod",
"kind": "prod",
- "check": "ssh openvibe-ovh 'db=/opt/openvibe.games/data/world.db; sudo -n -u \"$(stat -c %U $db)\" sqlite3 -readonly $db \"SELECT count(*) FROM mods\"' (also mod_grants, mod_audit); curl -s http://127.0.0.1:8000/api/v1/mods",
- "observed": "mods 0, mod_grants 0, mod_audit 0; /api/v1/mods -> {\"mods\":[]}",
- "at": "2026-09-23T20:22Z",
- "proves": "No mod has ever been installed, granted, used or revoked in production."
+ "check": "ssh openvibe-ovh: sudo sh -c '. /etc/openvibe/probe.env; cd /opt/openvibe.games && node --import tsx apps/server/scripts/modLifecycleProof.ts'",
+ "observed": "install 201 -> grant 200 -> use (prop placed) -> revoke 200 -> retract; the Network principal ended revoked with three network.mod.grants_changed events",
+ "at": "2026-09-27T23:45Z",
+ "proves": "One production install -> grant -> use -> revoke run with audit rows."
}
}
],
],
"remaining": [
"remaining": [
- "Network-side mod principals and grants (capability mods.grant.manage, still planned with implementedBy []): an install should create a mod:<id> principal whose grants Network checks, as ADR-013 decides",
- "Quotas: the manifest's resource budget is only metered and audited in Games (runtime.ts budget_exceeded, with no test). Still to do: enforce it, prove that a budget breach terminates only the offending mod, and add an event-flood throttle, each with tests (roadmap §20 Mods)",
- "Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C",
- "The §20 Mods acceptance tests still missing: namespace escape denied, and no forged Billing or Media ownership",
- "One production install -> grant -> use -> revoke run with audit rows (production has 0 mods)"
+ "Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C"
],
],
"blockedOn": null,
"blockedOn": null,
"ownerReview": false
"ownerReview": false
@@ -1,36 +1,36 @@
@@ -1,36 +1,36 @@
{
{
"generatedFrom": {
"generatedFrom": {
- "OpenVibe.Live": "8caa540466f9af86247febdbba1339b68919a42f",
- "OpenVibe.Network": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",
- "OpenVibe.Shared": "dbf9d39750e9f0dd0f19d8571d278eb303f3b83f",
- "OpenVibe.Media": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",
- "OpenVibe.Tools": "168e5110d062f076c2c4afe88e3fc3c53ab44613",
- "OpenVibe.Community": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",
- "OpenVibe.Games": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",
- "OpenVibe.Sites": "3802ee3d9ada9b8490134ece350420e627866a8c",
- "OpenVibe.Events": "eb98f8cad2a738fec45f1c10e373081532c83e91",
- "OpenVibe.Chat": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",
- "OpenRe.Stream": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",
- "OpenVibe.Billing": "180e246a3a344c062f1c7435303f4aa748f17046",
- "OpenVibe.Tips": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",
- "OpenVibe.VIP": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",
- "OpenVibe.AI": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",
- "OpenVibe.Search": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",
- "OpenVibe.Sources": "29cd386241c44456ffcebf70b6be287fa9a08aaa",
- "OpenVibe.Wiki": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",
- "OpenVibe.Blog": "79e9e153ca1308311993a31295fd471a8becaf8d",
- "OpenVibe.News": "0860cf20dd3d8e8032caad300e0ce90497195b96",
- "OpenVibe.Reviews": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",
- "OpenVibe.Deals": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",
- "OpenVibe.Coupons": "348f585cd6549a5c506171fba0fc2c5462dede32",
- "OpenVibe.Trade": "fa382881cd92ee90b6329699d7d79129e32a6325",
- "OpenVibe.Codes": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",
- "OpenVibe.Host": "75147890e32dd63fd1363f843c87415f90d5b2dd",
- "OpenVibe.Examples": "36901ffc052752754608df8764a9f2942069da9a"
+ "OpenVibe.Live": "03f49b7716b7cee1cce8a44e7155aeb96a67d004",
+ "OpenVibe.Network": "5a50c12a83f6501aacd663f15d3c06c718a4c83a",
+ "OpenVibe.Shared": "b5a9bd77171fcf75f42ff33fe86b7ad06baac1c8",
+ "OpenVibe.Media": "14cac06886649848c332cfa564aa6b3594ea09bc",
+ "OpenVibe.Tools": "4f4ed6e8f3f3c8e1a83dd644dd3c0659a7bccce4",
+ "OpenVibe.Community": "2da3501e28457fa4978c0bc4a1b3bfc9188b77b9",
+ "OpenVibe.Games": "eb2d00880d3231b2c68cb1753b4542044edef1e5",
+ "OpenVibe.Sites": "304e8b12b535f4b562f23027ae84f1a5d515cc6c",
+ "OpenVibe.Events": "19919ece79707eed051c3f18ab37b7fdb6d939a6",
+ "OpenVibe.Chat": "d87c8d3c906ad52ef8bf123ce60373fdefcf09e6",
+ "OpenRe.Stream": "c77ec2a9a1e350fb4ae1c646ec74693fae4f2fa3",
+ "OpenVibe.Billing": "f24684bb84ec1670bd08670891e6742fa433a548",
+ "OpenVibe.Tips": "13986b59e697d12a328a4f12e993295445ca40be",
+ "OpenVibe.VIP": "95b3e196daa152c2e7f8e940a1f02b7fe32706ba",
+ "OpenVibe.AI": "6c8b8338be936cbd3a6f50dee3f790807f145a0e",
+ "OpenVibe.Search": "e8511d849720534a9ffcd54b052663111e5b1e6f",
+ "OpenVibe.Sources": "167085388a637eed3f0d47b3c6eabb8c9d00814d",
+ "OpenVibe.Wiki": "3302540e8b5fdf3c07db9fce688be2f4ab8b847b",
+ "OpenVibe.Blog": "8a7f8ebe862b0e1c0bb119ee96c42f38fc0e5321",
+ "OpenVibe.News": "97dae43a2d41c5528bbb4c93ff2ea7ea456203dd",
+ "OpenVibe.Reviews": "c87b34440b0d50bc2cdf6c136775002ed9080c1e",
+ "OpenVibe.Deals": "533450f9cc4a358ba50f353f06826ec3611b4ddc",
+ "OpenVibe.Coupons": "b91cd795e8ee4a3e49317a6e3cb000fa92da9325",
+ "OpenVibe.Trade": "273bce7b1b8771037bc2a660fa8784dc1aa049a7",
+ "OpenVibe.Codes": "7d6f65ac198d95f70ac840c24d03d1407affb7a9",
+ "OpenVibe.Host": "6d2aaaa630e29d2bfd261a7f75cbbbaa2b8c1d46",
+ "OpenVibe.Examples": "92eb7c3b0f50fea9f76086ed3eeda3664de93494"
},
},
"prodSnapshot": {
"prodSnapshot": {
"host": "openvibe-oregon",
"host": "openvibe-oregon",
- "collectedAt": "2026-09-26T13:29:03.103Z"
+ "collectedAt": "2026-09-28T03:25:35.860Z"
},
},
"repos": [
"repos": [
{
{
@@ -38,18 +38,18 @@
@@ -38,18 +38,18 @@
"service": "live",
"service": "live",
"present": true,
"present": true,
"git": {
"git": {
- "head": "8caa540466f9af86247febdbba1339b68919a42f",
+ "head": "03f49b7716b7cee1cce8a44e7155aeb96a67d004",
"branch": "main",
"branch": "main",
- "originMain": "8caa540466f9af86247febdbba1339b68919a42f",
- "committedAt": "2026-09-26T06:22:32-07:00"
+ "originMain": "03f49b7716b7cee1cce8a44e7155aeb96a67d004",
+ "committedAt": "2026-09-27T20:24:58-07:00"
},
},
- "sourceFiles": 210,
- "loc": 74897,
+ "sourceFiles": 221,
+ "loc": 75126,
"tables": [
"tables": [
{
{
"table": "arena_profiles",
"table": "arena_profiles",
"file": "server/arena/arena-service.js",
"file": "server/arena/arena-service.js",
- "line": 83,
+ "line": 82,
"via": "repo"
"via": "repo"
},
},
{
{
@@ -88,6 +88,12 @@
@@ -88,6 +88,12 @@
"line": 54,
"line": 54,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "account_data_events",
+ "file": "server/auth/account-data.js",
+ "line": 51,
+ "via": "repo"
+ },
{
{
"table": "module_summary_pushes",
"table": "module_summary_pushes",
"file": "server/auth/module-summaries.js",
"file": "server/auth/module-summaries.js",
@@ -100,6 +106,12 @@
@@ -100,6 +106,12 @@
"line": 19,
"line": 19,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "subject_merges",
+ "file": "server/auth/subject-merge.js",
+ "line": 25,
+ "via": "repo"
+ },
{
{
"table": "subject_projection",
"table": "subject_projection",
"file": "server/auth/subject-projection.js",
"file": "server/auth/subject-projection.js",
@@ -295,235 +307,235 @@
@@ -295,235 +307,235 @@
{
{
"table": "app_state",
"table": "app_state",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1196,
+ "line": 1191,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "stream_memories",
"table": "stream_memories",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1210,
+ "line": 1205,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "stream_timeline_events",
"table": "stream_timeline_events",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1259,
+ "line": 1254,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "ai_usage",
"table": "ai_usage",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1284,
+ "line": 1279,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "streamer_overviews",
"table": "streamer_overviews",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1304,
+ "line": 1299,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "ai_timeline_cache",
"table": "ai_timeline_cache",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1326,
+ "line": 1321,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "chat_ai_summaries",
"table": "chat_ai_summaries",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1338,
+ "line": 1333,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "chat_timeline_events",
"table": "chat_timeline_events",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1358,
+ "line": 1353,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "easter_egg_solves",
"table": "easter_egg_solves",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1370,
+ "line": 1365,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "tts_voice_overrides",
"table": "tts_voice_overrides",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1382,
+ "line": 1377,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "relay_users",
"table": "relay_users",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1495,
+ "line": 1490,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "payment_orders",
"table": "payment_orders",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1590,
+ "line": 1585,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "channel_moderators",
"table": "channel_moderators",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1623,
+ "line": 1618,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "channel_moderation_settings",
"table": "channel_moderation_settings",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1640,
+ "line": 1635,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "emotes_new",
"table": "emotes_new",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1713,
+ "line": 1708,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "channel_sounds",
"table": "channel_sounds",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1745,
+ "line": 1740,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "channel_sounds_new",
"table": "channel_sounds_new",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1769,
+ "line": 1764,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "ai_chatbot_configs",
"table": "ai_chatbot_configs",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1807,
+ "line": 1802,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "channel_ai_bots",
"table": "channel_ai_bots",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1832,
+ "line": 1827,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "channel_ai_config",
"table": "channel_ai_config",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1856,
+ "line": 1851,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "ai_viewer_threads",
"table": "ai_viewer_threads",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1877,
+ "line": 1874,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "ai_viewer_log",
"table": "ai_viewer_log",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1891,
+ "line": 1888,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "moderation_actions",
"table": "moderation_actions",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1924,
+ "line": 1921,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "pastes",
"table": "pastes",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1943,
+ "line": 1940,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "paste_likes",
"table": "paste_likes",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 1980,
+ "line": 1977,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "paste_comments",
"table": "paste_comments",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2012,
+ "line": 2009,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "stream_first_chats",
"table": "stream_first_chats",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2044,
+ "line": 2041,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "ip_log",
"table": "ip_log",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2055,
+ "line": 2052,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "approved_ips",
"table": "approved_ips",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2079,
+ "line": 2076,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "pending_ip_messages",
"table": "pending_ip_messages",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2096,
+ "line": 2093,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "hidden_relay_users",
"table": "hidden_relay_users",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2116,
+ "line": 2113,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "control_whitelist",
"table": "control_whitelist",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2274,
+ "line": 2271,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "control_configs",
"table": "control_configs",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2289,
+ "line": 2286,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "control_config_buttons",
"table": "control_config_buttons",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2303,
+ "line": 2300,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "stream_controls_new",
"table": "stream_controls_new",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2382,
+ "line": 2379,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "managed_streams",
"table": "managed_streams",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2417,
+ "line": 2414,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "vibe_coding_sessions",
"table": "vibe_coding_sessions",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2639,
+ "line": 2636,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "vibe_coding_events",
"table": "vibe_coding_events",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 2674,
+ "line": 2671,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "viewer_samples",
"table": "viewer_samples",
"file": "server/db/database.js",
"file": "server/db/database.js",
- "line": 3861,
+ "line": 3868,
"via": "repo"
"via": "repo"
},
},
{
{
@@ -805,7 +817,13 @@
@@ -805,7 +817,13 @@
{
{
"table": "translations",
"table": "translations",
"file": "server/i18n/translate.js",
"file": "server/i18n/translate.js",
- "line": 147,
+ "line": 148,
+ "via": "repo"
+ },
+ {
+ "table": "lineage_unresolved",
+ "file": "server/lineage/unresolved.js",
+ "line": 26,
"via": "repo"
"via": "repo"
},
},
{
{
@@ -850,6 +868,12 @@
@@ -850,6 +868,12 @@
"line": 27,
"line": 27,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "follow_projection_revisions",
+ "file": "server/social/network-follows.js",
+ "line": 63,
+ "via": "repo"
+ },
{
{
"table": "tips_deliveries",
"table": "tips_deliveries",
"file": "server/tips/delivery-routes.js",
"file": "server/tips/delivery-routes.js",
@@ -874,7 +898,7 @@
@@ -874,7 +898,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/admins",
"path": "/api/admin/admins",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 841,
+ "line": 848,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -884,7 +908,7 @@
@@ -884,7 +908,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/admins",
"path": "/api/admin/admins",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 851,
+ "line": 858,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -894,7 +918,7 @@
@@ -894,7 +918,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/admins/:id",
"path": "/api/admin/admins/:id",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 870,
+ "line": 877,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -904,7 +928,7 @@
@@ -904,7 +928,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/ai/explorer/:userId",
"path": "/api/admin/ai/explorer/:userId",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 582,
+ "line": 589,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -914,7 +938,7 @@
@@ -914,7 +938,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/ai/overviews",
"path": "/api/admin/ai/overviews",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 619,
+ "line": 626,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -924,7 +948,7 @@
@@ -924,7 +948,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/ai/status",
"path": "/api/admin/ai/status",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 571,
+ "line": 578,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -934,7 +958,7 @@
@@ -934,7 +958,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/ai/streamer/:userId/overview",
"path": "/api/admin/ai/streamer/:userId/overview",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 628,
+ "line": 635,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -944,7 +968,7 @@
@@ -944,7 +968,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/ai/usage",
"path": "/api/admin/ai/usage",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 524,
+ "line": 531,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -954,7 +978,7 @@
@@ -954,7 +978,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/ai/viewers/:userId/:action",
"path": "/api/admin/ai/viewers/:userId/:action",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 552,
+ "line": 559,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -964,7 +988,7 @@
@@ -964,7 +988,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/ai/viewers/:userId/log",
"path": "/api/admin/ai/viewers/:userId/log",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 562,
+ "line": 569,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -974,7 +998,7 @@
@@ -974,7 +998,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/ai/viewers/status",
"path": "/api/admin/ai/viewers/status",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 534,
+ "line": 541,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -984,7 +1008,7 @@
@@ -984,7 +1008,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/analytics",
"path": "/api/admin/analytics",
"file": "server/index.js",
"file": "server/index.js",
- "line": 732,
+ "line": 745,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -994,7 +1018,7 @@
@@ -994,7 +1018,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/analytics/bots",
"path": "/api/admin/analytics/bots",
"file": "server/index.js",
"file": "server/index.js",
- "line": 741,
+ "line": 754,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1004,7 +1028,7 @@
@@ -1004,7 +1028,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/bans",
"path": "/api/admin/bans",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 431,
+ "line": 438,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1014,7 +1038,7 @@
@@ -1014,7 +1038,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/broadcast",
"path": "/api/admin/broadcast",
"file": "server/index.js",
"file": "server/index.js",
- "line": 853,
+ "line": 866,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1024,7 +1048,7 @@
@@ -1024,7 +1048,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/admin/channels/:id/force-nsfw",
"path": "/api/admin/channels/:id/force-nsfw",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 372,
+ "line": 379,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1034,7 +1058,7 @@
@@ -1034,7 +1058,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/config",
"path": "/api/admin/config",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 755,
+ "line": 762,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1044,7 +1068,7 @@
@@ -1044,7 +1068,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/config/:namespace",
"path": "/api/admin/config/:namespace",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 756,
+ "line": 763,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1054,7 +1078,7 @@
@@ -1054,7 +1078,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/config/:namespace/history",
"path": "/api/admin/config/:namespace/history",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 757,
+ "line": 764,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1064,7 +1088,7 @@
@@ -1064,7 +1088,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/config/:namespace/rollback",
"path": "/api/admin/config/:namespace/rollback",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 758,
+ "line": 765,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1074,7 +1098,17 @@
@@ -1074,7 +1098,17 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/diagnostics",
"path": "/api/admin/diagnostics",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 55,
+ "line": 62,
+ "target": "OpenVibe.Live",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "Live product surface. AI features call OpenVibe.AI (AI_SERVICE=remote); coins/cosmetics are loyalty and cosmetic entitlements (ADR-012); /api/media is the chat media-request queue."
+ },
+ {
+ "method": "GET",
+ "path": "/api/admin/lineage/unresolved",
+ "file": "server/admin/routes.js",
+ "line": 56,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1084,7 +1118,7 @@
@@ -1084,7 +1118,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/media-tools/cookies",
"path": "/api/admin/media-tools/cookies",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1296,
+ "line": 1302,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1094,7 +1128,7 @@
@@ -1094,7 +1128,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/admin/media-tools/cookies",
"path": "/api/admin/media-tools/cookies",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1215,
+ "line": 1221,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1104,7 +1138,7 @@
@@ -1104,7 +1138,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/media-tools/cookies/check",
"path": "/api/admin/media-tools/cookies/check",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1274,
+ "line": 1280,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1114,7 +1148,7 @@
@@ -1114,7 +1148,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/media-tools/extra-args",
"path": "/api/admin/media-tools/extra-args",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1329,
+ "line": 1335,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1124,7 +1158,7 @@
@@ -1124,7 +1158,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/admin/media-tools/extra-args",
"path": "/api/admin/media-tools/extra-args",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1310,
+ "line": 1316,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1134,7 +1168,7 @@
@@ -1134,7 +1168,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/media-tools/status",
"path": "/api/admin/media-tools/status",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1170,
+ "line": 1176,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1144,7 +1178,7 @@
@@ -1144,7 +1178,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/media-tools/test",
"path": "/api/admin/media-tools/test",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1340,
+ "line": 1346,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1154,7 +1188,7 @@
@@ -1154,7 +1188,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/moderators",
"path": "/api/admin/moderators",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 776,
+ "line": 783,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1164,7 +1198,7 @@
@@ -1164,7 +1198,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/moderators",
"path": "/api/admin/moderators",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 788,
+ "line": 795,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1174,7 +1208,7 @@
@@ -1174,7 +1208,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/moderators/:id",
"path": "/api/admin/moderators/:id",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 815,
+ "line": 822,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1184,7 +1218,7 @@
@@ -1184,7 +1218,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/money",
"path": "/api/admin/money",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 485,
+ "line": 492,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1194,7 +1228,7 @@
@@ -1194,7 +1228,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/money/actions/:id/resolve",
"path": "/api/admin/money/actions/:id/resolve",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 499,
+ "line": 506,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1204,7 +1238,7 @@
@@ -1204,7 +1238,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/money/freeze",
"path": "/api/admin/money/freeze",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 493,
+ "line": 500,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1234,7 +1268,7 @@
@@ -1234,7 +1268,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/settings",
"path": "/api/admin/settings",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 512,
+ "line": 519,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1244,7 +1278,7 @@
@@ -1244,7 +1278,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/admin/settings",
"path": "/api/admin/settings",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 647,
+ "line": 654,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1254,7 +1288,7 @@
@@ -1254,7 +1288,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/settings/:key",
"path": "/api/admin/settings/:key",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 732,
+ "line": 739,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1264,7 +1298,7 @@
@@ -1264,7 +1298,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/admin/settings/:key",
"path": "/api/admin/settings/:key",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 712,
+ "line": 719,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1274,7 +1308,7 @@
@@ -1274,7 +1308,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/stats",
"path": "/api/admin/stats",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 67,
+ "line": 74,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1284,7 +1318,7 @@
@@ -1284,7 +1318,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/storage",
"path": "/api/admin/storage",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1014,
+ "line": 1021,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1294,7 +1328,7 @@
@@ -1294,7 +1328,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/storage/clips/bulk",
"path": "/api/admin/storage/clips/bulk",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1120,
+ "line": 1127,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1304,7 +1338,7 @@
@@ -1304,7 +1338,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/storage/vods",
"path": "/api/admin/storage/vods",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1070,
+ "line": 1077,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1314,7 +1348,7 @@
@@ -1314,7 +1348,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/storage/vods/bulk",
"path": "/api/admin/storage/vods/bulk",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 1089,
+ "line": 1096,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1324,7 +1358,7 @@
@@ -1324,7 +1358,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/streams",
"path": "/api/admin/streams",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 307,
+ "line": 314,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1334,7 +1368,7 @@
@@ -1334,7 +1368,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/streams/:id",
"path": "/api/admin/streams/:id",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 326,
+ "line": 333,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1344,7 +1378,7 @@
@@ -1344,7 +1378,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/admin/streams/:id/nsfw",
"path": "/api/admin/streams/:id/nsfw",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 420,
+ "line": 427,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1354,7 +1388,7 @@
@@ -1354,7 +1388,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/users",
"path": "/api/admin/users",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 121,
+ "line": 128,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1364,7 +1398,7 @@
@@ -1364,7 +1398,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/admin/users/:id",
"path": "/api/admin/users/:id",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 160,
+ "line": 167,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1374,7 +1408,7 @@
@@ -1374,7 +1408,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/users/:id/ban",
"path": "/api/admin/users/:id/ban",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 288,
+ "line": 295,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1384,7 +1418,7 @@
@@ -1384,7 +1418,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/users/:id/ban",
"path": "/api/admin/users/:id/ban",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 250,
+ "line": 257,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1394,7 +1428,7 @@
@@ -1394,7 +1428,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/admin/users/:id/force-vod-recording",
"path": "/api/admin/users/:id/force-vod-recording",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 389,
+ "line": 396,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1404,7 +1438,7 @@
@@ -1404,7 +1438,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/verification-keys",
"path": "/api/admin/verification-keys",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 892,
+ "line": 899,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1414,7 +1448,7 @@
@@ -1414,7 +1448,7 @@
"method": "POST",
"method": "POST",
"path": "/api/admin/verification-keys",
"path": "/api/admin/verification-keys",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 902,
+ "line": 909,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1424,7 +1458,7 @@
@@ -1424,7 +1458,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/admin/verification-keys/:id",
"path": "/api/admin/verification-keys/:id",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 945,
+ "line": 952,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1434,7 +1468,7 @@
@@ -1434,7 +1468,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/vpn-queue",
"path": "/api/admin/vpn-queue",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 447,
+ "line": 454,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1444,7 +1478,7 @@
@@ -1444,7 +1478,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/admin/vpn-queue/:id",
"path": "/api/admin/vpn-queue/:id",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 463,
+ "line": 470,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1454,7 +1488,7 @@
@@ -1454,7 +1488,7 @@
"method": "POST",
"method": "POST",
"path": "/api/ai-viewers/${cmd}",
"path": "/api/ai-viewers/${cmd}",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 117,
+ "line": 118,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1464,7 +1498,7 @@
@@ -1464,7 +1498,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/ai-viewers/bots/:id",
"path": "/api/ai-viewers/bots/:id",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 220,
+ "line": 238,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1474,7 +1508,7 @@
@@ -1474,7 +1508,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/ai-viewers/bots/:id",
"path": "/api/ai-viewers/bots/:id",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 185,
+ "line": 203,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1484,7 +1518,7 @@
@@ -1484,7 +1518,7 @@
"method": "POST",
"method": "POST",
"path": "/api/ai-viewers/bots/:id/clear-memory",
"path": "/api/ai-viewers/bots/:id/clear-memory",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 209,
+ "line": 227,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1494,7 +1528,7 @@
@@ -1494,7 +1528,7 @@
"method": "POST",
"method": "POST",
"path": "/api/ai-viewers/bots/:id/mute",
"path": "/api/ai-viewers/bots/:id/mute",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 122,
+ "line": 123,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1504,7 +1538,7 @@
@@ -1504,7 +1538,7 @@
"method": "POST",
"method": "POST",
"path": "/api/ai-viewers/bots/:id/unmute",
"path": "/api/ai-viewers/bots/:id/unmute",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 123,
+ "line": 124,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1514,7 +1548,7 @@
@@ -1514,7 +1548,7 @@
"method": "POST",
"method": "POST",
"path": "/api/ai-viewers/byo/test",
"path": "/api/ai-viewers/byo/test",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 124,
+ "line": 125,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1524,7 +1558,7 @@
@@ -1524,7 +1558,7 @@
"method": "POST",
"method": "POST",
"path": "/api/ai-viewers/clone",
"path": "/api/ai-viewers/clone",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 233,
+ "line": 251,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1534,7 +1568,7 @@
@@ -1534,7 +1568,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ai-viewers/config",
"path": "/api/ai-viewers/config",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 82,
+ "line": 83,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1544,7 +1578,7 @@
@@ -1544,7 +1578,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/ai-viewers/config",
"path": "/api/ai-viewers/config",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 134,
+ "line": 145,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1554,7 +1588,7 @@
@@ -1554,7 +1588,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ai-viewers/log",
"path": "/api/ai-viewers/log",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 106,
+ "line": 107,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1564,7 +1598,7 @@
@@ -1564,7 +1598,7 @@
"method": "POST",
"method": "POST",
"path": "/api/ai-viewers/preview",
"path": "/api/ai-viewers/preview",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 282,
+ "line": 300,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1574,7 +1608,7 @@
@@ -1574,7 +1608,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ai-viewers/roster",
"path": "/api/ai-viewers/roster",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 167,
+ "line": 185,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1584,7 +1618,7 @@
@@ -1584,7 +1618,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ai-viewers/status",
"path": "/api/ai-viewers/status",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 99,
+ "line": 100,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1594,7 +1628,7 @@
@@ -1594,7 +1628,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ai-viewers/threads",
"path": "/api/ai-viewers/threads",
"file": "server/ai/viewers/routes.js",
"file": "server/ai/viewers/routes.js",
- "line": 112,
+ "line": 113,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1614,7 +1648,7 @@
@@ -1614,7 +1648,7 @@
"method": "GET",
"method": "GET",
"path": "/api/analytics/channel/:username/dashboard",
"path": "/api/analytics/channel/:username/dashboard",
"file": "server/streaming/analytics-routes.js",
"file": "server/streaming/analytics-routes.js",
- "line": 157,
+ "line": 158,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1624,7 +1658,7 @@
@@ -1624,7 +1658,7 @@
"method": "GET",
"method": "GET",
"path": "/api/analytics/channel/:username/streams",
"path": "/api/analytics/channel/:username/streams",
"file": "server/streaming/analytics-routes.js",
"file": "server/streaming/analytics-routes.js",
- "line": 58,
+ "line": 59,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -1634,7 +1668,7 @@
@@ -1634,7 +1668,7 @@
"method": "GET",
"method": "GET",
"path": "/api/analytics/stream/:id",
"path": "/api/analytics/stream/:id",
"file": "server/streaming/analytics-routes.js",
"file": "server/streaming/analytics-routes.js",
- "line": 97,
+ "line": 98,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -2134,7 +2168,7 @@
@@ -2134,7 +2168,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat-ai/live-captions/:username",
"path": "/api/chat-ai/live-captions/:username",
"file": "server/ai/chat-ai-routes.js",
"file": "server/ai/chat-ai-routes.js",
- "line": 236,
+ "line": 235,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -2164,7 +2198,7 @@
@@ -2164,7 +2198,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat-ai/timeline/:username",
"path": "/api/chat-ai/timeline/:username",
"file": "server/ai/chat-ai-routes.js",
"file": "server/ai/chat-ai-routes.js",
- "line": 174,
+ "line": 173,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -2174,7 +2208,7 @@
@@ -2174,7 +2208,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat-ai/transcript/:streamId",
"path": "/api/chat-ai/transcript/:streamId",
"file": "server/ai/chat-ai-routes.js",
"file": "server/ai/chat-ai-routes.js",
- "line": 335,
+ "line": 334,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -2194,7 +2228,7 @@
@@ -2194,7 +2228,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat-ai/vod-transcripts",
"path": "/api/chat-ai/vod-transcripts",
"file": "server/ai/chat-ai-routes.js",
"file": "server/ai/chat-ai-routes.js",
- "line": 273,
+ "line": 272,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -2414,7 +2448,7 @@
@@ -2414,7 +2448,7 @@
"method": "GET",
"method": "GET",
"path": "/api/clips",
"path": "/api/clips",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 181,
+ "line": 182,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2424,7 +2458,7 @@
@@ -2424,7 +2458,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/clips/:id",
"path": "/api/clips/:id",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 358,
+ "line": 359,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2434,7 +2468,7 @@
@@ -2434,7 +2468,7 @@
"method": "GET",
"method": "GET",
"path": "/api/clips/:id",
"path": "/api/clips/:id",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 210,
+ "line": 211,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2444,7 +2478,7 @@
@@ -2444,7 +2478,7 @@
"method": "GET",
"method": "GET",
"path": "/api/clips/:id/job",
"path": "/api/clips/:id/job",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 396,
+ "line": 397,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2454,7 +2488,7 @@
@@ -2454,7 +2488,7 @@
"method": "POST",
"method": "POST",
"path": "/api/clips/:id/recut",
"path": "/api/clips/:id/recut",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 377,
+ "line": 378,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2464,7 +2498,7 @@
@@ -2464,7 +2498,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/clips/:id/title",
"path": "/api/clips/:id/title",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 292,
+ "line": 293,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2474,7 +2508,7 @@
@@ -2474,7 +2508,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/clips/:id/visibility",
"path": "/api/clips/:id/visibility",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 309,
+ "line": 310,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2484,7 +2518,7 @@
@@ -2484,7 +2518,7 @@
"method": "POST",
"method": "POST",
"path": "/api/clips/bulk",
"path": "/api/clips/bulk",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 333,
+ "line": 334,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2494,7 +2528,7 @@
@@ -2494,7 +2528,7 @@
"method": "GET",
"method": "GET",
"path": "/api/clips/mine",
"path": "/api/clips/mine",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 123,
+ "line": 124,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2504,7 +2538,7 @@
@@ -2504,7 +2538,7 @@
"method": "GET",
"method": "GET",
"path": "/api/clips/my-stream",
"path": "/api/clips/my-stream",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 141,
+ "line": 142,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2514,7 +2548,7 @@
@@ -2514,7 +2548,7 @@
"method": "GET",
"method": "GET",
"path": "/api/clips/settings/channel",
"path": "/api/clips/settings/channel",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 159,
+ "line": 160,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -2524,7 +2558,7 @@
@@ -2524,7 +2558,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/clips/settings/channel",
"path": "/api/clips/settings/channel",
"file": "server/media-proxy/clips.js",
"file": "server/media-proxy/clips.js",
- "line": 168,
+ "line": 169,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -3094,7 +3128,7 @@
@@ -3094,7 +3128,7 @@
"method": "POST",
"method": "POST",
"path": "/api/csp-report",
"path": "/api/csp-report",
"file": "server/index.js",
"file": "server/index.js",
- "line": 874,
+ "line": 887,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -3594,7 +3628,7 @@
@@ -3594,7 +3628,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/index.js",
"file": "server/index.js",
- "line": 751,
+ "line": 764,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -3744,7 +3778,7 @@
@@ -3744,7 +3778,7 @@
"method": "GET",
"method": "GET",
"path": "/api/live-events",
"path": "/api/live-events",
"file": "server/index.js",
"file": "server/index.js",
- "line": 670,
+ "line": 683,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -4784,7 +4818,7 @@
@@ -4784,7 +4818,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/index.js",
"file": "server/index.js",
- "line": 792,
+ "line": 805,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5154,7 +5188,7 @@
@@ -5154,7 +5188,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams",
"path": "/api/streams",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1129,
+ "line": 1140,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5164,7 +5198,7 @@
@@ -5164,7 +5198,7 @@
"method": "POST",
"method": "POST",
"path": "/api/streams",
"path": "/api/streams",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1960,
+ "line": 1971,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5174,7 +5208,7 @@
@@ -5174,7 +5208,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/streams/:id",
"path": "/api/streams/:id",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2155,
+ "line": 2166,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5184,7 +5218,7 @@
@@ -5184,7 +5218,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/:id",
"path": "/api/streams/:id",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1912,
+ "line": 1923,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5194,7 +5228,7 @@
@@ -5194,7 +5228,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/streams/:id",
"path": "/api/streams/:id",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2104,
+ "line": 2115,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5204,7 +5238,7 @@
@@ -5204,7 +5238,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/:id/call",
"path": "/api/streams/:id/call",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2474,
+ "line": 2491,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5214,7 +5248,7 @@
@@ -5214,7 +5248,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/streams/:id/call",
"path": "/api/streams/:id/call",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2435,
+ "line": 2452,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5224,7 +5258,7 @@
@@ -5224,7 +5258,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/:id/endpoint",
"path": "/api/streams/:id/endpoint",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2202,
+ "line": 2213,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5234,7 +5268,7 @@
@@ -5234,7 +5268,7 @@
"method": "POST",
"method": "POST",
"path": "/api/streams/:id/follow",
"path": "/api/streams/:id/follow",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2343,
+ "line": 2354,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5244,7 +5278,7 @@
@@ -5244,7 +5278,7 @@
"method": "POST",
"method": "POST",
"path": "/api/streams/:id/heartbeat",
"path": "/api/streams/:id/heartbeat",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2300,
+ "line": 2311,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5254,7 +5288,7 @@
@@ -5254,7 +5288,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/:id/rtmp-status",
"path": "/api/streams/:id/rtmp-status",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2318,
+ "line": 2329,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5264,7 +5298,7 @@
@@ -5264,7 +5298,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/broadcast-settings",
"path": "/api/streams/broadcast-settings",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1429,
+ "line": 1440,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5274,7 +5308,7 @@
@@ -5274,7 +5308,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/streams/broadcast-settings",
"path": "/api/streams/broadcast-settings",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1446,
+ "line": 1457,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5344,7 +5378,17 @@
@@ -5344,7 +5378,17 @@
"method": "POST",
"method": "POST",
"path": "/api/streams/channel/:username/follow",
"path": "/api/streams/channel/:username/follow",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2388,
+ "line": 2402,
+ "target": "OpenVibe.Live",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "Live product surface. AI features call OpenVibe.AI (AI_SERVICE=remote); coins/cosmetics are loyalty and cosmetic entitlements (ADR-012); /api/media is the chat media-request queue."
+ },
+ {
+ "method": "GET",
+ "path": "/api/streams/channel/:username/game",
+ "file": "server/streaming/routes.js",
+ "line": 1020,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5374,7 +5418,7 @@
@@ -5374,7 +5418,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/channel/:username/resolve/:ref",
"path": "/api/streams/channel/:username/resolve/:ref",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1468,
+ "line": 1479,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5384,7 +5428,7 @@
@@ -5384,7 +5428,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/channel/:username/weather",
"path": "/api/streams/channel/:username/weather",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1018,
+ "line": 1029,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5404,7 +5448,7 @@
@@ -5404,7 +5448,7 @@
"method": "POST",
"method": "POST",
"path": "/api/streams/diag-log",
"path": "/api/streams/diag-log",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2293,
+ "line": 2304,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5424,7 +5468,7 @@
@@ -5424,7 +5468,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/managed",
"path": "/api/streams/managed",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1630,
+ "line": 1641,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5434,7 +5478,7 @@
@@ -5434,7 +5478,7 @@
"method": "POST",
"method": "POST",
"path": "/api/streams/managed",
"path": "/api/streams/managed",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1642,
+ "line": 1653,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5444,7 +5488,7 @@
@@ -5444,7 +5488,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/streams/managed/:id",
"path": "/api/streams/managed/:id",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1856,
+ "line": 1867,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5454,7 +5498,7 @@
@@ -5454,7 +5498,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/streams/managed/:id",
"path": "/api/streams/managed/:id",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1696,
+ "line": 1707,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5464,7 +5508,7 @@
@@ -5464,7 +5508,7 @@
"method": "POST",
"method": "POST",
"path": "/api/streams/managed/:id/regenerate-key",
"path": "/api/streams/managed/:id/regenerate-key",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1881,
+ "line": 1892,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5474,7 +5518,7 @@
@@ -5474,7 +5518,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/managed/:managedStreamId/history",
"path": "/api/streams/managed/:managedStreamId/history",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1502,
+ "line": 1513,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5484,7 +5528,7 @@
@@ -5484,7 +5528,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/managed/:managedStreamId/profile",
"path": "/api/streams/managed/:managedStreamId/profile",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1523,
+ "line": 1534,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5494,7 +5538,7 @@
@@ -5494,7 +5538,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/mine",
"path": "/api/streams/mine",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1165,
+ "line": 1176,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5514,7 +5558,7 @@
@@ -5514,7 +5558,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/recent",
"path": "/api/streams/recent",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1177,
+ "line": 1188,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5524,7 +5568,7 @@
@@ -5524,7 +5568,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/recent-vods",
"path": "/api/streams/recent-vods",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1248,
+ "line": 1259,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5534,7 +5578,7 @@
@@ -5534,7 +5578,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/recently-online",
"path": "/api/streams/recently-online",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1194,
+ "line": 1205,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5544,7 +5588,7 @@
@@ -5544,7 +5588,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/rtmp-proxy/:streamId.flv",
"path": "/api/streams/rtmp-proxy/:streamId.flv",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 2495,
+ "line": 2512,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5554,7 +5598,7 @@
@@ -5554,7 +5598,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/setup-progress",
"path": "/api/streams/setup-progress",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1575,
+ "line": 1586,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5564,7 +5608,7 @@
@@ -5564,7 +5608,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/voice-channels",
"path": "/api/streams/voice-channels",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1278,
+ "line": 1289,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5574,7 +5618,7 @@
@@ -5574,7 +5618,7 @@
"method": "POST",
"method": "POST",
"path": "/api/streams/voice-channels",
"path": "/api/streams/voice-channels",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1299,
+ "line": 1310,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5584,7 +5628,7 @@
@@ -5584,7 +5628,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/streams/voice-channels/:channelId",
"path": "/api/streams/voice-channels/:channelId",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1311,
+ "line": 1322,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5594,7 +5638,7 @@
@@ -5594,7 +5638,7 @@
"method": "GET",
"method": "GET",
"path": "/api/streams/voice-channels/:channelId",
"path": "/api/streams/voice-channels/:channelId",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1288,
+ "line": 1299,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5604,7 +5648,7 @@
@@ -5604,7 +5648,7 @@
"method": "POST",
"method": "POST",
"path": "/api/streams/voice-channels/call-user",
"path": "/api/streams/voice-channels/call-user",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1323,
+ "line": 1334,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5614,7 +5658,7 @@
@@ -5614,7 +5658,7 @@
"method": "POST",
"method": "POST",
"path": "/api/streams/voice-channels/call-user/respond",
"path": "/api/streams/voice-channels/call-user/respond",
"file": "server/streaming/routes.js",
"file": "server/streaming/routes.js",
- "line": 1392,
+ "line": 1403,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5824,7 +5868,7 @@
@@ -5824,7 +5868,7 @@
"method": "GET",
"method": "GET",
"path": "/api/updates",
"path": "/api/updates",
"file": "server/index.js",
"file": "server/index.js",
- "line": 840,
+ "line": 853,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -5874,7 +5918,7 @@
@@ -5874,7 +5918,7 @@
"method": "GET",
"method": "GET",
"path": "/api/vods",
"path": "/api/vods",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 303,
+ "line": 308,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5884,7 +5928,7 @@
@@ -5884,7 +5928,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/vods/:id",
"path": "/api/vods/:id",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 566,
+ "line": 571,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5894,7 +5938,7 @@
@@ -5894,7 +5938,7 @@
"method": "GET",
"method": "GET",
"path": "/api/vods/:id",
"path": "/api/vods/:id",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 460,
+ "line": 465,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5904,7 +5948,7 @@
@@ -5904,7 +5948,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/vods/:id",
"path": "/api/vods/:id",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 521,
+ "line": 526,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5914,7 +5958,7 @@
@@ -5914,7 +5958,7 @@
"method": "GET",
"method": "GET",
"path": "/api/vods/:id/context",
"path": "/api/vods/:id/context",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 401,
+ "line": 406,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5934,7 +5978,7 @@
@@ -5934,7 +5978,7 @@
"method": "GET",
"method": "GET",
"path": "/api/vods/:id/memories",
"path": "/api/vods/:id/memories",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 377,
+ "line": 382,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5944,7 +5988,7 @@
@@ -5944,7 +5988,7 @@
"method": "POST",
"method": "POST",
"path": "/api/vods/:id/publish",
"path": "/api/vods/:id/publish",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 578,
+ "line": 583,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5954,7 +5998,7 @@
@@ -5954,7 +5998,7 @@
"method": "POST",
"method": "POST",
"path": "/api/vods/bulk",
"path": "/api/vods/bulk",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 538,
+ "line": 543,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5964,7 +6008,7 @@
@@ -5964,7 +6008,7 @@
"method": "POST",
"method": "POST",
"path": "/api/vods/bulk-delete-old",
"path": "/api/vods/bulk-delete-old",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 333,
+ "line": 338,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5974,7 +6018,7 @@
@@ -5974,7 +6018,7 @@
"method": "POST",
"method": "POST",
"path": "/api/vods/clips",
"path": "/api/vods/clips",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 638,
+ "line": 643,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5984,7 +6028,7 @@
@@ -5984,7 +6028,7 @@
"method": "POST",
"method": "POST",
"path": "/api/vods/clips/:id/trim",
"path": "/api/vods/clips/:id/trim",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 792,
+ "line": 797,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -5994,7 +6038,7 @@
@@ -5994,7 +6038,7 @@
"method": "GET",
"method": "GET",
"path": "/api/vods/clips/stream/:streamId",
"path": "/api/vods/clips/stream/:streamId",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 781,
+ "line": 786,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -6004,7 +6048,7 @@
@@ -6004,7 +6048,7 @@
"method": "GET",
"method": "GET",
"path": "/api/vods/file/:filename",
"path": "/api/vods/file/:filename",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 594,
+ "line": 599,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -6014,7 +6058,7 @@
@@ -6014,7 +6058,7 @@
"method": "GET",
"method": "GET",
"path": "/api/vods/mine",
"path": "/api/vods/mine",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 321,
+ "line": 326,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -6054,7 +6098,7 @@
@@ -6054,7 +6098,7 @@
"method": "POST",
"method": "POST",
"path": "/api/vods/upload",
"path": "/api/vods/upload",
"file": "server/media-proxy/vods.js",
"file": "server/media-proxy/vods.js",
- "line": 600,
+ "line": 605,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W4",
"wave": "W4",
@@ -6064,7 +6108,7 @@
@@ -6064,7 +6108,7 @@
"method": "GET",
"method": "GET",
"path": "/banned",
"path": "/banned",
"file": "server/index.js",
"file": "server/index.js",
- "line": 1012,
+ "line": 1025,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -6074,7 +6118,7 @@
@@ -6074,7 +6118,7 @@
"method": "POST",
"method": "POST",
"path": "/banned/continue",
"path": "/banned/continue",
"file": "server/index.js",
"file": "server/index.js",
- "line": 982,
+ "line": 995,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -6084,7 +6128,7 @@
@@ -6084,7 +6128,7 @@
"method": "GET",
"method": "GET",
"path": "/canvas",
"path": "/canvas",
"file": "server/index.js",
"file": "server/index.js",
- "line": 705,
+ "line": 718,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "compat",
"disposition": "compat",
"wave": "W12",
"wave": "W12",
@@ -6094,7 +6138,7 @@
@@ -6094,7 +6138,7 @@
"method": "GET",
"method": "GET",
"path": "/data/pastes/screenshots/:filename",
"path": "/data/pastes/screenshots/:filename",
"file": "server/index.js",
"file": "server/index.js",
- "line": 638,
+ "line": 651,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -6104,7 +6148,7 @@
@@ -6104,7 +6148,7 @@
"method": "GET",
"method": "GET",
"path": "/dmca",
"path": "/dmca",
"file": "server/index.js",
"file": "server/index.js",
- "line": 921,
+ "line": 934,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -6144,7 +6188,7 @@
@@ -6144,7 +6188,7 @@
"method": "GET",
"method": "GET",
"path": "/game",
"path": "/game",
"file": "server/index.js",
"file": "server/index.js",
- "line": 704,
+ "line": 717,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "compat",
"disposition": "compat",
"wave": "W12",
"wave": "W12",
@@ -6154,7 +6198,7 @@
@@ -6154,7 +6198,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/analytics-summary",
"path": "/internal/analytics-summary",
"file": "server/index.js",
"file": "server/index.js",
- "line": 599,
+ "line": 612,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "W3",
"wave": "W3",
@@ -7084,7 +7128,7 @@
@@ -7084,7 +7128,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/lineage/resolve",
"path": "/internal/lineage/resolve",
"file": "server/lineage/routes.js",
"file": "server/lineage/routes.js",
- "line": 33,
+ "line": 36,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "W3",
"wave": "W3",
@@ -7094,7 +7138,7 @@
@@ -7094,7 +7138,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/lineage/resolve",
"path": "/internal/lineage/resolve",
"file": "server/lineage/routes.js",
"file": "server/lineage/routes.js",
- "line": 34,
+ "line": 37,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "W3",
"wave": "W3",
@@ -7104,7 +7148,7 @@
@@ -7104,7 +7148,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/media-events",
"path": "/internal/media-events",
"file": "server/index.js",
"file": "server/index.js",
- "line": 589,
+ "line": 602,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "W3",
"wave": "W3",
@@ -7114,7 +7158,7 @@
@@ -7114,7 +7158,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/media-webhook",
"path": "/internal/media-webhook",
"file": "server/index.js",
"file": "server/index.js",
- "line": 587,
+ "line": 600,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "compat",
"disposition": "compat",
"wave": "W3",
"wave": "W3",
@@ -7124,7 +7168,7 @@
@@ -7124,7 +7168,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/network-events",
"path": "/internal/network-events",
"file": "server/index.js",
"file": "server/index.js",
- "line": 591,
+ "line": 604,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "W3",
"wave": "W3",
@@ -7134,7 +7178,7 @@
@@ -7134,7 +7178,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/openre-events",
"path": "/internal/openre-events",
"file": "server/index.js",
"file": "server/index.js",
- "line": 594,
+ "line": 607,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "W3",
"wave": "W3",
@@ -7184,7 +7228,7 @@
@@ -7184,7 +7228,7 @@
"method": "GET",
"method": "GET",
"path": "/media/:username",
"path": "/media/:username",
"file": "server/index.js",
"file": "server/index.js",
- "line": 912,
+ "line": 925,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -7194,7 +7238,7 @@
@@ -7194,7 +7238,7 @@
"method": "GET",
"method": "GET",
"path": "/obs/chat/:username",
"path": "/obs/chat/:username",
"file": "server/index.js",
"file": "server/index.js",
- "line": 900,
+ "line": 913,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -7204,7 +7248,7 @@
@@ -7204,7 +7248,7 @@
"method": "GET",
"method": "GET",
"path": "/openvibe-sw.js",
"path": "/openvibe-sw.js",
"file": "server/index.js",
"file": "server/index.js",
- "line": 488,
+ "line": 501,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -7214,7 +7258,7 @@
@@ -7214,7 +7258,7 @@
"method": "GET",
"method": "GET",
"path": "/overlay/chat/:username",
"path": "/overlay/chat/:username",
"file": "server/index.js",
"file": "server/index.js",
- "line": 908,
+ "line": 921,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -7224,7 +7268,7 @@
@@ -7224,7 +7268,7 @@
"method": "GET",
"method": "GET",
"path": "/overlay/chat/:username/:slotIdOrSlug",
"path": "/overlay/chat/:username/:slotIdOrSlug",
"file": "server/index.js",
"file": "server/index.js",
- "line": 905,
+ "line": 918,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -7244,7 +7288,7 @@
@@ -7244,7 +7288,7 @@
"method": "GET",
"method": "GET",
"path": "/p/:slug/raw",
"path": "/p/:slug/raw",
"file": "server/index.js",
"file": "server/index.js",
- "line": 650,
+ "line": 663,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W5 (done)",
"wave": "W5 (done)",
@@ -7254,7 +7298,7 @@
@@ -7254,7 +7298,7 @@
"method": "GET",
"method": "GET",
"path": "/p/:slug/screenshot",
"path": "/p/:slug/screenshot",
"file": "server/index.js",
"file": "server/index.js",
- "line": 646,
+ "line": 659,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "adapter",
"disposition": "adapter",
"wave": "W5 (done)",
"wave": "W5 (done)",
@@ -7264,7 +7308,7 @@
@@ -7264,7 +7308,7 @@
"method": "GET",
"method": "GET",
"path": "/privacy",
"path": "/privacy",
"file": "server/index.js",
"file": "server/index.js",
- "line": 930,
+ "line": 943,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -7284,7 +7328,7 @@
@@ -7284,7 +7328,7 @@
"method": "GET",
"method": "GET",
"path": "/terms",
"path": "/terms",
"file": "server/index.js",
"file": "server/index.js",
- "line": 927,
+ "line": 940,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -7294,7 +7338,7 @@
@@ -7294,7 +7338,7 @@
"method": "GET",
"method": "GET",
"path": "/tos",
"path": "/tos",
"file": "server/index.js",
"file": "server/index.js",
- "line": 924,
+ "line": 937,
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -7304,7 +7348,7 @@
@@ -7304,7 +7348,7 @@
"method": "POST",
"method": "POST",
"path": "/whip/:streamId",
"path": "/whip/:streamId",
"file": "server/index.js",
"file": "server/index.js",
- "line": 939,
+ "line": 952,
"target": "OpenRe.Stream",
"target": "OpenRe.Stream",
"disposition": "extract",
"disposition": "extract",
"wave": "W7",
"wave": "W7",
@@ -7314,7 +7358,7 @@
@@ -7314,7 +7358,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/whip/:streamId/:resourceId",
"path": "/whip/:streamId/:resourceId",
"file": "server/index.js",
"file": "server/index.js",
- "line": 941,
+ "line": 954,
"target": "OpenRe.Stream",
"target": "OpenRe.Stream",
"disposition": "extract",
"disposition": "extract",
"wave": "W7",
"wave": "W7",
@@ -7324,7 +7368,7 @@
@@ -7324,7 +7368,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/whip/:streamId/:resourceId",
"path": "/whip/:streamId/:resourceId",
"file": "server/index.js",
"file": "server/index.js",
- "line": 940,
+ "line": 953,
"target": "OpenRe.Stream",
"target": "OpenRe.Stream",
"disposition": "extract",
"disposition": "extract",
"wave": "W7",
"wave": "W7",
@@ -7380,52 +7424,52 @@
@@ -7380,52 +7424,52 @@
{
{
"path": "/ws/",
"path": "/ws/",
"file": "server/index.js",
"file": "server/index.js",
- "line": 460
+ "line": 473
},
},
{
{
"path": "/ws/",
"path": "/ws/",
"file": "server/index.js",
"file": "server/index.js",
- "line": 470
+ "line": 483
},
},
{
{
"path": "/ws/chat",
"path": "/ws/chat",
"file": "server/index.js",
"file": "server/index.js",
- "line": 1085
+ "line": 1098
},
},
{
{
"path": "/ws/vibe-coding/publish",
"path": "/ws/vibe-coding/publish",
"file": "server/index.js",
"file": "server/index.js",
- "line": 1087
+ "line": 1100
},
},
{
{
"path": "/ws/broadcast",
"path": "/ws/broadcast",
"file": "server/index.js",
"file": "server/index.js",
- "line": 1089
+ "line": 1102
},
},
{
{
"path": "/ws/control",
"path": "/ws/control",
"file": "server/index.js",
"file": "server/index.js",
- "line": 1091
+ "line": 1104
},
},
{
{
"path": "/ws/call",
"path": "/ws/call",
"file": "server/index.js",
"file": "server/index.js",
- "line": 1093
+ "line": 1106
},
},
{
{
"path": "/ws/game",
"path": "/ws/game",
"file": "server/index.js",
"file": "server/index.js",
- "line": 1095
+ "line": 1108
},
},
{
{
"path": "/ws/canvas",
"path": "/ws/canvas",
"file": "server/index.js",
"file": "server/index.js",
- "line": 1095
+ "line": 1108
},
},
{
{
"path": "/ws/robotstreamer-publish",
"path": "/ws/robotstreamer-publish",
"file": "server/index.js",
"file": "server/index.js",
- "line": 1097
+ "line": 1110
},
},
{
{
"path": "/ws/robotstreamer-publish",
"path": "/ws/robotstreamer-publish",
@@ -7472,7 +7516,9 @@
@@ -7472,7 +7516,9 @@
"server/ai/ai-service.js"
"server/ai/ai-service.js"
],
],
"OV_AI_INTERNAL_URL": [
"OV_AI_INTERNAL_URL": [
- "server/ai/ai-service.js"
+ "server/ai/ai-service.js",
+ "server/ai/byo-credentials.js",
+ "server/ai/viewer-quota.js"
],
],
"YAMNET_MODEL": [
"YAMNET_MODEL": [
"server/ai/audio-events.js"
"server/ai/audio-events.js"
@@ -7519,6 +7565,24 @@
@@ -7519,6 +7565,24 @@
"WHISPER_MAX_CONCURRENT": [
"WHISPER_MAX_CONCURRENT": [
"server/ai/transcribe.js"
"server/ai/transcribe.js"
],
],
+ "OV_NETWORK_INTERNAL_URL": [
+ "server/analytics/network-analytics.js",
+ "server/auth/account-data.js",
+ "server/auth/game-summary.js",
+ "server/auth/module-summaries.js",
+ "server/chat/chat-server.js",
+ "server/events/stream-events.js",
+ "server/monetization/billing-client.js",
+ "server/monetization/wallet-client.js",
+ "server/net/network-principal.js",
+ "server/openre/openre-client.js",
+ "server/pastes-client.js",
+ "server/social/network-follows.js",
+ "server/utils/notify.js"
+ ],
+ "ANALYTICS_SOURCE": [
+ "server/analytics/network-analytics.js"
+ ],
"JWT_SECRET": [
"JWT_SECRET": [
"server/arena/arena-service.js",
"server/arena/arena-service.js",
"server/config.js",
"server/config.js",
@@ -7533,17 +7597,6 @@
@@ -7533,17 +7597,6 @@
"OV_NETWORK_PUBLIC_KEY": [
"OV_NETWORK_PUBLIC_KEY": [
"server/auth/auth.js"
"server/auth/auth.js"
],
],
- "OV_NETWORK_INTERNAL_URL": [
- "server/auth/module-summaries.js",
- "server/chat/chat-server.js",
- "server/events/stream-events.js",
- "server/monetization/billing-client.js",
- "server/monetization/wallet-client.js",
- "server/net/network-principal.js",
- "server/openre/openre-client.js",
- "server/pastes-client.js",
- "server/utils/notify.js"
- ],
"OV_OAUTH_CLIENT_ID": [
"OV_OAUTH_CLIENT_ID": [
"server/auth/module-summaries.js",
"server/auth/module-summaries.js",
"server/auth/routes.js",
"server/auth/routes.js",
@@ -7712,13 +7765,6 @@
@@ -7712,13 +7765,6 @@
"ESCROW_HOLD_DAYS": [
"ESCROW_HOLD_DAYS": [
"server/config.js"
"server/config.js"
],
],
- "COLD_STORAGE_PATH": [
- "server/config.js"
- ],
- "MAX_VOD_SIZE_MB": [
- "server/config.js",
- "server/media-proxy/vods.js"
- ],
"MAX_EMOTE_SIZE_KB": [
"MAX_EMOTE_SIZE_KB": [
"server/config.js"
"server/config.js"
],
],
@@ -7772,6 +7818,7 @@
@@ -7772,6 +7818,7 @@
],
],
"OV_APP_ROOT": [
"OV_APP_ROOT": [
"server/docs/routes.js",
"server/docs/routes.js",
+ "server/index.js",
"server/web/assets.js"
"server/web/assets.js"
],
],
"LIVE_DRILL": [
"LIVE_DRILL": [
@@ -7847,6 +7894,9 @@
@@ -7847,6 +7894,9 @@
"OPS_ALERT_WEBHOOK_URL": [
"OPS_ALERT_WEBHOOK_URL": [
"server/media-proxy/outcomes.js"
"server/media-proxy/outcomes.js"
],
],
+ "MAX_VOD_SIZE_MB": [
+ "server/media-proxy/vods.js"
+ ],
"MEDIA_WEBHOOK_SECRET": [
"MEDIA_WEBHOOK_SECRET": [
"server/media-proxy/webhook.js"
"server/media-proxy/webhook.js"
],
],
@@ -7874,6 +7924,12 @@
@@ -7874,6 +7924,12 @@
"LEGACY_QUEST_API_URL": [
"LEGACY_QUEST_API_URL": [
"server/monetization/cosmetics.js"
"server/monetization/cosmetics.js"
],
],
+ "LIVE_LIMITS_MINUTE": [
+ "server/net/actor-limits.js"
+ ],
+ "LIVE_LIMITS_HOUR": [
+ "server/net/actor-limits.js"
+ ],
"OPENRE_EVENTS_SECRET": [
"OPENRE_EVENTS_SECRET": [
"server/openre/mirror.js",
"server/openre/mirror.js",
"server/openre/routes.js"
"server/openre/routes.js"
@@ -7894,6 +7950,9 @@
@@ -7894,6 +7950,9 @@
"server/seo/seo.js",
"server/seo/seo.js",
"server/web/paste-handover.js"
"server/web/paste-handover.js"
],
],
+ "FOLLOWS_AUTHORITY": [
+ "server/social/network-follows.js"
+ ],
"CALLS_AUTHORITY": [
"CALLS_AUTHORITY": [
"server/streaming/calls-authority.js"
"server/streaming/calls-authority.js"
],
],
@@ -7922,11 +7981,80 @@
@@ -7922,11 +7981,80 @@
"refs": [
"refs": [
{
{
"via": "OV_AI_INTERNAL_URL",
"via": "OV_AI_INTERNAL_URL",
- "line": 40
+ "line": 41
},
},
{
{
"via": ":4700",
"via": ":4700",
- "line": 40
+ "line": 41
+ }
+ ]
+ }
+ ],
+ "auth": [
+ "none-detected"
+ ],
+ "timeout": true,
+ "retry": true
+ },
+ {
+ "file": "server/ai/byo-credentials.js",
+ "targets": [
+ {
+ "service": "ai",
+ "refs": [
+ {
+ "via": "OV_AI_INTERNAL_URL",
+ "line": 17
+ },
+ {
+ "via": ":4700",
+ "line": 17
+ }
+ ]
+ }
+ ],
+ "auth": [
+ "none-detected"
+ ],
+ "timeout": true,
+ "retry": true
+ },
+ {
+ "file": "server/ai/viewer-quota.js",
+ "targets": [
+ {
+ "service": "ai",
+ "refs": [
+ {
+ "via": "OV_AI_INTERNAL_URL",
+ "line": 17
+ },
+ {
+ "via": ":4700",
+ "line": 17
+ }
+ ]
+ }
+ ],
+ "auth": [
+ "none-detected"
+ ],
+ "timeout": true,
+ "retry": true
+ },
+ {
+ "file": "server/auth/account-data.js",
+ "targets": [
+ {
+ "service": "network",
+ "refs": [
+ {
+ "via": "OV_NETWORK_INTERNAL_URL",
+ "line": 171
+ },
+ {
+ "via": ":4000",
+ "line": 171
}
}
]
]
}
}
@@ -8540,7 +8668,7 @@
@@ -8540,7 +8668,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 300000,
"intervalMs": 300000,
- "line": 496,
+ "line": 470,
"file": "server/ai/ai-moments-job.js",
"file": "server/ai/ai-moments-job.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8551,7 +8679,7 @@
@@ -8551,7 +8679,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 354,
+ "line": 336,
"file": "server/ai/auto-clip-job.js",
"file": "server/ai/auto-clip-job.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8573,7 +8701,7 @@
@@ -8573,7 +8701,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 476,
+ "line": 395,
"file": "server/ai/chat-ai.js",
"file": "server/ai/chat-ai.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8584,7 +8712,7 @@
@@ -8584,7 +8712,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 300000,
"intervalMs": 300000,
- "line": 215,
+ "line": 201,
"file": "server/ai/easter-egg-job.js",
"file": "server/ai/easter-egg-job.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8595,7 +8723,7 @@
@@ -8595,7 +8723,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 193,
+ "line": 157,
"file": "server/ai/slogan-job.js",
"file": "server/ai/slogan-job.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8672,7 +8800,7 @@
@@ -8672,7 +8800,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 323,
+ "line": 292,
"file": "server/arena/listener.js",
"file": "server/arena/listener.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8815,7 +8943,7 @@
@@ -8815,7 +8943,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 100,
+ "line": 109,
"file": "server/events/stream-events.js",
"file": "server/events/stream-events.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8837,7 +8965,7 @@
@@ -8837,7 +8965,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 130,
+ "line": 124,
"file": "server/home/star-job.js",
"file": "server/home/star-job.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8848,7 +8976,7 @@
@@ -8848,7 +8976,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 21600000,
"intervalMs": 21600000,
- "line": 1364,
+ "line": 1377,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8859,7 +8987,7 @@
@@ -8859,7 +8987,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 45000,
"intervalMs": 45000,
- "line": 1381,
+ "line": 1394,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8870,7 +8998,7 @@
@@ -8870,7 +8998,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 1405,
+ "line": 1418,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -8881,7 +9009,7 @@
@@ -8881,7 +9009,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 1416,
+ "line": 1429,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -9068,7 +9196,7 @@
@@ -9068,7 +9196,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 246,
+ "line": 229,
"file": "server/recap/recap.js",
"file": "server/recap/recap.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"disposition": "keep",
"disposition": "keep",
@@ -9123,7 +9251,7 @@
@@ -9123,7 +9251,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 191,
+ "line": 196,
"file": "server/streaming/rtmp-server.js",
"file": "server/streaming/rtmp-server.js",
"target": "OpenRe.Stream",
"target": "OpenRe.Stream",
"disposition": "extract",
"disposition": "extract",
@@ -9166,7 +9294,7 @@
@@ -9166,7 +9294,7 @@
],
],
"contractTodos": 14,
"contractTodos": 14,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 126,
+ "testFiles": 158,
"ci": true
"ci": true
},
},
{
{
@@ -9174,13 +9302,13 @@
@@ -9174,13 +9302,13 @@
"service": "network",
"service": "network",
"present": true,
"present": true,
"git": {
"git": {
- "head": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",
+ "head": "5a50c12a83f6501aacd663f15d3c06c718a4c83a",
"branch": "main",
"branch": "main",
- "originMain": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",
- "committedAt": "2026-09-26T06:27:40-07:00"
+ "originMain": "5a50c12a83f6501aacd663f15d3c06c718a4c83a",
+ "committedAt": "2026-09-27T20:18:27-07:00"
},
},
- "sourceFiles": 93,
- "loc": 18495,
+ "sourceFiles": 103,
+ "loc": 21114,
"tables": [
"tables": [
{
{
"table": "moderation_audit",
"table": "moderation_audit",
@@ -9188,6 +9316,12 @@
@@ -9188,6 +9316,12 @@
"line": 36,
"line": 36,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "creator_streams",
+ "file": "server/analytics/creators.js",
+ "line": 27,
+ "via": "repo"
+ },
{
{
"table": "admin_rate_limits",
"table": "admin_rate_limits",
"file": "server/auth/admin-limits.js",
"file": "server/auth/admin-limits.js",
@@ -9392,6 +9526,24 @@
@@ -9392,6 +9526,24 @@
"line": 124,
"line": 124,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "dev_usage_windows",
+ "file": "server/developer/usage.js",
+ "line": 50,
+ "via": "repo"
+ },
+ {
+ "table": "dev_usage_daily",
+ "file": "server/developer/usage.js",
+ "line": 69,
+ "via": "repo"
+ },
+ {
+ "table": "dev_usage_errors",
+ "file": "server/developer/usage.js",
+ "line": 84,
+ "via": "repo"
+ },
{
{
"table": "tool_domains",
"table": "tool_domains",
"file": "server/domains/routes.js",
"file": "server/domains/routes.js",
@@ -9416,18 +9568,84 @@
@@ -9416,18 +9568,84 @@
"line": 26,
"line": 26,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "account_exports",
+ "file": "server/identity/account-data.js",
+ "line": 56,
+ "via": "repo"
+ },
+ {
+ "table": "account_export_parts",
+ "file": "server/identity/account-data.js",
+ "line": 71,
+ "via": "repo"
+ },
+ {
+ "table": "account_deletions",
+ "file": "server/identity/account-data.js",
+ "line": 80,
+ "via": "repo"
+ },
+ {
+ "table": "account_deletion_confirmations",
+ "file": "server/identity/account-data.js",
+ "line": 94,
+ "via": "repo"
+ },
+ {
+ "table": "subject_aliases",
+ "file": "server/identity/account-merge.js",
+ "line": 48,
+ "via": "repo"
+ },
+ {
+ "table": "account_merges",
+ "file": "server/identity/account-merge.js",
+ "line": 56,
+ "via": "repo"
+ },
+ {
+ "table": "account_merge_intents",
+ "file": "server/identity/account-merge.js",
+ "line": 71,
+ "via": "repo"
+ },
{
{
"table": "user_blocks",
"table": "user_blocks",
"file": "server/identity/blocks.js",
"file": "server/identity/blocks.js",
"line": 41,
"line": 41,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "user_follows",
+ "file": "server/identity/follows.js",
+ "line": 42,
+ "via": "repo"
+ },
+ {
+ "table": "follow_import_holds",
+ "file": "server/identity/follows.js",
+ "line": 57,
+ "via": "repo"
+ },
{
{
"table": "principal_grant_changes",
"table": "principal_grant_changes",
"file": "server/identity/grants-admin.js",
"file": "server/identity/grants-admin.js",
"line": 38,
"line": 38,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "mod_principals",
+ "file": "server/identity/mod-principals.js",
+ "line": 33,
+ "via": "repo"
+ },
+ {
+ "table": "mod_principal_grants",
+ "file": "server/identity/mod-principals.js",
+ "line": 49,
+ "via": "repo"
+ },
{
{
"table": "user_modules",
"table": "user_modules",
"file": "server/identity/modules.js",
"file": "server/identity/modules.js",
@@ -9449,13 +9667,13 @@
@@ -9449,13 +9667,13 @@
{
{
"table": "principal_grants",
"table": "principal_grants",
"file": "server/identity/principals.js",
"file": "server/identity/principals.js",
- "line": 217,
+ "line": 246,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "principal_usage",
"table": "principal_usage",
"file": "server/identity/principals.js",
"file": "server/identity/principals.js",
- "line": 227,
+ "line": 256,
"via": "repo"
"via": "repo"
},
},
{
{
@@ -9482,6 +9700,24 @@
@@ -9482,6 +9700,24 @@
"line": 31,
"line": 31,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "operator_alerts",
+ "file": "server/operator/alerts.js",
+ "line": 25,
+ "via": "repo"
+ },
+ {
+ "table": "status_incidents",
+ "file": "server/status/incidents.js",
+ "line": 30,
+ "via": "repo"
+ },
+ {
+ "table": "status_incident_updates",
+ "file": "server/status/incidents.js",
+ "line": 43,
+ "via": "repo"
+ },
{
{
"table": "url_registry",
"table": "url_registry",
"file": "server/url-registry.js",
"file": "server/url-registry.js",
@@ -9522,6 +9758,26 @@
@@ -9522,6 +9758,26 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "GET",
+ "path": "/",
+ "file": "server/identity/account-data.js",
+ "line": 554,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/",
+ "file": "server/identity/account-merge.js",
+ "line": 316,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
@@ -9532,11 +9788,21 @@
@@ -9532,11 +9788,21 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "POST",
+ "path": "/",
+ "file": "server/identity/account-merge.js",
+ "line": 304,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "POST",
"method": "POST",
"path": "/",
"path": "/",
"file": "server/notifications/events-consumer.js",
"file": "server/notifications/events-consumer.js",
- "line": 248,
+ "line": 264,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -9552,6 +9818,16 @@
@@ -9552,6 +9818,16 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "POST",
+ "path": "/:id/cancel",
+ "file": "server/identity/account-data.js",
+ "line": 565,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "POST",
"method": "POST",
"path": "/:id/dismiss",
"path": "/:id/dismiss",
@@ -9586,7 +9862,27 @@
@@ -9586,7 +9862,27 @@
"method": "GET",
"method": "GET",
"path": "/.well-known/web-identity",
"path": "/.well-known/web-identity",
"file": "server/index.js",
"file": "server/index.js",
- "line": 694,
+ "line": 755,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/account-deletions/:id/confirmations",
+ "file": "server/identity/account-data.js",
+ "line": 547,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/account-exports/:id/parts",
+ "file": "server/identity/account-data.js",
+ "line": 539,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -9606,7 +9902,7 @@
@@ -9606,7 +9902,7 @@
"method": "GET",
"method": "GET",
"path": "/api/.well-known/jwks",
"path": "/api/.well-known/jwks",
"file": "server/index.js",
"file": "server/index.js",
- "line": 442,
+ "line": 500,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -9782,6 +10078,86 @@
@@ -9782,6 +10078,86 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "GET",
+ "path": "/api/admin/mods",
+ "file": "server/identity/mod-principals.js",
+ "line": 178,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/admin/mods",
+ "file": "server/identity/mod-principals.js",
+ "line": 197,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/api/admin/mods",
+ "file": "server/identity/mod-principals.js",
+ "line": 184,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/admin/mods/:id",
+ "file": "server/identity/mod-principals.js",
+ "line": 183,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/api/admin/mods/:id/grants",
+ "file": "server/identity/mod-principals.js",
+ "line": 185,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/api/admin/mods/:id/grants",
+ "file": "server/identity/mod-principals.js",
+ "line": 201,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/api/admin/mods/:id/revoke",
+ "file": "server/identity/mod-principals.js",
+ "line": 186,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/api/admin/mods/:id/revoke",
+ "file": "server/identity/mod-principals.js",
+ "line": 210,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/api/admin/operator-checklist",
"path": "/api/admin/operator-checklist",
@@ -9796,7 +10172,7 @@
@@ -9796,7 +10172,7 @@
"method": "GET",
"method": "GET",
"path": "/api/admin/ssh-info",
"path": "/api/admin/ssh-info",
"file": "server/index.js",
"file": "server/index.js",
- "line": 566,
+ "line": 627,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -9916,7 +10292,7 @@
@@ -9916,7 +10292,7 @@
"method": "GET",
"method": "GET",
"path": "/api/auth/anon-identities",
"path": "/api/auth/anon-identities",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 667,
+ "line": 679,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -9926,7 +10302,7 @@
@@ -9926,7 +10302,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/anon-session",
"path": "/api/auth/anon-session",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 538,
+ "line": 550,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -9936,7 +10312,7 @@
@@ -9936,7 +10312,7 @@
"method": "GET",
"method": "GET",
"path": "/api/auth/anon/:token",
"path": "/api/auth/anon/:token",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 608,
+ "line": 620,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -9946,7 +10322,7 @@
@@ -9946,7 +10322,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/anon/:token/link",
"path": "/api/auth/anon/:token/link",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 645,
+ "line": 657,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -9956,7 +10332,7 @@
@@ -9956,7 +10332,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/auth/anon/:token/preferences",
"path": "/api/auth/anon/:token/preferences",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 622,
+ "line": 634,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -9966,7 +10342,7 @@
@@ -9966,7 +10342,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/change-password",
"path": "/api/auth/change-password",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 431,
+ "line": 443,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10046,7 +10422,7 @@
@@ -10046,7 +10422,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/forgot-password",
"path": "/api/auth/forgot-password",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 213,
+ "line": 225,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10056,7 +10432,7 @@
@@ -10056,7 +10432,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/login",
"path": "/api/auth/login",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 190,
+ "line": 199,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10066,7 +10442,7 @@
@@ -10066,7 +10442,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/logout",
"path": "/api/auth/logout",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 532,
+ "line": 544,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10076,7 +10452,7 @@
@@ -10076,7 +10452,7 @@
"method": "GET",
"method": "GET",
"path": "/api/auth/me",
"path": "/api/auth/me",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 370,
+ "line": 382,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10086,7 +10462,7 @@
@@ -10086,7 +10462,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/auth/profile",
"path": "/api/auth/profile",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 381,
+ "line": 393,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10096,7 +10472,7 @@
@@ -10096,7 +10472,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/refresh",
"path": "/api/auth/refresh",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 305,
+ "line": 317,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10106,7 +10482,7 @@
@@ -10106,7 +10482,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/register",
"path": "/api/auth/register",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 93,
+ "line": 102,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10116,7 +10492,7 @@
@@ -10116,7 +10492,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/reset-password",
"path": "/api/auth/reset-password",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 261,
+ "line": 273,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10126,7 +10502,7 @@
@@ -10126,7 +10502,7 @@
"method": "GET",
"method": "GET",
"path": "/api/auth/reset-password/validate",
"path": "/api/auth/reset-password/validate",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 245,
+ "line": 257,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10136,7 +10512,7 @@
@@ -10136,7 +10512,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/auth/sessions",
"path": "/api/auth/sessions",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 750,
+ "line": 762,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10146,7 +10522,7 @@
@@ -10146,7 +10522,7 @@
"method": "GET",
"method": "GET",
"path": "/api/auth/sessions",
"path": "/api/auth/sessions",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 705,
+ "line": 717,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10156,7 +10532,7 @@
@@ -10156,7 +10532,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/sessions",
"path": "/api/auth/sessions",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 718,
+ "line": 730,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10166,7 +10542,7 @@
@@ -10166,7 +10542,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/auth/sessions/:id",
"path": "/api/auth/sessions/:id",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 740,
+ "line": 752,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10176,7 +10552,7 @@
@@ -10176,7 +10552,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/sign-out-everywhere",
"path": "/api/auth/sign-out-everywhere",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 520,
+ "line": 532,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10186,7 +10562,7 @@
@@ -10186,7 +10562,7 @@
"method": "GET",
"method": "GET",
"path": "/api/auth/users/:id/card",
"path": "/api/auth/users/:id/card",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 765,
+ "line": 777,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10196,7 +10572,7 @@
@@ -10196,7 +10572,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/auth/users/:id/follow",
"path": "/api/auth/users/:id/follow",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 848,
+ "line": 860,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10206,7 +10582,7 @@
@@ -10206,7 +10582,7 @@
"method": "POST",
"method": "POST",
"path": "/api/auth/users/:id/follow",
"path": "/api/auth/users/:id/follow",
"file": "server/auth/routes.js",
"file": "server/auth/routes.js",
- "line": 817,
+ "line": 829,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10216,7 +10592,7 @@
@@ -10216,7 +10592,7 @@
"method": "GET",
"method": "GET",
"path": "/api/brand",
"path": "/api/brand",
"file": "server/index.js",
"file": "server/index.js",
- "line": 468,
+ "line": 529,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10226,7 +10602,7 @@
@@ -10226,7 +10602,7 @@
"method": "GET",
"method": "GET",
"path": "/api/catalog.json",
"path": "/api/catalog.json",
"file": "server/index.js",
"file": "server/index.js",
- "line": 532,
+ "line": 593,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10346,7 +10722,7 @@
@@ -10346,7 +10722,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/index.js",
"file": "server/index.js",
- "line": 454,
+ "line": 515,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10406,7 +10782,7 @@
@@ -10406,7 +10782,7 @@
"method": "GET",
"method": "GET",
"path": "/api/modules",
"path": "/api/modules",
"file": "server/identity/modules.js",
"file": "server/identity/modules.js",
- "line": 327,
+ "line": 345,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10416,7 +10792,7 @@
@@ -10416,7 +10792,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/modules/:ns",
"path": "/api/modules/:ns",
"file": "server/identity/modules.js",
"file": "server/identity/modules.js",
- "line": 352,
+ "line": 370,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10426,7 +10802,7 @@
@@ -10426,7 +10802,7 @@
"method": "GET",
"method": "GET",
"path": "/api/modules/:ns",
"path": "/api/modules/:ns",
"file": "server/identity/modules.js",
"file": "server/identity/modules.js",
- "line": 335,
+ "line": 353,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10436,7 +10812,7 @@
@@ -10436,7 +10812,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/modules/:ns",
"path": "/api/modules/:ns",
"file": "server/identity/modules.js",
"file": "server/identity/modules.js",
- "line": 343,
+ "line": 361,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10446,7 +10822,7 @@
@@ -10446,7 +10822,7 @@
"method": "GET",
"method": "GET",
"path": "/api/modules/:ns/public/:subject",
"path": "/api/modules/:ns/public/:subject",
"file": "server/identity/modules.js",
"file": "server/identity/modules.js",
- "line": 319,
+ "line": 337,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10456,7 +10832,7 @@
@@ -10456,7 +10832,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/modules/modules/:ns/:subject",
"path": "/api/modules/modules/:ns/:subject",
"file": "server/identity/modules.js",
"file": "server/identity/modules.js",
- "line": 390,
+ "line": 408,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10466,7 +10842,7 @@
@@ -10466,7 +10842,7 @@
"method": "GET",
"method": "GET",
"path": "/api/modules/modules/:ns/:subject",
"path": "/api/modules/modules/:ns/:subject",
"file": "server/identity/modules.js",
"file": "server/identity/modules.js",
- "line": 367,
+ "line": 385,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10476,7 +10852,7 @@
@@ -10476,7 +10852,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/modules/modules/:ns/:subject",
"path": "/api/modules/modules/:ns/:subject",
"file": "server/identity/modules.js",
"file": "server/identity/modules.js",
- "line": 379,
+ "line": 397,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10566,7 +10942,7 @@
@@ -10566,7 +10942,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/index.js",
"file": "server/index.js",
- "line": 464,
+ "line": 525,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10576,7 +10952,7 @@
@@ -10576,7 +10952,7 @@
"method": "GET",
"method": "GET",
"path": "/api/sso/targets",
"path": "/api/sso/targets",
"file": "server/index.js",
"file": "server/index.js",
- "line": 514,
+ "line": 575,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10702,6 +11078,86 @@
@@ -10702,6 +11078,86 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "GET",
+ "path": "/api/v1/creators/:creator/analytics",
+ "file": "server/analytics/creators.js",
+ "line": 121,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/follows",
+ "file": "server/identity/follows.js",
+ "line": 262,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "DELETE",
+ "path": "/api/v1/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 278,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "DELETE",
+ "path": "/api/v1/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 337,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 291,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "PUT",
+ "path": "/api/v1/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 268,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "PUT",
+ "path": "/api/v1/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 324,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/follows/:type/:target/followers",
+ "file": "server/identity/follows.js",
+ "line": 304,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/me/blocks",
"path": "/api/v1/me/blocks",
@@ -10732,11 +11188,81 @@
@@ -10732,11 +11188,81 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "GET",
+ "path": "/api/v1/me/follows",
+ "file": "server/identity/follows.js",
+ "line": 262,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "DELETE",
+ "path": "/api/v1/me/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 278,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "DELETE",
+ "path": "/api/v1/me/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 337,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/me/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 291,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "PUT",
+ "path": "/api/v1/me/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 268,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "PUT",
+ "path": "/api/v1/me/follows/:type/:target",
+ "file": "server/identity/follows.js",
+ "line": 324,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/me/follows/:type/:target/followers",
+ "file": "server/identity/follows.js",
+ "line": 304,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/projects",
"path": "/api/v1/projects",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 86,
+ "line": 89,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10746,7 +11272,7 @@
@@ -10746,7 +11272,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects",
"path": "/api/v1/projects",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 85,
+ "line": 88,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10756,7 +11282,7 @@
@@ -10756,7 +11282,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:project",
"path": "/api/v1/projects/:project",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 87,
+ "line": 90,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10766,7 +11292,7 @@
@@ -10766,7 +11292,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/projects/:project",
"path": "/api/v1/projects/:project",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 91,
+ "line": 94,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10776,7 +11302,7 @@
@@ -10776,7 +11302,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/projects/:project/allowance",
"path": "/api/v1/projects/:project/allowance",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 93,
+ "line": 96,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10786,7 +11312,7 @@
@@ -10786,7 +11312,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:project/apps",
"path": "/api/v1/projects/:project/apps",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 101,
+ "line": 104,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10796,7 +11322,7 @@
@@ -10796,7 +11322,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:project/apps",
"path": "/api/v1/projects/:project/apps",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 102,
+ "line": 105,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10806,7 +11332,7 @@
@@ -10806,7 +11332,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/projects/:project/apps/:app",
"path": "/api/v1/projects/:project/apps/:app",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 105,
+ "line": 108,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10816,7 +11342,7 @@
@@ -10816,7 +11342,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:project/apps/:app",
"path": "/api/v1/projects/:project/apps/:app",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 103,
+ "line": 106,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10826,7 +11352,7 @@
@@ -10826,7 +11352,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/projects/:project/apps/:app",
"path": "/api/v1/projects/:project/apps/:app",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 104,
+ "line": 107,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10836,7 +11362,7 @@
@@ -10836,7 +11362,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:project/apps/:app/credentials",
"path": "/api/v1/projects/:project/apps/:app/credentials",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 107,
+ "line": 110,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10846,7 +11372,7 @@
@@ -10846,7 +11372,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:project/apps/:app/credentials/:credential/revoke",
"path": "/api/v1/projects/:project/apps/:app/credentials/:credential/revoke",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 109,
+ "line": 112,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10856,7 +11382,7 @@
@@ -10856,7 +11382,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:project/apps/:app/credentials/rotate",
"path": "/api/v1/projects/:project/apps/:app/credentials/rotate",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 108,
+ "line": 111,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10866,7 +11392,7 @@
@@ -10866,7 +11392,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:project/apps/:app/grants",
"path": "/api/v1/projects/:project/apps/:app/grants",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 111,
+ "line": 114,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10876,7 +11402,7 @@
@@ -10876,7 +11402,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:project/apps/:app/grants",
"path": "/api/v1/projects/:project/apps/:app/grants",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 112,
+ "line": 115,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10886,7 +11412,7 @@
@@ -10886,7 +11412,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/projects/:project/apps/:app/grants/:capability",
"path": "/api/v1/projects/:project/apps/:app/grants/:capability",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 115,
+ "line": 118,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10896,7 +11422,7 @@
@@ -10896,7 +11422,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:project/apps/:app/grants/:capability/approve",
"path": "/api/v1/projects/:project/apps/:app/grants/:capability/approve",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 113,
+ "line": 116,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10906,7 +11432,7 @@
@@ -10906,7 +11432,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:project/apps/:app/grants/:capability/deny",
"path": "/api/v1/projects/:project/apps/:app/grants/:capability/deny",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 114,
+ "line": 117,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10916,7 +11442,7 @@
@@ -10916,7 +11442,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:project/archive",
"path": "/api/v1/projects/:project/archive",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 92,
+ "line": 95,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10926,7 +11452,7 @@
@@ -10926,7 +11452,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:project/audit",
"path": "/api/v1/projects/:project/audit",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 121,
+ "line": 130,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10936,7 +11462,7 @@
@@ -10936,7 +11462,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/projects/:project/environment-policy",
"path": "/api/v1/projects/:project/environment-policy",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 94,
+ "line": 97,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10946,7 +11472,7 @@
@@ -10946,7 +11472,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:project/export-tokens",
"path": "/api/v1/projects/:project/export-tokens",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 127,
+ "line": 136,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10956,7 +11482,7 @@
@@ -10956,7 +11482,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:project/members",
"path": "/api/v1/projects/:project/members",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 96,
+ "line": 99,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10966,7 +11492,7 @@
@@ -10966,7 +11492,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:project/members",
"path": "/api/v1/projects/:project/members",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 97,
+ "line": 100,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10976,7 +11502,7 @@
@@ -10976,7 +11502,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/projects/:project/members/:subject",
"path": "/api/v1/projects/:project/members/:subject",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 99,
+ "line": 102,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10986,7 +11512,7 @@
@@ -10986,7 +11512,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/projects/:project/members/:subject",
"path": "/api/v1/projects/:project/members/:subject",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 98,
+ "line": 101,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -10996,7 +11522,7 @@
@@ -10996,7 +11522,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:project/quotas",
"path": "/api/v1/projects/:project/quotas",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 117,
+ "line": 120,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11006,7 +11532,7 @@
@@ -11006,7 +11532,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/projects/:project/quotas/:capability",
"path": "/api/v1/projects/:project/quotas/:capability",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 119,
+ "line": 122,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11016,7 +11542,17 @@
@@ -11016,7 +11542,17 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/projects/:project/quotas/:capability",
"path": "/api/v1/projects/:project/quotas/:capability",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 118,
+ "line": 121,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/projects/:project/usage",
+ "file": "server/developer/routes.js",
+ "line": 125,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11026,7 +11562,7 @@
@@ -11026,7 +11562,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/catalog",
"path": "/api/v1/projects/catalog",
"file": "server/developer/routes.js",
"file": "server/developer/routes.js",
- "line": 79,
+ "line": 82,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11236,7 +11772,37 @@
@@ -11236,7 +11772,37 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/status",
"path": "/api/v1/status",
"file": "server/status/routes.js",
"file": "server/status/routes.js",
- "line": 228,
+ "line": 242,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/status/incidents",
+ "file": "server/status/incidents.js",
+ "line": 128,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/api/v1/status/incidents",
+ "file": "server/status/incidents.js",
+ "line": 153,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/api/v1/status/incidents/:id/updates",
+ "file": "server/status/incidents.js",
+ "line": 154,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11246,7 +11812,7 @@
@@ -11246,7 +11812,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/status/slo",
"path": "/api/v1/status/slo",
"file": "server/status/routes.js",
"file": "server/status/routes.js",
- "line": 245,
+ "line": 259,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11256,7 +11822,7 @@
@@ -11256,7 +11822,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/users/names/:name",
"path": "/api/v1/users/names/:name",
"file": "server/index.js",
"file": "server/index.js",
- "line": 396,
+ "line": 404,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11276,7 +11842,7 @@
@@ -11276,7 +11842,7 @@
"method": "GET",
"method": "GET",
"path": "/audit",
"path": "/audit",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 870,
+ "line": 872,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11336,7 +11902,7 @@
@@ -11336,7 +11902,7 @@
"method": "POST",
"method": "POST",
"path": "/broadcast",
"path": "/broadcast",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 794,
+ "line": 796,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11396,7 +11962,7 @@
@@ -11396,7 +11962,7 @@
"method": "GET",
"method": "GET",
"path": "/config",
"path": "/config",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 379,
+ "line": 380,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11426,7 +11992,7 @@
@@ -11426,7 +11992,7 @@
"method": "GET",
"method": "GET",
"path": "/config/:namespace",
"path": "/config/:namespace",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 380,
+ "line": 381,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11436,7 +12002,7 @@
@@ -11436,7 +12002,7 @@
"method": "GET",
"method": "GET",
"path": "/config/:namespace/history",
"path": "/config/:namespace/history",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 381,
+ "line": 382,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11446,7 +12012,37 @@
@@ -11446,7 +12012,37 @@
"method": "POST",
"method": "POST",
"path": "/config/:namespace/rollback",
"path": "/config/:namespace/rollback",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 382,
+ "line": 383,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "DELETE",
+ "path": "/deletion",
+ "file": "server/identity/account-data.js",
+ "line": 531,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/deletion",
+ "file": "server/identity/account-data.js",
+ "line": 520,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/deletion",
+ "file": "server/identity/account-data.js",
+ "line": 525,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11522,6 +12118,46 @@
@@ -11522,6 +12118,46 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "GET",
+ "path": "/export",
+ "file": "server/identity/account-data.js",
+ "line": 498,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/export",
+ "file": "server/identity/account-data.js",
+ "line": 490,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/export/:id",
+ "file": "server/identity/account-data.js",
+ "line": 503,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/export/:id/download",
+ "file": "server/identity/account-data.js",
+ "line": 509,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/fedcm/accounts",
"path": "/fedcm/accounts",
@@ -11576,7 +12212,7 @@
@@ -11576,7 +12212,7 @@
"method": "GET",
"method": "GET",
"path": "/health",
"path": "/health",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 839,
+ "line": 841,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11596,7 +12232,7 @@
@@ -11596,7 +12232,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/anon-admin",
"path": "/internal/anon-admin",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 661,
+ "line": 685,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11606,7 +12242,7 @@
@@ -11606,7 +12242,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/anon-list",
"path": "/internal/anon-list",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 710,
+ "line": 734,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11616,7 +12252,7 @@
@@ -11616,7 +12252,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/audit",
"path": "/internal/audit",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 224,
+ "line": 226,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11626,7 +12262,7 @@
@@ -11626,7 +12262,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/blocks",
"path": "/internal/blocks",
"file": "server/index.js",
"file": "server/index.js",
- "line": 408,
+ "line": 452,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11636,7 +12272,7 @@
@@ -11636,7 +12272,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/coins/credit",
"path": "/internal/coins/credit",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 316,
+ "line": 322,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11646,7 +12282,7 @@
@@ -11646,7 +12282,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/coins/debit",
"path": "/internal/coins/debit",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 328,
+ "line": 334,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11656,7 +12292,7 @@
@@ -11656,7 +12292,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/coins/stats",
"path": "/internal/coins/stats",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 275,
+ "line": 281,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11666,7 +12302,7 @@
@@ -11666,7 +12302,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/coins/transfer",
"path": "/internal/coins/transfer",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 341,
+ "line": 347,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11676,7 +12312,7 @@
@@ -11676,7 +12312,7 @@
"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": 359,
+ "line": 365,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "compat",
"disposition": "compat",
"wave": "W3",
"wave": "W3",
@@ -11696,7 +12332,7 @@
@@ -11696,7 +12332,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/identity/legacy-map",
"path": "/internal/identity/legacy-map",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 84,
+ "line": 86,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11716,7 +12352,7 @@
@@ -11716,7 +12352,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/identity/resolve",
"path": "/internal/identity/resolve",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 80,
+ "line": 82,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11736,7 +12372,7 @@
@@ -11736,7 +12372,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/identity/resolve-batch",
"path": "/internal/identity/resolve-batch",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 81,
+ "line": 83,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11746,7 +12382,7 @@
@@ -11746,7 +12382,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/integrations/github-token",
"path": "/internal/integrations/github-token",
"file": "server/index.js",
"file": "server/index.js",
- "line": 404,
+ "line": 412,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11756,7 +12392,7 @@
@@ -11756,7 +12392,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/issue-token",
"path": "/internal/issue-token",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 551,
+ "line": 575,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11766,7 +12402,87 @@
@@ -11766,7 +12402,87 @@
"method": "POST",
"method": "POST",
"path": "/internal/link-account",
"path": "/internal/link-account",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 166,
+ "line": 168,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1",
+ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
+ },
+ {
+ "method": "GET",
+ "path": "/internal/mods",
+ "file": "server/identity/mod-principals.js",
+ "line": 178,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1",
+ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
+ },
+ {
+ "method": "GET",
+ "path": "/internal/mods",
+ "file": "server/identity/mod-principals.js",
+ "line": 197,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1",
+ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
+ },
+ {
+ "method": "POST",
+ "path": "/internal/mods",
+ "file": "server/identity/mod-principals.js",
+ "line": 184,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1",
+ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
+ },
+ {
+ "method": "GET",
+ "path": "/internal/mods/:id",
+ "file": "server/identity/mod-principals.js",
+ "line": 183,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1",
+ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
+ },
+ {
+ "method": "POST",
+ "path": "/internal/mods/:id/grants",
+ "file": "server/identity/mod-principals.js",
+ "line": 185,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1",
+ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
+ },
+ {
+ "method": "POST",
+ "path": "/internal/mods/:id/grants",
+ "file": "server/identity/mod-principals.js",
+ "line": 201,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1",
+ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
+ },
+ {
+ "method": "POST",
+ "path": "/internal/mods/:id/revoke",
+ "file": "server/identity/mod-principals.js",
+ "line": 186,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1",
+ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
+ },
+ {
+ "method": "POST",
+ "path": "/internal/mods/:id/revoke",
+ "file": "server/identity/mod-principals.js",
+ "line": 210,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11776,7 +12492,7 @@
@@ -11776,7 +12492,7 @@
"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": 512,
+ "line": 536,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11786,7 +12502,7 @@
@@ -11786,7 +12502,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/notifications/push",
"path": "/internal/notifications/push",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 454,
+ "line": 460,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11796,7 +12512,7 @@
@@ -11796,7 +12512,7 @@
"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": 474,
+ "line": 480,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11806,7 +12522,7 @@
@@ -11806,7 +12522,7 @@
"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": 531,
+ "line": 555,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11816,7 +12532,17 @@
@@ -11816,7 +12532,17 @@
"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": 497,
+ "line": 521,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "W1",
+ "note": "Internal identity, notifications, coins and registry routes; key-only ones are dated in the register (C-50..C-57)."
+ },
+ {
+ "method": "POST",
+ "path": "/internal/operator/alerts",
+ "file": "server/internal/routes.js",
+ "line": 505,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11826,7 +12552,7 @@
@@ -11826,7 +12552,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/resolve-anon",
"path": "/internal/resolve-anon",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 582,
+ "line": 606,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11836,7 +12562,7 @@
@@ -11836,7 +12562,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/stats",
"path": "/internal/stats",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 233,
+ "line": 235,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11846,7 +12572,7 @@
@@ -11846,7 +12572,7 @@
"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": 244,
+ "line": 247,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11856,7 +12582,7 @@
@@ -11856,7 +12582,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/user-avatar",
"path": "/internal/user-avatar",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 209,
+ "line": 211,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11866,7 +12592,7 @@
@@ -11866,7 +12592,7 @@
"method": "GET",
"method": "GET",
"path": "/internal/users/:id",
"path": "/internal/users/:id",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 116,
+ "line": 118,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11876,7 +12602,7 @@
@@ -11876,7 +12602,7 @@
"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": 217,
+ "line": 219,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11886,7 +12612,7 @@
@@ -11886,7 +12612,7 @@
"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": 153,
+ "line": 155,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11896,7 +12622,7 @@
@@ -11896,7 +12622,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/users/bulk",
"path": "/internal/users/bulk",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 138,
+ "line": 140,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11906,7 +12632,7 @@
@@ -11906,7 +12632,7 @@
"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": 127,
+ "line": 129,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11916,7 +12642,7 @@
@@ -11916,7 +12642,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/verify-token",
"path": "/internal/verify-token",
"file": "server/internal/routes.js",
"file": "server/internal/routes.js",
- "line": 92,
+ "line": 94,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "W1",
"wave": "W1",
@@ -11926,7 +12652,7 @@
@@ -11926,7 +12652,7 @@
"method": "GET",
"method": "GET",
"path": "/llms.txt",
"path": "/llms.txt",
"file": "server/index.js",
"file": "server/index.js",
- "line": 672,
+ "line": 733,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11952,11 +12678,41 @@
@@ -11952,11 +12678,41 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "POST",
+ "path": "/merge",
+ "file": "server/identity/account-merge.js",
+ "line": 293,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/merge/intents",
+ "file": "server/identity/account-merge.js",
+ "line": 289,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/merges",
+ "file": "server/identity/account-merge.js",
+ "line": 296,
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/net-config",
"path": "/net-config",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 980,
+ "line": 982,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -11966,7 +12722,7 @@
@@ -11966,7 +12722,7 @@
"method": "PUT",
"method": "PUT",
"path": "/net-config",
"path": "/net-config",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 999,
+ "line": 1001,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12036,7 +12792,7 @@
@@ -12036,7 +12792,7 @@
"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": 421,
+ "line": 422,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12086,7 +12842,7 @@
@@ -12086,7 +12842,7 @@
"method": "GET",
"method": "GET",
"path": "/oauth/userinfo",
"path": "/oauth/userinfo",
"file": "server/auth/oauth-routes.js",
"file": "server/auth/oauth-routes.js",
- "line": 425,
+ "line": 426,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12096,7 +12852,7 @@
@@ -12096,7 +12852,7 @@
"method": "POST",
"method": "POST",
"path": "/oauth/userinfo",
"path": "/oauth/userinfo",
"file": "server/auth/oauth-routes.js",
"file": "server/auth/oauth-routes.js",
- "line": 426,
+ "line": 427,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12106,7 +12862,7 @@
@@ -12106,7 +12862,7 @@
"method": "GET",
"method": "GET",
"path": "/openvibe-sw.js",
"path": "/openvibe-sw.js",
"file": "server/index.js",
"file": "server/index.js",
- "line": 717,
+ "line": 778,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12206,7 +12962,7 @@
@@ -12206,7 +12962,7 @@
"method": "POST",
"method": "POST",
"path": "/reset-db",
"path": "/reset-db",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 518,
+ "line": 520,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12246,7 +13002,7 @@
@@ -12246,7 +13002,7 @@
"method": "PUT",
"method": "PUT",
"path": "/settings",
"path": "/settings",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 340,
+ "line": 341,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12256,7 +13012,7 @@
@@ -12256,7 +13012,7 @@
"method": "GET",
"method": "GET",
"path": "/sso/check",
"path": "/sso/check",
"file": "server/index.js",
"file": "server/index.js",
- "line": 701,
+ "line": 762,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12276,7 +13032,7 @@
@@ -12276,7 +13032,7 @@
"method": "GET",
"method": "GET",
"path": "/status",
"path": "/status",
"file": "server/status/routes.js",
"file": "server/status/routes.js",
- "line": 248,
+ "line": 262,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12306,7 +13062,7 @@
@@ -12306,7 +13062,7 @@
"method": "GET",
"method": "GET",
"path": "/tos",
"path": "/tos",
"file": "server/index.js",
"file": "server/index.js",
- "line": 528,
+ "line": 589,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12346,7 +13102,7 @@
@@ -12346,7 +13102,7 @@
"method": "GET",
"method": "GET",
"path": "/url-registry",
"path": "/url-registry",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 398,
+ "line": 399,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12356,7 +13112,7 @@
@@ -12356,7 +13112,7 @@
"method": "PUT",
"method": "PUT",
"path": "/url-registry",
"path": "/url-registry",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 425,
+ "line": 427,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12366,7 +13122,7 @@
@@ -12366,7 +13122,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/url-registry/:key",
"path": "/url-registry/:key",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 468,
+ "line": 470,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12376,7 +13132,7 @@
@@ -12376,7 +13132,7 @@
"method": "PUT",
"method": "PUT",
"path": "/url-registry/:key",
"path": "/url-registry/:key",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 446,
+ "line": 448,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12386,7 +13142,7 @@
@@ -12386,7 +13142,7 @@
"method": "POST",
"method": "POST",
"path": "/url-registry/:key/reset",
"path": "/url-registry/:key/reset",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 503,
+ "line": 505,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12396,7 +13152,7 @@
@@ -12396,7 +13152,7 @@
"method": "POST",
"method": "POST",
"path": "/url-registry/refresh-all",
"path": "/url-registry/refresh-all",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 483,
+ "line": 485,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12416,7 +13172,7 @@
@@ -12416,7 +13172,7 @@
"method": "GET",
"method": "GET",
"path": "/users",
"path": "/users",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 580,
+ "line": 582,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12426,7 +13182,7 @@
@@ -12426,7 +13182,7 @@
"method": "PUT",
"method": "PUT",
"path": "/users/:id/ban",
"path": "/users/:id/ban",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 733,
+ "line": 735,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12436,7 +13192,7 @@
@@ -12436,7 +13192,7 @@
"method": "PUT",
"method": "PUT",
"path": "/users/:id/email",
"path": "/users/:id/email",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 612,
+ "line": 614,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12446,7 +13202,7 @@
@@ -12446,7 +13202,7 @@
"method": "PUT",
"method": "PUT",
"path": "/users/:id/role",
"path": "/users/:id/role",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 710,
+ "line": 712,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12456,7 +13212,7 @@
@@ -12456,7 +13212,7 @@
"method": "POST",
"method": "POST",
"path": "/users/:id/send-reset",
"path": "/users/:id/send-reset",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 651,
+ "line": 653,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12466,7 +13222,7 @@
@@ -12466,7 +13222,7 @@
"method": "POST",
"method": "POST",
"path": "/users/:id/sign-out",
"path": "/users/:id/sign-out",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 776,
+ "line": 778,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12476,7 +13232,7 @@
@@ -12476,7 +13232,7 @@
"method": "PUT",
"method": "PUT",
"path": "/users/:id/username",
"path": "/users/:id/username",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 762,
+ "line": 764,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12486,7 +13242,7 @@
@@ -12486,7 +13242,7 @@
"method": "POST",
"method": "POST",
"path": "/users/grant-admin",
"path": "/users/grant-admin",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 545,
+ "line": 547,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12496,7 +13252,7 @@
@@ -12496,7 +13252,7 @@
"method": "GET",
"method": "GET",
"path": "/verification-keys",
"path": "/verification-keys",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 897,
+ "line": 899,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12506,7 +13262,7 @@
@@ -12506,7 +13262,7 @@
"method": "POST",
"method": "POST",
"path": "/verification-keys",
"path": "/verification-keys",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 906,
+ "line": 908,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12516,7 +13272,7 @@
@@ -12516,7 +13272,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/verification-keys/:id",
"path": "/verification-keys/:id",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 954,
+ "line": 956,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12526,7 +13282,7 @@
@@ -12526,7 +13282,7 @@
"method": "GET",
"method": "GET",
"path": "/verify-email",
"path": "/verify-email",
"file": "server/index.js",
"file": "server/index.js",
- "line": 684,
+ "line": 745,
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -12554,7 +13310,16 @@
@@ -12554,7 +13310,16 @@
"server/auth/owner-guard.js",
"server/auth/owner-guard.js",
"server/auth/routes.js",
"server/auth/routes.js",
"server/deploy/routes.js",
"server/deploy/routes.js",
- "server/index.js"
+ "server/identity/account-data.js",
+ "server/identity/account-merge.js",
+ "server/index.js",
+ "server/operator/alerts.js"
+ ],
+ "NETWORK_LIMITS_MINUTE": [
+ "server/auth/actor-limits.js"
+ ],
+ "NETWORK_LIMITS_HOUR": [
+ "server/auth/actor-limits.js"
],
],
"NODE_ENV": [
"NODE_ENV": [
"server/auth/fedcm.js",
"server/auth/fedcm.js",
@@ -12685,6 +13450,9 @@
@@ -12685,6 +13450,9 @@
"OV_AI_INTERNAL_URL": [
"OV_AI_INTERNAL_URL": [
"server/frame/service.js"
"server/frame/service.js"
],
],
+ "FOLLOWS_AUTHORITY": [
+ "server/index.js"
+ ],
"OV_EVENTS_PUBLIC_URL": [
"OV_EVENTS_PUBLIC_URL": [
"server/index.js"
"server/index.js"
],
],
@@ -12702,6 +13470,9 @@
@@ -12702,6 +13470,9 @@
"SSH_PROJECTS_ROOT": [
"SSH_PROJECTS_ROOT": [
"server/index.js"
"server/index.js"
],
],
+ "OPERATOR_ALERT_USERNAMES": [
+ "server/operator/alerts.js"
+ ],
"DEVPATH_RESULT_FILE": [
"DEVPATH_RESULT_FILE": [
"server/status/routes.js"
"server/status/routes.js"
],
],
@@ -12951,23 +13722,23 @@
@@ -12951,23 +13722,23 @@
"refs": [
"refs": [
{
{
"via": ":3000",
"via": ":3000",
- "line": 241
+ "line": 243
},
},
{
{
"via": "live.internalUrl",
"via": "live.internalUrl",
- "line": 311
+ "line": 313
},
},
{
{
"via": "liveUrl",
"via": "liveUrl",
- "line": 370
+ "line": 375
},
},
{
{
"via": "live.internalUrl",
"via": "live.internalUrl",
- "line": 370
+ "line": 375
},
},
{
{
"via": "live.internalUrl",
"via": "live.internalUrl",
- "line": 599
+ "line": 660
}
}
]
]
},
},
@@ -12976,11 +13747,11 @@
@@ -12976,11 +13747,11 @@
"refs": [
"refs": [
{
{
"via": ":4001",
"via": ":4001",
- "line": 243
+ "line": 245
},
},
{
{
"via": "tools.internalUrl",
"via": "tools.internalUrl",
- "line": 312
+ "line": 314
}
}
]
]
},
},
@@ -12989,11 +13760,11 @@
@@ -12989,11 +13760,11 @@
"refs": [
"refs": [
{
{
"via": ":4100",
"via": ":4100",
- "line": 244
+ "line": 246
},
},
{
{
"via": "media.internalUrl",
"via": "media.internalUrl",
- "line": 314
+ "line": 316
}
}
]
]
},
},
@@ -13002,11 +13773,11 @@
@@ -13002,11 +13773,11 @@
"refs": [
"refs": [
{
{
"via": ":8000",
"via": ":8000",
- "line": 245
+ "line": 247
},
},
{
{
"via": "games.internalUrl",
"via": "games.internalUrl",
- "line": 313
+ "line": 315
}
}
]
]
},
},
@@ -13015,15 +13786,15 @@
@@ -13015,15 +13786,15 @@
"refs": [
"refs": [
{
{
"via": "OV_BLOG_INTERNAL_URL",
"via": "OV_BLOG_INTERNAL_URL",
- "line": 440
+ "line": 498
},
},
{
{
"via": "blogUrl",
"via": "blogUrl",
- "line": 440
+ "line": 498
},
},
{
{
"via": ":4810",
"via": ":4810",
- "line": 440
+ "line": 498
}
}
]
]
},
},
@@ -13032,19 +13803,19 @@
@@ -13032,19 +13803,19 @@
"refs": [
"refs": [
{
{
"via": "eventsUrl",
"via": "eventsUrl",
- "line": 496
+ "line": 557
},
},
{
{
"via": "eventsInternalUrl",
"via": "eventsInternalUrl",
- "line": 496
+ "line": 557
},
},
{
{
"via": "eventsUrl",
"via": "eventsUrl",
- "line": 583
+ "line": 644
},
},
{
{
"via": "eventsInternalUrl",
"via": "eventsInternalUrl",
- "line": 583
+ "line": 644
}
}
]
]
}
}
@@ -13164,7 +13935,7 @@
@@ -13164,7 +13935,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 3600000,
"intervalMs": 3600000,
- "line": 790,
+ "line": 851,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
@@ -13175,7 +13946,7 @@
@@ -13175,7 +13946,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 120000,
"intervalMs": 120000,
- "line": 793,
+ "line": 854,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
@@ -13186,7 +13957,29 @@
@@ -13186,7 +13957,29 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 300000,
"intervalMs": 300000,
- "line": 807,
+ "line": 868,
+ "file": "server/index.js",
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "Runs in, and for, the service that owns it."
+ },
+ {
+ "kind": "setInterval",
+ "name": null,
+ "intervalMs": 360000,
+ "line": 871,
+ "file": "server/index.js",
+ "target": "OpenVibe.Network",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "Runs in, and for, the service that owns it."
+ },
+ {
+ "kind": "setInterval",
+ "name": null,
+ "intervalMs": 60000,
+ "line": 879,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
@@ -13197,7 +13990,7 @@
@@ -13197,7 +13990,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 810,
+ "line": 882,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"disposition": "keep",
"disposition": "keep",
@@ -13229,7 +14022,7 @@
@@ -13229,7 +14022,7 @@
],
],
"contractTodos": 3,
"contractTodos": 3,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 60,
+ "testFiles": 77,
"ci": true
"ci": true
},
},
{
{
@@ -13237,13 +14030,13 @@
@@ -13237,13 +14030,13 @@
"service": "shared",
"service": "shared",
"present": true,
"present": true,
"git": {
"git": {
- "head": "dbf9d39750e9f0dd0f19d8571d278eb303f3b83f",
+ "head": "b5a9bd77171fcf75f42ff33fe86b7ad06baac1c8",
"branch": "main",
"branch": "main",
- "originMain": "dbf9d39750e9f0dd0f19d8571d278eb303f3b83f",
- "committedAt": "2026-09-26T06:05:39-07:00"
+ "originMain": "b5a9bd77171fcf75f42ff33fe86b7ad06baac1c8",
+ "committedAt": "2026-09-27T20:13:02-07:00"
},
},
- "sourceFiles": 57,
- "loc": 15053,
+ "sourceFiles": 58,
+ "loc": 15503,
"tables": [
"tables": [
{
{
"table": "config_snapshots",
"table": "config_snapshots",
@@ -13480,7 +14273,7 @@
@@ -13480,7 +14273,7 @@
"refs": [
"refs": [
{
{
"via": "eventsUrl",
"via": "eventsUrl",
- "line": 12
+ "line": 9
},
},
{
{
"via": "eventsUrl",
"via": "eventsUrl",
@@ -13557,7 +14350,7 @@
@@ -13557,7 +14350,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 265,
+ "line": 266,
"file": "release-watch.js",
"file": "release-watch.js",
"target": "OpenVibe.Shared",
"target": "OpenVibe.Shared",
"disposition": "keep",
"disposition": "keep",
@@ -13568,7 +14361,7 @@
@@ -13568,7 +14361,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 600000,
"intervalMs": 600000,
- "line": 271,
+ "line": 272,
"file": "release-watch.js",
"file": "release-watch.js",
"target": "OpenVibe.Shared",
"target": "OpenVibe.Shared",
"disposition": "keep",
"disposition": "keep",
@@ -13585,11 +14378,22 @@
@@ -13585,11 +14378,22 @@
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
"note": "Runs in, and for, the service that owns it."
"note": "Runs in, and for, the service that owns it."
+ },
+ {
+ "kind": "setInterval",
+ "name": null,
+ "intervalMs": null,
+ "line": 276,
+ "file": "web-runtime.js",
+ "target": "OpenVibe.Shared",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "Runs in, and for, the service that owns it."
}
}
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 34,
+ "testFiles": 39,
"ci": true
"ci": true
},
},
{
{
@@ -13597,14 +14401,20 @@
@@ -13597,14 +14401,20 @@
"service": "media",
"service": "media",
"present": true,
"present": true,
"git": {
"git": {
- "head": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",
+ "head": "14cac06886649848c332cfa564aa6b3594ea09bc",
"branch": "main",
"branch": "main",
- "originMain": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",
- "committedAt": "2026-09-26T06:16:26-07:00"
+ "originMain": "14cac06886649848c332cfa564aa6b3594ea09bc",
+ "committedAt": "2026-09-27T20:17:24-07:00"
},
},
- "sourceFiles": 73,
- "loc": 19538,
+ "sourceFiles": 79,
+ "loc": 20861,
"tables": [
"tables": [
+ {
+ "table": "account_data_events",
+ "file": "server/account-data.js",
+ "line": 32,
+ "via": "repo"
+ },
{
{
"table": "apps",
"table": "apps",
"file": "server/db/schema.sql",
"file": "server/db/schema.sql",
@@ -13737,22 +14547,52 @@
@@ -13737,22 +14547,52 @@
"line": 413,
"line": 413,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "media_object_view_salts",
+ "file": "server/db/schema.sql",
+ "line": 435,
+ "via": "repo"
+ },
+ {
+ "table": "media_object_viewer_days",
+ "file": "server/db/schema.sql",
+ "line": 440,
+ "via": "repo"
+ },
+ {
+ "table": "media_object_views_daily",
+ "file": "server/db/schema.sql",
+ "line": 446,
+ "via": "repo"
+ },
+ {
+ "table": "media_object_tier_decisions",
+ "file": "server/db/schema.sql",
+ "line": 458,
+ "via": "repo"
+ },
{
{
"table": "media_object_changes",
"table": "media_object_changes",
"file": "server/db/schema.sql",
"file": "server/db/schema.sql",
- "line": 436,
+ "line": 480,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "media_verifications",
"table": "media_verifications",
"file": "server/db/schema.sql",
"file": "server/db/schema.sql",
- "line": 448,
+ "line": 492,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "media_verify_runs",
"table": "media_verify_runs",
"file": "server/db/schema.sql",
"file": "server/db/schema.sql",
- "line": 460,
+ "line": 504,
+ "via": "repo"
+ },
+ {
+ "table": "subject_merges",
+ "file": "server/subject-merge.js",
+ "line": 13,
"via": "repo"
"via": "repo"
},
},
{
{
@@ -13779,7 +14619,7 @@
@@ -13779,7 +14619,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/observability.js",
"file": "server/observability.js",
- "line": 153,
+ "line": 156,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13789,7 +14629,7 @@
@@ -13789,7 +14629,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/admin/storage",
"path": "/api/v1/:app/admin/storage",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 87,
+ "line": 102,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13799,7 +14639,7 @@
@@ -13799,7 +14639,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/admin/storage/buckets",
"path": "/api/v1/:app/admin/storage/buckets",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 639,
+ "line": 692,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13809,7 +14649,7 @@
@@ -13809,7 +14649,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/admin/storage/holds",
"path": "/api/v1/:app/admin/storage/holds",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 537,
+ "line": 590,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13819,7 +14659,7 @@
@@ -13819,7 +14659,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/admin/storage/holds",
"path": "/api/v1/:app/admin/storage/holds",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 558,
+ "line": 611,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13829,7 +14669,7 @@
@@ -13829,7 +14669,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/:app/admin/storage/holds/:holdId",
"path": "/api/v1/:app/admin/storage/holds/:holdId",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 598,
+ "line": 651,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13839,7 +14679,7 @@
@@ -13839,7 +14679,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/admin/storage/holds/:holdId/release",
"path": "/api/v1/:app/admin/storage/holds/:holdId/release",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 597,
+ "line": 650,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13849,7 +14689,7 @@
@@ -13849,7 +14689,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/admin/storage/ops",
"path": "/api/v1/:app/admin/storage/ops",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 613,
+ "line": 666,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13859,7 +14699,7 @@
@@ -13859,7 +14699,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/admin/storage/ops/recompute",
"path": "/api/v1/:app/admin/storage/ops/recompute",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 624,
+ "line": 677,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13869,7 +14709,7 @@
@@ -13869,7 +14709,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/admin/storage/tiers",
"path": "/api/v1/:app/admin/storage/tiers",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 273,
+ "line": 288,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13879,7 +14719,7 @@
@@ -13879,7 +14719,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/admin/storage/tiers/bulk-move",
"path": "/api/v1/:app/admin/storage/tiers/bulk-move",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 465,
+ "line": 518,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13889,7 +14729,7 @@
@@ -13889,7 +14729,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/admin/storage/tiers/decisions",
"path": "/api/v1/:app/admin/storage/tiers/decisions",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 394,
+ "line": 410,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13899,7 +14739,27 @@
@@ -13899,7 +14739,27 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/admin/storage/tiers/move",
"path": "/api/v1/:app/admin/storage/tiers/move",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 447,
+ "line": 500,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/:app/admin/storage/tiers/objects/decisions",
+ "file": "server/admin/routes.js",
+ "line": 458,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/:app/admin/storage/tiers/objects/policy",
+ "file": "server/admin/routes.js",
+ "line": 439,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13909,7 +14769,7 @@
@@ -13909,7 +14769,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/admin/storage/tiers/policy",
"path": "/api/v1/:app/admin/storage/tiers/policy",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 367,
+ "line": 383,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13919,7 +14779,7 @@
@@ -13919,7 +14779,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/:app/admin/storage/tiers/settings",
"path": "/api/v1/:app/admin/storage/tiers/settings",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 323,
+ "line": 338,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13929,7 +14789,7 @@
@@ -13929,7 +14789,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/admin/storage/tiers/sweep",
"path": "/api/v1/:app/admin/storage/tiers/sweep",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 419,
+ "line": 472,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13939,7 +14799,7 @@
@@ -13939,7 +14799,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/admin/storage/vods",
"path": "/api/v1/:app/admin/storage/vods",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 142,
+ "line": 157,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13949,7 +14809,7 @@
@@ -13949,7 +14809,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/:app/admin/storage/vods/bulk",
"path": "/api/v1/:app/admin/storage/vods/bulk",
"file": "server/admin/routes.js",
"file": "server/admin/routes.js",
- "line": 214,
+ "line": 229,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13989,7 +14849,7 @@
@@ -13989,7 +14849,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/clips",
"path": "/api/v1/:app/clips",
"file": "server/vod/clips-routes.js",
"file": "server/vod/clips-routes.js",
- "line": 288,
+ "line": 302,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -13999,7 +14859,7 @@
@@ -13999,7 +14859,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/clips",
"path": "/api/v1/:app/clips",
"file": "server/vod/clips-routes.js",
"file": "server/vod/clips-routes.js",
- "line": 124,
+ "line": 138,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14009,7 +14869,7 @@
@@ -14009,7 +14869,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/:app/clips/:id",
"path": "/api/v1/:app/clips/:id",
"file": "server/vod/clips-routes.js",
"file": "server/vod/clips-routes.js",
- "line": 380,
+ "line": 403,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14019,7 +14879,7 @@
@@ -14019,7 +14879,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/clips/:id",
"path": "/api/v1/:app/clips/:id",
"file": "server/vod/clips-routes.js",
"file": "server/vod/clips-routes.js",
- "line": 317,
+ "line": 340,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14029,7 +14889,7 @@
@@ -14029,7 +14889,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/:app/clips/:id",
"path": "/api/v1/:app/clips/:id",
"file": "server/vod/clips-routes.js",
"file": "server/vod/clips-routes.js",
- "line": 357,
+ "line": 380,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14039,7 +14899,17 @@
@@ -14039,7 +14899,17 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/clips/:id/recut",
"path": "/api/v1/:app/clips/:id/recut",
"file": "server/vod/clips-routes.js",
"file": "server/vod/clips-routes.js",
- "line": 340,
+ "line": 363,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/:app/clips/:id/signed-url",
+ "file": "server/vod/clips-routes.js",
+ "line": 332,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14049,7 +14919,7 @@
@@ -14049,7 +14919,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/files",
"path": "/api/v1/:app/files",
"file": "server/files/routes.js",
"file": "server/files/routes.js",
- "line": 152,
+ "line": 155,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14059,7 +14929,7 @@
@@ -14059,7 +14929,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/files",
"path": "/api/v1/:app/files",
"file": "server/files/routes.js",
"file": "server/files/routes.js",
- "line": 88,
+ "line": 91,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14069,7 +14939,7 @@
@@ -14069,7 +14939,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/:app/files/:key",
"path": "/api/v1/:app/files/:key",
"file": "server/files/routes.js",
"file": "server/files/routes.js",
- "line": 180,
+ "line": 184,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14079,7 +14949,7 @@
@@ -14079,7 +14949,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/files/:key",
"path": "/api/v1/:app/files/:key",
"file": "server/files/routes.js",
"file": "server/files/routes.js",
- "line": 169,
+ "line": 172,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14269,7 +15139,7 @@
@@ -14269,7 +15139,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/stats",
"path": "/api/v1/:app/stats",
"file": "server/index.js",
"file": "server/index.js",
- "line": 156,
+ "line": 158,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14279,7 +15149,7 @@
@@ -14279,7 +15149,7 @@
"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": 166,
+ "line": 168,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14319,7 +15189,7 @@
@@ -14319,7 +15189,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/vods",
"path": "/api/v1/:app/vods",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 272,
+ "line": 273,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14329,7 +15199,7 @@
@@ -14329,7 +15199,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/vods",
"path": "/api/v1/:app/vods",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 95,
+ "line": 98,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14339,7 +15209,7 @@
@@ -14339,7 +15209,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/:app/vods/:id",
"path": "/api/v1/:app/vods/:id",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 370,
+ "line": 383,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14349,7 +15219,7 @@
@@ -14349,7 +15219,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/vods/:id",
"path": "/api/v1/:app/vods/:id",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 313,
+ "line": 326,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14359,7 +15229,7 @@
@@ -14359,7 +15229,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/:app/vods/:id",
"path": "/api/v1/:app/vods/:id",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 345,
+ "line": 358,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14369,7 +15239,7 @@
@@ -14369,7 +15239,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/vods/:id/chunks",
"path": "/api/v1/:app/vods/:id/chunks",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 161,
+ "line": 164,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14379,7 +15249,7 @@
@@ -14379,7 +15249,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/vods/:id/complete",
"path": "/api/v1/:app/vods/:id/complete",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 265,
+ "line": 266,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14389,7 +15259,7 @@
@@ -14389,7 +15259,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/vods/:id/finalize",
"path": "/api/v1/:app/vods/:id/finalize",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 266,
+ "line": 267,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14399,7 +15269,7 @@
@@ -14399,7 +15269,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/vods/:id/ingest/rtmp",
"path": "/api/v1/:app/vods/:id/ingest/rtmp",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 118,
+ "line": 121,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14409,7 +15279,7 @@
@@ -14409,7 +15279,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/vods/:id/ingest/rtp/start",
"path": "/api/v1/:app/vods/:id/ingest/rtp/start",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 132,
+ "line": 135,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14419,7 +15289,17 @@
@@ -14419,7 +15289,17 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/:app/vods/:id/ingest/rtp/stop",
"path": "/api/v1/:app/vods/:id/ingest/rtp/stop",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 146,
+ "line": 149,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/:app/vods/:id/signed-url",
+ "file": "server/vod/routes.js",
+ "line": 317,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14429,7 +15309,7 @@
@@ -14429,7 +15309,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/:app/vods/latest-thumbs",
"path": "/api/v1/:app/vods/latest-thumbs",
"file": "server/vod/routes.js",
"file": "server/vod/routes.js",
- "line": 302,
+ "line": 303,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14439,7 +15319,7 @@
@@ -14439,7 +15319,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/jobs",
"path": "/api/v2/:app/jobs",
"file": "server/jobs/routes.js",
"file": "server/jobs/routes.js",
- "line": 74,
+ "line": 78,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14449,7 +15329,7 @@
@@ -14449,7 +15329,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/jobs",
"path": "/api/v2/:app/jobs",
"file": "server/jobs/routes.js",
"file": "server/jobs/routes.js",
- "line": 87,
+ "line": 91,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14459,7 +15339,7 @@
@@ -14459,7 +15339,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v2/:app/jobs/:jobId",
"path": "/api/v2/:app/jobs/:jobId",
"file": "server/jobs/routes.js",
"file": "server/jobs/routes.js",
- "line": 147,
+ "line": 153,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14469,7 +15349,7 @@
@@ -14469,7 +15349,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/jobs/:jobId",
"path": "/api/v2/:app/jobs/:jobId",
"file": "server/jobs/routes.js",
"file": "server/jobs/routes.js",
- "line": 120,
+ "line": 124,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14479,7 +15359,7 @@
@@ -14479,7 +15359,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/jobs/:jobId/approve",
"path": "/api/v2/:app/jobs/:jobId/approve",
"file": "server/jobs/routes.js",
"file": "server/jobs/routes.js",
- "line": 125,
+ "line": 129,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14489,7 +15369,7 @@
@@ -14489,7 +15369,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/jobs/:jobId/cancel",
"path": "/api/v2/:app/jobs/:jobId/cancel",
"file": "server/jobs/routes.js",
"file": "server/jobs/routes.js",
- "line": 146,
+ "line": 152,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14499,7 +15379,7 @@
@@ -14499,7 +15379,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/namespaces",
"path": "/api/v2/:app/namespaces",
"file": "server/objects/namespace-routes.js",
"file": "server/objects/namespace-routes.js",
- "line": 32,
+ "line": 34,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14509,7 +15389,7 @@
@@ -14509,7 +15389,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/namespaces/:namespace",
"path": "/api/v2/:app/namespaces/:namespace",
"file": "server/objects/namespace-routes.js",
"file": "server/objects/namespace-routes.js",
- "line": 42,
+ "line": 44,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14519,7 +15399,7 @@
@@ -14519,7 +15399,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/objects",
"path": "/api/v2/:app/objects",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 556,
+ "line": 564,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14529,7 +15409,7 @@
@@ -14529,7 +15409,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/objects",
"path": "/api/v2/:app/objects",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 291,
+ "line": 296,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14539,7 +15419,7 @@
@@ -14539,7 +15419,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v2/:app/objects/:id",
"path": "/api/v2/:app/objects/:id",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 609,
+ "line": 618,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14549,7 +15429,7 @@
@@ -14549,7 +15429,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/objects/:id",
"path": "/api/v2/:app/objects/:id",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 604,
+ "line": 612,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14559,7 +15439,7 @@
@@ -14559,7 +15439,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/objects/:id",
"path": "/api/v2/:app/objects/:id",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 700,
+ "line": 718,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14569,7 +15449,7 @@
@@ -14569,7 +15449,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/objects/:id/complete",
"path": "/api/v2/:app/objects/:id/complete",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 425,
+ "line": 431,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14579,7 +15459,7 @@
@@ -14579,7 +15459,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v2/:app/objects/:id/content",
"path": "/api/v2/:app/objects/:id/content",
"file": "server/index.js",
"file": "server/index.js",
- "line": 63,
+ "line": 65,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14589,7 +15469,7 @@
@@ -14589,7 +15469,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/objects/:id/download",
"path": "/api/v2/:app/objects/:id/download",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 641,
+ "line": 650,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14599,7 +15479,7 @@
@@ -14599,7 +15479,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/objects/:id/holds",
"path": "/api/v2/:app/objects/:id/holds",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 660,
+ "line": 669,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14609,7 +15489,7 @@
@@ -14609,7 +15489,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/objects/:id/holds",
"path": "/api/v2/:app/objects/:id/holds",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 672,
+ "line": 688,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14619,7 +15499,7 @@
@@ -14619,7 +15499,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v2/:app/objects/:id/holds/:holdId",
"path": "/api/v2/:app/objects/:id/holds/:holdId",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 684,
+ "line": 701,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14629,7 +15509,7 @@
@@ -14629,7 +15509,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/objects/:id/multipart",
"path": "/api/v2/:app/objects/:id/multipart",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 468,
+ "line": 474,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14639,7 +15519,7 @@
@@ -14639,7 +15519,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v2/:app/objects/:id/multipart/:uploadId",
"path": "/api/v2/:app/objects/:id/multipart/:uploadId",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 545,
+ "line": 553,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14649,7 +15529,7 @@
@@ -14649,7 +15529,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/:app/objects/:id/multipart/:uploadId",
"path": "/api/v2/:app/objects/:id/multipart/:uploadId",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 499,
+ "line": 505,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14659,7 +15539,7 @@
@@ -14659,7 +15539,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/objects/:id/multipart/:uploadId/complete",
"path": "/api/v2/:app/objects/:id/multipart/:uploadId/complete",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 508,
+ "line": 515,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14669,7 +15549,7 @@
@@ -14669,7 +15549,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v2/:app/objects/:id/multipart/:uploadId/parts/:n",
"path": "/api/v2/:app/objects/:id/multipart/:uploadId/parts/:n",
"file": "server/index.js",
"file": "server/index.js",
- "line": 64,
+ "line": 66,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14679,7 +15559,7 @@
@@ -14679,7 +15559,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/objects/:id/restore",
"path": "/api/v2/:app/objects/:id/restore",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 627,
+ "line": 636,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14689,7 +15569,7 @@
@@ -14689,7 +15569,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/:app/objects/:id/upload-url",
"path": "/api/v2/:app/objects/:id/upload-url",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 441,
+ "line": 447,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14699,7 +15579,7 @@
@@ -14699,7 +15579,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/me",
"path": "/api/v2/me",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 202,
+ "line": 206,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14709,7 +15589,7 @@
@@ -14709,7 +15589,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/me/app.js",
"path": "/api/v2/me/app.js",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 185,
+ "line": 189,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14719,7 +15599,7 @@
@@ -14719,7 +15599,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/me/objects",
"path": "/api/v2/me/objects",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 125,
+ "line": 128,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14729,7 +15609,7 @@
@@ -14729,7 +15609,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/me/objects/:id",
"path": "/api/v2/me/objects/:id",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 137,
+ "line": 140,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14739,7 +15619,7 @@
@@ -14739,7 +15619,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/me/objects/:id",
"path": "/api/v2/me/objects/:id",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 217,
+ "line": 221,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14749,7 +15629,7 @@
@@ -14749,7 +15629,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/me/ops",
"path": "/api/v2/me/ops",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 154,
+ "line": 157,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14759,7 +15639,7 @@
@@ -14759,7 +15639,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/me/ops",
"path": "/api/v2/me/ops",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 224,
+ "line": 228,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14769,7 +15649,7 @@
@@ -14769,7 +15649,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/me/ops/recompute",
"path": "/api/v2/me/ops/recompute",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 167,
+ "line": 171,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14779,7 +15659,7 @@
@@ -14779,7 +15659,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v2/me/ops/recompute",
"path": "/api/v2/me/ops/recompute",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 234,
+ "line": 238,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14789,7 +15669,7 @@
@@ -14789,7 +15669,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v2/me/usage",
"path": "/api/v2/me/usage",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 144,
+ "line": 147,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14859,7 +15739,7 @@
@@ -14859,7 +15739,7 @@
"method": "GET",
"method": "GET",
"path": "/healthz",
"path": "/healthz",
"file": "server/index.js",
"file": "server/index.js",
- "line": 133,
+ "line": 135,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14869,7 +15749,7 @@
@@ -14869,7 +15749,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/avatar-ingest",
"path": "/internal/avatar-ingest",
"file": "server/index.js",
"file": "server/index.js",
- "line": 97,
+ "line": 99,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14879,7 +15759,7 @@
@@ -14879,7 +15759,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/events",
"path": "/internal/events",
"file": "server/index.js",
"file": "server/index.js",
- "line": 67,
+ "line": 69,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14889,7 +15769,7 @@
@@ -14889,7 +15769,7 @@
"method": "GET",
"method": "GET",
"path": "/limits.json",
"path": "/limits.json",
"file": "server/limits.js",
"file": "server/limits.js",
- "line": 43,
+ "line": 42,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14899,7 +15779,7 @@
@@ -14899,7 +15779,7 @@
"method": "GET",
"method": "GET",
"path": "/manifest.webmanifest",
"path": "/manifest.webmanifest",
"file": "server/index.js",
"file": "server/index.js",
- "line": 85,
+ "line": 87,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14909,7 +15789,7 @@
@@ -14909,7 +15789,7 @@
"method": "GET",
"method": "GET",
"path": "/me",
"path": "/me",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 202,
+ "line": 206,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14919,7 +15799,7 @@
@@ -14919,7 +15799,7 @@
"method": "GET",
"method": "GET",
"path": "/me/app.js",
"path": "/me/app.js",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 185,
+ "line": 189,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14929,7 +15809,7 @@
@@ -14929,7 +15809,7 @@
"method": "GET",
"method": "GET",
"path": "/me/objects",
"path": "/me/objects",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 125,
+ "line": 128,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14939,7 +15819,7 @@
@@ -14939,7 +15819,7 @@
"method": "GET",
"method": "GET",
"path": "/me/objects/:id",
"path": "/me/objects/:id",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 137,
+ "line": 140,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14949,7 +15829,7 @@
@@ -14949,7 +15829,7 @@
"method": "GET",
"method": "GET",
"path": "/me/objects/:id",
"path": "/me/objects/:id",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 217,
+ "line": 221,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14959,7 +15839,7 @@
@@ -14959,7 +15839,7 @@
"method": "GET",
"method": "GET",
"path": "/me/ops",
"path": "/me/ops",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 154,
+ "line": 157,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14969,7 +15849,7 @@
@@ -14969,7 +15849,7 @@
"method": "GET",
"method": "GET",
"path": "/me/ops",
"path": "/me/ops",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 224,
+ "line": 228,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14979,7 +15859,7 @@
@@ -14979,7 +15859,7 @@
"method": "POST",
"method": "POST",
"path": "/me/ops/recompute",
"path": "/me/ops/recompute",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 167,
+ "line": 171,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14989,7 +15869,7 @@
@@ -14989,7 +15869,7 @@
"method": "POST",
"method": "POST",
"path": "/me/ops/recompute",
"path": "/me/ops/recompute",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 234,
+ "line": 238,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -14999,7 +15879,7 @@
@@ -14999,7 +15879,7 @@
"method": "GET",
"method": "GET",
"path": "/me/usage",
"path": "/me/usage",
"file": "server/me/routes.js",
"file": "server/me/routes.js",
- "line": 144,
+ "line": 147,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15009,7 +15889,7 @@
@@ -15009,7 +15889,7 @@
"method": "GET",
"method": "GET",
"path": "/o",
"path": "/o",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 556,
+ "line": 564,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15019,7 +15899,7 @@
@@ -15019,7 +15899,7 @@
"method": "POST",
"method": "POST",
"path": "/o",
"path": "/o",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 291,
+ "line": 296,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15029,7 +15909,7 @@
@@ -15029,7 +15909,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/o/:id",
"path": "/o/:id",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 609,
+ "line": 618,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15039,7 +15919,7 @@
@@ -15039,7 +15919,7 @@
"method": "GET",
"method": "GET",
"path": "/o/:id",
"path": "/o/:id",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 604,
+ "line": 612,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15049,7 +15929,7 @@
@@ -15049,7 +15929,7 @@
"method": "GET",
"method": "GET",
"path": "/o/:id",
"path": "/o/:id",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 700,
+ "line": 718,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15059,7 +15939,7 @@
@@ -15059,7 +15939,7 @@
"method": "POST",
"method": "POST",
"path": "/o/:id/complete",
"path": "/o/:id/complete",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 425,
+ "line": 431,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15069,7 +15949,7 @@
@@ -15069,7 +15949,7 @@
"method": "GET",
"method": "GET",
"path": "/o/:id/download",
"path": "/o/:id/download",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 641,
+ "line": 650,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15079,7 +15959,7 @@
@@ -15079,7 +15959,7 @@
"method": "GET",
"method": "GET",
"path": "/o/:id/holds",
"path": "/o/:id/holds",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 660,
+ "line": 669,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15089,7 +15969,7 @@
@@ -15089,7 +15969,7 @@
"method": "POST",
"method": "POST",
"path": "/o/:id/holds",
"path": "/o/:id/holds",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 672,
+ "line": 688,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15099,7 +15979,7 @@
@@ -15099,7 +15979,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/o/:id/holds/:holdId",
"path": "/o/:id/holds/:holdId",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 684,
+ "line": 701,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15109,7 +15989,7 @@
@@ -15109,7 +15989,7 @@
"method": "POST",
"method": "POST",
"path": "/o/:id/multipart",
"path": "/o/:id/multipart",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 468,
+ "line": 474,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15119,7 +15999,7 @@
@@ -15119,7 +15999,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/o/:id/multipart/:uploadId",
"path": "/o/:id/multipart/:uploadId",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 545,
+ "line": 553,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15129,7 +16009,7 @@
@@ -15129,7 +16009,7 @@
"method": "GET",
"method": "GET",
"path": "/o/:id/multipart/:uploadId",
"path": "/o/:id/multipart/:uploadId",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 499,
+ "line": 505,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15139,7 +16019,7 @@
@@ -15139,7 +16019,7 @@
"method": "POST",
"method": "POST",
"path": "/o/:id/multipart/:uploadId/complete",
"path": "/o/:id/multipart/:uploadId/complete",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 508,
+ "line": 515,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15149,7 +16029,7 @@
@@ -15149,7 +16029,7 @@
"method": "POST",
"method": "POST",
"path": "/o/:id/restore",
"path": "/o/:id/restore",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 627,
+ "line": 636,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15159,7 +16039,7 @@
@@ -15159,7 +16039,7 @@
"method": "POST",
"method": "POST",
"path": "/o/:id/upload-url",
"path": "/o/:id/upload-url",
"file": "server/objects/routes.js",
"file": "server/objects/routes.js",
- "line": 441,
+ "line": 447,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15169,7 +16049,7 @@
@@ -15169,7 +16049,7 @@
"method": "GET",
"method": "GET",
"path": "/tos",
"path": "/tos",
"file": "server/index.js",
"file": "server/index.js",
- "line": 80,
+ "line": 82,
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15181,6 +16061,29 @@
@@ -15181,6 +16061,29 @@
"paths": []
"paths": []
},
},
"env": {
"env": {
+ "OV_OAUTH_CLIENT_SECRET": [
+ "server/account-data.js",
+ "server/events.js",
+ "server/index.js",
+ "server/lineage-client.js",
+ "server/objects/owner-subject.js",
+ "server/revocations.js"
+ ],
+ "OV_NETWORK_INTERNAL_URL": [
+ "server/account-data.js",
+ "server/config.js",
+ "server/events.js",
+ "server/lineage-client.js",
+ "server/revocations.js"
+ ],
+ "OV_OAUTH_CLIENT_ID": [
+ "server/account-data.js",
+ "server/events.js",
+ "server/index.js",
+ "server/lineage-client.js",
+ "server/objects/owner-subject.js",
+ "server/revocations.js"
+ ],
"HOST": [
"HOST": [
"server/config.js",
"server/config.js",
"server/drill.js",
"server/drill.js",
@@ -15242,12 +16145,6 @@
@@ -15242,12 +16145,6 @@
"OV_NETWORK_URL": [
"OV_NETWORK_URL": [
"server/config.js"
"server/config.js"
],
],
- "OV_NETWORK_INTERNAL_URL": [
- "server/config.js",
- "server/events.js",
- "server/lineage-client.js",
- "server/revocations.js"
- ],
"INTERNAL_API_KEY": [
"INTERNAL_API_KEY": [
"server/config.js",
"server/config.js",
"server/views/service.js"
"server/views/service.js"
@@ -15269,20 +16166,6 @@
@@ -15269,20 +16166,6 @@
"server/events.js",
"server/events.js",
"server/revocations.js"
"server/revocations.js"
],
],
- "OV_OAUTH_CLIENT_SECRET": [
- "server/events.js",
- "server/index.js",
- "server/lineage-client.js",
- "server/objects/owner-subject.js",
- "server/revocations.js"
- ],
- "OV_OAUTH_CLIENT_ID": [
- "server/events.js",
- "server/index.js",
- "server/lineage-client.js",
- "server/objects/owner-subject.js",
- "server/revocations.js"
- ],
"EVENTS_PUBLISH": [
"EVENTS_PUBLISH": [
"server/events.js"
"server/events.js"
],
],
@@ -15387,6 +16270,38 @@
@@ -15387,6 +16270,38 @@
]
]
},
},
"outbound": [
"outbound": [
+ {
+ "file": "server/account-data.js",
+ "targets": [
+ {
+ "service": "network",
+ "refs": [
+ {
+ "via": "/internal/events",
+ "line": 4
+ },
+ {
+ "via": "OV_NETWORK_INTERNAL_URL",
+ "line": 116
+ },
+ {
+ "via": ":4000",
+ "line": 116
+ },
+ {
+ "via": "/oauth/token",
+ "line": 119
+ }
+ ]
+ }
+ ],
+ "auth": [
+ "bearer",
+ "oauth-client"
+ ],
+ "timeout": true,
+ "retry": false
+ },
{
{
"file": "server/auth.js",
"file": "server/auth.js",
"targets": [
"targets": [
@@ -15618,7 +16533,7 @@
@@ -15618,7 +16533,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 43200000,
"intervalMs": 43200000,
- "line": 178,
+ "line": 180,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
@@ -15629,7 +16544,7 @@
@@ -15629,7 +16544,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 214,
+ "line": 216,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
@@ -15739,7 +16654,7 @@
@@ -15739,7 +16654,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 595,
+ "line": 627,
"file": "server/vod/vod-storage.js",
"file": "server/vod/vod-storage.js",
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"disposition": "keep",
"disposition": "keep",
@@ -15749,7 +16664,7 @@
@@ -15749,7 +16664,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 56,
+ "testFiles": 67,
"ci": true
"ci": true
},
},
{
{
@@ -15757,13 +16672,13 @@
@@ -15757,13 +16672,13 @@
"service": "tools",
"service": "tools",
"present": true,
"present": true,
"git": {
"git": {
- "head": "168e5110d062f076c2c4afe88e3fc3c53ab44613",
+ "head": "4f4ed6e8f3f3c8e1a83dd644dd3c0659a7bccce4",
"branch": "main",
"branch": "main",
- "originMain": "168e5110d062f076c2c4afe88e3fc3c53ab44613",
- "committedAt": "2026-09-26T06:20:57-07:00"
+ "originMain": "4f4ed6e8f3f3c8e1a83dd644dd3c0659a7bccce4",
+ "committedAt": "2026-09-27T20:19:31-07:00"
},
},
- "sourceFiles": 173,
- "loc": 30080,
+ "sourceFiles": 176,
+ "loc": 30522,
"tables": [
"tables": [
{
{
"table": "guard_salt",
"table": "guard_salt",
@@ -15800,6 +16715,12 @@
@@ -15800,6 +16715,12 @@
"file": "apps/_shared/jobs/store.js",
"file": "apps/_shared/jobs/store.js",
"line": 55,
"line": 55,
"via": "repo"
"via": "repo"
+ },
+ {
+ "table": "tool_job_usage",
+ "file": "apps/_shared/jobs/usage.js",
+ "line": 36,
+ "via": "repo"
}
}
],
],
"routes": [
"routes": [
@@ -15817,7 +16738,7 @@
@@ -15817,7 +16738,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "apps/text/server/index.js",
"file": "apps/text/server/index.js",
- "line": 155,
+ "line": 159,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15847,7 +16768,7 @@
@@ -15847,7 +16768,7 @@
"method": "GET",
"method": "GET",
"path": "/api/brand",
"path": "/api/brand",
"file": "apps/gateway/server/index.js",
"file": "apps/gateway/server/index.js",
- "line": 309,
+ "line": 317,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15867,7 +16788,7 @@
@@ -15867,7 +16788,7 @@
"method": "GET",
"method": "GET",
"path": "/api/context",
"path": "/api/context",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 165,
+ "line": 169,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15877,7 +16798,7 @@
@@ -15877,7 +16798,7 @@
"method": "GET",
"method": "GET",
"path": "/api/context",
"path": "/api/context",
"file": "apps/docs/server/index.js",
"file": "apps/docs/server/index.js",
- "line": 194,
+ "line": 198,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15887,7 +16808,7 @@
@@ -15887,7 +16808,7 @@
"method": "GET",
"method": "GET",
"path": "/api/context",
"path": "/api/context",
"file": "apps/img/server/index.js",
"file": "apps/img/server/index.js",
- "line": 188,
+ "line": 192,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15897,7 +16818,7 @@
@@ -15897,7 +16818,7 @@
"method": "POST",
"method": "POST",
"path": "/api/download",
"path": "/api/download",
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
- "line": 174,
+ "line": 178,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15907,7 +16828,7 @@
@@ -15907,7 +16828,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/download/:id",
"path": "/api/download/:id",
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
- "line": 261,
+ "line": 265,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15917,7 +16838,7 @@
@@ -15917,7 +16838,7 @@
"method": "GET",
"method": "GET",
"path": "/api/download/:id",
"path": "/api/download/:id",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 298,
+ "line": 302,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15927,7 +16848,7 @@
@@ -15927,7 +16848,7 @@
"method": "GET",
"method": "GET",
"path": "/api/download/:id",
"path": "/api/download/:id",
"file": "apps/docs/server/index.js",
"file": "apps/docs/server/index.js",
- "line": 349,
+ "line": 353,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15937,7 +16858,7 @@
@@ -15937,7 +16858,7 @@
"method": "GET",
"method": "GET",
"path": "/api/download/:id",
"path": "/api/download/:id",
"file": "apps/img/server/index.js",
"file": "apps/img/server/index.js",
- "line": 291,
+ "line": 295,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15947,7 +16868,7 @@
@@ -15947,7 +16868,7 @@
"method": "GET",
"method": "GET",
"path": "/api/download/:id",
"path": "/api/download/:id",
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
- "line": 268,
+ "line": 272,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15957,7 +16878,7 @@
@@ -15957,7 +16878,7 @@
"method": "GET",
"method": "GET",
"path": "/api/food-banks",
"path": "/api/food-banks",
"file": "apps/food/server/index.js",
"file": "apps/food/server/index.js",
- "line": 137,
+ "line": 141,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15967,7 +16888,7 @@
@@ -15967,7 +16888,7 @@
"method": "GET",
"method": "GET",
"path": "/api/food-banks",
"path": "/api/food-banks",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 431,
+ "line": 435,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15977,7 +16898,7 @@
@@ -15977,7 +16898,7 @@
"method": "GET",
"method": "GET",
"path": "/api/foods",
"path": "/api/foods",
"file": "apps/food/server/index.js",
"file": "apps/food/server/index.js",
- "line": 139,
+ "line": 143,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15987,7 +16908,7 @@
@@ -15987,7 +16908,7 @@
"method": "GET",
"method": "GET",
"path": "/api/foods",
"path": "/api/foods",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 452,
+ "line": 456,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -15997,7 +16918,7 @@
@@ -15997,7 +16918,7 @@
"method": "GET",
"method": "GET",
"path": "/api/geocode",
"path": "/api/geocode",
"file": "apps/food/server/index.js",
"file": "apps/food/server/index.js",
- "line": 141,
+ "line": 145,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16007,7 +16928,7 @@
@@ -16007,7 +16928,7 @@
"method": "GET",
"method": "GET",
"path": "/api/geocode",
"path": "/api/geocode",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 153,
+ "line": 157,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16017,7 +16938,7 @@
@@ -16017,7 +16938,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 158,
+ "line": 162,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16027,7 +16948,7 @@
@@ -16027,7 +16948,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "apps/docs/server/index.js",
"file": "apps/docs/server/index.js",
- "line": 187,
+ "line": 191,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16037,7 +16958,7 @@
@@ -16037,7 +16958,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "apps/gateway/server/index.js",
"file": "apps/gateway/server/index.js",
- "line": 305,
+ "line": 313,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16047,7 +16968,7 @@
@@ -16047,7 +16968,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "apps/img/server/index.js",
"file": "apps/img/server/index.js",
- "line": 181,
+ "line": 185,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16057,7 +16978,7 @@
@@ -16057,7 +16978,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "apps/text/server/index.js",
"file": "apps/text/server/index.js",
- "line": 128,
+ "line": 132,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16067,7 +16988,7 @@
@@ -16067,7 +16988,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
- "line": 149,
+ "line": 153,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16077,7 +16998,7 @@
@@ -16077,7 +16998,7 @@
"method": "POST",
"method": "POST",
"path": "/api/info",
"path": "/api/info",
"file": "apps/docs/server/index.js",
"file": "apps/docs/server/index.js",
- "line": 218,
+ "line": 222,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16087,7 +17008,7 @@
@@ -16087,7 +17008,7 @@
"method": "POST",
"method": "POST",
"path": "/api/info",
"path": "/api/info",
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
- "line": 156,
+ "line": 160,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16097,7 +17018,7 @@
@@ -16097,7 +17018,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics",
"path": "/api/internal/analytics",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 347,
+ "line": 351,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16107,7 +17028,7 @@
@@ -16107,7 +17028,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics",
"path": "/api/internal/analytics",
"file": "apps/docs/server/index.js",
"file": "apps/docs/server/index.js",
- "line": 367,
+ "line": 371,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16117,7 +17038,7 @@
@@ -16117,7 +17038,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics",
"path": "/api/internal/analytics",
"file": "apps/food/server/index.js",
"file": "apps/food/server/index.js",
- "line": 144,
+ "line": 148,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16127,7 +17048,7 @@
@@ -16127,7 +17048,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics",
"path": "/api/internal/analytics",
"file": "apps/gateway/server/index.js",
"file": "apps/gateway/server/index.js",
- "line": 392,
+ "line": 409,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16137,7 +17058,7 @@
@@ -16137,7 +17058,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics",
"path": "/api/internal/analytics",
"file": "apps/img/server/index.js",
"file": "apps/img/server/index.js",
- "line": 309,
+ "line": 313,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16147,7 +17068,7 @@
@@ -16147,7 +17068,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics",
"path": "/api/internal/analytics",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 474,
+ "line": 478,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16157,7 +17078,7 @@
@@ -16157,7 +17078,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics",
"path": "/api/internal/analytics",
"file": "apps/text/server/index.js",
"file": "apps/text/server/index.js",
- "line": 116,
+ "line": 120,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16167,7 +17088,7 @@
@@ -16167,7 +17088,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics",
"path": "/api/internal/analytics",
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
- "line": 282,
+ "line": 286,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16177,7 +17098,7 @@
@@ -16177,7 +17098,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics/bots",
"path": "/api/internal/analytics/bots",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 352,
+ "line": 356,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16187,7 +17108,7 @@
@@ -16187,7 +17108,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics/bots",
"path": "/api/internal/analytics/bots",
"file": "apps/docs/server/index.js",
"file": "apps/docs/server/index.js",
- "line": 372,
+ "line": 376,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16197,7 +17118,7 @@
@@ -16197,7 +17118,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics/bots",
"path": "/api/internal/analytics/bots",
"file": "apps/food/server/index.js",
"file": "apps/food/server/index.js",
- "line": 149,
+ "line": 153,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16207,7 +17128,7 @@
@@ -16207,7 +17128,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics/bots",
"path": "/api/internal/analytics/bots",
"file": "apps/img/server/index.js",
"file": "apps/img/server/index.js",
- "line": 314,
+ "line": 318,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16217,7 +17138,7 @@
@@ -16217,7 +17138,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics/bots",
"path": "/api/internal/analytics/bots",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 479,
+ "line": 483,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16227,7 +17148,7 @@
@@ -16227,7 +17148,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics/bots",
"path": "/api/internal/analytics/bots",
"file": "apps/text/server/index.js",
"file": "apps/text/server/index.js",
- "line": 121,
+ "line": 125,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16237,7 +17158,7 @@
@@ -16237,7 +17158,7 @@
"method": "GET",
"method": "GET",
"path": "/api/internal/analytics/bots",
"path": "/api/internal/analytics/bots",
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
- "line": 287,
+ "line": 291,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16257,7 +17178,7 @@
@@ -16257,7 +17178,7 @@
"method": "GET",
"method": "GET",
"path": "/api/meal-plan",
"path": "/api/meal-plan",
"file": "apps/food/server/index.js",
"file": "apps/food/server/index.js",
- "line": 140,
+ "line": 144,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16267,7 +17188,7 @@
@@ -16267,7 +17188,7 @@
"method": "GET",
"method": "GET",
"path": "/api/meal-plan",
"path": "/api/meal-plan",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 462,
+ "line": 466,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16277,7 +17198,7 @@
@@ -16277,7 +17198,7 @@
"method": "GET",
"method": "GET",
"path": "/api/preview/:id",
"path": "/api/preview/:id",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 316,
+ "line": 320,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16287,7 +17208,7 @@
@@ -16287,7 +17208,7 @@
"method": "POST",
"method": "POST",
"path": "/api/probe",
"path": "/api/probe",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 189,
+ "line": 193,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16307,7 +17228,7 @@
@@ -16307,7 +17228,7 @@
"method": "POST",
"method": "POST",
"path": "/api/process",
"path": "/api/process",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 202,
+ "line": 206,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16317,7 +17238,7 @@
@@ -16317,7 +17238,7 @@
"method": "POST",
"method": "POST",
"path": "/api/process",
"path": "/api/process",
"file": "apps/docs/server/index.js",
"file": "apps/docs/server/index.js",
- "line": 230,
+ "line": 234,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16327,7 +17248,7 @@
@@ -16327,7 +17248,7 @@
"method": "POST",
"method": "POST",
"path": "/api/process",
"path": "/api/process",
"file": "apps/img/server/index.js",
"file": "apps/img/server/index.js",
- "line": 214,
+ "line": 218,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16337,7 +17258,7 @@
@@ -16337,7 +17258,7 @@
"method": "POST",
"method": "POST",
"path": "/api/process/direct",
"path": "/api/process/direct",
"file": "apps/img/server/index.js",
"file": "apps/img/server/index.js",
- "line": 241,
+ "line": 245,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16347,7 +17268,7 @@
@@ -16347,7 +17268,7 @@
"method": "POST",
"method": "POST",
"path": "/api/process/multi",
"path": "/api/process/multi",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 243,
+ "line": 247,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16357,7 +17278,7 @@
@@ -16357,7 +17278,7 @@
"method": "POST",
"method": "POST",
"path": "/api/process/multi",
"path": "/api/process/multi",
"file": "apps/docs/server/index.js",
"file": "apps/docs/server/index.js",
- "line": 277,
+ "line": 281,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16387,7 +17308,7 @@
@@ -16387,7 +17308,7 @@
"method": "GET",
"method": "GET",
"path": "/api/search",
"path": "/api/search",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 260,
+ "line": 264,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16397,7 +17318,7 @@
@@ -16397,7 +17318,7 @@
"method": "GET",
"method": "GET",
"path": "/api/search/stream",
"path": "/api/search/stream",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 305,
+ "line": 309,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16407,7 +17328,7 @@
@@ -16407,7 +17328,7 @@
"method": "GET",
"method": "GET",
"path": "/api/status/:id",
"path": "/api/status/:id",
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
- "line": 194,
+ "line": 198,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16417,7 +17338,7 @@
@@ -16417,7 +17338,7 @@
"method": "GET",
"method": "GET",
"path": "/api/status/:id/stream",
"path": "/api/status/:id/stream",
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
- "line": 210,
+ "line": 214,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16427,7 +17348,7 @@
@@ -16427,7 +17348,7 @@
"method": "GET",
"method": "GET",
"path": "/api/stores",
"path": "/api/stores",
"file": "apps/food/server/index.js",
"file": "apps/food/server/index.js",
- "line": 138,
+ "line": 142,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16437,7 +17358,7 @@
@@ -16437,7 +17358,7 @@
"method": "GET",
"method": "GET",
"path": "/api/stores",
"path": "/api/stores",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 442,
+ "line": 446,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16447,7 +17368,7 @@
@@ -16447,7 +17368,7 @@
"method": "GET",
"method": "GET",
"path": "/api/terrain",
"path": "/api/terrain",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 421,
+ "line": 425,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16457,7 +17378,7 @@
@@ -16457,7 +17378,7 @@
"method": "GET",
"method": "GET",
"path": "/api/tools",
"path": "/api/tools",
"file": "apps/audio/server/index.js",
"file": "apps/audio/server/index.js",
- "line": 184,
+ "line": 188,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16467,7 +17388,7 @@
@@ -16467,7 +17388,7 @@
"method": "GET",
"method": "GET",
"path": "/api/tools",
"path": "/api/tools",
"file": "apps/docs/server/index.js",
"file": "apps/docs/server/index.js",
- "line": 213,
+ "line": 217,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16477,7 +17398,7 @@
@@ -16477,7 +17398,7 @@
"method": "GET",
"method": "GET",
"path": "/api/tools",
"path": "/api/tools",
"file": "apps/img/server/index.js",
"file": "apps/img/server/index.js",
- "line": 209,
+ "line": 213,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16567,7 +17488,7 @@
@@ -16567,7 +17488,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/me/recent-tools",
"path": "/api/v1/me/recent-tools",
"file": "apps/gateway/server/index.js",
"file": "apps/gateway/server/index.js",
- "line": 203,
+ "line": 207,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16583,11 +17504,21 @@
@@ -16583,11 +17504,21 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "POST",
+ "path": "/api/v1/tools/:id/run",
+ "file": "apps/gateway/server/index.js",
+ "line": 266,
+ "target": "OpenVibe.Tools",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/api/weather",
"path": "/api/weather",
"file": "apps/maps/server/index.js",
"file": "apps/maps/server/index.js",
- "line": 405,
+ "line": 409,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16797,7 +17728,7 @@
@@ -16797,7 +17728,7 @@
"method": "GET",
"method": "GET",
"path": "/openvibe-sw.js",
"path": "/openvibe-sw.js",
"file": "apps/gateway/server/index.js",
"file": "apps/gateway/server/index.js",
- "line": 459,
+ "line": 476,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16897,7 +17828,7 @@
@@ -16897,7 +17828,7 @@
"method": "GET",
"method": "GET",
"path": "/sitemap.xml",
"path": "/sitemap.xml",
"file": "apps/text/server/index.js",
"file": "apps/text/server/index.js",
- "line": 149,
+ "line": 153,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -16967,7 +17898,7 @@
@@ -16967,7 +17898,7 @@
"method": "GET",
"method": "GET",
"path": "/tos",
"path": "/tos",
"file": "apps/gateway/server/index.js",
"file": "apps/gateway/server/index.js",
- "line": 417,
+ "line": 434,
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -17049,6 +17980,12 @@
@@ -17049,6 +17980,12 @@
"paths": []
"paths": []
},
},
"env": {
"env": {
+ "TOOLS_LIMITS_MINUTE": [
+ "apps/_shared/actor-limits.js"
+ ],
+ "TOOLS_LIMITS_HOUR": [
+ "apps/_shared/actor-limits.js"
+ ],
"NODE_ENV": [
"NODE_ENV": [
"apps/_shared/guard/caller.js",
"apps/_shared/guard/caller.js",
"apps/_shared/guard/index.js",
"apps/_shared/guard/index.js",
@@ -17402,43 +18339,43 @@
@@ -17402,43 +18339,43 @@
"refs": [
"refs": [
{
{
"via": ":4100",
"via": ":4100",
- "line": 18
+ "line": 19
},
},
{
{
"via": "OV_MEDIA_INTERNAL_URL",
"via": "OV_MEDIA_INTERNAL_URL",
- "line": 54
+ "line": 55
},
},
{
{
"via": "MEDIA_URL",
"via": "MEDIA_URL",
- "line": 54
+ "line": 55
},
},
{
{
"via": ":4100",
"via": ":4100",
- "line": 54
+ "line": 55
},
},
{
{
"via": "mediaOrigin",
"via": "mediaOrigin",
- "line": 62
+ "line": 63
},
},
{
{
"via": "OV_MEDIA_URL",
"via": "OV_MEDIA_URL",
- "line": 63
+ "line": 64
},
},
{
{
"via": "OV_MEDIA_INTERNAL_URL",
"via": "OV_MEDIA_INTERNAL_URL",
- "line": 143
+ "line": 144
},
},
{
{
"via": "MEDIA_URL",
"via": "MEDIA_URL",
- "line": 143
+ "line": 144
},
},
{
{
"via": ":4100",
"via": ":4100",
- "line": 143
+ "line": 144
},
},
{
{
"via": "mediaOrigin",
"via": "mediaOrigin",
- "line": 157
+ "line": 158
}
}
]
]
},
},
@@ -17447,19 +18384,19 @@
@@ -17447,19 +18384,19 @@
"refs": [
"refs": [
{
{
"via": ":4000",
"via": ":4000",
- "line": 20
+ "line": 21
},
},
{
{
"via": "OV_NETWORK_INTERNAL_URL",
"via": "OV_NETWORK_INTERNAL_URL",
- "line": 45
+ "line": 46
},
},
{
{
"via": ":4000",
"via": ":4000",
- "line": 45
+ "line": 46
},
},
{
{
"via": "/oauth/token",
"via": "/oauth/token",
- "line": 47
+ "line": 48
}
}
]
]
},
},
@@ -17468,7 +18405,7 @@
@@ -17468,7 +18405,7 @@
"refs": [
"refs": [
{
{
"via": "EVENTS_URL",
"via": "EVENTS_URL",
- "line": 96
+ "line": 97
}
}
]
]
}
}
@@ -17590,7 +18527,7 @@
@@ -17590,7 +18527,7 @@
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 504
+ "line": 521
}
}
]
]
},
},
@@ -17603,11 +18540,11 @@
@@ -17603,11 +18540,11 @@
},
},
{
{
"via": "communityUrl",
"via": "communityUrl",
- "line": 318
+ "line": 326
},
},
{
{
"via": "OV_COMMUNITY_URL",
"via": "OV_COMMUNITY_URL",
- "line": 440
+ "line": 457
}
}
]
]
},
},
@@ -17616,7 +18553,7 @@
@@ -17616,7 +18553,7 @@
"refs": [
"refs": [
{
{
"via": "liveUrl",
"via": "liveUrl",
- "line": 505
+ "line": 522
}
}
]
]
}
}
@@ -17796,7 +18733,7 @@
@@ -17796,7 +18733,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 123,
+ "line": 124,
"file": "apps/_shared/jobs/index.js",
"file": "apps/_shared/jobs/index.js",
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
@@ -17807,7 +18744,7 @@
@@ -17807,7 +18744,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 660,
+ "line": 674,
"file": "apps/_shared/jobs/system.js",
"file": "apps/_shared/jobs/system.js",
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
@@ -17917,7 +18854,7 @@
@@ -17917,7 +18854,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 662,
+ "line": 666,
"file": "apps/yt/server/downloader.js",
"file": "apps/yt/server/downloader.js",
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
@@ -17928,7 +18865,7 @@
@@ -17928,7 +18865,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 5000,
"intervalMs": 5000,
- "line": 713,
+ "line": 717,
"file": "apps/yt/server/downloader.js",
"file": "apps/yt/server/downloader.js",
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
@@ -17939,7 +18876,7 @@
@@ -17939,7 +18876,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 600000,
"intervalMs": 600000,
- "line": 138,
+ "line": 142,
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
@@ -17950,7 +18887,7 @@
@@ -17950,7 +18887,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 500,
"intervalMs": 500,
- "line": 255,
+ "line": 259,
"file": "apps/yt/server/index.js",
"file": "apps/yt/server/index.js",
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"disposition": "keep",
"disposition": "keep",
@@ -17960,7 +18897,7 @@
@@ -17960,7 +18897,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 49,
+ "testFiles": 61,
"ci": true
"ci": true
},
},
{
{
@@ -17968,13 +18905,13 @@
@@ -17968,13 +18905,13 @@
"service": "community",
"service": "community",
"present": true,
"present": true,
"git": {
"git": {
- "head": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",
+ "head": "2da3501e28457fa4978c0bc4a1b3bfc9188b77b9",
"branch": "main",
"branch": "main",
- "originMain": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",
- "committedAt": "2026-09-26T06:13:46-07:00"
+ "originMain": "2da3501e28457fa4978c0bc4a1b3bfc9188b77b9",
+ "committedAt": "2026-09-27T20:14:58-07:00"
},
},
- "sourceFiles": 63,
- "loc": 11502,
+ "sourceFiles": 66,
+ "loc": 12037,
"tables": [
"tables": [
{
{
"table": "pastes",
"table": "pastes",
@@ -18144,16 +19081,28 @@
@@ -18144,16 +19081,28 @@
"line": 408,
"line": 408,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "game_progress",
+ "file": "server/db.js",
+ "line": 424,
+ "via": "repo"
+ },
{
{
"table": "import_hold",
"table": "import_hold",
"file": "server/db.js",
"file": "server/db.js",
- "line": 425,
+ "line": 431,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "relay_deliveries_v2",
"table": "relay_deliveries_v2",
"file": "server/db.js",
"file": "server/db.js",
- "line": 554,
+ "line": 560,
+ "via": "repo"
+ },
+ {
+ "table": "account_data_events",
+ "file": "server/identity/account-data.js",
+ "line": 32,
"via": "repo"
"via": "repo"
},
},
{
{
@@ -18180,7 +19129,7 @@
@@ -18180,7 +19129,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/app.js",
"file": "server/app.js",
- "line": 252,
+ "line": 259,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18190,7 +19139,7 @@
@@ -18190,7 +19139,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 217,
+ "line": 224,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18200,7 +19149,7 @@
@@ -18200,7 +19149,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes",
"path": "/api/pastes",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 105,
+ "line": 111,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18210,7 +19159,7 @@
@@ -18210,7 +19159,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes",
"path": "/api/pastes",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 109,
+ "line": 115,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18220,7 +19169,7 @@
@@ -18220,7 +19169,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/pastes/:slug",
"path": "/api/pastes/:slug",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 127,
+ "line": 134,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18230,7 +19179,7 @@
@@ -18230,7 +19179,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/:slug",
"path": "/api/pastes/:slug",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 125,
+ "line": 132,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18240,7 +19189,7 @@
@@ -18240,7 +19189,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/pastes/:slug",
"path": "/api/pastes/:slug",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 126,
+ "line": 133,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18250,7 +19199,7 @@
@@ -18250,7 +19199,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/:slug/ai",
"path": "/api/pastes/:slug/ai",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 130,
+ "line": 138,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18260,7 +19209,7 @@
@@ -18260,7 +19209,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/:slug/censor",
"path": "/api/pastes/:slug/censor",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 129,
+ "line": 136,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18270,7 +19219,7 @@
@@ -18270,7 +19219,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/:slug/comments",
"path": "/api/pastes/:slug/comments",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 139,
+ "line": 147,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18280,7 +19229,7 @@
@@ -18280,7 +19229,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/:slug/comments",
"path": "/api/pastes/:slug/comments",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 140,
+ "line": 148,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18290,7 +19239,7 @@
@@ -18290,7 +19239,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/pastes/:slug/comments/:commentId",
"path": "/api/pastes/:slug/comments/:commentId",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 143,
+ "line": 151,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18300,7 +19249,7 @@
@@ -18300,7 +19249,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/:slug/copy",
"path": "/api/pastes/:slug/copy",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 137,
+ "line": 145,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18310,7 +19259,7 @@
@@ -18310,7 +19259,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/:slug/fork",
"path": "/api/pastes/:slug/fork",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 135,
+ "line": 143,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18320,7 +19269,7 @@
@@ -18320,7 +19269,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/:slug/like",
"path": "/api/pastes/:slug/like",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 136,
+ "line": 144,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18330,7 +19279,7 @@
@@ -18330,7 +19279,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/:slug/raw",
"path": "/api/pastes/:slug/raw",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 132,
+ "line": 140,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18340,7 +19289,7 @@
@@ -18340,7 +19289,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/:slug/set-avatar",
"path": "/api/pastes/:slug/set-avatar",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 146,
+ "line": 154,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18350,7 +19299,7 @@
@@ -18350,7 +19299,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/:slug/versions",
"path": "/api/pastes/:slug/versions",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 133,
+ "line": 141,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18360,7 +19309,7 @@
@@ -18360,7 +19309,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/pastes/admin/forks",
"path": "/api/pastes/admin/forks",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 116,
+ "line": 122,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18370,7 +19319,7 @@
@@ -18370,7 +19319,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/admin/forks",
"path": "/api/pastes/admin/forks",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 115,
+ "line": 121,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18380,7 +19329,7 @@
@@ -18380,7 +19329,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/admin/stats",
"path": "/api/pastes/admin/stats",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 114,
+ "line": 120,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18390,7 +19339,7 @@
@@ -18390,7 +19339,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/bulk",
"path": "/api/pastes/bulk",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 117,
+ "line": 123,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18400,7 +19349,7 @@
@@ -18400,7 +19349,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/by-user/:username",
"path": "/api/pastes/by-user/:username",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 122,
+ "line": 129,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18410,7 +19359,7 @@
@@ -18410,7 +19359,7 @@
"method": "GET",
"method": "GET",
"path": "/api/pastes/config",
"path": "/api/pastes/config",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 112,
+ "line": 118,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18420,7 +19369,7 @@
@@ -18420,7 +19369,7 @@
"method": "POST",
"method": "POST",
"path": "/api/pastes/screenshot",
"path": "/api/pastes/screenshot",
"file": "server/pastes/api.js",
"file": "server/pastes/api.js",
- "line": 119,
+ "line": 126,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18430,7 +19379,7 @@
@@ -18430,7 +19379,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 224,
+ "line": 231,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18440,7 +19389,7 @@
@@ -18440,7 +19389,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/comments/:commentId",
"path": "/api/v1/comments/:commentId",
"file": "server/comments/api.js",
"file": "server/comments/api.js",
- "line": 45,
+ "line": 51,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18450,7 +19399,7 @@
@@ -18450,7 +19399,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/comments/:commentId",
"path": "/api/v1/comments/:commentId",
"file": "server/comments/api.js",
"file": "server/comments/api.js",
- "line": 43,
+ "line": 49,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18460,7 +19409,7 @@
@@ -18460,7 +19409,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/comments/:commentId",
"path": "/api/v1/comments/:commentId",
"file": "server/comments/api.js",
"file": "server/comments/api.js",
- "line": 44,
+ "line": 50,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18470,7 +19419,7 @@
@@ -18470,7 +19419,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/comments/:commentId/votes",
"path": "/api/v1/comments/:commentId/votes",
"file": "server/comments/api.js",
"file": "server/comments/api.js",
- "line": 46,
+ "line": 52,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18480,7 +19429,7 @@
@@ -18480,7 +19429,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/comments/threads/:id",
"path": "/api/v1/comments/threads/:id",
"file": "server/comments/api.js",
"file": "server/comments/api.js",
- "line": 39,
+ "line": 45,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18490,7 +19439,7 @@
@@ -18490,7 +19439,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/comments/threads/:id/comments",
"path": "/api/v1/comments/threads/:id/comments",
"file": "server/comments/api.js",
"file": "server/comments/api.js",
- "line": 40,
+ "line": 46,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18500,7 +19449,7 @@
@@ -18500,7 +19449,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/comments/threads/:id/visibility",
"path": "/api/v1/comments/threads/:id/visibility",
"file": "server/comments/api.js",
"file": "server/comments/api.js",
- "line": 42,
+ "line": 48,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18510,7 +19459,7 @@
@@ -18510,7 +19459,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/comments/threads/resolve",
"path": "/api/v1/comments/threads/resolve",
"file": "server/comments/api.js",
"file": "server/comments/api.js",
- "line": 37,
+ "line": 43,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18520,7 +19469,7 @@
@@ -18520,7 +19469,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts",
"path": "/api/v1/posts",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 57,
+ "line": 63,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18530,7 +19479,7 @@
@@ -18530,7 +19479,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts",
"path": "/api/v1/posts",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 110,
+ "line": 121,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18540,7 +19489,7 @@
@@ -18540,7 +19489,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/posts",
"path": "/api/v1/posts",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 58,
+ "line": 64,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18550,7 +19499,7 @@
@@ -18550,7 +19499,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:group",
"path": "/api/v1/posts/:group",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 111,
+ "line": 122,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18560,7 +19509,7 @@
@@ -18560,7 +19509,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/posts/:id",
"path": "/api/v1/posts/:id",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 98,
+ "line": 107,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18570,7 +19519,7 @@
@@ -18570,7 +19519,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:id",
"path": "/api/v1/posts/:id",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 96,
+ "line": 105,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18580,7 +19529,7 @@
@@ -18580,7 +19529,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/posts/:id/reactions",
"path": "/api/v1/posts/:id/reactions",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 97,
+ "line": 106,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18590,7 +19539,7 @@
@@ -18590,7 +19539,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts/:id/versions",
"path": "/api/v1/posts/:id/versions",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 99,
+ "line": 108,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18600,7 +19549,7 @@
@@ -18600,7 +19549,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts/:space",
"path": "/api/v1/posts/:space",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 60,
+ "line": 66,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18610,7 +19559,7 @@
@@ -18610,7 +19559,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/posts/:space/attachments",
"path": "/api/v1/posts/:space/attachments",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 68,
+ "line": 75,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18620,7 +19569,7 @@
@@ -18620,7 +19569,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts/:space/categories",
"path": "/api/v1/posts/:space/categories",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 62,
+ "line": 68,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18630,7 +19579,7 @@
@@ -18630,7 +19579,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/posts/:space/categories/:category",
"path": "/api/v1/posts/:space/categories/:category",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 70,
+ "line": 77,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18640,7 +19589,7 @@
@@ -18640,7 +19589,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:space/categories/:category",
"path": "/api/v1/posts/:space/categories/:category",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 69,
+ "line": 76,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18650,7 +19599,7 @@
@@ -18650,7 +19599,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/posts/:space/chat-room",
"path": "/api/v1/posts/:space/chat-room",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 84,
+ "line": 91,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18660,7 +19609,7 @@
@@ -18660,7 +19609,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:space/chat-room",
"path": "/api/v1/posts/:space/chat-room",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 83,
+ "line": 90,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18670,7 +19619,7 @@
@@ -18670,7 +19619,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:space/members-only",
"path": "/api/v1/posts/:space/members-only",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 81,
+ "line": 88,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18680,7 +19629,7 @@
@@ -18680,7 +19629,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:space/settings",
"path": "/api/v1/posts/:space/settings",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 59,
+ "line": 65,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18690,7 +19639,7 @@
@@ -18690,7 +19639,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts/:space/threads",
"path": "/api/v1/posts/:space/threads",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 61,
+ "line": 67,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18700,7 +19649,7 @@
@@ -18700,7 +19649,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/posts/:space/threads",
"path": "/api/v1/posts/:space/threads",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 74,
+ "line": 81,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18710,7 +19659,7 @@
@@ -18710,7 +19659,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/posts/:space/threads/:slug",
"path": "/api/v1/posts/:space/threads/:slug",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 76,
+ "line": 83,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18720,7 +19669,7 @@
@@ -18720,7 +19669,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts/:space/threads/:slug",
"path": "/api/v1/posts/:space/threads/:slug",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 75,
+ "line": 82,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18730,7 +19679,7 @@
@@ -18730,7 +19679,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:space/threads/:slug/category",
"path": "/api/v1/posts/:space/threads/:slug/category",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 71,
+ "line": 78,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18740,7 +19689,7 @@
@@ -18740,7 +19689,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/posts/:space/threads/:slug/crosspost",
"path": "/api/v1/posts/:space/threads/:slug/crosspost",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 73,
+ "line": 80,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18750,7 +19699,7 @@
@@ -18750,7 +19699,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:space/threads/:slug/members-only",
"path": "/api/v1/posts/:space/threads/:slug/members-only",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 80,
+ "line": 87,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18760,7 +19709,7 @@
@@ -18760,7 +19709,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/posts/:space/threads/:slug/posts",
"path": "/api/v1/posts/:space/threads/:slug/posts",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 77,
+ "line": 84,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18770,7 +19719,7 @@
@@ -18770,7 +19719,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:space/threads/:slug/state",
"path": "/api/v1/posts/:space/threads/:slug/state",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 79,
+ "line": 86,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18780,7 +19729,7 @@
@@ -18780,7 +19729,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/posts/:space/threads/:slug/status",
"path": "/api/v1/posts/:space/threads/:slug/status",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 72,
+ "line": 79,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18790,7 +19739,7 @@
@@ -18790,7 +19739,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/posts/:space/threads/:slug/votes",
"path": "/api/v1/posts/:space/threads/:slug/votes",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 78,
+ "line": 85,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18800,7 +19749,7 @@
@@ -18800,7 +19749,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/pulse",
"path": "/api/v1/pulse",
"file": "server/pulse/api.js",
"file": "server/pulse/api.js",
- "line": 27,
+ "line": 31,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18810,7 +19759,7 @@
@@ -18810,7 +19759,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pulse/items",
"path": "/api/v1/pulse/items",
"file": "server/pulse/api.js",
"file": "server/pulse/api.js",
- "line": 28,
+ "line": 32,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18820,7 +19769,7 @@
@@ -18820,7 +19769,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/pulse/items/:service/:type/:id",
"path": "/api/v1/pulse/items/:service/:type/:id",
"file": "server/pulse/api.js",
"file": "server/pulse/api.js",
- "line": 29,
+ "line": 33,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18830,7 +19779,7 @@
@@ -18830,7 +19779,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/relay/deliveries",
"path": "/api/v1/relay/deliveries",
"file": "server/relay/api.js",
"file": "server/relay/api.js",
- "line": 54,
+ "line": 58,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18840,7 +19789,7 @@
@@ -18840,7 +19789,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/relay/deliveries/:id/drop",
"path": "/api/v1/relay/deliveries/:id/drop",
"file": "server/relay/api.js",
"file": "server/relay/api.js",
- "line": 63,
+ "line": 67,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18850,7 +19799,7 @@
@@ -18850,7 +19799,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/relay/deliveries/:id/retry",
"path": "/api/v1/relay/deliveries/:id/retry",
"file": "server/relay/api.js",
"file": "server/relay/api.js",
- "line": 59,
+ "line": 63,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18860,7 +19809,7 @@
@@ -18860,7 +19809,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/relay/inbound",
"path": "/api/v1/relay/inbound",
"file": "server/relay/api.js",
"file": "server/relay/api.js",
- "line": 67,
+ "line": 71,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18870,7 +19819,7 @@
@@ -18870,7 +19819,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/relay/inbound/:id/dismiss",
"path": "/api/v1/relay/inbound/:id/dismiss",
"file": "server/relay/api.js",
"file": "server/relay/api.js",
- "line": 70,
+ "line": 74,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18880,7 +19829,7 @@
@@ -18880,7 +19829,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/relay/mappings",
"path": "/api/v1/relay/mappings",
"file": "server/relay/api.js",
"file": "server/relay/api.js",
- "line": 74,
+ "line": 78,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18890,7 +19839,7 @@
@@ -18890,7 +19839,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/relay/mappings",
"path": "/api/v1/relay/mappings",
"file": "server/relay/api.js",
"file": "server/relay/api.js",
- "line": 75,
+ "line": 79,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18900,7 +19849,7 @@
@@ -18900,7 +19849,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/relay/mappings/:id",
"path": "/api/v1/relay/mappings/:id",
"file": "server/relay/api.js",
"file": "server/relay/api.js",
- "line": 85,
+ "line": 89,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18910,7 +19859,7 @@
@@ -18910,7 +19859,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/relay/status",
"path": "/api/v1/relay/status",
"file": "server/relay/api.js",
"file": "server/relay/api.js",
- "line": 53,
+ "line": 57,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18920,7 +19869,7 @@
@@ -18920,7 +19869,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/space-groups",
"path": "/api/v1/space-groups",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 57,
+ "line": 63,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18930,7 +19879,7 @@
@@ -18930,7 +19879,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/space-groups",
"path": "/api/v1/space-groups",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 110,
+ "line": 121,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18940,7 +19889,7 @@
@@ -18940,7 +19889,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/space-groups",
"path": "/api/v1/space-groups",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 58,
+ "line": 64,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18950,7 +19899,7 @@
@@ -18950,7 +19899,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:group",
"path": "/api/v1/space-groups/:group",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 111,
+ "line": 122,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18960,7 +19909,7 @@
@@ -18960,7 +19909,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/space-groups/:id",
"path": "/api/v1/space-groups/:id",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 98,
+ "line": 107,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18970,7 +19919,7 @@
@@ -18970,7 +19919,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:id",
"path": "/api/v1/space-groups/:id",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 96,
+ "line": 105,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18980,7 +19929,7 @@
@@ -18980,7 +19929,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/space-groups/:id/reactions",
"path": "/api/v1/space-groups/:id/reactions",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 97,
+ "line": 106,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -18990,7 +19939,7 @@
@@ -18990,7 +19939,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/space-groups/:id/versions",
"path": "/api/v1/space-groups/:id/versions",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 99,
+ "line": 108,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19000,7 +19949,7 @@
@@ -19000,7 +19949,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/space-groups/:space",
"path": "/api/v1/space-groups/:space",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 60,
+ "line": 66,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19010,7 +19959,7 @@
@@ -19010,7 +19959,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/space-groups/:space/attachments",
"path": "/api/v1/space-groups/:space/attachments",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 68,
+ "line": 75,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19020,7 +19969,7 @@
@@ -19020,7 +19969,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/space-groups/:space/categories",
"path": "/api/v1/space-groups/:space/categories",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 62,
+ "line": 68,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19030,7 +19979,7 @@
@@ -19030,7 +19979,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/space-groups/:space/categories/:category",
"path": "/api/v1/space-groups/:space/categories/:category",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 70,
+ "line": 77,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19040,7 +19989,7 @@
@@ -19040,7 +19989,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:space/categories/:category",
"path": "/api/v1/space-groups/:space/categories/:category",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 69,
+ "line": 76,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19050,7 +19999,7 @@
@@ -19050,7 +19999,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/space-groups/:space/chat-room",
"path": "/api/v1/space-groups/:space/chat-room",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 84,
+ "line": 91,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19060,7 +20009,7 @@
@@ -19060,7 +20009,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:space/chat-room",
"path": "/api/v1/space-groups/:space/chat-room",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 83,
+ "line": 90,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19070,7 +20019,7 @@
@@ -19070,7 +20019,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:space/members-only",
"path": "/api/v1/space-groups/:space/members-only",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 81,
+ "line": 88,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19080,7 +20029,7 @@
@@ -19080,7 +20029,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:space/settings",
"path": "/api/v1/space-groups/:space/settings",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 59,
+ "line": 65,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19090,7 +20039,7 @@
@@ -19090,7 +20039,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/space-groups/:space/threads",
"path": "/api/v1/space-groups/:space/threads",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 61,
+ "line": 67,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19100,7 +20049,7 @@
@@ -19100,7 +20049,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/space-groups/:space/threads",
"path": "/api/v1/space-groups/:space/threads",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 74,
+ "line": 81,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19110,7 +20059,7 @@
@@ -19110,7 +20059,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/space-groups/:space/threads/:slug",
"path": "/api/v1/space-groups/:space/threads/:slug",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 76,
+ "line": 83,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19120,7 +20069,7 @@
@@ -19120,7 +20069,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/space-groups/:space/threads/:slug",
"path": "/api/v1/space-groups/:space/threads/:slug",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 75,
+ "line": 82,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19130,7 +20079,7 @@
@@ -19130,7 +20079,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:space/threads/:slug/category",
"path": "/api/v1/space-groups/:space/threads/:slug/category",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 71,
+ "line": 78,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19140,7 +20089,7 @@
@@ -19140,7 +20089,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/space-groups/:space/threads/:slug/crosspost",
"path": "/api/v1/space-groups/:space/threads/:slug/crosspost",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 73,
+ "line": 80,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19150,7 +20099,7 @@
@@ -19150,7 +20099,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:space/threads/:slug/members-only",
"path": "/api/v1/space-groups/:space/threads/:slug/members-only",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 80,
+ "line": 87,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19160,7 +20109,7 @@
@@ -19160,7 +20109,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/space-groups/:space/threads/:slug/posts",
"path": "/api/v1/space-groups/:space/threads/:slug/posts",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 77,
+ "line": 84,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19170,7 +20119,7 @@
@@ -19170,7 +20119,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:space/threads/:slug/state",
"path": "/api/v1/space-groups/:space/threads/:slug/state",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 79,
+ "line": 86,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19180,7 +20129,7 @@
@@ -19180,7 +20129,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/space-groups/:space/threads/:slug/status",
"path": "/api/v1/space-groups/:space/threads/:slug/status",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 72,
+ "line": 79,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19190,7 +20139,7 @@
@@ -19190,7 +20139,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/space-groups/:space/threads/:slug/votes",
"path": "/api/v1/space-groups/:space/threads/:slug/votes",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 78,
+ "line": 85,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19200,7 +20149,7 @@
@@ -19200,7 +20149,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces",
"path": "/api/v1/spaces",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 57,
+ "line": 63,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19210,7 +20159,7 @@
@@ -19210,7 +20159,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces",
"path": "/api/v1/spaces",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 110,
+ "line": 121,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19220,7 +20169,7 @@
@@ -19220,7 +20169,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces",
"path": "/api/v1/spaces",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 58,
+ "line": 64,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19230,7 +20179,7 @@
@@ -19230,7 +20179,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:group",
"path": "/api/v1/spaces/:group",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 111,
+ "line": 122,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19240,7 +20189,7 @@
@@ -19240,7 +20189,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/spaces/:id",
"path": "/api/v1/spaces/:id",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 98,
+ "line": 107,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19250,7 +20199,7 @@
@@ -19250,7 +20199,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:id",
"path": "/api/v1/spaces/:id",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 96,
+ "line": 105,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19260,7 +20209,7 @@
@@ -19260,7 +20209,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces/:id/reactions",
"path": "/api/v1/spaces/:id/reactions",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 97,
+ "line": 106,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19270,7 +20219,7 @@
@@ -19270,7 +20219,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces/:id/versions",
"path": "/api/v1/spaces/:id/versions",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 99,
+ "line": 108,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19280,7 +20229,7 @@
@@ -19280,7 +20229,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces/:space",
"path": "/api/v1/spaces/:space",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 60,
+ "line": 66,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19290,7 +20239,7 @@
@@ -19290,7 +20239,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces/:space/attachments",
"path": "/api/v1/spaces/:space/attachments",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 68,
+ "line": 75,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19300,7 +20249,7 @@
@@ -19300,7 +20249,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces/:space/categories",
"path": "/api/v1/spaces/:space/categories",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 62,
+ "line": 68,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19310,7 +20259,7 @@
@@ -19310,7 +20259,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/spaces/:space/categories/:category",
"path": "/api/v1/spaces/:space/categories/:category",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 70,
+ "line": 77,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19320,7 +20269,7 @@
@@ -19320,7 +20269,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:space/categories/:category",
"path": "/api/v1/spaces/:space/categories/:category",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 69,
+ "line": 76,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19330,7 +20279,7 @@
@@ -19330,7 +20279,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/spaces/:space/chat-room",
"path": "/api/v1/spaces/:space/chat-room",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 84,
+ "line": 91,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19340,7 +20289,7 @@
@@ -19340,7 +20289,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:space/chat-room",
"path": "/api/v1/spaces/:space/chat-room",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 83,
+ "line": 90,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19350,7 +20299,7 @@
@@ -19350,7 +20299,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:space/members-only",
"path": "/api/v1/spaces/:space/members-only",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 81,
+ "line": 88,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19360,7 +20309,7 @@
@@ -19360,7 +20309,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:space/settings",
"path": "/api/v1/spaces/:space/settings",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 59,
+ "line": 65,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19370,7 +20319,7 @@
@@ -19370,7 +20319,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces/:space/threads",
"path": "/api/v1/spaces/:space/threads",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 61,
+ "line": 67,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19380,7 +20329,7 @@
@@ -19380,7 +20329,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces/:space/threads",
"path": "/api/v1/spaces/:space/threads",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 74,
+ "line": 81,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19390,7 +20339,7 @@
@@ -19390,7 +20339,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/spaces/:space/threads/:slug",
"path": "/api/v1/spaces/:space/threads/:slug",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 76,
+ "line": 83,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19400,7 +20349,7 @@
@@ -19400,7 +20349,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces/:space/threads/:slug",
"path": "/api/v1/spaces/:space/threads/:slug",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 75,
+ "line": 82,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19410,7 +20359,7 @@
@@ -19410,7 +20359,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:space/threads/:slug/category",
"path": "/api/v1/spaces/:space/threads/:slug/category",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 71,
+ "line": 78,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19420,7 +20369,7 @@
@@ -19420,7 +20369,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces/:space/threads/:slug/crosspost",
"path": "/api/v1/spaces/:space/threads/:slug/crosspost",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 73,
+ "line": 80,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19430,7 +20379,7 @@
@@ -19430,7 +20379,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:space/threads/:slug/members-only",
"path": "/api/v1/spaces/:space/threads/:slug/members-only",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 80,
+ "line": 87,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19440,7 +20389,7 @@
@@ -19440,7 +20389,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces/:space/threads/:slug/posts",
"path": "/api/v1/spaces/:space/threads/:slug/posts",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 77,
+ "line": 84,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19450,7 +20399,7 @@
@@ -19450,7 +20399,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:space/threads/:slug/state",
"path": "/api/v1/spaces/:space/threads/:slug/state",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 79,
+ "line": 86,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19460,7 +20409,7 @@
@@ -19460,7 +20409,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:space/threads/:slug/status",
"path": "/api/v1/spaces/:space/threads/:slug/status",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 72,
+ "line": 79,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19470,7 +20419,7 @@
@@ -19470,7 +20419,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces/:space/threads/:slug/votes",
"path": "/api/v1/spaces/:space/threads/:slug/votes",
"file": "server/forum/api.js",
"file": "server/forum/api.js",
- "line": 78,
+ "line": 85,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19520,7 +20469,7 @@
@@ -19520,7 +20469,7 @@
"method": "GET",
"method": "GET",
"path": "/feed.xml",
"path": "/feed.xml",
"file": "server/app.js",
"file": "server/app.js",
- "line": 244,
+ "line": 251,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19530,7 +20479,7 @@
@@ -19530,7 +20479,7 @@
"method": "POST",
"method": "POST",
"path": "/internal/events",
"path": "/internal/events",
"file": "server/pulse/consumer.js",
"file": "server/pulse/consumer.js",
- "line": 74,
+ "line": 109,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19540,7 +20489,7 @@
@@ -19540,7 +20489,7 @@
"method": "GET",
"method": "GET",
"path": "/llms.txt",
"path": "/llms.txt",
"file": "server/app.js",
"file": "server/app.js",
- "line": 242,
+ "line": 249,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19580,7 +20529,7 @@
@@ -19580,7 +20529,7 @@
"method": "GET",
"method": "GET",
"path": "/my",
"path": "/my",
"file": "server/app.js",
"file": "server/app.js",
- "line": 388,
+ "line": 399,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19590,7 +20539,7 @@
@@ -19590,7 +20539,7 @@
"method": "GET",
"method": "GET",
"path": "/new",
"path": "/new",
"file": "server/app.js",
"file": "server/app.js",
- "line": 339,
+ "line": 350,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19600,7 +20549,7 @@
@@ -19600,7 +20549,7 @@
"method": "POST",
"method": "POST",
"path": "/new",
"path": "/new",
"file": "server/app.js",
"file": "server/app.js",
- "line": 350,
+ "line": 361,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19610,7 +20559,7 @@
@@ -19610,7 +20559,7 @@
"method": "GET",
"method": "GET",
"path": "/p/:slug",
"path": "/p/:slug",
"file": "server/app.js",
"file": "server/app.js",
- "line": 284,
+ "line": 291,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19620,7 +20569,7 @@
@@ -19620,7 +20569,7 @@
"method": "GET",
"method": "GET",
"path": "/p/:slug/download",
"path": "/p/:slug/download",
"file": "server/app.js",
"file": "server/app.js",
- "line": 327,
+ "line": 338,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19630,7 +20579,7 @@
@@ -19630,7 +20579,7 @@
"method": "GET",
"method": "GET",
"path": "/p/:slug/raw",
"path": "/p/:slug/raw",
"file": "server/app.js",
"file": "server/app.js",
- "line": 303,
+ "line": 310,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19640,7 +20589,7 @@
@@ -19640,7 +20589,7 @@
"method": "GET",
"method": "GET",
"path": "/p/:slug/raw",
"path": "/p/:slug/raw",
"file": "server/app.js",
"file": "server/app.js",
- "line": 323,
+ "line": 334,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19650,7 +20599,7 @@
@@ -19650,7 +20599,7 @@
"method": "GET",
"method": "GET",
"path": "/p/:slug/screenshot",
"path": "/p/:slug/screenshot",
"file": "server/app.js",
"file": "server/app.js",
- "line": 316,
+ "line": 323,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19660,7 +20609,7 @@
@@ -19660,7 +20609,7 @@
"method": "GET",
"method": "GET",
"path": "/p/:slug/screenshot",
"path": "/p/:slug/screenshot",
"file": "server/app.js",
"file": "server/app.js",
- "line": 324,
+ "line": 335,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19670,7 +20619,7 @@
@@ -19670,7 +20619,7 @@
"method": "GET",
"method": "GET",
"path": "/pastes",
"path": "/pastes",
"file": "server/app.js",
"file": "server/app.js",
- "line": 276,
+ "line": 283,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19680,7 +20629,7 @@
@@ -19680,7 +20629,7 @@
"method": "GET",
"method": "GET",
"path": "/pastes/:slug",
"path": "/pastes/:slug",
"file": "server/app.js",
"file": "server/app.js",
- "line": 282,
+ "line": 289,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19690,7 +20639,7 @@
@@ -19690,7 +20639,7 @@
"method": "GET",
"method": "GET",
"path": "/pulse",
"path": "/pulse",
"file": "server/app.js",
"file": "server/app.js",
- "line": 380,
+ "line": 391,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19710,7 +20659,7 @@
@@ -19710,7 +20659,7 @@
"method": "GET",
"method": "GET",
"path": "/robots.txt",
"path": "/robots.txt",
"file": "server/app.js",
"file": "server/app.js",
- "line": 241,
+ "line": 248,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19940,7 +20889,7 @@
@@ -19940,7 +20889,7 @@
"method": "GET",
"method": "GET",
"path": "/search",
"path": "/search",
"file": "server/app.js",
"file": "server/app.js",
- "line": 261,
+ "line": 268,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19950,7 +20899,7 @@
@@ -19950,7 +20899,7 @@
"method": "GET",
"method": "GET",
"path": "/sitemap.xml",
"path": "/sitemap.xml",
"file": "server/app.js",
"file": "server/app.js",
- "line": 243,
+ "line": 250,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19960,7 +20909,7 @@
@@ -19960,7 +20909,7 @@
"method": "GET",
"method": "GET",
"path": "/tos",
"path": "/tos",
"file": "server/app.js",
"file": "server/app.js",
- "line": 114,
+ "line": 115,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -19970,7 +20919,7 @@
@@ -19970,7 +20919,7 @@
"method": "GET",
"method": "GET",
"path": "/updates",
"path": "/updates",
"file": "server/app.js",
"file": "server/app.js",
- "line": 257,
+ "line": 264,
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20001,6 +20950,12 @@
@@ -20001,6 +20950,12 @@
"TRUST_PROXY": [
"TRUST_PROXY": [
"server/config.js"
"server/config.js"
],
],
+ "COMMUNITY_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "COMMUNITY_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"OV_NETWORK_URL": [
"OV_NETWORK_URL": [
"server/config.js"
"server/config.js"
],
],
@@ -20401,7 +21356,7 @@
@@ -20401,7 +21356,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 48,
+ "testFiles": 61,
"ci": true
"ci": true
},
},
{
{
@@ -20409,14 +21364,20 @@
@@ -20409,14 +21364,20 @@
"service": "games",
"service": "games",
"present": true,
"present": true,
"git": {
"git": {
- "head": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",
+ "head": "eb2d00880d3231b2c68cb1753b4542044edef1e5",
"branch": "main",
"branch": "main",
- "originMain": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",
- "committedAt": "2026-09-26T05:39:23-07:00"
+ "originMain": "eb2d00880d3231b2c68cb1753b4542044edef1e5",
+ "committedAt": "2026-09-27T20:16:07-07:00"
},
},
- "sourceFiles": 122,
- "loc": 23563,
+ "sourceFiles": 126,
+ "loc": 24425,
"tables": [
"tables": [
+ {
+ "table": "account_data_events",
+ "file": "apps/server/src/platform/accountData.ts",
+ "line": 47,
+ "via": "repo"
+ },
{
{
"table": "world_entities",
"table": "world_entities",
"file": "packages/persistence/src/sqlite/sqliteStore.ts",
"file": "packages/persistence/src/sqlite/sqliteStore.ts",
@@ -20513,7 +21474,7 @@
@@ -20513,7 +21474,7 @@
"method": "ANY",
"method": "ANY",
"path": "/",
"path": "/",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 672,
+ "line": 685,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20523,7 +21484,7 @@
@@ -20523,7 +21484,7 @@
"method": "ANY",
"method": "ANY",
"path": "/api",
"path": "/api",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 634,
+ "line": 647,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20533,7 +21494,7 @@
@@ -20533,7 +21494,7 @@
"method": "ANY",
"method": "ANY",
"path": "/api/*",
"path": "/api/*",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 634,
+ "line": 647,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20543,7 +21504,7 @@
@@ -20543,7 +21504,7 @@
"method": "ANY",
"method": "ANY",
"path": "/api/characters",
"path": "/api/characters",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 330,
+ "line": 343,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20553,7 +21514,7 @@
@@ -20553,7 +21514,7 @@
"method": "POST",
"method": "POST",
"path": "/api/map",
"path": "/api/map",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 178,
+ "line": 181,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20563,7 +21524,7 @@
@@ -20563,7 +21524,7 @@
"method": "POST",
"method": "POST",
"path": "/api/map-assets",
"path": "/api/map-assets",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 248,
+ "line": 256,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20573,7 +21534,7 @@
@@ -20573,7 +21534,7 @@
"method": "POST",
"method": "POST",
"path": "/api/texture",
"path": "/api/texture",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 248,
+ "line": 256,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20583,7 +21544,7 @@
@@ -20583,7 +21544,7 @@
"method": "ANY",
"method": "ANY",
"path": "/auth/*",
"path": "/auth/*",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 350,
+ "line": 363,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20593,7 +21554,7 @@
@@ -20593,7 +21554,7 @@
"method": "ANY",
"method": "ANY",
"path": "/auth/callback",
"path": "/auth/callback",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 416,
+ "line": 429,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20603,7 +21564,7 @@
@@ -20603,7 +21564,7 @@
"method": "ANY",
"method": "ANY",
"path": "/auth/fedcm",
"path": "/auth/fedcm",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 502,
+ "line": 515,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20613,7 +21574,7 @@
@@ -20613,7 +21574,7 @@
"method": "ANY",
"method": "ANY",
"path": "/auth/login",
"path": "/auth/login",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 365,
+ "line": 378,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20623,7 +21584,7 @@
@@ -20623,7 +21584,7 @@
"method": "ANY",
"method": "ANY",
"path": "/auth/logout",
"path": "/auth/logout",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 578,
+ "line": 591,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20633,7 +21594,7 @@
@@ -20633,7 +21594,7 @@
"method": "ANY",
"method": "ANY",
"path": "/auth/me",
"path": "/auth/me",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 595,
+ "line": 608,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20643,7 +21604,7 @@
@@ -20643,7 +21604,7 @@
"method": "ANY",
"method": "ANY",
"path": "/canvas",
"path": "/canvas",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 666,
+ "line": 679,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20653,7 +21614,7 @@
@@ -20653,7 +21614,7 @@
"method": "ANY",
"method": "ANY",
"path": "/editor",
"path": "/editor",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 678,
+ "line": 691,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20663,7 +21624,7 @@
@@ -20663,7 +21624,7 @@
"method": "ANY",
"method": "ANY",
"path": "/editor.html",
"path": "/editor.html",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 646,
+ "line": 659,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20673,7 +21634,7 @@
@@ -20673,7 +21634,7 @@
"method": "ANY",
"method": "ANY",
"path": "/editor/",
"path": "/editor/",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 658,
+ "line": 671,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20683,7 +21644,7 @@
@@ -20683,7 +21644,7 @@
"method": "ANY",
"method": "ANY",
"path": "/game",
"path": "/game",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 666,
+ "line": 679,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20693,7 +21654,7 @@
@@ -20693,7 +21654,7 @@
"method": "ANY",
"method": "ANY",
"path": "/game",
"path": "/game",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 667,
+ "line": 680,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20703,7 +21664,7 @@
@@ -20703,7 +21664,7 @@
"method": "ANY",
"method": "ANY",
"path": "/healthz",
"path": "/healthz",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 613,
+ "line": 626,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20713,7 +21674,7 @@
@@ -20713,7 +21674,7 @@
"method": "ANY",
"method": "ANY",
"path": "/map-assets/*",
"path": "/map-assets/*",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 304,
+ "line": 317,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20723,7 +21684,7 @@
@@ -20723,7 +21684,7 @@
"method": "ANY",
"method": "ANY",
"path": "/map.json",
"path": "/map.json",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 165,
+ "line": 168,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20733,7 +21694,7 @@
@@ -20733,7 +21694,7 @@
"method": "ANY",
"method": "ANY",
"path": "/metrics",
"path": "/metrics",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 618,
+ "line": 631,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20743,7 +21704,7 @@
@@ -20743,7 +21704,7 @@
"method": "ANY",
"method": "ANY",
"path": "/play",
"path": "/play",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 653,
+ "line": 666,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20753,7 +21714,7 @@
@@ -20753,7 +21714,7 @@
"method": "ANY",
"method": "ANY",
"path": "/play",
"path": "/play",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 676,
+ "line": 689,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20763,7 +21724,7 @@
@@ -20763,7 +21724,7 @@
"method": "ANY",
"method": "ANY",
"path": "/play.html",
"path": "/play.html",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 646,
+ "line": 659,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20773,7 +21734,7 @@
@@ -20773,7 +21734,7 @@
"method": "ANY",
"method": "ANY",
"path": "/play.html",
"path": "/play.html",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 648,
+ "line": 661,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20783,7 +21744,7 @@
@@ -20783,7 +21744,7 @@
"method": "ANY",
"method": "ANY",
"path": "/play/",
"path": "/play/",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 653,
+ "line": 666,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20793,7 +21754,7 @@
@@ -20793,7 +21754,7 @@
"method": "ANY",
"method": "ANY",
"path": "/play/",
"path": "/play/",
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
- "line": 658,
+ "line": 671,
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -20815,7 +21776,7 @@
@@ -20815,7 +21776,7 @@
{
{
"path": "/ws",
"path": "/ws",
"file": "apps/server/src/main.ts",
"file": "apps/server/src/main.ts",
- "line": 320
+ "line": 382
}
}
]
]
},
},
@@ -20886,6 +21847,12 @@
@@ -20886,6 +21847,12 @@
"LOG_LEVEL": [
"LOG_LEVEL": [
"apps/server/src/main.ts"
"apps/server/src/main.ts"
],
],
+ "GAMES_LIMITS_MINUTE": [
+ "apps/server/src/net/actorLimits.ts"
+ ],
+ "GAMES_LIMITS_HOUR": [
+ "apps/server/src/net/actorLimits.ts"
+ ],
"RELEASE_SHA": [
"RELEASE_SHA": [
"apps/server/src/observability/release.ts"
"apps/server/src/observability/release.ts"
],
],
@@ -20902,19 +21869,19 @@
@@ -20902,19 +21869,19 @@
"refs": [
"refs": [
{
{
"via": "/api/auth/me",
"via": "/api/auth/me",
- "line": 363
+ "line": 376
},
},
{
{
"via": "/api/auth/me",
"via": "/api/auth/me",
- "line": 395
+ "line": 408
},
},
{
{
"via": "/oauth/token",
"via": "/oauth/token",
- "line": 460
+ "line": 473
},
},
{
{
"via": "/oauth/token",
"via": "/oauth/token",
- "line": 539
+ "line": 552
}
}
]
]
}
}
@@ -20962,7 +21929,7 @@
@@ -20962,7 +21929,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 21600000,
"intervalMs": 21600000,
- "line": 162,
+ "line": 190,
"file": "apps/server/src/main.ts",
"file": "apps/server/src/main.ts",
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
@@ -20973,7 +21940,7 @@
@@ -20973,7 +21940,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 350,
+ "line": 412,
"file": "apps/server/src/main.ts",
"file": "apps/server/src/main.ts",
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"disposition": "keep",
"disposition": "keep",
@@ -21005,7 +21972,7 @@
@@ -21005,7 +21972,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 76,
+ "testFiles": 82,
"ci": true
"ci": true
},
},
{
{
@@ -21013,13 +21980,13 @@
@@ -21013,13 +21980,13 @@
"service": "sites",
"service": "sites",
"present": true,
"present": true,
"git": {
"git": {
- "head": "3802ee3d9ada9b8490134ece350420e627866a8c",
+ "head": "304e8b12b535f4b562f23027ae84f1a5d515cc6c",
"branch": "main",
"branch": "main",
- "originMain": "3802ee3d9ada9b8490134ece350420e627866a8c",
- "committedAt": "2026-09-26T06:18:20-07:00"
+ "originMain": "304e8b12b535f4b562f23027ae84f1a5d515cc6c",
+ "committedAt": "2026-09-27T20:13:57-07:00"
},
},
"sourceFiles": 1,
"sourceFiles": 1,
- "loc": 540,
+ "loc": 555,
"tables": [],
"tables": [],
"routes": [],
"routes": [],
"ws": {
"ws": {
@@ -21036,79 +22003,63 @@
@@ -21036,79 +22003,63 @@
"refs": [
"refs": [
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 100
+ "line": 104
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 111
+ "line": 115
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 111
+ "line": 115
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 112
- },
- {
- "via": "networkUrl",
- "line": 112
- },
- {
- "via": "networkUrl",
- "line": 114
+ "line": 116
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 145
+ "line": 116
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 216
+ "line": 118
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 217
+ "line": 220
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 266
+ "line": 221
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 267
+ "line": 275
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 268
+ "line": 275
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 271
+ "line": 276
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 271
+ "line": 276
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 272
+ "line": 287
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 272
+ "line": 322
},
},
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 283
- },
- {
- "via": "networkUrl",
- "line": 318
- },
- {
- "via": "networkUrl",
- "line": 501
+ "line": 514
}
}
]
]
}
}
@@ -21123,7 +22074,7 @@
@@ -21123,7 +22074,7 @@
"jobs": [],
"jobs": [],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 1,
+ "testFiles": 2,
"ci": true
"ci": true
},
},
{
{
@@ -21131,54 +22082,60 @@
@@ -21131,54 +22082,60 @@
"service": "events",
"service": "events",
"present": true,
"present": true,
"git": {
"git": {
- "head": "eb98f8cad2a738fec45f1c10e373081532c83e91",
+ "head": "19919ece79707eed051c3f18ab37b7fdb6d939a6",
"branch": "main",
"branch": "main",
- "originMain": "eb98f8cad2a738fec45f1c10e373081532c83e91",
- "committedAt": "2026-09-26T06:14:37-07:00"
+ "originMain": "19919ece79707eed051c3f18ab37b7fdb6d939a6",
+ "committedAt": "2026-09-27T20:03:54-07:00"
},
},
- "sourceFiles": 18,
- "loc": 3024,
+ "sourceFiles": 20,
+ "loc": 3357,
"tables": [
"tables": [
{
{
"table": "sequences",
"table": "sequences",
"file": "server/store.js",
"file": "server/store.js",
- "line": 20,
+ "line": 21,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "events",
"table": "events",
"file": "server/store.js",
"file": "server/store.js",
- "line": 24,
+ "line": 25,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "subscriptions",
"table": "subscriptions",
"file": "server/store.js",
"file": "server/store.js",
- "line": 48,
+ "line": 49,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "deliveries",
"table": "deliveries",
"file": "server/store.js",
"file": "server/store.js",
- "line": 61,
+ "line": 62,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "consumer_checkpoints",
"table": "consumer_checkpoints",
"file": "server/store.js",
"file": "server/store.js",
- "line": 79,
+ "line": 80,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "app_revocations",
"table": "app_revocations",
"file": "server/store.js",
"file": "server/store.js",
- "line": 90,
+ "line": 91,
"via": "repo"
"via": "repo"
},
},
{
{
"table": "idempotency_receipts",
"table": "idempotency_receipts",
"file": "server/store.js",
"file": "server/store.js",
- "line": 99,
+ "line": 100,
+ "via": "repo"
+ },
+ {
+ "table": "app_usage",
+ "file": "server/usage.js",
+ "line": 40,
"via": "repo"
"via": "repo"
}
}
],
],
@@ -21187,7 +22144,7 @@
@@ -21187,7 +22144,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/app.js",
"file": "server/app.js",
- "line": 76,
+ "line": 80,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21197,7 +22154,7 @@
@@ -21197,7 +22154,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 39,
+ "line": 40,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21207,7 +22164,7 @@
@@ -21207,7 +22164,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 70,
+ "line": 71,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21217,7 +22174,7 @@
@@ -21217,7 +22174,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/checkpoints",
"path": "/api/v1/checkpoints",
"file": "server/api/read.js",
"file": "server/api/read.js",
- "line": 94,
+ "line": 98,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21227,7 +22184,7 @@
@@ -21227,7 +22184,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/checkpoints",
"path": "/api/v1/checkpoints",
"file": "server/api/read.js",
"file": "server/api/read.js",
- "line": 103,
+ "line": 107,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21237,7 +22194,7 @@
@@ -21237,7 +22194,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/deliveries",
"path": "/api/v1/deliveries",
"file": "server/api/read.js",
"file": "server/api/read.js",
- "line": 114,
+ "line": 118,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21247,7 +22204,7 @@
@@ -21247,7 +22204,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/deliveries/replay",
"path": "/api/v1/deliveries/replay",
"file": "server/api/read.js",
"file": "server/api/read.js",
- "line": 139,
+ "line": 145,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21257,7 +22214,7 @@
@@ -21257,7 +22214,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/events",
"path": "/api/v1/events",
"file": "server/api/read.js",
"file": "server/api/read.js",
- "line": 58,
+ "line": 62,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21267,7 +22224,7 @@
@@ -21267,7 +22224,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/events",
"path": "/api/v1/events",
"file": "server/api/publish.js",
"file": "server/api/publish.js",
- "line": 80,
+ "line": 99,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21277,7 +22234,7 @@
@@ -21277,7 +22234,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/events/:id",
"path": "/api/v1/events/:id",
"file": "server/api/read.js",
"file": "server/api/read.js",
- "line": 85,
+ "line": 89,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21287,7 +22244,7 @@
@@ -21287,7 +22244,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/subscriptions",
"path": "/api/v1/subscriptions",
"file": "server/api/subscriptions.js",
"file": "server/api/subscriptions.js",
- "line": 133,
+ "line": 142,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21297,7 +22254,7 @@
@@ -21297,7 +22254,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/subscriptions",
"path": "/api/v1/subscriptions",
"file": "server/api/subscriptions.js",
"file": "server/api/subscriptions.js",
- "line": 74,
+ "line": 83,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21307,7 +22264,7 @@
@@ -21307,7 +22264,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/subscriptions/:id",
"path": "/api/v1/subscriptions/:id",
"file": "server/api/subscriptions.js",
"file": "server/api/subscriptions.js",
- "line": 137,
+ "line": 146,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21317,7 +22274,7 @@
@@ -21317,7 +22274,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/subscriptions/:id/${action}",
"path": "/api/v1/subscriptions/:id/${action}",
"file": "server/api/subscriptions.js",
"file": "server/api/subscriptions.js",
- "line": 162,
+ "line": 172,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21327,7 +22284,7 @@
@@ -21327,7 +22284,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/subscriptions/:id/rotate-secret",
"path": "/api/v1/subscriptions/:id/rotate-secret",
"file": "server/api/subscriptions.js",
"file": "server/api/subscriptions.js",
- "line": 145,
+ "line": 154,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21357,7 +22314,7 @@
@@ -21357,7 +22314,7 @@
"method": "GET",
"method": "GET",
"path": "/realtime/stream",
"path": "/realtime/stream",
"file": "server/app.js",
"file": "server/app.js",
- "line": 35,
+ "line": 36,
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21471,6 +22428,21 @@
@@ -21471,6 +22428,21 @@
"EVENTS_APP_SANDBOX_RETENTION_DAYS": [
"EVENTS_APP_SANDBOX_RETENTION_DAYS": [
"server/config.js"
"server/config.js"
],
],
+ "EVENTS_LIMITS": [
+ "server/config.js"
+ ],
+ "EVENTS_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "EVENTS_LIMITS_HOUR": [
+ "server/config.js"
+ ],
+ "EVENTS_USAGE": [
+ "server/config.js"
+ ],
+ "EVENTS_USAGE_FLUSH_MS": [
+ "server/config.js"
+ ],
"REALTIME_MAX_CONNECTIONS": [
"REALTIME_MAX_CONNECTIONS": [
"server/config.js"
"server/config.js"
],
],
@@ -21529,6 +22501,17 @@
@@ -21529,6 +22501,17 @@
"wave": "-",
"wave": "-",
"note": "Runs in, and for, the service that owns it."
"note": "Runs in, and for, the service that owns it."
},
},
+ {
+ "kind": "setInterval",
+ "name": null,
+ "intervalMs": null,
+ "line": 69,
+ "file": "server/index.js",
+ "target": "OpenVibe.Events",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "Runs in, and for, the service that owns it."
+ },
{
{
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
@@ -21543,7 +22526,7 @@
@@ -21543,7 +22526,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 14,
+ "testFiles": 22,
"ci": true
"ci": true
},
},
{
{
@@ -21551,13 +22534,13 @@
@@ -21551,13 +22534,13 @@
"service": "chat",
"service": "chat",
"present": true,
"present": true,
"git": {
"git": {
- "head": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",
+ "head": "d87c8d3c906ad52ef8bf123ce60373fdefcf09e6",
"branch": "main",
"branch": "main",
- "originMain": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",
- "committedAt": "2026-09-26T06:12:38-07:00"
+ "originMain": "d87c8d3c906ad52ef8bf123ce60373fdefcf09e6",
+ "committedAt": "2026-09-27T20:03:11-07:00"
},
},
- "sourceFiles": 50,
- "loc": 16372,
+ "sourceFiles": 53,
+ "loc": 16898,
"tables": [
"tables": [
{
{
"table": "token_revocations",
"table": "token_revocations",
@@ -21565,6 +22548,12 @@
@@ -21565,6 +22548,12 @@
"line": 19,
"line": 19,
"via": "repo"
"via": "repo"
},
},
+ {
+ "table": "account_data_events",
+ "file": "server/chat/account-data.js",
+ "line": 39,
+ "via": "repo"
+ },
{
{
"table": "network_blocks",
"table": "network_blocks",
"file": "server/chat/network-blocks.js",
"file": "server/chat/network-blocks.js",
@@ -21811,7 +22800,7 @@
@@ -21811,7 +22800,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/prefs/routes.js",
"file": "server/prefs/routes.js",
- "line": 35,
+ "line": 40,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21831,7 +22820,7 @@
@@ -21831,7 +22820,7 @@
"method": "POST",
"method": "POST",
"path": "/",
"path": "/",
"file": "server/events/consumer.js",
"file": "server/events/consumer.js",
- "line": 143,
+ "line": 151,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21841,7 +22830,27 @@
@@ -21841,7 +22830,27 @@
"method": "PUT",
"method": "PUT",
"path": "/",
"path": "/",
"file": "server/prefs/routes.js",
"file": "server/prefs/routes.js",
- "line": 38,
+ "line": 43,
+ "target": "OpenVibe.Chat",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/:id/call",
+ "file": "server/calls/routes.js",
+ "line": 263,
+ "target": "OpenVibe.Chat",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "PUT",
+ "path": "/:id/call",
+ "file": "server/calls/routes.js",
+ "line": 231,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21851,7 +22860,7 @@
@@ -21851,7 +22860,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/:streamId/history",
"path": "/api/chat/:streamId/history",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 538,
+ "line": 550,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21861,7 +22870,7 @@
@@ -21861,7 +22870,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/:streamId/replay",
"path": "/api/chat/:streamId/replay",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 516,
+ "line": 528,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21871,7 +22880,7 @@
@@ -21871,7 +22880,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/:streamId/users",
"path": "/api/chat/:streamId/users",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 681,
+ "line": 693,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21881,7 +22890,7 @@
@@ -21881,7 +22890,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/admin/logs",
"path": "/api/chat/admin/logs",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 777,
+ "line": 793,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21891,7 +22900,7 @@
@@ -21891,7 +22900,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/admin/logs/export",
"path": "/api/chat/admin/logs/export",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 821,
+ "line": 837,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21901,7 +22910,7 @@
@@ -21901,7 +22910,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/chat/admin/purge",
"path": "/api/chat/admin/purge",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 722,
+ "line": 738,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21911,7 +22920,7 @@
@@ -21911,7 +22920,7 @@
"method": "POST",
"method": "POST",
"path": "/api/chat/admin/purge/preview",
"path": "/api/chat/admin/purge/preview",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 690,
+ "line": 706,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21921,7 +22930,7 @@
@@ -21921,7 +22930,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/anon/:anonId",
"path": "/api/chat/anon/:anonId",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 443,
+ "line": 455,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21931,7 +22940,7 @@
@@ -21931,7 +22940,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/anon/:anonId/logs",
"path": "/api/chat/anon/:anonId/logs",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 457,
+ "line": 469,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21941,7 +22950,7 @@
@@ -21941,7 +22950,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/channel/:userId/history",
"path": "/api/chat/channel/:userId/history",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 642,
+ "line": 654,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21951,7 +22960,7 @@
@@ -21951,7 +22960,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/filters/friendly",
"path": "/api/chat/filters/friendly",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 489,
+ "line": 501,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21961,7 +22970,7 @@
@@ -21961,7 +22970,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/gif/providers",
"path": "/api/chat/gif/providers",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 164,
+ "line": 174,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21971,7 +22980,7 @@
@@ -21971,7 +22980,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/gif/search",
"path": "/api/chat/gif/search",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 202,
+ "line": 212,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21981,7 +22990,7 @@
@@ -21981,7 +22990,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/gif/trending",
"path": "/api/chat/gif/trending",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 175,
+ "line": 185,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -21991,7 +23000,7 @@
@@ -21991,7 +23000,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/global/history",
"path": "/api/chat/global/history",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 495,
+ "line": 507,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22011,7 +23020,7 @@
@@ -22011,7 +23020,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/me/export",
"path": "/api/chat/me/export",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 869,
+ "line": 885,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22021,7 +23030,7 @@
@@ -22021,7 +23030,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/online",
"path": "/api/chat/online",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 670,
+ "line": 682,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22031,7 +23040,7 @@
@@ -22031,7 +23040,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/relay-user/:platform/:username",
"path": "/api/chat/relay-user/:platform/:username",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 433,
+ "line": 445,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22041,7 +23050,7 @@
@@ -22041,7 +23050,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/relay-user/:platform/:username/logs",
"path": "/api/chat/relay-user/:platform/:username/logs",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 473,
+ "line": 485,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22051,7 +23060,7 @@
@@ -22051,7 +23060,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/rooms",
"path": "/api/chat/rooms",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 65,
+ "line": 80,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22061,7 +23070,7 @@
@@ -22061,7 +23070,7 @@
"method": "POST",
"method": "POST",
"path": "/api/chat/rooms",
"path": "/api/chat/rooms",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 69,
+ "line": 84,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22071,7 +23080,7 @@
@@ -22071,7 +23080,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/rooms/:slug",
"path": "/api/chat/rooms/:slug",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 73,
+ "line": 88,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22081,7 +23090,7 @@
@@ -22081,7 +23090,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/chat/rooms/:slug",
"path": "/api/chat/rooms/:slug",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 83,
+ "line": 98,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22091,7 +23100,7 @@
@@ -22091,7 +23100,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/rooms/:slug/attachments",
"path": "/api/chat/rooms/:slug/attachments",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 155,
+ "line": 170,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22101,7 +23110,7 @@
@@ -22101,7 +23110,7 @@
"method": "POST",
"method": "POST",
"path": "/api/chat/rooms/:slug/attachments",
"path": "/api/chat/rooms/:slug/attachments",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 161,
+ "line": 176,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22111,7 +23120,7 @@
@@ -22111,7 +23120,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/chat/rooms/:slug/attachments/:service/:resource",
"path": "/api/chat/rooms/:slug/attachments/:service/:resource",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 170,
+ "line": 185,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22121,7 +23130,7 @@
@@ -22121,7 +23130,7 @@
"method": "POST",
"method": "POST",
"path": "/api/chat/rooms/:slug/join",
"path": "/api/chat/rooms/:slug/join",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 114,
+ "line": 129,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22131,7 +23140,7 @@
@@ -22131,7 +23140,7 @@
"method": "POST",
"method": "POST",
"path": "/api/chat/rooms/:slug/leave",
"path": "/api/chat/rooms/:slug/leave",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 120,
+ "line": 135,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22141,7 +23150,7 @@
@@ -22141,7 +23150,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/rooms/:slug/members",
"path": "/api/chat/rooms/:slug/members",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 135,
+ "line": 150,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22151,7 +23160,7 @@
@@ -22151,7 +23160,7 @@
"method": "POST",
"method": "POST",
"path": "/api/chat/rooms/:slug/members",
"path": "/api/chat/rooms/:slug/members",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 141,
+ "line": 156,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22161,7 +23170,7 @@
@@ -22161,7 +23170,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/rooms/:slug/messages",
"path": "/api/chat/rooms/:slug/messages",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 88,
+ "line": 103,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22171,7 +23180,7 @@
@@ -22171,7 +23180,7 @@
"method": "POST",
"method": "POST",
"path": "/api/chat/rooms/:slug/messages",
"path": "/api/chat/rooms/:slug/messages",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 96,
+ "line": 111,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22181,7 +23190,7 @@
@@ -22181,7 +23190,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/chat/rooms/:slug/messages/:id",
"path": "/api/chat/rooms/:slug/messages/:id",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 105,
+ "line": 120,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22191,7 +23200,7 @@
@@ -22191,7 +23200,7 @@
"method": "POST",
"method": "POST",
"path": "/api/chat/rooms/:slug/read",
"path": "/api/chat/rooms/:slug/read",
"file": "server/rooms/routes.js",
"file": "server/rooms/routes.js",
- "line": 130,
+ "line": 145,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22201,7 +23210,7 @@
@@ -22201,7 +23210,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/search",
"path": "/api/chat/search",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 372,
+ "line": 384,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22211,7 +23220,7 @@
@@ -22211,7 +23220,7 @@
"method": "POST",
"method": "POST",
"path": "/api/chat/send",
"path": "/api/chat/send",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 267,
+ "line": 279,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22221,7 +23230,7 @@
@@ -22221,7 +23230,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/user/:userId/history",
"path": "/api/chat/user/:userId/history",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 399,
+ "line": 411,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22231,7 +23240,7 @@
@@ -22231,7 +23240,7 @@
"method": "GET",
"method": "GET",
"path": "/api/chat/user/:username/profile",
"path": "/api/chat/user/:username/profile",
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
- "line": 420,
+ "line": 432,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22241,7 +23250,7 @@
@@ -22241,7 +23250,7 @@
"method": "GET",
"method": "GET",
"path": "/api/dm/blocks",
"path": "/api/dm/blocks",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 418,
+ "line": 433,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22251,7 +23260,7 @@
@@ -22251,7 +23260,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/dm/blocks/:userId",
"path": "/api/dm/blocks/:userId",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 406,
+ "line": 421,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22261,7 +23270,7 @@
@@ -22261,7 +23270,7 @@
"method": "POST",
"method": "POST",
"path": "/api/dm/blocks/:userId",
"path": "/api/dm/blocks/:userId",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 391,
+ "line": 406,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22271,7 +23280,7 @@
@@ -22271,7 +23280,7 @@
"method": "GET",
"method": "GET",
"path": "/api/dm/blocks/check/:userId",
"path": "/api/dm/blocks/check/:userId",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 428,
+ "line": 443,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22281,7 +23290,7 @@
@@ -22281,7 +23290,7 @@
"method": "GET",
"method": "GET",
"path": "/api/dm/conversations",
"path": "/api/dm/conversations",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 66,
+ "line": 81,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22291,7 +23300,7 @@
@@ -22291,7 +23300,7 @@
"method": "POST",
"method": "POST",
"path": "/api/dm/conversations",
"path": "/api/dm/conversations",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 81,
+ "line": 96,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22301,7 +23310,7 @@
@@ -22301,7 +23310,7 @@
"method": "GET",
"method": "GET",
"path": "/api/dm/conversations/:id",
"path": "/api/dm/conversations/:id",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 145,
+ "line": 160,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22311,7 +23320,7 @@
@@ -22311,7 +23320,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/dm/conversations/:id",
"path": "/api/dm/conversations/:id",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 348,
+ "line": 363,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22321,7 +23330,7 @@
@@ -22321,7 +23330,7 @@
"method": "GET",
"method": "GET",
"path": "/api/dm/conversations/:id/messages",
"path": "/api/dm/conversations/:id/messages",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 162,
+ "line": 177,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22331,7 +23340,7 @@
@@ -22331,7 +23340,7 @@
"method": "POST",
"method": "POST",
"path": "/api/dm/conversations/:id/messages",
"path": "/api/dm/conversations/:id/messages",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 180,
+ "line": 195,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22341,7 +23350,7 @@
@@ -22341,7 +23350,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/dm/conversations/:id/messages/:msgId",
"path": "/api/dm/conversations/:id/messages/:msgId",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 438,
+ "line": 453,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22351,7 +23360,7 @@
@@ -22351,7 +23360,7 @@
"method": "POST",
"method": "POST",
"path": "/api/dm/conversations/:id/participants",
"path": "/api/dm/conversations/:id/participants",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 270,
+ "line": 285,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22361,7 +23370,7 @@
@@ -22361,7 +23370,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/dm/conversations/:id/participants/:userId",
"path": "/api/dm/conversations/:id/participants/:userId",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 327,
+ "line": 342,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22371,7 +23380,7 @@
@@ -22371,7 +23380,7 @@
"method": "POST",
"method": "POST",
"path": "/api/dm/conversations/:id/read",
"path": "/api/dm/conversations/:id/read",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 249,
+ "line": 264,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22381,7 +23390,7 @@
@@ -22381,7 +23390,7 @@
"method": "GET",
"method": "GET",
"path": "/api/dm/unread",
"path": "/api/dm/unread",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 367,
+ "line": 382,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22391,7 +23400,7 @@
@@ -22391,7 +23400,7 @@
"method": "GET",
"method": "GET",
"path": "/api/dm/users/search",
"path": "/api/dm/users/search",
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
- "line": 377,
+ "line": 392,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22401,7 +23410,7 @@
@@ -22401,7 +23410,7 @@
"method": "POST",
"method": "POST",
"path": "/api/sounds",
"path": "/api/sounds",
"file": "server/chat/sounds-routes.js",
"file": "server/chat/sounds-routes.js",
- "line": 165,
+ "line": 173,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22411,7 +23420,7 @@
@@ -22411,7 +23420,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/sounds/:id",
"path": "/api/sounds/:id",
"file": "server/chat/sounds-routes.js",
"file": "server/chat/sounds-routes.js",
- "line": 307,
+ "line": 315,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22421,7 +23430,7 @@
@@ -22421,7 +23430,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/sounds/alert/:kind",
"path": "/api/sounds/alert/:kind",
"file": "server/chat/sounds-routes.js",
"file": "server/chat/sounds-routes.js",
- "line": 464,
+ "line": 472,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22431,7 +23440,7 @@
@@ -22431,7 +23440,7 @@
"method": "POST",
"method": "POST",
"path": "/api/sounds/alert/:kind",
"path": "/api/sounds/alert/:kind",
"file": "server/chat/sounds-routes.js",
"file": "server/chat/sounds-routes.js",
- "line": 425,
+ "line": 433,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22441,7 +23450,7 @@
@@ -22441,7 +23450,7 @@
"method": "GET",
"method": "GET",
"path": "/api/sounds/alert/mine",
"path": "/api/sounds/alert/mine",
"file": "server/chat/sounds-routes.js",
"file": "server/chat/sounds-routes.js",
- "line": 414,
+ "line": 422,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22451,7 +23460,7 @@
@@ -22451,7 +23460,7 @@
"method": "GET",
"method": "GET",
"path": "/api/sounds/all/:streamId",
"path": "/api/sounds/all/:streamId",
"file": "server/chat/sounds-routes.js",
"file": "server/chat/sounds-routes.js",
- "line": 154,
+ "line": 162,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22461,7 +23470,7 @@
@@ -22461,7 +23470,7 @@
"method": "GET",
"method": "GET",
"path": "/api/sounds/channel/:userId",
"path": "/api/sounds/channel/:userId",
"file": "server/chat/sounds-routes.js",
"file": "server/chat/sounds-routes.js",
- "line": 143,
+ "line": 151,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22471,7 +23480,7 @@
@@ -22471,7 +23480,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/sounds/command",
"path": "/api/sounds/command",
"file": "server/chat/sounds-routes.js",
"file": "server/chat/sounds-routes.js",
- "line": 334,
+ "line": 342,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22481,87 +23490,7 @@
@@ -22481,87 +23490,7 @@
"method": "GET",
"method": "GET",
"path": "/api/sounds/file/:filename",
"path": "/api/sounds/file/:filename",
"file": "server/chat/sounds-routes.js",
"file": "server/chat/sounds-routes.js",
- "line": 392,
- "target": "OpenVibe.Chat",
- "disposition": "keep",
- "wave": "-",
- "note": "The service is the authority for its own API and pages."
- },
- {
- "method": "GET",
- "path": "/api/streams/:id/call",
- "file": "server/calls/routes.js",
- "line": 253,
- "target": "OpenVibe.Chat",
- "disposition": "keep",
- "wave": "-",
- "note": "The service is the authority for its own API and pages."
- },
- {
- "method": "PUT",
- "path": "/api/streams/:id/call",
- "file": "server/calls/routes.js",
- "line": 221,
- "target": "OpenVibe.Chat",
- "disposition": "keep",
- "wave": "-",
- "note": "The service is the authority for its own API and pages."
- },
- {
- "method": "GET",
- "path": "/api/streams/voice-channels",
- "file": "server/calls/routes.js",
- "line": 37,
- "target": "OpenVibe.Chat",
- "disposition": "keep",
- "wave": "-",
- "note": "The service is the authority for its own API and pages."
- },
- {
- "method": "POST",
- "path": "/api/streams/voice-channels",
- "file": "server/calls/routes.js",
- "line": 58,
- "target": "OpenVibe.Chat",
- "disposition": "keep",
- "wave": "-",
- "note": "The service is the authority for its own API and pages."
- },
- {
- "method": "DELETE",
- "path": "/api/streams/voice-channels/:channelId",
- "file": "server/calls/routes.js",
- "line": 70,
- "target": "OpenVibe.Chat",
- "disposition": "keep",
- "wave": "-",
- "note": "The service is the authority for its own API and pages."
- },
- {
- "method": "GET",
- "path": "/api/streams/voice-channels/:channelId",
- "file": "server/calls/routes.js",
- "line": 47,
- "target": "OpenVibe.Chat",
- "disposition": "keep",
- "wave": "-",
- "note": "The service is the authority for its own API and pages."
- },
- {
- "method": "POST",
- "path": "/api/streams/voice-channels/call-user",
- "file": "server/calls/routes.js",
- "line": 108,
- "target": "OpenVibe.Chat",
- "disposition": "keep",
- "wave": "-",
- "note": "The service is the authority for its own API and pages."
- },
- {
- "method": "POST",
- "path": "/api/streams/voice-channels/call-user/respond",
- "file": "server/calls/routes.js",
- "line": 171,
+ "line": 400,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22571,7 +23500,7 @@
@@ -22571,7 +23500,7 @@
"method": "GET",
"method": "GET",
"path": "/api/tts/admin/settings",
"path": "/api/tts/admin/settings",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 112,
+ "line": 113,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22581,7 +23510,7 @@
@@ -22581,7 +23510,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/tts/admin/settings",
"path": "/api/tts/admin/settings",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 130,
+ "line": 132,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22591,7 +23520,7 @@
@@ -22591,7 +23520,7 @@
"method": "POST",
"method": "POST",
"path": "/api/tts/admin/test",
"path": "/api/tts/admin/test",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 162,
+ "line": 165,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22601,7 +23530,7 @@
@@ -22601,7 +23530,7 @@
"method": "GET",
"method": "GET",
"path": "/api/tts/audio/:file",
"path": "/api/tts/audio/:file",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 260,
+ "line": 267,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22611,7 +23540,7 @@
@@ -22611,7 +23540,7 @@
"method": "GET",
"method": "GET",
"path": "/api/tts/queue",
"path": "/api/tts/queue",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 217,
+ "line": 220,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22621,7 +23550,7 @@
@@ -22621,7 +23550,7 @@
"method": "POST",
"method": "POST",
"path": "/api/tts/queue/:id/report",
"path": "/api/tts/queue/:id/report",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 247,
+ "line": 254,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22631,7 +23560,7 @@
@@ -22631,7 +23560,7 @@
"method": "POST",
"method": "POST",
"path": "/api/tts/queue/clear",
"path": "/api/tts/queue/clear",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 237,
+ "line": 244,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22641,7 +23570,7 @@
@@ -22641,7 +23570,7 @@
"method": "POST",
"method": "POST",
"path": "/api/tts/queue/skip",
"path": "/api/tts/queue/skip",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 225,
+ "line": 232,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22651,7 +23580,7 @@
@@ -22651,7 +23580,7 @@
"method": "GET",
"method": "GET",
"path": "/api/tts/settings",
"path": "/api/tts/settings",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 90,
+ "line": 91,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -22661,7 +23590,7 @@
@@ -22661,7 +23590,7 @@
"method": "GET",
"method": "GET",
"path": "/api/tts/voices",
"path": "/api/tts/voices",
"file": "server/chat/tts-routes.js",
"file": "server/chat/tts-routes.js",
- "line": 80,
+ "line": 81,
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -23016,6 +23945,66 @@
@@ -23016,6 +23945,66 @@
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/voice-channels",
+ "file": "server/calls/routes.js",
+ "line": 47,
+ "target": "OpenVibe.Chat",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/voice-channels",
+ "file": "server/calls/routes.js",
+ "line": 68,
+ "target": "OpenVibe.Chat",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "DELETE",
+ "path": "/voice-channels/:channelId",
+ "file": "server/calls/routes.js",
+ "line": 80,
+ "target": "OpenVibe.Chat",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/voice-channels/:channelId",
+ "file": "server/calls/routes.js",
+ "line": 57,
+ "target": "OpenVibe.Chat",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/voice-channels/call-user",
+ "file": "server/calls/routes.js",
+ "line": 118,
+ "target": "OpenVibe.Chat",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/voice-channels/call-user/respond",
+ "file": "server/calls/routes.js",
+ "line": 181,
+ "target": "OpenVibe.Chat",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
}
}
],
],
"ws": {
"ws": {
@@ -23033,12 +24022,12 @@
@@ -23033,12 +24022,12 @@
{
{
"path": "/ws/call",
"path": "/ws/call",
"file": "server/app.js",
"file": "server/app.js",
- "line": 244
+ "line": 258
},
},
{
{
"path": "/ws/chat",
"path": "/ws/chat",
"file": "server/app.js",
"file": "server/app.js",
- "line": 245
+ "line": 259
},
},
{
{
"path": "/ws/call",
"path": "/ws/call",
@@ -23083,6 +24072,12 @@
@@ -23083,6 +24072,12 @@
"ALLOWED_ORIGINS": [
"ALLOWED_ORIGINS": [
"server/config.js"
"server/config.js"
],
],
+ "CHAT_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "CHAT_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"CHAT_DB_PATH": [
"CHAT_DB_PATH": [
"server/config.js"
"server/config.js"
],
],
@@ -23248,6 +24243,29 @@
@@ -23248,6 +24243,29 @@
"timeout": true,
"timeout": true,
"retry": false
"retry": false
},
},
+ {
+ "file": "server/chat/account-data.js",
+ "targets": [
+ {
+ "service": "network",
+ "refs": [
+ {
+ "via": "/internal/events",
+ "line": 4
+ },
+ {
+ "via": "networkInternalUrl",
+ "line": 164
+ }
+ ]
+ }
+ ],
+ "auth": [
+ "none-detected"
+ ],
+ "timeout": true,
+ "retry": true
+ },
{
{
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
"targets": [
"targets": [
@@ -23256,15 +24274,15 @@
@@ -23256,15 +24274,15 @@
"refs": [
"refs": [
{
{
"via": "searchUrl",
"via": "searchUrl",
- "line": 111
+ "line": 121
},
},
{
{
"via": "searchUrl",
"via": "searchUrl",
- "line": 117
+ "line": 127
},
},
{
{
"via": "searchUrl",
"via": "searchUrl",
- "line": 212
+ "line": 222
}
}
]
]
}
}
@@ -23440,7 +24458,7 @@
@@ -23440,7 +24458,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 56,
+ "line": 71,
"file": "server/chat/dm-routes.js",
"file": "server/chat/dm-routes.js",
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
@@ -23451,7 +24469,7 @@
@@ -23451,7 +24469,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": 21600000,
"intervalMs": 21600000,
- "line": 188,
+ "line": 211,
"file": "server/events/consumer.js",
"file": "server/events/consumer.js",
"target": "OpenVibe.Chat",
"target": "OpenVibe.Chat",
"disposition": "keep",
"disposition": "keep",
@@ -23494,7 +24512,7 @@
@@ -23494,7 +24512,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 35,
+ "testFiles": 48,
"ci": true
"ci": true
},
},
{
{
@@ -23502,13 +24520,13 @@
@@ -23502,13 +24520,13 @@
"service": "openre",
"service": "openre",
"present": true,
"present": true,
"git": {
"git": {
- "head": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",
+ "head": "c77ec2a9a1e350fb4ae1c646ec74693fae4f2fa3",
"branch": "main",
"branch": "main",
- "originMain": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",
- "committedAt": "2026-09-26T06:08:48-07:00"
+ "originMain": "c77ec2a9a1e350fb4ae1c646ec74693fae4f2fa3",
+ "committedAt": "2026-09-27T20:06:06-07:00"
},
},
- "sourceFiles": 35,
- "loc": 4753,
+ "sourceFiles": 36,
+ "loc": 4806,
"tables": [
"tables": [
{
{
"table": "stream_definitions",
"table": "stream_definitions",
@@ -23754,7 +24772,7 @@
@@ -23754,7 +24772,7 @@
"method": "GET",
"method": "GET",
"path": "/play/:file",
"path": "/play/:file",
"file": "server/app.js",
"file": "server/app.js",
- "line": 90,
+ "line": 92,
"target": "OpenRe.Stream",
"target": "OpenRe.Stream",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -23764,7 +24782,7 @@
@@ -23764,7 +24782,7 @@
"method": "GET",
"method": "GET",
"path": "/robots.txt",
"path": "/robots.txt",
"file": "server/app.js",
"file": "server/app.js",
- "line": 108,
+ "line": 110,
"target": "OpenRe.Stream",
"target": "OpenRe.Stream",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -23976,6 +24994,12 @@
@@ -23976,6 +24994,12 @@
"paths": []
"paths": []
},
},
"env": {
"env": {
+ "OPENRE_LIMITS_MINUTE": [
+ "server/api/actor-limits.js"
+ ],
+ "OPENRE_LIMITS_HOUR": [
+ "server/api/actor-limits.js"
+ ],
"RELEASE_COMMIT": [
"RELEASE_COMMIT": [
"server/app.js",
"server/app.js",
"OpenVibe.Shared/release.js"
"OpenVibe.Shared/release.js"
@@ -24253,7 +25277,7 @@
@@ -24253,7 +25277,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 19,
+ "testFiles": 21,
"ci": true
"ci": true
},
},
{
{
@@ -24261,13 +25285,13 @@
@@ -24261,13 +25285,13 @@
"service": "billing",
"service": "billing",
"present": true,
"present": true,
"git": {
"git": {
- "head": "180e246a3a344c062f1c7435303f4aa748f17046",
+ "head": "f24684bb84ec1670bd08670891e6742fa433a548",
"branch": "main",
"branch": "main",
- "originMain": "180e246a3a344c062f1c7435303f4aa748f17046",
- "committedAt": "2026-09-26T06:09:39-07:00"
+ "originMain": "f24684bb84ec1670bd08670891e6742fa433a548",
+ "committedAt": "2026-09-27T20:08:06-07:00"
},
},
- "sourceFiles": 37,
- "loc": 5325,
+ "sourceFiles": 38,
+ "loc": 5452,
"tables": [
"tables": [
{
{
"table": "accounts",
"table": "accounts",
@@ -24399,7 +25423,7 @@
@@ -24399,7 +25423,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 64,
+ "line": 66,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24409,7 +25433,7 @@
@@ -24409,7 +25433,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 79,
+ "line": 81,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24419,7 +25443,7 @@
@@ -24419,7 +25443,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/admin/adjustments",
"path": "/api/v1/admin/adjustments",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 286,
+ "line": 292,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24429,7 +25453,7 @@
@@ -24429,7 +25453,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/admin/freeze",
"path": "/api/v1/admin/freeze",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 242,
+ "line": 248,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24439,7 +25463,7 @@
@@ -24439,7 +25463,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/admin/freeze",
"path": "/api/v1/admin/freeze",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 243,
+ "line": 249,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24449,7 +25473,7 @@
@@ -24449,7 +25473,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/admin/import-holds",
"path": "/api/v1/admin/import-holds",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 301,
+ "line": 307,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24459,7 +25483,7 @@
@@ -24459,7 +25483,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/admin/provider-accounts",
"path": "/api/v1/admin/provider-accounts",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 275,
+ "line": 281,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24469,7 +25493,7 @@
@@ -24469,7 +25493,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/admin/provider-accounts",
"path": "/api/v1/admin/provider-accounts",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 279,
+ "line": 285,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24479,7 +25503,7 @@
@@ -24479,7 +25503,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/admin/provider-events",
"path": "/api/v1/admin/provider-events",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 291,
+ "line": 297,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24489,7 +25513,7 @@
@@ -24489,7 +25513,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/admin/provider-events/:id/reprocess",
"path": "/api/v1/admin/provider-events/:id/reprocess",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 296,
+ "line": 302,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24499,7 +25523,7 @@
@@ -24499,7 +25523,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/admin/reconcile",
"path": "/api/v1/admin/reconcile",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 251,
+ "line": 257,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24509,7 +25533,7 @@
@@ -24509,7 +25533,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/admin/reconciliations",
"path": "/api/v1/admin/reconciliations",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 256,
+ "line": 262,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24519,7 +25543,7 @@
@@ -24519,7 +25543,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/admin/reconciliations/:id",
"path": "/api/v1/admin/reconciliations/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 267,
+ "line": 273,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24529,7 +25553,7 @@
@@ -24529,7 +25553,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/admin/sweep",
"path": "/api/v1/admin/sweep",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 300,
+ "line": 306,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24539,7 +25563,7 @@
@@ -24539,7 +25563,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/balances/:subject",
"path": "/api/v1/balances/:subject",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 216,
+ "line": 222,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24549,7 +25573,7 @@
@@ -24549,7 +25573,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/cashouts",
"path": "/api/v1/cashouts",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 143,
+ "line": 149,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24559,7 +25583,7 @@
@@ -24559,7 +25583,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/cashouts",
"path": "/api/v1/cashouts",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 138,
+ "line": 144,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24569,7 +25593,7 @@
@@ -24569,7 +25593,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/cashouts/:id",
"path": "/api/v1/cashouts/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 147,
+ "line": 153,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24579,7 +25603,7 @@
@@ -24579,7 +25603,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/cashouts/:id/approve",
"path": "/api/v1/cashouts/:id/approve",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 152,
+ "line": 158,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24589,7 +25613,7 @@
@@ -24589,7 +25613,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/cashouts/:id/deny",
"path": "/api/v1/cashouts/:id/deny",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 157,
+ "line": 163,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24599,7 +25623,7 @@
@@ -24599,7 +25623,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/entitlements/:subject",
"path": "/api/v1/entitlements/:subject",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 200,
+ "line": 206,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24609,7 +25633,7 @@
@@ -24609,7 +25633,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/intents",
"path": "/api/v1/intents",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 64,
+ "line": 70,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24619,7 +25643,7 @@
@@ -24619,7 +25643,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/intents/:id",
"path": "/api/v1/intents/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 87,
+ "line": 93,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24629,7 +25653,7 @@
@@ -24629,7 +25653,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/intents/:id/capture",
"path": "/api/v1/intents/:id/capture",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 92,
+ "line": 98,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24639,7 +25663,7 @@
@@ -24639,7 +25663,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/purchases/settle",
"path": "/api/v1/purchases/settle",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 103,
+ "line": 109,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24649,7 +25673,7 @@
@@ -24649,7 +25673,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/rates",
"path": "/api/v1/rates",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 52,
+ "line": 58,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24659,7 +25683,7 @@
@@ -24659,7 +25683,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/recycle",
"path": "/api/v1/recycle",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 130,
+ "line": 136,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24669,7 +25693,7 @@
@@ -24669,7 +25693,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/subscriptions",
"path": "/api/v1/subscriptions",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 183,
+ "line": 189,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24679,7 +25703,7 @@
@@ -24679,7 +25703,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/subscriptions",
"path": "/api/v1/subscriptions",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 163,
+ "line": 169,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24689,7 +25713,7 @@
@@ -24689,7 +25713,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/subscriptions/:id",
"path": "/api/v1/subscriptions/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 191,
+ "line": 197,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24699,7 +25723,7 @@
@@ -24699,7 +25723,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/subscriptions/:id/cancel",
"path": "/api/v1/subscriptions/:id/cancel",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 196,
+ "line": 202,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24709,7 +25733,7 @@
@@ -24709,7 +25733,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/transactions",
"path": "/api/v1/transactions",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 218,
+ "line": 224,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24719,7 +25743,7 @@
@@ -24719,7 +25743,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/transactions/:id",
"path": "/api/v1/transactions/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 234,
+ "line": 240,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24729,7 +25753,7 @@
@@ -24729,7 +25753,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/transfers",
"path": "/api/v1/transfers",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 115,
+ "line": 121,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24739,7 +25763,7 @@
@@ -24739,7 +25763,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/transfers/:id/refund",
"path": "/api/v1/transfers/:id/refund",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 123,
+ "line": 129,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24929,7 +25953,7 @@
@@ -24929,7 +25953,7 @@
"method": "GET",
"method": "GET",
"path": "/robots.txt",
"path": "/robots.txt",
"file": "server/app.js",
"file": "server/app.js",
- "line": 85,
+ "line": 89,
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -24990,6 +26014,15 @@
@@ -24990,6 +26014,15 @@
"BILLING_AUDIENCE": [
"BILLING_AUDIENCE": [
"server/config.js"
"server/config.js"
],
],
+ "BILLING_LIMITS": [
+ "server/config.js"
+ ],
+ "BILLING_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "BILLING_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"OV_OAUTH_CLIENT_ID": [
"OV_OAUTH_CLIENT_ID": [
"server/config.js"
"server/config.js"
],
],
@@ -25179,7 +26212,7 @@
@@ -25179,7 +26212,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 21,
+ "testFiles": 22,
"ci": true
"ci": true
},
},
{
{
@@ -25187,13 +26220,13 @@
@@ -25187,13 +26220,13 @@
"service": "tips",
"service": "tips",
"present": true,
"present": true,
"git": {
"git": {
- "head": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",
+ "head": "13986b59e697d12a328a4f12e993295445ca40be",
"branch": "main",
"branch": "main",
- "originMain": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",
- "committedAt": "2026-09-26T06:18:52-07:00"
+ "originMain": "13986b59e697d12a328a4f12e993295445ca40be",
+ "committedAt": "2026-09-27T20:01:20-07:00"
},
},
- "sourceFiles": 29,
- "loc": 5267,
+ "sourceFiles": 30,
+ "loc": 5346,
"tables": [
"tables": [
{
{
"table": "settings",
"table": "settings",
@@ -25353,7 +26386,7 @@
@@ -25353,7 +26386,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 79,
+ "line": 80,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25363,7 +26396,7 @@
@@ -25363,7 +26396,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 85,
+ "line": 86,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25373,7 +26406,7 @@
@@ -25373,7 +26406,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/checkout",
"path": "/api/v1/checkout",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 194,
+ "line": 209,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25383,7 +26416,7 @@
@@ -25383,7 +26416,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/goals",
"path": "/api/v1/goals",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 248,
+ "line": 264,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25393,7 +26426,7 @@
@@ -25393,7 +26426,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/goals",
"path": "/api/v1/goals",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 262,
+ "line": 278,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25403,7 +26436,7 @@
@@ -25403,7 +26436,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/goals/:id",
"path": "/api/v1/goals/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 256,
+ "line": 272,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25413,7 +26446,7 @@
@@ -25413,7 +26446,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/goals/:id",
"path": "/api/v1/goals/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 274,
+ "line": 290,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25423,7 +26456,7 @@
@@ -25423,7 +26456,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/goals/:id/close",
"path": "/api/v1/goals/:id/close",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 275,
+ "line": 291,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25433,7 +26466,7 @@
@@ -25433,7 +26466,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/interactions",
"path": "/api/v1/interactions",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 200,
+ "line": 215,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25443,7 +26476,7 @@
@@ -25443,7 +26476,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/interactions/:id",
"path": "/api/v1/interactions/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 219,
+ "line": 234,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25453,7 +26486,7 @@
@@ -25453,7 +26486,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/interactions/:id/${action}",
"path": "/api/v1/interactions/:id/${action}",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 350,
+ "line": 367,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25463,7 +26496,7 @@
@@ -25463,7 +26496,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/interactions/external",
"path": "/api/v1/interactions/external",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 232,
+ "line": 248,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25473,7 +26506,7 @@
@@ -25473,7 +26506,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/me/erase",
"path": "/api/v1/me/erase",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 125,
+ "line": 134,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25483,7 +26516,7 @@
@@ -25483,7 +26516,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/me/export",
"path": "/api/v1/me/export",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 124,
+ "line": 131,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25493,7 +26526,7 @@
@@ -25493,7 +26526,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/media-requests",
"path": "/api/v1/media-requests",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 197,
+ "line": 212,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25503,7 +26536,7 @@
@@ -25503,7 +26536,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/moderation",
"path": "/api/v1/moderation",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 338,
+ "line": 355,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25513,7 +26546,7 @@
@@ -25513,7 +26546,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/moderation/log",
"path": "/api/v1/moderation/log",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 344,
+ "line": 361,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25523,7 +26556,7 @@
@@ -25523,7 +26556,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/moderators",
"path": "/api/v1/moderators",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 358,
+ "line": 375,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25533,7 +26566,7 @@
@@ -25533,7 +26566,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/moderators",
"path": "/api/v1/moderators",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 363,
+ "line": 380,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25543,7 +26576,7 @@
@@ -25543,7 +26576,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/moderators/:subject/remove",
"path": "/api/v1/moderators/:subject/remove",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 370,
+ "line": 387,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25553,7 +26586,7 @@
@@ -25553,7 +26586,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/overlay-configs",
"path": "/api/v1/overlay-configs",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 301,
+ "line": 318,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25563,7 +26596,7 @@
@@ -25563,7 +26596,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/overlay-configs",
"path": "/api/v1/overlay-configs",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 312,
+ "line": 329,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25573,7 +26606,7 @@
@@ -25573,7 +26606,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/overlay-configs/:id",
"path": "/api/v1/overlay-configs/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 306,
+ "line": 323,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25583,7 +26616,7 @@
@@ -25583,7 +26616,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/overlay-configs/:id",
"path": "/api/v1/overlay-configs/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 318,
+ "line": 335,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25593,7 +26626,7 @@
@@ -25593,7 +26626,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/overlay-tokens",
"path": "/api/v1/overlay-tokens",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 278,
+ "line": 294,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25603,7 +26636,7 @@
@@ -25603,7 +26636,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/overlay-tokens",
"path": "/api/v1/overlay-tokens",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 283,
+ "line": 300,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25613,7 +26646,7 @@
@@ -25613,7 +26646,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/overlay-tokens/:id/revoke",
"path": "/api/v1/overlay-tokens/:id/revoke",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 294,
+ "line": 311,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25623,7 +26656,7 @@
@@ -25623,7 +26656,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/paid-messages",
"path": "/api/v1/paid-messages",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 195,
+ "line": 210,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25633,7 +26666,7 @@
@@ -25633,7 +26666,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/profiles/:creator",
"path": "/api/v1/profiles/:creator",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 93,
+ "line": 100,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25643,7 +26676,7 @@
@@ -25643,7 +26676,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/profiles/:creator",
"path": "/api/v1/profiles/:creator",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 127,
+ "line": 136,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25653,7 +26686,7 @@
@@ -25653,7 +26686,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/profiles/:creator/supporters",
"path": "/api/v1/profiles/:creator/supporters",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 106,
+ "line": 113,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25663,7 +26696,7 @@
@@ -25663,7 +26696,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/profiles/:creator/totals",
"path": "/api/v1/profiles/:creator/totals",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 146,
+ "line": 155,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25673,7 +26706,7 @@
@@ -25673,7 +26706,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/simulate",
"path": "/api/v1/simulate",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 377,
+ "line": 395,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -25683,7 +26716,7 @@
@@ -25683,7 +26716,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/tts-requests",
"path": "/api/v1/tts-requests",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 196,
+ "line": 211,
"target": "OpenVibe.Tips",
"target": "OpenVibe.Tips",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26042,6 +27075,12 @@
@@ -26042,6 +27075,12 @@
"TIPS_MAX_PENDING_CHECKOUTS": [
"TIPS_MAX_PENDING_CHECKOUTS": [
"server/config.js"
"server/config.js"
],
],
+ "TIPS_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "TIPS_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"TIPS_JOBS": [
"TIPS_JOBS": [
"server/config.js"
"server/config.js"
],
],
@@ -26138,7 +27177,7 @@
@@ -26138,7 +27177,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 16,
+ "testFiles": 17,
"ci": true
"ci": true
},
},
{
{
@@ -26146,13 +27185,13 @@
@@ -26146,13 +27185,13 @@
"service": "vip",
"service": "vip",
"present": true,
"present": true,
"git": {
"git": {
- "head": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",
+ "head": "95b3e196daa152c2e7f8e940a1f02b7fe32706ba",
"branch": "main",
"branch": "main",
- "originMain": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",
- "committedAt": "2026-09-26T06:21:19-07:00"
+ "originMain": "95b3e196daa152c2e7f8e940a1f02b7fe32706ba",
+ "committedAt": "2026-09-27T20:01:51-07:00"
},
},
- "sourceFiles": 29,
- "loc": 4211,
+ "sourceFiles": 30,
+ "loc": 4293,
"tables": [
"tables": [
{
{
"table": "settings",
"table": "settings",
@@ -26268,7 +27307,7 @@
@@ -26268,7 +27307,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 87,
+ "line": 88,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26278,7 +27317,7 @@
@@ -26278,7 +27317,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 89,
+ "line": 90,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26288,7 +27327,7 @@
@@ -26288,7 +27327,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/checkout",
"path": "/api/v1/checkout",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 210,
+ "line": 220,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26298,7 +27337,7 @@
@@ -26298,7 +27337,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/creators/:ref",
"path": "/api/v1/creators/:ref",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 99,
+ "line": 107,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26308,7 +27347,7 @@
@@ -26308,7 +27347,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/creators/:ref/card",
"path": "/api/v1/creators/:ref/card",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 111,
+ "line": 119,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26318,7 +27357,7 @@
@@ -26318,7 +27357,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/creators/:ref/members",
"path": "/api/v1/creators/:ref/members",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 338,
+ "line": 355,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26328,7 +27367,7 @@
@@ -26328,7 +27367,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/entitlements/check",
"path": "/api/v1/entitlements/check",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 276,
+ "line": 292,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26338,7 +27377,7 @@
@@ -26338,7 +27377,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entitlements/check",
"path": "/api/v1/entitlements/check",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 277,
+ "line": 293,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26348,7 +27387,7 @@
@@ -26348,7 +27387,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/memberships/:creator/cancel",
"path": "/api/v1/memberships/:creator/cancel",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 238,
+ "line": 249,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26358,7 +27397,7 @@
@@ -26358,7 +27397,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/memberships/:creator/preferences",
"path": "/api/v1/memberships/:creator/preferences",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 243,
+ "line": 254,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26368,7 +27407,7 @@
@@ -26368,7 +27407,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/memberships/:subject",
"path": "/api/v1/memberships/:subject",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 222,
+ "line": 232,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26378,7 +27417,7 @@
@@ -26378,7 +27417,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/perks",
"path": "/api/v1/perks",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 173,
+ "line": 181,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26388,7 +27427,7 @@
@@ -26388,7 +27427,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/perks",
"path": "/api/v1/perks",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 180,
+ "line": 188,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26398,7 +27437,7 @@
@@ -26398,7 +27437,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/perks/:id",
"path": "/api/v1/perks/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 187,
+ "line": 195,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26408,7 +27447,7 @@
@@ -26408,7 +27447,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/plans",
"path": "/api/v1/plans",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 118,
+ "line": 126,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26418,7 +27457,7 @@
@@ -26418,7 +27457,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/plans",
"path": "/api/v1/plans",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 139,
+ "line": 147,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26428,7 +27467,7 @@
@@ -26428,7 +27467,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/plans/:id",
"path": "/api/v1/plans/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 132,
+ "line": 140,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26438,7 +27477,7 @@
@@ -26438,7 +27477,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/plans/:id",
"path": "/api/v1/plans/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 155,
+ "line": 163,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26448,7 +27487,7 @@
@@ -26448,7 +27487,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/plans/:id/archive",
"path": "/api/v1/plans/:id/archive",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 167,
+ "line": 175,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26458,7 +27497,7 @@
@@ -26458,7 +27497,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/plans/:id/publish",
"path": "/api/v1/plans/:id/publish",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 162,
+ "line": 170,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26468,7 +27507,7 @@
@@ -26468,7 +27507,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/plans/:id/versions",
"path": "/api/v1/plans/:id/versions",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 133,
+ "line": 141,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26478,7 +27517,7 @@
@@ -26478,7 +27517,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/policies",
"path": "/api/v1/policies",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 280,
+ "line": 296,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26488,7 +27527,7 @@
@@ -26488,7 +27527,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/policies",
"path": "/api/v1/policies",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 305,
+ "line": 321,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26498,7 +27537,7 @@
@@ -26498,7 +27537,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/policies/:id",
"path": "/api/v1/policies/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 313,
+ "line": 329,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26508,7 +27547,7 @@
@@ -26508,7 +27547,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/policies/:id",
"path": "/api/v1/policies/:id",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 299,
+ "line": 315,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26518,7 +27557,7 @@
@@ -26518,7 +27557,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/policies/evaluate",
"path": "/api/v1/policies/evaluate",
"file": "server/api/v1.js",
"file": "server/api/v1.js",
- "line": 319,
+ "line": 336,
"target": "OpenVibe.VIP",
"target": "OpenVibe.VIP",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -26779,6 +27818,12 @@
@@ -26779,6 +27818,12 @@
"VIP_MEMBER_COUNT_TTL_MS": [
"VIP_MEMBER_COUNT_TTL_MS": [
"server/config.js"
"server/config.js"
],
],
+ "VIP_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "VIP_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"MIN_CLIENT_RELEASE": [
"MIN_CLIENT_RELEASE": [
"OpenVibe.Shared/release.js"
"OpenVibe.Shared/release.js"
],
],
@@ -26852,7 +27897,7 @@
@@ -26852,7 +27897,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 13,
+ "testFiles": 14,
"ci": true
"ci": true
},
},
{
{
@@ -26860,14 +27905,20 @@
@@ -26860,14 +27905,20 @@
"service": "ai",
"service": "ai",
"present": true,
"present": true,
"git": {
"git": {
- "head": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",
+ "head": "6c8b8338be936cbd3a6f50dee3f790807f145a0e",
"branch": "main",
"branch": "main",
- "originMain": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",
- "committedAt": "2026-09-26T06:09:19-07:00"
+ "originMain": "6c8b8338be936cbd3a6f50dee3f790807f145a0e",
+ "committedAt": "2026-09-27T20:07:22-07:00"
},
},
- "sourceFiles": 38,
- "loc": 6339,
+ "sourceFiles": 44,
+ "loc": 7919,
"tables": [
"tables": [
+ {
+ "table": "subject_credentials",
+ "file": "server/credentials.js",
+ "line": 27,
+ "via": "repo"
+ },
{
{
"table": "providers",
"table": "providers",
"file": "server/db.js",
"file": "server/db.js",
@@ -26982,7 +28033,7 @@
@@ -26982,7 +28033,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/app.js",
"file": "server/app.js",
- "line": 58,
+ "line": 60,
"target": "OpenVibe.AI",
"target": "OpenVibe.AI",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27058,6 +28109,36 @@
@@ -27058,6 +28109,36 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "DELETE",
+ "path": "/api/v1/attribution-quotas/:attribution",
+ "file": "server/api/attribution-quotas.js",
+ "line": 63,
+ "target": "OpenVibe.AI",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/attribution-quotas/:attribution",
+ "file": "server/api/attribution-quotas.js",
+ "line": 60,
+ "target": "OpenVibe.AI",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "PUT",
+ "path": "/api/v1/attribution-quotas/:attribution",
+ "file": "server/api/attribution-quotas.js",
+ "line": 49,
+ "target": "OpenVibe.AI",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/audit",
"path": "/api/v1/audit",
@@ -27088,6 +28169,36 @@
@@ -27088,6 +28169,36 @@
"wave": "-",
"wave": "-",
"note": "The service is the authority for its own API and pages."
"note": "The service is the authority for its own API and pages."
},
},
+ {
+ "method": "DELETE",
+ "path": "/api/v1/credentials/:subject",
+ "file": "server/credentials.js",
+ "line": 152,
+ "target": "OpenVibe.AI",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/api/v1/credentials/:subject",
+ "file": "server/credentials.js",
+ "line": 149,
+ "target": "OpenVibe.AI",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "PUT",
+ "path": "/api/v1/credentials/:subject",
+ "file": "server/credentials.js",
+ "line": 142,
+ "target": "OpenVibe.AI",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
{
{
"method": "GET",
"method": "GET",
"path": "/api/v1/models",
"path": "/api/v1/models",
@@ -27492,7 +28603,7 @@
@@ -27492,7 +28603,7 @@
"method": "GET",
"method": "GET",
"path": "/robots.txt",
"path": "/robots.txt",
"file": "server/app.js",
"file": "server/app.js",
- "line": 54,
+ "line": 56,
"target": "OpenVibe.AI",
"target": "OpenVibe.AI",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27535,13 +28646,10 @@
@@ -27535,13 +28646,10 @@
"OV_NETWORK_ISSUER": [
"OV_NETWORK_ISSUER": [
"server/config.js"
"server/config.js"
],
],
- "OV_NETWORK_PUBLIC_KEY": [
- "server/config.js"
- ],
- "AI_NS_REQUIRED": [
+ "AI_CREDENTIALS_KEY": [
"server/config.js"
"server/config.js"
],
],
- "AI_NS_FALLBACK": [
+ "OV_NETWORK_PUBLIC_KEY": [
"server/config.js"
"server/config.js"
],
],
"AI_DB_PATH": [
"AI_DB_PATH": [
@@ -27579,6 +28687,42 @@
@@ -27579,6 +28687,42 @@
"AI_HTTP_SEAM_URL": [
"AI_HTTP_SEAM_URL": [
"server/config.js"
"server/config.js"
],
],
+ "AI_LOCAL_LLM_URL": [
+ "server/config.js"
+ ],
+ "AI_LOCAL_LLM_MODEL": [
+ "server/config.js"
+ ],
+ "AI_LOCAL_LLM_TIMEOUT_MS": [
+ "server/config.js"
+ ],
+ "AI_MEDIA_ANALYSIS_DIR": [
+ "server/config.js"
+ ],
+ "AI_MEDIA_ANALYSIS_MAX_BYTES": [
+ "server/config.js"
+ ],
+ "AI_MEDIA_ANALYSIS_DISK_RESERVE_BYTES": [
+ "server/config.js"
+ ],
+ "AI_MEDIA_ANALYSIS_FETCH_TIMEOUT_MS": [
+ "server/config.js"
+ ],
+ "AI_MEDIA_SCENE_THRESHOLD": [
+ "server/config.js"
+ ],
+ "AI_MEDIA_STT_WINDOW_SEC": [
+ "server/config.js"
+ ],
+ "AI_MEDIA_STREAM": [
+ "server/config.js"
+ ],
+ "FFMPEG_BIN": [
+ "server/config.js"
+ ],
+ "FFPROBE_BIN": [
+ "server/config.js"
+ ],
"AI_STUB_FALLBACK": [
"AI_STUB_FALLBACK": [
"server/config.js"
"server/config.js"
],
],
@@ -27675,6 +28819,9 @@
@@ -27675,6 +28819,9 @@
"AI_FETCH_ALLOW_HOSTS": [
"AI_FETCH_ALLOW_HOSTS": [
"server/config.js"
"server/config.js"
],
],
+ "AI_MEDIA_STORAGE_HOSTS": [
+ "server/config.js"
+ ],
"AI_FETCH_MAX_BYTES": [
"AI_FETCH_MAX_BYTES": [
"server/config.js"
"server/config.js"
],
],
@@ -27725,7 +28872,7 @@
@@ -27725,7 +28872,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 70,
+ "line": 69,
"file": "server/auth.js",
"file": "server/auth.js",
"target": "OpenVibe.AI",
"target": "OpenVibe.AI",
"disposition": "keep",
"disposition": "keep",
@@ -27747,7 +28894,7 @@
@@ -27747,7 +28894,7 @@
"kind": "setInterval",
"kind": "setInterval",
"name": null,
"name": null,
"intervalMs": null,
"intervalMs": null,
- "line": 49,
+ "line": 51,
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.AI",
"target": "OpenVibe.AI",
"disposition": "keep",
"disposition": "keep",
@@ -27768,7 +28915,7 @@
@@ -27768,7 +28915,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 20,
+ "testFiles": 26,
"ci": true
"ci": true
},
},
{
{
@@ -27776,13 +28923,13 @@
@@ -27776,13 +28923,13 @@
"service": "search",
"service": "search",
"present": true,
"present": true,
"git": {
"git": {
- "head": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",
+ "head": "e8511d849720534a9ffcd54b052663111e5b1e6f",
"branch": "main",
"branch": "main",
- "originMain": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",
- "committedAt": "2026-09-26T06:18:19-07:00"
+ "originMain": "e8511d849720534a9ffcd54b052663111e5b1e6f",
+ "committedAt": "2026-09-27T19:55:17-07:00"
},
},
- "sourceFiles": 17,
- "loc": 2787,
+ "sourceFiles": 18,
+ "loc": 2868,
"tables": [
"tables": [
{
{
"table": "documents",
"table": "documents",
@@ -27856,7 +29003,7 @@
@@ -27856,7 +29003,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/web/page.js",
"file": "server/web/page.js",
- "line": 174,
+ "line": 178,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27866,7 +29013,7 @@
@@ -27866,7 +29013,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 41,
+ "line": 42,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27876,7 +29023,7 @@
@@ -27876,7 +29023,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 48,
+ "line": 49,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27886,7 +29033,7 @@
@@ -27886,7 +29033,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/documents/:owner/:type/:id",
"path": "/api/v1/documents/:owner/:type/:id",
"file": "server/api/documents.js",
"file": "server/api/documents.js",
- "line": 80,
+ "line": 85,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27896,7 +29043,7 @@
@@ -27896,7 +29043,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/documents/:owner/:type/:id",
"path": "/api/v1/documents/:owner/:type/:id",
"file": "server/api/query.js",
"file": "server/api/query.js",
- "line": 223,
+ "line": 232,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27906,7 +29053,7 @@
@@ -27906,7 +29053,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/documents/:owner/:type/:id",
"path": "/api/v1/documents/:owner/:type/:id",
"file": "server/api/documents.js",
"file": "server/api/documents.js",
- "line": 62,
+ "line": 67,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27916,7 +29063,7 @@
@@ -27916,7 +29063,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/owners/:owner/documents",
"path": "/api/v1/owners/:owner/documents",
"file": "server/api/documents.js",
"file": "server/api/documents.js",
- "line": 93,
+ "line": 98,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27926,7 +29073,7 @@
@@ -27926,7 +29073,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/owners/:owner/documents/:type/:id",
"path": "/api/v1/owners/:owner/documents/:type/:id",
"file": "server/api/documents.js",
"file": "server/api/documents.js",
- "line": 103,
+ "line": 108,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27936,7 +29083,7 @@
@@ -27936,7 +29083,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/owners/:owner/rejections",
"path": "/api/v1/owners/:owner/rejections",
"file": "server/api/documents.js",
"file": "server/api/documents.js",
- "line": 118,
+ "line": 123,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27946,7 +29093,7 @@
@@ -27946,7 +29093,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/owners/:owner/removals",
"path": "/api/v1/owners/:owner/removals",
"file": "server/api/documents.js",
"file": "server/api/documents.js",
- "line": 131,
+ "line": 136,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27956,7 +29103,7 @@
@@ -27956,7 +29103,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/saved-searches",
"path": "/api/v1/saved-searches",
"file": "server/api/saved.js",
"file": "server/api/saved.js",
- "line": 53,
+ "line": 56,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27966,7 +29113,7 @@
@@ -27966,7 +29113,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/saved-searches",
"path": "/api/v1/saved-searches",
"file": "server/api/saved.js",
"file": "server/api/saved.js",
- "line": 59,
+ "line": 62,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27976,7 +29123,7 @@
@@ -27976,7 +29123,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/saved-searches/:id",
"path": "/api/v1/saved-searches/:id",
"file": "server/api/saved.js",
"file": "server/api/saved.js",
- "line": 102,
+ "line": 105,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27986,7 +29133,7 @@
@@ -27986,7 +29133,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/saved-searches/:id",
"path": "/api/v1/saved-searches/:id",
"file": "server/api/saved.js",
"file": "server/api/saved.js",
- "line": 94,
+ "line": 97,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -27996,7 +29143,7 @@
@@ -27996,7 +29143,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/saved-searches/:id/results",
"path": "/api/v1/saved-searches/:id/results",
"file": "server/api/saved.js",
"file": "server/api/saved.js",
- "line": 109,
+ "line": 112,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28006,7 +29153,7 @@
@@ -28006,7 +29153,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/search",
"path": "/api/v1/search",
"file": "server/api/query.js",
"file": "server/api/query.js",
- "line": 194,
+ "line": 203,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28016,7 +29163,7 @@
@@ -28016,7 +29163,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/suggest",
"path": "/api/v1/suggest",
"file": "server/api/query.js",
"file": "server/api/query.js",
- "line": 206,
+ "line": 215,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28026,7 +29173,7 @@
@@ -28026,7 +29173,7 @@
"method": "GET",
"method": "GET",
"path": "/frame-init.js",
"path": "/frame-init.js",
"file": "server/web/page.js",
"file": "server/web/page.js",
- "line": 157,
+ "line": 161,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28046,7 +29193,7 @@
@@ -28046,7 +29193,7 @@
"method": "GET",
"method": "GET",
"path": "/robots.txt",
"path": "/robots.txt",
"file": "server/web/page.js",
"file": "server/web/page.js",
- "line": 169,
+ "line": 173,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28056,7 +29203,7 @@
@@ -28056,7 +29203,7 @@
"method": "GET",
"method": "GET",
"path": "/updates",
"path": "/updates",
"file": "server/web/page.js",
"file": "server/web/page.js",
- "line": 162,
+ "line": 166,
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28128,6 +29275,12 @@
@@ -28128,6 +29275,12 @@
"SEARCH_SAVED_MAX_PER_SUBJECT": [
"SEARCH_SAVED_MAX_PER_SUBJECT": [
"server/config.js"
"server/config.js"
],
],
+ "SEARCH_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "SEARCH_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"CLOUDFLARE_PURGE_TOKEN": [
"CLOUDFLARE_PURGE_TOKEN": [
"server/config.js"
"server/config.js"
],
],
@@ -28208,7 +29361,7 @@
@@ -28208,7 +29361,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 13,
+ "testFiles": 14,
"ci": true
"ci": true
},
},
{
{
@@ -28216,13 +29369,13 @@
@@ -28216,13 +29369,13 @@
"service": "sources",
"service": "sources",
"present": true,
"present": true,
"git": {
"git": {
- "head": "29cd386241c44456ffcebf70b6be287fa9a08aaa",
+ "head": "167085388a637eed3f0d47b3c6eabb8c9d00814d",
"branch": "main",
"branch": "main",
- "originMain": "29cd386241c44456ffcebf70b6be287fa9a08aaa",
- "committedAt": "2026-09-26T06:18:36-07:00"
+ "originMain": "167085388a637eed3f0d47b3c6eabb8c9d00814d",
+ "committedAt": "2026-09-27T19:55:56-07:00"
},
},
- "sourceFiles": 23,
- "loc": 2980,
+ "sourceFiles": 24,
+ "loc": 3100,
"tables": [
"tables": [
{
{
"table": "sources",
"table": "sources",
@@ -28278,7 +29431,7 @@
@@ -28278,7 +29431,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/app.js",
"file": "server/app.js",
- "line": 101,
+ "line": 105,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28288,7 +29441,7 @@
@@ -28288,7 +29441,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 84,
+ "line": 85,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28298,7 +29451,7 @@
@@ -28298,7 +29451,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 91,
+ "line": 92,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28308,7 +29461,7 @@
@@ -28308,7 +29461,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/health",
"path": "/api/v1/health",
"file": "server/api/sources.js",
"file": "server/api/sources.js",
- "line": 78,
+ "line": 80,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28318,7 +29471,7 @@
@@ -28318,7 +29471,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/items",
"path": "/api/v1/items",
"file": "server/api/items.js",
"file": "server/api/items.js",
- "line": 55,
+ "line": 57,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28328,7 +29481,7 @@
@@ -28328,7 +29481,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/items/:id",
"path": "/api/v1/items/:id",
"file": "server/api/items.js",
"file": "server/api/items.js",
- "line": 99,
+ "line": 101,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28338,7 +29491,7 @@
@@ -28338,7 +29491,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/items/:id",
"path": "/api/v1/items/:id",
"file": "server/api/items.js",
"file": "server/api/items.js",
- "line": 74,
+ "line": 76,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28348,7 +29501,7 @@
@@ -28348,7 +29501,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/runs",
"path": "/api/v1/runs",
"file": "server/api/sources.js",
"file": "server/api/sources.js",
- "line": 67,
+ "line": 69,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28358,7 +29511,7 @@
@@ -28358,7 +29511,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/sources",
"path": "/api/v1/sources",
"file": "server/api/sources.js",
"file": "server/api/sources.js",
- "line": 49,
+ "line": 51,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28368,7 +29521,7 @@
@@ -28368,7 +29521,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/sources",
"path": "/api/v1/sources",
"file": "server/api/sources.js",
"file": "server/api/sources.js",
- "line": 85,
+ "line": 87,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28378,7 +29531,7 @@
@@ -28378,7 +29531,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/sources/:key",
"path": "/api/v1/sources/:key",
"file": "server/api/sources.js",
"file": "server/api/sources.js",
- "line": 100,
+ "line": 102,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28388,7 +29541,7 @@
@@ -28388,7 +29541,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/sources/:key",
"path": "/api/v1/sources/:key",
"file": "server/api/sources.js",
"file": "server/api/sources.js",
- "line": 53,
+ "line": 55,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28398,7 +29551,7 @@
@@ -28398,7 +29551,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/sources/:key",
"path": "/api/v1/sources/:key",
"file": "server/api/sources.js",
"file": "server/api/sources.js",
- "line": 92,
+ "line": 94,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28408,7 +29561,7 @@
@@ -28408,7 +29561,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/sources/:key/fetch",
"path": "/api/v1/sources/:key/fetch",
"file": "server/api/sources.js",
"file": "server/api/sources.js",
- "line": 115,
+ "line": 117,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28418,7 +29571,7 @@
@@ -28418,7 +29571,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/sources/:key/items",
"path": "/api/v1/sources/:key/items",
"file": "server/api/items.js",
"file": "server/api/items.js",
- "line": 82,
+ "line": 84,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28428,7 +29581,7 @@
@@ -28428,7 +29581,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/sources/:key/runs",
"path": "/api/v1/sources/:key/runs",
"file": "server/api/sources.js",
"file": "server/api/sources.js",
- "line": 59,
+ "line": 61,
"target": "OpenVibe.Sources",
"target": "OpenVibe.Sources",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28464,6 +29617,12 @@
@@ -28464,6 +29617,12 @@
"OV_NETWORK_PUBLIC_KEY": [
"OV_NETWORK_PUBLIC_KEY": [
"server/config.js"
"server/config.js"
],
],
+ "SOURCES_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "SOURCES_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"OV_OAUTH_CLIENT_ID": [
"OV_OAUTH_CLIENT_ID": [
"server/config.js"
"server/config.js"
],
],
@@ -28586,7 +29745,7 @@
@@ -28586,7 +29745,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 10,
+ "testFiles": 13,
"ci": true
"ci": true
},
},
{
{
@@ -28594,13 +29753,13 @@
@@ -28594,13 +29753,13 @@
"service": "wiki",
"service": "wiki",
"present": true,
"present": true,
"git": {
"git": {
- "head": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",
+ "head": "3302540e8b5fdf3c07db9fce688be2f4ab8b847b",
"branch": "main",
"branch": "main",
- "originMain": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",
- "committedAt": "2026-09-26T06:21:43-07:00"
+ "originMain": "3302540e8b5fdf3c07db9fce688be2f4ab8b847b",
+ "committedAt": "2026-09-27T20:00:00-07:00"
},
},
- "sourceFiles": 21,
- "loc": 4421,
+ "sourceFiles": 23,
+ "loc": 4751,
"tables": [
"tables": [
{
{
"table": "wiki_spaces",
"table": "wiki_spaces",
@@ -28668,7 +29827,7 @@
@@ -28668,7 +29827,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 98,
+ "line": 119,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28678,7 +29837,7 @@
@@ -28678,7 +29837,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 66,
+ "line": 67,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28688,7 +29847,7 @@
@@ -28688,7 +29847,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 81,
+ "line": 82,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28698,7 +29857,7 @@
@@ -28698,7 +29857,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/pages/:id",
"path": "/api/v1/pages/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 164,
+ "line": 179,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28708,7 +29867,7 @@
@@ -28708,7 +29867,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/pages/:id",
"path": "/api/v1/pages/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 144,
+ "line": 159,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28718,7 +29877,7 @@
@@ -28718,7 +29877,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/pages/:id",
"path": "/api/v1/pages/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 156,
+ "line": 171,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28728,7 +29887,7 @@
@@ -28728,7 +29887,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/pages/:id/diff",
"path": "/api/v1/pages/:id/diff",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 188,
+ "line": 203,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28738,7 +29897,7 @@
@@ -28738,7 +29897,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pages/:id/media",
"path": "/api/v1/pages/:id/media",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 226,
+ "line": 241,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28748,7 +29907,7 @@
@@ -28748,7 +29907,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pages/:id/media/verify",
"path": "/api/v1/pages/:id/media/verify",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 231,
+ "line": 246,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28758,7 +29917,7 @@
@@ -28758,7 +29917,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pages/:id/publish",
"path": "/api/v1/pages/:id/publish",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 208,
+ "line": 223,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28768,7 +29927,7 @@
@@ -28768,7 +29927,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pages/:id/revert",
"path": "/api/v1/pages/:id/revert",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 221,
+ "line": 236,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28778,7 +29937,7 @@
@@ -28778,7 +29937,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/pages/:id/revisions",
"path": "/api/v1/pages/:id/revisions",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 168,
+ "line": 183,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28788,7 +29947,7 @@
@@ -28788,7 +29947,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pages/:id/revisions",
"path": "/api/v1/pages/:id/revisions",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 173,
+ "line": 188,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28798,7 +29957,7 @@
@@ -28798,7 +29957,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/pages/:id/revisions/:n",
"path": "/api/v1/pages/:id/revisions/:n",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 183,
+ "line": 198,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28808,7 +29967,7 @@
@@ -28808,7 +29967,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/pages/:id/revisions/:n/citations",
"path": "/api/v1/pages/:id/revisions/:n/citations",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 193,
+ "line": 208,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28818,7 +29977,7 @@
@@ -28818,7 +29977,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pages/:id/revisions/:n/citations",
"path": "/api/v1/pages/:id/revisions/:n/citations",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 198,
+ "line": 213,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28828,7 +29987,7 @@
@@ -28828,7 +29987,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pages/:id/revisions/:n/review",
"path": "/api/v1/pages/:id/revisions/:n/review",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 202,
+ "line": 217,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28838,7 +29997,7 @@
@@ -28838,7 +29997,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pages/:id/schedule",
"path": "/api/v1/pages/:id/schedule",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 212,
+ "line": 227,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28848,7 +30007,7 @@
@@ -28848,7 +30007,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/pages/:id/unpublish",
"path": "/api/v1/pages/:id/unpublish",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 217,
+ "line": 232,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28858,7 +30017,7 @@
@@ -28858,7 +30017,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/pages/:id/watch",
"path": "/api/v1/pages/:id/watch",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 236,
+ "line": 251,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28868,7 +30027,7 @@
@@ -28868,7 +30027,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/proposals",
"path": "/api/v1/proposals",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 239,
+ "line": 254,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28878,7 +30037,7 @@
@@ -28878,7 +30037,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/proposals/:id",
"path": "/api/v1/proposals/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 250,
+ "line": 265,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28888,7 +30047,7 @@
@@ -28888,7 +30047,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/proposals/:id/review",
"path": "/api/v1/proposals/:id/review",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 258,
+ "line": 273,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28898,7 +30057,7 @@
@@ -28898,7 +30057,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/search",
"path": "/api/v1/search",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 263,
+ "line": 278,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28908,7 +30067,7 @@
@@ -28908,7 +30067,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces",
"path": "/api/v1/spaces",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 116,
+ "line": 131,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28918,7 +30077,7 @@
@@ -28918,7 +30077,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces",
"path": "/api/v1/spaces",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 117,
+ "line": 132,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28928,7 +30087,7 @@
@@ -28928,7 +30087,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces/:space",
"path": "/api/v1/spaces/:space",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 118,
+ "line": 133,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28938,7 +30097,7 @@
@@ -28938,7 +30097,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/spaces/:space",
"path": "/api/v1/spaces/:space",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 122,
+ "line": 137,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28958,7 +30117,7 @@
@@ -28958,7 +30117,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces/:space/import",
"path": "/api/v1/spaces/:space/import",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 133,
+ "line": 148,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28968,7 +30127,7 @@
@@ -28968,7 +30127,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/spaces/:space/pages",
"path": "/api/v1/spaces/:space/pages",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 125,
+ "line": 140,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28978,7 +30137,7 @@
@@ -28978,7 +30137,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/spaces/:space/roles",
"path": "/api/v1/spaces/:space/roles",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 123,
+ "line": 138,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -28988,7 +30147,7 @@
@@ -28988,7 +30147,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/spaces/:space/roles/:subject",
"path": "/api/v1/spaces/:space/roles/:subject",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 124,
+ "line": 139,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29088,7 +30247,7 @@
@@ -29088,7 +30247,7 @@
"method": "GET",
"method": "GET",
"path": "/new-space",
"path": "/new-space",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 115,
+ "line": 137,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29098,7 +30257,7 @@
@@ -29098,7 +30257,7 @@
"method": "POST",
"method": "POST",
"path": "/new-space",
"path": "/new-space",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 119,
+ "line": 141,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29108,7 +30267,7 @@
@@ -29108,7 +30267,7 @@
"method": "POST",
"method": "POST",
"path": "/proposals/:id",
"path": "/proposals/:id",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 247,
+ "line": 269,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29118,7 +30277,7 @@
@@ -29118,7 +30277,7 @@
"method": "GET",
"method": "GET",
"path": "/recent",
"path": "/recent",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 108,
+ "line": 130,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29138,7 +30297,7 @@
@@ -29138,7 +30297,7 @@
"method": "GET",
"method": "GET",
"path": "/s/:space",
"path": "/s/:space",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 131,
+ "line": 153,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29148,7 +30307,7 @@
@@ -29148,7 +30307,7 @@
"method": "GET",
"method": "GET",
"path": "/s/:space/import",
"path": "/s/:space/import",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 215,
+ "line": 237,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29158,7 +30317,7 @@
@@ -29158,7 +30317,7 @@
"method": "POST",
"method": "POST",
"path": "/s/:space/import",
"path": "/s/:space/import",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 220,
+ "line": 242,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29168,7 +30327,7 @@
@@ -29168,7 +30327,7 @@
"method": "GET",
"method": "GET",
"path": "/s/:space/new",
"path": "/s/:space/new",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 158,
+ "line": 180,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29178,7 +30337,7 @@
@@ -29178,7 +30337,7 @@
"method": "POST",
"method": "POST",
"path": "/s/:space/new",
"path": "/s/:space/new",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 164,
+ "line": 186,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29188,7 +30347,7 @@
@@ -29188,7 +30347,7 @@
"method": "GET",
"method": "GET",
"path": "/s/:space/proposals",
"path": "/s/:space/proposals",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 240,
+ "line": 262,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29198,7 +30357,7 @@
@@ -29198,7 +30357,7 @@
"method": "GET",
"method": "GET",
"path": "/s/:space/settings",
"path": "/s/:space/settings",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 183,
+ "line": 205,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29208,7 +30367,7 @@
@@ -29208,7 +30367,7 @@
"method": "POST",
"method": "POST",
"path": "/s/:space/settings",
"path": "/s/:space/settings",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 190,
+ "line": 212,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29218,7 +30377,7 @@
@@ -29218,7 +30377,7 @@
"method": "GET",
"method": "GET",
"path": "/search",
"path": "/search",
"file": "server/app.js",
"file": "server/app.js",
- "line": 108,
+ "line": 112,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29228,7 +30387,7 @@
@@ -29228,7 +30387,7 @@
"method": "GET",
"method": "GET",
"path": "/search",
"path": "/search",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 109,
+ "line": 131,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29268,7 +30427,7 @@
@@ -29268,7 +30427,7 @@
"method": "GET",
"method": "GET",
"path": "/updates",
"path": "/updates",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 107,
+ "line": 129,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29278,7 +30437,7 @@
@@ -29278,7 +30437,7 @@
"method": "GET",
"method": "GET",
"path": "/w/:space/:slug",
"path": "/w/:space/:slug",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 285,
+ "line": 307,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29288,7 +30447,7 @@
@@ -29288,7 +30447,7 @@
"method": "GET",
"method": "GET",
"path": "/w/:space/:slug/compare",
"path": "/w/:space/:slug/compare",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 349,
+ "line": 371,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29298,7 +30457,7 @@
@@ -29298,7 +30457,7 @@
"method": "GET",
"method": "GET",
"path": "/w/:space/:slug/diff/:a/:b",
"path": "/w/:space/:slug/diff/:a/:b",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 357,
+ "line": 379,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29308,7 +30467,7 @@
@@ -29308,7 +30467,7 @@
"method": "POST",
"method": "POST",
"path": "/w/:space/:slug/discuss",
"path": "/w/:space/:slug/discuss",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 516,
+ "line": 538,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29318,7 +30477,7 @@
@@ -29318,7 +30477,7 @@
"method": "GET",
"method": "GET",
"path": "/w/:space/:slug/edit",
"path": "/w/:space/:slug/edit",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 378,
+ "line": 400,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29328,7 +30487,7 @@
@@ -29328,7 +30487,7 @@
"method": "POST",
"method": "POST",
"path": "/w/:space/:slug/edit",
"path": "/w/:space/:slug/edit",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 393,
+ "line": 415,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29338,7 +30497,7 @@
@@ -29338,7 +30497,7 @@
"method": "GET",
"method": "GET",
"path": "/w/:space/:slug/history",
"path": "/w/:space/:slug/history",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 324,
+ "line": 346,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29348,7 +30507,7 @@
@@ -29348,7 +30507,7 @@
"method": "GET",
"method": "GET",
"path": "/w/:space/:slug/publish",
"path": "/w/:space/:slug/publish",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 441,
+ "line": 463,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29358,7 +30517,7 @@
@@ -29358,7 +30517,7 @@
"method": "GET",
"method": "GET",
"path": "/w/:space/:slug/revert",
"path": "/w/:space/:slug/revert",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 420,
+ "line": 442,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29368,7 +30527,7 @@
@@ -29368,7 +30527,7 @@
"method": "POST",
"method": "POST",
"path": "/w/:space/:slug/revert",
"path": "/w/:space/:slug/revert",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 431,
+ "line": 453,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29378,7 +30537,7 @@
@@ -29378,7 +30537,7 @@
"method": "POST",
"method": "POST",
"path": "/w/:space/:slug/review",
"path": "/w/:space/:slug/review",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 498,
+ "line": 520,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29388,7 +30547,7 @@
@@ -29388,7 +30547,7 @@
"method": "GET",
"method": "GET",
"path": "/w/:space/:slug/settings",
"path": "/w/:space/:slug/settings",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 450,
+ "line": 472,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29398,7 +30557,7 @@
@@ -29398,7 +30557,7 @@
"method": "POST",
"method": "POST",
"path": "/w/:space/:slug/settings",
"path": "/w/:space/:slug/settings",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 464,
+ "line": 486,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29408,7 +30567,7 @@
@@ -29408,7 +30567,7 @@
"method": "GET",
"method": "GET",
"path": "/w/:space/:slug/sources",
"path": "/w/:space/:slug/sources",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 335,
+ "line": 357,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29418,7 +30577,7 @@
@@ -29418,7 +30577,7 @@
"method": "POST",
"method": "POST",
"path": "/w/:space/:slug/watch",
"path": "/w/:space/:slug/watch",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 508,
+ "line": 530,
"target": "OpenVibe.Wiki",
"target": "OpenVibe.Wiki",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29448,6 +30607,12 @@
@@ -29448,6 +30607,12 @@
"TRUST_PROXY": [
"TRUST_PROXY": [
"server/config.js"
"server/config.js"
],
],
+ "WIKI_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "WIKI_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"WIKI_DB_PATH": [
"WIKI_DB_PATH": [
"server/config.js"
"server/config.js"
],
],
@@ -29502,6 +30667,24 @@
@@ -29502,6 +30667,24 @@
"WIKI_MEDIA_VERIFY_INTERVAL_MS": [
"WIKI_MEDIA_VERIFY_INTERVAL_MS": [
"server/config.js"
"server/config.js"
],
],
+ "OV_VIP_INTERNAL_URL": [
+ "server/config.js"
+ ],
+ "OV_VIP_URL": [
+ "server/config.js"
+ ],
+ "WIKI_VIP_TIMEOUT_MS": [
+ "server/config.js"
+ ],
+ "WIKI_VIP_CACHE_TTL_MS": [
+ "server/config.js"
+ ],
+ "WIKI_VIP_CACHE_DENY_TTL_MS": [
+ "server/config.js"
+ ],
+ "WIKI_VIP_CACHE_UNAVAILABLE_TTL_MS": [
+ "server/config.js"
+ ],
"WIKI_SCHEDULE_INTERVAL_MS": [
"WIKI_SCHEDULE_INTERVAL_MS": [
"server/config.js"
"server/config.js"
],
],
@@ -29571,7 +30754,7 @@
@@ -29571,7 +30754,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 28,
+ "testFiles": 35,
"ci": true
"ci": true
},
},
{
{
@@ -29579,13 +30762,13 @@
@@ -29579,13 +30762,13 @@
"service": "blog",
"service": "blog",
"present": true,
"present": true,
"git": {
"git": {
- "head": "79e9e153ca1308311993a31295fd471a8becaf8d",
+ "head": "8a7f8ebe862b0e1c0bb119ee96c42f38fc0e5321",
"branch": "main",
"branch": "main",
- "originMain": "79e9e153ca1308311993a31295fd471a8becaf8d",
- "committedAt": "2026-09-26T06:09:58-07:00"
+ "originMain": "8a7f8ebe862b0e1c0bb119ee96c42f38fc0e5321",
+ "committedAt": "2026-09-27T19:58:44-07:00"
},
},
- "sourceFiles": 33,
- "loc": 5037,
+ "sourceFiles": 34,
+ "loc": 5185,
"tables": [
"tables": [
{
{
"table": "changelog_state",
"table": "changelog_state",
@@ -29683,7 +30866,7 @@
@@ -29683,7 +30866,7 @@
"method": "POST",
"method": "POST",
"path": "/@:handle/:slug/comments",
"path": "/@:handle/:slug/comments",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 381,
+ "line": 383,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29753,7 +30936,7 @@
@@ -29753,7 +30936,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 112,
+ "line": 117,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29763,7 +30946,7 @@
@@ -29763,7 +30946,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 116,
+ "line": 121,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29773,7 +30956,7 @@
@@ -29773,7 +30956,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/blogs",
"path": "/api/v1/blogs",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 127,
+ "line": 132,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29783,7 +30966,7 @@
@@ -29783,7 +30966,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/blogs/:handle",
"path": "/api/v1/blogs/:handle",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 122,
+ "line": 127,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29793,7 +30976,7 @@
@@ -29793,7 +30976,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/blogs/:handle",
"path": "/api/v1/blogs/:handle",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 134,
+ "line": 139,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29803,7 +30986,7 @@
@@ -29803,7 +30986,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/blogs/:handle/feed",
"path": "/api/v1/blogs/:handle/feed",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 221,
+ "line": 226,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29813,7 +30996,7 @@
@@ -29813,7 +30996,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/blogs/:handle/members",
"path": "/api/v1/blogs/:handle/members",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 152,
+ "line": 157,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29823,7 +31006,7 @@
@@ -29823,7 +31006,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/blogs/:handle/members/:subject",
"path": "/api/v1/blogs/:handle/members/:subject",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 166,
+ "line": 171,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29833,7 +31016,7 @@
@@ -29833,7 +31016,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/blogs/:handle/members/:subject",
"path": "/api/v1/blogs/:handle/members/:subject",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 160,
+ "line": 165,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29843,7 +31026,7 @@
@@ -29843,7 +31026,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/blogs/:handle/posts",
"path": "/api/v1/blogs/:handle/posts",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 172,
+ "line": 177,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29853,7 +31036,7 @@
@@ -29853,7 +31036,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/blogs/:handle/posts",
"path": "/api/v1/blogs/:handle/posts",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 214,
+ "line": 219,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29863,7 +31046,7 @@
@@ -29863,7 +31046,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/blogs/:handle/posts/ai-draft",
"path": "/api/v1/blogs/:handle/posts/ai-draft",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 206,
+ "line": 211,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29873,7 +31056,7 @@
@@ -29873,7 +31056,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/blogs/:handle/theme",
"path": "/api/v1/blogs/:handle/theme",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 146,
+ "line": 151,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29883,7 +31066,7 @@
@@ -29883,7 +31066,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/changelog",
"path": "/api/v1/changelog",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 187,
+ "line": 192,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29893,7 +31076,7 @@
@@ -29893,7 +31076,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts/:id",
"path": "/api/v1/posts/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 232,
+ "line": 237,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29903,7 +31086,7 @@
@@ -29903,7 +31086,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts/:id/diff",
"path": "/api/v1/posts/:id/diff",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 306,
+ "line": 311,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29913,7 +31096,7 @@
@@ -29913,7 +31096,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/posts/:id/reviews",
"path": "/api/v1/posts/:id/reviews",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 279,
+ "line": 284,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29923,7 +31106,7 @@
@@ -29923,7 +31106,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts/:id/revisions",
"path": "/api/v1/posts/:id/revisions",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 296,
+ "line": 301,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -29933,7 +31116,7 @@
@@ -29933,7 +31116,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/posts/:id/revisions/:n",
"path": "/api/v1/posts/:id/revisions/:n",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 300,
+ "line": 305,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30083,7 +31266,7 @@
@@ -30083,7 +31266,7 @@
"method": "GET",
"method": "GET",
"path": "/write",
"path": "/write",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 94,
+ "line": 106,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30093,7 +31276,7 @@
@@ -30093,7 +31276,7 @@
"method": "GET",
"method": "GET",
"path": "/write/@:handle",
"path": "/write/@:handle",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 109,
+ "line": 121,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30103,7 +31286,17 @@
@@ -30103,7 +31286,17 @@
"method": "POST",
"method": "POST",
"path": "/write/@:handle/ai-draft",
"path": "/write/@:handle/ai-draft",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 125,
+ "line": 56,
+ "target": "OpenVibe.Blog",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/write/@:handle/ai-draft",
+ "file": "server/http/editor.js",
+ "line": 137,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30113,7 +31306,7 @@
@@ -30113,7 +31306,7 @@
"method": "POST",
"method": "POST",
"path": "/write/@:handle/members",
"path": "/write/@:handle/members",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 162,
+ "line": 174,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30123,7 +31316,7 @@
@@ -30123,7 +31316,7 @@
"method": "POST",
"method": "POST",
"path": "/write/@:handle/members/remove",
"path": "/write/@:handle/members/remove",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 173,
+ "line": 185,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30133,7 +31326,7 @@
@@ -30133,7 +31326,7 @@
"method": "GET",
"method": "GET",
"path": "/write/@:handle/new",
"path": "/write/@:handle/new",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 117,
+ "line": 129,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30143,7 +31336,17 @@
@@ -30143,7 +31336,17 @@
"method": "POST",
"method": "POST",
"path": "/write/@:handle/new",
"path": "/write/@:handle/new",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 134,
+ "line": 57,
+ "target": "OpenVibe.Blog",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/write/@:handle/new",
+ "file": "server/http/editor.js",
+ "line": 146,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30153,7 +31356,7 @@
@@ -30153,7 +31356,7 @@
"method": "GET",
"method": "GET",
"path": "/write/@:handle/settings",
"path": "/write/@:handle/settings",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 142,
+ "line": 154,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30163,7 +31366,17 @@
@@ -30163,7 +31366,17 @@
"method": "POST",
"method": "POST",
"path": "/write/@:handle/settings",
"path": "/write/@:handle/settings",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 150,
+ "line": 58,
+ "target": "OpenVibe.Blog",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/write/@:handle/settings",
+ "file": "server/http/editor.js",
+ "line": 162,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30173,7 +31386,7 @@
@@ -30173,7 +31386,7 @@
"method": "GET",
"method": "GET",
"path": "/write/posts/:id",
"path": "/write/posts/:id",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 182,
+ "line": 194,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30183,7 +31396,7 @@
@@ -30183,7 +31396,7 @@
"method": "POST",
"method": "POST",
"path": "/write/posts/:id",
"path": "/write/posts/:id",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 203,
+ "line": 215,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30193,7 +31406,17 @@
@@ -30193,7 +31406,17 @@
"method": "POST",
"method": "POST",
"path": "/write/posts/:id/${name}",
"path": "/write/posts/:id/${name}",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 212,
+ "line": 224,
+ "target": "OpenVibe.Blog",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/write/posts/:id/delete",
+ "file": "server/http/editor.js",
+ "line": 62,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30203,7 +31426,7 @@
@@ -30203,7 +31426,7 @@
"method": "POST",
"method": "POST",
"path": "/write/posts/:id/media/:aid/remove",
"path": "/write/posts/:id/media/:aid/remove",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 242,
+ "line": 254,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30213,7 +31436,7 @@
@@ -30213,7 +31436,7 @@
"method": "GET",
"method": "GET",
"path": "/write/posts/:id/preview",
"path": "/write/posts/:id/preview",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 260,
+ "line": 272,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30223,7 +31446,7 @@
@@ -30223,7 +31446,7 @@
"method": "GET",
"method": "GET",
"path": "/write/posts/:id/revisions",
"path": "/write/posts/:id/revisions",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 249,
+ "line": 261,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30233,7 +31456,17 @@
@@ -30233,7 +31456,17 @@
"method": "POST",
"method": "POST",
"path": "/write/start",
"path": "/write/start",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 101,
+ "line": 55,
+ "target": "OpenVibe.Blog",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "POST",
+ "path": "/write/start",
+ "file": "server/http/editor.js",
+ "line": 113,
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30260,6 +31493,12 @@
@@ -30260,6 +31493,12 @@
"TRUST_PROXY": [
"TRUST_PROXY": [
"server/config.js"
"server/config.js"
],
],
+ "BLOG_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "BLOG_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"BLOG_DB_PATH": [
"BLOG_DB_PATH": [
"server/config.js"
"server/config.js"
],
],
@@ -30532,7 +31771,7 @@
@@ -30532,7 +31771,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 23,
+ "testFiles": 29,
"ci": true
"ci": true
},
},
{
{
@@ -30540,13 +31779,13 @@
@@ -30540,13 +31779,13 @@
"service": "news",
"service": "news",
"present": true,
"present": true,
"git": {
"git": {
- "head": "0860cf20dd3d8e8032caad300e0ce90497195b96",
+ "head": "97dae43a2d41c5528bbb4c93ff2ea7ea456203dd",
"branch": "main",
"branch": "main",
- "originMain": "0860cf20dd3d8e8032caad300e0ce90497195b96",
- "committedAt": "2026-09-26T06:17:45-07:00"
+ "originMain": "97dae43a2d41c5528bbb4c93ff2ea7ea456203dd",
+ "committedAt": "2026-09-27T19:57:37-07:00"
},
},
- "sourceFiles": 33,
- "loc": 5103,
+ "sourceFiles": 34,
+ "loc": 5251,
"tables": [
"tables": [
{
{
"table": "news_topics",
"table": "news_topics",
@@ -30652,7 +31891,7 @@
@@ -30652,7 +31891,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 107,
+ "line": 112,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30662,7 +31901,7 @@
@@ -30662,7 +31901,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 111,
+ "line": 116,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30672,7 +31911,7 @@
@@ -30672,7 +31911,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/clusters",
"path": "/api/v1/clusters",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 219,
+ "line": 225,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30682,7 +31921,7 @@
@@ -30682,7 +31921,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/clusters/:id",
"path": "/api/v1/clusters/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 224,
+ "line": 230,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30692,7 +31931,7 @@
@@ -30692,7 +31931,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/clusters/:id/merge",
"path": "/api/v1/clusters/:id/merge",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 235,
+ "line": 241,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30702,7 +31941,7 @@
@@ -30702,7 +31941,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/clusters/:id/split",
"path": "/api/v1/clusters/:id/split",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 241,
+ "line": 247,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30712,7 +31951,7 @@
@@ -30712,7 +31951,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/clusters/audit/:auditId/reverse",
"path": "/api/v1/clusters/audit/:auditId/reverse",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 230,
+ "line": 236,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30722,7 +31961,7 @@
@@ -30722,7 +31961,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/ingest",
"path": "/api/v1/ingest",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 253,
+ "line": 259,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30732,7 +31971,7 @@
@@ -30732,7 +31971,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/source-items/:id",
"path": "/api/v1/source-items/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 247,
+ "line": 253,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30742,7 +31981,7 @@
@@ -30742,7 +31981,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/stories",
"path": "/api/v1/stories",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 129,
+ "line": 134,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30752,7 +31991,7 @@
@@ -30752,7 +31991,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/stories",
"path": "/api/v1/stories",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 152,
+ "line": 157,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30762,7 +32001,7 @@
@@ -30762,7 +32001,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/stories/:id",
"path": "/api/v1/stories/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 139,
+ "line": 144,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30772,7 +32011,7 @@
@@ -30772,7 +32011,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/stories/:id/diff",
"path": "/api/v1/stories/:id/diff",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 170,
+ "line": 175,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30782,7 +32021,7 @@
@@ -30782,7 +32021,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/stories/:id/reviews",
"path": "/api/v1/stories/:id/reviews",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 200,
+ "line": 206,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30792,7 +32031,7 @@
@@ -30792,7 +32031,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/stories/:id/revisions",
"path": "/api/v1/stories/:id/revisions",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 158,
+ "line": 163,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30802,7 +32041,7 @@
@@ -30802,7 +32041,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/stories/:id/revisions/:n",
"path": "/api/v1/stories/:id/revisions/:n",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 163,
+ "line": 168,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30812,7 +32051,7 @@
@@ -30812,7 +32051,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/topics",
"path": "/api/v1/topics",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 118,
+ "line": 123,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30822,7 +32061,7 @@
@@ -30822,7 +32061,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/topics",
"path": "/api/v1/topics",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 120,
+ "line": 125,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30892,7 +32131,7 @@
@@ -30892,7 +32131,7 @@
"method": "GET",
"method": "GET",
"path": "/clusters/:id",
"path": "/clusters/:id",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 105,
+ "line": 110,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30902,7 +32141,7 @@
@@ -30902,7 +32141,7 @@
"method": "POST",
"method": "POST",
"path": "/clusters/:id/merge",
"path": "/clusters/:id/merge",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 114,
+ "line": 119,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30912,7 +32151,7 @@
@@ -30912,7 +32151,7 @@
"method": "POST",
"method": "POST",
"path": "/clusters/:id/split",
"path": "/clusters/:id/split",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 119,
+ "line": 124,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30922,7 +32161,7 @@
@@ -30922,7 +32161,7 @@
"method": "POST",
"method": "POST",
"path": "/clusters/:id/stories",
"path": "/clusters/:id/stories",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 128,
+ "line": 133,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30932,7 +32171,7 @@
@@ -30932,7 +32171,7 @@
"method": "POST",
"method": "POST",
"path": "/clusters/audit/:aid/reverse",
"path": "/clusters/audit/:aid/reverse",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 124,
+ "line": 129,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30942,7 +32181,7 @@
@@ -30942,7 +32181,7 @@
"method": "GET",
"method": "GET",
"path": "/edit",
"path": "/edit",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 74,
+ "line": 79,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30952,7 +32191,7 @@
@@ -30952,7 +32191,7 @@
"method": "POST",
"method": "POST",
"path": "/edit/pull",
"path": "/edit/pull",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 85,
+ "line": 90,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30962,7 +32201,7 @@
@@ -30962,7 +32201,7 @@
"method": "GET",
"method": "GET",
"path": "/edit/stories/:id",
"path": "/edit/stories/:id",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 142,
+ "line": 147,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30972,7 +32211,7 @@
@@ -30972,7 +32211,7 @@
"method": "POST",
"method": "POST",
"path": "/edit/stories/:id/${path}",
"path": "/edit/stories/:id/${path}",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 171,
+ "line": 176,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30982,7 +32221,7 @@
@@ -30982,7 +32221,7 @@
"method": "GET",
"method": "GET",
"path": "/edit/stories/:id/diff",
"path": "/edit/stories/:id/diff",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 165,
+ "line": 170,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -30992,7 +32231,7 @@
@@ -30992,7 +32231,7 @@
"method": "GET",
"method": "GET",
"path": "/edit/stories/:id/preview",
"path": "/edit/stories/:id/preview",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 155,
+ "line": 160,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31002,7 +32241,7 @@
@@ -31002,7 +32241,7 @@
"method": "GET",
"method": "GET",
"path": "/edit/topics",
"path": "/edit/topics",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 90,
+ "line": 95,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31012,7 +32251,7 @@
@@ -31012,7 +32251,7 @@
"method": "POST",
"method": "POST",
"path": "/edit/topics",
"path": "/edit/topics",
"file": "server/http/editor.js",
"file": "server/http/editor.js",
- "line": 91,
+ "line": 96,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31092,7 +32331,7 @@
@@ -31092,7 +32331,7 @@
"method": "POST",
"method": "POST",
"path": "/stories/:slug/comments",
"path": "/stories/:slug/comments",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 201,
+ "line": 202,
"target": "OpenVibe.News",
"target": "OpenVibe.News",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31159,6 +32398,12 @@
@@ -31159,6 +32398,12 @@
"TRUST_PROXY": [
"TRUST_PROXY": [
"server/config.js"
"server/config.js"
],
],
+ "NEWS_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "NEWS_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"NEWS_DB_PATH": [
"NEWS_DB_PATH": [
"server/config.js"
"server/config.js"
],
],
@@ -31358,7 +32603,7 @@
@@ -31358,7 +32603,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 18,
+ "testFiles": 19,
"ci": true
"ci": true
},
},
{
{
@@ -31366,13 +32611,13 @@
@@ -31366,13 +32611,13 @@
"service": "reviews",
"service": "reviews",
"present": true,
"present": true,
"git": {
"git": {
- "head": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",
+ "head": "c87b34440b0d50bc2cdf6c136775002ed9080c1e",
"branch": "main",
"branch": "main",
- "originMain": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",
- "committedAt": "2026-09-26T06:18:06-07:00"
+ "originMain": "c87b34440b0d50bc2cdf6c136775002ed9080c1e",
+ "committedAt": "2026-09-27T19:59:21-07:00"
},
},
- "sourceFiles": 22,
- "loc": 4649,
+ "sourceFiles": 23,
+ "loc": 4792,
"tables": [
"tables": [
{
{
"table": "review_entities",
"table": "review_entities",
@@ -31464,7 +32709,7 @@
@@ -31464,7 +32709,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 141,
+ "line": 145,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31474,7 +32719,7 @@
@@ -31474,7 +32719,7 @@
"method": "GET",
"method": "GET",
"path": "/about",
"path": "/about",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 150,
+ "line": 154,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31484,7 +32729,7 @@
@@ -31484,7 +32729,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 83,
+ "line": 84,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31494,7 +32739,7 @@
@@ -31494,7 +32739,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 103,
+ "line": 104,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31504,7 +32749,7 @@
@@ -31504,7 +32749,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/corrections",
"path": "/api/v1/corrections",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 152,
+ "line": 158,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31514,7 +32759,7 @@
@@ -31514,7 +32759,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/corrections/:id",
"path": "/api/v1/corrections/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 156,
+ "line": 162,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31524,7 +32769,7 @@
@@ -31524,7 +32769,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/entities",
"path": "/api/v1/entities",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 71,
+ "line": 76,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31534,7 +32779,7 @@
@@ -31534,7 +32779,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities",
"path": "/api/v1/entities",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 91,
+ "line": 97,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31544,7 +32789,7 @@
@@ -31544,7 +32789,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/entities/:ref",
"path": "/api/v1/entities/:ref",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 96,
+ "line": 102,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31554,7 +32799,7 @@
@@ -31554,7 +32799,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/entities/:ref",
"path": "/api/v1/entities/:ref",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 78,
+ "line": 84,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31564,7 +32809,7 @@
@@ -31564,7 +32809,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/entities/:ref",
"path": "/api/v1/entities/:ref",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 95,
+ "line": 101,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31574,7 +32819,7 @@
@@ -31574,7 +32819,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/entities/:ref/aggregate",
"path": "/api/v1/entities/:ref/aggregate",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 85,
+ "line": 91,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31584,7 +32829,7 @@
@@ -31584,7 +32829,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/aliases",
"path": "/api/v1/entities/:ref/aliases",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 97,
+ "line": 103,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31594,7 +32839,7 @@
@@ -31594,7 +32839,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/entities/:ref/aliases/:id",
"path": "/api/v1/entities/:ref/aliases/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 98,
+ "line": 104,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31604,7 +32849,7 @@
@@ -31604,7 +32849,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/corrections",
"path": "/api/v1/entities/:ref/corrections",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 151,
+ "line": 157,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31614,7 +32859,7 @@
@@ -31614,7 +32859,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/entities/:ref/history",
"path": "/api/v1/entities/:ref/history",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 84,
+ "line": 90,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31624,7 +32869,7 @@
@@ -31624,7 +32869,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/links",
"path": "/api/v1/entities/:ref/links",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 99,
+ "line": 105,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31634,7 +32879,7 @@
@@ -31634,7 +32879,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/entities/:ref/links/:id",
"path": "/api/v1/entities/:ref/links/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 100,
+ "line": 106,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31644,7 +32889,7 @@
@@ -31644,7 +32889,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/merge",
"path": "/api/v1/entities/:ref/merge",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 101,
+ "line": 107,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31654,7 +32899,7 @@
@@ -31654,7 +32899,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/split",
"path": "/api/v1/entities/:ref/split",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 105,
+ "line": 111,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31664,7 +32909,7 @@
@@ -31664,7 +32909,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/summary/proposals",
"path": "/api/v1/entities/:ref/summary/proposals",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 145,
+ "line": 151,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31674,7 +32919,7 @@
@@ -31674,7 +32919,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/summary/publish",
"path": "/api/v1/entities/:ref/summary/publish",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 148,
+ "line": 154,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31684,7 +32929,7 @@
@@ -31684,7 +32929,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/summary/revisions",
"path": "/api/v1/entities/:ref/summary/revisions",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 144,
+ "line": 150,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31694,7 +32939,7 @@
@@ -31694,7 +32939,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/entities/:ref/summary/revisions/:n",
"path": "/api/v1/entities/:ref/summary/revisions/:n",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 146,
+ "line": 152,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31704,7 +32949,7 @@
@@ -31704,7 +32949,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/summary/revisions/:n/review",
"path": "/api/v1/entities/:ref/summary/revisions/:n/review",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 147,
+ "line": 153,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31714,7 +32959,7 @@
@@ -31714,7 +32959,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/entities/:ref/summary/unpublish",
"path": "/api/v1/entities/:ref/summary/unpublish",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 149,
+ "line": 155,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31724,7 +32969,7 @@
@@ -31724,7 +32969,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/items",
"path": "/api/v1/items",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 111,
+ "line": 117,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31734,7 +32979,7 @@
@@ -31734,7 +32979,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/items/:id",
"path": "/api/v1/items/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 115,
+ "line": 121,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31744,7 +32989,7 @@
@@ -31744,7 +32989,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/items/:id/resolution",
"path": "/api/v1/items/:id/resolution",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 122,
+ "line": 128,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31754,7 +32999,7 @@
@@ -31754,7 +32999,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/resolve",
"path": "/api/v1/resolve",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 77,
+ "line": 83,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31764,7 +33009,7 @@
@@ -31764,7 +33009,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/signals/import",
"path": "/api/v1/signals/import",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 129,
+ "line": 135,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31774,7 +33019,7 @@
@@ -31774,7 +33019,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/sources/sync",
"path": "/api/v1/sources/sync",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 136,
+ "line": 142,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31784,7 +33029,7 @@
@@ -31784,7 +33029,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/trust",
"path": "/api/v1/trust",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 109,
+ "line": 115,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31854,7 +33099,7 @@
@@ -31854,7 +33099,7 @@
"method": "GET",
"method": "GET",
"path": "/e/:slug",
"path": "/e/:slug",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 176,
+ "line": 180,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31864,7 +33109,7 @@
@@ -31864,7 +33109,7 @@
"method": "GET",
"method": "GET",
"path": "/e/:slug.json",
"path": "/e/:slug.json",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 156,
+ "line": 160,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31874,7 +33119,7 @@
@@ -31874,7 +33119,7 @@
"method": "GET",
"method": "GET",
"path": "/e/:slug/correct",
"path": "/e/:slug/correct",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 204,
+ "line": 208,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31884,7 +33129,7 @@
@@ -31884,7 +33129,7 @@
"method": "POST",
"method": "POST",
"path": "/e/:slug/correct",
"path": "/e/:slug/correct",
"file": "server/app.js",
"file": "server/app.js",
- "line": 125,
+ "line": 129,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31894,7 +33139,7 @@
@@ -31894,7 +33139,7 @@
"method": "POST",
"method": "POST",
"path": "/e/:slug/correct",
"path": "/e/:slug/correct",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 210,
+ "line": 214,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31904,7 +33149,7 @@
@@ -31904,7 +33149,7 @@
"method": "POST",
"method": "POST",
"path": "/e/:slug/discuss",
"path": "/e/:slug/discuss",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 224,
+ "line": 228,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31914,7 +33159,7 @@
@@ -31914,7 +33159,7 @@
"method": "GET",
"method": "GET",
"path": "/e/:slug/edit",
"path": "/e/:slug/edit",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 285,
+ "line": 289,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31924,7 +33169,7 @@
@@ -31924,7 +33169,7 @@
"method": "POST",
"method": "POST",
"path": "/e/:slug/edit",
"path": "/e/:slug/edit",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 291,
+ "line": 295,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31934,7 +33179,7 @@
@@ -31934,7 +33179,7 @@
"method": "GET",
"method": "GET",
"path": "/e/:slug/history",
"path": "/e/:slug/history",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 191,
+ "line": 195,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31944,7 +33189,7 @@
@@ -31944,7 +33189,7 @@
"method": "POST",
"method": "POST",
"path": "/e/:slug/merge",
"path": "/e/:slug/merge",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 339,
+ "line": 343,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31954,7 +33199,7 @@
@@ -31954,7 +33199,7 @@
"method": "POST",
"method": "POST",
"path": "/e/:slug/split",
"path": "/e/:slug/split",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 348,
+ "line": 352,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31964,7 +33209,7 @@
@@ -31964,7 +33209,7 @@
"method": "POST",
"method": "POST",
"path": "/e/:slug/summary",
"path": "/e/:slug/summary",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 317,
+ "line": 321,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31974,7 +33219,7 @@
@@ -31974,7 +33219,7 @@
"method": "GET",
"method": "GET",
"path": "/e/:slug/summary/:n",
"path": "/e/:slug/summary/:n",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 197,
+ "line": 201,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31984,7 +33229,7 @@
@@ -31984,7 +33229,7 @@
"method": "POST",
"method": "POST",
"path": "/e/:slug/summary/:n/review",
"path": "/e/:slug/summary/:n/review",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 330,
+ "line": 334,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -31994,7 +33239,7 @@
@@ -31994,7 +33239,7 @@
"method": "GET",
"method": "GET",
"path": "/editor",
"path": "/editor",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 242,
+ "line": 246,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32004,7 +33249,7 @@
@@ -32004,7 +33249,7 @@
"method": "POST",
"method": "POST",
"path": "/editor/corrections/:id",
"path": "/editor/corrections/:id",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 376,
+ "line": 380,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32014,7 +33259,7 @@
@@ -32014,7 +33259,7 @@
"method": "GET",
"method": "GET",
"path": "/editor/entities/new",
"path": "/editor/entities/new",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 258,
+ "line": 262,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32024,7 +33269,7 @@
@@ -32024,7 +33269,7 @@
"method": "POST",
"method": "POST",
"path": "/editor/entities/new",
"path": "/editor/entities/new",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 262,
+ "line": 266,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32034,7 +33279,7 @@
@@ -32034,7 +33279,7 @@
"method": "GET",
"method": "GET",
"path": "/editor/items/:id",
"path": "/editor/items/:id",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 357,
+ "line": 361,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32044,7 +33289,7 @@
@@ -32044,7 +33289,7 @@
"method": "POST",
"method": "POST",
"path": "/editor/items/:id",
"path": "/editor/items/:id",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 365,
+ "line": 369,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32054,7 +33299,7 @@
@@ -32054,7 +33299,7 @@
"method": "POST",
"method": "POST",
"path": "/editor/sync",
"path": "/editor/sync",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 250,
+ "line": 254,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32114,7 +33359,7 @@
@@ -32114,7 +33359,7 @@
"method": "GET",
"method": "GET",
"path": "/search",
"path": "/search",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 151,
+ "line": 155,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32154,7 +33399,7 @@
@@ -32154,7 +33399,7 @@
"method": "GET",
"method": "GET",
"path": "/updates",
"path": "/updates",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 149,
+ "line": 153,
"target": "OpenVibe.Reviews",
"target": "OpenVibe.Reviews",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32184,6 +33429,12 @@
@@ -32184,6 +33429,12 @@
"TRUST_PROXY": [
"TRUST_PROXY": [
"server/config.js"
"server/config.js"
],
],
+ "REVIEWS_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "REVIEWS_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"REVIEWS_DB_PATH": [
"REVIEWS_DB_PATH": [
"server/config.js"
"server/config.js"
],
],
@@ -32293,7 +33544,7 @@
@@ -32293,7 +33544,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 16,
+ "testFiles": 17,
"ci": true
"ci": true
},
},
{
{
@@ -32301,13 +33552,13 @@
@@ -32301,13 +33552,13 @@
"service": "deals",
"service": "deals",
"present": true,
"present": true,
"git": {
"git": {
- "head": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",
+ "head": "533450f9cc4a358ba50f353f06826ec3611b4ddc",
"branch": "main",
"branch": "main",
- "originMain": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",
- "committedAt": "2026-09-26T06:14:11-07:00"
+ "originMain": "533450f9cc4a358ba50f353f06826ec3611b4ddc",
+ "committedAt": "2026-09-27T19:57:12-07:00"
},
},
- "sourceFiles": 35,
- "loc": 4845,
+ "sourceFiles": 36,
+ "loc": 4980,
"tables": [
"tables": [
{
{
"table": "deal_stores",
"table": "deal_stores",
@@ -32405,7 +33656,7 @@
@@ -32405,7 +33656,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 132,
+ "line": 135,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32415,7 +33666,7 @@
@@ -32415,7 +33666,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 114,
+ "line": 118,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32425,7 +33676,7 @@
@@ -32425,7 +33676,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 118,
+ "line": 122,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32435,7 +33686,7 @@
@@ -32435,7 +33686,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/flags",
"path": "/api/v1/flags",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 144,
+ "line": 148,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32445,7 +33696,7 @@
@@ -32445,7 +33696,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/flags/:id/resolve",
"path": "/api/v1/flags/:id/resolve",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 150,
+ "line": 154,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32455,7 +33706,7 @@
@@ -32455,7 +33706,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/offers",
"path": "/api/v1/offers",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 65,
+ "line": 69,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32465,7 +33716,7 @@
@@ -32465,7 +33716,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/offers",
"path": "/api/v1/offers",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 93,
+ "line": 97,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32475,7 +33726,7 @@
@@ -32475,7 +33726,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/offers/:id",
"path": "/api/v1/offers/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 73,
+ "line": 77,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32485,7 +33736,7 @@
@@ -32485,7 +33736,7 @@
"method": "PATCH",
"method": "PATCH",
"path": "/api/v1/offers/:id",
"path": "/api/v1/offers/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 99,
+ "line": 103,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32495,7 +33746,7 @@
@@ -32495,7 +33746,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/offers/:id/${action}",
"path": "/api/v1/offers/:id/${action}",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 141,
+ "line": 145,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32505,7 +33756,7 @@
@@ -32505,7 +33756,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/offers/:id/expire",
"path": "/api/v1/offers/:id/expire",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 107,
+ "line": 111,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32515,7 +33766,7 @@
@@ -32515,7 +33766,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/offers/:id/flags",
"path": "/api/v1/offers/:id/flags",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 123,
+ "line": 127,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32525,7 +33776,7 @@
@@ -32525,7 +33776,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/offers/:id/hotness",
"path": "/api/v1/offers/:id/hotness",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 82,
+ "line": 86,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32535,7 +33786,7 @@
@@ -32535,7 +33786,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/offers/:id/merge",
"path": "/api/v1/offers/:id/merge",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 129,
+ "line": 133,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32545,7 +33796,7 @@
@@ -32545,7 +33796,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/offers/:id/observations",
"path": "/api/v1/offers/:id/observations",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 101,
+ "line": 105,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32555,7 +33806,7 @@
@@ -32555,7 +33806,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/offers/:id/unmerge",
"path": "/api/v1/offers/:id/unmerge",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 135,
+ "line": 139,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32565,7 +33816,7 @@
@@ -32565,7 +33816,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/offers/:id/vote",
"path": "/api/v1/offers/:id/vote",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 117,
+ "line": 121,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32575,7 +33826,7 @@
@@ -32575,7 +33826,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/offers/:id/vote",
"path": "/api/v1/offers/:id/vote",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 109,
+ "line": 113,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32585,7 +33836,7 @@
@@ -32585,7 +33836,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/products/:slug",
"path": "/api/v1/products/:slug",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 157,
+ "line": 161,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32595,7 +33846,7 @@
@@ -32595,7 +33846,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/products/resolve",
"path": "/api/v1/products/resolve",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 167,
+ "line": 171,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32605,7 +33856,7 @@
@@ -32605,7 +33856,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/stores/:domain",
"path": "/api/v1/stores/:domain",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 181,
+ "line": 185,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32615,7 +33866,7 @@
@@ -32615,7 +33866,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/watches",
"path": "/api/v1/watches",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 189,
+ "line": 193,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32625,7 +33876,7 @@
@@ -32625,7 +33876,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/watches",
"path": "/api/v1/watches",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 191,
+ "line": 195,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32635,7 +33886,7 @@
@@ -32635,7 +33886,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/watches/:id",
"path": "/api/v1/watches/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 196,
+ "line": 200,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32645,7 +33896,7 @@
@@ -32645,7 +33896,7 @@
"method": "GET",
"method": "GET",
"path": "/atom.xml",
"path": "/atom.xml",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 424,
+ "line": 427,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32715,7 +33966,7 @@
@@ -32715,7 +33966,7 @@
"method": "GET",
"method": "GET",
"path": "/d/:slug",
"path": "/d/:slug",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 204,
+ "line": 207,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32725,7 +33976,7 @@
@@ -32725,7 +33976,7 @@
"method": "POST",
"method": "POST",
"path": "/d/:slug/comments",
"path": "/d/:slug/comments",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 235,
+ "line": 238,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32735,7 +33986,7 @@
@@ -32735,7 +33986,7 @@
"method": "POST",
"method": "POST",
"path": "/d/:slug/expire",
"path": "/d/:slug/expire",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 230,
+ "line": 233,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32745,7 +33996,7 @@
@@ -32745,7 +33996,7 @@
"method": "POST",
"method": "POST",
"path": "/d/:slug/flag",
"path": "/d/:slug/flag",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 225,
+ "line": 228,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32755,7 +34006,7 @@
@@ -32755,7 +34006,7 @@
"method": "POST",
"method": "POST",
"path": "/d/:slug/observe",
"path": "/d/:slug/observe",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 220,
+ "line": 223,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32765,7 +34016,7 @@
@@ -32765,7 +34016,7 @@
"method": "POST",
"method": "POST",
"path": "/d/:slug/vote",
"path": "/d/:slug/vote",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 212,
+ "line": 215,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32775,7 +34026,7 @@
@@ -32775,7 +34026,7 @@
"method": "GET",
"method": "GET",
"path": "/feed.json",
"path": "/feed.json",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 428,
+ "line": 431,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32785,7 +34036,7 @@
@@ -32785,7 +34036,7 @@
"method": "GET",
"method": "GET",
"path": "/feed.xml",
"path": "/feed.xml",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 423,
+ "line": 426,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32815,7 +34066,7 @@
@@ -32815,7 +34066,7 @@
"method": "GET",
"method": "GET",
"path": "/mod",
"path": "/mod",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 371,
+ "line": 374,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32825,7 +34076,7 @@
@@ -32825,7 +34076,7 @@
"method": "POST",
"method": "POST",
"path": "/mod/flags/:id/:action",
"path": "/mod/flags/:id/:action",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 398,
+ "line": 401,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32835,7 +34086,7 @@
@@ -32835,7 +34086,7 @@
"method": "POST",
"method": "POST",
"path": "/mod/offers/:slug/:action",
"path": "/mod/offers/:slug/:action",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 380,
+ "line": 383,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32845,7 +34096,7 @@
@@ -32845,7 +34096,7 @@
"method": "GET",
"method": "GET",
"path": "/new",
"path": "/new",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 139,
+ "line": 142,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32855,7 +34106,7 @@
@@ -32855,7 +34106,7 @@
"method": "GET",
"method": "GET",
"path": "/p/:slug",
"path": "/p/:slug",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 252,
+ "line": 255,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32875,7 +34126,7 @@
@@ -32875,7 +34126,7 @@
"method": "GET",
"method": "GET",
"path": "/s/:domain",
"path": "/s/:domain",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 275,
+ "line": 278,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32885,7 +34136,7 @@
@@ -32885,7 +34136,7 @@
"method": "GET",
"method": "GET",
"path": "/search",
"path": "/search",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 293,
+ "line": 296,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32925,7 +34176,7 @@
@@ -32925,7 +34176,7 @@
"method": "GET",
"method": "GET",
"path": "/submit",
"path": "/submit",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 307,
+ "line": 310,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32935,7 +34186,7 @@
@@ -32935,7 +34186,7 @@
"method": "POST",
"method": "POST",
"path": "/submit",
"path": "/submit",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 314,
+ "line": 317,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32945,7 +34196,7 @@
@@ -32945,7 +34196,7 @@
"method": "GET",
"method": "GET",
"path": "/updates",
"path": "/updates",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 134,
+ "line": 137,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32955,7 +34206,7 @@
@@ -32955,7 +34206,7 @@
"method": "GET",
"method": "GET",
"path": "/watches",
"path": "/watches",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 341,
+ "line": 344,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32965,7 +34216,7 @@
@@ -32965,7 +34216,7 @@
"method": "POST",
"method": "POST",
"path": "/watches",
"path": "/watches",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 346,
+ "line": 349,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -32975,7 +34226,7 @@
@@ -32975,7 +34226,7 @@
"method": "POST",
"method": "POST",
"path": "/watches/:id/delete",
"path": "/watches/:id/delete",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 358,
+ "line": 361,
"target": "OpenVibe.Deals",
"target": "OpenVibe.Deals",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33002,6 +34253,12 @@
@@ -33002,6 +34253,12 @@
"TRUST_PROXY": [
"TRUST_PROXY": [
"server/config.js"
"server/config.js"
],
],
+ "DEALS_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "DEALS_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"DEALS_DB_PATH": [
"DEALS_DB_PATH": [
"server/config.js"
"server/config.js"
],
],
@@ -33237,7 +34494,7 @@
@@ -33237,7 +34494,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 16,
+ "testFiles": 17,
"ci": true
"ci": true
},
},
{
{
@@ -33245,13 +34502,13 @@
@@ -33245,13 +34502,13 @@
"service": "coupons",
"service": "coupons",
"present": true,
"present": true,
"git": {
"git": {
- "head": "348f585cd6549a5c506171fba0fc2c5462dede32",
+ "head": "b91cd795e8ee4a3e49317a6e3cb000fa92da9325",
"branch": "main",
"branch": "main",
- "originMain": "348f585cd6549a5c506171fba0fc2c5462dede32",
- "committedAt": "2026-09-26T06:13:57-07:00"
+ "originMain": "b91cd795e8ee4a3e49317a6e3cb000fa92da9325",
+ "committedAt": "2026-09-27T19:56:35-07:00"
},
},
- "sourceFiles": 28,
- "loc": 4155,
+ "sourceFiles": 29,
+ "loc": 4289,
"tables": [
"tables": [
{
{
"table": "coupon_merchants",
"table": "coupon_merchants",
@@ -33331,7 +34588,7 @@
@@ -33331,7 +34588,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 105,
+ "line": 108,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33341,7 +34598,7 @@
@@ -33341,7 +34598,7 @@
"method": "GET",
"method": "GET",
"path": "/about",
"path": "/about",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 118,
+ "line": 121,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33351,7 +34608,7 @@
@@ -33351,7 +34608,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 98,
+ "line": 105,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33361,7 +34618,7 @@
@@ -33361,7 +34618,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 102,
+ "line": 109,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33371,7 +34628,7 @@
@@ -33371,7 +34628,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/coupons/:id",
"path": "/api/v1/coupons/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 143,
+ "line": 148,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33381,7 +34638,7 @@
@@ -33381,7 +34638,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/coupons/:id/report",
"path": "/api/v1/coupons/:id/report",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 152,
+ "line": 157,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33391,7 +34648,7 @@
@@ -33391,7 +34648,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/coupons/:id/status",
"path": "/api/v1/coupons/:id/status",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 176,
+ "line": 181,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33401,7 +34658,7 @@
@@ -33401,7 +34658,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/coupons/submit",
"path": "/api/v1/coupons/submit",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 158,
+ "line": 163,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33411,7 +34668,7 @@
@@ -33411,7 +34668,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/merchants",
"path": "/api/v1/merchants",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 186,
+ "line": 191,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33421,7 +34678,7 @@
@@ -33421,7 +34678,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/merchants/:id",
"path": "/api/v1/merchants/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 137,
+ "line": 142,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33431,7 +34688,7 @@
@@ -33431,7 +34688,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/merchants/:id/coupons",
"path": "/api/v1/merchants/:id/coupons",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 131,
+ "line": 136,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33441,7 +34698,7 @@
@@ -33441,7 +34698,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/merchants/:id/domains",
"path": "/api/v1/merchants/:id/domains",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 196,
+ "line": 201,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33451,7 +34708,7 @@
@@ -33451,7 +34708,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/merchants/:id/status",
"path": "/api/v1/merchants/:id/status",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 205,
+ "line": 210,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33461,7 +34718,7 @@
@@ -33461,7 +34718,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/merchants/resolve",
"path": "/api/v1/merchants/resolve",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 115,
+ "line": 120,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33541,7 +34798,7 @@
@@ -33541,7 +34798,7 @@
"method": "GET",
"method": "GET",
"path": "/c/:id",
"path": "/c/:id",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 199,
+ "line": 202,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33551,7 +34808,7 @@
@@ -33551,7 +34808,7 @@
"method": "GET",
"method": "GET",
"path": "/c/:id.json",
"path": "/c/:id.json",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 189,
+ "line": 192,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33561,7 +34818,7 @@
@@ -33561,7 +34818,7 @@
"method": "POST",
"method": "POST",
"path": "/c/:id/report",
"path": "/c/:id/report",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 213,
+ "line": 216,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33571,7 +34828,7 @@
@@ -33571,7 +34828,7 @@
"method": "GET",
"method": "GET",
"path": "/connect-extension",
"path": "/connect-extension",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 271,
+ "line": 274,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33581,7 +34838,7 @@
@@ -33581,7 +34838,7 @@
"method": "POST",
"method": "POST",
"path": "/connect-extension",
"path": "/connect-extension",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 272,
+ "line": 275,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33591,7 +34848,7 @@
@@ -33591,7 +34848,7 @@
"method": "POST",
"method": "POST",
"path": "/connect-extension/:id/revoke",
"path": "/connect-extension/:id/revoke",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 282,
+ "line": 285,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33631,7 +34888,7 @@
@@ -33631,7 +34888,7 @@
"method": "GET",
"method": "GET",
"path": "/m/:slug",
"path": "/m/:slug",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 151,
+ "line": 154,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33641,7 +34898,7 @@
@@ -33641,7 +34898,7 @@
"method": "GET",
"method": "GET",
"path": "/m/:slug.json",
"path": "/m/:slug.json",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 140,
+ "line": 143,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33661,7 +34918,7 @@
@@ -33661,7 +34918,7 @@
"method": "POST",
"method": "POST",
"path": "/m/:slug/watch",
"path": "/m/:slug/watch",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 171,
+ "line": 174,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33711,7 +34968,7 @@
@@ -33711,7 +34968,7 @@
"method": "GET",
"method": "GET",
"path": "/staff",
"path": "/staff",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 324,
+ "line": 327,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33721,7 +34978,7 @@
@@ -33721,7 +34978,7 @@
"method": "POST",
"method": "POST",
"path": "/staff/coupons/:id/approve",
"path": "/staff/coupons/:id/approve",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 337,
+ "line": 340,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33731,7 +34988,7 @@
@@ -33731,7 +34988,7 @@
"method": "POST",
"method": "POST",
"path": "/staff/merchants",
"path": "/staff/merchants",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 325,
+ "line": 328,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33741,7 +34998,7 @@
@@ -33741,7 +34998,7 @@
"method": "POST",
"method": "POST",
"path": "/staff/merchants/:id/status",
"path": "/staff/merchants/:id/status",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 331,
+ "line": 334,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33751,7 +35008,7 @@
@@ -33751,7 +35008,7 @@
"method": "GET",
"method": "GET",
"path": "/submit",
"path": "/submit",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 227,
+ "line": 230,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33761,7 +35018,7 @@
@@ -33761,7 +35018,7 @@
"method": "POST",
"method": "POST",
"path": "/submit",
"path": "/submit",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 236,
+ "line": 239,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33771,7 +35028,7 @@
@@ -33771,7 +35028,7 @@
"method": "GET",
"method": "GET",
"path": "/updates",
"path": "/updates",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 100,
+ "line": 103,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33781,7 +35038,7 @@
@@ -33781,7 +35038,7 @@
"method": "GET",
"method": "GET",
"path": "/watching",
"path": "/watching",
"file": "server/http/public.js",
"file": "server/http/public.js",
- "line": 288,
+ "line": 291,
"target": "OpenVibe.Coupons",
"target": "OpenVibe.Coupons",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -33808,6 +35065,12 @@
@@ -33808,6 +35065,12 @@
"TRUST_PROXY": [
"TRUST_PROXY": [
"server/config.js"
"server/config.js"
],
],
+ "COUPONS_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "COUPONS_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"COUPONS_DB_PATH": [
"COUPONS_DB_PATH": [
"server/config.js"
"server/config.js"
],
],
@@ -34024,7 +35287,7 @@
@@ -34024,7 +35287,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 15,
+ "testFiles": 16,
"ci": true
"ci": true
},
},
{
{
@@ -34032,13 +35295,13 @@
@@ -34032,13 +35295,13 @@
"service": "trade",
"service": "trade",
"present": true,
"present": true,
"git": {
"git": {
- "head": "fa382881cd92ee90b6329699d7d79129e32a6325",
+ "head": "273bce7b1b8771037bc2a660fa8784dc1aa049a7",
"branch": "main",
"branch": "main",
- "originMain": "fa382881cd92ee90b6329699d7d79129e32a6325",
- "committedAt": "2026-09-26T06:21:08-07:00"
+ "originMain": "273bce7b1b8771037bc2a660fa8784dc1aa049a7",
+ "committedAt": "2026-09-27T19:58:02-07:00"
},
},
- "sourceFiles": 36,
- "loc": 4431,
+ "sourceFiles": 37,
+ "loc": 4562,
"tables": [
"tables": [
{
{
"table": "trade_instruments",
"table": "trade_instruments",
@@ -34193,6 +35456,12 @@
@@ -34193,6 +35456,12 @@
"TRUST_PROXY": [
"TRUST_PROXY": [
"server/config.js"
"server/config.js"
],
],
+ "TRADE_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "TRADE_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"TRADE_DB_PATH": [
"TRADE_DB_PATH": [
"server/config.js"
"server/config.js"
],
],
@@ -34391,7 +35660,7 @@
@@ -34391,7 +35660,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 15,
+ "testFiles": 16,
"ci": true
"ci": true
},
},
{
{
@@ -34399,13 +35668,13 @@
@@ -34399,13 +35668,13 @@
"service": "codes",
"service": "codes",
"present": true,
"present": true,
"git": {
"git": {
- "head": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",
+ "head": "7d6f65ac198d95f70ac840c24d03d1407affb7a9",
"branch": "main",
"branch": "main",
- "originMain": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",
- "committedAt": "2026-09-26T06:13:08-07:00"
+ "originMain": "7d6f65ac198d95f70ac840c24d03d1407affb7a9",
+ "committedAt": "2026-09-27T20:00:39-07:00"
},
},
- "sourceFiles": 29,
- "loc": 4803,
+ "sourceFiles": 32,
+ "loc": 5091,
"tables": [
"tables": [
{
{
"table": "manifests",
"table": "manifests",
@@ -34465,7 +35734,7 @@
@@ -34465,7 +35734,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 102,
+ "line": 112,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34475,7 +35744,7 @@
@@ -34475,7 +35744,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 106,
+ "line": 116,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34485,7 +35754,7 @@
@@ -34485,7 +35754,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/apps/:app/releases",
"path": "/api/v1/apps/:app/releases",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 65,
+ "line": 69,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34495,7 +35764,7 @@
@@ -34495,7 +35764,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/apps/:app/releases",
"path": "/api/v1/apps/:app/releases",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 107,
+ "line": 111,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34505,7 +35774,7 @@
@@ -34505,7 +35774,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/apps/:app/trust",
"path": "/api/v1/apps/:app/trust",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 70,
+ "line": 74,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34515,7 +35784,7 @@
@@ -34515,7 +35784,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/docs/versions",
"path": "/api/v1/docs/versions",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 42,
+ "line": 46,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34525,7 +35794,7 @@
@@ -34525,7 +35794,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/manifests/validate",
"path": "/api/v1/manifests/validate",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 46,
+ "line": 50,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34535,7 +35804,7 @@
@@ -34535,7 +35804,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/releases/:id",
"path": "/api/v1/releases/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 75,
+ "line": 79,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34545,7 +35814,7 @@
@@ -34545,7 +35814,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/releases/:id/${action}",
"path": "/api/v1/releases/:id/${action}",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 123,
+ "line": 127,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34575,7 +35844,7 @@
@@ -34575,7 +35844,7 @@
"method": "GET",
"method": "GET",
"path": "/docs",
"path": "/docs",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 42,
+ "line": 43,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34585,7 +35854,7 @@
@@ -34585,7 +35854,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/adr/:id",
"path": "/docs/adr/:id",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 542,
+ "line": 513,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34595,7 +35864,7 @@
@@ -34595,7 +35864,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/api",
"path": "/docs/api",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 182,
+ "line": 183,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34605,7 +35874,7 @@
@@ -34605,7 +35874,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/api/:service",
"path": "/docs/api/:service",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 203,
+ "line": 204,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34615,7 +35884,7 @@
@@ -34615,7 +35884,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/api/:service.json",
"path": "/docs/api/:service.json",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 197,
+ "line": 198,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34625,7 +35894,7 @@
@@ -34625,7 +35894,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/billing",
"path": "/docs/billing",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 371,
+ "line": 372,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34635,7 +35904,7 @@
@@ -34635,7 +35904,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/capabilities",
"path": "/docs/capabilities",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 125,
+ "line": 126,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34645,7 +35914,7 @@
@@ -34645,7 +35914,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/capabilities/:id",
"path": "/docs/capabilities/:id",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 144,
+ "line": 145,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34655,7 +35924,7 @@
@@ -34655,7 +35924,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/contracts",
"path": "/docs/contracts",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 72,
+ "line": 73,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34665,7 +35934,7 @@
@@ -34665,7 +35934,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/contracts/:id",
"path": "/docs/contracts/:id",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 91,
+ "line": 92,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34675,7 +35944,7 @@
@@ -34675,7 +35944,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/contracts/:id.json",
"path": "/docs/contracts/:id.json",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 85,
+ "line": 86,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34685,7 +35954,7 @@
@@ -34685,7 +35954,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/events",
"path": "/docs/events",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 296,
+ "line": 297,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34695,7 +35964,7 @@
@@ -34695,7 +35964,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/export",
"path": "/docs/export",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 484,
+ "line": 455,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34705,7 +35974,7 @@
@@ -34705,7 +35974,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/limits",
"path": "/docs/limits",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 452,
+ "line": 422,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34715,7 +35984,7 @@
@@ -34715,7 +35984,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/sdk",
"path": "/docs/sdk",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 517,
+ "line": 488,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34725,7 +35994,7 @@
@@ -34725,7 +35994,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/sdk/:module",
"path": "/docs/sdk/:module",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 529,
+ "line": 500,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34735,7 +36004,7 @@
@@ -34735,7 +36004,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/services",
"path": "/docs/services",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 307,
+ "line": 308,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34745,7 +36014,7 @@
@@ -34745,7 +36014,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/tools",
"path": "/docs/tools",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 338,
+ "line": 339,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34755,7 +36024,7 @@
@@ -34755,7 +36024,7 @@
"method": "GET",
"method": "GET",
"path": "/docs/updates",
"path": "/docs/updates",
"file": "server/http/docs.js",
"file": "server/http/docs.js",
- "line": 249,
+ "line": 250,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34805,7 +36074,7 @@
@@ -34805,7 +36074,7 @@
"method": "GET",
"method": "GET",
"path": "/manifests/validate",
"path": "/manifests/validate",
"file": "server/http/tools.js",
"file": "server/http/tools.js",
- "line": 172,
+ "line": 175,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34815,7 +36084,7 @@
@@ -34815,7 +36084,7 @@
"method": "POST",
"method": "POST",
"path": "/manifests/validate",
"path": "/manifests/validate",
"file": "server/http/tools.js",
"file": "server/http/tools.js",
- "line": 173,
+ "line": 176,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34835,7 +36104,7 @@
@@ -34835,7 +36104,7 @@
"method": "GET",
"method": "GET",
"path": "/oauth",
"path": "/oauth",
"file": "server/http/tools.js",
"file": "server/http/tools.js",
- "line": 29,
+ "line": 32,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34845,7 +36114,7 @@
@@ -34845,7 +36114,7 @@
"method": "GET",
"method": "GET",
"path": "/oauth/test-callback",
"path": "/oauth/test-callback",
"file": "server/http/tools.js",
"file": "server/http/tools.js",
- "line": 65,
+ "line": 68,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34915,7 +36184,7 @@
@@ -34915,7 +36184,7 @@
"method": "GET",
"method": "GET",
"path": "/projects",
"path": "/projects",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 110,
+ "line": 117,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34925,7 +36194,7 @@
@@ -34925,7 +36194,7 @@
"method": "POST",
"method": "POST",
"path": "/projects",
"path": "/projects",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 111,
+ "line": 118,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34935,7 +36204,7 @@
@@ -34935,7 +36204,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:id/${action}",
"path": "/projects/:id/${action}",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 671,
+ "line": 697,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34945,7 +36214,7 @@
@@ -34945,7 +36214,7 @@
"method": "GET",
"method": "GET",
"path": "/projects/:project",
"path": "/projects/:project",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 124,
+ "line": 131,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34955,7 +36224,7 @@
@@ -34955,7 +36224,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps",
"path": "/projects/:project/apps",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 346,
+ "line": 370,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34965,7 +36234,7 @@
@@ -34965,7 +36234,7 @@
"method": "GET",
"method": "GET",
"path": "/projects/:project/apps/:app",
"path": "/projects/:project/apps/:app",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 389,
+ "line": 413,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34975,7 +36244,7 @@
@@ -34975,7 +36244,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps/:app/credentials/:credential/revoke",
"path": "/projects/:project/apps/:app/credentials/:credential/revoke",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 498,
+ "line": 522,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34985,7 +36254,7 @@
@@ -34985,7 +36254,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps/:app/credentials/rotate",
"path": "/projects/:project/apps/:app/credentials/rotate",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 487,
+ "line": 511,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -34995,7 +36264,7 @@
@@ -34995,7 +36264,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps/:app/grants",
"path": "/projects/:project/apps/:app/grants",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 504,
+ "line": 528,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35005,7 +36274,7 @@
@@ -35005,7 +36274,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps/:app/grants/:capability/${action}",
"path": "/projects/:project/apps/:app/grants/:capability/${action}",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 520,
+ "line": 544,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35015,7 +36284,7 @@
@@ -35015,7 +36284,7 @@
"method": "GET",
"method": "GET",
"path": "/projects/:project/apps/:app/playground",
"path": "/projects/:project/apps/:app/playground",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 575,
+ "line": 599,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35025,7 +36294,7 @@
@@ -35025,7 +36294,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps/:app/playground/events",
"path": "/projects/:project/apps/:app/playground/events",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 577,
+ "line": 601,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35035,7 +36304,7 @@
@@ -35035,7 +36304,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps/:app/playground/media",
"path": "/projects/:project/apps/:app/playground/media",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 590,
+ "line": 614,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35045,7 +36314,7 @@
@@ -35045,7 +36314,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps/:app/redirects",
"path": "/projects/:project/apps/:app/redirects",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 478,
+ "line": 502,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35055,7 +36324,7 @@
@@ -35055,7 +36324,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps/:app/releases",
"path": "/projects/:project/apps/:app/releases",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 631,
+ "line": 655,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35065,7 +36334,7 @@
@@ -35065,7 +36334,7 @@
"method": "GET",
"method": "GET",
"path": "/projects/:project/apps/:app/releases/new",
"path": "/projects/:project/apps/:app/releases/new",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 630,
+ "line": 654,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35075,7 +36344,7 @@
@@ -35075,7 +36344,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/apps/:app/revoke",
"path": "/projects/:project/apps/:app/revoke",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 482,
+ "line": 506,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35085,7 +36354,7 @@
@@ -35085,7 +36354,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/archive",
"path": "/projects/:project/archive",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 230,
+ "line": 237,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35095,7 +36364,7 @@
@@ -35095,7 +36364,7 @@
"method": "GET",
"method": "GET",
"path": "/projects/:project/audit",
"path": "/projects/:project/audit",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 303,
+ "line": 310,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35105,7 +36374,7 @@
@@ -35105,7 +36374,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/delete",
"path": "/projects/:project/delete",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 286,
+ "line": 293,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35115,7 +36384,7 @@
@@ -35115,7 +36384,7 @@
"method": "GET",
"method": "GET",
"path": "/projects/:project/export",
"path": "/projects/:project/export",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 236,
+ "line": 243,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35125,7 +36394,7 @@
@@ -35125,7 +36394,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/export/archive",
"path": "/projects/:project/export/archive",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 252,
+ "line": 259,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35135,7 +36404,7 @@
@@ -35135,7 +36404,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/members",
"path": "/projects/:project/members",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 213,
+ "line": 220,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35145,7 +36414,7 @@
@@ -35145,7 +36414,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/members/:subject/remove",
"path": "/projects/:project/members/:subject/remove",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 223,
+ "line": 230,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35155,7 +36424,17 @@
@@ -35155,7 +36424,17 @@
"method": "POST",
"method": "POST",
"path": "/projects/:project/members/:subject/role",
"path": "/projects/:project/members/:subject/role",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 218,
+ "line": 225,
+ "target": "OpenVibe.Codes",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/projects/:project/usage",
+ "file": "server/http/portal.js",
+ "line": 327,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35165,7 +36444,7 @@
@@ -35165,7 +36444,7 @@
"method": "GET",
"method": "GET",
"path": "/releases",
"path": "/releases",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 110,
+ "line": 117,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35175,7 +36454,7 @@
@@ -35175,7 +36454,7 @@
"method": "POST",
"method": "POST",
"path": "/releases",
"path": "/releases",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 111,
+ "line": 118,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35195,7 +36474,7 @@
@@ -35195,7 +36474,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:id/${action}",
"path": "/releases/:id/${action}",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 671,
+ "line": 697,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35205,7 +36484,7 @@
@@ -35205,7 +36484,7 @@
"method": "GET",
"method": "GET",
"path": "/releases/:project",
"path": "/releases/:project",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 124,
+ "line": 131,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35215,7 +36494,7 @@
@@ -35215,7 +36494,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps",
"path": "/releases/:project/apps",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 346,
+ "line": 370,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35225,7 +36504,7 @@
@@ -35225,7 +36504,7 @@
"method": "GET",
"method": "GET",
"path": "/releases/:project/apps/:app",
"path": "/releases/:project/apps/:app",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 389,
+ "line": 413,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35235,7 +36514,7 @@
@@ -35235,7 +36514,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps/:app/credentials/:credential/revoke",
"path": "/releases/:project/apps/:app/credentials/:credential/revoke",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 498,
+ "line": 522,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35245,7 +36524,7 @@
@@ -35245,7 +36524,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps/:app/credentials/rotate",
"path": "/releases/:project/apps/:app/credentials/rotate",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 487,
+ "line": 511,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35255,7 +36534,7 @@
@@ -35255,7 +36534,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps/:app/grants",
"path": "/releases/:project/apps/:app/grants",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 504,
+ "line": 528,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35265,7 +36544,7 @@
@@ -35265,7 +36544,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps/:app/grants/:capability/${action}",
"path": "/releases/:project/apps/:app/grants/:capability/${action}",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 520,
+ "line": 544,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35275,7 +36554,7 @@
@@ -35275,7 +36554,7 @@
"method": "GET",
"method": "GET",
"path": "/releases/:project/apps/:app/playground",
"path": "/releases/:project/apps/:app/playground",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 575,
+ "line": 599,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35285,7 +36564,7 @@
@@ -35285,7 +36564,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps/:app/playground/events",
"path": "/releases/:project/apps/:app/playground/events",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 577,
+ "line": 601,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35295,7 +36574,7 @@
@@ -35295,7 +36574,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps/:app/playground/media",
"path": "/releases/:project/apps/:app/playground/media",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 590,
+ "line": 614,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35305,7 +36584,7 @@
@@ -35305,7 +36584,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps/:app/redirects",
"path": "/releases/:project/apps/:app/redirects",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 478,
+ "line": 502,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35315,7 +36594,7 @@
@@ -35315,7 +36594,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps/:app/releases",
"path": "/releases/:project/apps/:app/releases",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 631,
+ "line": 655,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35325,7 +36604,7 @@
@@ -35325,7 +36604,7 @@
"method": "GET",
"method": "GET",
"path": "/releases/:project/apps/:app/releases/new",
"path": "/releases/:project/apps/:app/releases/new",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 630,
+ "line": 654,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35335,7 +36614,7 @@
@@ -35335,7 +36614,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/apps/:app/revoke",
"path": "/releases/:project/apps/:app/revoke",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 482,
+ "line": 506,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35345,7 +36624,7 @@
@@ -35345,7 +36624,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/archive",
"path": "/releases/:project/archive",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 230,
+ "line": 237,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35355,7 +36634,7 @@
@@ -35355,7 +36634,7 @@
"method": "GET",
"method": "GET",
"path": "/releases/:project/audit",
"path": "/releases/:project/audit",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 303,
+ "line": 310,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35365,7 +36644,7 @@
@@ -35365,7 +36644,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/delete",
"path": "/releases/:project/delete",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 286,
+ "line": 293,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35375,7 +36654,7 @@
@@ -35375,7 +36654,7 @@
"method": "GET",
"method": "GET",
"path": "/releases/:project/export",
"path": "/releases/:project/export",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 236,
+ "line": 243,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35385,7 +36664,7 @@
@@ -35385,7 +36664,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/export/archive",
"path": "/releases/:project/export/archive",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 252,
+ "line": 259,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35395,7 +36674,7 @@
@@ -35395,7 +36674,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/members",
"path": "/releases/:project/members",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 213,
+ "line": 220,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35405,7 +36684,7 @@
@@ -35405,7 +36684,7 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/members/:subject/remove",
"path": "/releases/:project/members/:subject/remove",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 223,
+ "line": 230,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35415,7 +36694,17 @@
@@ -35415,7 +36694,17 @@
"method": "POST",
"method": "POST",
"path": "/releases/:project/members/:subject/role",
"path": "/releases/:project/members/:subject/role",
"file": "server/http/portal.js",
"file": "server/http/portal.js",
- "line": 218,
+ "line": 225,
+ "target": "OpenVibe.Codes",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "The service is the authority for its own API and pages."
+ },
+ {
+ "method": "GET",
+ "path": "/releases/:project/usage",
+ "file": "server/http/portal.js",
+ "line": 327,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35425,7 +36714,7 @@
@@ -35425,7 +36714,7 @@
"method": "GET",
"method": "GET",
"path": "/robots.txt",
"path": "/robots.txt",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 267,
+ "line": 268,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35435,7 +36724,7 @@
@@ -35435,7 +36724,7 @@
"method": "GET",
"method": "GET",
"path": "/sitemap.xml",
"path": "/sitemap.xml",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 273,
+ "line": 274,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35455,7 +36744,7 @@
@@ -35455,7 +36744,7 @@
"method": "POST",
"method": "POST",
"path": "/staff/trust",
"path": "/staff/trust",
"file": "server/http/pages.js",
"file": "server/http/pages.js",
- "line": 256,
+ "line": 257,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35465,7 +36754,7 @@
@@ -35465,7 +36754,7 @@
"method": "GET",
"method": "GET",
"path": "/tools/webhooks",
"path": "/tools/webhooks",
"file": "server/http/tools.js",
"file": "server/http/tools.js",
- "line": 143,
+ "line": 146,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35475,7 +36764,7 @@
@@ -35475,7 +36764,7 @@
"method": "POST",
"method": "POST",
"path": "/tools/webhooks/sample",
"path": "/tools/webhooks/sample",
"file": "server/http/tools.js",
"file": "server/http/tools.js",
- "line": 149,
+ "line": 152,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35485,7 +36774,7 @@
@@ -35485,7 +36774,7 @@
"method": "POST",
"method": "POST",
"path": "/tools/webhooks/verify",
"path": "/tools/webhooks/verify",
"file": "server/http/tools.js",
"file": "server/http/tools.js",
- "line": 144,
+ "line": 147,
"target": "OpenVibe.Codes",
"target": "OpenVibe.Codes",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35528,6 +36817,12 @@
@@ -35528,6 +36817,12 @@
"TRUST_PROXY": [
"TRUST_PROXY": [
"server/config.js"
"server/config.js"
],
],
+ "CODES_LIMITS_MINUTE": [
+ "server/config.js"
+ ],
+ "CODES_LIMITS_HOUR": [
+ "server/config.js"
+ ],
"CODES_DB_PATH": [
"CODES_DB_PATH": [
"server/config.js"
"server/config.js"
],
],
@@ -35575,14 +36870,14 @@
@@ -35575,14 +36870,14 @@
],
],
"OV_MEDIA_INTERNAL_URL": [
"OV_MEDIA_INTERNAL_URL": [
"server/config.js",
"server/config.js",
- "server/http/docs.js"
+ "server/domain/limits.js"
],
],
"CODES_EXPORT_EVENTS_URL": [
"CODES_EXPORT_EVENTS_URL": [
"server/config.js"
"server/config.js"
],
],
"OV_EVENTS_INTERNAL_URL": [
"OV_EVENTS_INTERNAL_URL": [
"server/config.js",
"server/config.js",
- "server/http/docs.js"
+ "server/domain/limits.js"
],
],
"CODES_EXPORT_MAX_OBJECTS": [
"CODES_EXPORT_MAX_OBJECTS": [
"server/config.js"
"server/config.js"
@@ -35602,15 +36897,15 @@
@@ -35602,15 +36897,15 @@
"EVENTS_RELAY_INTERVAL_MS": [
"EVENTS_RELAY_INTERVAL_MS": [
"server/config.js"
"server/config.js"
],
],
+ "OV_HOST_INTERNAL_URL": [
+ "server/domain/limits.js"
+ ],
"OV_TOOLS_INTERNAL_URL": [
"OV_TOOLS_INTERNAL_URL": [
"server/http/docs.js"
"server/http/docs.js"
],
],
"OV_BILLING_INTERNAL_URL": [
"OV_BILLING_INTERNAL_URL": [
"server/http/docs.js"
"server/http/docs.js"
],
],
- "OV_HOST_INTERNAL_URL": [
- "server/http/docs.js"
- ],
"OV_CLIENT_SECRET": [
"OV_CLIENT_SECRET": [
"server/http/portal.js"
"server/http/portal.js"
],
],
@@ -35628,6 +36923,51 @@
@@ -35628,6 +36923,51 @@
]
]
},
},
"outbound": [
"outbound": [
+ {
+ "file": "server/domain/limits.js",
+ "targets": [
+ {
+ "service": "host",
+ "refs": [
+ {
+ "via": ":4910",
+ "line": 14
+ }
+ ]
+ },
+ {
+ "service": "events",
+ "refs": [
+ {
+ "via": "OV_EVENTS_INTERNAL_URL",
+ "line": 15
+ },
+ {
+ "via": ":4300",
+ "line": 15
+ }
+ ]
+ },
+ {
+ "service": "media",
+ "refs": [
+ {
+ "via": "OV_MEDIA_INTERNAL_URL",
+ "line": 16
+ },
+ {
+ "via": ":4100",
+ "line": 16
+ }
+ ]
+ }
+ ],
+ "auth": [
+ "none-detected"
+ ],
+ "timeout": true,
+ "retry": false
+ },
{
{
"file": "server/domain/project-archive.js",
"file": "server/domain/project-archive.js",
"targets": [
"targets": [
@@ -35673,7 +37013,7 @@
@@ -35673,7 +37013,7 @@
"refs": [
"refs": [
{
{
"via": "networkUrl",
"via": "networkUrl",
- "line": 250
+ "line": 251
}
}
]
]
},
},
@@ -35682,11 +37022,11 @@
@@ -35682,11 +37022,11 @@
"refs": [
"refs": [
{
{
"via": "OV_TOOLS_INTERNAL_URL",
"via": "OV_TOOLS_INTERNAL_URL",
- "line": 336
+ "line": 337
},
},
{
{
"via": ":4001",
"via": ":4001",
- "line": 336
+ "line": 337
}
}
]
]
},
},
@@ -35695,46 +37035,11 @@
@@ -35695,46 +37035,11 @@
"refs": [
"refs": [
{
{
"via": "OV_BILLING_INTERNAL_URL",
"via": "OV_BILLING_INTERNAL_URL",
- "line": 369
+ "line": 370
},
},
{
{
"via": ":4600",
"via": ":4600",
- "line": 369
- }
- ]
- },
- {
- "service": "host",
- "refs": [
- {
- "via": ":4910",
- "line": 420
- }
- ]
- },
- {
- "service": "events",
- "refs": [
- {
- "via": "OV_EVENTS_INTERNAL_URL",
- "line": 421
- },
- {
- "via": ":4300",
- "line": 421
- }
- ]
- },
- {
- "service": "media",
- "refs": [
- {
- "via": "OV_MEDIA_INTERNAL_URL",
- "line": 422
- },
- {
- "via": ":4100",
- "line": 422
+ "line": 370
}
}
]
]
}
}
@@ -35749,7 +37054,7 @@
@@ -35749,7 +37054,7 @@
"jobs": [],
"jobs": [],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 27,
+ "testFiles": 34,
"ci": true
"ci": true
},
},
{
{
@@ -35757,13 +37062,13 @@
@@ -35757,13 +37062,13 @@
"service": "host",
"service": "host",
"present": true,
"present": true,
"git": {
"git": {
- "head": "75147890e32dd63fd1363f843c87415f90d5b2dd",
+ "head": "6d2aaaa630e29d2bfd261a7f75cbbbaa2b8c1d46",
"branch": "main",
"branch": "main",
- "originMain": "75147890e32dd63fd1363f843c87415f90d5b2dd",
- "committedAt": "2026-09-26T06:15:11-07:00"
+ "originMain": "6d2aaaa630e29d2bfd261a7f75cbbbaa2b8c1d46",
+ "committedAt": "2026-09-27T20:22:17-07:00"
},
},
- "sourceFiles": 60,
- "loc": 9185,
+ "sourceFiles": 68,
+ "loc": 11899,
"tables": [
"tables": [
{
{
"table": "host_projects",
"table": "host_projects",
@@ -35837,7 +37142,7 @@
@@ -35837,7 +37142,7 @@
"method": "GET",
"method": "GET",
"path": "/",
"path": "/",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 68,
+ "line": 69,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35847,7 +37152,7 @@
@@ -35847,7 +37152,7 @@
"method": "GET",
"method": "GET",
"path": "/api/health",
"path": "/api/health",
"file": "server/app.js",
"file": "server/app.js",
- "line": 131,
+ "line": 133,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35857,7 +37162,7 @@
@@ -35857,7 +37162,7 @@
"method": "GET",
"method": "GET",
"path": "/api/ready",
"path": "/api/ready",
"file": "server/app.js",
"file": "server/app.js",
- "line": 137,
+ "line": 139,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35867,7 +37172,7 @@
@@ -35867,7 +37172,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/deploys/:id",
"path": "/api/v1/deploys/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 191,
+ "line": 192,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35877,7 +37182,7 @@
@@ -35877,7 +37182,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/deploys/:id",
"path": "/api/v1/deploys/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 173,
+ "line": 174,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35887,7 +37192,7 @@
@@ -35887,7 +37192,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/deploys/:id/activate",
"path": "/api/v1/deploys/:id/activate",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 181,
+ "line": 182,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35897,7 +37202,7 @@
@@ -35897,7 +37202,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/deploys/:id/log",
"path": "/api/v1/deploys/:id/log",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 177,
+ "line": 178,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35907,7 +37212,7 @@
@@ -35907,7 +37212,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/domains/:id",
"path": "/api/v1/domains/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 207,
+ "line": 208,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35917,7 +37222,7 @@
@@ -35917,7 +37222,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/domains/:id/verify",
"path": "/api/v1/domains/:id/verify",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 202,
+ "line": 203,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35927,7 +37232,7 @@
@@ -35927,7 +37232,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects",
"path": "/api/v1/projects",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 61,
+ "line": 62,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35937,7 +37242,7 @@
@@ -35937,7 +37242,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects",
"path": "/api/v1/projects",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 65,
+ "line": 66,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35947,7 +37252,7 @@
@@ -35947,7 +37252,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/projects/:id",
"path": "/api/v1/projects/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 74,
+ "line": 75,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35957,7 +37262,7 @@
@@ -35957,7 +37262,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:id",
"path": "/api/v1/projects/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 70,
+ "line": 71,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35967,7 +37272,7 @@
@@ -35967,7 +37272,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/projects/:id/members/:principal",
"path": "/api/v1/projects/:id/members/:principal",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 92,
+ "line": 93,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35977,7 +37282,7 @@
@@ -35977,7 +37282,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/projects/:id/members/:principal",
"path": "/api/v1/projects/:id/members/:principal",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 87,
+ "line": 88,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35987,7 +37292,7 @@
@@ -35987,7 +37292,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:id/quota",
"path": "/api/v1/projects/:id/quota",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 78,
+ "line": 79,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -35997,7 +37302,7 @@
@@ -35997,7 +37302,7 @@
"method": "PUT",
"method": "PUT",
"path": "/api/v1/projects/:id/quota",
"path": "/api/v1/projects/:id/quota",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 82,
+ "line": 83,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36007,7 +37312,7 @@
@@ -36007,7 +37312,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/projects/:id/sites",
"path": "/api/v1/projects/:id/sites",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 118,
+ "line": 119,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36017,7 +37322,7 @@
@@ -36017,7 +37322,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:id/sites",
"path": "/api/v1/projects/:id/sites",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 122,
+ "line": 123,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36027,7 +37332,7 @@
@@ -36027,7 +37332,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/projects/:id/takedown",
"path": "/api/v1/projects/:id/takedown",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 104,
+ "line": 105,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36037,7 +37342,7 @@
@@ -36037,7 +37342,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/projects/:id/takedown",
"path": "/api/v1/projects/:id/takedown",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 100,
+ "line": 101,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36047,7 +37352,7 @@
@@ -36047,7 +37352,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/sites/:id",
"path": "/api/v1/sites/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 131,
+ "line": 132,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36057,7 +37362,7 @@
@@ -36057,7 +37362,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/sites/:id",
"path": "/api/v1/sites/:id",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 127,
+ "line": 128,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36067,7 +37372,7 @@
@@ -36067,7 +37372,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/sites/:id/deploys",
"path": "/api/v1/sites/:id/deploys",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 134,
+ "line": 135,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36077,7 +37382,7 @@
@@ -36077,7 +37382,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/sites/:id/deploys",
"path": "/api/v1/sites/:id/deploys",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 144,
+ "line": 145,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36087,7 +37392,7 @@
@@ -36087,7 +37392,7 @@
"method": "GET",
"method": "GET",
"path": "/api/v1/sites/:id/domains",
"path": "/api/v1/sites/:id/domains",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 194,
+ "line": 195,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36097,7 +37402,7 @@
@@ -36097,7 +37402,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/sites/:id/domains",
"path": "/api/v1/sites/:id/domains",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 198,
+ "line": 199,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36107,7 +37412,7 @@
@@ -36107,7 +37412,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/sites/:id/rollback",
"path": "/api/v1/sites/:id/rollback",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 186,
+ "line": 187,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36117,7 +37422,7 @@
@@ -36117,7 +37422,7 @@
"method": "DELETE",
"method": "DELETE",
"path": "/api/v1/sites/:id/takedown",
"path": "/api/v1/sites/:id/takedown",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 112,
+ "line": 113,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36127,7 +37432,7 @@
@@ -36127,7 +37432,7 @@
"method": "POST",
"method": "POST",
"path": "/api/v1/sites/:id/takedown",
"path": "/api/v1/sites/:id/takedown",
"file": "server/http/api.js",
"file": "server/http/api.js",
- "line": 108,
+ "line": 109,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36197,7 +37502,7 @@
@@ -36197,7 +37502,7 @@
"method": "GET",
"method": "GET",
"path": "/deploys/:id",
"path": "/deploys/:id",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 95,
+ "line": 96,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36207,7 +37512,7 @@
@@ -36207,7 +37512,7 @@
"method": "POST",
"method": "POST",
"path": "/deploys/:id/activate",
"path": "/deploys/:id/activate",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 147,
+ "line": 148,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36217,7 +37522,7 @@
@@ -36217,7 +37522,7 @@
"method": "POST",
"method": "POST",
"path": "/deploys/:id/delete",
"path": "/deploys/:id/delete",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 152,
+ "line": 153,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36227,7 +37532,7 @@
@@ -36227,7 +37532,7 @@
"method": "POST",
"method": "POST",
"path": "/domains/:id/delete",
"path": "/domains/:id/delete",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 161,
+ "line": 162,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36237,7 +37542,7 @@
@@ -36237,7 +37542,7 @@
"method": "POST",
"method": "POST",
"path": "/domains/:id/verify",
"path": "/domains/:id/verify",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 157,
+ "line": 158,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36257,7 +37562,7 @@
@@ -36257,7 +37562,7 @@
"method": "GET",
"method": "GET",
"path": "/metrics",
"path": "/metrics",
"file": "server/app.js",
"file": "server/app.js",
- "line": 138,
+ "line": 140,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36267,7 +37572,7 @@
@@ -36267,7 +37572,7 @@
"method": "POST",
"method": "POST",
"path": "/projects",
"path": "/projects",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 104,
+ "line": 105,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36277,7 +37582,7 @@
@@ -36277,7 +37582,7 @@
"method": "GET",
"method": "GET",
"path": "/projects/:id",
"path": "/projects/:id",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 75,
+ "line": 76,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36287,7 +37592,7 @@
@@ -36287,7 +37592,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:id/delete",
"path": "/projects/:id/delete",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 126,
+ "line": 127,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36297,7 +37602,7 @@
@@ -36297,7 +37602,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:id/members",
"path": "/projects/:id/members",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 114,
+ "line": 115,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36307,7 +37612,7 @@
@@ -36307,7 +37612,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:id/members/remove",
"path": "/projects/:id/members/remove",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 120,
+ "line": 121,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36317,7 +37622,7 @@
@@ -36317,7 +37622,7 @@
"method": "POST",
"method": "POST",
"path": "/projects/:id/sites",
"path": "/projects/:id/sites",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 108,
+ "line": 109,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36327,7 +37632,7 @@
@@ -36327,7 +37632,7 @@
"method": "GET",
"method": "GET",
"path": "/robots.txt",
"path": "/robots.txt",
"file": "server/app.js",
"file": "server/app.js",
- "line": 142,
+ "line": 144,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36337,7 +37642,7 @@
@@ -36337,7 +37642,7 @@
"method": "GET",
"method": "GET",
"path": "/sitemap.xml",
"path": "/sitemap.xml",
"file": "server/app.js",
"file": "server/app.js",
- "line": 144,
+ "line": 146,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36347,7 +37652,7 @@
@@ -36347,7 +37652,7 @@
"method": "GET",
"method": "GET",
"path": "/sites/:id",
"path": "/sites/:id",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 85,
+ "line": 86,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36357,7 +37662,7 @@
@@ -36357,7 +37662,7 @@
"method": "POST",
"method": "POST",
"path": "/sites/:id/delete",
"path": "/sites/:id/delete",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 141,
+ "line": 142,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36367,7 +37672,7 @@
@@ -36367,7 +37672,7 @@
"method": "POST",
"method": "POST",
"path": "/sites/:id/deploys",
"path": "/sites/:id/deploys",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 168,
+ "line": 169,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36377,7 +37682,7 @@
@@ -36377,7 +37682,7 @@
"method": "POST",
"method": "POST",
"path": "/sites/:id/domains",
"path": "/sites/:id/domains",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 133,
+ "line": 134,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36387,7 +37692,7 @@
@@ -36387,7 +37692,7 @@
"method": "POST",
"method": "POST",
"path": "/sites/:id/rollback",
"path": "/sites/:id/rollback",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 137,
+ "line": 138,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36397,7 +37702,7 @@
@@ -36397,7 +37702,7 @@
"method": "GET",
"method": "GET",
"path": "/updates",
"path": "/updates",
"file": "server/http/dashboard.js",
"file": "server/http/dashboard.js",
- "line": 67,
+ "line": 68,
"target": "OpenVibe.Host",
"target": "OpenVibe.Host",
"disposition": "keep",
"disposition": "keep",
"wave": "-",
"wave": "-",
@@ -36517,16 +37822,39 @@
@@ -36517,16 +37822,39 @@
"API_CORS_ORIGINS": [
"API_CORS_ORIGINS": [
"server/config.js"
"server/config.js"
],
],
+ "HOST_ACTOR_LIMITS": [
+ "server/http/actor-limits.js"
+ ],
+ "HOST_LIMITS_MINUTE": [
+ "server/http/actor-limits.js"
+ ],
+ "HOST_LIMITS_HOUR": [
+ "server/http/actor-limits.js"
+ ],
+ "OVHOST_PROMETHEUS_URL": [
+ "lib/alerts.js"
+ ],
"OVHOST_EVENTS_ENV": [
"OVHOST_EVENTS_ENV": [
"lib/announce.js"
"lib/announce.js"
],
],
"SUDO_USER": [
"SUDO_USER": [
+ "lib/cli.js",
"lib/commands/drill.js",
"lib/commands/drill.js",
"lib/release-ops.js"
"lib/release-ops.js"
],
],
"USER": [
"USER": [
+ "lib/cli.js",
"lib/executor.js"
"lib/executor.js"
],
],
+ "CLOUDFLARE_API_TOKEN_FILE": [
+ "lib/dns.js"
+ ],
+ "HOME": [
+ "lib/dns.js"
+ ],
+ "CLOUDFLARE_API_TOKEN": [
+ "lib/dns.js"
+ ],
"PATH": [
"PATH": [
"lib/executor.js"
"lib/executor.js"
],
],
@@ -36657,7 +37985,7 @@
@@ -36657,7 +37985,7 @@
],
],
"contractTodos": 0,
"contractTodos": 0,
"unresolvedMounts": [],
"unresolvedMounts": [],
- "testFiles": 38,
+ "testFiles": 48,
"ci": true
"ci": true
},
},
{
{
@@ -36665,10 +37993,10 @@
@@ -36665,10 +37993,10 @@
"service": "examples",
"service": "examples",
"present": true,
"present": true,
"git": {
"git": {
- "head": "36901ffc052752754608df8764a9f2942069da9a",
+ "head": "92eb7c3b0f50fea9f76086ed3eeda3664de93494",
"branch": "main",
"branch": "main",
- "originMain": "36901ffc052752754608df8764a9f2942069da9a",
- "committedAt": "2026-09-26T04:53:16-07:00"
+ "originMain": "92eb7c3b0f50fea9f76086ed3eeda3664de93494",
+ "committedAt": "2026-09-27T20:10:31-07:00"
},
},
"sourceFiles": 11,
"sourceFiles": 11,
"loc": 1604,
"loc": 1604,
@@ -36834,187 +38162,193 @@
@@ -36834,187 +38162,193 @@
"repo": "OpenRe.Stream",
"repo": "OpenRe.Stream",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.AI",
"repo": "OpenVibe.AI",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Billing",
"repo": "OpenVibe.Billing",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Blog",
"repo": "OpenVibe.Blog",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Chat",
"repo": "OpenVibe.Chat",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Codes",
"repo": "OpenVibe.Codes",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Coupons",
"repo": "OpenVibe.Coupons",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Deals",
"repo": "OpenVibe.Deals",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
+ },
+ {
+ "repo": "OpenVibe.Games",
+ "manifest": "apps/server/package.json",
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Host",
"repo": "OpenVibe.Host",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"manifest": "package.json",
"manifest": "package.json",
- "spec": "v1.22.0",
+ "spec": "v1.23.1",
"state": "current"
"state": "current"
},
},
{
{
"repo": "OpenVibe.Media",
"repo": "OpenVibe.Media",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Network",
"repo": "OpenVibe.Network",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.News",
"repo": "OpenVibe.News",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Reviews",
"repo": "OpenVibe.Reviews",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Search",
"repo": "OpenVibe.Search",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Sites",
"repo": "OpenVibe.Sites",
"manifest": "package.json",
"manifest": "package.json",
- "spec": "v1.22.0",
- "state": "current"
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Sources",
"repo": "OpenVibe.Sources",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Tips",
"repo": "OpenVibe.Tips",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"manifest": "apps/audio/package.json",
"manifest": "apps/audio/package.json",
- "spec": "v1.22.0",
- "state": "current"
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"manifest": "apps/docs/package.json",
"manifest": "apps/docs/package.json",
- "spec": "v1.22.0",
- "state": "current"
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"manifest": "apps/food/package.json",
"manifest": "apps/food/package.json",
- "spec": "v1.22.0",
- "state": "current"
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"manifest": "apps/gateway/package.json",
"manifest": "apps/gateway/package.json",
- "spec": "v1.22.0",
- "state": "current"
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"manifest": "apps/img/package.json",
"manifest": "apps/img/package.json",
- "spec": "v1.22.0",
- "state": "current"
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"manifest": "apps/maps/package.json",
"manifest": "apps/maps/package.json",
- "spec": "v1.22.0",
- "state": "current"
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"manifest": "apps/text/package.json",
"manifest": "apps/text/package.json",
- "spec": "v1.22.0",
- "state": "current"
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"manifest": "apps/yt/package.json",
"manifest": "apps/yt/package.json",
- "spec": "v1.22.0",
- "state": "current"
+ "spec": "v1.23.0",
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Trade",
"repo": "OpenVibe.Trade",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.VIP",
"repo": "OpenVibe.VIP",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
},
},
{
{
"repo": "OpenVibe.Wiki",
"repo": "OpenVibe.Wiki",
"manifest": "package.json",
"manifest": "package.json",
"spec": "v1.22.0",
"spec": "v1.22.0",
- "state": "current"
+ "state": "behind"
}
}
],
],
"ownership": [
"ownership": [
@@ -37478,6 +38812,22 @@
@@ -37478,6 +38812,22 @@
"wave": "W13",
"wave": "W13",
"note": "Provider/model/route registry, templates, workflows, runs, cache, quotas, audit, imports."
"note": "Provider/model/route registry, templates, workflows, runs, cache, quotas, audit, imports."
},
},
+ {
+ "repo": "OpenVibe.AI",
+ "table": "subject_credentials",
+ "declaredAt": [
+ "server/credentials.js:27"
+ ],
+ "prodDbs": [
+ "ai.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.AI",
+ "disposition": "keep",
+ "wave": "W13",
+ "note": "Provider/model/route registry, templates, workflows, runs, cache, quotas, audit, imports."
+ },
{
{
"repo": "OpenVibe.AI",
"repo": "OpenVibe.AI",
"table": "templates",
"table": "templates",
@@ -38202,6 +39552,22 @@
@@ -38202,6 +39552,22 @@
"wave": "W16",
"wave": "W16",
"note": "Blogs, posts, terms (plus openvibe-publishing stores)."
"note": "Blogs, posts, terms (plus openvibe-publishing stores)."
},
},
+ {
+ "repo": "OpenVibe.Chat",
+ "table": "account_data_events",
+ "declaredAt": [
+ "server/chat/account-data.js:39"
+ ],
+ "prodDbs": [
+ "chat.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Chat",
+ "disposition": "keep",
+ "wave": "W6",
+ "note": "Chat authority tables (table_authority=chat), bridge/mirror outboxes and import bookkeeping."
+ },
{
{
"repo": "OpenVibe.Chat",
"repo": "OpenVibe.Chat",
"table": "audio_requests",
"table": "audio_requests",
@@ -38982,6 +40348,22 @@
@@ -38982,6 +40348,22 @@
"wave": "W20",
"wave": "W20",
"note": "Developer manifests, releases, trust, playground runs."
"note": "Developer manifests, releases, trust, playground runs."
},
},
+ {
+ "repo": "OpenVibe.Community",
+ "table": "account_data_events",
+ "declaredAt": [
+ "server/identity/account-data.js:32"
+ ],
+ "prodDbs": [
+ "community.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "W5",
+ "note": ""
+ },
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
"table": "attachments",
"table": "attachments",
@@ -39090,11 +40472,27 @@
@@ -39090,11 +40472,27 @@
"wave": "W3",
"wave": "W3",
"note": "Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers."
"note": "Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers."
},
},
+ {
+ "repo": "OpenVibe.Community",
+ "table": "game_progress",
+ "declaredAt": [
+ "server/db.js:424"
+ ],
+ "prodDbs": [
+ "community.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Community",
+ "disposition": "keep",
+ "wave": "W5",
+ "note": ""
+ },
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
"table": "import_hold",
"table": "import_hold",
"declaredAt": [
"declaredAt": [
- "server/db.js:425"
+ "server/db.js:431"
],
],
"prodDbs": [
"prodDbs": [
"community.db"
"community.db"
@@ -39364,7 +40762,7 @@
@@ -39364,7 +40762,7 @@
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
"table": "relay_deliveries_v2",
"table": "relay_deliveries_v2",
"declaredAt": [
"declaredAt": [
- "server/db.js:554"
+ "server/db.js:560"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40068,7 +41466,23 @@
@@ -40068,7 +41466,23 @@
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"table": "app_revocations",
"table": "app_revocations",
"declaredAt": [
"declaredAt": [
- "server/store.js:90"
+ "server/store.js:91"
+ ],
+ "prodDbs": [
+ "events.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Events",
+ "disposition": "keep",
+ "wave": "W3",
+ "note": "Event store, subscriptions, deliveries, checkpoints, idempotency receipts."
+ },
+ {
+ "repo": "OpenVibe.Events",
+ "table": "app_usage",
+ "declaredAt": [
+ "server/usage.js:40"
],
],
"prodDbs": [
"prodDbs": [
"events.db"
"events.db"
@@ -40084,7 +41498,7 @@
@@ -40084,7 +41498,7 @@
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"table": "consumer_checkpoints",
"table": "consumer_checkpoints",
"declaredAt": [
"declaredAt": [
- "server/store.js:79"
+ "server/store.js:80"
],
],
"prodDbs": [
"prodDbs": [
"events.db"
"events.db"
@@ -40100,7 +41514,7 @@
@@ -40100,7 +41514,7 @@
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"table": "deliveries",
"table": "deliveries",
"declaredAt": [
"declaredAt": [
- "server/store.js:61"
+ "server/store.js:62"
],
],
"prodDbs": [
"prodDbs": [
"events.db"
"events.db"
@@ -40116,7 +41530,7 @@
@@ -40116,7 +41530,7 @@
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"table": "events",
"table": "events",
"declaredAt": [
"declaredAt": [
- "server/store.js:24"
+ "server/store.js:25"
],
],
"prodDbs": [
"prodDbs": [
"events.db"
"events.db"
@@ -40132,7 +41546,7 @@
@@ -40132,7 +41546,7 @@
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"table": "idempotency_receipts",
"table": "idempotency_receipts",
"declaredAt": [
"declaredAt": [
- "server/store.js:99"
+ "server/store.js:100"
],
],
"prodDbs": [
"prodDbs": [
"events.db"
"events.db"
@@ -40148,7 +41562,7 @@
@@ -40148,7 +41562,7 @@
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"table": "sequences",
"table": "sequences",
"declaredAt": [
"declaredAt": [
- "server/store.js:20"
+ "server/store.js:21"
],
],
"prodDbs": [
"prodDbs": [
"events.db"
"events.db"
@@ -40164,7 +41578,7 @@
@@ -40164,7 +41578,7 @@
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"table": "subscriptions",
"table": "subscriptions",
"declaredAt": [
"declaredAt": [
- "server/store.js:48"
+ "server/store.js:49"
],
],
"prodDbs": [
"prodDbs": [
"events.db"
"events.db"
@@ -40190,6 +41604,22 @@
@@ -40190,6 +41604,22 @@
"wave": "W20",
"wave": "W20",
"note": "Example application storage; not deployed."
"note": "Example application storage; not deployed."
},
},
+ {
+ "repo": "OpenVibe.Games",
+ "table": "account_data_events",
+ "declaredAt": [
+ "apps/server/src/platform/accountData.ts:47"
+ ],
+ "prodDbs": [
+ "world.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Games",
+ "disposition": "keep",
+ "wave": "W12",
+ "note": "Authoritative game state."
+ },
{
{
"repo": "OpenVibe.Games",
"repo": "OpenVibe.Games",
"table": "constraints",
"table": "constraints",
@@ -40603,11 +42033,25 @@
@@ -40603,11 +42033,25 @@
"wave": "W21",
"wave": "W21",
"note": "Host Stage B projects, sites, deploys, domains."
"note": "Host Stage B projects, sites, deploys, domains."
},
},
+ {
+ "repo": "OpenVibe.Live",
+ "table": "account_data_events",
+ "declaredAt": [
+ "server/auth/account-data.js:51"
+ ],
+ "prodDbs": [],
+ "inCode": true,
+ "inProd": false,
+ "target": "OpenVibe.Live",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "server/auth/account-data.js: which network.account.export_requested / deleted events Live has answered (ADR-033), so a redelivery is applied once."
+ },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "ai_chatbot_configs",
"table": "ai_chatbot_configs",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1807"
+ "server/db/database.js:1802"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40621,7 +42065,7 @@
@@ -40621,7 +42065,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "ai_timeline_cache",
"table": "ai_timeline_cache",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1326"
+ "server/db/database.js:1321"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40635,7 +42079,7 @@
@@ -40635,7 +42079,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "ai_usage",
"table": "ai_usage",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1284"
+ "server/db/database.js:1279"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40649,7 +42093,7 @@
@@ -40649,7 +42093,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "ai_viewer_log",
"table": "ai_viewer_log",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1891"
+ "server/db/database.js:1888"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40663,7 +42107,7 @@
@@ -40663,7 +42107,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "ai_viewer_threads",
"table": "ai_viewer_threads",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1877"
+ "server/db/database.js:1874"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40719,7 +42163,7 @@
@@ -40719,7 +42163,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "app_state",
"table": "app_state",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1196"
+ "server/db/database.js:1191"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40733,7 +42177,7 @@
@@ -40733,7 +42177,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "approved_ips",
"table": "approved_ips",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2079"
+ "server/db/database.js:2076"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40803,7 +42247,7 @@
@@ -40803,7 +42247,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "arena_profiles",
"table": "arena_profiles",
"declaredAt": [
"declaredAt": [
- "server/arena/arena-service.js:83"
+ "server/arena/arena-service.js:82"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40915,7 +42359,7 @@
@@ -40915,7 +42359,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "channel_ai_bots",
"table": "channel_ai_bots",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1832"
+ "server/db/database.js:1827"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40929,7 +42373,7 @@
@@ -40929,7 +42373,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "channel_ai_config",
"table": "channel_ai_config",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1856"
+ "server/db/database.js:1851"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -40943,7 +42387,7 @@
@@ -40943,7 +42387,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "channel_moderation_settings",
"table": "channel_moderation_settings",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1640",
+ "server/db/database.js:1635",
"server/db/schema.sql:514"
"server/db/schema.sql:514"
],
],
"prodDbs": [],
"prodDbs": [],
@@ -40958,7 +42402,7 @@
@@ -40958,7 +42402,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "channel_moderators",
"table": "channel_moderators",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1623",
+ "server/db/database.js:1618",
"server/db/schema.sql:499"
"server/db/schema.sql:499"
],
],
"prodDbs": [],
"prodDbs": [],
@@ -41001,7 +42445,7 @@
@@ -41001,7 +42445,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "channel_sounds",
"table": "channel_sounds",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1745",
+ "server/db/database.js:1740",
"server/db/schema.sql:626"
"server/db/schema.sql:626"
],
],
"prodDbs": [],
"prodDbs": [],
@@ -41016,7 +42460,7 @@
@@ -41016,7 +42460,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "channel_sounds_new",
"table": "channel_sounds_new",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1769"
+ "server/db/database.js:1764"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41044,7 +42488,7 @@
@@ -41044,7 +42488,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "chat_ai_summaries",
"table": "chat_ai_summaries",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1338"
+ "server/db/database.js:1333"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41128,7 +42572,7 @@
@@ -41128,7 +42572,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "chat_timeline_events",
"table": "chat_timeline_events",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1358"
+ "server/db/database.js:1353"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41283,7 +42727,7 @@
@@ -41283,7 +42727,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "control_config_buttons",
"table": "control_config_buttons",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2303"
+ "server/db/database.js:2300"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41297,7 +42741,7 @@
@@ -41297,7 +42741,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "control_configs",
"table": "control_configs",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2289"
+ "server/db/database.js:2286"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41311,7 +42755,7 @@
@@ -41311,7 +42755,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "control_whitelist",
"table": "control_whitelist",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2274"
+ "server/db/database.js:2271"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41395,7 +42839,7 @@
@@ -41395,7 +42839,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "easter_egg_solves",
"table": "easter_egg_solves",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1370"
+ "server/db/database.js:1365"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41423,7 +42867,7 @@
@@ -41423,7 +42867,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "emotes_new",
"table": "emotes_new",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1713"
+ "server/db/database.js:1708"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41433,6 +42877,20 @@
@@ -41433,6 +42877,20 @@
"wave": "W6 (remainder)",
"wave": "W6 (remainder)",
"note": "Still written by Live: Chat holds staged copies (table_authority=live) of moderators, moderation settings, emotes, user tags and the chat AI tables; media requests were not moved."
"note": "Still written by Live: Chat holds staged copies (table_authority=live) of moderators, moderation settings, emotes, user tags and the chat AI tables; media requests were not moved."
},
},
+ {
+ "repo": "OpenVibe.Live",
+ "table": "follow_projection_revisions",
+ "declaredAt": [
+ "server/social/network-follows.js:63"
+ ],
+ "prodDbs": [],
+ "inCode": true,
+ "inProd": false,
+ "target": "OpenVibe.Live",
+ "disposition": "projection",
+ "wave": "-",
+ "note": "server/social/network-follows.js: the per-pair revision of Live's follows projection of Network's graph (ADR-030); an older network.follow.* event changes nothing."
+ },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "follows",
"table": "follows",
@@ -41451,7 +42909,7 @@
@@ -41451,7 +42909,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "hidden_relay_users",
"table": "hidden_relay_users",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2116"
+ "server/db/database.js:2113"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41465,7 +42923,7 @@
@@ -41465,7 +42923,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "ip_log",
"table": "ip_log",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2055"
+ "server/db/database.js:2052"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41489,6 +42947,20 @@
@@ -41489,6 +42947,20 @@
"wave": "W7",
"wave": "W7",
"note": "Stream definitions/keys, outputs, restream and control presets. managed_streams.stream_key rotation is open (hazard H4)."
"note": "Stream definitions/keys, outputs, restream and control presets. managed_streams.stream_key rotation is open (hazard H4)."
},
},
+ {
+ "repo": "OpenVibe.Live",
+ "table": "lineage_unresolved",
+ "declaredAt": [
+ "server/lineage/unresolved.js:26"
+ ],
+ "prodDbs": [],
+ "inCode": true,
+ "inProd": false,
+ "target": "OpenVibe.Live",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "server/lineage/unresolved.js: media and session references the lineage resolver could not resolve yet, for the operator view (WS-H task 8)."
+ },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "linked_accounts",
"table": "linked_accounts",
@@ -41507,7 +42979,7 @@
@@ -41507,7 +42979,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "managed_streams",
"table": "managed_streams",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2417",
+ "server/db/database.js:2414",
"server/db/schema.sql:78"
"server/db/schema.sql:78"
],
],
"prodDbs": [],
"prodDbs": [],
@@ -41552,7 +43024,7 @@
@@ -41552,7 +43024,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "moderation_actions",
"table": "moderation_actions",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1924"
+ "server/db/database.js:1921"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41622,7 +43094,7 @@
@@ -41622,7 +43094,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "paste_comments",
"table": "paste_comments",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2012"
+ "server/db/database.js:2009"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41636,7 +43108,7 @@
@@ -41636,7 +43108,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "paste_likes",
"table": "paste_likes",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1980"
+ "server/db/database.js:1977"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41650,7 +43122,7 @@
@@ -41650,7 +43122,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "pastes",
"table": "pastes",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1943"
+ "server/db/database.js:1940"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41664,7 +43136,7 @@
@@ -41664,7 +43136,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "payment_orders",
"table": "payment_orders",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1590"
+ "server/db/database.js:1585"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41678,7 +43150,7 @@
@@ -41678,7 +43150,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "pending_ip_messages",
"table": "pending_ip_messages",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2096"
+ "server/db/database.js:2093"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41734,7 +43206,7 @@
@@ -41734,7 +43206,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "relay_users",
"table": "relay_users",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1495"
+ "server/db/database.js:1490"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41876,7 +43348,7 @@
@@ -41876,7 +43348,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "stream_controls_new",
"table": "stream_controls_new",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2382"
+ "server/db/database.js:2379"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41890,7 +43362,7 @@
@@ -41890,7 +43362,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "stream_first_chats",
"table": "stream_first_chats",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2044"
+ "server/db/database.js:2041"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41904,7 +43376,7 @@
@@ -41904,7 +43376,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "stream_memories",
"table": "stream_memories",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1210"
+ "server/db/database.js:1205"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41932,7 +43404,7 @@
@@ -41932,7 +43404,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "stream_timeline_events",
"table": "stream_timeline_events",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1259"
+ "server/db/database.js:1254"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41946,7 +43418,7 @@
@@ -41946,7 +43418,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "streamer_overviews",
"table": "streamer_overviews",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1304"
+ "server/db/database.js:1299"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -41970,6 +43442,20 @@
@@ -41970,6 +43442,20 @@
"wave": "-",
"wave": "-",
"note": "Live product data and read models."
"note": "Live product data and read models."
},
},
+ {
+ "repo": "OpenVibe.Live",
+ "table": "subject_merges",
+ "declaredAt": [
+ "server/auth/subject-merge.js:25"
+ ],
+ "prodDbs": [],
+ "inCode": true,
+ "inProd": false,
+ "target": "OpenVibe.Live",
+ "disposition": "keep",
+ "wave": "-",
+ "note": "server/auth/subject-merge.js: the network.subject.merged events Live has applied (ADR-029), once each."
+ },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "subject_projection",
"table": "subject_projection",
@@ -42059,7 +43545,7 @@
@@ -42059,7 +43545,7 @@
"table": "translations",
"table": "translations",
"declaredAt": [
"declaredAt": [
"server/db/database.js:513",
"server/db/database.js:513",
- "server/i18n/translate.js:147"
+ "server/i18n/translate.js:148"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -42073,7 +43559,7 @@
@@ -42073,7 +43559,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "tts_voice_overrides",
"table": "tts_voice_overrides",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:1382"
+ "server/db/database.js:1377"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -42216,7 +43702,7 @@
@@ -42216,7 +43702,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "vibe_coding_events",
"table": "vibe_coding_events",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2674",
+ "server/db/database.js:2671",
"server/db/schema.sql:198"
"server/db/schema.sql:198"
],
],
"prodDbs": [],
"prodDbs": [],
@@ -42231,7 +43717,7 @@
@@ -42231,7 +43717,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "vibe_coding_sessions",
"table": "vibe_coding_sessions",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:2639",
+ "server/db/database.js:2636",
"server/db/schema.sql:170"
"server/db/schema.sql:170"
],
],
"prodDbs": [],
"prodDbs": [],
@@ -42246,7 +43732,7 @@
@@ -42246,7 +43732,7 @@
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"table": "viewer_samples",
"table": "viewer_samples",
"declaredAt": [
"declaredAt": [
- "server/db/database.js:3861"
+ "server/db/database.js:3868"
],
],
"prodDbs": [],
"prodDbs": [],
"inCode": true,
"inCode": true,
@@ -42326,6 +43812,22 @@
@@ -42326,6 +43812,22 @@
"wave": "-",
"wave": "-",
"note": "Live product data and read models."
"note": "Live product data and read models."
},
},
+ {
+ "repo": "OpenVibe.Media",
+ "table": "account_data_events",
+ "declaredAt": [
+ "server/account-data.js:32"
+ ],
+ "prodDbs": [
+ "media.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "W4 (object model)",
+ "note": "Becomes projections over media_objects/media_locations."
+ },
{
{
"repo": "OpenVibe.Media",
"repo": "OpenVibe.Media",
"table": "apps",
"table": "apps",
@@ -42552,7 +44054,71 @@
@@ -42552,7 +44054,71 @@
"repo": "OpenVibe.Media",
"repo": "OpenVibe.Media",
"table": "media_object_changes",
"table": "media_object_changes",
"declaredAt": [
"declaredAt": [
- "server/db/schema.sql:436"
+ "server/db/schema.sql:480"
+ ],
+ "prodDbs": [
+ "media.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "W4 (object model)",
+ "note": "Becomes projections over media_objects/media_locations."
+ },
+ {
+ "repo": "OpenVibe.Media",
+ "table": "media_object_tier_decisions",
+ "declaredAt": [
+ "server/db/schema.sql:458"
+ ],
+ "prodDbs": [
+ "media.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "W4 (object model)",
+ "note": "Becomes projections over media_objects/media_locations."
+ },
+ {
+ "repo": "OpenVibe.Media",
+ "table": "media_object_view_salts",
+ "declaredAt": [
+ "server/db/schema.sql:435"
+ ],
+ "prodDbs": [
+ "media.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "W4 (object model)",
+ "note": "Becomes projections over media_objects/media_locations."
+ },
+ {
+ "repo": "OpenVibe.Media",
+ "table": "media_object_viewer_days",
+ "declaredAt": [
+ "server/db/schema.sql:440"
+ ],
+ "prodDbs": [
+ "media.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "W4 (object model)",
+ "note": "Becomes projections over media_objects/media_locations."
+ },
+ {
+ "repo": "OpenVibe.Media",
+ "table": "media_object_views_daily",
+ "declaredAt": [
+ "server/db/schema.sql:446"
],
],
"prodDbs": [
"prodDbs": [
"media.db"
"media.db"
@@ -42696,7 +44262,7 @@
@@ -42696,7 +44262,7 @@
"repo": "OpenVibe.Media",
"repo": "OpenVibe.Media",
"table": "media_verifications",
"table": "media_verifications",
"declaredAt": [
"declaredAt": [
- "server/db/schema.sql:448"
+ "server/db/schema.sql:492"
],
],
"prodDbs": [
"prodDbs": [
"media.db"
"media.db"
@@ -42712,7 +44278,7 @@
@@ -42712,7 +44278,7 @@
"repo": "OpenVibe.Media",
"repo": "OpenVibe.Media",
"table": "media_verify_runs",
"table": "media_verify_runs",
"declaredAt": [
"declaredAt": [
- "server/db/schema.sql:460"
+ "server/db/schema.sql:504"
],
],
"prodDbs": [
"prodDbs": [
"media.db"
"media.db"
@@ -42786,6 +44352,20 @@
@@ -42786,6 +44352,20 @@
"wave": "W0",
"wave": "W0",
"note": "Exists in a production database but no CREATE TABLE in the repo."
"note": "Exists in a production database but no CREATE TABLE in the repo."
},
},
+ {
+ "repo": "OpenVibe.Media",
+ "table": "subject_merges",
+ "declaredAt": [
+ "server/subject-merge.js:13"
+ ],
+ "prodDbs": [],
+ "inCode": true,
+ "inProd": false,
+ "target": "OpenVibe.Media",
+ "disposition": "keep",
+ "wave": "W4 (object model)",
+ "note": "Becomes projections over media_objects/media_locations."
+ },
{
{
"repo": "OpenVibe.Media",
"repo": "OpenVibe.Media",
"table": "token_revocations",
"table": "token_revocations",
@@ -42816,6 +44396,102 @@
@@ -42816,6 +44396,102 @@
"wave": "W4 (object model)",
"wave": "W4 (object model)",
"note": "Becomes projections over media_objects/media_locations."
"note": "Becomes projections over media_objects/media_locations."
},
},
+ {
+ "repo": "OpenVibe.Network",
+ "table": "account_deletion_confirmations",
+ "declaredAt": [
+ "server/identity/account-data.js:94"
+ ],
+ "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": "account_deletions",
+ "declaredAt": [
+ "server/identity/account-data.js:80"
+ ],
+ "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": "account_export_parts",
+ "declaredAt": [
+ "server/identity/account-data.js:71"
+ ],
+ "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": "account_exports",
+ "declaredAt": [
+ "server/identity/account-data.js:56"
+ ],
+ "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": "account_merge_intents",
+ "declaredAt": [
+ "server/identity/account-merge.js:71"
+ ],
+ "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": "account_merges",
+ "declaredAt": [
+ "server/identity/account-merge.js:56"
+ ],
+ "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": "admin_rate_limits",
"table": "admin_rate_limits",
@@ -43006,6 +44682,22 @@
@@ -43006,6 +44682,22 @@
"wave": "-",
"wave": "-",
"note": "openvibe-shared/config.js: each service's own revisioned settings (keys and snapshots for rollback)."
"note": "openvibe-shared/config.js: each service's own revisioned settings (keys and snapshots for rollback)."
},
},
+ {
+ "repo": "OpenVibe.Network",
+ "table": "creator_streams",
+ "declaredAt": [
+ "server/analytics/creators.js:27"
+ ],
+ "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": "dev_apps",
"table": "dev_apps",
@@ -43134,6 +44826,54 @@
@@ -43134,6 +44826,54 @@
"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": "dev_usage_daily",
+ "declaredAt": [
+ "server/developer/usage.js:69"
+ ],
+ "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": "dev_usage_errors",
+ "declaredAt": [
+ "server/developer/usage.js:84"
+ ],
+ "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": "dev_usage_windows",
+ "declaredAt": [
+ "server/developer/usage.js:50"
+ ],
+ "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": "email_delivery_log",
"table": "email_delivery_log",
@@ -43166,6 +44906,22 @@
@@ -43166,6 +44906,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": "follow_import_holds",
+ "declaredAt": [
+ "server/identity/follows.js:57"
+ ],
+ "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": "follows",
"table": "follows",
@@ -43262,6 +45018,38 @@
@@ -43262,6 +45018,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": "mod_principal_grants",
+ "declaredAt": [
+ "server/identity/mod-principals.js:49"
+ ],
+ "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": "mod_principals",
+ "declaredAt": [
+ "server/identity/mod-principals.js:33"
+ ],
+ "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": "moderation_audit",
"table": "moderation_audit",
@@ -43386,6 +45174,22 @@
@@ -43386,6 +45174,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": "operator_alerts",
+ "declaredAt": [
+ "server/operator/alerts.js:25"
+ ],
+ "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": "password_reset_tokens",
"table": "password_reset_tokens",
@@ -43422,7 +45226,7 @@
@@ -43422,7 +45226,7 @@
"repo": "OpenVibe.Network",
"repo": "OpenVibe.Network",
"table": "principal_grants",
"table": "principal_grants",
"declaredAt": [
"declaredAt": [
- "server/identity/principals.js:217"
+ "server/identity/principals.js:246"
],
],
"prodDbs": [
"prodDbs": [
"network.db"
"network.db"
@@ -43438,7 +45242,7 @@
@@ -43438,7 +45242,7 @@
"repo": "OpenVibe.Network",
"repo": "OpenVibe.Network",
"table": "principal_usage",
"table": "principal_usage",
"declaredAt": [
"declaredAt": [
- "server/identity/principals.js:227"
+ "server/identity/principals.js:256"
],
],
"prodDbs": [
"prodDbs": [
"network.db"
"network.db"
@@ -43482,6 +45286,38 @@
@@ -43482,6 +45286,38 @@
"wave": "-",
"wave": "-",
"note": "Service-local config/bookkeeping."
"note": "Service-local config/bookkeeping."
},
},
+ {
+ "repo": "OpenVibe.Network",
+ "table": "status_incident_updates",
+ "declaredAt": [
+ "server/status/incidents.js:43"
+ ],
+ "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": "status_incidents",
+ "declaredAt": [
+ "server/status/incidents.js:30"
+ ],
+ "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": "stream_live_announcements",
"table": "stream_live_announcements",
@@ -43498,6 +45334,22 @@
@@ -43498,6 +45334,22 @@
"wave": "W3",
"wave": "W3",
"note": "Go-live fanout rate state; durable delivery moves to Events."
"note": "Go-live fanout rate state; durable delivery moves to Events."
},
},
+ {
+ "repo": "OpenVibe.Network",
+ "table": "subject_aliases",
+ "declaredAt": [
+ "server/identity/account-merge.js:48"
+ ],
+ "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": "themes",
"table": "themes",
@@ -43579,6 +45431,22 @@
@@ -43579,6 +45431,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_follows",
+ "declaredAt": [
+ "server/identity/follows.js:42"
+ ],
+ "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_history",
"table": "user_history",
@@ -45397,6 +47265,22 @@
@@ -45397,6 +47265,22 @@
"wave": "-",
"wave": "-",
"note": ""
"note": ""
},
},
+ {
+ "repo": "OpenVibe.Tools",
+ "table": "tool_job_usage",
+ "declaredAt": [
+ "apps/_shared/jobs/usage.js:36"
+ ],
+ "prodDbs": [
+ "jobs.db"
+ ],
+ "inCode": true,
+ "inProd": true,
+ "target": "OpenVibe.Tools",
+ "disposition": "keep",
+ "wave": "-",
+ "note": ""
+ },
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"table": "tool_jobs",
"table": "tool_jobs",
@@ -46297,6 +48181,16 @@
@@ -46297,6 +48181,16 @@
"timeout": true,
"timeout": true,
"retry": true
"retry": true
},
},
+ {
+ "caller": "OpenVibe.Chat",
+ "file": "server/chat/account-data.js",
+ "target": "OpenVibe.Network",
+ "via": "/internal/events, networkInternalUrl",
+ "lines": "4,164",
+ "auth": "none-detected",
+ "timeout": true,
+ "retry": true
+ },
{
{
"caller": "OpenVibe.Chat",
"caller": "OpenVibe.Chat",
"file": "server/net/service-auth.js",
"file": "server/net/service-auth.js",
@@ -46322,7 +48216,7 @@
@@ -46322,7 +48216,7 @@
"file": "server/chat/routes.js",
"file": "server/chat/routes.js",
"target": "OpenVibe.Search",
"target": "OpenVibe.Search",
"via": "searchUrl",
"via": "searchUrl",
- "lines": "111,117,212",
+ "lines": "121,127,222",
"auth": "none-detected",
"auth": "none-detected",
"timeout": false,
"timeout": false,
"retry": false
"retry": false
@@ -46332,11 +48226,21 @@
@@ -46332,11 +48226,21 @@
"file": "server/http/docs.js",
"file": "server/http/docs.js",
"target": "OpenVibe.Billing",
"target": "OpenVibe.Billing",
"via": "OV_BILLING_INTERNAL_URL, :4600",
"via": "OV_BILLING_INTERNAL_URL, :4600",
- "lines": "369,369",
+ "lines": "370,370",
"auth": "none-detected",
"auth": "none-detected",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
},
},
+ {
+ "caller": "OpenVibe.Codes",
+ "file": "server/domain/limits.js",
+ "target": "OpenVibe.Events",
+ "via": "OV_EVENTS_INTERNAL_URL, :4300",
+ "lines": "15,15",
+ "auth": "none-detected",
+ "timeout": true,
+ "retry": false
+ },
{
{
"caller": "OpenVibe.Codes",
"caller": "OpenVibe.Codes",
"file": "server/domain/project-archive.js",
"file": "server/domain/project-archive.js",
@@ -46349,23 +48253,23 @@
@@ -46349,23 +48253,23 @@
},
},
{
{
"caller": "OpenVibe.Codes",
"caller": "OpenVibe.Codes",
- "file": "server/http/docs.js",
- "target": "OpenVibe.Events",
- "via": "OV_EVENTS_INTERNAL_URL, :4300",
- "lines": "421,421",
+ "file": "server/domain/limits.js",
+ "target": "OpenVibe.Host",
+ "via": ":4910",
+ "lines": "14",
"auth": "none-detected",
"auth": "none-detected",
"timeout": true,
"timeout": true,
- "retry": true
+ "retry": false
},
},
{
{
"caller": "OpenVibe.Codes",
"caller": "OpenVibe.Codes",
- "file": "server/http/docs.js",
- "target": "OpenVibe.Host",
- "via": ":4910",
- "lines": "420",
+ "file": "server/domain/limits.js",
+ "target": "OpenVibe.Media",
+ "via": "OV_MEDIA_INTERNAL_URL, :4100",
+ "lines": "16,16",
"auth": "none-detected",
"auth": "none-detected",
"timeout": true,
"timeout": true,
- "retry": true
+ "retry": false
},
},
{
{
"caller": "OpenVibe.Codes",
"caller": "OpenVibe.Codes",
@@ -46377,16 +48281,6 @@
@@ -46377,16 +48281,6 @@
"timeout": false,
"timeout": false,
"retry": true
"retry": true
},
},
- {
- "caller": "OpenVibe.Codes",
- "file": "server/http/docs.js",
- "target": "OpenVibe.Media",
- "via": "OV_MEDIA_INTERNAL_URL, :4100",
- "lines": "422,422",
- "auth": "none-detected",
- "timeout": true,
- "retry": true
- },
{
{
"caller": "OpenVibe.Codes",
"caller": "OpenVibe.Codes",
"file": "server/domain/project-archive.js",
"file": "server/domain/project-archive.js",
@@ -46402,7 +48296,7 @@
@@ -46402,7 +48296,7 @@
"file": "server/http/docs.js",
"file": "server/http/docs.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"via": "networkUrl",
"via": "networkUrl",
- "lines": "250",
+ "lines": "251",
"auth": "none-detected",
"auth": "none-detected",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
@@ -46412,7 +48306,7 @@
@@ -46412,7 +48306,7 @@
"file": "server/http/docs.js",
"file": "server/http/docs.js",
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"via": "OV_TOOLS_INTERNAL_URL, :4001",
"via": "OV_TOOLS_INTERNAL_URL, :4001",
- "lines": "336,336",
+ "lines": "337,337",
"auth": "none-detected",
"auth": "none-detected",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
@@ -46512,7 +48406,7 @@
@@ -46512,7 +48406,7 @@
"file": "apps/server/src/net/httpServer.ts",
"file": "apps/server/src/net/httpServer.ts",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"via": "/api/auth/me, /oauth/token",
"via": "/api/auth/me, /oauth/token",
- "lines": "363,395,460,539",
+ "lines": "376,408,473,552",
"auth": "oauth-client",
"auth": "oauth-client",
"timeout": false,
"timeout": false,
"retry": true
"retry": true
@@ -46562,7 +48456,27 @@
@@ -46562,7 +48456,27 @@
"file": "server/ai/ai-service.js",
"file": "server/ai/ai-service.js",
"target": "OpenVibe.AI",
"target": "OpenVibe.AI",
"via": "OV_AI_INTERNAL_URL, :4700",
"via": "OV_AI_INTERNAL_URL, :4700",
- "lines": "40,40",
+ "lines": "41,41",
+ "auth": "none-detected",
+ "timeout": true,
+ "retry": true
+ },
+ {
+ "caller": "OpenVibe.Live",
+ "file": "server/ai/byo-credentials.js",
+ "target": "OpenVibe.AI",
+ "via": "OV_AI_INTERNAL_URL, :4700",
+ "lines": "17,17",
+ "auth": "none-detected",
+ "timeout": true,
+ "retry": true
+ },
+ {
+ "caller": "OpenVibe.Live",
+ "file": "server/ai/viewer-quota.js",
+ "target": "OpenVibe.AI",
+ "via": "OV_AI_INTERNAL_URL, :4700",
+ "lines": "17,17",
"auth": "none-detected",
"auth": "none-detected",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
@@ -46647,6 +48561,16 @@
@@ -46647,6 +48561,16 @@
"timeout": true,
"timeout": true,
"retry": false
"retry": false
},
},
+ {
+ "caller": "OpenVibe.Live",
+ "file": "server/auth/account-data.js",
+ "target": "OpenVibe.Network",
+ "via": "OV_NETWORK_INTERNAL_URL, :4000",
+ "lines": "171,171",
+ "auth": "none-detected",
+ "timeout": true,
+ "retry": true
+ },
{
{
"caller": "OpenVibe.Live",
"caller": "OpenVibe.Live",
"file": "server/chat/chat-server.js",
"file": "server/chat/chat-server.js",
@@ -46827,6 +48751,16 @@
@@ -46827,6 +48751,16 @@
"timeout": false,
"timeout": false,
"retry": false
"retry": false
},
},
+ {
+ "caller": "OpenVibe.Media",
+ "file": "server/account-data.js",
+ "target": "OpenVibe.Network",
+ "via": "/internal/events, OV_NETWORK_INTERNAL_URL, :4000, /oauth/token",
+ "lines": "4,116,116,119",
+ "auth": "bearer, oauth-client",
+ "timeout": true,
+ "retry": false
+ },
{
{
"caller": "OpenVibe.Media",
"caller": "OpenVibe.Media",
"file": "server/auth.js",
"file": "server/auth.js",
@@ -46882,7 +48816,7 @@
@@ -46882,7 +48816,7 @@
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Blog",
"target": "OpenVibe.Blog",
"via": "OV_BLOG_INTERNAL_URL, blogUrl, :4810",
"via": "OV_BLOG_INTERNAL_URL, blogUrl, :4810",
- "lines": "440,440,440",
+ "lines": "498,498,498",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": false,
"timeout": false,
"retry": false
"retry": false
@@ -46892,7 +48826,7 @@
@@ -46892,7 +48826,7 @@
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"via": "eventsUrl, eventsInternalUrl",
"via": "eventsUrl, eventsInternalUrl",
- "lines": "496,496,583,583",
+ "lines": "557,557,644,644",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": false,
"timeout": false,
"retry": false
"retry": false
@@ -46922,7 +48856,7 @@
@@ -46922,7 +48856,7 @@
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Games",
"target": "OpenVibe.Games",
"via": ":8000, games.internalUrl",
"via": ":8000, games.internalUrl",
- "lines": "245,313",
+ "lines": "247,315",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": false,
"timeout": false,
"retry": false
"retry": false
@@ -46962,7 +48896,7 @@
@@ -46962,7 +48896,7 @@
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"via": ":3000, live.internalUrl, liveUrl",
"via": ":3000, live.internalUrl, liveUrl",
- "lines": "241,311,370,370,599",
+ "lines": "243,313,375,375,660",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": false,
"timeout": false,
"retry": false
"retry": false
@@ -47002,7 +48936,7 @@
@@ -47002,7 +48936,7 @@
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"via": ":4100, media.internalUrl",
"via": ":4100, media.internalUrl",
- "lines": "244,314",
+ "lines": "246,316",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": false,
"timeout": false,
"retry": false
"retry": false
@@ -47052,7 +48986,7 @@
@@ -47052,7 +48986,7 @@
"file": "server/index.js",
"file": "server/index.js",
"target": "OpenVibe.Tools",
"target": "OpenVibe.Tools",
"via": ":4001, tools.internalUrl",
"via": ":4001, tools.internalUrl",
- "lines": "243,312",
+ "lines": "245,314",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": false,
"timeout": false,
"retry": false
"retry": false
@@ -47082,7 +49016,7 @@
@@ -47082,7 +49016,7 @@
"file": "release-watch.js",
"file": "release-watch.js",
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"via": "eventsUrl",
"via": "eventsUrl",
- "lines": "12,189,190,190,197",
+ "lines": "9,189,190,190,197",
"auth": "none-detected",
"auth": "none-detected",
"timeout": false,
"timeout": false,
"retry": true
"retry": true
@@ -47132,7 +49066,7 @@
@@ -47132,7 +49066,7 @@
"file": "build.js",
"file": "build.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"via": "networkUrl",
"via": "networkUrl",
- "lines": "100,111,111,112,112,114,145,216,217,266,267,268,271,271,272,272,283,318,501",
+ "lines": "104,115,115,116,116,118,220,221,275,275,276,276,287,322,514",
"auth": "none-detected",
"auth": "none-detected",
"timeout": false,
"timeout": false,
"retry": false
"retry": false
@@ -47152,7 +49086,7 @@
@@ -47152,7 +49086,7 @@
"file": "apps/gateway/server/index.js",
"file": "apps/gateway/server/index.js",
"target": "OpenVibe.Community",
"target": "OpenVibe.Community",
"via": "communityUrl, OV_COMMUNITY_URL",
"via": "communityUrl, OV_COMMUNITY_URL",
- "lines": "86,318,440",
+ "lines": "86,326,457",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
@@ -47162,7 +49096,7 @@
@@ -47162,7 +49096,7 @@
"file": "apps/_shared/jobs/index.js",
"file": "apps/_shared/jobs/index.js",
"target": "OpenVibe.Events",
"target": "OpenVibe.Events",
"via": "EVENTS_URL",
"via": "EVENTS_URL",
- "lines": "96",
+ "lines": "97",
"auth": "oauth-client, service-token",
"auth": "oauth-client, service-token",
"timeout": true,
"timeout": true,
"retry": false
"retry": false
@@ -47172,7 +49106,7 @@
@@ -47172,7 +49106,7 @@
"file": "apps/gateway/server/index.js",
"file": "apps/gateway/server/index.js",
"target": "OpenVibe.Live",
"target": "OpenVibe.Live",
"via": "liveUrl",
"via": "liveUrl",
- "lines": "505",
+ "lines": "522",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
@@ -47182,7 +49116,7 @@
@@ -47182,7 +49116,7 @@
"file": "apps/_shared/jobs/index.js",
"file": "apps/_shared/jobs/index.js",
"target": "OpenVibe.Media",
"target": "OpenVibe.Media",
"via": ":4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL",
"via": ":4100, OV_MEDIA_INTERNAL_URL, MEDIA_URL, mediaOrigin, OV_MEDIA_URL",
- "lines": "18,54,54,54,62,63,143,143,143,157",
+ "lines": "19,55,55,55,63,64,144,144,144,158",
"auth": "oauth-client, service-token",
"auth": "oauth-client, service-token",
"timeout": true,
"timeout": true,
"retry": false
"retry": false
@@ -47202,7 +49136,7 @@
@@ -47202,7 +49136,7 @@
"file": "apps/_shared/jobs/index.js",
"file": "apps/_shared/jobs/index.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"via": ":4000, OV_NETWORK_INTERNAL_URL, /oauth/token",
"via": ":4000, OV_NETWORK_INTERNAL_URL, /oauth/token",
- "lines": "20,45,45,47",
+ "lines": "21,46,46,48",
"auth": "oauth-client, service-token",
"auth": "oauth-client, service-token",
"timeout": true,
"timeout": true,
"retry": false
"retry": false
@@ -47232,7 +49166,7 @@
@@ -47232,7 +49166,7 @@
"file": "apps/gateway/server/index.js",
"file": "apps/gateway/server/index.js",
"target": "OpenVibe.Network",
"target": "OpenVibe.Network",
"via": "/internal/events, networkUrl",
"via": "/internal/events, networkUrl",
- "lines": "34,63,504",
+ "lines": "34,63,521",
"auth": "internal-key, bearer",
"auth": "internal-key, bearer",
"timeout": true,
"timeout": true,
"retry": true
"retry": true
@@ -47361,7 +49295,7 @@
@@ -47361,7 +49295,7 @@
"files": [
"files": [
"server/config.js"
"server/config.js"
],
],
- "prod": null
+ "prod": "openre.env"
},
},
{
{
"repo": "OpenRe.Stream",
"repo": "OpenRe.Stream",
@@ -47493,6 +49427,24 @@
@@ -47493,6 +49427,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenRe.Stream",
+ "name": "OPENRE_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/api/actor-limits.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenRe.Stream",
+ "name": "OPENRE_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/api/actor-limits.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenRe.Stream",
"repo": "OpenRe.Stream",
"name": "OPENRE_LINEAGE",
"name": "OPENRE_LINEAGE",
@@ -47951,6 +49903,15 @@
@@ -47951,6 +49903,15 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_CREDENTIALS_KEY",
+ "secret": true,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": "ai.env"
+ },
{
{
"repo": "OpenVibe.AI",
"repo": "OpenVibe.AI",
"name": "AI_DB_PATH",
"name": "AI_DB_PATH",
@@ -48068,6 +50029,33 @@
@@ -48068,6 +50029,33 @@
],
],
"prod": "ai.env"
"prod": "ai.env"
},
},
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_LOCAL_LLM_MODEL",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": "ai.env"
+ },
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_LOCAL_LLM_TIMEOUT_MS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_LOCAL_LLM_URL",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": "ai.env"
+ },
{
{
"repo": "OpenVibe.AI",
"repo": "OpenVibe.AI",
"name": "AI_MAX_CONCURRENT_RUNS",
"name": "AI_MAX_CONCURRENT_RUNS",
@@ -48124,16 +50112,61 @@
@@ -48124,16 +50112,61 @@
},
},
{
{
"repo": "OpenVibe.AI",
"repo": "OpenVibe.AI",
- "name": "AI_MODEL",
+ "name": "AI_MEDIA_ANALYSIS_DIR",
"secret": false,
"secret": false,
"files": [
"files": [
"server/config.js"
"server/config.js"
],
],
- "prod": "ai.env"
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_MEDIA_ANALYSIS_DISK_RESERVE_BYTES",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_MEDIA_ANALYSIS_FETCH_TIMEOUT_MS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_MEDIA_ANALYSIS_MAX_BYTES",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_MEDIA_SCENE_THRESHOLD",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_MEDIA_STORAGE_HOSTS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
},
},
{
{
"repo": "OpenVibe.AI",
"repo": "OpenVibe.AI",
- "name": "AI_NS_FALLBACK",
+ "name": "AI_MEDIA_STREAM",
"secret": false,
"secret": false,
"files": [
"files": [
"server/config.js"
"server/config.js"
@@ -48142,13 +50175,22 @@
@@ -48142,13 +50175,22 @@
},
},
{
{
"repo": "OpenVibe.AI",
"repo": "OpenVibe.AI",
- "name": "AI_NS_REQUIRED",
+ "name": "AI_MEDIA_STT_WINDOW_SEC",
"secret": false,
"secret": false,
"files": [
"files": [
"server/config.js"
"server/config.js"
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.AI",
+ "name": "AI_MODEL",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": "ai.env"
+ },
{
{
"repo": "OpenVibe.AI",
"repo": "OpenVibe.AI",
"name": "AI_OUTPUT_COST_PER_MTOK",
"name": "AI_OUTPUT_COST_PER_MTOK",
@@ -48302,6 +50344,24 @@
@@ -48302,6 +50344,24 @@
],
],
"prod": "ai.env"
"prod": "ai.env"
},
},
+ {
+ "repo": "OpenVibe.AI",
+ "name": "FFMPEG_BIN",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.AI",
+ "name": "FFPROBE_BIN",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.AI",
"repo": "OpenVibe.AI",
"name": "HOST",
"name": "HOST",
@@ -48603,6 +50663,33 @@
@@ -48603,6 +50663,33 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Billing",
+ "name": "BILLING_LIMITS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Billing",
+ "name": "BILLING_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Billing",
+ "name": "BILLING_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Billing",
"repo": "OpenVibe.Billing",
"name": "BILLING_MAX_BITS",
"name": "BILLING_MAX_BITS",
@@ -49152,6 +51239,24 @@
@@ -49152,6 +51239,24 @@
],
],
"prod": "blog.env"
"prod": "blog.env"
},
},
+ {
+ "repo": "OpenVibe.Blog",
+ "name": "BLOG_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Blog",
+ "name": "BLOG_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Blog",
"repo": "OpenVibe.Blog",
"name": "BLOG_MEDIA_APP",
"name": "BLOG_MEDIA_APP",
@@ -49656,6 +51761,24 @@
@@ -49656,6 +51761,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Chat",
+ "name": "CHAT_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Chat",
+ "name": "CHAT_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Chat",
"repo": "OpenVibe.Chat",
"name": "CHAT_OAUTH_REDIRECT_URI",
"name": "CHAT_OAUTH_REDIRECT_URI",
@@ -50169,6 +52292,24 @@
@@ -50169,6 +52292,24 @@
],
],
"prod": "codes.env"
"prod": "codes.env"
},
},
+ {
+ "repo": "OpenVibe.Codes",
+ "name": "CODES_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Codes",
+ "name": "CODES_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Codes",
"repo": "OpenVibe.Codes",
"name": "CODES_PLAYGROUND_EVENTS_URL",
"name": "CODES_PLAYGROUND_EVENTS_URL",
@@ -50319,7 +52460,7 @@
@@ -50319,7 +52460,7 @@
"secret": false,
"secret": false,
"files": [
"files": [
"server/config.js",
"server/config.js",
- "server/http/docs.js"
+ "server/domain/limits.js"
],
],
"prod": null
"prod": null
},
},
@@ -50328,7 +52469,7 @@
@@ -50328,7 +52469,7 @@
"name": "OV_HOST_INTERNAL_URL",
"name": "OV_HOST_INTERNAL_URL",
"secret": false,
"secret": false,
"files": [
"files": [
- "server/http/docs.js"
+ "server/domain/limits.js"
],
],
"prod": null
"prod": null
},
},
@@ -50338,7 +52479,7 @@
@@ -50338,7 +52479,7 @@
"secret": false,
"secret": false,
"files": [
"files": [
"server/config.js",
"server/config.js",
- "server/http/docs.js"
+ "server/domain/limits.js"
],
],
"prod": null
"prod": null
},
},
@@ -50514,6 +52655,24 @@
@@ -50514,6 +52655,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Community",
+ "name": "COMMUNITY_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Community",
+ "name": "COMMUNITY_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Community",
"repo": "OpenVibe.Community",
"name": "COMMUNITY_PROFILE_MODULE",
"name": "COMMUNITY_PROFILE_MODULE",
@@ -50984,6 +53143,24 @@
@@ -50984,6 +53143,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Coupons",
+ "name": "COUPONS_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Coupons",
+ "name": "COUPONS_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Coupons",
"repo": "OpenVibe.Coupons",
"name": "COUPONS_LOOKUP_ANON_PER_MIN",
"name": "COUPONS_LOOKUP_ANON_PER_MIN",
@@ -51389,6 +53566,24 @@
@@ -51389,6 +53566,24 @@
],
],
"prod": "deals.env"
"prod": "deals.env"
},
},
+ {
+ "repo": "OpenVibe.Deals",
+ "name": "DEALS_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Deals",
+ "name": "DEALS_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Deals",
"repo": "OpenVibe.Deals",
"name": "DEALS_MODERATORS",
"name": "DEALS_MODERATORS",
@@ -51812,6 +54007,33 @@
@@ -51812,6 +54007,33 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Events",
+ "name": "EVENTS_LIMITS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Events",
+ "name": "EVENTS_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Events",
+ "name": "EVENTS_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"name": "EVENTS_MAX_ATTEMPTS",
"name": "EVENTS_MAX_ATTEMPTS",
@@ -51893,6 +54115,24 @@
@@ -51893,6 +54115,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Events",
+ "name": "EVENTS_USAGE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Events",
+ "name": "EVENTS_USAGE_FLUSH_MS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Events",
"repo": "OpenVibe.Events",
"name": "EVENTS_USER_AUDIENCES",
"name": "EVENTS_USER_AUDIENCES",
@@ -52499,6 +54739,24 @@
@@ -52499,6 +54739,24 @@
],
],
"prod": "games.env"
"prod": "games.env"
},
},
+ {
+ "repo": "OpenVibe.Games",
+ "name": "GAMES_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "apps/server/src/net/actorLimits.ts"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Games",
+ "name": "GAMES_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "apps/server/src/net/actorLimits.ts"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Games",
"repo": "OpenVibe.Games",
"name": "GUEST_IP_BINDING",
"name": "GUEST_IP_BINDING",
@@ -52694,6 +54952,24 @@
@@ -52694,6 +54952,24 @@
],
],
"prod": "host.env"
"prod": "host.env"
},
},
+ {
+ "repo": "OpenVibe.Host",
+ "name": "CLOUDFLARE_API_TOKEN",
+ "secret": true,
+ "files": [
+ "lib/dns.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Host",
+ "name": "CLOUDFLARE_API_TOKEN_FILE",
+ "secret": false,
+ "files": [
+ "lib/dns.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Host",
"repo": "OpenVibe.Host",
"name": "COOKIE_SECURE",
"name": "COOKIE_SECURE",
@@ -52721,6 +54997,15 @@
@@ -52721,6 +54997,15 @@
],
],
"prod": "host.env"
"prod": "host.env"
},
},
+ {
+ "repo": "OpenVibe.Host",
+ "name": "HOME",
+ "secret": false,
+ "files": [
+ "lib/dns.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Host",
"repo": "OpenVibe.Host",
"name": "HOST",
"name": "HOST",
@@ -52730,6 +55015,15 @@
@@ -52730,6 +55015,15 @@
],
],
"prod": "host.env"
"prod": "host.env"
},
},
+ {
+ "repo": "OpenVibe.Host",
+ "name": "HOST_ACTOR_LIMITS",
+ "secret": false,
+ "files": [
+ "server/http/actor-limits.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Host",
"repo": "OpenVibe.Host",
"name": "HOST_CNAME_TARGET",
"name": "HOST_CNAME_TARGET",
@@ -52793,6 +55087,24 @@
@@ -52793,6 +55087,24 @@
],
],
"prod": "host.env"
"prod": "host.env"
},
},
+ {
+ "repo": "OpenVibe.Host",
+ "name": "HOST_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/http/actor-limits.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Host",
+ "name": "HOST_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/http/actor-limits.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Host",
"repo": "OpenVibe.Host",
"name": "HOST_MAX_CONCURRENT_UPLOADS",
"name": "HOST_MAX_CONCURRENT_UPLOADS",
@@ -53009,6 +55321,15 @@
@@ -53009,6 +55321,15 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Host",
+ "name": "OVHOST_PROMETHEUS_URL",
+ "secret": false,
+ "files": [
+ "lib/alerts.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Host",
"repo": "OpenVibe.Host",
"name": "PATH",
"name": "PATH",
@@ -53050,6 +55371,7 @@
@@ -53050,6 +55371,7 @@
"name": "SUDO_USER",
"name": "SUDO_USER",
"secret": false,
"secret": false,
"files": [
"files": [
+ "lib/cli.js",
"lib/commands/drill.js",
"lib/commands/drill.js",
"lib/release-ops.js"
"lib/release-ops.js"
],
],
@@ -53069,6 +55391,7 @@
@@ -53069,6 +55391,7 @@
"name": "USER",
"name": "USER",
"secret": false,
"secret": false,
"files": [
"files": [
+ "lib/cli.js",
"lib/executor.js"
"lib/executor.js"
],
],
"prod": null
"prod": null
@@ -53136,6 +55459,15 @@
@@ -53136,6 +55459,15 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Live",
+ "name": "ANALYTICS_SOURCE",
+ "secret": false,
+ "files": [
+ "server/analytics/network-analytics.js"
+ ],
+ "prod": "live.env"
+ },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"name": "BASE_URL",
"name": "BASE_URL",
@@ -53185,15 +55517,6 @@
@@ -53185,15 +55517,6 @@
],
],
"prod": "live.env"
"prod": "live.env"
},
},
- {
- "repo": "OpenVibe.Live",
- "name": "COLD_STORAGE_PATH",
- "secret": false,
- "files": [
- "server/config.js"
- ],
- "prod": null
- },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"name": "DATA_DIR",
"name": "DATA_DIR",
@@ -53270,6 +55593,15 @@
@@ -53270,6 +55593,15 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Live",
+ "name": "FOLLOWS_AUTHORITY",
+ "secret": false,
+ "files": [
+ "server/social/network-follows.js"
+ ],
+ "prod": "live.env"
+ },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"name": "GH_TOKEN",
"name": "GH_TOKEN",
@@ -53408,6 +55740,24 @@
@@ -53408,6 +55740,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Live",
+ "name": "LIVE_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/net/actor-limits.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Live",
+ "name": "LIVE_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/net/actor-limits.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Live",
"repo": "OpenVibe.Live",
"name": "LIVE_MODULE_SUMMARIES",
"name": "LIVE_MODULE_SUMMARIES",
@@ -53524,7 +55874,6 @@
@@ -53524,7 +55874,6 @@
"name": "MAX_VOD_SIZE_MB",
"name": "MAX_VOD_SIZE_MB",
"secret": false,
"secret": false,
"files": [
"files": [
- "server/config.js",
"server/media-proxy/vods.js"
"server/media-proxy/vods.js"
],
],
"prod": null
"prod": null
@@ -53722,7 +56071,9 @@
@@ -53722,7 +56071,9 @@
"name": "OV_AI_INTERNAL_URL",
"name": "OV_AI_INTERNAL_URL",
"secret": false,
"secret": false,
"files": [
"files": [
- "server/ai/ai-service.js"
+ "server/ai/ai-service.js",
+ "server/ai/byo-credentials.js",
+ "server/ai/viewer-quota.js"
],
],
"prod": null
"prod": null
},
},
@@ -53732,6 +56083,7 @@
@@ -53732,6 +56083,7 @@
"secret": false,
"secret": false,
"files": [
"files": [
"server/docs/routes.js",
"server/docs/routes.js",
+ "server/index.js",
"server/web/assets.js"
"server/web/assets.js"
],
],
"prod": null
"prod": null
@@ -53822,6 +56174,9 @@
@@ -53822,6 +56174,9 @@
"name": "OV_NETWORK_INTERNAL_URL",
"name": "OV_NETWORK_INTERNAL_URL",
"secret": false,
"secret": false,
"files": [
"files": [
+ "server/analytics/network-analytics.js",
+ "server/auth/account-data.js",
+ "server/auth/game-summary.js",
"server/auth/module-summaries.js",
"server/auth/module-summaries.js",
"server/chat/chat-server.js",
"server/chat/chat-server.js",
"server/events/stream-events.js",
"server/events/stream-events.js",
@@ -53830,6 +56185,7 @@
@@ -53830,6 +56185,7 @@
"server/net/network-principal.js",
"server/net/network-principal.js",
"server/openre/openre-client.js",
"server/openre/openre-client.js",
"server/pastes-client.js",
"server/pastes-client.js",
+ "server/social/network-follows.js",
"server/utils/notify.js"
"server/utils/notify.js"
],
],
"prod": "live.env"
"prod": "live.env"
@@ -54776,6 +57132,7 @@
@@ -54776,6 +57132,7 @@
"name": "OV_NETWORK_INTERNAL_URL",
"name": "OV_NETWORK_INTERNAL_URL",
"secret": false,
"secret": false,
"files": [
"files": [
+ "server/account-data.js",
"server/config.js",
"server/config.js",
"server/events.js",
"server/events.js",
"server/lineage-client.js",
"server/lineage-client.js",
@@ -54797,6 +57154,7 @@
@@ -54797,6 +57154,7 @@
"name": "OV_OAUTH_CLIENT_ID",
"name": "OV_OAUTH_CLIENT_ID",
"secret": false,
"secret": false,
"files": [
"files": [
+ "server/account-data.js",
"server/events.js",
"server/events.js",
"server/index.js",
"server/index.js",
"server/lineage-client.js",
"server/lineage-client.js",
@@ -54810,6 +57168,7 @@
@@ -54810,6 +57168,7 @@
"name": "OV_OAUTH_CLIENT_SECRET",
"name": "OV_OAUTH_CLIENT_SECRET",
"secret": true,
"secret": true,
"files": [
"files": [
+ "server/account-data.js",
"server/events.js",
"server/events.js",
"server/index.js",
"server/index.js",
"server/lineage-client.js",
"server/lineage-client.js",
@@ -55092,6 +57451,15 @@
@@ -55092,6 +57451,15 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Network",
+ "name": "FOLLOWS_AUTHORITY",
+ "secret": false,
+ "files": [
+ "server/index.js"
+ ],
+ "prod": "network.env"
+ },
{
{
"repo": "OpenVibe.Network",
"repo": "OpenVibe.Network",
"name": "GITHUB_TOKEN",
"name": "GITHUB_TOKEN",
@@ -55203,6 +57571,24 @@
@@ -55203,6 +57571,24 @@
],
],
"prod": "network.env"
"prod": "network.env"
},
},
+ {
+ "repo": "OpenVibe.Network",
+ "name": "NETWORK_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/auth/actor-limits.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Network",
+ "name": "NETWORK_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/auth/actor-limits.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Network",
"repo": "OpenVibe.Network",
"name": "NODE_ENV",
"name": "NODE_ENV",
@@ -55241,6 +57627,15 @@
@@ -55241,6 +57627,15 @@
"prod": "network.env",
"prod": "network.env",
"unreferenced": true
"unreferenced": true
},
},
+ {
+ "repo": "OpenVibe.Network",
+ "name": "OPERATOR_ALERT_USERNAMES",
+ "secret": false,
+ "files": [
+ "server/operator/alerts.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Network",
"repo": "OpenVibe.Network",
"name": "OV_AI_INTERNAL_URL",
"name": "OV_AI_INTERNAL_URL",
@@ -55540,7 +57935,10 @@
@@ -55540,7 +57935,10 @@
"server/auth/owner-guard.js",
"server/auth/owner-guard.js",
"server/auth/routes.js",
"server/auth/routes.js",
"server/deploy/routes.js",
"server/deploy/routes.js",
- "server/index.js"
+ "server/identity/account-data.js",
+ "server/identity/account-merge.js",
+ "server/index.js",
+ "server/operator/alerts.js"
],
],
"prod": null
"prod": null
},
},
@@ -55767,6 +58165,24 @@
@@ -55767,6 +58165,24 @@
],
],
"prod": "news.env"
"prod": "news.env"
},
},
+ {
+ "repo": "OpenVibe.News",
+ "name": "NEWS_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.News",
+ "name": "NEWS_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.News",
"repo": "OpenVibe.News",
"name": "NEWS_MIN_INDEPENDENT_SOURCES",
"name": "NEWS_MIN_INDEPENDENT_SOURCES",
@@ -56199,6 +58615,24 @@
@@ -56199,6 +58615,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Reviews",
+ "name": "REVIEWS_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Reviews",
+ "name": "REVIEWS_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Reviews",
"repo": "OpenVibe.Reviews",
"name": "REVIEWS_SOURCES_PAGE_SIZE",
"name": "REVIEWS_SOURCES_PAGE_SIZE",
@@ -56487,6 +58921,24 @@
@@ -56487,6 +58921,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Search",
+ "name": "SEARCH_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Search",
+ "name": "SEARCH_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Search",
"repo": "OpenVibe.Search",
"name": "SEARCH_MAX_BODY_BYTES",
"name": "SEARCH_MAX_BODY_BYTES",
@@ -56955,6 +59407,24 @@
@@ -56955,6 +59407,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Sources",
+ "name": "SOURCES_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Sources",
+ "name": "SOURCES_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Sources",
"repo": "OpenVibe.Sources",
"name": "SOURCES_MAX_BACKOFF_MS",
"name": "SOURCES_MAX_BACKOFF_MS",
@@ -57369,6 +59839,24 @@
@@ -57369,6 +59839,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Tips",
+ "name": "TIPS_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Tips",
+ "name": "TIPS_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Tips",
"repo": "OpenVibe.Tips",
"name": "TIPS_MAX_BITS",
"name": "TIPS_MAX_BITS",
@@ -58066,7 +60554,7 @@
@@ -58066,7 +60554,7 @@
"apps/maps/server/config.js",
"apps/maps/server/config.js",
"apps/maps/server/sources/ridb.js"
"apps/maps/server/sources/ridb.js"
],
],
- "prod": null
+ "prod": "tools.env"
},
},
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
@@ -58122,6 +60610,24 @@
@@ -58122,6 +60610,24 @@
],
],
"prod": "tools.env"
"prod": "tools.env"
},
},
+ {
+ "repo": "OpenVibe.Tools",
+ "name": "TOOLS_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "apps/_shared/actor-limits.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Tools",
+ "name": "TOOLS_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "apps/_shared/actor-limits.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Tools",
"repo": "OpenVibe.Tools",
"name": "TOOLS_MEDIA_NAMESPACE",
"name": "TOOLS_MEDIA_NAMESPACE",
@@ -58460,6 +60966,24 @@
@@ -58460,6 +60966,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Trade",
+ "name": "TRADE_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Trade",
+ "name": "TRADE_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Trade",
"repo": "OpenVibe.Trade",
"name": "TRADE_PRICE_MAX_AGE_SEC",
"name": "TRADE_PRICE_MAX_AGE_SEC",
@@ -58793,6 +61317,24 @@
@@ -58793,6 +61317,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.VIP",
+ "name": "VIP_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.VIP",
+ "name": "VIP_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.VIP",
"repo": "OpenVibe.VIP",
"name": "VIP_MEMBER_COUNT_TTL_MS",
"name": "VIP_MEMBER_COUNT_TTL_MS",
@@ -59027,6 +61569,24 @@
@@ -59027,6 +61569,24 @@
],
],
"prod": "wiki.env"
"prod": "wiki.env"
},
},
+ {
+ "repo": "OpenVibe.Wiki",
+ "name": "OV_VIP_INTERNAL_URL",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Wiki",
+ "name": "OV_VIP_URL",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Wiki",
"repo": "OpenVibe.Wiki",
"name": "PORT",
"name": "PORT",
@@ -59108,6 +61668,24 @@
@@ -59108,6 +61668,24 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Wiki",
+ "name": "WIKI_LIMITS_HOUR",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Wiki",
+ "name": "WIKI_LIMITS_MINUTE",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Wiki",
"repo": "OpenVibe.Wiki",
"name": "WIKI_MEDIA_APP",
"name": "WIKI_MEDIA_APP",
@@ -59144,6 +61722,42 @@
@@ -59144,6 +61722,42 @@
],
],
"prod": null
"prod": null
},
},
+ {
+ "repo": "OpenVibe.Wiki",
+ "name": "WIKI_VIP_CACHE_DENY_TTL_MS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Wiki",
+ "name": "WIKI_VIP_CACHE_TTL_MS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Wiki",
+ "name": "WIKI_VIP_CACHE_UNAVAILABLE_TTL_MS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
+ {
+ "repo": "OpenVibe.Wiki",
+ "name": "WIKI_VIP_TIMEOUT_MS",
+ "secret": false,
+ "files": [
+ "server/config.js"
+ ],
+ "prod": null
+ },
{
{
"repo": "OpenVibe.Wiki",
"repo": "OpenVibe.Wiki",
"name": "WIKI_WORKER_ID",
"name": "WIKI_WORKER_ID",
@@ -59155,11 +61769,155 @@
@@ -59155,11 +61769,155 @@
}
}
],
],
"discrepancies": [
"discrepancies": [
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "ai",
+ "detail": "deployed 549bed0 is 1 commit(s) behind origin/main 6c8b833"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "billing",
+ "detail": "deployed 80f97aa is 1 commit(s) behind origin/main f24684b"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "blog",
+ "detail": "deployed 21d537c is 1 commit(s) behind origin/main 8a7f8eb"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "chat",
+ "detail": "deployed 3aab730 is 1 commit(s) behind origin/main d87c8d3"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "codes",
+ "detail": "deployed d78de70 is 1 commit(s) behind origin/main 7d6f65a"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "community",
+ "detail": "deployed 52d923a is 1 commit(s) behind origin/main 2da3501"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "coupons",
+ "detail": "deployed 64835d2 is 1 commit(s) behind origin/main b91cd79"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "deals",
+ "detail": "deployed fa0582d is 1 commit(s) behind origin/main 533450f"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "events",
+ "detail": "deployed f55f7eb is 1 commit(s) behind origin/main 19919ec"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "games",
+ "detail": "deployed 51d8688 is 1 commit(s) behind origin/main eb2d008"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "host",
+ "detail": "deployed 2b63389 is 2 commit(s) behind origin/main 6d2aaaa"
+ },
{
{
"severity": "medium",
"severity": "medium",
"area": "deploy",
"area": "deploy",
"subject": "live",
"subject": "live",
- "detail": "deployed 9f7f36c is 61 commit(s) behind origin/main 8caa540"
+ "detail": "deployed 9f7f36c is 120 commit(s) behind origin/main 03f49b7"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "media",
+ "detail": "deployed 6248363 is 1 commit(s) behind origin/main 14cac06"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "network",
+ "detail": "deployed ddd87b6 is 1 commit(s) behind origin/main 5a50c12"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "news",
+ "detail": "deployed 8ab47a6 is 1 commit(s) behind origin/main 97dae43"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "openre",
+ "detail": "deployed cf423e3 is 1 commit(s) behind origin/main c77ec2a"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "reviews",
+ "detail": "deployed 1cff36b is 1 commit(s) behind origin/main c87b344"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "search",
+ "detail": "deployed 8ed7667 is 1 commit(s) behind origin/main e8511d8"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "sites",
+ "detail": "deployed 32464ec is 1 commit(s) behind origin/main 304e8b1"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "sources",
+ "detail": "deployed 351383e is 1 commit(s) behind origin/main 1670853"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "tips",
+ "detail": "deployed 1e6bfbb is 1 commit(s) behind origin/main 13986b5"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "tools",
+ "detail": "deployed e55469f is 1 commit(s) behind origin/main 4f4ed6e"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "trade",
+ "detail": "deployed 4658447 is 1 commit(s) behind origin/main 273bce7"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "vip",
+ "detail": "deployed 0fbcbb5 is 1 commit(s) behind origin/main 95b3e19"
+ },
+ {
+ "severity": "medium",
+ "area": "deploy",
+ "subject": "wiki",
+ "detail": "deployed 32a26ef is 1 commit(s) behind origin/main 3302540"
},
},
{
{
"severity": "low",
"severity": "low",
@@ -59183,7 +61941,7 @@
@@ -59183,7 +61941,7 @@
"severity": "low",
"severity": "low",
"area": "database",
"area": "database",
"subject": "/opt/openvibe.live/shared/data/analytics.db",
"subject": "/opt/openvibe.live/shared/data/analytics.db",
- "detail": "518.0 MB, 6 tables, not a database the service opens (services.json): stale file or undeclared copy"
+ "detail": "525.4 MB, 6 tables, not a database the service opens (services.json): stale file or undeclared copy"
},
},
{
{
"severity": "low",
"severity": "low",
@@ -59209,6 +61967,12 @@
@@ -59209,6 +61967,12 @@
"subject": "/opt/openvibe.live/shared/data/backups/live-pre-643a2e6.db",
"subject": "/opt/openvibe.live/shared/data/backups/live-pre-643a2e6.db",
"detail": "264.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data"
"detail": "264.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data"
},
},
+ {
+ "severity": "low",
+ "area": "database",
+ "subject": "/opt/openvibe.live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db",
+ "detail": "284.7 MB copy (backup, import snapshot or rehearsal) kept beside the service data"
+ },
{
{
"severity": "low",
"severity": "low",
"area": "database",
"area": "database",
@@ -59225,7 +61989,7 @@
@@ -59225,7 +61989,7 @@
"severity": "low",
"severity": "low",
"area": "database",
"area": "database",
"subject": "/opt/openvibe.live/shared/data/live.db",
"subject": "/opt/openvibe.live/shared/data/live.db",
- "detail": "284.1 MB, 161 tables, not a database the service opens (services.json): stale file or undeclared copy"
+ "detail": "284.7 MB, 162 tables, not a database the service opens (services.json): stale file or undeclared copy"
},
},
{
{
"severity": "low",
"severity": "low",
@@ -59251,6 +62015,18 @@
@@ -59251,6 +62015,18 @@
"subject": "/opt/openvibe.media/data/reports/h15-repair-applied-20260925.media.db",
"subject": "/opt/openvibe.media/data/reports/h15-repair-applied-20260925.media.db",
"detail": "11.3 MB, 27 tables, not a database the service opens (services.json): stale file or undeclared copy"
"detail": "11.3 MB, 27 tables, not a database the service opens (services.json): stale file or undeclared copy"
},
},
+ {
+ "severity": "low",
+ "area": "database",
+ "subject": "/opt/openvibe.network/data/backups/network-pre-creator-analytics-20260926.db",
+ "detail": "292.4 MB copy (backup, import snapshot or rehearsal) kept beside the service data"
+ },
+ {
+ "severity": "low",
+ "area": "database",
+ "subject": "/opt/openvibe.network/data/backups/network-pre-follows-20260926.db",
+ "detail": "292.1 MB copy (backup, import snapshot or rehearsal) kept beside the service data"
+ },
{
{
"severity": "low",
"severity": "low",
"area": "database",
"area": "database",
@@ -59533,6 +62309,12 @@
@@ -59533,6 +62309,12 @@
"subject": "OpenVibe.Examples:OV_WEBHOOK_SECRET_PREVIOUS",
"subject": "OpenVibe.Examples:OV_WEBHOOK_SECRET_PREVIOUS",
"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.Host:CLOUDFLARE_API_TOKEN",
+ "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",
@@ -59641,12 +62423,6 @@
@@ -59641,12 +62423,6 @@
"subject": "OpenVibe.Tools:OV_INTERNAL_KEY",
"subject": "OpenVibe.Tools:OV_INTERNAL_KEY",
"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.Tools:RIDB_API_KEY",
- "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",
@@ -59989,6 +62765,12 @@
@@ -59989,6 +62765,12 @@
"subject": "OpenVibe.Host:event_outbox",
"subject": "OpenVibe.Host:event_outbox",
"detail": "in production (host.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Host (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.)"
"detail": "in production (host.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Host (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.)"
},
},
+ {
+ "severity": "info",
+ "area": "schema",
+ "subject": "OpenVibe.Live:account_data_events",
+ "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",
@@ -60343,6 +63125,12 @@
@@ -60343,6 +63125,12 @@
"subject": "OpenVibe.Live:emotes_new",
"subject": "OpenVibe.Live:emotes_new",
"detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
"detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
},
},
+ {
+ "severity": "info",
+ "area": "schema",
+ "subject": "OpenVibe.Live:follow_projection_revisions",
+ "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",
@@ -60367,6 +63155,12 @@
@@ -60367,6 +63155,12 @@
"subject": "OpenVibe.Live:kick_channel_cache",
"subject": "OpenVibe.Live:kick_channel_cache",
"detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
"detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
},
},
+ {
+ "severity": "info",
+ "area": "schema",
+ "subject": "OpenVibe.Live:lineage_unresolved",
+ "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",
@@ -60571,6 +63365,12 @@
@@ -60571,6 +63365,12 @@
"subject": "OpenVibe.Live:streams",
"subject": "OpenVibe.Live:streams",
"detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
"detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
},
},
+ {
+ "severity": "info",
+ "area": "schema",
+ "subject": "OpenVibe.Live:subject_merges",
+ "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",
@@ -60727,6 +63527,12 @@
@@ -60727,6 +63527,12 @@
"subject": "OpenVibe.Media:event_outbox",
"subject": "OpenVibe.Media:event_outbox",
"detail": "in production (media.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Media (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.)"
"detail": "in production (media.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Media (Created at runtime by the openvibe-sdk / openvibe-events outbox and inbox helpers.)"
},
},
+ {
+ "severity": "info",
+ "area": "schema",
+ "subject": "OpenVibe.Media:subject_merges",
+ "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",
@@ -61165,6 +63971,30 @@
@@ -61165,6 +63971,30 @@
"subject": "OpenVibe.Wiki:wiki_schedule_jobs",
"subject": "OpenVibe.Wiki:wiki_schedule_jobs",
"detail": "in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).)"
"detail": "in production (wiki.db) but no CREATE TABLE in the repo; classified keep -> OpenVibe.Wiki (Prefixed stores created at runtime by openvibe-publishing (revisions, citations, schedules, redirects, index hooks).)"
},
},
+ {
+ "severity": "info",
+ "area": "units",
+ "subject": "openvibe-alerts.service",
+ "detail": "unit not listed in services.json"
+ },
+ {
+ "severity": "info",
+ "area": "units",
+ "subject": "openvibe-alerts.timer",
+ "detail": "unit not listed in services.json"
+ },
+ {
+ "severity": "info",
+ "area": "units",
+ "subject": "openvibe-browsercheck.service",
+ "detail": "unit not listed in services.json"
+ },
+ {
+ "severity": "info",
+ "area": "units",
+ "subject": "openvibe-browsercheck.timer",
+ "detail": "unit not listed in services.json"
+ },
{
{
"severity": "info",
"severity": "info",
"area": "units",
"area": "units",
@@ -61177,6 +64007,12 @@
@@ -61177,6 +64007,12 @@
"subject": "openvibe-devpath.timer",
"subject": "openvibe-devpath.timer",
"detail": "unit not listed in services.json"
"detail": "unit not listed in services.json"
},
},
+ {
+ "severity": "info",
+ "area": "units",
+ "subject": "openvibe-llm.service",
+ "detail": "unit not listed in services.json"
+ },
{
{
"severity": "info",
"severity": "info",
"area": "units",
"area": "units",
@@ -61205,20 +64041,20 @@
@@ -61205,20 +64041,20 @@
"metrics": {
"metrics": {
"github.charters": "1 charter-only repos of 36",
"github.charters": "1 charter-only repos of 36",
"contract.todo-markers": "Live 14, Network 3, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0",
"contract.todo-markers": "Live 14, Network 3, Shared 0, Media 0, Tools 0, Community 0, Games 0, Sites 0, Events 0, Chat 0, OpenRe.Stream 0, Billing 0, Tips 0, VIP 0, AI 0, Search 0, Sources 0, Wiki 0, Blog 0, News 0, Reviews 0, Deals 0, Coupons 0, Trade 0, Codes 0, Host 0, Examples 0",
- "outbound.call-sites": "107 caller-file/target pairs across 76 files",
- "outbound.internal-key": "40 of 107 call sites authenticate with the shared internal key",
+ "outbound.call-sites": "112 caller-file/target pairs across 82 files",
+ "outbound.internal-key": "40 of 112 call sites authenticate with the shared internal key",
"ws.servers": "12 WebSocket server constructions",
"ws.servers": "12 WebSocket server constructions",
"tables.analytics-copies": "2 repos carry their own analytics_events",
"tables.analytics-copies": "2 repos carry their own analytics_events",
- "shared.pins": "24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0",
- "shared.drift": "0 manifests unpinned or behind: none",
+ "shared.pins": "25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0",
+ "shared.drift": "31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0)",
"ci.repos": "27 of 27 scanned repos have .github/workflows",
"ci.repos": "27 of 27 scanned repos have .github/workflows",
- "deploy.drift": "1 service(s) not running origin/main",
- "tests.OpenVibe.Live": "126 test files",
- "tables.OpenVibe.Live": "122 tables",
+ "deploy.drift": "25 service(s) not running origin/main",
+ "tests.OpenVibe.Live": "158 test files",
+ "tables.OpenVibe.Live": "126 tables",
+ "tables.OpenVibe.Live.target:OpenVibe.Live": "35 Live tables target OpenVibe.Live",
"tables.OpenVibe.Live.target:OpenVibe.AI": "14 Live tables target OpenVibe.AI",
"tables.OpenVibe.Live.target:OpenVibe.AI": "14 Live tables target OpenVibe.AI",
"tables.OpenVibe.Live.target:OpenVibe.Network (policy)": "5 Live tables target OpenVibe.Network (policy)",
"tables.OpenVibe.Live.target:OpenVibe.Network (policy)": "5 Live tables target OpenVibe.Network (policy)",
"tables.OpenVibe.Live.target:OpenVibe.Network (principals) / OpenVibe.Codes": "2 Live tables target OpenVibe.Network (principals) / OpenVibe.Codes",
"tables.OpenVibe.Live.target:OpenVibe.Network (principals) / OpenVibe.Codes": "2 Live tables target OpenVibe.Network (principals) / OpenVibe.Codes",
- "tables.OpenVibe.Live.target:OpenVibe.Live": "31 Live tables target OpenVibe.Live",
"tables.OpenVibe.Live.target:OpenRe.Stream": "14 Live tables target OpenRe.Stream",
"tables.OpenVibe.Live.target:OpenRe.Stream": "14 Live tables target OpenRe.Stream",
"tables.OpenVibe.Live.target:OpenVibe.Chat": "25 Live tables target OpenVibe.Chat",
"tables.OpenVibe.Live.target:OpenVibe.Chat": "25 Live tables target OpenVibe.Chat",
"tables.OpenVibe.Live.target:OpenVibe.Billing (loyalty ledger)": "9 Live tables target OpenVibe.Billing (loyalty ledger)",
"tables.OpenVibe.Live.target:OpenVibe.Billing (loyalty ledger)": "9 Live tables target OpenVibe.Billing (loyalty ledger)",
@@ -61229,84 +64065,84 @@
@@ -61229,84 +64065,84 @@
"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": "60 test files",
- "tables.OpenVibe.Network": "52 tables",
- "tables.OpenVibe.Network.target:OpenVibe.Network": "57 Network tables target OpenVibe.Network",
+ "tests.OpenVibe.Network": "77 test files",
+ "tables.OpenVibe.Network": "70 tables",
+ "tables.OpenVibe.Network.target:OpenVibe.Network": "75 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.Shared": "34 test files",
+ "tests.OpenVibe.Shared": "39 test files",
"tables.OpenVibe.Shared": "2 tables",
"tables.OpenVibe.Shared": "2 tables",
"tables.OpenVibe.Shared.target:OpenVibe.Shared": "2 Shared tables target OpenVibe.Shared",
"tables.OpenVibe.Shared.target:OpenVibe.Shared": "2 Shared tables target OpenVibe.Shared",
- "tests.OpenVibe.Media": "56 test files",
- "tables.OpenVibe.Media": "28 tables",
- "tables.OpenVibe.Media.target:OpenVibe.Media": "26 Media tables target OpenVibe.Media",
+ "tests.OpenVibe.Media": "67 test files",
+ "tables.OpenVibe.Media": "34 tables",
+ "tables.OpenVibe.Media.target:OpenVibe.Media": "32 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",
"tables.OpenVibe.Media.target:?": "2 Media tables target ?",
"tables.OpenVibe.Media.target:?": "2 Media tables target ?",
- "tests.OpenVibe.Tools": "49 test files",
- "tables.OpenVibe.Tools": "6 tables",
- "tables.OpenVibe.Tools.target:OpenVibe.Tools": "13 Tools tables target OpenVibe.Tools",
- "tests.OpenVibe.Community": "48 test files",
- "tables.OpenVibe.Community": "33 tables",
- "tables.OpenVibe.Community.target:OpenVibe.Community": "35 Community tables target OpenVibe.Community",
+ "tests.OpenVibe.Tools": "61 test files",
+ "tables.OpenVibe.Tools": "7 tables",
+ "tables.OpenVibe.Tools.target:OpenVibe.Tools": "14 Tools tables target OpenVibe.Tools",
+ "tests.OpenVibe.Community": "61 test files",
+ "tables.OpenVibe.Community": "35 tables",
+ "tables.OpenVibe.Community.target:OpenVibe.Community": "37 Community tables target OpenVibe.Community",
"tables.OpenVibe.Community.target:?": "1 Community tables target ?",
"tables.OpenVibe.Community.target:?": "1 Community tables target ?",
- "tests.OpenVibe.Games": "76 test files",
- "tables.OpenVibe.Games": "12 tables",
- "tables.OpenVibe.Games.target:OpenVibe.Games": "13 Games tables target OpenVibe.Games",
+ "tests.OpenVibe.Games": "82 test files",
+ "tables.OpenVibe.Games": "13 tables",
+ "tables.OpenVibe.Games.target:OpenVibe.Games": "14 Games tables target OpenVibe.Games",
"tables.OpenVibe.Games.target:?": "1 Games tables target ?",
"tables.OpenVibe.Games.target:?": "1 Games tables target ?",
- "tests.OpenVibe.Sites": "1 test files",
+ "tests.OpenVibe.Sites": "2 test files",
"tables.OpenVibe.Sites": "0 tables",
"tables.OpenVibe.Sites": "0 tables",
- "tests.OpenVibe.Events": "14 test files",
- "tables.OpenVibe.Events": "7 tables",
- "tables.OpenVibe.Events.target:OpenVibe.Events": "7 Events tables target OpenVibe.Events",
- "tests.OpenVibe.Chat": "35 test files",
- "tables.OpenVibe.Chat": "41 tables",
- "tables.OpenVibe.Chat.target:OpenVibe.Chat": "41 Chat tables target OpenVibe.Chat",
- "tests.OpenRe.Stream": "19 test files",
+ "tests.OpenVibe.Events": "22 test files",
+ "tables.OpenVibe.Events": "8 tables",
+ "tables.OpenVibe.Events.target:OpenVibe.Events": "8 Events tables target OpenVibe.Events",
+ "tests.OpenVibe.Chat": "48 test files",
+ "tables.OpenVibe.Chat": "42 tables",
+ "tables.OpenVibe.Chat.target:OpenVibe.Chat": "42 Chat tables target OpenVibe.Chat",
+ "tests.OpenRe.Stream": "21 test files",
"tables.OpenRe.Stream": "13 tables",
"tables.OpenRe.Stream": "13 tables",
"tables.OpenRe.Stream.target:OpenRe.Stream": "14 OpenRe.Stream tables target OpenRe.Stream",
"tables.OpenRe.Stream.target:OpenRe.Stream": "14 OpenRe.Stream tables target OpenRe.Stream",
- "tests.OpenVibe.Billing": "21 test files",
+ "tests.OpenVibe.Billing": "22 test files",
"tables.OpenVibe.Billing": "19 tables",
"tables.OpenVibe.Billing": "19 tables",
"tables.OpenVibe.Billing.target:OpenVibe.Billing": "19 Billing tables target OpenVibe.Billing",
"tables.OpenVibe.Billing.target:OpenVibe.Billing": "19 Billing tables target OpenVibe.Billing",
- "tests.OpenVibe.Tips": "16 test files",
+ "tests.OpenVibe.Tips": "17 test files",
"tables.OpenVibe.Tips": "17 tables",
"tables.OpenVibe.Tips": "17 tables",
"tables.OpenVibe.Tips.target:OpenVibe.Tips": "19 Tips tables target OpenVibe.Tips",
"tables.OpenVibe.Tips.target:OpenVibe.Tips": "19 Tips tables target OpenVibe.Tips",
- "tests.OpenVibe.VIP": "13 test files",
+ "tests.OpenVibe.VIP": "14 test files",
"tables.OpenVibe.VIP": "13 tables",
"tables.OpenVibe.VIP": "13 tables",
"tables.OpenVibe.VIP.target:OpenVibe.VIP": "15 VIP tables target OpenVibe.VIP",
"tables.OpenVibe.VIP.target:OpenVibe.VIP": "15 VIP tables target OpenVibe.VIP",
- "tests.OpenVibe.AI": "20 test files",
- "tables.OpenVibe.AI": "18 tables",
- "tables.OpenVibe.AI.target:OpenVibe.AI": "19 AI tables target OpenVibe.AI",
- "tests.OpenVibe.Search": "13 test files",
+ "tests.OpenVibe.AI": "26 test files",
+ "tables.OpenVibe.AI": "19 tables",
+ "tables.OpenVibe.AI.target:OpenVibe.AI": "20 AI tables target OpenVibe.AI",
+ "tests.OpenVibe.Search": "14 test files",
"tables.OpenVibe.Search": "11 tables",
"tables.OpenVibe.Search": "11 tables",
"tables.OpenVibe.Search.target:OpenVibe.Search": "21 Search tables target OpenVibe.Search",
"tables.OpenVibe.Search.target:OpenVibe.Search": "21 Search tables target OpenVibe.Search",
- "tests.OpenVibe.Sources": "10 test files",
+ "tests.OpenVibe.Sources": "13 test files",
"tables.OpenVibe.Sources": "8 tables",
"tables.OpenVibe.Sources": "8 tables",
"tables.OpenVibe.Sources.target:OpenVibe.Sources": "8 Sources tables target OpenVibe.Sources",
"tables.OpenVibe.Sources.target:OpenVibe.Sources": "8 Sources tables target OpenVibe.Sources",
- "tests.OpenVibe.Wiki": "28 test files",
+ "tests.OpenVibe.Wiki": "35 test files",
"tables.OpenVibe.Wiki": "10 tables",
"tables.OpenVibe.Wiki": "10 tables",
"tables.OpenVibe.Wiki.target:OpenVibe.Wiki": "22 Wiki tables target OpenVibe.Wiki",
"tables.OpenVibe.Wiki.target:OpenVibe.Wiki": "22 Wiki tables target OpenVibe.Wiki",
- "tests.OpenVibe.Blog": "23 test files",
+ "tests.OpenVibe.Blog": "29 test files",
"tables.OpenVibe.Blog": "10 tables",
"tables.OpenVibe.Blog": "10 tables",
"tables.OpenVibe.Blog.target:OpenVibe.Blog": "24 Blog tables target OpenVibe.Blog",
"tables.OpenVibe.Blog.target:OpenVibe.Blog": "24 Blog tables target OpenVibe.Blog",
- "tests.OpenVibe.News": "18 test files",
+ "tests.OpenVibe.News": "19 test files",
"tables.OpenVibe.News": "13 tables",
"tables.OpenVibe.News": "13 tables",
"tables.OpenVibe.News.target:OpenVibe.News": "23 News tables target OpenVibe.News",
"tables.OpenVibe.News.target:OpenVibe.News": "23 News tables target OpenVibe.News",
- "tests.OpenVibe.Reviews": "16 test files",
+ "tests.OpenVibe.Reviews": "17 test files",
"tables.OpenVibe.Reviews": "14 tables",
"tables.OpenVibe.Reviews": "14 tables",
"tables.OpenVibe.Reviews.target:OpenVibe.Reviews": "23 Reviews tables target OpenVibe.Reviews",
"tables.OpenVibe.Reviews.target:OpenVibe.Reviews": "23 Reviews tables target OpenVibe.Reviews",
- "tests.OpenVibe.Deals": "16 test files",
+ "tests.OpenVibe.Deals": "17 test files",
"tables.OpenVibe.Deals": "15 tables",
"tables.OpenVibe.Deals": "15 tables",
"tables.OpenVibe.Deals.target:OpenVibe.Deals": "19 Deals tables target OpenVibe.Deals",
"tables.OpenVibe.Deals.target:OpenVibe.Deals": "19 Deals tables target OpenVibe.Deals",
- "tests.OpenVibe.Coupons": "15 test files",
+ "tests.OpenVibe.Coupons": "16 test files",
"tables.OpenVibe.Coupons": "12 tables",
"tables.OpenVibe.Coupons": "12 tables",
"tables.OpenVibe.Coupons.target:OpenVibe.Coupons": "14 Coupons tables target OpenVibe.Coupons",
"tables.OpenVibe.Coupons.target:OpenVibe.Coupons": "14 Coupons tables target OpenVibe.Coupons",
- "tests.OpenVibe.Trade": "15 test files",
+ "tests.OpenVibe.Trade": "16 test files",
"tables.OpenVibe.Trade": "10 tables",
"tables.OpenVibe.Trade": "10 tables",
"tables.OpenVibe.Trade.target:OpenVibe.Trade": "17 Trade tables target OpenVibe.Trade",
"tables.OpenVibe.Trade.target:OpenVibe.Trade": "17 Trade tables target OpenVibe.Trade",
- "tests.OpenVibe.Codes": "27 test files",
+ "tests.OpenVibe.Codes": "34 test files",
"tables.OpenVibe.Codes": "7 tables",
"tables.OpenVibe.Codes": "7 tables",
"tables.OpenVibe.Codes.target:OpenVibe.Codes": "8 Codes tables target OpenVibe.Codes",
"tables.OpenVibe.Codes.target:OpenVibe.Codes": "8 Codes tables target OpenVibe.Codes",
- "tests.OpenVibe.Host": "38 test files",
+ "tests.OpenVibe.Host": "48 test files",
"tables.OpenVibe.Host": "11 tables",
"tables.OpenVibe.Host": "11 tables",
"tables.OpenVibe.Host.target:OpenVibe.Host": "12 Host tables target OpenVibe.Host",
"tables.OpenVibe.Host.target:OpenVibe.Host": "12 Host tables target OpenVibe.Host",
"tests.OpenVibe.Examples": "16 test files",
"tests.OpenVibe.Examples": "16 test files",
@@ -61413,7 +64249,7 @@
@@ -61413,7 +64249,7 @@
"metrics": [
"metrics": [
{
{
"key": "outbound.call-sites",
"key": "outbound.call-sites",
- "value": "107 caller-file/target pairs across 76 files"
+ "value": "112 caller-file/target pairs across 82 files"
},
},
{
{
"key": "ws.servers",
"key": "ws.servers",
@@ -61469,7 +64305,7 @@
@@ -61469,7 +64305,7 @@
},
},
{
{
"key": "tests.OpenRe.Stream",
"key": "tests.OpenRe.Stream",
- "value": "19 test files"
+ "value": "21 test files"
}
}
],
],
"members": [
"members": [
@@ -61499,7 +64335,7 @@
@@ -61499,7 +64335,7 @@
},
},
{
{
"key": "tests.OpenVibe.Chat",
"key": "tests.OpenVibe.Chat",
- "value": "35 test files"
+ "value": "48 test files"
}
}
],
],
"members": [
"members": [
@@ -61523,7 +64359,7 @@
@@ -61523,7 +64359,7 @@
"metrics": [
"metrics": [
{
{
"key": "tables.OpenVibe.Community",
"key": "tables.OpenVibe.Community",
- "value": "33 tables"
+ "value": "35 tables"
},
},
{
{
"key": "tables.OpenVibe.Live.target:OpenVibe.Community",
"key": "tables.OpenVibe.Live.target:OpenVibe.Community",
@@ -61557,7 +64393,7 @@
@@ -61557,7 +64393,7 @@
},
},
{
{
"key": "tests.OpenVibe.Billing",
"key": "tests.OpenVibe.Billing",
- "value": "21 test files"
+ "value": "22 test files"
}
}
],
],
"members": [
"members": [
@@ -61581,7 +64417,7 @@
@@ -61581,7 +64417,7 @@
"metrics": [
"metrics": [
{
{
"key": "tests.OpenVibe.Tools",
"key": "tests.OpenVibe.Tools",
- "value": "49 test files"
+ "value": "61 test files"
}
}
],
],
"members": [
"members": [
@@ -61601,7 +64437,7 @@
@@ -61601,7 +64437,7 @@
"metrics": [
"metrics": [
{
{
"key": "tests.OpenVibe.Games",
"key": "tests.OpenVibe.Games",
- "value": "76 test files"
+ "value": "82 test files"
}
}
],
],
"members": [
"members": [
@@ -61621,11 +64457,11 @@
@@ -61621,11 +64457,11 @@
"metrics": [
"metrics": [
{
{
"key": "tests.OpenVibe.Codes",
"key": "tests.OpenVibe.Codes",
- "value": "27 test files"
+ "value": "34 test files"
},
},
{
{
"key": "tests.OpenVibe.Host",
"key": "tests.OpenVibe.Host",
- "value": "38 test files"
+ "value": "48 test files"
}
}
],
],
"members": [
"members": [
@@ -61651,7 +64487,7 @@
@@ -61651,7 +64487,7 @@
},
},
{
{
"key": "tests.OpenVibe.AI",
"key": "tests.OpenVibe.AI",
- "value": "20 test files"
+ "value": "26 test files"
}
}
],
],
"members": [
"members": [
@@ -61692,7 +64528,7 @@
@@ -61692,7 +64528,7 @@
"metrics": [
"metrics": [
{
{
"key": "outbound.internal-key",
"key": "outbound.internal-key",
- "value": "40 of 107 call sites authenticate with the shared internal key"
+ "value": "40 of 112 call sites authenticate with the shared internal key"
}
}
],
],
"members": [
"members": [
@@ -61727,11 +64563,11 @@
@@ -61727,11 +64563,11 @@
"metrics": [
"metrics": [
{
{
"key": "shared.pins",
"key": "shared.pins",
- "value": "24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0"
+ "value": "25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0"
},
},
{
{
"key": "shared.drift",
"key": "shared.drift",
- "value": "0 manifests unpinned or behind: none"
+ "value": "31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0)"
}
}
],
],
"members": [
"members": [
@@ -61781,7 +64617,7 @@
@@ -61781,7 +64617,7 @@
"metrics": [
"metrics": [
{
{
"key": "deploy.drift",
"key": "deploy.drift",
- "value": "1 service(s) not running origin/main"
+ "value": "25 service(s) not running origin/main"
}
}
],
],
"members": [
"members": [
@@ -61914,7 +64750,7 @@
@@ -61914,7 +64750,7 @@
"status": "open",
"status": "open",
"check": "workstation-disk",
"check": "workstation-disk",
"ownerReview": false,
"ownerReview": false,
- "checkResult": "workstation / is 97% used (at generation time)"
+ "checkResult": "workstation / is 73% used (at generation time)"
},
},
{
{
"id": "H8",
"id": "H8",
@@ -61970,7 +64806,7 @@
@@ -61970,7 +64806,7 @@
"check": "db-size",
"check": "db-size",
"evidence": "2026-09-23: Live analytics.db 1.7 GB -> about 500 MB and network.db 731 -> 276 MB after the prune and VACUUM. The pre-ADR-021 backups that still hold IPs are hazard H17.",
"evidence": "2026-09-23: Live analytics.db 1.7 GB -> about 500 MB and network.db 731 -> 276 MB after the prune and VACUUM. The pre-ADR-021 backups that still hold IPs are hazard H17.",
"ownerReview": false,
"ownerReview": false,
- "checkResult": "largest analytics stores: live/shared/data/analytics.db 518.0 MB; network/data/network.db 290.3 MB; tools/apps/audio/data/analytics.db 36.6 MB; tools/apps/text/data/analytics.db 5.8 MB"
+ "checkResult": "largest analytics stores: live/shared/data/analytics.db 525.4 MB; network/data/network.db 302.4 MB; tools/apps/audio/data/analytics.db 36.7 MB; tools/apps/text/data/analytics.db 5.9 MB"
},
},
{
{
"id": "H12",
"id": "H12",
@@ -61999,7 +64835,7 @@
@@ -61999,7 +64835,7 @@
"status": "open",
"status": "open",
"check": "deploy-drift",
"check": "deploy-drift",
"ownerReview": false,
"ownerReview": false,
- "checkResult": "live: deployed 9f7f36c is 61 commit(s) behind origin/main 8caa540"
+ "checkResult": "ai: deployed 549bed0 is 1 commit(s) behind origin/main 6c8b833; billing: deployed 80f97aa is 1 commit(s) behind origin/main f24684b; blog: deployed 21d537c is 1 commit(s) behind origin/main 8a7f8eb; chat: deployed 3aab730 is 1 commit(s) behind origin/main d87c8d3; codes: deployed d78de70 is 1 commit(s) behind origin/main 7d6f65a; community: deployed 52d923a is 1 commit(s) behind origin/main 2da3501; coupons: deployed 64835d2 is 1 commit(s) behind origin/main b91cd79; deals: deployed fa0582d is 1 commit(s) behind origin/main 533450f; events: deployed f55f7eb is 1 commit(s) behind origin/main 19919ec; games: deployed 51d8688 is 1 commit(s) behind origin/main eb2d008; host: deployed 2b63389 is 2 commit(s) behind origin/main 6d2aaaa; live: deployed 9f7f36c is 120 commit(s) behind origin/main 03f49b7; media: deployed 6248363 is 1 commit(s) behind origin/main 14cac06; network: deployed ddd87b6 is 1 commit(s) behind origin/main 5a50c12; news: deployed 8ab47a6 is 1 commit(s) behind origin/main 97dae43; openre: deployed cf423e3 is 1 commit(s) behind origin/main c77ec2a; reviews: deployed 1cff36b is 1 commit(s) behind origin/main c87b344; search: deployed 8ed7667 is 1 commit(s) behind origin/main e8511d8; sites: deployed 32464ec is 1 commit(s) behind origin/main 304e8b1; sources: deployed 351383e is 1 commit(s) behind origin/main 1670853; tips: deployed 1e6bfbb is 1 commit(s) behind origin/main 13986b5; tools: deployed e55469f is 1 commit(s) behind origin/main 4f4ed6e; trade: deployed 4658447 is 1 commit(s) behind origin/main 273bce7; vip: deployed 0fbcbb5 is 1 commit(s) behind origin/main 95b3e19; wiki: deployed 32a26ef is 1 commit(s) behind origin/main 3302540"
},
},
{
{
"id": "H14",
"id": "H14",
@@ -62013,7 +64849,7 @@
@@ -62013,7 +64849,7 @@
"status": "open",
"status": "open",
"check": "dead-dbs",
"check": "dead-dbs",
"ownerReview": "Approve deleting the zero-table files and moving or deleting the import snapshots and backups listed by the check.",
"ownerReview": "Approve deleting the zero-table files and moving or deleting the import snapshots and backups listed by the check.",
- "checkResult": "blog/data/blog.db, community/data/community.db, games/data/legacy-import/world-before-20260923T184930Z.db, live/shared/data/analytics.db, live/shared/data/backups/analytics-pre-adr021-2026-09-23.db, live/shared/data/backups/live-20260926-072748.db, live/shared/data/backups/live-20260926-095352.db, live/shared/data/backups/live-pre-643a2e6.db, live/shared/data/hobo.db, live/shared/data/live-before-rs-slots-20260924T0153Z.db, live/shared/data/live.db, live/shared/data/openvibe.db, live/shared/data/rs-companion.db, media/data/backups/owner-subject-20260923.media.db, media/data/reports/h15-repair-applied-20260925.media.db, network/data/network-pre-refresh-hash-2026-09-24.db, network/data/network-pre-secrets-2026-09-24.db, tips/data/tips.db, tools/apps/audio/data/guard.db, tools/apps/docs/data/guard.db, tools/apps/food/data/guard.db, tools/apps/gateway/data/guard.db, tools/apps/gateway/data/token-revocations.db, tools/apps/img/data/guard.db, tools/apps/maps/data/guard.db, tools/apps/text/data/guard.db, tools/apps/yt/data/guard.db, tools/backups/analytics-2026-09-23/audio.analytics.db, tools/backups/analytics-2026-09-23/docs.analytics.db, tools/backups/analytics-2026-09-23/food.analytics.db, tools/backups/analytics-2026-09-23/img.analytics.db, tools/backups/analytics-2026-09-23/maps.analytics.db, tools/backups/analytics-2026-09-23/text.analytics.db, tools/backups/analytics-2026-09-23/yt.analytics.db, billing/live-snapshot-202609230121.db, chat/live-snap-a.db, chat/live-snap-b.db, chat/live-snapshot-0159.db, chat/rehearsal.db, community/community.pre-c24-20260925T185117Z.db, community/community.pre-c24b-20260925T185400Z.db, community/community.pre-c24c-20260925T185425Z.db, community/community.pre-live-comments-20260923T191345Z.db"
+ "checkResult": "blog/data/blog.db, community/data/community.db, games/data/legacy-import/world-before-20260923T184930Z.db, live/shared/data/analytics.db, live/shared/data/backups/analytics-pre-adr021-2026-09-23.db, live/shared/data/backups/live-20260926-072748.db, live/shared/data/backups/live-20260926-095352.db, live/shared/data/backups/live-pre-643a2e6.db, live/shared/data/backups/live-pre-identity-contract-20260928-001702Z.db, live/shared/data/hobo.db, live/shared/data/live-before-rs-slots-20260924T0153Z.db, live/shared/data/live.db, live/shared/data/openvibe.db, live/shared/data/rs-companion.db, media/data/backups/owner-subject-20260923.media.db, media/data/reports/h15-repair-applied-20260925.media.db, network/data/backups/network-pre-creator-analytics-20260926.db, network/data/backups/network-pre-follows-20260926.db, network/data/network-pre-refresh-hash-2026-09-24.db, network/data/network-pre-secrets-2026-09-24.db, tips/data/tips.db, tools/apps/audio/data/guard.db, tools/apps/docs/data/guard.db, tools/apps/food/data/guard.db, tools/apps/gateway/data/guard.db, tools/apps/gateway/data/token-revocations.db, tools/apps/img/data/guard.db, tools/apps/maps/data/guard.db, tools/apps/text/data/guard.db, tools/apps/yt/data/guard.db, tools/backups/analytics-2026-09-23/audio.analytics.db, tools/backups/analytics-2026-09-23/docs.analytics.db, tools/backups/analytics-2026-09-23/food.analytics.db, tools/backups/analytics-2026-09-23/img.analytics.db, tools/backups/analytics-2026-09-23/maps.analytics.db, tools/backups/analytics-2026-09-23/text.analytics.db, tools/backups/analytics-2026-09-23/yt.analytics.db, billing/live-snapshot-202609230121.db, chat/live-snap-a.db, chat/live-snap-b.db, chat/live-snapshot-0159.db, chat/rehearsal.db, community/community.pre-c24-20260925T185117Z.db, community/community.pre-c24b-20260925T185400Z.db, community/community.pre-c24c-20260925T185425Z.db, community/community.pre-live-comments-20260923T191345Z.db"
},
},
{
{
"id": "H15",
"id": "H15",
@@ -62078,25 +64914,25 @@
@@ -62078,25 +64914,25 @@
"id": "EC1",
"id": "EC1",
"text": "Every table has an owner classification",
"text": "Every table has an owner classification",
"pass": true,
"pass": true,
- "detail": "604 tables classified, 0 unclassified"
+ "detail": "639 tables classified, 0 unclassified"
},
},
{
{
"id": "EC2",
"id": "EC2",
"text": "Every route is attributed to a repo and source line, with an owner classification",
"text": "Every route is attributed to a repo and source line, with an owner classification",
"pass": true,
"pass": true,
- "detail": "2381 routes, 0 unclassified; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"
+ "detail": "2453 routes, 0 unclassified; 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 and an owner classification",
"text": "Every background job is listed with its location and an owner classification",
"pass": true,
"pass": true,
- "detail": "175 timers/jobs, 0 unclassified"
+ "detail": "179 timers/jobs, 0 unclassified"
},
},
{
{
"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": "107 call sites; 39 with no timeout detected"
+ "detail": "112 call sites; 39 with no timeout detected"
},
},
{
{
"id": "EC5",
"id": "EC5",
@@ -2,37 +2,37 @@
@@ -2,37 +2,37 @@
"_about": "Generated from data/requirement-ledger.json by scripts/roadmap-baseline/generate.js. Umbrella-level ledger (roadmap §22.4/§25): one row per D01-D46 requirement, every artifact re-verified against the scanned origin/main checkouts and prod-snapshot.json. Do not edit; edit the data file and regenerate.",
"_about": "Generated from data/requirement-ledger.json by scripts/roadmap-baseline/generate.js. Umbrella-level ledger (roadmap §22.4/§25): one row per D01-D46 requirement, every artifact re-verified against the scanned origin/main checkouts and prod-snapshot.json. Do not edit; edit the data file and regenerate.",
"asOf": "2026-09-23T20:30Z",
"asOf": "2026-09-23T20:30Z",
"generatedFrom": {
"generatedFrom": {
- "OpenVibe.Live": "8caa540466f9af86247febdbba1339b68919a42f",
- "OpenVibe.Network": "a7b99c7f8791a9ebe42b550d17e89b4599b26715",
- "OpenVibe.Shared": "dbf9d39750e9f0dd0f19d8571d278eb303f3b83f",
- "OpenVibe.Media": "b7fbe65029f38fd3ec6b10919eab9b8ba13df9d4",
- "OpenVibe.Tools": "168e5110d062f076c2c4afe88e3fc3c53ab44613",
- "OpenVibe.Community": "19441aa2511a7648f1dd3c1d9f70fe74e41cb530",
- "OpenVibe.Games": "b207e78909f7d2927bbb2ebc802389b4dd4f2647",
- "OpenVibe.Sites": "3802ee3d9ada9b8490134ece350420e627866a8c",
- "OpenVibe.Events": "eb98f8cad2a738fec45f1c10e373081532c83e91",
- "OpenVibe.Chat": "739d3a1cdc22fbb0717e4df4abd6b7e4ad31a8f1",
- "OpenRe.Stream": "b34dcd688867f0c6ae6c16f03b206e1bd3cd7304",
- "OpenVibe.Billing": "180e246a3a344c062f1c7435303f4aa748f17046",
- "OpenVibe.Tips": "1d558c51e25b5c9a8f9a3e3312905103eb1fa879",
- "OpenVibe.VIP": "4ddf723e72b141d05e55dfcbfd3126e20da3f47d",
- "OpenVibe.AI": "c3ee6056b96d74a99b25ebebf671e86c9d9d4b24",
- "OpenVibe.Search": "b00aa4c20c0f6e8d9a3a1c85f543ee2d384da050",
- "OpenVibe.Sources": "29cd386241c44456ffcebf70b6be287fa9a08aaa",
- "OpenVibe.Wiki": "38a17bddaba5748ed44622f204cb3a2716c7fd6a",
- "OpenVibe.Blog": "79e9e153ca1308311993a31295fd471a8becaf8d",
- "OpenVibe.News": "0860cf20dd3d8e8032caad300e0ce90497195b96",
- "OpenVibe.Reviews": "cfc37ac5b72ecc7a4e913881d3c916a1f3823fa8",
- "OpenVibe.Deals": "99bd438b40abd42502e3b2c4c57a62eaabd091a9",
- "OpenVibe.Coupons": "348f585cd6549a5c506171fba0fc2c5462dede32",
- "OpenVibe.Trade": "fa382881cd92ee90b6329699d7d79129e32a6325",
- "OpenVibe.Codes": "0bfdf708ffae5d1ad02f8572ccbc9505b06ade82",
- "OpenVibe.Host": "75147890e32dd63fd1363f843c87415f90d5b2dd",
- "OpenVibe.Examples": "36901ffc052752754608df8764a9f2942069da9a"
+ "OpenVibe.Live": "03f49b7716b7cee1cce8a44e7155aeb96a67d004",
+ "OpenVibe.Network": "5a50c12a83f6501aacd663f15d3c06c718a4c83a",
+ "OpenVibe.Shared": "b5a9bd77171fcf75f42ff33fe86b7ad06baac1c8",
+ "OpenVibe.Media": "14cac06886649848c332cfa564aa6b3594ea09bc",
+ "OpenVibe.Tools": "4f4ed6e8f3f3c8e1a83dd644dd3c0659a7bccce4",
+ "OpenVibe.Community": "2da3501e28457fa4978c0bc4a1b3bfc9188b77b9",
+ "OpenVibe.Games": "eb2d00880d3231b2c68cb1753b4542044edef1e5",
+ "OpenVibe.Sites": "304e8b12b535f4b562f23027ae84f1a5d515cc6c",
+ "OpenVibe.Events": "19919ece79707eed051c3f18ab37b7fdb6d939a6",
+ "OpenVibe.Chat": "d87c8d3c906ad52ef8bf123ce60373fdefcf09e6",
+ "OpenRe.Stream": "c77ec2a9a1e350fb4ae1c646ec74693fae4f2fa3",
+ "OpenVibe.Billing": "f24684bb84ec1670bd08670891e6742fa433a548",
+ "OpenVibe.Tips": "13986b59e697d12a328a4f12e993295445ca40be",
+ "OpenVibe.VIP": "95b3e196daa152c2e7f8e940a1f02b7fe32706ba",
+ "OpenVibe.AI": "6c8b8338be936cbd3a6f50dee3f790807f145a0e",
+ "OpenVibe.Search": "e8511d849720534a9ffcd54b052663111e5b1e6f",
+ "OpenVibe.Sources": "167085388a637eed3f0d47b3c6eabb8c9d00814d",
+ "OpenVibe.Wiki": "3302540e8b5fdf3c07db9fce688be2f4ab8b847b",
+ "OpenVibe.Blog": "8a7f8ebe862b0e1c0bb119ee96c42f38fc0e5321",
+ "OpenVibe.News": "97dae43a2d41c5528bbb4c93ff2ea7ea456203dd",
+ "OpenVibe.Reviews": "c87b34440b0d50bc2cdf6c136775002ed9080c1e",
+ "OpenVibe.Deals": "533450f9cc4a358ba50f353f06826ec3611b4ddc",
+ "OpenVibe.Coupons": "b91cd795e8ee4a3e49317a6e3cb000fa92da9325",
+ "OpenVibe.Trade": "273bce7b1b8771037bc2a660fa8784dc1aa049a7",
+ "OpenVibe.Codes": "7d6f65ac198d95f70ac840c24d03d1407affb7a9",
+ "OpenVibe.Host": "6d2aaaa630e29d2bfd261a7f75cbbbaa2b8c1d46",
+ "OpenVibe.Examples": "92eb7c3b0f50fea9f76086ed3eeda3664de93494"
},
},
"prodSnapshot": {
"prodSnapshot": {
"host": "openvibe-oregon",
"host": "openvibe-oregon",
- "collectedAt": "2026-09-26T13:29:03.103Z"
+ "collectedAt": "2026-09-28T03:25:35.860Z"
},
},
"statuses": {
"statuses": {
"met": "the §15.0 required target is demonstrated by current evidence: a test that exercises it, and production evidence where the target is a production authority or state.",
"met": "the §15.0 required target is demonstrated by current evidence: a test that exercises it, and production evidence where the target is a production authority or state.",
@@ -149,7 +149,7 @@
@@ -149,7 +149,7 @@
"metrics": [
"metrics": [
{
{
"key": "outbound.call-sites",
"key": "outbound.call-sites",
- "value": "107 caller-file/target pairs across 76 files"
+ "value": "112 caller-file/target pairs across 82 files"
},
},
{
{
"key": "ws.servers",
"key": "ws.servers",
@@ -196,7 +196,7 @@
@@ -196,7 +196,7 @@
},
},
{
{
"key": "tests.OpenRe.Stream",
"key": "tests.OpenRe.Stream",
- "value": "19 test files"
+ "value": "21 test files"
}
}
]
]
},
},
@@ -219,7 +219,7 @@
@@ -219,7 +219,7 @@
},
},
{
{
"key": "tests.OpenVibe.Chat",
"key": "tests.OpenVibe.Chat",
- "value": "35 test files"
+ "value": "48 test files"
}
}
]
]
},
},
@@ -239,7 +239,7 @@
@@ -239,7 +239,7 @@
"metrics": [
"metrics": [
{
{
"key": "tables.OpenVibe.Community",
"key": "tables.OpenVibe.Community",
- "value": "33 tables"
+ "value": "35 tables"
},
},
{
{
"key": "tables.OpenVibe.Live.target:OpenVibe.Community",
"key": "tables.OpenVibe.Live.target:OpenVibe.Community",
@@ -266,7 +266,7 @@
@@ -266,7 +266,7 @@
},
},
{
{
"key": "tests.OpenVibe.Billing",
"key": "tests.OpenVibe.Billing",
- "value": "21 test files"
+ "value": "22 test files"
}
}
]
]
},
},
@@ -283,7 +283,7 @@
@@ -283,7 +283,7 @@
"metrics": [
"metrics": [
{
{
"key": "tests.OpenVibe.Tools",
"key": "tests.OpenVibe.Tools",
- "value": "49 test files"
+ "value": "61 test files"
}
}
]
]
},
},
@@ -300,7 +300,7 @@
@@ -300,7 +300,7 @@
"metrics": [
"metrics": [
{
{
"key": "tests.OpenVibe.Games",
"key": "tests.OpenVibe.Games",
- "value": "76 test files"
+ "value": "82 test files"
}
}
]
]
},
},
@@ -318,11 +318,11 @@
@@ -318,11 +318,11 @@
"metrics": [
"metrics": [
{
{
"key": "tests.OpenVibe.Codes",
"key": "tests.OpenVibe.Codes",
- "value": "27 test files"
+ "value": "34 test files"
},
},
{
{
"key": "tests.OpenVibe.Host",
"key": "tests.OpenVibe.Host",
- "value": "38 test files"
+ "value": "48 test files"
}
}
]
]
},
},
@@ -346,7 +346,7 @@
@@ -346,7 +346,7 @@
},
},
{
{
"key": "tests.OpenVibe.AI",
"key": "tests.OpenVibe.AI",
- "value": "20 test files"
+ "value": "26 test files"
}
}
]
]
},
},
@@ -375,7 +375,7 @@
@@ -375,7 +375,7 @@
"metrics": [
"metrics": [
{
{
"key": "outbound.internal-key",
"key": "outbound.internal-key",
- "value": "40 of 107 call sites authenticate with the shared internal key"
+ "value": "40 of 112 call sites authenticate with the shared internal key"
}
}
]
]
},
},
@@ -404,11 +404,11 @@
@@ -404,11 +404,11 @@
"metrics": [
"metrics": [
{
{
"key": "shared.pins",
"key": "shared.pins",
- "value": "24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0"
+ "value": "25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0"
},
},
{
{
"key": "shared.drift",
"key": "shared.drift",
- "value": "0 manifests unpinned or behind: none"
+ "value": "31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0)"
}
}
]
]
},
},
@@ -449,7 +449,7 @@
@@ -449,7 +449,7 @@
"metrics": [
"metrics": [
{
{
"key": "deploy.drift",
"key": "deploy.drift",
- "value": "1 service(s) not running origin/main"
+ "value": "25 service(s) not running origin/main"
}
}
]
]
},
},
@@ -2678,10 +2678,10 @@
@@ -2678,10 +2678,10 @@
{
{
"id": "D39",
"id": "D39",
"title": "Mods",
"title": "Mods",
- "owner": "OpenVibe.Games (registry, grants and runtime today); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Network (planned mod grants); OpenVibe.Host (Stage C sandbox)",
+ "owner": "OpenVibe.Games (registry, runtime, the hot path's copy of grants); OpenVibe.Network (mod principals and grants, mods.grant.manage); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Host (Stage C sandbox)",
"target": "mod manifests, capabilities, quotas, runtime adapters",
"target": "mod manifests, capabilities, quotas, runtime adapters",
"status": "partial",
"status": "partial",
- "summary": "The mod manifest (Contracts mods/mod-manifest.v1, ADR-013 accepted 2026-09-23) and a Games-local registry are tested: grants are the approved subset, installs and grants are audited, and revoking a mod removes its effect on the next tick and across a restart. Only declarative games-content packs run. Executable runtimes are refused, and the CPU budget is metered and audited but not enforced. Network's mods.grant.manage capability is still `planned`, and on 2026-09-23 at 20:22 UTC production world.db held 0 mods, 0 grants and 0 audit rows.",
+ "summary": "The mod manifest (Contracts mods/mod-manifest.v1, ADR-013) and the Games registry are tested. Since 2026-09-27 every install is a Network principal mod:<id> whose grants Network holds (mods.grant.manage active; Games asks Network first, and network.mod.grants_changed keeps its copy current). The budget is enforced: 5 reconciles over cpuMs, or 3 minutes over 60 effects a minute, disable only the offending mod. Security tests cover namespace escape, event flood, resource budget and forged ownership. One production install -> grant -> use -> revoke run is recorded. Only declarative games-content packs run; executable runtimes wait for Host Stage C.",
"artifacts": [
"artifacts": [
{
{
"kind": "test",
"kind": "test",
@@ -2711,25 +2711,45 @@
@@ -2711,25 +2711,45 @@
"kind": "doc",
"kind": "doc",
"repo": "OpenVibe.Contracts",
"repo": "OpenVibe.Contracts",
"path": "manifests/capabilities/mods.grant.manage.json",
"path": "manifests/capabilities/mods.grant.manage.json",
- "contains": "Until Network implements it, each runtime keeps the approved subset itself",
- "proves": "Network-side mod principals and grants are not implemented: the status is planned and implementedBy is empty.",
+ "contains": "\"status\": \"active\"",
+ "proves": "Network implements mod principals and grants: the capability is active.",
+ "ok": true
+ },
+ {
+ "kind": "test",
+ "repo": "OpenVibe.Network",
+ "path": "test/mod-principals.test.js",
+ "contains": "another runtime can neither register nor change it",
+ "proves": "An install registers mod:<id> with the approved subset of what its manifest requests; the registering runtime owns it; staff changes carry a reason and an audit row; every change is announced with the complete approved set.",
+ "ok": true
+ },
+ {
+ "kind": "test",
+ "repo": "OpenVibe.Games",
+ "path": "apps/server/src/mods/security.test.ts",
+ "contains": "forged ownership",
+ "proves": "Namespace escape, event flood, resource budget and forged ownership: a flooding or over-budget mod is disabled while the others run; props are always the mod's.",
+ "ok": true
+ },
+ {
+ "kind": "test",
+ "repo": "OpenVibe.Games",
+ "path": "apps/server/src/mods/networkGrants.test.ts",
+ "contains": "installs with what Network approved",
+ "proves": "The mods API asks Network first and applies only its answer; an older grants_changed revision changes nothing.",
"ok": true
"ok": true
},
},
{
{
"kind": "prod",
"kind": "prod",
- "check": "ssh openvibe-ovh 'db=/opt/openvibe.games/data/world.db; sudo -n -u \"$(stat -c %U $db)\" sqlite3 -readonly $db \"SELECT count(*) FROM mods\"' (also mod_grants, mod_audit); curl -s http://127.0.0.1:8000/api/v1/mods",
- "observed": "mods 0, mod_grants 0, mod_audit 0; /api/v1/mods -> {\"mods\":[]}",
- "at": "2026-09-23T20:22Z",
- "proves": "No mod has ever been installed, granted, used or revoked in production.",
+ "check": "ssh openvibe-ovh: sudo sh -c '. /etc/openvibe/probe.env; cd /opt/openvibe.games && node --import tsx apps/server/scripts/modLifecycleProof.ts'",
+ "observed": "install 201 -> grant 200 -> use (prop placed) -> revoke 200 -> retract; the Network principal ended revoked with three network.mod.grants_changed events",
+ "at": "2026-09-27T23:45Z",
+ "proves": "One production install -> grant -> use -> revoke run with audit rows.",
"ok": true
"ok": true
}
}
],
],
"remaining": [
"remaining": [
- "Network-side mod principals and grants (capability mods.grant.manage, still planned with implementedBy []): an install should create a mod:<id> principal whose grants Network checks, as ADR-013 decides",
- "Quotas: the manifest's resource budget is only metered and audited in Games (runtime.ts budget_exceeded, with no test). Still to do: enforce it, prove that a budget breach terminates only the offending mod, and add an event-flood throttle, each with tests (roadmap §20 Mods)",
- "Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C",
- "The §20 Mods acceptance tests still missing: namespace escape denied, and no forged Billing or Media ownership",
- "One production install -> grant -> use -> revoke run with audit rows (production has 0 mods)"
+ "Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C"
],
],
"blockedOn": null,
"blockedOn": null,
"ownerReview": false,
"ownerReview": false,
@@ -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.
-Roadmap §22.4 and §25: every D01-D46 requirement linked to the acceptance artifact that proves it. As of 2026-09-23T20:30Z; repositories scanned at origin/main (README), production snapshot 2026-09-26 13:29 UTC.
+Roadmap §22.4 and §25: every D01-D46 requirement linked to the acceptance artifact that proves it. As of 2026-09-23T20:30Z; repositories scanned at origin/main (README), production snapshot 2026-09-28 03:25 UTC.
This is the umbrella layer. §25.2 also asks for an atomic, source-level ledger (`docs/implementation/requirements-ledger.yaml`, one entry per field, route family, event, capability, journey and failure state); that ledger does not exist yet, and no row here may be read as closing the requirements beneath it.
This is the umbrella layer. §25.2 also asks for an atomic, source-level ledger (`docs/implementation/requirements-ledger.yaml`, one entry per field, route family, event, capability, journey and failure state); that ledger does not exist yet, and no row here may be read as closing the requirements beneath it.
@@ -70,7 +70,7 @@ Every run re-verifies each artifact: a test, doc or drill file must exist at ori
@@ -70,7 +70,7 @@ Every run re-verifies each artifact: a test, doc or drill file must exist at ori
| [D36](#d36) | Sources | **blocked on owner** | OpenVibe.Sources (loopback :4720, deployed 2e986af) | 5/5 | Enable at least one owner-verified source per category and observe real fetch runs and items with provenance in production |
| [D36](#d36) | Sources | **blocked on owner** | OpenVibe.Sources (loopback :4720, deployed 2e986af) | 5/5 | Enable at least one owner-verified source per category and observe real fetch runs and items with provenance in production |
| [D37](#d37) | Search/SEO | **blocked on owner** | OpenVibe.Search (deployed a707e38; public page at search.openvibe.network); OpenVibe.Contracts (search/index-document.v1.json) | 5/5 | Index real content: once wiki pages are reviewed or the blog post is published, re-send the upserts and verify they land (only tombstones so far) |
| [D37](#d37) | Search/SEO | **blocked on owner** | OpenVibe.Search (deployed a707e38; public page at search.openvibe.network); OpenVibe.Contracts (search/index-document.v1.json) | 5/5 | Index real content: once wiki pages are reviewed or the blog post is published, re-send the upserts and verify they land (only tombstones so far) |
| [D38](#d38) | Publishing | **blocked on owner** | OpenVibe.Publishing (openvibe-publishing v0.2.1); consumers OpenVibe.Wiki, Blog, News, Reviews, Deals, Coupons, Trade | 5/5 | Publish the first real content: reviewed wiki pages and the Blog seed post, then verify that the published revision, search document, feed, sitemap and SSR page converge (roadmap §20.1) |
| [D38](#d38) | Publishing | **blocked on owner** | OpenVibe.Publishing (openvibe-publishing v0.2.1); consumers OpenVibe.Wiki, Blog, News, Reviews, Deals, Coupons, Trade | 5/5 | Publish the first real content: reviewed wiki pages and the Blog seed post, then verify that the published revision, search document, feed, sitemap and SSR page converge (roadmap §20.1) |
-| [D39](#d39) | Mods | **partial** | OpenVibe.Games (registry, grants and runtime today); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Network (planned mod grants); OpenVibe.Host (Stage C sandbox) | 5/5 | Network-side mod principals and grants (capability mods.grant.manage, still planned with implementedBy []): an install should create a mod:<id> principal whose grants Network checks, as ADR-013 decides |
+| [D39](#d39) | Mods | **partial** | OpenVibe.Games (registry, runtime, the hot path's copy of grants); OpenVibe.Network (mod principals and grants, mods.grant.manage); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Host (Stage C sandbox) | 8/8 | Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C |
| [D40](#d40) | Developer services | **partial** | OpenVibe.Network (projects, apps, credentials, grants, quota records); OpenVibe.Media, OpenVibe.Events, OpenVibe.Tools (tenant storage, app events, jobs); OpenVibe.SDK; OpenVibe.Codes (portal); OpenVibe.Examples | 6/6 | Run the committed developer path (OpenVibe.Examples npm run developer-path) against production and record the result |
| [D40](#d40) | Developer services | **partial** | OpenVibe.Network (projects, apps, credentials, grants, quota records); OpenVibe.Media, OpenVibe.Events, OpenVibe.Tools (tenant storage, app events, jobs); OpenVibe.SDK; OpenVibe.Codes (portal); OpenVibe.Examples | 6/6 | Run the committed developer path (OpenVibe.Examples npm run developer-path) against production and record the result |
| [D41](#d41) | Runtime lifecycle | **partial** | OpenVibe.Host (ovhost inventory, deploy, rollback, drain); each service (readiness endpoint) | 5/5 | Declare the rest of the §15.18 lifecycle for each deployable unit: liveness, shutdown deadline, startup recovery, rollback conditions, supported contract ranges, and leases or fencing for competing workers. The inventory has only ready, drain policy, protected probe, workerUnits and databases |
| [D41](#d41) | Runtime lifecycle | **partial** | OpenVibe.Host (ovhost inventory, deploy, rollback, drain); each service (readiness endpoint) | 5/5 | Declare the rest of the §15.18 lifecycle for each deployable unit: liveness, shutdown deadline, startup recovery, rollback conditions, supported contract ranges, and leases or fencing for competing workers. The inventory has only ready, drain policy, protected probe, workerUnits and databases |
| [D42](#d42) | Shared components | **partial** | OpenVibe.Shared (package); OpenVibe.Network (serves /shared/*); every consuming product | 5/5 | Serve shared browser files immutably for each consumer. Community, Wiki, Codes and Tools reference unversioned https://openvibe.network/shared/*.js, which serves Network's pinned release, not their own pin. Use the content-hash ?v= or a site-local copy, as Live does |
| [D42](#d42) | Shared components | **partial** | OpenVibe.Shared (package); OpenVibe.Network (serves /shared/*); every consuming product | 5/5 | Serve shared browser files immutably for each consumer. Community, Wiki, Codes and Tools reference unversioned https://openvibe.network/shared/*.js, which serves Network's pinned release, not their own pin. Use the content-hash ?v= or a site-local copy, as Live does |
@@ -344,7 +344,7 @@ Remaining:
@@ -344,7 +344,7 @@ Remaining:
### D11-D13 Events, realtime, SDK: partial
### D11-D13 Events, realtime, SDK: partial
-Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W2, W3. Measured this run: 107 caller-file/target pairs across 76 files; 12 WebSocket server constructions.
+Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W2, W3. Measured this run: 112 caller-file/target pairs across 82 files; 12 WebSocket server constructions.
#### D11
#### D11
@@ -477,7 +477,7 @@ Blocked on the owner: Owner decision on the 6 ready objects with no good copy (s
@@ -477,7 +477,7 @@ Blocked on the owner: Owner decision on the 6 ready objects with no good copy (s
### D17-D20 Live, OpenRe, channel/VOD lineage: partial
### D17-D20 Live, OpenRe, channel/VOD lineage: partial
-Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W7. Measured this run: 14 Live tables target OpenRe.Stream; 19 test files.
+Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W7. Measured this run: 14 Live tables target OpenRe.Stream; 21 test files.
#### D17
#### D17
@@ -570,7 +570,7 @@ Remaining:
@@ -570,7 +570,7 @@ Remaining:
### D21-D23 Chat: partial
### D21-D23 Chat: partial
-Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W6. Measured this run: 25 Live tables target OpenVibe.Chat; 35 test files.
+Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W6. Measured this run: 25 Live tables target OpenVibe.Chat; 48 test files.
#### D21
#### D21
@@ -636,7 +636,7 @@ Remaining:
@@ -636,7 +636,7 @@ Remaining:
### D24-D27 Community: partial
### D24-D27 Community: partial
-Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W5. Measured this run: 33 tables; 4 Live tables target OpenVibe.Community.
+Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W5. Measured this run: 35 tables; 4 Live tables target OpenVibe.Community.
#### D24
#### D24
@@ -712,7 +712,7 @@ Acceptance artifacts:
@@ -712,7 +712,7 @@ Acceptance artifacts:
### D28-D30 Billing, Tips, VIP: blocked on owner
### D28-D30 Billing, Tips, VIP: blocked on owner
-Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W8-W10 (ADR-012 first). Measured this run: 2 Live tables target OpenVibe.Billing; 21 test files.
+Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W8-W10 (ADR-012 first). Measured this run: 2 Live tables target OpenVibe.Billing; 22 test files.
#### D28
#### D28
@@ -788,7 +788,7 @@ Blocked on the owner: Owner: the Billing cutover prerequisites: the PowerChat we
@@ -788,7 +788,7 @@ Blocked on the owner: Owner: the Billing cutover prerequisites: the PowerChat we
### D31 Tools: partial
### D31 Tools: partial
-Roadmap §3.2 (W0, 2026-09-22): built. Waves: W11. Measured this run: 49 test files.
+Roadmap §3.2 (W0, 2026-09-22): built. Waves: W11. Measured this run: 61 test files.
#### D31
#### D31
@@ -816,7 +816,7 @@ Blocked on the owner: Owner: supply YT_PROXY or YT_COOKIES_FILE for the YouTube
@@ -816,7 +816,7 @@ Blocked on the owner: Owner: supply YT_PROXY or YT_COOKIES_FILE for the YouTube
### D32 Games: partial
### D32 Games: partial
-Roadmap §3.2 (W0, 2026-09-22): built. Waves: W12. Measured this run: 76 test files.
+Roadmap §3.2 (W0, 2026-09-22): built. Waves: W12. Measured this run: 82 test files.
#### D32
#### D32
@@ -844,7 +844,7 @@ Blocked on the owner: Owner: accept ADR-013's trust-tier names (unreviewed/revie
@@ -844,7 +844,7 @@ Blocked on the owner: Owner: accept ADR-013's trust-tier names (unreviewed/revie
### D33-D34 Codes, Host: partial
### D33-D34 Codes, Host: partial
-Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 27 test files; 38 test files.
+Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 34 test files; 48 test files.
#### D33
#### D33
@@ -897,7 +897,7 @@ Blocked on the owner: Owner: confirm /etc/openvibe/backup.key is escrowed off th
@@ -897,7 +897,7 @@ Blocked on the owner: Owner: confirm /etc/openvibe/backup.key is escrowed off th
### D35-D38 AI, content, sources, search: partial
### D35-D38 AI, content, sources, search: partial
-Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W13-W15. Measured this run: 14 Live tables target OpenVibe.AI; 20 test files.
+Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W13-W15. Measured this run: 14 Live tables target OpenVibe.AI; 26 test files.
#### D35
#### D35
@@ -998,29 +998,28 @@ Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W12, W21.
@@ -998,29 +998,28 @@ Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W12, W21.
#### D39
#### D39
-**Mods: partial**. Owner today: OpenVibe.Games (registry, grants and runtime today); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Network (planned mod grants); OpenVibe.Host (Stage C sandbox). Target (§15.0): mod manifests, capabilities, quotas, runtime adapters.
+**Mods: partial**. Owner today: OpenVibe.Games (registry, runtime, the hot path's copy of grants); OpenVibe.Network (mod principals and grants, mods.grant.manage); OpenVibe.Contracts (mods/mod-manifest.v1, ADR-013); OpenVibe.Host (Stage C sandbox). Target (§15.0): mod manifests, capabilities, quotas, runtime adapters.
-The mod manifest (Contracts mods/mod-manifest.v1, ADR-013 accepted 2026-09-23) and a Games-local registry are tested: grants are the approved subset, installs and grants are audited, and revoking a mod removes its effect on the next tick and across a restart. Only declarative games-content packs run. Executable runtimes are refused, and the CPU budget is metered and audited but not enforced. Network's mods.grant.manage capability is still `planned`, and on 2026-09-23 at 20:22 UTC production world.db held 0 mods, 0 grants and 0 audit rows.
+The mod manifest (Contracts mods/mod-manifest.v1, ADR-013) and the Games registry are tested. Since 2026-09-27 every install is a Network principal mod:<id> whose grants Network holds (mods.grant.manage active; Games asks Network first, and network.mod.grants_changed keeps its copy current). The budget is enforced: 5 reconciles over cpuMs, or 3 minutes over 60 effects a minute, disable only the offending mod. Security tests cover namespace escape, event flood, resource budget and forged ownership. One production install -> grant -> use -> revoke run is recorded. Only declarative games-content packs run; executable runtimes wait for Host Stage C.
Acceptance artifacts:
Acceptance artifacts:
- test: Games/apps/server/src/mods/runtime.test.ts ("a denied capability cannot be reached: the binding throws and the host is never called") - A capability the mod was not granted cannot be reached through the Games runtime seam (ADR-013 acceptance 1)..
- test: Games/apps/server/src/mods/runtime.test.ts ("a denied capability cannot be reached: the binding throws and the host is never called") - A capability the mod was not granted cannot be reached through the Games runtime seam (ADR-013 acceptance 1)..
- test: Games/apps/server/src/mods/runtime.test.ts ("revocation survives a restart: the next boot retracts what the old process left") - A revoked mod stops affecting the world on the next tick and stays revoked after a restart. The same file tests that a trust tier never stands in for a grant and that executable runtimes are refused..
- test: Games/apps/server/src/mods/runtime.test.ts ("revocation survives a restart: the next boot retracts what the old process left") - A revoked mod stops affecting the world on the next tick and stays revoked after a restart. The same file tests that a trust tier never stands in for a grant and that executable runtimes are refused..
- doc: Contracts/docs/adr/ADR-013-mod-manifest.md ("**Manifest in Contracts:** a mod is described by `mods/mod-manifest.v1`") - The accepted manifest carries the target runtime, the requested capabilities, a resource budget and a compatibility range. Grants belong in Network and the sandbox in Host..
- doc: Contracts/docs/adr/ADR-013-mod-manifest.md ("**Manifest in Contracts:** a mod is described by `mods/mod-manifest.v1`") - The accepted manifest carries the target runtime, the requested capabilities, a resource budget and a compatibility range. Grants belong in Network and the sandbox in Host..
-- doc: Contracts/manifests/capabilities/mods.grant.manage.json ("Until Network implements it, each runtime keeps the approved subset itself") - Network-side mod principals and grants are not implemented: the status is planned and implementedBy is empty..
-- prod: `ssh openvibe-ovh 'db=/opt/openvibe.games/data/world.db; sudo -n -u "$(stat -c %U $db)" sqlite3 -readonly $db "SELECT count(*) FROM mods"' (also mod_grants, mod_audit); curl -s http://127.0.0.1:8000/api/v1/mods` (2026-09-23 20:22) - No mod has ever been installed, granted, used or revoked in production.. Observed: mods 0, mod_grants 0, mod_audit 0; /api/v1/mods -> {"mods":[]}.
+- doc: Contracts/manifests/capabilities/mods.grant.manage.json (""status": "active"") - Network implements mod principals and grants: the capability is active..
+- test: Network/test/mod-principals.test.js ("another runtime can neither register nor change it") - An install registers mod:<id> with the approved subset of what its manifest requests; the registering runtime owns it; staff changes carry a reason and an audit row; every change is announced with the complete approved set..
+- test: Games/apps/server/src/mods/security.test.ts ("forged ownership") - Namespace escape, event flood, resource budget and forged ownership: a flooding or over-budget mod is disabled while the others run; props are always the mod's..
+- test: Games/apps/server/src/mods/networkGrants.test.ts ("installs with what Network approved") - The mods API asks Network first and applies only its answer; an older grants_changed revision changes nothing..
+- prod: `ssh openvibe-ovh: sudo sh -c '. /etc/openvibe/probe.env; cd /opt/openvibe.games && node --import tsx apps/server/scripts/modLifecycleProof.ts'` (2026-09-27 23:45) - One production install -> grant -> use -> revoke run with audit rows.. Observed: install 201 -> grant 200 -> use (prop placed) -> revoke 200 -> retract; the Network principal ended revoked with three network.mod.grants_changed events.
Remaining:
Remaining:
-- Network-side mod principals and grants (capability mods.grant.manage, still planned with implementedBy []): an install should create a mod:<id> principal whose grants Network checks, as ADR-013 decides
-- Quotas: the manifest's resource budget is only metered and audited in Games (runtime.ts budget_exceeded, with no test). Still to do: enforce it, prove that a budget breach terminates only the offending mod, and add an event-flood throttle, each with tests (roadmap §20 Mods)
- Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C
- Runtime adapters beyond declarative Games content packs: executable runtimes (source-quickjs, target games.source) are refused. Source.OpenVibe.Games has no adapter, and there is no live.overlay adapter. Sandboxed execution waits for Host Stage C
-- The §20 Mods acceptance tests still missing: namespace escape denied, and no forged Billing or Media ownership
-- One production install -> grant -> use -> revoke run with audit rows (production has 0 mods)
### D40 Open developer services: partial
### D40 Open developer services: partial
-Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 40 of 107 call sites authenticate with the shared internal key.
+Roadmap §3.2 (W0, 2026-09-22): absent. Waves: W20, W21. Measured this run: 40 of 112 call sites authenticate with the shared internal key.
#### D40
#### D40
@@ -1075,7 +1074,7 @@ Blocked on the owner: Open 1936/tcp at the host firewall and at the provider edg
@@ -1075,7 +1074,7 @@ Blocked on the owner: Open 1936/tcp at the host firewall and at the provider edg
### D42 Shared component architecture: partial
### D42 Shared component architecture: partial
-Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W2, Track R. Measured this run: 24 repos pin a tagged openvibe-shared release (latest v1.22.0): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Host v1.22.0, Live v1.22.0, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.22.0, Sources v1.22.0, Tips v1.22.0, Tools v1.22.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0; 0 manifests unpinned or behind: none.
+Roadmap §3.2 (W0, 2026-09-22): partial. Waves: W2, Track R. Measured this run: 25 repos pin a tagged openvibe-shared release (latest v1.23.1): OpenRe.Stream v1.22.0, AI v1.22.0, Billing v1.22.0, Blog v1.22.0, Chat v1.22.0, Codes v1.22.0, Community v1.22.0, Coupons v1.22.0, Deals v1.22.0, Events v1.22.0, Games v1.23.0, Host v1.22.0, Live v1.23.1, Media v1.22.0, Network v1.22.0, News v1.22.0, Reviews v1.22.0, Search v1.22.0, Sites v1.23.0, Sources v1.22.0, Tips v1.22.0, Tools v1.23.0, Trade v1.22.0, VIP v1.22.0, Wiki v1.22.0; 31 manifests unpinned or behind: OpenRe.Stream (v1.22.0), AI (v1.22.0), Billing (v1.22.0), Blog (v1.22.0), Chat (v1.22.0), Codes (v1.22.0), Community (v1.22.0), Coupons (v1.22.0), Deals (v1.22.0), Events (v1.22.0), Games/apps/server (v1.23.0), Host (v1.22.0), Media (v1.22.0), Network (v1.22.0), News (v1.22.0), Reviews (v1.22.0), Search (v1.22.0), Sites (v1.23.0), Sources (v1.22.0), Tips (v1.22.0), Tools/apps/audio (v1.23.0), Tools/apps/docs (v1.23.0), Tools/apps/food (v1.23.0), Tools/apps/gateway (v1.23.0), Tools/apps/img (v1.23.0), Tools/apps/maps (v1.23.0), Tools/apps/text (v1.23.0), Tools/apps/yt (v1.23.0), Trade (v1.22.0), VIP (v1.22.0), Wiki (v1.22.0).
#### D42
#### D42
@@ -1156,7 +1155,7 @@ Remaining:
@@ -1156,7 +1155,7 @@ Remaining:
### D45 Release compatibility and recovery: partial
### D45 Release compatibility and recovery: partial
-Roadmap §3.2 (W0, 2026-09-22): absent. Waves: Track R, W22. Measured this run: 1 service(s) not running origin/main.
+Roadmap §3.2 (W0, 2026-09-22): absent. Waves: Track R, W22. Measured this run: 25 service(s) not running origin/main.
#### D45
#### D45