@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.
- package/dist/bin.js +2 -2
- package/dist/bin.js.map +1 -1
- package/dist/bootstrapHostScope.test.js +1 -1
- package/dist/bootstrapHostScope.test.js.map +1 -1
- package/dist/bootstrapProcessCaller.test.js +1 -0
- package/dist/bootstrapProcessCaller.test.js.map +1 -1
- package/dist/bootstrapVaultScope.test.js +25 -1
- package/dist/bootstrapVaultScope.test.js.map +1 -1
- package/dist/codexBoundSession.d.ts +59 -0
- package/dist/codexBoundSession.d.ts.map +1 -1
- package/dist/codexBoundSession.js +140 -1
- package/dist/codexBoundSession.js.map +1 -1
- package/dist/codexInboxSession.d.ts +1 -1
- package/dist/codexInboxSession.d.ts.map +1 -1
- package/dist/codexRecoveryController.test.d.ts +2 -0
- package/dist/codexRecoveryController.test.d.ts.map +1 -0
- package/dist/codexRecoveryController.test.js +295 -0
- package/dist/codexRecoveryController.test.js.map +1 -0
- package/dist/codexScopedDispatch.test.js +2 -1
- package/dist/codexScopedDispatch.test.js.map +1 -1
- package/dist/codexSetupChildProvider.test.js +20 -0
- package/dist/codexSetupChildProvider.test.js.map +1 -1
- package/dist/codexSetupNativeHost.test.js +2 -1
- package/dist/codexSetupNativeHost.test.js.map +1 -1
- package/dist/codexSetupSessionCaller.test.js +1 -0
- package/dist/codexSetupSessionCaller.test.js.map +1 -1
- package/dist/codexSigningRecoveryNativeHost.d.ts +50 -0
- package/dist/codexSigningRecoveryNativeHost.d.ts.map +1 -0
- package/dist/codexSigningRecoveryNativeHost.js +186 -0
- package/dist/codexSigningRecoveryNativeHost.js.map +1 -0
- package/dist/codexSigningRecoveryNativeHost.test.d.ts +2 -0
- package/dist/codexSigningRecoveryNativeHost.test.d.ts.map +1 -0
- package/dist/codexSigningRecoveryNativeHost.test.js +475 -0
- package/dist/codexSigningRecoveryNativeHost.test.js.map +1 -0
- package/dist/codexSigningRecoveryTool.d.ts +25 -0
- package/dist/codexSigningRecoveryTool.d.ts.map +1 -0
- package/dist/codexSigningRecoveryTool.js +24 -0
- package/dist/codexSigningRecoveryTool.js.map +1 -0
- package/dist/containerRelayLifecycle.d.ts +2 -1
- package/dist/containerRelayLifecycle.d.ts.map +1 -1
- package/dist/containerRelayLifecycle.js +12 -0
- package/dist/containerRelayLifecycle.js.map +1 -1
- package/dist/containerRelayLifecycle.test.js +38 -6
- package/dist/containerRelayLifecycle.test.js.map +1 -1
- package/dist/containerRelayRuntimeTrust.test.js +10 -0
- package/dist/containerRelayRuntimeTrust.test.js.map +1 -1
- package/dist/cooperativeInboxSession.d.ts +1 -1
- package/dist/demoPackage.d.ts +1 -1
- package/dist/demoWatchControl.d.ts +6 -6
- package/dist/deviceSigningMaintenanceController.d.ts +35 -0
- package/dist/deviceSigningMaintenanceController.d.ts.map +1 -0
- package/dist/deviceSigningMaintenanceController.js +197 -0
- package/dist/deviceSigningMaintenanceController.js.map +1 -0
- package/dist/deviceSigningMaintenanceController.test.d.ts +2 -0
- package/dist/deviceSigningMaintenanceController.test.d.ts.map +1 -0
- package/dist/deviceSigningMaintenanceController.test.js +67 -0
- package/dist/deviceSigningMaintenanceController.test.js.map +1 -0
- package/dist/deviceSigningMaintenanceFlow.test.d.ts +2 -0
- package/dist/deviceSigningMaintenanceFlow.test.d.ts.map +1 -0
- package/dist/deviceSigningMaintenanceFlow.test.js +196 -0
- package/dist/deviceSigningMaintenanceFlow.test.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +723 -470
- package/dist/index.js.map +1 -1
- package/dist/legacySigningMaintenanceBoundary.d.ts +14 -0
- package/dist/legacySigningMaintenanceBoundary.d.ts.map +1 -0
- package/dist/legacySigningMaintenanceBoundary.js +128 -0
- package/dist/legacySigningMaintenanceBoundary.js.map +1 -0
- package/dist/legacySigningMaintenanceBoundary.test.d.ts +2 -0
- package/dist/legacySigningMaintenanceBoundary.test.d.ts.map +1 -0
- package/dist/legacySigningMaintenanceBoundary.test.js +109 -0
- package/dist/legacySigningMaintenanceBoundary.test.js.map +1 -0
- package/dist/maintenanceControlCaller.test.d.ts +2 -0
- package/dist/maintenanceControlCaller.test.d.ts.map +1 -0
- package/dist/maintenanceControlCaller.test.js +119 -0
- package/dist/maintenanceControlCaller.test.js.map +1 -0
- package/dist/namedCodexThread.d.ts.map +1 -1
- package/dist/namedCodexThread.js +3 -1
- package/dist/namedCodexThread.js.map +1 -1
- package/dist/namedCodexThread.test.js +17 -1
- package/dist/namedCodexThread.test.js.map +1 -1
- package/dist/namedSessionMaintenance.d.ts +1 -1
- package/dist/namedSessionStartupFence.test.d.ts +2 -0
- package/dist/namedSessionStartupFence.test.d.ts.map +1 -0
- package/dist/namedSessionStartupFence.test.js +81 -0
- package/dist/namedSessionStartupFence.test.js.map +1 -0
- package/dist/namedSessionStoppedLock.d.ts +34 -0
- package/dist/namedSessionStoppedLock.d.ts.map +1 -0
- package/dist/namedSessionStoppedLock.js +108 -0
- package/dist/namedSessionStoppedLock.js.map +1 -0
- package/dist/namedSessionStoppedLock.test.d.ts +2 -0
- package/dist/namedSessionStoppedLock.test.d.ts.map +1 -0
- package/dist/namedSessionStoppedLock.test.js +104 -0
- package/dist/namedSessionStoppedLock.test.js.map +1 -0
- package/dist/providerSessionReplyRecovery.d.ts +1 -1
- package/dist/relayAutostart.d.ts +3 -0
- package/dist/relayAutostart.d.ts.map +1 -1
- package/dist/relayAutostart.js +45 -6
- package/dist/relayAutostart.js.map +1 -1
- package/dist/relayAutostart.test.js +49 -1
- package/dist/relayAutostart.test.js.map +1 -1
- package/dist/relayRuntimeUpgrade.d.ts +2 -1
- package/dist/relayRuntimeUpgrade.d.ts.map +1 -1
- package/dist/relayRuntimeUpgrade.js +3 -3
- package/dist/relayRuntimeUpgrade.js.map +1 -1
- package/dist/relayRuntimeUpgradeCaller.test.js +76 -0
- package/dist/relayRuntimeUpgradeCaller.test.js.map +1 -1
- package/dist/relaySigningMaintenanceUpgrade.d.ts +44 -0
- package/dist/relaySigningMaintenanceUpgrade.d.ts.map +1 -0
- package/dist/relaySigningMaintenanceUpgrade.js +249 -0
- package/dist/relaySigningMaintenanceUpgrade.js.map +1 -0
- package/dist/relaySigningMaintenanceUpgrade.test.d.ts +2 -0
- package/dist/relaySigningMaintenanceUpgrade.test.d.ts.map +1 -0
- package/dist/relaySigningMaintenanceUpgrade.test.js +230 -0
- package/dist/relaySigningMaintenanceUpgrade.test.js.map +1 -0
- package/dist/schemas/codex-signing-recovery-native-progress.schema.json +16 -0
- package/dist/schemas/device-enrollment-recovery-journal.schema.json +20 -0
- package/dist/schemas/device-signing-maintenance-challenge.schema.json +185 -0
- package/dist/schemas/device-signing-maintenance-completion.schema.json +98 -0
- package/dist/schemas/device-signing-maintenance-context-request.schema.json +68 -0
- package/dist/schemas/device-signing-maintenance-context.schema.json +137 -0
- package/dist/schemas/device-signing-maintenance-control.schema.json +12 -0
- package/dist/schemas/device-signing-maintenance-controller-progress.schema.json +26 -0
- package/dist/schemas/device-signing-maintenance-delivery-request.schema.json +45 -0
- package/dist/schemas/device-signing-maintenance-host-progress.schema.json +121 -0
- package/dist/schemas/device-signing-maintenance-plan.schema.json +136 -0
- package/dist/schemas/device-signing-maintenance-preparation.schema.json +56 -0
- package/dist/schemas/device-signing-recovery-candidate.schema.json +28 -0
- package/dist/schemas/device-signing-recovery-challenge.schema.json +52 -0
- package/dist/schemas/device-signing-recovery-completion.schema.json +23 -0
- package/dist/schemas/device-signing-recovery-delivery-request.schema.json +16 -0
- package/dist/schemas/device-signing-recovery-delivery.schema.json +22 -0
- package/dist/schemas/device-signing-recovery-host-progress.schema.json +28 -0
- package/dist/schemas/device-signing-recovery-offer-progress.schema.json +32 -0
- package/dist/schemas/device-signing-recovery-offer-read-request.schema.json +16 -0
- package/dist/schemas/device-signing-recovery-offer-registration-receipt.schema.json +16 -0
- package/dist/schemas/device-signing-recovery-offer-registration-request.schema.json +18 -0
- package/dist/schemas/device-signing-recovery-offer-response.schema.json +43 -0
- package/dist/schemas/device-signing-recovery-plan.schema.json +40 -0
- package/dist/schemas/device-signing-recovery-preparation.schema.json +23 -0
- package/dist/schemas/local-signing-maintenance-upgrade-journal.schema.json +34 -0
- package/dist/schemas/local-signing-maintenance-upgrade.schema.json +33 -0
- package/dist/schemas/provider-session-recovery-declaration.schema.json +21 -0
- package/dist/signingMaintenanceCohort.test.d.ts +2 -0
- package/dist/signingMaintenanceCohort.test.d.ts.map +1 -0
- package/dist/signingMaintenanceCohort.test.js +55 -0
- package/dist/signingMaintenanceCohort.test.js.map +1 -0
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +4 -2
- package/dist/usage.js.map +1 -1
- package/dist/wslRelayHost.d.ts +2 -0
- package/dist/wslRelayHost.d.ts.map +1 -1
- package/dist/wslRelayHost.js +35 -0
- package/dist/wslRelayHost.js.map +1 -1
- package/dist/wslRelayHost.test.js +81 -4
- package/dist/wslRelayHost.test.js.map +1 -1
- 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
|
+
}
|