openvibers/openvibe.search Commits
openvibe-shared v4.108.0 (was v4.107.4) (#215)
Changes
@@@ -507,5 +507,5 @@ Part of the [OpenVibe network](https://openvibe.network). Built in the open by [<!-- versions:start -->- openvibe-contracts: v0.225.0- openvibe-sdk: v0.82.0--- openvibe-shared: v4.107.4++- openvibe-shared: v4.108.0<!-- versions:end -->@@@ -9,7 +9,7 @@"domain": "search.openvibe.network (vhost in deploy/nginx; the service manifest records the search page and query API as public since 2026-09-23)","contracts": "openvibe-contracts v0.225.0","sdk": "openvibe-sdk v0.82.0",-- "shared": "openvibe-shared v4.107.4",++ "shared": "openvibe-shared v4.108.0","capabilities": ["search.document.write","search.query.delegate",@@@ -15,7 +15,7 @@"express": "^4.21.2","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.225.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"},"devDependencies": {@@@ -1069,9 +1069,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",@@@ -27,7 +27,7 @@"express": "^4.21.2","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.225.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"},"engines": {@@@ -126,25 +126,27 @@ function llmsTxt(origin) {return seo.llmsTxt({name: SITE_NAME,summary: `The search service of the OpenVibe network: one permission-aware index over what the network's services have published. ${SITE_DESCRIPTION}`,-- details: 'The index holds only what the services have sent so far (Alpha: it is young). Anonymous callers see public, published, indexable documents only; a browser with an ov_token cookie also gets that person\'s own restricted matches. Private, draft and deleted documents are never listed or returned, and a document that is removed or made private leaves the results at once. Result pages are noindex; this file lists pages and public endpoints only, never a person\'s saved searches or the owner API.',++ details: 'The index holds only what the services have sent so far (Alpha: it is young). Anonymous callers see public, published, indexable documents only; a browser with an ov_token cookie also gets that person\'s own restricted matches. Private, draft and deleted documents are never listed or returned, and a document that is removed or made private leaves the results at once. Result pages are noindex; this file lists pages and public endpoints only, never a person\'s saved searches or the owner API. MCP server: POST https://search.openvibe.network/mcp (JSON-RPC 2.0): agents call openvibe_search and openvibe_search_providers.',++ markdown: true,++ base: origin,sections: [{ title: 'Pages', links: [{ title: 'Search', url: `${origin}/`, note: 'the search page; ?q= and ?owner=/?type= search, results are noindex' },-- { title: 'What shipped', url: `${origin}/updates`, note: "the site's update log" },] },-- { title: 'Machine-readable', links: [++ // A JSON API is what an agent came for, not something to skip (AGT-5 review).++ { title: 'API', links: [{ title: 'Search API', url: `${origin}/api/v1/search?q=`, note: 'JSON results; anonymous = public documents only' },-- { title: 'MCP endpoint', url: `${origin}/mcp`, note: 'Streamable HTTP MCP (JSON-RPC 2.0): agents call openvibe_search and openvibe_search_providers' },{ title: 'Suggest API', url: `${origin}/api/v1/suggest?q=`, note: 'title suggestions (JSON)' },-- { title: 'Sitemap', url: `${origin}/sitemap.xml` },-- { title: 'robots.txt', url: `${origin}/robots.txt` },-- { title: 'Release', url: `${origin}/release.json`, note: 'the deployed release manifest (JSON)' },-- ] },-- { title: 'The network', links: [-- { title: 'OpenVibe.Network', url: 'https://openvibe.network/', note: 'accounts and the network directory' },-- { title: 'Source', url: 'https://github.com/OpenVibers/OpenVibe.Search' },] },],++ optional: [++ { title: 'What shipped', url: `${origin}/updates`, note: "the site's update log" },++ { title: 'Sitemap', url: `${origin}/sitemap.xml` },++ { title: 'robots.txt', url: `${origin}/robots.txt` },++ { title: 'Release', url: `${origin}/release.json`, note: 'the deployed release manifest (JSON)' },++ { title: 'OpenVibe.Network', url: 'https://openvibe.network/', note: 'accounts and the network directory' },++ { title: 'Source', url: 'https://github.com/OpenVibers/OpenVibe.Search' },++ ],});}@@@ -30,10 +30,12 @@ t('GET /llms.txt: what the site is, its public pages and its public endpoints, cassert.match(r.headers.get('content-type'), /text\/plain/);assert.strictEqual(r.headers.get('cache-control'), 'public, max-age=3600, stale-while-revalidate=3600');assert.match(r.text, /^# OpenVibe\.Search/m);-- assert.ok(r.text.includes(`- [Search](${origin()}/)`), 'the front page');-- assert.ok(r.text.includes(`(${origin()}/updates)`), 'the update log');++ assert.ok(r.text.includes(`- [Search](${origin()}/index.md)`), 'the front page');++ assert.ok(r.text.includes(`(${origin()}/updates.md)`), 'the update log');assert.ok(r.text.includes(`(${origin()}/api/v1/search?q=)`), 'the public query API');assert.ok(r.text.includes(`(${origin()}/sitemap.xml)`));++ assert.ok(r.text.includes('\n## Optional\n'), 'llms.txt has an Optional section');++ assert.ok(r.text.includes('MCP server: POST https://search.openvibe.network/mcp (JSON-RPC 2.0)'), 'MCP endpoint is folded into the note');// Nothing private or per-user: no saved searches, no owner API, no Events webhook.assert.ok(!/saved-searches|\/api\/v1\/owners|\/internal\/events/.test(r.text));});
@@ -507,5 +507,5 @@ Part of the [OpenVibe network](https://openvibe.network). Built in the open by [
@@ -507,5 +507,5 @@ Part of the [OpenVibe network](https://openvibe.network). Built in the open by [
<!-- versions:start -->
<!-- versions:start -->
- openvibe-contracts: v0.225.0
- openvibe-contracts: v0.225.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 -->
@@ -9,7 +9,7 @@
@@ -9,7 +9,7 @@
"domain": "search.openvibe.network (vhost in deploy/nginx; the service manifest records the search page and query API as public since 2026-09-23)",
"domain": "search.openvibe.network (vhost in deploy/nginx; the service manifest records the search page and query API as public since 2026-09-23)",
"contracts": "openvibe-contracts v0.225.0",
"contracts": "openvibe-contracts v0.225.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",
"capabilities": [
"capabilities": [
"search.document.write",
"search.document.write",
"search.query.delegate",
"search.query.delegate",
@@ -15,7 +15,7 @@
@@ -15,7 +15,7 @@
"express": "^4.21.2",
"express": "^4.21.2",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.225.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.225.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"
},
},
"devDependencies": {
"devDependencies": {
@@ -1069,9 +1069,9 @@
@@ -1069,9 +1069,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",
@@ -27,7 +27,7 @@
@@ -27,7 +27,7 @@
"express": "^4.21.2",
"express": "^4.21.2",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.225.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.225.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"
},
},
"engines": {
"engines": {
@@ -126,25 +126,27 @@ function llmsTxt(origin) {
@@ -126,25 +126,27 @@ function llmsTxt(origin) {
return seo.llmsTxt({
return seo.llmsTxt({
name: SITE_NAME,
name: SITE_NAME,
summary: `The search service of the OpenVibe network: one permission-aware index over what the network's services have published. ${SITE_DESCRIPTION}`,
summary: `The search service of the OpenVibe network: one permission-aware index over what the network's services have published. ${SITE_DESCRIPTION}`,
- details: 'The index holds only what the services have sent so far (Alpha: it is young). Anonymous callers see public, published, indexable documents only; a browser with an ov_token cookie also gets that person\'s own restricted matches. Private, draft and deleted documents are never listed or returned, and a document that is removed or made private leaves the results at once. Result pages are noindex; this file lists pages and public endpoints only, never a person\'s saved searches or the owner API.',
+ details: 'The index holds only what the services have sent so far (Alpha: it is young). Anonymous callers see public, published, indexable documents only; a browser with an ov_token cookie also gets that person\'s own restricted matches. Private, draft and deleted documents are never listed or returned, and a document that is removed or made private leaves the results at once. Result pages are noindex; this file lists pages and public endpoints only, never a person\'s saved searches or the owner API. MCP server: POST https://search.openvibe.network/mcp (JSON-RPC 2.0): agents call openvibe_search and openvibe_search_providers.',
+ markdown: true,
+ base: origin,
sections: [
sections: [
{ title: 'Pages', links: [
{ title: 'Pages', links: [
{ title: 'Search', url: `${origin}/`, note: 'the search page; ?q= and ?owner=/?type= search, results are noindex' },
{ title: 'Search', url: `${origin}/`, note: 'the search page; ?q= and ?owner=/?type= search, results are noindex' },
- { title: 'What shipped', url: `${origin}/updates`, note: "the site's update log" },
] },
] },
- { title: 'Machine-readable', links: [
+ // A JSON API is what an agent came for, not something to skip (AGT-5 review).
+ { title: 'API', links: [
{ title: 'Search API', url: `${origin}/api/v1/search?q=`, note: 'JSON results; anonymous = public documents only' },
{ title: 'Search API', url: `${origin}/api/v1/search?q=`, note: 'JSON results; anonymous = public documents only' },
- { title: 'MCP endpoint', url: `${origin}/mcp`, note: 'Streamable HTTP MCP (JSON-RPC 2.0): agents call openvibe_search and openvibe_search_providers' },
{ title: 'Suggest API', url: `${origin}/api/v1/suggest?q=`, note: 'title suggestions (JSON)' },
{ title: 'Suggest API', url: `${origin}/api/v1/suggest?q=`, note: 'title suggestions (JSON)' },
- { title: 'Sitemap', url: `${origin}/sitemap.xml` },
- { title: 'robots.txt', url: `${origin}/robots.txt` },
- { title: 'Release', url: `${origin}/release.json`, note: 'the deployed release manifest (JSON)' },
- ] },
- { title: 'The network', links: [
- { title: 'OpenVibe.Network', url: 'https://openvibe.network/', note: 'accounts and the network directory' },
- { title: 'Source', url: 'https://github.com/OpenVibers/OpenVibe.Search' },
] },
] },
],
],
+ optional: [
+ { title: 'What shipped', url: `${origin}/updates`, note: "the site's update log" },
+ { title: 'Sitemap', url: `${origin}/sitemap.xml` },
+ { title: 'robots.txt', url: `${origin}/robots.txt` },
+ { title: 'Release', url: `${origin}/release.json`, note: 'the deployed release manifest (JSON)' },
+ { title: 'OpenVibe.Network', url: 'https://openvibe.network/', note: 'accounts and the network directory' },
+ { title: 'Source', url: 'https://github.com/OpenVibers/OpenVibe.Search' },
+ ],
});
});
}
}
@@ -30,10 +30,12 @@ t('GET /llms.txt: what the site is, its public pages and its public endpoints, c
@@ -30,10 +30,12 @@ t('GET /llms.txt: what the site is, its public pages and its public endpoints, c
assert.match(r.headers.get('content-type'), /text\/plain/);
assert.match(r.headers.get('content-type'), /text\/plain/);
assert.strictEqual(r.headers.get('cache-control'), 'public, max-age=3600, stale-while-revalidate=3600');
assert.strictEqual(r.headers.get('cache-control'), 'public, max-age=3600, stale-while-revalidate=3600');
assert.match(r.text, /^# OpenVibe\.Search/m);
assert.match(r.text, /^# OpenVibe\.Search/m);
- assert.ok(r.text.includes(`- [Search](${origin()}/)`), 'the front page');
- assert.ok(r.text.includes(`(${origin()}/updates)`), 'the update log');
+ assert.ok(r.text.includes(`- [Search](${origin()}/index.md)`), 'the front page');
+ assert.ok(r.text.includes(`(${origin()}/updates.md)`), 'the update log');
assert.ok(r.text.includes(`(${origin()}/api/v1/search?q=)`), 'the public query API');
assert.ok(r.text.includes(`(${origin()}/api/v1/search?q=)`), 'the public query API');
assert.ok(r.text.includes(`(${origin()}/sitemap.xml)`));
assert.ok(r.text.includes(`(${origin()}/sitemap.xml)`));
+ assert.ok(r.text.includes('\n## Optional\n'), 'llms.txt has an Optional section');
+ assert.ok(r.text.includes('MCP server: POST https://search.openvibe.network/mcp (JSON-RPC 2.0)'), 'MCP endpoint is folded into the note');
// Nothing private or per-user: no saved searches, no owner API, no Events webhook.
// Nothing private or per-user: no saved searches, no owner API, no Events webhook.
assert.ok(!/saved-searches|\/api\/v1\/owners|\/internal\/events/.test(r.text));
assert.ok(!/saved-searches|\/api\/v1\/owners|\/internal\/events/.test(r.text));
});
});