openvibers/openvibe.shared Commits

The Dock keeps the Vibe tab across sites (4.75.0) (#227)

OP OpenVibers committed 12 days ago · 0af91b680a · 6 files, +14 −8

The Network's Dock state knows vibe since contracts 0.270.0 (Network #481): the open Vibe tab now follows the person
from site to site like the others.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 47429b1..f840ca8 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,11 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semve
breaking change to any exported module, browser global or served file name is a new major.
A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
++## 4.75.0 — 2026-11-01
++
++- **The Dock keeps the Vibe tab across sites.** The Network's Dock state knows `vibe` since openvibe-contracts 0.270.0
++ (Network #481), so the open tab follows the person from site to site like the others.
++
## 4.74.0 — 2026-11-01
- **Vibe in the Dock, on every site** (plan L48 V2; the owner, 2026-11-01: "access your agent or the AI… from across
ddiff --git a/README.md b/README.md
iindex db7c8c4..d58c30a 100644
---- a/README.md
++++ b/README.md
@@@ -2,7 +2,7 @@
> Versioned UI, the OpenVibe Frame (the navbar, footer and "shipped" views every site sits in), SEO, legal and release-client packages every OpenVibe site renders.
--**Status:** alpha, v4.74.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
++**Status:** alpha, v4.75.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
consumer installs a tagged release and none keeps a vendored copy
([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` names
the tag it pins.
ddiff --git a/STATUS.json b/STATUS.json
iindex fa74a8c..1efc369 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -4,7 +4,7 @@
"code": true,
"wave": "W2",
"package": "openvibe-shared",
-- "version": "4.74.0",
++ "version": "4.75.0",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"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)",
ddiff --git a/dock.js b/dock.js
iindex d61b37f..5f48b6f 100644
---- a/dock.js
++++ b/dock.js
@@@ -42,8 +42,9 @@
};
// Vibe first (L48 V2): the person's AI, on every site.
const TABS = [['vibe', 'Vibe', G.vibe], ['agent', 'Agents', G.spark], ['chats', 'Chats', G.chat], ['activity', 'Activity', G.bell]];
-- // The tabs the Network keeps in the person's Dock state (network.dock-state@1); a newer one stays on this site's copy.
-- const SAVED_TABS = ['agent', 'chats', 'activity'];
++ // The tabs the Network keeps in the person's Dock state (network.dock-state@1; vibe since contracts 0.270.0); a
++ // newer one stays on this site's copy until the Network learns it.
++ const SAVED_TABS = ['vibe', 'agent', 'chats', 'activity'];
const DEFAULT_STATE = { open: false, tab: 'activity', pinned: false, agent: null, chat: null, place: { phone: { corner: 'bottom-right' }, desktop: { corner: 'bottom-right', width: null, height: null } } };
let el = null, o = {}, doc = null, tab = 'activity', saveT = 0, pending = {}, lastFocus = null;
ddiff --git a/package.json b/package.json
iindex e59db82..9beeed4 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-shared",
-- "version": "4.74.0",
++ "version": "4.75.0",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"bin": {
ddiff --git a/test/dock-chrome.test.js b/test/dock-chrome.test.js
iindex 9a1d574..396f8d4 100644
---- a/test/dock-chrome.test.js
++++ b/test/dock-chrome.test.js
@@@ -12,7 +12,7 @@
// and mine), Enter sends, the thread is marked read, the open chat is the Dock's state, and opening one on a phone
// never reads as a tap outside the sheet;
// • Vibe (L48 V2): the person's Vibe from Chat's /api/vibe, starters before the first message, a question posted and
--// Vibe's answer arriving in place (an https link as a link), the Vibe tab never sent to the Network's state;
++// Vibe's answer arriving in place (an https link as a link), and the Vibe tab kept in the Network's state;
// • Pop out (K-D4): the button only where the browser can open a window of its own; the panel moves into it with
// its tabs and its styles, the page keeps the pill saying where the Dock went, and closing the window brings the
// panel back; the Network is told.
@@@ -334,7 +334,7 @@ async function drag(p, from, to) {
await p.close();
}
-- // ── Vibe (L48 V2): starters, a question, Vibe's answer in place; the tab stays off the Network's state. ──
++ // ── Vibe (L48 V2): starters, a question, Vibe's answer in place; the Network keeps the tab. ──
{
scenario = { counts: { running: 0, waiting: 0, unread: 0 }, state: { ...defaultState(), pinned: true } };
puts.length = 0;
@@@ -356,7 +356,7 @@ async function drag(p, from, to) {
assert.strictEqual(await p.evaluate("!!document.querySelector('.ovdk .ovdk-typing')"), false, 'the writing dots go when it answers');
assert.strictEqual(await p.evaluate("document.querySelector('.ovdk .ovdk-away').href"), 'https://openvibe.chat/vibe/v1', 'Open in Chat goes to the same chat');
await wait(900);
-- assert.ok(!puts.some((b) => b.tab === 'vibe'), `the Network's Dock state never gets a tab it does not know (${JSON.stringify(puts)})`);
++ assert.ok(puts.some((b) => b.tab === 'vibe'), `the Network keeps the Vibe tab, so it follows the person to the next site (${JSON.stringify(puts)})`);
await p.close();
}