@dharma-ai-labs/agent-fabric 0.2.208 → 0.2.210

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 (120) hide show
  1. package/dist/bin.js +2 -2
  2. package/dist/bin.js.map +1 -1
  3. package/dist/bootstrapHostScope.test.js +1 -1
  4. package/dist/bootstrapHostScope.test.js.map +1 -1
  5. package/dist/bootstrapProcessCaller.test.js +1 -0
  6. package/dist/bootstrapProcessCaller.test.js.map +1 -1
  7. package/dist/bootstrapVaultScope.test.js +25 -1
  8. package/dist/bootstrapVaultScope.test.js.map +1 -1
  9. package/dist/codexBoundSession.d.ts +59 -0
  10. package/dist/codexBoundSession.d.ts.map +1 -1
  11. package/dist/codexBoundSession.js +140 -1
  12. package/dist/codexBoundSession.js.map +1 -1
  13. package/dist/codexInboxSession.d.ts +1 -1
  14. package/dist/codexInboxSession.d.ts.map +1 -1
  15. package/dist/codexRecoveryController.test.d.ts +2 -0
  16. package/dist/codexRecoveryController.test.d.ts.map +1 -0
  17. package/dist/codexRecoveryController.test.js +295 -0
  18. package/dist/codexRecoveryController.test.js.map +1 -0
  19. package/dist/codexScopedDispatch.test.js +2 -1
  20. package/dist/codexScopedDispatch.test.js.map +1 -1
  21. package/dist/codexSetupChildProvider.test.js +20 -0
  22. package/dist/codexSetupChildProvider.test.js.map +1 -1
  23. package/dist/codexSetupNativeHost.test.js +2 -1
  24. package/dist/codexSetupNativeHost.test.js.map +1 -1
  25. package/dist/codexSetupSessionCaller.test.js +1 -0
  26. package/dist/codexSetupSessionCaller.test.js.map +1 -1
  27. package/dist/codexSigningRecoveryNativeHost.d.ts +50 -0
  28. package/dist/codexSigningRecoveryNativeHost.d.ts.map +1 -0
  29. package/dist/codexSigningRecoveryNativeHost.js +186 -0
  30. package/dist/codexSigningRecoveryNativeHost.js.map +1 -0
  31. package/dist/codexSigningRecoveryNativeHost.test.d.ts +2 -0
  32. package/dist/codexSigningRecoveryNativeHost.test.d.ts.map +1 -0
  33. package/dist/codexSigningRecoveryNativeHost.test.js +475 -0
  34. package/dist/codexSigningRecoveryNativeHost.test.js.map +1 -0
  35. package/dist/codexSigningRecoveryTool.d.ts +25 -0
  36. package/dist/codexSigningRecoveryTool.d.ts.map +1 -0
  37. package/dist/codexSigningRecoveryTool.js +24 -0
  38. package/dist/codexSigningRecoveryTool.js.map +1 -0
  39. package/dist/containerRelayLifecycle.d.ts +1 -1
  40. package/dist/cooperativeInboxSession.d.ts +1 -1
  41. package/dist/demoPackage.d.ts +1 -1
  42. package/dist/demoWatchControl.d.ts +6 -6
  43. package/dist/deviceSigningMaintenanceController.d.ts +35 -0
  44. package/dist/deviceSigningMaintenanceController.d.ts.map +1 -0
  45. package/dist/deviceSigningMaintenanceController.js +197 -0
  46. package/dist/deviceSigningMaintenanceController.js.map +1 -0
  47. package/dist/deviceSigningMaintenanceController.test.d.ts +2 -0
  48. package/dist/deviceSigningMaintenanceController.test.d.ts.map +1 -0
  49. package/dist/deviceSigningMaintenanceController.test.js +67 -0
  50. package/dist/deviceSigningMaintenanceController.test.js.map +1 -0
  51. package/dist/deviceSigningMaintenanceFlow.test.d.ts +2 -0
  52. package/dist/deviceSigningMaintenanceFlow.test.d.ts.map +1 -0
  53. package/dist/deviceSigningMaintenanceFlow.test.js +196 -0
  54. package/dist/deviceSigningMaintenanceFlow.test.js.map +1 -0
  55. package/dist/index.d.ts +9 -0
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +612 -469
  58. package/dist/index.js.map +1 -1
  59. package/dist/legacySigningMaintenanceBoundary.d.ts +14 -0
  60. package/dist/legacySigningMaintenanceBoundary.d.ts.map +1 -0
  61. package/dist/legacySigningMaintenanceBoundary.js +128 -0
  62. package/dist/legacySigningMaintenanceBoundary.js.map +1 -0
  63. package/dist/legacySigningMaintenanceBoundary.test.d.ts +2 -0
  64. package/dist/legacySigningMaintenanceBoundary.test.d.ts.map +1 -0
  65. package/dist/legacySigningMaintenanceBoundary.test.js +109 -0
  66. package/dist/legacySigningMaintenanceBoundary.test.js.map +1 -0
  67. package/dist/namedCodexThread.d.ts.map +1 -1
  68. package/dist/namedCodexThread.js +3 -1
  69. package/dist/namedCodexThread.js.map +1 -1
  70. package/dist/namedCodexThread.test.js +17 -1
  71. package/dist/namedCodexThread.test.js.map +1 -1
  72. package/dist/namedSessionMaintenance.d.ts +1 -1
  73. package/dist/namedSessionStartupFence.test.d.ts +2 -0
  74. package/dist/namedSessionStartupFence.test.d.ts.map +1 -0
  75. package/dist/namedSessionStartupFence.test.js +81 -0
  76. package/dist/namedSessionStartupFence.test.js.map +1 -0
  77. package/dist/providerSessionReplyRecovery.d.ts +1 -1
  78. package/dist/relayRuntimeUpgrade.d.ts +1 -1
  79. package/dist/repositoryRelayPreludeDiagnostic.test.d.ts +2 -0
  80. package/dist/repositoryRelayPreludeDiagnostic.test.d.ts.map +1 -0
  81. package/dist/repositoryRelayPreludeDiagnostic.test.js +27 -0
  82. package/dist/repositoryRelayPreludeDiagnostic.test.js.map +1 -0
  83. package/dist/repositoryRelaySupervisor.d.ts +1 -1
  84. package/dist/repositoryRelaySupervisor.d.ts.map +1 -1
  85. package/dist/repositoryRelaySupervisor.js +1 -1
  86. package/dist/repositoryRelaySupervisor.js.map +1 -1
  87. package/dist/schemas/codex-signing-recovery-native-progress.schema.json +16 -0
  88. package/dist/schemas/device-enrollment-recovery-journal.schema.json +20 -0
  89. package/dist/schemas/device-signing-maintenance-challenge.schema.json +185 -0
  90. package/dist/schemas/device-signing-maintenance-completion.schema.json +98 -0
  91. package/dist/schemas/device-signing-maintenance-context-request.schema.json +68 -0
  92. package/dist/schemas/device-signing-maintenance-context.schema.json +137 -0
  93. package/dist/schemas/device-signing-maintenance-control.schema.json +12 -0
  94. package/dist/schemas/device-signing-maintenance-controller-progress.schema.json +26 -0
  95. package/dist/schemas/device-signing-maintenance-delivery-request.schema.json +45 -0
  96. package/dist/schemas/device-signing-maintenance-host-progress.schema.json +121 -0
  97. package/dist/schemas/device-signing-maintenance-plan.schema.json +136 -0
  98. package/dist/schemas/device-signing-maintenance-preparation.schema.json +56 -0
  99. package/dist/schemas/device-signing-recovery-candidate.schema.json +28 -0
  100. package/dist/schemas/device-signing-recovery-challenge.schema.json +52 -0
  101. package/dist/schemas/device-signing-recovery-completion.schema.json +23 -0
  102. package/dist/schemas/device-signing-recovery-delivery-request.schema.json +16 -0
  103. package/dist/schemas/device-signing-recovery-delivery.schema.json +22 -0
  104. package/dist/schemas/device-signing-recovery-host-progress.schema.json +28 -0
  105. package/dist/schemas/device-signing-recovery-offer-progress.schema.json +32 -0
  106. package/dist/schemas/device-signing-recovery-offer-read-request.schema.json +16 -0
  107. package/dist/schemas/device-signing-recovery-offer-registration-receipt.schema.json +16 -0
  108. package/dist/schemas/device-signing-recovery-offer-registration-request.schema.json +18 -0
  109. package/dist/schemas/device-signing-recovery-offer-response.schema.json +43 -0
  110. package/dist/schemas/device-signing-recovery-plan.schema.json +40 -0
  111. package/dist/schemas/device-signing-recovery-preparation.schema.json +23 -0
  112. package/dist/schemas/provider-session-recovery-declaration.schema.json +21 -0
  113. package/dist/signingMaintenanceCohort.test.d.ts +2 -0
  114. package/dist/signingMaintenanceCohort.test.d.ts.map +1 -0
  115. package/dist/signingMaintenanceCohort.test.js +55 -0
  116. package/dist/signingMaintenanceCohort.test.js.map +1 -0
  117. package/dist/usage.d.ts.map +1 -1
  118. package/dist/usage.js +3 -2
  119. package/dist/usage.js.map +1 -1
  120. package/package.json +4 -4
