openvibers/openvibe.network Commits
OpenVibe.AI may run a model on a person's own machine for them (bot.machine.ai on Bot); openvibe-contracts v0.219.0 (#355)
Changes
@@@ -49,7 +49,7 @@ Identity and account service for the OpenVibe network. Manages user accounts, OA## Depends on--- `openvibe-contracts` v0.218.0 (registry manifests, capability checks), `openvibe-sdk` v0.65.0 (PostgreSQL++- `openvibe-contracts` v0.219.0 (registry manifests, capability checks), `openvibe-sdk` v0.65.0 (PostgreSQLand Valkey adapters, events, per-actor limits, universal telemetry), `openvibe-shared` v4.15.2, 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)@@@ -6,7 +6,7 @@"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9","port": 4000,"domain": "openvibe.network (with auth., api., admin., my. and themes.openvibe.network in its manifest)",-- "contracts": "openvibe-contracts v0.218.0",++ "contracts": "openvibe-contracts v0.219.0","sdk": "openvibe-sdk v0.65.0","shared": "openvibe-shared v4.15.2","capabilities": [@@@ -20,7 +20,7 @@"iovalkey": "^0.4.0","jsonwebtoken": "^9.0.0","multer": "^1.4.5-lts.1",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.218.0",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.219.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.65.0","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.15.2","pg": "^8.23.0",@@@ -1320,9 +1320,9 @@}},"node_modules/openvibe-contracts": {-- "version": "0.218.0",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.218.0",-- "integrity": "sha512-/cgAdxibISceSva51oCYz/382iLsXW5RU6kt8Lyt5JWPiL6QhL0193boUZS9Ls4SxnEgT/fiAtMU3IJY4qMKwg==",++ "version": "0.219.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.219.0",++ "integrity": "sha512-Ka5nyz0UGjfQrN91vKL4TJWV84Fb6Nr8bGrfoSuPSKNv1F5U/uvPG9lFsw5bw9ocn6xMrypUDwsyu+hn/NnmVA==","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -24,7 +24,7 @@"iovalkey": "^0.4.0","jsonwebtoken": "^9.0.0","multer": "^1.4.5-lts.1",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.218.0",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.219.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.65.0","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.15.2","pg": "^8.23.0",@@@ -409,7 +409,10 @@ const DEFAULT_GRANTS = [['probe', 'games.mod.manage', 'openvibe.games', []],// Wave 20: the Codes portal relays its release events.['services', 'events.event.publish', 'openvibe.events', []],-- ['ai', 'events.event.publish', 'openvibe.events', []], // ai.run.* (AI server/events.js, 2026-09-24)++ ['ai', 'events.event.publish', 'openvibe.events', []],++ // AI on your own machines (contracts 0.219.0): a person's own model, on their own machine through its OpenVibe Node,++ // for that person's runs only (Bot checks the owner and their switch, "Let my AI use this computer's models").++ ['ai', 'bot.machine.ai', 'openvibe.bot', []], // ai.run.* (AI server/events.js, 2026-09-24)// Wave 13: Live's AI features run as OpenVibe.AI workflows (AI_SERVICE=remote in live.env).// Live runs its own live.* workflows, network.site_copy as the footer-copy fallback, and media.analyze// (local-first VOD/clip analysis, roadmap WS-O task 5) (OpenVibe.AI fails closed on a token with no ns).nnew file mode 100644@@@ -0,0 +1,16 @@++/**++ * OpenVibe.AI's grant on OpenVibe.Bot for AI on your own machines (contracts 0.219.0): it runs a model on a person's++ * own machine for that person (bot.machine.ai, audience openvibe.bot), and nothing else of Bot's computer control.++ *++ * node test/ai-machine-grant.test.js++ */++'use strict';++const assert = require('assert');++const contracts = require('openvibe-contracts');++const principals = require('../server/identity/principals');++++const onBot = principals.DEFAULT_GRANTS.filter((g) => g[0] === 'ai' && g[2] === 'openvibe.bot').map((g) => g[1]);++assert.deepStrictEqual(onBot, ['bot.machine.ai'], 'ai holds bot.machine.ai on Bot, and no computer control');++const cap = contracts.capabilities.get('bot.machine.ai');++assert.ok(cap && cap.status === 'active', 'bot.machine.ai is an active capability in the pinned contracts');++console.log('ai machine grant: ok');
@@ -49,7 +49,7 @@ Identity and account service for the OpenVibe network. Manages user accounts, OA
@@ -49,7 +49,7 @@ Identity and account service for the OpenVibe network. Manages user accounts, OA
## Depends on
## Depends on
-- `openvibe-contracts` v0.218.0 (registry manifests, capability checks), `openvibe-sdk` v0.65.0 (PostgreSQL
+- `openvibe-contracts` v0.219.0 (registry manifests, capability checks), `openvibe-sdk` v0.65.0 (PostgreSQL
and Valkey adapters, events, per-actor limits, universal telemetry), `openvibe-shared` v4.15.2, pinned by release tarball
and Valkey adapters, events, per-actor limits, universal telemetry), `openvibe-shared` v4.15.2, 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)
@@ -6,7 +6,7 @@
@@ -6,7 +6,7 @@
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"port": 4000,
"port": 4000,
"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.218.0",
+ "contracts": "openvibe-contracts v0.219.0",
"sdk": "openvibe-sdk v0.65.0",
"sdk": "openvibe-sdk v0.65.0",
"shared": "openvibe-shared v4.15.2",
"shared": "openvibe-shared v4.15.2",
"capabilities": [
"capabilities": [
@@ -20,7 +20,7 @@
@@ -20,7 +20,7 @@
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
"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.218.0",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.219.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.65.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.65.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.15.2",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.15.2",
"pg": "^8.23.0",
"pg": "^8.23.0",
@@ -1320,9 +1320,9 @@
@@ -1320,9 +1320,9 @@
}
}
},
},
"node_modules/openvibe-contracts": {
"node_modules/openvibe-contracts": {
- "version": "0.218.0",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.218.0",
- "integrity": "sha512-/cgAdxibISceSva51oCYz/382iLsXW5RU6kt8Lyt5JWPiL6QhL0193boUZS9Ls4SxnEgT/fiAtMU3IJY4qMKwg==",
+ "version": "0.219.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.219.0",
+ "integrity": "sha512-Ka5nyz0UGjfQrN91vKL4TJWV84Fb6Nr8bGrfoSuPSKNv1F5U/uvPG9lFsw5bw9ocn6xMrypUDwsyu+hn/NnmVA==",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
"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.218.0",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.219.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.65.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.65.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.15.2",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.15.2",
"pg": "^8.23.0",
"pg": "^8.23.0",
@@ -409,7 +409,10 @@ const DEFAULT_GRANTS = [
@@ -409,7 +409,10 @@ const DEFAULT_GRANTS = [
['probe', 'games.mod.manage', 'openvibe.games', []],
['probe', 'games.mod.manage', 'openvibe.games', []],
// Wave 20: the Codes portal relays its release events.
// Wave 20: the Codes portal relays its release events.
['services', 'events.event.publish', 'openvibe.events', []],
['services', 'events.event.publish', 'openvibe.events', []],
- ['ai', 'events.event.publish', 'openvibe.events', []], // ai.run.* (AI server/events.js, 2026-09-24)
+ ['ai', 'events.event.publish', 'openvibe.events', []],
+ // AI on your own machines (contracts 0.219.0): a person's own model, on their own machine through its OpenVibe Node,
+ // for that person's runs only (Bot checks the owner and their switch, "Let my AI use this computer's models").
+ ['ai', 'bot.machine.ai', 'openvibe.bot', []], // ai.run.* (AI server/events.js, 2026-09-24)
// Wave 13: Live's AI features run as OpenVibe.AI workflows (AI_SERVICE=remote in live.env).
// Wave 13: Live's AI features run as OpenVibe.AI workflows (AI_SERVICE=remote in live.env).
// Live runs its own live.* workflows, network.site_copy as the footer-copy fallback, and media.analyze
// Live runs its own live.* workflows, network.site_copy as the footer-copy fallback, and media.analyze
// (local-first VOD/clip analysis, roadmap WS-O task 5) (OpenVibe.AI fails closed on a token with no ns).
// (local-first VOD/clip analysis, roadmap WS-O task 5) (OpenVibe.AI fails closed on a token with no ns).
new file mode 100644
new file mode 100644
@@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
+/**
+ * OpenVibe.AI's grant on OpenVibe.Bot for AI on your own machines (contracts 0.219.0): it runs a model on a person's
+ * own machine for that person (bot.machine.ai, audience openvibe.bot), and nothing else of Bot's computer control.
+ *
+ * node test/ai-machine-grant.test.js
+ */
+'use strict';
+const assert = require('assert');
+const contracts = require('openvibe-contracts');
+const principals = require('../server/identity/principals');
+
+const onBot = principals.DEFAULT_GRANTS.filter((g) => g[0] === 'ai' && g[2] === 'openvibe.bot').map((g) => g[1]);
+assert.deepStrictEqual(onBot, ['bot.machine.ai'], 'ai holds bot.machine.ai on Bot, and no computer control');
+const cap = contracts.capabilities.get('bot.machine.ai');
+assert.ok(cap && cap.status === 'active', 'bot.machine.ai is an active capability in the pinned contracts');
+console.log('ai machine grant: ok');