@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.
Files changed (58) hide show
  1. package/dist/demoDeviceTransport.d.ts +33 -0
  2. package/dist/demoDeviceTransport.d.ts.map +1 -0
  3. package/dist/demoDeviceTransport.js +52 -0
  4. package/dist/demoDeviceTransport.js.map +1 -0
  5. package/dist/demoDeviceTransport.test.d.ts +2 -0
  6. package/dist/demoDeviceTransport.test.d.ts.map +1 -0
  7. package/dist/demoDeviceTransport.test.js +178 -0
  8. package/dist/demoDeviceTransport.test.js.map +1 -0
  9. package/dist/demoTransportCommand.test.d.ts +2 -0
  10. package/dist/demoTransportCommand.test.d.ts.map +1 -0
  11. package/dist/demoTransportCommand.test.js +28 -0
  12. package/dist/demoTransportCommand.test.js.map +1 -0
  13. package/dist/demoTransportContinuity.d.ts +39 -0
  14. package/dist/demoTransportContinuity.d.ts.map +1 -0
  15. package/dist/demoTransportContinuity.js +82 -0
  16. package/dist/demoTransportContinuity.js.map +1 -0
  17. package/dist/demoTransportContinuity.test.d.ts +2 -0
  18. package/dist/demoTransportContinuity.test.d.ts.map +1 -0
  19. package/dist/demoTransportContinuity.test.js +145 -0
  20. package/dist/demoTransportContinuity.test.js.map +1 -0
  21. package/dist/demoTransportFetch.d.ts +12 -0
  22. package/dist/demoTransportFetch.d.ts.map +1 -0
  23. package/dist/demoTransportFetch.js +109 -0
  24. package/dist/demoTransportFetch.js.map +1 -0
  25. package/dist/demoTransportFetch.test.d.ts +2 -0
  26. package/dist/demoTransportFetch.test.d.ts.map +1 -0
  27. package/dist/demoTransportFetch.test.js +150 -0
  28. package/dist/demoTransportFetch.test.js.map +1 -0
  29. package/dist/demoTransportRequest.d.ts +35 -0
  30. package/dist/demoTransportRequest.d.ts.map +1 -0
  31. package/dist/demoTransportRequest.js +193 -0
  32. package/dist/demoTransportRequest.js.map +1 -0
  33. package/dist/demoTransportRequest.test.d.ts +2 -0
  34. package/dist/demoTransportRequest.test.d.ts.map +1 -0
  35. package/dist/demoTransportRequest.test.js +203 -0
  36. package/dist/demoTransportRequest.test.js.map +1 -0
  37. package/dist/demoTransportState.d.ts +31 -0
  38. package/dist/demoTransportState.d.ts.map +1 -0
  39. package/dist/demoTransportState.js +204 -0
  40. package/dist/demoTransportState.js.map +1 -0
  41. package/dist/demoTransportState.test.d.ts +2 -0
  42. package/dist/demoTransportState.test.d.ts.map +1 -0
  43. package/dist/demoTransportState.test.js +192 -0
  44. package/dist/demoTransportState.test.js.map +1 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +33 -14
  47. package/dist/index.js.map +1 -1
  48. package/dist/relaySupervisor.test.js +3 -1
  49. package/dist/relaySupervisor.test.js.map +1 -1
  50. package/dist/schemas/demo-transport-continuity.schema.json +27 -0
  51. package/dist/schemas/demo-transport-journal.schema.json +13 -0
  52. package/dist/schemas/demo-transport-request.schema.json +27 -0
  53. package/dist/schemas/demo-transport-state.schema.json +13 -0
  54. package/dist/usage.d.ts +1 -1
  55. package/dist/usage.d.ts.map +1 -1
  56. package/dist/usage.js +1 -1
  57. package/dist/usage.js.map +1 -1
  58. 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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAA6B,MAAM,yBAAyB,CAAC;AAS1F,MAAM,IAAI,GAAG,4EAA4E,CAAC;AAC1F,SAAS,IAAI,CAAC,MAAc;IAC1B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,MAAM,mDAAmD,CAAC,EAC1H,EAAE,IAAI,EAAE,kBAAkB,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AACD,SAAS,YAAY,CAAC,QAAqC,EAAE,IAAiB,EAAE,OAA6B;IAC3G,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,YAAY,GAAG,CAAC;QAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC9F,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAAC,CAAC;IACjF,MAAM,MAAM,GAAG,iCAAiC,OAAO,CAAC,YAAY,GAAG,CAAC;IACxE,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI;WAClF,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,MAAM,CAAC;WACvF,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;WAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,cAAc;WACxD,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;WAC/C,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;WAC9E,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,kGAAkG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjK,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,OAAO,CAAC,QAAQ;QAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC1F,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AACD,SAAS,aAAa,CAAC,GAAQ,EAAE,IAAiB,EAAE,OAAgB,EAAE,OAA6B,EAAE,GAAS;IAC5G,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrG,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3F,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACtG,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;WAC5F,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;WAC1F,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;WAC/E,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9F,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,KAAK;QAC1E,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE;QAChF,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACnC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACjH,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,SAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IACxG,CAAC;IAAC,MAAM,CAAC;QAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;AAChD,CAAC;AAED,6EAA6E;AAC7E,iFAAiF;AACjF,MAAM,UAAU,0BAA0B,CAAC,IAAkB;IAC3D,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChH,MAAM,aAAa,GAAsB,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK;QACjG,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC;QAC1D,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClH,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAG,eAAe,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;QACrE,IAAI,UAAU,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3F,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7D,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,KAAK,kBAAkB,IAAI,UAAU,CAAC,KAAK,KAAK,OAAO;eACvF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;QACrG,IAAI,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,KAAK,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,mBAAmB;gBACrF,CAAC,CAAC,UAAU,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;YACzF,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACpC,OAAO,GAAG,eAAe,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;YACjE,UAAU,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACvF,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,IAAI,UAAU,CAAC,KAAK,KAAK,OAAO,IAAI,UAAU,CAAC,eAAe,KAAK,MAAM;gBAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACzG,CAAC;QACD,IAAI,UAAU,CAAC,KAAK,KAAK,kBAAkB;YAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjF,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAgB,EAAE,WAAW,EAAE,MAAe,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAC1H,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3E,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;eACrE,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,KAAK,MAAM,CAAC,QAAQ,EAAE;eAClD,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACzG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=demoTransportFetch.test.d.ts.map
@@ -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":"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"}
@@ -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"}