openvibers/openvibe.shared Commits
The Dock keeps the Vibe tab across sites (4.75.0) (#227)
Changes
@@@ -4,6 +4,11 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semvebreaking 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@@@ -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 deployedconsumer 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` namesthe tag it pins.@@@ -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)",@@@ -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;@@@ -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": {@@@ -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();}
@@ -4,6 +4,11 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semve
@@ -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.
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).
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
## 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
- **Vibe in the Dock, on every site** (plan L48 V2; the owner, 2026-11-01: "access your agent or the AI… from across
@@ -2,7 +2,7 @@
@@ -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.
> 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
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
([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` names
the tag it pins.
the tag it pins.
@@ -4,7 +4,7 @@
@@ -4,7 +4,7 @@
"code": true,
"code": true,
"wave": "W2",
"wave": "W2",
"package": "openvibe-shared",
"package": "openvibe-shared",
- "version": "4.74.0",
+ "version": "4.75.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)",
"deployed": false,
"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)",
"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)",
@@ -42,8 +42,9 @@
@@ -42,8 +42,9 @@
};
};
// Vibe first (L48 V2): the person's AI, on every site.
// 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]];
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 } } };
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;
let el = null, o = {}, doc = null, tab = 'activity', saveT = 0, pending = {}, lastFocus = null;
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-shared",
"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",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"main": "index.js",
"bin": {
"bin": {
@@ -12,7 +12,7 @@
@@ -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
// 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;
// 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 (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
// • 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
// 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.
// panel back; the Network is told.
@@ -334,7 +334,7 @@ async function drag(p, from, to) {
@@ -334,7 +334,7 @@ async function drag(p, from, to) {
await p.close();
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 } };
scenario = { counts: { running: 0, waiting: 0, unread: 0 }, state: { ...defaultState(), pinned: true } };
puts.length = 0;
puts.length = 0;
@@ -356,7 +356,7 @@ async function drag(p, from, to) {
@@ -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-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');
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);
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();
await p.close();
}
}