openvibers/openvibe.codes Commits
openvibe-contracts v0.416.0 (was v0.406.0) (#431)
Changes
@@@ -180,7 +180,7 @@ Reporting a vulnerability: [SECURITY.md](SECURITY.md).Part of the [OpenVibe network](https://openvibe.network). Built in the open by [OpenVibers](https://github.com/OpenVibers).<!-- versions:start -->--- openvibe-contracts: v0.406.0++- openvibe-contracts: v0.416.0- openvibe-sdk: v0.150.0- openvibe-shared: v4.223.0<!-- versions:end -->@@@ -7,11 +7,11 @@"runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9","port": 4900,"domain": "openvibe.codes",-- "contracts": "openvibe-contracts v0.406.0",++ "contracts": "openvibe-contracts v0.416.0","sdk": "openvibe-sdk v0.150.0","shared": "openvibe-shared v4.223.0","packages": [-- "openvibe-contracts v0.406.0",++ "openvibe-contracts v0.416.0","openvibe-sdk v0.150.0","openvibe-shared v4.223.0"],@@@ -15,7 +15,7 @@"express-rate-limit": "^7.5.0","helmet": "^8.1.0","iovalkey": "^0.4.0",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.406.0",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.416.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.150.0","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.223.0","pg": "^8.23.0",@@@ -1231,9 +1231,9 @@}},"node_modules/openvibe-contracts": {-- "version": "0.406.0",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.406.0",-- "integrity": "sha512-V/Tjss2UWvzI551bw3ACb/RqWg0lChxGITxfCVZ8qou2Docg0pBMvIjkeQoib56yq3r6UZGB6DGl+pA+qfjOiA==",++ "version": "0.416.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.416.0",++ "integrity": "sha512-gFZGSXY7GM2SHdyOmqZ0699yJhF9ZsF/Rb0WHo3asI+S4LTqthqIQPOCoYczlF/dcB5p13KBjLCMdAvEqmNLoQ==","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -30,7 +30,7 @@"express-rate-limit": "^7.5.0","helmet": "^8.1.0","iovalkey": "^0.4.0",-- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.406.0",++ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.416.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.150.0","openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.223.0","pg": "^8.23.0",@@@ -28,8 +28,8 @@ const TOPIC_SET = new Set(TOPICS);*/const UPDATED_TOPIC = 'codes.task.updated';/** A ticket follows its pull request (AL5): bound, follow-up started, ended. Payloads are plain JSON; the-- * service manifest's eventsProduced stays the codes.task.* five (contracts.test.js), so these are the-- * portal's view, not a new contract. */++ * service manifest's eventsProduced names the codes.task.* topics (the five states plus updated, since++ * OpenVibe.Contracts 0.416.0), so these are the portal's view, not a new contract. */const PR_TOPICS = Object.freeze(['codes.pr.bound', 'codes.pr.followup', 'codes.pr.ended']);const PR_TOPIC_SET = new Set(PR_TOPICS);const MAX_BACKOFF_MS = 5 * 60_000;@@@ -50,7 +50,7 @@ const { check, done } = require('./helpers/boot');await check('every codes.task.* payload validates against the pinned contracts, and the manifest names the topics', async () => {const contracts = require('openvibe-contracts');-- const { TOPICS, payloadOf } = require('../server/events/outbox');++ const { TOPICS, UPDATED_TOPIC, payloadOf } = require('../server/events/outbox');const row = { id: 'tsk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3', agent: 'claude', repo: 'https://github.com/OpenVibers/OpenVibe.Codes.git',started_at: '2026-10-28T16:00:00.000Z', finished_at: null, error: null, result: null };const rows = [@@@ -70,7 +70,9 @@ const { check, done } = require('./helpers/boot');assert.strictEqual(payloadOf(rows[2]).repo, 'OpenVibers/OpenVibe.Codes');assert.strictEqual(payloadOf(rows[2]).files_changed, 2);const manifest = require('openvibe-contracts/manifests/services/codes.json');-- assert.deepStrictEqual(manifest.eventsProduced, TOPICS);++ // The released manifest may name more than the five state topics (codes.task.updated joined them in++ // OpenVibe.Contracts 0.416.0); every topic the code publishes must be named there.++ for (const topic of [...TOPICS, UPDATED_TOPIC]) assert.ok(manifest.eventsProduced.includes(topic), topic);assert.ok(manifest.eventsConsumed.includes('run.job.succeeded') && manifest.eventsConsumed.includes('network.account.deleted'));assert.ok(!fs.existsSync(path.join(__dirname, '..', 'docs', 'contracts-proposal')), 'the proposal moved to Contracts 0.232.0');});
@@ -180,7 +180,7 @@ Reporting a vulnerability: [SECURITY.md](SECURITY.md).
@@ -180,7 +180,7 @@ Reporting a vulnerability: [SECURITY.md](SECURITY.md).
Part of the [OpenVibe network](https://openvibe.network). Built in the open by [OpenVibers](https://github.com/OpenVibers).
Part of the [OpenVibe network](https://openvibe.network). Built in the open by [OpenVibers](https://github.com/OpenVibers).
<!-- versions:start -->
<!-- versions:start -->
-- openvibe-contracts: v0.406.0
+- openvibe-contracts: v0.416.0
- openvibe-sdk: v0.150.0
- openvibe-sdk: v0.150.0
- openvibe-shared: v4.223.0
- openvibe-shared: v4.223.0
<!-- versions:end -->
<!-- versions:end -->
@@ -7,11 +7,11 @@
@@ -7,11 +7,11 @@
"runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"port": 4900,
"port": 4900,
"domain": "openvibe.codes",
"domain": "openvibe.codes",
- "contracts": "openvibe-contracts v0.406.0",
+ "contracts": "openvibe-contracts v0.416.0",
"sdk": "openvibe-sdk v0.150.0",
"sdk": "openvibe-sdk v0.150.0",
"shared": "openvibe-shared v4.223.0",
"shared": "openvibe-shared v4.223.0",
"packages": [
"packages": [
- "openvibe-contracts v0.406.0",
+ "openvibe-contracts v0.416.0",
"openvibe-sdk v0.150.0",
"openvibe-sdk v0.150.0",
"openvibe-shared v4.223.0"
"openvibe-shared v4.223.0"
],
],
@@ -15,7 +15,7 @@
@@ -15,7 +15,7 @@
"express-rate-limit": "^7.5.0",
"express-rate-limit": "^7.5.0",
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.406.0",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.416.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.150.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.150.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.223.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.223.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
@@ -1231,9 +1231,9 @@
@@ -1231,9 +1231,9 @@
}
}
},
},
"node_modules/openvibe-contracts": {
"node_modules/openvibe-contracts": {
- "version": "0.406.0",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.406.0",
- "integrity": "sha512-V/Tjss2UWvzI551bw3ACb/RqWg0lChxGITxfCVZ8qou2Docg0pBMvIjkeQoib56yq3r6UZGB6DGl+pA+qfjOiA==",
+ "version": "0.416.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.416.0",
+ "integrity": "sha512-gFZGSXY7GM2SHdyOmqZ0699yJhF9ZsF/Rb0WHo3asI+S4LTqthqIQPOCoYczlF/dcB5p13KBjLCMdAvEqmNLoQ==",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -30,7 +30,7 @@
@@ -30,7 +30,7 @@
"express-rate-limit": "^7.5.0",
"express-rate-limit": "^7.5.0",
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"iovalkey": "^0.4.0",
"iovalkey": "^0.4.0",
- "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.406.0",
+ "openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.416.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.150.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.150.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.223.0",
"openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.223.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
@@ -28,8 +28,8 @@ const TOPIC_SET = new Set(TOPICS);
@@ -28,8 +28,8 @@ const TOPIC_SET = new Set(TOPICS);
*/
*/
const UPDATED_TOPIC = 'codes.task.updated';
const UPDATED_TOPIC = 'codes.task.updated';
/** A ticket follows its pull request (AL5): bound, follow-up started, ended. Payloads are plain JSON; the
/** A ticket follows its pull request (AL5): bound, follow-up started, ended. Payloads are plain JSON; the
- * service manifest's eventsProduced stays the codes.task.* five (contracts.test.js), so these are the
- * portal's view, not a new contract. */
+ * service manifest's eventsProduced names the codes.task.* topics (the five states plus updated, since
+ * OpenVibe.Contracts 0.416.0), so these are the portal's view, not a new contract. */
const PR_TOPICS = Object.freeze(['codes.pr.bound', 'codes.pr.followup', 'codes.pr.ended']);
const PR_TOPICS = Object.freeze(['codes.pr.bound', 'codes.pr.followup', 'codes.pr.ended']);
const PR_TOPIC_SET = new Set(PR_TOPICS);
const PR_TOPIC_SET = new Set(PR_TOPICS);
const MAX_BACKOFF_MS = 5 * 60_000;
const MAX_BACKOFF_MS = 5 * 60_000;
@@ -50,7 +50,7 @@ const { check, done } = require('./helpers/boot');
@@ -50,7 +50,7 @@ const { check, done } = require('./helpers/boot');
await check('every codes.task.* payload validates against the pinned contracts, and the manifest names the topics', async () => {
await check('every codes.task.* payload validates against the pinned contracts, and the manifest names the topics', async () => {
const contracts = require('openvibe-contracts');
const contracts = require('openvibe-contracts');
- const { TOPICS, payloadOf } = require('../server/events/outbox');
+ const { TOPICS, UPDATED_TOPIC, payloadOf } = require('../server/events/outbox');
const row = { id: 'tsk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3', agent: 'claude', repo: 'https://github.com/OpenVibers/OpenVibe.Codes.git',
const row = { id: 'tsk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3', agent: 'claude', repo: 'https://github.com/OpenVibers/OpenVibe.Codes.git',
started_at: '2026-10-28T16:00:00.000Z', finished_at: null, error: null, result: null };
started_at: '2026-10-28T16:00:00.000Z', finished_at: null, error: null, result: null };
const rows = [
const rows = [
@@ -70,7 +70,9 @@ const { check, done } = require('./helpers/boot');
@@ -70,7 +70,9 @@ const { check, done } = require('./helpers/boot');
assert.strictEqual(payloadOf(rows[2]).repo, 'OpenVibers/OpenVibe.Codes');
assert.strictEqual(payloadOf(rows[2]).repo, 'OpenVibers/OpenVibe.Codes');
assert.strictEqual(payloadOf(rows[2]).files_changed, 2);
assert.strictEqual(payloadOf(rows[2]).files_changed, 2);
const manifest = require('openvibe-contracts/manifests/services/codes.json');
const manifest = require('openvibe-contracts/manifests/services/codes.json');
- assert.deepStrictEqual(manifest.eventsProduced, TOPICS);
+ // The released manifest may name more than the five state topics (codes.task.updated joined them in
+ // OpenVibe.Contracts 0.416.0); every topic the code publishes must be named there.
+ for (const topic of [...TOPICS, UPDATED_TOPIC]) assert.ok(manifest.eventsProduced.includes(topic), topic);
assert.ok(manifest.eventsConsumed.includes('run.job.succeeded') && manifest.eventsConsumed.includes('network.account.deleted'));
assert.ok(manifest.eventsConsumed.includes('run.job.succeeded') && manifest.eventsConsumed.includes('network.account.deleted'));
assert.ok(!fs.existsSync(path.join(__dirname, '..', 'docs', 'contracts-proposal')), 'the proposal moved to Contracts 0.232.0');
assert.ok(!fs.existsSync(path.join(__dirname, '..', 'docs', 'contracts-proposal')), 'the proposal moved to Contracts 0.232.0');
});
});