@dharma-ai-labs/agent-fabric 0.2.107 → 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.
Files changed (40) hide show
  1. package/README.md +15 -0
  2. package/dist/codexBoundSession.d.ts +42 -0
  3. package/dist/codexBoundSession.d.ts.map +1 -0
  4. package/dist/codexBoundSession.js +106 -0
  5. package/dist/codexBoundSession.js.map +1 -0
  6. package/dist/codexBoundSession.test.d.ts +2 -0
  7. package/dist/codexBoundSession.test.d.ts.map +1 -0
  8. package/dist/codexBoundSession.test.js +619 -0
  9. package/dist/codexBoundSession.test.js.map +1 -0
  10. package/dist/codexInboxSession.d.ts +75 -0
  11. package/dist/codexInboxSession.d.ts.map +1 -0
  12. package/dist/codexInboxSession.js +157 -0
  13. package/dist/codexInboxSession.js.map +1 -0
  14. package/dist/cooperativeInboxSession.d.ts +89 -0
  15. package/dist/cooperativeInboxSession.d.ts.map +1 -0
  16. package/dist/cooperativeInboxSession.js +195 -0
  17. package/dist/cooperativeInboxSession.js.map +1 -0
  18. package/dist/cooperativeInboxSession.test.d.ts +2 -0
  19. package/dist/cooperativeInboxSession.test.d.ts.map +1 -0
  20. package/dist/cooperativeInboxSession.test.js +354 -0
  21. package/dist/cooperativeInboxSession.test.js.map +1 -0
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/index.test.js +2 -2
  27. package/dist/providerSessionChannel.d.ts +129 -0
  28. package/dist/providerSessionChannel.d.ts.map +1 -0
  29. package/dist/providerSessionChannel.js +249 -0
  30. package/dist/providerSessionChannel.js.map +1 -0
  31. package/dist/providerSessionChannel.test.d.ts +2 -0
  32. package/dist/providerSessionChannel.test.d.ts.map +1 -0
  33. package/dist/providerSessionChannel.test.js +246 -0
  34. package/dist/providerSessionChannel.test.js.map +1 -0
  35. package/dist/providerSessionReplyRecovery.d.ts +33 -0
  36. package/dist/providerSessionReplyRecovery.d.ts.map +1 -0
  37. package/dist/providerSessionReplyRecovery.js +58 -0
  38. package/dist/providerSessionReplyRecovery.js.map +1 -0
  39. package/dist/schemas/provider-session-completion.schema.json +22 -0
  40. 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.107",
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.10",
38
- "@dharma-ai-labs/agent-fabric-evidence-reduction": "0.2.18",
39
- "@dharma-ai-labs/agent-fabric-local-vault": "0.1.20",
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.20",
42
- "@dharma-ai-labs/agent-fabric-relay-client": "0.2.22",
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.22",
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"