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)

OP OpenVibers committed 17 days ago · f937a6200c · 6 files, +27 −8

Changes

ddiff --git a/README.md b/README.md
iindex 0b65b612..1ea98d38 100644
---- a/README.md
++++ b/README.md
@@@ -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 (PostgreSQL
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`
workflow), OpenVibe.Blog (the changelog feed it proxies)
ddiff --git a/STATUS.json b/STATUS.json
iindex 55d4a6a8..92d0e9e2 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -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": [
ddiff --git a/package-lock.json b/package-lock.json
iindex b1da704a..6eab8bdb 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -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",
ddiff --git a/package.json b/package.json
iindex 7ab88194..62f8a99c 100644
---- a/package.json
++++ b/package.json
@@@ -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",
ddiff --git a/server/identity/principals.js b/server/identity/principals.js
iindex 13ea7207..032076bf 100644
---- a/server/identity/principals.js
++++ b/server/identity/principals.js
@@@ -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).
ddiff --git a/test/ai-machine-grant.test.js b/test/ai-machine-grant.test.js
nnew file mode 100644
iindex 00000000..d6278c22
---- /dev/null
++++ b/test/ai-machine-grant.test.js
@@@ -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');