@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.
Files changed (46) 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/demoPackage.d.ts +1 -0
  23. package/dist/demoPackage.d.ts.map +1 -1
  24. package/dist/demoPackage.js +17 -11
  25. package/dist/demoPackage.js.map +1 -1
  26. package/dist/demoPackage.test.js +58 -0
  27. package/dist/demoPackage.test.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.test.js +2 -2
  33. package/dist/providerSessionChannel.d.ts +129 -0
  34. package/dist/providerSessionChannel.d.ts.map +1 -0
  35. package/dist/providerSessionChannel.js +249 -0
  36. package/dist/providerSessionChannel.js.map +1 -0
  37. package/dist/providerSessionChannel.test.d.ts +2 -0
  38. package/dist/providerSessionChannel.test.d.ts.map +1 -0
  39. package/dist/providerSessionChannel.test.js +246 -0
  40. package/dist/providerSessionChannel.test.js.map +1 -0
  41. package/dist/providerSessionReplyRecovery.d.ts +33 -0
  42. package/dist/providerSessionReplyRecovery.d.ts.map +1 -0
  43. package/dist/providerSessionReplyRecovery.js +58 -0
  44. package/dist/providerSessionReplyRecovery.js.map +1 -0
  45. package/dist/schemas/provider-session-completion.schema.json +22 -0
  46. 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":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAoC,MAAM,0CAA0C,CAAC;AACxG,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,IAAI,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;AACjE,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,2BAA2B,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;AAE3F,IAAI,CAAC,2FAA2F,EAAE,GAAG,EAAE;IACrG,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,OAAO,CAAC,QAAiD,qBAAqB;IAC3F,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACpD,MAAM,OAAO,GAAgC;QAC3C,MAAM,EAAE,0CAA0C,EAAE,KAAK;QACzD,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;QACnG,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACnG,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAClE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,wBAAwB,EAAE,EAAE;KACzF,CAAC;IACF,MAAM,QAAQ,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QACzG,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY;QACpG,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACpG,IAAI,OAAO,GAA4F;QACrG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI;KACpG,CAAC;IACF,MAAM,QAAQ,GAAG,EAAE,MAAM,EAAE,4BAA4B,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QAC7F,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QACxF,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE;QACnG,MAAM,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY;YAC5G,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;QAC/E,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,+BAA+B;QACnE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,EAAE,EAAE;QACjG,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE;QACtF,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,UAAU;KAC9C,CAAC;IACF,MAAM,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;IACvF,MAAM,OAAO,GAAa,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IACvD,IAAI,KAAK,GAAG,QAAQ,EAAE,MAAM,GAAkB,IAAI,EAAE,QAAQ,GAAG,CAAC,EAAE,IAAI,GAAkB,IAAI,CAAC;IAC7F,IAAI,KAA6C,EAAE,SAAS,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACrF,MAAM,SAAS,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,OAAgB;YAClE,MAAM,IAAI,GAAG,OAAkC,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,IAAI,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/F,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACxC,IAAI,MAAM,KAAK,SAAS;oBAAE,QAAQ,EAAE,CAAC;gBACrC,OAAO,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC1D,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9F,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY;wBACpF,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ;wBAC5E,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;wBACpD,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK;qBACtE,EAAE,CAAC;YACN,CAAC;YACD,IAAI,MAAM,KAAK,OAAO;gBAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;YACzG,IAAI,MAAM,KAAK,QAAQ;gBAAE,KAAK,GAAG,UAAU,CAAC;YAC5C,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAAC,MAAM,GAAG,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAAC,CAAC;YACrH,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;wBACnD,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,SAAS;wBAC5F,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI;wBAC1E,gBAAgB,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;qBAC7F,EAAE,CAAC;YACJ,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACtF,eAAe,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjE,CAAC,EAAE,CAAC;IACJ,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS;QACxF,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;QACnC,QAAQ,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;YAC3C,OAAO,EAAE,KAAK,EAAE,EAAU,EAAE,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE;QACjG,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;QACvC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,GACtE,CAAC;IACF,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK;QACzE,UAAU,EAAE,CAAC,KAAqB,EAAE,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO;QACtF,OAAO,EAAE,CAAC,MAAqB,EAAE,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAgB,EAAE,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;QACvG,aAAa,EAAE,CAAC,KAAc,EAAE,EAAE,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,KAAc,EAAE,EAAE,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;QACpH,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,GAC7B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;IACpF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK;YACrD,aAAa,EAAE,KAAK,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC1G,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;YAAS,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uFAAuF,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACtG,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAU;QAAE,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACpH,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;YACtF,IAAI,KAAK,KAAK,SAAS;gBAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,KAAK,KAAK,UAAU;gBAAE,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,UAAU,EAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9E,IAAI,KAAK,KAAK,QAAQ;gBAAE,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,UAAU,EAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAClF,IAAI,KAAK,KAAK,WAAW;gBAAE,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,UAAU,EAAG,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACzG,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,sDAAsD,CAAC,CAAC;gBACnH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAClC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACtF,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;gBAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC;oBAAS,CAAC;gBAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;QAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;IACjH,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;YAC/C,QAAQ,EAAE,CAAC;YAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACzE,OAAO,uEAAuE,CAAC;QACjF,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5F,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;IACzF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACjH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iFAAiF,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAChG,KAAK,MAAM,QAAQ,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAU;QAAE,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACtF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;wBAChF,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,UAAU,EAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBAAC,OAAO,IAAI,CAAC;oBACzE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAChB,IAAI,QAAQ,KAAK,QAAQ;gBAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,MAAM,KAAK,QAAQ;oBAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClG,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,KAAK,CAAC,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;gBACxG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;YACnD,CAAC;oBAAS,CAAC;gBAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;gBAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;QACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;IACjF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,iCAAiC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACjI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gGAAgG,EAAE,KAAK,IAAI,EAAE;IAChH,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,OAAO,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAChI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9F,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,MAAM,SAAS,GAAG,MAAM,2BAA2B,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrF,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QAClI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/F,CAAC;YAAS,CAAC;QAAC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;IACjG,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,8BAA8B,CAAC,CAAC,CAAC,CAAC,CAAC;QACnH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9F,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9F,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;IAC1F,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAChF,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;QACvF,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACnF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,OAAoB,EAAE,MAAmB,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,MAAM,KAAK,CAAC;IACZ,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACnG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iFAAiF,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAChG,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC1D,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACjE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK;QAC1D,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE;KAC7E,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC9H,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;IAC/G,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC;IACrF,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;IACnG,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,OAAoB,EAAE,MAAmB,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3G,MAAM,KAAK,CAAC;IACZ,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5F,MAAM,EAAE,CAAC;IACT,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAAC,MAAM,OAAO,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1F,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;IACnE,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ;YAC3F,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;SAC7G,EAAE,CAAC,CAAC;IACL,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACxG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;IACjF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,KAAK,GAAG,MAAM,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,mCAAmC,CAAC,CAAC;QACpF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,KAAK,CAAC,CAAC;IACpF,CAAC;YAAS,CAAC;QAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC,CAAC,CAAC"}
@@ -57,6 +57,7 @@ export declare function demoRepositoryPackage(input: {
57
57
  alreadyInstalled: boolean;
58
58
  policyTransition?: undefined;
59
59
  policyHash?: undefined;
60
+ retainedKnowledge?: undefined;
60
61
  };
61
62
  acknowledgement: {
62
63
  receiptHash: string;
@@ -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;AAuB9G,MAAM,WAAW,uBAAuB;IAAG,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAE;AAmflH,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+GpC"}
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"}
@@ -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 }, deps);
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' };