@@ -0,0 +1,14 @@
1
+ export interface LegacySigningMaintenanceBoundary {
2
+ readonly leaseDigest: string;
3
+ assertHeld(): Promise<void>;
4
+ }
5
+ /** Cooperative exclusion for a verified current managed CLI cohort. Old lock
6
+ * paths are held for compatibility, not as proof against archived binaries.
7
+ * Never reclaim old locks, stop a process, enable a session or alter identity. */
8
+ export declare function withLegacySigningMaintenanceBoundary<T>(input: {
9
+ home: string;
10
+ name: string;
11
+ signal: AbortSignal;
12
+ assertManagedCohort(): Promise<string>;
13
+ }, work: (boundary: LegacySigningMaintenanceBoundary) => Promise<T>): Promise<T>;
14
+ //# sourceMappingURL=legacySigningMaintenanceBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacySigningMaintenanceBoundary.d.ts","sourceRoot":"","sources":["../src/legacySigningMaintenanceBoundary.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gCAAgC;IAAE,QAAQ,CAAC,WAAW,EAAC,MAAM,CAAC;IAAA,UAAU,IAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAAC;AAK3G;;kFAEkF;AAClF,wBAAsB,oCAAoC,CAAC,CAAC,EAAE,KAAK,EAAC;IAAC,IAAI,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,WAAW,CAAC;IAC9G,mBAAmB,IAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAAC,EACtC,IAAI,EAAC,CAAC,QAAQ,EAAC,gCAAgC,KAAG,OAAO,CAAC,CAAC,CAAC,GAAE,OAAO,CAAC,CAAC,CAAC,CAoEzE"}
@@ -0,0 +1,128 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { link, lstat, mkdir, readFile, readdir, realpath, unlink, writeFile } from 'node:fs/promises';
3
+ import { dirname, resolve, sep } from 'node:path';
4
+ import { canonicalize } from '@dharma-ai-labs/agent-fabric-contracts';
5
+ import { namedSessionPaths, readNamedSession } from './namedSessionService.js';
6
+ const unavailable = () => { throw Error('legacy_signing_maintenance_boundary_unavailable'); };
7
+ const hash = (value) => 'sha256:' + createHash('sha256').update(canonicalize(value)).digest('hex');
8
+ /** Cooperative exclusion for a verified current managed CLI cohort. Old lock
9
+ * paths are held for compatibility, not as proof against archived binaries.
10
+ * Never reclaim old locks, stop a process, enable a session or alter identity. */
11
+ export async function withLegacySigningMaintenanceBoundary(input, work) {
12
+ const home = resolve(input.home), owned = [], operationId = randomUUID();
13
+ let active = true;
14
+ const assertDirectory = async (path) => {
15
+ const info = await lstat(path);
16
+ if (!info.isDirectory() || info.isSymbolicLink() || resolve(await realpath(path)) !== path
17
+ || process.platform !== 'win32' && (info.uid !== process.getuid() || (info.mode & 0o022) !== 0))
18
+ return unavailable();
19
+ };
20
+ const snapshot = async () => {
21
+ input.signal.throwIfAborted();
22
+ await assertDirectory(home);
23
+ await assertDirectory(resolve(home, 'sessions'));
24
+ const entries = await readdir(resolve(home, 'sessions'), { withFileTypes: true });
25
+ const names = entries.filter(value => /^[a-z][a-z0-9-]{0,47}$/.test(value.name)).map(value => value.name).sort();
26
+ if (names.length !== 1 || names[0] !== input.name)
27
+ return unavailable();
28
+ await assertDirectory(namedSessionPaths(home, input.name).root);
29
+ const registration = await readNamedSession(home, input.name);
30
+ if (!registration || registration.enabled)
31
+ return unavailable();
32
+ return canonicalize(registration);
33
+ };
34
+ const original = await snapshot();
35
+ if (typeof input.assertManagedCohort !== 'function')
36
+ return unavailable();
37
+ let cohortDigest;
38
+ const paths = ['autostart-mutation.lock', 'device.json.enrollment.lock', 'device.json.connection.lock', 'registry/workspaces.json.mutation.lock',
39
+ 'relay/supervisor.pid.lock', 'relay/relay.pid.lock', 'sessions/' + input.name + '/service.lock'].map(path => resolve(home, path));
40
+ const assertOwned = async (entry) => {
41
+ await assertDirectory(dirname(entry.path));
42
+ const info = await lstat(entry.path, { bigint: true });
43
+ if (!info.isFile() || info.isSymbolicLink() || info.dev !== entry.dev || info.ino !== entry.ino
44
+ || await readFile(entry.path, 'utf8') !== entry.bytes)
45
+ return unavailable();
46
+ };
47
+ const assertHeld = async () => {
48
+ if (!active || input.signal.aborted || await snapshot() !== original || owned.length !== paths.length)
49
+ return unavailable();
50
+ for (const entry of owned)
51
+ await assertOwned(entry);
52
+ const currentCohort = await input.assertManagedCohort();
53
+ if (!/^sha256:[a-f0-9]{64}$/.test(currentCohort) || cohortDigest !== undefined && currentCohort !== cohortDigest)
54
+ return unavailable();
55
+ cohortDigest = currentCohort;
56
+ // Relay PID files name daemons, while the .lock paths above name their
57
+ // mutually exclusive owner. Do not synthesize a running relay PID file.
58
+ for (const name of ['relay/relay.pid', 'relay/supervisor.pid']) {
59
+ try {
60
+ const text = (await readFile(resolve(home, name), 'utf8')).trim(), pid = Number(text);
61
+ if (!/^[1-9][0-9]*$/.test(text) || !Number.isSafeInteger(pid))
62
+ return unavailable();
63
+ try {
64
+ process.kill(pid, 0);
65
+ return unavailable();
66
+ }
67
+ catch (error) {
68
+ if (error.code !== 'ESRCH')
69
+ return unavailable();
70
+ }
71
+ }
72
+ catch (error) {
73
+ if (error.code !== 'ENOENT')
74
+ throw error;
75
+ }
76
+ }
77
+ input.signal.throwIfAborted();
78
+ };
79
+ let cleanupError = false;
80
+ try {
81
+ for (const path of paths) {
82
+ if (!path.startsWith(home + sep))
83
+ return unavailable();
84
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
85
+ await assertDirectory(dirname(path));
86
+ const candidate = path + '.maintenance-' + operationId, bytes = process.pid + '\n';
87
+ let candidateOwned;
88
+ try {
89
+ await writeFile(candidate, bytes, { flag: 'wx', mode: 0o600 });
90
+ const metadata = await lstat(candidate, { bigint: true });
91
+ candidateOwned = { path: candidate, dev: metadata.dev, ino: metadata.ino, bytes };
92
+ await assertOwned(candidateOwned);
93
+ input.signal.throwIfAborted();
94
+ // link is the same atomic publication primitive used by the legacy
95
+ // acquirePidLock. Existing or corrupt owners fail closed, no recovery.
96
+ await link(candidate, path);
97
+ owned.push({ ...candidateOwned, path });
98
+ }
99
+ finally {
100
+ if (candidateOwned) {
101
+ await assertOwned(candidateOwned);
102
+ await unlink(candidate);
103
+ }
104
+ }
105
+ }
106
+ await assertHeld();
107
+ const lease = Object.freeze({ leaseDigest: hash({ schema: 'dharma.legacy-signing-maintenance-boundary/v1', operationId,
108
+ pid: process.pid, registrationDigest: hash(original), cohortDigest,
109
+ paths: owned.map(entry => ({ path: entry.path, dev: String(entry.dev), ino: String(entry.ino) })) }), assertHeld });
110
+ const result = await work(lease);
111
+ await assertHeld();
112
+ return result;
113
+ }
114
+ finally {
115
+ active = false;
116
+ for (const entry of owned.reverse())
117
+ try {
118
+ await assertOwned(entry);
119
+ await unlink(entry.path);
120
+ }
121
+ catch {
122
+ cleanupError = true;
123
+ }
124
+ if (cleanupError)
125
+ throw Error('legacy_signing_maintenance_cleanup_unconfirmed');
126
+ }
127
+ }
128
+ //# sourceMappingURL=legacySigningMaintenanceBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacySigningMaintenanceBoundary.js","sourceRoot":"","sources":["../src/legacySigningMaintenanceBoundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=legacySigningMaintenanceBoundary.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacySigningMaintenanceBoundary.test.d.ts","sourceRoot":"","sources":["../src/legacySigningMaintenanceBoundary.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ import assert from 'node:assert/strict';
2
+ import { execFile } from 'node:child_process';
3
+ import { promisify } from 'node:util';
4
+ import { mkdir, mkdtemp, readFile, realpath, rm, unlink, writeFile } from 'node:fs/promises';
5
+ import { tmpdir } from 'node:os';
6
+ import { resolve } from 'node:path';
7
+ import test from 'node:test';
8
+ import { saveNamedSession } from './namedSessionService.js';
9
+ import * as boundary from './legacySigningMaintenanceBoundary.js';
10
+ const id = (n) => `df000000-0000-4000-8000-${String(n).padStart(12, '0')}`;
11
+ async function fixture() {
12
+ const home = await realpath(await mkdtemp(resolve(tmpdir(), 'mb-')));
13
+ await saveNamedSession(home, { schema: 'dharma.named-session/v1', name: 'reviewer', bindingId: id(1), enabled: false, maximumCostCents: 100, maximumTurnCostCents: 25,
14
+ identity: { organizationId: 'org_fixture', deviceId: id(2), membershipId: id(3), endpointId: id(4), workspaceId: id(5), repositoryBindingId: id(6), provider: 'codex' } });
15
+ return { home, name: 'reviewer', signal: new AbortController().signal, assertManagedCohort: async () => 'sha256:' + 'f'.repeat(64) };
16
+ }
17
+ test('held legacy startup locks exclude independent normal relay/supervisor acquisition for the whole maintenance window', async () => {
18
+ const f = await fixture();
19
+ try {
20
+ await boundary.withLegacySigningMaintenanceBoundary(f, async (owned) => {
21
+ await owned.assertHeld();
22
+ assert.match(owned.leaseDigest, /^sha256:[a-f0-9]{64}$/);
23
+ for (const method of ['acquireRelayProcessLease', 'acquireRelaySupervisorLease', 'acquireNamedSessionStartupAdmission']) {
24
+ const source = `const m=await import(${JSON.stringify(new URL('./index.js', import.meta.url).href)});try{await m.${method}(${JSON.stringify(f.home)});process.stdout.write('UNEXPECTED_START');process.exitCode=2;}catch{process.stdout.write('BLOCKED');}`;
25
+ const result = await promisify(execFile)(process.execPath, ['--input-type=module', '-e', source], { windowsHide: true, timeout: 15000 });
26
+ assert.equal(result.stdout, 'BLOCKED');
27
+ await owned.assertHeld();
28
+ }
29
+ const lock = resolve(f.home, 'sessions', 'reviewer', 'service.lock');
30
+ assert.equal((await readFile(lock, 'utf8')).trim(), String(process.pid));
31
+ });
32
+ await assert.rejects(readFile(resolve(f.home, 'relay', 'relay.pid.lock')), { code: 'ENOENT' });
33
+ }
34
+ finally {
35
+ await rm(f.home, { recursive: true, force: true });
36
+ }
37
+ });
38
+ test('old, unknown or changed managed cohort cannot enter or retain maintenance authority', async () => {
39
+ const f = await fixture();
40
+ try {
41
+ let entered = false;
42
+ await assert.rejects(boundary.withLegacySigningMaintenanceBoundary({ ...f, assertManagedCohort: async () => { throw Error('OLD_COHORT'); } }, async () => { entered = true; }), /OLD_COHORT/);
43
+ assert.equal(entered, false);
44
+ let digest = 'sha256:' + 'a'.repeat(64);
45
+ await assert.rejects(boundary.withLegacySigningMaintenanceBoundary({ ...f, assertManagedCohort: async () => digest }, async (owned) => {
46
+ digest = 'sha256:' + 'b'.repeat(64);
47
+ await owned.assertHeld();
48
+ }), /legacy_signing_maintenance_boundary_unavailable/);
49
+ await assert.rejects(readFile(resolve(f.home, 'autostart-mutation.lock')), { code: 'ENOENT' });
50
+ }
51
+ finally {
52
+ await rm(f.home, { recursive: true, force: true });
53
+ }
54
+ });
55
+ test('foreign or corrupt existing lock is preserved instead of recovered or silently accepted', async () => {
56
+ const f = await fixture();
57
+ try {
58
+ await mkdir(resolve(f.home, 'relay'));
59
+ const lock = resolve(f.home, 'relay', 'relay.pid.lock');
60
+ await writeFile(lock, 'not-a-known-owner');
61
+ let entered = false;
62
+ await assert.rejects(boundary.withLegacySigningMaintenanceBoundary(f, async () => { entered = true; }));
63
+ assert.equal(entered, false);
64
+ assert.equal(await readFile(lock, 'utf8'), 'not-a-known-owner');
65
+ }
66
+ finally {
67
+ await rm(f.home, { recursive: true, force: true });
68
+ }
69
+ });
70
+ test('changed registration or replaced lock withdraws authority and cleanup preserves the replacement', async () => {
71
+ const f = await fixture();
72
+ try {
73
+ const lock = resolve(f.home, 'relay', 'relay.pid.lock');
74
+ let retained;
75
+ await assert.rejects(boundary.withLegacySigningMaintenanceBoundary(f, async (owned) => {
76
+ retained = owned;
77
+ await unlink(lock);
78
+ await writeFile(lock, 'FOREIGN_REPLACEMENT');
79
+ await owned.assertHeld();
80
+ }));
81
+ assert.equal(await readFile(lock, 'utf8'), 'FOREIGN_REPLACEMENT');
82
+ await assert.rejects(retained.assertHeld());
83
+ }
84
+ finally {
85
+ await rm(f.home, { recursive: true, force: true });
86
+ }
87
+ });
88
+ test('registration change and cancellation invalidate the held boundary without undoing another actor edits', async () => {
89
+ const f = await fixture();
90
+ try {
91
+ const path = resolve(f.home, 'sessions', 'reviewer', 'registration.json'), original = JSON.parse(await readFile(path, 'utf8'));
92
+ await assert.rejects(boundary.withLegacySigningMaintenanceBoundary(f, async (owned) => {
93
+ await writeFile(path, JSON.stringify({ ...original, enabled: true }));
94
+ await owned.assertHeld();
95
+ }));
96
+ assert.equal(JSON.parse(await readFile(path, 'utf8')).enabled, true);
97
+ await writeFile(path, JSON.stringify(original));
98
+ const controller = new AbortController();
99
+ await assert.rejects(boundary.withLegacySigningMaintenanceBoundary({ ...f, signal: controller.signal }, async (owned) => {
100
+ controller.abort();
101
+ await owned.assertHeld();
102
+ }));
103
+ await assert.rejects(readFile(resolve(f.home, 'sessions', 'reviewer', 'service.lock')), { code: 'ENOENT' });
104
+ }
105
+ finally {
106
+ await rm(f.home, { recursive: true, force: true });
107
+ }
108
+ });
109
+ //# sourceMappingURL=legacySigningMaintenanceBoundary.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacySigningMaintenanceBoundary.test.js","sourceRoot":"","sources":["../src/legacySigningMaintenanceBoundary.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"namedCodexThread.d.ts","sourceRoot":"","sources":["../src/namedCodexThread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2EAA2E,CAAC;AAGzH,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAGhE,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAElH;AAED,wBAAsB,0BAA0B,CAAC,SAAS,EAAE,uBAAuB,EACjF,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,UAAQ,mBAEzF"}
1
+ {"version":3,"file":"namedCodexThread.d.ts","sourceRoot":"","sources":["../src/namedCodexThread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2EAA2E,CAAC;AAGzH,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAIhE,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAElH;AAED,wBAAsB,0BAA0B,CAAC,SAAS,EAAE,uBAAuB,EACjF,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,UAAQ,mBAEzF"}
@@ -2,6 +2,7 @@ import { isAbsolute, resolve } from 'node:path';
2
2
  import { CODEX_PEER_TOOLS } from './codexPeerTools.js';
3
3
  import { CODEX_SETUP_TOOL } from './codexSetupAdmission.js';
4
4
  import { inspectCodexBootstrapHostPreparation } from './bootstrapHostScope.js';
5
+ import { CODEX_SIGNING_RECOVERY_TOOL, recordNamedCodexRecoveryToolDeclaration } from './codexSigningRecoveryTool.js';
5
6
  export async function startNamedCodexThread(transport, workspaceRoot, name) {
6
7
  return startThread(transport, workspaceRoot, name);
7
8
  }
@@ -24,7 +25,7 @@ async function startThread(transport, workspaceRoot, name, setupScope, bindPubli
24
25
  }
25
26
  const created = await request('thread/start', { cwd: workspaceRoot,
26
27
  approvalPolicy: 'never', permissions: 'dharma_bridge', ephemeral: false,
27
- dynamicTools: setupScope ? structuredClone([...CODEX_PEER_TOOLS, setupTool]) : CODEX_PEER_TOOLS });
28
+ dynamicTools: structuredClone([...CODEX_PEER_TOOLS, CODEX_SIGNING_RECOVERY_TOOL, ...(setupScope ? [setupTool] : [])]) });
28
29
  const thread = created?.thread;
