openvibers/openvibe.vision Commits

/.well-known/agent.json: what this site serves, for agents (SEO-2) (#76)

OP OpenVibers committed 10 days ago · 1809f80d1e · 3 files, +37 −0

It answered 404. The shared agent layer serves server/agent-descriptor.js: the site's
purpose (its llms.txt summary), its API, docs and MCP where it has them, and its auth.

Changes

ddiff --git a/server/agent-descriptor.js b/server/agent-descriptor.js
nnew file mode 100644
iindex 0000000..d462f71
---- /dev/null
++++ b/server/agent-descriptor.js
@@@ -0,0 +1,16 @@
++'use strict';
++// What OpenVibe.Vision tells an agent about itself (openvibe-shared/agent-layer): /.well-known/agent.json (SEO-2).
++// Every field is something this site really serves; the purpose is its own llms.txt summary.
++module.exports = {
++ id: "vision",
++ name: "OpenVibe.Vision",
++ purpose: "Answers questions about a picture, reads text locally and checks UI faults. Face features that identify a person each need that person's consent.",
++ home: "https://openvibe.vision",
++ site: "openvibe.vision",
++ api: "/api/v1",
++ docs: "/developers",
++ mcp: { url: "/mcp" },
++ policy: {
++ auth: ["none", "Network OIDC"],
++ },
++};
ddiff --git a/server/app.js b/server/app.js
iindex 2b3a813..e16ed5a 100644
---- a/server/app.js
++++ b/server/app.js
@@@ -92,6 +92,8 @@ async function createApp(opts = {}) {
const ctx = { config, s, keys, sso, principal, store, ocr, ai, vision, faces, faceLibraries, consentRegistry, models, networkTools, accountData, accountSend, eventOutbox, eventPublisher, log, fetchImpl };
const app = express();
++ // /.well-known/agent.json (openvibe-shared/agent-layer, SEO-2): what this site serves, for agents.
++ require('openvibe-shared/agent-layer').mount(app, { descriptor: require('./agent-descriptor') });
app.disable('x-powered-by');
app.set('trust proxy', config.trustProxy);
const release = require('openvibe-shared/release').createRelease({ service: 'vision', root: path.join(__dirname, '..') });
ddiff --git a/test/agent-json.test.js b/test/agent-json.test.js
nnew file mode 100644
iindex 0000000..f613093
---- /dev/null
++++ b/test/agent-json.test.js
@@@ -0,0 +1,19 @@
++'use strict';
++// SEO-2: /.well-known/agent.json answered 404 here (11-03 check of all 55 sites). The shared agent layer serves this
++// site's descriptor; every field is something it really serves.
++const assert = require('assert');
++const fs = require('fs');
++const path = require('path');
++const descriptor = require('../server/agent-descriptor');
++const { agentManifest } = require('openvibe-shared/agent-layer');
++
++const m = agentManifest(descriptor);
++assert.strictEqual(m.network, 'OpenVibe');
++assert.strictEqual(m.home, 'https://openvibe.vision');
++assert.ok(m.purpose && m.purpose.length > 40, 'a purpose');
++assert.ok(/^https:\/\//.test(m.api), 'its API, absolute');
++assert.strictEqual(m.llms, 'https://openvibe.vision/llms.txt');
++assert.ok(Array.isArray(m.policy.auth) && m.policy.auth.length, 'how it is called');
++const app = fs.readFileSync(path.join(__dirname, '..', 'server', 'app.js'), 'utf8');
++assert.match(app, /require\('openvibe-shared\/agent-layer'\)\.mount\(app, \{ descriptor: require\('\.\/agent-descriptor'\) \}\);/);
++console.log('agent.json: ok');