@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,197 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
3
|
+
import { canonicalize } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
4
|
+
import { loadDeviceConfig, loadDeviceEnrollmentAnchor, withDeviceSigningControl, readOwnedSigningMaintenanceContext, prepareOwnedSigningMaintenance, submitOwnedSigningRecoveryPreparation, progressOwnedSigningRecoveryOffer, completeOwnedSigningRecovery, inspectOwnedSigningRecovery, disposeOwnedSigningRecovery, OwnedSigningRecoveryError } from '@dharma-ai-labs/agent-fabric-relay-client';
|
|
5
|
+
import { readNamedSession } from './namedSessionService.js';
|
|
6
|
+
const UUID = /^[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])/;
|
|
7
|
+
const hash = (v) => 'sha256:' + createHash('sha256').update(canonicalize(v)).digest('hex');
|
|
8
|
+
const unavailable = (phase) => { throw Error('device_signing_maintenance_' + phase); };
|
|
9
|
+
const immutableDevice = (config) => ({ hqUrl: config.hqUrl, organizationId: config.organizationId, deviceId: config.deviceId,
|
|
10
|
+
installationId: config.installationId, publicKeyEd25519: config.publicKeyEd25519, setupClaimReference: config.setupClaimReference,
|
|
11
|
+
setupClaimRepositoryFingerprint: config.setupClaimRepositoryFingerprint, relayUrl: config.relayUrl, enrolledAt: config.enrolledAt,
|
|
12
|
+
connectionMode: config.connectionMode ?? 'manual' });
|
|
13
|
+
async function next(iterator, signal) {
|
|
14
|
+
if (signal.aborted)
|
|
15
|
+
return unavailable('cancelled');
|
|
16
|
+
let stop;
|
|
17
|
+
const aborted = new Promise((_, reject) => {
|
|
18
|
+
stop = () => reject(Error('device_signing_maintenance_cancelled'));
|
|
19
|
+
signal.addEventListener('abort', stop, { once: true });
|
|
20
|
+
});
|
|
21
|
+
try {
|
|
22
|
+
return await Promise.race([iterator.next(), aborted]);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
signal.removeEventListener('abort', stop);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function* frames(input, signal) {
|
|
29
|
+
const iterator = input[Symbol.asyncIterator]();
|
|
30
|
+
let buffered = Buffer.alloc(0), count = 0;
|
|
31
|
+
try {
|
|
32
|
+
for (;;) {
|
|
33
|
+
const item = await next(iterator, signal);
|
|
34
|
+
if (item.done) {
|
|
35
|
+
if (buffered.length)
|
|
36
|
+
return unavailable('input_invalid');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!(item.value instanceof Uint8Array) || item.value.byteLength > 8192)
|
|
40
|
+
return unavailable('input_invalid');
|
|
41
|
+
buffered = Buffer.concat([buffered, item.value]);
|
|
42
|
+
let end;
|
|
43
|
+
while ((end = buffered.indexOf(10)) >= 0) {
|
|
44
|
+
const line = buffered.subarray(0, end);
|
|
45
|
+
buffered = buffered.subarray(end + 1);
|
|
46
|
+
if (!line.length)
|
|
47
|
+
continue;
|
|
48
|
+
if (line.length > 512 || ++count > 64)
|
|
49
|
+
return unavailable('input_invalid');
|
|
50
|
+
let value;
|
|
51
|
+
try {
|
|
52
|
+
value = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(line));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return unavailable('input_invalid');
|
|
56
|
+
}
|
|
57
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
58
|
+
return unavailable('input_invalid');
|
|
59
|
+
const body = value;
|
|
60
|
+
if (Object.keys(body).sort().join(',') !== 'action,operationId,schema' || body.schema !== 'dharma.device-signing-maintenance-control/v1'
|
|
61
|
+
|| typeof body.operationId !== 'string' || !UUID.test(body.operationId)
|
|
62
|
+
|| !['progress', 'complete', 'status', 'cancel'].includes(String(body.action)))
|
|
63
|
+
return unavailable('input_invalid');
|
|
64
|
+
yield body;
|
|
65
|
+
}
|
|
66
|
+
if (buffered.length > 512)
|
|
67
|
+
return unavailable('input_invalid');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
void iterator.return?.().catch(() => { });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Connected CLI owner. No provider transport, model turn, enrollment, password
|
|
75
|
+
* input or service control is available here. The disabled original session is
|
|
76
|
+
* an audit locator; a device-specific control lease, original encrypted binding
|
|
77
|
+
* and durable operation claim fence this separate maintenance capability. */
|
|
78
|
+
export async function runDeviceSigningMaintenanceController(input) {
|
|
79
|
+
const clock = input.now ?? Date.now, config = await loadDeviceConfig(input.configPath);
|
|
80
|
+
const registration = await readNamedSession(input.home, input.name), workspace = await input.readWorkspace();
|
|
81
|
+
if (!registration || !workspace || !UUID.test(input.workspaceId) || registration.identity.workspaceId !== input.workspaceId
|
|
82
|
+
|| ![config.deviceId, config.installationId, config.setupClaimReference, workspace.repositoryBindingId].every(value => typeof value === 'string' && UUID.test(value))
|
|
83
|
+
|| !/^sha256:[a-f0-9]{64}$(?![\s\S])/.test(workspace.repositoryRemoteHash)
|
|
84
|
+
|| workspace.workspaceId !== input.workspaceId || workspace.organizationId !== config.organizationId
|
|
85
|
+
|| registration.identity.organizationId !== config.organizationId || registration.identity.deviceId !== config.deviceId
|
|
86
|
+
|| registration.identity.repositoryBindingId !== workspace.repositoryBindingId || workspace.repositoryRemoteHash !== config.setupClaimRepositoryFingerprint
|
|
87
|
+
|| !isAbsolute(workspace.path) || resolve(workspace.path) !== workspace.path)
|
|
88
|
+
return unavailable('scope_unavailable');
|
|
89
|
+
const state = await input.processState(), operationId = input.operationId ?? randomUUID();
|
|
90
|
+
const trustExpiry = Date.parse(config.serverSigningKeyset?.expiresAt ?? '');
|
|
91
|
+
const trustState = !Number.isFinite(trustExpiry) ? 'unavailable' : trustExpiry <= clock() ? 'expired' : 'current';
|
|
92
|
+
if (!UUID.test(operationId))
|
|
93
|
+
return unavailable('operation_invalid');
|
|
94
|
+
const summary = { schema: 'dharma.device-signing-maintenance-controller-progress/v1', operationId,
|
|
95
|
+
organizationId: config.organizationId, deviceId: config.deviceId, workspaceId: input.workspaceId, bindingId: registration.bindingId,
|
|
96
|
+
authorityKind: 'device_trust_maintenance', nativeContinuationAuthorized: false, ready: false };
|
|
97
|
+
if (!input.apply)
|
|
98
|
+
return { ...summary, ok: true, planned: true, protectedStoreQualified: false, currentSourceVerified: false,
|
|
99
|
+
registrationDisabled: !registration.enabled, processState: state, trustState, clientTrustInstalled: false };
|
|
100
|
+
if (!input.operationId || registration.enabled || state !== 'stopped')
|
|
101
|
+
return unavailable('quiescence_required');
|
|
102
|
+
if (!input.legacyBoundary || !/^sha256:[a-f0-9]{64}$/.test(input.legacyBoundary.leaseDigest))
|
|
103
|
+
return unavailable('exclusive_legacy_boundary_required');
|
|
104
|
+
await input.legacyBoundary.assertHeld();
|
|
105
|
+
if (trustState !== 'expired')
|
|
106
|
+
return unavailable('expired_trust_required');
|
|
107
|
+
const abort = new AbortController(), started = clock(), deadline = started + 900000;
|
|
108
|
+
const signal = AbortSignal.any([input.signal, abort.signal]), timer = setTimeout(() => abort.abort(), 900000);
|
|
109
|
+
timer.unref();
|
|
110
|
+
let vault;
|
|
111
|
+
try {
|
|
112
|
+
return await withDeviceSigningControl({ config, hostScope: { signal, current: async () => !signal.aborted } }, async (control) => {
|
|
113
|
+
vault = await input.openVault();
|
|
114
|
+
const original = await vault.getProviderSessionBinding(registration.bindingId, registration.identity);
|
|
115
|
+
if (!original || original.owner !== 'dharma_bridge' || original.provider !== 'codex' || original.workspaceRoot !== workspace.path
|
|
116
|
+
|| !UUID.test(original.bindingId))
|
|
117
|
+
return unavailable('binding_unavailable');
|
|
118
|
+
const lease = await vault.tryAcquireProviderSessionLease(registration.bindingId, registration.identity);
|
|
119
|
+
if (!lease)
|
|
120
|
+
return unavailable('owner_busy');
|
|
121
|
+
let handle;
|
|
122
|
+
const valid = async () => {
|
|
123
|
+
if (signal.aborted || clock() < started || clock() >= deadline || !await lease.assertHeld())
|
|
124
|
+
return false;
|
|
125
|
+
await input.legacyBoundary.assertHeld();
|
|
126
|
+
await control.assertHeld();
|
|
127
|
+
const current = await readNamedSession(input.home, input.name), selected = await input.readWorkspace();
|
|
128
|
+
const fresh = await loadDeviceConfig(input.configPath), binding = await vault.getProviderSessionBinding(registration.bindingId, registration.identity);
|
|
129
|
+
return !signal.aborted && canonicalize(current) === canonicalize(registration) && canonicalize(selected) === canonicalize(workspace)
|
|
130
|
+
&& canonicalize(immutableDevice(fresh)) === canonicalize(immutableDevice(config)) && canonicalize(binding) === canonicalize(original)
|
|
131
|
+
&& await input.processState() === 'stopped' && await lease.assertHeld();
|
|
132
|
+
};
|
|
133
|
+
const hostScope = { signal, current: valid };
|
|
134
|
+
const assert = async () => { if (!await valid())
|
|
135
|
+
return unavailable('scope_changed'); };
|
|
136
|
+
try {
|
|
137
|
+
await assert();
|
|
138
|
+
await loadDeviceEnrollmentAnchor({ config, store: input.store, hostScope, readOnly: true });
|
|
139
|
+
await assert();
|
|
140
|
+
const claimed = await vault.claimCodexSetupOperation(operationId, hash({ purpose: 'dharma.device-trust-maintenance/v1', operationId,
|
|
141
|
+
device: immutableDevice(config), registration, workspace, originalBinding: original }));
|
|
142
|
+
if (claimed.state !== 'acquired')
|
|
143
|
+
return unavailable('operation_consumed');
|
|
144
|
+
await assert();
|
|
145
|
+
const context = await readOwnedSigningMaintenanceContext({ configPath: input.configPath, workspaceId: input.workspaceId,
|
|
146
|
+
repositoryBindingId: workspace.repositoryBindingId, membershipId: registration.identity.membershipId, operationId, hostScope,
|
|
147
|
+
store: input.store, fetcher: input.fetcher, now: clock });
|
|
148
|
+
await assert();
|
|
149
|
+
handle = await prepareOwnedSigningMaintenance({ configPath: input.configPath, source: context.source, hostScope,
|
|
150
|
+
store: input.store, fetcher: input.fetcher, now: clock, controller: { schema: 'dharma.device-trust-maintenance-owner/v1', operationId,
|
|
151
|
+
controllerInstanceId: control.controllerInstanceId, processIdentityDigest: control.processIdentityDigest,
|
|
152
|
+
leaseDigest: hash({ deviceSigningControl: control.leaseDigest, legacyRuntimeBoundary: input.legacyBoundary.leaseDigest }),
|
|
153
|
+
registrationDigest: hash({ registration, originalBinding: original }), deviceId: config.deviceId, recipientMembershipId: registration.identity.membershipId,
|
|
154
|
+
originalBindingId: registration.bindingId, originalSessionId: original.sessionId, expiresAt: new Date(deadline).toISOString() } });
|
|
155
|
+
const progress = await submitOwnedSigningRecoveryPreparation(handle);
|
|
156
|
+
input.emit({ ...summary, ok: true, progress, recipientUrl: config.hqUrl + '/agent-fabric/signing-maintenance?orgId='
|
|
157
|
+
+ encodeURIComponent(config.organizationId) + '&preparationId=' + encodeURIComponent(handle.preparationId) + '&kind=recipient' });
|
|
158
|
+
for await (const request of frames(input.frames, signal)) {
|
|
159
|
+
await assert();
|
|
160
|
+
if (request.operationId !== operationId)
|
|
161
|
+
return unavailable('input_invalid');
|
|
162
|
+
if (request.action === 'cancel')
|
|
163
|
+
return { ...summary, ok: false, state: 'cancelled', clientTrustInstalled: false };
|
|
164
|
+
const current = request.action === 'status' ? await inspectOwnedSigningRecovery(handle)
|
|
165
|
+
: request.action === 'progress' ? await progressOwnedSigningRecoveryOffer(handle) : await completeOwnedSigningRecovery(handle);
|
|
166
|
+
await assert();
|
|
167
|
+
const selectedUrl = config.hqUrl + '/agent-fabric/signing-maintenance?orgId=' + encodeURIComponent(config.organizationId)
|
|
168
|
+
+ '&preparationId=' + encodeURIComponent(handle.preparationId) + '&recoveryId=' + encodeURIComponent(current.recoveryId ?? '')
|
|
169
|
+
+ '&approvalId=' + encodeURIComponent(current.approvalId ?? '');
|
|
170
|
+
const view = { ...summary, ok: true, progress: current, ...('recoveryId' in current ? { ownerUrl: selectedUrl + '&kind=owner',
|
|
171
|
+
recipientUrl: selectedUrl + '&kind=recipient' } : {}) };
|
|
172
|
+
if (current.state === 'trust_installed')
|
|
173
|
+
return view;
|
|
174
|
+
input.emit(view);
|
|
175
|
+
}
|
|
176
|
+
return { ...summary, ok: false, state: 'closed_before_completion', reconcileBeforeRetry: true };
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
const phase = error instanceof OwnedSigningRecoveryError ? error.phase : 'controller';
|
|
180
|
+
const httpStatus = error instanceof OwnedSigningRecoveryError ? error.httpStatus : null;
|
|
181
|
+
return { ...summary, ok: false, state: 'unconfirmed', phase, httpStatus, reconcileBeforeRetry: true,
|
|
182
|
+
...(handle ? { progress: await inspectOwnedSigningRecovery(handle).catch(() => null) } : {}) };
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
if (handle)
|
|
186
|
+
disposeOwnedSigningRecovery(handle);
|
|
187
|
+
await lease.release();
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
abort.abort();
|
|
193
|
+
clearTimeout(timer);
|
|
194
|
+
await vault?.close();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=deviceSigningMaintenanceController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceSigningMaintenanceController.js","sourceRoot":"","sources":["../src/deviceSigningMaintenanceController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceSigningMaintenanceController.test.d.ts","sourceRoot":"","sources":["../src/deviceSigningMaintenanceController.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdir, mkdtemp, realpath, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
import { commandExitCode, run, relayProcessState, formatCommandOutput, deviceTrustMaintenanceProcessState } from './index.js';
|
|
7
|
+
const id = (n) => `dc000000-0000-4000-8000-${String(n).padStart(12, '0')}`;
|
|
8
|
+
test('maintenance completion signaling cannot turn an unfinished component or native readiness into success', () => {
|
|
9
|
+
const base = { schema: 'dharma.device-signing-maintenance-controller-progress/v1', nativeContinuationAuthorized: false, ready: false };
|
|
10
|
+
assert.equal(commandExitCode(['signing-recovery', '--apply'], { ...base, ok: false, state: 'unconfirmed' }), 2);
|
|
11
|
+
assert.equal(commandExitCode(['signing-recovery', '--apply'], { ...base, ok: true, planned: true }), 2);
|
|
12
|
+
assert.equal(commandExitCode(['signing-recovery', '--apply'], { ...base, ok: true, progress: { state: 'trust_installed', clientTrustInstalled: true } }), 0);
|
|
13
|
+
assert.equal(commandExitCode(['signing-recovery'], { ...base, ok: true, planned: true }), 0);
|
|
14
|
+
const text = formatCommandOutput({ ...base, ok: true, planned: true });
|
|
15
|
+
assert.equal(text.trim().split('\n').length, 1);
|
|
16
|
+
assert.equal(JSON.parse(text).nativeContinuationAuthorized, false);
|
|
17
|
+
});
|
|
18
|
+
test('official maintenance plan is grant-free and needs no protected-store, provider or active native session', async () => {
|
|
19
|
+
const root = await realpath(await mkdtemp(resolve(tmpdir(), 'mc-'))), prior = process.env.DHARMA_HOME;
|
|
20
|
+
try {
|
|
21
|
+
process.env.DHARMA_HOME = root;
|
|
22
|
+
const workspace = { organizationId: 'org_fixture', workspaceId: id(1), repositoryBindingId: id(2), repositoryRemoteHash: 'sha256:' + 'a'.repeat(64), path: resolve(root, 'checkout') };
|
|
23
|
+
const identity = { organizationId: 'org_fixture', workspaceId: id(1), repositoryBindingId: id(2), deviceId: id(3), membershipId: id(4), endpointId: id(5), provider: 'codex' };
|
|
24
|
+
await mkdir(resolve(root, 'sessions', 'codex-reviewer'), { recursive: true });
|
|
25
|
+
await writeFile(resolve(root, 'device.json'), JSON.stringify({ schema: 'dharma.device-config/v1', hqUrl: 'https://www.dharma-ai.io',
|
|
26
|
+
organizationId: 'org_fixture', deviceId: id(3), deviceName: 'Synthetic maintenance fixture', installationId: id(7), setupClaimReference: id(8), setupClaimRepositoryFingerprint: workspace.repositoryRemoteHash,
|
|
27
|
+
platform: 'linux', publicKeyEd25519: Buffer.alloc(32, 7).toString('base64url'), serverPublicKeyEd25519: Buffer.alloc(32, 8).toString('base64url'),
|
|
28
|
+
relayUrl: 'wss://relay.fixture.invalid', enrolledAt: '2026-10-01T00:00:00.000Z' }));
|
|
29
|
+
await mkdir(resolve(root, 'registry'));
|
|
30
|
+
await writeFile(resolve(root, 'registry', 'workspaces.json'), JSON.stringify([workspace]));
|
|
31
|
+
await writeFile(resolve(root, 'sessions', 'codex-reviewer', 'registration.json'), JSON.stringify({ schema: 'dharma.named-session/v1', name: 'codex-reviewer',
|
|
32
|
+
bindingId: id(6), identity, maximumCostCents: 1000, maximumTurnCostCents: 25, enabled: false }));
|
|
33
|
+
const result = await run(['signing-recovery', '--name', 'codex-reviewer', '--workspace-id', id(1)]);
|
|
34
|
+
assert.equal(result.planned, true);
|
|
35
|
+
assert.equal(result.protectedStoreQualified, false);
|
|
36
|
+
assert.equal(result.currentSourceVerified, false);
|
|
37
|
+
assert.equal(result.nativeContinuationAuthorized, false);
|
|
38
|
+
assert.equal(result.ready, false);
|
|
39
|
+
await mkdir(resolve(root, 'relay'));
|
|
40
|
+
await writeFile(resolve(root, 'relay', 'relay.pid'), String(process.pid));
|
|
41
|
+
assert.equal(await deviceTrustMaintenanceProcessState(root, 'codex-reviewer'), 'running');
|
|
42
|
+
await writeFile(resolve(root, 'relay', 'relay.pid'), 'invalid');
|
|
43
|
+
assert.equal(await deviceTrustMaintenanceProcessState(root, 'codex-reviewer'), 'unknown');
|
|
44
|
+
await assert.rejects(run(['signing-recovery', '--name', 'codex-reviewer', '--workspace-id', id(1), '--grant', 'SYNTHETIC_NOT_SECRET']), /maintenance_options_invalid/);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
if (prior === undefined)
|
|
48
|
+
delete process.env.DHARMA_HOME;
|
|
49
|
+
else
|
|
50
|
+
process.env.DHARMA_HOME = prior;
|
|
51
|
+
await rm(root, { recursive: true, force: true });
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
test('unknown PID-inspection errors cannot establish stopped runtime custody', async (t) => {
|
|
55
|
+
const root = await mkdtemp(resolve(tmpdir(), 'fabric-maintenance-pid-'));
|
|
56
|
+
try {
|
|
57
|
+
await mkdir(resolve(root, 'relay'));
|
|
58
|
+
await writeFile(resolve(root, 'relay', 'relay.pid'), '12345\n');
|
|
59
|
+
t.mock.method(process, 'kill', () => { throw Object.assign(Error('synthetic inspection failure'), { code: 'EACCES' }); });
|
|
60
|
+
assert.equal(await relayProcessState(root), 'unknown');
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
t.mock.restoreAll();
|
|
64
|
+
await rm(root, { recursive: true, force: true });
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=deviceSigningMaintenanceController.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceSigningMaintenanceController.test.js","sourceRoot":"","sources":["../src/deviceSigningMaintenanceController.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceSigningMaintenanceFlow.test.d.ts","sourceRoot":"","sources":["../src/deviceSigningMaintenanceFlow.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { createHash, generateKeyPairSync, randomBytes, verify } from 'node:crypto';
|
|
3
|
+
import { mkdir, mkdtemp, readFile, realpath, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
import { LocalVault } from '@dharma-ai-labs/agent-fabric-local-vault';
|
|
8
|
+
import { canonicalize, deviceSigningRecoveryPreparationSigningPayload, deviceSigningRecoverySigningPayload, parseDeviceSigningRecoveryPreparation, sealDeviceSigningRecoveryDelivery, signCanonicalObject, validateContract } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
9
|
+
import { runDeviceSigningMaintenanceController } from './deviceSigningMaintenanceController.js';
|
|
10
|
+
import { saveNamedSession } from './namedSessionService.js';
|
|
11
|
+
import { withLegacySigningMaintenanceBoundary } from './legacySigningMaintenanceBoundary.js';
|
|
12
|
+
const id = (n) => `de000000-0000-4000-8000-${String(n).padStart(12, '0')}`;
|
|
13
|
+
const hash = (value) => 'sha256:' + createHash('sha256').update(value).digest('hex');
|
|
14
|
+
const digest = (c) => 'sha256:' + c.repeat(64);
|
|
15
|
+
const controlled = (input) => withLegacySigningMaintenanceBoundary({
|
|
16
|
+
...input, assertManagedCohort: async () => digest('f')
|
|
17
|
+
}, legacyBoundary => runDeviceSigningMaintenanceController({ ...input, legacyBoundary }));
|
|
18
|
+
async function fixture() {
|
|
19
|
+
const root = await realpath(await mkdtemp(resolve(tmpdir(), 'mf-'))), now = Date.now(), masterKey = randomBytes(32);
|
|
20
|
+
const old = generateKeyPairSync('ed25519'), next = generateKeyPairSync('ed25519'), device = generateKeyPairSync('ed25519');
|
|
21
|
+
const pub = (key) => key.publicKey.export({ format: 'jwk' }).x;
|
|
22
|
+
const keyset = (key, generation, issued, expiry) => {
|
|
23
|
+
const body = { schema: 'dharma.server-signing-keyset/v1', organizationId: 'org_fixture', generation,
|
|
24
|
+
keys: [{ keyVersion: 'fixture-' + generation, publicKeyEd25519: pub(key), status: 'active', notBefore: new Date(issued).toISOString(), notAfter: new Date(expiry).toISOString() }],
|
|
25
|
+
signedByKeyVersion: 'fixture-' + generation, issuedAt: new Date(issued).toISOString(), expiresAt: new Date(expiry).toISOString() };
|
|
26
|
+
return { ...body, signature: signCanonicalObject(body, key.privateKey) };
|
|
27
|
+
};
|
|
28
|
+
const config = { schema: 'dharma.device-config/v1', hqUrl: 'https://www.dharma-ai.io', organizationId: 'org_fixture',
|
|
29
|
+
installationId: id(1), deviceId: id(2), deviceName: 'Synthetic controller fixture', platform: 'linux', publicKeyEd25519: pub(device),
|
|
30
|
+
serverPublicKeyEd25519: pub(old), serverSigningKeyset: keyset(old, 2, now - 86400000, now - 1000),
|
|
31
|
+
setupClaimReference: id(3), setupClaimRepositoryFingerprint: digest('a'), relayUrl: 'wss://relay.fixture.invalid',
|
|
32
|
+
enrolledAt: new Date(now - 86400000).toISOString(), connectionMode: 'manual' };
|
|
33
|
+
const workspace = { organizationId: config.organizationId, workspaceId: id(4), repositoryBindingId: id(5), repositoryRemoteHash: digest('a'), path: resolve(root, 'checkout') };
|
|
34
|
+
const identity = { organizationId: config.organizationId, workspaceId: id(4), repositoryBindingId: id(5), deviceId: id(2), membershipId: id(6), endpointId: id(7), provider: 'codex' };
|
|
35
|
+
const binding = { schema: 'dharma.local-provider-session-binding/v1', ...identity, bindingId: id(8), owner: 'dharma_bridge',
|
|
36
|
+
sessionId: 'original-disabled-fixture-session', workspaceRoot: workspace.path, createdAt: new Date(now - 10000).toISOString(),
|
|
37
|
+
expiresAt: new Date(now + 3600000).toISOString(), maximumProviderCostCents: 25 };
|
|
38
|
+
const registration = { schema: 'dharma.named-session/v1', name: 'reviewer', bindingId: binding.bindingId, identity, maximumCostCents: 100, maximumTurnCostCents: 25, enabled: false };
|
|
39
|
+
await mkdir(workspace.path);
|
|
40
|
+
await saveNamedSession(root, registration);
|
|
41
|
+
const vaultRoot = resolve(root, 'vault'), vault = await LocalVault.open({ root: vaultRoot, masterKey });
|
|
42
|
+
vault.saveProviderSessionBinding(binding);
|
|
43
|
+
vault.close();
|
|
44
|
+
const configPath = resolve(root, 'device.json');
|
|
45
|
+
await writeFile(configPath, JSON.stringify(config));
|
|
46
|
+
const anchorAccount = 'device-enrollment-' + hash(`${config.hqUrl}:${config.organizationId}:${config.deviceId}`).slice(7, 39);
|
|
47
|
+
const keyAccount = 'device-key-' + hash(`${config.hqUrl}:${config.organizationId}:${config.installationId}`).slice(7, 39);
|
|
48
|
+
const privateIdentity = JSON.stringify(device.privateKey.export({ format: 'jwk' }));
|
|
49
|
+
const values = new Map([[keyAccount, privateIdentity], [anchorAccount, JSON.stringify({ schema: 'dharma.device-enrollment-anchor/v1', hqUrl: config.hqUrl,
|
|
50
|
+
organizationId: config.organizationId, deviceId: config.deviceId, devicePublicKeyEd25519: config.publicKeyEd25519,
|
|
51
|
+
serverPublicKeyEd25519: config.serverPublicKeyEd25519, serverSigningKeyset: config.serverSigningKeyset, enrolledAt: config.enrolledAt })]]);
|
|
52
|
+
const writes = [], emitted = [], requests = [];
|
|
53
|
+
const store = { backend: 'linux-secret-service', get: async (key) => values.get(key) ?? null, getFresh: async (key) => values.get(key) ?? null,
|
|
54
|
+
put: async (key, value) => { writes.push(key); values.set(key, value); }, delete: async () => { throw Error('FORBIDDEN_DELETE'); } };
|
|
55
|
+
const source = { organizationId: config.organizationId, workspaceId: id(4), repositoryBindingId: id(5), repositoryFingerprint: digest('a'),
|
|
56
|
+
policyRevision: 'agent-fabric-local-analysis-v1', scopeDigest: digest('b'), contractDigest: digest('c'), sourceGenerationId: id(9),
|
|
57
|
+
sourceReceiptId: 'repo_consent_' + id(9), sourceRevision: 1, sourcePolicyRevision: 'repository-source-' + id(9), sourcePolicyHash: digest('d') };
|
|
58
|
+
let preparation, challenge, proofRegistered = false;
|
|
59
|
+
const successor = keyset(next, 3, now, now + 86400000), abort = new AbortController();
|
|
60
|
+
const fetcher = (async (url, init) => {
|
|
61
|
+
assert.ok(init);
|
|
62
|
+
const address = new URL(String(url)), body = JSON.parse(String(init.body)), headers = new Headers(init.headers);
|
|
63
|
+
assert.equal(address.origin, config.hqUrl);
|
|
64
|
+
assert.equal(init.redirect, 'error');
|
|
65
|
+
assert.equal(init.credentials, 'omit');
|
|
66
|
+
assert.equal(headers.has('authorization'), false);
|
|
67
|
+
assert.equal(headers.has('cookie'), false);
|
|
68
|
+
const transport = Buffer.from(JSON.stringify({ bodyHash: hash(String(init.body)), deviceId: config.deviceId, messageId: headers.get('x-dharma-message-id'),
|
|
69
|
+
method: 'POST', nonce: headers.get('x-dharma-nonce'), organizationId: config.organizationId, pathname: address.pathname, sequence: 1,
|
|
70
|
+
sessionId: headers.get('x-dharma-session-id'), timestamp: headers.get('x-dharma-timestamp') }));
|
|
71
|
+
assert.equal(verify(null, transport, device.publicKey, Buffer.from(headers.get('x-dharma-signature') ?? '', 'base64url')), true);
|
|
72
|
+
requests.push(body.schema);
|
|
73
|
+
if (body.schema === 'dharma.device-signing-maintenance-context-request/v1') {
|
|
74
|
+
const { schema, issuedAt, repositoryFingerprint, ...selection } = body;
|
|
75
|
+
void [schema, issuedAt, repositoryFingerprint];
|
|
76
|
+
return Response.json({ ...selection, schema: 'dharma.device-signing-maintenance-context/v1', recipientMembershipId: identity.membershipId,
|
|
77
|
+
source, authority: 'current_source_context_only_not_consent' });
|
|
78
|
+
}
|
|
79
|
+
if (body.schema === 'dharma.device-signing-maintenance-preparation-request/v1') {
|
|
80
|
+
preparation = parseDeviceSigningRecoveryPreparation(body.preparation, body.preparation.plan, now);
|
|
81
|
+
assert.equal(verify(null, deviceSigningRecoveryPreparationSigningPayload(preparation), device.publicKey, Buffer.from(body.signature, 'base64url')), true);
|
|
82
|
+
const { schema, planId, authority, preparedAt, expiresAt, ...scope } = preparation.plan;
|
|
83
|
+
void [schema, planId, authority, preparedAt];
|
|
84
|
+
challenge = { ...scope, schema: 'dharma.device-signing-maintenance-challenge/v1', purpose: 'expired_signing_trust_reapproval', recoveryId: id(11), approvalId: id(12),
|
|
85
|
+
credentialEncryptionPublicKey: preparation.credentialEncryptionPublicKey, candidateGeneration: 3, candidateKeysetHash: hash(canonicalize(successor)),
|
|
86
|
+
candidateRootFingerprint: hash(Buffer.from(pub(next), 'base64url')), candidateKeyVersionFingerprint: hash(successor.signedByKeyVersion),
|
|
87
|
+
method: 'POST', path: '/api/v1/agent-fabric/signing-recovery', nonce: Buffer.alloc(32, 7).toString('base64url'),
|
|
88
|
+
authenticator: Buffer.alloc(32, 8).toString('base64url'), issuedAt: new Date(now).toISOString(), expiresAt: new Date(now + 600000).toISOString() };
|
|
89
|
+
return Response.json({ schema: 'dharma.signing-recovery-preparation-receipt/v1', organizationId: config.organizationId, deviceId: config.deviceId,
|
|
90
|
+
recipientMembershipId: identity.membershipId, preparationId: preparation.plan.planId, expiresAt, state: 'pending_browser_review',
|
|
91
|
+
controllerBinding: 'device_attested_not_native_authority', nativeContinuationAuthorized: false, clientTrustInstalled: false });
|
|
92
|
+
}
|
|
93
|
+
assert.ok(preparation && challenge);
|
|
94
|
+
const common = { organizationId: config.organizationId, deviceId: config.deviceId, preparationId: preparation.plan.planId,
|
|
95
|
+
expiresAt: challenge.expiresAt, clientTrustInstalled: false, ready: false };
|
|
96
|
+
if (address.pathname.endsWith('/offers/read'))
|
|
97
|
+
return Response.json({ ...common, schema: 'dharma.device-signing-recovery-offer-response/v1',
|
|
98
|
+
state: proofRegistered ? 'pending_approval' : 'awaiting_device_proof', deviceProofRegistered: proofRegistered, challenge });
|
|
99
|
+
assert.equal(verify(null, deviceSigningRecoverySigningPayload(challenge), device.publicKey, Buffer.from(body.signature, 'base64url')), true);
|
|
100
|
+
if (address.pathname.endsWith('/offers/register')) {
|
|
101
|
+
proofRegistered = true;
|
|
102
|
+
return Response.json({ ...common,
|
|
103
|
+
schema: 'dharma.device-signing-recovery-offer-registration-receipt/v1', recoveryId: challenge.recoveryId, approvalId: challenge.approvalId,
|
|
104
|
+
state: 'pending_approval', deviceProofRegistered: true });
|
|
105
|
+
}
|
|
106
|
+
assert.equal(body.schema, 'dharma.device-signing-maintenance-delivery-request/v1');
|
|
107
|
+
assert.equal(proofRegistered, true);
|
|
108
|
+
// Synthetic server fixture stands in for separately recorded dual browser
|
|
109
|
+
// consents/publication; this is not a live browser or OS-store receipt.
|
|
110
|
+
const candidate = { schema: 'dharma.device-signing-recovery-candidate/v1', organizationId: config.organizationId,
|
|
111
|
+
recoveryId: challenge.recoveryId, approvalId: challenge.approvalId, keysetCanonical: canonicalize(successor), rootPublicKey: pub(next),
|
|
112
|
+
publication: { schema: 'dharma.signing-recovery-publication/v1', organizationId: config.organizationId, recoveryId: challenge.recoveryId,
|
|
113
|
+
generation: 3, artifactHash: digest('e'), publishedAt: new Date(now).toISOString() } };
|
|
114
|
+
return Response.json({ ok: true, delivery: sealDeviceSigningRecoveryDelivery(challenge, candidate, now), clientTrustInstalled: false,
|
|
115
|
+
controllerBinding: 'device_attested_not_native_authority', nativeContinuationAuthorized: false });
|
|
116
|
+
});
|
|
117
|
+
const input = { home: root, configPath, name: 'reviewer', workspaceId: workspace.workspaceId, operationId: id(10), apply: true,
|
|
118
|
+
readWorkspace: async () => workspace, processState: async () => 'stopped', openVault: () => LocalVault.open({ root: vaultRoot, masterKey }),
|
|
119
|
+
signal: abort.signal, frames: (async function* () { for (const action of ['progress', 'status', 'complete'])
|
|
120
|
+
yield Buffer.from(JSON.stringify({ schema: 'dharma.device-signing-maintenance-control/v1', operationId: id(10), action }) + '\n'); })(),
|
|
121
|
+
emit: (value) => emitted.push(value), store, fetcher, now: () => now };
|
|
122
|
+
return { root, input, config, configPath, registration, requests, writes, emitted, values, keyAccount, anchorAccount, privateIdentity, abort,
|
|
123
|
+
cleanup: () => rm(root, { recursive: true, force: true }) };
|
|
124
|
+
}
|
|
125
|
+
test('connected owning controller qualifies source, device proofs and encrypted installation without a native turn', async () => {
|
|
126
|
+
const f = await fixture();
|
|
127
|
+
try {
|
|
128
|
+
const result = await controlled(f.input);
|
|
129
|
+
assert.equal(result.ok, true);
|
|
130
|
+
assert.equal(result.ready, false);
|
|
131
|
+
assert.equal(result.nativeContinuationAuthorized, false);
|
|
132
|
+
assert.equal(result.progress.state, 'trust_installed');
|
|
133
|
+
assert.equal(JSON.parse(await readFile(f.configPath, 'utf8')).serverSigningKeyset.generation, 3);
|
|
134
|
+
assert.equal(f.values.get(f.keyAccount), f.privateIdentity);
|
|
135
|
+
assert.ok(f.writes.every(key => key === f.anchorAccount));
|
|
136
|
+
assert.equal(f.requests.length, 5);
|
|
137
|
+
assert.equal(f.emitted.length, 3);
|
|
138
|
+
assert.deepEqual(JSON.parse(await readFile(resolve(f.root, 'sessions', 'reviewer', 'registration.json'), 'utf8')), f.registration);
|
|
139
|
+
for (const value of [...f.emitted, result]) {
|
|
140
|
+
const checked = await validateContract(resolve(import.meta.dirname, '../../../schemas'), 'https://schemas.dharma-ai.io/device-signing-maintenance-controller-progress/v1', value);
|
|
141
|
+
assert.equal(checked.ok, true, JSON.stringify(checked));
|
|
142
|
+
assert.doesNotMatch(JSON.stringify(value), /signature|authenticator|privateJwk|keysetCanonical|PRIVATE_/);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
await f.cleanup();
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
test('sampled stopped state without the exclusive legacy boundary cannot open the vault or dispatch', async () => {
|
|
150
|
+
const f = await fixture();
|
|
151
|
+
try {
|
|
152
|
+
let opened = 0;
|
|
153
|
+
await assert.rejects(runDeviceSigningMaintenanceController({ ...f.input, openVault: async () => { opened++; throw Error('FORBIDDEN_VAULT'); } }), /exclusive_legacy_boundary_required/);
|
|
154
|
+
assert.equal(opened, 0);
|
|
155
|
+
assert.deepEqual(f.requests, []);
|
|
156
|
+
assert.deepEqual(f.writes, []);
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
await f.cleanup();
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
test('cancelled operation is consumed and cannot replay its source or private-key requests', async () => {
|
|
163
|
+
const f = await fixture();
|
|
164
|
+
try {
|
|
165
|
+
const frames = async function* () { yield Buffer.from(JSON.stringify({ schema: 'dharma.device-signing-maintenance-control/v1', operationId: id(10), action: 'cancel' }) + '\n'); };
|
|
166
|
+
const result = await controlled({ ...f.input, frames: frames() });
|
|
167
|
+
assert.equal(result.state, 'cancelled');
|
|
168
|
+
const count = f.requests.length;
|
|
169
|
+
assert.equal(count, 2);
|
|
170
|
+
assert.deepEqual(f.writes, []);
|
|
171
|
+
const repeated = await controlled({ ...f.input, frames: frames() });
|
|
172
|
+
assert.equal(repeated.state, 'unconfirmed');
|
|
173
|
+
assert.equal(f.requests.length, count);
|
|
174
|
+
assert.deepEqual(f.writes, []);
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
await f.cleanup();
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
for (const action of ['arbitrary-shell', 'complete-with-extra', 'foreign-operation', 'oversized', 'truncated'])
|
|
181
|
+
test('fixed controller rejects ' + action + ' without delivery', async () => {
|
|
182
|
+
const f = await fixture();
|
|
183
|
+
try {
|
|
184
|
+
const value = { schema: 'dharma.device-signing-maintenance-control/v1', operationId: action === 'foreign-operation' ? id(99) : id(10), action: action === 'complete-with-extra' ? 'complete' : action };
|
|
185
|
+
const bytes = action === 'oversized' ? 'x'.repeat(513) : JSON.stringify({ ...value, ...(action === 'complete-with-extra' ? { command: 'forbidden' } : {}) });
|
|
186
|
+
const frames = (async function* () { yield Buffer.from(bytes + (action === 'truncated' ? '' : '\n')); })();
|
|
187
|
+
const result = await controlled({ ...f.input, frames });
|
|
188
|
+
assert.equal(result.state, 'unconfirmed');
|
|
189
|
+
assert.equal(f.requests.length, 2);
|
|
190
|
+
assert.deepEqual(f.writes, []);
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
await f.cleanup();
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
//# sourceMappingURL=deviceSigningMaintenanceFlow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceSigningMaintenanceFlow.test.js","sourceRoot":"","sources":["../src/deviceSigningMaintenanceFlow.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ import { type BootstrapHostScope, type CodexBootstrapHostInput } from './bootstr
|
|
|
13
13
|
import { startCodexSetupNativeHost } from './codexSetupNativeHost.js';
|
|
14
14
|
import { type CodexSetupPromptBinding } from './codexSetupUserPrompt.js';
|
|
15
15
|
export { startCodexSetupNativeHost } from './codexSetupNativeHost.js';
|
|
16
|
+
export { attachCodexSigningRecoveryNativeHost, type CodexSigningRecoveryNativeInput } from './codexSigningRecoveryNativeHost.js';
|
|
17
|
+
export { openCodexSigningRecoveryOwner, type CodexBoundSigningRecoveryInput } from './codexBoundSession.js';
|
|
16
18
|
export { openCodexSetupVaultJournal } from './codexSetupVaultJournal.js';
|
|
17
19
|
export { createCodexSetupReadinessOwner } from './codexSetupReadiness.js';
|
|
18
20
|
import { type CodexSetupExecutionLease, type CodexSetupIntent } from './codexSetupAdmission.js';
|
|
@@ -66,6 +68,7 @@ export declare function parseCliOptions(args: string[]): {
|
|
|
66
68
|
repeated: Map<string, Array<string | boolean>>;
|
|
67
69
|
};
|
|
68
70
|
export declare function portalUrl(flags: Map<string, string | boolean>, fallback?: string): string;
|
|
71
|
+
export declare function formatCommandOutput(value: unknown): string;
|
|
69
72
|
export declare function commandExitCode(argv: string[], value: Output): number;
|
|
70
73
|
export declare function isDirectExecution(argvPath: string | undefined, moduleUrl: string): boolean;
|
|
71
74
|
export declare function loadOrCreateInstallationId(path?: string): Promise<string>;
|
|
@@ -87,6 +90,11 @@ export declare function reserveDailyContentUpload(capsule: Record<string, unknow
|
|
|
87
90
|
export declare function releaseDailyContentUpload(capsule: Record<string, unknown>, policy: OrganizationPolicy, _store?: SecureSecretStore): Promise<void>;
|
|
88
91
|
export declare function relayProcessState(home?: string): Promise<'running' | 'stopped' | 'unknown'>;
|
|
89
92
|
export declare function relaySupervisorProcessState(home?: string): Promise<'running' | 'stopped' | 'unknown'>;
|
|
93
|
+
/** A legacy runtime may not participate in the new signing mutex. Require all
|
|
94
|
+
* registrations belonging to this device disabled and their known owned PID
|
|
95
|
+
* locks stopped, plus its relay/supervisor, before any maintenance store read.
|
|
96
|
+
* This check never stops a process or changes startup/registration state. */
|
|
97
|
+
export declare function deviceTrustMaintenanceProcessState(home: string, name: string): Promise<'running' | 'stopped' | 'unknown'>;
|
|
90
98
|
export declare function acquireRelayProcessLease(home?: string): Promise<() => Promise<void>>;
|
|
91
99
|
export declare function acquireRelaySupervisorLease(home?: string): Promise<() => Promise<void>>;
|
|
92
100
|
export declare function materializeWorkspacePolicy(input: {
|
|
@@ -104,6 +112,7 @@ export declare function materializeWorkspacePolicy(input: {
|
|
|
104
112
|
applied: boolean;
|
|
105
113
|
}>;
|
|
106
114
|
export declare function withRelayStartupMutation<T>(operation: () => Promise<T>, home?: string): Promise<T>;
|
|
115
|
+
export declare function acquireNamedSessionStartupAdmission(home?: string): Promise<() => Promise<void>>;
|
|
107
116
|
export declare function withWorkspacePolicyRefreshLock<T>(workspaceId: string, operation: () => Promise<T>): Promise<T>;
|
|
108
117
|
export declare function withWorkspaceSkillActivationLock<T>(workspaceId: string, provider: ProviderId, operation: () => Promise<T>): Promise<T>;
|
|
109
118
|
export declare function applyServerEvidencePolicy(base: OrganizationPolicy, value: unknown, serverPublicKeyEd25519: string, organizationId: string, workspaceId: string, now?: Date): OrganizationPolicy;
|