29
30
  if (!thread || typeof thread.id !== 'string' || !/^[A-Za-z0-9_-]{1,128}$/.test(thread.id)
30
31
  || thread.cwd !== workspaceRoot || thread.status?.type !== 'idle')
@@ -45,6 +46,7 @@ async function startThread(transport, workspaceRoot, name, setupScope, bindPubli
45
46
  if (read?.thread?.id !== thread.id || read.thread.cwd !== workspaceRoot || read.thread.name !== name
46
47
  || read.thread.status?.type !== 'idle')
47
48
  throw new Error('named_session_thread_invalid');
49
+ recordNamedCodexRecoveryToolDeclaration(transport, thread.id);
48
50
  return thread.id;
49
51
  }
50
52
  //# sourceMappingURL=namedCodexThread.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"namedCodexThread.js","sourceRoot":"","sources":["../src/namedCodexThread.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"namedCodexThread.js","sourceRoot":"","sources":["../src/namedCodexThread.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import assert from 'node:assert/strict';
2
2
  import test from 'node:test';
3
3
  import { resolve } from 'node:path';
4
4
  import { CODEX_PEER_TOOLS } from './codexPeerTools.js';
5
+ import { CODEX_SIGNING_RECOVERY_TOOL, CODEX_SIGNING_RECOVERY_TOOL_HASH, inspectNamedCodexRecoveryToolDeclaration } from './codexSigningRecoveryTool.js';
5
6
  import { startNamedCodexThread, startNamedCodexSetupThread } from './namedCodexThread.js';
