openvibers/openvibe.chat Commits

AI text may describe people; only sex acts and porn stay gated (#274)

OP OpenVibers committed 12 days ago · 2b025babf0 · 6 files, +26 −8

Changes

ddiff --git a/README.md b/README.md
iindex a630534..e61bcc7 100644
---- a/README.md
++++ b/README.md
@@@ -969,6 +969,6 @@ Part of the [OpenVibe network](https://openvibe.network). Built in the open by [
<!-- versions:start -->
- openvibe-contracts: v0.222.0
--- openvibe-sdk: v0.74.0
++- openvibe-sdk: v0.77.0
- openvibe-shared: v4.67.0
<!-- versions:end -->
ddiff --git a/STATUS.json b/STATUS.json
iindex cf0113d..5d215cc 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -8,7 +8,7 @@
"port": 4400,
"domain": "openvibe.chat (Chat's own site: global chat, messages, rooms, settings; the service manifest records it live since 2026-09-24) and openvibe.live (/ws/chat, /api/chat/, /api/dm/, /api/tts/, /api/sounds via an nginx include in openvibe.live's vhost)",
"contracts": "openvibe-contracts v0.222.0",
-- "sdk": "openvibe-sdk v0.74.0",
++ "sdk": "openvibe-sdk v0.77.0",
"shared": "openvibe-shared v4.67.0",
"capabilities": [
"chat.message.send",
ddiff --git a/package-lock.json b/package-lock.json
iindex a263656..fbd7cd4 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -17,7 +17,7 @@
"iovalkey": "^0.4.0",
"multer": "^2.0.2",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.222.0",
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.74.0",
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.77.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.67.0",
"pg": "^8.23.0",
"ws": "^8.18.0"
@@@ -1311,9 +1311,9 @@
}
},
"node_modules/openvibe-sdk": {
-- "version": "0.74.0",
-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.74.0",
-- "integrity": "sha512-DO9KVPnUriY/I4lX6ZEJtXaUvRDbJyqnqJxvlpl+zkNGFILpmuBXVJogNOCfK071Qci1gg7C4Iw1Xrseklcajg==",
++ "version": "0.77.0",
++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.77.0",
++ "integrity": "sha512-bFjW3E4LGh1XAtZjC0x01skHXWwT6iaT/31uTIt2TmSMua1YmH/P23uTuI8Tqkm7o0mGvmOglUpietPo4JHRzQ==",
"license": "MIT",
"bin": {
"openvibe-download": "bin/openvibe-download.js"
ddiff --git a/package.json b/package.json
iindex c5162fe..7230d08 100644
---- a/package.json
++++ b/package.json
@@@ -29,7 +29,7 @@
"iovalkey": "^0.4.0",
"multer": "^2.0.2",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.222.0",
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.74.0",
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.77.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.67.0",
"pg": "^8.23.0",
"ws": "^8.18.0"
ddiff --git a/server/rooms/ai-members.js b/server/rooms/ai-members.js
iindex 498e8fb..d7b75b2 100644
---- a/server/rooms/ai-members.js
++++ b/server/rooms/ai-members.js
@@@ -244,7 +244,7 @@ function vibePrompt(member, askedBy, memory = null, { now = Date.now(), timezone
'- OpenVibe first: for jobs call search_openvibe with owner "work", deals "deals", recipes and food "food", rentals "rent", help "help", quests "quest", videos and streams "live", OpenVibe tools "tools". Add freshness when it is about today, this week or the latest. Go to web_search only when that returns nothing useful, or when they ask for the wider web.',
'- When OpenVibe is weak: if search_openvibe returns fewer than 3 results, or a result that misses a constraint they stated (remote, a price limit, a city, the kind of thing they asked for: a keyboard, not a game), also call web_search for the same request before you answer. Tell them which results came from OpenVibe and which came from the web, and never present a result marked matches_constraints "no" as meeting what they asked.',
'- News: OpenVibe.News has no stories yet, so for news go to web_search with freshness "day" (or "week" for a roundup) and say which web source and date each story came from; never present a recorded stream or video as today\'s news.',
-- '- When they send a picture you see it: describe what matters for their question (text in it, objects, a screenshot\'s error). Never guess who a person in it is, and never describe anyone\'s looks, body or age.',
++ '- When they send a picture you see it: describe what matters for their question (text in it, objects, a screenshot\'s error). Never guess who a person in it is.',
'- Recurring work ("every morning, find me new remote jobs"): set_up_agent makes it one of their OpenVibe Agents, run daily or weekly on their own allowance with every result on its page. First say what it would do and when, and set it up only once they agree. my_agents lists the agents they have.',
'- You cannot yet make pictures, use their computer or set reminders. Say so plainly when asked, and offer what you can do instead.',
'- The earlier messages are this conversation: build on them. Never invent facts about the person or their plans; when you do not know, say so and ask.',
ddiff --git a/test/no-looks-guard.test.js b/test/no-looks-guard.test.js
nnew file mode 100644
iindex 0000000..5587d93
---- /dev/null
++++ b/test/no-looks-guard.test.js
@@@ -0,0 +1,18 @@
++'use strict';
++// Owner, 2026-10-31: AI may describe people; only sex acts and porn stay gated. No server file may call the old
++// looks filter again.
++const assert = require('assert');
++const fs = require('fs');
++const path = require('path');
++
++const root = path.join(__dirname, '..');
++const offenders = [];
++(function walk(dir) {
++ for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
++ const p = path.join(dir, e.name);
++ if (e.isDirectory()) walk(p);
++ else if (e.name.endsWith('.js') && /\b(noLooks|noLooksTags|hasLooks)\s*\(|openvibe-sdk\/no-looks/.test(fs.readFileSync(p, 'utf8'))) offenders.push(path.relative(root, p));
++ }
++})(path.join(root, 'server'));
++assert.deepStrictEqual(offenders, [], 'no looks filter in server/');
++console.log('No looks filter: AI text describes people as written.');