import test from 'node:test'; import assert from 'node:assert/strict'; import { mkdtempSync, rmSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { Store } from '../src/store.mjs'; import { Broker } from '../src/broker.mjs'; test('REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses', async t => { const root = mkdtempSync(join(tmpdir(), 'usage-broker-')); const store = new Store(root); t.after(() => { store.close(); rmSync(root, { recursive: true, force: true }); }); const businesses = { demo: { id: 'demo', human: 'jason', roles: {chief: { definition: 'chief-of-staff', authority: { withinRole: ['decision.resolve.technical', 'decision.resolve.delivery'], crossRole: [] } }, coder: { definition: 'coder', authority: { withinRole: [], crossRole: [] } } }, arbiters: { technical: 'chief', delivery: 'chief' } } }; const recorded = []; const broker = new Broker({ store, businesses, usage: { collect: async (...args) => { recorded.push(args); return { recorded: true }; }, view: business => ({ business }), } }); const coder = broker.bindLaunch({ business: 'demo', role: 'coder', run: 'run1', harness: 'pi', provider: 'fixture', model: 'custom-model' }); broker.request(coder, { verb: 'role.claim' }); const human = broker.bindHuman({ business: 'demo', human: 'jason', via: 'cli', outsideAgent: true }); const { id } = broker.request(human, { verb: 'message.send', args: { to: 'coder', body: 'Work' } }); await assert.rejects(broker.request(coder, { verb: 'usage.begin', args: { turn: id } }), { code: 'not-recipient' }); broker.request(coder, { verb: 'message.receive' }); for (const phase of ['begin', 'end']) assert.deepEqual(await broker.request(coder, { verb: `usage.${phase}`, args: { turn: id } }), { recorded: true }); assert.equal(recorded.length, 2); assert.equal(recorded[0][0].run, 'run1'); assert.equal(recorded[0][0].provider, 'fixture'); assert.equal(recorded[0][0].model, 'custom-model'); await assert.rejects(broker.request(coder, { verb: 'usage.end', args: { turn: id, root: '/etc' } }), { code: 'invalid-request' }); await assert.rejects(broker.request(human, { verb: 'usage.begin', args: { turn: id } }), { code: 'agent-required' }); assert.deepEqual(broker.request(broker.bindReader({ business: 'demo' }), { verb: 'usage' }), { business: 'demo' }); assert.throws(() => broker.request(human, { verb: 'usage', args: { business: 'other' } }), /invalid-request/); });