6
7
  const workspace = resolve('synthetic-workspace');
7
8
  function fixture() {
@@ -18,7 +19,7 @@ test('new named threads materialize and resume before returning an identity for
18
19
  assert.equal(await startNamedCodexThread(f.transport, workspace, 'implementer'), 'thread-1');
19
20
  assert.deepEqual(f.calls, [
20
21
  { method: 'thread/start', params: { cwd: workspace, approvalPolicy: 'never', permissions: 'dharma_bridge',
21
- ephemeral: false, dynamicTools: CODEX_PEER_TOOLS } },
22
+ ephemeral: false, dynamicTools: [...CODEX_PEER_TOOLS, CODEX_SIGNING_RECOVERY_TOOL] } },
22
23
  { method: 'thread/name/set', params: { threadId: 'thread-1', name: 'implementer' } },
23
24
  { method: 'thread/archive', params: { threadId: 'thread-1' } },
24
25
  { method: 'thread/unarchive', params: { threadId: 'thread-1' } },
@@ -26,6 +27,20 @@ test('new named threads materialize and resume before returning an identity for
26
27
  { method: 'thread/read', params: { threadId: 'thread-1', includeTurns: false } },
27
28
  ]);
28
29
  });
30
+ test('an original named-thread creation declares the fixed recovery tool without granting recovery authority', async () => {
31
+ const f = fixture();
32
+ await startNamedCodexThread(f.transport, workspace, 'implementer');
33
+ const tools = f.calls[0].params.dynamicTools;
34
+ const recovery = tools.filter(tool => tool.name === 'dharma_signing_recovery');
35
+ assert.equal(recovery.length, 1, 'the recovery tool is absent from the original thread catalog');
36
+ assert.deepEqual(recovery[0].inputSchema.required, ['operationId', 'action']);
37
+ assert.equal(recovery[0].inputSchema.additionalProperties, false);
38
+ assert.equal(recovery[0].inputSchema.properties.operationId.format, 'uuid');
39
+ assert.equal(f.calls.some(call => call.method === 'turn/start'), false);
40
+ assert.equal(f.calls.some(call => call.method === 'thread/resume' && 'dynamicTools' in call.params), false);
41
+ assert.equal(inspectNamedCodexRecoveryToolDeclaration(f.transport, 'thread-1'), CODEX_SIGNING_RECOVERY_TOOL_HASH);
42
+ assert.equal(inspectNamedCodexRecoveryToolDeclaration(fixture().transport, 'thread-1'), null);
43
+ });
29
44
  test('invalid names and workspace roots never start a thread', async () => {
30
45
  const f = fixture();
31
46
  for (const [root, name] of [[workspace, '../foreign'], ['relative', 'implementer'], [workspace, 'x'.repeat(49)]]) {
@@ -77,6 +92,7 @@ test('persistence failures do not return or silently replace a new session ident
77
92
  assert.equal(f.calls.at(-1).method, failure);
78
93
  assert.equal(f.calls.filter(call => call.method === 'thread/start').length, 1);
79
94
  assert.equal(f.calls.some(call => call.method === 'turn/start'), false);
95
+ assert.equal(inspectNamedCodexRecoveryToolDeclaration(f.transport, 'thread-1'), null);
80
96
  }
81
97
  });
82
98
  test('unarchived and resumed scope mismatches fail before returning an identity', async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"namedCodexThread.test.js","sourceRoot":"","sources":["../src/namedCodexThread.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"namedCodexThread.test.js","sourceRoot":"","sources":["../src/namedCodexThread.test.ts"],"names":[],"mappings":"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"}
@@ -27,8 +27,8 @@ export declare function recoverStoppedNamedSession(input: {
27
27
  observedAt: string;
28
28
  organizationId: string;
29
29
  deviceId: string;
30
- workspaceId: string;
31
30
  provider: import("@dharma-ai-labs/agent-fabric-contracts").ProviderId;
31
+ workspaceId: string;
32
32
  repositoryBindingId: string;
33
33
  endpointId: string;
34
34
  membershipId: string;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=namedSessionStartupFence.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namedSessionStartupFence.test.d.ts","sourceRoot":"","sources":["../src/namedSessionStartupFence.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ import assert from 'node:assert/strict';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { resolve } from 'node:path';
4
+ import { compileFunction } from 'node:vm';
5
+ import test from 'node:test';
6
+ import ts from 'typescript';
7
+ async function caller(overrides = {}) {
8
+ const source = await readFile(new URL('../src/index.ts', import.meta.url), 'utf8');
9
+ const ast = ts.createSourceFile('index.ts', source, ts.ScriptTarget.Latest, true);
10
+ const node = ast.statements.find(value => ts.isFunctionDeclaration(value) && value.name?.text === 'namedSessionCommand');
11
+ const compiled = ts.transpileModule(node.getText(ast), { compilerOptions: { target: ts.ScriptTarget.ES2023, module: ts.ModuleKind.CommonJS } });
12
+ const calls = [], identity = { organizationId: 'org_fixture', deviceId: 'device', workspaceId: 'workspace', repositoryBindingId: 'binding', endpointId: 'endpoint' };
13
+ let held = false, enabled = false;
14
+ const deps = { process: { platform: 'linux', execPath: '/fixture/node', env: {}, once: () => { }, removeListener: () => { } },
15
+ namedSessionReadinessDiagnosticRequested: () => false, currentBootstrapHostScope: () => undefined,
16
+ currentAcceptedSetupSessionScope: () => undefined, currentNamedSessionChildOwner: () => undefined,
17
+ dharmaHome: () => '/fixture/home', required: (flags, name) => flags.get(name), resolve,
18
+ configPath: () => '/fixture/home/device.json',
19
+ namedSessionPaths: () => ({ root: '/fixture/home/sessions/new-name' }),
20
+ acquireNamedSessionStartupAdmission: async () => { held = true; calls.push('acquire'); return async () => { assert.equal(held, true); held = false; calls.push('release'); }; },
21
+ registry: async () => [{ path: '/fixture/repo', ...identity }], readDeviceConfig: async () => identity,
22
+ assertBootstrapHostSource: async () => { }, repositoryRoleScope: () => identity,
23
+ readNamedSession: async () => ({ identity, enabled: false }), verifyNamedSessionVisibleSkill: () => { },
24
+ verifyAgentFabricSkillInstallation: async () => ({}), repositorySharedReady: async () => ({}),
25
+ namedSessionRequest: async () => { throw Error('stopped'); },
26
+ saveNamedSession: async () => { assert.equal(held, true); enabled = true; calls.push('enable'); },
27
+ fileURLToPath: () => '/fixture/index.js',
28
+ spawn: () => { assert.equal(held, false, 'parent must release before child can acquire'); calls.push('spawn'); return { on: () => { }, unref: () => { } }; },
29
+ observeNamedSessionStartupChild: () => ({ readFailure: () => null, dispose: () => calls.push('dispose') }),
30
+ waitForNamedSessionStartup: async () => { assert.equal(held, false); calls.push('wait'); return { ok: true }; },
31
+ mkdir: async () => { assert.equal(held, true); calls.push('mkdir'); },
32
+ openBootstrapVault: async () => { assert.equal(held, true); calls.push('vault'); throw Error('FIXTURE_VAULT_STOP'); },
33
+ namedSessionStartupPhaseError: (_phase, error) => error, ...overrides };
34
+ const run = compileFunction(compiled.outputText.replaceAll('import.meta.url', '"file:///fixture/index.js"') + '\nreturn namedSessionCommand;', ['exports', ...Object.keys(deps)])({}, ...Object.values(deps));
35
+ return { calls, run, enabled: () => enabled, held: () => held, flags: new Map([['name', 'new-name'], ['workspace-id', 'workspace'], ['apply', true]]) };
36
+ }
37
+ test('actual start and direct serve refuse maintenance contention before registration, spawn or vault', async () => {
38
+ for (const action of ['start', 'serve']) {
39
+ const f = await caller({ acquireNamedSessionStartupAdmission: async () => { throw Error('STARTUP_FENCED'); },
40
+ registry: async () => { throw Error('REGISTRY_REACHED_BEFORE_FENCE'); } });
41
+ await assert.rejects(f.run(action, f.flags), /STARTUP_FENCED/);
42
+ assert.deepEqual(f.calls, []);
43
+ }
44
+ });
45
+ test('actual start serializes disabled enablement and releases admission before child fork and wait', async () => {
46
+ const f = await caller();
47
+ assert.deepEqual(await f.run('start', f.flags), { ok: true });
48
+ assert.equal(f.enabled(), true);
49
+ assert.equal(f.held(), false);
50
+ assert.deepEqual(f.calls, ['acquire', 'enable', 'release', 'spawn', 'wait', 'dispose']);
51
+ });
52
+ test('direct serve holds startup admission before private vault access and releases on failure', async () => {
53
+ const f = await caller();
54
+ await assert.rejects(f.run('serve', f.flags), /FIXTURE_VAULT_STOP/);
55
+ assert.deepEqual(f.calls, ['acquire', 'mkdir', 'vault', 'release']);
56
+ assert.equal(f.held(), false);
57
+ });
58
+ test('early scope failure releases startup admission without starting or touching the vault', async () => {
59
+ const f = await caller({ registry: async () => [] });
60
+ await assert.rejects(f.run('start', f.flags), /named_session_scope_mismatch/);
61
+ assert.deepEqual(f.calls, ['acquire', 'release']);
62
+ assert.equal(f.held(), false);
63
+ });
64
+ test('actual direct serve hands home-wide admission to its service lock before provider startup', async () => {
65
+ const effects = [];
66
+ const f = await caller({ openBootstrapVault: async () => ({ close: async () => { effects.push('vault-close'); } }),
67
+ acquirePidLock: async () => { effects.push('service-lock'); return async () => { effects.push('service-release'); }; },
68
+ assertNamedSessionStartupRegistration: () => { effects.push('registration-recheck'); },
69
+ AgentFabricClient: { open: async () => { assert.equal(f.held(), false); effects.push('provider-boundary'); throw Error('FIXTURE_PROVIDER_STOP'); } },
70
+ namedSessionStartupPhaseError: (_phase, error) => error });
71
+ await assert.rejects(f.run('serve', f.flags), /FIXTURE_PROVIDER_STOP/);
72
+ assert.deepEqual(f.calls, ['acquire', 'mkdir', 'release']);
73
+ assert.deepEqual(effects, ['service-lock', 'registration-recheck', 'provider-boundary', 'vault-close', 'service-release']);
74
+ });
75
+ test('a new-name start releases admission before spawn and direct child admission owns the next phase', async () => {
76
+ const f = await caller({ readNamedSession: async () => null });
77
+ assert.deepEqual(await f.run('start', f.flags), { ok: true });
78
+ assert.equal(f.enabled(), false);
79
+ assert.deepEqual(f.calls, ['acquire', 'release', 'spawn', 'wait', 'dispose']);
80
+ });
81
+ //# sourceMappingURL=namedSessionStartupFence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namedSessionStartupFence.test.js","sourceRoot":"","sources":["../src/namedSessionStartupFence.test.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ export declare function reconcileProviderSessionReply(input: {
11
11
  questionId: string;
12
12
  taskId: string;
13
13
  completionHash: string;
14
- reasonCode: "content_or_contract_blocked" | "receipt_invalid" | "delivery_unconfirmed";
14
+ reasonCode: "delivery_unconfirmed" | "content_or_contract_blocked" | "receipt_invalid";
15
15
  dispositionHash?: undefined;
16
16
  delivered?: undefined;
17
17
  replyReceiptHash?: undefined;
@@ -42,7 +42,7 @@ export declare function upgradeRelayRuntime(input: Input, deps: RelayUpgradeDepe
42
42
  workspaceId: string;
43
43
  previousVersion: string;
44
44
  version: string;
45
- state: State | "planned";
45
+ state: "planned" | State;
46
46
  createdAt: string;
47
47
  previousLauncherHash: string;
48
48
  enrollmentChanged: boolean;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=repositoryRelayPreludeDiagnostic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryRelayPreludeDiagnostic.test.d.ts","sourceRoot":"","sources":["../src/repositoryRelayPreludeDiagnostic.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { currentRepositoryRelayFailure, runRegisteredRepositoryRelays, withRepositoryRelayStage } from './repositoryRelaySupervisor.js';
4
+ for (const stage of ['session_open', 'vault_open']) {
5
+ test(`current-process diagnostics retain ${stage} without private error text`, () => {
6
+ const at = '2026-10-16T23:00:00.000Z', mtime = Date.parse(at) - 1000;
7
+ const receipt = { schema: 'dharma.local-repository-relay-failure/v1', organizationId: 'org_a',
8
+ deviceId: 'device_a', workspaceId: 'workspace_a', pid: 50, relayPidMtimeMs: mtime,
9
+ relayPidCtimeMs: mtime, at, stage, category: 'unexpected', privateDetail: 'must-not-leak' };
10
+ assert.deepEqual(currentRepositoryRelayFailure({ receipt, organizationId: 'org_a', deviceId: 'device_a',
11
+ workspaceId: 'workspace_a', pid: 50, relayPidMtimeMs: mtime, relayPidCtimeMs: mtime,
12
+ lastSuccessfulPollAt: null, now: Date.parse(at) + 1000 }), { at, stage, category: 'unexpected' });
13
+ });
14
+ test(`${stage} remains a bounded failed worker, not a raw error or successful poll`, async () => {
15
+ const controller = new AbortController(), events = [];
16
+ let ticks = 0;
17
+ await runRegisteredRepositoryRelays({ signal: controller.signal,
18
+ list: async () => [{ workspaceId: 'workspace_a', policyPath: '/a/.dharma/approved-policy.json' }],
19
+ run: () => withRepositoryRelayStage(stage, async () => { throw Error('private-key-and-response-body'); }),
20
+ observe: event => { events.push(event); }, now: () => 0,
21
+ wait: async () => { await Promise.resolve(); await Promise.resolve(); if (++ticks === 4)
22
+ controller.abort(); } });
23
+ assert.deepEqual(events, [{ workspaceId: 'workspace_a', code: 'repository_relay_failed', stage, category: 'unexpected' }]);
24
+ assert(!JSON.stringify(events).includes('private-key-and-response-body'));
25
+ });
26
+ }
27
+ //# sourceMappingURL=repositoryRelayPreludeDiagnostic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryRelayPreludeDiagnostic.test.js","sourceRoot":"","sources":["../src/repositoryRelayPreludeDiagnostic.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,6BAA6B,EAAE,6BAA6B,EAClE,wBAAwB,EAA4B,MAAM,gCAAgC,CAAC;AAE7F,KAAK,MAAM,KAAK,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,EAAE,CAAC;IACnD,IAAI,CAAC,sCAAsC,KAAK,6BAA6B,EAAE,GAAG,EAAE;QAClF,MAAM,EAAE,GAAG,0BAA0B,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QACrE,MAAM,OAAO,GAAG,EAAC,MAAM,EAAC,0CAA0C,EAAE,cAAc,EAAC,OAAO;YACxF,QAAQ,EAAC,UAAU,EAAE,WAAW,EAAC,aAAa,EAAE,GAAG,EAAC,EAAE,EAAE,eAAe,EAAC,KAAK;YAC7E,eAAe,EAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAC,YAAY,EAAE,aAAa,EAAC,eAAe,EAAC,CAAC;QAC1F,MAAM,CAAC,SAAS,CAAC,6BAA6B,CAAC,EAAC,OAAO,EAAE,cAAc,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU;YACjG,WAAW,EAAC,aAAa,EAAC,GAAG,EAAC,EAAE,EAAC,eAAe,EAAC,KAAK,EAAC,eAAe,EAAC,KAAK;YAC5E,oBAAoB,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAC,IAAI,EAAC,CAAC,EAAE,EAAC,EAAE,EAAC,KAAK,EAAC,QAAQ,EAAC,YAAY,EAAC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,KAAK,sEAAsE,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,EAAE,MAAM,GAAc,EAAE,CAAC;QACjE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,6BAA6B,CAAC,EAAC,MAAM,EAAC,UAAU,CAAC,MAAM;YAC3D,IAAI,EAAC,KAAK,IAAE,EAAE,CAAA,CAAC,EAAC,WAAW,EAAC,aAAa,EAAC,UAAU,EAAC,iCAAiC,EAAC,CAAC;YACxF,GAAG,EAAC,GAAE,EAAE,CAAA,wBAAwB,CAAC,KAA6B,EAAC,KAAK,IAAE,EAAE,GAAC,MAAM,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAA,CAAC,CAAC;YACxH,OAAO,EAAC,KAAK,CAAA,EAAE,GAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC,EAAC,GAAG,EAAC,GAAE,EAAE,CAAA,CAAC;YAC9C,IAAI,EAAC,KAAK,IAAE,EAAE,GAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA,IAAG,EAAE,KAAK,KAAG,CAAC;gBAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA,CAAC,EAAC,CAAC,CAAC;QACvG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAC,CAAC,EAAC,WAAW,EAAC,aAAa,EAAC,IAAI,EAAC,yBAAyB,EAAC,KAAK,EAAC,QAAQ,EAAC,YAAY,EAAC,CAAC,CAAC,CAAC;QAClH,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC"}