@dharma-ai-labs/agent-fabric 0.2.209 → 0.2.211

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 (158) 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 +2 -1
  40. package/dist/containerRelayLifecycle.d.ts.map +1 -1
  41. package/dist/containerRelayLifecycle.js +12 -0
  42. package/dist/containerRelayLifecycle.js.map +1 -1
  43. package/dist/containerRelayLifecycle.test.js +38 -6
  44. package/dist/containerRelayLifecycle.test.js.map +1 -1
  45. package/dist/containerRelayRuntimeTrust.test.js +10 -0
  46. package/dist/containerRelayRuntimeTrust.test.js.map +1 -1
  47. package/dist/cooperativeInboxSession.d.ts +1 -1
  48. package/dist/demoPackage.d.ts +1 -1
  49. package/dist/demoWatchControl.d.ts +6 -6
  50. package/dist/deviceSigningMaintenanceController.d.ts +35 -0
  51. package/dist/deviceSigningMaintenanceController.d.ts.map +1 -0
  52. package/dist/deviceSigningMaintenanceController.js +197 -0
  53. package/dist/deviceSigningMaintenanceController.js.map +1 -0
  54. package/dist/deviceSigningMaintenanceController.test.d.ts +2 -0
  55. package/dist/deviceSigningMaintenanceController.test.d.ts.map +1 -0
  56. package/dist/deviceSigningMaintenanceController.test.js +67 -0
  57. package/dist/deviceSigningMaintenanceController.test.js.map +1 -0
  58. package/dist/deviceSigningMaintenanceFlow.test.d.ts +2 -0
  59. package/dist/deviceSigningMaintenanceFlow.test.d.ts.map +1 -0
  60. package/dist/deviceSigningMaintenanceFlow.test.js +196 -0
  61. package/dist/deviceSigningMaintenanceFlow.test.js.map +1 -0
  62. package/dist/index.d.ts +9 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +723 -470
  65. package/dist/index.js.map +1 -1
  66. package/dist/legacySigningMaintenanceBoundary.d.ts +14 -0
  67. package/dist/legacySigningMaintenanceBoundary.d.ts.map +1 -0
  68. package/dist/legacySigningMaintenanceBoundary.js +128 -0
  69. package/dist/legacySigningMaintenanceBoundary.js.map +1 -0
  70. package/dist/legacySigningMaintenanceBoundary.test.d.ts +2 -0
  71. package/dist/legacySigningMaintenanceBoundary.test.d.ts.map +1 -0
  72. package/dist/legacySigningMaintenanceBoundary.test.js +109 -0
  73. package/dist/legacySigningMaintenanceBoundary.test.js.map +1 -0
  74. package/dist/maintenanceControlCaller.test.d.ts +2 -0
  75. package/dist/maintenanceControlCaller.test.d.ts.map +1 -0
  76. package/dist/maintenanceControlCaller.test.js +119 -0
  77. package/dist/maintenanceControlCaller.test.js.map +1 -0
  78. package/dist/namedCodexThread.d.ts.map +1 -1
  79. package/dist/namedCodexThread.js +3 -1
  80. package/dist/namedCodexThread.js.map +1 -1
  81. package/dist/namedCodexThread.test.js +17 -1
  82. package/dist/namedCodexThread.test.js.map +1 -1
  83. package/dist/namedSessionMaintenance.d.ts +1 -1
  84. package/dist/namedSessionStartupFence.test.d.ts +2 -0
  85. package/dist/namedSessionStartupFence.test.d.ts.map +1 -0
  86. package/dist/namedSessionStartupFence.test.js +81 -0
  87. package/dist/namedSessionStartupFence.test.js.map +1 -0
  88. package/dist/namedSessionStoppedLock.d.ts +34 -0
  89. package/dist/namedSessionStoppedLock.d.ts.map +1 -0
  90. package/dist/namedSessionStoppedLock.js +108 -0
  91. package/dist/namedSessionStoppedLock.js.map +1 -0
  92. package/dist/namedSessionStoppedLock.test.d.ts +2 -0
  93. package/dist/namedSessionStoppedLock.test.d.ts.map +1 -0
  94. package/dist/namedSessionStoppedLock.test.js +104 -0
  95. package/dist/namedSessionStoppedLock.test.js.map +1 -0
  96. package/dist/providerSessionReplyRecovery.d.ts +1 -1
  97. package/dist/relayAutostart.d.ts +3 -0
  98. package/dist/relayAutostart.d.ts.map +1 -1
  99. package/dist/relayAutostart.js +45 -6
  100. package/dist/relayAutostart.js.map +1 -1
  101. package/dist/relayAutostart.test.js +49 -1
  102. package/dist/relayAutostart.test.js.map +1 -1
  103. package/dist/relayRuntimeUpgrade.d.ts +2 -1
  104. package/dist/relayRuntimeUpgrade.d.ts.map +1 -1
  105. package/dist/relayRuntimeUpgrade.js +3 -3
  106. package/dist/relayRuntimeUpgrade.js.map +1 -1
  107. package/dist/relayRuntimeUpgradeCaller.test.js +76 -0
  108. package/dist/relayRuntimeUpgradeCaller.test.js.map +1 -1
  109. package/dist/relaySigningMaintenanceUpgrade.d.ts +44 -0
  110. package/dist/relaySigningMaintenanceUpgrade.d.ts.map +1 -0
  111. package/dist/relaySigningMaintenanceUpgrade.js +249 -0
  112. package/dist/relaySigningMaintenanceUpgrade.js.map +1 -0
  113. package/dist/relaySigningMaintenanceUpgrade.test.d.ts +2 -0
  114. package/dist/relaySigningMaintenanceUpgrade.test.d.ts.map +1 -0
  115. package/dist/relaySigningMaintenanceUpgrade.test.js +230 -0
  116. package/dist/relaySigningMaintenanceUpgrade.test.js.map +1 -0
  117. package/dist/schemas/codex-signing-recovery-native-progress.schema.json +16 -0
  118. package/dist/schemas/device-enrollment-recovery-journal.schema.json +20 -0
  119. package/dist/schemas/device-signing-maintenance-challenge.schema.json +185 -0
  120. package/dist/schemas/device-signing-maintenance-completion.schema.json +98 -0
  121. package/dist/schemas/device-signing-maintenance-context-request.schema.json +68 -0
  122. package/dist/schemas/device-signing-maintenance-context.schema.json +137 -0
  123. package/dist/schemas/device-signing-maintenance-control.schema.json +12 -0
  124. package/dist/schemas/device-signing-maintenance-controller-progress.schema.json +26 -0
  125. package/dist/schemas/device-signing-maintenance-delivery-request.schema.json +45 -0
  126. package/dist/schemas/device-signing-maintenance-host-progress.schema.json +121 -0
  127. package/dist/schemas/device-signing-maintenance-plan.schema.json +136 -0
  128. package/dist/schemas/device-signing-maintenance-preparation.schema.json +56 -0
  129. package/dist/schemas/device-signing-recovery-candidate.schema.json +28 -0
  130. package/dist/schemas/device-signing-recovery-challenge.schema.json +52 -0
  131. package/dist/schemas/device-signing-recovery-completion.schema.json +23 -0
  132. package/dist/schemas/device-signing-recovery-delivery-request.schema.json +16 -0
  133. package/dist/schemas/device-signing-recovery-delivery.schema.json +22 -0
  134. package/dist/schemas/device-signing-recovery-host-progress.schema.json +28 -0
  135. package/dist/schemas/device-signing-recovery-offer-progress.schema.json +32 -0
  136. package/dist/schemas/device-signing-recovery-offer-read-request.schema.json +16 -0
  137. package/dist/schemas/device-signing-recovery-offer-registration-receipt.schema.json +16 -0
  138. package/dist/schemas/device-signing-recovery-offer-registration-request.schema.json +18 -0
  139. package/dist/schemas/device-signing-recovery-offer-response.schema.json +43 -0
  140. package/dist/schemas/device-signing-recovery-plan.schema.json +40 -0
  141. package/dist/schemas/device-signing-recovery-preparation.schema.json +23 -0
  142. package/dist/schemas/local-signing-maintenance-upgrade-journal.schema.json +34 -0
  143. package/dist/schemas/local-signing-maintenance-upgrade.schema.json +33 -0
  144. package/dist/schemas/provider-session-recovery-declaration.schema.json +21 -0
  145. package/dist/signingMaintenanceCohort.test.d.ts +2 -0
  146. package/dist/signingMaintenanceCohort.test.d.ts.map +1 -0
  147. package/dist/signingMaintenanceCohort.test.js +55 -0
  148. package/dist/signingMaintenanceCohort.test.js.map +1 -0
  149. package/dist/usage.d.ts.map +1 -1
  150. package/dist/usage.js +4 -2
  151. package/dist/usage.js.map +1 -1
  152. package/dist/wslRelayHost.d.ts +2 -0
  153. package/dist/wslRelayHost.d.ts.map +1 -1
  154. package/dist/wslRelayHost.js +35 -0
  155. package/dist/wslRelayHost.js.map +1 -1
  156. package/dist/wslRelayHost.test.js +81 -4
  157. package/dist/wslRelayHost.test.js.map +1 -1
  158. package/package.json +4 -4
