@dharma-ai-labs/agent-fabric 0.2.106 → 0.2.108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/codexBoundSession.d.ts +42 -0
- package/dist/codexBoundSession.d.ts.map +1 -0
- package/dist/codexBoundSession.js +106 -0
- package/dist/codexBoundSession.js.map +1 -0
- package/dist/codexBoundSession.test.d.ts +2 -0
- package/dist/codexBoundSession.test.d.ts.map +1 -0
- package/dist/codexBoundSession.test.js +619 -0
- package/dist/codexBoundSession.test.js.map +1 -0
- package/dist/codexInboxSession.d.ts +75 -0
- package/dist/codexInboxSession.d.ts.map +1 -0
- package/dist/codexInboxSession.js +157 -0
- package/dist/codexInboxSession.js.map +1 -0
- package/dist/cooperativeInboxSession.d.ts +89 -0
- package/dist/cooperativeInboxSession.d.ts.map +1 -0
- package/dist/cooperativeInboxSession.js +195 -0
- package/dist/cooperativeInboxSession.js.map +1 -0
- package/dist/cooperativeInboxSession.test.d.ts +2 -0
- package/dist/cooperativeInboxSession.test.d.ts.map +1 -0
- package/dist/cooperativeInboxSession.test.js +354 -0
- package/dist/cooperativeInboxSession.test.js.map +1 -0
- package/dist/demoPackage.d.ts +1 -0
- package/dist/demoPackage.d.ts.map +1 -1
- package/dist/demoPackage.js +17 -11
- package/dist/demoPackage.js.map +1 -1
- package/dist/demoPackage.test.js +58 -0
- package/dist/demoPackage.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +2 -2
- package/dist/providerSessionChannel.d.ts +129 -0
- package/dist/providerSessionChannel.d.ts.map +1 -0
- package/dist/providerSessionChannel.js +249 -0
- package/dist/providerSessionChannel.js.map +1 -0
- package/dist/providerSessionChannel.test.d.ts +2 -0
- package/dist/providerSessionChannel.test.d.ts.map +1 -0
- package/dist/providerSessionChannel.test.js +246 -0
- package/dist/providerSessionChannel.test.js.map +1 -0
- package/dist/providerSessionReplyRecovery.d.ts +33 -0
- package/dist/providerSessionReplyRecovery.d.ts.map +1 -0
- package/dist/providerSessionReplyRecovery.js +58 -0
- package/dist/providerSessionReplyRecovery.js.map +1 -0
- package/dist/schemas/provider-session-completion.schema.json +22 -0
- package/package.json +7 -7
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { generateKeyPairSync } from 'node:crypto';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
import { signCanonicalObject } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
5
|
+
import { createProviderSessionChannel } from './providerSessionChannel.js';
|
|
6
|
+
const { privateKey, publicKey } = generateKeyPairSync('ed25519');
|
|
7
|
+
const uuid = (last) => `40000000-0000-4000-8000-${String(last).padStart(12, '0')}`;
|
|
8
|
+
const now = new Date('2026-09-26T05:00:00.000Z');
|
|
9
|
+
const scope = {
|
|
10
|
+
organizationId: 'org_test', repositoryBindingId: uuid(1), workspaceId: uuid(2), endpointId: uuid(3),
|
|
11
|
+
membershipId: uuid(4), deviceId: uuid(5), bindingId: uuid(6), provider: 'codex',
|
|
12
|
+
expiresAt: '2026-09-26T06:00:00.000Z', maximumProviderCostCents: 25,
|
|
13
|
+
};
|
|
14
|
+
function offer(change = {}) {
|
|
15
|
+
const unsigned = {
|
|
16
|
+
schema: 'dharma.session-question/v1', questionId: uuid(10), taskId: uuid(11),
|
|
17
|
+
organizationId: scope.organizationId, repositoryBindingId: scope.repositoryBindingId,
|
|
18
|
+
source: { workspaceId: uuid(12), endpointId: uuid(13), membershipId: uuid(14), deviceId: uuid(15) },
|
|
19
|
+
target: { workspaceId: scope.workspaceId, endpointId: scope.endpointId, membershipId: scope.membershipId,
|
|
20
|
+
deviceId: scope.deviceId, bindingId: scope.bindingId, provider: scope.provider },
|
|
21
|
+
category: 'architecture', question: 'Which signed catalog applies?',
|
|
22
|
+
authority: { mode: 'read_only', readPaths: ['.'], network: 'deny', maximumProviderCostCents: 25 },
|
|
23
|
+
createdAt: now.toISOString(), expiresAt: '2026-09-26T05:15:00.000Z', nonce: uuid(16),
|
|
24
|
+
signerKeyVersion: 'projects/test/locations/global/keyRings/af/cryptoKeys/questions/cryptoKeyVersions/1',
|
|
25
|
+
...change,
|
|
26
|
+
};
|
|
27
|
+
return { ...unsigned, signature: signCanonicalObject(unsigned, privateKey) };
|
|
28
|
+
}
|
|
29
|
+
function fixture() {
|
|
30
|
+
let held = true, time = now, responseOverride;
|
|
31
|
+
const calls = [];
|
|
32
|
+
let afterSend;
|
|
33
|
+
const transport = { async signedPost(route, input) {
|
|
34
|
+
const body = input;
|
|
35
|
+
calls.push({ route, body });
|
|
36
|
+
afterSend?.();
|
|
37
|
+
if (responseOverride instanceof Error)
|
|
38
|
+
throw responseOverride;
|
|
39
|
+
if (typeof responseOverride === 'function')
|
|
40
|
+
return responseOverride(body);
|
|
41
|
+
if (responseOverride)
|
|
42
|
+
return responseOverride;
|
|
43
|
+
if (route.endsWith('provider-sessions'))
|
|
44
|
+
return { ok: true, organizationId: scope.organizationId, correlationId: uuid(90),
|
|
45
|
+
registration: { bindingId: scope.bindingId, workspaceId: scope.workspaceId, endpointId: scope.endpointId,
|
|
46
|
+
repositoryBindingId: scope.repositoryBindingId, membershipId: scope.membershipId, deviceId: scope.deviceId,
|
|
47
|
+
provider: 'codex', mode: 'bridge_owned', revision: Number(body.expectedRevision) + 1,
|
|
48
|
+
state: body.action === 'detach' ? 'detached' : 'attached', leaseUntil: '2026-09-26T05:01:00.000Z', replay: false } };
|
|
49
|
+
const result = body.action === 'inbox' ? { offers: [offer()] } : {
|
|
50
|
+
questionId: body.questionId || uuid(10), taskId: uuid(11), targetBindingId: body.targetBindingId || scope.bindingId,
|
|
51
|
+
state: body.action === 'accept' ? 'accepted' : body.action === 'reply' ? body.outcome : 'queued', replay: false,
|
|
52
|
+
};
|
|
53
|
+
return { ok: true, organizationId: scope.organizationId, result, correlationId: uuid(90) };
|
|
54
|
+
} };
|
|
55
|
+
const channel = createProviderSessionChannel({ transport, scope, mode: 'bridge_owned', expectedRevision: 0,
|
|
56
|
+
assertOwner: async () => held, now: () => time,
|
|
57
|
+
verifier: { resolvePublicKey: () => publicKey }, authorizeContent: async () => true });
|
|
58
|
+
return { channel, calls, setHeld: (value) => { held = value; },
|
|
59
|
+
setTime: (value) => { time = value; }, setResponse: (value) => { responseOverride = value; },
|
|
60
|
+
onSend: (fn) => { afterSend = fn; } };
|
|
61
|
+
}
|
|
62
|
+
test('registration, heartbeat and detach preserve scope and CAS without transmitting a chat locator', async () => {
|
|
63
|
+
const f = fixture();
|
|
64
|
+
const attached = await f.channel.attach();
|
|
65
|
+
assert.equal(attached.revision, 1);
|
|
66
|
+
assert.equal(attached.correlationId, uuid(90));
|
|
67
|
+
assert.equal((await f.channel.heartbeat()).revision, 2);
|
|
68
|
+
assert.equal((await f.channel.detach()).state, 'detached');
|
|
69
|
+
assert.deepEqual(f.calls.map(call => call.body.expectedRevision), [0, 1, 2]);
|
|
70
|
+
assert.ok(f.calls.every(call => !('sessionId' in call.body) && !('workspaceRoot' in call.body)));
|
|
71
|
+
await assert.rejects(f.channel.attach(), /provider_session_channel_closed/);
|
|
72
|
+
});
|
|
73
|
+
test('reconnect inspects an existing expired registration before attaching its exact current revision', async () => {
|
|
74
|
+
const f = fixture();
|
|
75
|
+
f.setResponse((body) => ({ ok: true, organizationId: scope.organizationId, correlationId: uuid(90),
|
|
76
|
+
registration: { bindingId: scope.bindingId, workspaceId: scope.workspaceId, endpointId: scope.endpointId,
|
|
77
|
+
repositoryBindingId: scope.repositoryBindingId, membershipId: scope.membershipId, deviceId: scope.deviceId,
|
|
78
|
+
provider: 'codex', mode: 'bridge_owned', revision: body.action === 'inspect' ? 9 : Number(body.expectedRevision) + 1,
|
|
79
|
+
state: 'attached', leaseUntil: body.action === 'inspect' ? '2026-09-26T04:59:00.000Z' : '2026-09-26T05:01:00.000Z', replay: false } }));
|
|
80
|
+
assert.equal((await f.channel.reconnect()).revision, 10);
|
|
81
|
+
assert.deepEqual(f.calls.map(call => [call.body.action, call.body.expectedRevision]), [['inspect', 0], ['attach', 9]]);
|
|
82
|
+
assert.equal((await f.channel.heartbeat()).revision, 11);
|
|
83
|
+
});
|
|
84
|
+
test('absent registration reconnects at zero; inspection itself cannot advertise presence', async () => {
|
|
85
|
+
const f = fixture();
|
|
86
|
+
f.setResponse({ ok: true, organizationId: scope.organizationId, correlationId: uuid(90), registration: null });
|
|
87
|
+
assert.equal(await f.channel.inspect(), null);
|
|
88
|
+
await assert.rejects(f.channel.inbox(), /provider_session_channel_unavailable/);
|
|
89
|
+
f.setResponse((body) => ({ ok: true, organizationId: scope.organizationId, correlationId: uuid(90),
|
|
90
|
+
registration: body.action === 'inspect' ? null : { bindingId: scope.bindingId, workspaceId: scope.workspaceId,
|
|
91
|
+
endpointId: scope.endpointId, repositoryBindingId: scope.repositoryBindingId, membershipId: scope.membershipId,
|
|
92
|
+
deviceId: scope.deviceId, provider: 'codex', mode: 'bridge_owned', revision: 1, state: 'attached',
|
|
93
|
+
leaseUntil: '2026-09-26T05:01:00.000Z', replay: false } }));
|
|
94
|
+
assert.equal((await f.channel.reconnect()).revision, 1);
|
|
95
|
+
assert.equal(f.calls.filter(call => call.body.action === 'attach').length, 1);
|
|
96
|
+
});
|
|
97
|
+
test('reconnect never revives a tombstone, adopts another owner, or advertises a stale replay as live', async () => {
|
|
98
|
+
for (const change of [{ state: 'detached' }, { membershipId: uuid(50) }, { mode: 'cooperative' }, { replay: true }, { revision: 0 }]) {
|
|
99
|
+
const f = fixture();
|
|
100
|
+
f.setResponse({ ok: true, organizationId: scope.organizationId, correlationId: uuid(90), registration: {
|
|
101
|
+
bindingId: scope.bindingId, workspaceId: scope.workspaceId, endpointId: scope.endpointId,
|
|
102
|
+
repositoryBindingId: scope.repositoryBindingId, membershipId: scope.membershipId, deviceId: scope.deviceId,
|
|
103
|
+
provider: 'codex', mode: 'bridge_owned', revision: 5, state: 'attached',
|
|
104
|
+
leaseUntil: '2026-09-26T04:59:00.000Z', replay: false, ...change
|
|
105
|
+
} });
|
|
106
|
+
await assert.rejects(f.channel.reconnect(), /provider_session_channel_(response|revoked)/);
|
|
107
|
+
assert.equal(f.calls.length, 1);
|
|
108
|
+
await assert.rejects(f.channel.inbox(), /provider_session_channel_closed/);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
test('inspection loses authority during the wait and never follows up with an attachment', async () => {
|
|
112
|
+
const f = fixture();
|
|
113
|
+
f.onSend(() => f.setHeld(false));
|
|
114
|
+
await assert.rejects(f.channel.reconnect(), /provider_session_channel_owner_lost/);
|
|
115
|
+
assert.equal(f.calls.length, 1);
|
|
116
|
+
});
|
|
117
|
+
test('a recovered revision cannot turn an expired attachment receipt or a competing CAS update into live presence', async () => {
|
|
118
|
+
for (const failure of ['expired', 'competing']) {
|
|
119
|
+
const f = fixture();
|
|
120
|
+
f.setResponse((body) => ({ ok: true, organizationId: scope.organizationId, correlationId: uuid(90),
|
|
121
|
+
registration: { bindingId: scope.bindingId, workspaceId: scope.workspaceId, endpointId: scope.endpointId,
|
|
122
|
+
repositoryBindingId: scope.repositoryBindingId, membershipId: scope.membershipId, deviceId: scope.deviceId,
|
|
123
|
+
provider: 'codex', mode: 'bridge_owned', revision: body.action === 'inspect' ? 9 : failure === 'competing' ? 11 : 10,
|
|
124
|
+
state: 'attached', leaseUntil: failure === 'expired' || body.action === 'inspect'
|
|
125
|
+
? '2026-09-26T04:59:00.000Z' : '2026-09-26T05:01:00.000Z', replay: false } }));
|
|
126
|
+
await assert.rejects(f.channel.reconnect(), /provider_session_channel_response/);
|
|
127
|
+
await assert.rejects(f.channel.inbox(), /provider_session_channel_closed/);
|
|
128
|
+
assert.deepEqual(f.calls.map(call => call.body.action), ['inspect', 'attach']);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
test('inbox verifies signed offers and acceptance is not an answer', async () => {
|
|
132
|
+
const f = fixture();
|
|
133
|
+
await f.channel.attach();
|
|
134
|
+
const incoming = await f.channel.inbox();
|
|
135
|
+
assert.equal(incoming[0]?.target.bindingId, scope.bindingId);
|
|
136
|
+
assert.equal((await f.channel.accept(uuid(10), uuid(11))).state, 'accepted');
|
|
137
|
+
assert.equal((await f.channel.reply({ questionId: uuid(10), taskId: uuid(11), outcome: 'answered',
|
|
138
|
+
answer: 'Use the canonical catalog.\nPreserve its references.', failureCode: null })).state, 'answered');
|
|
139
|
+
});
|
|
140
|
+
test('questions are directed to an explicit binding with a bounded cost ceiling', async () => {
|
|
141
|
+
const f = fixture();
|
|
142
|
+
await f.channel.attach();
|
|
143
|
+
const result = await f.channel.ask({ targetBindingId: uuid(20), taskId: uuid(11), category: 'architecture',
|
|
144
|
+
question: 'Which catalog applies?', maximumProviderCostCents: 10 });
|
|
145
|
+
assert.equal(result.state, 'queued');
|
|
146
|
+
assert.equal(result.targetBindingId, uuid(20));
|
|
147
|
+
await assert.rejects(f.channel.ask({ targetBindingId: scope.bindingId, taskId: uuid(11), category: 'architecture',
|
|
148
|
+
question: 'Which catalog applies?', maximumProviderCostCents: 26 }), /provider_session_channel_input/);
|
|
149
|
+
});
|
|
150
|
+
test('unattached, expired and detached presence cannot be described as available', async () => {
|
|
151
|
+
const f = fixture();
|
|
152
|
+
await assert.rejects(f.channel.inbox(), /provider_session_channel_unavailable/);
|
|
153
|
+
await f.channel.attach();
|
|
154
|
+
f.setTime(new Date('2026-09-26T05:01:01.000Z'));
|
|
155
|
+
await assert.rejects(f.channel.inbox(), /provider_session_channel_unavailable/);
|
|
156
|
+
await assert.rejects(f.channel.heartbeat(), /provider_session_channel_unavailable/);
|
|
157
|
+
});
|
|
158
|
+
test('revocation before and after a network wait stops use of the same channel', async () => {
|
|
159
|
+
const before = fixture();
|
|
160
|
+
before.setHeld(false);
|
|
161
|
+
await assert.rejects(before.channel.attach(), /provider_session_channel_owner_lost/);
|
|
162
|
+
assert.equal(before.calls.length, 0);
|
|
163
|
+
const after = fixture();
|
|
164
|
+
after.onSend(() => after.setHeld(false));
|
|
165
|
+
await assert.rejects(after.channel.attach(), /provider_session_channel_owner_lost/);
|
|
166
|
+
after.setHeld(true);
|
|
167
|
+
await assert.rejects(after.channel.attach(), /provider_session_channel_closed/);
|
|
168
|
+
});
|
|
169
|
+
test('foreign identity, stale revision and unexpected response fields fail closed', async () => {
|
|
170
|
+
for (const key of ['membershipId', 'deviceId', 'bindingId', 'repositoryBindingId', 'revision', 'extra']) {
|
|
171
|
+
const f = fixture();
|
|
172
|
+
f.setResponse({ ok: true, organizationId: scope.organizationId, correlationId: uuid(90), registration: {
|
|
173
|
+
bindingId: scope.bindingId, workspaceId: scope.workspaceId, endpointId: scope.endpointId,
|
|
174
|
+
repositoryBindingId: scope.repositoryBindingId, membershipId: scope.membershipId, deviceId: scope.deviceId,
|
|
175
|
+
provider: 'codex', mode: 'bridge_owned', revision: 1, state: 'attached',
|
|
176
|
+
leaseUntil: '2026-09-26T05:01:00.000Z', replay: false, [key]: key === 'revision' ? 4 : uuid(50),
|
|
177
|
+
} });
|
|
178
|
+
await assert.rejects(f.channel.attach(), /provider_session_channel_response/);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
test('foreign, expired, unsigned and duplicate inbox offers never become consumable', async () => {
|
|
182
|
+
for (const offers of [[offer({ organizationId: 'org_foreign' })], [{ ...offer(), signature: 'bad' }],
|
|
183
|
+
[offer({ expiresAt: '2026-09-26T04:59:00.000Z' })], [offer(), offer()]]) {
|
|
184
|
+
const f = fixture();
|
|
185
|
+
await f.channel.attach();
|
|
186
|
+
f.setResponse({ ok: true, organizationId: scope.organizationId, result: { offers }, correlationId: uuid(90) });
|
|
187
|
+
await assert.rejects(f.channel.inbox(), /provider_session_channel_response/);
|
|
188
|
+
assert.equal(f.calls.filter(call => call.body.action === 'accept').length, 0);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
test('ambiguous network delivery disables further operations instead of executing or retargeting', async () => {
|
|
192
|
+
const f = fixture();
|
|
193
|
+
await f.channel.attach();
|
|
194
|
+
f.setResponse(new Error('socket-lost'));
|
|
195
|
+
await assert.rejects(f.channel.accept(uuid(10), uuid(11)), /provider_session_channel_uncertain/);
|
|
196
|
+
await assert.rejects(f.channel.inbox(), /provider_session_channel_closed/);
|
|
197
|
+
assert.equal(f.calls.length, 2);
|
|
198
|
+
});
|
|
199
|
+
test('completed reads require an immutable receipt and a valid answer/failure distinction', async () => {
|
|
200
|
+
const f = fixture();
|
|
201
|
+
await f.channel.attach();
|
|
202
|
+
const result = { questionId: uuid(10), taskId: uuid(11), targetBindingId: uuid(20), state: 'answered',
|
|
203
|
+
answer: 'The canonical catalog applies.', failureCode: null, replyReceiptHash: `sha256:${'a'.repeat(64)}` };
|
|
204
|
+
f.setResponse({ ok: true, organizationId: scope.organizationId, result, correlationId: uuid(90) });
|
|
205
|
+
assert.equal((await f.channel.read(uuid(10), uuid(11), uuid(20))).answer, result.answer);
|
|
206
|
+
const bad = fixture();
|
|
207
|
+
await bad.channel.attach();
|
|
208
|
+
bad.setResponse({ ok: true, organizationId: scope.organizationId, result: { ...result, replyReceiptHash: null }, correlationId: uuid(90) });
|
|
209
|
+
await assert.rejects(bad.channel.read(uuid(10), uuid(11), uuid(20)), /provider_session_channel_response/);
|
|
210
|
+
});
|
|
211
|
+
test('content secrets and oversize inputs are rejected before transport', async () => {
|
|
212
|
+
const f = fixture();
|
|
213
|
+
await f.channel.attach();
|
|
214
|
+
for (const question of ['x'.repeat(2001), 'Bearer secret-secret-secret', 'Read\u0000this', 'é'.repeat(1700)]) {
|
|
215
|
+
await assert.rejects(f.channel.ask({ targetBindingId: uuid(20), taskId: uuid(11), category: 'architecture', question,
|
|
216
|
+
maximumProviderCostCents: 0 }), /provider_session_channel_input/);
|
|
217
|
+
}
|
|
218
|
+
assert.equal(f.calls.length, 1);
|
|
219
|
+
});
|
|
220
|
+
test('hostile responses and identifiers cannot invoke getters or coercion hooks', async () => {
|
|
221
|
+
const f = fixture();
|
|
222
|
+
let invoked = 0;
|
|
223
|
+
const hostile = { toString() { invoked += 1; return uuid(20); } };
|
|
224
|
+
await assert.rejects(f.channel.ask({ targetBindingId: hostile, taskId: uuid(11),
|
|
225
|
+
category: 'architecture', question: 'Which catalog?', maximumProviderCostCents: 0 }), /provider_session_channel_input/);
|
|
226
|
+
const response = { ok: true, organizationId: scope.organizationId, correlationId: uuid(90) };
|
|
227
|
+
Object.defineProperty(response, 'registration', { enumerable: true, get() { invoked += 1; return {}; } });
|
|
228
|
+
f.setResponse(response);
|
|
229
|
+
await assert.rejects(f.channel.attach(), /provider_session_channel_response/);
|
|
230
|
+
assert.equal(invoked, 0);
|
|
231
|
+
});
|
|
232
|
+
test('malformed inbox disables the channel and never implicitly consumes another offer', async () => {
|
|
233
|
+
const f = fixture();
|
|
234
|
+
await f.channel.attach();
|
|
235
|
+
f.setResponse({ ok: true, organizationId: scope.organizationId, correlationId: uuid(90),
|
|
236
|
+
result: { offers: [offer({ question: 'Bearer private-private-private' })] } });
|
|
237
|
+
await assert.rejects(f.channel.inbox(), /provider_session_channel_response/);
|
|
238
|
+
await assert.rejects(f.channel.inbox(), /provider_session_channel_closed/);
|
|
239
|
+
});
|
|
240
|
+
test('a lease that expires during acceptance cannot authorize a provider turn', async () => {
|
|
241
|
+
const f = fixture();
|
|
242
|
+
await f.channel.attach();
|
|
243
|
+
f.onSend(() => f.setTime(new Date('2026-09-26T05:01:01.000Z')));
|
|
244
|
+
await assert.rejects(f.channel.accept(uuid(10), uuid(11)), /provider_session_channel_unavailable/);
|
|
245
|
+
});
|
|
246
|
+
//# sourceMappingURL=providerSessionChannel.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerSessionChannel.test.js","sourceRoot":"","sources":["../src/providerSessionChannel.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { LocalProviderSessionIdentity, LocalVault } from '@dharma-ai-labs/agent-fabric-local-vault';
|
|
2
|
+
import type { createProviderSessionChannel } from './providerSessionChannel.js';
|
|
3
|
+
export declare function reconcileProviderSessionReply(input: {
|
|
4
|
+
vault: LocalVault;
|
|
5
|
+
bindingId: string;
|
|
6
|
+
identity: LocalProviderSessionIdentity;
|
|
7
|
+
channel: Pick<ReturnType<typeof createProviderSessionChannel>, 'read' | 'reply'>;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
state: "reply_pending";
|
|
10
|
+
questionId: string;
|
|
11
|
+
taskId: string;
|
|
12
|
+
completionHash: string;
|
|
13
|
+
reasonCode: "content_or_contract_blocked" | "receipt_invalid" | "delivery_unconfirmed";
|
|
14
|
+
replyReceiptHash?: undefined;
|
|
15
|
+
correlationId?: undefined;
|
|
16
|
+
} | {
|
|
17
|
+
state: "reply_pending";
|
|
18
|
+
questionId: string;
|
|
19
|
+
taskId: string;
|
|
20
|
+
completionHash: string;
|
|
21
|
+
reasonCode: "answer_conflict" | "remote_not_answered";
|
|
22
|
+
replyReceiptHash?: undefined;
|
|
23
|
+
correlationId?: undefined;
|
|
24
|
+
} | {
|
|
25
|
+
state: "reply_reconciled";
|
|
26
|
+
questionId: string;
|
|
27
|
+
taskId: string;
|
|
28
|
+
completionHash: string;
|
|
29
|
+
replyReceiptHash: string;
|
|
30
|
+
correlationId: string;
|
|
31
|
+
reasonCode?: undefined;
|
|
32
|
+
} | null>;
|
|
33
|
+
//# sourceMappingURL=providerSessionReplyRecovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerSessionReplyRecovery.d.ts","sourceRoot":"","sources":["../src/providerSessionReplyRecovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACzG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAUhF,wBAAsB,6BAA6B,CAAC,KAAK,EAAE;IACzD,KAAK,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,4BAA4B,CAAC;IAC7E,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,4BAA4B,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CAClF;;;;;;;;;;;;;;;;;;;;;;;;UA4CA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { sha256, validateContract } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
3
|
+
// Reconcile one durable result before admitting more provider work. This function
|
|
4
|
+
// has no provider transport or budget API, so upload recovery cannot rerun a turn.
|
|
5
|
+
export async function reconcileProviderSessionReply(input) {
|
|
6
|
+
const pending = input.vault.listProviderSessionReplies(input.bindingId, input.identity)[0];
|
|
7
|
+
if (!pending)
|
|
8
|
+
return null;
|
|
9
|
+
const bytes = await input.vault.getBlob(pending.completionHash);
|
|
10
|
+
if (bytes.length > 16384)
|
|
11
|
+
throw new Error('provider_session_completion_invalid');
|
|
12
|
+
let value;
|
|
13
|
+
try {
|
|
14
|
+
value = JSON.parse(bytes.toString('utf8'));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error('provider_session_completion_invalid');
|
|
18
|
+
}
|
|
19
|
+
const contract = await validateContract(resolve(import.meta.dirname, 'schemas'), 'https://schemas.dharma-ai.io/provider-session-completion/v1', value);
|
|
20
|
+
if (!contract.ok)
|
|
21
|
+
throw new Error('provider_session_completion_invalid');
|
|
22
|
+
const completion = value;
|
|
23
|
+
if (!input.vault.getProviderSessionBinding(input.bindingId, input.identity)
|
|
24
|
+
|| completion.bindingId !== input.bindingId || completion.questionId !== pending.questionId
|
|
25
|
+
|| ['organizationId', 'repositoryBindingId', 'membershipId', 'deviceId', 'workspaceId', 'endpointId']
|
|
26
|
+
.some(key => completion[key] !== input.identity[key])
|
|
27
|
+
|| completion.targetEndpointId !== input.identity.endpointId || completion.answerHash !== sha256(completion.answer)) {
|
|
28
|
+
throw new Error('provider_session_completion_scope_mismatch');
|
|
29
|
+
}
|
|
30
|
+
let observed;
|
|
31
|
+
try {
|
|
32
|
+
observed = await input.channel.read(completion.questionId, completion.taskId, completion.bindingId);
|
|
33
|
+
if (observed.state === 'accepted') {
|
|
34
|
+
await input.channel.reply({ questionId: completion.questionId, taskId: completion.taskId,
|
|
35
|
+
outcome: 'answered', answer: completion.answer, failureCode: null });
|
|
36
|
+
observed = await input.channel.read(completion.questionId, completion.taskId, completion.bindingId);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const reason = error instanceof Error ? error.message : '';
|
|
41
|
+
const reasonCode = reason === 'provider_session_channel_input' ? 'content_or_contract_blocked'
|
|
42
|
+
: reason === 'provider_session_channel_response' ? 'receipt_invalid'
|
|
43
|
+
: reason === 'provider_session_channel_uncertain' ? 'delivery_unconfirmed' : null;
|
|
44
|
+
if (!reasonCode)
|
|
45
|
+
throw error;
|
|
46
|
+
return { state: 'reply_pending', questionId: completion.questionId, taskId: completion.taskId,
|
|
47
|
+
completionHash: pending.completionHash, reasonCode };
|
|
48
|
+
}
|
|
49
|
+
if (observed.state !== 'answered' || observed.answer !== completion.answer || !observed.replyReceiptHash) {
|
|
50
|
+
return { state: 'reply_pending', questionId: completion.questionId, taskId: completion.taskId,
|
|
51
|
+
completionHash: pending.completionHash,
|
|
52
|
+
reasonCode: observed.state === 'answered' ? 'answer_conflict' : 'remote_not_answered' };
|
|
53
|
+
}
|
|
54
|
+
input.vault.acknowledgeProviderSessionReply(input.bindingId, input.identity, completion.questionId, pending.completionHash);
|
|
55
|
+
return { state: 'reply_reconciled', questionId: completion.questionId, taskId: completion.taskId,
|
|
56
|
+
completionHash: pending.completionHash, replyReceiptHash: observed.replyReceiptHash, correlationId: observed.correlationId };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=providerSessionReplyRecovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerSessionReplyRecovery.js","sourceRoot":"","sources":["../src/providerSessionReplyRecovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://schemas.dharma-ai.io/provider-session-completion/v1",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"additionalProperties": false,
|
|
6
|
+
"required": ["schema", "organizationId", "repositoryBindingId", "membershipId", "deviceId", "workspaceId", "endpointId", "questionId", "taskId", "bindingId", "targetEndpointId", "answer", "answerHash"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schema": { "const": "dharma.provider-session-completion/v1" },
|
|
9
|
+
"organizationId": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,199}$" },
|
|
10
|
+
"repositoryBindingId": { "type": "string", "format": "uuid" },
|
|
11
|
+
"membershipId": { "type": "string", "format": "uuid" },
|
|
12
|
+
"deviceId": { "type": "string", "format": "uuid" },
|
|
13
|
+
"workspaceId": { "type": "string", "format": "uuid" },
|
|
14
|
+
"endpointId": { "type": "string", "format": "uuid" },
|
|
15
|
+
"questionId": { "type": "string", "format": "uuid" },
|
|
16
|
+
"taskId": { "type": "string", "format": "uuid" },
|
|
17
|
+
"bindingId": { "type": "string", "format": "uuid" },
|
|
18
|
+
"targetEndpointId": { "type": "string", "format": "uuid" },
|
|
19
|
+
"answer": { "type": "string", "minLength": 1, "maxLength": 2000 },
|
|
20
|
+
"answerHash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" }
|
|
21
|
+
}
|
|
22
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dharma-ai-labs/agent-fabric",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.108",
|
|
4
4
|
"description": "Local-first CLI for connecting coding agents to Dharma evaluation, orchestration, and signed Skill delivery",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/dharma-ai-labs/dharma-agent-fabric/tree/main/packages/cli#readme",
|
|
@@ -34,15 +34,15 @@
|
|
|
34
34
|
"test": "node --test dist/*.test.js"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@dharma-ai-labs/agent-fabric-contracts": "0.1.
|
|
38
|
-
"@dharma-ai-labs/agent-fabric-evidence-reduction": "0.2.
|
|
39
|
-
"@dharma-ai-labs/agent-fabric-local-vault": "0.1.
|
|
37
|
+
"@dharma-ai-labs/agent-fabric-contracts": "0.1.11",
|
|
38
|
+
"@dharma-ai-labs/agent-fabric-evidence-reduction": "0.2.19",
|
|
39
|
+
"@dharma-ai-labs/agent-fabric-local-vault": "0.1.21",
|
|
40
40
|
"@dharma-ai-labs/agent-fabric-policy": "0.1.4",
|
|
41
|
-
"@dharma-ai-labs/agent-fabric-provider-adapters": "0.1.
|
|
42
|
-
"@dharma-ai-labs/agent-fabric-relay-client": "0.2.
|
|
41
|
+
"@dharma-ai-labs/agent-fabric-provider-adapters": "0.1.21",
|
|
42
|
+
"@dharma-ai-labs/agent-fabric-relay-client": "0.2.23",
|
|
43
43
|
"@dharma-ai-labs/agent-fabric-sdk": "0.1.10",
|
|
44
44
|
"@dharma-ai-labs/agent-fabric-skill-manager": "0.2.10",
|
|
45
|
-
"@dharma-ai-labs/agent-fabric-task-runner": "0.1.
|
|
45
|
+
"@dharma-ai-labs/agent-fabric-task-runner": "0.1.23",
|
|
46
46
|
"ajv": "8.20.0",
|
|
47
47
|
"ajv-formats": "3.0.1",
|
|
48
48
|
"fs-native-extensions": "1.5.1"
|