openvibers/openvibe.casino Commits
openvibe-shared v4.108.0 (was v4.107.4) (#45)
Changes
@@@ -69,5 +69,5 @@ AGPL-3.0-only.<!-- versions:start -->- openvibe-contracts: v0.264.0- openvibe-sdk: v0.82.0--- openvibe-shared: v4.107.4++- openvibe-shared: v4.108.0<!-- versions:end -->@@@ -10,11 +10,11 @@"domain": "openvibe.casino","contracts": "openvibe-contracts v0.264.0","sdk": "openvibe-sdk v0.82.0",-- "shared": "openvibe-shared v4.107.4",++ "shared": "openvibe-shared v4.108.0","packages": ["openvibe-contracts v0.264.0","openvibe-sdk v0.82.0",-- "openvibe-shared v4.107.4"++ "openvibe-shared v4.108.0"],"summary": "Five open engines (blackjack, roulette, baccarat, craps, slots) with exact or checked house edges, playable tables, Learn explainers built on the engines, a Web Worker simulator with shareable runs, and an open API. No real money; an 18+ gate and play-safe lines throughout.","works": [@@@ -17,7 +17,7 @@"iovalkey": "^0.4.0","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.264.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": {@@@ -1198,9 +1198,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",@@@ -24,7 +24,7 @@"iovalkey": "^0.4.0","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.264.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": {@@@ -61,19 +61,24 @@ function createDiscoveryRoutes(ctx) {});r.get('/llms.txt', (_req, res) => {++ // AGT-5: own pages link their Markdown twins (openvibe-shared 4.108.0); ## Optional is what an agent may skip.res.type('text/plain').set('Cache-Control', TEXT).send(seo.llmsTxt({name: SITE_NAME,summary: DESCRIPTION,++ markdown: true,++ base: site,details: 'GET /api/v1/games lists every game, its rules and each bet\'s house edge (exact where the maths allows, simulated for blackjack strategies) with the published source. POST /api/v1/simulate runs a bounded simulation. Play chips are free, reset daily and are worth nothing; nothing is bought or cashed out.',sections: [{ title: 'Start here', links: pages.map((p) => ({ title: p.title, url: abs(p.path), note: p.text })) },{ title: 'Machine-readable', links: [{ title: 'Games and house edges (JSON)', url: abs('/api/v1/games') },{ title: 'OpenAPI', url: abs('/api/v1/openapi.json') },-- { title: 'Sitemap', url: abs('/sitemap.xml') },-- { title: 'Full text for language models', url: abs('/llms-full.txt') },] },],++ optional: [++ { title: 'Sitemap', url: abs('/sitemap.xml') },++ { title: 'Full text for language models', url: abs('/llms-full.txt') },++ ],}));});@@@ -80,6 +80,13 @@ const games = require('../engine/games');const map = await t.get('/sitemap.xml');for (const g of games.catalogue()) assert.ok(map.text.includes(`/learn/${g.id}</loc>`) && map.text.includes(`/play/${g.id}</loc>`), g.id);assert.match((await t.get('/robots.txt')).text, /Disallow: \/s\//);++ // AGT-5: llms.txt links each page at its Markdown twin, the API and files as they are, ## Optional last.++ const llms = (await t.get('/llms.txt')).text;++ assert.match(llms, /\(https?:\/\/[^)]*\/index\.md\)/, 'the home links its twin');++ assert.match(llms, /\(https?:\/\/[^)]*\/learn\/blackjack\.md\)/);++ assert.match(llms, /\(https?:\/\/[^)]*\/api\/v1\/openapi\.json\)/);++ assert.ok(llms.includes('\n## Optional\n') && llms.lastIndexOf('\n## ') === llms.indexOf('\n## Optional\n'), 'Optional is last');++ assert.strictEqual((await t.get('/learn/blackjack.md')).status, 200, 'a twin it links answers');});} finally { await t.close(); }done();
@@ -69,5 +69,5 @@ AGPL-3.0-only.
@@ -69,5 +69,5 @@ AGPL-3.0-only.
<!-- versions:start -->
<!-- versions:start -->
- openvibe-contracts: v0.264.0
- openvibe-contracts: v0.264.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.casino",
"domain": "openvibe.casino",
"contracts": "openvibe-contracts v0.264.0",
"contracts": "openvibe-contracts v0.264.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.264.0",
"openvibe-contracts v0.264.0",
"openvibe-sdk v0.82.0",
"openvibe-sdk v0.82.0",
- "openvibe-shared v4.107.4"
+ "openvibe-shared v4.108.0"
],
],
"summary": "Five open engines (blackjack, roulette, baccarat, craps, slots) with exact or checked house edges, playable tables, Learn explainers built on the engines, a Web Worker simulator with shareable runs, and an open API. No real money; an 18+ gate and play-safe lines throughout.",
"summary": "Five open engines (blackjack, roulette, baccarat, craps, slots) with exact or checked house edges, playable tables, Learn explainers built on the engines, a Web Worker simulator with shareable runs, and an open API. No real money; an 18+ gate and play-safe lines throughout.",
"works": [
"works": [
@@ -17,7 +17,7 @@
@@ -17,7 +17,7 @@
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.264.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.264.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": {
@@ -1198,9 +1198,9 @@
@@ -1198,9 +1198,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",
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.264.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.264.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": {
@@ -61,19 +61,24 @@ function createDiscoveryRoutes(ctx) {
@@ -61,19 +61,24 @@ function createDiscoveryRoutes(ctx) {
});
});
r.get('/llms.txt', (_req, res) => {
r.get('/llms.txt', (_req, res) => {
+ // AGT-5: own pages link their Markdown twins (openvibe-shared 4.108.0); ## Optional is what an agent may skip.
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: DESCRIPTION,
summary: DESCRIPTION,
+ markdown: true,
+ base: site,
details: 'GET /api/v1/games lists every game, its rules and each bet\'s house edge (exact where the maths allows, simulated for blackjack strategies) with the published source. POST /api/v1/simulate runs a bounded simulation. Play chips are free, reset daily and are worth nothing; nothing is bought or cashed out.',
details: 'GET /api/v1/games lists every game, its rules and each bet\'s house edge (exact where the maths allows, simulated for blackjack strategies) with the published source. POST /api/v1/simulate runs a bounded simulation. Play chips are free, reset daily and are worth nothing; nothing is bought or cashed out.',
sections: [
sections: [
{ title: 'Start here', links: pages.map((p) => ({ title: p.title, url: abs(p.path), note: p.text })) },
{ title: 'Start here', links: pages.map((p) => ({ title: p.title, url: abs(p.path), note: p.text })) },
{ title: 'Machine-readable', links: [
{ title: 'Machine-readable', links: [
{ title: 'Games and house edges (JSON)', url: abs('/api/v1/games') },
{ title: 'Games and house edges (JSON)', url: abs('/api/v1/games') },
{ title: 'OpenAPI', url: abs('/api/v1/openapi.json') },
{ title: 'OpenAPI', url: abs('/api/v1/openapi.json') },
- { title: 'Sitemap', url: abs('/sitemap.xml') },
- { title: 'Full text for language models', url: abs('/llms-full.txt') },
] },
] },
],
],
+ optional: [
+ { title: 'Sitemap', url: abs('/sitemap.xml') },
+ { title: 'Full text for language models', url: abs('/llms-full.txt') },
+ ],
}));
}));
});
});
@@ -80,6 +80,13 @@ const games = require('../engine/games');
@@ -80,6 +80,13 @@ const games = require('../engine/games');
const map = await t.get('/sitemap.xml');
const map = await t.get('/sitemap.xml');
for (const g of games.catalogue()) assert.ok(map.text.includes(`/learn/${g.id}</loc>`) && map.text.includes(`/play/${g.id}</loc>`), g.id);
for (const g of games.catalogue()) assert.ok(map.text.includes(`/learn/${g.id}</loc>`) && map.text.includes(`/play/${g.id}</loc>`), g.id);
assert.match((await t.get('/robots.txt')).text, /Disallow: \/s\//);
assert.match((await t.get('/robots.txt')).text, /Disallow: \/s\//);
+ // AGT-5: llms.txt links each page at its Markdown twin, the API and files as they are, ## Optional last.
+ const llms = (await t.get('/llms.txt')).text;
+ assert.match(llms, /\(https?:\/\/[^)]*\/index\.md\)/, 'the home links its twin');
+ assert.match(llms, /\(https?:\/\/[^)]*\/learn\/blackjack\.md\)/);
+ assert.match(llms, /\(https?:\/\/[^)]*\/api\/v1\/openapi\.json\)/);
+ assert.ok(llms.includes('\n## Optional\n') && llms.lastIndexOf('\n## ') === llms.indexOf('\n## Optional\n'), 'Optional is last');
+ assert.strictEqual((await t.get('/learn/blackjack.md')).status, 200, 'a twin it links answers');
});
});
} finally { await t.close(); }
} finally { await t.close(); }
done();
done();