@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,354 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { generateKeyPairSync, randomBytes } from 'node:crypto';
|
|
3
|
+
import { mkdtemp } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join, resolve } from 'node:path';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
import { signCanonicalObject } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
8
|
+
import { LocalVault } from '@dharma-ai-labs/agent-fabric-local-vault';
|
|
9
|
+
import { openCooperativeInboxSession } from './cooperativeInboxSession.js';
|
|
10
|
+
import { openCodexBoundSession } from './codexBoundSession.js';
|
|
11
|
+
import { openCooperativeInboxSession as publicConsumer } from './index.js';
|
|
12
|
+
const { privateKey, publicKey } = generateKeyPairSync('ed25519');
|
|
13
|
+
const uuid = (last) => `50000000-0000-4000-8000-${String(last).padStart(12, '0')}`;
|
|
14
|
+
test('the owning runtime may import the cooperative consumer through the public package surface', () => {
|
|
15
|
+
assert.equal(publicConsumer, openCooperativeInboxSession);
|
|
16
|
+
});
|
|
17
|
+
async function fixture(owner = 'cooperative_session') {
|
|
18
|
+
const root = await mkdtemp(join(tmpdir(), 'dharma-cooperative-'));
|
|
19
|
+
const masterKey = randomBytes(32), now = new Date();
|
|
20
|
+
const binding = {
|
|
21
|
+
schema: 'dharma.local-provider-session-binding/v1', owner,
|
|
22
|
+
organizationId: 'org_test', repositoryBindingId: uuid(1), workspaceId: uuid(2), endpointId: uuid(3),
|
|
23
|
+
membershipId: uuid(4), deviceId: uuid(5), bindingId: uuid(6), provider: 'codex', sessionId: uuid(7),
|
|
24
|
+
workspaceRoot: resolve(root, 'repo'), createdAt: now.toISOString(),
|
|
25
|
+
expiresAt: new Date(now.getTime() + 3600000).toISOString(), maximumProviderCostCents: 25,
|
|
26
|
+
};
|
|
27
|
+
const identity = { organizationId: binding.organizationId, repositoryBindingId: binding.repositoryBindingId,
|
|
28
|
+
workspaceId: binding.workspaceId, endpointId: binding.endpointId, membershipId: binding.membershipId,
|
|
29
|
+
deviceId: binding.deviceId, provider: binding.provider };
|
|
30
|
+
const vault = await LocalVault.open({ root, masterKey });
|
|
31
|
+
vault.saveProviderSessionBinding(binding);
|
|
32
|
+
let context = {
|
|
33
|
+
provider: 'codex', sessionId: binding.sessionId, workspaceRoot: binding.workspaceRoot, active: true,
|
|
34
|
+
};
|
|
35
|
+
const unsigned = { schema: 'dharma.session-question/v1', questionId: uuid(10), taskId: uuid(11),
|
|
36
|
+
organizationId: binding.organizationId, repositoryBindingId: binding.repositoryBindingId,
|
|
37
|
+
source: { workspaceId: uuid(12), endpointId: uuid(13), membershipId: uuid(14), deviceId: uuid(15) },
|
|
38
|
+
target: { workspaceId: binding.workspaceId, endpointId: binding.endpointId, membershipId: binding.membershipId,
|
|
39
|
+
deviceId: binding.deviceId, bindingId: binding.bindingId, provider: 'codex' },
|
|
40
|
+
category: 'architecture', question: 'Which signed catalog applies?',
|
|
41
|
+
authority: { mode: 'read_only', readPaths: ['.'], network: 'deny', maximumProviderCostCents: 25 },
|
|
42
|
+
createdAt: now.toISOString(), expiresAt: new Date(now.getTime() + 60000).toISOString(),
|
|
43
|
+
nonce: uuid(16), signerKeyVersion: 'test-key',
|
|
44
|
+
};
|
|
45
|
+
const question = { ...unsigned, signature: signCanonicalObject(unsigned, privateKey) };
|
|
46
|
+
const actions = [], used = new Set();
|
|
47
|
+
let state = 'queued', answer = null, revision = 0, fail = null;
|
|
48
|
+
let after, disclosed = true, reserved = true;
|
|
49
|
+
const transport = { async signedPost(route, payload) {
|
|
50
|
+
const body = payload, action = String(body.action);
|
|
51
|
+
actions.push(action);
|
|
52
|
+
after?.(action);
|
|
53
|
+
if (fail === action)
|
|
54
|
+
throw new Error('synthetic acknowledgement lost');
|
|
55
|
+
const envelope = { ok: true, organizationId: binding.organizationId, correlationId: uuid(90) };
|
|
56
|
+
if (route.endsWith('provider-sessions')) {
|
|
57
|
+
if (action !== 'inspect')
|
|
58
|
+
revision++;
|
|
59
|
+
return { ...envelope, registration: revision === 0 ? null : {
|
|
60
|
+
bindingId: binding.bindingId, workspaceId: binding.workspaceId, endpointId: binding.endpointId,
|
|
61
|
+
repositoryBindingId: binding.repositoryBindingId, membershipId: binding.membershipId,
|
|
62
|
+
deviceId: binding.deviceId, provider: 'codex', mode: 'cooperative', revision,
|
|
63
|
+
state: action === 'detach' ? 'detached' : 'attached',
|
|
64
|
+
leaseUntil: new Date(Date.now() + 60000).toISOString(), replay: false,
|
|
65
|
+
} };
|
|
66
|
+
}
|
|
67
|
+
if (action === 'inbox')
|
|
68
|
+
return { ...envelope, result: { offers: state === 'queued' ? [question] : [] } };
|
|
69
|
+
if (action === 'accept')
|
|
70
|
+
state = 'accepted';
|
|
71
|
+
if (action === 'reply') {
|
|
72
|
+
state = String(body.outcome);
|
|
73
|
+
answer = state === 'answered' ? String(body.answer) : null;
|
|
74
|
+
}
|
|
75
|
+
if (action === 'read')
|
|
76
|
+
return { ...envelope, result: {
|
|
77
|
+
questionId: question.questionId, taskId: question.taskId, targetBindingId: binding.bindingId,
|
|
78
|
+
state, answer, failureCode: state === 'failed' ? 'execution_failed' : null,
|
|
79
|
+
replyReceiptHash: ['answered', 'failed'].includes(state) ? `sha256:${'a'.repeat(64)}` : null,
|
|
80
|
+
} };
|
|
81
|
+
return { ...envelope, result: { questionId: question.questionId, taskId: question.taskId,
|
|
82
|
+
targetBindingId: binding.bindingId, state, replay: false } };
|
|
83
|
+
} };
|
|
84
|
+
let reserveCalls = 0;
|
|
85
|
+
const input = { vault, bindingId: binding.bindingId, identity, channelTransport: transport,
|
|
86
|
+
currentSession: async () => context,
|
|
87
|
+
verifier: { resolvePublicKey: () => publicKey,
|
|
88
|
+
consume: async (id) => { if (used.has(id))
|
|
89
|
+
return false; used.add(id); return true; } },
|
|
90
|
+
authorizeContent: async () => disclosed,
|
|
91
|
+
budget: { reserve: async () => { reserveCalls++; return reserved; } }, };
|
|
92
|
+
return { ...input, binding, root, masterKey, question, actions, used, input,
|
|
93
|
+
setContext: (value) => { context = value; }, getContext: () => context,
|
|
94
|
+
setFail: (action) => { fail = action; }, onAction: (fn) => { after = fn; },
|
|
95
|
+
setDisclosure: (value) => { disclosed = value; }, setReservation: (value) => { reserved = value; },
|
|
96
|
+
reserves: () => reserveCalls, };
|
|
97
|
+
}
|
|
98
|
+
test('cooperative bindings cannot be driven by a bridge-owned app-server', async () => {
|
|
99
|
+
const f = await fixture();
|
|
100
|
+
let spawned = 0;
|
|
101
|
+
try {
|
|
102
|
+
await assert.rejects(openCodexBoundSession({ ...f.input,
|
|
103
|
+
openTransport: async () => { spawned++; throw new Error('must not spawn'); } }), /binding_unavailable/);
|
|
104
|
+
assert.equal(spawned, 0);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
f.vault.close();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
test('only the exact active cooperative session may attach; bridge bindings remain separate', async (t) => {
|
|
111
|
+
for (const wrong of ['missing', 'inactive', 'thread', 'workspace', 'bridge'])
|
|
112
|
+
await t.test(wrong, async () => {
|
|
113
|
+
const f = await fixture(wrong === 'bridge' ? 'dharma_bridge' : 'cooperative_session');
|
|
114
|
+
if (wrong === 'missing')
|
|
115
|
+
f.setContext(null);
|
|
116
|
+
if (wrong === 'inactive')
|
|
117
|
+
f.setContext({ ...f.getContext(), active: false });
|
|
118
|
+
if (wrong === 'thread')
|
|
119
|
+
f.setContext({ ...f.getContext(), sessionId: uuid(50) });
|
|
120
|
+
if (wrong === 'workspace')
|
|
121
|
+
f.setContext({ ...f.getContext(), workspaceRoot: resolve(f.root, 'other') });
|
|
122
|
+
try {
|
|
123
|
+
await assert.rejects(openCooperativeInboxSession(f.input), /cooperative_session_(binding_unavailable|owner_lost)/);
|
|
124
|
+
assert.equal(f.actions.length, 0);
|
|
125
|
+
const lease = f.vault.tryAcquireProviderSessionLease(f.binding.bindingId, f.identity);
|
|
126
|
+
assert.ok(lease);
|
|
127
|
+
lease.release();
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
f.vault.close();
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
test('in-session handler receives a verified bounded offer and returns an attributed immutable answer', async () => {
|
|
135
|
+
const f = await fixture(), owner = await openCooperativeInboxSession(f.input);
|
|
136
|
+
try {
|
|
137
|
+
let handlers = 0;
|
|
138
|
+
const result = await owner.runNext(async (offer) => {
|
|
139
|
+
handlers++;
|
|
140
|
+
assert.deepEqual(offer, f.question);
|
|
141
|
+
assert.throws(() => { offer.taskId = uuid(50); }, TypeError);
|
|
142
|
+
assert.throws(() => { offer.authority.readPaths.push('.'); }, TypeError);
|
|
143
|
+
return 'Consult signed catalog generation 13; preserve its source references.';
|
|
144
|
+
});
|
|
145
|
+
assert.equal(result.state, 'answered');
|
|
146
|
+
assert.equal(handlers, 1);
|
|
147
|
+
assert.equal(f.reserves(), 1);
|
|
148
|
+
assert.equal(f.used.size, 1);
|
|
149
|
+
assert.deepEqual(f.actions, ['inspect', 'attach', 'inbox', 'accept', 'reply']);
|
|
150
|
+
assert.equal(f.vault.listProviderSessionReplies(f.binding.bindingId, f.identity).length, 0);
|
|
151
|
+
const idle = await owner.runNext(async () => { throw new Error('must not execute'); });
|
|
152
|
+
assert.equal(idle.state, 'idle');
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
await owner.close();
|
|
156
|
+
f.vault.close();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
test('budget denial neither accepts nor consumes nor invokes the chat handler', async () => {
|
|
160
|
+
const f = await fixture();
|
|
161
|
+
f.setReservation(false);
|
|
162
|
+
const owner = await openCooperativeInboxSession(f.input);
|
|
163
|
+
try {
|
|
164
|
+
assert.equal((await owner.runNext(async () => { throw new Error('must not execute'); })).state, 'budget_denied');
|
|
165
|
+
assert.equal(f.actions.includes('accept'), false);
|
|
166
|
+
assert.equal(f.used.size, 0);
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
await owner.close();
|
|
170
|
+
f.vault.close();
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
test('owner changes during asynchronous budget or acceptance cannot reach the handler', async (t) => {
|
|
174
|
+
for (const boundary of ['budget', 'accept'])
|
|
175
|
+
await t.test(boundary, async () => {
|
|
176
|
+
const f = await fixture();
|
|
177
|
+
const input = boundary === 'budget' ? { ...f.input, budget: { reserve: async () => {
|
|
178
|
+
f.setContext({ ...f.getContext(), sessionId: uuid(51) });
|
|
179
|
+
return true;
|
|
180
|
+
} } } : f.input;
|
|
181
|
+
if (boundary === 'accept')
|
|
182
|
+
f.onAction(action => { if (action === 'accept')
|
|
183
|
+
f.setContext(null); });
|
|
184
|
+
const owner = await openCooperativeInboxSession(input);
|
|
185
|
+
try {
|
|
186
|
+
await assert.rejects(owner.runNext(async () => { throw new Error('must not execute'); }), /owner_lost/);
|
|
187
|
+
assert.equal(f.actions.includes('reply'), false);
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
await owner.close();
|
|
191
|
+
f.vault.close();
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
test('loss of current session after computation suppresses disclosure', async () => {
|
|
196
|
+
const f = await fixture(), owner = await openCooperativeInboxSession(f.input);
|
|
197
|
+
try {
|
|
198
|
+
await assert.rejects(owner.runNext(async () => { f.setContext(null); return 'An answer that must not escape.'; }), /owner_lost/);
|
|
199
|
+
assert.equal(f.actions.includes('reply'), false);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
await owner.close();
|
|
203
|
+
f.vault.close();
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
test('lost answer acknowledgement is recovered from the vault without another handler or reservation', async () => {
|
|
207
|
+
const f = await fixture();
|
|
208
|
+
f.setFail('reply');
|
|
209
|
+
const owner = await openCooperativeInboxSession(f.input);
|
|
210
|
+
let handlers = 0;
|
|
211
|
+
try {
|
|
212
|
+
assert.equal((await owner.runNext(async () => { handlers++; return 'Retain catalog generation 13.'; })).state, 'reply_pending');
|
|
213
|
+
assert.equal(f.vault.listProviderSessionReplies(f.binding.bindingId, f.identity).length, 1);
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
await owner.close();
|
|
217
|
+
f.vault.close();
|
|
218
|
+
}
|
|
219
|
+
const reopened = await LocalVault.open({ root: f.root, masterKey: f.masterKey });
|
|
220
|
+
f.setFail(null);
|
|
221
|
+
const successor = await openCooperativeInboxSession({ ...f.input, vault: reopened });
|
|
222
|
+
try {
|
|
223
|
+
assert.equal((await successor.runNext(async () => { handlers++; throw new Error('must not rerun'); })).state, 'reply_reconciled');
|
|
224
|
+
assert.equal(handlers, 1);
|
|
225
|
+
assert.equal(f.reserves(), 1);
|
|
226
|
+
assert.equal(reopened.listProviderSessionReplies(f.binding.bindingId, f.identity).length, 0);
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
await successor.close();
|
|
230
|
+
reopened.close();
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
test('disclosure denial leaves encrypted completion pending instead of rerunning work', async () => {
|
|
234
|
+
const f = await fixture(), owner = await openCooperativeInboxSession(f.input);
|
|
235
|
+
try {
|
|
236
|
+
const result = await owner.runNext(async () => { f.setDisclosure(false); return 'Retain the approved catalog.'; });
|
|
237
|
+
assert.equal(result.state, 'reply_pending');
|
|
238
|
+
assert.equal(f.actions.includes('reply'), false);
|
|
239
|
+
assert.equal(f.vault.listProviderSessionReplies(f.binding.bindingId, f.identity).length, 1);
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
await owner.close();
|
|
243
|
+
f.vault.close();
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
test('local fence rejects another consumer and explicit retirement is terminal', async () => {
|
|
247
|
+
const f = await fixture(), owner = await openCooperativeInboxSession(f.input);
|
|
248
|
+
try {
|
|
249
|
+
await assert.rejects(openCooperativeInboxSession(f.input), /lease_unavailable/);
|
|
250
|
+
assert.equal((await owner.retire()).serverDetached, true);
|
|
251
|
+
assert.equal(f.vault.getProviderSessionBinding(f.binding.bindingId, f.identity), null);
|
|
252
|
+
await assert.rejects(owner.runNext(async () => 'No.'), /unavailable/);
|
|
253
|
+
}
|
|
254
|
+
finally {
|
|
255
|
+
await owner.close();
|
|
256
|
+
f.vault.close();
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
test('a second question handler cannot overlap the current session turn', async () => {
|
|
260
|
+
const f = await fixture(), owner = await openCooperativeInboxSession(f.input);
|
|
261
|
+
let started, finish;
|
|
262
|
+
const began = new Promise(resolve => { started = resolve; });
|
|
263
|
+
const gate = new Promise(resolve => { finish = resolve; });
|
|
264
|
+
const first = owner.runNext(async () => { started(); await gate; return 'Use the approved catalog.'; });
|
|
265
|
+
await began;
|
|
266
|
+
try {
|
|
267
|
+
await assert.rejects(owner.runNext(async () => 'No.'), /busy/);
|
|
268
|
+
finish();
|
|
269
|
+
assert.equal((await first).state, 'answered');
|
|
270
|
+
}
|
|
271
|
+
finally {
|
|
272
|
+
finish();
|
|
273
|
+
await first.catch(() => undefined);
|
|
274
|
+
await owner.close();
|
|
275
|
+
f.vault.close();
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
test('expiry during a reservation wait prevents acceptance and current-chat execution', async (t) => {
|
|
279
|
+
const f = await fixture();
|
|
280
|
+
f.question.expiresAt = new Date(Date.now() + 30000).toISOString();
|
|
281
|
+
const { signature: _signature, ...unsigned } = f.question;
|
|
282
|
+
f.question.signature = signCanonicalObject(unsigned, privateKey);
|
|
283
|
+
t.mock.timers.enable({ apis: ['Date'], now: Date.now() });
|
|
284
|
+
const owner = await openCooperativeInboxSession({ ...f.input,
|
|
285
|
+
budget: { reserve: async () => { t.mock.timers.tick(31000); return true; } },
|
|
286
|
+
});
|
|
287
|
+
try {
|
|
288
|
+
await assert.rejects(owner.runNext(async () => { throw new Error('must not execute expired work'); }), /expired|unavailable/);
|
|
289
|
+
assert.equal(f.actions.includes('accept'), false);
|
|
290
|
+
}
|
|
291
|
+
finally {
|
|
292
|
+
await owner.close();
|
|
293
|
+
f.vault.close();
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
test('current-chat execution failure emits a typed failed receipt without disclosing exception text', async () => {
|
|
297
|
+
const f = await fixture(), owner = await openCooperativeInboxSession(f.input);
|
|
298
|
+
try {
|
|
299
|
+
const result = await owner.runNext(async () => { throw new Error('private internal exception'); });
|
|
300
|
+
assert.equal(result.state, 'failed');
|
|
301
|
+
assert.equal(f.actions.includes('reply'), true);
|
|
302
|
+
assert.equal(JSON.stringify(result).includes('private internal exception'), false);
|
|
303
|
+
}
|
|
304
|
+
finally {
|
|
305
|
+
await owner.close();
|
|
306
|
+
f.vault.close();
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
test('close keeps the fence until the current handler settles and suppresses its answer', async () => {
|
|
310
|
+
const f = await fixture(), owner = await openCooperativeInboxSession(f.input);
|
|
311
|
+
let started, finish;
|
|
312
|
+
const began = new Promise(resolve => { started = resolve; });
|
|
313
|
+
const gate = new Promise(resolve => { finish = resolve; });
|
|
314
|
+
const turn = owner.runNext(async () => { started(); await gate; return 'This answer must be withheld.'; });
|
|
315
|
+
await began;
|
|
316
|
+
const closing = owner.close();
|
|
317
|
+
assert.equal(f.vault.tryAcquireProviderSessionLease(f.binding.bindingId, f.identity), null);
|
|
318
|
+
finish();
|
|
319
|
+
await assert.rejects(turn, /owner_lost/);
|
|
320
|
+
await closing;
|
|
321
|
+
assert.equal(f.actions.includes('reply'), false);
|
|
322
|
+
const successor = f.vault.tryAcquireProviderSessionLease(f.binding.bindingId, f.identity);
|
|
323
|
+
assert.ok(successor);
|
|
324
|
+
successor.release();
|
|
325
|
+
f.vault.close();
|
|
326
|
+
});
|
|
327
|
+
test('revocation during replay claim prevents execution', async () => {
|
|
328
|
+
const f = await fixture();
|
|
329
|
+
const owner = await openCooperativeInboxSession({ ...f.input, verifier: { ...f.input.verifier,
|
|
330
|
+
consume: async () => { f.vault.revokeProviderSessionBinding(f.binding.bindingId, f.identity); return true; },
|
|
331
|
+
} });
|
|
332
|
+
try {
|
|
333
|
+
await assert.rejects(owner.runNext(async () => { throw new Error('must not execute'); }), /owner_lost/);
|
|
334
|
+
assert.equal(f.actions.includes('reply'), false);
|
|
335
|
+
}
|
|
336
|
+
finally {
|
|
337
|
+
await owner.close();
|
|
338
|
+
f.vault.close();
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
test('secret answers stay encrypted locally and are never transmitted', async () => {
|
|
342
|
+
const f = await fixture(), owner = await openCooperativeInboxSession(f.input);
|
|
343
|
+
try {
|
|
344
|
+
const result = await owner.runNext(async () => 'api_key=synthetic-do-not-disclose');
|
|
345
|
+
assert.equal(result.state, 'reply_pending');
|
|
346
|
+
assert.equal(f.actions.includes('reply'), false);
|
|
347
|
+
assert.equal(JSON.stringify(result).includes('synthetic-do-not-disclose'), false);
|
|
348
|
+
}
|
|
349
|
+
finally {
|
|
350
|
+
await owner.close();
|
|
351
|
+
f.vault.close();
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
//# sourceMappingURL=cooperativeInboxSession.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cooperativeInboxSession.test.js","sourceRoot":"","sources":["../src/cooperativeInboxSession.test.ts"],"names":[],"mappings":"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"}
|
package/dist/demoPackage.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"demoPackage.d.ts","sourceRoot":"","sources":["../src/demoPackage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC9G,OAAO,EAE+B,KAAK,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAGhH,OAAO,EAAqD,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"demoPackage.d.ts","sourceRoot":"","sources":["../src/demoPackage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC9G,OAAO,EAE+B,KAAK,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAGhH,OAAO,EAAqD,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAyB9G,MAAM,WAAW,uBAAuB;IAAG,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAE;AA6flH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE;IACjD,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,EAAE,IAAI,GAAE,uBAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4GpC"}
|
package/dist/demoPackage.js
CHANGED
|
@@ -8,7 +8,7 @@ import { getActiveSkillBundleAuthorization, installSkillBundle, rollbackUnconfir
|
|
|
8
8
|
import { loadDemoSigningTrust, scopePath, verifyDemoDevice } from './demoEnrollment.js';
|
|
9
9
|
import { receiveRepositoryPackageDelivery } from './repositoryPackageDelivery.js';
|
|
10
10
|
import { inventoryRepositoryPackage, readRepositoryPackageSnapshot, rebuildRepositoryPackageSnapshot, writeRepositoryPackageSnapshot } from './repositoryPackage.js';
|
|
11
|
-
import { initializeRepositoryKnowledge } from './repositoryKnowledge.js';
|
|
11
|
+
import { initializeRepositoryKnowledge, REPOSITORY_KNOWLEDGE_CATALOG_PATH, REPOSITORY_KNOWLEDGE_RELEASE_MANIFEST_PATH } from './repositoryKnowledge.js';
|
|
12
12
|
import { assertRepositoryInstallerOwnership, writeRepositoryInstallerFile } from './repositoryInstallerFiles.js';
|
|
13
13
|
import { pollRepositoryCandidate, synchronizeRepositoryCandidate } from './repositoryCandidateSync.js';
|
|
14
14
|
import { validateRepositorySourceAuthorization } from './repositorySourceAuthorization.js';
|
|
@@ -202,9 +202,6 @@ async function installActiveDemoPackage(input, deps) {
|
|
|
202
202
|
if (!signingKey)
|
|
203
203
|
throw new Error('Demo release is not signed by a currently trusted organization key.');
|
|
204
204
|
const releaseId = String(published.releaseId);
|
|
205
|
-
if (descriptor.policyHash !== input.authorization.policyHash) {
|
|
206
|
-
return { policyTransition: true, releaseId, policyHash: descriptor.policyHash };
|
|
207
|
-
}
|
|
208
205
|
const delivery = await receiveRepositoryPackageDelivery({
|
|
209
206
|
envelope, bundle, serverPublicKey: signingKey,
|
|
210
207
|
scope: { organizationId: scope.organizationId, repositoryBindingId: scope.repositoryId,
|
|
@@ -219,6 +216,19 @@ async function installActiveDemoPackage(input, deps) {
|
|
|
219
216
|
return response.chunk;
|
|
220
217
|
},
|
|
221
218
|
});
|
|
219
|
+
if (descriptor.policyHash !== input.authorization.policyHash) {
|
|
220
|
+
// Retain verified history for a replacement candidate, never activate stale authority.
|
|
221
|
+
delivery.assertCurrent();
|
|
222
|
+
const bytes = (path) => {
|
|
223
|
+
const file = delivery.files.find(row => row.path === path);
|
|
224
|
+
if (!file)
|
|
225
|
+
throw new Error('Demo policy transition is missing its verified knowledge.');
|
|
226
|
+
return Buffer.from(file.contentBase64, 'base64');
|
|
227
|
+
};
|
|
228
|
+
return { policyTransition: true, releaseId, policyHash: descriptor.policyHash,
|
|
229
|
+
retainedKnowledge: { catalogBytes: bytes(REPOSITORY_KNOWLEDGE_CATALOG_PATH),
|
|
230
|
+
manifestBytes: bytes(REPOSITORY_KNOWLEDGE_RELEASE_MANIFEST_PATH) } };
|
|
231
|
+
}
|
|
222
232
|
const installerWorkspaceId = scope.repositoryId;
|
|
223
233
|
const config = { hqUrl: normalizeHqUrl(scope.hqUrl), organizationId: scope.organizationId,
|
|
224
234
|
deviceId: trust.deviceId };
|
|
@@ -367,7 +377,7 @@ async function syncPublishedDemoSource(input, deps) {
|
|
|
367
377
|
const snapshot = await inventoryRepositoryPackage({ workspace: input.workspace,
|
|
368
378
|
organizationId: scope.organizationId, workspaceId: input.workspaceId,
|
|
369
379
|
repositoryBindingId: scope.repositoryId, repositoryAgentId: scope.repositoryId,
|
|
370
|
-
sourceAuthorization: input.authorization });
|
|
380
|
+
sourceAuthorization: input.authorization, retainedKnowledge: input.retainedKnowledge });
|
|
371
381
|
const fingerprint = snapshot.manifest.sourceFingerprint;
|
|
372
382
|
if (!fingerprint)
|
|
373
383
|
throw new Error('Demo source inventory has no fingerprint.');
|
|
@@ -569,16 +579,12 @@ export async function demoRepositoryPackage(input, deps = {}) {
|
|
|
569
579
|
if (!policyCoversPrior(previous, sourceAuthorization)) {
|
|
570
580
|
throw new Error('Demo current source policy narrows the active release policy; suspend or replace the release before synchronization.');
|
|
571
581
|
}
|
|
572
|
-
if (ownership !== 'signed')
|
|
573
|
-
return { ok: true,
|
|
574
|
-
stage: 'demo_repository_package_policy_transition', repositoryId: scope.repositoryId,
|
|
575
|
-
repositoryPackageState: 'published', candidate: null, ready: false,
|
|
576
|
-
activationState: 'signed_delivery_pending' };
|
|
577
582
|
const sourceSync = await syncPublishedDemoSource({ scope, workspace: input.workspace,
|
|
578
583
|
workspaceId: view.workspaceId, authorization: sourceAuthorization,
|
|
579
584
|
publishedSourceFingerprint: view.publishedSourceFingerprint,
|
|
580
585
|
activeReleaseId: view.activeReleaseId, candidateTransport, outboxRoot,
|
|
581
|
-
priorPolicyHash: previous.policyHash, publishedAuthorization: previous
|
|
586
|
+
priorPolicyHash: previous.policyHash, publishedAuthorization: previous,
|
|
587
|
+
retainedKnowledge: ownership === 'signed' ? undefined : installed.retainedKnowledge }, deps);
|
|
582
588
|
return { ok: true, stage: 'demo_repository_package_policy_transition',
|
|
583
589
|
repositoryId: scope.repositoryId, repositoryPackageState: 'published',
|
|
584
590
|
candidate: null, sourceSync, ready: false, activationState: 'candidate_pending' };
|