@@ -0,0 +1,230 @@
1
+ import assert from 'node:assert/strict';
2
+ import { createHash } from 'node:crypto';
3
+ import { mkdir, mkdtemp, readFile, realpath, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import test from 'node:test';
7
+ import { upgradeRelayRuntime } from './relayRuntimeUpgrade.js';
8
+ import { validateContract } from '@dharma-ai-labs/agent-fabric-contracts';
9
+ import { commandExitCode } from './index.js';
10
+ const modulePath = './relaySigningMaintenanceUpgrade.js';
11
+ const hash = (value) => 'sha256:' + createHash('sha256').update(value).digest('hex');
12
+ const contents = (version) => ({ shell: `#!/bin/sh\n# verified ${version}\n`, windows: `@echo off\r\nrem verified ${version}\r\n` });
13
+ async function fixture() {
14
+ const root = await realpath(await mkdtemp(join(tmpdir(), 'relay-signing-maintenance-')));
15
+ const home = join(root, 'home'), workspace = join(root, 'repo');
16
+ await mkdir(join(workspace, '.dharma', 'bin'), { recursive: true });
17
+ await mkdir(join(home, 'relay'), { recursive: true });
18
+ const input = { home, workspace, organizationId: 'org_fixture', deviceId: '11111111-1111-4111-8111-111111111111',
19
+ workspaceId: '22222222-2222-4222-8222-222222222222', version: '0.2.211', trustGeneration: 2 };
20
+ let version = '0.2.207';
21
+ const calls = [];
22
+ const old = contents(version);
23
+ for (const [name, value] of Object.entries({ dharma: old.shell, 'dharma.cmd': old.windows }))
24
+ await writeFile(join(workspace, '.dharma', 'bin', name), value);
25
+ const deps = { assertStopped: async () => { calls.push('stopped'); }, assertNamedDisabled: async () => { calls.push('named-disabled'); },
26
+ assertStartupPaused: async () => { calls.push('paused'); },
27
+ inspectStartup: async () => ({ version, workspace }), configureStartup: async (next) => { calls.push('configure:' + next); version = next; },
28
+ stageStartup: async (next) => { calls.push('stage:' + next); version = next; },
29
+ launcherContents: contents, verifyPriorLaunchers: async (v, c) => JSON.stringify(c) === JSON.stringify(contents(v)),
30
+ verifyRecoveryLaunchers: async (v, c) => JSON.stringify(c) === JSON.stringify(contents(v)),
31
+ start: async () => { calls.push('start'); }, stop: async () => { calls.push('stop'); },
32
+ verify: async (v) => { calls.push('verify:' + v); }, assertRecoveredTrust: async (generation) => { calls.push('trust:' + generation); } };
33
+ return { input, deps, calls, old, currentVersion: () => version };
34
+ }
35
+ test('expired-signing upgrade stages offline without inventing a successful poll or starting a receiver', async () => {
36
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
37
+ const f = await fixture();
38
+ const result = await upgradeRelayForSigningMaintenance({ ...f.input, dryRun: false }, f.deps);
39
+ assert.equal(result.state, 'staged');
40
+ assert.equal(result.upgradeComplete, false);
41
+ assert.equal(result.ready, false);
42
+ assert.equal(result.runtimeObservation, 'not_performed');
43
+ assert.equal(result.nativeContinuationAuthorized, false);
44
+ assert.equal(f.currentVersion(), f.input.version);
45
+ assert(!f.calls.includes('start'));
46
+ assert(!f.calls.some(v => v.startsWith('trust:') || v.startsWith('verify:')));
47
+ assert(f.calls.indexOf('stage:0.2.207') < f.calls.indexOf('stage:0.2.211'));
48
+ await assert.rejects(readFile(join(f.input.home, 'relay', 'runtime-upgrade.json')), /ENOENT/);
49
+ });
50
+ test('the default plan and repeated staging preserve public bytes and never start a receiver', async () => {
51
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
52
+ const f = await fixture();
53
+ const plan = await upgradeRelayForSigningMaintenance({ ...f.input, dryRun: true }, f.deps);
54
+ assert.equal(plan.state, 'planned');
55
+ assert.equal(f.currentVersion(), '0.2.207');
56
+ assert(!f.calls.some(v => v.startsWith('configure:') || v.startsWith('stage:')));
57
+ await assert.rejects(readFile(join(f.input.home, 'relay', 'signing-maintenance-upgrade.json')), /ENOENT/);
58
+ const first = await upgradeRelayForSigningMaintenance(f.input, f.deps);
59
+ const bytes = await readFile(join(f.input.home, 'relay', 'signing-maintenance-upgrade.json'), 'utf8');
60
+ f.calls.length = 0;
61
+ const second = await upgradeRelayForSigningMaintenance(f.input, f.deps);
62
+ assert.equal(second.upgradeId, first.upgradeId);
63
+ assert.equal(second.state, 'staged');
64
+ assert.equal(await readFile(join(f.input.home, 'relay', 'signing-maintenance-upgrade.json'), 'utf8'), bytes);
65
+ assert(!f.calls.some(v => v === 'start' || v.startsWith('configure:') || v.startsWith('stage:')));
66
+ });
67
+ test('a failed legacy rollback cannot be erased or retried by a new release', async () => {
68
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
69
+ const f = await fixture();
70
+ const legacy = await upgradeRelayRuntime({ ...f.input, version: '0.2.209' }, { ...f.deps, verify: async () => { throw Error('expired signer'); } });
71
+ assert.equal(legacy.state, 'rollback_failed');
72
+ assert.equal(f.currentVersion(), '0.2.207');
73
+ const path = join(f.input.home, 'relay', 'runtime-upgrade.json'), bytes = await readFile(path, 'utf8');
74
+ f.calls.length = 0;
75
+ await assert.rejects(upgradeRelayForSigningMaintenance(f.input, f.deps), /prior_failure_custody_required/);
76
+ await assert.rejects(upgradeRelayForSigningMaintenance({ ...f.input, previousUpgradeSha256: hash(bytes + 'tampered') }, f.deps), /prior_failure_custody_required/);
77
+ assert.equal(await readFile(path, 'utf8'), bytes);
78
+ assert(!f.calls.some(v => v.startsWith('configure:') || v.startsWith('stage:') || v === 'start'));
79
+ const staged = await upgradeRelayForSigningMaintenance({ ...f.input, previousUpgradeSha256: hash(bytes) }, f.deps);
80
+ assert.equal(staged.state, 'staged');
81
+ assert.equal(await readFile(path, 'utf8'), bytes);
82
+ assert.equal(await readFile(join(f.input.home, 'relay', staged.priorJournalArchive), 'utf8'), bytes);
83
+ });
84
+ test('changed or half-restored failed journals are refused before launcher or startup mutation', async () => {
85
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
86
+ for (const change of ['launcher', 'context', 'state']) {
87
+ const f = await fixture();
88
+ await upgradeRelayRuntime({ ...f.input, version: '0.2.209' }, { ...f.deps, verify: async () => { throw Error('offline'); } });
89
+ const path = join(f.input.home, 'relay', 'runtime-upgrade.json');
90
+ let bytes = await readFile(path, 'utf8');
91
+ if (change === 'launcher')
92
+ await writeFile(join(f.input.workspace, '.dharma', 'bin', 'dharma'), contents('0.2.209').shell);
93
+ if (change === 'state') {
94
+ const value = JSON.parse(bytes);
95
+ value.state = 'installed';
96
+ bytes = JSON.stringify(value);
97
+ await writeFile(path, bytes, { mode: 0o600 });
98
+ }
99
+ f.calls.length = 0;
100
+ await assert.rejects(upgradeRelayForSigningMaintenance({ ...f.input, previousUpgradeSha256: hash(bytes) }, { ...f.deps, ...(change === 'context' ? { inspectStartup: async () => ({ version: '0.2.207', workspace: f.input.workspace, codexHome: '/different/profile' }) } : {}) }), /prior_failure_custody_required|launcher_conflict|context_conflict/);
101
+ assert.equal(await readFile(path, 'utf8'), bytes);
102
+ assert(!f.calls.some(v => v.startsWith('configure:') || v.startsWith('stage:') || v === 'start'));
103
+ }
104
+ });
105
+ test('finish requires recovered trust and a genuine current-version receiver verification', async () => {
106
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
107
+ const f = await fixture();
108
+ await upgradeRelayForSigningMaintenance(f.input, f.deps);
109
+ f.calls.length = 0;
110
+ await assert.rejects(upgradeRelayForSigningMaintenance({ ...f.input, finish: true }, { ...f.deps, assertRecoveredTrust: async () => { throw Error('trust still expired'); } }), /trust still expired/);
111
+ assert(!f.calls.includes('start'));
112
+ const result = await upgradeRelayForSigningMaintenance({ ...f.input, finish: true }, f.deps);
113
+ assert.equal(result.state, 'completed');
114
+ assert.equal(result.upgradeComplete, true);
115
+ assert.equal(result.ready, false);
116
+ assert(f.calls.indexOf('trust:2') < f.calls.indexOf('start'));
117
+ assert(f.calls.includes('verify:0.2.211'));
118
+ const ordinary = JSON.parse(await readFile(join(f.input.home, 'relay', 'runtime-upgrade.json'), 'utf8'));
119
+ assert.equal(ordinary.state, 'completed');
120
+ assert.equal(ordinary.version, f.input.version);
121
+ });
122
+ test('a failed finish preserves its attempt and cannot automatically resume or restart old expired services', async () => {
123
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
124
+ const f = await fixture();
125
+ await upgradeRelayForSigningMaintenance(f.input, f.deps);
126
+ f.calls.length = 0;
127
+ const failed = await upgradeRelayForSigningMaintenance({ ...f.input, finish: true }, { ...f.deps, verify: async () => { throw Error('no current poll'); } });
128
+ assert.equal(failed.state, 'finish_failed');
129
+ assert.equal(failed.upgradeComplete, false);
130
+ assert.equal(f.calls.filter(v => v === 'start').length, 1);
131
+ assert.equal(f.calls.filter(v => v === 'stop').length, 1);
132
+ await assert.rejects(upgradeRelayForSigningMaintenance({ ...f.input, finish: true }, f.deps), /reconciliation_required/);
133
+ assert.equal(f.calls.filter(v => v === 'start').length, 1);
134
+ });
135
+ test('staging rejects active or enabled named sessions and never removes old service locks', async () => {
136
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
137
+ for (const boundary of ['assertStopped', 'assertNamedDisabled']) {
138
+ const f = await fixture();
139
+ await assert.rejects(upgradeRelayForSigningMaintenance(f.input, { ...f.deps, [boundary]: async () => { throw Error('not quiescent'); } }), /not quiescent/);
140
+ assert(!f.calls.some(v => v === 'start' || v.startsWith('configure:') || v.startsWith('stage:')));
141
+ assert.equal(await readFile(join(f.input.workspace, '.dharma', 'bin', 'dharma'), 'utf8'), f.old.shell);
142
+ }
143
+ });
144
+ test('staging failure restores verified public files without opening protected stores or starting the old relay', async () => {
145
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
146
+ const f = await fixture();
147
+ let failed = false;
148
+ const result = await upgradeRelayForSigningMaintenance(f.input, { ...f.deps, stageStartup: async (v) => {
149
+ if (!failed) {
150
+ failed = true;
151
+ throw Error('configuration write failed');
152
+ }
153
+ return f.deps.stageStartup(v);
154
+ } });
155
+ assert.equal(result.state, 'staging_reverted');
156
+ assert.equal(result.upgradeComplete, false);
157
+ assert.equal(f.currentVersion(), '0.2.207');
158
+ assert.equal(await readFile(join(f.input.workspace, '.dharma', 'bin', 'dharma'), 'utf8'), f.old.shell);
159
+ assert(!f.calls.includes('start'));
160
+ assert(!f.calls.some(v => v.startsWith('trust:')));
161
+ });
162
+ test('stage and finish receipts and the persistent journal match their bounded contracts', async () => {
163
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
164
+ const f = await fixture();
165
+ const schemaRoot = join(import.meta.dirname, 'schemas');
166
+ const staged = await upgradeRelayForSigningMaintenance(f.input, f.deps);
167
+ const journal = JSON.parse(await readFile(join(f.input.home, 'relay', 'signing-maintenance-upgrade.json'), 'utf8'));
168
+ assert.equal((await validateContract(schemaRoot, 'https://schemas.dharma-ai.io/local-signing-maintenance-upgrade/v1', staged)).ok, true);
169
+ assert.equal((await validateContract(schemaRoot, 'https://schemas.dharma-ai.io/local-signing-maintenance-upgrade-journal/v1', journal)).ok, true);
170
+ assert.equal((await validateContract(schemaRoot, 'https://schemas.dharma-ai.io/local-signing-maintenance-upgrade/v1', { ...staged, upgradeComplete: true })).ok, false);
171
+ assert.equal((await validateContract(schemaRoot, 'https://schemas.dharma-ai.io/local-signing-maintenance-upgrade-journal/v1', { ...journal, password: 'SYNTHETIC_FORBIDDEN' })).ok, false);
172
+ const completed = await upgradeRelayForSigningMaintenance({ ...f.input, finish: true }, f.deps);
173
+ assert.equal((await validateContract(schemaRoot, 'https://schemas.dharma-ai.io/local-signing-maintenance-upgrade/v1', completed)).ok, true);
174
+ });
175
+ test('journal, launcher and original-history changes prevent finish before trust access or service start', async () => {
176
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
177
+ for (const change of ['journal', 'launcher', 'legacy']) {
178
+ const f = await fixture();
179
+ await upgradeRelayForSigningMaintenance(f.input, f.deps);
180
+ if (change === 'journal') {
181
+ const path = join(f.input.home, 'relay', 'signing-maintenance-upgrade.json');
182
+ const body = JSON.parse(await readFile(path, 'utf8'));
183
+ body.deviceId = '33333333-3333-4333-8333-333333333333';
184
+ await writeFile(path, JSON.stringify(body), { mode: 0o600 });
185
+ }
186
+ else if (change === 'launcher')
187
+ await writeFile(join(f.input.workspace, '.dharma', 'bin', 'dharma'), contents('0.2.209').shell);
188
+ else
189
+ await writeFile(join(f.input.home, 'relay', 'runtime-upgrade.json'), '{}', { mode: 0o600 });
190
+ f.calls.length = 0;
191
+ await assert.rejects(upgradeRelayForSigningMaintenance({ ...f.input, finish: true }, f.deps), /journal_unavailable|launcher_conflict|prior_journal_changed/);
192
+ assert(!f.calls.some(v => v === 'start' || v.startsWith('trust:')));
193
+ }
194
+ });
195
+ test('staging exit status cannot relabel an unfinished or failed finish as success', () => {
196
+ const base = { schema: 'dharma.local-signing-maintenance-upgrade/v1', ready: false, nativeContinuationAuthorized: false };
197
+ const stage = ['relay', 'upgrade', '--stage-signing-maintenance', '--apply'];
198
+ const finish = ['relay', 'upgrade', '--finish-signing-maintenance', '--apply'];
199
+ assert.equal(commandExitCode(stage, { ...base, state: 'staged', upgradeComplete: false }), 0);
200
+ assert.equal(commandExitCode(finish, { ...base, state: 'staged', upgradeComplete: false }), 2);
201
+ assert.equal(commandExitCode(finish, { ...base, state: 'completed', upgradeComplete: true }), 0);
202
+ for (const state of ['staging_failed', 'finish_failed', 'staging_reverted']) {
203
+ assert.equal(commandExitCode(stage, { ...base, state, upgradeComplete: false }), 2);
204
+ assert.equal(commandExitCode(finish, { ...base, state, upgradeComplete: false }), 2);
205
+ }
206
+ assert.equal(commandExitCode(stage, { ...base, state: 'staged', upgradeComplete: false, ready: true }), 2);
207
+ });
208
+ test('startup is paused and independently verified before either launcher can change', async () => {
209
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
210
+ const f = await fixture();
211
+ const result = await upgradeRelayForSigningMaintenance(f.input, { ...f.deps,
212
+ stageStartup: async (v) => {
213
+ assert.equal(await readFile(join(f.input.workspace, '.dharma', 'bin', 'dharma'), 'utf8'), v === '0.2.207' ? f.old.shell : contents(f.input.version).shell);
214
+ await f.deps.stageStartup(v);
215
+ },
216
+ assertStartupPaused: async () => { f.calls.push('paused'); assert(!f.calls.includes('start')); } });
217
+ assert.equal(result.state, 'staged');
218
+ const firstPause = f.calls.indexOf('paused'), writeTarget = f.calls.indexOf('stage:0.2.211');
219
+ assert(firstPause >= 0 && firstPause < writeTarget);
220
+ });
221
+ test('unconfirmed pause cannot mutate launchers or open protected trust', async () => {
222
+ const { upgradeRelayForSigningMaintenance } = await import(modulePath);
223
+ const f = await fixture();
224
+ const result = await upgradeRelayForSigningMaintenance(f.input, { ...f.deps, assertStartupPaused: async () => { throw Error('pause not acknowledged'); } });
225
+ assert.equal(result.state, 'staging_failed');
226
+ assert.equal(await readFile(join(f.input.workspace, '.dharma', 'bin', 'dharma'), 'utf8'), f.old.shell);
227
+ assert(!f.calls.includes('start'));
228
+ assert(!f.calls.some(v => v.startsWith('trust:')));
229
+ });
230
+ //# sourceMappingURL=relaySigningMaintenanceUpgrade.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relaySigningMaintenanceUpgrade.test.js","sourceRoot":"","sources":["../src/relaySigningMaintenanceUpgrade.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/codex-signing-recovery-native-progress/v1",
4
+ "title": "Original native-turn signing recovery progress, not customer readiness",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "operationId", "threadId", "turnId", "ready", "progress"],
8
+ "properties": {
9
+ "schema": {"const": "dharma.codex-signing-recovery-native-progress/v1"},
10
+ "operationId": {"type": "string", "format": "uuid"},
11
+ "threadId": {"type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9_-]+$"},
12
+ "turnId": {"type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9_-]+$"},
13
+ "ready": {"const": false},
14
+ "progress": {"anyOf": [{"type": "null"}, {"$ref": "https://schemas.dharma-ai.io/device-signing-recovery-host-progress/v1"}]}
15
+ }
16
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/device-enrollment-recovery-journal/v1",
4
+ "title": "Protected local write-ahead transaction, never task-supplied authority",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "acceptedAt", "challenge", "candidate", "previousAnchor", "previousCurrentHash", "previousLegacyHash", "previousConnectionMode", "nextConfigDigest"],
8
+ "properties": {
9
+ "schema": {"const": "dharma.device-enrollment-recovery-journal/v1"},
10
+ "acceptedAt": {"type": "string", "format": "date-time", "maxLength": 40},
11
+ "challenge": {"$ref": "https://schemas.dharma-ai.io/device-signing-recovery-challenge/v1"},
12
+ "candidate": {"$ref": "https://schemas.dharma-ai.io/device-signing-recovery-candidate/v1"},
13
+ "previousAnchor": {"type": "string", "minLength": 2, "maxLength": 65536},
14
+ "previousCurrentHash": {"anyOf": [{"type": "null"}, {"$ref": "#/$defs/digest"}]},
15
+ "previousLegacyHash": {"anyOf": [{"type": "null"}, {"$ref": "#/$defs/digest"}]},
16
+ "previousConnectionMode": {"enum": [null, "manual", "resume"]},
17
+ "nextConfigDigest": {"$ref": "#/$defs/digest"}
18
+ },
19
+ "$defs": {"digest": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$(?![\\s\\S])"}}
20
+ }
@@ -0,0 +1,185 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/device-signing-maintenance-challenge/v1",
4
+ "title": "Existing-device signing maintenance challenge; no native continuation authority",
5
+ "$comment": "Distinct device-maintenance origin. Device possession, both fresh browser consents, current member/device/source, independent configured-key provenance, publication CAS and protected installation remain separate and mandatory. Native session liveness or execution is not asserted.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema",
10
+ "origin",
11
+ "issuer",
12
+ "audience",
13
+ "recoveryId",
14
+ "approvalId",
15
+ "organizationId",
16
+ "recipientMembershipId",
17
+ "deviceId",
18
+ "installationId",
19
+ "workspaceId",
20
+ "publicKeyEd25519",
21
+ "credentialEncryptionPublicKey",
22
+ "repositoryFingerprint",
23
+ "policyRevision",
24
+ "scopeDigest",
25
+ "contractDigest",
26
+ "sourceSelectionDigest",
27
+ "controllerBindingDigest",
28
+ "previousAnchorHash",
29
+ "protectedConfigDigest",
30
+ "previousGeneration",
31
+ "previousKeysetHash",
32
+ "previousRootFingerprint",
33
+ "candidateGeneration",
34
+ "candidateKeysetHash",
35
+ "candidateRootFingerprint",
36
+ "candidateKeyVersionFingerprint",
37
+ "purpose",
38
+ "method",
39
+ "path",
40
+ "nonce",
41
+ "issuedAt",
42
+ "expiresAt",
43
+ "authenticator"
44
+ ],
45
+ "properties": {
46
+ "schema": {
47
+ "const": "dharma.device-signing-maintenance-challenge/v1"
48
+ },
49
+ "origin": {
50
+ "type": "string",
51
+ "maxLength": 256,
52
+ "format": "uri",
53
+ "pattern": "^https://[^/@?#\\s]+$"
54
+ },
55
+ "issuer": {
56
+ "type": "string",
57
+ "maxLength": 256,
58
+ "format": "uri",
59
+ "pattern": "^https://[^/@?#\\s]+$"
60
+ },
61
+ "audience": {
62
+ "const": "dharma.agent-fabric.signing-maintenance/v1"
63
+ },
64
+ "recoveryId": {
65
+ "$ref": "#/$defs/uuid"
66
+ },
67
+ "approvalId": {
68
+ "$ref": "#/$defs/uuid"
69
+ },
70
+ "organizationId": {
71
+ "type": "string",
72
+ "maxLength": 256,
73
+ "pattern": "^org_[A-Za-z0-9]+$"
74
+ },
75
+ "recipientMembershipId": {
76
+ "$ref": "#/$defs/uuid"
77
+ },
78
+ "deviceId": {
79
+ "$ref": "#/$defs/uuid"
80
+ },
81
+ "installationId": {
82
+ "$ref": "#/$defs/uuid"
83
+ },
84
+ "workspaceId": {
85
+ "$ref": "#/$defs/uuid"
86
+ },
87
+ "publicKeyEd25519": {
88
+ "$ref": "#/$defs/bytes32"
89
+ },
90
+ "credentialEncryptionPublicKey": {
91
+ "$ref": "#/$defs/bytes32"
92
+ },
93
+ "repositoryFingerprint": {
94
+ "$ref": "#/$defs/digest"
95
+ },
96
+ "policyRevision": {
97
+ "type": "string",
98
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
99
+ },
100
+ "scopeDigest": {
101
+ "$ref": "#/$defs/digest"
102
+ },
103
+ "contractDigest": {
104
+ "$ref": "#/$defs/digest"
105
+ },
106
+ "sourceSelectionDigest": {
107
+ "$ref": "#/$defs/digest"
108
+ },
109
+ "controllerBindingDigest": {
110
+ "$ref": "#/$defs/digest"
111
+ },
112
+ "previousAnchorHash": {
113
+ "$ref": "#/$defs/digest"
114
+ },
115
+ "protectedConfigDigest": {
116
+ "$ref": "#/$defs/digest"
117
+ },
118
+ "previousGeneration": {
119
+ "$ref": "#/$defs/generation"
120
+ },
121
+ "previousKeysetHash": {
122
+ "$ref": "#/$defs/digest"
123
+ },
124
+ "previousRootFingerprint": {
125
+ "$ref": "#/$defs/digest"
126
+ },
127
+ "candidateGeneration": {
128
+ "$ref": "#/$defs/generation"
129
+ },
130
+ "candidateKeysetHash": {
131
+ "$ref": "#/$defs/digest"
132
+ },
133
+ "candidateRootFingerprint": {
134
+ "$ref": "#/$defs/digest"
135
+ },
136
+ "candidateKeyVersionFingerprint": {
137
+ "$ref": "#/$defs/digest"
138
+ },
139
+ "purpose": {
140
+ "const": "expired_signing_trust_reapproval"
141
+ },
142
+ "method": {
143
+ "const": "POST"
144
+ },
145
+ "path": {
146
+ "const": "/api/v1/agent-fabric/signing-recovery"
147
+ },
148
+ "nonce": {
149
+ "$ref": "#/$defs/bytes32"
150
+ },
151
+ "issuedAt": {
152
+ "type": "string",
153
+ "format": "date-time",
154
+ "maxLength": 256
155
+ },
156
+ "expiresAt": {
157
+ "type": "string",
158
+ "format": "date-time",
159
+ "maxLength": 256
160
+ },
161
+ "authenticator": {
162
+ "$ref": "#/$defs/bytes32"
163
+ }
164
+ },
165
+ "$defs": {
166
+ "uuid": {
167
+ "type": "string",
168
+ "format": "uuid",
169
+ "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
170
+ },
171
+ "bytes32": {
172
+ "type": "string",
173
+ "pattern": "^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$"
174
+ },
175
+ "digest": {
176
+ "type": "string",
177
+ "pattern": "^sha256:[a-f0-9]{64}$"
178
+ },
179
+ "generation": {
180
+ "type": "integer",
181
+ "minimum": 1,
182
+ "maximum": 9007199254740991
183
+ }
184
+ }
185
+ }
@@ -0,0 +1,98 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/device-signing-maintenance-completion/v1",
4
+ "title": "Device trust maintenance completion; not native continuation",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema",
9
+ "organizationId",
10
+ "deviceId",
11
+ "installationId",
12
+ "workspaceId",
13
+ "recoveryId",
14
+ "approvalId",
15
+ "generation",
16
+ "keysetHash",
17
+ "rootFingerprint",
18
+ "publicationArtifactHash",
19
+ "observedAt",
20
+ "connectionMode",
21
+ "ready",
22
+ "disposition",
23
+ "authorityKind",
24
+ "nativeContinuationAuthorized"
25
+ ],
26
+ "properties": {
27
+ "schema": {
28
+ "const": "dharma.device-signing-maintenance-completion/v1"
29
+ },
30
+ "organizationId": {
31
+ "type": "string",
32
+ "pattern": "^org_[A-Za-z0-9]+$(?![\\s\\S])",
33
+ "maxLength": 200
34
+ },
35
+ "deviceId": {
36
+ "$ref": "#/$defs/uuid"
37
+ },
38
+ "installationId": {
39
+ "$ref": "#/$defs/uuid"
40
+ },
41
+ "workspaceId": {
42
+ "$ref": "#/$defs/uuid"
43
+ },
44
+ "recoveryId": {
45
+ "$ref": "#/$defs/uuid"
46
+ },
47
+ "approvalId": {
48
+ "$ref": "#/$defs/uuid"
49
+ },
50
+ "generation": {
51
+ "type": "integer",
52
+ "minimum": 1,
53
+ "maximum": 9007199254740991
54
+ },
55
+ "keysetHash": {
56
+ "$ref": "#/$defs/digest"
57
+ },
58
+ "rootFingerprint": {
59
+ "$ref": "#/$defs/digest"
60
+ },
61
+ "publicationArtifactHash": {
62
+ "$ref": "#/$defs/digest"
63
+ },
64
+ "observedAt": {
65
+ "type": "string",
66
+ "format": "date-time"
67
+ },
68
+ "connectionMode": {
69
+ "enum": [
70
+ "manual",
71
+ "resume"
72
+ ]
73
+ },
74
+ "ready": {
75
+ "const": false
76
+ },
77
+ "disposition": {
78
+ "const": "signing_trust_installed_not_onboarding_ready"
79
+ },
80
+ "authorityKind": {
81
+ "const": "device_trust_maintenance"
82
+ },
83
+ "nativeContinuationAuthorized": {
84
+ "const": false
85
+ }
86
+ },
87
+ "$defs": {
88
+ "uuid": {
89
+ "type": "string",
90
+ "format": "uuid",
91
+ "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$(?![\\s\\S])"
92
+ },
93
+ "digest": {
94
+ "type": "string",
95
+ "pattern": "^sha256:[a-f0-9]{64}$(?![\\s\\S])"
96
+ }
97
+ }
98
+ }