@dharma-ai-labs/agent-fabric 0.2.110 → 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.
- package/AGENT_FABRIC_ONBOARDING.md +13 -0
- package/dist/codexBoundSession.d.ts +30 -5
- package/dist/codexBoundSession.d.ts.map +1 -1
- package/dist/codexBoundSession.js +49 -2
- package/dist/codexBoundSession.js.map +1 -1
- package/dist/codexBoundSession.test.js +17 -0
- package/dist/codexBoundSession.test.js.map +1 -1
- package/dist/codexInboxSession.d.ts +50 -0
- package/dist/codexInboxSession.d.ts.map +1 -1
- package/dist/codexInboxSession.js +32 -3
- package/dist/codexInboxSession.js.map +1 -1
- package/dist/codexPeerTools.d.ts +62 -0
- package/dist/codexPeerTools.d.ts.map +1 -0
- package/dist/codexPeerTools.js +53 -0
- package/dist/codexPeerTools.js.map +1 -0
- package/dist/codexPeerTools.test.d.ts +2 -0
- package/dist/codexPeerTools.test.d.ts.map +1 -0
- package/dist/codexPeerTools.test.js +77 -0
- package/dist/codexPeerTools.test.js.map +1 -0
- 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 +299 -17
- package/dist/index.js.map +1 -1
- package/dist/namedCodexThread.d.ts +3 -0
- package/dist/namedCodexThread.d.ts.map +1 -0
- package/dist/namedCodexThread.js +22 -0
- package/dist/namedCodexThread.js.map +1 -0
- package/dist/namedCodexThread.test.d.ts +2 -0
- package/dist/namedCodexThread.test.d.ts.map +1 -0
- package/dist/namedCodexThread.test.js +63 -0
- package/dist/namedCodexThread.test.js.map +1 -0
- package/dist/namedSessionBudget.d.ts +21 -0
- package/dist/namedSessionBudget.d.ts.map +1 -0
- package/dist/namedSessionBudget.js +70 -0
- package/dist/namedSessionBudget.js.map +1 -0
- package/dist/namedSessionBudget.test.d.ts +2 -0
- package/dist/namedSessionBudget.test.d.ts.map +1 -0
- package/dist/namedSessionBudget.test.js +40 -0
- package/dist/namedSessionBudget.test.js.map +1 -0
- package/dist/namedSessionService.d.ts +39 -0
- package/dist/namedSessionService.d.ts.map +1 -0
- package/dist/namedSessionService.js +269 -0
- package/dist/namedSessionService.js.map +1 -0
- package/dist/namedSessionService.test.d.ts +2 -0
- package/dist/namedSessionService.test.d.ts.map +1 -0
- package/dist/namedSessionService.test.js +158 -0
- package/dist/namedSessionService.test.js.map +1 -0
- package/dist/namedSessionTrust.d.ts +21 -0
- package/dist/namedSessionTrust.d.ts.map +1 -0
- package/dist/namedSessionTrust.js +64 -0
- package/dist/namedSessionTrust.js.map +1 -0
- package/dist/namedSessionTrust.test.d.ts +2 -0
- package/dist/namedSessionTrust.test.d.ts.map +1 -0
- package/dist/namedSessionTrust.test.js +178 -0
- package/dist/namedSessionTrust.test.js.map +1 -0
- package/dist/onboardingStage.d.ts +1 -1
- package/dist/onboardingStage.d.ts.map +1 -1
- package/dist/onboardingStage.js.map +1 -1
- package/dist/providerSessionChannel.d.ts +1 -0
- package/dist/providerSessionChannel.d.ts.map +1 -1
- package/dist/providerSessionChannel.js +5 -1
- package/dist/providerSessionChannel.js.map +1 -1
- package/dist/providerSessionChannel.test.js +10 -3
- package/dist/providerSessionChannel.test.js.map +1 -1
- package/dist/relaySupervisor.test.js +3 -1
- package/dist/relaySupervisor.test.js.map +1 -1
- package/dist/repositoryOnboardingCaller.test.js +19 -0
- package/dist/repositoryOnboardingCaller.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/dist/usage.test.d.ts +2 -0
- package/dist/usage.test.d.ts.map +1 -0
- package/dist/usage.test.js +18 -0
- package/dist/usage.test.js.map +1 -0
- 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":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAoC,MAAM,0CAA0C,CAAC;AACxG,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,gBAAgB,EAC1E,MAAM,0BAA0B,CAAC;AAElE,IAAI,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;IAC3F,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;QACzG,UAAU,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC;IAC7G,MAAM,IAAI,GAA6B,EAAE,MAAM,EAAE,yBAAyB,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE;QACnH,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7E,MAAM,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,KAAK,MAAM,OAAO,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE;QAClG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,EAAE;QACrE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC;QACzE,MAAM,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAmC,CAAC,EAAE,sBAAsB,CAAC,CAAC;QAC1G,MAAM,CAAC,SAAS,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;IACzH,MAAM,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,sBAAsB,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC1F,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACtG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC;IACjF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;AACxF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yFAAyF,EAC5F,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE;IACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5D,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;QACzG,UAAU,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC;IAC7G,MAAM,OAAO,GAAgC,EAAE,MAAM,EAAE,0CAA0C,EAAE,GAAG,QAAQ;QAC5G,SAAS,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QAC3G,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,wBAAwB,EAAE,EAAE,EAAE,CAAC;IAC/H,MAAM,YAAY,GAA6B,EAAE,MAAM,EAAE,yBAAyB,EAAE,IAAI,EAAE,aAAa;QACrG,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3G,MAAM,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC/E,MAAM,CAAC,SAAS,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/F,KAAK,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,EAAE,KAAK,GAAa,EAAE,EAAE,OAAO,GAAa,EAAE,CAAC;IACvF,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IACtD,IAAI,OAAO,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC;IACnG,MAAM,UAAU,GAAG,UAAU,EAAE,EAAE,MAAM,GAAG,UAAU,EAAE,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACzE,MAAM,QAAQ,GAAG,EAAE,MAAM,EAAE,4BAA4B,EAAE,UAAU,EAAE,MAAM;QACzE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;QAC1F,MAAM,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;QACnH,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY;YAC/G,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;QAChF,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,wBAAwB;QAC3D,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,EAAE,EAAE;QACjG,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE;QACvF,KAAK,EAAE,UAAU,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;IACvF,MAAM,SAAS,GAAG;QAChB,UAAU,KAAK,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC;QACjC,cAAc,CAAC,QAAkC,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7H,KAAK,CAAC,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QAChC,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,MAA+B;YAC3D,IAAI,MAAM,KAAK,wBAAwB;gBAAE,OAAO,EAAE,IAAI,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9H,IAAI,MAAM,KAAK,aAAa;gBAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE;4BAC5D,aAAa,EAAE,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;4BACvH,WAAW,EAAE,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;yBACvH,EAAE,EAAE,CAAC;YACN,IAAI,MAAM,KAAK,aAAa;gBAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACjI,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;gBACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;gBAAC,MAAM,EAAE,CAAC;gBAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBAClG,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,EAAE,CAAC;oBACT,KAAK,MAAM,QAAQ,IAAI,SAAS;wBAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS;gCAC1G,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnJ,CAAC,EAAE,EAAE,CAAC,CAAC;gBACP,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;YAClC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;IACF,MAAM,gBAAgB,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,IAAa;YACtE,MAAM,KAAK,GAAG,IAA+B,CAAC;YAC9C,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,CAAC;YAChG,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;gBACvE,OAAO,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,QAAQ;wBACzE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU;wBACxF,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9E,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;gBAAE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7G,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;gBAAE,QAAQ,GAAG,IAAI,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YACjE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,SAAS;oBAChF,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjF,CAAC,EAAE,CAAC;IACJ,qFAAqF;IACrF,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC;IAC5C,gBAAgB,CAAC,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,CAA4B,CAAC;QACrE,IAAI,MAAM,CAAC,YAAY;YAAE,OAAQ,MAAM,CAAC,YAAwC,CAAC,cAAc,CAAC;QAChG,OAAO,MAA6C,CAAC;IACvD,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM;QAC3F,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE;QAClI,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,GAAG,CAAC,EAAE,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QAChG,sBAAsB,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC;gBAAC,MAAM,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;YACpF,MAAM,CAAC;gBAAC,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;YAAC,CAAC;QAC1E,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;QACpH,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;QACnI,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACnC,OAAO,GAAG,IAAI,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/G,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC;QACzE,MAAM,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,uBAAuB,CAAC,CAAC;QACtI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7G,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACvE,6DAA6D,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACxF,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACpH,CAAC;YAAS,CAAC;QAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAAC,MAAM,OAAO,CAAC;QAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
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":"
|
|
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":"AACA,OAAO,EAAoC,KAAK,mBAAmB,EAAE,KAAK,eAAe,EACvF,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAE/E,KAAK,IAAI,GAAG,cAAc,GAAG,aAAa,CAAC;AAC3C,KAAK,WAAW,GAAG,sBAAsB,GAAG,eAAe,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AACvG,KAAK,YAAY,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAC;IAC5G,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACxF,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AACxE,KAAK,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IACnF,KAAK,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AACjG,KAAK,KAAK,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAAC;AACrI,KAAK,WAAW,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAC/E,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,aAAa,CAAC;IAC/F,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AA0CnH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,SAAS,EAAE;QAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC;IAC1F,KAAK,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IACjE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;IAC5D,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjF,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;;;;
|
|
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
|
-
|
|
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);
|