@dharma-ai-labs/agent-fabric 0.2.111 → 0.2.112

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 (74) hide show
  1. package/AGENT_FABRIC_ONBOARDING.md +13 -0
  2. package/dist/codexBoundSession.d.ts +30 -5
  3. package/dist/codexBoundSession.d.ts.map +1 -1
  4. package/dist/codexBoundSession.js +49 -2
  5. package/dist/codexBoundSession.js.map +1 -1
  6. package/dist/codexBoundSession.test.js +17 -0
  7. package/dist/codexBoundSession.test.js.map +1 -1
  8. package/dist/codexInboxSession.d.ts +50 -0
  9. package/dist/codexInboxSession.d.ts.map +1 -1
  10. package/dist/codexInboxSession.js +32 -3
  11. package/dist/codexInboxSession.js.map +1 -1
  12. package/dist/codexPeerTools.d.ts +62 -0
  13. package/dist/codexPeerTools.d.ts.map +1 -0
  14. package/dist/codexPeerTools.js +53 -0
  15. package/dist/codexPeerTools.js.map +1 -0
  16. package/dist/codexPeerTools.test.d.ts +2 -0
  17. package/dist/codexPeerTools.test.d.ts.map +1 -0
  18. package/dist/codexPeerTools.test.js +77 -0
  19. package/dist/codexPeerTools.test.js.map +1 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +267 -4
  22. package/dist/index.js.map +1 -1
  23. package/dist/namedCodexThread.d.ts +3 -0
  24. package/dist/namedCodexThread.d.ts.map +1 -0
  25. package/dist/namedCodexThread.js +22 -0
  26. package/dist/namedCodexThread.js.map +1 -0
  27. package/dist/namedCodexThread.test.d.ts +2 -0
  28. package/dist/namedCodexThread.test.d.ts.map +1 -0
  29. package/dist/namedCodexThread.test.js +63 -0
  30. package/dist/namedCodexThread.test.js.map +1 -0
  31. package/dist/namedSessionBudget.d.ts +21 -0
  32. package/dist/namedSessionBudget.d.ts.map +1 -0
  33. package/dist/namedSessionBudget.js +70 -0
  34. package/dist/namedSessionBudget.js.map +1 -0
  35. package/dist/namedSessionBudget.test.d.ts +2 -0
  36. package/dist/namedSessionBudget.test.d.ts.map +1 -0
  37. package/dist/namedSessionBudget.test.js +40 -0
  38. package/dist/namedSessionBudget.test.js.map +1 -0
  39. package/dist/namedSessionService.d.ts +39 -0
  40. package/dist/namedSessionService.d.ts.map +1 -0
  41. package/dist/namedSessionService.js +269 -0
  42. package/dist/namedSessionService.js.map +1 -0
  43. package/dist/namedSessionService.test.d.ts +2 -0
  44. package/dist/namedSessionService.test.d.ts.map +1 -0
  45. package/dist/namedSessionService.test.js +158 -0
  46. package/dist/namedSessionService.test.js.map +1 -0
  47. package/dist/namedSessionTrust.d.ts +21 -0
  48. package/dist/namedSessionTrust.d.ts.map +1 -0
  49. package/dist/namedSessionTrust.js +64 -0
  50. package/dist/namedSessionTrust.js.map +1 -0
  51. package/dist/namedSessionTrust.test.d.ts +2 -0
  52. package/dist/namedSessionTrust.test.d.ts.map +1 -0
  53. package/dist/namedSessionTrust.test.js +178 -0
  54. package/dist/namedSessionTrust.test.js.map +1 -0
  55. package/dist/onboardingStage.d.ts +1 -1
  56. package/dist/onboardingStage.d.ts.map +1 -1
  57. package/dist/onboardingStage.js.map +1 -1
  58. package/dist/providerSessionChannel.d.ts +1 -0
  59. package/dist/providerSessionChannel.d.ts.map +1 -1
  60. package/dist/providerSessionChannel.js +5 -1
  61. package/dist/providerSessionChannel.js.map +1 -1
  62. package/dist/providerSessionChannel.test.js +10 -3
  63. package/dist/providerSessionChannel.test.js.map +1 -1
  64. package/dist/repositoryOnboardingCaller.test.js +19 -0
  65. package/dist/repositoryOnboardingCaller.test.js.map +1 -1
  66. package/dist/usage.d.ts +1 -1
  67. package/dist/usage.d.ts.map +1 -1
  68. package/dist/usage.js +1 -1
  69. package/dist/usage.js.map +1 -1
  70. package/dist/usage.test.d.ts +2 -0
  71. package/dist/usage.test.d.ts.map +1 -0
  72. package/dist/usage.test.js +18 -0
  73. package/dist/usage.test.js.map +1 -0
  74. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namedSessionService.test.d.ts","sourceRoot":"","sources":["../src/namedSessionService.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,158 @@
