@dharma-ai-labs/agent-fabric 0.2.110 → 0.2.111
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/demoDeviceTransport.d.ts +33 -0
- package/dist/demoDeviceTransport.d.ts.map +1 -0
- package/dist/demoDeviceTransport.js +52 -0
- package/dist/demoDeviceTransport.js.map +1 -0
- package/dist/demoDeviceTransport.test.d.ts +2 -0
- package/dist/demoDeviceTransport.test.d.ts.map +1 -0
- package/dist/demoDeviceTransport.test.js +178 -0
- package/dist/demoDeviceTransport.test.js.map +1 -0
- package/dist/demoTransportCommand.test.d.ts +2 -0
- package/dist/demoTransportCommand.test.d.ts.map +1 -0
- package/dist/demoTransportCommand.test.js +28 -0
- package/dist/demoTransportCommand.test.js.map +1 -0
- package/dist/demoTransportContinuity.d.ts +39 -0
- package/dist/demoTransportContinuity.d.ts.map +1 -0
- package/dist/demoTransportContinuity.js +82 -0
- package/dist/demoTransportContinuity.js.map +1 -0
- package/dist/demoTransportContinuity.test.d.ts +2 -0
- package/dist/demoTransportContinuity.test.d.ts.map +1 -0
- package/dist/demoTransportContinuity.test.js +145 -0
- package/dist/demoTransportContinuity.test.js.map +1 -0
- package/dist/demoTransportFetch.d.ts +12 -0
- package/dist/demoTransportFetch.d.ts.map +1 -0
- package/dist/demoTransportFetch.js +109 -0
- package/dist/demoTransportFetch.js.map +1 -0
- package/dist/demoTransportFetch.test.d.ts +2 -0
- package/dist/demoTransportFetch.test.d.ts.map +1 -0
- package/dist/demoTransportFetch.test.js +150 -0
- package/dist/demoTransportFetch.test.js.map +1 -0
- package/dist/demoTransportRequest.d.ts +35 -0
- package/dist/demoTransportRequest.d.ts.map +1 -0
- package/dist/demoTransportRequest.js +193 -0
- package/dist/demoTransportRequest.js.map +1 -0
- package/dist/demoTransportRequest.test.d.ts +2 -0
- package/dist/demoTransportRequest.test.d.ts.map +1 -0
- package/dist/demoTransportRequest.test.js +203 -0
- package/dist/demoTransportRequest.test.js.map +1 -0
- package/dist/demoTransportState.d.ts +31 -0
- package/dist/demoTransportState.d.ts.map +1 -0
- package/dist/demoTransportState.js +204 -0
- package/dist/demoTransportState.js.map +1 -0
- package/dist/demoTransportState.test.d.ts +2 -0
- package/dist/demoTransportState.test.d.ts.map +1 -0
- package/dist/demoTransportState.test.js +192 -0
- package/dist/demoTransportState.test.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -14
- package/dist/index.js.map +1 -1
- package/dist/relaySupervisor.test.js +3 -1
- package/dist/relaySupervisor.test.js.map +1 -1
- package/dist/schemas/demo-transport-continuity.schema.json +27 -0
- package/dist/schemas/demo-transport-journal.schema.json +13 -0
- package/dist/schemas/demo-transport-request.schema.json +27 -0
- package/dist/schemas/demo-transport-state.schema.json +13 -0
- package/dist/usage.d.ts +1 -1
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +1 -1
- package/dist/usage.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { createHash, generateKeyPairSync } from 'node:crypto';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
import { canonicalize, signCanonicalObject } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
5
|
+
import { verifyDemoTransportContinuity } from './demoTransportContinuity.js';
|
|
6
|
+
const now = new Date('2026-09-27T14:00:00.000Z');
|
|
7
|
+
const signer = generateKeyPairSync('ed25519');
|
|
8
|
+
const stranger = generateKeyPairSync('ed25519');
|
|
9
|
+
function fixture() {
|
|
10
|
+
const keysetBody = { schema: 'dharma.server-signing-keyset/v1',
|
|
11
|
+
organizationId: 'org_fixture', generation: 1, signedByKeyVersion: 'original',
|
|
12
|
+
issuedAt: '2026-09-27T13:00:00.000Z', expiresAt: '2026-09-27T22:49:28.544Z',
|
|
13
|
+
keys: [{ keyVersion: 'original', publicKeyEd25519: signer.publicKey.export({ format: 'jwk' }).x,
|
|
14
|
+
status: 'active', notBefore: '2026-09-01T00:00:00.000Z', notAfter: '2026-09-27T22:49:28.544Z' }] };
|
|
15
|
+
const protectedKeyset = { ...keysetBody,
|
|
16
|
+
signature: signCanonicalObject(keysetBody, signer.privateKey) };
|
|
17
|
+
const scope = { organizationId: 'org_fixture', repositoryId: '10000000-0000-4000-8000-000000000001',
|
|
18
|
+
deviceId: '30000000-0000-4000-8000-000000000001', installationId: '40000000-0000-4000-8000-000000000001',
|
|
19
|
+
publicKeyEd25519: stranger.publicKey.export({ format: 'jwk' }).x,
|
|
20
|
+
enrollmentOrigin: 'https://original.example', transportOrigin: 'https://corrected.example',
|
|
21
|
+
requestNonce: 'N'.repeat(32) };
|
|
22
|
+
const body = { schema: 'dharma.demo-transport-continuity/v1',
|
|
23
|
+
purpose: 'same-authority-repository-transport', ...scope, policyRevision: 2,
|
|
24
|
+
trustGeneration: protectedKeyset.generation,
|
|
25
|
+
installedKeysetHash: `sha256:${createHash('sha256').update(canonicalize(protectedKeyset)).digest('hex')}`,
|
|
26
|
+
signingKeyVersion: 'original', issuedAt: now.toISOString(),
|
|
27
|
+
expiresAt: new Date(now.getTime() + 600_000).toISOString() };
|
|
28
|
+
const sign = (change = {}) => {
|
|
29
|
+
const value = { ...body, ...change };
|
|
30
|
+
return { ...value, signature: signCanonicalObject(value, signer.privateKey) };
|
|
31
|
+
};
|
|
32
|
+
return { scope, protectedKeyset, body, sign,
|
|
33
|
+
context: { ...scope, protectedKeyset, minimumPolicyRevision: 2, now } };
|
|
34
|
+
}
|
|
35
|
+
test('continuity verifies the protected authority without changing identity or extending trust', async () => {
|
|
36
|
+
const f = fixture(), before = canonicalize(f.context), certificate = f.sign();
|
|
37
|
+
assert.deepEqual(await verifyDemoTransportContinuity(certificate, f.context), certificate);
|
|
38
|
+
assert.equal(canonicalize(f.context), before);
|
|
39
|
+
assert.doesNotMatch(canonicalize(certificate), /grant|privateJwk|authorization/);
|
|
40
|
+
});
|
|
41
|
+
const invalidFields = [
|
|
42
|
+
['organizationId', 'org_foreign'], ['repositoryId', '10000000-0000-4000-8000-000000000099'],
|
|
43
|
+
['deviceId', '30000000-0000-4000-8000-000000000099'], ['installationId', '40000000-0000-4000-8000-000000000099'],
|
|
44
|
+
['publicKeyEd25519', 'E'.repeat(43)], ['enrollmentOrigin', 'https://other.example'],
|
|
45
|
+
['transportOrigin', 'https://unrequested.example'], ['requestNonce', 'R'.repeat(32)],
|
|
46
|
+
['policyRevision', 1], ['policyRevision', 0], ['trustGeneration', 2],
|
|
47
|
+
['installedKeysetHash', `sha256:${'a'.repeat(64)}`], ['signingKeyVersion', 'untrusted'],
|
|
48
|
+
['issuedAt', new Date(now.getTime() + 1).toISOString()], ['expiresAt', now.toISOString()],
|
|
49
|
+
['expiresAt', new Date(now.getTime() + 600_001).toISOString()], ['expiresAt', 'invalid'],
|
|
50
|
+
['schema', 'legacy'], ['purpose', 'enrollment'], ['grant', 'must-not-persist'],
|
|
51
|
+
['privateJwk', { d: 'secret' }], ['authorization', 'Bearer secret'],
|
|
52
|
+
];
|
|
53
|
+
for (const [field, value] of invalidFields) {
|
|
54
|
+
test(`continuity rejects signed invalid ${field}=${JSON.stringify(value)}`, async () => {
|
|
55
|
+
const f = fixture();
|
|
56
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign({ [field]: value }), f.context), /Demo transport continuity rejected/);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
test('continuity rejects malformed and unsigned responses, including HTML and empty objects', async () => {
|
|
60
|
+
const f = fixture();
|
|
61
|
+
for (const value of [null, {}, [], '', '<html>not a contract</html>', { ...f.sign(), signature: undefined }]) {
|
|
62
|
+
await assert.rejects(verifyDemoTransportContinuity(value, f.context), /schema_invalid/);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
test('continuity rejects a foreign signature and tampering after issuance', async () => {
|
|
66
|
+
const f = fixture();
|
|
67
|
+
await assert.rejects(verifyDemoTransportContinuity({ ...f.sign(),
|
|
68
|
+
signature: signCanonicalObject(f.body, stranger.privateKey) }, f.context), /signature_invalid/);
|
|
69
|
+
await assert.rejects(verifyDemoTransportContinuity({ ...f.sign(), policyRevision: 3 }, f.context), /signature_invalid/);
|
|
70
|
+
});
|
|
71
|
+
for (const origin of ['http://corrected.example', 'https://corrected.example/', 'https://corrected.example/path',
|
|
72
|
+
'https://corrected.example?query=x', 'https://corrected.example#fragment', 'https://user:password@corrected.example',
|
|
73
|
+
'https://CORRECTED.example', 'https://corrected.example:443']) {
|
|
74
|
+
test(`continuity rejects noncanonical or insecure destination ${origin}`, async () => {
|
|
75
|
+
const f = fixture();
|
|
76
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign({ transportOrigin: origin }), { ...f.context, transportOrigin: origin }), /origin_invalid/);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
test('continuity rejects invalid protected authority, even if the certificate looks valid', async () => {
|
|
80
|
+
const f = fixture();
|
|
81
|
+
for (const protectedKeyset of [{ ...f.protectedKeyset, signature: 'invalid' },
|
|
82
|
+
{ ...f.protectedKeyset, organizationId: 'org_foreign' },
|
|
83
|
+
{ ...f.protectedKeyset, keys: [] }]) {
|
|
84
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign(), { ...f.context, protectedKeyset }), /authority_invalid/);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
test('continuity rejects ambiguous signer roles and duplicate versions in protected authority', async () => {
|
|
88
|
+
const f = fixture();
|
|
89
|
+
const original = f.protectedKeyset.keys[0];
|
|
90
|
+
const cases = [
|
|
91
|
+
[{ ...original, status: 'overlap' }], [original, { ...original, keyVersion: 'second' }],
|
|
92
|
+
[original, { ...original, status: 'overlap' }],
|
|
93
|
+
[{ ...original, notBefore: '2026-09-27T14:01:00.000Z' }],
|
|
94
|
+
[{ ...original, notAfter: '2026-09-27T22:00:00.000Z' }],
|
|
95
|
+
];
|
|
96
|
+
for (const keys of cases) {
|
|
97
|
+
const { signature: _signature, ...unsigned } = f.protectedKeyset;
|
|
98
|
+
const body = { ...unsigned, keys };
|
|
99
|
+
const protectedKeyset = { ...body, signature: signCanonicalObject(body, signer.privateKey) };
|
|
100
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign({
|
|
101
|
+
installedKeysetHash: `sha256:${createHash('sha256').update(canonicalize(protectedKeyset)).digest('hex')}`
|
|
102
|
+
}), { ...f.context, protectedKeyset }), /authority_invalid/);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
test('continuity rejects certificates missing required scope and unsafe revisions', async () => {
|
|
106
|
+
const f = fixture();
|
|
107
|
+
for (const field of Object.keys(f.body)) {
|
|
108
|
+
const unsigned = { ...f.body };
|
|
109
|
+
delete unsigned[field];
|
|
110
|
+
await assert.rejects(verifyDemoTransportContinuity({ ...unsigned,
|
|
111
|
+
signature: signCanonicalObject(unsigned, signer.privateKey) }, f.context), /schema_invalid/);
|
|
112
|
+
}
|
|
113
|
+
for (const value of [1.5, Number.MAX_SAFE_INTEGER + 1, NaN, Infinity]) {
|
|
114
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign({ policyRevision: value }), f.context), /schema_invalid/);
|
|
115
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign({ trustGeneration: value }), f.context), /schema_invalid/);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
test('continuity never recovers expired trust and expires no later than the original anchor', async () => {
|
|
119
|
+
const f = fixture();
|
|
120
|
+
const late = new Date(f.protectedKeyset.expiresAt);
|
|
121
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign(), { ...f.context, now: late }), /authority_invalid/);
|
|
122
|
+
const nearExpiry = new Date(late.getTime() - 60_000);
|
|
123
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign({ issuedAt: nearExpiry.toISOString(),
|
|
124
|
+
expiresAt: new Date(late.getTime() + 1).toISOString() }), { ...f.context, now: nearExpiry }), /lifetime_invalid/);
|
|
125
|
+
});
|
|
126
|
+
test('continuity rejects downgrade and split destinations at the same protected revision', async () => {
|
|
127
|
+
const f = fixture();
|
|
128
|
+
const previous = { policyRevision: 3, transportOrigin: f.scope.transportOrigin };
|
|
129
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign(), { ...f.context, previous }), /policy_revision_conflict/);
|
|
130
|
+
await assert.rejects(verifyDemoTransportContinuity(f.sign({ policyRevision: 3 }), { ...f.context, previous: { ...previous, transportOrigin: 'https://different.example' } }), /policy_revision_conflict/);
|
|
131
|
+
assert.equal((await verifyDemoTransportContinuity(f.sign({ policyRevision: 3 }), { ...f.context, previous })).policyRevision, 3);
|
|
132
|
+
});
|
|
133
|
+
test('continuity snapshots inputs before asynchronous schema loading and rejects invalid local context', async () => {
|
|
134
|
+
const f = fixture(), certificate = f.sign(), before = structuredClone(certificate);
|
|
135
|
+
const pending = verifyDemoTransportContinuity(certificate, f.context);
|
|
136
|
+
certificate.transportOrigin = 'https://changed.example';
|
|
137
|
+
f.context.transportOrigin = 'https://changed.example';
|
|
138
|
+
assert.deepEqual(await pending, before);
|
|
139
|
+
const fresh = fixture();
|
|
140
|
+
for (const context of [{ ...fresh.context, now: new Date(NaN) },
|
|
141
|
+
{ ...fresh.context, minimumPolicyRevision: 0 }, { ...fresh.context, minimumPolicyRevision: NaN }]) {
|
|
142
|
+
await assert.rejects(verifyDemoTransportContinuity(fresh.sign(), context), /context_invalid/);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=demoTransportContinuity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoTransportContinuity.test.js","sourceRoot":"","sources":["../src/demoTransportContinuity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SecureSecretStore } from '@dharma-ai-labs/agent-fabric-relay-client';
|
|
2
|
+
import { type DemoTransportBinding } from './demoTransportState.js';
|
|
3
|
+
interface Dependencies {
|
|
4
|
+
store: SecureSecretStore;
|
|
5
|
+
loadBinding: (readOnlyStore: SecureSecretStore) => Promise<DemoTransportBinding>;
|
|
6
|
+
fetcher?: typeof fetch;
|
|
7
|
+
now?: () => Date;
|
|
8
|
+
refresh?: (binding: DemoTransportBinding, transportOrigin: string) => Promise<unknown>;
|
|
9
|
+
}
|
|
10
|
+
export declare function createDemoTransportFetcher(deps: Dependencies): typeof fetch;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=demoTransportFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoTransportFetch.d.ts","sourceRoot":"","sources":["../src/demoTransportFetch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE1F,UAAU,YAAY;IACpB,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,EAAE,CAAC,aAAa,EAAE,iBAAiB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjF,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxF;AAqDD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,KAAK,CAwC3E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createPublicKey, verify } from 'node:crypto';
|
|
2
|
+
import { sha256 } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
3
|
+
import { resolveDemoTransport } from './demoTransportState.js';
|
|
4
|
+
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}$/i;
|
|
5
|
+
function fail(reason) {
|
|
6
|
+
throw Object.assign(new Error(`Demo transport request rejected: ${reason}. Preserve the original device and signing trust.`), { code: `demo_transport_${reason}` });
|
|
7
|
+
}
|
|
8
|
+
function requestScope(resource, init, binding) {
|
|
9
|
+
if (typeof resource !== 'string' && !(resource instanceof URL))
|
|
10
|
+
fail('request_scope_invalid');
|
|
11
|
+
let url;
|
|
12
|
+
try {
|
|
13
|
+
url = new URL(String(resource));
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
fail('request_scope_invalid');
|
|
17
|
+
}
|
|
18
|
+
const prefix = `/api/demo/fabric/repositories/${binding.repositoryId}/`;
|
|
19
|
+
const suffix = url.pathname.slice(prefix.length);
|
|
20
|
+
if (url.origin !== binding.enrollmentOrigin || url.username || url.password || url.hash
|
|
21
|
+
|| !url.pathname.startsWith(prefix) || !/^[a-zA-Z0-9-]+(?:\/[a-zA-Z0-9-]+)*$/.test(suffix)
|
|
22
|
+
|| url.searchParams.getAll('orgId').length !== 1
|
|
23
|
+
|| url.searchParams.get('orgId') !== binding.organizationId
|
|
24
|
+
|| !['GET', 'POST'].includes(init.method || 'GET')
|
|
25
|
+
|| init.body !== undefined && init.body !== null && typeof init.body !== 'string'
|
|
26
|
+
|| (init.method || 'GET') === 'GET' && init.body)
|
|
27
|
+
fail('request_scope_invalid');
|
|
28
|
+
const headers = new Headers(init.headers);
|
|
29
|
+
for (const name of headers.keys()) {
|
|
30
|
+
if (!['accept', 'content-type'].includes(name) && !/^x-dharma-(?:device-id|session-id|message-id|timestamp|nonce|sequence|signature|correlation-id)$/.test(name)) {
|
|
31
|
+
fail('request_scope_invalid');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (headers.get('x-dharma-device-id') !== binding.deviceId)
|
|
35
|
+
fail('request_scope_invalid');
|
|
36
|
+
return { url, headers };
|
|
37
|
+
}
|
|
38
|
+
function signedRequest(url, init, headers, binding, now) {
|
|
39
|
+
const sessionId = headers.get('x-dharma-session-id'), messageId = headers.get('x-dharma-message-id');
|
|
40
|
+
const timestamp = headers.get('x-dharma-timestamp'), nonce = headers.get('x-dharma-nonce');
|
|
41
|
+
const sequenceValue = headers.get('x-dharma-sequence'), signature = headers.get('x-dharma-signature');
|
|
42
|
+
const sequence = Number(sequenceValue), time = Date.parse(timestamp || '');
|
|
43
|
+
if (!Number.isFinite(now.getTime()) || !UUID.test(sessionId || '') || !UUID.test(messageId || '')
|
|
44
|
+
|| !/^[A-Za-z0-9_-]{24,128}$/.test(nonce || '') || !/^[1-9][0-9]*$/.test(sequenceValue || '')
|
|
45
|
+
|| !Number.isSafeInteger(sequence) || !/^[A-Za-z0-9_-]{86}$/.test(signature || '')
|
|
46
|
+
|| !Number.isFinite(time) || time > now.getTime() + 5_000 || time < now.getTime() - 240_000) {
|
|
47
|
+
fail('request_signature_invalid');
|
|
48
|
+
}
|
|
49
|
+
const payload = { bodyHash: sha256(typeof init.body === 'string' ? init.body : ''),
|
|
50
|
+
deviceId: binding.deviceId, messageId, method: init.method || 'GET', nonce,
|
|
51
|
+
organizationId: binding.organizationId, pathname: `${url.pathname}${url.search}`,
|
|
52
|
+
sequence, sessionId, timestamp };
|
|
53
|
+
let valid = false;
|
|
54
|
+
try {
|
|
55
|
+
const key = createPublicKey({ format: 'jwk', key: { kty: 'OKP', crv: 'Ed25519', x: binding.publicKeyEd25519 } });
|
|
56
|
+
valid = verify(null, Buffer.from(JSON.stringify(payload)), key, Buffer.from(signature, 'base64url'));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
fail('request_signature_invalid');
|
|
60
|
+
}
|
|
61
|
+
if (!valid)
|
|
62
|
+
fail('request_signature_invalid');
|
|
63
|
+
}
|
|
64
|
+
// The operation's existing device lock encloses this fetcher. The loader can
|
|
65
|
+
// read fresh OS authority, but cannot manufacture an identity or signing anchor.
|
|
66
|
+
export function createDemoTransportFetcher(deps) {
|
|
67
|
+
const fresh = (account) => deps.store.getFresh ? deps.store.getFresh(account) : deps.store.get(account);
|
|
68
|
+
const readOnlyStore = { backend: deps.store.backend, get: fresh, getFresh: fresh,
|
|
69
|
+
async put() { fail('existing_protected_state_required'); },
|
|
70
|
+
async delete() { fail('existing_protected_state_required'); } };
|
|
71
|
+
return async (resource, input = {}) => {
|
|
72
|
+
const init = { ...input, headers: new Headers(input.headers) };
|
|
73
|
+
const selected = typeof resource === 'string' ? resource : resource instanceof URL ? new URL(resource) : resource;
|
|
74
|
+
init.signal?.throwIfAborted();
|
|
75
|
+
let binding = structuredClone(await deps.loadBinding(readOnlyStore));
|
|
76
|
+
let resolution = await resolveDemoTransport(binding, { store: deps.store, now: deps.now });
|
|
77
|
+
let { url, headers } = requestScope(selected, init, binding);
|
|
78
|
+
signedRequest(url, init, headers, binding, deps.now?.() ?? new Date());
|
|
79
|
+
const needsRefresh = resolution.state === 'refresh_required' || resolution.state === 'ready'
|
|
80
|
+
&& Date.parse(resolution.certificate.expiresAt) <= (deps.now?.() ?? new Date()).getTime() + 60_000;
|
|
81
|
+
if (needsRefresh && deps.refresh) {
|
|
82
|
+
const target = resolution.state === 'refresh_required' ? resolution.lastTransportOrigin
|
|
83
|
+
: resolution.state === 'ready' ? resolution.transportOrigin : binding.enrollmentOrigin;
|
|
84
|
+
await deps.refresh(binding, target);
|
|
85
|
+
binding = structuredClone(await deps.loadBinding(readOnlyStore));
|
|
86
|
+
resolution = await resolveDemoTransport(binding, { store: deps.store, now: deps.now });
|
|
87
|
+
({ url, headers } = requestScope(selected, init, binding));
|
|
88
|
+
if (resolution.state !== 'ready' || resolution.transportOrigin !== target)
|
|
89
|
+
fail('refresh_unconfirmed');
|
|
90
|
+
}
|
|
91
|
+
if (resolution.state === 'refresh_required')
|
|
92
|
+
fail('refresh_required');
|
|
93
|
+
signedRequest(url, init, headers, binding, deps.now?.() ?? new Date());
|
|
94
|
+
const target = new URL(`${url.pathname}${url.search}`, resolution.transportOrigin);
|
|
95
|
+
const deadline = AbortSignal.timeout(15_000);
|
|
96
|
+
const signal = init.signal ? AbortSignal.any([init.signal, deadline]) : deadline;
|
|
97
|
+
signal.throwIfAborted();
|
|
98
|
+
const options = { ...init, headers, redirect: 'error', credentials: 'omit', cache: 'no-store', signal };
|
|
99
|
+
const response = await (deps.fetcher || fetch)(target.toString(), options);
|
|
100
|
+
if (response.redirected || response.status >= 300 && response.status < 400
|
|
101
|
+
|| response.url && response.url !== target.toString()
|
|
102
|
+
|| !response.body || !/^application\/json(?:\s*;|$)/i.test(response.headers.get('content-type') || '')) {
|
|
103
|
+
await response.body?.cancel().catch(() => undefined);
|
|
104
|
+
fail('response_contract_invalid');
|
|
105
|
+
}
|
|
106
|
+
return response;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=demoTransportFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoTransportFetch.js","sourceRoot":"","sources":["../src/demoTransportFetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoTransportFetch.test.d.ts","sourceRoot":"","sources":["../src/demoTransportFetch.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { generateKeyPairSync, randomUUID, sign } from 'node:crypto';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
import { canonicalize, sha256, signCanonicalObject } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
5
|
+
import { acceptDemoTransport } from './demoTransportState.js';
|
|
6
|
+
import { createDemoTransportFetcher } from './demoTransportFetch.js';
|
|
7
|
+
async function fixture(mapped = true) {
|
|
8
|
+
const signer = generateKeyPairSync('ed25519'), identity = generateKeyPairSync('ed25519');
|
|
9
|
+
let now = new Date('2026-09-27T14:00:00.000Z');
|
|
10
|
+
const unsigned = { schema: 'dharma.server-signing-keyset/v1',
|
|
11
|
+
organizationId: 'org_fixture', generation: 1, signedByKeyVersion: 'original',
|
|
12
|
+
issuedAt: '2026-09-27T13:00:00.000Z', expiresAt: '2026-09-27T22:49:28.544Z',
|
|
13
|
+
keys: [{ keyVersion: 'original', publicKeyEd25519: signer.publicKey.export({ format: 'jwk' }).x,
|
|
14
|
+
status: 'active', notBefore: '2026-09-01T00:00:00.000Z', notAfter: '2026-09-27T22:49:28.544Z' }] };
|
|
15
|
+
const keyset = { ...unsigned, signature: signCanonicalObject(unsigned, signer.privateKey) };
|
|
16
|
+
const binding = { organizationId: 'org_fixture', repositoryId: '10000000-0000-4000-8000-000000000001',
|
|
17
|
+
deviceId: '30000000-0000-4000-8000-000000000001', installationId: '40000000-0000-4000-8000-000000000001',
|
|
18
|
+
publicKeyEd25519: identity.publicKey.export({ format: 'jwk' }).x,
|
|
19
|
+
enrollmentOrigin: 'https://original.example', protectedKeyset: keyset, minimumPolicyRevision: 1 };
|
|
20
|
+
const values = new Map([['existing-identity', 'private-fixture'], ['existing-trust', canonicalize(keyset)]]);
|
|
21
|
+
const store = { backend: 'linux-secret-service',
|
|
22
|
+
async get(account) { return values.get(account) ?? null; },
|
|
23
|
+
async getFresh(account) { return values.get(account) ?? null; },
|
|
24
|
+
async put(account, value) { assert.match(account, /^demo-transport-/); values.set(account, value); },
|
|
25
|
+
async delete(account) { assert.match(account, /^demo-transport-/); values.delete(account); } };
|
|
26
|
+
const clock = () => new Date(now), target = 'https://corrected.example';
|
|
27
|
+
if (mapped) {
|
|
28
|
+
const body = { schema: 'dharma.demo-transport-continuity/v1', purpose: 'same-authority-repository-transport',
|
|
29
|
+
organizationId: binding.organizationId, repositoryId: binding.repositoryId, deviceId: binding.deviceId,
|
|
30
|
+
installationId: binding.installationId, publicKeyEd25519: binding.publicKeyEd25519,
|
|
31
|
+
enrollmentOrigin: binding.enrollmentOrigin, transportOrigin: target, requestNonce: 'N'.repeat(32),
|
|
32
|
+
policyRevision: 2, trustGeneration: 1, installedKeysetHash: sha256(canonicalize(keyset)),
|
|
33
|
+
signingKeyVersion: 'original', issuedAt: now.toISOString(),
|
|
34
|
+
expiresAt: new Date(now.getTime() + 600_000).toISOString() };
|
|
35
|
+
await acceptDemoTransport({ ...body, signature: signCanonicalObject(body, signer.privateKey) }, binding, { transportOrigin: target, requestNonce: body.requestNonce }, { store, now: clock });
|
|
36
|
+
}
|
|
37
|
+
const root = `/api/demo/fabric/repositories/${binding.repositoryId}`;
|
|
38
|
+
const request = (path = `${root}/status?orgId=${binding.organizationId}`, method = 'GET', body = '') => {
|
|
39
|
+
const url = new URL(path, binding.enrollmentOrigin), sessionId = randomUUID(), messageId = randomUUID();
|
|
40
|
+
const timestamp = now.toISOString(), nonce = 'N'.repeat(32), sequence = 7;
|
|
41
|
+
const payload = { bodyHash: sha256(body), deviceId: binding.deviceId, messageId, method, nonce,
|
|
42
|
+
organizationId: binding.organizationId, pathname: `${url.pathname}${url.search}`, sequence, sessionId, timestamp };
|
|
43
|
+
const headers = { 'x-dharma-device-id': binding.deviceId, 'x-dharma-session-id': sessionId,
|
|
44
|
+
'x-dharma-message-id': messageId, 'x-dharma-timestamp': timestamp, 'x-dharma-nonce': nonce,
|
|
45
|
+
'x-dharma-sequence': String(sequence), 'x-dharma-signature': sign(null, Buffer.from(JSON.stringify(payload)), identity.privateKey).toString('base64url') };
|
|
46
|
+
return { url: url.toString(), init: { method, headers, ...(body ? { body } : {}) } };
|
|
47
|
+
};
|
|
48
|
+
const calls = [];
|
|
49
|
+
let response = Response.json({ ok: true });
|
|
50
|
+
const network = async (resource, init) => { calls.push({ url: String(resource), init }); return response; };
|
|
51
|
+
const deps = { store, now: clock, loadBinding: async (_store) => binding, fetcher: network };
|
|
52
|
+
const fetcher = createDemoTransportFetcher(deps);
|
|
53
|
+
return { binding, values, calls, deps, fetcher, request, root, target,
|
|
54
|
+
setNow(value) { now = value; }, setResponse(value) { response = value; } };
|
|
55
|
+
}
|
|
56
|
+
test('a valid repository request changes only the transport host, not device identity, signature or body', async () => {
|
|
57
|
+
const f = await fixture(), before = [...f.values];
|
|
58
|
+
for (const request of [f.request(), f.request(`${f.root}/messages?orgId=org_fixture`, 'POST', '{"content":"bounded question"}')]) {
|
|
59
|
+
assert.equal((await f.fetcher(request.url, request.init)).status, 200);
|
|
60
|
+
const sent = f.calls.at(-1);
|
|
61
|
+
assert.equal(new URL(sent.url).origin, f.target);
|
|
62
|
+
assert.equal(new URL(sent.url).pathname + new URL(sent.url).search, new URL(request.url).pathname + new URL(request.url).search);
|
|
63
|
+
assert.equal(sent.init?.body, request.init.body);
|
|
64
|
+
assert.equal(new Headers(sent.init?.headers).get('x-dharma-signature'), request.init.headers['x-dharma-signature']);
|
|
65
|
+
assert.equal(sent.init?.redirect, 'error');
|
|
66
|
+
assert.equal(sent.init?.credentials, 'omit');
|
|
67
|
+
}
|
|
68
|
+
assert.deepEqual([...f.values], before);
|
|
69
|
+
});
|
|
70
|
+
test('unmapped transport uses the original origin without creating keys or a transport record', async () => {
|
|
71
|
+
const f = await fixture(false), before = [...f.values], request = f.request();
|
|
72
|
+
await f.fetcher(request.url, request.init);
|
|
73
|
+
assert.equal(new URL(f.calls[0].url).origin, f.binding.enrollmentOrigin);
|
|
74
|
+
assert.deepEqual([...f.values], before);
|
|
75
|
+
});
|
|
76
|
+
test('every request resolves fresh protected state; expired transport or signing trust sends nothing', async () => {
|
|
77
|
+
const f = await fixture();
|
|
78
|
+
f.setNow(new Date('2026-09-27T14:10:00.000Z'));
|
|
79
|
+
const request = f.request();
|
|
80
|
+
await assert.rejects(f.fetcher(request.url, request.init), /refresh_required/);
|
|
81
|
+
assert.equal(f.calls.length, 0);
|
|
82
|
+
f.setNow(new Date(f.binding.protectedKeyset.expiresAt));
|
|
83
|
+
await assert.rejects(f.fetcher(request.url, f.request().init), /protected_authority_invalid/);
|
|
84
|
+
assert.equal(f.calls.length, 0);
|
|
85
|
+
});
|
|
86
|
+
test('foreign origins, repositories, duplicate tenants and encoded routes never receive signed requests', async () => {
|
|
87
|
+
const f = await fixture();
|
|
88
|
+
const valid = f.request();
|
|
89
|
+
for (const url of [valid.url.replace('original.example', 'foreign.example'),
|
|
90
|
+
valid.url.replace(f.binding.repositoryId, '10000000-0000-4000-8000-000000000099'),
|
|
91
|
+
`${valid.url}&orgId=org_fixture`, valid.url.replace('org_fixture', 'org_foreign'),
|
|
92
|
+
valid.url.replace('/status', '/%73tatus'), `${valid.url}#fragment`,
|
|
93
|
+
valid.url.replace('https://', 'https://user:password@')]) {
|
|
94
|
+
await assert.rejects(f.fetcher(url, valid.init), /request_scope_invalid/);
|
|
95
|
+
}
|
|
96
|
+
assert.equal(f.calls.length, 0);
|
|
97
|
+
});
|
|
98
|
+
test('invalid or altered signatures, credentials and unsupported bodies are never forwarded', async () => {
|
|
99
|
+
const f = await fixture(), request = f.request(`${f.root}/messages?orgId=org_fixture`, 'POST', '{"content":"original"}');
|
|
100
|
+
for (const change of [{ body: '{"content":"altered"}' }, { method: 'DELETE' },
|
|
101
|
+
{ body: new URLSearchParams('secret=do-not-forward') },
|
|
102
|
+
{ headers: { ...request.init.headers, authorization: 'Bearer do-not-forward' } },
|
|
103
|
+
{ headers: { ...request.init.headers, cookie: 'do-not-forward' } },
|
|
104
|
+
{ headers: { ...request.init.headers, 'x-dharma-device-id': randomUUID() } },
|
|
105
|
+
{ headers: { ...request.init.headers, 'x-dharma-signature': 'A'.repeat(86) } }]) {
|
|
106
|
+
await assert.rejects(f.fetcher(request.url, { ...request.init, ...change }), /request_(scope|signature)_invalid/);
|
|
107
|
+
}
|
|
108
|
+
assert.equal(f.calls.length, 0);
|
|
109
|
+
});
|
|
110
|
+
test('the protected binding loader cannot create or replace enrollment accounts', async () => {
|
|
111
|
+
const f = await fixture(), request = f.request(), before = [...f.values];
|
|
112
|
+
for (const operation of ['put', 'delete']) {
|
|
113
|
+
const fetcher = createDemoTransportFetcher({ ...f.deps, loadBinding: async (store) => {
|
|
114
|
+
if (operation === 'put')
|
|
115
|
+
await store.put('existing-identity', 'replacement');
|
|
116
|
+
else
|
|
117
|
+
await store.delete('existing-trust');
|
|
118
|
+
return f.binding;
|
|
119
|
+
} });
|
|
120
|
+
await assert.rejects(fetcher(request.url, request.init), /existing_protected_state_required/);
|
|
121
|
+
}
|
|
122
|
+
assert.deepEqual([...f.values], before);
|
|
123
|
+
assert.equal(f.calls.length, 0);
|
|
124
|
+
});
|
|
125
|
+
test('redirects, HTML, and empty transport responses cannot become verified JSON', async () => {
|
|
126
|
+
const f = await fixture(), request = f.request();
|
|
127
|
+
for (const response of [new Response(null, { status: 302, headers: { location: 'https://foreign.example' } }),
|
|
128
|
+
new Response('<html>login</html>', { headers: { 'content-type': 'text/html' } }),
|
|
129
|
+
new Response(null, { status: 204 })]) {
|
|
130
|
+
f.setResponse(response);
|
|
131
|
+
await assert.rejects(f.fetcher(request.url, request.init), /response_contract_invalid/);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
test('HTTP rejection is retained for the caller and never relabeled healthy', async () => {
|
|
135
|
+
const f = await fixture(), request = f.request();
|
|
136
|
+
f.setResponse(Response.json({ ok: false, error: { code: 'demo_fabric_device_revoked' } }, { status: 403 }));
|
|
137
|
+
const result = await f.fetcher(request.url, request.init);
|
|
138
|
+
assert.equal(result.status, 403);
|
|
139
|
+
assert.deepEqual(await result.json(), { ok: false, error: { code: 'demo_fabric_device_revoked' } });
|
|
140
|
+
});
|
|
141
|
+
test('an aborted request and a changed protected binding cannot dispatch', async () => {
|
|
142
|
+
const f = await fixture(), request = f.request(), controller = new AbortController();
|
|
143
|
+
controller.abort();
|
|
144
|
+
await assert.rejects(f.fetcher(request.url, { ...request.init, signal: controller.signal }));
|
|
145
|
+
const foreign = createDemoTransportFetcher({ ...f.deps,
|
|
146
|
+
loadBinding: async () => ({ ...f.binding, deviceId: randomUUID() }) });
|
|
147
|
+
await assert.rejects(foreign(request.url, request.init), /request_scope_invalid/);
|
|
148
|
+
assert.equal(f.calls.length, 0);
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=demoTransportFetch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoTransportFetch.test.js","sourceRoot":"","sources":["../src/demoTransportFetch.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,mBAAmB,EAAmC,MAAM,wCAAwC,CAAC;AAEpI,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,KAAK,UAAU,OAAO,CAAC,MAAM,GAAG,IAAI;IAClC,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACzF,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,EAAE,MAAM,EAAE,iCAA0C;QACnE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE,kBAAkB,EAAE,UAAU;QAC5E,QAAQ,EAAE,0BAA0B,EAAE,SAAS,EAAE,0BAA0B;QAC3E,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAE;gBAC9F,MAAM,EAAE,QAAiB,EAAE,SAAS,EAAE,0BAA0B,EAAE,QAAQ,EAAE,0BAA0B,EAAE,CAAC,EAAE,CAAC;IAChH,MAAM,MAAM,GAA+B,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;IACxH,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,sCAAsC;QACnG,QAAQ,EAAE,sCAAsC,EAAE,cAAc,EAAE,sCAAsC;QACxG,gBAAgB,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAE;QACjE,gBAAgB,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;IACpG,MAAM,MAAM,GAAG,IAAI,GAAG,CAAiB,CAAC,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,EAAE,CAAC,gBAAgB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7H,MAAM,KAAK,GAAsB,EAAE,OAAO,EAAE,sBAAsB;QAChE,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC1D,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACpG,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjG,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,2BAA2B,CAAC;IACxE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,qCAAqC,EAAE,OAAO,EAAE,qCAAqC;YAC1G,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ;YACtG,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAClF,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACjG,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACxF,iBAAiB,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE;YAC1D,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/D,MAAM,mBAAmB,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,EACrG,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,IAAI,GAAG,iCAAiC,OAAO,CAAC,YAAY,EAAE,CAAC;IACrE,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,iBAAiB,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;QACrG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,SAAS,GAAG,UAAU,EAAE,EAAE,SAAS,GAAG,UAAU,EAAE,CAAC;QACxG,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK;YAC5F,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QACrH,MAAM,OAAO,GAAG,EAAE,oBAAoB,EAAE,OAAO,CAAC,QAAQ,EAAE,qBAAqB,EAAE,SAAS;YACxF,qBAAqB,EAAE,SAAS,EAAE,oBAAoB,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK;YAC1F,mBAAmB,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,oBAAoB,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7J,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;IACvF,CAAC,CAAC;IACF,MAAM,KAAK,GAA+C,EAAE,CAAC;IAC7D,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAiB,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1H,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAyB,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAChH,MAAM,OAAO,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM;QACnE,MAAM,CAAC,KAAW,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,KAAe,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/F,CAAC;AAED,IAAI,CAAC,oGAAoG,EAAE,KAAK,IAAI,EAAE;IACpH,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAClD,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,6BAA6B,EAAE,MAAM,EAAE,gCAAgC,CAAC,CAAC,EAAE,CAAC;QACjI,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAChE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACpH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;IACzG,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9E,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1E,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gGAAgG,EAAE,KAAK,IAAI,EAAE;IAChH,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC/E,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,6BAA6B,CAAC,CAAC;IAC9F,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mGAAmG,EAAE,KAAK,IAAI,EAAE;IACnH,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;QACzE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,sCAAsC,CAAC;QACjF,GAAG,KAAK,CAAC,GAAG,oBAAoB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC;QACjF,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,WAAW;QAClE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;IACvG,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,6BAA6B,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC;IACzH,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;QAC3E,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC,uBAAuB,CAAC,EAAE;QACtD,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,EAAE;QAChF,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE;QAClE,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,EAAE,EAAE;QAC5E,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAClF,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,mCAAmC,CAAC,CAAC;IACpH,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;IAC3F,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACzE,KAAK,MAAM,SAAS,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAU,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,0BAA0B,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;gBACjF,IAAI,SAAS,KAAK,KAAK;oBAAE,MAAM,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;;oBACxE,MAAM,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBAC1C,OAAO,CAAC,CAAC,OAAO,CAAC;YACnB,CAAC,EAAE,CAAC,CAAC;QACL,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,mCAAmC,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;IAC5F,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,KAAK,MAAM,QAAQ,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,yBAAyB,EAAE,EAAE,CAAC;QAC3G,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,CAAC;QAChF,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACvC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,2BAA2B,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;IACvF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5G,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;AACtG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;IACpF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACrF,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7F,MAAM,OAAO,GAAG,0BAA0B,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI;QACpD,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACzE,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC;IAClF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { SecureSecretStore } from '@dharma-ai-labs/agent-fabric-relay-client';
|
|
2
|
+
import { type DemoTransportBinding } from './demoTransportState.js';
|
|
3
|
+
interface Dependencies {
|
|
4
|
+
store: SecureSecretStore;
|
|
5
|
+
fetcher?: typeof fetch;
|
|
6
|
+
now?: () => Date;
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
sign: (payload: string) => Promise<string>;
|
|
9
|
+
loadBinding?: () => Promise<DemoTransportBinding>;
|
|
10
|
+
}
|
|
11
|
+
export declare function requestDemoTransportContinuity(input: DemoTransportBinding, target: string, deps: Dependencies): Promise<{
|
|
12
|
+
ok: boolean;
|
|
13
|
+
stage: "demo_transport_verified";
|
|
14
|
+
enrolled: boolean;
|
|
15
|
+
duplicate: boolean;
|
|
16
|
+
deviceId: string;
|
|
17
|
+
repositoryId: string;
|
|
18
|
+
transportOrigin: string;
|
|
19
|
+
expiresAt: string;
|
|
20
|
+
resumed: boolean;
|
|
21
|
+
correlationId?: undefined;
|
|
22
|
+
} | {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
stage: "demo_transport_verified";
|
|
25
|
+
enrolled: boolean;
|
|
26
|
+
duplicate: boolean;
|
|
27
|
+
deviceId: string;
|
|
28
|
+
repositoryId: string;
|
|
29
|
+
transportOrigin: string;
|
|
30
|
+
expiresAt: string;
|
|
31
|
+
correlationId: string;
|
|
32
|
+
resumed: boolean;
|
|
33
|
+
}>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=demoTransportRequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoTransportRequest.d.ts","sourceRoot":"","sources":["../src/demoTransportRequest.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAA6C,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAQ/G,UAAU,YAAY;IACpB,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IACzF,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACnD;AA8CD,wBAAsB,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;GA2FnH"}
|