openvibers/openvibe.codes Commits
Declare edit/review/tools/vision/browser/computer-use and runtimes on Codes' harness offers and route on them (#16)
Changes
@@@ -7,7 +7,14 @@"host_access": true,"mcp": true,"long_autonomy": true,-- "resume": true++ "resume": true,++ "edit": true,++ "review": true,++ "tools": true,++ "vision": true,++ "browser": false,++ "computer_use": false,++ "runtimes": ["code"]},"address": {"kind": "cli",@@@ -50,7 +57,14 @@"host_access": true,"mcp": true,"long_autonomy": true,-- "resume": true++ "resume": true,++ "edit": true,++ "review": true,++ "tools": true,++ "vision": true,++ "browser": false,++ "computer_use": false,++ "runtimes": ["code"]},"address": {"kind": "cli",@@@ -93,7 +107,14 @@"host_access": true,"mcp": true,"long_autonomy": false,-- "resume": true++ "resume": true,++ "edit": true,++ "review": false,++ "tools": true,++ "vision": false,++ "browser": false,++ "computer_use": false,++ "runtimes": ["code"]},"address": {"kind": "cli",@@@ -118,7 +139,14 @@"host_access": true,"mcp": true,"long_autonomy": false,-- "resume": true++ "resume": true,++ "edit": true,++ "review": true,++ "tools": true,++ "vision": true,++ "browser": false,++ "computer_use": false,++ "runtimes": ["code"]},"address": {"kind": "cli",@@@ -143,7 +171,14 @@"host_access": true,"mcp": false,"long_autonomy": false,-- "resume": true++ "resume": true,++ "edit": true,++ "review": false,++ "tools": true,++ "vision": true,++ "browser": false,++ "computer_use": false,++ "runtimes": ["code"]},"address": {"kind": "cli",@@@ -168,7 +203,14 @@"host_access": false,"mcp": false,"long_autonomy": false,-- "resume": false++ "resume": false,++ "edit": false,++ "review": false,++ "tools": false,++ "vision": false,++ "browser": false,++ "computer_use": false,++ "runtimes": ["code"]},"address": {"kind": "api",@@@ -10,7 +10,10 @@ const { plan } = require('openvibe-sdk/placement');// A catalog row without task_capabilities takes edit and review.const DEFAULT_TASKS = ['edit', 'review'];// harness-offer@1 capability flag → the resource-offer@1 capability it adds when true.--const HARNESS_FLAGS = { host_access: 'harness:host-access', mcp: 'harness:mcp', long_autonomy: 'harness:long-autonomy', resume: 'harness:resume' };++const HARNESS_FLAGS = {++ host_access: 'harness:host-access', mcp: 'harness:mcp', long_autonomy: 'harness:long-autonomy', resume: 'harness:resume',++ edit: 'harness:edit', review: 'harness:review', tools: 'harness:tools', vision: 'harness:vision', browser: 'harness:browser', computer_use: 'harness:computer-use',++};const TASKS = Object.freeze({edit: ['task:edit'],@@@ -39,7 +39,7 @@ function priced(row, freshUsd) {provider: 'example',region: 'global',trust: 'partner',-- capabilities: ['task:edit', 'task:review', 'harness:host-access', 'harness:mcp', 'harness:resume'],++ capabilities: ['task:edit', 'task:review', 'harness:host-access', 'harness:mcp', 'harness:resume', 'harness:edit', 'harness:tools'],capacity: { workers: { harness: 2 } },health: { status: 'degraded' },pricing: { model: 'per-operation', unit: 'token', marginal_usd_per_unit: 0.003 / 1000 },@@@ -72,7 +72,7 @@ function priced(row, freshUsd) {}const browsing = { ...rows[0], task_capabilities: ['edit', 'browse'] };const offer = toOffer(browsing, browsing.agents[0], { now });-- assert.deepStrictEqual(offer.capabilities, ['task:edit', 'task:browse', 'harness:host-access', 'harness:mcp', 'harness:long-autonomy', 'harness:resume']);++ assert.deepStrictEqual(offer.capabilities, ['task:edit', 'task:browse', 'harness:host-access', 'harness:mcp', 'harness:long-autonomy', 'harness:resume', 'harness:edit', 'harness:review', 'harness:tools', 'harness:vision']);assert.ok(contracts.validate('platform.resource-offer@1', JSON.parse(JSON.stringify(offer))).valid);});@@@ -136,6 +136,17 @@ function priced(row, freshUsd) {assert.ok(none.candidates.every((c) => c.reason === 'lacks task:browse'));});++ await check('a harness:vision requirement drops the vision:false harnesses', async () => {++ const harnesses = createHarnesses({ catalogPath });++ const r = route({ task: 'edit', extra: { capabilities: ['harness:vision'] }, harnesses, now });++ assert.ok(['claude-code:claude-code-sonnet', 'codex:codex-default'].includes(r.selected), `selected ${r.selected}`);++ for (const id of ['claude-code:claude-code-sonnet', 'codex:codex-default']) {++ assert.deepStrictEqual(r.candidates.find((c) => c.id === id), { id, included: true, reason: null });++ }++ assert.deepStrictEqual(r.candidates.find((c) => c.id === 'deepseek:deepseek-chat'), { id: 'deepseek:deepseek-chat', included: false, reason: 'lacks harness:vision' });++ assert.ok(toOffer(harnesses.get(r.selected.split(':')[0]), harnesses.agents(r.selected.split(':')[0])[0]).capabilities.includes('harness:vision'));++ });++await check('an unknown task throws harness.task_unknown', async () => {assert.throws(() => requirementsFor('deploy'), (error) => error.code === 'harness.task_unknown');assert.throws(() => requirementsFor('toString'), (error) => error.code === 'harness.task_unknown');
@@ -7,7 +7,14 @@
@@ -7,7 +7,14 @@
"host_access": true,
"host_access": true,
"mcp": true,
"mcp": true,
"long_autonomy": true,
"long_autonomy": true,
- "resume": true
+ "resume": true,
+ "edit": true,
+ "review": true,
+ "tools": true,
+ "vision": true,
+ "browser": false,
+ "computer_use": false,
+ "runtimes": ["code"]
},
},
"address": {
"address": {
"kind": "cli",
"kind": "cli",
@@ -50,7 +57,14 @@
@@ -50,7 +57,14 @@
"host_access": true,
"host_access": true,
"mcp": true,
"mcp": true,
"long_autonomy": true,
"long_autonomy": true,
- "resume": true
+ "resume": true,
+ "edit": true,
+ "review": true,
+ "tools": true,
+ "vision": true,
+ "browser": false,
+ "computer_use": false,
+ "runtimes": ["code"]
},
},
"address": {
"address": {
"kind": "cli",
"kind": "cli",
@@ -93,7 +107,14 @@
@@ -93,7 +107,14 @@
"host_access": true,
"host_access": true,
"mcp": true,
"mcp": true,
"long_autonomy": false,
"long_autonomy": false,
- "resume": true
+ "resume": true,
+ "edit": true,
+ "review": false,
+ "tools": true,
+ "vision": false,
+ "browser": false,
+ "computer_use": false,
+ "runtimes": ["code"]
},
},
"address": {
"address": {
"kind": "cli",
"kind": "cli",
@@ -118,7 +139,14 @@
@@ -118,7 +139,14 @@
"host_access": true,
"host_access": true,
"mcp": true,
"mcp": true,
"long_autonomy": false,
"long_autonomy": false,
- "resume": true
+ "resume": true,
+ "edit": true,
+ "review": true,
+ "tools": true,
+ "vision": true,
+ "browser": false,
+ "computer_use": false,
+ "runtimes": ["code"]
},
},
"address": {
"address": {
"kind": "cli",
"kind": "cli",
@@ -143,7 +171,14 @@
@@ -143,7 +171,14 @@
"host_access": true,
"host_access": true,
"mcp": false,
"mcp": false,
"long_autonomy": false,
"long_autonomy": false,
- "resume": true
+ "resume": true,
+ "edit": true,
+ "review": false,
+ "tools": true,
+ "vision": true,
+ "browser": false,
+ "computer_use": false,
+ "runtimes": ["code"]
},
},
"address": {
"address": {
"kind": "cli",
"kind": "cli",
@@ -168,7 +203,14 @@
@@ -168,7 +203,14 @@
"host_access": false,
"host_access": false,
"mcp": false,
"mcp": false,
"long_autonomy": false,
"long_autonomy": false,
- "resume": false
+ "resume": false,
+ "edit": false,
+ "review": false,
+ "tools": false,
+ "vision": false,
+ "browser": false,
+ "computer_use": false,
+ "runtimes": ["code"]
},
},
"address": {
"address": {
"kind": "api",
"kind": "api",
@@ -10,7 +10,10 @@ const { plan } = require('openvibe-sdk/placement');
@@ -10,7 +10,10 @@ const { plan } = require('openvibe-sdk/placement');
// A catalog row without task_capabilities takes edit and review.
// A catalog row without task_capabilities takes edit and review.
const DEFAULT_TASKS = ['edit', 'review'];
const DEFAULT_TASKS = ['edit', 'review'];
// harness-offer@1 capability flag → the resource-offer@1 capability it adds when true.
// harness-offer@1 capability flag → the resource-offer@1 capability it adds when true.
-const HARNESS_FLAGS = { host_access: 'harness:host-access', mcp: 'harness:mcp', long_autonomy: 'harness:long-autonomy', resume: 'harness:resume' };
+const HARNESS_FLAGS = {
+ host_access: 'harness:host-access', mcp: 'harness:mcp', long_autonomy: 'harness:long-autonomy', resume: 'harness:resume',
+ edit: 'harness:edit', review: 'harness:review', tools: 'harness:tools', vision: 'harness:vision', browser: 'harness:browser', computer_use: 'harness:computer-use',
+};
const TASKS = Object.freeze({
const TASKS = Object.freeze({
edit: ['task:edit'],
edit: ['task:edit'],
@@ -39,7 +39,7 @@ function priced(row, freshUsd) {
@@ -39,7 +39,7 @@ function priced(row, freshUsd) {
provider: 'example',
provider: 'example',
region: 'global',
region: 'global',
trust: 'partner',
trust: 'partner',
- capabilities: ['task:edit', 'task:review', 'harness:host-access', 'harness:mcp', 'harness:resume'],
+ capabilities: ['task:edit', 'task:review', 'harness:host-access', 'harness:mcp', 'harness:resume', 'harness:edit', 'harness:tools'],
capacity: { workers: { harness: 2 } },
capacity: { workers: { harness: 2 } },
health: { status: 'degraded' },
health: { status: 'degraded' },
pricing: { model: 'per-operation', unit: 'token', marginal_usd_per_unit: 0.003 / 1000 },
pricing: { model: 'per-operation', unit: 'token', marginal_usd_per_unit: 0.003 / 1000 },
@@ -72,7 +72,7 @@ function priced(row, freshUsd) {
@@ -72,7 +72,7 @@ function priced(row, freshUsd) {
}
}
const browsing = { ...rows[0], task_capabilities: ['edit', 'browse'] };
const browsing = { ...rows[0], task_capabilities: ['edit', 'browse'] };
const offer = toOffer(browsing, browsing.agents[0], { now });
const offer = toOffer(browsing, browsing.agents[0], { now });
- assert.deepStrictEqual(offer.capabilities, ['task:edit', 'task:browse', 'harness:host-access', 'harness:mcp', 'harness:long-autonomy', 'harness:resume']);
+ assert.deepStrictEqual(offer.capabilities, ['task:edit', 'task:browse', 'harness:host-access', 'harness:mcp', 'harness:long-autonomy', 'harness:resume', 'harness:edit', 'harness:review', 'harness:tools', 'harness:vision']);
assert.ok(contracts.validate('platform.resource-offer@1', JSON.parse(JSON.stringify(offer))).valid);
assert.ok(contracts.validate('platform.resource-offer@1', JSON.parse(JSON.stringify(offer))).valid);
});
});
@@ -136,6 +136,17 @@ function priced(row, freshUsd) {
@@ -136,6 +136,17 @@ function priced(row, freshUsd) {
assert.ok(none.candidates.every((c) => c.reason === 'lacks task:browse'));
assert.ok(none.candidates.every((c) => c.reason === 'lacks task:browse'));
});
});
+ await check('a harness:vision requirement drops the vision:false harnesses', async () => {
+ const harnesses = createHarnesses({ catalogPath });
+ const r = route({ task: 'edit', extra: { capabilities: ['harness:vision'] }, harnesses, now });
+ assert.ok(['claude-code:claude-code-sonnet', 'codex:codex-default'].includes(r.selected), `selected ${r.selected}`);
+ for (const id of ['claude-code:claude-code-sonnet', 'codex:codex-default']) {
+ assert.deepStrictEqual(r.candidates.find((c) => c.id === id), { id, included: true, reason: null });
+ }
+ assert.deepStrictEqual(r.candidates.find((c) => c.id === 'deepseek:deepseek-chat'), { id: 'deepseek:deepseek-chat', included: false, reason: 'lacks harness:vision' });
+ assert.ok(toOffer(harnesses.get(r.selected.split(':')[0]), harnesses.agents(r.selected.split(':')[0])[0]).capabilities.includes('harness:vision'));
+ });
+
await check('an unknown task throws harness.task_unknown', async () => {
await check('an unknown task throws harness.task_unknown', async () => {
assert.throws(() => requirementsFor('deploy'), (error) => error.code === 'harness.task_unknown');
assert.throws(() => requirementsFor('deploy'), (error) => error.code === 'harness.task_unknown');
assert.throws(() => requirementsFor('toString'), (error) => error.code === 'harness.task_unknown');
assert.throws(() => requirementsFor('toString'), (error) => error.code === 'harness.task_unknown');