1
+ import assert from 'node:assert/strict';
2
+ import { generateKeyPairSync, randomBytes, randomUUID } from 'node:crypto';
3
+ import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import test from 'node:test';
7
+ import { LocalVault } from '@dharma-ai-labs/agent-fabric-local-vault';
8
+ import { signCanonicalObject, validateContract } from '@dharma-ai-labs/agent-fabric-contracts';
9
+ import { namedSessionPaths, namedSessionRequest, readNamedSession, runNamedSessionService, saveNamedSession } from './namedSessionService.js';
10
+ test('durable named registration excludes credentials, grants and foreign shape', async () => {
11
+ const home = await mkdtemp(join(process.platform === 'darwin' ? '/tmp' : tmpdir(), 'dhr-'));
12
+ const identity = { organizationId: 'org_test', repositoryBindingId: randomUUID(), workspaceId: randomUUID(),
13
+ endpointId: randomUUID(), membershipId: randomUUID(), deviceId: randomUUID(), provider: 'codex' };
14
+ const good = { schema: 'dharma.named-session/v1', name: 'reviewer', bindingId: randomUUID(),
15
+ identity, maximumCostCents: 100, maximumTurnCostCents: 25, enabled: true };
16
+ await saveNamedSession(home, good);
17
+ for (const invalid of [{ ...good, grant: 'private-fixture' }, { ...good, maximumTurnCostCents: 101 },
18
+ { ...good, identity: { ...identity, credential: 'private-fixture' } },
19
+ { ...good, identity: { ...identity, membershipId: 'unbound-email' } }]) {
20
+ await assert.rejects(saveNamedSession(home, invalid), /registration_invalid/);
21
+ assert.deepEqual(await readNamedSession(home, 'reviewer'), good);
22
+ }
23
+ await writeFile(namedSessionPaths(home, 'reviewer').registration, JSON.stringify({ ...good, grant: 'private-fixture' }));
24
+ await assert.rejects(readNamedSession(home, 'reviewer'), /registration_invalid/);
25
+ });
26
+ test('named session socket paths remain bounded without relaxing identity validation', () => {
27
+ assert.throws(() => namedSessionPaths('/tmp/' + 'x'.repeat(100), 'reviewer'), /socket_path_too_long/);
28
+ assert.throws(() => namedSessionPaths('/tmp/dhr', '../foreign'), /name_invalid/);
29
+ assert.ok(Buffer.byteLength(namedSessionPaths('/tmp/dhr', 'reviewer').socket) <= 103);
30
+ });
31
+ test('named session serializes local work and signed peer questions with per-turn permissions', { skip: process.platform !== 'linux' }, async () => {
32
+ const home = await mkdtemp(join(tmpdir(), 'dharma-named-'));
33
+ const { privateKey, publicKey } = generateKeyPairSync('ed25519');
34
+ const identity = { organizationId: 'org_test', repositoryBindingId: randomUUID(), workspaceId: randomUUID(),
35
+ endpointId: randomUUID(), membershipId: randomUUID(), deviceId: randomUUID(), provider: 'codex' };
36
+ const binding = { schema: 'dharma.local-provider-session-binding/v1', ...identity,
37
+ bindingId: randomUUID(), owner: 'dharma_bridge', sessionId: randomUUID(), workspaceRoot: join(home, 'repo'),
38
+ createdAt: new Date().toISOString(), expiresAt: new Date(Date.now() + 3600000).toISOString(), maximumProviderCostCents: 25 };
39
+ const registration = { schema: 'dharma.named-session/v1', name: 'implementer',
40
+ bindingId: binding.bindingId, identity, maximumCostCents: 100, maximumTurnCostCents: 25, enabled: true };
41
+ await mkdir(binding.workspaceRoot);
42
+ await saveNamedSession(home, registration);
43
+ assert.deepEqual(await readNamedSession(home, registration.name), registration);
44
+ const vault = await LocalVault.open({ root: join(home, 'vault'), masterKey: randomBytes(32) });
45
+ vault.saveProviderSessionBinding(binding);
46
+ const controller = new AbortController(), turns = [], replies = [];
47
+ const listeners = new Set();
48
+ let offered = false, accepted = false, active = 0, maximumActive = 0, closed = false, revision = 0;
49
+ const questionId = randomUUID(), taskId = randomUUID(), now = new Date();
50
+ const unsigned = { schema: 'dharma.session-question/v1', questionId, taskId,
51
+ organizationId: identity.organizationId, repositoryBindingId: identity.repositoryBindingId,
52
+ source: { workspaceId: randomUUID(), endpointId: randomUUID(), membershipId: randomUUID(), deviceId: randomUUID() },
53
+ target: { workspaceId: identity.workspaceId, endpointId: identity.endpointId, membershipId: identity.membershipId,
54
+ deviceId: identity.deviceId, bindingId: binding.bindingId, provider: 'codex' },
55
+ category: 'code-review', question: 'What is a logical job?',
56
+ authority: { mode: 'read_only', readPaths: ['.'], network: 'deny', maximumProviderCostCents: 25 },
57
+ createdAt: now.toISOString(), expiresAt: new Date(now.getTime() + 300000).toISOString(),
58
+ nonce: randomUUID(), signerKeyVersion: 'test-v1' };
59
+ const question = { ...unsigned, signature: signCanonicalObject(unsigned, privateKey) };
60
+ const transport = {
61
+ onToolCall() { return () => { }; },
62
+ onNotification(listener) { listeners.add(listener); return () => { listeners.delete(listener); }; },
63
+ async close() { closed = true; },
64
+ async request(method, params) {
65
+ if (method === 'permissionProfile/list')
66
+ return { data: ['dharma_bridge', 'dharma_work'].map(id => ({ id, allowed: true })) };
67
+ if (method === 'config/read')
68
+ return { config: { permissions: {
69
+ dharma_bridge: { filesystem: { ':minimal': 'read', ':workspace_roots': { '.': 'read' } }, network: { enabled: false } },
70
+ dharma_work: { filesystem: { ':minimal': 'read', ':workspace_roots': { '.': 'write' } }, network: { enabled: false } },
71
+ } } };
72
+ if (method === 'thread/read')
73
+ return { thread: { id: binding.sessionId, cwd: binding.workspaceRoot, status: { type: 'idle' } } };
74
+ if (method === 'turn/start') {
75
+ assert.equal(params.threadId, binding.sessionId);
76
+ assert.equal(params.approvalPolicy, 'never');
77
+ turns.push(String(params.permissions));
78
+ active++;
79
+ maximumActive = Math.max(maximumActive, active);
80
+ const turnId = randomUUID();
81
+ setTimeout(() => {
82
+ active--;
83
+ for (const listener of listeners)
84
+ listener({ method: 'turn/completed', params: { threadId: binding.sessionId,
85
+ turn: { id: turnId, status: 'completed', items: [{ type: 'agentMessage', phase: 'final_answer', text: 'One tenant-scoped operation.' }] } } });
86
+ }, 25);
87
+ return { turn: { id: turnId } };
88
+ }
89
+ throw new Error('unexpected');
90
+ },
91
+ };
92
+ const channelTransport = { async signedPost(route, body) {
93
+ const value = body;
94
+ const base = { ok: true, organizationId: identity.organizationId, correlationId: randomUUID() };
95
+ if (route.endsWith('provider-sessions')) {
96
+ if (value.action === 'inspect')
97
+ return { ...base, registration: null };
98
+ return { ...base, registration: { bindingId: binding.bindingId, ...identity,
99
+ organizationId: undefined, mode: 'bridge_owned', revision: ++revision, state: 'attached',
100
+ leaseUntil: new Date(Date.now() + 60000).toISOString(), replay: false } };
101
+ }
102
+ if (value.action === 'inbox')
103
+ return { ...base, result: { offers: offered && !accepted ? [question] : [] } };
104
+ if (value.action === 'accept')
105
+ accepted = true;
106
+ if (value.action === 'reply')
107
+ replies.push(String(value.answer));
108
+ return { ...base, result: { questionId, taskId, targetBindingId: binding.bindingId,
109
+ state: value.action === 'reply' ? 'answered' : 'accepted', replay: false } };
110
+ } };
111
+ // The wire registration deliberately has no organizationId inside the scoped result.
112
+ const rawPost = channelTransport.signedPost;
113
+ channelTransport.signedPost = async (route, body) => {
114
+ const result = await rawPost(route, body);
115
+ if (result.registration)
116
+ delete result.registration.organizationId;
117
+ return result;
118
+ };
119
+ const service = runNamedSessionService({ home, registration, vault, signal: controller.signal,
120
+ openTransport: async () => transport, channelTransport, verifier: { resolvePublicKey: () => publicKey, consume: async () => true },
121
+ authorizeContent: async () => true, localWriteRoots: ['.'], authorizeLocalWork: async () => true,
122
+ withActivationBoundary: operation => operation() });
123
+ try {
124
+ for (let n = 0; n < 40; n++) {
125
+ try {
126
+ await namedSessionRequest(home, 'implementer', { action: 'status' });
127
+ break;
128
+ }
129
+ catch {
130
+ await new Promise(resolveWait => setTimeout(resolveWait, 10));
131
+ }
132
+ }
133
+ const workId = randomUUID();
134
+ const first = namedSessionRequest(home, 'implementer', { action: 'work', workId, prompt: 'Run the public tests.' });
135
+ const second = namedSessionRequest(home, 'implementer', { action: 'work', workId: randomUUID(), prompt: 'Check the correction.' });
136
+ await Promise.all([first, second]);
137
+ offered = true;
138
+ for (let n = 0; n < 150 && !replies.length; n++)
139
+ await new Promise(resolveWait => setTimeout(resolveWait, 10));
140
+ assert.equal(replies.length, 1);
141
+ assert.equal(maximumActive, 1);
142
+ assert.deepEqual(turns, ['dharma_work', 'dharma_work', 'dharma_bridge']);
143
+ await assert.rejects(namedSessionRequest(home, 'implementer', { action: 'work', workId, prompt: 'Replay' }), /work_already_recorded/);
144
+ assert.equal(turns.length, 3);
145
+ const health = JSON.parse(await readFile(namedSessionPaths(home, 'implementer').health, 'utf8'));
146
+ assert.equal(health.budget.reservedCents, 75);
147
+ const completion = JSON.parse((await vault.getBlob(health.lastObservation.completionHash)).toString('utf8'));
148
+ assert.equal((await validateContract(join(import.meta.dirname, 'schemas'), 'https://schemas.dharma-ai.io/provider-session-completion/v1', completion)).ok, true);
149
+ assert.equal((await namedSessionRequest(home, 'implementer', { action: 'status' })).sessionId, binding.sessionId);
150
+ }
151
+ finally {
152
+ controller.abort();
153
+ await service;
154
+ vault.close();
155
+ }
156
+ assert.equal(closed, true);
157
+ });
158
+ //# sourceMappingURL=namedSessionService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namedSessionService.test.js","sourceRoot":"","sources":["../src/namedSessionService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { LocalProviderSessionIdentity, LocalVault } from '@dharma-ai-labs/agent-fabric-local-vault';
2
+ import { type DeviceConfig, type SecureSecretStore } from '@dharma-ai-labs/agent-fabric-relay-client';
3
+ export declare function isNamedSessionOwnerReceipt(response: Record<string, unknown>, bindingId: string, identity: LocalProviderSessionIdentity, now?: Date): boolean;
4
+ export declare function createNamedSessionTrust(input: {
5
+ configPath: string;
6
+ identity: Pick<DeviceConfig, 'organizationId' | 'deviceId' | 'publicKeyEd25519' | 'hqUrl'>;
7
+ store?: SecureSecretStore;
8
+ now?: () => Date;
9
+ }): {
10
+ resolvePublicKey: (keyVersion: string) => import("crypto").KeyObject | null;
11
+ refresh(): Promise<DeviceConfig>;
12
+ };
13
+ export declare function renewNamedSessionLifetime(input: {
14
+ vault: LocalVault;
15
+ bindingId: string;
16
+ identity: LocalProviderSessionIdentity;
17
+ trust: ReturnType<typeof createNamedSessionTrust>;
18
+ authorize(): Promise<boolean>;
19
+ now?: () => Date;
20
+ }): Promise<import("@dharma-ai-labs/agent-fabric-local-vault").LocalProviderSessionBinding>;
21
+ //# sourceMappingURL=namedSessionTrust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namedSessionTrust.d.ts","sourceRoot":"","sources":["../src/namedSessionTrust.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACzG,OAAO,EACL,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAG/F,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAC7F,QAAQ,EAAE,4BAA4B,EAAE,GAAG,OAAa,GAAG,OAAO,CAcnE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,UAAU,GAAG,kBAAkB,GAAG,OAAO,CAAC,CAAC;IAC3F,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;;;EA+BA;AAED,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,KAAK,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,4BAA4B,CAAC;IAC7E,KAAK,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;IAClD,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,2FAWA"}
@@ -0,0 +1,64 @@
1
+ import { createActionDecisionPublicKeyResolver } from '@dharma-ai-labs/agent-fabric-contracts';
2
+ import { loadDeviceEnrollmentAnchor, recoverDeviceEnrollmentConsistency } from '@dharma-ai-labs/agent-fabric-relay-client';
3
+ import { createSystemSecureStore } from '@dharma-ai-labs/agent-fabric-secure-store';
4
+ export function isNamedSessionOwnerReceipt(response, bindingId, identity, now = new Date()) {
5
+ 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;
6
+ const value = response.registration;
7
+ const fields = ['bindingId', 'workspaceId', 'endpointId', 'repositoryBindingId', 'membershipId', 'deviceId',
8
+ 'provider', 'mode', 'revision', 'state', 'leaseUntil', 'replay'];
9
+ return Object.keys(response).sort().join(',') === 'correlationId,ok,organizationId,registration'
10
+ && response.ok === true && response.organizationId === identity.organizationId
11
+ && typeof response.correlationId === 'string' && uuid.test(response.correlationId)
12
+ && Boolean(value) && Object.keys(value).sort().join(',') === fields.sort().join(',')
13
+ && value.bindingId === bindingId && value.mode === 'bridge_owned' && value.state === 'attached'
14
+ && value.replay === false && Number.isInteger(value.revision) && Number(value.revision) >= 1
15
+ && Number(value.revision) <= 2147483647 && typeof value.leaseUntil === 'string' && Number.isFinite(Date.parse(value.leaseUntil))
16
+ && Number.isFinite(now.getTime()) && Date.parse(value.leaseUntil) <= now.getTime() + 120000
17
+ && Object.entries(identity).filter(([key]) => key !== 'organizationId').every(([key, expected]) => value[key] === expected);
18
+ }
19
+ export function createNamedSessionTrust(input) {
20
+ const now = input.now ?? (() => new Date());
21
+ let trusted = null;
22
+ const resolvePublicKey = version => {
23
+ const keyset = trusted?.serverSigningKeyset;
24
+ return keyset ? createActionDecisionPublicKeyResolver(keyset, now())(version) : null;
25
+ };
26
+ return {
27
+ resolvePublicKey,
28
+ async refresh() {
29
+ // Clear stale authority even when the protected read or transition fails.
30
+ trusted = null;
31
+ const protectedStore = input.store ?? await createSystemSecureStore();
32
+ const store = { backend: protectedStore.backend,
33
+ get: account => protectedStore.getFresh ? protectedStore.getFresh(account) : protectedStore.get(account),
34
+ put: (account, value) => protectedStore.put(account, value), delete: account => protectedStore.delete(account) };
35
+ const config = await recoverDeviceEnrollmentConsistency({ configPath: input.configPath, store, now: now() });
36
+ await loadDeviceEnrollmentAnchor({ config, store });
37
+ if (['organizationId', 'deviceId', 'publicKeyEd25519', 'hqUrl'].some(key => config[key] !== input.identity[key])) {
38
+ throw new Error('named_session_trust_scope_mismatch');
39
+ }
40
+ const keyset = config.serverSigningKeyset;
41
+ if (!keyset || keyset.organizationId !== config.organizationId
42
+ || !keyset.keys.some(key => createActionDecisionPublicKeyResolver(keyset, now())(key.keyVersion))) {
43
+ throw new Error('named_session_trust_invalid_or_expired');
44
+ }
45
+ trusted = config;
46
+ return config;
47
+ },
48
+ };
49
+ }
50
+ export async function renewNamedSessionLifetime(input) {
51
+ await input.trust.refresh();
52
+ const binding = input.vault.getProviderSessionBinding(input.bindingId, input.identity);
53
+ if (!binding || binding.owner !== 'dharma_bridge')
54
+ throw new Error('named_session_binding_unavailable');
55
+ const now = (input.now ?? (() => new Date()))();
56
+ if (Date.parse(binding.expiresAt) - now.getTime() >= 86400000)
57
+ return binding;
58
+ if (!await input.authorize())
59
+ throw new Error('named_session_lifetime_not_authorized');
60
+ // A network wait must not allow an expired or replaced enrollment to authorize renewal.
61
+ await input.trust.refresh();
62
+ return input.vault.renewProviderSessionBinding(input.bindingId, input.identity, binding.expiresAt, new Date(now.getTime() + 30 * 86400000).toISOString(), now);
63
+ }
64
+ //# sourceMappingURL=namedSessionTrust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namedSessionTrust.js","sourceRoot":"","sources":["../src/namedSessionTrust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=namedSessionTrust.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namedSessionTrust.test.d.ts","sourceRoot":"","sources":["../src/namedSessionTrust.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,178 @@
1
+ import assert from 'node:assert/strict';
2
+ import { generateKeyPairSync, randomBytes } from 'node:crypto';
3
+ import { mkdtemp } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import test from 'node:test';
7
+ import { signCanonicalObject } from '@dharma-ai-labs/agent-fabric-contracts';
8
+ import { LocalVault } from '@dharma-ai-labs/agent-fabric-local-vault';
9
+ import { installTrustedServerSigningKeyset, saveDeviceConfig, saveDeviceEnrollmentAnchor } from '@dharma-ai-labs/agent-fabric-relay-client';
10
+ import { createNamedSessionTrust, isNamedSessionOwnerReceipt, renewNamedSessionLifetime } from './namedSessionTrust.js';
11
+ import { createProviderSessionChannel } from './providerSessionChannel.js';
12
+ const uuid = (n) => `40000000-0000-4000-8000-${String(n).padStart(12, '0')}`;
13
+ async function fixture() {
14
+ const root = await mkdtemp(join(tmpdir(), 'fabric-session-trust-'));
15
+ let now = new Date();
16
+ const first = generateKeyPairSync('ed25519'), second = generateKeyPairSync('ed25519');
17
+ const firstPublic = first.publicKey.export({ format: 'jwk' }).x;
18
+ const secondPublic = second.publicKey.export({ format: 'jwk' }).x;
19
+ const notBefore = new Date(now.getTime() - 60_000).toISOString();
20
+ const oldExpiry = new Date(now.getTime() + 2 * 86400000).toISOString();
21
+ const newExpiry = new Date(now.getTime() + 10 * 86400000).toISOString();
22
+ const initialUnsigned = { schema: 'dharma.server-signing-keyset/v1', organizationId: 'org_test', generation: 1,
23
+ keys: [{ keyVersion: 'kms/1', publicKeyEd25519: firstPublic, status: 'active', notBefore, notAfter: oldExpiry }],
24
+ signedByKeyVersion: 'kms/1', issuedAt: now.toISOString(), expiresAt: oldExpiry };
25
+ const initial = { ...initialUnsigned, signature: signCanonicalObject(initialUnsigned, first.privateKey) };
26
+ const rotatedUnsigned = { ...initialUnsigned, generation: 2, expiresAt: newExpiry,
27
+ keys: [{ ...initialUnsigned.keys[0], status: 'overlap' },
28
+ { keyVersion: 'kms/2', publicKeyEd25519: secondPublic, status: 'active', notBefore, notAfter: newExpiry }] };
29
+ const rotated = { ...rotatedUnsigned, signature: signCanonicalObject(rotatedUnsigned, first.privateKey) };
30
+ const values = new Map();
31
+ const store = { backend: 'linux-secret-service', get: async (key) => values.get(key) ?? null,
32
+ put: async (key, value) => { values.set(key, value); }, delete: async (key) => { values.delete(key); } };
33
+ const config = { schema: 'dharma.device-config/v1', hqUrl: 'https://hq.example', relayUrl: 'wss://relay.example',
34
+ organizationId: 'org_test', deviceId: uuid(5), deviceName: 'test', platform: 'linux',
35
+ publicKeyEd25519: firstPublic, serverPublicKeyEd25519: firstPublic, serverSigningKeyset: initial, enrolledAt: now.toISOString() };
36
+ const configPath = join(root, 'device.json');
37
+ await saveDeviceConfig(configPath, config);
38
+ await saveDeviceEnrollmentAnchor({ config, store });
39
+ const trust = createNamedSessionTrust({ configPath, identity: config, store, now: () => now });
40
+ const vault = await LocalVault.open({ root: join(root, 'vault'), masterKey: randomBytes(32) });
41
+ const binding = { schema: 'dharma.local-provider-session-binding/v1', owner: 'dharma_bridge',
42
+ organizationId: config.organizationId, deviceId: config.deviceId, membershipId: uuid(4), repositoryBindingId: uuid(1),
43
+ workspaceId: uuid(2), endpointId: uuid(3), bindingId: uuid(6), provider: 'codex', sessionId: 'retained-thread',
44
+ workspaceRoot: root, createdAt: now.toISOString(), expiresAt: oldExpiry, maximumProviderCostCents: 25 };
45
+ vault.saveProviderSessionBinding(binding);
46
+ return { root, trust, vault, binding, config, configPath, store, rotated, oldExpiry, newExpiry, second,
47
+ setTime: (time) => { now = time; }, now: () => now };
48
+ }
49
+ test('protected successor trust is refreshed while running and after original expiry on restart', async () => {
50
+ const f = await fixture();
51
+ try {
52
+ await f.trust.refresh();
53
+ assert.ok(f.trust.resolvePublicKey('kms/1'));
54
+ assert.equal(f.trust.resolvePublicKey('kms/2'), null);
55
+ await installTrustedServerSigningKeyset({ configPath: f.configPath, candidate: f.rotated, store: f.store, now: f.now() });
56
+ await f.trust.refresh();
57
+ assert.ok(f.trust.resolvePublicKey('kms/2'));
58
+ f.setTime(new Date(Date.parse(f.oldExpiry) + 1000));
59
+ const restarted = createNamedSessionTrust({ configPath: f.configPath, identity: f.config, store: f.store, now: f.now });
60
+ await restarted.refresh();
61
+ assert.ok(restarted.resolvePublicKey('kms/2'));
62
+ assert.equal(restarted.resolvePublicKey('kms/1'), null);
63
+ await renewNamedSessionLifetime({ vault: f.vault, bindingId: f.binding.bindingId, identity: f.binding,
64
+ trust: restarted, authorize: async () => true, now: f.now });
65
+ const renewed = f.vault.getProviderSessionBinding(f.binding.bindingId, f.binding);
66
+ assert.deepEqual({ ...renewed, expiresAt: f.binding.expiresAt }, f.binding);
67
+ assert.ok(Date.parse(renewed.expiresAt) > f.now().getTime());
68
+ assert.equal(f.rotated.keys[0].notAfter, f.oldExpiry);
69
+ }
70
+ finally {
71
+ f.vault.close();
72
+ }
73
+ });
74
+ test('expired, foreign, unprotected and conflicting trust never renews local authority', async () => {
75
+ for (const kind of ['expired', 'foreign', 'unprotected', 'deleted_after_cache', 'conflicting']) {
76
+ const f = await fixture();
77
+ try {
78
+ if (kind === 'expired')
79
+ f.setTime(new Date(Date.parse(f.oldExpiry) + 1));
80
+ if (kind === 'foreign')
81
+ await saveDeviceConfig(f.configPath, { ...f.config, organizationId: 'org_foreign' });
82
+ if (kind === 'unprotected')
83
+ f.store.get = async () => null;
84
+ if (kind === 'deleted_after_cache') {
85
+ await f.trust.refresh();
86
+ f.store.getFresh = async () => null;
87
+ }
88
+ if (kind === 'conflicting')
89
+ await saveDeviceConfig(f.configPath, { ...f.config, serverSigningKeyset: { ...f.rotated, generation: 1 } });
90
+ await assert.rejects(renewNamedSessionLifetime({ vault: f.vault, bindingId: f.binding.bindingId, identity: f.binding,
91
+ trust: f.trust, authorize: async () => true, now: f.now }));
92
+ assert.deepEqual(f.vault.getProviderSessionBinding(f.binding.bindingId, f.binding), f.binding);
93
+ }
94
+ finally {
95
+ f.vault.close();
96
+ }
97
+ }
98
+ });
99
+ test('revoked standing policy and local binding cannot be renewed', async () => {
100
+ const f = await fixture();
101
+ try {
102
+ f.setTime(new Date(Date.parse(f.oldExpiry) - 1000));
103
+ await assert.rejects(renewNamedSessionLifetime({ vault: f.vault, bindingId: f.binding.bindingId, identity: f.binding,
104
+ trust: f.trust, authorize: async () => false, now: f.now }), /not_authorized/);
105
+ f.vault.revokeProviderSessionBinding(f.binding.bindingId, f.binding);
106
+ await assert.rejects(renewNamedSessionLifetime({ vault: f.vault, bindingId: f.binding.bindingId, identity: f.binding,
107
+ trust: f.trust, authorize: async () => true, now: f.now }), /binding_unavailable/);
108
+ }
109
+ finally {
110
+ f.vault.close();
111
+ }
112
+ });
113
+ test('a retained channel consumes successor-signed offers after protected rotation and local deadline renewal', async () => {
114
+ const f = await fixture();
115
+ let revision = 0;
116
+ const signedOffer = () => {
117
+ const unsigned = { schema: 'dharma.session-question/v1', questionId: uuid(10), taskId: uuid(11),
118
+ organizationId: f.binding.organizationId, repositoryBindingId: f.binding.repositoryBindingId,
119
+ source: { workspaceId: uuid(12), endpointId: uuid(13), membershipId: uuid(14), deviceId: uuid(15) },
120
+ target: { workspaceId: f.binding.workspaceId, endpointId: f.binding.endpointId, membershipId: f.binding.membershipId,
121
+ deviceId: f.binding.deviceId, bindingId: f.binding.bindingId, provider: f.binding.provider },
122
+ category: 'code-review', question: 'Is the logical job deduplicated?',
123
+ authority: { mode: 'read_only', readPaths: ['.'], network: 'deny', maximumProviderCostCents: 25 },
124
+ createdAt: f.now().toISOString(), expiresAt: new Date(f.now().getTime() + 60_000).toISOString(),
125
+ nonce: uuid(16), signerKeyVersion: 'kms/2' };
126
+ return { ...unsigned, signature: signCanonicalObject(unsigned, f.second.privateKey) };
127
+ };
128
+ const { schema: _schema, owner: _owner, sessionId: _session, workspaceRoot: _root, createdAt: _created, ...scope } = f.binding;
129
+ const channel = createProviderSessionChannel({ scope, mode: 'bridge_owned', expectedRevision: 0,
130
+ assertOwner: async () => Boolean(f.vault.getProviderSessionBinding(f.binding.bindingId, f.binding)),
131
+ currentExpiresAt: () => f.vault.getProviderSessionBinding(f.binding.bindingId, f.binding)?.expiresAt ?? null,
132
+ verifier: f.trust, authorizeContent: async () => true, now: f.now,
133
+ transport: { async signedPost(_route, input) {
134
+ await f.trust.refresh();
135
+ const body = input;
136
+ return body.action === 'inbox'
137
+ ? { ok: true, organizationId: f.binding.organizationId, correlationId: uuid(90), result: { offers: [signedOffer()] } }
138
+ : { ok: true, organizationId: f.binding.organizationId, correlationId: uuid(90), registration: {
139
+ bindingId: f.binding.bindingId, workspaceId: f.binding.workspaceId, endpointId: f.binding.endpointId,
140
+ repositoryBindingId: f.binding.repositoryBindingId, membershipId: f.binding.membershipId, deviceId: f.binding.deviceId,
141
+ provider: 'codex', mode: 'bridge_owned', revision: ++revision, state: 'attached', replay: false,
142
+ leaseUntil: new Date(f.now().getTime() + 60_000).toISOString()
143
+ } };
144
+ } } });
145
+ try {
146
+ await channel.attach();
147
+ await installTrustedServerSigningKeyset({ configPath: f.configPath, candidate: f.rotated, store: f.store, now: f.now() });
148
+ assert.equal((await channel.inbox())[0]?.signerKeyVersion, 'kms/2');
149
+ f.setTime(new Date(Date.parse(f.oldExpiry) + 1000));
150
+ await renewNamedSessionLifetime({ vault: f.vault, bindingId: f.binding.bindingId, identity: f.binding,
151
+ trust: f.trust, authorize: async () => true, now: f.now });
152
+ await channel.reconnect();
153
+ assert.equal((await channel.inbox())[0]?.target.bindingId, f.binding.bindingId);
154
+ }
155
+ finally {
156
+ f.vault.close();
157
+ }
158
+ });
159
+ test('lifetime renewal requires the exact owner inspect receipt, not an HTTP success or presence assumption', async () => {
160
+ const f = await fixture();
161
+ const { schema: _schema, owner: _owner, sessionId: _session, workspaceRoot: _root, createdAt: _created, expiresAt: _expiry, maximumProviderCostCents: _cost, organizationId, ...identity } = f.binding;
162
+ const receipt = { ok: true, organizationId, correlationId: uuid(90), registration: { ...identity,
163
+ mode: 'bridge_owned', revision: 5, state: 'attached', leaseUntil: f.now().toISOString(), replay: false } };
164
+ try {
165
+ assert.equal(isNamedSessionOwnerReceipt(receipt, f.binding.bindingId, { ...identity, organizationId }), true);
166
+ for (const change of [{ membershipId: uuid(99) }, { deviceId: uuid(99) }, { repositoryBindingId: uuid(99) },
167
+ { state: 'detached' }, { mode: 'cooperative' }, { replay: true }, { revision: 0 }, { leaseUntil: 'invalid' },
168
+ { leaseUntil: new Date(Date.now() + 86400000).toISOString() }, { extra: true }]) {
169
+ assert.equal(isNamedSessionOwnerReceipt({ ...receipt, registration: { ...receipt.registration, ...change } }, f.binding.bindingId, { ...identity, organizationId }), false);
170
+ }
171
+ assert.equal(isNamedSessionOwnerReceipt({ ...receipt, organizationId: 'org_foreign' }, f.binding.bindingId, { ...identity, organizationId }), false);
172
+ assert.equal(isNamedSessionOwnerReceipt({ ok: true }, f.binding.bindingId, { ...identity, organizationId }), false);
173
+ }
174
+ finally {
175
+ f.vault.close();
176
+ }
177
+ });
178
+ //# sourceMappingURL=namedSessionTrust.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namedSessionTrust.test.js","sourceRoot":"","sources":["../src/namedSessionTrust.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- export type OnboardingStage = 'local_skill_inventory' | 'first_learning_preview' | 'first_learning_sync' | 'package_snapshot' | 'package_publication' | 'role_registration' | 'native_skill_install' | 'relay_start' | 'autostart' | 'readiness';
1
+ export type OnboardingStage = 'local_skill_inventory' | 'first_learning_preview' | 'first_learning_sync' | 'package_snapshot' | 'package_publication' | 'role_registration' | 'native_skill_install' | 'relay_start' | 'autostart' | 'named_session' | 'readiness';
2
2
  export declare function withOnboardingStage<T>(stage: OnboardingStage, workspaceId: string, resumeCommand: string, operation: () => Promise<T>): Promise<T>;
