openvibers/openvibe.live Commits

AI viewers: routes use the engine selector; independent name-part hashing for roster names

OP OpenVibers committed 27 Aug 2026 · d62d386958 · 2 files, +9 −4


Changes

ddiff --git a/server/ai/viewers/roster.js b/server/ai/viewers/roster.js
iindex c51806b3..bdbdcbce 100644
---- a/server/ai/viewers/roster.js
++++ b/server/ai/viewers/roster.js
@@@ -46,11 +46,14 @@ function pick(arr, salt) {
return arr[_seedCounter % arr.length];
}
++// Stable per-bot hash so each name part is chosen independently (the LCG pick() above
++// walks a shared sequence, which gave siblings near-identical names like sleepyotter42/69/99).
++function _h(str) { let h = 2166136261; for (const ch of String(str)) { h ^= ch.charCodeAt(0); h = Math.imul(h, 16777619) >>> 0; } return h >>> 0; }
function makeUsername(existing, salt) {
for (let i = 0; i < 40; i++) {
-- const adj = pick(NAME_ADJ, salt + i);
-- const noun = pick(NAME_NOUN, salt + i * 7 + 3);
-- const suf = pick(NAME_SUF, salt + i * 13 + 5);
++ const adj = NAME_ADJ[_h(`a:${salt}:${i}`) % NAME_ADJ.length];
++ const noun = NAME_NOUN[_h(`n:${salt}:${i}:${adj}`) % NAME_NOUN.length];
++ const suf = NAME_SUF[_h(`s:${salt}:${i}:${noun}`) % NAME_SUF.length];
const name = `${adj}${noun}${suf}`.slice(0, 22);
if (!existing.has(name.toLowerCase())) { existing.add(name.toLowerCase()); return name; }
}
ddiff --git a/server/ai/viewers/routes.js b/server/ai/viewers/routes.js
iindex c26a02f4..43b1c619 100644
---- a/server/ai/viewers/routes.js
++++ b/server/ai/viewers/routes.js
@@@ -18,7 +18,9 @@ const chatAi = require('../chat-ai');
const budget = require('./budget');
const roster = require('./roster');
const brain = require('./brain');
--const engine = require('./engine');
++const engine = require('./index');
++const settingsMod = require('./settings');
++const ai = require('../ai-analysis');
const router = express.Router();
const KEY_SENTINEL = '••••••••••••••••';