openvibers/openvibe.vision Commits
openvibe-shared v4.108.0 (was v4.107.4) (#80)
Changes
@@@ -279,5 +279,5 @@ Offer discovery is configured by `VISION_DEALS_SEARCH_URL` and `VISION_SHOES_SEA<!-- versions:start -->- openvibe-contracts: v0.240.0- openvibe-sdk: v0.82.0--- openvibe-shared: v4.107.4++- openvibe-shared: v4.108.0<!-- versions:end -->@@@ -10,11 +10,11 @@"domain": "openvibe.vision","contracts": "openvibe-contracts v0.240.0","sdk": "openvibe-sdk v0.82.0",-- "shared": "openvibe-shared v4.107.4",++ "shared": "openvibe-shared v4.108.0","packages": ["openvibe-contracts v0.240.0","openvibe-sdk v0.82.0",-- "openvibe-shared v4.107.4"++ "openvibe-shared v4.108.0"],"capabilities": ["vision.image.ask",@@@ -20,7 +20,7 @@"onnxruntime-node": "^1.31.1","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.240.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.82.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.107.4",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.108.0","pg": "^8.23.0","sharp": "^0.33.5"},@@@ -2669,9 +2669,9 @@}},"node_modules/openvibe-shared": {-- "version": "4.107.4",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.107.4",-- "integrity": "sha512-tThN0m3KMncEHVcBOvE+ysHjsZTlVIDLG1P+/i2Mulmxfc/AUpebAXhpWWrut50OChZ8o+HeePxsSrPI8mUQOQ==",++ "version": "4.108.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.108.0",++ "integrity": "sha512-NPzwjxpzGIpFpIm4uw3+VwHfsxbJ2+cD9yuhRzSwolSwqv2kCmwaVtHJ0DA9gKO3K8PCBfIP3UpKzpuSbYEJ+g==","license": "MIT","dependencies": {"jsonwebtoken": "^9.0.0",@@@ -30,7 +30,7 @@"onnxruntime-node": "^1.31.1","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.240.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.82.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.107.4",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.108.0","pg": "^8.23.0","sharp": "^0.33.5"},@@@ -68,6 +68,9 @@ function createDiscoveryRoutes(ctx) {res.type('text/plain').set('Cache-Control', TEXT).send(seo.llmsTxt({name: SITE_NAME,summary: 'OpenVibe.Vision answers questions about a picture, reads text locally and checks UI faults. Local face detection and blur need no identity; self verification, self search, cast tagging and library grouping each require separate consent. AI may describe people, including how they look; a stranger is never looked up.',++ // AGT-5: own pages link their Markdown twins (openvibe-shared 4.108.0); ## Optional is what an agent may skip.++ markdown: true,++ base: site,details: 'POST /api/v1/ask (multipart image, image data URL or image_url) asks a question. POST /api/v1/ocr reads text locally first. POST /api/v1/compare runs the same image through local OCR and up to three AI hints. POST /api/v1/ui-check takes html, url or a screenshot and returns findings. GET /api/v1/benchmarks aggregates compare samples without subjects. Face detection/blur are open at POST /api/v1/faces/detect and /blur; matching needs separate signed consent per purpose (verify, find, cast, library). A person is the openvibe.vision session or a Network user token; a service token needs vision.ask, vision.ocr, vision.compare, vision.ui.check or vision.face.cast.match.',sections: [{ title: 'Start here', links: [@@@ -85,16 +88,16 @@ function createDiscoveryRoutes(ctx) {{ title: 'Machine-readable', links: [{ title: 'Benchmark results (JSON)', url: abs('/api/v1/benchmarks') },{ title: 'Model hints (JSON)', url: abs('/api/v1/models') },-- { title: 'Sitemap', url: abs('/sitemap.xml') },-- { title: 'Full text for language models', url: abs('/llms-full.txt') },-- { title: 'Release metadata (JSON)', url: abs('/release.json') },-- ] },-- { title: 'Elsewhere', links: [-- { title: 'OpenVibe.AI', url: 'https://ai.openvibe.services', note: 'the routing, quotas and provenance every model answer uses' },-- { title: 'OpenVibe.Design', url: 'https://openvibe.design', note: 'the Arena that calls the UI check' },-- { title: 'OpenVibe.Network', url: 'https://openvibe.network', note: 'accounts, tokens and staff roles' },] },],++ optional: [++ { title: 'Sitemap', url: abs('/sitemap.xml') },++ { title: 'Full text for language models', url: abs('/llms-full.txt') },++ { title: 'Release metadata (JSON)', url: abs('/release.json') },++ { title: 'OpenVibe.AI', url: 'https://ai.openvibe.services', note: 'the routing, quotas and provenance every model answer uses' },++ { title: 'OpenVibe.Design', url: 'https://openvibe.design', note: 'the Arena that calls the UI check' },++ { title: 'OpenVibe.Network', url: 'https://openvibe.network', note: 'accounts, tokens and staff roles' },++ ],}));});@@@ -124,6 +124,10 @@ const PLANTED = '<style>body{background:#fff;color:#999}.wide{width:1600px}</styassert.ok(llms.text.includes('OpenVibe.Vision'));assert.match(llms.text, /separate consent/);assert.doesNotMatch(llms.text, /No face recognition/);++ // AGT-5: own pages at their Markdown twins, the API as it is, ## Optional last.++ assert.ok(llms.text.includes('(https://openvibe.vision/index.md)') && llms.text.includes('(https://openvibe.vision/people/privacy.md)'));++ assert.ok(llms.text.includes('(https://openvibe.vision/api/v1/models)') && llms.text.includes('(https://openvibe.vision/sitemap.xml)'));++ assert.ok(llms.text.includes('\n## Optional\n') && llms.text.lastIndexOf('\n## ') === llms.text.indexOf('\n## Optional\n'), 'Optional is last');});} finally {await t.close();
@@ -279,5 +279,5 @@ Offer discovery is configured by `VISION_DEALS_SEARCH_URL` and `VISION_SHOES_SEA
@@ -279,5 +279,5 @@ Offer discovery is configured by `VISION_DEALS_SEARCH_URL` and `VISION_SHOES_SEA
<!-- versions:start -->
<!-- versions:start -->
- openvibe-contracts: v0.240.0
- openvibe-contracts: v0.240.0
- openvibe-sdk: v0.82.0
- openvibe-sdk: v0.82.0
-- openvibe-shared: v4.107.4
+- openvibe-shared: v4.108.0
<!-- versions:end -->
<!-- versions:end -->
@@ -10,11 +10,11 @@
@@ -10,11 +10,11 @@
"domain": "openvibe.vision",
"domain": "openvibe.vision",
"contracts": "openvibe-contracts v0.240.0",
"contracts": "openvibe-contracts v0.240.0",
"sdk": "openvibe-sdk v0.82.0",
"sdk": "openvibe-sdk v0.82.0",
- "shared": "openvibe-shared v4.107.4",
+ "shared": "openvibe-shared v4.108.0",
"packages": [
"packages": [
"openvibe-contracts v0.240.0",
"openvibe-contracts v0.240.0",
"openvibe-sdk v0.82.0",
"openvibe-sdk v0.82.0",
- "openvibe-shared v4.107.4"
+ "openvibe-shared v4.108.0"
],
],
"capabilities": [
"capabilities": [
"vision.image.ask",
"vision.image.ask",
@@ -20,7 +20,7 @@
@@ -20,7 +20,7 @@
"onnxruntime-node": "^1.31.1",
"onnxruntime-node": "^1.31.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.240.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.240.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.82.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.82.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.107.4",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.108.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
"sharp": "^0.33.5"
"sharp": "^0.33.5"
},
},
@@ -2669,9 +2669,9 @@
@@ -2669,9 +2669,9 @@
}
}
},
},
"node_modules/openvibe-shared": {
"node_modules/openvibe-shared": {
- "version": "4.107.4",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.107.4",
- "integrity": "sha512-tThN0m3KMncEHVcBOvE+ysHjsZTlVIDLG1P+/i2Mulmxfc/AUpebAXhpWWrut50OChZ8o+HeePxsSrPI8mUQOQ==",
+ "version": "4.108.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.108.0",
+ "integrity": "sha512-NPzwjxpzGIpFpIm4uw3+VwHfsxbJ2+cD9yuhRzSwolSwqv2kCmwaVtHJ0DA9gKO3K8PCBfIP3UpKzpuSbYEJ+g==",
"license": "MIT",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
@@ -30,7 +30,7 @@
@@ -30,7 +30,7 @@
"onnxruntime-node": "^1.31.1",
"onnxruntime-node": "^1.31.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.240.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.240.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.82.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.82.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.107.4",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.108.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
"sharp": "^0.33.5"
"sharp": "^0.33.5"
},
},
@@ -68,6 +68,9 @@ function createDiscoveryRoutes(ctx) {
@@ -68,6 +68,9 @@ function createDiscoveryRoutes(ctx) {
res.type('text/plain').set('Cache-Control', TEXT).send(seo.llmsTxt({
res.type('text/plain').set('Cache-Control', TEXT).send(seo.llmsTxt({
name: SITE_NAME,
name: SITE_NAME,
summary: 'OpenVibe.Vision answers questions about a picture, reads text locally and checks UI faults. Local face detection and blur need no identity; self verification, self search, cast tagging and library grouping each require separate consent. AI may describe people, including how they look; a stranger is never looked up.',
summary: 'OpenVibe.Vision answers questions about a picture, reads text locally and checks UI faults. Local face detection and blur need no identity; self verification, self search, cast tagging and library grouping each require separate consent. AI may describe people, including how they look; a stranger is never looked up.',
+ // AGT-5: own pages link their Markdown twins (openvibe-shared 4.108.0); ## Optional is what an agent may skip.
+ markdown: true,
+ base: site,
details: 'POST /api/v1/ask (multipart image, image data URL or image_url) asks a question. POST /api/v1/ocr reads text locally first. POST /api/v1/compare runs the same image through local OCR and up to three AI hints. POST /api/v1/ui-check takes html, url or a screenshot and returns findings. GET /api/v1/benchmarks aggregates compare samples without subjects. Face detection/blur are open at POST /api/v1/faces/detect and /blur; matching needs separate signed consent per purpose (verify, find, cast, library). A person is the openvibe.vision session or a Network user token; a service token needs vision.ask, vision.ocr, vision.compare, vision.ui.check or vision.face.cast.match.',
details: 'POST /api/v1/ask (multipart image, image data URL or image_url) asks a question. POST /api/v1/ocr reads text locally first. POST /api/v1/compare runs the same image through local OCR and up to three AI hints. POST /api/v1/ui-check takes html, url or a screenshot and returns findings. GET /api/v1/benchmarks aggregates compare samples without subjects. Face detection/blur are open at POST /api/v1/faces/detect and /blur; matching needs separate signed consent per purpose (verify, find, cast, library). A person is the openvibe.vision session or a Network user token; a service token needs vision.ask, vision.ocr, vision.compare, vision.ui.check or vision.face.cast.match.',
sections: [
sections: [
{ title: 'Start here', links: [
{ title: 'Start here', links: [
@@ -85,16 +88,16 @@ function createDiscoveryRoutes(ctx) {
@@ -85,16 +88,16 @@ function createDiscoveryRoutes(ctx) {
{ title: 'Machine-readable', links: [
{ title: 'Machine-readable', links: [
{ title: 'Benchmark results (JSON)', url: abs('/api/v1/benchmarks') },
{ title: 'Benchmark results (JSON)', url: abs('/api/v1/benchmarks') },
{ title: 'Model hints (JSON)', url: abs('/api/v1/models') },
{ title: 'Model hints (JSON)', url: abs('/api/v1/models') },
- { title: 'Sitemap', url: abs('/sitemap.xml') },
- { title: 'Full text for language models', url: abs('/llms-full.txt') },
- { title: 'Release metadata (JSON)', url: abs('/release.json') },
- ] },
- { title: 'Elsewhere', links: [
- { title: 'OpenVibe.AI', url: 'https://ai.openvibe.services', note: 'the routing, quotas and provenance every model answer uses' },
- { title: 'OpenVibe.Design', url: 'https://openvibe.design', note: 'the Arena that calls the UI check' },
- { title: 'OpenVibe.Network', url: 'https://openvibe.network', note: 'accounts, tokens and staff roles' },
] },
] },
],
],
+ optional: [
+ { title: 'Sitemap', url: abs('/sitemap.xml') },
+ { title: 'Full text for language models', url: abs('/llms-full.txt') },
+ { title: 'Release metadata (JSON)', url: abs('/release.json') },
+ { title: 'OpenVibe.AI', url: 'https://ai.openvibe.services', note: 'the routing, quotas and provenance every model answer uses' },
+ { title: 'OpenVibe.Design', url: 'https://openvibe.design', note: 'the Arena that calls the UI check' },
+ { title: 'OpenVibe.Network', url: 'https://openvibe.network', note: 'accounts, tokens and staff roles' },
+ ],
}));
}));
});
});
@@ -124,6 +124,10 @@ const PLANTED = '<style>body{background:#fff;color:#999}.wide{width:1600px}</sty
@@ -124,6 +124,10 @@ const PLANTED = '<style>body{background:#fff;color:#999}.wide{width:1600px}</sty
assert.ok(llms.text.includes('OpenVibe.Vision'));
assert.ok(llms.text.includes('OpenVibe.Vision'));
assert.match(llms.text, /separate consent/);
assert.match(llms.text, /separate consent/);
assert.doesNotMatch(llms.text, /No face recognition/);
assert.doesNotMatch(llms.text, /No face recognition/);
+ // AGT-5: own pages at their Markdown twins, the API as it is, ## Optional last.
+ assert.ok(llms.text.includes('(https://openvibe.vision/index.md)') && llms.text.includes('(https://openvibe.vision/people/privacy.md)'));
+ assert.ok(llms.text.includes('(https://openvibe.vision/api/v1/models)') && llms.text.includes('(https://openvibe.vision/sitemap.xml)'));
+ assert.ok(llms.text.includes('\n## Optional\n') && llms.text.lastIndexOf('\n## ') === llms.text.indexOf('\n## Optional\n'), 'Optional is last');
});
});
} finally {
} finally {
await t.close();
await t.close();