3
3
  //# sourceMappingURL=onboardingStage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"onboardingStage.d.ts","sourceRoot":"","sources":["../src/onboardingStage.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GACvB,uBAAuB,GACvB,wBAAwB,GACxB,qBAAqB,GACrB,kBAAkB,GAClB,qBAAqB,GACrB,mBAAmB,GACnB,sBAAsB,GACtB,aAAa,GACb,WAAW,GACX,WAAW,CAAC;AAEhB,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAUZ"}
1
+ {"version":3,"file":"onboardingStage.d.ts","sourceRoot":"","sources":["../src/onboardingStage.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GACvB,uBAAuB,GACvB,wBAAwB,GACxB,qBAAqB,GACrB,kBAAkB,GAClB,qBAAqB,GACrB,mBAAmB,GACnB,sBAAsB,GACtB,aAAa,GACb,WAAW,GACX,eAAe,GACf,WAAW,CAAC;AAEhB,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAUZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"onboardingStage.js","sourceRoot":"","sources":["../src/onboardingStage.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAsB,EACtB,WAAmB,EACnB,aAAqB,EACrB,SAA2B;IAE3B,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,2BAA2B,KAAK,KAAK,MAAM,mBAAmB,WAAW,qBAAqB,aAAa,EAAE,EAC7G,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"onboardingStage.js","sourceRoot":"","sources":["../src/onboardingStage.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAsB,EACtB,WAAmB,EACnB,aAAqB,EACrB,SAA2B;IAE3B,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,2BAA2B,KAAK,KAAK,MAAM,mBAAmB,WAAW,qBAAqB,aAAa,EAAE,EAC7G,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -48,6 +48,7 @@ export declare function createProviderSessionChannel(input: {
48
48
  mode: Mode;
49
49
  expectedRevision: number;
50
50
  assertOwner(): Promise<boolean>;
51
+ currentExpiresAt?: () => string | null;
51
52
  verifier: Pick<SessionQuestionVerifier, 'resolvePublicKey'>;
52
53
  authorizeContent(content: string, kind: 'question' | 'answer'): Promise<boolean>;
53
54
  now?: () => Date;
@@ -1 +1 @@
1
- {"version":3,"file":"providerSessionChannel.d.ts","sourceRoot":"","sources":["../src/providerSessionChannel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providerSessionChannel.d.ts","sourceRoot":"","sources":["../src/providerSessionChannel.ts"],"names":[],"mappings":"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"}
@@ -83,10 +83,13 @@ export function createProviderSessionChannel(input) {
83
83
  held = await input.assertOwner();
84
84
  }
85
85
  catch { /* Unconfirmed ownership cannot authorize another send. */ }
86
- if (!held || !Number.isFinite(now().getTime()) || now().getTime() >= Date.parse(scope.expiresAt)) {
86
+ const expiresAt = input.currentExpiresAt ? input.currentExpiresAt() : scope.expiresAt;
87
+ if (!held || !expiresAt || !Number.isFinite(Date.parse(expiresAt))
88
+ || !Number.isFinite(now().getTime()) || now().getTime() >= Date.parse(expiresAt)) {
87
89
  closed = true;
88
90
  throw new Error('provider_session_channel_owner_lost');
89
91
  }
92
+ scope.expiresAt = expiresAt;
90
93
  if (live && (!registration || registration.state !== 'attached' || now().getTime() >= Date.parse(registration.leaseUntil))) {
91
94
  throw new Error('provider_session_channel_unavailable');
92
95
  }
@@ -195,6 +198,7 @@ export function createProviderSessionChannel(input) {
195
198
  fact(inspected.ok, 'response');
196
199
  const offer = candidate;
197
200
  text(offer.question, 'response');
201
+ await content(offer.question, 'question');
198
202
  fact(!seen.has(offer.questionId), 'response');
199
203
  seen.add(offer.questionId);
200
204
  offers.push(offer);