openvibers/openvibe.network Commits
openvibe-shared v4.12.0 (was v4.11.0) (#328)
Changes
@@@ -50,7 +50,7 @@ Identity and account service for the OpenVibe network. Manages user accounts, OA## Depends on- `openvibe-contracts` v0.213.0 (registry manifests, capability checks), `openvibe-sdk` v0.64.0 (PostgreSQL-- and Valkey adapters, events, per-actor limits, universal telemetry), `openvibe-shared` v4.11.0, pinned by release tarball++ and Valkey adapters, events, per-actor limits, universal telemetry), `openvibe-shared` v4.12.0, pinned by release tarball- OpenVibe.Events (Network's outbox relay; the events it consumes), OpenVibe.AI (the `network.site_copy`workflow), OpenVibe.Blog (the changelog feed it proxies)- email (Resend), Discord and GitHub when their secrets are set ([Provider secrets](#provider-secrets))@@@ -759,5 +759,5 @@ MIT (`license` in [package.json](package.json)).<!-- versions:start -->- openvibe-contracts: v0.213.0- openvibe-sdk: v0.64.0--- openvibe-shared: v4.11.0++- openvibe-shared: v4.12.0<!-- versions:end -->@@@ -8,7 +8,7 @@"domain": "openvibe.network (with auth., api., admin., my. and themes.openvibe.network in its manifest)","contracts": "openvibe-contracts v0.213.0","sdk": "openvibe-sdk v0.64.0",-- "shared": "openvibe-shared v4.11.0",++ "shared": "openvibe-shared v4.12.0","capabilities": ["identity.subject.resolve","mods.grant.manage",@@@ -22,7 +22,7 @@"multer": "^1.4.5-lts.1","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.213.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.64.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.11.0",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.12.0","pg": "^8.23.0","uuid": "^11.1.0","web-push": "^3.6.7"@@@ -1364,9 +1364,9 @@}},"node_modules/openvibe-shared": {-- "version": "4.11.0",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.11.0",-- "integrity": "sha512-/OKVLcD4PN/C9g8Nwox+OE7cY7PHDfYduh6Kbe3f12V19bb9n2fDciK5ND4IlYCq3T5CHChL3vZyJIaPdWKrCA==",++ "version": "4.12.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.12.0",++ "integrity": "sha512-k0i63sCPfHtz1KF5MJSI+CGv5VwBf4ISRzxJRQdorkeMKOTtABlAQfiH1uf9kJsd5/Wn7VUTTHlhhOLSX6ZTzw==","license": "MIT","dependencies": {"jsonwebtoken": "^9.0.0"@@@ -26,7 +26,7 @@"multer": "^1.4.5-lts.1","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.213.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.64.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.11.0",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.12.0","pg": "^8.23.0","uuid": "^11.1.0","web-push": "^3.6.7"@@@ -16,7 +16,7 @@ const BUDGETS = {htmlBrotliKB: 30, // 28.5 with the FAQ, numbers and groups (2026-10-22); 26.1 with Play; 25.1 (31 sites, contracts 0.135.0); 24.1 (shared 2.21.0, the same glyphs); 20.5 (contracts 0.116.0)jsFiles: 8, // 7 with boost.js, was 6 (2026-10-13, plan T11 step 3: one more script on every boosted page; it loads route-transition.js on the first move only)jsRawKB: 274, // 269.3 with shared 4.11.0's seasonal navbar (Pumpkin Night and the season badge, +2.6); 249.8 with boost.js (13.1); 228.3-- jsBrotliKB: 66, // 64.5 with shared 4.11.0's navbar; 60.3 with boost.js (3.8); 53.9++ jsBrotliKB: 70, // 68.0 with shared 4.12.0 (light/dark switch, seasonal mark, theme pairs); 64.5 with shared 4.11.0's navbar; 60.3 with boost.js (3.8); 53.9cssFiles: 2, // 1 (Font Awesome, cross-origin)externalFiles: 3, // 1 locally; production adds Cloudflare's beacon};@@@ -115,13 +115,14 @@ const token = async (id) => signToken(await db.prepare('SELECT * FROM users WHER// ── Seasons: what stands in for the default theme when, for apps and the SDK ──r = await call('GET', '/api/themes/seasons?date=2026-10-25');assert.deepStrictEqual(r.body.seasons.map((x) => [x.id, x.theme, x.from, x.to]), [['halloween', 'halloween', '10-01', '10-31'], ['winter', 'frost', '12-01', '12-31']]);-- assert.deepStrictEqual(r.body.now, { id: 'halloween', name: 'Halloween', theme: 'halloween' });++ // openvibe-shared 4.12: a season names its light half too (Midnight Pumpkin ↔ Hayride).++ assert.deepStrictEqual(r.body.now, { id: 'halloween', name: 'Halloween', theme: 'halloween', light: 'hayride' });assert.strictEqual((await call('GET', '/api/themes/seasons?date=2026-11-05')).body.now, null);assert.strictEqual((await call('GET', '/api/themes/seasons?date=2026-12-24')).body.now.id, 'winter');const cat = (await call('GET', '/api/themes')).body.themes;const pumpkin = cat.find((t) => t.id === 'halloween');assert.ok(!pumpkin || (pumpkin.season && pumpkin.season.id === 'halloween'), 'a seasonal theme in the catalog says its season');-- assert.ok(cat.filter((t) => t.season).every((t) => ['halloween', 'frost'].includes(t.id)), 'and only those');++ assert.ok(cat.filter((t) => t.season).every((t) => ['halloween', 'hayride', 'frost', 'snowfall'].includes(t.id)), 'and only those (and their light halves)');server.close();fs.rmSync(dir, { recursive: true, force: true });
@@ -50,7 +50,7 @@ Identity and account service for the OpenVibe network. Manages user accounts, OA
@@ -50,7 +50,7 @@ Identity and account service for the OpenVibe network. Manages user accounts, OA
## Depends on
## Depends on
- `openvibe-contracts` v0.213.0 (registry manifests, capability checks), `openvibe-sdk` v0.64.0 (PostgreSQL
- `openvibe-contracts` v0.213.0 (registry manifests, capability checks), `openvibe-sdk` v0.64.0 (PostgreSQL
- and Valkey adapters, events, per-actor limits, universal telemetry), `openvibe-shared` v4.11.0, pinned by release tarball
+ and Valkey adapters, events, per-actor limits, universal telemetry), `openvibe-shared` v4.12.0, pinned by release tarball
- OpenVibe.Events (Network's outbox relay; the events it consumes), OpenVibe.AI (the `network.site_copy`
- OpenVibe.Events (Network's outbox relay; the events it consumes), OpenVibe.AI (the `network.site_copy`
workflow), OpenVibe.Blog (the changelog feed it proxies)
workflow), OpenVibe.Blog (the changelog feed it proxies)
- email (Resend), Discord and GitHub when their secrets are set ([Provider secrets](#provider-secrets))
- email (Resend), Discord and GitHub when their secrets are set ([Provider secrets](#provider-secrets))
@@ -759,5 +759,5 @@ MIT (`license` in [package.json](package.json)).
@@ -759,5 +759,5 @@ MIT (`license` in [package.json](package.json)).
<!-- versions:start -->
<!-- versions:start -->
- openvibe-contracts: v0.213.0
- openvibe-contracts: v0.213.0
- openvibe-sdk: v0.64.0
- openvibe-sdk: v0.64.0
-- openvibe-shared: v4.11.0
+- openvibe-shared: v4.12.0
<!-- versions:end -->
<!-- versions:end -->
@@ -8,7 +8,7 @@
@@ -8,7 +8,7 @@
"domain": "openvibe.network (with auth., api., admin., my. and themes.openvibe.network in its manifest)",
"domain": "openvibe.network (with auth., api., admin., my. and themes.openvibe.network in its manifest)",
"contracts": "openvibe-contracts v0.213.0",
"contracts": "openvibe-contracts v0.213.0",
"sdk": "openvibe-sdk v0.64.0",
"sdk": "openvibe-sdk v0.64.0",
- "shared": "openvibe-shared v4.11.0",
+ "shared": "openvibe-shared v4.12.0",
"capabilities": [
"capabilities": [
"identity.subject.resolve",
"identity.subject.resolve",
"mods.grant.manage",
"mods.grant.manage",
@@ -22,7 +22,7 @@
@@ -22,7 +22,7 @@
"multer": "^1.4.5-lts.1",
"multer": "^1.4.5-lts.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.213.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.213.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.64.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.64.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.11.0",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.12.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
"uuid": "^11.1.0",
"uuid": "^11.1.0",
"web-push": "^3.6.7"
"web-push": "^3.6.7"
@@ -1364,9 +1364,9 @@
@@ -1364,9 +1364,9 @@
}
}
},
},
"node_modules/openvibe-shared": {
"node_modules/openvibe-shared": {
- "version": "4.11.0",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.11.0",
- "integrity": "sha512-/OKVLcD4PN/C9g8Nwox+OE7cY7PHDfYduh6Kbe3f12V19bb9n2fDciK5ND4IlYCq3T5CHChL3vZyJIaPdWKrCA==",
+ "version": "4.12.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.12.0",
+ "integrity": "sha512-k0i63sCPfHtz1KF5MJSI+CGv5VwBf4ISRzxJRQdorkeMKOTtABlAQfiH1uf9kJsd5/Wn7VUTTHlhhOLSX6ZTzw==",
"license": "MIT",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0"
"jsonwebtoken": "^9.0.0"
@@ -26,7 +26,7 @@
@@ -26,7 +26,7 @@
"multer": "^1.4.5-lts.1",
"multer": "^1.4.5-lts.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.213.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.213.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.64.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.64.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.11.0",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.12.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
"uuid": "^11.1.0",
"uuid": "^11.1.0",
"web-push": "^3.6.7"
"web-push": "^3.6.7"
@@ -16,7 +16,7 @@ const BUDGETS = {
@@ -16,7 +16,7 @@ const BUDGETS = {
htmlBrotliKB: 30, // 28.5 with the FAQ, numbers and groups (2026-10-22); 26.1 with Play; 25.1 (31 sites, contracts 0.135.0); 24.1 (shared 2.21.0, the same glyphs); 20.5 (contracts 0.116.0)
htmlBrotliKB: 30, // 28.5 with the FAQ, numbers and groups (2026-10-22); 26.1 with Play; 25.1 (31 sites, contracts 0.135.0); 24.1 (shared 2.21.0, the same glyphs); 20.5 (contracts 0.116.0)
jsFiles: 8, // 7 with boost.js, was 6 (2026-10-13, plan T11 step 3: one more script on every boosted page; it loads route-transition.js on the first move only)
jsFiles: 8, // 7 with boost.js, was 6 (2026-10-13, plan T11 step 3: one more script on every boosted page; it loads route-transition.js on the first move only)
jsRawKB: 274, // 269.3 with shared 4.11.0's seasonal navbar (Pumpkin Night and the season badge, +2.6); 249.8 with boost.js (13.1); 228.3
jsRawKB: 274, // 269.3 with shared 4.11.0's seasonal navbar (Pumpkin Night and the season badge, +2.6); 249.8 with boost.js (13.1); 228.3
- jsBrotliKB: 66, // 64.5 with shared 4.11.0's navbar; 60.3 with boost.js (3.8); 53.9
+ jsBrotliKB: 70, // 68.0 with shared 4.12.0 (light/dark switch, seasonal mark, theme pairs); 64.5 with shared 4.11.0's navbar; 60.3 with boost.js (3.8); 53.9
cssFiles: 2, // 1 (Font Awesome, cross-origin)
cssFiles: 2, // 1 (Font Awesome, cross-origin)
externalFiles: 3, // 1 locally; production adds Cloudflare's beacon
externalFiles: 3, // 1 locally; production adds Cloudflare's beacon
};
};
@@ -115,13 +115,14 @@ const token = async (id) => signToken(await db.prepare('SELECT * FROM users WHER
@@ -115,13 +115,14 @@ const token = async (id) => signToken(await db.prepare('SELECT * FROM users WHER
// ── Seasons: what stands in for the default theme when, for apps and the SDK ──
// ── Seasons: what stands in for the default theme when, for apps and the SDK ──
r = await call('GET', '/api/themes/seasons?date=2026-10-25');
r = await call('GET', '/api/themes/seasons?date=2026-10-25');
assert.deepStrictEqual(r.body.seasons.map((x) => [x.id, x.theme, x.from, x.to]), [['halloween', 'halloween', '10-01', '10-31'], ['winter', 'frost', '12-01', '12-31']]);
assert.deepStrictEqual(r.body.seasons.map((x) => [x.id, x.theme, x.from, x.to]), [['halloween', 'halloween', '10-01', '10-31'], ['winter', 'frost', '12-01', '12-31']]);
- assert.deepStrictEqual(r.body.now, { id: 'halloween', name: 'Halloween', theme: 'halloween' });
+ // openvibe-shared 4.12: a season names its light half too (Midnight Pumpkin ↔ Hayride).
+ assert.deepStrictEqual(r.body.now, { id: 'halloween', name: 'Halloween', theme: 'halloween', light: 'hayride' });
assert.strictEqual((await call('GET', '/api/themes/seasons?date=2026-11-05')).body.now, null);
assert.strictEqual((await call('GET', '/api/themes/seasons?date=2026-11-05')).body.now, null);
assert.strictEqual((await call('GET', '/api/themes/seasons?date=2026-12-24')).body.now.id, 'winter');
assert.strictEqual((await call('GET', '/api/themes/seasons?date=2026-12-24')).body.now.id, 'winter');
const cat = (await call('GET', '/api/themes')).body.themes;
const cat = (await call('GET', '/api/themes')).body.themes;
const pumpkin = cat.find((t) => t.id === 'halloween');
const pumpkin = cat.find((t) => t.id === 'halloween');
assert.ok(!pumpkin || (pumpkin.season && pumpkin.season.id === 'halloween'), 'a seasonal theme in the catalog says its season');
assert.ok(!pumpkin || (pumpkin.season && pumpkin.season.id === 'halloween'), 'a seasonal theme in the catalog says its season');
- assert.ok(cat.filter((t) => t.season).every((t) => ['halloween', 'frost'].includes(t.id)), 'and only those');
+ assert.ok(cat.filter((t) => t.season).every((t) => ['halloween', 'hayride', 'frost', 'snowfall'].includes(t.id)), 'and only those (and their light halves)');
server.close();
server.close();
fs.rmSync(dir, { recursive: true, force: true });
fs.rmSync(dir, { recursive: true, force: true });